flowchart-sequence-designer 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ui/index.ts","../../src/ui/DiagramEditor.tsx","../../src/ui/Toolbar.tsx","../../src/ui/ImportDialog.tsx","../../src/ui/theme.ts","../../src/ui/StepEditor.tsx","../../src/core/ids.ts","../../src/ui/SequenceEditor.tsx","../../src/ui/hooks/useEditorTheme.ts","../../src/ui/hooks/useSystemTheme.ts","../../src/ui/hooks/useExporters.ts","../../src/exporters/mermaid.ts","../../src/exporters/plantuml.ts","../../src/exporters/json.ts","../../src/exporters/svg.ts","../../src/ui/hooks/useImporter.ts","../../src/core/model.ts","../../src/importers/mermaid.ts","../../src/importers/json.ts","../../src/ui/presets.ts","../../src/ui/Minimap.tsx","../../src/ui/NodeNavigator.tsx","../../src/ui/ContextMenu.tsx","../../src/ui/render.tsx","../../src/ui/layout.ts","../../src/ui/hooks/useHistory.ts","../../src/ui/hooks/useCanvasWheel.ts","../../src/ui/hooks/useCanvasTouch.ts","../../src/ui/hooks/useElementSize.ts","../../src/ui/alignment.ts","../../src/ui/traversal.ts"],"sourcesContent":["/**\n * React UI entry point. Pulls in `react` and `react-dom` as peer\n * dependencies. The `DiagramEditor` is the all-in-one component most\n * consumers reach for; `SequenceEditor` is the sequence-diagram specialization.\n * `Toolbar` and `StepEditor` are exposed for embedding the same primitives\n * inside a custom shell.\n */\n\nexport { DiagramEditor } from './DiagramEditor.js';\nexport type { DiagramEditorProps, ThemeColors } from './DiagramEditor.js';\nexport { SequenceEditor } from './SequenceEditor.js';\nexport type { SequenceEditorProps, SequenceThemeColors } from './SequenceEditor.js';\nexport { Toolbar } from './Toolbar.js';\nexport { StepEditor } from './StepEditor.js';\nexport { presetFlowchartModel, presetSequenceModel, emptyModel } from './presets.js';\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { Toolbar } from './Toolbar.js';\nimport { StepEditor } from './StepEditor.js';\nimport { SequenceEditor } from './SequenceEditor.js';\nimport { Minimap } from './Minimap.js';\nimport { NodeNavigator } from './NodeNavigator.js';\nimport { ContextMenu, type CtxMenuState as CtxMenu } from './ContextMenu.js';\nimport { NodeShape, QuestionNode, EdgeLine } from './render.js';\nimport { useHistory } from './hooks/useHistory.js';\nimport { usePrefersReducedMotion, useIsCoarsePointer } from './hooks/useSystemTheme.js';\nimport { useCanvasWheel } from './hooks/useCanvasWheel.js';\nimport { useCanvasTouch } from './hooks/useCanvasTouch.js';\nimport { useElementSize } from './hooks/useElementSize.js';\nimport { useEditorTheme } from './hooks/useEditorTheme.js';\nimport { useExporters } from './hooks/useExporters.js';\nimport { useImporter } from './hooks/useImporter.js';\nimport {\n NODE_H,\n GRID,\n nodeWidth,\n nodeDims,\n snap,\n bezierPath,\n} from './layout.js';\nimport { findSiblingSnap, type AlignGuideV, type AlignGuideH } from './alignment.js';\nimport { nearestInDirection } from './traversal.js';\nimport { presetFlowchartModel } from './presets.js';\nimport type { DiagramModel, DiagramNode, DiagramEdge, ExportFormat, DiagramVariant } from '../core/types.js';\nimport { nextId, makeIdSource } from '../core/ids.js';\n\n// ── Theme ──────────────────────────────────────────────────────────────────\nimport { ACCENT as C, type ThemeColors, lightTheme, darkTheme, variantAccent } from './theme.js';\nexport type { ThemeColors } from './theme.js';\n\n// Static styles hoisted to module scope to avoid re-allocating an object per\n// render in the node/edge map loops.\nconst STYLE_LABEL: React.CSSProperties = { pointerEvents: 'none', userSelect: 'none' };\nconst STYLE_LIVE_PORT: React.CSSProperties = { opacity: 0.85, pointerEvents: 'none' };\nconst STYLE_SR_ONLY: React.CSSProperties = { position: 'absolute', width: 1, height: 1, padding: 0, margin: -1, overflow: 'hidden', clip: 'rect(0 0 0 0)', whiteSpace: 'nowrap', border: 0 };\nconst STYLE_FLEX_ROW: React.CSSProperties = { flex: 1, display: 'flex', overflow: 'hidden' };\n\ninterface Transform { x: number; y: number; scale: number }\ninterface DragState { nodeId: string; ox: number; oy: number }\ninterface LiveEdge {\n fromId: string; fromX: number; fromY: number;\n exitDir: 'bottom' | 'right' | 'left'; answerLabel?: string; toX: number; toY: number;\n}\n\n/**\n * Props for `<DiagramEditor>`. All fields are optional — mounting with no\n * props renders the flowchart preset on an `auto`-themed canvas with every\n * export format and import enabled.\n *\n * @property initialModel Initial diagram. If a sequence model is passed,\n * rendering is delegated to `<SequenceEditor>`. If\n * omitted, `presetFlowchartModel(variant)` is used.\n * @property onChange Fires after every committed mutation (undo/redo,\n * drag, label edit, etc.). Receives the new model.\n * @property onExport Optional sink for exporter output. If omitted, the\n * editor triggers a browser download of `diagram.<ext>`.\n * @property height Canvas height; accepts CSS units. Defaults to `600`.\n * @property allowedExports Whitelist of export formats to show in the\n * toolbar. Defaults to all formats.\n * @property allowImport Show the import button. Defaults to `true`.\n * @property variant Initial variant when `initialModel` is omitted.\n * Ignored if `initialModel.variant` is set.\n * @property theme `'light'`, `'dark'`, or `'auto'` (follow OS).\n * Defaults to `'auto'`.\n * @property themeOverrides Per-property overrides on top of the resolved\n * palette. Useful for brand-matching without forking.\n */\nexport interface DiagramEditorProps {\n initialModel?: DiagramModel;\n onChange?: (model: DiagramModel) => void;\n onExport?: (format: ExportFormat, content: string | Blob) => void;\n height?: number | string;\n allowedExports?: ExportFormat[];\n allowImport?: boolean;\n variant?: DiagramVariant;\n theme?: 'light' | 'dark' | 'auto';\n themeOverrides?: Partial<ThemeColors>;\n}\n\n\n\n/**\n * The all-in-one editor component. Renders a smart router: if the supplied\n * `initialModel.type` is `sequence`, it delegates to `<SequenceEditor>` with\n * the same props pass-through. Otherwise it renders the flowchart editor.\n *\n * @example\n * ```tsx\n * import { DiagramEditor } from 'flowchart-sequence-designer/ui';\n *\n * export default function App() {\n * return <DiagramEditor height={520} onChange={(m) => console.log(m)} />;\n * }\n * ```\n */\nexport function DiagramEditor(props: DiagramEditorProps) {\n // Delegate sequence diagrams to the dedicated SequenceEditor.\n if (props.initialModel?.type === 'sequence') {\n return <SequenceEditor\n initialModel={props.initialModel}\n onChange={props.onChange}\n onExport={props.onExport}\n height={props.height}\n allowedExports={props.allowedExports}\n allowImport={props.allowImport}\n theme={props.theme}\n themeOverrides={props.themeOverrides}\n />;\n }\n return <FlowchartEditor {...props} />;\n}\n\nfunction FlowchartEditor({\n initialModel, onChange, onExport, height = 600,\n allowedExports, allowImport = true, variant = 'flowchart', theme = 'auto',\n themeOverrides,\n}: DiagramEditorProps) {\n const base: DiagramModel = initialModel\n ? { ...initialModel, variant: initialModel.variant ?? variant }\n : presetFlowchartModel(variant);\n const notify = useCallback((m: DiagramModel) => onChange?.(m), [onChange]);\n const history = useHistory<DiagramModel>(base, notify);\n const { state: model, apply: applyModel, applyAndPush, undo, redo } = history;\n const [transform, setTransform] = useState<Transform>({ x: 60, y: 60, scale: 1 });\n const [selected, setSelected] = useState<string | null>(null);\n const [selectedSet, setSelectedSet] = useState<Set<string>>(() => new Set());\n const [drag, setDrag] = useState<DragState | null>(null);\n const [pan, setPan] = useState<{ ox: number; oy: number; tx: number; ty: number } | null>(null);\n const [boxSel, setBoxSel] = useState<{ sx: number; sy: number; cx: number; cy: number; additive: boolean } | null>(null);\n const [liveEdge, setLiveEdge] = useState<LiveEdge | null>(null);\n const [alignGuides, setAlignGuides] = useState<{ x?: AlignGuideV; y?: AlignGuideH } | null>(null);\n const [waypointDrag, setWaypointDrag] = useState<string | null>(null);\n const groupDragOriginsRef = useRef<Map<string, { ox: number; oy: number }> | null>(null);\n const clipboardRef = useRef<{ nodes: DiagramNode[]; edges: DiagramEdge[] } | null>(null);\n\n const selectOne = useCallback((id: string | null) => {\n setSelected(id);\n setSelectedSet(id ? new Set([id]) : new Set());\n }, []);\n\n const toggleSelect = useCallback((id: string) => {\n setSelectedSet(prev => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n const last = next.size ? Array.from(next)[next.size - 1] : null;\n setSelected(last);\n } else {\n next.add(id);\n setSelected(id);\n }\n return next;\n });\n }, []);\n\n const clearSelection = useCallback(() => {\n setSelected(null);\n setSelectedSet(new Set());\n }, []);\n const [editingId, setEditingId] = useState<string | null>(null);\n const [editLabel, setEditLabel] = useState('');\n const [editingEdgeId, setEditingEdgeId] = useState<string | null>(null);\n const [editEdgeLabel, setEditEdgeLabel] = useState('');\n const [hoveredId, setHoveredId] = useState<string | null>(null);\n const [ctxMenu, setCtxMenu] = useState<CtxMenu | null>(null);\n const [navOpen, setNavOpen] = useState(true);\n const [announcement, setAnnouncement] = useState('');\n const svgRef = useRef<SVGSVGElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const reducedMotion = usePrefersReducedMotion();\n const { t, isDark } = useEditorTheme(theme, themeOverrides, { light: lightTheme, dark: darkTheme });\n const isCoarse = useIsCoarsePointer();\n const portR = isCoarse ? 9 : 6;\n\n // Track the SVG element size for the minimap viewport overlay.\n const viewport = useElementSize(svgRef);\n\n\n const reCenter = useCallback(() => {\n if (!svgRef.current) return;\n const rect = svgRef.current.getBoundingClientRect();\n const W = rect.width, H = rect.height;\n if (model.nodes.length === 0) { setTransform({ x: W / 2, y: H / 2, scale: 1 }); return; }\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const n of model.nodes) {\n const nx = n.x ?? 0, ny = n.y ?? 0;\n const { w: nw, h: nh } = nodeDims(n, variant);\n minX = Math.min(minX, nx); minY = Math.min(minY, ny);\n maxX = Math.max(maxX, nx + nw); maxY = Math.max(maxY, ny + nh);\n }\n const pad = 48;\n const scaleX = (W - pad * 2) / (maxX - minX || 1);\n const scaleY = (H - pad * 2) / (maxY - minY || 1);\n const scale = Math.min(1.5, Math.max(0.2, Math.min(scaleX, scaleY)));\n const cx = (minX + maxX) / 2, cy = (minY + maxY) / 2;\n setTransform({ scale, x: W / 2 - cx * scale, y: H / 2 - cy * scale });\n }, [model.nodes, variant]);\n\n const jumpToNode = useCallback((nodeId: string) => {\n const node = model.nodes.find(n => n.id === nodeId);\n if (!node || !svgRef.current) return;\n const rect = svgRef.current.getBoundingClientRect();\n const { w: nw, h: nh } = nodeDims(node, variant);\n const cx = (node.x ?? 0) + nw / 2;\n const cy = (node.y ?? 0) + nh / 2;\n const scale = Math.min(Math.max(transform.scale, 0.8), 1.4);\n setTransform({ scale, x: rect.width / 2 - cx * scale, y: rect.height / 2 - cy * scale });\n selectOne(nodeId);\n }, [model.nodes, variant, transform.scale, selectOne]);\n\n const duplicateIds = useCallback((ids: string[]) => {\n if (ids.length === 0) return;\n const idSet = new Set(ids);\n const idMap = new Map<string, string>();\n const nextNode = makeIdSource('node', model.nodes);\n const nextEdge = makeIdSource('e', model.edges);\n const newNodes: DiagramNode[] = [];\n for (const oldId of ids) {\n const n = model.nodes.find(x => x.id === oldId);\n if (!n) continue;\n const newId = nextNode();\n idMap.set(oldId, newId);\n newNodes.push({\n ...n, id: newId,\n label: ids.length === 1 ? n.label + ' (copy)' : n.label,\n x: (n.x ?? 0) + 32, y: (n.y ?? 0) + 32,\n });\n }\n const newEdges: DiagramEdge[] = [];\n for (const e of model.edges) {\n if (idSet.has(e.from) && idSet.has(e.to)) {\n newEdges.push({ ...e, id: nextEdge(), from: idMap.get(e.from)!, to: idMap.get(e.to)! });\n }\n }\n const m = { ...model, nodes: [...model.nodes, ...newNodes], edges: [...model.edges, ...newEdges] };\n applyAndPush(m);\n const newIds = newNodes.map(n => n.id);\n setSelected(newIds[newIds.length - 1] ?? null);\n setSelectedSet(new Set(newIds));\n }, [model, applyAndPush]);\n\n const duplicateNode = useCallback((nodeId: string) => { duplicateIds([nodeId]); }, [duplicateIds]);\n\n // Close context menu on any click\n useEffect(() => {\n if (!ctxMenu) return;\n const close = () => setCtxMenu(null);\n window.addEventListener('mousedown', close);\n return () => window.removeEventListener('mousedown', close);\n }, [ctxMenu]);\n\n // Global keyboard shortcuts\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n // Don't hijack keys when the user is typing in an input / textarea / contentEditable.\n const tgt = e.target as HTMLElement | null;\n if (tgt && (tgt.tagName === 'INPUT' || tgt.tagName === 'TEXTAREA' || tgt.isContentEditable)) return;\n\n const ctrl = e.ctrlKey || e.metaKey;\n if (ctrl && e.key === 'z') { e.preventDefault(); undo(); return; }\n if (ctrl && (e.key === 'y' || (e.shiftKey && e.key === 'z'))) { e.preventDefault(); redo(); return; }\n if (ctrl && e.key === '0') { e.preventDefault(); reCenter(); return; }\n if (ctrl && (e.key === 'd' || e.key === 'D')) {\n if (selectedSet.size > 0) { e.preventDefault(); duplicateIds(Array.from(selectedSet)); }\n return;\n }\n\n if (ctrl && (e.key === 'c' || e.key === 'C')) {\n if (selectedSet.size > 0) {\n e.preventDefault();\n const ids = new Set(selectedSet);\n const nodes = model.nodes.filter(n => ids.has(n.id));\n const edges = model.edges.filter(ed => ids.has(ed.from) && ids.has(ed.to));\n clipboardRef.current = {\n nodes: nodes.map(n => ({ ...n })),\n edges: edges.map(ed => ({ ...ed })),\n };\n }\n return;\n }\n if (ctrl && (e.key === 'v' || e.key === 'V')) {\n const clip = clipboardRef.current;\n if (clip && clip.nodes.length > 0) {\n e.preventDefault();\n const idMap = new Map<string, string>();\n const nextNode = makeIdSource('node', model.nodes);\n const nextEdge = makeIdSource('e', model.edges);\n const newNodes: DiagramNode[] = clip.nodes.map(n => {\n const newId = nextNode();\n idMap.set(n.id, newId);\n return { ...n, id: newId, x: (n.x ?? 0) + 24, y: (n.y ?? 0) + 24 };\n });\n const newEdges: DiagramEdge[] = clip.edges.map(ed => ({\n ...ed, id: nextEdge(),\n from: idMap.get(ed.from) ?? ed.from,\n to: idMap.get(ed.to) ?? ed.to,\n }));\n const m = { ...model, nodes: [...model.nodes, ...newNodes], edges: [...model.edges, ...newEdges] };\n applyAndPush(m);\n const newIds = newNodes.map(n => n.id);\n setSelected(newIds[newIds.length - 1]);\n setSelectedSet(new Set(newIds));\n setAnnouncement(`Pasted ${newIds.length} ${variantLabel.toLowerCase()}${newIds.length === 1 ? '' : 's'}.`);\n }\n return;\n }\n\n if (e.key === 'Escape') {\n if (ctxMenu) setCtxMenu(null);\n if (liveEdge) setLiveEdge(null);\n if (editingId) setEditingId(null);\n if (boxSel) setBoxSel(null);\n if (selectedSet.size > 0) clearSelection();\n return;\n }\n\n if ((e.key === 'Delete' || e.key === 'Backspace') && selectedSet.size > 0) {\n e.preventDefault();\n const ids = new Set(selectedSet);\n const updated = {\n ...model,\n nodes: model.nodes.filter(n => !ids.has(n.id)),\n edges: model.edges.filter(ed => !ids.has(ed.from) && !ids.has(ed.to)),\n };\n applyAndPush(updated);\n clearSelection();\n setAnnouncement(`Deleted ${ids.size} ${variantLabel.toLowerCase()}${ids.size === 1 ? '' : 's'}.`);\n return;\n }\n\n if (selectedSet.size > 0 && (e.key === 'ArrowUp' || e.key === 'ArrowDown' || e.key === 'ArrowLeft' || e.key === 'ArrowRight')) {\n const dirKey = e.key === 'ArrowLeft' ? 'left' : e.key === 'ArrowRight' ? 'right' : e.key === 'ArrowUp' ? 'up' : 'down';\n\n // Alt+Arrow → traverse the graph: jump selection to the nearest neighbor in that direction.\n if (e.altKey && selected) {\n e.preventDefault();\n const origin = model.nodes.find(n => n.id === selected);\n if (!origin) return;\n const od = nodeDims(origin, variant);\n const ox = (origin.x ?? 0) + od.w / 2;\n const oy = (origin.y ?? 0) + od.h / 2;\n const candidates = model.nodes\n .filter(n => n.id !== selected)\n .map(n => {\n const d = nodeDims(n, variant);\n return { id: n.id, x: (n.x ?? 0) + d.w / 2, y: (n.y ?? 0) + d.h / 2 };\n });\n const nextId = nearestInDirection(ox, oy, dirKey, candidates);\n if (nextId) {\n selectOne(nextId);\n setAnnouncement(`Selected ${model.nodes.find(n => n.id === nextId)?.label ?? ''}.`);\n }\n return;\n }\n\n e.preventDefault();\n const step = e.shiftKey ? GRID * 4 : GRID;\n const dx = dirKey === 'left' ? -step : dirKey === 'right' ? step : 0;\n const dy = dirKey === 'up' ? -step : dirKey === 'down' ? step : 0;\n const ids = selectedSet;\n const updated = {\n ...model,\n nodes: model.nodes.map(n => ids.has(n.id)\n ? { ...n, x: snap((n.x ?? 0) + dx), y: snap((n.y ?? 0) + dy) }\n : n),\n };\n applyAndPush(updated);\n }\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [undo, redo, reCenter, selected, selectedSet, ctxMenu, liveEdge, editingId, boxSel, model, applyAndPush, duplicateNode, clearSelection]);\n\n const toCanvas = useCallback((clientX: number, clientY: number) => {\n const rect = svgRef.current!.getBoundingClientRect();\n return { x: (clientX - rect.left - transform.x) / transform.scale, y: (clientY - rect.top - transform.y) / transform.scale };\n }, [transform]);\n\n useCanvasWheel(svgRef, setTransform);\n\n const onCanvasLongPress = useCallback((x: number, y: number) => {\n setCtxMenu({ x, y, nodeId: null });\n }, []);\n useCanvasTouch(svgRef, { transform, setTransform, onLongPress: onCanvasLongPress });\n\n const onPortMouseDown = (e: React.MouseEvent, nodeId: string) => {\n e.stopPropagation();\n const node = model.nodes.find(n => n.id === nodeId)!;\n const { x, y } = toCanvas(e.clientX, e.clientY);\n const nW = nodeWidth(node.label);\n setLiveEdge({ fromId: nodeId, fromX: (node.x ?? 0) + nW / 2, fromY: (node.y ?? 0) + NODE_H, exitDir: 'bottom', toX: x, toY: y });\n };\n\n const onAnswerPortDown = (e: React.MouseEvent, nodeId: string, answer: string, portXInNode: number, portYInNode: number) => {\n e.stopPropagation();\n const node = model.nodes.find(n => n.id === nodeId)!;\n const { x, y } = toCanvas(e.clientX, e.clientY);\n setLiveEdge({ fromId: nodeId, fromX: (node.x ?? 0) + portXInNode, fromY: (node.y ?? 0) + portYInNode, exitDir: 'bottom', answerLabel: answer, toX: x, toY: y });\n };\n\n const onNodeMouseDown = (e: React.MouseEvent, id: string) => {\n e.stopPropagation();\n if (liveEdge) return;\n const node = model.nodes.find(n => n.id === id)!;\n\n if (e.shiftKey) {\n toggleSelect(id);\n return;\n }\n\n const inSet = selectedSet.has(id);\n if (inSet && selectedSet.size > 1) {\n // Group drag: keep selection, set primary to this node, record origins for every selected node.\n setSelected(id);\n const origins = new Map<string, { ox: number; oy: number }>();\n for (const sid of selectedSet) {\n const n = model.nodes.find(x => x.id === sid);\n if (!n) continue;\n origins.set(sid, {\n ox: e.clientX - (transform.x + (n.x ?? 0) * transform.scale),\n oy: e.clientY - (transform.y + (n.y ?? 0) * transform.scale),\n });\n }\n groupDragOriginsRef.current = origins;\n } else {\n selectOne(id);\n groupDragOriginsRef.current = null;\n }\n setDrag({ nodeId: id, ox: e.clientX - (transform.x + (node.x ?? 0) * transform.scale), oy: e.clientY - (transform.y + (node.y ?? 0) * transform.scale) });\n };\n\n const onNodeMouseUp = (e: React.MouseEvent, targetId: string) => {\n if (!liveEdge || liveEdge.fromId === targetId) return;\n e.stopPropagation();\n const label = liveEdge.answerLabel;\n let updated: DiagramModel;\n if (label) {\n const existing = model.edges.find(ex => ex.from === liveEdge.fromId && ex.label === label);\n if (existing) {\n updated = { ...model, edges: model.edges.map(ex => ex.id === existing.id ? { ...ex, to: targetId } : ex) };\n } else {\n updated = { ...model, edges: [...model.edges, { id: nextId('e', model.edges), from: liveEdge.fromId, to: targetId, label }] };\n }\n } else {\n updated = { ...model, edges: [...model.edges, { id: nextId('e', model.edges), from: liveEdge.fromId, to: targetId }] };\n }\n applyAndPush(updated);\n setLiveEdge(null);\n };\n\n const onSvgMouseDown = (e: React.MouseEvent) => {\n if (ctxMenu) { setCtxMenu(null); return; }\n if ((e.target as SVGElement).dataset.bg === '1' || e.target === svgRef.current) {\n if (e.shiftKey) {\n // Shift+drag on empty canvas = box-select. Existing selection is preserved (additive).\n setBoxSel({ sx: e.clientX, sy: e.clientY, cx: e.clientX, cy: e.clientY, additive: true });\n } else {\n clearSelection();\n setPan({ ox: e.clientX, oy: e.clientY, tx: transform.x, ty: transform.y });\n }\n }\n };\n\n const onSvgContextMenu = (e: React.MouseEvent) => {\n e.preventDefault();\n setCtxMenu({ x: e.clientX, y: e.clientY, nodeId: null });\n };\n\n const onNodeContextMenu = (e: React.MouseEvent, nodeId: string) => {\n e.preventDefault(); e.stopPropagation();\n // Right-click on a node that is NOT already in the multi-selection collapses\n // selection to just this node (matches Figma / VS Code). Right-clicking a\n // node that IS part of a multi-selection keeps the group intact.\n if (!selectedSet.has(nodeId)) selectOne(nodeId);\n setCtxMenu({ x: e.clientX, y: e.clientY, nodeId });\n };\n\n const onMouseMove = (e: React.MouseEvent) => {\n if (liveEdge) {\n const { x, y } = toCanvas(e.clientX, e.clientY);\n setLiveEdge(le => le ? { ...le, toX: x, toY: y } : null);\n return;\n }\n if (waypointDrag) {\n const { x, y } = toCanvas(e.clientX, e.clientY);\n const wx = snap(x), wy = snap(y);\n const updated = {\n ...model,\n edges: model.edges.map(ed => ed.id === waypointDrag ? { ...ed, waypoint: { x: wx, y: wy } } : ed),\n };\n applyModel(updated);\n return;\n }\n if (drag) {\n const dx = snap((e.clientX - drag.ox - transform.x) / transform.scale);\n const dy = snap((e.clientY - drag.oy - transform.y) / transform.scale);\n const origins = groupDragOriginsRef.current;\n if (origins && origins.size > 1) {\n const updated = {\n ...model,\n nodes: model.nodes.map(n => {\n const o = origins.get(n.id);\n if (!o) return n;\n return {\n ...n,\n x: snap((e.clientX - o.ox - transform.x) / transform.scale),\n y: snap((e.clientY - o.oy - transform.y) / transform.scale),\n };\n }),\n };\n applyModel(updated);\n } else {\n const dragged = model.nodes.find(n => n.id === drag.nodeId);\n if (!dragged) return;\n const { w: dW, h: dH } = nodeDims(dragged, variant);\n const others = model.nodes\n .filter(n => n.id !== drag.nodeId)\n .map(n => {\n const d = nodeDims(n, variant);\n return { x: n.x ?? 0, y: n.y ?? 0, w: d.w, h: d.h };\n });\n const snapResult = findSiblingSnap({ x: dx, y: dy, w: dW, h: dH }, others);\n setAlignGuides(snapResult.guideX || snapResult.guideY ? { x: snapResult.guideX, y: snapResult.guideY } : null);\n const updated = { ...model, nodes: model.nodes.map(n => n.id === drag.nodeId ? { ...n, x: snapResult.x, y: snapResult.y } : n) };\n applyModel(updated);\n }\n } else if (pan) {\n setTransform(tr => ({ ...tr, x: pan.tx + (e.clientX - pan.ox), y: pan.ty + (e.clientY - pan.oy) }));\n } else if (boxSel) {\n setBoxSel(b => b ? { ...b, cx: e.clientX, cy: e.clientY } : null);\n }\n };\n\n const onMouseUp = () => {\n if (boxSel) {\n const dragged = Math.abs(boxSel.cx - boxSel.sx) > 3 || Math.abs(boxSel.cy - boxSel.sy) > 3;\n if (dragged && svgRef.current) {\n const rect = svgRef.current.getBoundingClientRect();\n const x1 = Math.min(boxSel.sx, boxSel.cx) - rect.left;\n const y1 = Math.min(boxSel.sy, boxSel.cy) - rect.top;\n const x2 = Math.max(boxSel.sx, boxSel.cx) - rect.left;\n const y2 = Math.max(boxSel.sy, boxSel.cy) - rect.top;\n // Box edges → canvas coords\n const cx1 = (x1 - transform.x) / transform.scale;\n const cy1 = (y1 - transform.y) / transform.scale;\n const cx2 = (x2 - transform.x) / transform.scale;\n const cy2 = (y2 - transform.y) / transform.scale;\n const hits = new Set<string>(boxSel.additive ? selectedSet : []);\n for (const n of model.nodes) {\n const nx = n.x ?? 0, ny = n.y ?? 0;\n const { w: nw, h: nh } = nodeDims(n, variant);\n if (nx + nw >= cx1 && nx <= cx2 && ny + nh >= cy1 && ny <= cy2) hits.add(n.id);\n }\n const arr = Array.from(hits);\n setSelectedSet(hits);\n setSelected(arr.length ? arr[arr.length - 1] : null);\n }\n setBoxSel(null);\n }\n // Commit drag position to history so it can be undone.\n if (drag) applyAndPush(model);\n if (waypointDrag) { applyAndPush(model); setWaypointDrag(null); }\n groupDragOriginsRef.current = null;\n setAlignGuides(null);\n setDrag(null); setPan(null);\n if (liveEdge) setLiveEdge(null);\n };\n\n const onNodeDblClick = (e: React.MouseEvent, id: string) => {\n e.stopPropagation();\n const node = model.nodes.find(n => n.id === id)!;\n setEditingId(id); setEditLabel(node.label);\n };\n\n const commitEdit = () => {\n if (!editingId) return;\n const up = { ...model, nodes: model.nodes.map(n => n.id === editingId ? { ...n, label: editLabel } : n) };\n applyAndPush(up);\n setEditingId(null);\n };\n\n const addNode = (atCanvasPos?: { x: number; y: number }) => {\n const id = nextId('node', model.nodes);\n const p = atCanvasPos\n ? { x: snap(atCanvasPos.x), y: snap(atCanvasPos.y) }\n : { x: snap(100 + Math.random() * 240), y: snap(100 + Math.random() * 180) };\n const label = variant === 'question' ? 'New Question' : variant === 'journey' ? `Step ${model.nodes.length + 1}` : 'New Step';\n const metadata = variant === 'question' ? { answers: [] } : undefined;\n const updated = { ...model, nodes: [...model.nodes, { id, label, shape: 'rectangle' as const, metadata, ...p }] };\n applyAndPush(updated); selectOne(id);\n setAnnouncement(`Added ${variantLabel.toLowerCase()} \"${label}\".`);\n };\n\n const deleteNode = (nodeId: string) => {\n const node = model.nodes.find(n => n.id === nodeId);\n const updated = { ...model, nodes: model.nodes.filter(n => n.id !== nodeId), edges: model.edges.filter(e => e.from !== nodeId && e.to !== nodeId) };\n applyAndPush(updated);\n if (selectedSet.has(nodeId)) {\n const next = new Set(selectedSet); next.delete(nodeId);\n setSelectedSet(next);\n if (selected === nodeId) setSelected(next.size ? Array.from(next)[next.size - 1] : null);\n }\n if (node) setAnnouncement(`Deleted ${variantLabel.toLowerCase()} \"${node.label}\".`);\n };\n\n const deleteSelected = () => {\n if (selectedSet.size === 0) return;\n if (selectedSet.size === 1 && selected) { deleteNode(selected); return; }\n const ids = new Set(selectedSet);\n const updated = {\n ...model,\n nodes: model.nodes.filter(n => !ids.has(n.id)),\n edges: model.edges.filter(ed => !ids.has(ed.from) && !ids.has(ed.to)),\n };\n applyAndPush(updated);\n clearSelection();\n setAnnouncement(`Deleted ${ids.size} ${variantLabel.toLowerCase()}s.`);\n };\n\n const beginEditEdge = (edgeId: string) => {\n const edge = model.edges.find(e => e.id === edgeId);\n if (!edge) return;\n // Question-variant edge labels mirror an answer card; editing them on the canvas\n // would desync the card so we ignore the double-click for that variant.\n if (variant === 'question') return;\n setEditingEdgeId(edgeId);\n setEditEdgeLabel(edge.label ?? '');\n };\n\n const commitEdgeEdit = () => {\n if (!editingEdgeId) return;\n const next = editEdgeLabel.trim();\n const updated = {\n ...model,\n edges: model.edges.map(e => e.id === editingEdgeId\n ? { ...e, ...(next ? { label: next } : { label: undefined }) }\n : e),\n };\n applyAndPush(updated);\n setEditingEdgeId(null);\n };\n\n const onEdgeContextMenu = (e: React.MouseEvent, edgeId: string) => {\n e.preventDefault(); e.stopPropagation();\n setCtxMenu({ x: e.clientX, y: e.clientY, nodeId: null, edgeId });\n };\n\n const setEdgeStyle = (edgeId: string, style: 'solid' | 'dashed' | 'dotted') => {\n const updated = { ...model, edges: model.edges.map(e => e.id === edgeId ? { ...e, style } : e) };\n applyAndPush(updated);\n };\n\n const setEdgeArrowhead = (edgeId: string, arrowhead: 'arrow' | 'none') => {\n const updated = { ...model, edges: model.edges.map(e => e.id === edgeId ? { ...e, arrowhead } : e) };\n applyAndPush(updated);\n };\n\n const deleteEdge = (edgeId: string) => {\n const updated = { ...model, edges: model.edges.filter(e => e.id !== edgeId) };\n applyAndPush(updated);\n };\n\n const resetEdgeRouting = (edgeId: string) => {\n const updated = {\n ...model,\n edges: model.edges.map(e => {\n if (e.id !== edgeId) return e;\n const { waypoint: _ignored, ...rest } = e;\n void _ignored;\n return rest;\n }),\n };\n applyAndPush(updated);\n };\n\n const handleExport = useExporters(model, onExport, 'diagram');\n\n const positionFlowchartNodes = useCallback((m: DiagramModel): DiagramModel => ({\n ...m,\n nodes: m.nodes.map((n, i) => ({\n ...n,\n x: n.x ?? snap(80 + (i % 4) * 200),\n y: n.y ?? snap(80 + Math.floor(i / 4) * 140),\n })),\n }), []);\n const handleImport = useImporter(applyAndPush, { transform: positionFlowchartNodes });\n\n const acc = variantAccent(variant, isDark);\n const variantLabel = variant === 'question' ? 'Question' : variant === 'journey' ? 'Step' : 'Node';\n const shadowColor = isDark ? 'rgba(0,0,0,0.55)' : 'rgba(15,23,42,0.09)';\n const arrowColor = isDark ? '#64748b' : '#94a3b8';\n const amberArrow = isDark ? C.amberDark : C.amber;\n\n return (\n <div className=\"fsd-editor\" style={{ display: 'flex', flexDirection: 'column', height, width: '100%', fontFamily: 'ui-sans-serif,system-ui,sans-serif', boxSizing: 'border-box', background: t.ctrlsBg }}>\n <style>{`\n .fsd-editor button:focus-visible,\n .fsd-editor input:focus-visible,\n .fsd-editor textarea:focus-visible,\n .fsd-editor select:focus-visible,\n .fsd-editor [role=\"button\"]:focus-visible {\n outline: 2px solid ${acc.color};\n outline-offset: 2px;\n border-radius: 6px;\n }\n .fsd-editor svg[role=\"application\"]:focus-visible {\n outline: 2px solid ${acc.color};\n outline-offset: -2px;\n }\n `}</style>\n {/* Screen-reader live region — announces selection/add/delete actions. */}\n <div\n role=\"status\" aria-live=\"polite\" aria-atomic=\"true\"\n style={STYLE_SR_ONLY}\n >{announcement}</div>\n <Toolbar onExport={handleExport} onImport={allowImport ? handleImport : undefined} allowedExports={allowedExports} allowImport={allowImport} />\n\n {/* Controls bar */}\n <div style={{ display: 'flex', gap: 6, padding: '7px 14px', background: t.ctrlsBg, borderBottom: `1px solid ${t.ctrlsBorder}`, alignItems: 'center', flexWrap: 'wrap' }}>\n <button onClick={() => addNode()} style={ctrlBtn(acc.color, isDark)}>+ {variantLabel}</button>\n {selectedSet.size > 0 && (\n <>\n <div style={{ width: 1, height: 20, background: t.ctrlsBorder, margin: '0 2px' }} />\n <button onClick={deleteSelected} style={{ ...ctrlBtn('transparent', isDark), color: '#ef4444', border: `1px solid ${isDark ? '#7f1d1d' : '#fca5a5'}` }}>\n {selectedSet.size > 1 ? `Delete (${selectedSet.size})` : 'Delete'}\n </button>\n </>\n )}\n {liveEdge && (\n <span style={{ fontSize: 11, color: acc.color, fontWeight: 600, marginLeft: 6 }}>\n {liveEdge.answerLabel ? `Routing \"${liveEdge.answerLabel}\" →` : 'Drop on a node to connect'}\n <span style={{ fontWeight: 400, color: t.textMuted, marginLeft: 6 }}>release to cancel</span>\n </span>\n )}\n <span style={{ marginLeft: 'auto', fontSize: 11, color: t.textMuted }}>\n {variant === 'question' ? 'drag answer port to connect · ' : 'drag port dot · '}scroll to zoom · drag to pan\n </span>\n </div>\n\n {variant !== 'flowchart' && (\n <div style={{ padding: '3px 14px', background: acc.fill, borderBottom: `1px solid ${acc.border}`, fontSize: 11, color: acc.color, fontWeight: 600 }}>\n {variant === 'question' ? '? Question Flow — add answers in the panel, drag their port to connect' : '↗ Journey Map — numbered steps, drag port to sequence'}\n </div>\n )}\n\n <div style={STYLE_FLEX_ROW}>\n {/* Node navigator */}\n <NodeNavigator\n model={model} selected={selected} variant={variant}\n isDark={isDark} t={t} acc={acc}\n open={navOpen} onToggle={() => setNavOpen(v => !v)}\n onSelect={jumpToNode}\n />\n\n <div ref={containerRef} style={{ flex: 1, overflow: 'hidden', position: 'relative', background: t.canvas }}>\n <svg\n ref={svgRef}\n width=\"100%\" height=\"100%\"\n role=\"application\"\n aria-label={`${variantLabel} diagram editor. ${model.nodes.length} ${variantLabel.toLowerCase()}s, ${model.edges.length} connections. Scroll to zoom, drag to pan, click a ${variantLabel.toLowerCase()} to select.`}\n tabIndex={0}\n style={{ display: 'block', cursor: pan ? 'grabbing' : drag ? 'grabbing' : liveEdge ? 'crosshair' : 'default', userSelect: 'none', outline: 'none' }}\n onMouseDown={onSvgMouseDown}\n onMouseMove={onMouseMove}\n onMouseUp={onMouseUp}\n onMouseLeave={onMouseUp}\n onContextMenu={onSvgContextMenu}\n >\n <defs>\n <style>{reducedMotion ? `\n .edge-flow { stroke-dasharray: 0; }\n .edge-flow-amber { stroke-dasharray: 0; }\n .edge-live { stroke-dasharray: 4 4; }\n ` : `\n @keyframes edgeFlow { to { stroke-dashoffset: -13; } }\n @keyframes edgeFlowFast { to { stroke-dashoffset: -13; } }\n .edge-flow { stroke-dasharray: 8 5; animation: edgeFlow 0.9s linear infinite; }\n .edge-flow-amber { stroke-dasharray: 6 4; animation: edgeFlowFast 0.65s linear infinite; }\n .edge-live { stroke-dasharray: 7 5; animation: edgeFlow 0.55s linear infinite; }\n `}</style>\n <pattern id=\"dots\" width={GRID} height={GRID} patternUnits=\"userSpaceOnUse\">\n <circle cx={GRID / 2} cy={GRID / 2} r={1.1} fill={t.dot} />\n </pattern>\n <filter id=\"nodeShadow\" x=\"-25%\" y=\"-25%\" width=\"150%\" height=\"160%\">\n <feDropShadow dx=\"0\" dy=\"3\" stdDeviation=\"5\" floodColor={shadowColor} floodOpacity=\"1\" />\n </filter>\n <marker id=\"arrowhead\" markerWidth=\"9\" markerHeight=\"7\" refX=\"8\" refY=\"3.5\" orient=\"auto\" markerUnits=\"strokeWidth\">\n <path d=\"M0,0.5 L9,3.5 L0,6.5 L2.2,3.5 Z\" fill={arrowColor} />\n </marker>\n <marker id=\"arrowAmber\" markerWidth=\"9\" markerHeight=\"7\" refX=\"8\" refY=\"3.5\" orient=\"auto\" markerUnits=\"strokeWidth\">\n <path d=\"M0,0.5 L9,3.5 L0,6.5 L2.2,3.5 Z\" fill={amberArrow} />\n </marker>\n <marker id=\"arrowLive\" markerWidth=\"9\" markerHeight=\"7\" refX=\"8\" refY=\"3.5\" orient=\"auto\" markerUnits=\"strokeWidth\">\n <path d=\"M0,0.5 L9,3.5 L0,6.5 L2.2,3.5 Z\" fill={acc.color} />\n </marker>\n </defs>\n\n <rect width=\"100%\" height=\"100%\" fill=\"url(#dots)\" data-bg=\"1\" />\n\n <g transform={`translate(${transform.x},${transform.y}) scale(${transform.scale})`}>\n {model.edges.map(e => (\n <EdgeLine\n key={e.id} edge={e} nodes={model.nodes} variant={variant} t={t} isDark={isDark} acc={acc}\n editing={editingEdgeId === e.id}\n editValue={editEdgeLabel}\n onEditChange={setEditEdgeLabel}\n onEditCommit={commitEdgeEdit}\n onEditCancel={() => setEditingEdgeId(null)}\n onDoubleClick={beginEditEdge}\n onContextMenu={onEdgeContextMenu}\n onWaypointDown={(ev, edgeId) => setWaypointDrag(edgeId)}\n />\n ))}\n\n {liveEdge && (() => {\n const d = bezierPath(liveEdge.fromX, liveEdge.fromY, liveEdge.toX, liveEdge.toY, liveEdge.exitDir);\n return <path d={d} fill=\"none\" stroke={acc.color} strokeWidth={2} strokeLinecap=\"round\" className=\"edge-live\" opacity={0.8} markerEnd=\"url(#arrowLive)\" />;\n })()}\n\n {alignGuides?.x && (\n <line\n x1={alignGuides.x.pos} x2={alignGuides.x.pos}\n y1={alignGuides.x.minY} y2={alignGuides.x.maxY}\n stroke={acc.color} strokeWidth={1 / transform.scale}\n strokeDasharray={`${4 / transform.scale} ${3 / transform.scale}`}\n opacity={0.85} pointerEvents=\"none\"\n />\n )}\n {alignGuides?.y && (\n <line\n y1={alignGuides.y.pos} y2={alignGuides.y.pos}\n x1={alignGuides.y.minX} x2={alignGuides.y.maxX}\n stroke={acc.color} strokeWidth={1 / transform.scale}\n strokeDasharray={`${4 / transform.scale} ${3 / transform.scale}`}\n opacity={0.85} pointerEvents=\"none\"\n />\n )}\n\n {model.nodes.map((node, idx) => {\n const isHovered = hoveredId === node.id;\n const isQuestion = variant === 'question';\n const { w: nW, h: nH } = nodeDims(node, variant);\n const isSelected = selectedSet.has(node.id);\n\n return (\n <g\n key={node.id}\n transform={`translate(${node.x ?? 0},${node.y ?? 0})`}\n role=\"button\"\n aria-label={`${variantLabel} ${variant === 'journey' ? idx + 1 + ': ' : ''}${node.label}${isSelected ? ', selected' : ''}`}\n style={{ cursor: drag?.nodeId === node.id ? 'grabbing' : 'grab' }}\n onMouseDown={e => onNodeMouseDown(e, node.id)}\n onMouseUp={e => onNodeMouseUp(e, node.id)}\n onDoubleClick={e => onNodeDblClick(e, node.id)}\n onContextMenu={e => onNodeContextMenu(e, node.id)}\n onMouseEnter={() => setHoveredId(node.id)}\n onMouseLeave={() => setHoveredId(null)}\n >\n <title>{`${variantLabel}: ${node.label}`}</title>\n {isQuestion ? (\n <QuestionNode node={node} selected={isSelected} edges={model.edges} isDark={isDark} onAnswerPortDown={onAnswerPortDown} qW={nW} />\n ) : (\n <>\n <NodeShape node={node} selected={isSelected} variant={variant} stepNumber={variant === 'journey' ? idx + 1 : undefined} t={t} isDark={isDark} w={nW} />\n {editingId === node.id ? (\n <foreignObject x={6} y={6} width={nW - 12} height={NODE_H - 12}>\n <input\n autoFocus\n value={editLabel}\n onChange={e => setEditLabel(e.target.value)}\n onBlur={commitEdit}\n onKeyDown={e => { if (e.key === 'Enter') commitEdit(); if (e.key === 'Escape') setEditingId(null); }}\n style={{ width: '100%', height: '100%', border: 'none', borderRadius: 6, outline: `2px solid ${acc.color}`, textAlign: 'center', fontSize: 13, fontWeight: 500, background: t.inputBg, boxSizing: 'border-box', padding: '0 6px', fontFamily: 'inherit', color: t.inputText }}\n />\n </foreignObject>\n ) : (\n <text x={nW / 2} y={NODE_H / 2 + 5} textAnchor=\"middle\" fontSize={13} fontWeight=\"500\" fontFamily=\"ui-sans-serif,system-ui,sans-serif\" fill={isSelected ? acc.color : t.textPrimary} style={STYLE_LABEL}>\n {node.label}\n </text>\n )}\n <circle\n cx={nW / 2} cy={NODE_H + 1} r={portR}\n fill={acc.color} stroke={isDark ? '#0f172a' : 'white'} strokeWidth={2}\n style={{ cursor: 'crosshair', opacity: isHovered || isCoarse ? 1 : 0, transition: 'opacity 0.15s', pointerEvents: (isHovered || isCoarse) ? 'all' : 'none', filter: 'drop-shadow(0 1px 3px rgba(0,0,0,0.25))' }}\n onMouseDown={e => onPortMouseDown(e, node.id)}\n />\n </>\n )}\n\n {liveEdge && liveEdge.fromId !== node.id && (\n <circle cx={nW / 2} cy={-1} r={portR} fill={acc.color} stroke={isDark ? '#0f172a' : 'white'} strokeWidth={2} style={STYLE_LIVE_PORT} />\n )}\n </g>\n );\n })}\n </g>\n </svg>\n\n {boxSel && Math.abs(boxSel.cx - boxSel.sx) + Math.abs(boxSel.cy - boxSel.sy) > 4 && containerRef.current && (() => {\n const rect = containerRef.current.getBoundingClientRect();\n const left = Math.min(boxSel.sx, boxSel.cx) - rect.left;\n const top = Math.min(boxSel.sy, boxSel.cy) - rect.top;\n const w = Math.abs(boxSel.cx - boxSel.sx);\n const h = Math.abs(boxSel.cy - boxSel.sy);\n return (\n <div\n style={{\n position: 'absolute', left, top, width: w, height: h,\n border: `1px dashed ${acc.color}`,\n background: isDark ? 'rgba(99,102,241,0.10)' : 'rgba(99,102,241,0.08)',\n pointerEvents: 'none', borderRadius: 4,\n }}\n />\n );\n })()}\n\n {model.nodes.length === 0 && (\n <div style={{ position: 'absolute', inset: 0, display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', pointerEvents: 'none', gap: 8 }}>\n <div style={{ fontSize: 36, opacity: 0.1, color: t.textPrimary }}>{variant === 'question' ? '?' : variant === 'journey' ? '↗' : '⬡'}</div>\n <div style={{ fontSize: 13, color: t.textMuted, fontWeight: 500 }}>Click <strong style={{ color: acc.color }}>+ {variantLabel}</strong> to start</div>\n </div>\n )}\n\n {model.nodes.length > 0 && viewport.w > 0 && (\n <Minimap\n model={model}\n viewportW={viewport.w}\n viewportH={viewport.h}\n transform={transform}\n isDark={isDark}\n accentColor={acc.color}\n measureNode={(n) => nodeDims(n, variant)}\n onCenterOn={(cx, cy) => {\n setTransform(tr => ({ ...tr, x: viewport.w / 2 - cx * tr.scale, y: viewport.h / 2 - cy * tr.scale }));\n }}\n />\n )}\n\n {/* Context menu */}\n {ctxMenu && (() => {\n const ctxEdge = ctxMenu.edgeId ? model.edges.find(e => e.id === ctxMenu.edgeId) : undefined;\n return <ContextMenu\n x={ctxMenu.x} y={ctxMenu.y}\n nodeId={ctxMenu.nodeId} edgeId={ctxMenu.edgeId}\n isDark={isDark} t={t} acc={acc}\n canUndo={history.canUndo}\n canRedo={history.canRedo}\n onUndo={() => { undo(); setCtxMenu(null); }}\n onRedo={() => { redo(); setCtxMenu(null); }}\n onReCenter={() => { reCenter(); setCtxMenu(null); }}\n onAddNode={() => {\n const rect = svgRef.current!.getBoundingClientRect();\n const cx = (ctxMenu.x - rect.left - transform.x) / transform.scale;\n const cy = (ctxMenu.y - rect.top - transform.y) / transform.scale;\n addNode({ x: cx, y: cy }); setCtxMenu(null);\n }}\n onDuplicate={() => { if (ctxMenu.nodeId) { duplicateNode(ctxMenu.nodeId); setCtxMenu(null); } }}\n onRename={() => {\n if (ctxMenu.nodeId) {\n const node = model.nodes.find(n => n.id === ctxMenu.nodeId)!;\n setEditingId(ctxMenu.nodeId); setEditLabel(node.label); setCtxMenu(null);\n }\n }}\n onDelete={() => { if (ctxMenu.nodeId) { deleteNode(ctxMenu.nodeId); setCtxMenu(null); } }}\n onDisconnect={() => {\n if (ctxMenu.nodeId) {\n const m = { ...model, edges: model.edges.filter(e => e.from !== ctxMenu.nodeId && e.to !== ctxMenu.nodeId) };\n applyAndPush(m); setCtxMenu(null);\n }\n }}\n currentEdgeStyle={ctxEdge?.style ?? 'solid'}\n currentEdgeArrow={ctxEdge?.arrowhead ?? 'arrow'}\n edgeHasWaypoint={!!ctxEdge?.waypoint}\n onEdgeRename={() => { if (ctxMenu.edgeId) { beginEditEdge(ctxMenu.edgeId); setCtxMenu(null); } }}\n onEdgeStyle={(s) => { if (ctxMenu.edgeId) { setEdgeStyle(ctxMenu.edgeId, s); setCtxMenu(null); } }}\n onEdgeArrowhead={(a) => { if (ctxMenu.edgeId) { setEdgeArrowhead(ctxMenu.edgeId, a); setCtxMenu(null); } }}\n onEdgeDelete={() => { if (ctxMenu.edgeId) { deleteEdge(ctxMenu.edgeId); setCtxMenu(null); } }}\n onEdgeResetRouting={() => { if (ctxMenu.edgeId) { resetEdgeRouting(ctxMenu.edgeId); setCtxMenu(null); } }}\n containerRef={containerRef}\n />;\n })()}\n </div>\n\n {selected && (\n <StepEditor key={selected} nodeId={selected} model={model} onModelChange={m => { applyAndPush(m); }} variant={variant} isDark={isDark} t={t} acc={acc} />\n )}\n </div>\n\n <div style={{ padding: '4px 14px', fontSize: 11, color: t.textMuted, background: t.statusBg, borderTop: `1px solid ${t.ctrlsBorder}`, display: 'flex', gap: 16 }}>\n <span>{model.nodes.length} {variantLabel.toLowerCase()}s</span>\n <span>{model.edges.length} connections</span>\n <span>{Math.round(transform.scale * 100)}% zoom</span>\n <span style={{ marginLeft: 'auto' }}>Ctrl+Z undo · Ctrl+Y redo · Ctrl+0 fit · Alt+Arrow traverse</span>\n {selected && <span style={{ color: acc.color }}>{model.nodes.find(n => n.id === selected)?.label}</span>}\n </div>\n </div>\n );\n}\n\nfunction ctrlBtn(accent: string, isDark: boolean): React.CSSProperties {\n const isTransparent = accent === 'transparent';\n return {\n display: 'inline-flex', alignItems: 'center', gap: 5,\n padding: '5px 12px',\n background: isTransparent ? 'transparent' : accent,\n color: isTransparent ? '#ef4444' : '#fff',\n border: isTransparent ? `1px solid ${isDark ? '#7f1d1d' : '#fca5a5'}` : 'none',\n borderRadius: 6, cursor: 'pointer', fontSize: 12, fontWeight: 500, fontFamily: 'inherit',\n };\n}\n","import React, { useState } from 'react';\nimport { ImportDialog } from './ImportDialog.js';\nimport { darkTheme, ACCENT } from './theme.js';\nimport type { ExportFormat } from '../core/types.js';\n\nconst ALL_FORMATS: { key: ExportFormat; label: string }[] = [\n { key: 'mermaid', label: 'Mermaid' },\n { key: 'plantuml', label: 'PlantUML' },\n { key: 'json', label: 'JSON' },\n { key: 'svg', label: 'SVG' },\n { key: 'png', label: 'PNG' },\n];\n\ninterface ToolbarProps {\n onExport: (format: ExportFormat) => void;\n onImport?: (text: string) => void;\n allowedExports?: ExportFormat[];\n allowImport?: boolean;\n}\n\nexport function Toolbar({ onExport, onImport, allowedExports, allowImport = true }: ToolbarProps) {\n const [importOpen, setImportOpen] = useState(false);\n const formats = allowedExports\n ? ALL_FORMATS.filter(f => allowedExports.includes(f.key))\n : ALL_FORMATS;\n\n return (\n <div style={bar}>\n <div style={brand}>\n <div style={brandDot} />\n <span>flowchart</span>\n <span style={{ color: darkTheme.textSecondary, fontWeight: 400 }}>/</span>\n <span style={{ color: ACCENT.indigo }}>designer</span>\n </div>\n\n <div style={divider} />\n\n <div style={{ display: 'flex', gap: 4, alignItems: 'center' }}>\n {allowImport && onImport && (\n <button onClick={() => setImportOpen(true)} style={ghostBtn}>\n ↑ Import\n </button>\n )}\n {formats.length > 0 && (\n <>\n <span style={{ fontSize: 11, color: darkTheme.inputText, margin: '0 4px' }}>Export →</span>\n {formats.map(f => (\n <button key={f.key} onClick={() => onExport(f.key)} style={exportBtn}>\n {f.label}\n </button>\n ))}\n </>\n )}\n </div>\n {onImport && (\n <ImportDialog\n open={importOpen}\n onClose={() => setImportOpen(false)}\n onImport={onImport}\n />\n )}\n </div>\n );\n}\n\n// Toolbar is intentionally always-dark chrome regardless of editor theme — it\n// reads from `darkTheme` directly rather than threading a runtime theme prop.\nconst bar: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n padding: '0 14px',\n height: 44,\n background: darkTheme.panelBg,\n borderBottom: `1px solid ${darkTheme.panelBorder}`,\n flexShrink: 0,\n};\nconst brand: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 5,\n fontSize: 13,\n fontWeight: 700,\n color: darkTheme.textPrimary,\n letterSpacing: 0.2,\n fontFamily: 'ui-monospace,monospace',\n};\nconst brandDot: React.CSSProperties = {\n width: 7,\n height: 7,\n borderRadius: '50%',\n background: ACCENT.indigo,\n boxShadow: `0 0 6px ${ACCENT.indigoLight}`,\n};\nconst divider: React.CSSProperties = {\n width: 1,\n height: 20,\n background: darkTheme.panelBorder,\n margin: '0 4px',\n};\nconst ghostBtn: React.CSSProperties = {\n padding: '4px 10px',\n background: 'transparent',\n color: darkTheme.textSecondary,\n border: `1px solid ${darkTheme.panelBorder}`,\n borderRadius: 6,\n cursor: 'pointer',\n fontSize: 11,\n fontWeight: 500,\n fontFamily: 'inherit',\n letterSpacing: 0.2,\n};\nconst exportBtn: React.CSSProperties = {\n padding: '4px 10px',\n background: ACCENT.indigoSoftBg,\n color: ACCENT.indigoText,\n border: `1px solid ${ACCENT.indigoSoftBorder}`,\n borderRadius: 6,\n cursor: 'pointer',\n fontSize: 11,\n fontWeight: 600,\n fontFamily: 'ui-monospace,monospace',\n letterSpacing: 0.3,\n};\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\n\nexport interface ImportDialogProps {\n open: boolean;\n onClose(): void;\n onImport(text: string): void;\n}\n\n/**\n * Modal for importing a Mermaid or JSON diagram. Textarea for paste plus a\n * file picker (.json / .mmd / .mermaid / .txt). Auto-detects format from\n * the body: leading `{` → JSON, otherwise Mermaid.\n */\nexport function ImportDialog({ open, onClose, onImport }: ImportDialogProps) {\n const [text, setText] = useState('');\n const [fileName, setFileName] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const dialogRef = useRef<HTMLDivElement>(null);\n\n // Reset every time the dialog opens; focus the textarea so paste works\n // without an extra click.\n useEffect(() => {\n if (!open) return;\n setText('');\n setFileName(null);\n setError(null);\n const id = requestAnimationFrame(() => textareaRef.current?.focus());\n return () => cancelAnimationFrame(id);\n }, [open]);\n\n // Esc closes, Tab is trapped inside the dialog so focus can't leak to the\n // editor underneath.\n useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n onClose();\n return;\n }\n if (e.key !== 'Tab') return;\n const root = dialogRef.current;\n if (!root) return;\n const focusables = root.querySelectorAll<HTMLElement>(\n 'button:not([disabled]), textarea, input:not([type=\"file\"])',\n );\n if (focusables.length === 0) return;\n const first = focusables[0];\n const last = focusables[focusables.length - 1];\n const active = document.activeElement as HTMLElement | null;\n if (e.shiftKey && active === first) { e.preventDefault(); last.focus(); }\n else if (!e.shiftKey && active === last) { e.preventDefault(); first.focus(); }\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [open, onClose]);\n\n const onFile = useCallback((file: File) => {\n setError(null);\n setFileName(file.name);\n const reader = new FileReader();\n reader.onload = () => {\n const result = typeof reader.result === 'string' ? reader.result : '';\n setText(result);\n };\n reader.onerror = () => setError(`Could not read ${file.name}`);\n reader.readAsText(file);\n }, []);\n\n const onSubmit = useCallback(() => {\n const trimmed = text.trim();\n if (!trimmed) {\n setError('Paste a diagram or pick a file first.');\n return;\n }\n try {\n onImport(trimmed);\n onClose();\n } catch (e) {\n setError((e as Error).message);\n }\n }, [text, onImport, onClose]);\n\n if (!open) return null;\n\n const trimmed = text.trim();\n const detected = !trimmed ? null : trimmed.startsWith('{') ? 'JSON' : 'Mermaid';\n const canSubmit = trimmed.length > 0;\n\n return (\n <div role=\"presentation\" onClick={onClose} style={s.backdrop}>\n <div\n ref={dialogRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"fsd-import-title\"\n onClick={(e) => e.stopPropagation()}\n style={s.dialog}\n >\n <header style={s.header}>\n <div style={s.brandDot} />\n <h2 id=\"fsd-import-title\" style={s.title}>Import diagram</h2>\n <span style={s.headerHint}>Mermaid or JSON</span>\n </header>\n\n <div style={s.body}>\n <label htmlFor=\"fsd-import-textarea\" style={s.label}>Paste source</label>\n <textarea\n id=\"fsd-import-textarea\"\n ref={textareaRef}\n value={text}\n onChange={(e) => { setText(e.target.value); setError(null); }}\n placeholder={PLACEHOLDER}\n spellCheck={false}\n style={s.textarea}\n />\n\n <div style={s.fileRow}>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".json,.mmd,.mermaid,.txt,application/json,text/plain\"\n style={s.hiddenFile}\n onChange={(e) => {\n const f = e.target.files?.[0];\n if (f) onFile(f);\n e.target.value = '';\n }}\n />\n <button type=\"button\" onClick={() => fileInputRef.current?.click()} style={s.fileBtn}>\n Choose file…\n </button>\n <span style={s.fileName}>{fileName ?? '.json, .mmd, .mermaid, .txt'}</span>\n </div>\n\n <div style={s.status} aria-live=\"polite\">\n {error ? (\n <span style={s.error}>! {error}</span>\n ) : detected ? (\n <span style={s.ok}>Detected: {detected}</span>\n ) : null}\n </div>\n </div>\n\n <footer style={s.footer}>\n <button type=\"button\" onClick={onClose} style={s.cancelBtn}>Cancel</button>\n <button\n type=\"button\"\n onClick={onSubmit}\n disabled={!canSubmit}\n style={{ ...s.submitBtn, ...(canSubmit ? null : s.submitBtnDisabled) }}\n >\n Import\n </button>\n </footer>\n </div>\n </div>\n );\n}\n\nconst PLACEHOLDER =\n 'flowchart TD\\n A[Start] --> B{Choice?}\\n B -->|yes| C[Done]\\n B -->|no| A';\n\n// ── Styles ────────────────────────────────────────────────────────────────\n// The dialog is launched from the Toolbar which is fixed-dark, so the modal\n// matches that surface rather than the canvas's themed palette.\nconst s = {\n backdrop: {\n position: 'fixed', inset: 0, zIndex: 100,\n background: 'rgba(15, 23, 42, 0.65)',\n backdropFilter: 'blur(2px)',\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n padding: 24, fontFamily: 'ui-sans-serif,system-ui,sans-serif',\n },\n dialog: {\n width: 'min(560px, 100%)', maxHeight: '90vh',\n background: '#1e293b', color: '#f1f5f9',\n border: '1px solid #334155', borderRadius: 12,\n boxShadow: '0 24px 64px rgba(0,0,0,0.45)',\n display: 'flex', flexDirection: 'column', overflow: 'hidden',\n },\n header: {\n padding: '14px 18px', borderBottom: '1px solid #334155',\n display: 'flex', alignItems: 'center', gap: 10,\n },\n brandDot: {\n width: 8, height: 8, borderRadius: '50%',\n background: '#4f46e5', boxShadow: '0 0 8px #818cf8',\n },\n title: {\n margin: 0, fontSize: 14, fontWeight: 700, letterSpacing: 0.2,\n color: '#f1f5f9', fontFamily: 'ui-monospace,monospace',\n },\n headerHint: { marginLeft: 'auto', fontSize: 11, color: '#64748b' },\n body: { padding: 18, display: 'flex', flexDirection: 'column', gap: 12, overflow: 'auto' },\n label: {\n fontSize: 11, fontWeight: 600, color: '#94a3b8',\n letterSpacing: 0.4, textTransform: 'uppercase',\n },\n textarea: {\n width: '100%', minHeight: 180,\n padding: '10px 12px', borderRadius: 8,\n background: '#0f172a', color: '#e2e8f0',\n border: '1px solid #334155', outline: 'none',\n fontFamily: 'ui-monospace,SFMono-Regular,Menlo,Consolas,monospace',\n fontSize: 12, lineHeight: 1.55, resize: 'vertical',\n boxSizing: 'border-box',\n },\n fileRow: {\n display: 'flex', alignItems: 'center', gap: 10,\n padding: '10px 12px', borderRadius: 8,\n background: 'rgba(79, 70, 229, 0.08)',\n border: '1px dashed rgba(79, 70, 229, 0.4)',\n },\n hiddenFile: { display: 'none' },\n fileBtn: {\n padding: '6px 12px', borderRadius: 6, cursor: 'pointer',\n background: '#4f46e5', color: '#fff', border: 'none',\n fontSize: 11, fontWeight: 600, fontFamily: 'inherit',\n letterSpacing: 0.2,\n },\n fileName: {\n fontSize: 11, color: '#cbd5e1', flex: 1,\n overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap',\n },\n status: { display: 'flex', alignItems: 'center', minHeight: 16 },\n error: { fontSize: 11, color: '#fca5a5', fontWeight: 500 },\n ok: { fontSize: 11, color: '#86efac', fontWeight: 500 },\n footer: {\n padding: '12px 18px', borderTop: '1px solid #334155',\n display: 'flex', justifyContent: 'flex-end', gap: 8,\n background: '#0f172a',\n },\n cancelBtn: {\n padding: '6px 14px', borderRadius: 6, cursor: 'pointer',\n background: 'transparent', color: '#cbd5e1',\n border: '1px solid #334155',\n fontSize: 12, fontWeight: 500, fontFamily: 'inherit',\n },\n submitBtn: {\n padding: '6px 14px', borderRadius: 6, cursor: 'pointer',\n background: '#4f46e5', color: '#fff', border: 'none',\n fontSize: 12, fontWeight: 600, fontFamily: 'inherit',\n letterSpacing: 0.2,\n },\n submitBtnDisabled: { cursor: 'not-allowed', background: 'rgba(79,70,229,0.35)' },\n} satisfies Record<string, React.CSSProperties>;\n","import type { DiagramVariant } from '../core/types.js';\n\n/**\n * Color palette for the flowchart `<DiagramEditor>`. Every visual surface\n * pulls from one of these tokens, so overriding any single property via\n * `themeOverrides` updates every element that uses it. Built-in\n * `lightTheme` and `darkTheme` are exported as ready-made values.\n *\n * Token groups:\n * - `canvas` / `dot` — background and dot-grid color.\n * - `nodeFill` / `nodeStroke` / `nodeSelectedFill` — base node styling.\n * - `edgeColor` — edge stroke and arrowhead color.\n * - `text*` — type ramp (primary > secondary > muted).\n * - `panel*` / `ctrls*` / `input*` / `card*` / `section*` — chrome around\n * the canvas (side panel, controls, form fields, card rows).\n * - `labelText` / `hintText` — small-text accents inside chrome.\n * - `statusBg` / `bannerBg` — bottom validation banner backdrop.\n * - `btnSec*` / `shapeBtn*` — secondary button surfaces.\n * - `addFormBg` — accent backdrop for the \"add node\" form.\n */\nexport interface ThemeColors {\n canvas: string; dot: string;\n nodeFill: string; nodeStroke: string; nodeSelectedFill: string;\n edgeColor: string;\n textPrimary: string; textSecondary: string; textMuted: string;\n panelBg: string; panelBorder: string;\n ctrlsBg: string; ctrlsBorder: string;\n inputBg: string; inputBorder: string; inputText: string;\n cardBg: string; cardBorder: string;\n sectionBorder: string;\n labelText: string;\n hintText: string;\n statusBg: string;\n btnSecBg: string; btnSecText: string;\n shapeBtnBg: string; shapeBtnBorder: string;\n addFormBg: string;\n bannerBg: string;\n}\n\n/** Default light palette. Indigo accent on a near-white canvas. */\nexport const lightTheme: ThemeColors = {\n canvas: '#fafbfc', dot: '#dbe3ee',\n nodeFill: '#ffffff', nodeStroke: '#cbd5e1', nodeSelectedFill: '#eef2ff',\n edgeColor: '#94a3b8',\n textPrimary: '#1e293b', textSecondary: '#475569', textMuted: '#94a3b8',\n panelBg: '#ffffff', panelBorder: '#e2e8f0',\n ctrlsBg: '#ffffff', ctrlsBorder: '#cbd5e1',\n inputBg: '#f8fafc', inputBorder: '#e2e8f0', inputText: '#1e293b',\n cardBg: '#f8fafc', cardBorder: '#e2e8f0',\n sectionBorder: '#f1f5f9',\n labelText: '#94a3b8',\n hintText: '#94a3b8',\n statusBg: '#ffffff',\n btnSecBg: '#e2e8f0', btnSecText: '#475569',\n shapeBtnBg: '#f1f5f9', shapeBtnBorder: '#e2e8f0',\n addFormBg: '#f5f3ff',\n bannerBg: '#f8fafc',\n};\n\n/** Default dark palette. Slate canvas with a softer indigo accent. */\nexport const darkTheme: ThemeColors = {\n canvas: '#0f172a', dot: '#1e293b',\n nodeFill: '#1e293b', nodeStroke: '#334155', nodeSelectedFill: '#1e1b4b',\n edgeColor: '#475569',\n textPrimary: '#f1f5f9', textSecondary: '#94a3b8', textMuted: '#475569',\n panelBg: '#1e293b', panelBorder: '#334155',\n ctrlsBg: '#0f172a', ctrlsBorder: '#1e293b',\n inputBg: '#0f172a', inputBorder: '#334155', inputText: '#e2e8f0',\n cardBg: '#0f172a', cardBorder: '#334155',\n sectionBorder: '#0f172a',\n labelText: '#475569',\n hintText: '#475569',\n statusBg: '#0f172a',\n btnSecBg: '#334155', btnSecText: '#94a3b8',\n shapeBtnBg: '#0f172a', shapeBtnBorder: '#334155',\n addFormBg: '#1e1b4b',\n bannerBg: '#1e293b',\n};\n\nexport const ACCENT = {\n indigo: '#4f46e5', indigoGlow: 'rgba(79,70,229,0.22)',\n indigoLight: '#818cf8', indigoText: '#a5b4fc',\n indigoSoftBg: 'rgba(79,70,229,0.15)', indigoSoftBorder: 'rgba(79,70,229,0.3)',\n amber: '#d97706', amberLight: '#fef3c7', amberBorder: '#fcd34d', amberGlow: 'rgba(217,119,6,0.25)',\n amberDark: '#fbbf24', amberDarkLight: 'rgba(251,191,36,0.12)', amberDarkBorder: 'rgba(251,191,36,0.3)',\n emerald: '#059669', emeraldLight: '#ecfdf5', emeraldGlow: 'rgba(5,150,105,0.2)',\n emeraldDark: '#10b981', emeraldDarkLight: 'rgba(16,185,129,0.12)', emeraldDarkBorder: 'rgba(16,185,129,0.3)',\n};\n\nexport interface VariantAccent {\n color: string;\n fill: string;\n border: string;\n glow: string;\n}\n\nexport function variantAccent(variant: DiagramVariant, isDark: boolean): VariantAccent {\n if (variant === 'question') {\n return isDark\n ? { color: ACCENT.amberDark, fill: ACCENT.amberDarkLight, border: ACCENT.amberDarkBorder, glow: ACCENT.amberGlow }\n : { color: ACCENT.amber, fill: ACCENT.amberLight, border: ACCENT.amberBorder, glow: ACCENT.amberGlow };\n }\n if (variant === 'journey') {\n return isDark\n ? { color: ACCENT.emeraldDark, fill: ACCENT.emeraldDarkLight, border: ACCENT.emeraldDarkBorder, glow: ACCENT.emeraldGlow }\n : { color: ACCENT.emerald, fill: ACCENT.emeraldLight, border: '#6ee7b7', glow: ACCENT.emeraldGlow };\n }\n return isDark\n ? { color: '#818cf8', fill: 'rgba(79,70,229,0.12)', border: 'rgba(79,70,229,0.3)', glow: ACCENT.indigoGlow }\n : { color: ACCENT.indigo, fill: '#f5f3ff', border: '#c7d2fe', glow: ACCENT.indigoGlow };\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport type { DiagramModel, DiagramNode, DiagramEdge, NodeShape, DiagramVariant } from '../core/types.js';\nimport { nextId } from '../core/ids.js';\nimport { lightTheme, darkTheme, variantAccent, type ThemeColors, type VariantAccent } from './theme.js';\n\ninterface StepEditorProps {\n nodeId: string;\n model: DiagramModel;\n onModelChange: (model: DiagramModel) => void;\n variant?: DiagramVariant;\n isDark?: boolean;\n t?: ThemeColors;\n acc?: VariantAccent;\n}\n\nconst SHAPES: { key: NodeShape; label: string; icon: string }[] = [\n { key: 'rectangle', label: 'Box', icon: '▭' },\n { key: 'diamond', label: 'Decision', icon: '◇' },\n { key: 'circle', label: 'Circle', icon: '○' },\n { key: 'parallelogram', label: 'I/O', icon: '▱' },\n];\n\nexport function StepEditor({ nodeId, model, onModelChange, variant = 'flowchart', isDark = false, t, acc }: StepEditorProps) {\n const isQuestion = variant === 'question';\n const branchTerm = isQuestion ? 'Answer' : 'Branch';\n\n // Fall back to the built-in theme when used standalone (without DiagramEditor wiring).\n const tt = t ?? (isDark ? darkTheme : lightTheme);\n const aa = acc ?? variantAccent(variant, isDark);\n const accentColor = aa.color;\n const accentLight = aa.fill;\n const accentBorder = aa.border;\n\n const node = model.nodes.find(n => n.id === nodeId);\n const [label, setLabel] = useState(node?.label ?? '');\n const [addingBranch, setAddingBranch] = useState(false);\n const [branchMode, setBranchMode] = useState<'new' | 'existing'>('new');\n const [branchLabel, setBranchLabel] = useState('');\n const [branchEdgeLabel, setBranchEdgeLabel] = useState('');\n const [branchTarget, setBranchTarget] = useState('');\n const [newAnswer, setNewAnswer] = useState('');\n const [addingAnswer, setAddingAnswer] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n setLabel(node?.label ?? '');\n setAddingBranch(false);\n setAddingAnswer(false);\n setBranchLabel(''); setBranchEdgeLabel(''); setBranchTarget(''); setNewAnswer('');\n setTimeout(() => inputRef.current?.focus(), 50);\n }, [nodeId]);\n\n if (!node) return null;\n\n const outEdges = model.edges.filter(e => e.from === nodeId);\n const otherNodes = model.nodes.filter(n => n.id !== nodeId);\n const answers: string[] = (node.metadata?.answers as string[] | undefined) ?? [];\n\n const commitLabel = () => {\n if (label === node.label || !label.trim()) return;\n onModelChange({ ...model, nodes: model.nodes.map(n => n.id === nodeId ? { ...n, label: label.trim() } : n) });\n };\n\n const setShape = (shape: NodeShape) => {\n onModelChange({ ...model, nodes: model.nodes.map(n => n.id === nodeId ? { ...n, shape } : n) });\n };\n\n const removeEdge = (edgeId: string) => {\n onModelChange({ ...model, edges: model.edges.filter(e => e.id !== edgeId) });\n };\n\n const updateEdgeLabel = (edgeId: string, val: string) => {\n onModelChange({ ...model, edges: model.edges.map(e => e.id === edgeId ? { ...e, label: val || undefined } : e) });\n };\n\n const addBranch = () => {\n if (branchMode === 'new') {\n if (!branchLabel.trim()) return;\n const newId = nextId('node', model.nodes);\n const newNode: DiagramNode = { id: newId, label: branchLabel.trim(), shape: 'rectangle', x: (node.x ?? 0) + 200, y: (node.y ?? 0) + 20 + outEdges.length * 100 };\n const newEdge: DiagramEdge = { id: nextId('e', model.edges), from: nodeId, to: newId, label: branchEdgeLabel.trim() || undefined };\n onModelChange({ ...model, nodes: [...model.nodes, newNode], edges: [...model.edges, newEdge] });\n } else {\n if (!branchTarget || model.edges.some(e => e.from === nodeId && e.to === branchTarget)) return;\n const newEdge: DiagramEdge = { id: nextId('e', model.edges), from: nodeId, to: branchTarget, label: branchEdgeLabel.trim() || undefined };\n onModelChange({ ...model, edges: [...model.edges, newEdge] });\n }\n setBranchLabel(''); setBranchEdgeLabel(''); setBranchTarget(''); setAddingBranch(false);\n };\n\n const addAnswer = () => {\n const trimmed = newAnswer.trim();\n if (!trimmed || answers.includes(trimmed)) return;\n const updated = [...answers, trimmed];\n onModelChange({ ...model, nodes: model.nodes.map(n => n.id === nodeId ? { ...n, metadata: { ...(n.metadata ?? {}), answers: updated } } : n) });\n setNewAnswer(''); setAddingAnswer(false);\n };\n\n const removeAnswer = (ans: string) => {\n const updated = answers.filter(a => a !== ans);\n const updatedEdges = model.edges.filter(e => !(e.from === nodeId && e.label === ans));\n onModelChange({\n ...model,\n nodes: model.nodes.map(n => n.id === nodeId ? { ...n, metadata: { ...(n.metadata ?? {}), answers: updated } } : n),\n edges: updatedEdges,\n });\n };\n\n const moveAnswer = (idx: number, dir: -1 | 1) => {\n const next = idx + dir;\n if (next < 0 || next >= answers.length) return;\n const arr = [...answers];\n [arr[idx], arr[next]] = [arr[next], arr[idx]];\n onModelChange({ ...model, nodes: model.nodes.map(n => n.id === nodeId ? { ...n, metadata: { ...(n.metadata ?? {}), answers: arr } } : n) });\n };\n\n const inputStyle: React.CSSProperties = {\n width: '100%', padding: '7px 10px',\n border: `1.5px solid ${tt.inputBorder}`,\n borderRadius: 8, fontSize: 13, outline: 'none',\n boxSizing: 'border-box', fontFamily: 'inherit',\n color: tt.inputText, background: tt.inputBg,\n transition: 'border-color 0.15s',\n };\n\n const addBtnStyle: React.CSSProperties = {\n flex: 1, padding: '7px 0', background: accentColor, color: '#fff',\n border: 'none', borderRadius: 7, cursor: 'pointer', fontSize: 12, fontWeight: 600, fontFamily: 'inherit',\n };\n\n const cancelBtnStyle: React.CSSProperties = {\n padding: '7px 14px', background: tt.btnSecBg, color: tt.btnSecText,\n border: 'none', borderRadius: 7, cursor: 'pointer', fontSize: 12, fontFamily: 'inherit',\n };\n\n const addTriggerStyle: React.CSSProperties = {\n display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 6,\n marginTop: 10, width: '100%', padding: '9px 0', background: 'transparent',\n color: accentColor, border: `1.5px dashed ${accentBorder}`,\n borderRadius: 10, cursor: 'pointer', fontSize: 12, fontWeight: 600, fontFamily: 'inherit',\n transition: 'background 0.15s, border-color 0.15s',\n };\n\n return (\n <div style={{ width: 272, minWidth: 272, background: tt.panelBg, borderLeft: `1px solid ${tt.panelBorder}`, display: 'flex', flexDirection: 'column', overflow: 'hidden' }}>\n {/* Header */}\n <div style={{\n padding: '12px 16px', fontWeight: 700, fontSize: 12, letterSpacing: 0.8,\n textTransform: 'uppercase', color: accentColor,\n borderBottom: `1px solid ${accentBorder}`, background: accentLight,\n display: 'flex', alignItems: 'center', gap: 8,\n }}>\n <div style={{ width: 6, height: 6, borderRadius: '50%', background: accentColor }} />\n <span>{isQuestion ? 'Question Editor' : variant === 'journey' ? 'Step Editor' : 'Step Editor'}</span>\n </div>\n\n <div style={{ flex: 1, overflowY: 'auto', display: 'flex', flexDirection: 'column' }}>\n {/* Name */}\n <section style={{ padding: '14px 16px', borderBottom: `1px solid ${tt.sectionBorder}` }}>\n <label style={{ display: 'block', fontSize: 10, fontWeight: 700, color: tt.labelText, marginBottom: 8, textTransform: 'uppercase', letterSpacing: 0.8 }}>Name</label>\n <input\n ref={inputRef}\n value={label}\n onChange={e => setLabel(e.target.value)}\n onBlur={commitLabel}\n onKeyDown={e => e.key === 'Enter' && commitLabel()}\n style={inputStyle}\n placeholder=\"Step name…\"\n />\n </section>\n\n {/* Shape (hidden for question variant) */}\n {!isQuestion && (\n <section style={{ padding: '14px 16px', borderBottom: `1px solid ${tt.sectionBorder}` }}>\n <label style={{ display: 'block', fontSize: 10, fontWeight: 700, color: tt.labelText, marginBottom: 8, textTransform: 'uppercase', letterSpacing: 0.8 }}>Shape</label>\n <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 6 }}>\n {SHAPES.map(s => {\n const active = (node.shape ?? 'rectangle') === s.key;\n return (\n <button key={s.key} onClick={() => setShape(s.key)} style={{\n display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 4,\n padding: '8px 6px', borderRadius: 8, cursor: 'pointer', transition: 'all 0.15s',\n background: active ? accentColor : tt.shapeBtnBg,\n color: active ? '#fff' : tt.textSecondary,\n border: active ? `1.5px solid ${accentColor}` : `1.5px solid ${tt.shapeBtnBorder}`,\n }}>\n <span style={{ fontSize: 16, lineHeight: 1 }}>{s.icon}</span>\n <span style={{ fontSize: 11, fontWeight: 500 }}>{s.label}</span>\n </button>\n );\n })}\n </div>\n </section>\n )}\n\n {/* Question variant: Answers */}\n {isQuestion && (\n <section style={{ padding: '14px 16px', borderBottom: `1px solid ${tt.sectionBorder}`, flex: 1 }}>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginBottom: 10 }}>\n <label style={{ display: 'block', fontSize: 10, fontWeight: 700, color: tt.labelText, textTransform: 'uppercase', letterSpacing: 0.8 }}>Answers</label>\n <span style={{ fontSize: 11, color: tt.textMuted, background: isDark ? '#0f172a' : '#f1f5f9', padding: '1px 7px', borderRadius: 99, fontWeight: 600 }}>{answers.length}</span>\n </div>\n\n {answers.length === 0 && !addingAnswer && (\n <div style={{ fontSize: 12, color: tt.textMuted, textAlign: 'center', padding: '16px 0', fontStyle: 'italic' }}>No answers yet — add one below</div>\n )}\n\n {answers.map((ans, i) => {\n const connected = model.edges.some(e => e.from === nodeId && e.label === ans);\n const targetNode = model.nodes.find(n => { const e = model.edges.find(ex => ex.from === nodeId && ex.label === ans); return e && n.id === e.to; });\n return (\n <div key={ans + i} style={{ display: 'flex', alignItems: 'flex-start', gap: 0, marginBottom: 8, borderRadius: 12, border: `1px solid ${tt.cardBorder}`, overflow: 'hidden', background: tt.cardBg, boxShadow: isDark ? 'none' : '0 1px 2px rgba(15,23,42,0.04)' }}>\n <div style={{ width: 4, alignSelf: 'stretch', background: accentColor, flexShrink: 0 }} />\n <div style={{ flex: 1, minWidth: 0, padding: '8px 10px' }}>\n <div style={{ fontSize: 12, fontWeight: 600, color: tt.textPrimary, marginBottom: connected ? 3 : 0, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{ans}</div>\n {connected && targetNode && <div style={{ fontSize: 11, color: accentColor, opacity: 0.85 }}>→ {targetNode.label}</div>}\n {!connected && <div style={{ fontSize: 10, color: tt.textMuted, fontStyle: 'italic' }}>drag port to connect</div>}\n </div>\n <div style={{ display: 'flex', flexDirection: 'column', padding: '4px 2px', gap: 2 }}>\n <button onClick={() => moveAnswer(i, -1)} disabled={i === 0} style={{ background: 'none', border: 'none', color: tt.textMuted, cursor: 'pointer', fontSize: 11, padding: '2px 4px', opacity: i === 0 ? 0.3 : 1 }}>↑</button>\n <button onClick={() => moveAnswer(i, 1)} disabled={i === answers.length - 1} style={{ background: 'none', border: 'none', color: tt.textMuted, cursor: 'pointer', fontSize: 11, padding: '2px 4px', opacity: i === answers.length - 1 ? 0.3 : 1 }}>↓</button>\n </div>\n <button onClick={() => removeAnswer(ans)} style={{ background: 'none', border: 'none', color: tt.textMuted, cursor: 'pointer', fontSize: 12, padding: '8px 10px', flexShrink: 0 }} title=\"Remove\">✕</button>\n </div>\n );\n })}\n\n {addingAnswer ? (\n <div style={{ marginTop: 10, background: tt.addFormBg, borderRadius: 10, padding: 12, border: `1.5px solid ${accentBorder}` }}>\n <input autoFocus value={newAnswer} onChange={e => setNewAnswer(e.target.value)} onKeyDown={e => e.key === 'Enter' && addAnswer()} placeholder=\"Answer text…\" style={{ ...inputStyle, marginBottom: 8 }} />\n <div style={{ display: 'flex', gap: 6 }}>\n <button onClick={addAnswer} style={addBtnStyle}>Add Answer</button>\n <button onClick={() => { setAddingAnswer(false); setNewAnswer(''); }} style={cancelBtnStyle}>Cancel</button>\n </div>\n </div>\n ) : (\n <button onClick={() => setAddingAnswer(true)} style={addTriggerStyle}>\n <span style={{ fontSize: 16, lineHeight: 1 }}>+</span> Add Answer\n </button>\n )}\n\n {answers.length > 0 && (\n <div style={{ marginTop: 12, padding: '8px 10px', background: isDark ? 'rgba(251,191,36,0.06)' : '#fef9f0', borderRadius: 8, border: `1px solid ${accentBorder}` }}>\n <div style={{ fontSize: 10, fontWeight: 700, color: accentColor, textTransform: 'uppercase', letterSpacing: 0.6, marginBottom: 4 }}>How to connect</div>\n <div style={{ fontSize: 11, color: tt.textSecondary, lineHeight: 1.5 }}>Hover the question node on the canvas — drag an answer's port dot to any other node.</div>\n </div>\n )}\n </section>\n )}\n\n {/* Non-question: Branches */}\n {!isQuestion && (\n <section style={{ padding: '14px 16px', borderBottom: `1px solid ${tt.sectionBorder}`, flex: 1 }}>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginBottom: 10 }}>\n <label style={{ display: 'block', fontSize: 10, fontWeight: 700, color: tt.labelText, textTransform: 'uppercase', letterSpacing: 0.8 }}>Branches</label>\n <span style={{ fontSize: 11, color: tt.textMuted, background: isDark ? '#0f172a' : '#f1f5f9', padding: '1px 7px', borderRadius: 99, fontWeight: 600 }}>{outEdges.length}</span>\n </div>\n\n {outEdges.length === 0 && !addingBranch && (\n <div style={{ fontSize: 12, color: tt.textMuted, textAlign: 'center', padding: '16px 0', fontStyle: 'italic' }}>No outgoing connections yet</div>\n )}\n\n {outEdges.map(edge => {\n const target = model.nodes.find(n => n.id === edge.to);\n return (\n <div key={edge.id} style={{ display: 'flex', alignItems: 'flex-start', gap: 0, marginBottom: 8, borderRadius: 12, border: `1px solid ${tt.cardBorder}`, overflow: 'hidden', background: tt.cardBg, boxShadow: isDark ? 'none' : '0 1px 2px rgba(15,23,42,0.04)' }}>\n <div style={{ width: 4, alignSelf: 'stretch', background: accentColor, flexShrink: 0 }} />\n <div style={{ flex: 1, minWidth: 0, padding: '8px 10px' }}>\n <div style={{ fontSize: 12, fontWeight: 600, color: tt.textPrimary, marginBottom: 5, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>→ {target?.label ?? edge.to}</div>\n <input value={edge.label ?? ''} onChange={e => updateEdgeLabel(edge.id, e.target.value)} placeholder=\"Edge label (optional)\" style={{ ...inputStyle, fontSize: 11, padding: '4px 8px' }} />\n </div>\n <button onClick={() => removeEdge(edge.id)} style={{ background: 'none', border: 'none', color: tt.textMuted, cursor: 'pointer', fontSize: 12, padding: '8px 10px', flexShrink: 0 }} title=\"Remove\">✕</button>\n </div>\n );\n })}\n\n {addingBranch ? (\n <div style={{ marginTop: 10, background: tt.addFormBg, borderRadius: 10, padding: 12, border: `1.5px solid ${accentBorder}` }}>\n <div style={{ display: 'flex', gap: 6, marginBottom: 10 }}>\n {(['new', 'existing'] as const).map(mode => (\n <button key={mode} onClick={() => setBranchMode(mode)} style={{\n flex: 1, padding: '5px 0', border: 'none', borderRadius: 6, cursor: 'pointer', fontSize: 11, fontWeight: 600,\n background: branchMode === mode ? accentColor : tt.btnSecBg,\n color: branchMode === mode ? '#fff' : tt.btnSecText,\n }}>\n {mode === 'new' ? `+ New step` : 'Existing step'}\n </button>\n ))}\n </div>\n {branchMode === 'new' ? (\n <input autoFocus value={branchLabel} onChange={e => setBranchLabel(e.target.value)} onKeyDown={e => e.key === 'Enter' && addBranch()} placeholder=\"New step name…\" style={{ ...inputStyle, marginBottom: 6 }} />\n ) : (\n <select value={branchTarget} onChange={e => setBranchTarget(e.target.value)} style={{ ...inputStyle, marginBottom: 6, appearance: 'none' }}>\n <option value=\"\">Choose a step…</option>\n {otherNodes.map(n => <option key={n.id} value={n.id}>{n.label}</option>)}\n </select>\n )}\n <input value={branchEdgeLabel} onChange={e => setBranchEdgeLabel(e.target.value)} placeholder=\"Edge label (optional)\" style={{ ...inputStyle, marginBottom: 10 }} />\n <div style={{ display: 'flex', gap: 6 }}>\n <button onClick={addBranch} style={addBtnStyle}>Add {branchTerm}</button>\n <button onClick={() => setAddingBranch(false)} style={cancelBtnStyle}>Cancel</button>\n </div>\n </div>\n ) : (\n <button onClick={() => setAddingBranch(true)} style={addTriggerStyle}>\n <span style={{ fontSize: 16, lineHeight: 1 }}>+</span> Add {branchTerm}\n </button>\n )}\n </section>\n )}\n </div>\n </div>\n );\n}\n","/**\n * Mint the next available ID for a given prefix by scanning the existing\n * entities in a model.\n *\n * Avoids the classic collision pitfall of a module-level counter starting at\n * zero: if the model already contains `e1..e6` (e.g. from a preset or an\n * imported diagram), a counter that started at zero would produce a duplicate\n * `e1` on first use. By deriving from the model itself, generated IDs are\n * collision-proof against presets, imports, and concurrent editor instances.\n *\n * @example\n * nextId('node', model.nodes) // → 'node7' if model has node1..node6\n * nextId('e', model.edges) // → 'e1' if model has no edges yet\n * nextId('m', model.messages) // → 'm5' if model has m1..m4\n */\n/**\n * Returns a stateful id generator seeded from the current model. Use this\n * when a single operation needs to mint several IDs in succession (e.g.\n * duplicate or paste) — calling `nextId()` repeatedly against the same\n * snapshot would produce duplicates because the snapshot doesn't reflect\n * the freshly minted IDs.\n *\n * @example\n * const newNodeId = makeIdSource('node', model.nodes);\n * const a = newNodeId(); // → 'node7'\n * const b = newNodeId(); // → 'node8'\n */\nexport function makeIdSource(prefix: string, existing: Iterable<{ id: string }>): () => string {\n const first = nextId(prefix, existing);\n let counter = parseInt(first.slice(prefix.length), 10);\n return () => `${prefix}${counter++}`;\n}\n\nexport function nextId(prefix: string, existing: Iterable<{ id: string }>): string {\n const escaped = prefix.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const re = new RegExp(`^${escaped}(\\\\d+)$`);\n let max = 0;\n for (const item of existing) {\n const match = re.exec(item.id);\n if (match) {\n const n = parseInt(match[1], 10);\n if (n > max) max = n;\n }\n }\n return `${prefix}${max + 1}`;\n}\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { DiagramModel, SequenceMessage, ExportFormat } from '../core/types.js';\nimport { Toolbar } from './Toolbar.js';\nimport { useEditorTheme } from './hooks/useEditorTheme.js';\nimport { useExporters } from './hooks/useExporters.js';\nimport { useImporter } from './hooks/useImporter.js';\nimport { presetSequenceModel } from './presets.js';\nimport { nextId } from '../core/ids.js';\n\nconst INDIGO = '#4f46e5';\nconst INDIGO_SOFT = '#eef2ff';\n\n/**\n * Color palette for `<SequenceEditor>`. Sequence diagrams use a smaller\n * token set than flowcharts — there are no node shapes to color, but there\n * are `lifeline`, `arrow`, and `actor*` tokens that flowcharts don't need.\n *\n * Token groups:\n * - `canvas` / `dot` — background and dot-grid color.\n * - `panel*` / `ctrls*` / `input*` / `card*` — chrome around the canvas.\n * - `text*` — type ramp (primary > secondary > muted).\n * - `lifeline` — vertical actor lifeline color.\n * - `arrow` — message arrow + label color.\n * - `actorFill` / `actorStroke` / `actorText` — actor header box.\n */\nexport interface SequenceThemeColors {\n canvas: string; dot: string;\n panelBg: string; panelBorder: string;\n ctrlsBg: string; ctrlsBorder: string;\n inputBg: string; inputBorder: string; inputText: string;\n textPrimary: string; textSecondary: string; textMuted: string;\n cardBg: string; cardBorder: string;\n lifeline: string; arrow: string;\n actorFill: string; actorStroke: string; actorText: string;\n}\n\nconst lightTheme: SequenceThemeColors = {\n canvas: '#fafbfc',\n dot: '#dbe3ee',\n panelBg: '#ffffff',\n panelBorder: '#e2e8f0',\n ctrlsBg: '#ffffff',\n ctrlsBorder: '#cbd5e1',\n inputBg: '#f8fafc',\n inputBorder: '#e2e8f0',\n inputText: '#1e293b',\n textPrimary: '#1e293b',\n textSecondary: '#475569',\n textMuted: '#94a3b8',\n cardBg: '#ffffff',\n cardBorder: '#e2e8f0',\n lifeline: '#cbd5e1',\n arrow: '#64748b',\n actorFill: '#f5f3ff',\n actorStroke: '#c7d2fe',\n actorText: '#4338ca',\n};\nconst darkTheme: SequenceThemeColors = {\n canvas: '#0f172a',\n dot: '#1e293b',\n panelBg: '#1e293b',\n panelBorder: '#334155',\n ctrlsBg: '#0f172a',\n ctrlsBorder: '#1e293b',\n inputBg: '#0f172a',\n inputBorder: '#334155',\n inputText: '#e2e8f0',\n textPrimary: '#f1f5f9',\n textSecondary: '#94a3b8',\n textMuted: '#475569',\n cardBg: '#0f172a',\n cardBorder: '#334155',\n lifeline: '#334155',\n arrow: '#64748b',\n actorFill: '#1e1b4b',\n actorStroke: 'rgba(99,102,241,0.45)',\n actorText: '#a5b4fc',\n};\n\n// Layout\nconst HEADER_H = 64; // height of actor box\nconst HEADER_PAD = 24; // top padding before headers start\nconst COL_MIN = 160; // min column width\nconst ROW_H = 64; // vertical spacing per message\nconst SIDE_PAD = 40; // left/right padding\n\n/**\n * Props for `<SequenceEditor>`. Mirrors `DiagramEditorProps` minus the\n * flowchart-only `variant` field; the theme override type is the\n * sequence-specific palette.\n *\n * @property initialModel Initial sequence model. Defaults to\n * `presetSequenceModel()` if omitted or if a\n * non-sequence model is passed.\n * @property onChange Fires after every committed mutation.\n * @property onExport Optional sink for exporter output. If omitted, the\n * editor triggers a browser download of `sequence.<ext>`.\n * @property height Canvas height; accepts CSS units. Defaults to `600`.\n * @property allowedExports Whitelist of export formats. Defaults to all.\n * @property allowImport Show the import button. Defaults to `true`.\n * @property theme `'light'`, `'dark'`, or `'auto'` (follow OS).\n * @property themeOverrides Per-property overrides on top of the resolved\n * sequence palette. `themeOverrides` passed to\n * `<DiagramEditor>` is forwarded here when\n * `type === 'sequence'`.\n */\nexport interface SequenceEditorProps {\n initialModel?: DiagramModel;\n onChange?: (model: DiagramModel) => void;\n onExport?: (format: ExportFormat, content: string | Blob) => void;\n height?: number | string;\n allowedExports?: ExportFormat[];\n allowImport?: boolean;\n theme?: 'light' | 'dark' | 'auto';\n themeOverrides?: Partial<SequenceThemeColors>;\n}\n\ninterface DragState {\n id: string;\n startY: number; // clientY at mousedown (page-space)\n originalIdx: number; // index in messages[] at drag start\n targetIdx: number; // current preview position\n active: boolean; // true once the cursor moves > DRAG_THRESHOLD\n}\nconst DRAG_THRESHOLD = 5;\n\nfunction ensureSequenceModel(m?: DiagramModel): DiagramModel {\n if (m && m.type === 'sequence') {\n return { ...m, actors: m.actors ?? [], messages: m.messages ?? [] };\n }\n return presetSequenceModel();\n}\n\n/**\n * Sequence-diagram specialization of the editor. Accepts the same props as\n * `<DiagramEditor>` but renders a swim-lane layout with drag-to-reorder\n * messages and inline label editing.\n *\n * @example\n * ```tsx\n * import { SequenceEditor, presetSequenceModel } from 'flowchart-sequence-designer/ui';\n *\n * <SequenceEditor initialModel={presetSequenceModel()} theme=\"dark\" />\n * ```\n */\nexport function SequenceEditor({\n initialModel, onChange, onExport, height = 600,\n allowedExports, allowImport = true, theme = 'auto',\n themeOverrides,\n}: SequenceEditorProps) {\n const [model, setModel] = useState<DiagramModel>(() => ensureSequenceModel(initialModel));\n const [selected, setSelected] = useState<string | null>(null);\n const [drag, setDrag] = useState<DragState | null>(null);\n const [editingId, setEditingId] = useState<string | null>(null);\n const [editLabel, setEditLabel] = useState('');\n const historyRef = useRef<DiagramModel[]>([ensureSequenceModel(initialModel)]);\n const historyIdxRef = useRef(0);\n const svgRef = useRef<SVGSVGElement>(null);\n\n const { t, isDark } = useEditorTheme(theme, themeOverrides, { light: lightTheme, dark: darkTheme });\n\n const actors = model.actors ?? [];\n const messages = model.messages ?? [];\n\n // Column width sized to the longest actor name.\n const colW = useMemo(() => {\n const longest = actors.reduce((m, a) => Math.max(m, a.length), 6);\n return Math.max(COL_MIN, longest * 9 + 40);\n }, [actors]);\n\n const totalW = SIDE_PAD * 2 + Math.max(1, actors.length) * colW;\n const totalH = HEADER_PAD + HEADER_H + 32 + messages.length * ROW_H + 48;\n\n const actorX = (name: string) => {\n const idx = actors.indexOf(name);\n if (idx < 0) return SIDE_PAD + colW / 2;\n return SIDE_PAD + idx * colW + colW / 2;\n };\n const msgY = (idx: number) => HEADER_PAD + HEADER_H + 40 + idx * ROW_H;\n\n const pushHistory = useCallback((m: DiagramModel) => {\n const stack = historyRef.current.slice(0, historyIdxRef.current + 1);\n stack.push(m);\n if (stack.length > 80) stack.shift();\n historyRef.current = stack;\n historyIdxRef.current = stack.length - 1;\n }, []);\n\n const applyAndPush = useCallback((m: DiagramModel) => {\n setModel(m); onChange?.(m); pushHistory(m);\n }, [onChange, pushHistory]);\n\n const undo = useCallback(() => {\n if (historyIdxRef.current <= 0) return;\n historyIdxRef.current--;\n const m = historyRef.current[historyIdxRef.current];\n setModel(m); onChange?.(m);\n }, [onChange]);\n\n const redo = useCallback(() => {\n if (historyIdxRef.current >= historyRef.current.length - 1) return;\n historyIdxRef.current++;\n const m = historyRef.current[historyIdxRef.current];\n setModel(m); onChange?.(m);\n }, [onChange]);\n\n const addActor = () => {\n const name = `Actor${actors.length + 1}`;\n applyAndPush({ ...model, actors: [...actors, name] });\n };\n\n const renameActor = (oldName: string, newName: string) => {\n if (!newName || newName === oldName || actors.includes(newName)) return;\n applyAndPush({\n ...model,\n actors: actors.map(a => a === oldName ? newName : a),\n messages: messages.map(m => ({\n ...m,\n from: m.from === oldName ? newName : m.from,\n to: m.to === oldName ? newName : m.to,\n })),\n });\n };\n\n const removeActor = (name: string) => {\n applyAndPush({\n ...model,\n actors: actors.filter(a => a !== name),\n messages: messages.filter(m => m.from !== name && m.to !== name),\n });\n };\n\n const addMessage = () => {\n if (actors.length < 1) {\n // Need at least one actor; create a sensible default pair.\n const a = `Actor${actors.length + 1}`;\n const b = `Actor${actors.length + 2}`;\n applyAndPush({\n ...model,\n actors: [...actors, a, b],\n messages: [...messages, { id: nextId('m', messages), from: a, to: b, label: 'message', style: 'solid' }],\n });\n return;\n }\n const from = actors[0];\n const to = actors[Math.min(1, actors.length - 1)] ?? from;\n applyAndPush({\n ...model,\n messages: [...messages, { id: nextId('m', messages), from, to, label: 'message', style: 'solid' }],\n });\n };\n\n const updateMessage = (id: string, patch: Partial<SequenceMessage>) => {\n applyAndPush({\n ...model,\n messages: messages.map(m => m.id === id ? { ...m, ...patch } : m),\n });\n };\n\n const removeMessage = (id: string) => {\n applyAndPush({ ...model, messages: messages.filter(m => m.id !== id) });\n if (selected === id) setSelected(null);\n };\n\n const reorderMessage = useCallback((id: string, toIdx: number) => {\n const fromIdx = messages.findIndex(m => m.id === id);\n if (fromIdx < 0 || toIdx === fromIdx) return;\n const next = messages.slice();\n const [moved] = next.splice(fromIdx, 1);\n next.splice(toIdx, 0, moved);\n applyAndPush({ ...model, messages: next });\n }, [messages, model, applyAndPush]);\n\n // ── Keyboard ────────────────────────────────────────────────────────────\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n const tgt = e.target as HTMLElement | null;\n if (tgt && (tgt.tagName === 'INPUT' || tgt.tagName === 'TEXTAREA' || tgt.isContentEditable)) return;\n const ctrl = e.ctrlKey || e.metaKey;\n if (ctrl && e.key === 'z') { e.preventDefault(); undo(); return; }\n if (ctrl && (e.key === 'y' || (e.shiftKey && e.key === 'z'))) { e.preventDefault(); redo(); return; }\n if (e.key === 'Escape') { setSelected(null); setEditingId(null); return; }\n if ((e.key === 'Delete' || e.key === 'Backspace') && selected) {\n e.preventDefault();\n removeMessage(selected);\n }\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [undo, redo, selected]);\n\n // ── Export / import ─────────────────────────────────────────────────────\n const handleExport = useExporters(model, onExport, 'sequence');\n const handleImport = useImporter(applyAndPush, {\n expectedType: 'sequence',\n transform: ensureSequenceModel,\n });\n\n // ── Drag-to-reorder ─────────────────────────────────────────────────────\n // Mousedown seeds drag state but does NOT mark it active — that flips on\n // first move past DRAG_THRESHOLD so a click doesn't reorder. We mutate the\n // model exactly once on mouseup; intermediate moves only update preview\n // state, so the history stack stays clean and rows can't cascade.\n const onRowMouseDown = (e: React.MouseEvent, id: string) => {\n const tag = (e.target as HTMLElement).tagName;\n if (tag === 'INPUT' || tag === 'BUTTON' || tag === 'SELECT') return;\n const idx = messages.findIndex(m => m.id === id);\n if (idx < 0) return;\n e.preventDefault();\n setSelected(id);\n setDrag({ id, startY: e.clientY, originalIdx: idx, targetIdx: idx, active: false });\n };\n\n useEffect(() => {\n if (!drag) return;\n const baseY = HEADER_PAD + HEADER_H + 40;\n const onMove = (ev: MouseEvent) => {\n const dy = ev.clientY - drag.startY;\n if (!drag.active && Math.abs(dy) < DRAG_THRESHOLD) return;\n const svg = svgRef.current;\n if (!svg) return;\n const rect = svg.getBoundingClientRect();\n const yInSvg = ev.clientY - rect.top;\n const raw = Math.floor((yInSvg - baseY + ROW_H / 2) / ROW_H);\n const next = Math.max(0, Math.min(messages.length - 1, raw));\n if (next === drag.targetIdx && drag.active) return;\n setDrag({ ...drag, active: true, targetIdx: next });\n };\n const onUp = () => {\n if (drag.active && drag.targetIdx !== drag.originalIdx) {\n reorderMessage(drag.id, drag.targetIdx);\n }\n setDrag(null);\n };\n window.addEventListener('mousemove', onMove);\n window.addEventListener('mouseup', onUp);\n return () => {\n window.removeEventListener('mousemove', onMove);\n window.removeEventListener('mouseup', onUp);\n };\n }, [drag, messages.length, reorderMessage]);\n\n // Visual order during a drag: messages stay in model order, only the\n // dragged row is virtually relocated. Real array isn't touched until mouseup.\n const visualMessages = useMemo(() => {\n if (!drag?.active) return messages;\n const idx = messages.findIndex(m => m.id === drag.id);\n if (idx < 0) return messages;\n const next = messages.slice();\n const [moved] = next.splice(idx, 1);\n next.splice(drag.targetIdx, 0, moved);\n return next;\n }, [messages, drag]);\n\n // ── Render ──────────────────────────────────────────────────────────────\n const selectedMsg = selected ? messages.find(m => m.id === selected) : null;\n\n return (\n <div style={{\n display: 'flex', flexDirection: 'column', height, width: '100%',\n fontFamily: 'ui-sans-serif,system-ui,sans-serif', background: t.ctrlsBg,\n }}>\n <Toolbar onExport={handleExport} onImport={allowImport ? handleImport : undefined} allowedExports={allowedExports} allowImport={allowImport} />\n\n {/* Controls */}\n <div style={{\n display: 'flex', gap: 8, padding: '7px 14px',\n background: t.ctrlsBg, borderBottom: `1px solid ${t.ctrlsBorder}`,\n alignItems: 'center', flexWrap: 'wrap',\n }}>\n <button onClick={addActor} style={primaryBtn()}>+ Actor</button>\n <button onClick={addMessage} style={primaryBtn()}>+ Message</button>\n <div style={{ width: 1, height: 18, background: t.ctrlsBorder, margin: '0 4px' }} />\n <button onClick={undo} style={ghostBtn(t)} title=\"Undo (Ctrl+Z)\">↶</button>\n <button onClick={redo} style={ghostBtn(t)} title=\"Redo (Ctrl+Y)\">↷</button>\n <span style={{ marginLeft: 'auto', fontSize: 11, color: t.textMuted }}>\n {actors.length} actor{actors.length === 1 ? '' : 's'} · {messages.length} message{messages.length === 1 ? '' : 's'} · drag a row to reorder\n </span>\n </div>\n\n <div style={{ flex: 1, display: 'flex', overflow: 'hidden' }}>\n {/* Canvas */}\n <div style={{ flex: 1, overflow: 'auto', background: t.canvas, position: 'relative' }}>\n {actors.length === 0 && messages.length === 0 ? (\n <div style={{\n position: 'absolute', inset: 0, display: 'flex', flexDirection: 'column',\n alignItems: 'center', justifyContent: 'center', gap: 10,\n color: t.textMuted, pointerEvents: 'none',\n }}>\n <div style={{ fontSize: 36, opacity: 0.15, color: t.textPrimary }}>↔</div>\n <div style={{ fontSize: 13, fontWeight: 500 }}>\n Click <strong style={{ color: INDIGO }}>+ Actor</strong> then <strong style={{ color: INDIGO }}>+ Message</strong> to start\n </div>\n </div>\n ) : (\n <svg\n ref={svgRef}\n width={totalW} height={totalH}\n style={{ display: 'block', cursor: drag?.active ? 'grabbing' : 'default', userSelect: 'none' }}\n >\n <defs>\n <pattern id=\"seqdots\" x=\"0\" y=\"0\" width=\"24\" height=\"24\" patternUnits=\"userSpaceOnUse\">\n <circle cx={12} cy={12} r={1.1} fill={t.dot} />\n </pattern>\n <filter id=\"seqShadow\" x=\"-20%\" y=\"-20%\" width=\"140%\" height=\"140%\">\n <feDropShadow dx={0} dy={3} stdDeviation={5} floodColor={isDark ? 'rgba(0,0,0,0.5)' : 'rgba(15,23,42,0.09)'} />\n </filter>\n <marker id=\"seqArrow\" markerWidth={9} markerHeight={7} refX={8.5} refY={3.5} orient=\"auto\" markerUnits=\"strokeWidth\">\n <path d=\"M0,0.5 L9,3.5 L0,6.5 L2.2,3.5 Z\" fill={t.arrow} />\n </marker>\n </defs>\n\n <rect width={totalW} height={totalH} fill=\"url(#seqdots)\" />\n\n {/* Lifelines */}\n {actors.map(name => {\n const x = actorX(name);\n const top = HEADER_PAD + HEADER_H;\n return (\n <line\n key={`life-${name}`}\n x1={x} x2={x}\n y1={top + 4} y2={totalH - 24}\n stroke={t.lifeline} strokeWidth={1.25} strokeDasharray=\"5 5\"\n />\n );\n })}\n\n {/* Messages (arrows + label rows) — rendered in visual order\n so the dragged row previews its new slot without mutating\n the underlying messages array until the user releases. */}\n {visualMessages.map((msg, idx) => {\n const y = msgY(idx);\n const fromX = actorX(msg.from);\n const toX = actorX(msg.to);\n const selectedHere = selected === msg.id;\n const isDragging = drag?.active && drag.id === msg.id;\n const isSelf = msg.from === msg.to;\n const stroke = selectedHere ? INDIGO : t.arrow;\n const dash = msg.style === 'dashed' ? '6,4' : undefined;\n const cursor = drag?.active ? 'grabbing' : 'grab';\n const groupOpacity = isDragging ? 0.85 : 1;\n\n if (isSelf) {\n const startX = fromX;\n const loopW = 36;\n const loopY = y - 6;\n const d = `M ${startX} ${loopY} C ${startX + loopW} ${loopY}, ${startX + loopW} ${loopY + 24}, ${startX} ${loopY + 24}`;\n return (\n <g key={msg.id} onMouseDown={(e) => onRowMouseDown(e, msg.id)} style={{ cursor, opacity: groupOpacity }}>\n {(selectedHere || isDragging) && (\n <rect x={SIDE_PAD - 8} y={y - 22} width={totalW - (SIDE_PAD - 8) * 2} height={ROW_H - 12} rx={10}\n fill={INDIGO_SOFT} opacity={isDark ? 0.18 : 0.6} />\n )}\n <path d={d} fill=\"none\" stroke={stroke} strokeWidth={1.5} strokeDasharray={dash} markerEnd=\"url(#seqArrow)\" />\n <text x={startX + loopW + 8} y={loopY + 16} fontSize={11} fill={selectedHere ? INDIGO : t.textPrimary} fontWeight={500}>\n {msg.label}\n </text>\n </g>\n );\n }\n\n const labelX = (fromX + toX) / 2;\n return (\n <g key={msg.id} onMouseDown={(e) => onRowMouseDown(e, msg.id)} style={{ cursor, opacity: groupOpacity }}>\n {(selectedHere || isDragging) && (\n <rect x={SIDE_PAD - 8} y={y - 22} width={totalW - (SIDE_PAD - 8) * 2} height={ROW_H - 12} rx={10}\n fill={INDIGO_SOFT} opacity={isDark ? 0.18 : 0.6} />\n )}\n <line x1={fromX} y1={y} x2={toX} y2={y} stroke={stroke} strokeWidth={1.5} strokeDasharray={dash} markerEnd=\"url(#seqArrow)\" />\n <rect x={labelX - estimateW(msg.label) / 2 - 6} y={y - 18} width={estimateW(msg.label) + 12} height={18} rx={6}\n fill={t.canvas} stroke={selectedHere ? INDIGO : t.cardBorder} strokeWidth={selectedHere ? 1.25 : 1} />\n <text x={labelX} y={y - 5} textAnchor=\"middle\" fontSize={11} fill={selectedHere ? INDIGO : t.textPrimary} fontWeight={500}>\n {msg.label}\n </text>\n </g>\n );\n })}\n\n {/* Actor headers (rendered last so they overlay lifelines cleanly) */}\n {actors.map(name => {\n const x = actorX(name);\n const w = colW - 24;\n return (\n <g key={`hdr-${name}`}>\n <rect x={x - w / 2} y={HEADER_PAD} width={w} height={HEADER_H} rx={12}\n fill={t.actorFill} stroke={t.actorStroke} strokeWidth={1.25} filter=\"url(#seqShadow)\" />\n {editingId === name ? (\n <foreignObject x={x - w / 2 + 8} y={HEADER_PAD + 16} width={w - 16} height={32}>\n <input\n autoFocus\n defaultValue={name}\n onBlur={(e) => { renameActor(name, e.currentTarget.value.trim()); setEditingId(null); }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') { renameActor(name, (e.target as HTMLInputElement).value.trim()); setEditingId(null); }\n if (e.key === 'Escape') setEditingId(null);\n }}\n style={{\n width: '100%', height: '100%', border: 'none', borderRadius: 6,\n outline: `2px solid ${INDIGO}`, textAlign: 'center', fontSize: 13,\n fontWeight: 600, background: t.inputBg, color: t.inputText,\n boxSizing: 'border-box', padding: '0 6px', fontFamily: 'inherit',\n }}\n />\n </foreignObject>\n ) : (\n <text\n x={x} y={HEADER_PAD + HEADER_H / 2 + 4} textAnchor=\"middle\"\n fontSize={13} fontWeight={700} fill={t.actorText}\n style={{ cursor: 'pointer', userSelect: 'none' }}\n onDoubleClick={() => setEditingId(name)}\n >\n {name}\n </text>\n )}\n <circle\n cx={x + w / 2 - 12} cy={HEADER_PAD + 14} r={9}\n fill=\"transparent\"\n style={{ cursor: 'pointer' }}\n onClick={() => removeActor(name)}\n >\n <title>Remove actor</title>\n </circle>\n <text x={x + w / 2 - 12} y={HEADER_PAD + 18} textAnchor=\"middle\" fontSize={12}\n fill={t.textMuted} style={{ pointerEvents: 'none', userSelect: 'none' }}>×</text>\n </g>\n );\n })}\n </svg>\n )}\n </div>\n\n {/* Side panel */}\n {selectedMsg && (\n <div style={{\n width: 280, flexShrink: 0,\n background: t.panelBg, borderLeft: `1px solid ${t.panelBorder}`,\n padding: '14px 16px', overflowY: 'auto',\n }}>\n <div style={{ fontSize: 10, fontWeight: 700, color: t.textMuted, textTransform: 'uppercase', letterSpacing: 0.7, marginBottom: 10 }}>Message</div>\n\n <Label t={t}>Label</Label>\n <input\n value={editLabel || selectedMsg.label}\n onChange={(e) => setEditLabel(e.target.value)}\n onFocus={() => setEditLabel(selectedMsg.label)}\n onBlur={() => { if (editLabel && editLabel !== selectedMsg.label) updateMessage(selectedMsg.id, { label: editLabel }); setEditLabel(''); }}\n onKeyDown={(e) => { if (e.key === 'Enter') (e.target as HTMLInputElement).blur(); }}\n style={input(t)}\n />\n\n <Label t={t}>From</Label>\n <select value={selectedMsg.from} onChange={(e) => updateMessage(selectedMsg.id, { from: e.target.value })} style={input(t)}>\n {actors.map(a => <option key={a} value={a}>{a}</option>)}\n </select>\n\n <Label t={t}>To</Label>\n <select value={selectedMsg.to} onChange={(e) => updateMessage(selectedMsg.id, { to: e.target.value })} style={input(t)}>\n {actors.map(a => <option key={a} value={a}>{a}</option>)}\n </select>\n\n <Label t={t}>Style</Label>\n <div style={{ display: 'flex', gap: 6 }}>\n {(['solid', 'dashed'] as const).map(s => (\n <button\n key={s}\n onClick={() => updateMessage(selectedMsg.id, { style: s })}\n style={{\n flex: 1, padding: '6px 10px',\n border: `1.5px solid ${selectedMsg.style === s || (!selectedMsg.style && s === 'solid') ? INDIGO : t.inputBorder}`,\n background: selectedMsg.style === s || (!selectedMsg.style && s === 'solid') ? INDIGO_SOFT : t.inputBg,\n color: selectedMsg.style === s || (!selectedMsg.style && s === 'solid') ? INDIGO : t.textPrimary,\n borderRadius: 8, fontSize: 12, fontWeight: 600, cursor: 'pointer', fontFamily: 'inherit',\n }}\n >\n {s === 'solid' ? '── solid' : '─ ─ dashed'}\n </button>\n ))}\n </div>\n\n <div style={{ height: 14 }} />\n <button\n onClick={() => removeMessage(selectedMsg.id)}\n style={{ ...ghostBtn(t), width: '100%', color: '#ef4444', border: `1px solid ${isDark ? '#7f1d1d' : '#fca5a5'}` }}\n >Delete message</button>\n </div>\n )}\n </div>\n\n <div style={{\n padding: '4px 14px', fontSize: 11, color: t.textMuted, background: t.canvas,\n borderTop: `1px solid ${t.ctrlsBorder}`, display: 'flex', gap: 16,\n }}>\n <span>{actors.length} actors</span>\n <span>{messages.length} messages</span>\n <span style={{ marginLeft: 'auto' }}>double-click actor to rename · drag a row to reorder</span>\n </div>\n </div>\n );\n}\n\nfunction estimateW(text: string, pxPerChar = 7): number {\n return text.length * pxPerChar;\n}\n\nfunction primaryBtn(): React.CSSProperties {\n return {\n padding: '6px 12px', background: INDIGO, color: '#fff', border: 'none',\n borderRadius: 8, cursor: 'pointer', fontSize: 12, fontWeight: 600, fontFamily: 'inherit',\n };\n}\nfunction ghostBtn(t: typeof lightTheme): React.CSSProperties {\n return {\n padding: '5px 10px', background: 'transparent', color: t.textSecondary,\n border: `1px solid ${t.ctrlsBorder}`, borderRadius: 7, cursor: 'pointer',\n fontSize: 12, fontWeight: 500, fontFamily: 'inherit',\n };\n}\nfunction input(t: typeof lightTheme): React.CSSProperties {\n return {\n width: '100%', boxSizing: 'border-box', padding: '6px 10px',\n border: `1.5px solid ${t.inputBorder}`, borderRadius: 7,\n background: t.inputBg, color: t.inputText, fontSize: 12,\n fontFamily: 'inherit', outline: 'none', marginBottom: 12,\n };\n}\n\nfunction Label({ t, children }: { t: typeof lightTheme; children: React.ReactNode }) {\n return (\n <div style={{ fontSize: 10, fontWeight: 700, color: t.textMuted, textTransform: 'uppercase', letterSpacing: 0.6, marginBottom: 4 }}>\n {children}\n </div>\n );\n}\n\n","import { useMemo } from 'react';\nimport { useIsDark } from './useSystemTheme.js';\n\n/**\n * Resolves the editor's effective theme tokens by merging the active\n * built-in palette with any caller-supplied `themeOverrides`. Both editors\n * accept light/dark/auto plus arbitrary partial overrides; this hook\n * centralizes the merge so the logic stays identical across editors and the\n * memoization key (isDark + overrides) is uniform.\n *\n * Generic over `T` so it works with `ThemeColors` (DiagramEditor) and\n * `SequenceThemeColors` (SequenceEditor) without duplication.\n *\n * @example\n * const { t, isDark } = useEditorTheme(theme, themeOverrides, { light: lightTheme, dark: darkTheme });\n */\nexport function useEditorTheme<T>(\n theme: 'light' | 'dark' | 'auto',\n overrides: Partial<T> | undefined,\n palettes: { light: T; dark: T },\n): { t: T; isDark: boolean } {\n const isDark = useIsDark(theme);\n const t = useMemo<T>(\n () => ({ ...(isDark ? palettes.dark : palettes.light), ...(overrides ?? {}) }),\n // palettes is a stable module-level constant in every caller, so it is\n // deliberately omitted from the dep array to keep the memo key tight.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [isDark, overrides],\n );\n return { t, isDark };\n}\n","import { useEffect, useState } from 'react';\n\n/**\n * Resolves `'auto'` to the OS's current `prefers-color-scheme` and updates\n * when it flips. Returns `true` for dark, `false` for light. `'light'` and\n * `'dark'` short-circuit to a constant value.\n */\nexport function useIsDark(theme: 'light' | 'dark' | 'auto'): boolean {\n const [sysDark, setSysDark] = useState<boolean>(() =>\n typeof window !== 'undefined'\n ? window.matchMedia('(prefers-color-scheme: dark)').matches\n : false,\n );\n useEffect(() => {\n if (theme !== 'auto' || typeof window === 'undefined') return;\n const mq = window.matchMedia('(prefers-color-scheme: dark)');\n const handler = (e: MediaQueryListEvent) => setSysDark(e.matches);\n mq.addEventListener('change', handler);\n return () => mq.removeEventListener('change', handler);\n }, [theme]);\n return theme === 'dark' || (theme === 'auto' && sysDark);\n}\n\n/**\n * Tracks the `(pointer: coarse)` media query. Returns `true` on touch-first\n * devices so callers can grow hit targets accordingly.\n */\nexport function useIsCoarsePointer(): boolean {\n const [coarse, setCoarse] = useState<boolean>(() =>\n typeof window !== 'undefined'\n ? window.matchMedia('(pointer: coarse)').matches\n : false,\n );\n useEffect(() => {\n if (typeof window === 'undefined') return;\n const mq = window.matchMedia('(pointer: coarse)');\n const handler = (e: MediaQueryListEvent) => setCoarse(e.matches);\n mq.addEventListener('change', handler);\n return () => mq.removeEventListener('change', handler);\n }, []);\n return coarse;\n}\n\n/**\n * Tracks the user's `prefers-reduced-motion` preference. Returns `true` if\n * the user has requested reduced motion. Listens for changes.\n */\nexport function usePrefersReducedMotion(): boolean {\n const [reduced, setReduced] = useState<boolean>(() =>\n typeof window !== 'undefined'\n ? window.matchMedia('(prefers-reduced-motion: reduce)').matches\n : false,\n );\n useEffect(() => {\n if (typeof window === 'undefined') return;\n const mq = window.matchMedia('(prefers-reduced-motion: reduce)');\n const handler = (e: MediaQueryListEvent) => setReduced(e.matches);\n mq.addEventListener('change', handler);\n return () => mq.removeEventListener('change', handler);\n }, []);\n return reduced;\n}\n","import { useCallback } from 'react';\nimport type { DiagramModel, ExportFormat } from '../../core/types.js';\nimport { toMermaid } from '../../exporters/mermaid.js';\nimport { toPlantUML } from '../../exporters/plantuml.js';\nimport { toJSON } from '../../exporters/json.js';\nimport { toSVG, toPNG } from '../../exporters/svg.js';\n\n/**\n * Returns a single `handleExport(format)` callback that runs the requested\n * exporter against `model`. If the caller provided `onExport`, the resulting\n * content is handed off to them. Otherwise the hook triggers a browser\n * download with `filename.<ext>` (with `.puml` substituted for PlantUML).\n *\n * Both editors used to inline this switch; centralizing it keeps export\n * behavior identical and makes adding a new format a one-file change.\n *\n * @param model The diagram to export.\n * @param onExport Optional caller-supplied sink. If omitted, a download is triggered.\n * @param filename Base filename for the download (default `\"diagram\"`). Diagram and\n * sequence editors override to `\"diagram\"` / `\"sequence\"` respectively.\n */\nexport function useExporters(\n model: DiagramModel,\n onExport: ((format: ExportFormat, content: string | Blob) => void) | undefined,\n filename: string = 'diagram',\n): (format: ExportFormat) => Promise<void> {\n return useCallback(async (format: ExportFormat) => {\n let content: string | Blob;\n switch (format) {\n case 'mermaid': content = toMermaid(model); break;\n case 'plantuml': content = toPlantUML(model); break;\n case 'json': content = toJSON(model); break;\n case 'svg': content = toSVG(model); break;\n case 'png': content = await toPNG(model); break;\n default: return;\n }\n if (onExport) { onExport(format, content); return; }\n const url = content instanceof Blob\n ? URL.createObjectURL(content)\n : URL.createObjectURL(new Blob([content], { type: 'text/plain' }));\n const a = document.createElement('a');\n a.href = url;\n a.download = `${filename}.${format === 'plantuml' ? 'puml' : format}`;\n a.click();\n URL.revokeObjectURL(url);\n }, [model, onExport, filename]);\n}\n","import type { DiagramModel, DiagramNode, DiagramEdge, SequenceMessage } from '../core/types.js';\n\nconst SHAPE_OPEN: Record<string, string> = {\n rectangle: '[',\n diamond: '{',\n circle: '((',\n parallelogram: '[/',\n};\nconst SHAPE_CLOSE: Record<string, string> = {\n rectangle: ']',\n diamond: '}',\n circle: '))',\n parallelogram: '/]',\n};\n\nfunction formatNode(node: DiagramNode): string {\n const shape = node.shape ?? 'rectangle';\n const open = SHAPE_OPEN[shape] ?? '[';\n const close = SHAPE_CLOSE[shape] ?? ']';\n return ` ${node.id}${open}\"${node.label}\"${close}`;\n}\n\nfunction edgeArrow(edge: DiagramEdge): string {\n const style = edge.style ?? 'solid';\n const arrowhead = edge.arrowhead ?? 'arrow';\n // Mermaid flowcharts only have solid and dashed; dotted collapses to dashed.\n if (style === 'dashed' || style === 'dotted') return arrowhead === 'none' ? '-.-' : '-.->';\n return arrowhead === 'none' ? '---' : '-->';\n}\n\nfunction formatEdge(edge: DiagramEdge): string {\n const arrow = edgeArrow(edge);\n return edge.label\n ? ` ${edge.from} ${arrow}|\"${edge.label}\"| ${edge.to}`\n : ` ${edge.from} ${arrow} ${edge.to}`;\n}\n\nfunction exportFlowchart(model: DiagramModel): string {\n const lines: string[] = ['graph TD'];\n if (model.title) lines.unshift(`---\\ntitle: ${model.title}\\n---`);\n for (const node of model.nodes) lines.push(formatNode(node));\n for (const edge of model.edges) lines.push(formatEdge(edge));\n return lines.join('\\n');\n}\n\nfunction msgArrow(msg: SequenceMessage): string {\n return msg.style === 'dashed' ? '-->>' : '->>';\n}\n\nfunction exportSequence(model: DiagramModel): string {\n const lines: string[] = ['sequenceDiagram'];\n if (model.title) lines.unshift(`---\\ntitle: ${model.title}\\n---`);\n for (const actor of (model.actors ?? [])) lines.push(` participant ${actor}`);\n for (const msg of (model.messages ?? [])) {\n lines.push(` ${msg.from}${msgArrow(msg)}${msg.to}: ${msg.label}`);\n }\n return lines.join('\\n');\n}\n\n/**\n * Serialize a `DiagramModel` to Mermaid source. Dispatches between\n * `graph TD` (flowchart) and `sequenceDiagram` based on `model.type`.\n *\n * **Round-trip notes (flowchart):**\n * - Node shapes `rectangle`, `diamond`, `circle`, `parallelogram` map to\n * `[ ]`, `{ }`, `(( ))`, `[/ /]` respectively.\n * - Edge style `solid` → `-->`, `dashed` and `dotted` → `-.->` (Mermaid\n * collapses dotted to dashed). `arrowhead: 'none'` strips the head.\n * - `waypoint`, `metadata`, and `variant` are **dropped** — Mermaid has no\n * way to encode routing or arbitrary metadata.\n *\n * **Round-trip notes (sequence):**\n * - Message style `solid` → `->>`, `dashed` → `-->>`.\n */\nexport function toMermaid(model: DiagramModel): string {\n return model.type === 'sequence' ? exportSequence(model) : exportFlowchart(model);\n}\n","import type { DiagramModel, DiagramNode, DiagramEdge, SequenceMessage } from '../core/types.js';\n\nfunction nodeShape(node: DiagramNode): [string, string] {\n switch (node.shape) {\n case 'diamond': return ['<>', '<>'];\n case 'circle': return ['(', ')'];\n case 'parallelogram': return ['/', '/'];\n default: return ['[', ']'];\n }\n}\n\nfunction exportFlowchart(model: DiagramModel): string {\n const lines: string[] = ['@startuml'];\n if (model.title) lines.push(`title ${model.title}`);\n lines.push('');\n\n for (const node of model.nodes) {\n const [open, close] = nodeShape(node);\n lines.push(`state \"${node.label}\" as ${node.id} ${open}${close}`);\n }\n lines.push('');\n\n for (const edge of model.edges) {\n const arrow = edge.style === 'dashed' ? '-[dashed]->'\n : edge.style === 'dotted' ? '-[dotted]->'\n : '-->';\n const label = edge.label ? ` : ${edge.label}` : '';\n lines.push(`${edge.from} ${arrow} ${edge.to}${label}`);\n }\n\n lines.push('@enduml');\n return lines.join('\\n');\n}\n\nfunction msgArrow(msg: SequenceMessage): string {\n return msg.style === 'dashed' ? '-->' : '->';\n}\n\nfunction exportSequence(model: DiagramModel): string {\n const lines: string[] = ['@startuml'];\n if (model.title) lines.push(`title ${model.title}`);\n lines.push('');\n\n for (const actor of (model.actors ?? [])) {\n lines.push(`participant ${actor}`);\n }\n lines.push('');\n\n for (const msg of (model.messages ?? [])) {\n lines.push(`${msg.from} ${msgArrow(msg)} ${msg.to} : ${msg.label}`);\n }\n\n lines.push('@enduml');\n return lines.join('\\n');\n}\n\n/**\n * Serialize a `DiagramModel` to PlantUML source. Dispatches between the\n * state-diagram form (flowchart) and the sequence-diagram form based on\n * `model.type`.\n *\n * **Round-trip notes (flowchart):**\n * - Edge style maps `solid` → `-->`, `dashed` → `-[dashed]->`,\n * `dotted` → `-[dotted]->`.\n * - Node shapes are emitted via the `state \"..\" as id < >` syntax; some\n * shape information is lossy (PlantUML state diagrams don't distinguish\n * every shape this package supports).\n * - `waypoint`, `metadata`, and `variant` are **dropped**.\n *\n * **Round-trip notes (sequence):**\n * - Actor order is preserved; message style `solid` → `->`, `dashed` → `-->`.\n */\nexport function toPlantUML(model: DiagramModel): string {\n return model.type === 'sequence' ? exportSequence(model) : exportFlowchart(model);\n}\n","import type { DiagramModel } from '../core/types.js';\n\n/**\n * Serialize a `DiagramModel` to pretty-printed JSON. This is the canonical\n * round-trip format: every field — including `variant`, `waypoint`,\n * `metadata.group`, and `metadata.answers` — survives a round trip through\n * `toJSON` + `fromJSON` unchanged.\n */\nexport function toJSON(model: DiagramModel): string {\n return JSON.stringify(model, null, 2);\n}\n","import type { DiagramModel, DiagramNode, DiagramEdge } from '../core/types.js';\n\n// Layout constants — kept in sync with src/ui/DiagramEditor.tsx\nconst NODE_H = 48;\nconst Q_BASE_H = 68;\nconst Q_ANS_ROW_H = 80;\nconst Q_CARD_PAD = 8;\nconst MIN_NODE_W = 120;\nconst MAX_NODE_W = 320;\nconst MIN_Q_W = 220;\nconst PADDING = 48;\nconst H_GAP = 80;\nconst V_GAP = 96;\n\nfunction estimateTextW(text: string, pxPerChar = 7.5): number {\n return text.length * pxPerChar;\n}\n\nfunction nodeWidth(label: string): number {\n return Math.min(MAX_NODE_W, Math.max(MIN_NODE_W, Math.ceil(estimateTextW(label) + 48)));\n}\n\nfunction answerCardW(ans: string): number {\n return Math.max(86, Math.ceil(Math.max(estimateTextW(ans, 7.5) + 20, 56) + 32));\n}\n\nfunction questionNodeW(node: DiagramNode): number {\n const answers = (node.metadata?.answers as string[] | undefined) ?? [];\n const headerW = estimateTextW(node.label, 8) + 80;\n if (answers.length === 0) return Math.max(MIN_Q_W, Math.ceil(headerW));\n const cardsW = answers.reduce((s, a) => s + answerCardW(a), 0)\n + (answers.length - 1) * Q_CARD_PAD + 2 * Q_CARD_PAD;\n return Math.max(MIN_Q_W, Math.ceil(Math.max(headerW, cardsW)));\n}\n\nfunction questionNodeH(answers: string[]): number {\n return Q_BASE_H + (answers.length === 0 ? 48 : Q_ANS_ROW_H);\n}\n\nfunction bezierPath(x1: number, y1: number, x2: number, y2: number): string {\n const dy = y2 - y1;\n const dyAbs = Math.abs(dy);\n const dxAbs = Math.abs(x2 - x1);\n const base = dy > 0 ? dyAbs * 0.55 : Math.max(90, dyAbs * 0.5 + dxAbs * 0.28);\n const curve = Math.max(36, Math.min(220, base));\n return `M ${x1} ${y1} C ${x1} ${y1 + curve}, ${x2} ${y2 - curve}, ${x2} ${y2}`;\n}\n\ninterface LayoutBox { x: number; y: number; w: number; h: number }\n\nfunction isQuestion(node: DiagramNode, variant: DiagramModel['variant']): boolean {\n return variant === 'question' && !!node.metadata?.answers;\n}\n\n/** Honor x/y on nodes if present; otherwise BFS-layer fallback. */\nfunction computeLayout(model: DiagramModel): Map<string, LayoutBox> {\n const boxes = new Map<string, LayoutBox>();\n const sized = model.nodes.map(n => {\n const w = isQuestion(n, model.variant) ? questionNodeW(n) : nodeWidth(n.label);\n const h = isQuestion(n, model.variant)\n ? questionNodeH((n.metadata?.answers as string[] | undefined) ?? [])\n : NODE_H;\n return { node: n, w, h };\n });\n\n const allPositioned = sized.every(s => typeof s.node.x === 'number' && typeof s.node.y === 'number');\n if (allPositioned) {\n for (const s of sized) {\n boxes.set(s.node.id, { x: s.node.x as number, y: s.node.y as number, w: s.w, h: s.h });\n }\n return boxes;\n }\n\n // BFS-layer fallback for un-positioned graphs (e.g. fresh imports).\n const inDeg = new Map(model.nodes.map(n => [n.id, 0]));\n for (const e of model.edges) inDeg.set(e.to, (inDeg.get(e.to) ?? 0) + 1);\n\n const layers = new Map<string, number>();\n const queue = model.nodes.filter(n => (inDeg.get(n.id) ?? 0) === 0).map(n => n.id);\n for (const id of queue) layers.set(id, 0);\n let head = 0;\n while (head < queue.length) {\n const cur = queue[head++];\n const layer = layers.get(cur) ?? 0;\n for (const e of model.edges) {\n if (e.from === cur) {\n const next = layers.get(e.to) ?? -1;\n if (next < layer + 1) {\n layers.set(e.to, layer + 1);\n queue.push(e.to);\n }\n }\n }\n }\n model.nodes.forEach(n => { if (!layers.has(n.id)) layers.set(n.id, 0); });\n\n const byLayer = new Map<number, typeof sized>();\n for (const s of sized) {\n const layer = layers.get(s.node.id) ?? 0;\n if (!byLayer.has(layer)) byLayer.set(layer, []);\n byLayer.get(layer)!.push(s);\n }\n\n let y = PADDING;\n for (const layer of [...byLayer.keys()].sort((a, b) => a - b)) {\n const row = byLayer.get(layer)!;\n let x = PADDING;\n let maxH = 0;\n for (const s of row) {\n boxes.set(s.node.id, { x, y, w: s.w, h: s.h });\n x += s.w + H_GAP;\n maxH = Math.max(maxH, s.h);\n }\n y += maxH + V_GAP;\n }\n return boxes;\n}\n\nfunction escapeXML(s: string): string {\n return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n}\n\n// Match canvas: indigo/slate palette, light theme by default.\nconst COLORS = {\n bg: '#fafbfc',\n dot: '#dbe3ee',\n nodeFill: '#ffffff',\n nodeStroke: '#cbd5e1',\n edge: '#94a3b8',\n text: '#1e293b',\n textSub: '#94a3b8',\n amber: '#d97706',\n amberSoft: '#fef9ee',\n amberLine: '#fde68a',\n amberCardBg: '#fffdf7',\n};\n\nfunction renderStandardNode(node: DiagramNode, box: LayoutBox): string {\n const cx = box.x + box.w / 2;\n const cy = box.y + box.h / 2;\n const shape = node.shape ?? 'rectangle';\n const label = `<text x=\"${cx}\" y=\"${cy + 4.5}\" text-anchor=\"middle\" font-family=\"ui-sans-serif,system-ui,-apple-system,sans-serif\" font-size=\"13\" font-weight=\"500\" fill=\"${COLORS.text}\">${escapeXML(node.label)}</text>`;\n\n let shapeEl = '';\n if (shape === 'diamond') {\n const pts = `${cx},${box.y} ${box.x + box.w},${cy} ${cx},${box.y + box.h} ${box.x},${cy}`;\n shapeEl = `<polygon points=\"${pts}\" fill=\"${COLORS.nodeFill}\" stroke=\"${COLORS.nodeStroke}\" stroke-width=\"1.25\" filter=\"url(#nodeShadow)\"/>`;\n } else if (shape === 'circle') {\n const r = Math.min(box.w, box.h) / 2 - 1;\n shapeEl = `<circle cx=\"${cx}\" cy=\"${cy}\" r=\"${r}\" fill=\"${COLORS.nodeFill}\" stroke=\"${COLORS.nodeStroke}\" stroke-width=\"1.25\" filter=\"url(#nodeShadow)\"/>`;\n } else if (shape === 'parallelogram') {\n const pts = `${box.x + 14},${box.y} ${box.x + box.w},${box.y} ${box.x + box.w - 14},${box.y + box.h} ${box.x},${box.y + box.h}`;\n shapeEl = `<polygon points=\"${pts}\" fill=\"${COLORS.nodeFill}\" stroke=\"${COLORS.nodeStroke}\" stroke-width=\"1.25\" filter=\"url(#nodeShadow)\"/>`;\n } else {\n shapeEl = `<rect x=\"${box.x}\" y=\"${box.y}\" width=\"${box.w}\" height=\"${box.h}\" rx=\"14\" fill=\"${COLORS.nodeFill}\" stroke=\"${COLORS.nodeStroke}\" stroke-width=\"1.25\" filter=\"url(#nodeShadow)\"/>`;\n }\n return shapeEl + label;\n}\n\nfunction renderQuestionNode(node: DiagramNode, box: LayoutBox): string {\n const answers = (node.metadata?.answers as string[] | undefined) ?? [];\n const clipId = `qhdr-${node.id.replace(/[^a-zA-Z0-9_-]/g, '_')}`;\n const x = box.x, y = box.y, w = box.w, h = box.h;\n const parts: string[] = [];\n\n // Card body\n parts.push(`<rect x=\"${x}\" y=\"${y}\" width=\"${w}\" height=\"${h}\" rx=\"14\" fill=\"${COLORS.nodeFill}\" stroke=\"${COLORS.amberLine}\" stroke-width=\"1.5\" filter=\"url(#nodeShadow)\"/>`);\n\n // Header tint (clipped to top rounded corners)\n parts.push(`<defs><clipPath id=\"${clipId}\"><rect x=\"${x}\" y=\"${y}\" width=\"${w}\" height=\"${Q_BASE_H}\" rx=\"14\"/></clipPath></defs>`);\n parts.push(`<rect x=\"${x}\" y=\"${y}\" width=\"${w}\" height=\"${Q_BASE_H}\" fill=\"${COLORS.amberSoft}\" clip-path=\"url(#${clipId})\"/>`);\n\n // Amber left accent\n parts.push(`<rect x=\"${x}\" y=\"${y}\" width=\"4\" height=\"${Q_BASE_H}\" rx=\"2\" fill=\"${COLORS.amber}\"/>`);\n\n // ? badge\n parts.push(`<rect x=\"${x + 12}\" y=\"${y + 14}\" width=\"28\" height=\"28\" rx=\"8\" fill=\"${COLORS.amber}\"/>`);\n parts.push(`<text x=\"${x + 26}\" y=\"${y + 33}\" text-anchor=\"middle\" font-size=\"15\" font-weight=\"900\" fill=\"white\">?</text>`);\n\n // QUESTION label + node label\n parts.push(`<text x=\"${x + 50}\" y=\"${y + 27}\" font-family=\"ui-sans-serif,system-ui,sans-serif\" font-size=\"9\" font-weight=\"700\" fill=\"${COLORS.textSub}\" letter-spacing=\"0.6\">QUESTION</text>`);\n parts.push(`<text x=\"${x + 50}\" y=\"${y + 42}\" font-family=\"ui-sans-serif,system-ui,sans-serif\" font-size=\"13\" font-weight=\"700\" fill=\"${COLORS.text}\">${escapeXML(node.label)}</text>`);\n\n // Divider\n parts.push(`<line x1=\"${x}\" y1=\"${y + Q_BASE_H}\" x2=\"${x + w}\" y2=\"${y + Q_BASE_H}\" stroke=\"${COLORS.amberLine}\" stroke-width=\"1\"/>`);\n\n if (answers.length === 0) {\n parts.push(`<text x=\"${x + w / 2}\" y=\"${y + Q_BASE_H + 22}\" text-anchor=\"middle\" font-size=\"10\" fill=\"${COLORS.amber}\" opacity=\"0.4\" font-weight=\"600\">No answers yet</text>`);\n } else {\n const letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n answers.forEach((ans, i) => {\n const prevW = answers.slice(0, i).reduce((s, a) => s + answerCardW(a) + Q_CARD_PAD, 0);\n const cW = answerCardW(ans);\n const cardX = x + Q_CARD_PAD + prevW;\n const cardY = y + Q_BASE_H + 7;\n const cardH = Q_ANS_ROW_H - 20;\n const cx = cardX + cW / 2;\n const letter = i < 26 ? letters[i] : `${i + 1}`;\n const maxChars = Math.max(2, Math.floor((cW - 20) / 7.5));\n const displayAns = ans.length > maxChars ? ans.slice(0, maxChars - 1) + '…' : ans;\n\n parts.push(`<rect x=\"${cardX}\" y=\"${cardY}\" width=\"${cW}\" height=\"${cardH}\" rx=\"8\" fill=\"${COLORS.amberCardBg}\" stroke=\"${COLORS.amberLine}\" stroke-width=\"1\"/>`);\n parts.push(`<rect x=\"${cx - 11}\" y=\"${cardY + 7}\" width=\"22\" height=\"22\" rx=\"6\" fill=\"#fef3c7\"/>`);\n parts.push(`<text x=\"${cx}\" y=\"${cardY + 22}\" text-anchor=\"middle\" font-size=\"10\" font-weight=\"800\" fill=\"${COLORS.amber}\">${escapeXML(letter)}</text>`);\n parts.push(`<text x=\"${cx}\" y=\"${cardY + 46}\" text-anchor=\"middle\" font-size=\"11\" font-weight=\"500\" fill=\"#374151\" font-family=\"ui-sans-serif,system-ui,sans-serif\">${escapeXML(displayAns)}</text>`);\n });\n }\n\n return parts.join('');\n}\n\nfunction renderEdge(edge: DiagramEdge, boxes: Map<string, LayoutBox>, variant: DiagramModel['variant'], nodes: DiagramNode[]): string {\n const fromBox = boxes.get(edge.from);\n const toBox = boxes.get(edge.to);\n if (!fromBox || !toBox) return '';\n\n let x1: number, y1: number;\n const fromNode = nodes.find(n => n.id === edge.from);\n\n if (fromNode && isQuestion(fromNode, variant)) {\n const answers = (fromNode.metadata?.answers as string[] | undefined) ?? [];\n const idx = answers.indexOf(edge.label ?? '');\n if (idx >= 0) {\n const prevW = answers.slice(0, idx).reduce((s, a) => s + answerCardW(a) + Q_CARD_PAD, 0);\n const cW = answerCardW(answers[idx]);\n x1 = fromBox.x + Q_CARD_PAD + prevW + cW / 2;\n y1 = fromBox.y + Q_BASE_H + Q_ANS_ROW_H - 8;\n } else {\n x1 = fromBox.x + fromBox.w / 2;\n y1 = fromBox.y + fromBox.h;\n }\n } else {\n x1 = fromBox.x + fromBox.w / 2;\n y1 = fromBox.y + fromBox.h;\n }\n const x2 = toBox.x + toBox.w / 2;\n const y2 = toBox.y;\n\n const dash = edge.style === 'dashed' ? ' stroke-dasharray=\"6,4\"'\n : edge.style === 'dotted' ? ' stroke-dasharray=\"2,3\"' : '';\n const marker = edge.arrowhead === 'none' ? '' : ' marker-end=\"url(#arrow)\"';\n const d = bezierPath(x1, y1, x2, y2);\n\n let out = `<path d=\"${d}\" fill=\"none\" stroke=\"${COLORS.edge}\" stroke-width=\"1.5\"${dash}${marker}/>`;\n\n if (edge.label) {\n const midX = (x1 + x2) / 2;\n const midY = (y1 + y2) / 2;\n const labelW = estimateTextW(edge.label, 7) + 14;\n out += `<rect x=\"${midX - labelW / 2}\" y=\"${midY - 11}\" width=\"${labelW}\" height=\"18\" rx=\"9\" fill=\"${COLORS.bg}\" stroke=\"${COLORS.nodeStroke}\" stroke-width=\"1\"/>`;\n out += `<text x=\"${midX}\" y=\"${midY + 2}\" text-anchor=\"middle\" font-family=\"ui-sans-serif,system-ui,sans-serif\" font-size=\"11\" fill=\"${COLORS.text}\">${escapeXML(edge.label)}</text>`;\n }\n return out;\n}\n\n/**\n * Render a `DiagramModel` to a standalone SVG string. The output mirrors the\n * editor canvas: dot-grid background, soft drop-shadowed nodes, smooth\n * cubic-bezier edges. No external assets — the result is fully inline and\n * pasteable into HTML, README files, or PR descriptions.\n *\n * Layout is computed identically to the editor's hit-test pass (same width\n * estimation, padding, and question-card sizing), so an exported SVG matches\n * what you see on screen.\n *\n * Works in Node, Bun, and the browser (no DOM APIs needed).\n */\nexport function toSVG(model: DiagramModel): string {\n const boxes = computeLayout(model);\n let maxX = 0, maxY = 0;\n for (const b of boxes.values()) {\n maxX = Math.max(maxX, b.x + b.w);\n maxY = Math.max(maxY, b.y + b.h);\n }\n const width = maxX + PADDING;\n const height = maxY + PADDING + (model.title ? 32 : 0);\n\n const defs = [\n `<defs>`,\n `<pattern id=\"dotgrid\" x=\"0\" y=\"0\" width=\"24\" height=\"24\" patternUnits=\"userSpaceOnUse\">`,\n `<circle cx=\"12\" cy=\"12\" r=\"1.1\" fill=\"${COLORS.dot}\"/>`,\n `</pattern>`,\n `<filter id=\"nodeShadow\" x=\"-20%\" y=\"-20%\" width=\"140%\" height=\"140%\">`,\n `<feDropShadow dx=\"0\" dy=\"3\" stdDeviation=\"5\" flood-color=\"rgba(15,23,42,0.09)\"/>`,\n `</filter>`,\n `<marker id=\"arrow\" markerWidth=\"9\" markerHeight=\"7\" refX=\"8.5\" refY=\"3.5\" orient=\"auto\" markerUnits=\"strokeWidth\">`,\n `<path d=\"M0,0.5 L9,3.5 L0,6.5 L2.2,3.5 Z\" fill=\"${COLORS.edge}\"/>`,\n `</marker>`,\n `</defs>`,\n ].join('');\n\n const titleEl = model.title\n ? `<text x=\"${width / 2}\" y=\"22\" text-anchor=\"middle\" font-family=\"ui-sans-serif,system-ui,sans-serif\" font-size=\"15\" font-weight=\"700\" fill=\"${COLORS.text}\">${escapeXML(model.title)}</text>`\n : '';\n\n const edges = model.edges.map(e => renderEdge(e, boxes, model.variant, model.nodes)).join('\\n');\n const nodes = model.nodes.map(n => {\n const b = boxes.get(n.id)!;\n return isQuestion(n, model.variant) ? renderQuestionNode(n, b) : renderStandardNode(n, b);\n }).join('\\n');\n\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\" viewBox=\"0 0 ${width} ${height}\">\\n${defs}\\n<rect width=\"${width}\" height=\"${height}\" fill=\"${COLORS.bg}\"/>\\n<rect width=\"${width}\" height=\"${height}\" fill=\"url(#dotgrid)\"/>\\n${titleEl}\\n${edges}\\n${nodes}\\n</svg>`;\n}\n\n/**\n * Render a `DiagramModel` to a PNG `Blob`. Routes the SVG output through an\n * `<img>` and a `<canvas>` at `devicePixelRatio` scale, so the result is\n * crisp on hi-DPI displays.\n *\n * **Browser-only.** Throws if called in a Node/Bun environment (the Canvas\n * API is not available). For server-side PNG rendering, pipe `toSVG()` output\n * through a library like `@resvg/resvg-js`.\n */\nexport async function toPNG(model: DiagramModel): Promise<Blob> {\n if (typeof document === 'undefined') {\n throw new Error('toPNG requires a browser environment. For Node/Bun server use, pipe toSVG() through @resvg/resvg-js.');\n }\n const svg = toSVG(model);\n const blob = new Blob([svg], { type: 'image/svg+xml' });\n const url = URL.createObjectURL(blob);\n\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => {\n const canvas = document.createElement('canvas');\n const scale = window.devicePixelRatio || 2;\n canvas.width = img.naturalWidth * scale;\n canvas.height = img.naturalHeight * scale;\n const ctx = canvas.getContext('2d')!;\n ctx.scale(scale, scale);\n ctx.drawImage(img, 0, 0);\n URL.revokeObjectURL(url);\n canvas.toBlob(b => b ? resolve(b) : reject(new Error('Canvas toBlob failed')), 'image/png');\n };\n img.onerror = () => { URL.revokeObjectURL(url); reject(new Error('SVG image load failed')); };\n img.src = url;\n });\n}\n","import { useCallback } from 'react';\nimport type { DiagramModel } from '../../core/types.js';\nimport { fromMermaid } from '../../importers/mermaid.js';\nimport { fromJSON } from '../../importers/json.js';\n\n/**\n * Returns a `handleImport(text)` callback that parses pasted/uploaded text\n * (JSON or Mermaid, sniffed by whether it starts with `{`) and pushes the\n * result into history via `applyAndPush`.\n *\n * Editors differ in what shape they expect (flowchart vs sequence) and how\n * they post-process the parsed model (positioning nodes, normalizing types).\n * `expectedType` + `transform` capture those differences without duplicating\n * the parse/error-handling shell.\n *\n * @param applyAndPush Commits the imported model into the editor's history stack.\n * @param options.expectedType If set, an alert fires when the imported model is\n * the wrong type — guards against pasting a flowchart into the sequence editor.\n * @param options.transform Optional final-shape transform applied after the\n * type check and before `applyAndPush` (e.g., position-defaulting nodes).\n */\nexport function useImporter(\n applyAndPush: (m: DiagramModel) => void,\n options: {\n expectedType?: DiagramModel['type'];\n transform?: (m: DiagramModel) => DiagramModel;\n } = {},\n): (text: string) => void {\n const { expectedType, transform } = options;\n return useCallback((text: string) => {\n try {\n const parsed = text.trim().startsWith('{')\n ? fromJSON(text).toJSON()\n : fromMermaid(text).toJSON();\n if (expectedType && parsed.type !== expectedType) {\n alert(`Imported diagram is not a ${expectedType} diagram.`);\n return;\n }\n applyAndPush(transform ? transform(parsed) : parsed);\n } catch (err) {\n alert(`Import failed: ${(err as Error).message}`);\n }\n }, [applyAndPush, expectedType, transform]);\n}\n","import type { DiagramModel, DiagramNode, DiagramEdge, DiagramType, DiagramVariant, SequenceMessage, ValidationError } from './types.js';\n\n/**\n * Mutable builder around a `DiagramModel`. Every public mutator returns\n * `this` so callers can chain (`new Model('flowchart').addNode(...).addEdge(...)`).\n * Call `.toJSON()` to extract a deep-cloned plain model suitable for\n * serialization or for handing to the editor components.\n *\n * All add/update operations validate immediately and throw on collisions or\n * dangling references. For non-throwing, batch-style structural checks call\n * `.validate()` instead.\n */\nexport class Model {\n private data: DiagramModel;\n\n /**\n * Create an empty model.\n *\n * @param type Top-level kind — `flowchart` or `sequence`.\n * @param title Optional human-readable title.\n * @param variant Optional UI variant (flowchart models only).\n */\n constructor(type: DiagramType, title?: string, variant?: DiagramVariant) {\n this.data = { type, ...(variant ? { variant } : {}), title, nodes: [], edges: [], actors: [], messages: [] };\n }\n\n /**\n * Rehydrate a `Model` from a previously serialized `DiagramModel`. The\n * incoming data is deep-cloned, so future mutations on the returned `Model`\n * do not affect the caller's object.\n */\n static fromData(data: DiagramModel): Model {\n const m = new Model(data.type, data.title, data.variant);\n m.data = structuredClone(data);\n return m;\n }\n\n /** Set the UI variant. No-op semantics for sequence models. */\n setVariant(variant: DiagramVariant): this {\n this.data.variant = variant;\n return this;\n }\n\n /**\n * Append a node. Throws if a node with the same id already exists. The\n * input is shallow-cloned, so later mutations of the caller's object do\n * not leak in.\n */\n addNode(node: DiagramNode): this {\n if (this.data.nodes.find(n => n.id === node.id)) {\n throw new Error(`Node with id \"${node.id}\" already exists`);\n }\n this.data.nodes.push({ ...node });\n return this;\n }\n\n /**\n * Patch an existing node in place. Throws if the id is not found. The id\n * field itself cannot be patched — to rename, remove + re-add.\n */\n updateNode(id: string, patch: Partial<Omit<DiagramNode, 'id'>>): this {\n const node = this.data.nodes.find(n => n.id === id);\n if (!node) throw new Error(`Node \"${id}\" not found`);\n Object.assign(node, patch);\n return this;\n }\n\n /**\n * Remove a node and every edge that referenced it as `from` or `to`. Safe\n * to call on a missing id (no-op).\n */\n removeNode(id: string): this {\n this.data.nodes = this.data.nodes.filter(n => n.id !== id);\n this.data.edges = this.data.edges.filter(e => e.from !== id && e.to !== id);\n return this;\n }\n\n /**\n * Append an edge. Throws on duplicate id or if either endpoint references\n * an unknown node — the model never holds dangling edges from this entry\n * point. (Importers can still construct dangling edges; call `validate()`\n * to detect them.)\n */\n addEdge(edge: DiagramEdge): this {\n if (this.data.edges.find(e => e.id === edge.id)) {\n throw new Error(`Edge with id \"${edge.id}\" already exists`);\n }\n if (!this.data.nodes.find(n => n.id === edge.from)) {\n throw new Error(`Edge \"${edge.id}\" references unknown source node \"${edge.from}\"`);\n }\n if (!this.data.nodes.find(n => n.id === edge.to)) {\n throw new Error(`Edge \"${edge.id}\" references unknown target node \"${edge.to}\"`);\n }\n this.data.edges.push({ ...edge });\n return this;\n }\n\n /**\n * Surface structural problems without throwing. Returns an array of\n * `ValidationError`s; empty array means the model is well-formed. Used by\n * the editor's status banner and by external tooling.\n */\n validate(): ValidationError[] {\n const errors: ValidationError[] = [];\n const nodeIds = new Set<string>();\n for (const n of this.data.nodes) {\n if (nodeIds.has(n.id)) errors.push({ kind: 'duplicate-node-id', id: n.id, message: `Duplicate node id \"${n.id}\"` });\n nodeIds.add(n.id);\n }\n const edgeIds = new Set<string>();\n for (const e of this.data.edges) {\n if (edgeIds.has(e.id)) errors.push({ kind: 'duplicate-edge-id', id: e.id, message: `Duplicate edge id \"${e.id}\"` });\n edgeIds.add(e.id);\n if (!nodeIds.has(e.from)) errors.push({ kind: 'dangling-from', id: e.id, message: `Edge \"${e.id}\" references unknown source node \"${e.from}\"` });\n if (!nodeIds.has(e.to)) errors.push({ kind: 'dangling-to', id: e.id, message: `Edge \"${e.id}\" references unknown target node \"${e.to}\"` });\n }\n return errors;\n }\n\n /** Remove an edge by id. Safe to call on a missing id (no-op). */\n removeEdge(id: string): this {\n this.data.edges = this.data.edges.filter(e => e.id !== id);\n return this;\n }\n\n /** Append a sequence actor. Duplicate names are silently ignored. */\n addActor(name: string): this {\n if (!this.data.actors!.includes(name)) {\n this.data.actors!.push(name);\n }\n return this;\n }\n\n /**\n * Append a sequence message. The actors referenced by `from`/`to` are not\n * validated here — callers are expected to register them via `addActor()`\n * first.\n */\n addMessage(message: SequenceMessage): this {\n this.data.messages!.push({ ...message });\n return this;\n }\n\n /**\n * Return a deep-cloned plain `DiagramModel`. Safe to mutate by the caller;\n * mutations do not flow back into this `Model`.\n */\n toJSON(): DiagramModel {\n return structuredClone(this.data);\n }\n}\n","import { Model } from '../core/model.js';\nimport type { NodeShape } from '../core/types.js';\nimport { nextId } from '../core/ids.js';\n\n// Detects shape from Mermaid node syntax\nfunction parseNodeDecl(raw: string): { id: string; label: string; shape: NodeShape } | null {\n // diamond: id{label}, circle: id((label)), parallelogram: id[/label/], default: id[label] or id(\"label\")\n const patterns: [RegExp, NodeShape][] = [\n [/^(\\w+)\\{\\{?\"?(.+?)\"?\\}?\\}$/, 'diamond'],\n [/^(\\w+)\\(\\(\"?(.+?)\"?\\)\\)$/, 'circle'],\n [/^(\\w+)\\[\\/(.+?)\\/\\]$/, 'parallelogram'],\n [/^(\\w+)\\[[\"']?(.+?)[\"']?\\]$/, 'rectangle'],\n [/^(\\w+)\\(\"?(.+?)\"?\\)$/, 'rectangle'],\n ];\n for (const [re, shape] of patterns) {\n const m = raw.match(re);\n if (m) return { id: m[1], label: m[2].replace(/^[\"']|[\"']$/g, ''), shape };\n }\n return null;\n}\n\n// Mermaid flowchart edge connector: solid (-->, ---), dashed (-.->, -.-), or with labels.\n// Anchored so node IDs ending in `{`/`[`/`(` cannot bleed into the connector.\nconst EDGE_RE = /^(.+?)\\s*(-\\.->|-\\.-|-->|---)(?:\\|(.+?)\\|)?\\s*(.+)$/;\n\nfunction detectStyle(connector: string): 'solid' | 'dashed' {\n return connector.startsWith('-.') ? 'dashed' : 'solid';\n}\n\nfunction detectArrowhead(connector: string): 'arrow' | 'none' {\n return connector.endsWith('>') ? 'arrow' : 'none';\n}\n\nfunction parseFlowchart(lines: string[]): Model {\n const model = new Model('flowchart');\n const nodeMap = new Map<string, boolean>();\n const groupStack: string[] = [];\n\n const ensureNode = (id: string, group?: string) => {\n if (!nodeMap.has(id)) {\n nodeMap.set(id, true);\n const metadata = group ? { group } : undefined;\n model.addNode({ id, label: id, shape: 'rectangle', ...(metadata ? { metadata } : {}) });\n }\n };\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n // Skip Mermaid comments, config blocks, header directives, and click handlers.\n if (\n trimmed.startsWith('%%') ||\n trimmed.startsWith('graph') ||\n trimmed.startsWith('flowchart') ||\n trimmed.startsWith('click ') ||\n trimmed.startsWith('classDef ') ||\n trimmed.startsWith('class ') ||\n trimmed.startsWith('style ') ||\n trimmed.startsWith('linkStyle ')\n ) continue;\n\n // Subgraphs: track current group so contained nodes get metadata.group set.\n const subgraphOpen = trimmed.match(/^subgraph\\s+(\\S+)/i);\n if (subgraphOpen) { groupStack.push(subgraphOpen[1]); continue; }\n if (/^end\\b/i.test(trimmed)) { groupStack.pop(); continue; }\n\n const currentGroup = groupStack[groupStack.length - 1];\n\n const edgeMatch = trimmed.match(EDGE_RE);\n if (edgeMatch) {\n const fromRaw = edgeMatch[1].trim();\n const connector = edgeMatch[2];\n const label = edgeMatch[3]?.replace(/^[\"']|[\"']$/g, '');\n const toRaw = edgeMatch[4].trim();\n const style = detectStyle(connector);\n const arrowhead = detectArrowhead(connector);\n\n const fromNode = parseNodeDecl(fromRaw);\n const toNode = parseNodeDecl(toRaw);\n\n if (fromNode && !nodeMap.has(fromNode.id)) {\n nodeMap.set(fromNode.id, true);\n const metadata = currentGroup ? { group: currentGroup } : undefined;\n model.addNode({ ...fromNode, ...(metadata ? { metadata } : {}) });\n } else if (!fromNode) {\n ensureNode(fromRaw.replace(/\\W.*/, ''), currentGroup);\n }\n if (toNode && !nodeMap.has(toNode.id)) {\n nodeMap.set(toNode.id, true);\n const metadata = currentGroup ? { group: currentGroup } : undefined;\n model.addNode({ ...toNode, ...(metadata ? { metadata } : {}) });\n } else if (!toNode) {\n ensureNode(toRaw.replace(/\\W.*/, ''), currentGroup);\n }\n\n const fromId = fromNode?.id ?? fromRaw.replace(/\\W.*/, '');\n const toId = toNode?.id ?? toRaw.replace(/\\W.*/, '');\n model.addEdge({\n id: nextId('e', model.toJSON().edges),\n from: fromId, to: toId,\n ...(label ? { label } : {}),\n style,\n ...(arrowhead === 'none' ? { arrowhead } : {}),\n });\n continue;\n }\n\n const nodeDecl = parseNodeDecl(trimmed);\n if (nodeDecl && !nodeMap.has(nodeDecl.id)) {\n nodeMap.set(nodeDecl.id, true);\n const metadata = currentGroup ? { group: currentGroup } : undefined;\n model.addNode({ ...nodeDecl, ...(metadata ? { metadata } : {}) });\n }\n }\n\n return model;\n}\n\nfunction parseSequence(lines: string[], title?: string): Model {\n const model = new Model('sequence', title);\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('sequenceDiagram') || trimmed.startsWith('%%')) continue;\n\n const participantMatch = trimmed.match(/^participant\\s+(.+)$/i);\n if (participantMatch) {\n model.addActor(participantMatch[1].trim());\n continue;\n }\n\n const actorMatch = trimmed.match(/^actor\\s+(.+)$/i);\n if (actorMatch) {\n model.addActor(actorMatch[1].trim());\n continue;\n }\n\n // Sequence message arrows: ->, ->>, -->, -->> (-- prefix = dashed)\n const msgMatch = trimmed.match(/^(.+?)\\s*(-->>|->>|-->|->)\\s*(.+?):\\s*(.+)$/);\n if (msgMatch) {\n const from = msgMatch[1].trim();\n const arrow = msgMatch[2];\n const to = msgMatch[3].trim();\n const label = msgMatch[4].trim();\n model.addActor(from);\n model.addActor(to);\n const messages = model.toJSON().messages ?? [];\n model.addMessage({ id: nextId('m', messages), from, to, label, style: arrow.startsWith('--') ? 'dashed' : 'solid' });\n }\n }\n\n return model;\n}\n\n/**\n * Parse Mermaid source into a `Model`. Auto-detects `flowchart` /\n * `sequenceDiagram` from the directive line and dispatches accordingly.\n *\n * **What is preserved:**\n * - Flowcharts: node shapes (`[]` / `{}` / `(())` / `[/]`), node labels,\n * edge connectors (`-->`, `-.->`, `---`, `-.-`), edge labels, and\n * `subgraph` grouping (stored on `node.metadata.group`).\n * - Sequence: actor declarations, message arrows (`->>`, `-->>`), labels.\n * - Frontmatter `title: ...` blocks are lifted into `model.title`.\n *\n * **What is dropped or normalized:**\n * - `mermaid.initialize(...)` blocks, `%%{init: ...}%%` directives, and\n * click handlers — stripped before parsing.\n * - Dotted edges collapse to `dashed` (Mermaid's dot/dash style is lossy).\n * - Node positions, `waypoint`, and any package-specific metadata other\n * than `group` are not present in Mermaid and so cannot round-trip.\n */\nexport function fromMermaid(mermaid: string): Model {\n // Strip mermaid.initialize(...) and similar JS-style config blocks that\n // sometimes appear in copy-pasted snippets — anything between `init` and `)`.\n const cleaned = mermaid.replace(/mermaid\\.initialize\\([\\s\\S]*?\\)\\s*;?/g, '');\n const rawLines = cleaned.split('\\n');\n\n // Strip frontmatter\n let startIdx = 0;\n let title: string | undefined;\n if (rawLines[0]?.trim() === '---') {\n const endFm = rawLines.findIndex((l, i) => i > 0 && l.trim() === '---');\n if (endFm !== -1) {\n const fmLines = rawLines.slice(1, endFm);\n for (const fl of fmLines) {\n const tm = fl.match(/^title:\\s*(.+)$/);\n if (tm) title = tm[1].trim();\n }\n startIdx = endFm + 1;\n }\n }\n\n const lines = rawLines.slice(startIdx);\n const firstContent = lines.find(l => l.trim());\n\n if (firstContent?.trim().startsWith('sequenceDiagram')) {\n const m = parseSequence(lines, title);\n return m;\n }\n\n const m = parseFlowchart(lines);\n if (title) {\n // patch title via internal JSON round-trip\n const data = m.toJSON();\n data.title = title;\n return Model.fromData(data);\n }\n return m;\n}\n","import { Model } from '../core/model.js';\nimport type { DiagramModel } from '../core/types.js';\n\n/**\n * Rehydrate a `Model` from the package's JSON shape. Accepts either the raw\n * JSON string or an already-parsed `DiagramModel` (handy when the caller has\n * received the data from a typed source).\n *\n * Validation here is minimal — only the structural fields needed by the\n * downstream renderer (`type`, `nodes`, `edges`) are checked. For deeper\n * checks call `model.validate()` after import.\n *\n * @throws If `json` is not a valid `DiagramModel` shape.\n */\nexport function fromJSON(json: string | DiagramModel): Model {\n const data: DiagramModel = typeof json === 'string' ? JSON.parse(json) : json;\n if (!data.type || !Array.isArray(data.nodes) || !Array.isArray(data.edges)) {\n throw new Error('Invalid DiagramModel JSON');\n }\n return Model.fromData(data);\n}\n","/**\n * Built-in sample diagrams shown when a consumer mounts the editor without\n * an `initialModel`. The goal is for the empty state to look like a real\n * working diagram, not a blank canvas — so a developer evaluating the\n * package immediately sees the canvas, edge styles, and side panels with\n * meaningful content.\n *\n * Pass `initialModel={emptyModel(variant)}` (or any model of your own) to\n * opt out of the preset.\n */\n\nimport type { DiagramModel, DiagramVariant, DiagramType } from '../core/types.js';\n\n/**\n * Return a blank model of the requested type/variant. Useful as\n * `initialModel={emptyModel('flowchart')}` to opt out of the demo preset.\n */\nexport function emptyModel(\n type: DiagramType,\n variant?: DiagramVariant,\n): DiagramModel {\n if (type === 'sequence') {\n return { type: 'sequence', nodes: [], edges: [], actors: [], messages: [] };\n }\n return { type: 'flowchart', variant: variant ?? 'flowchart', nodes: [], edges: [] };\n}\n\nconst FLOWCHART_PRESET: DiagramModel = {\n type: 'flowchart',\n variant: 'flowchart',\n nodes: [\n { id: 'start', label: 'Start', shape: 'circle', x: 240, y: 60 },\n { id: 'place', label: 'Place order', shape: 'rectangle', x: 216, y: 180 },\n { id: 'check', label: 'Payment valid?', shape: 'diamond', x: 200, y: 300 },\n { id: 'confirm', label: 'Send confirmation',shape: 'rectangle', x: 60, y: 460 },\n { id: 'retry', label: 'Notify failure', shape: 'rectangle', x: 380, y: 460 },\n { id: 'done', label: 'Done', shape: 'circle', x: 240, y: 580 },\n ],\n edges: [\n { id: 'e1', from: 'start', to: 'place' },\n { id: 'e2', from: 'place', to: 'check' },\n { id: 'e3', from: 'check', to: 'confirm', label: 'yes' },\n { id: 'e4', from: 'check', to: 'retry', label: 'no', style: 'dashed' },\n { id: 'e5', from: 'confirm', to: 'done' },\n { id: 'e6', from: 'retry', to: 'done', style: 'dashed' },\n ],\n};\n\nconst QUESTION_PRESET: DiagramModel = {\n type: 'flowchart',\n variant: 'question',\n nodes: [\n {\n id: 'role',\n label: 'What is your role?',\n shape: 'rectangle',\n x: 220, y: 60,\n metadata: { answers: ['Engineer', 'Designer', 'PM'] },\n },\n { id: 'eng', label: 'Engineering docs', shape: 'rectangle', x: 40, y: 320 },\n { id: 'design', label: 'Design system', shape: 'rectangle', x: 280, y: 320 },\n { id: 'pm', label: 'Product roadmap', shape: 'rectangle', x: 520, y: 320 },\n ],\n edges: [\n { id: 'q1', from: 'role', to: 'eng', label: 'Engineer' },\n { id: 'q2', from: 'role', to: 'design', label: 'Designer' },\n { id: 'q3', from: 'role', to: 'pm', label: 'PM' },\n ],\n};\n\nconst JOURNEY_PRESET: DiagramModel = {\n type: 'flowchart',\n variant: 'journey',\n nodes: [\n { id: 'j1', label: 'Sign up', shape: 'rectangle', x: 60, y: 60 },\n { id: 'j2', label: 'Verify email', shape: 'rectangle', x: 60, y: 180 },\n { id: 'j3', label: 'Complete profile', shape: 'rectangle', x: 60, y: 300 },\n { id: 'j4', label: 'Invite team', shape: 'rectangle', x: 60, y: 420 },\n { id: 'j5', label: 'Launch project', shape: 'rectangle', x: 60, y: 540 },\n ],\n edges: [\n { id: 'je1', from: 'j1', to: 'j2' },\n { id: 'je2', from: 'j2', to: 'j3' },\n { id: 'je3', from: 'j3', to: 'j4' },\n { id: 'je4', from: 'j4', to: 'j5' },\n ],\n};\n\nconst SEQUENCE_PRESET: DiagramModel = {\n type: 'sequence',\n nodes: [],\n edges: [],\n actors: ['User', 'App', 'Server'],\n messages: [\n { id: 'm1', from: 'User', to: 'App', label: 'Tap \"Log in\"' },\n { id: 'm2', from: 'App', to: 'Server', label: 'POST /login' },\n { id: 'm3', from: 'Server', to: 'App', label: '200 OK + token', style: 'dashed' },\n { id: 'm4', from: 'App', to: 'User', label: 'Show dashboard', style: 'dashed' },\n ],\n};\n\n/**\n * Return a fresh, ready-to-edit flowchart model for the requested variant.\n * The result is a deep clone — callers may mutate freely without affecting\n * future calls.\n *\n * - `flowchart` → 6-node order-processing example with a decision diamond\n * - `question` → 1-question / 3-answer routing example\n * - `journey` → 5-step linear onboarding sequence\n */\nexport function presetFlowchartModel(variant: DiagramVariant = 'flowchart'): DiagramModel {\n if (variant === 'question') return cloneModel(QUESTION_PRESET);\n if (variant === 'journey') return cloneModel(JOURNEY_PRESET);\n return cloneModel(FLOWCHART_PRESET);\n}\n\n/**\n * Return a fresh, ready-to-edit sequence model — a 4-message User → App →\n * Server login flow. Deep-cloned; safe to mutate.\n */\nexport function presetSequenceModel(): DiagramModel {\n return cloneModel(SEQUENCE_PRESET);\n}\n\nfunction cloneModel(m: DiagramModel): DiagramModel {\n return {\n ...m,\n nodes: m.nodes.map((n) => ({ ...n, metadata: n.metadata ? { ...n.metadata } : undefined })),\n edges: m.edges.map((e) => ({ ...e })),\n actors: m.actors ? [...m.actors] : undefined,\n messages: m.messages?.map((msg) => ({ ...msg })),\n };\n}\n","import React, { useCallback, useRef } from 'react';\nimport type { DiagramModel, DiagramNode } from '../core/types.js';\n\nconst W = 168;\nconst H = 112;\nconst PAD = 18;\n\ninterface NodeBox { id: string; x: number; y: number; w: number; h: number }\n\nexport interface MinimapProps {\n model: DiagramModel;\n /** Canvas viewport size (the visible SVG element bounds, in CSS pixels). */\n viewportW: number;\n viewportH: number;\n /** Current pan/zoom transform from the parent canvas. */\n transform: { x: number; y: number; scale: number };\n /** Compute width+height for a node, matching the canvas's measurements. */\n measureNode(node: DiagramNode): { w: number; h: number };\n /** Center the canvas on a content-space point. */\n onCenterOn(contentX: number, contentY: number): void;\n isDark: boolean;\n accentColor: string;\n}\n\nexport function Minimap({\n model, viewportW, viewportH, transform, measureNode, onCenterOn, isDark, accentColor,\n}: MinimapProps) {\n const dragRef = useRef<{ active: boolean } | null>(null);\n\n const boxes: NodeBox[] = model.nodes.map(n => {\n const { w, h } = measureNode(n);\n return { id: n.id, x: n.x ?? 0, y: n.y ?? 0, w, h };\n });\n\n if (boxes.length === 0) return null;\n\n // Content bounding box, plus the current viewport rect (in content space).\n const vx = -transform.x / transform.scale;\n const vy = -transform.y / transform.scale;\n const vw = viewportW / transform.scale;\n const vh = viewportH / transform.scale;\n\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const b of boxes) {\n minX = Math.min(minX, b.x); minY = Math.min(minY, b.y);\n maxX = Math.max(maxX, b.x + b.w); maxY = Math.max(maxY, b.y + b.h);\n }\n // Include the viewport so the user always sees their current position.\n minX = Math.min(minX, vx); minY = Math.min(minY, vy);\n maxX = Math.max(maxX, vx + vw); maxY = Math.max(maxY, vy + vh);\n\n const contentW = Math.max(1, maxX - minX);\n const contentH = Math.max(1, maxY - minY);\n const scale = Math.min((W - PAD * 2) / contentW, (H - PAD * 2) / contentH);\n const offsetX = (W - contentW * scale) / 2 - minX * scale;\n const offsetY = (H - contentH * scale) / 2 - minY * scale;\n\n const project = (x: number, y: number) => ({\n x: offsetX + x * scale,\n y: offsetY + y * scale,\n });\n\n const unproject = (mx: number, my: number) => ({\n x: (mx - offsetX) / scale,\n y: (my - offsetY) / scale,\n });\n\n const panTo = useCallback((e: React.MouseEvent<SVGSVGElement>) => {\n const rect = e.currentTarget.getBoundingClientRect();\n const mx = e.clientX - rect.left;\n const my = e.clientY - rect.top;\n const { x, y } = unproject(mx, my);\n onCenterOn(x, y);\n }, [onCenterOn, scale, offsetX, offsetY]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const onMouseDown = (e: React.MouseEvent<SVGSVGElement>) => {\n e.stopPropagation();\n dragRef.current = { active: true };\n panTo(e);\n };\n const onMouseMove = (e: React.MouseEvent<SVGSVGElement>) => {\n if (!dragRef.current?.active) return;\n panTo(e);\n };\n const onMouseUp = () => { dragRef.current = null; };\n\n const bg = isDark ? 'rgba(15,23,42,0.92)' : 'rgba(255,255,255,0.94)';\n const border = isDark ? '#334155' : '#e2e8f0';\n const nodeFill = isDark ? '#475569' : '#cbd5e1';\n const viewStroke = accentColor;\n const viewFill = `${accentColor}22`;\n\n // Viewport rect projected into mini-space.\n const vp1 = project(vx, vy);\n const vp2 = project(vx + vw, vy + vh);\n const vpRect = {\n x: Math.max(0, Math.min(W, vp1.x)),\n y: Math.max(0, Math.min(H, vp1.y)),\n w: Math.max(2, Math.min(W, vp2.x) - Math.max(0, vp1.x)),\n h: Math.max(2, Math.min(H, vp2.y) - Math.max(0, vp1.y)),\n };\n\n return (\n <div\n style={{\n position: 'absolute', bottom: 14, right: 14,\n background: bg, border: `1px solid ${border}`,\n borderRadius: 10, padding: 6,\n boxShadow: isDark ? '0 8px 20px rgba(0,0,0,0.45)' : '0 6px 18px rgba(15,23,42,0.08)',\n backdropFilter: 'blur(6px)',\n }}\n >\n <svg\n width={W} height={H}\n style={{ display: 'block', cursor: 'grab', borderRadius: 6 }}\n onMouseDown={onMouseDown}\n onMouseMove={onMouseMove}\n onMouseUp={onMouseUp}\n onMouseLeave={onMouseUp}\n >\n <rect width={W} height={H} rx={6} fill={isDark ? '#0f172a' : '#fafbfc'} />\n {boxes.map(b => {\n const p = project(b.x, b.y);\n return (\n <rect\n key={b.id}\n x={p.x} y={p.y}\n width={Math.max(2, b.w * scale)} height={Math.max(2, b.h * scale)}\n rx={2} fill={nodeFill}\n />\n );\n })}\n <rect\n x={vpRect.x} y={vpRect.y}\n width={vpRect.w} height={vpRect.h}\n rx={3}\n fill={viewFill} stroke={viewStroke} strokeWidth={1.25}\n />\n </svg>\n </div>\n );\n}\n","import React, { useState } from 'react';\nimport type { DiagramModel, DiagramNode, DiagramVariant } from '../core/types.js';\nimport type { ThemeColors } from './theme.js';\n\nexport interface NodeNavigatorProps {\n model: DiagramModel;\n selected: string | null;\n variant: DiagramVariant;\n isDark: boolean;\n t: ThemeColors;\n acc: { color: string; fill: string; border: string };\n open: boolean;\n onToggle(): void;\n onSelect(nodeId: string): void;\n}\n\nexport function NodeNavigator({\n model, selected, variant, isDark, t, acc, open, onToggle, onSelect,\n}: NodeNavigatorProps) {\n const [search, setSearch] = useState('');\n\n const shapeIcon = (node: DiagramNode) => {\n if (variant === 'question') return '?';\n if (variant === 'journey') return '↗';\n switch (node.shape) {\n case 'diamond': return '◇';\n case 'circle': return '○';\n case 'parallelogram': return '▱';\n default: return '▭';\n }\n };\n\n const filtered = model.nodes.filter(n =>\n n.label.toLowerCase().includes(search.toLowerCase())\n );\n\n const inEdges = (id: string) => model.edges.filter(e => e.to === id).length;\n const outEdges = (id: string) => model.edges.filter(e => e.from === id).length;\n\n if (!open) {\n return (\n <div style={{\n width: 36, flexShrink: 0,\n background: t.panelBg, borderRight: `1px solid ${t.panelBorder}`,\n display: 'flex', flexDirection: 'column', alignItems: 'center', paddingTop: 8, gap: 6,\n }}>\n <button\n onClick={onToggle}\n title=\"Open node list\"\n style={{ background: 'none', border: 'none', cursor: 'pointer', color: t.textMuted, padding: 6, borderRadius: 6, fontSize: 14, lineHeight: 1 }}\n >☰</button>\n <div style={{ fontSize: 10, color: t.textMuted, fontWeight: 700, writingMode: 'vertical-rl', transform: 'rotate(180deg)', letterSpacing: 0.5 }}>\n {model.nodes.length}\n </div>\n </div>\n );\n }\n\n return (\n <div style={{\n width: 216, flexShrink: 0,\n background: t.panelBg, borderRight: `1px solid ${t.panelBorder}`,\n display: 'flex', flexDirection: 'column', overflow: 'hidden',\n }}>\n <div style={{\n display: 'flex', alignItems: 'center', justifyContent: 'space-between',\n padding: '10px 12px', borderBottom: `1px solid ${t.panelBorder}`, flexShrink: 0,\n }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>\n <span style={{ fontSize: 11, fontWeight: 700, color: t.textSecondary, textTransform: 'uppercase', letterSpacing: 0.7 }}>\n {variant === 'question' ? 'Questions' : variant === 'journey' ? 'Steps' : 'Nodes'}\n </span>\n <span style={{\n fontSize: 10, fontWeight: 700, color: t.textMuted,\n background: isDark ? '#0f172a' : '#f1f5f9',\n padding: '1px 6px', borderRadius: 99,\n }}>{model.nodes.length}</span>\n </div>\n <button\n onClick={onToggle}\n style={{ background: 'none', border: 'none', cursor: 'pointer', color: t.textMuted, padding: '2px 4px', borderRadius: 4, fontSize: 13, lineHeight: 1 }}\n title=\"Collapse\"\n >‹</button>\n </div>\n\n <div style={{ padding: '8px 10px', borderBottom: `1px solid ${t.sectionBorder}`, flexShrink: 0 }}>\n <div style={{ position: 'relative' }}>\n <span style={{ position: 'absolute', left: 8, top: '50%', transform: 'translateY(-50%)', fontSize: 11, color: t.textMuted, pointerEvents: 'none' }}>⌕</span>\n <input\n value={search}\n onChange={e => setSearch(e.target.value)}\n placeholder=\"Search…\"\n style={{\n width: '100%', padding: '5px 8px 5px 24px',\n border: `1.5px solid ${t.inputBorder}`, borderRadius: 7,\n fontSize: 12, background: t.inputBg, color: t.inputText,\n outline: 'none', boxSizing: 'border-box', fontFamily: 'inherit',\n }}\n />\n </div>\n </div>\n\n <div style={{ flex: 1, overflowY: 'auto', padding: '6px 8px', display: 'flex', flexDirection: 'column', gap: 2 }}>\n {filtered.length === 0 && (\n <div style={{ textAlign: 'center', padding: '20px 0', fontSize: 12, color: t.textMuted, fontStyle: 'italic' }}>\n {model.nodes.length === 0 ? 'No nodes yet' : 'No matches'}\n </div>\n )}\n {filtered.map((node, idx) => {\n const isSelected = selected === node.id;\n const answers = (node.metadata?.answers as string[] | undefined) ?? [];\n return (\n <button\n key={node.id}\n onClick={() => onSelect(node.id)}\n style={{\n display: 'flex', alignItems: 'center', gap: 8,\n width: '100%', padding: '7px 8px', textAlign: 'left',\n background: isSelected ? acc.fill : 'transparent',\n border: isSelected ? `1.5px solid ${acc.border}` : '1.5px solid transparent',\n borderRadius: 8, cursor: 'pointer', fontFamily: 'inherit',\n transition: 'background 0.1s',\n }}\n onMouseEnter={e => { if (!isSelected) (e.currentTarget as HTMLElement).style.background = isDark ? '#334155' : '#f1f5f9'; }}\n onMouseLeave={e => { if (!isSelected) (e.currentTarget as HTMLElement).style.background = 'transparent'; }}\n >\n <div style={{\n width: 22, height: 22, borderRadius: 6, flexShrink: 0,\n background: isSelected ? acc.color : (isDark ? '#334155' : '#e2e8f0'),\n color: isSelected ? '#fff' : t.textMuted,\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n fontSize: variant === 'journey' ? 9 : 11, fontWeight: 700,\n }}>\n {variant === 'journey' ? idx + 1 : shapeIcon(node)}\n </div>\n\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{\n fontSize: 12, fontWeight: isSelected ? 600 : 400,\n color: isSelected ? acc.color : t.textPrimary,\n overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap',\n lineHeight: 1.3,\n }}>{node.label}</div>\n <div style={{ fontSize: 10, color: t.textMuted, lineHeight: 1.2, marginTop: 1 }}>\n {variant === 'question'\n ? `${answers.length} answer${answers.length !== 1 ? 's' : ''}`\n : `${inEdges(node.id)}↓ ${outEdges(node.id)}→`}\n </div>\n </div>\n\n {isSelected && <span style={{ fontSize: 10, color: acc.color, flexShrink: 0 }}>◉</span>}\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport type { ThemeColors } from './theme.js';\n\nexport interface CtxMenuState {\n x: number;\n y: number;\n nodeId: string | null;\n edgeId?: string | null;\n}\n\nexport interface ContextMenuProps {\n x: number; y: number; nodeId: string | null; edgeId?: string | null;\n isDark: boolean; t: ThemeColors; acc: { color: string };\n canUndo: boolean; canRedo: boolean;\n onUndo(): void; onRedo(): void; onReCenter(): void; onAddNode(): void;\n onDuplicate(): void; onRename(): void; onDelete(): void; onDisconnect(): void;\n onEdgeRename?(): void;\n onEdgeStyle?(style: 'solid' | 'dashed' | 'dotted'): void;\n onEdgeArrowhead?(arrow: 'arrow' | 'none'): void;\n onEdgeDelete?(): void;\n onEdgeResetRouting?(): void;\n currentEdgeStyle?: 'solid' | 'dashed' | 'dotted';\n currentEdgeArrow?: 'arrow' | 'none' | 'open';\n edgeHasWaypoint?: boolean;\n containerRef: React.RefObject<HTMLDivElement | null>;\n}\n\nexport function ContextMenu({\n x, y, nodeId, edgeId, isDark, t, acc, canUndo, canRedo,\n onUndo, onRedo, onReCenter, onAddNode, onDuplicate, onRename, onDelete, onDisconnect,\n onEdgeRename, onEdgeStyle, onEdgeArrowhead, onEdgeDelete, onEdgeResetRouting,\n currentEdgeStyle, currentEdgeArrow, edgeHasWaypoint, containerRef,\n}: ContextMenuProps) {\n const menuRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState({ x, y });\n\n useEffect(() => {\n if (!menuRef.current || !containerRef.current) return;\n const m = menuRef.current.getBoundingClientRect();\n const c = containerRef.current.getBoundingClientRect();\n let nx = x, ny = y;\n if (nx + m.width > c.right - 8) nx = x - m.width;\n if (ny + m.height > c.bottom - 8) ny = y - m.height;\n setPos({ x: nx, y: ny });\n }, [x, y, containerRef]);\n\n const bg = isDark ? '#1e293b' : '#ffffff';\n const border = isDark ? '#334155' : '#e2e8f0';\n const hoverBg = isDark ? '#334155' : '#f1f5f9';\n const dividerColor = isDark ? '#334155' : '#f1f5f9';\n const text = t.textPrimary;\n const muted = t.textMuted;\n\n const item = (label: string, onClick: () => void, color?: string, disabled?: boolean): React.ReactNode => (\n <button\n key={label}\n onClick={disabled ? undefined : onClick}\n style={{\n display: 'flex', alignItems: 'center', gap: 10,\n width: '100%', padding: '7px 14px', background: 'none', border: 'none',\n textAlign: 'left', cursor: disabled ? 'default' : 'pointer',\n fontSize: 12, fontFamily: 'ui-sans-serif,system-ui,sans-serif',\n color: disabled ? muted : (color ?? text),\n opacity: disabled ? 0.4 : 1,\n borderRadius: 6,\n }}\n onMouseEnter={e => { if (!disabled) (e.currentTarget as HTMLElement).style.background = hoverBg; }}\n onMouseLeave={e => { (e.currentTarget as HTMLElement).style.background = 'none'; }}\n >\n {label}\n </button>\n );\n\n const divider = <div style={{ height: 1, background: dividerColor, margin: '4px 0' }} />;\n\n return (\n <div\n ref={menuRef}\n onMouseDown={e => e.stopPropagation()}\n style={{\n position: 'fixed', left: pos.x, top: pos.y, zIndex: 9999,\n background: bg, border: `1px solid ${border}`,\n borderRadius: 10, padding: '5px 0', minWidth: 180,\n boxShadow: isDark ? '0 8px 32px rgba(0,0,0,0.5)' : '0 8px 32px rgba(0,0,0,0.12)',\n fontFamily: 'ui-sans-serif,system-ui,sans-serif',\n }}\n >\n {edgeId ? (\n <>\n <div style={{ padding: '4px 14px 6px', fontSize: 10, fontWeight: 700, color: muted, textTransform: 'uppercase', letterSpacing: 0.8 }}>Edge</div>\n {item('Rename label (dbl-click)', () => onEdgeRename?.())}\n {divider}\n <div style={{ padding: '4px 14px 2px', fontSize: 9, fontWeight: 700, color: muted, textTransform: 'uppercase', letterSpacing: 0.8 }}>Style</div>\n {item(`Solid${currentEdgeStyle === 'solid' || !currentEdgeStyle ? ' ✓' : ''}`, () => onEdgeStyle?.('solid'))}\n {item(`Dashed${currentEdgeStyle === 'dashed' ? ' ✓' : ''}`, () => onEdgeStyle?.('dashed'))}\n {item(`Dotted${currentEdgeStyle === 'dotted' ? ' ✓' : ''}`, () => onEdgeStyle?.('dotted'))}\n {divider}\n <div style={{ padding: '4px 14px 2px', fontSize: 9, fontWeight: 700, color: muted, textTransform: 'uppercase', letterSpacing: 0.8 }}>Arrowhead</div>\n {item(`Arrow${currentEdgeArrow !== 'none' ? ' ✓' : ''}`, () => onEdgeArrowhead?.('arrow'))}\n {item(`None${currentEdgeArrow === 'none' ? ' ✓' : ''}`, () => onEdgeArrowhead?.('none'))}\n {divider}\n {item('Reset routing', () => onEdgeResetRouting?.(), undefined, !edgeHasWaypoint)}\n {item('Delete edge', () => onEdgeDelete?.(), '#ef4444')}\n </>\n ) : nodeId ? (\n <>\n <div style={{ padding: '4px 14px 6px', fontSize: 10, fontWeight: 700, color: muted, textTransform: 'uppercase', letterSpacing: 0.8 }}>Node</div>\n {item('Rename (dbl-click)', onRename)}\n {item('Duplicate', onDuplicate)}\n {item('Disconnect all edges', onDisconnect)}\n {divider}\n {item('Delete node', onDelete, '#ef4444')}\n </>\n ) : (\n <>\n <div style={{ padding: '4px 14px 6px', fontSize: 10, fontWeight: 700, color: muted, textTransform: 'uppercase', letterSpacing: 0.8 }}>Canvas</div>\n {item('Add node here', onAddNode, acc.color)}\n {item('Re-center (Ctrl+0)', onReCenter)}\n {divider}\n {item('Undo (Ctrl+Z)', onUndo, undefined, !canUndo)}\n {item('Redo (Ctrl+Y)', onRedo, undefined, !canRedo)}\n </>\n )}\n </div>\n );\n}\n","import React, { useState } from 'react';\nimport type { DiagramNode, DiagramEdge, DiagramVariant } from '../core/types.js';\nimport {\n NODE_H,\n Q_BASE_H,\n Q_ANS_ROW_H,\n Q_CARD_PAD,\n estimateTextW,\n nodeWidth,\n answerCardW,\n questionNodeW,\n questionNodeH,\n bezierPath,\n bezierPathVia,\n} from './layout.js';\nimport { ACCENT as C, variantAccent, type ThemeColors } from './theme.js';\n\n// Static style objects hoisted to module scope so React diffing doesn't see a\n// fresh `{}` on every render. Anything stable enough to be a constant lives\n// here; per-node theme-derived styles still allocate inline.\nconst STYLE_LABEL: React.CSSProperties = { pointerEvents: 'none', userSelect: 'none' };\nconst STYLE_BLUR: React.CSSProperties = { filter: 'blur(4px)' };\nconst STYLE_EDGE_HIT: React.CSSProperties = { cursor: 'pointer' };\nconst STYLE_NO_EVENTS: React.CSSProperties = { pointerEvents: 'none' };\nconst STYLE_PORT_HOVER: React.CSSProperties = { cursor: 'crosshair', filter: 'drop-shadow(0 1px 3px rgba(0,0,0,0.18))' };\nconst STYLE_WAYPOINT: React.CSSProperties = { cursor: 'grab', filter: 'drop-shadow(0 1px 2px rgba(0,0,0,0.25))' };\nconst STYLE_EDGE_LABEL_HIT: React.CSSProperties = { cursor: 'text' };\n\n// ── Standard node shape ────────────────────────────────────────────────────\nexport function NodeShape({ node, selected, variant, stepNumber, t, isDark, w }: {\n node: DiagramNode; selected: boolean; variant: DiagramVariant;\n stepNumber?: number; t: ThemeColors; isDark: boolean; w: number;\n}) {\n const acc = variantAccent(variant, isDark);\n const cx = w / 2, cy = NODE_H / 2;\n const stroke = selected ? acc.color : t.nodeStroke;\n const fill = selected ? t.nodeSelectedFill : t.nodeFill;\n const sw = selected ? 1.75 : 1.25;\n\n const glow = selected && (\n <>\n {node.shape === 'circle' ? (\n <>\n <circle cx={cx} cy={cy} r={NODE_H / 2 + 3} fill=\"none\" stroke={acc.color} strokeWidth={6} opacity={0.18} style={STYLE_BLUR} />\n <circle cx={cx} cy={cy} r={NODE_H / 2 + 1.5} fill=\"none\" stroke={acc.color} strokeWidth={1} opacity={0.55} />\n </>\n ) : node.shape === 'diamond' ? (\n <>\n <polygon points={`${cx},${-5} ${w + 5},${cy} ${cx},${NODE_H + 5} ${-5},${cy}`}\n fill=\"none\" stroke={acc.color} strokeWidth={6} opacity={0.18} style={STYLE_BLUR} />\n <polygon points={`${cx},${-2} ${w + 2},${cy} ${cx},${NODE_H + 2} ${-2},${cy}`}\n fill=\"none\" stroke={acc.color} strokeWidth={1} opacity={0.55} />\n </>\n ) : (\n <>\n <rect x={-4} y={-4} width={w + 8} height={NODE_H + 8} rx={18}\n fill=\"none\" stroke={acc.color} strokeWidth={6} opacity={0.18} style={STYLE_BLUR} />\n <rect x={-1.5} y={-1.5} width={w + 3} height={NODE_H + 3} rx={15.5}\n fill=\"none\" stroke={acc.color} strokeWidth={1} opacity={0.5} />\n </>\n )}\n </>\n );\n\n const badgeColor = isDark ? C.emeraldDark : C.emerald;\n const badge = variant === 'journey' && stepNumber !== undefined && (\n <>\n <circle cx={14} cy={14} r={10} fill={badgeColor} />\n <text x={14} y={18} textAnchor=\"middle\" fontSize={9} fill=\"white\" fontWeight=\"700\" style={STYLE_LABEL}>{stepNumber}</text>\n </>\n );\n\n switch (node.shape) {\n case 'diamond': {\n const pts = `${cx},0 ${w},${cy} ${cx},${NODE_H} 0,${cy}`;\n return <>{glow}<polygon points={pts} fill={fill} stroke={stroke} strokeWidth={sw} filter=\"url(#nodeShadow)\" />{badge}</>;\n }\n case 'circle':\n return <>{glow}<circle cx={cx} cy={cy} r={NODE_H / 2 - 1} fill={fill} stroke={stroke} strokeWidth={sw} filter=\"url(#nodeShadow)\" />{badge}</>;\n case 'parallelogram':\n return <>{glow}<polygon points={`14,0 ${w},0 ${w - 14},${NODE_H} 0,${NODE_H}`} fill={fill} stroke={stroke} strokeWidth={sw} filter=\"url(#nodeShadow)\" />{badge}</>;\n default:\n return <>{glow}<rect width={w} height={NODE_H} rx={14} fill={fill} stroke={stroke} strokeWidth={sw} filter=\"url(#nodeShadow)\" />{badge}</>;\n }\n}\n\n// ── Question node ──────────────────────────────────────────────────────────\nconst ANSWER_LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n\nexport function QuestionNode({ node, selected, edges, isDark, onAnswerPortDown, qW }: {\n node: DiagramNode; selected: boolean; edges: DiagramEdge[];\n isDark: boolean; qW: number;\n onAnswerPortDown: (e: React.MouseEvent, nodeId: string, answer: string, portX: number, portY: number) => void;\n}) {\n const answers: string[] = (node.metadata?.answers as string[] | undefined) ?? [];\n const totalH = questionNodeH(answers);\n const amber = isDark ? C.amberDark : C.amber;\n const amberSoft = isDark ? 'rgba(251,191,36,0.14)' : '#fef9ee';\n const amberLine = isDark ? 'rgba(251,191,36,0.18)' : '#fde68a';\n const nodeBg = isDark ? '#1e293b' : '#ffffff';\n const nodeBorder = selected ? amber : (isDark ? 'rgba(251,191,36,0.25)' : '#fde68a');\n const cardBg = isDark ? '#0f172a' : '#fffdf7';\n const cardBgConnected = isDark ? 'rgba(251,191,36,0.12)' : '#fef3c7';\n const cardBorder = isDark ? '#1e293b' : '#fde68a';\n const textMain = isDark ? '#f1f5f9' : '#1e293b';\n const textSub = isDark ? '#64748b' : '#94a3b8';\n const textAns = isDark ? '#cbd5e1' : '#374151';\n\n const portRowY = Q_BASE_H + Q_ANS_ROW_H - 8;\n\n const glow = selected && (\n <>\n <rect x={-4} y={-4} width={qW + 8} height={totalH + 8} rx={18}\n fill=\"none\" stroke={amber} strokeWidth={6} opacity={0.2}\n style={STYLE_BLUR} />\n <rect x={-1.5} y={-1.5} width={qW + 3} height={totalH + 3} rx={15.5}\n fill=\"none\" stroke={amber} strokeWidth={1} opacity={0.55} />\n </>\n );\n\n return (\n <>\n {glow}\n <rect width={qW} height={totalH} rx={14} fill={nodeBg} stroke={nodeBorder} strokeWidth={selected ? 2 : 1.5} filter=\"url(#nodeShadow)\" />\n <clipPath id={`qhdr-${node.id}`}>\n <rect width={qW} height={Q_BASE_H} rx={14} />\n </clipPath>\n <rect width={qW} height={Q_BASE_H} fill={amberSoft} clipPath={`url(#qhdr-${node.id})`} />\n <rect x={0} y={0} width={4} height={Q_BASE_H} rx={2} fill={amber} />\n <rect x={12} y={14} width={28} height={28} rx={8} fill={amber} />\n <text x={26} y={33} textAnchor=\"middle\" fontSize={15} fontWeight=\"900\" fill=\"white\" style={STYLE_LABEL}>?</text>\n <text style={STYLE_LABEL}\n fontFamily=\"ui-sans-serif,system-ui,sans-serif\">\n <tspan x={50} y={27} fontSize={9} fontWeight={700} fill={textSub} letterSpacing={0.6} textAnchor=\"start\">QUESTION</tspan>\n <tspan x={50} dy={15} fontSize={13} fontWeight={700} fill={selected ? amber : textMain} textAnchor=\"start\">\n {node.label}\n </tspan>\n </text>\n <line x1={0} y1={Q_BASE_H} x2={qW} y2={Q_BASE_H} stroke={amberLine} strokeWidth={1} />\n {answers.length === 0 && (\n <>\n <text x={qW / 2} y={Q_BASE_H + 22} textAnchor=\"middle\" fontSize={10} fill={amber} opacity={0.4} fontWeight={600} style={STYLE_LABEL}>\n No answers yet\n </text>\n <text x={qW / 2} y={Q_BASE_H + 36} textAnchor=\"middle\" fontSize={9} fill={textSub} opacity={0.7} style={STYLE_LABEL}>\n Open panel → Add Answer\n </text>\n </>\n )}\n {answers.map((ans, i) => {\n const prevW = answers.slice(0, i).reduce((s, a) => s + answerCardW(a) + Q_CARD_PAD, 0);\n const cW = answerCardW(ans);\n const cardX = Q_CARD_PAD + prevW;\n const cardY = Q_BASE_H + 7;\n const cardH = Q_ANS_ROW_H - 20;\n const cx = cardX + cW / 2;\n const connected = edges.some(e => e.from === node.id && e.label === ans);\n const letter = i < 26 ? ANSWER_LETTERS[i] : `${i + 1}`;\n const maxChars = Math.max(2, Math.floor((cW - 20) / 7.5));\n const displayAns = ans.length > maxChars ? ans.slice(0, maxChars - 1) + '…' : ans;\n\n return (\n <g key={ans + i}>\n <rect x={cardX} y={cardY} width={cW} height={cardH} rx={8}\n fill={connected ? cardBgConnected : cardBg}\n stroke={connected ? amber : cardBorder} strokeWidth={connected ? 1.5 : 1} />\n <rect x={cx - 11} y={cardY + 7} width={22} height={22} rx={6}\n fill={connected ? amber : (isDark ? '#1e293b' : '#fef3c7')} />\n <text x={cx} y={cardY + 22} textAnchor=\"middle\" fontSize={10} fontWeight={800}\n fill={connected ? '#fff' : amber}\n style={STYLE_LABEL}>\n {letter}\n </text>\n <text x={cx} y={cardY + 46} textAnchor=\"middle\" fontSize={11} fontWeight={500}\n fill={connected ? (isDark ? '#fef3c7' : '#92400e') : textAns}\n fontFamily=\"ui-sans-serif,system-ui,sans-serif\"\n style={STYLE_LABEL}>\n {displayAns}\n </text>\n <circle\n cx={cx} cy={portRowY} r={7}\n fill={connected ? amber : (isDark ? '#0f172a' : '#fff')}\n stroke={amber} strokeWidth={1.5}\n style={STYLE_PORT_HOVER}\n onMouseDown={e => onAnswerPortDown(e, node.id, ans, cx, portRowY)}\n />\n <path\n d={`M ${cx - 3} ${portRowY - 2} L ${cx} ${portRowY + 2} L ${cx + 3} ${portRowY - 2}`}\n fill=\"none\" stroke={connected ? '#fff' : amber} strokeWidth={1.5} strokeLinecap=\"round\" strokeLinejoin=\"round\"\n style={STYLE_NO_EVENTS}\n />\n </g>\n );\n })}\n </>\n );\n}\n\n// ── Edge ───────────────────────────────────────────────────────────────────\nexport function EdgeLine({ edge, nodes, variant, t, isDark, acc, editing, editValue, onEditChange, onEditCommit, onEditCancel, onDoubleClick, onContextMenu, onWaypointDown }: {\n edge: DiagramEdge; nodes: DiagramNode[]; variant: DiagramVariant;\n t: ThemeColors; isDark: boolean;\n acc: { color: string };\n editing?: boolean;\n editValue?: string;\n onEditChange?: (v: string) => void;\n onEditCommit?: () => void;\n onEditCancel?: () => void;\n onDoubleClick?: (edgeId: string) => void;\n onContextMenu?: (e: React.MouseEvent, edgeId: string) => void;\n onWaypointDown?: (e: React.MouseEvent, edgeId: string) => void;\n}) {\n const [hovered, setHovered] = useState(false);\n const from = nodes.find(n => n.id === edge.from);\n const to = nodes.find(n => n.id === edge.to);\n if (!from || !to) return null;\n\n let x1: number, y1: number, exitDir: 'bottom' | 'right' | 'left' = 'bottom';\n const amberColor = isDark ? C.amberDark : C.amber;\n\n if (variant === 'question') {\n const answers: string[] = (from.metadata?.answers as string[] | undefined) ?? [];\n const idx = answers.indexOf(edge.label ?? '');\n if (idx >= 0) {\n const prevW = answers.slice(0, idx).reduce((s, a) => s + answerCardW(a) + Q_CARD_PAD, 0);\n const cW = answerCardW(answers[idx]);\n x1 = (from.x ?? 0) + Q_CARD_PAD + prevW + cW / 2;\n y1 = (from.y ?? 0) + Q_BASE_H + Q_ANS_ROW_H - 8;\n exitDir = 'bottom';\n } else {\n const fqW = questionNodeW(from);\n x1 = (from.x ?? 0) + fqW / 2;\n y1 = (from.y ?? 0) + questionNodeH(answers);\n }\n } else {\n const fnW = nodeWidth(from.label);\n x1 = (from.x ?? 0) + fnW / 2;\n y1 = (from.y ?? 0) + NODE_H;\n }\n\n const toW = variant === 'question' ? questionNodeW(to) : nodeWidth(to.label);\n const x2 = (to.x ?? 0) + toW / 2;\n const y2 = to.y ?? 0;\n const wp = edge.waypoint;\n const d = wp ? bezierPathVia(x1, y1, wp.x, wp.y, x2, y2) : bezierPath(x1, y1, x2, y2, exitDir);\n // Handle position: at the waypoint when set; otherwise at the natural midpoint of the cubic.\n const hx = wp ? wp.x : (x1 + x2) / 2;\n const hy = wp ? wp.y : (y1 + y2) / 2;\n const mx = hx, my = hy - 8;\n const dash = edge.style === 'dashed' ? '7 4' : edge.style === 'dotted' ? '2 4' : undefined;\n const edgeClr = variant === 'question' ? amberColor : t.edgeColor;\n\n const isAmber = variant === 'question';\n const labelW = edge.label ? Math.max(60, Math.ceil(estimateTextW(edge.label, 7) + 18)) : 60;\n const showHandle = !!onWaypointDown && (hovered || !!wp);\n // The `edge-flow` / `edge-flow-amber` classes apply an animated flowing\n // dasharray for solid edges. When the user explicitly picks `dashed` or\n // `dotted`, honor that pattern statically — the animation would override\n // it and confuse the chosen meaning.\n const flowClass = dash ? undefined : isAmber ? 'edge-flow-amber' : 'edge-flow';\n return (\n <g\n onDoubleClick={(e) => { e.stopPropagation(); onDoubleClick?.(edge.id); }}\n onContextMenu={(e) => { onContextMenu?.(e, edge.id); }}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n >\n <path d={d} fill=\"none\" stroke=\"transparent\" strokeWidth={14} style={STYLE_EDGE_HIT} />\n <path\n d={d} fill=\"none\" stroke={edgeClr}\n strokeWidth={isAmber ? 2 : 1.5}\n strokeLinecap=\"round\"\n className={flowClass}\n strokeDasharray={dash}\n markerEnd={isAmber ? 'url(#arrowAmber)' : 'url(#arrowhead)'}\n opacity={isAmber ? 0.85 : 0.9}\n style={STYLE_NO_EVENTS}\n />\n {showHandle && (\n <circle\n cx={hx} cy={hy} r={wp ? 5 : 4}\n fill={wp ? acc.color : (isDark ? '#1e293b' : '#fff')}\n stroke={acc.color} strokeWidth={1.5}\n style={STYLE_WAYPOINT}\n onMouseDown={(e) => { e.stopPropagation(); onWaypointDown?.(e, edge.id); }}\n />\n )}\n {editing && !isAmber ? (\n <foreignObject x={mx - labelW / 2} y={my - 12} width={labelW} height={22}>\n <input\n autoFocus\n value={editValue ?? ''}\n onChange={(e) => onEditChange?.(e.target.value)}\n onBlur={() => onEditCommit?.()}\n onKeyDown={(e) => {\n if (e.key === 'Enter') { e.preventDefault(); onEditCommit?.(); }\n if (e.key === 'Escape') { e.preventDefault(); onEditCancel?.(); }\n }}\n onMouseDown={(e) => e.stopPropagation()}\n style={{\n width: '100%', height: '100%', border: 'none', borderRadius: 6,\n outline: `2px solid ${acc.color}`,\n textAlign: 'center', fontSize: 10, fontWeight: 500,\n background: t.inputBg, color: t.inputText,\n boxSizing: 'border-box', padding: '0 6px', fontFamily: 'inherit',\n }}\n />\n </foreignObject>\n ) : edge.label && !isAmber ? (\n <>\n <rect x={mx - labelW / 2} y={my - 11} width={labelW} height={19} rx={5}\n fill={t.panelBg} stroke={t.cardBorder} strokeWidth={1}\n style={STYLE_EDGE_LABEL_HIT} />\n <text x={mx} y={my + 4} textAnchor=\"middle\" fontSize={10} fill={t.textSecondary}\n fontFamily=\"ui-sans-serif,system-ui,sans-serif\" fontWeight=\"500\"\n style={STYLE_LABEL}>{edge.label}</text>\n </>\n ) : null}\n </g>\n );\n}\n","import type { DiagramNode, DiagramVariant } from '../core/types.js';\n\n// Fixed heights; widths are dynamic per-node.\nexport const NODE_H = 48;\nexport const Q_BASE_H = 68;\nexport const Q_ANS_ROW_H = 80;\nexport const GRID = 24;\nexport const Q_CARD_PAD = 8;\n\n// Width bounds.\nexport const MIN_NODE_W = 120;\nexport const MAX_NODE_W = 320;\nexport const MIN_Q_W = 220;\nexport const MAX_Q_W = 400;\n\n/** Estimate text width at ~7.5px/char (13px ui-sans-serif mixed-case). */\nexport function estimateTextW(text: string, pxPerChar = 7.5): number {\n return text.length * pxPerChar;\n}\n\n/** Dynamic width for standard nodes based on label length. */\nexport function nodeWidth(label: string): number {\n return Math.min(MAX_NODE_W, Math.max(MIN_NODE_W, Math.ceil(estimateTextW(label) + 48)));\n}\n\n/** Width of a single answer card based on its text content. */\nexport function answerCardW(ans: string): number {\n return Math.max(86, Math.ceil(Math.max(estimateTextW(ans, 7.5) + 20, 56) + 32));\n}\n\n/** Dynamic width for question nodes — header vs. sum of side-by-side answer cards. */\nexport function questionNodeW(node: DiagramNode): number {\n const answers = (node.metadata?.answers as string[] | undefined) ?? [];\n const headerW = estimateTextW(node.label, 8) + 80;\n if (answers.length === 0) return Math.max(MIN_Q_W, Math.ceil(headerW));\n const cardsW =\n answers.reduce((s, a) => s + answerCardW(a), 0) +\n (answers.length - 1) * Q_CARD_PAD +\n 2 * Q_CARD_PAD;\n return Math.max(MIN_Q_W, Math.ceil(Math.max(headerW, cardsW)));\n}\n\nexport function questionNodeH(answers: string[]): number {\n return Q_BASE_H + (answers.length === 0 ? 48 : Q_ANS_ROW_H);\n}\n\n/** Variant-aware width × height for a node, in canvas units. */\nexport function nodeDims(node: DiagramNode, variant: DiagramVariant): { w: number; h: number } {\n if (variant === 'question') {\n const answers = (node.metadata?.answers as string[] | undefined) ?? [];\n return { w: questionNodeW(node), h: questionNodeH(answers) };\n }\n return { w: nodeWidth(node.label), h: NODE_H };\n}\n\n/** Snap a value to the nearest grid step. */\nexport function snap(v: number): number {\n return Math.round(v / GRID) * GRID;\n}\n\n/**\n * Cubic-bezier path between two ports. The default `bottom` direction pulls the\n * source control point straight down and the target control point straight up,\n * producing the natural S-curve used by the canvas. `right`/`left` exits add\n * lateral pull for ports that emerge from a node's side (answer cards).\n */\nexport function bezierPath(\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n exitDir: 'bottom' | 'right' | 'left' = 'bottom',\n): string {\n if (exitDir === 'right') {\n const dx = Math.abs(x2 - x1),\n dy = Math.abs(y2 - y1);\n const c = Math.max(60, (dx + dy) * 0.45);\n return `M ${x1} ${y1} C ${x1 + c} ${y1}, ${x2} ${y2 - c * 0.5}, ${x2} ${y2}`;\n }\n if (exitDir === 'left') {\n const dx = Math.abs(x2 - x1),\n dy = Math.abs(y2 - y1);\n const c = Math.max(60, (dx + dy) * 0.45);\n return `M ${x1} ${y1} C ${x1 - c} ${y1}, ${x2} ${y2 - c * 0.5}, ${x2} ${y2}`;\n }\n const dy = y2 - y1;\n const dyAbs = Math.abs(dy);\n const dxAbs = Math.abs(x2 - x1);\n const base = dy > 0 ? dyAbs * 0.55 : Math.max(90, dyAbs * 0.5 + dxAbs * 0.28);\n const curve = Math.max(36, Math.min(220, base));\n return `M ${x1} ${y1} C ${x1} ${y1 + curve}, ${x2} ${y2 - curve}, ${x2} ${y2}`;\n}\n\n/**\n * Two-segment cubic path that passes through `(wx, wy)` as a hard waypoint.\n * Each segment uses the same vertical-pull logic as `bezierPath`. The result\n * is one continuous path command: `M src C ... wx wy C ... dst`.\n */\nexport function bezierPathVia(\n x1: number,\n y1: number,\n wx: number,\n wy: number,\n x2: number,\n y2: number,\n): string {\n const seg1 = bezierPath(x1, y1, wx, wy, 'bottom');\n const seg2 = bezierPath(wx, wy, x2, y2, 'bottom');\n // seg2 starts with `M wx wy ` — strip it so the path continues from\n // the end of seg1 (which is already at `wx, wy`).\n const seg2NoM = seg2.replace(/^M\\s+-?[\\d.]+\\s+-?[\\d.]+\\s+/, '');\n return seg1 + ' ' + seg2NoM;\n}\n\n/** Approximate midpoint of the cubic path produced by `bezierPath`. */\nexport function bezierMidpoint(\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n): { x: number; y: number } {\n // The cubic uses control points (x1, y1+curve) and (x2, y2-curve). At t=0.5\n // a cubic bezier evaluates to (P0+3P1+3P2+P3)/8. So Y is:\n // (y1 + 3(y1+curve) + 3(y2-curve) + y2) / 8 = (4y1 + 4y2) / 8 = (y1+y2)/2\n // X collapses similarly since both control points share the endpoint X.\n return { x: (x1 + x2) / 2, y: (y1 + y2) / 2 };\n}\n","import { useCallback, useRef, useState } from 'react';\n\nconst MAX_HISTORY = 80;\n\nexport interface HistoryApi<T> {\n state: T;\n /** Replace state without recording history (e.g. mid-drag). */\n apply: (next: T) => void;\n /** Replace state AND push the previous-to-this snapshot onto the undo stack. */\n applyAndPush: (next: T) => void;\n undo: () => void;\n redo: () => void;\n canUndo: boolean;\n canRedo: boolean;\n}\n\n/**\n * Linear undo/redo history bounded to MAX_HISTORY entries. The initial value\n * counts as the first entry, so calling `applyAndPush` then `undo` returns to\n * the initial state. `onChange` fires for every state replacement, including\n * undo/redo navigation.\n */\nexport function useHistory<T>(initial: T, onChange?: (next: T) => void): HistoryApi<T> {\n const [state, setState] = useState<T>(initial);\n const stackRef = useRef<T[]>([initial]);\n const idxRef = useRef(0);\n // Force re-renders when canUndo/canRedo flip (refs alone don't trigger renders).\n const [, setTick] = useState(0);\n const bump = () => setTick((n) => n + 1);\n\n const apply = useCallback(\n (next: T) => {\n setState(next);\n onChange?.(next);\n },\n [onChange],\n );\n\n const applyAndPush = useCallback(\n (next: T) => {\n const stack = stackRef.current.slice(0, idxRef.current + 1);\n stack.push(next);\n if (stack.length > MAX_HISTORY) stack.shift();\n stackRef.current = stack;\n idxRef.current = stack.length - 1;\n setState(next);\n onChange?.(next);\n bump();\n },\n [onChange],\n );\n\n const undo = useCallback(() => {\n if (idxRef.current <= 0) return;\n idxRef.current--;\n const next = stackRef.current[idxRef.current];\n setState(next);\n onChange?.(next);\n bump();\n }, [onChange]);\n\n const redo = useCallback(() => {\n if (idxRef.current >= stackRef.current.length - 1) return;\n idxRef.current++;\n const next = stackRef.current[idxRef.current];\n setState(next);\n onChange?.(next);\n bump();\n }, [onChange]);\n\n return {\n state,\n apply,\n applyAndPush,\n undo,\n redo,\n canUndo: idxRef.current > 0,\n canRedo: idxRef.current < stackRef.current.length - 1,\n };\n}\n","import { useEffect, type RefObject } from 'react';\n\ninterface Transform {\n x: number;\n y: number;\n scale: number;\n}\n\n/**\n * Attaches a non-passive wheel listener that pans + zooms `transform` around\n * the cursor position. Non-passive is required so we can `preventDefault()`\n * the page scroll on the canvas.\n */\nexport function useCanvasWheel(\n ref: RefObject<SVGSVGElement>,\n setTransform: (updater: (t: Transform) => Transform) => void,\n options: { min?: number; max?: number; factor?: number } = {},\n): void {\n const { min = 0.15, max = 3, factor = 0.1 } = options;\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n const onWheel = (e: WheelEvent) => {\n e.preventDefault();\n const rect = el.getBoundingClientRect();\n const px = e.clientX - rect.left;\n const py = e.clientY - rect.top;\n const delta = e.deltaY > 0 ? 1 - factor : 1 + factor;\n setTransform((tr) => {\n const scale = Math.min(max, Math.max(min, tr.scale * delta));\n return {\n scale,\n x: px - (px - tr.x) * (scale / tr.scale),\n y: py - (py - tr.y) * (scale / tr.scale),\n };\n });\n };\n el.addEventListener('wheel', onWheel, { passive: false });\n return () => el.removeEventListener('wheel', onWheel);\n }, [ref, setTransform, min, max, factor]);\n}\n","import { useEffect, type RefObject } from 'react';\n\ninterface Transform {\n x: number;\n y: number;\n scale: number;\n}\n\ninterface UseCanvasTouchOptions {\n /** Current pan/zoom transform — read at touch-start to seed the gesture. */\n transform: Transform;\n /** Updater applied while the gesture runs. */\n setTransform: (next: Transform | ((tr: Transform) => Transform)) => void;\n /** Fired after ~550 ms of stationary contact. Cancelled by movement. */\n onLongPress: (clientX: number, clientY: number) => void;\n /** Min/max scale for pinch zoom (defaults match the wheel hook). */\n minScale?: number;\n maxScale?: number;\n /** Long-press duration and pixels-of-slop allowance before cancel. */\n longPressMs?: number;\n longPressSlop?: number;\n}\n\n/**\n * Touch gesture wiring for the canvas SVG: single-finger pan on the\n * background, two-finger pinch zoom anywhere, and long-press to fire\n * `onLongPress` (typically opens the context menu). The synthetic `click`\n * that follows a fired long-press is swallowed so the menu isn't dismissed\n * immediately.\n */\nexport function useCanvasTouch(\n ref: RefObject<SVGSVGElement>,\n {\n transform,\n setTransform,\n onLongPress,\n minScale = 0.15,\n maxScale = 3,\n longPressMs = 550,\n longPressSlop = 8,\n }: UseCanvasTouchOptions,\n): void {\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n\n let touchPan: { ox: number; oy: number; tx: number; ty: number } | null = null;\n let pinch: { dist: number; cx: number; cy: number; scale: number; tx: number; ty: number } | null = null;\n let longPressTimer: ReturnType<typeof setTimeout> | null = null;\n let longPressStart: { x: number; y: number } | null = null;\n let longPressFired = false;\n\n const dist = (a: Touch, b: Touch) => Math.hypot(a.clientX - b.clientX, a.clientY - b.clientY);\n\n const cancelLongPress = () => {\n if (longPressTimer) {\n clearTimeout(longPressTimer);\n longPressTimer = null;\n }\n longPressStart = null;\n };\n\n const onStart = (e: TouchEvent) => {\n if (e.touches.length === 2) {\n e.preventDefault();\n cancelLongPress();\n const [a, b] = [e.touches[0], e.touches[1]];\n const rect = el.getBoundingClientRect();\n pinch = {\n dist: dist(a, b),\n cx: (a.clientX + b.clientX) / 2 - rect.left,\n cy: (a.clientY + b.clientY) / 2 - rect.top,\n scale: transform.scale,\n tx: transform.x,\n ty: transform.y,\n };\n touchPan = null;\n return;\n }\n if (e.touches.length === 1) {\n const target = e.target as SVGElement | null;\n const t0 = e.touches[0];\n longPressFired = false;\n longPressStart = { x: t0.clientX, y: t0.clientY };\n longPressTimer = setTimeout(() => {\n if (!longPressStart) return;\n longPressFired = true;\n touchPan = null;\n onLongPress(longPressStart.x, longPressStart.y);\n }, longPressMs);\n if (target?.dataset.bg !== '1' && target !== el) return;\n touchPan = { ox: t0.clientX, oy: t0.clientY, tx: transform.x, ty: transform.y };\n }\n };\n\n const onMove = (e: TouchEvent) => {\n if (pinch && e.touches.length === 2) {\n e.preventDefault();\n const [a, b] = [e.touches[0], e.touches[1]];\n const ratio = dist(a, b) / pinch.dist;\n const scale = Math.min(maxScale, Math.max(minScale, pinch.scale * ratio));\n setTransform({\n scale,\n x: pinch.cx - (pinch.cx - pinch.tx) * (scale / pinch.scale),\n y: pinch.cy - (pinch.cy - pinch.ty) * (scale / pinch.scale),\n });\n return;\n }\n if (e.touches.length === 1) {\n const t0 = e.touches[0];\n if (\n longPressStart &&\n (Math.abs(t0.clientX - longPressStart.x) > longPressSlop ||\n Math.abs(t0.clientY - longPressStart.y) > longPressSlop)\n ) {\n cancelLongPress();\n }\n if (touchPan) {\n e.preventDefault();\n const pan = touchPan;\n setTransform((tr) => ({\n ...tr,\n x: pan.tx + (t0.clientX - pan.ox),\n y: pan.ty + (t0.clientY - pan.oy),\n }));\n }\n }\n };\n\n const onEnd = (e: TouchEvent) => {\n cancelLongPress();\n if (longPressFired) {\n e.preventDefault();\n longPressFired = false;\n }\n if (e.touches.length === 0) {\n touchPan = null;\n pinch = null;\n }\n if (e.touches.length === 1) pinch = null;\n };\n\n el.addEventListener('touchstart', onStart, { passive: false });\n el.addEventListener('touchmove', onMove, { passive: false });\n el.addEventListener('touchend', onEnd);\n el.addEventListener('touchcancel', onEnd);\n return () => {\n cancelLongPress();\n el.removeEventListener('touchstart', onStart);\n el.removeEventListener('touchmove', onMove);\n el.removeEventListener('touchend', onEnd);\n el.removeEventListener('touchcancel', onEnd);\n };\n }, [ref, transform.scale, transform.x, transform.y, setTransform, onLongPress, minScale, maxScale, longPressMs, longPressSlop]);\n}\n","import { useEffect, useState, type RefObject } from 'react';\n\n/**\n * Observes a ref'd element's bounding rect and reports its current size.\n * Returns `{ w: 0, h: 0 }` until the element mounts; updates on every\n * ResizeObserver tick. No-ops when `ResizeObserver` is unavailable (older\n * non-browser test envs).\n */\nexport function useElementSize<E extends Element>(\n ref: RefObject<E | null>,\n): { w: number; h: number } {\n const [size, setSize] = useState<{ w: number; h: number }>({ w: 0, h: 0 });\n\n useEffect(() => {\n const el = ref.current;\n if (!el || typeof ResizeObserver === 'undefined') return;\n const measure = () => {\n const r = el.getBoundingClientRect();\n setSize({ w: r.width, h: r.height });\n };\n const ro = new ResizeObserver(measure);\n ro.observe(el);\n measure();\n return () => ro.disconnect();\n }, [ref]);\n\n return size;\n}\n","/**\n * Alignment guides and snap-to-sibling logic, used while dragging a single\n * node. Pure functions — no DOM, no React — so they can be unit tested.\n */\n\nexport const ALIGN_SNAP_THRESHOLD = 4; // canvas-space pixels\n\nexport interface AlignBox {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nexport interface AlignGuideV {\n pos: number; // x position in canvas coords\n minY: number; // line extent (vertical guide)\n maxY: number;\n}\n\nexport interface AlignGuideH {\n pos: number; // y position in canvas coords\n minX: number; // line extent (horizontal guide)\n maxX: number;\n}\n\nexport interface AlignResult {\n x: number;\n y: number;\n guideX?: AlignGuideV;\n guideY?: AlignGuideH;\n}\n\n/**\n * Given a dragged box and a list of other boxes, return the snapped\n * position and any alignment guides that should be shown.\n *\n * Snaps the left, horizontal-center, or right edge to a matching axis on\n * any sibling within ALIGN_SNAP_THRESHOLD. Likewise for top, vertical-center,\n * and bottom. The closest match per axis wins.\n */\nexport function findSiblingSnap(\n dragged: AlignBox,\n others: AlignBox[],\n threshold: number = ALIGN_SNAP_THRESHOLD,\n): AlignResult {\n const dL = dragged.x;\n const dC = dragged.x + dragged.w / 2;\n const dR = dragged.x + dragged.w;\n const dT = dragged.y;\n const dM = dragged.y + dragged.h / 2;\n const dB = dragged.y + dragged.h;\n\n let bestX: { delta: number; pos: number; otherIdx: number } | null = null;\n let bestY: { delta: number; pos: number; otherIdx: number } | null = null;\n\n others.forEach((o, idx) => {\n const oL = o.x;\n const oC = o.x + o.w / 2;\n const oR = o.x + o.w;\n const oT = o.y;\n const oM = o.y + o.h / 2;\n const oB = o.y + o.h;\n\n const xCandidates: { delta: number; pos: number }[] = [\n { delta: oL - dL, pos: oL }, // left -> left\n { delta: oC - dC, pos: oC }, // center -> center\n { delta: oR - dR, pos: oR }, // right -> right\n ];\n for (const c of xCandidates) {\n if (Math.abs(c.delta) < threshold && (!bestX || Math.abs(c.delta) < Math.abs(bestX.delta))) {\n bestX = { delta: c.delta, pos: c.pos, otherIdx: idx };\n }\n }\n\n const yCandidates: { delta: number; pos: number }[] = [\n { delta: oT - dT, pos: oT }, // top -> top\n { delta: oM - dM, pos: oM }, // middle -> middle\n { delta: oB - dB, pos: oB }, // bottom -> bottom\n ];\n for (const c of yCandidates) {\n if (Math.abs(c.delta) < threshold && (!bestY || Math.abs(c.delta) < Math.abs(bestY.delta))) {\n bestY = { delta: c.delta, pos: c.pos, otherIdx: idx };\n }\n }\n });\n\n let x = dragged.x;\n let y = dragged.y;\n let guideX: AlignGuideV | undefined;\n let guideY: AlignGuideH | undefined;\n\n if (bestX) {\n const bx = bestX as { delta: number; pos: number; otherIdx: number };\n x = dragged.x + bx.delta;\n const o = others[bx.otherIdx];\n guideX = {\n pos: bx.pos,\n minY: Math.min(y, o.y) - 12,\n maxY: Math.max(y + dragged.h, o.y + o.h) + 12,\n };\n }\n if (bestY) {\n const by = bestY as { delta: number; pos: number; otherIdx: number };\n y = dragged.y + by.delta;\n const o = others[by.otherIdx];\n guideY = {\n pos: by.pos,\n minX: Math.min(x, o.x) - 12,\n maxX: Math.max(x + dragged.w, o.x + o.w) + 12,\n };\n }\n\n return { x, y, guideX, guideY };\n}\n","/**\n * Geometric graph traversal — picks the nearest sibling node in a given\n * direction from an origin point. Used by the Alt+Arrow keyboard shortcut.\n */\n\nexport interface TraversalCandidate {\n id: string;\n x: number; // center x\n y: number; // center y\n}\n\nexport type Direction = 'up' | 'down' | 'left' | 'right';\n\n/**\n * Returns the id of the candidate node closest to `(fromX, fromY)` that lies\n * within the angular cone of `dir` (45° each side of the axis), or null if\n * nothing qualifies. Distance is Euclidean from origin to candidate center.\n */\nexport function nearestInDirection(\n fromX: number,\n fromY: number,\n dir: Direction,\n candidates: TraversalCandidate[],\n): string | null {\n const matches = candidates.filter((c) => {\n const dx = c.x - fromX;\n const dy = c.y - fromY;\n if (dx === 0 && dy === 0) return false;\n if (dir === 'right') return dx > 0 && Math.abs(dy) <= Math.abs(dx);\n if (dir === 'left') return dx < 0 && Math.abs(dy) <= Math.abs(dx);\n if (dir === 'down') return dy > 0 && Math.abs(dx) <= Math.abs(dy);\n return dy < 0 && Math.abs(dx) <= Math.abs(dy); // up\n });\n if (matches.length === 0) return null;\n matches.sort(\n (a, b) =>\n Math.hypot(a.x - fromX, a.y - fromY) -\n Math.hypot(b.x - fromX, b.y - fromY),\n );\n return matches[0].id;\n}\n"],"mappings":"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","names":["import_react","import_react","trimmed","import_jsx_runtime","import_react","import_jsx_runtime","isQuestion","s","import_react","import_react","import_react","import_react","exportFlowchart","msgArrow","exportSequence","s","import_react","m","import_jsx_runtime","lightTheme","darkTheme","ghostBtn","s","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","divider","import_react","NODE_H","Q_BASE_H","Q_ANS_ROW_H","Q_CARD_PAD","MIN_NODE_W","MAX_NODE_W","MIN_Q_W","estimateTextW","nodeWidth","MAX_NODE_W","MIN_NODE_W","answerCardW","questionNodeW","MIN_Q_W","s","Q_CARD_PAD","questionNodeH","Q_BASE_H","Q_ANS_ROW_H","NODE_H","bezierPath","dy","import_jsx_runtime","NODE_H","questionNodeH","Q_BASE_H","Q_ANS_ROW_H","s","answerCardW","Q_CARD_PAD","questionNodeW","nodeWidth","bezierPath","estimateTextW","import_react","import_react","import_react","import_react","import_jsx_runtime","STYLE_LABEL","W","H","nextId","nodeWidth","NODE_H","bezierPath","isQuestion","s"]}
1
+ {"version":3,"sources":["../../src/ui/index.ts","../../src/ui/DiagramEditor.tsx","../../src/ui/Toolbar.tsx","../../src/ui/ImportDialog.tsx","../../src/ui/theme.ts","../../src/ui/StepEditor.tsx","../../src/core/ids.ts","../../src/ui/SequenceEditor.tsx","../../src/ui/SequenceCanvas.tsx","../../src/ui/hooks/useEditorTheme.ts","../../src/ui/hooks/useSystemTheme.ts","../../src/ui/hooks/useExporters.ts","../../src/exporters/mermaid.ts","../../src/exporters/plantuml.ts","../../src/exporters/json.ts","../../src/exporters/svg.ts","../../src/ui/hooks/useImporter.ts","../../src/core/model.ts","../../src/importers/mermaid.ts","../../src/importers/json.ts","../../src/ui/hooks/useToast.ts","../../src/ui/ToastContainer.tsx","../../src/ui/presets.ts","../../src/ui/hooks/useEditorKeyboard.ts","../../src/ui/NodeNavigator.tsx","../../src/ui/render.tsx","../../src/ui/layout.ts","../../src/ui/Minimap.tsx","../../src/ui/ContextMenu.tsx","../../src/ui/DiagramCanvas.tsx","../../src/ui/hooks/useHistory.ts","../../src/ui/hooks/useCanvasWheel.ts","../../src/ui/hooks/useCanvasTouch.ts","../../src/ui/hooks/useElementSize.ts","../../src/ui/alignment.ts","../../src/ui/traversal.ts"],"sourcesContent":["/**\n * React UI entry point. Pulls in `react` and `react-dom` as peer\n * dependencies. The `DiagramEditor` is the all-in-one component most\n * consumers reach for; `SequenceEditor` is the sequence-diagram specialization.\n * `Toolbar` and `StepEditor` are exposed for embedding the same primitives\n * inside a custom shell.\n *\n * @example\n * ```tsx\n * import { DiagramEditor, presetFlowchartModel } from 'flowchart-sequence-designer/ui';\n *\n * <DiagramEditor initialModel={presetFlowchartModel()} onChange={save} />\n * ```\n */\n\n/** Main flowchart/question/journey editor. Accepts an optional `initialModel`; renders a SequenceEditor internally if the model type is `'sequence'`. */\nexport { DiagramEditor } from './DiagramEditor.js';\nexport type { DiagramEditorProps, ThemeColors } from './DiagramEditor.js';\n\n/** Dedicated sequence diagram editor with actor columns and message rows. */\nexport { SequenceEditor } from './SequenceEditor.js';\nexport type { SequenceEditorProps, SequenceThemeColors } from './SequenceEditor.js';\n\n/** Dark-themed toolbar with export buttons and import dialog. Can be used standalone in a custom editor shell. */\nexport { Toolbar } from './Toolbar.js';\n\n/** Node property editor panel (label, shape, color, answers/branches). Useful for building custom sidebars. */\nexport { StepEditor } from './StepEditor.js';\n\n/** Preset model factories and blank-canvas helper. */\nexport { presetFlowchartModel, presetSequenceModel, emptyModel } from './presets.js';\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { Toolbar } from './Toolbar.js';\nimport { StepEditor } from './StepEditor.js';\nimport { SequenceEditor } from './SequenceEditor.js';\nimport { NodeNavigator } from './NodeNavigator.js';\nimport { DiagramCanvas } from './DiagramCanvas.js';\nimport type { CtxMenuState as CtxMenu } from './ContextMenu.js';\nimport { useHistory } from './hooks/useHistory.js';\nimport { usePrefersReducedMotion, useIsCoarsePointer } from './hooks/useSystemTheme.js';\nimport { useCanvasWheel } from './hooks/useCanvasWheel.js';\nimport { useCanvasTouch } from './hooks/useCanvasTouch.js';\nimport { useElementSize } from './hooks/useElementSize.js';\nimport { useEditorTheme } from './hooks/useEditorTheme.js';\nimport { useExporters } from './hooks/useExporters.js';\nimport { useImporter } from './hooks/useImporter.js';\nimport { useToast } from './hooks/useToast.js';\nimport { ToastContainer } from './ToastContainer.js';\nimport { useEditorKeyboard, type KeyCommand } from './hooks/useEditorKeyboard.js';\nimport {\n NODE_H,\n GRID,\n nodeWidth,\n nodeDims,\n snap,\n} from './layout.js';\nimport { findSiblingSnap, type AlignGuideV, type AlignGuideH } from './alignment.js';\nimport { nearestInDirection } from './traversal.js';\nimport { presetFlowchartModel } from './presets.js';\nimport type { DiagramModel, DiagramNode, DiagramEdge, ExportFormat, DiagramVariant } from '../core/types.js';\nimport { nextId, makeIdSource } from '../core/ids.js';\n\n// ── Theme ──────────────────────────────────────────────────────────────────\nimport { ACCENT as C, type ThemeColors, lightTheme, darkTheme, variantAccent, shadowColor as themeShadow, arrowColor as themeArrow } from './theme.js';\nexport type { ThemeColors } from './theme.js';\n\n// Static styles hoisted to module scope.\nconst STYLE_SR_ONLY: React.CSSProperties = { position: 'absolute', width: 1, height: 1, padding: 0, margin: -1, overflow: 'hidden', clip: 'rect(0 0 0 0)', whiteSpace: 'nowrap', border: 0 };\nconst STYLE_FLEX_ROW: React.CSSProperties = { flex: 1, display: 'flex', overflow: 'hidden' };\n\ninterface Transform { x: number; y: number; scale: number }\ninterface DragState { nodeId: string; ox: number; oy: number }\ninterface LiveEdge {\n fromId: string; fromX: number; fromY: number;\n exitDir: 'bottom' | 'right' | 'left'; answerLabel?: string; toX: number; toY: number;\n}\n\n/**\n * Props for `<DiagramEditor>`. All fields are optional — mounting with no\n * props renders the flowchart preset on an `auto`-themed canvas with every\n * export format and import enabled.\n *\n * @property initialModel Initial diagram. If a sequence model is passed,\n * rendering is delegated to `<SequenceEditor>`. If\n * omitted, `presetFlowchartModel(variant)` is used.\n * @property onChange Fires after every committed mutation (undo/redo,\n * drag, label edit, etc.). Receives the new model.\n * @property onExport Optional sink for exporter output. If omitted, the\n * editor triggers a browser download of `diagram.<ext>`.\n * @property height Canvas height; accepts CSS units. Defaults to `600`.\n * @property allowedExports Whitelist of export formats to show in the\n * toolbar. Defaults to all formats.\n * @property allowImport Show the import button. Defaults to `true`.\n * @property variant Initial variant when `initialModel` is omitted.\n * Ignored if `initialModel.variant` is set.\n * @property theme `'light'`, `'dark'`, or `'auto'` (follow OS).\n * Defaults to `'auto'`.\n * @property themeOverrides Per-property overrides on top of the resolved\n * palette. Useful for brand-matching without forking.\n */\nexport interface DiagramEditorProps {\n initialModel?: DiagramModel;\n onChange?: (model: DiagramModel) => void;\n onExport?: (format: ExportFormat, content: string | Blob) => void;\n height?: number | string;\n allowedExports?: ExportFormat[];\n allowImport?: boolean;\n variant?: DiagramVariant;\n theme?: 'light' | 'dark' | 'auto';\n themeOverrides?: Partial<ThemeColors>;\n}\n\n\n\n/**\n * The all-in-one editor component. Renders a smart router: if the supplied\n * `initialModel.type` is `sequence`, it delegates to `<SequenceEditor>` with\n * the same props pass-through. Otherwise it renders the flowchart editor.\n *\n * @example\n * ```tsx\n * import { DiagramEditor } from 'flowchart-sequence-designer/ui';\n *\n * export default function App() {\n * return <DiagramEditor height={520} onChange={(m) => console.log(m)} />;\n * }\n * ```\n */\nexport function DiagramEditor(props: DiagramEditorProps) {\n // Delegate sequence diagrams to the dedicated SequenceEditor.\n if (props.initialModel?.type === 'sequence') {\n return <SequenceEditor\n initialModel={props.initialModel}\n onChange={props.onChange}\n onExport={props.onExport}\n height={props.height}\n allowedExports={props.allowedExports}\n allowImport={props.allowImport}\n theme={props.theme}\n themeOverrides={props.themeOverrides}\n />;\n }\n return <FlowchartEditor {...props} />;\n}\n\nfunction FlowchartEditor({\n initialModel, onChange, onExport, height = 600,\n allowedExports, allowImport = true, variant = 'flowchart', theme = 'auto',\n themeOverrides,\n}: DiagramEditorProps) {\n const base: DiagramModel = initialModel\n ? { ...initialModel, variant: initialModel.variant ?? variant }\n : presetFlowchartModel(variant);\n const notify = useCallback((m: DiagramModel) => onChange?.(m), [onChange]);\n const history = useHistory<DiagramModel>(base, notify);\n const { state: model, apply: applyModel, applyAndPush, undo, redo } = history;\n const { toasts, showToast, dismissToast } = useToast();\n const [transform, setTransform] = useState<Transform>({ x: 60, y: 60, scale: 1 });\n const [selected, setSelected] = useState<string | null>(null);\n const [selectedSet, setSelectedSet] = useState<Set<string>>(() => new Set());\n const [drag, setDrag] = useState<DragState | null>(null);\n const [pan, setPan] = useState<{ ox: number; oy: number; tx: number; ty: number } | null>(null);\n const [boxSel, setBoxSel] = useState<{ sx: number; sy: number; cx: number; cy: number; additive: boolean } | null>(null);\n const [liveEdge, setLiveEdge] = useState<LiveEdge | null>(null);\n const [alignGuides, setAlignGuides] = useState<{ x?: AlignGuideV; y?: AlignGuideH } | null>(null);\n const [waypointDrag, setWaypointDrag] = useState<string | null>(null);\n const groupDragOriginsRef = useRef<Map<string, { ox: number; oy: number }> | null>(null);\n const clipboardRef = useRef<{ nodes: DiagramNode[]; edges: DiagramEdge[] } | null>(null);\n\n const selectOne = useCallback((id: string | null) => {\n setSelected(id);\n setSelectedSet(id ? new Set([id]) : new Set());\n }, []);\n\n const toggleSelect = useCallback((id: string) => {\n setSelectedSet(prev => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n const last = next.size ? Array.from(next)[next.size - 1] : null;\n setSelected(last);\n } else {\n next.add(id);\n setSelected(id);\n }\n return next;\n });\n }, []);\n\n const clearSelection = useCallback(() => {\n setSelected(null);\n setSelectedSet(new Set());\n }, []);\n const [editingId, setEditingId] = useState<string | null>(null);\n const [editLabel, setEditLabel] = useState('');\n const [editingEdgeId, setEditingEdgeId] = useState<string | null>(null);\n const [editEdgeLabel, setEditEdgeLabel] = useState('');\n const [hoveredId, setHoveredId] = useState<string | null>(null);\n const [ctxMenu, setCtxMenu] = useState<CtxMenu | null>(null);\n const [navOpen, setNavOpen] = useState(true);\n const [announcement, setAnnouncement] = useState('');\n const svgRef = useRef<SVGSVGElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const reducedMotion = usePrefersReducedMotion();\n const { t, isDark } = useEditorTheme(theme, themeOverrides, { light: lightTheme, dark: darkTheme });\n const isCoarse = useIsCoarsePointer();\n const portR = isCoarse ? 9 : 6;\n\n // Track the SVG element size for the minimap viewport overlay.\n const viewport = useElementSize(svgRef);\n\n\n const reCenter = useCallback(() => {\n if (!svgRef.current) return;\n const rect = svgRef.current.getBoundingClientRect();\n const W = rect.width, H = rect.height;\n if (model.nodes.length === 0) { setTransform({ x: W / 2, y: H / 2, scale: 1 }); return; }\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const n of model.nodes) {\n const nx = n.x ?? 0, ny = n.y ?? 0;\n const { w: nw, h: nh } = nodeDims(n, variant);\n minX = Math.min(minX, nx); minY = Math.min(minY, ny);\n maxX = Math.max(maxX, nx + nw); maxY = Math.max(maxY, ny + nh);\n }\n const pad = 48;\n const scaleX = (W - pad * 2) / (maxX - minX || 1);\n const scaleY = (H - pad * 2) / (maxY - minY || 1);\n const scale = Math.min(1.5, Math.max(0.2, Math.min(scaleX, scaleY)));\n const cx = (minX + maxX) / 2, cy = (minY + maxY) / 2;\n setTransform({ scale, x: W / 2 - cx * scale, y: H / 2 - cy * scale });\n }, [model.nodes, variant]);\n\n const jumpToNode = useCallback((nodeId: string) => {\n const node = model.nodes.find(n => n.id === nodeId);\n if (!node || !svgRef.current) return;\n const rect = svgRef.current.getBoundingClientRect();\n const { w: nw, h: nh } = nodeDims(node, variant);\n const cx = (node.x ?? 0) + nw / 2;\n const cy = (node.y ?? 0) + nh / 2;\n const scale = Math.min(Math.max(transform.scale, 0.8), 1.4);\n setTransform({ scale, x: rect.width / 2 - cx * scale, y: rect.height / 2 - cy * scale });\n selectOne(nodeId);\n }, [model.nodes, variant, transform.scale, selectOne]);\n\n const duplicateIds = useCallback((ids: string[]) => {\n if (ids.length === 0) return;\n const idSet = new Set(ids);\n const idMap = new Map<string, string>();\n const nextNode = makeIdSource('node', model.nodes);\n const nextEdge = makeIdSource('e', model.edges);\n const newNodes: DiagramNode[] = [];\n for (const oldId of ids) {\n const n = model.nodes.find(x => x.id === oldId);\n if (!n) continue;\n const newId = nextNode();\n idMap.set(oldId, newId);\n newNodes.push({\n ...n, id: newId,\n label: ids.length === 1 ? n.label + ' (copy)' : n.label,\n x: (n.x ?? 0) + 32, y: (n.y ?? 0) + 32,\n });\n }\n const newEdges: DiagramEdge[] = [];\n for (const e of model.edges) {\n if (idSet.has(e.from) && idSet.has(e.to)) {\n newEdges.push({ ...e, id: nextEdge(), from: idMap.get(e.from)!, to: idMap.get(e.to)! });\n }\n }\n const m = { ...model, nodes: [...model.nodes, ...newNodes], edges: [...model.edges, ...newEdges] };\n applyAndPush(m);\n const newIds = newNodes.map(n => n.id);\n setSelected(newIds[newIds.length - 1] ?? null);\n setSelectedSet(new Set(newIds));\n }, [model, applyAndPush]);\n\n const duplicateNode = useCallback((nodeId: string) => { duplicateIds([nodeId]); }, [duplicateIds]);\n\n // Close context menu on any click\n useEffect(() => {\n if (!ctxMenu) return;\n const close = () => setCtxMenu(null);\n window.addEventListener('mousedown', close);\n return () => window.removeEventListener('mousedown', close);\n }, [ctxMenu]);\n\n // Global keyboard shortcuts\n const keyCommands: KeyCommand[] = [\n { match: e => (e.ctrlKey || e.metaKey) && e.key === 'z' && !e.shiftKey, run: () => { undo(); return true; } },\n { match: e => (e.ctrlKey || e.metaKey) && (e.key === 'y' || (e.shiftKey && e.key === 'z')), run: () => { redo(); return true; } },\n { match: e => (e.ctrlKey || e.metaKey) && e.key === '0', run: () => { reCenter(); return true; } },\n {\n match: e => (e.ctrlKey || e.metaKey) && (e.key === 'd' || e.key === 'D') && selectedSet.size > 0,\n run: () => { duplicateIds(Array.from(selectedSet)); return true; },\n },\n {\n match: e => (e.ctrlKey || e.metaKey) && (e.key === 'c' || e.key === 'C') && selectedSet.size > 0,\n run: () => {\n const ids = new Set(selectedSet);\n const nodes = model.nodes.filter(n => ids.has(n.id));\n const edges = model.edges.filter(ed => ids.has(ed.from) && ids.has(ed.to));\n clipboardRef.current = {\n nodes: nodes.map(n => ({ ...n })),\n edges: edges.map(ed => ({ ...ed })),\n };\n return true;\n },\n },\n {\n match: e => (e.ctrlKey || e.metaKey) && (e.key === 'v' || e.key === 'V'),\n run: () => {\n const clip = clipboardRef.current;\n if (!clip || clip.nodes.length === 0) return false;\n const idMap = new Map<string, string>();\n const nextNode = makeIdSource('node', model.nodes);\n const nextEdge = makeIdSource('e', model.edges);\n const newNodes: DiagramNode[] = clip.nodes.map(n => {\n const newId = nextNode();\n idMap.set(n.id, newId);\n return { ...n, id: newId, x: (n.x ?? 0) + 24, y: (n.y ?? 0) + 24 };\n });\n const newEdges: DiagramEdge[] = clip.edges.map(ed => ({\n ...ed, id: nextEdge(),\n from: idMap.get(ed.from) ?? ed.from,\n to: idMap.get(ed.to) ?? ed.to,\n }));\n const m = { ...model, nodes: [...model.nodes, ...newNodes], edges: [...model.edges, ...newEdges] };\n applyAndPush(m);\n const newIds = newNodes.map(n => n.id);\n setSelected(newIds[newIds.length - 1]);\n setSelectedSet(new Set(newIds));\n setAnnouncement(`Pasted ${newIds.length} ${variantLabel.toLowerCase()}${newIds.length === 1 ? '' : 's'}.`);\n return true;\n },\n },\n {\n match: e => e.key === 'Escape',\n run: () => {\n if (ctxMenu) setCtxMenu(null);\n if (liveEdge) setLiveEdge(null);\n if (editingId) setEditingId(null);\n if (boxSel) setBoxSel(null);\n if (selectedSet.size > 0) clearSelection();\n return true;\n },\n },\n {\n match: e => (e.key === 'Delete' || e.key === 'Backspace') && selectedSet.size > 0,\n run: () => {\n const ids = new Set(selectedSet);\n const updated = {\n ...model,\n nodes: model.nodes.filter(n => !ids.has(n.id)),\n edges: model.edges.filter(ed => !ids.has(ed.from) && !ids.has(ed.to)),\n };\n applyAndPush(updated);\n clearSelection();\n setAnnouncement(`Deleted ${ids.size} ${variantLabel.toLowerCase()}${ids.size === 1 ? '' : 's'}.`);\n return true;\n },\n },\n {\n match: e => selectedSet.size > 0 && e.altKey && !!selected && (e.key === 'ArrowUp' || e.key === 'ArrowDown' || e.key === 'ArrowLeft' || e.key === 'ArrowRight'),\n run: (e) => {\n const dirKey = e.key === 'ArrowLeft' ? 'left' : e.key === 'ArrowRight' ? 'right' : e.key === 'ArrowUp' ? 'up' : 'down' as const;\n const origin = model.nodes.find(n => n.id === selected);\n if (!origin) return false;\n const od = nodeDims(origin, variant);\n const ox = (origin.x ?? 0) + od.w / 2;\n const oy = (origin.y ?? 0) + od.h / 2;\n const candidates = model.nodes\n .filter(n => n.id !== selected)\n .map(n => {\n const d = nodeDims(n, variant);\n return { id: n.id, x: (n.x ?? 0) + d.w / 2, y: (n.y ?? 0) + d.h / 2 };\n });\n const nextNodeId = nearestInDirection(ox, oy, dirKey, candidates);\n if (nextNodeId) {\n selectOne(nextNodeId);\n setAnnouncement(`Selected ${model.nodes.find(n => n.id === nextNodeId)?.label ?? ''}.`);\n }\n return true;\n },\n },\n {\n match: e => selectedSet.size > 0 && (e.key === 'ArrowUp' || e.key === 'ArrowDown' || e.key === 'ArrowLeft' || e.key === 'ArrowRight'),\n run: (e) => {\n const dirKey = e.key === 'ArrowLeft' ? 'left' : e.key === 'ArrowRight' ? 'right' : e.key === 'ArrowUp' ? 'up' : 'down' as const;\n const step = e.shiftKey ? GRID * 4 : GRID;\n const dx = dirKey === 'left' ? -step : dirKey === 'right' ? step : 0;\n const dy = dirKey === 'up' ? -step : dirKey === 'down' ? step : 0;\n const ids = selectedSet;\n const updated = {\n ...model,\n nodes: model.nodes.map(n => ids.has(n.id)\n ? { ...n, x: snap((n.x ?? 0) + dx), y: snap((n.y ?? 0) + dy) }\n : n),\n };\n applyAndPush(updated);\n return true;\n },\n },\n ];\n useEditorKeyboard(keyCommands, [undo, redo, reCenter, selected, selectedSet, ctxMenu, liveEdge, editingId, boxSel, model, applyAndPush, duplicateNode, clearSelection]);\n\n const toCanvas = useCallback((clientX: number, clientY: number) => {\n const rect = svgRef.current!.getBoundingClientRect();\n return { x: (clientX - rect.left - transform.x) / transform.scale, y: (clientY - rect.top - transform.y) / transform.scale };\n }, [transform]);\n\n useCanvasWheel(svgRef, setTransform);\n\n const onCanvasLongPress = useCallback((x: number, y: number) => {\n setCtxMenu({ x, y, nodeId: null });\n }, []);\n useCanvasTouch(svgRef, { transform, setTransform, onLongPress: onCanvasLongPress });\n\n const onPortMouseDown = (e: React.MouseEvent, nodeId: string) => {\n e.stopPropagation();\n const node = model.nodes.find(n => n.id === nodeId)!;\n const { x, y } = toCanvas(e.clientX, e.clientY);\n const nW = nodeWidth(node.label);\n setLiveEdge({ fromId: nodeId, fromX: (node.x ?? 0) + nW / 2, fromY: (node.y ?? 0) + NODE_H, exitDir: 'bottom', toX: x, toY: y });\n };\n\n const onAnswerPortDown = (e: React.MouseEvent, nodeId: string, answer: string, portXInNode: number, portYInNode: number) => {\n e.stopPropagation();\n const node = model.nodes.find(n => n.id === nodeId)!;\n const { x, y } = toCanvas(e.clientX, e.clientY);\n setLiveEdge({ fromId: nodeId, fromX: (node.x ?? 0) + portXInNode, fromY: (node.y ?? 0) + portYInNode, exitDir: 'bottom', answerLabel: answer, toX: x, toY: y });\n };\n\n const onNodeMouseDown = (e: React.MouseEvent, id: string) => {\n e.stopPropagation();\n if (liveEdge) return;\n const node = model.nodes.find(n => n.id === id)!;\n\n if (e.shiftKey) {\n toggleSelect(id);\n return;\n }\n\n const inSet = selectedSet.has(id);\n if (inSet && selectedSet.size > 1) {\n // Group drag: keep selection, set primary to this node, record origins for every selected node.\n setSelected(id);\n const origins = new Map<string, { ox: number; oy: number }>();\n for (const sid of selectedSet) {\n const n = model.nodes.find(x => x.id === sid);\n if (!n) continue;\n origins.set(sid, {\n ox: e.clientX - (transform.x + (n.x ?? 0) * transform.scale),\n oy: e.clientY - (transform.y + (n.y ?? 0) * transform.scale),\n });\n }\n groupDragOriginsRef.current = origins;\n } else {\n selectOne(id);\n groupDragOriginsRef.current = null;\n }\n setDrag({ nodeId: id, ox: e.clientX - (transform.x + (node.x ?? 0) * transform.scale), oy: e.clientY - (transform.y + (node.y ?? 0) * transform.scale) });\n };\n\n const onNodeMouseUp = (e: React.MouseEvent, targetId: string) => {\n if (!liveEdge || liveEdge.fromId === targetId) return;\n e.stopPropagation();\n const label = liveEdge.answerLabel;\n let updated: DiagramModel;\n if (label) {\n const existing = model.edges.find(ex => ex.from === liveEdge.fromId && ex.label === label);\n if (existing) {\n updated = { ...model, edges: model.edges.map(ex => ex.id === existing.id ? { ...ex, to: targetId } : ex) };\n } else {\n updated = { ...model, edges: [...model.edges, { id: nextId('e', model.edges), from: liveEdge.fromId, to: targetId, label }] };\n }\n } else {\n updated = { ...model, edges: [...model.edges, { id: nextId('e', model.edges), from: liveEdge.fromId, to: targetId }] };\n }\n applyAndPush(updated);\n setLiveEdge(null);\n };\n\n const onSvgMouseDown = (e: React.MouseEvent) => {\n if (ctxMenu) { setCtxMenu(null); return; }\n if ((e.target as SVGElement).dataset.bg === '1' || e.target === svgRef.current) {\n if (e.shiftKey) {\n // Shift+drag on empty canvas = box-select. Existing selection is preserved (additive).\n setBoxSel({ sx: e.clientX, sy: e.clientY, cx: e.clientX, cy: e.clientY, additive: true });\n } else {\n clearSelection();\n setPan({ ox: e.clientX, oy: e.clientY, tx: transform.x, ty: transform.y });\n }\n }\n };\n\n const onSvgContextMenu = (e: React.MouseEvent) => {\n e.preventDefault();\n setCtxMenu({ x: e.clientX, y: e.clientY, nodeId: null });\n };\n\n const onNodeContextMenu = (e: React.MouseEvent, nodeId: string) => {\n e.preventDefault(); e.stopPropagation();\n // Right-click on a node that is NOT already in the multi-selection collapses\n // selection to just this node (matches Figma / VS Code). Right-clicking a\n // node that IS part of a multi-selection keeps the group intact.\n if (!selectedSet.has(nodeId)) selectOne(nodeId);\n setCtxMenu({ x: e.clientX, y: e.clientY, nodeId });\n };\n\n const onMouseMove = (e: React.MouseEvent) => {\n if (liveEdge) {\n const { x, y } = toCanvas(e.clientX, e.clientY);\n setLiveEdge(le => le ? { ...le, toX: x, toY: y } : null);\n return;\n }\n if (waypointDrag) {\n const { x, y } = toCanvas(e.clientX, e.clientY);\n const wx = snap(x), wy = snap(y);\n const updated = {\n ...model,\n edges: model.edges.map(ed => ed.id === waypointDrag ? { ...ed, waypoint: { x: wx, y: wy } } : ed),\n };\n applyModel(updated);\n return;\n }\n if (drag) {\n const dx = snap((e.clientX - drag.ox - transform.x) / transform.scale);\n const dy = snap((e.clientY - drag.oy - transform.y) / transform.scale);\n const origins = groupDragOriginsRef.current;\n if (origins && origins.size > 1) {\n const updated = {\n ...model,\n nodes: model.nodes.map(n => {\n const o = origins.get(n.id);\n if (!o) return n;\n return {\n ...n,\n x: snap((e.clientX - o.ox - transform.x) / transform.scale),\n y: snap((e.clientY - o.oy - transform.y) / transform.scale),\n };\n }),\n };\n applyModel(updated);\n } else {\n const dragged = model.nodes.find(n => n.id === drag.nodeId);\n if (!dragged) return;\n const { w: dW, h: dH } = nodeDims(dragged, variant);\n const others = model.nodes\n .filter(n => n.id !== drag.nodeId)\n .map(n => {\n const d = nodeDims(n, variant);\n return { x: n.x ?? 0, y: n.y ?? 0, w: d.w, h: d.h };\n });\n const snapResult = findSiblingSnap({ x: dx, y: dy, w: dW, h: dH }, others);\n setAlignGuides(snapResult.guideX || snapResult.guideY ? { x: snapResult.guideX, y: snapResult.guideY } : null);\n const updated = { ...model, nodes: model.nodes.map(n => n.id === drag.nodeId ? { ...n, x: snapResult.x, y: snapResult.y } : n) };\n applyModel(updated);\n }\n } else if (pan) {\n setTransform(tr => ({ ...tr, x: pan.tx + (e.clientX - pan.ox), y: pan.ty + (e.clientY - pan.oy) }));\n } else if (boxSel) {\n setBoxSel(b => b ? { ...b, cx: e.clientX, cy: e.clientY } : null);\n }\n };\n\n const onMouseUp = () => {\n if (boxSel) {\n const dragged = Math.abs(boxSel.cx - boxSel.sx) > 3 || Math.abs(boxSel.cy - boxSel.sy) > 3;\n if (dragged && svgRef.current) {\n const rect = svgRef.current.getBoundingClientRect();\n const x1 = Math.min(boxSel.sx, boxSel.cx) - rect.left;\n const y1 = Math.min(boxSel.sy, boxSel.cy) - rect.top;\n const x2 = Math.max(boxSel.sx, boxSel.cx) - rect.left;\n const y2 = Math.max(boxSel.sy, boxSel.cy) - rect.top;\n // Box edges → canvas coords\n const cx1 = (x1 - transform.x) / transform.scale;\n const cy1 = (y1 - transform.y) / transform.scale;\n const cx2 = (x2 - transform.x) / transform.scale;\n const cy2 = (y2 - transform.y) / transform.scale;\n const hits = new Set<string>(boxSel.additive ? selectedSet : []);\n for (const n of model.nodes) {\n const nx = n.x ?? 0, ny = n.y ?? 0;\n const { w: nw, h: nh } = nodeDims(n, variant);\n if (nx + nw >= cx1 && nx <= cx2 && ny + nh >= cy1 && ny <= cy2) hits.add(n.id);\n }\n const arr = Array.from(hits);\n setSelectedSet(hits);\n setSelected(arr.length ? arr[arr.length - 1] : null);\n }\n setBoxSel(null);\n }\n // Commit drag position to history so it can be undone.\n if (drag) applyAndPush(model);\n if (waypointDrag) { applyAndPush(model); setWaypointDrag(null); }\n groupDragOriginsRef.current = null;\n setAlignGuides(null);\n setDrag(null); setPan(null);\n if (liveEdge) setLiveEdge(null);\n };\n\n const onNodeDblClick = (e: React.MouseEvent, id: string) => {\n e.stopPropagation();\n const node = model.nodes.find(n => n.id === id)!;\n setEditingId(id); setEditLabel(node.label);\n };\n\n const commitEdit = () => {\n if (!editingId) return;\n const up = { ...model, nodes: model.nodes.map(n => n.id === editingId ? { ...n, label: editLabel } : n) };\n applyAndPush(up);\n setEditingId(null);\n };\n\n const addNode = (atCanvasPos?: { x: number; y: number }) => {\n const id = nextId('node', model.nodes);\n const p = atCanvasPos\n ? { x: snap(atCanvasPos.x), y: snap(atCanvasPos.y) }\n : { x: snap(100 + Math.random() * 240), y: snap(100 + Math.random() * 180) };\n const label = variant === 'question' ? 'New Question' : variant === 'journey' ? `Step ${model.nodes.length + 1}` : 'New Step';\n const metadata = variant === 'question' ? { answers: [] } : undefined;\n const updated = { ...model, nodes: [...model.nodes, { id, label, shape: 'rectangle' as const, metadata, ...p }] };\n applyAndPush(updated); selectOne(id);\n setAnnouncement(`Added ${variantLabel.toLowerCase()} \"${label}\".`);\n };\n\n const deleteNode = (nodeId: string) => {\n const node = model.nodes.find(n => n.id === nodeId);\n const updated = { ...model, nodes: model.nodes.filter(n => n.id !== nodeId), edges: model.edges.filter(e => e.from !== nodeId && e.to !== nodeId) };\n applyAndPush(updated);\n if (selectedSet.has(nodeId)) {\n const next = new Set(selectedSet); next.delete(nodeId);\n setSelectedSet(next);\n if (selected === nodeId) setSelected(next.size ? Array.from(next)[next.size - 1] : null);\n }\n if (node) setAnnouncement(`Deleted ${variantLabel.toLowerCase()} \"${node.label}\".`);\n };\n\n const deleteSelected = () => {\n if (selectedSet.size === 0) return;\n if (selectedSet.size === 1 && selected) { deleteNode(selected); return; }\n const ids = new Set(selectedSet);\n const updated = {\n ...model,\n nodes: model.nodes.filter(n => !ids.has(n.id)),\n edges: model.edges.filter(ed => !ids.has(ed.from) && !ids.has(ed.to)),\n };\n applyAndPush(updated);\n clearSelection();\n setAnnouncement(`Deleted ${ids.size} ${variantLabel.toLowerCase()}s.`);\n };\n\n const beginEditEdge = (edgeId: string) => {\n const edge = model.edges.find(e => e.id === edgeId);\n if (!edge) return;\n // Question-variant edge labels mirror an answer card; editing them on the canvas\n // would desync the card so we ignore the double-click for that variant.\n if (variant === 'question') return;\n setEditingEdgeId(edgeId);\n setEditEdgeLabel(edge.label ?? '');\n };\n\n const commitEdgeEdit = () => {\n if (!editingEdgeId) return;\n const next = editEdgeLabel.trim();\n const updated = {\n ...model,\n edges: model.edges.map(e => e.id === editingEdgeId\n ? { ...e, ...(next ? { label: next } : { label: undefined }) }\n : e),\n };\n applyAndPush(updated);\n setEditingEdgeId(null);\n };\n\n const onEdgeContextMenu = (e: React.MouseEvent, edgeId: string) => {\n e.preventDefault(); e.stopPropagation();\n setCtxMenu({ x: e.clientX, y: e.clientY, nodeId: null, edgeId });\n };\n\n const setEdgeStyle = (edgeId: string, style: 'solid' | 'dashed' | 'dotted') => {\n const updated = { ...model, edges: model.edges.map(e => e.id === edgeId ? { ...e, style } : e) };\n applyAndPush(updated);\n };\n\n const setEdgeArrowhead = (edgeId: string, arrowhead: 'arrow' | 'none') => {\n const updated = { ...model, edges: model.edges.map(e => e.id === edgeId ? { ...e, arrowhead } : e) };\n applyAndPush(updated);\n };\n\n const deleteEdge = (edgeId: string) => {\n const updated = { ...model, edges: model.edges.filter(e => e.id !== edgeId) };\n applyAndPush(updated);\n };\n\n const resetEdgeRouting = (edgeId: string) => {\n const updated = {\n ...model,\n edges: model.edges.map(e => {\n if (e.id !== edgeId) return e;\n const { waypoint: _ignored, ...rest } = e;\n void _ignored;\n return rest;\n }),\n };\n applyAndPush(updated);\n };\n\n const handleExport = useExporters(model, onExport, 'diagram', (msg) => showToast(msg, 'success'));\n\n const positionFlowchartNodes = useCallback((m: DiagramModel): DiagramModel => ({\n ...m,\n nodes: m.nodes.map((n, i) => ({\n ...n,\n x: n.x ?? snap(80 + (i % 4) * 200),\n y: n.y ?? snap(80 + Math.floor(i / 4) * 140),\n })),\n }), []);\n const handleImport = useImporter(applyAndPush, {\n transform: positionFlowchartNodes,\n onSuccess: (msg) => showToast(msg, 'success'),\n onError: (msg) => showToast(msg, 'error'),\n });\n\n const acc = variantAccent(variant, isDark);\n const variantLabel = variant === 'question' ? 'Question' : variant === 'journey' ? 'Step' : 'Node';\n const shadowClr = themeShadow(isDark);\n const arrowClr = themeArrow(isDark);\n const amberArrow = isDark ? C.amberDark : C.amber;\n\n return (\n <div className=\"fsd-editor\" style={{ display: 'flex', flexDirection: 'column', height, width: '100%', fontFamily: 'ui-sans-serif,system-ui,sans-serif', boxSizing: 'border-box', background: t.ctrlsBg, position: 'relative' }}>\n <ToastContainer toasts={toasts} onDismiss={dismissToast} />\n <style>{`\n .fsd-editor button:focus-visible,\n .fsd-editor input:focus-visible,\n .fsd-editor textarea:focus-visible,\n .fsd-editor select:focus-visible,\n .fsd-editor [role=\"button\"]:focus-visible {\n outline: 2px solid ${acc.color};\n outline-offset: 2px;\n border-radius: 6px;\n }\n .fsd-editor svg [role=\"button\"]:focus-visible {\n outline: 2px solid ${acc.color};\n outline-offset: 3px;\n }\n .fsd-editor svg[role=\"application\"]:focus-visible {\n outline: 2px solid ${acc.color};\n outline-offset: -2px;\n }\n `}</style>\n {/* Screen-reader live region — announces selection/add/delete actions. */}\n <div\n role=\"status\" aria-live=\"polite\" aria-atomic=\"true\"\n style={STYLE_SR_ONLY}\n >{announcement}</div>\n <Toolbar onExport={handleExport} onImport={allowImport ? handleImport : undefined} allowedExports={allowedExports} allowImport={allowImport} />\n\n {/* Controls bar */}\n <div style={{ display: 'flex', gap: 6, padding: '7px 14px', background: t.ctrlsBg, borderBottom: `1px solid ${t.ctrlsBorder}`, alignItems: 'center', flexWrap: 'wrap' }}>\n <button onClick={() => addNode()} style={ctrlBtn(acc.color, isDark)}>+ {variantLabel}</button>\n {selectedSet.size > 0 && (\n <>\n <div style={{ width: 1, height: 20, background: t.ctrlsBorder, margin: '0 2px' }} />\n <button onClick={deleteSelected} style={{ ...ctrlBtn('transparent', isDark), color: '#ef4444', border: `1px solid ${isDark ? '#7f1d1d' : '#fca5a5'}` }}>\n {selectedSet.size > 1 ? `Delete (${selectedSet.size})` : 'Delete'}\n </button>\n </>\n )}\n {liveEdge && (\n <span style={{ fontSize: 11, color: acc.color, fontWeight: 600, marginLeft: 6 }}>\n {liveEdge.answerLabel ? `Routing \"${liveEdge.answerLabel}\" →` : 'Drop on a node to connect'}\n <span style={{ fontWeight: 400, color: t.textMuted, marginLeft: 6 }}>release to cancel</span>\n </span>\n )}\n <span style={{ marginLeft: 'auto', fontSize: 11, color: t.textMuted }}>\n {variant === 'question' ? 'drag answer port to connect · ' : 'drag port dot · '}scroll to zoom · drag to pan\n </span>\n </div>\n\n {variant !== 'flowchart' && (\n <div style={{ padding: '3px 14px', background: acc.fill, borderBottom: `1px solid ${acc.border}`, fontSize: 11, color: acc.color, fontWeight: 600 }}>\n {variant === 'question' ? '? Question Flow — add answers in the panel, drag their port to connect' : '↗ Journey Map — numbered steps, drag port to sequence'}\n </div>\n )}\n\n <div style={STYLE_FLEX_ROW}>\n {/* Node navigator */}\n <NodeNavigator\n model={model} selected={selected} variant={variant}\n isDark={isDark} t={t} acc={acc}\n open={navOpen} onToggle={() => setNavOpen(v => !v)}\n onSelect={jumpToNode}\n />\n\n <DiagramCanvas\n model={model} variant={variant} variantLabel={variantLabel}\n t={t} isDark={isDark} acc={acc}\n transform={transform} setTransform={setTransform}\n selected={selected} selectedSet={selectedSet}\n hoveredId={hoveredId} setHoveredId={setHoveredId}\n drag={drag} pan={pan} liveEdge={liveEdge} boxSel={boxSel}\n alignGuides={alignGuides}\n editingEdgeId={editingEdgeId} editEdgeLabel={editEdgeLabel}\n setEditEdgeLabel={setEditEdgeLabel} commitEdgeEdit={commitEdgeEdit}\n setEditingEdgeId={setEditingEdgeId} beginEditEdge={beginEditEdge}\n onEdgeContextMenu={onEdgeContextMenu} setWaypointDrag={setWaypointDrag}\n editingId={editingId} editLabel={editLabel} setEditLabel={setEditLabel}\n commitEdit={commitEdit} setEditingId={setEditingId}\n onNodeMouseDown={onNodeMouseDown} onNodeMouseUp={onNodeMouseUp}\n onNodeDblClick={onNodeDblClick} onNodeContextMenu={onNodeContextMenu}\n onPortMouseDown={onPortMouseDown} onAnswerPortDown={onAnswerPortDown}\n onSvgMouseDown={onSvgMouseDown} onMouseMove={onMouseMove} onMouseUp={onMouseUp}\n onSvgContextMenu={onSvgContextMenu}\n reducedMotion={reducedMotion} isCoarse={isCoarse} portR={portR}\n shadowClr={shadowClr} arrowClr={arrowClr} amberArrow={amberArrow}\n viewport={viewport}\n svgRef={svgRef} containerRef={containerRef}\n ctxMenu={ctxMenu} history={history}\n ctxEdgeStyle={(ctxMenu?.edgeId ? model.edges.find(e => e.id === ctxMenu.edgeId) : undefined)?.style ?? 'solid'}\n ctxEdgeArrow={((ctxMenu?.edgeId ? model.edges.find(e => e.id === ctxMenu.edgeId) : undefined)?.arrowhead ?? 'arrow') as 'arrow' | 'none'}\n ctxEdgeHasWaypoint={!!(ctxMenu?.edgeId ? model.edges.find(e => e.id === ctxMenu.edgeId) : undefined)?.waypoint}\n onCtxUndo={() => { undo(); setCtxMenu(null); }}\n onCtxRedo={() => { redo(); setCtxMenu(null); }}\n onCtxReCenter={() => { reCenter(); setCtxMenu(null); }}\n onCtxAddNode={() => {\n const rect = svgRef.current!.getBoundingClientRect();\n const cx = (ctxMenu!.x - rect.left - transform.x) / transform.scale;\n const cy = (ctxMenu!.y - rect.top - transform.y) / transform.scale;\n addNode({ x: cx, y: cy }); setCtxMenu(null);\n }}\n onCtxDuplicate={() => { if (ctxMenu?.nodeId) { duplicateNode(ctxMenu.nodeId); setCtxMenu(null); } }}\n onCtxRename={() => {\n if (ctxMenu?.nodeId) {\n const node = model.nodes.find(n => n.id === ctxMenu.nodeId)!;\n setEditingId(ctxMenu.nodeId); setEditLabel(node.label); setCtxMenu(null);\n }\n }}\n onCtxDelete={() => { if (ctxMenu?.nodeId) { deleteNode(ctxMenu.nodeId); setCtxMenu(null); } }}\n onCtxDisconnect={() => {\n if (ctxMenu?.nodeId) {\n const m = { ...model, edges: model.edges.filter(e => e.from !== ctxMenu.nodeId && e.to !== ctxMenu.nodeId) };\n applyAndPush(m); setCtxMenu(null);\n }\n }}\n onCtxEdgeRename={() => { if (ctxMenu?.edgeId) { beginEditEdge(ctxMenu.edgeId); setCtxMenu(null); } }}\n onCtxEdgeStyle={(s) => { if (ctxMenu?.edgeId) { setEdgeStyle(ctxMenu.edgeId, s); setCtxMenu(null); } }}\n onCtxEdgeArrowhead={(a) => { if (ctxMenu?.edgeId) { setEdgeArrowhead(ctxMenu.edgeId, a); setCtxMenu(null); } }}\n onCtxEdgeDelete={() => { if (ctxMenu?.edgeId) { deleteEdge(ctxMenu.edgeId); setCtxMenu(null); } }}\n onCtxEdgeResetRouting={() => { if (ctxMenu?.edgeId) { resetEdgeRouting(ctxMenu.edgeId); setCtxMenu(null); } }}\n />\n\n {selected && (\n <StepEditor key={selected} nodeId={selected} model={model} onModelChange={m => { applyAndPush(m); }} variant={variant} isDark={isDark} t={t} acc={acc} />\n )}\n </div>\n\n <div style={{ padding: '4px 14px', fontSize: 11, color: t.textMuted, background: t.statusBg, borderTop: `1px solid ${t.ctrlsBorder}`, display: 'flex', gap: 16, flexWrap: 'wrap', overflow: 'hidden', maxHeight: 28 }}>\n <span>{model.nodes.length} {variantLabel.toLowerCase()}s</span>\n <span>{model.edges.length} connections</span>\n <span>{Math.round(transform.scale * 100)}% zoom</span>\n <span style={{ marginLeft: 'auto', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>Ctrl+Z undo · Ctrl+Y redo · Ctrl+0 fit · Alt+Arrow traverse</span>\n {selected && <span style={{ color: acc.color }}>{model.nodes.find(n => n.id === selected)?.label}</span>}\n </div>\n </div>\n );\n}\n\nfunction ctrlBtn(accent: string, isDark: boolean): React.CSSProperties {\n const isTransparent = accent === 'transparent';\n return {\n display: 'inline-flex', alignItems: 'center', gap: 5,\n padding: '5px 12px',\n background: isTransparent ? 'transparent' : accent,\n color: isTransparent ? '#ef4444' : '#fff',\n border: isTransparent ? `1px solid ${isDark ? '#7f1d1d' : '#fca5a5'}` : 'none',\n borderRadius: 6, cursor: 'pointer', fontSize: 12, fontWeight: 500, fontFamily: 'inherit',\n };\n}\n","import React, { useState } from 'react';\nimport { ImportDialog } from './ImportDialog.js';\nimport { darkTheme, ACCENT } from './theme.js';\nimport type { ExportFormat } from '../core/types.js';\n\nconst ALL_FORMATS: { key: ExportFormat; label: string }[] = [\n { key: 'mermaid', label: 'Mermaid' },\n { key: 'plantuml', label: 'PlantUML' },\n { key: 'json', label: 'JSON' },\n { key: 'svg', label: 'SVG' },\n { key: 'png', label: 'PNG' },\n];\n\ninterface ToolbarProps {\n onExport: (format: ExportFormat) => void;\n onImport?: (text: string) => void;\n allowedExports?: ExportFormat[];\n allowImport?: boolean;\n}\n\nexport function Toolbar({ onExport, onImport, allowedExports, allowImport = true }: ToolbarProps) {\n const [importOpen, setImportOpen] = useState(false);\n const formats = allowedExports\n ? ALL_FORMATS.filter(f => allowedExports.includes(f.key))\n : ALL_FORMATS;\n\n return (\n <div style={bar}>\n <div style={brand}>\n <div style={brandDot} />\n <span>flowchart</span>\n <span style={{ color: darkTheme.textSecondary, fontWeight: 400 }}>/</span>\n <span style={{ color: ACCENT.indigo }}>designer</span>\n </div>\n\n <div style={divider} />\n\n <div style={{ display: 'flex', gap: 4, alignItems: 'center' }}>\n {allowImport && onImport && (\n <button onClick={() => setImportOpen(true)} aria-label=\"Import diagram\" style={ghostBtn}>\n ↑ Import\n </button>\n )}\n {formats.length > 0 && (\n <>\n <span style={{ fontSize: 11, color: darkTheme.inputText, margin: '0 4px' }}>Export →</span>\n {formats.map(f => (\n <button key={f.key} onClick={() => onExport(f.key)} aria-label={`Export as ${f.label}`} style={exportBtn}>\n {f.label}\n </button>\n ))}\n </>\n )}\n </div>\n {onImport && (\n <ImportDialog\n open={importOpen}\n onClose={() => setImportOpen(false)}\n onImport={onImport}\n />\n )}\n </div>\n );\n}\n\n// Toolbar is intentionally always-dark chrome regardless of editor theme — it\n// reads from `darkTheme` directly rather than threading a runtime theme prop.\nconst bar: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n padding: '0 14px',\n height: 44,\n background: darkTheme.panelBg,\n borderBottom: `1px solid ${darkTheme.panelBorder}`,\n flexShrink: 0,\n};\nconst brand: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 5,\n fontSize: 13,\n fontWeight: 700,\n color: darkTheme.textPrimary,\n letterSpacing: 0.2,\n fontFamily: 'ui-monospace,monospace',\n};\nconst brandDot: React.CSSProperties = {\n width: 7,\n height: 7,\n borderRadius: '50%',\n background: ACCENT.indigo,\n boxShadow: `0 0 6px ${ACCENT.indigoLight}`,\n};\nconst divider: React.CSSProperties = {\n width: 1,\n height: 20,\n background: darkTheme.panelBorder,\n margin: '0 4px',\n};\nconst ghostBtn: React.CSSProperties = {\n padding: '4px 10px',\n background: 'transparent',\n color: darkTheme.textSecondary,\n border: `1px solid ${darkTheme.panelBorder}`,\n borderRadius: 6,\n cursor: 'pointer',\n fontSize: 11,\n fontWeight: 500,\n fontFamily: 'inherit',\n letterSpacing: 0.2,\n};\nconst exportBtn: React.CSSProperties = {\n padding: '4px 10px',\n background: ACCENT.indigoSoftBg,\n color: ACCENT.indigoText,\n border: `1px solid ${ACCENT.indigoSoftBorder}`,\n borderRadius: 6,\n cursor: 'pointer',\n fontSize: 11,\n fontWeight: 600,\n fontFamily: 'ui-monospace,monospace',\n letterSpacing: 0.3,\n};\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\n\nexport interface ImportDialogProps {\n open: boolean;\n onClose(): void;\n onImport(text: string): void;\n}\n\n/**\n * Modal for importing a Mermaid or JSON diagram. Textarea for paste plus a\n * file picker (.json / .mmd / .mermaid / .txt). Auto-detects format from\n * the body: leading `{` → JSON, otherwise Mermaid.\n */\nexport function ImportDialog({ open, onClose, onImport }: ImportDialogProps) {\n const [text, setText] = useState('');\n const [fileName, setFileName] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const dialogRef = useRef<HTMLDivElement>(null);\n\n // Reset every time the dialog opens; focus the textarea so paste works\n // without an extra click.\n useEffect(() => {\n if (!open) return;\n setText('');\n setFileName(null);\n setError(null);\n const id = requestAnimationFrame(() => textareaRef.current?.focus());\n return () => cancelAnimationFrame(id);\n }, [open]);\n\n // Esc closes, Tab is trapped inside the dialog so focus can't leak to the\n // editor underneath.\n useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n onClose();\n return;\n }\n if (e.key !== 'Tab') return;\n const root = dialogRef.current;\n if (!root) return;\n const focusables = root.querySelectorAll<HTMLElement>(\n 'button:not([disabled]), textarea, input:not([type=\"file\"])',\n );\n if (focusables.length === 0) return;\n const first = focusables[0];\n const last = focusables[focusables.length - 1];\n const active = document.activeElement as HTMLElement | null;\n if (e.shiftKey && active === first) { e.preventDefault(); last.focus(); }\n else if (!e.shiftKey && active === last) { e.preventDefault(); first.focus(); }\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [open, onClose]);\n\n const onFile = useCallback((file: File) => {\n setError(null);\n setFileName(file.name);\n const reader = new FileReader();\n reader.onload = () => {\n const result = typeof reader.result === 'string' ? reader.result : '';\n setText(result);\n };\n reader.onerror = () => setError(`Could not read ${file.name}`);\n reader.readAsText(file);\n }, []);\n\n const onSubmit = useCallback(() => {\n const trimmed = text.trim();\n if (!trimmed) {\n setError('Paste a diagram or pick a file first.');\n return;\n }\n try {\n onImport(trimmed);\n onClose();\n } catch (e) {\n setError((e as Error).message);\n }\n }, [text, onImport, onClose]);\n\n if (!open) return null;\n\n const trimmed = text.trim();\n const detected = !trimmed ? null : trimmed.startsWith('{') ? 'JSON' : 'Mermaid';\n const canSubmit = trimmed.length > 0;\n\n return (\n <div role=\"presentation\" onClick={onClose} style={s.backdrop}>\n <div\n ref={dialogRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"fsd-import-title\"\n onClick={(e) => e.stopPropagation()}\n style={s.dialog}\n >\n <header style={s.header}>\n <div style={s.brandDot} />\n <h2 id=\"fsd-import-title\" style={s.title}>Import diagram</h2>\n <span style={s.headerHint}>Mermaid or JSON</span>\n </header>\n\n <div style={s.body}>\n <label htmlFor=\"fsd-import-textarea\" style={s.label}>Paste source</label>\n <textarea\n id=\"fsd-import-textarea\"\n ref={textareaRef}\n value={text}\n onChange={(e) => { setText(e.target.value); setError(null); }}\n placeholder={PLACEHOLDER}\n spellCheck={false}\n style={s.textarea}\n />\n\n <div style={s.fileRow}>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".json,.mmd,.mermaid,.txt,application/json,text/plain\"\n style={s.hiddenFile}\n onChange={(e) => {\n const f = e.target.files?.[0];\n if (f) onFile(f);\n e.target.value = '';\n }}\n />\n <button type=\"button\" onClick={() => fileInputRef.current?.click()} style={s.fileBtn}>\n Choose file…\n </button>\n <span style={s.fileName}>{fileName ?? '.json, .mmd, .mermaid, .txt'}</span>\n </div>\n\n <div style={s.status} aria-live=\"polite\">\n {error ? (\n <span style={s.error}>! {error}</span>\n ) : detected ? (\n <span style={s.ok}>Detected: {detected}</span>\n ) : null}\n </div>\n </div>\n\n <footer style={s.footer}>\n <button type=\"button\" onClick={onClose} style={s.cancelBtn}>Cancel</button>\n <button\n type=\"button\"\n onClick={onSubmit}\n disabled={!canSubmit}\n style={{ ...s.submitBtn, ...(canSubmit ? null : s.submitBtnDisabled) }}\n >\n Import\n </button>\n </footer>\n </div>\n </div>\n );\n}\n\nconst PLACEHOLDER =\n 'flowchart TD\\n A[Start] --> B{Choice?}\\n B -->|yes| C[Done]\\n B -->|no| A';\n\n// ── Styles ────────────────────────────────────────────────────────────────\n// The dialog is launched from the Toolbar which is fixed-dark, so the modal\n// matches that surface rather than the canvas's themed palette.\nconst s = {\n backdrop: {\n position: 'fixed', inset: 0, zIndex: 100,\n background: 'rgba(15, 23, 42, 0.65)',\n backdropFilter: 'blur(2px)',\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n padding: 24, fontFamily: 'ui-sans-serif,system-ui,sans-serif',\n },\n dialog: {\n width: 'min(560px, 100%)', maxHeight: '90vh',\n background: '#1e293b', color: '#f1f5f9',\n border: '1px solid #334155', borderRadius: 12,\n boxShadow: '0 24px 64px rgba(0,0,0,0.45)',\n display: 'flex', flexDirection: 'column', overflow: 'hidden',\n },\n header: {\n padding: '14px 18px', borderBottom: '1px solid #334155',\n display: 'flex', alignItems: 'center', gap: 10,\n },\n brandDot: {\n width: 8, height: 8, borderRadius: '50%',\n background: '#4f46e5', boxShadow: '0 0 8px #818cf8',\n },\n title: {\n margin: 0, fontSize: 14, fontWeight: 700, letterSpacing: 0.2,\n color: '#f1f5f9', fontFamily: 'ui-monospace,monospace',\n },\n headerHint: { marginLeft: 'auto', fontSize: 11, color: '#64748b' },\n body: { padding: 18, display: 'flex', flexDirection: 'column', gap: 12, overflow: 'auto' },\n label: {\n fontSize: 11, fontWeight: 600, color: '#94a3b8',\n letterSpacing: 0.4, textTransform: 'uppercase',\n },\n textarea: {\n width: '100%', minHeight: 180,\n padding: '10px 12px', borderRadius: 8,\n background: '#0f172a', color: '#e2e8f0',\n border: '1px solid #334155', outline: 'none',\n fontFamily: 'ui-monospace,SFMono-Regular,Menlo,Consolas,monospace',\n fontSize: 12, lineHeight: 1.55, resize: 'vertical',\n boxSizing: 'border-box',\n },\n fileRow: {\n display: 'flex', alignItems: 'center', gap: 10,\n padding: '10px 12px', borderRadius: 8,\n background: 'rgba(79, 70, 229, 0.08)',\n border: '1px dashed rgba(79, 70, 229, 0.4)',\n },\n hiddenFile: { display: 'none' },\n fileBtn: {\n padding: '6px 12px', borderRadius: 6, cursor: 'pointer',\n background: '#4f46e5', color: '#fff', border: 'none',\n fontSize: 11, fontWeight: 600, fontFamily: 'inherit',\n letterSpacing: 0.2,\n },\n fileName: {\n fontSize: 11, color: '#cbd5e1', flex: 1,\n overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap',\n },\n status: { display: 'flex', alignItems: 'center', minHeight: 16 },\n error: { fontSize: 11, color: '#fca5a5', fontWeight: 500 },\n ok: { fontSize: 11, color: '#86efac', fontWeight: 500 },\n footer: {\n padding: '12px 18px', borderTop: '1px solid #334155',\n display: 'flex', justifyContent: 'flex-end', gap: 8,\n background: '#0f172a',\n },\n cancelBtn: {\n padding: '6px 14px', borderRadius: 6, cursor: 'pointer',\n background: 'transparent', color: '#cbd5e1',\n border: '1px solid #334155',\n fontSize: 12, fontWeight: 500, fontFamily: 'inherit',\n },\n submitBtn: {\n padding: '6px 14px', borderRadius: 6, cursor: 'pointer',\n background: '#4f46e5', color: '#fff', border: 'none',\n fontSize: 12, fontWeight: 600, fontFamily: 'inherit',\n letterSpacing: 0.2,\n },\n submitBtnDisabled: { cursor: 'not-allowed', background: 'rgba(79,70,229,0.35)' },\n} satisfies Record<string, React.CSSProperties>;\n","import type { DiagramVariant } from '../core/types.js';\n\n/**\n * Color palette for the flowchart `<DiagramEditor>`. Every visual surface\n * pulls from one of these tokens, so overriding any single property via\n * `themeOverrides` updates every element that uses it. Built-in\n * `lightTheme` and `darkTheme` are exported as ready-made values.\n *\n * Token groups:\n * - `canvas` / `dot` — background and dot-grid color.\n * - `nodeFill` / `nodeStroke` / `nodeSelectedFill` — base node styling.\n * - `edgeColor` — edge stroke and arrowhead color.\n * - `text*` — type ramp (primary > secondary > muted).\n * - `panel*` / `ctrls*` / `input*` / `card*` / `section*` — chrome around\n * the canvas (side panel, controls, form fields, card rows).\n * - `labelText` / `hintText` — small-text accents inside chrome.\n * - `statusBg` / `bannerBg` — bottom validation banner backdrop.\n * - `btnSec*` / `shapeBtn*` — secondary button surfaces.\n * - `addFormBg` — accent backdrop for the \"add node\" form.\n */\nexport interface ThemeColors {\n canvas: string; dot: string;\n nodeFill: string; nodeStroke: string; nodeSelectedFill: string;\n edgeColor: string;\n textPrimary: string; textSecondary: string; textMuted: string;\n panelBg: string; panelBorder: string;\n ctrlsBg: string; ctrlsBorder: string;\n inputBg: string; inputBorder: string; inputText: string;\n cardBg: string; cardBorder: string;\n sectionBorder: string;\n labelText: string;\n hintText: string;\n statusBg: string;\n btnSecBg: string; btnSecText: string;\n shapeBtnBg: string; shapeBtnBorder: string;\n addFormBg: string;\n bannerBg: string;\n}\n\n/** Default light palette. Indigo accent on a near-white canvas. */\nexport const lightTheme: ThemeColors = {\n canvas: '#fafbfc', dot: '#dbe3ee',\n nodeFill: '#ffffff', nodeStroke: '#cbd5e1', nodeSelectedFill: '#eef2ff',\n edgeColor: '#94a3b8',\n textPrimary: '#1e293b', textSecondary: '#475569', textMuted: '#94a3b8',\n panelBg: '#ffffff', panelBorder: '#e2e8f0',\n ctrlsBg: '#ffffff', ctrlsBorder: '#cbd5e1',\n inputBg: '#f8fafc', inputBorder: '#e2e8f0', inputText: '#1e293b',\n cardBg: '#f8fafc', cardBorder: '#e2e8f0',\n sectionBorder: '#f1f5f9',\n labelText: '#94a3b8',\n hintText: '#94a3b8',\n statusBg: '#ffffff',\n btnSecBg: '#e2e8f0', btnSecText: '#475569',\n shapeBtnBg: '#f1f5f9', shapeBtnBorder: '#e2e8f0',\n addFormBg: '#f5f3ff',\n bannerBg: '#f8fafc',\n};\n\n/** Default dark palette. Slate canvas with a softer indigo accent. */\nexport const darkTheme: ThemeColors = {\n canvas: '#0f172a', dot: '#1e293b',\n nodeFill: '#1e293b', nodeStroke: '#334155', nodeSelectedFill: '#1e1b4b',\n edgeColor: '#475569',\n textPrimary: '#f1f5f9', textSecondary: '#94a3b8', textMuted: '#475569',\n panelBg: '#1e293b', panelBorder: '#334155',\n ctrlsBg: '#0f172a', ctrlsBorder: '#1e293b',\n inputBg: '#0f172a', inputBorder: '#334155', inputText: '#e2e8f0',\n cardBg: '#0f172a', cardBorder: '#334155',\n sectionBorder: '#0f172a',\n labelText: '#475569',\n hintText: '#475569',\n statusBg: '#0f172a',\n btnSecBg: '#334155', btnSecText: '#94a3b8',\n shapeBtnBg: '#0f172a', shapeBtnBorder: '#334155',\n addFormBg: '#1e1b4b',\n bannerBg: '#1e293b',\n};\n\nexport const ACCENT = {\n indigo: '#4f46e5', indigoGlow: 'rgba(79,70,229,0.22)',\n indigoLight: '#818cf8', indigoText: '#a5b4fc',\n indigoSoftBg: 'rgba(79,70,229,0.15)', indigoSoftBorder: 'rgba(79,70,229,0.3)',\n amber: '#d97706', amberLight: '#fef3c7', amberBorder: '#fcd34d', amberGlow: 'rgba(217,119,6,0.25)',\n amberDark: '#fbbf24', amberDarkLight: 'rgba(251,191,36,0.12)', amberDarkBorder: 'rgba(251,191,36,0.3)',\n emerald: '#059669', emeraldLight: '#ecfdf5', emeraldGlow: 'rgba(5,150,105,0.2)',\n emeraldDark: '#10b981', emeraldDarkLight: 'rgba(16,185,129,0.12)', emeraldDarkBorder: 'rgba(16,185,129,0.3)',\n};\n\nexport interface VariantAccent {\n color: string;\n fill: string;\n border: string;\n glow: string;\n}\n\n/**\n * Derived shadow color used in SVG `<feDropShadow>` filters. Dark mode needs\n * a heavier shadow to remain visible against the dark canvas.\n */\nexport function shadowColor(isDark: boolean): string {\n return isDark ? 'rgba(0,0,0,0.55)' : 'rgba(15,23,42,0.09)';\n}\n\n/**\n * Default arrowhead fill color, matching the edge palette for the current mode.\n */\nexport function arrowColor(isDark: boolean): string {\n return isDark ? '#64748b' : '#94a3b8';\n}\n\nexport function variantAccent(variant: DiagramVariant, isDark: boolean): VariantAccent {\n if (variant === 'question') {\n return isDark\n ? { color: ACCENT.amberDark, fill: ACCENT.amberDarkLight, border: ACCENT.amberDarkBorder, glow: ACCENT.amberGlow }\n : { color: ACCENT.amber, fill: ACCENT.amberLight, border: ACCENT.amberBorder, glow: ACCENT.amberGlow };\n }\n if (variant === 'journey') {\n return isDark\n ? { color: ACCENT.emeraldDark, fill: ACCENT.emeraldDarkLight, border: ACCENT.emeraldDarkBorder, glow: ACCENT.emeraldGlow }\n : { color: ACCENT.emerald, fill: ACCENT.emeraldLight, border: '#6ee7b7', glow: ACCENT.emeraldGlow };\n }\n return isDark\n ? { color: '#818cf8', fill: 'rgba(79,70,229,0.12)', border: 'rgba(79,70,229,0.3)', glow: ACCENT.indigoGlow }\n : { color: ACCENT.indigo, fill: '#f5f3ff', border: '#c7d2fe', glow: ACCENT.indigoGlow };\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport type { DiagramModel, DiagramNode, DiagramEdge, NodeShape, DiagramVariant } from '../core/types.js';\nimport { nextId } from '../core/ids.js';\nimport { lightTheme, darkTheme, variantAccent, type ThemeColors, type VariantAccent } from './theme.js';\n\ninterface StepEditorProps {\n nodeId: string;\n model: DiagramModel;\n onModelChange: (model: DiagramModel) => void;\n variant?: DiagramVariant;\n isDark?: boolean;\n t?: ThemeColors;\n acc?: VariantAccent;\n}\n\nconst SHAPES: { key: NodeShape; label: string; icon: string }[] = [\n { key: 'rectangle', label: 'Box', icon: '▭' },\n { key: 'diamond', label: 'Decision', icon: '◇' },\n { key: 'circle', label: 'Circle', icon: '○' },\n { key: 'parallelogram', label: 'I/O', icon: '▱' },\n];\n\nexport function StepEditor({ nodeId, model, onModelChange, variant = 'flowchart', isDark = false, t, acc }: StepEditorProps) {\n const isQuestion = variant === 'question';\n const branchTerm = isQuestion ? 'Answer' : 'Branch';\n\n // Fall back to the built-in theme when used standalone (without DiagramEditor wiring).\n const tt = t ?? (isDark ? darkTheme : lightTheme);\n const aa = acc ?? variantAccent(variant, isDark);\n const accentColor = aa.color;\n const accentLight = aa.fill;\n const accentBorder = aa.border;\n\n const node = model.nodes.find(n => n.id === nodeId);\n const [label, setLabel] = useState(node?.label ?? '');\n const [addingBranch, setAddingBranch] = useState(false);\n const [branchMode, setBranchMode] = useState<'new' | 'existing'>('new');\n const [branchLabel, setBranchLabel] = useState('');\n const [branchEdgeLabel, setBranchEdgeLabel] = useState('');\n const [branchTarget, setBranchTarget] = useState('');\n const [newAnswer, setNewAnswer] = useState('');\n const [addingAnswer, setAddingAnswer] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n setLabel(node?.label ?? '');\n setAddingBranch(false);\n setAddingAnswer(false);\n setBranchLabel(''); setBranchEdgeLabel(''); setBranchTarget(''); setNewAnswer('');\n setTimeout(() => inputRef.current?.focus(), 50);\n }, [nodeId]);\n\n if (!node) return null;\n\n const outEdges = model.edges.filter(e => e.from === nodeId);\n const otherNodes = model.nodes.filter(n => n.id !== nodeId);\n const answers: string[] = (node.metadata?.answers as string[] | undefined) ?? [];\n\n const commitLabel = () => {\n if (label === node.label || !label.trim()) return;\n onModelChange({ ...model, nodes: model.nodes.map(n => n.id === nodeId ? { ...n, label: label.trim() } : n) });\n };\n\n const setShape = (shape: NodeShape) => {\n onModelChange({ ...model, nodes: model.nodes.map(n => n.id === nodeId ? { ...n, shape } : n) });\n };\n\n const removeEdge = (edgeId: string) => {\n onModelChange({ ...model, edges: model.edges.filter(e => e.id !== edgeId) });\n };\n\n const updateEdgeLabel = (edgeId: string, val: string) => {\n onModelChange({ ...model, edges: model.edges.map(e => e.id === edgeId ? { ...e, label: val || undefined } : e) });\n };\n\n const addBranch = () => {\n if (branchMode === 'new') {\n if (!branchLabel.trim()) return;\n const newId = nextId('node', model.nodes);\n const newNode: DiagramNode = { id: newId, label: branchLabel.trim(), shape: 'rectangle', x: (node.x ?? 0) + 200, y: (node.y ?? 0) + 20 + outEdges.length * 100 };\n const newEdge: DiagramEdge = { id: nextId('e', model.edges), from: nodeId, to: newId, label: branchEdgeLabel.trim() || undefined };\n onModelChange({ ...model, nodes: [...model.nodes, newNode], edges: [...model.edges, newEdge] });\n } else {\n if (!branchTarget || model.edges.some(e => e.from === nodeId && e.to === branchTarget)) return;\n const newEdge: DiagramEdge = { id: nextId('e', model.edges), from: nodeId, to: branchTarget, label: branchEdgeLabel.trim() || undefined };\n onModelChange({ ...model, edges: [...model.edges, newEdge] });\n }\n setBranchLabel(''); setBranchEdgeLabel(''); setBranchTarget(''); setAddingBranch(false);\n };\n\n const addAnswer = () => {\n const trimmed = newAnswer.trim();\n if (!trimmed || answers.includes(trimmed)) return;\n const updated = [...answers, trimmed];\n onModelChange({ ...model, nodes: model.nodes.map(n => n.id === nodeId ? { ...n, metadata: { ...(n.metadata ?? {}), answers: updated } } : n) });\n setNewAnswer(''); setAddingAnswer(false);\n };\n\n const removeAnswer = (ans: string) => {\n const updated = answers.filter(a => a !== ans);\n const updatedEdges = model.edges.filter(e => !(e.from === nodeId && e.label === ans));\n onModelChange({\n ...model,\n nodes: model.nodes.map(n => n.id === nodeId ? { ...n, metadata: { ...(n.metadata ?? {}), answers: updated } } : n),\n edges: updatedEdges,\n });\n };\n\n const moveAnswer = (idx: number, dir: -1 | 1) => {\n const next = idx + dir;\n if (next < 0 || next >= answers.length) return;\n const arr = [...answers];\n [arr[idx], arr[next]] = [arr[next], arr[idx]];\n onModelChange({ ...model, nodes: model.nodes.map(n => n.id === nodeId ? { ...n, metadata: { ...(n.metadata ?? {}), answers: arr } } : n) });\n };\n\n const inputStyle: React.CSSProperties = {\n width: '100%', padding: '7px 10px',\n border: `1.5px solid ${tt.inputBorder}`,\n borderRadius: 8, fontSize: 13, outline: 'none',\n boxSizing: 'border-box', fontFamily: 'inherit',\n color: tt.inputText, background: tt.inputBg,\n transition: 'border-color 0.15s',\n };\n\n const addBtnStyle: React.CSSProperties = {\n flex: 1, padding: '7px 0', background: accentColor, color: '#fff',\n border: 'none', borderRadius: 7, cursor: 'pointer', fontSize: 12, fontWeight: 600, fontFamily: 'inherit',\n };\n\n const cancelBtnStyle: React.CSSProperties = {\n padding: '7px 14px', background: tt.btnSecBg, color: tt.btnSecText,\n border: 'none', borderRadius: 7, cursor: 'pointer', fontSize: 12, fontFamily: 'inherit',\n };\n\n const addTriggerStyle: React.CSSProperties = {\n display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 6,\n marginTop: 10, width: '100%', padding: '9px 0', background: 'transparent',\n color: accentColor, border: `1.5px dashed ${accentBorder}`,\n borderRadius: 10, cursor: 'pointer', fontSize: 12, fontWeight: 600, fontFamily: 'inherit',\n transition: 'background 0.15s, border-color 0.15s',\n };\n\n return (\n <div style={{ width: 272, minWidth: 272, background: tt.panelBg, borderLeft: `1px solid ${tt.panelBorder}`, display: 'flex', flexDirection: 'column', overflow: 'hidden' }}>\n {/* Header */}\n <div style={{\n padding: '12px 16px', fontWeight: 700, fontSize: 12, letterSpacing: 0.8,\n textTransform: 'uppercase', color: accentColor,\n borderBottom: `1px solid ${accentBorder}`, background: accentLight,\n display: 'flex', alignItems: 'center', gap: 8,\n }}>\n <div style={{ width: 6, height: 6, borderRadius: '50%', background: accentColor }} />\n <span>{isQuestion ? 'Question Editor' : variant === 'journey' ? 'Step Editor' : 'Step Editor'}</span>\n </div>\n\n <div style={{ flex: 1, overflowY: 'auto', display: 'flex', flexDirection: 'column' }}>\n {/* Name */}\n <section style={{ padding: '14px 16px', borderBottom: `1px solid ${tt.sectionBorder}` }}>\n <label style={{ display: 'block', fontSize: 10, fontWeight: 700, color: tt.labelText, marginBottom: 8, textTransform: 'uppercase', letterSpacing: 0.8 }}>Name</label>\n <input\n ref={inputRef}\n value={label}\n onChange={e => setLabel(e.target.value)}\n onBlur={commitLabel}\n onKeyDown={e => e.key === 'Enter' && commitLabel()}\n style={inputStyle}\n placeholder=\"Step name…\"\n />\n </section>\n\n {/* Shape (hidden for question variant) */}\n {!isQuestion && (\n <section style={{ padding: '14px 16px', borderBottom: `1px solid ${tt.sectionBorder}` }}>\n <label style={{ display: 'block', fontSize: 10, fontWeight: 700, color: tt.labelText, marginBottom: 8, textTransform: 'uppercase', letterSpacing: 0.8 }}>Shape</label>\n <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 6 }}>\n {SHAPES.map(s => {\n const active = (node.shape ?? 'rectangle') === s.key;\n return (\n <button key={s.key} onClick={() => setShape(s.key)} aria-pressed={active} style={{\n display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 4,\n padding: '8px 6px', borderRadius: 8, cursor: 'pointer', transition: 'all 0.15s',\n background: active ? accentColor : tt.shapeBtnBg,\n color: active ? '#fff' : tt.textSecondary,\n border: active ? `1.5px solid ${accentColor}` : `1.5px solid ${tt.shapeBtnBorder}`,\n }}>\n <span style={{ fontSize: 16, lineHeight: 1 }}>{s.icon}</span>\n <span style={{ fontSize: 11, fontWeight: 500 }}>{s.label}</span>\n </button>\n );\n })}\n </div>\n </section>\n )}\n\n {/* Question variant: Answers */}\n {isQuestion && (\n <section style={{ padding: '14px 16px', borderBottom: `1px solid ${tt.sectionBorder}`, flex: 1 }}>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginBottom: 10 }}>\n <label style={{ display: 'block', fontSize: 10, fontWeight: 700, color: tt.labelText, textTransform: 'uppercase', letterSpacing: 0.8 }}>Answers</label>\n <span style={{ fontSize: 11, color: tt.textMuted, background: isDark ? '#0f172a' : '#f1f5f9', padding: '1px 7px', borderRadius: 99, fontWeight: 600 }}>{answers.length}</span>\n </div>\n\n {answers.length === 0 && !addingAnswer && (\n <div style={{ fontSize: 12, color: tt.textMuted, textAlign: 'center', padding: '16px 0', fontStyle: 'italic' }}>No answers yet — add one below</div>\n )}\n\n {answers.map((ans, i) => {\n const connected = model.edges.some(e => e.from === nodeId && e.label === ans);\n const targetNode = model.nodes.find(n => { const e = model.edges.find(ex => ex.from === nodeId && ex.label === ans); return e && n.id === e.to; });\n return (\n <div key={ans + i} style={{ display: 'flex', alignItems: 'flex-start', gap: 0, marginBottom: 8, borderRadius: 12, border: `1px solid ${tt.cardBorder}`, overflow: 'hidden', background: tt.cardBg, boxShadow: isDark ? 'none' : '0 1px 2px rgba(15,23,42,0.04)' }}>\n <div style={{ width: 4, alignSelf: 'stretch', background: accentColor, flexShrink: 0 }} />\n <div style={{ flex: 1, minWidth: 0, padding: '8px 10px' }}>\n <div style={{ fontSize: 12, fontWeight: 600, color: tt.textPrimary, marginBottom: connected ? 3 : 0, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{ans}</div>\n {connected && targetNode && <div style={{ fontSize: 11, color: accentColor, opacity: 0.85 }}>→ {targetNode.label}</div>}\n {!connected && <div style={{ fontSize: 10, color: tt.textMuted, fontStyle: 'italic' }}>drag port to connect</div>}\n </div>\n <div style={{ display: 'flex', flexDirection: 'column', padding: '4px 2px', gap: 2 }}>\n <button onClick={() => moveAnswer(i, -1)} disabled={i === 0} style={{ background: 'none', border: 'none', color: tt.textMuted, cursor: 'pointer', fontSize: 11, padding: '2px 4px', opacity: i === 0 ? 0.3 : 1 }}>↑</button>\n <button onClick={() => moveAnswer(i, 1)} disabled={i === answers.length - 1} style={{ background: 'none', border: 'none', color: tt.textMuted, cursor: 'pointer', fontSize: 11, padding: '2px 4px', opacity: i === answers.length - 1 ? 0.3 : 1 }}>↓</button>\n </div>\n <button onClick={() => removeAnswer(ans)} style={{ background: 'none', border: 'none', color: tt.textMuted, cursor: 'pointer', fontSize: 12, padding: '8px 10px', flexShrink: 0 }} title=\"Remove\">✕</button>\n </div>\n );\n })}\n\n {addingAnswer ? (\n <div role=\"group\" aria-label=\"Add answer form\" onKeyDown={e => { if (e.key === 'Escape') { setAddingAnswer(false); setNewAnswer(''); } }} style={{ marginTop: 10, background: tt.addFormBg, borderRadius: 10, padding: 12, border: `1.5px solid ${accentBorder}` }}>\n <input autoFocus value={newAnswer} onChange={e => setNewAnswer(e.target.value)} onKeyDown={e => e.key === 'Enter' && addAnswer()} placeholder=\"Answer text…\" style={{ ...inputStyle, marginBottom: 8 }} />\n <div style={{ display: 'flex', gap: 6 }}>\n <button onClick={addAnswer} style={addBtnStyle}>Add Answer</button>\n <button onClick={() => { setAddingAnswer(false); setNewAnswer(''); }} style={cancelBtnStyle}>Cancel</button>\n </div>\n </div>\n ) : (\n <button onClick={() => setAddingAnswer(true)} style={addTriggerStyle}>\n <span style={{ fontSize: 16, lineHeight: 1 }}>+</span> Add Answer\n </button>\n )}\n\n {answers.length > 0 && (\n <div style={{ marginTop: 12, padding: '8px 10px', background: isDark ? 'rgba(251,191,36,0.06)' : '#fef9f0', borderRadius: 8, border: `1px solid ${accentBorder}` }}>\n <div style={{ fontSize: 10, fontWeight: 700, color: accentColor, textTransform: 'uppercase', letterSpacing: 0.6, marginBottom: 4 }}>How to connect</div>\n <div style={{ fontSize: 11, color: tt.textSecondary, lineHeight: 1.5 }}>Hover the question node on the canvas — drag an answer's port dot to any other node.</div>\n </div>\n )}\n </section>\n )}\n\n {/* Non-question: Branches */}\n {!isQuestion && (\n <section style={{ padding: '14px 16px', borderBottom: `1px solid ${tt.sectionBorder}`, flex: 1 }}>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginBottom: 10 }}>\n <label style={{ display: 'block', fontSize: 10, fontWeight: 700, color: tt.labelText, textTransform: 'uppercase', letterSpacing: 0.8 }}>Branches</label>\n <span style={{ fontSize: 11, color: tt.textMuted, background: isDark ? '#0f172a' : '#f1f5f9', padding: '1px 7px', borderRadius: 99, fontWeight: 600 }}>{outEdges.length}</span>\n </div>\n\n {outEdges.length === 0 && !addingBranch && (\n <div style={{ fontSize: 12, color: tt.textMuted, textAlign: 'center', padding: '16px 0', fontStyle: 'italic' }}>No outgoing connections yet</div>\n )}\n\n {outEdges.map(edge => {\n const target = model.nodes.find(n => n.id === edge.to);\n return (\n <div key={edge.id} style={{ display: 'flex', alignItems: 'flex-start', gap: 0, marginBottom: 8, borderRadius: 12, border: `1px solid ${tt.cardBorder}`, overflow: 'hidden', background: tt.cardBg, boxShadow: isDark ? 'none' : '0 1px 2px rgba(15,23,42,0.04)' }}>\n <div style={{ width: 4, alignSelf: 'stretch', background: accentColor, flexShrink: 0 }} />\n <div style={{ flex: 1, minWidth: 0, padding: '8px 10px' }}>\n <div style={{ fontSize: 12, fontWeight: 600, color: tt.textPrimary, marginBottom: 5, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>→ {target?.label ?? edge.to}</div>\n <input value={edge.label ?? ''} onChange={e => updateEdgeLabel(edge.id, e.target.value)} placeholder=\"Edge label (optional)\" style={{ ...inputStyle, fontSize: 11, padding: '4px 8px' }} />\n </div>\n <button onClick={() => removeEdge(edge.id)} style={{ background: 'none', border: 'none', color: tt.textMuted, cursor: 'pointer', fontSize: 12, padding: '8px 10px', flexShrink: 0 }} title=\"Remove\">✕</button>\n </div>\n );\n })}\n\n {addingBranch ? (\n <div role=\"group\" aria-label=\"Add branch form\" onKeyDown={e => { if (e.key === 'Escape') setAddingBranch(false); }} style={{ marginTop: 10, background: tt.addFormBg, borderRadius: 10, padding: 12, border: `1.5px solid ${accentBorder}` }}>\n <div style={{ display: 'flex', gap: 6, marginBottom: 10 }}>\n {(['new', 'existing'] as const).map(mode => (\n <button key={mode} onClick={() => setBranchMode(mode)} style={{\n flex: 1, padding: '5px 0', border: 'none', borderRadius: 6, cursor: 'pointer', fontSize: 11, fontWeight: 600,\n background: branchMode === mode ? accentColor : tt.btnSecBg,\n color: branchMode === mode ? '#fff' : tt.btnSecText,\n }}>\n {mode === 'new' ? `+ New step` : 'Existing step'}\n </button>\n ))}\n </div>\n {branchMode === 'new' ? (\n <input autoFocus value={branchLabel} onChange={e => setBranchLabel(e.target.value)} onKeyDown={e => e.key === 'Enter' && addBranch()} placeholder=\"New step name…\" style={{ ...inputStyle, marginBottom: 6 }} />\n ) : (\n <select value={branchTarget} onChange={e => setBranchTarget(e.target.value)} style={{ ...inputStyle, marginBottom: 6, appearance: 'none' }}>\n <option value=\"\">Choose a step…</option>\n {otherNodes.map(n => <option key={n.id} value={n.id}>{n.label}</option>)}\n </select>\n )}\n <input value={branchEdgeLabel} onChange={e => setBranchEdgeLabel(e.target.value)} placeholder=\"Edge label (optional)\" style={{ ...inputStyle, marginBottom: 10 }} />\n <div style={{ display: 'flex', gap: 6 }}>\n <button onClick={addBranch} style={addBtnStyle}>Add {branchTerm}</button>\n <button onClick={() => setAddingBranch(false)} style={cancelBtnStyle}>Cancel</button>\n </div>\n </div>\n ) : (\n <button onClick={() => setAddingBranch(true)} style={addTriggerStyle}>\n <span style={{ fontSize: 16, lineHeight: 1 }}>+</span> Add {branchTerm}\n </button>\n )}\n </section>\n )}\n </div>\n </div>\n );\n}\n","/**\n * Mint the next available ID for a given prefix by scanning the existing\n * entities in a model.\n *\n * Avoids the classic collision pitfall of a module-level counter starting at\n * zero: if the model already contains `e1..e6` (e.g. from a preset or an\n * imported diagram), a counter that started at zero would produce a duplicate\n * `e1` on first use. By deriving from the model itself, generated IDs are\n * collision-proof against presets, imports, and concurrent editor instances.\n *\n * @example\n * nextId('node', model.nodes) // → 'node7' if model has node1..node6\n * nextId('e', model.edges) // → 'e1' if model has no edges yet\n * nextId('m', model.messages) // → 'm5' if model has m1..m4\n */\n/**\n * Returns a stateful id generator seeded from the current model. Use this\n * when a single operation needs to mint several IDs in succession (e.g.\n * duplicate or paste) — calling `nextId()` repeatedly against the same\n * snapshot would produce duplicates because the snapshot doesn't reflect\n * the freshly minted IDs.\n *\n * @example\n * const newNodeId = makeIdSource('node', model.nodes);\n * const a = newNodeId(); // → 'node7'\n * const b = newNodeId(); // → 'node8'\n */\nexport function makeIdSource(prefix: string, existing: Iterable<{ id: string }>): () => string {\n const first = nextId(prefix, existing);\n let counter = parseInt(first.slice(prefix.length), 10);\n return () => `${prefix}${counter++}`;\n}\n\nexport function nextId(prefix: string, existing: Iterable<{ id: string }>): string {\n const escaped = prefix.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const re = new RegExp(`^${escaped}(\\\\d+)$`);\n let max = 0;\n for (const item of existing) {\n const match = re.exec(item.id);\n if (match) {\n const n = parseInt(match[1], 10);\n if (n > max) max = n;\n }\n }\n return `${prefix}${max + 1}`;\n}\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { DiagramModel, SequenceMessage, ExportFormat } from '../core/types.js';\nimport { Toolbar } from './Toolbar.js';\nimport { SequenceCanvas } from './SequenceCanvas.js';\nimport { useEditorTheme } from './hooks/useEditorTheme.js';\nimport { useExporters } from './hooks/useExporters.js';\nimport { useImporter } from './hooks/useImporter.js';\nimport { useToast } from './hooks/useToast.js';\nimport { ToastContainer } from './ToastContainer.js';\nimport { presetSequenceModel } from './presets.js';\nimport { nextId } from '../core/ids.js';\nimport { useEditorKeyboard, type KeyCommand } from './hooks/useEditorKeyboard.js';\n\nconst INDIGO = '#4f46e5';\nconst INDIGO_SOFT = '#eef2ff';\n\n/**\n * Color palette for `<SequenceEditor>`. Sequence diagrams use a smaller\n * token set than flowcharts — there are no node shapes to color, but there\n * are `lifeline`, `arrow`, and `actor*` tokens that flowcharts don't need.\n *\n * Token groups:\n * - `canvas` / `dot` — background and dot-grid color.\n * - `panel*` / `ctrls*` / `input*` / `card*` — chrome around the canvas.\n * - `text*` — type ramp (primary > secondary > muted).\n * - `lifeline` — vertical actor lifeline color.\n * - `arrow` — message arrow + label color.\n * - `actorFill` / `actorStroke` / `actorText` — actor header box.\n */\nexport interface SequenceThemeColors {\n canvas: string; dot: string;\n panelBg: string; panelBorder: string;\n ctrlsBg: string; ctrlsBorder: string;\n inputBg: string; inputBorder: string; inputText: string;\n textPrimary: string; textSecondary: string; textMuted: string;\n cardBg: string; cardBorder: string;\n lifeline: string; arrow: string;\n actorFill: string; actorStroke: string; actorText: string;\n}\n\nconst lightTheme: SequenceThemeColors = {\n canvas: '#fafbfc',\n dot: '#dbe3ee',\n panelBg: '#ffffff',\n panelBorder: '#e2e8f0',\n ctrlsBg: '#ffffff',\n ctrlsBorder: '#cbd5e1',\n inputBg: '#f8fafc',\n inputBorder: '#e2e8f0',\n inputText: '#1e293b',\n textPrimary: '#1e293b',\n textSecondary: '#475569',\n textMuted: '#94a3b8',\n cardBg: '#ffffff',\n cardBorder: '#e2e8f0',\n lifeline: '#cbd5e1',\n arrow: '#64748b',\n actorFill: '#f5f3ff',\n actorStroke: '#c7d2fe',\n actorText: '#4338ca',\n};\nconst darkTheme: SequenceThemeColors = {\n canvas: '#0f172a',\n dot: '#1e293b',\n panelBg: '#1e293b',\n panelBorder: '#334155',\n ctrlsBg: '#0f172a',\n ctrlsBorder: '#1e293b',\n inputBg: '#0f172a',\n inputBorder: '#334155',\n inputText: '#e2e8f0',\n textPrimary: '#f1f5f9',\n textSecondary: '#94a3b8',\n textMuted: '#475569',\n cardBg: '#0f172a',\n cardBorder: '#334155',\n lifeline: '#334155',\n arrow: '#64748b',\n actorFill: '#1e1b4b',\n actorStroke: 'rgba(99,102,241,0.45)',\n actorText: '#a5b4fc',\n};\n\n// Layout\nconst HEADER_H = 64; // height of actor box\nconst HEADER_PAD = 24; // top padding before headers start\nconst COL_MIN = 160; // min column width\nconst ROW_H = 64; // vertical spacing per message\nconst SIDE_PAD = 40; // left/right padding\n\n/**\n * Props for `<SequenceEditor>`. Mirrors `DiagramEditorProps` minus the\n * flowchart-only `variant` field; the theme override type is the\n * sequence-specific palette.\n *\n * @property initialModel Initial sequence model. Defaults to\n * `presetSequenceModel()` if omitted or if a\n * non-sequence model is passed.\n * @property onChange Fires after every committed mutation.\n * @property onExport Optional sink for exporter output. If omitted, the\n * editor triggers a browser download of `sequence.<ext>`.\n * @property height Canvas height; accepts CSS units. Defaults to `600`.\n * @property allowedExports Whitelist of export formats. Defaults to all.\n * @property allowImport Show the import button. Defaults to `true`.\n * @property theme `'light'`, `'dark'`, or `'auto'` (follow OS).\n * @property themeOverrides Per-property overrides on top of the resolved\n * sequence palette. `themeOverrides` passed to\n * `<DiagramEditor>` is forwarded here when\n * `type === 'sequence'`.\n */\nexport interface SequenceEditorProps {\n initialModel?: DiagramModel;\n onChange?: (model: DiagramModel) => void;\n onExport?: (format: ExportFormat, content: string | Blob) => void;\n height?: number | string;\n allowedExports?: ExportFormat[];\n allowImport?: boolean;\n theme?: 'light' | 'dark' | 'auto';\n themeOverrides?: Partial<SequenceThemeColors>;\n}\n\ninterface DragState {\n id: string;\n startY: number; // clientY at mousedown (page-space)\n originalIdx: number; // index in messages[] at drag start\n targetIdx: number; // current preview position\n active: boolean; // true once the cursor moves > DRAG_THRESHOLD\n}\nconst DRAG_THRESHOLD = 5;\n\nfunction ensureSequenceModel(m?: DiagramModel): DiagramModel {\n if (m && m.type === 'sequence') {\n return { ...m, actors: m.actors ?? [], messages: m.messages ?? [] };\n }\n return presetSequenceModel();\n}\n\n/**\n * Sequence-diagram specialization of the editor. Accepts the same props as\n * `<DiagramEditor>` but renders a swim-lane layout with drag-to-reorder\n * messages and inline label editing.\n *\n * @example\n * ```tsx\n * import { SequenceEditor, presetSequenceModel } from 'flowchart-sequence-designer/ui';\n *\n * <SequenceEditor initialModel={presetSequenceModel()} theme=\"dark\" />\n * ```\n */\nexport function SequenceEditor({\n initialModel, onChange, onExport, height = 600,\n allowedExports, allowImport = true, theme = 'auto',\n themeOverrides,\n}: SequenceEditorProps) {\n const [model, setModel] = useState<DiagramModel>(() => ensureSequenceModel(initialModel));\n const { toasts, showToast, dismissToast } = useToast();\n const [selected, setSelected] = useState<string | null>(null);\n const [drag, setDrag] = useState<DragState | null>(null);\n const [editingId, setEditingId] = useState<string | null>(null);\n const [editLabel, setEditLabel] = useState('');\n const historyRef = useRef<DiagramModel[]>([ensureSequenceModel(initialModel)]);\n const historyIdxRef = useRef(0);\n const svgRef = useRef<SVGSVGElement>(null);\n\n const { t, isDark } = useEditorTheme(theme, themeOverrides, { light: lightTheme, dark: darkTheme });\n\n const actors = model.actors ?? [];\n const messages = model.messages ?? [];\n\n // Column width sized to the longest actor name.\n const colW = useMemo(() => {\n const longest = actors.reduce((m, a) => Math.max(m, a.length), 6);\n return Math.max(COL_MIN, longest * 9 + 40);\n }, [actors]);\n\n const totalW = SIDE_PAD * 2 + Math.max(1, actors.length) * colW;\n const totalH = HEADER_PAD + HEADER_H + 32 + messages.length * ROW_H + 48;\n\n const actorX = (name: string) => {\n const idx = actors.indexOf(name);\n if (idx < 0) return SIDE_PAD + colW / 2;\n return SIDE_PAD + idx * colW + colW / 2;\n };\n const msgY = (idx: number) => HEADER_PAD + HEADER_H + 40 + idx * ROW_H;\n\n const pushHistory = useCallback((m: DiagramModel) => {\n const stack = historyRef.current.slice(0, historyIdxRef.current + 1);\n stack.push(m);\n if (stack.length > 80) stack.shift();\n historyRef.current = stack;\n historyIdxRef.current = stack.length - 1;\n }, []);\n\n const applyAndPush = useCallback((m: DiagramModel) => {\n setModel(m); onChange?.(m); pushHistory(m);\n }, [onChange, pushHistory]);\n\n const undo = useCallback(() => {\n if (historyIdxRef.current <= 0) return;\n historyIdxRef.current--;\n const m = historyRef.current[historyIdxRef.current];\n setModel(m); onChange?.(m);\n }, [onChange]);\n\n const redo = useCallback(() => {\n if (historyIdxRef.current >= historyRef.current.length - 1) return;\n historyIdxRef.current++;\n const m = historyRef.current[historyIdxRef.current];\n setModel(m); onChange?.(m);\n }, [onChange]);\n\n const addActor = () => {\n const name = `Actor${actors.length + 1}`;\n applyAndPush({ ...model, actors: [...actors, name] });\n };\n\n const renameActor = (oldName: string, newName: string) => {\n if (!newName || newName === oldName || actors.includes(newName)) return;\n applyAndPush({\n ...model,\n actors: actors.map(a => a === oldName ? newName : a),\n messages: messages.map(m => ({\n ...m,\n from: m.from === oldName ? newName : m.from,\n to: m.to === oldName ? newName : m.to,\n })),\n });\n };\n\n const removeActor = (name: string) => {\n applyAndPush({\n ...model,\n actors: actors.filter(a => a !== name),\n messages: messages.filter(m => m.from !== name && m.to !== name),\n });\n };\n\n const addMessage = () => {\n if (actors.length < 1) {\n // Need at least one actor; create a sensible default pair.\n const a = `Actor${actors.length + 1}`;\n const b = `Actor${actors.length + 2}`;\n applyAndPush({\n ...model,\n actors: [...actors, a, b],\n messages: [...messages, { id: nextId('m', messages), from: a, to: b, label: 'message', style: 'solid' }],\n });\n return;\n }\n const from = actors[0];\n const to = actors[Math.min(1, actors.length - 1)] ?? from;\n applyAndPush({\n ...model,\n messages: [...messages, { id: nextId('m', messages), from, to, label: 'message', style: 'solid' }],\n });\n };\n\n const updateMessage = (id: string, patch: Partial<SequenceMessage>) => {\n applyAndPush({\n ...model,\n messages: messages.map(m => m.id === id ? { ...m, ...patch } : m),\n });\n };\n\n const removeMessage = (id: string) => {\n applyAndPush({ ...model, messages: messages.filter(m => m.id !== id) });\n if (selected === id) setSelected(null);\n };\n\n const reorderMessage = useCallback((id: string, toIdx: number) => {\n const fromIdx = messages.findIndex(m => m.id === id);\n if (fromIdx < 0 || toIdx === fromIdx) return;\n const next = messages.slice();\n const [moved] = next.splice(fromIdx, 1);\n next.splice(toIdx, 0, moved);\n applyAndPush({ ...model, messages: next });\n }, [messages, model, applyAndPush]);\n\n // ── Keyboard ────────────────────────────────────────────────────────────\n const keyCommands: KeyCommand[] = [\n { match: e => (e.ctrlKey || e.metaKey) && e.key === 'z', run: () => { undo(); return true; } },\n { match: e => (e.ctrlKey || e.metaKey) && (e.key === 'y' || (e.shiftKey && e.key === 'z')), run: () => { redo(); return true; } },\n { match: e => e.key === 'Escape', run: () => { setSelected(null); setEditingId(null); return true; } },\n { match: e => (e.key === 'Delete' || e.key === 'Backspace') && !!selected, run: () => { removeMessage(selected!); return true; } },\n ];\n useEditorKeyboard(keyCommands, [undo, redo, selected]);\n\n // ── Export / import ─────────────────────────────────────────────────────\n const handleExport = useExporters(model, onExport, 'sequence', (msg) => showToast(msg, 'success'));\n const handleImport = useImporter(applyAndPush, {\n expectedType: 'sequence',\n transform: ensureSequenceModel,\n onSuccess: (msg) => showToast(msg, 'success'),\n onError: (msg) => showToast(msg, 'error'),\n });\n\n // ── Drag-to-reorder ─────────────────────────────────────────────────────\n // Mousedown seeds drag state but does NOT mark it active — that flips on\n // first move past DRAG_THRESHOLD so a click doesn't reorder. We mutate the\n // model exactly once on mouseup; intermediate moves only update preview\n // state, so the history stack stays clean and rows can't cascade.\n const onRowMouseDown = (e: React.MouseEvent, id: string) => {\n const tag = (e.target as HTMLElement).tagName;\n if (tag === 'INPUT' || tag === 'BUTTON' || tag === 'SELECT') return;\n const idx = messages.findIndex(m => m.id === id);\n if (idx < 0) return;\n e.preventDefault();\n setSelected(id);\n setDrag({ id, startY: e.clientY, originalIdx: idx, targetIdx: idx, active: false });\n };\n\n useEffect(() => {\n if (!drag) return;\n const baseY = HEADER_PAD + HEADER_H + 40;\n const onMove = (ev: MouseEvent) => {\n const dy = ev.clientY - drag.startY;\n if (!drag.active && Math.abs(dy) < DRAG_THRESHOLD) return;\n const svg = svgRef.current;\n if (!svg) return;\n const rect = svg.getBoundingClientRect();\n const yInSvg = ev.clientY - rect.top;\n const raw = Math.floor((yInSvg - baseY + ROW_H / 2) / ROW_H);\n const next = Math.max(0, Math.min(messages.length - 1, raw));\n if (next === drag.targetIdx && drag.active) return;\n setDrag({ ...drag, active: true, targetIdx: next });\n };\n const onUp = () => {\n if (drag.active && drag.targetIdx !== drag.originalIdx) {\n reorderMessage(drag.id, drag.targetIdx);\n }\n setDrag(null);\n };\n window.addEventListener('mousemove', onMove);\n window.addEventListener('mouseup', onUp);\n return () => {\n window.removeEventListener('mousemove', onMove);\n window.removeEventListener('mouseup', onUp);\n };\n }, [drag, messages.length, reorderMessage]);\n\n // ── Render ──────────────────────────────────────────────────────────────\n const selectedMsg = selected ? messages.find(m => m.id === selected) : null;\n\n return (\n <div className=\"fsd-seq-editor\" style={{\n display: 'flex', flexDirection: 'column', height, width: '100%',\n fontFamily: 'ui-sans-serif,system-ui,sans-serif', background: t.ctrlsBg,\n position: 'relative',\n }}>\n <ToastContainer toasts={toasts} onDismiss={dismissToast} />\n <style>{`\n .fsd-seq-editor [role=\"button\"]:focus-visible {\n outline: 2px solid ${t.actorText};\n outline-offset: 2px;\n }\n .fsd-seq-editor button:focus-visible,\n .fsd-seq-editor input:focus-visible {\n outline: 2px solid ${t.actorText};\n outline-offset: 2px;\n border-radius: 4px;\n }\n `}</style>\n <Toolbar onExport={handleExport} onImport={allowImport ? handleImport : undefined} allowedExports={allowedExports} allowImport={allowImport} />\n\n {/* Controls */}\n <div style={{\n display: 'flex', gap: 8, padding: '7px 14px',\n background: t.ctrlsBg, borderBottom: `1px solid ${t.ctrlsBorder}`,\n alignItems: 'center', flexWrap: 'wrap',\n }}>\n <button onClick={addActor} style={primaryBtn()}>+ Actor</button>\n <button onClick={addMessage} style={primaryBtn()}>+ Message</button>\n <div style={{ width: 1, height: 18, background: t.ctrlsBorder, margin: '0 4px' }} />\n <button onClick={undo} style={ghostBtn(t)} title=\"Undo (Ctrl+Z)\">↶</button>\n <button onClick={redo} style={ghostBtn(t)} title=\"Redo (Ctrl+Y)\">↷</button>\n <span style={{ marginLeft: 'auto', fontSize: 11, color: t.textMuted }}>\n {actors.length} actor{actors.length === 1 ? '' : 's'} · {messages.length} message{messages.length === 1 ? '' : 's'} · drag a row to reorder\n </span>\n </div>\n\n <div style={{ flex: 1, display: 'flex', overflow: 'hidden' }}>\n {/* Canvas */}\n <div style={{ flex: 1, overflow: 'auto', background: t.canvas, position: 'relative' }}>\n <SequenceCanvas\n model={model} actors={actors} messages={messages}\n t={t} isDark={isDark}\n colW={colW} totalW={totalW} totalH={totalH}\n actorX={actorX} msgY={msgY}\n selected={selected} editingId={editingId} setEditingId={setEditingId}\n drag={drag} onRowMouseDown={onRowMouseDown}\n renameActor={renameActor} removeActor={removeActor}\n svgRef={svgRef}\n />\n </div>\n\n {/* Side panel */}\n {selectedMsg && (\n <div style={{\n width: 280, maxWidth: '40vw', flexShrink: 0,\n background: t.panelBg, borderLeft: `1px solid ${t.panelBorder}`,\n padding: '14px 16px', overflowY: 'auto',\n }}>\n <div style={{ fontSize: 10, fontWeight: 700, color: t.textMuted, textTransform: 'uppercase', letterSpacing: 0.7, marginBottom: 10 }}>Message</div>\n\n <Label t={t}>Label</Label>\n <input\n value={editLabel || selectedMsg.label}\n onChange={(e) => setEditLabel(e.target.value)}\n onFocus={() => setEditLabel(selectedMsg.label)}\n onBlur={() => { if (editLabel && editLabel !== selectedMsg.label) updateMessage(selectedMsg.id, { label: editLabel }); setEditLabel(''); }}\n onKeyDown={(e) => { if (e.key === 'Enter') (e.target as HTMLInputElement).blur(); }}\n style={input(t)}\n />\n\n <Label t={t}>From</Label>\n <select value={selectedMsg.from} onChange={(e) => updateMessage(selectedMsg.id, { from: e.target.value })} style={input(t)}>\n {actors.map(a => <option key={a} value={a}>{a}</option>)}\n </select>\n\n <Label t={t}>To</Label>\n <select value={selectedMsg.to} onChange={(e) => updateMessage(selectedMsg.id, { to: e.target.value })} style={input(t)}>\n {actors.map(a => <option key={a} value={a}>{a}</option>)}\n </select>\n\n <Label t={t}>Style</Label>\n <div style={{ display: 'flex', gap: 6 }}>\n {(['solid', 'dashed'] as const).map(s => (\n <button\n key={s}\n onClick={() => updateMessage(selectedMsg.id, { style: s })}\n style={{\n flex: 1, padding: '6px 10px',\n border: `1.5px solid ${selectedMsg.style === s || (!selectedMsg.style && s === 'solid') ? INDIGO : t.inputBorder}`,\n background: selectedMsg.style === s || (!selectedMsg.style && s === 'solid') ? INDIGO_SOFT : t.inputBg,\n color: selectedMsg.style === s || (!selectedMsg.style && s === 'solid') ? INDIGO : t.textPrimary,\n borderRadius: 8, fontSize: 12, fontWeight: 600, cursor: 'pointer', fontFamily: 'inherit',\n }}\n >\n {s === 'solid' ? '── solid' : '─ ─ dashed'}\n </button>\n ))}\n </div>\n\n <div style={{ height: 14 }} />\n <button\n onClick={() => removeMessage(selectedMsg.id)}\n style={{ ...ghostBtn(t), width: '100%', color: '#ef4444', border: `1px solid ${isDark ? '#7f1d1d' : '#fca5a5'}` }}\n >Delete message</button>\n </div>\n )}\n </div>\n\n <div style={{\n padding: '4px 14px', fontSize: 11, color: t.textMuted, background: t.canvas,\n borderTop: `1px solid ${t.ctrlsBorder}`, display: 'flex', gap: 16,\n }}>\n <span>{actors.length} actors</span>\n <span>{messages.length} messages</span>\n <span style={{ marginLeft: 'auto' }}>double-click actor to rename · drag a row to reorder</span>\n </div>\n </div>\n );\n}\n\n\nfunction primaryBtn(): React.CSSProperties {\n return {\n padding: '6px 12px', background: INDIGO, color: '#fff', border: 'none',\n borderRadius: 8, cursor: 'pointer', fontSize: 12, fontWeight: 600, fontFamily: 'inherit',\n };\n}\nfunction ghostBtn(t: typeof lightTheme): React.CSSProperties {\n return {\n padding: '5px 10px', background: 'transparent', color: t.textSecondary,\n border: `1px solid ${t.ctrlsBorder}`, borderRadius: 7, cursor: 'pointer',\n fontSize: 12, fontWeight: 500, fontFamily: 'inherit',\n };\n}\nfunction input(t: typeof lightTheme): React.CSSProperties {\n return {\n width: '100%', boxSizing: 'border-box', padding: '6px 10px',\n border: `1.5px solid ${t.inputBorder}`, borderRadius: 7,\n background: t.inputBg, color: t.inputText, fontSize: 12,\n fontFamily: 'inherit', outline: 'none', marginBottom: 12,\n };\n}\n\nfunction Label({ t, children }: { t: typeof lightTheme; children: React.ReactNode }) {\n return (\n <div style={{ fontSize: 10, fontWeight: 700, color: t.textMuted, textTransform: 'uppercase', letterSpacing: 0.6, marginBottom: 4 }}>\n {children}\n </div>\n );\n}\n\n","import React, { useMemo } from 'react';\nimport type { DiagramModel, SequenceMessage } from '../core/types.js';\nimport type { SequenceThemeColors } from './SequenceEditor.js';\nimport { shadowColor as themeShadow } from './theme.js';\n\n// Layout constants (mirrored from SequenceEditor for now — shared reference).\nconst HEADER_H = 64;\nconst HEADER_PAD = 24;\nconst ROW_H = 64;\nconst SIDE_PAD = 40;\n\nconst INDIGO = '#4f46e5';\nconst INDIGO_SOFT = '#eef2ff';\n\n// Hoisted static styles.\nconst STYLE_SEQ_GRAB: React.CSSProperties = { cursor: 'grab' };\nconst STYLE_SEQ_GRABBING: React.CSSProperties = { cursor: 'grabbing' };\nconst STYLE_SEQ_ACTOR_TEXT: React.CSSProperties = { cursor: 'pointer', userSelect: 'none' };\nconst STYLE_SEQ_REMOVE_BTN: React.CSSProperties = { cursor: 'pointer' };\nconst STYLE_SEQ_REMOVE_ICON: React.CSSProperties = { pointerEvents: 'none', userSelect: 'none' };\nconst STYLE_SEQ_DRAGGING: React.CSSProperties = { opacity: 0.85 };\n\ninterface DragState {\n id: string;\n startY: number;\n originalIdx: number;\n targetIdx: number;\n active: boolean;\n}\n\nexport interface SequenceCanvasProps {\n model: DiagramModel;\n actors: string[];\n messages: SequenceMessage[];\n t: SequenceThemeColors;\n isDark: boolean;\n colW: number;\n totalW: number;\n totalH: number;\n actorX: (name: string) => number;\n msgY: (idx: number) => number;\n // Selection / editing\n selected: string | null;\n editingId: string | null;\n setEditingId: (id: string | null) => void;\n // Drag\n drag: DragState | null;\n onRowMouseDown: (e: React.MouseEvent, id: string) => void;\n // Actor actions\n renameActor: (oldName: string, newName: string) => void;\n removeActor: (name: string) => void;\n // Ref\n svgRef: React.RefObject<SVGSVGElement | null>;\n}\n\nfunction estimateW(text: string, pxPerChar = 7): number {\n return text.length * pxPerChar;\n}\n\n/**\n * SVG canvas layer of the sequence editor — lifelines, message arrows,\n * actor headers, and the dot-grid background. Extracted from\n * `SequenceEditor` so the orchestrator focuses on state + handlers.\n */\nexport function SequenceCanvas(props: SequenceCanvasProps) {\n const {\n model, actors, messages, t, isDark, colW, totalW, totalH, actorX, msgY,\n selected, editingId, setEditingId,\n drag, onRowMouseDown,\n renameActor, removeActor,\n svgRef,\n } = props;\n\n // Visual order during a drag: the dragged row is virtually relocated.\n const visualMessages = useMemo(() => {\n if (!drag?.active) return messages;\n const idx = messages.findIndex(m => m.id === drag.id);\n if (idx < 0) return messages;\n const next = messages.slice();\n const [moved] = next.splice(idx, 1);\n next.splice(drag.targetIdx, 0, moved);\n return next;\n }, [messages, drag]);\n\n if (actors.length === 0 && messages.length === 0) {\n return (\n <div style={{\n position: 'absolute', inset: 0, display: 'flex', flexDirection: 'column',\n alignItems: 'center', justifyContent: 'center', gap: 10,\n color: t.textMuted, pointerEvents: 'none',\n }}>\n <div style={{ fontSize: 36, opacity: 0.15, color: t.textPrimary }}>↔</div>\n <div style={{ fontSize: 13, fontWeight: 500 }}>\n Click <strong style={{ color: INDIGO }}>+ Actor</strong> then <strong style={{ color: INDIGO }}>+ Message</strong> to start\n </div>\n </div>\n );\n }\n\n return (\n <svg\n ref={svgRef as React.RefObject<SVGSVGElement>}\n width={totalW} height={totalH}\n style={{ display: 'block', cursor: drag?.active ? 'grabbing' : 'default', userSelect: 'none' }}\n >\n <defs>\n <pattern id=\"seqdots\" x=\"0\" y=\"0\" width=\"24\" height=\"24\" patternUnits=\"userSpaceOnUse\">\n <circle cx={12} cy={12} r={1.1} fill={t.dot} />\n </pattern>\n <filter id=\"seqShadow\" x=\"-20%\" y=\"-20%\" width=\"140%\" height=\"140%\">\n <feDropShadow dx={0} dy={3} stdDeviation={5} floodColor={themeShadow(isDark)} />\n </filter>\n <marker id=\"seqArrow\" markerWidth={9} markerHeight={7} refX={8.5} refY={3.5} orient=\"auto\" markerUnits=\"strokeWidth\">\n <path d=\"M0,0.5 L9,3.5 L0,6.5 L2.2,3.5 Z\" fill={t.arrow} />\n </marker>\n </defs>\n\n <rect width={totalW} height={totalH} fill=\"url(#seqdots)\" />\n\n {/* Lifelines */}\n {actors.map(name => {\n const x = actorX(name);\n const top = HEADER_PAD + HEADER_H;\n return (\n <line\n key={`life-${name}`}\n x1={x} x2={x}\n y1={top + 4} y2={totalH - 24}\n stroke={t.lifeline} strokeWidth={1.25} strokeDasharray=\"5 5\"\n />\n );\n })}\n\n {/* Messages */}\n {visualMessages.map((msg, idx) => {\n const y = msgY(idx);\n const fromX = actorX(msg.from);\n const toX = actorX(msg.to);\n const selectedHere = selected === msg.id;\n const isDragging = drag?.active && drag.id === msg.id;\n const isSelf = msg.from === msg.to;\n const stroke = selectedHere ? INDIGO : t.arrow;\n const dash = msg.style === 'dashed' ? '6,4' : undefined;\n const cursorStyle = drag?.active ? STYLE_SEQ_GRABBING : STYLE_SEQ_GRAB;\n const groupStyle = isDragging ? { ...cursorStyle, ...STYLE_SEQ_DRAGGING } : cursorStyle;\n\n if (isSelf) {\n const startX = fromX;\n const loopW = 36;\n const loopY = y - 6;\n const d = `M ${startX} ${loopY} C ${startX + loopW} ${loopY}, ${startX + loopW} ${loopY + 24}, ${startX} ${loopY + 24}`;\n return (\n <g key={msg.id} onMouseDown={(e) => onRowMouseDown(e, msg.id)} style={groupStyle}>\n {(selectedHere || isDragging) && (\n <rect x={SIDE_PAD - 8} y={y - 22} width={totalW - (SIDE_PAD - 8) * 2} height={ROW_H - 12} rx={10}\n fill={INDIGO_SOFT} opacity={isDark ? 0.18 : 0.6} />\n )}\n <path d={d} fill=\"none\" stroke={stroke} strokeWidth={1.5} strokeDasharray={dash} markerEnd=\"url(#seqArrow)\" />\n <text x={startX + loopW + 8} y={loopY + 16} fontSize={11} fill={selectedHere ? INDIGO : t.textPrimary} fontWeight={500}>\n {msg.label}\n </text>\n </g>\n );\n }\n\n const labelX = (fromX + toX) / 2;\n return (\n <g key={msg.id} onMouseDown={(e) => onRowMouseDown(e, msg.id)} style={groupStyle}>\n {(selectedHere || isDragging) && (\n <rect x={SIDE_PAD - 8} y={y - 22} width={totalW - (SIDE_PAD - 8) * 2} height={ROW_H - 12} rx={10}\n fill={INDIGO_SOFT} opacity={isDark ? 0.18 : 0.6} />\n )}\n <line x1={fromX} y1={y} x2={toX} y2={y} stroke={stroke} strokeWidth={1.5} strokeDasharray={dash} markerEnd=\"url(#seqArrow)\" />\n <rect x={labelX - estimateW(msg.label) / 2 - 6} y={y - 18} width={estimateW(msg.label) + 12} height={18} rx={6}\n fill={t.canvas} stroke={selectedHere ? INDIGO : t.cardBorder} strokeWidth={selectedHere ? 1.25 : 1} />\n <text x={labelX} y={y - 5} textAnchor=\"middle\" fontSize={11} fill={selectedHere ? INDIGO : t.textPrimary} fontWeight={500}>\n {msg.label}\n </text>\n </g>\n );\n })}\n\n {/* Actor headers */}\n {actors.map(name => {\n const x = actorX(name);\n const w = colW - 24;\n return (\n <g key={`hdr-${name}`}>\n <rect x={x - w / 2} y={HEADER_PAD} width={w} height={HEADER_H} rx={12}\n fill={t.actorFill} stroke={t.actorStroke} strokeWidth={1.25} filter=\"url(#seqShadow)\" />\n {editingId === name ? (\n <foreignObject x={x - w / 2 + 8} y={HEADER_PAD + 16} width={w - 16} height={32}>\n <input\n autoFocus\n defaultValue={name}\n onBlur={(e) => { renameActor(name, e.currentTarget.value.trim()); setEditingId(null); }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') { renameActor(name, (e.target as HTMLInputElement).value.trim()); setEditingId(null); }\n if (e.key === 'Escape') setEditingId(null);\n }}\n style={{\n width: '100%', height: '100%', border: 'none', borderRadius: 6,\n outline: `2px solid ${INDIGO}`, textAlign: 'center', fontSize: 13,\n fontWeight: 600, background: t.inputBg, color: t.inputText,\n boxSizing: 'border-box', padding: '0 6px', fontFamily: 'inherit',\n }}\n />\n </foreignObject>\n ) : (\n <text\n x={x} y={HEADER_PAD + HEADER_H / 2 + 4} textAnchor=\"middle\"\n fontSize={13} fontWeight={700} fill={t.actorText}\n role=\"button\"\n tabIndex={0}\n aria-label={`Actor ${name} — press Enter or F2 to rename`}\n style={STYLE_SEQ_ACTOR_TEXT}\n onDoubleClick={() => setEditingId(name)}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === 'F2') { e.preventDefault(); setEditingId(name); } }}\n >\n {name}\n </text>\n )}\n <circle\n cx={x + w / 2 - 12} cy={HEADER_PAD + 14} r={9}\n fill=\"transparent\"\n role=\"button\"\n tabIndex={0}\n aria-label={`Remove actor ${name}`}\n style={STYLE_SEQ_REMOVE_BTN}\n onClick={() => removeActor(name)}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); removeActor(name); } }}\n >\n <title>Remove actor {name}</title>\n </circle>\n <text x={x + w / 2 - 12} y={HEADER_PAD + 18} textAnchor=\"middle\" fontSize={12}\n fill={t.textMuted} style={STYLE_SEQ_REMOVE_ICON}>×</text>\n </g>\n );\n })}\n </svg>\n );\n}\n","import { useMemo } from 'react';\nimport { useIsDark } from './useSystemTheme.js';\n\n/**\n * Resolves the editor's effective theme tokens by merging the active\n * built-in palette with any caller-supplied `themeOverrides`. Both editors\n * accept light/dark/auto plus arbitrary partial overrides; this hook\n * centralizes the merge so the logic stays identical across editors and the\n * memoization key (isDark + overrides) is uniform.\n *\n * Generic over `T` so it works with `ThemeColors` (DiagramEditor) and\n * `SequenceThemeColors` (SequenceEditor) without duplication.\n *\n * @example\n * const { t, isDark } = useEditorTheme(theme, themeOverrides, { light: lightTheme, dark: darkTheme });\n */\nexport function useEditorTheme<T>(\n theme: 'light' | 'dark' | 'auto',\n overrides: Partial<T> | undefined,\n palettes: { light: T; dark: T },\n): { t: T; isDark: boolean } {\n const isDark = useIsDark(theme);\n const t = useMemo<T>(\n () => ({ ...(isDark ? palettes.dark : palettes.light), ...(overrides ?? {}) }),\n // palettes is a stable module-level constant in every caller, so it is\n // deliberately omitted from the dep array to keep the memo key tight.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [isDark, overrides],\n );\n return { t, isDark };\n}\n","import { useEffect, useState } from 'react';\n\n/**\n * Resolves `'auto'` to the OS's current `prefers-color-scheme` and updates\n * when it flips. Returns `true` for dark, `false` for light. `'light'` and\n * `'dark'` short-circuit to a constant value.\n */\nexport function useIsDark(theme: 'light' | 'dark' | 'auto'): boolean {\n const [sysDark, setSysDark] = useState<boolean>(() =>\n typeof window !== 'undefined'\n ? window.matchMedia('(prefers-color-scheme: dark)').matches\n : false,\n );\n useEffect(() => {\n if (theme !== 'auto' || typeof window === 'undefined') return;\n const mq = window.matchMedia('(prefers-color-scheme: dark)');\n const handler = (e: MediaQueryListEvent) => setSysDark(e.matches);\n mq.addEventListener('change', handler);\n return () => mq.removeEventListener('change', handler);\n }, [theme]);\n return theme === 'dark' || (theme === 'auto' && sysDark);\n}\n\n/**\n * Tracks the `(pointer: coarse)` media query. Returns `true` on touch-first\n * devices so callers can grow hit targets accordingly.\n */\nexport function useIsCoarsePointer(): boolean {\n const [coarse, setCoarse] = useState<boolean>(() =>\n typeof window !== 'undefined'\n ? window.matchMedia('(pointer: coarse)').matches\n : false,\n );\n useEffect(() => {\n if (typeof window === 'undefined') return;\n const mq = window.matchMedia('(pointer: coarse)');\n const handler = (e: MediaQueryListEvent) => setCoarse(e.matches);\n mq.addEventListener('change', handler);\n return () => mq.removeEventListener('change', handler);\n }, []);\n return coarse;\n}\n\n/**\n * Tracks the user's `prefers-reduced-motion` preference. Returns `true` if\n * the user has requested reduced motion. Listens for changes.\n */\nexport function usePrefersReducedMotion(): boolean {\n const [reduced, setReduced] = useState<boolean>(() =>\n typeof window !== 'undefined'\n ? window.matchMedia('(prefers-reduced-motion: reduce)').matches\n : false,\n );\n useEffect(() => {\n if (typeof window === 'undefined') return;\n const mq = window.matchMedia('(prefers-reduced-motion: reduce)');\n const handler = (e: MediaQueryListEvent) => setReduced(e.matches);\n mq.addEventListener('change', handler);\n return () => mq.removeEventListener('change', handler);\n }, []);\n return reduced;\n}\n","import { useCallback } from 'react';\nimport type { DiagramModel, ExportFormat } from '../../core/types.js';\nimport { toMermaid } from '../../exporters/mermaid.js';\nimport { toPlantUML } from '../../exporters/plantuml.js';\nimport { toJSON } from '../../exporters/json.js';\nimport { toSVG, toPNG } from '../../exporters/svg.js';\n\n/**\n * Returns a single `handleExport(format)` callback that runs the requested\n * exporter against `model`. If the caller provided `onExport`, the resulting\n * content is handed off to them. Otherwise the hook triggers a browser\n * download with `filename.<ext>` (with `.puml` substituted for PlantUML).\n *\n * Both editors used to inline this switch; centralizing it keeps export\n * behavior identical and makes adding a new format a one-file change.\n *\n * @param model The diagram to export.\n * @param onExport Optional caller-supplied sink. If omitted, a download is triggered.\n * @param filename Base filename for the download (default `\"diagram\"`). Diagram and\n * sequence editors override to `\"diagram\"` / `\"sequence\"` respectively.\n * @param onSuccess Optional callback fired after a successful export (e.g., for toast).\n */\nexport function useExporters(\n model: DiagramModel,\n onExport: ((format: ExportFormat, content: string | Blob) => void) | undefined,\n filename: string = 'diagram',\n onSuccess?: (message: string) => void,\n): (format: ExportFormat) => Promise<void> {\n return useCallback(async (format: ExportFormat) => {\n let content: string | Blob;\n switch (format) {\n case 'mermaid': content = toMermaid(model); break;\n case 'plantuml': content = toPlantUML(model); break;\n case 'json': content = toJSON(model); break;\n case 'svg': content = toSVG(model); break;\n case 'png': content = await toPNG(model); break;\n default: return;\n }\n if (onExport) { onExport(format, content); onSuccess?.(`Exported as ${format.toUpperCase()}`); return; }\n const url = content instanceof Blob\n ? URL.createObjectURL(content)\n : URL.createObjectURL(new Blob([content], { type: 'text/plain' }));\n const a = document.createElement('a');\n a.href = url;\n a.download = `${filename}.${format === 'plantuml' ? 'puml' : format}`;\n a.click();\n URL.revokeObjectURL(url);\n onSuccess?.(`Downloaded ${a.download}`);\n }, [model, onExport, filename, onSuccess]);\n}\n","import type { DiagramModel, DiagramNode, DiagramEdge, SequenceMessage } from '../core/types.js';\n\nconst SHAPE_OPEN: Record<string, string> = {\n rectangle: '[',\n diamond: '{',\n circle: '((',\n parallelogram: '[/',\n};\nconst SHAPE_CLOSE: Record<string, string> = {\n rectangle: ']',\n diamond: '}',\n circle: '))',\n parallelogram: '/]',\n};\n\nfunction formatNode(node: DiagramNode): string {\n const shape = node.shape ?? 'rectangle';\n const open = SHAPE_OPEN[shape] ?? '[';\n const close = SHAPE_CLOSE[shape] ?? ']';\n return ` ${node.id}${open}\"${node.label}\"${close}`;\n}\n\nfunction edgeArrow(edge: DiagramEdge): string {\n const style = edge.style ?? 'solid';\n const arrowhead = edge.arrowhead ?? 'arrow';\n // Mermaid flowcharts only have solid and dashed; dotted collapses to dashed.\n if (style === 'dashed' || style === 'dotted') return arrowhead === 'none' ? '-.-' : '-.->';\n return arrowhead === 'none' ? '---' : '-->';\n}\n\nfunction formatEdge(edge: DiagramEdge): string {\n const arrow = edgeArrow(edge);\n return edge.label\n ? ` ${edge.from} ${arrow}|\"${edge.label}\"| ${edge.to}`\n : ` ${edge.from} ${arrow} ${edge.to}`;\n}\n\nfunction exportFlowchart(model: DiagramModel): string {\n const lines: string[] = ['graph TD'];\n if (model.title) lines.unshift(`---\\ntitle: ${model.title}\\n---`);\n for (const node of model.nodes) lines.push(formatNode(node));\n for (const edge of model.edges) lines.push(formatEdge(edge));\n return lines.join('\\n');\n}\n\nfunction msgArrow(msg: SequenceMessage): string {\n return msg.style === 'dashed' ? '-->>' : '->>';\n}\n\nfunction exportSequence(model: DiagramModel): string {\n const lines: string[] = ['sequenceDiagram'];\n if (model.title) lines.unshift(`---\\ntitle: ${model.title}\\n---`);\n for (const actor of (model.actors ?? [])) lines.push(` participant ${actor}`);\n for (const msg of (model.messages ?? [])) {\n lines.push(` ${msg.from}${msgArrow(msg)}${msg.to}: ${msg.label}`);\n }\n return lines.join('\\n');\n}\n\n/**\n * Serialize a `DiagramModel` to Mermaid source. Dispatches between\n * `graph TD` (flowchart) and `sequenceDiagram` based on `model.type`.\n *\n * **Round-trip notes (flowchart):**\n * - Node shapes `rectangle`, `diamond`, `circle`, `parallelogram` map to\n * `[ ]`, `{ }`, `(( ))`, `[/ /]` respectively.\n * - Edge style `solid` → `-->`, `dashed` and `dotted` → `-.->` (Mermaid\n * collapses dotted to dashed). `arrowhead: 'none'` strips the head.\n * - `waypoint`, `metadata`, and `variant` are **dropped** — Mermaid has no\n * way to encode routing or arbitrary metadata.\n *\n * **Round-trip notes (sequence):**\n * - Message style `solid` → `->>`, `dashed` → `-->>`.\n */\nexport function toMermaid(model: DiagramModel): string {\n return model.type === 'sequence' ? exportSequence(model) : exportFlowchart(model);\n}\n","import type { DiagramModel, DiagramNode, DiagramEdge, SequenceMessage } from '../core/types.js';\n\nfunction nodeShape(node: DiagramNode): [string, string] {\n switch (node.shape) {\n case 'diamond': return ['<>', '<>'];\n case 'circle': return ['(', ')'];\n case 'parallelogram': return ['/', '/'];\n default: return ['[', ']'];\n }\n}\n\nfunction exportFlowchart(model: DiagramModel): string {\n const lines: string[] = ['@startuml'];\n if (model.title) lines.push(`title ${model.title}`);\n lines.push('');\n\n for (const node of model.nodes) {\n const [open, close] = nodeShape(node);\n lines.push(`state \"${node.label}\" as ${node.id} ${open}${close}`);\n }\n lines.push('');\n\n for (const edge of model.edges) {\n const arrow = edge.style === 'dashed' ? '-[dashed]->'\n : edge.style === 'dotted' ? '-[dotted]->'\n : '-->';\n const label = edge.label ? ` : ${edge.label}` : '';\n lines.push(`${edge.from} ${arrow} ${edge.to}${label}`);\n }\n\n lines.push('@enduml');\n return lines.join('\\n');\n}\n\nfunction msgArrow(msg: SequenceMessage): string {\n return msg.style === 'dashed' ? '-->' : '->';\n}\n\nfunction exportSequence(model: DiagramModel): string {\n const lines: string[] = ['@startuml'];\n if (model.title) lines.push(`title ${model.title}`);\n lines.push('');\n\n for (const actor of (model.actors ?? [])) {\n lines.push(`participant ${actor}`);\n }\n lines.push('');\n\n for (const msg of (model.messages ?? [])) {\n lines.push(`${msg.from} ${msgArrow(msg)} ${msg.to} : ${msg.label}`);\n }\n\n lines.push('@enduml');\n return lines.join('\\n');\n}\n\n/**\n * Serialize a `DiagramModel` to PlantUML source. Dispatches between the\n * state-diagram form (flowchart) and the sequence-diagram form based on\n * `model.type`.\n *\n * **Round-trip notes (flowchart):**\n * - Edge style maps `solid` → `-->`, `dashed` → `-[dashed]->`,\n * `dotted` → `-[dotted]->`.\n * - Node shapes are emitted via the `state \"..\" as id < >` syntax; some\n * shape information is lossy (PlantUML state diagrams don't distinguish\n * every shape this package supports).\n * - `waypoint`, `metadata`, and `variant` are **dropped**.\n *\n * **Round-trip notes (sequence):**\n * - Actor order is preserved; message style `solid` → `->`, `dashed` → `-->`.\n */\nexport function toPlantUML(model: DiagramModel): string {\n return model.type === 'sequence' ? exportSequence(model) : exportFlowchart(model);\n}\n","import type { DiagramModel } from '../core/types.js';\n\n/**\n * Serialize a `DiagramModel` to pretty-printed JSON. This is the canonical\n * round-trip format: every field — including `variant`, `waypoint`,\n * `metadata.group`, and `metadata.answers` — survives a round trip through\n * `toJSON` + `fromJSON` unchanged.\n */\nexport function toJSON(model: DiagramModel): string {\n return JSON.stringify(model, null, 2);\n}\n","import type { DiagramModel, DiagramNode, DiagramEdge } from '../core/types.js';\n\n// Layout constants — kept in sync with src/ui/DiagramEditor.tsx\nconst NODE_H = 48;\nconst Q_BASE_H = 68;\nconst Q_ANS_ROW_H = 80;\nconst Q_CARD_PAD = 8;\nconst MIN_NODE_W = 120;\nconst MAX_NODE_W = 320;\nconst MIN_Q_W = 220;\nconst PADDING = 48;\nconst H_GAP = 80;\nconst V_GAP = 96;\n\nfunction estimateTextW(text: string, pxPerChar = 7.5): number {\n return text.length * pxPerChar;\n}\n\nfunction nodeWidth(label: string): number {\n return Math.min(MAX_NODE_W, Math.max(MIN_NODE_W, Math.ceil(estimateTextW(label) + 48)));\n}\n\nfunction answerCardW(ans: string): number {\n return Math.max(86, Math.ceil(Math.max(estimateTextW(ans, 7.5) + 20, 56) + 32));\n}\n\nfunction questionNodeW(node: DiagramNode): number {\n const answers = (node.metadata?.answers as string[] | undefined) ?? [];\n const headerW = estimateTextW(node.label, 8) + 80;\n if (answers.length === 0) return Math.max(MIN_Q_W, Math.ceil(headerW));\n const cardsW = answers.reduce((s, a) => s + answerCardW(a), 0)\n + (answers.length - 1) * Q_CARD_PAD + 2 * Q_CARD_PAD;\n return Math.max(MIN_Q_W, Math.ceil(Math.max(headerW, cardsW)));\n}\n\nfunction questionNodeH(answers: string[]): number {\n return Q_BASE_H + (answers.length === 0 ? 48 : Q_ANS_ROW_H);\n}\n\nfunction bezierPath(x1: number, y1: number, x2: number, y2: number): string {\n const dy = y2 - y1;\n const dyAbs = Math.abs(dy);\n const dxAbs = Math.abs(x2 - x1);\n const base = dy > 0 ? dyAbs * 0.55 : Math.max(90, dyAbs * 0.5 + dxAbs * 0.28);\n const curve = Math.max(36, Math.min(220, base));\n return `M ${x1} ${y1} C ${x1} ${y1 + curve}, ${x2} ${y2 - curve}, ${x2} ${y2}`;\n}\n\ninterface LayoutBox { x: number; y: number; w: number; h: number }\n\nfunction isQuestion(node: DiagramNode, variant: DiagramModel['variant']): boolean {\n return variant === 'question' && !!node.metadata?.answers;\n}\n\n/** Honor x/y on nodes if present; otherwise BFS-layer fallback. */\nfunction computeLayout(model: DiagramModel): Map<string, LayoutBox> {\n const boxes = new Map<string, LayoutBox>();\n const sized = model.nodes.map(n => {\n const w = isQuestion(n, model.variant) ? questionNodeW(n) : nodeWidth(n.label);\n const h = isQuestion(n, model.variant)\n ? questionNodeH((n.metadata?.answers as string[] | undefined) ?? [])\n : NODE_H;\n return { node: n, w, h };\n });\n\n const allPositioned = sized.every(s => typeof s.node.x === 'number' && typeof s.node.y === 'number');\n if (allPositioned) {\n for (const s of sized) {\n boxes.set(s.node.id, { x: s.node.x as number, y: s.node.y as number, w: s.w, h: s.h });\n }\n return boxes;\n }\n\n // BFS-layer fallback for un-positioned graphs (e.g. fresh imports).\n const inDeg = new Map(model.nodes.map(n => [n.id, 0]));\n for (const e of model.edges) inDeg.set(e.to, (inDeg.get(e.to) ?? 0) + 1);\n\n const layers = new Map<string, number>();\n const queue = model.nodes.filter(n => (inDeg.get(n.id) ?? 0) === 0).map(n => n.id);\n for (const id of queue) layers.set(id, 0);\n let head = 0;\n while (head < queue.length) {\n const cur = queue[head++];\n const layer = layers.get(cur) ?? 0;\n for (const e of model.edges) {\n if (e.from === cur) {\n const next = layers.get(e.to) ?? -1;\n if (next < layer + 1) {\n layers.set(e.to, layer + 1);\n queue.push(e.to);\n }\n }\n }\n }\n model.nodes.forEach(n => { if (!layers.has(n.id)) layers.set(n.id, 0); });\n\n const byLayer = new Map<number, typeof sized>();\n for (const s of sized) {\n const layer = layers.get(s.node.id) ?? 0;\n if (!byLayer.has(layer)) byLayer.set(layer, []);\n byLayer.get(layer)!.push(s);\n }\n\n let y = PADDING;\n for (const layer of [...byLayer.keys()].sort((a, b) => a - b)) {\n const row = byLayer.get(layer)!;\n let x = PADDING;\n let maxH = 0;\n for (const s of row) {\n boxes.set(s.node.id, { x, y, w: s.w, h: s.h });\n x += s.w + H_GAP;\n maxH = Math.max(maxH, s.h);\n }\n y += maxH + V_GAP;\n }\n return boxes;\n}\n\nfunction escapeXML(s: string): string {\n return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n}\n\n// Match canvas: indigo/slate palette, light theme by default.\nconst COLORS = {\n bg: '#fafbfc',\n dot: '#dbe3ee',\n nodeFill: '#ffffff',\n nodeStroke: '#cbd5e1',\n edge: '#94a3b8',\n text: '#1e293b',\n textSub: '#94a3b8',\n amber: '#d97706',\n amberSoft: '#fef9ee',\n amberLine: '#fde68a',\n amberCardBg: '#fffdf7',\n};\n\nfunction renderStandardNode(node: DiagramNode, box: LayoutBox): string {\n const cx = box.x + box.w / 2;\n const cy = box.y + box.h / 2;\n const shape = node.shape ?? 'rectangle';\n const label = `<text x=\"${cx}\" y=\"${cy + 4.5}\" text-anchor=\"middle\" font-family=\"ui-sans-serif,system-ui,-apple-system,sans-serif\" font-size=\"13\" font-weight=\"500\" fill=\"${COLORS.text}\">${escapeXML(node.label)}</text>`;\n\n let shapeEl = '';\n if (shape === 'diamond') {\n const pts = `${cx},${box.y} ${box.x + box.w},${cy} ${cx},${box.y + box.h} ${box.x},${cy}`;\n shapeEl = `<polygon points=\"${pts}\" fill=\"${COLORS.nodeFill}\" stroke=\"${COLORS.nodeStroke}\" stroke-width=\"1.25\" filter=\"url(#nodeShadow)\"/>`;\n } else if (shape === 'circle') {\n const r = Math.min(box.w, box.h) / 2 - 1;\n shapeEl = `<circle cx=\"${cx}\" cy=\"${cy}\" r=\"${r}\" fill=\"${COLORS.nodeFill}\" stroke=\"${COLORS.nodeStroke}\" stroke-width=\"1.25\" filter=\"url(#nodeShadow)\"/>`;\n } else if (shape === 'parallelogram') {\n const pts = `${box.x + 14},${box.y} ${box.x + box.w},${box.y} ${box.x + box.w - 14},${box.y + box.h} ${box.x},${box.y + box.h}`;\n shapeEl = `<polygon points=\"${pts}\" fill=\"${COLORS.nodeFill}\" stroke=\"${COLORS.nodeStroke}\" stroke-width=\"1.25\" filter=\"url(#nodeShadow)\"/>`;\n } else {\n shapeEl = `<rect x=\"${box.x}\" y=\"${box.y}\" width=\"${box.w}\" height=\"${box.h}\" rx=\"14\" fill=\"${COLORS.nodeFill}\" stroke=\"${COLORS.nodeStroke}\" stroke-width=\"1.25\" filter=\"url(#nodeShadow)\"/>`;\n }\n return shapeEl + label;\n}\n\nfunction renderQuestionNode(node: DiagramNode, box: LayoutBox): string {\n const answers = (node.metadata?.answers as string[] | undefined) ?? [];\n const clipId = `qhdr-${node.id.replace(/[^a-zA-Z0-9_-]/g, '_')}`;\n const x = box.x, y = box.y, w = box.w, h = box.h;\n const parts: string[] = [];\n\n // Card body\n parts.push(`<rect x=\"${x}\" y=\"${y}\" width=\"${w}\" height=\"${h}\" rx=\"14\" fill=\"${COLORS.nodeFill}\" stroke=\"${COLORS.amberLine}\" stroke-width=\"1.5\" filter=\"url(#nodeShadow)\"/>`);\n\n // Header tint (clipped to top rounded corners)\n parts.push(`<defs><clipPath id=\"${clipId}\"><rect x=\"${x}\" y=\"${y}\" width=\"${w}\" height=\"${Q_BASE_H}\" rx=\"14\"/></clipPath></defs>`);\n parts.push(`<rect x=\"${x}\" y=\"${y}\" width=\"${w}\" height=\"${Q_BASE_H}\" fill=\"${COLORS.amberSoft}\" clip-path=\"url(#${clipId})\"/>`);\n\n // Amber left accent\n parts.push(`<rect x=\"${x}\" y=\"${y}\" width=\"4\" height=\"${Q_BASE_H}\" rx=\"2\" fill=\"${COLORS.amber}\"/>`);\n\n // ? badge\n parts.push(`<rect x=\"${x + 12}\" y=\"${y + 14}\" width=\"28\" height=\"28\" rx=\"8\" fill=\"${COLORS.amber}\"/>`);\n parts.push(`<text x=\"${x + 26}\" y=\"${y + 33}\" text-anchor=\"middle\" font-size=\"15\" font-weight=\"900\" fill=\"white\">?</text>`);\n\n // QUESTION label + node label\n parts.push(`<text x=\"${x + 50}\" y=\"${y + 27}\" font-family=\"ui-sans-serif,system-ui,sans-serif\" font-size=\"9\" font-weight=\"700\" fill=\"${COLORS.textSub}\" letter-spacing=\"0.6\">QUESTION</text>`);\n parts.push(`<text x=\"${x + 50}\" y=\"${y + 42}\" font-family=\"ui-sans-serif,system-ui,sans-serif\" font-size=\"13\" font-weight=\"700\" fill=\"${COLORS.text}\">${escapeXML(node.label)}</text>`);\n\n // Divider\n parts.push(`<line x1=\"${x}\" y1=\"${y + Q_BASE_H}\" x2=\"${x + w}\" y2=\"${y + Q_BASE_H}\" stroke=\"${COLORS.amberLine}\" stroke-width=\"1\"/>`);\n\n if (answers.length === 0) {\n parts.push(`<text x=\"${x + w / 2}\" y=\"${y + Q_BASE_H + 22}\" text-anchor=\"middle\" font-size=\"10\" fill=\"${COLORS.amber}\" opacity=\"0.4\" font-weight=\"600\">No answers yet</text>`);\n } else {\n const letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n answers.forEach((ans, i) => {\n const prevW = answers.slice(0, i).reduce((s, a) => s + answerCardW(a) + Q_CARD_PAD, 0);\n const cW = answerCardW(ans);\n const cardX = x + Q_CARD_PAD + prevW;\n const cardY = y + Q_BASE_H + 7;\n const cardH = Q_ANS_ROW_H - 20;\n const cx = cardX + cW / 2;\n const letter = i < 26 ? letters[i] : `${i + 1}`;\n const maxChars = Math.max(2, Math.floor((cW - 20) / 7.5));\n const displayAns = ans.length > maxChars ? ans.slice(0, maxChars - 1) + '…' : ans;\n\n parts.push(`<rect x=\"${cardX}\" y=\"${cardY}\" width=\"${cW}\" height=\"${cardH}\" rx=\"8\" fill=\"${COLORS.amberCardBg}\" stroke=\"${COLORS.amberLine}\" stroke-width=\"1\"/>`);\n parts.push(`<rect x=\"${cx - 11}\" y=\"${cardY + 7}\" width=\"22\" height=\"22\" rx=\"6\" fill=\"#fef3c7\"/>`);\n parts.push(`<text x=\"${cx}\" y=\"${cardY + 22}\" text-anchor=\"middle\" font-size=\"10\" font-weight=\"800\" fill=\"${COLORS.amber}\">${escapeXML(letter)}</text>`);\n parts.push(`<text x=\"${cx}\" y=\"${cardY + 46}\" text-anchor=\"middle\" font-size=\"11\" font-weight=\"500\" fill=\"#374151\" font-family=\"ui-sans-serif,system-ui,sans-serif\">${escapeXML(displayAns)}</text>`);\n });\n }\n\n return parts.join('');\n}\n\nfunction renderEdge(edge: DiagramEdge, boxes: Map<string, LayoutBox>, variant: DiagramModel['variant'], nodes: DiagramNode[]): string {\n const fromBox = boxes.get(edge.from);\n const toBox = boxes.get(edge.to);\n if (!fromBox || !toBox) return '';\n\n let x1: number, y1: number;\n const fromNode = nodes.find(n => n.id === edge.from);\n\n if (fromNode && isQuestion(fromNode, variant)) {\n const answers = (fromNode.metadata?.answers as string[] | undefined) ?? [];\n const idx = answers.indexOf(edge.label ?? '');\n if (idx >= 0) {\n const prevW = answers.slice(0, idx).reduce((s, a) => s + answerCardW(a) + Q_CARD_PAD, 0);\n const cW = answerCardW(answers[idx]);\n x1 = fromBox.x + Q_CARD_PAD + prevW + cW / 2;\n y1 = fromBox.y + Q_BASE_H + Q_ANS_ROW_H - 8;\n } else {\n x1 = fromBox.x + fromBox.w / 2;\n y1 = fromBox.y + fromBox.h;\n }\n } else {\n x1 = fromBox.x + fromBox.w / 2;\n y1 = fromBox.y + fromBox.h;\n }\n const x2 = toBox.x + toBox.w / 2;\n const y2 = toBox.y;\n\n const dash = edge.style === 'dashed' ? ' stroke-dasharray=\"6,4\"'\n : edge.style === 'dotted' ? ' stroke-dasharray=\"2,3\"' : '';\n const marker = edge.arrowhead === 'none' ? '' : ' marker-end=\"url(#arrow)\"';\n const d = bezierPath(x1, y1, x2, y2);\n\n let out = `<path d=\"${d}\" fill=\"none\" stroke=\"${COLORS.edge}\" stroke-width=\"1.5\"${dash}${marker}/>`;\n\n if (edge.label) {\n const midX = (x1 + x2) / 2;\n const midY = (y1 + y2) / 2;\n const labelW = estimateTextW(edge.label, 7) + 14;\n out += `<rect x=\"${midX - labelW / 2}\" y=\"${midY - 11}\" width=\"${labelW}\" height=\"18\" rx=\"9\" fill=\"${COLORS.bg}\" stroke=\"${COLORS.nodeStroke}\" stroke-width=\"1\"/>`;\n out += `<text x=\"${midX}\" y=\"${midY + 2}\" text-anchor=\"middle\" font-family=\"ui-sans-serif,system-ui,sans-serif\" font-size=\"11\" fill=\"${COLORS.text}\">${escapeXML(edge.label)}</text>`;\n }\n return out;\n}\n\n/**\n * Render a `DiagramModel` to a standalone SVG string. The output mirrors the\n * editor canvas: dot-grid background, soft drop-shadowed nodes, smooth\n * cubic-bezier edges. No external assets — the result is fully inline and\n * pasteable into HTML, README files, or PR descriptions.\n *\n * Layout is computed identically to the editor's hit-test pass (same width\n * estimation, padding, and question-card sizing), so an exported SVG matches\n * what you see on screen.\n *\n * Works in Node, Bun, and the browser (no DOM APIs needed).\n */\nexport function toSVG(model: DiagramModel): string {\n const boxes = computeLayout(model);\n let maxX = 0, maxY = 0;\n for (const b of boxes.values()) {\n maxX = Math.max(maxX, b.x + b.w);\n maxY = Math.max(maxY, b.y + b.h);\n }\n const width = maxX + PADDING;\n const height = maxY + PADDING + (model.title ? 32 : 0);\n\n const defs = [\n `<defs>`,\n `<pattern id=\"dotgrid\" x=\"0\" y=\"0\" width=\"24\" height=\"24\" patternUnits=\"userSpaceOnUse\">`,\n `<circle cx=\"12\" cy=\"12\" r=\"1.1\" fill=\"${COLORS.dot}\"/>`,\n `</pattern>`,\n `<filter id=\"nodeShadow\" x=\"-20%\" y=\"-20%\" width=\"140%\" height=\"140%\">`,\n `<feDropShadow dx=\"0\" dy=\"3\" stdDeviation=\"5\" flood-color=\"rgba(15,23,42,0.09)\"/>`,\n `</filter>`,\n `<marker id=\"arrow\" markerWidth=\"9\" markerHeight=\"7\" refX=\"8.5\" refY=\"3.5\" orient=\"auto\" markerUnits=\"strokeWidth\">`,\n `<path d=\"M0,0.5 L9,3.5 L0,6.5 L2.2,3.5 Z\" fill=\"${COLORS.edge}\"/>`,\n `</marker>`,\n `</defs>`,\n ].join('');\n\n const titleEl = model.title\n ? `<text x=\"${width / 2}\" y=\"22\" text-anchor=\"middle\" font-family=\"ui-sans-serif,system-ui,sans-serif\" font-size=\"15\" font-weight=\"700\" fill=\"${COLORS.text}\">${escapeXML(model.title)}</text>`\n : '';\n\n const edges = model.edges.map(e => renderEdge(e, boxes, model.variant, model.nodes)).join('\\n');\n const nodes = model.nodes.map(n => {\n const b = boxes.get(n.id)!;\n return isQuestion(n, model.variant) ? renderQuestionNode(n, b) : renderStandardNode(n, b);\n }).join('\\n');\n\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\" viewBox=\"0 0 ${width} ${height}\">\\n${defs}\\n<rect width=\"${width}\" height=\"${height}\" fill=\"${COLORS.bg}\"/>\\n<rect width=\"${width}\" height=\"${height}\" fill=\"url(#dotgrid)\"/>\\n${titleEl}\\n${edges}\\n${nodes}\\n</svg>`;\n}\n\n/**\n * Render a `DiagramModel` to a PNG `Blob`. Routes the SVG output through an\n * `<img>` and a `<canvas>` at `devicePixelRatio` scale, so the result is\n * crisp on hi-DPI displays.\n *\n * **Browser-only.** Throws if called in a Node/Bun environment (the Canvas\n * API is not available). For server-side PNG rendering, pipe `toSVG()` output\n * through a library like `@resvg/resvg-js`.\n */\nexport async function toPNG(model: DiagramModel): Promise<Blob> {\n if (typeof document === 'undefined') {\n throw new Error('toPNG requires a browser environment. For Node/Bun server use, pipe toSVG() through @resvg/resvg-js.');\n }\n const svg = toSVG(model);\n const blob = new Blob([svg], { type: 'image/svg+xml' });\n const url = URL.createObjectURL(blob);\n\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => {\n const canvas = document.createElement('canvas');\n const scale = window.devicePixelRatio || 2;\n canvas.width = img.naturalWidth * scale;\n canvas.height = img.naturalHeight * scale;\n const ctx = canvas.getContext('2d')!;\n ctx.scale(scale, scale);\n ctx.drawImage(img, 0, 0);\n URL.revokeObjectURL(url);\n canvas.toBlob(b => b ? resolve(b) : reject(new Error('Canvas toBlob failed')), 'image/png');\n };\n img.onerror = () => { URL.revokeObjectURL(url); reject(new Error('SVG image load failed')); };\n img.src = url;\n });\n}\n","import { useCallback } from 'react';\nimport type { DiagramModel } from '../../core/types.js';\nimport { fromMermaid } from '../../importers/mermaid.js';\nimport { fromJSON } from '../../importers/json.js';\n\n/**\n * Returns a `handleImport(text)` callback that parses pasted/uploaded text\n * (JSON or Mermaid, sniffed by whether it starts with `{`) and pushes the\n * result into history via `applyAndPush`.\n *\n * Editors differ in what shape they expect (flowchart vs sequence) and how\n * they post-process the parsed model (positioning nodes, normalizing types).\n * `expectedType` + `transform` capture those differences without duplicating\n * the parse/error-handling shell.\n *\n * @param applyAndPush Commits the imported model into the editor's history stack.\n * @param options.expectedType If set, an error fires when the imported model is\n * the wrong type — guards against pasting a flowchart into the sequence editor.\n * @param options.transform Optional final-shape transform applied after the\n * type check and before `applyAndPush` (e.g., position-defaulting nodes).\n * @param options.onSuccess Optional success callback (e.g., for toast notifications).\n * @param options.onError Optional error callback. Falls back to `alert()` if omitted.\n */\nexport function useImporter(\n applyAndPush: (m: DiagramModel) => void,\n options: {\n expectedType?: DiagramModel['type'];\n transform?: (m: DiagramModel) => DiagramModel;\n onSuccess?: (message: string) => void;\n onError?: (message: string) => void;\n } = {},\n): (text: string) => void {\n const { expectedType, transform, onSuccess, onError } = options;\n const reportError = onError ?? ((msg: string) => alert(msg));\n return useCallback((text: string) => {\n try {\n const parsed = text.trim().startsWith('{')\n ? fromJSON(text).toJSON()\n : fromMermaid(text).toJSON();\n if (expectedType && parsed.type !== expectedType) {\n reportError(`Imported diagram is not a ${expectedType} diagram.`);\n return;\n }\n applyAndPush(transform ? transform(parsed) : parsed);\n onSuccess?.('Diagram imported successfully');\n } catch (err) {\n reportError(`Import failed: ${(err as Error).message}`);\n }\n }, [applyAndPush, expectedType, transform, onSuccess, onError]);\n}\n","import type { DiagramModel, DiagramNode, DiagramEdge, DiagramType, DiagramVariant, SequenceMessage, ValidationError } from './types.js';\n\n/**\n * Mutable builder around a `DiagramModel`. Every public mutator returns\n * `this` so callers can chain (`new Model('flowchart').addNode(...).addEdge(...)`).\n * Call `.toJSON()` to extract a deep-cloned plain model suitable for\n * serialization or for handing to the editor components.\n *\n * All add/update operations validate immediately and throw on collisions or\n * dangling references. For non-throwing, batch-style structural checks call\n * `.validate()` instead.\n */\nexport class Model {\n private data: DiagramModel;\n\n /**\n * Create an empty model.\n *\n * @param type Top-level kind — `flowchart` or `sequence`.\n * @param title Optional human-readable title.\n * @param variant Optional UI variant (flowchart models only).\n */\n constructor(type: DiagramType, title?: string, variant?: DiagramVariant) {\n this.data = { type, ...(variant ? { variant } : {}), title, nodes: [], edges: [], actors: [], messages: [] };\n }\n\n /**\n * Rehydrate a `Model` from a previously serialized `DiagramModel`. The\n * incoming data is deep-cloned, so future mutations on the returned `Model`\n * do not affect the caller's object.\n */\n static fromData(data: DiagramModel): Model {\n const m = new Model(data.type, data.title, data.variant);\n m.data = structuredClone(data);\n return m;\n }\n\n /** Set the UI variant. No-op semantics for sequence models. */\n setVariant(variant: DiagramVariant): this {\n this.data.variant = variant;\n return this;\n }\n\n /**\n * Append a node. Throws if a node with the same id already exists. The\n * input is shallow-cloned, so later mutations of the caller's object do\n * not leak in.\n */\n addNode(node: DiagramNode): this {\n if (this.data.nodes.find(n => n.id === node.id)) {\n throw new Error(`Node with id \"${node.id}\" already exists`);\n }\n this.data.nodes.push({ ...node });\n return this;\n }\n\n /**\n * Patch an existing node in place. Throws if the id is not found. The id\n * field itself cannot be patched — to rename, remove + re-add.\n */\n updateNode(id: string, patch: Partial<Omit<DiagramNode, 'id'>>): this {\n const node = this.data.nodes.find(n => n.id === id);\n if (!node) throw new Error(`Node \"${id}\" not found`);\n Object.assign(node, patch);\n return this;\n }\n\n /**\n * Remove a node and every edge that referenced it as `from` or `to`. Safe\n * to call on a missing id (no-op).\n */\n removeNode(id: string): this {\n this.data.nodes = this.data.nodes.filter(n => n.id !== id);\n this.data.edges = this.data.edges.filter(e => e.from !== id && e.to !== id);\n return this;\n }\n\n /**\n * Append an edge. Throws on duplicate id or if either endpoint references\n * an unknown node — the model never holds dangling edges from this entry\n * point. (Importers can still construct dangling edges; call `validate()`\n * to detect them.)\n */\n addEdge(edge: DiagramEdge): this {\n if (this.data.edges.find(e => e.id === edge.id)) {\n throw new Error(`Edge with id \"${edge.id}\" already exists`);\n }\n if (!this.data.nodes.find(n => n.id === edge.from)) {\n throw new Error(`Edge \"${edge.id}\" references unknown source node \"${edge.from}\"`);\n }\n if (!this.data.nodes.find(n => n.id === edge.to)) {\n throw new Error(`Edge \"${edge.id}\" references unknown target node \"${edge.to}\"`);\n }\n this.data.edges.push({ ...edge });\n return this;\n }\n\n /**\n * Surface structural problems without throwing. Returns an array of\n * `ValidationError`s; empty array means the model is well-formed. Used by\n * the editor's status banner and by external tooling.\n */\n validate(): ValidationError[] {\n const errors: ValidationError[] = [];\n const nodeIds = new Set<string>();\n for (const n of this.data.nodes) {\n if (nodeIds.has(n.id)) errors.push({ kind: 'duplicate-node-id', id: n.id, message: `Duplicate node id \"${n.id}\"` });\n nodeIds.add(n.id);\n }\n const edgeIds = new Set<string>();\n for (const e of this.data.edges) {\n if (edgeIds.has(e.id)) errors.push({ kind: 'duplicate-edge-id', id: e.id, message: `Duplicate edge id \"${e.id}\"` });\n edgeIds.add(e.id);\n if (!nodeIds.has(e.from)) errors.push({ kind: 'dangling-from', id: e.id, message: `Edge \"${e.id}\" references unknown source node \"${e.from}\"` });\n if (!nodeIds.has(e.to)) errors.push({ kind: 'dangling-to', id: e.id, message: `Edge \"${e.id}\" references unknown target node \"${e.to}\"` });\n }\n return errors;\n }\n\n /** Remove an edge by id. Safe to call on a missing id (no-op). */\n removeEdge(id: string): this {\n this.data.edges = this.data.edges.filter(e => e.id !== id);\n return this;\n }\n\n /** Append a sequence actor. Duplicate names are silently ignored. */\n addActor(name: string): this {\n if (!this.data.actors!.includes(name)) {\n this.data.actors!.push(name);\n }\n return this;\n }\n\n /**\n * Append a sequence message. The actors referenced by `from`/`to` are not\n * validated here — callers are expected to register them via `addActor()`\n * first.\n */\n addMessage(message: SequenceMessage): this {\n this.data.messages!.push({ ...message });\n return this;\n }\n\n /**\n * Return a deep-cloned plain `DiagramModel`. Safe to mutate by the caller;\n * mutations do not flow back into this `Model`.\n */\n toJSON(): DiagramModel {\n return structuredClone(this.data);\n }\n}\n","import { Model } from '../core/model.js';\nimport type { NodeShape } from '../core/types.js';\nimport { nextId } from '../core/ids.js';\n\n// Detects shape from Mermaid node syntax\nfunction parseNodeDecl(raw: string): { id: string; label: string; shape: NodeShape } | null {\n // diamond: id{label}, circle: id((label)), parallelogram: id[/label/], default: id[label] or id(\"label\")\n const patterns: [RegExp, NodeShape][] = [\n [/^(\\w+)\\{\\{?\"?(.+?)\"?\\}?\\}$/, 'diamond'],\n [/^(\\w+)\\(\\(\"?(.+?)\"?\\)\\)$/, 'circle'],\n [/^(\\w+)\\[\\/(.+?)\\/\\]$/, 'parallelogram'],\n [/^(\\w+)\\[[\"']?(.+?)[\"']?\\]$/, 'rectangle'],\n [/^(\\w+)\\(\"?(.+?)\"?\\)$/, 'rectangle'],\n ];\n for (const [re, shape] of patterns) {\n const m = raw.match(re);\n if (m) return { id: m[1], label: m[2].replace(/^[\"']|[\"']$/g, ''), shape };\n }\n return null;\n}\n\n// Mermaid flowchart edge connector: solid (-->, ---), dashed (-.->, -.-), or with labels.\n// Anchored so node IDs ending in `{`/`[`/`(` cannot bleed into the connector.\nconst EDGE_RE = /^(.+?)\\s*(-\\.->|-\\.-|-->|---)(?:\\|(.+?)\\|)?\\s*(.+)$/;\n\nfunction detectStyle(connector: string): 'solid' | 'dashed' {\n return connector.startsWith('-.') ? 'dashed' : 'solid';\n}\n\nfunction detectArrowhead(connector: string): 'arrow' | 'none' {\n return connector.endsWith('>') ? 'arrow' : 'none';\n}\n\nfunction parseFlowchart(lines: string[]): Model {\n const model = new Model('flowchart');\n const nodeMap = new Map<string, boolean>();\n const groupStack: string[] = [];\n\n const ensureNode = (id: string, group?: string) => {\n if (!nodeMap.has(id)) {\n nodeMap.set(id, true);\n const metadata = group ? { group } : undefined;\n model.addNode({ id, label: id, shape: 'rectangle', ...(metadata ? { metadata } : {}) });\n }\n };\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n // Skip Mermaid comments, config blocks, header directives, and click handlers.\n if (\n trimmed.startsWith('%%') ||\n trimmed.startsWith('graph') ||\n trimmed.startsWith('flowchart') ||\n trimmed.startsWith('click ') ||\n trimmed.startsWith('classDef ') ||\n trimmed.startsWith('class ') ||\n trimmed.startsWith('style ') ||\n trimmed.startsWith('linkStyle ')\n ) continue;\n\n // Subgraphs: track current group so contained nodes get metadata.group set.\n const subgraphOpen = trimmed.match(/^subgraph\\s+(\\S+)/i);\n if (subgraphOpen) { groupStack.push(subgraphOpen[1]); continue; }\n if (/^end\\b/i.test(trimmed)) { groupStack.pop(); continue; }\n\n const currentGroup = groupStack[groupStack.length - 1];\n\n const edgeMatch = trimmed.match(EDGE_RE);\n if (edgeMatch) {\n const fromRaw = edgeMatch[1].trim();\n const connector = edgeMatch[2];\n const label = edgeMatch[3]?.replace(/^[\"']|[\"']$/g, '');\n const toRaw = edgeMatch[4].trim();\n const style = detectStyle(connector);\n const arrowhead = detectArrowhead(connector);\n\n const fromNode = parseNodeDecl(fromRaw);\n const toNode = parseNodeDecl(toRaw);\n\n if (fromNode && !nodeMap.has(fromNode.id)) {\n nodeMap.set(fromNode.id, true);\n const metadata = currentGroup ? { group: currentGroup } : undefined;\n model.addNode({ ...fromNode, ...(metadata ? { metadata } : {}) });\n } else if (!fromNode) {\n ensureNode(fromRaw.replace(/\\W.*/, ''), currentGroup);\n }\n if (toNode && !nodeMap.has(toNode.id)) {\n nodeMap.set(toNode.id, true);\n const metadata = currentGroup ? { group: currentGroup } : undefined;\n model.addNode({ ...toNode, ...(metadata ? { metadata } : {}) });\n } else if (!toNode) {\n ensureNode(toRaw.replace(/\\W.*/, ''), currentGroup);\n }\n\n const fromId = fromNode?.id ?? fromRaw.replace(/\\W.*/, '');\n const toId = toNode?.id ?? toRaw.replace(/\\W.*/, '');\n model.addEdge({\n id: nextId('e', model.toJSON().edges),\n from: fromId, to: toId,\n ...(label ? { label } : {}),\n style,\n ...(arrowhead === 'none' ? { arrowhead } : {}),\n });\n continue;\n }\n\n const nodeDecl = parseNodeDecl(trimmed);\n if (nodeDecl && !nodeMap.has(nodeDecl.id)) {\n nodeMap.set(nodeDecl.id, true);\n const metadata = currentGroup ? { group: currentGroup } : undefined;\n model.addNode({ ...nodeDecl, ...(metadata ? { metadata } : {}) });\n }\n }\n\n return model;\n}\n\nfunction parseSequence(lines: string[], title?: string): Model {\n const model = new Model('sequence', title);\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('sequenceDiagram') || trimmed.startsWith('%%')) continue;\n\n const participantMatch = trimmed.match(/^participant\\s+(.+)$/i);\n if (participantMatch) {\n model.addActor(participantMatch[1].trim());\n continue;\n }\n\n const actorMatch = trimmed.match(/^actor\\s+(.+)$/i);\n if (actorMatch) {\n model.addActor(actorMatch[1].trim());\n continue;\n }\n\n // Sequence message arrows: ->, ->>, -->, -->> (-- prefix = dashed)\n const msgMatch = trimmed.match(/^(.+?)\\s*(-->>|->>|-->|->)\\s*(.+?):\\s*(.+)$/);\n if (msgMatch) {\n const from = msgMatch[1].trim();\n const arrow = msgMatch[2];\n const to = msgMatch[3].trim();\n const label = msgMatch[4].trim();\n model.addActor(from);\n model.addActor(to);\n const messages = model.toJSON().messages ?? [];\n model.addMessage({ id: nextId('m', messages), from, to, label, style: arrow.startsWith('--') ? 'dashed' : 'solid' });\n }\n }\n\n return model;\n}\n\n/**\n * Parse Mermaid source into a `Model`. Auto-detects `flowchart` /\n * `sequenceDiagram` from the directive line and dispatches accordingly.\n *\n * **What is preserved:**\n * - Flowcharts: node shapes (`[]` / `{}` / `(())` / `[/]`), node labels,\n * edge connectors (`-->`, `-.->`, `---`, `-.-`), edge labels, and\n * `subgraph` grouping (stored on `node.metadata.group`).\n * - Sequence: actor declarations, message arrows (`->>`, `-->>`), labels.\n * - Frontmatter `title: ...` blocks are lifted into `model.title`.\n *\n * **What is dropped or normalized:**\n * - `mermaid.initialize(...)` blocks, `%%{init: ...}%%` directives, and\n * click handlers — stripped before parsing.\n * - Dotted edges collapse to `dashed` (Mermaid's dot/dash style is lossy).\n * - Node positions, `waypoint`, and any package-specific metadata other\n * than `group` are not present in Mermaid and so cannot round-trip.\n */\nexport function fromMermaid(mermaid: string): Model {\n // Strip mermaid.initialize(...) and similar JS-style config blocks that\n // sometimes appear in copy-pasted snippets — anything between `init` and `)`.\n const cleaned = mermaid.replace(/mermaid\\.initialize\\([\\s\\S]*?\\)\\s*;?/g, '');\n const rawLines = cleaned.split('\\n');\n\n // Strip frontmatter\n let startIdx = 0;\n let title: string | undefined;\n if (rawLines[0]?.trim() === '---') {\n const endFm = rawLines.findIndex((l, i) => i > 0 && l.trim() === '---');\n if (endFm !== -1) {\n const fmLines = rawLines.slice(1, endFm);\n for (const fl of fmLines) {\n const tm = fl.match(/^title:\\s*(.+)$/);\n if (tm) title = tm[1].trim();\n }\n startIdx = endFm + 1;\n }\n }\n\n const lines = rawLines.slice(startIdx);\n const firstContent = lines.find(l => l.trim());\n\n if (firstContent?.trim().startsWith('sequenceDiagram')) {\n const m = parseSequence(lines, title);\n return m;\n }\n\n const m = parseFlowchart(lines);\n if (title) {\n // patch title via internal JSON round-trip\n const data = m.toJSON();\n data.title = title;\n return Model.fromData(data);\n }\n return m;\n}\n","import { Model } from '../core/model.js';\nimport type { DiagramModel } from '../core/types.js';\n\n/**\n * Rehydrate a `Model` from the package's JSON shape. Accepts either the raw\n * JSON string or an already-parsed `DiagramModel` (handy when the caller has\n * received the data from a typed source).\n *\n * Validation here is minimal — only the structural fields needed by the\n * downstream renderer (`type`, `nodes`, `edges`) are checked. For deeper\n * checks call `model.validate()` after import.\n *\n * @throws If `json` is not a valid `DiagramModel` shape.\n */\nexport function fromJSON(json: string | DiagramModel): Model {\n const data: DiagramModel = typeof json === 'string' ? JSON.parse(json) : json;\n if (!data.type || !Array.isArray(data.nodes) || !Array.isArray(data.edges)) {\n throw new Error('Invalid DiagramModel JSON');\n }\n return Model.fromData(data);\n}\n","import { useCallback, useState } from 'react';\n\nexport interface Toast {\n id: number;\n message: string;\n type: 'success' | 'error' | 'info';\n}\n\nlet _toastSeq = 0;\n\n/**\n * Minimal toast notification state. Returns `toasts` (current visible toasts)\n * and `showToast(message, type?)` to push a new one. Toasts auto-dismiss after\n * 3 seconds.\n */\nexport function useToast() {\n const [toasts, setToasts] = useState<Toast[]>([]);\n\n const showToast = useCallback((message: string, type: Toast['type'] = 'info') => {\n const id = ++_toastSeq;\n setToasts(prev => [...prev, { id, message, type }]);\n setTimeout(() => {\n setToasts(prev => prev.filter(t => t.id !== id));\n }, 3000);\n }, []);\n\n const dismissToast = useCallback((id: number) => {\n setToasts(prev => prev.filter(t => t.id !== id));\n }, []);\n\n return { toasts, showToast, dismissToast };\n}\n","import React from 'react';\nimport type { Toast } from './hooks/useToast.js';\n\nconst TOAST_COLORS = {\n success: { bg: '#065f46', border: '#10b981', text: '#ecfdf5' },\n error: { bg: '#7f1d1d', border: '#ef4444', text: '#fef2f2' },\n info: { bg: '#1e3a5f', border: '#3b82f6', text: '#eff6ff' },\n};\n\nconst containerStyle: React.CSSProperties = {\n position: 'absolute',\n top: 8,\n right: 8,\n display: 'flex',\n flexDirection: 'column',\n gap: 6,\n zIndex: 9999,\n pointerEvents: 'none',\n};\n\n/**\n * Renders a stack of auto-dismissing toast notifications.\n * Position this inside a `position: relative` container.\n */\nexport function ToastContainer({ toasts, onDismiss }: { toasts: Toast[]; onDismiss: (id: number) => void }) {\n if (toasts.length === 0) return null;\n return (\n <div style={containerStyle}>\n {toasts.map(t => {\n const c = TOAST_COLORS[t.type];\n return (\n <div\n key={t.id}\n role=\"alert\"\n aria-live=\"polite\"\n style={{\n background: c.bg,\n border: `1px solid ${c.border}`,\n color: c.text,\n padding: '8px 14px',\n borderRadius: 8,\n fontSize: 12,\n fontWeight: 500,\n fontFamily: 'ui-sans-serif,system-ui,sans-serif',\n boxShadow: '0 4px 12px rgba(0,0,0,0.3)',\n pointerEvents: 'auto',\n cursor: 'pointer',\n maxWidth: 280,\n }}\n onClick={() => onDismiss(t.id)}\n >\n {t.type === 'success' && '✓ '}\n {t.type === 'error' && '✗ '}\n {t.message}\n </div>\n );\n })}\n </div>\n );\n}\n","/**\n * Built-in sample diagrams shown when a consumer mounts the editor without\n * an `initialModel`. The goal is for the empty state to look like a real\n * working diagram, not a blank canvas — so a developer evaluating the\n * package immediately sees the canvas, edge styles, and side panels with\n * meaningful content.\n *\n * Pass `initialModel={emptyModel(variant)}` (or any model of your own) to\n * opt out of the preset.\n */\n\nimport type { DiagramModel, DiagramVariant, DiagramType } from '../core/types.js';\n\n/**\n * Return a blank model of the requested type/variant. Useful as\n * `initialModel={emptyModel('flowchart')}` to opt out of the demo preset.\n */\nexport function emptyModel(\n type: DiagramType,\n variant?: DiagramVariant,\n): DiagramModel {\n if (type === 'sequence') {\n return { type: 'sequence', nodes: [], edges: [], actors: [], messages: [] };\n }\n return { type: 'flowchart', variant: variant ?? 'flowchart', nodes: [], edges: [] };\n}\n\nconst FLOWCHART_PRESET: DiagramModel = {\n type: 'flowchart',\n variant: 'flowchart',\n nodes: [\n { id: 'start', label: 'Start', shape: 'circle', x: 240, y: 60 },\n { id: 'place', label: 'Place order', shape: 'rectangle', x: 216, y: 180 },\n { id: 'check', label: 'Payment valid?', shape: 'diamond', x: 200, y: 300 },\n { id: 'confirm', label: 'Send confirmation',shape: 'rectangle', x: 60, y: 460 },\n { id: 'retry', label: 'Notify failure', shape: 'rectangle', x: 380, y: 460 },\n { id: 'done', label: 'Done', shape: 'circle', x: 240, y: 580 },\n ],\n edges: [\n { id: 'e1', from: 'start', to: 'place' },\n { id: 'e2', from: 'place', to: 'check' },\n { id: 'e3', from: 'check', to: 'confirm', label: 'yes' },\n { id: 'e4', from: 'check', to: 'retry', label: 'no', style: 'dashed' },\n { id: 'e5', from: 'confirm', to: 'done' },\n { id: 'e6', from: 'retry', to: 'done', style: 'dashed' },\n ],\n};\n\nconst QUESTION_PRESET: DiagramModel = {\n type: 'flowchart',\n variant: 'question',\n nodes: [\n {\n id: 'role',\n label: 'What is your role?',\n shape: 'rectangle',\n x: 220, y: 60,\n metadata: { answers: ['Engineer', 'Designer', 'PM'] },\n },\n { id: 'eng', label: 'Engineering docs', shape: 'rectangle', x: 40, y: 320 },\n { id: 'design', label: 'Design system', shape: 'rectangle', x: 280, y: 320 },\n { id: 'pm', label: 'Product roadmap', shape: 'rectangle', x: 520, y: 320 },\n ],\n edges: [\n { id: 'q1', from: 'role', to: 'eng', label: 'Engineer' },\n { id: 'q2', from: 'role', to: 'design', label: 'Designer' },\n { id: 'q3', from: 'role', to: 'pm', label: 'PM' },\n ],\n};\n\nconst JOURNEY_PRESET: DiagramModel = {\n type: 'flowchart',\n variant: 'journey',\n nodes: [\n { id: 'j1', label: 'Sign up', shape: 'rectangle', x: 60, y: 60 },\n { id: 'j2', label: 'Verify email', shape: 'rectangle', x: 60, y: 180 },\n { id: 'j3', label: 'Complete profile', shape: 'rectangle', x: 60, y: 300 },\n { id: 'j4', label: 'Invite team', shape: 'rectangle', x: 60, y: 420 },\n { id: 'j5', label: 'Launch project', shape: 'rectangle', x: 60, y: 540 },\n ],\n edges: [\n { id: 'je1', from: 'j1', to: 'j2' },\n { id: 'je2', from: 'j2', to: 'j3' },\n { id: 'je3', from: 'j3', to: 'j4' },\n { id: 'je4', from: 'j4', to: 'j5' },\n ],\n};\n\nconst SEQUENCE_PRESET: DiagramModel = {\n type: 'sequence',\n nodes: [],\n edges: [],\n actors: ['User', 'App', 'Server'],\n messages: [\n { id: 'm1', from: 'User', to: 'App', label: 'Tap \"Log in\"' },\n { id: 'm2', from: 'App', to: 'Server', label: 'POST /login' },\n { id: 'm3', from: 'Server', to: 'App', label: '200 OK + token', style: 'dashed' },\n { id: 'm4', from: 'App', to: 'User', label: 'Show dashboard', style: 'dashed' },\n ],\n};\n\n/**\n * Return a fresh, ready-to-edit flowchart model for the requested variant.\n * The result is a deep clone — callers may mutate freely without affecting\n * future calls.\n *\n * - `flowchart` → 6-node order-processing example with a decision diamond\n * - `question` → 1-question / 3-answer routing example\n * - `journey` → 5-step linear onboarding sequence\n */\nexport function presetFlowchartModel(variant: DiagramVariant = 'flowchart'): DiagramModel {\n if (variant === 'question') return cloneModel(QUESTION_PRESET);\n if (variant === 'journey') return cloneModel(JOURNEY_PRESET);\n return cloneModel(FLOWCHART_PRESET);\n}\n\n/**\n * Return a fresh, ready-to-edit sequence model — a 4-message User → App →\n * Server login flow. Deep-cloned; safe to mutate.\n */\nexport function presetSequenceModel(): DiagramModel {\n return cloneModel(SEQUENCE_PRESET);\n}\n\nfunction cloneModel(m: DiagramModel): DiagramModel {\n return {\n ...m,\n nodes: m.nodes.map((n) => ({ ...n, metadata: n.metadata ? { ...n.metadata } : undefined })),\n edges: m.edges.map((e) => ({ ...e })),\n actors: m.actors ? [...m.actors] : undefined,\n messages: m.messages?.map((msg) => ({ ...msg })),\n };\n}\n","import { useEffect } from 'react';\n\n/**\n * A single keyboard command registration. `match` decides whether the\n * keydown event belongs to this command; `run` executes it. Returning\n * `true` from `run` signals that the event was handled — the hook calls\n * `preventDefault()` automatically.\n */\nexport interface KeyCommand {\n /** Return `true` when this command should handle the event. */\n match: (e: KeyboardEvent) => boolean;\n /** Execute the command. Return `true` to call `preventDefault()`. */\n run: (e: KeyboardEvent) => boolean | void;\n}\n\n// Helpers for building match predicates.\nconst isInput = (e: KeyboardEvent): boolean => {\n const tgt = e.target as HTMLElement | null;\n return !!(tgt && (tgt.tagName === 'INPUT' || tgt.tagName === 'TEXTAREA' || tgt.isContentEditable));\n};\n\n/**\n * Installs a single `keydown` listener on `window` that dispatches to the\n * first matching `KeyCommand` in the provided array. Commands at the front\n * of the list take priority — place more-specific bindings before generic\n * ones. Events targeted at `<input>` / `<textarea>` / `contentEditable`\n * elements are silently skipped so the editor never steals text-entry keys.\n *\n * Both `DiagramEditor` and `SequenceEditor` previously inlined an identical\n * pattern (check target tag → switch on key combos). Centralizing into this\n * hook deduplicates the boilerplate and keeps each command's match + action\n * colocated, making it easier to test and extend.\n *\n * @param commands Ordered list of keyboard commands. Re-creating this array\n * on every render is fine — the hook only uses the latest ref.\n * @param deps Dependency array passed through to `useEffect` so the\n * listener re-binds when relevant state changes.\n */\nexport function useEditorKeyboard(commands: KeyCommand[], deps: unknown[]): void {\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (isInput(e)) return;\n for (const cmd of commands) {\n if (cmd.match(e)) {\n const handled = cmd.run(e);\n if (handled) e.preventDefault();\n return;\n }\n }\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, deps);\n}\n","import React, { useState } from 'react';\nimport type { DiagramModel, DiagramNode, DiagramVariant } from '../core/types.js';\nimport type { ThemeColors } from './theme.js';\n\nexport interface NodeNavigatorProps {\n model: DiagramModel;\n selected: string | null;\n variant: DiagramVariant;\n isDark: boolean;\n t: ThemeColors;\n acc: { color: string; fill: string; border: string };\n open: boolean;\n onToggle(): void;\n onSelect(nodeId: string): void;\n}\n\nexport function NodeNavigator({\n model, selected, variant, isDark, t, acc, open, onToggle, onSelect,\n}: NodeNavigatorProps) {\n const [search, setSearch] = useState('');\n\n const shapeIcon = (node: DiagramNode) => {\n if (variant === 'question') return '?';\n if (variant === 'journey') return '↗';\n switch (node.shape) {\n case 'diamond': return '◇';\n case 'circle': return '○';\n case 'parallelogram': return '▱';\n default: return '▭';\n }\n };\n\n const filtered = model.nodes.filter(n =>\n n.label.toLowerCase().includes(search.toLowerCase())\n );\n\n const inEdges = (id: string) => model.edges.filter(e => e.to === id).length;\n const outEdges = (id: string) => model.edges.filter(e => e.from === id).length;\n\n if (!open) {\n return (\n <div style={{\n width: 36, flexShrink: 0,\n background: t.panelBg, borderRight: `1px solid ${t.panelBorder}`,\n display: 'flex', flexDirection: 'column', alignItems: 'center', paddingTop: 8, gap: 6,\n }}>\n <button\n onClick={onToggle}\n title=\"Open node list\"\n aria-expanded={false}\n aria-label=\"Open node list\"\n style={{ background: 'none', border: 'none', cursor: 'pointer', color: t.textMuted, padding: 6, borderRadius: 6, fontSize: 14, lineHeight: 1 }}\n >☰</button>\n <div style={{ fontSize: 10, color: t.textMuted, fontWeight: 700, writingMode: 'vertical-rl', transform: 'rotate(180deg)', letterSpacing: 0.5 }}>\n {model.nodes.length}\n </div>\n </div>\n );\n }\n\n return (\n <div style={{\n width: 216, flexShrink: 0,\n background: t.panelBg, borderRight: `1px solid ${t.panelBorder}`,\n display: 'flex', flexDirection: 'column', overflow: 'hidden',\n }}>\n <div style={{\n display: 'flex', alignItems: 'center', justifyContent: 'space-between',\n padding: '10px 12px', borderBottom: `1px solid ${t.panelBorder}`, flexShrink: 0,\n }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>\n <span style={{ fontSize: 11, fontWeight: 700, color: t.textSecondary, textTransform: 'uppercase', letterSpacing: 0.7 }}>\n {variant === 'question' ? 'Questions' : variant === 'journey' ? 'Steps' : 'Nodes'}\n </span>\n <span style={{\n fontSize: 10, fontWeight: 700, color: t.textMuted,\n background: isDark ? '#0f172a' : '#f1f5f9',\n padding: '1px 6px', borderRadius: 99,\n }}>{model.nodes.length}</span>\n </div>\n <button\n onClick={onToggle}\n style={{ background: 'none', border: 'none', cursor: 'pointer', color: t.textMuted, padding: '2px 4px', borderRadius: 4, fontSize: 13, lineHeight: 1 }}\n title=\"Collapse\"\n aria-expanded={true}\n aria-label=\"Collapse node list\"\n >‹</button>\n </div>\n\n <div style={{ padding: '8px 10px', borderBottom: `1px solid ${t.sectionBorder}`, flexShrink: 0 }}>\n <div style={{ position: 'relative' }}>\n <span style={{ position: 'absolute', left: 8, top: '50%', transform: 'translateY(-50%)', fontSize: 11, color: t.textMuted, pointerEvents: 'none' }}>⌕</span>\n <input\n value={search}\n onChange={e => setSearch(e.target.value)}\n placeholder=\"Search…\"\n style={{\n width: '100%', padding: '5px 8px 5px 24px',\n border: `1.5px solid ${t.inputBorder}`, borderRadius: 7,\n fontSize: 12, background: t.inputBg, color: t.inputText,\n outline: 'none', boxSizing: 'border-box', fontFamily: 'inherit',\n }}\n />\n </div>\n </div>\n\n <div style={{ flex: 1, overflowY: 'auto', padding: '6px 8px', display: 'flex', flexDirection: 'column', gap: 2 }}>\n {filtered.length === 0 && (\n <div style={{ textAlign: 'center', padding: '20px 0', fontSize: 12, color: t.textMuted, fontStyle: 'italic' }}>\n {model.nodes.length === 0 ? 'No nodes yet' : 'No matches'}\n </div>\n )}\n {filtered.map((node, idx) => {\n const isSelected = selected === node.id;\n const answers = (node.metadata?.answers as string[] | undefined) ?? [];\n return (\n <button\n key={node.id}\n onClick={() => onSelect(node.id)}\n style={{\n display: 'flex', alignItems: 'center', gap: 8,\n width: '100%', padding: '7px 8px', textAlign: 'left',\n background: isSelected ? acc.fill : 'transparent',\n border: isSelected ? `1.5px solid ${acc.border}` : '1.5px solid transparent',\n borderRadius: 8, cursor: 'pointer', fontFamily: 'inherit',\n transition: 'background 0.1s',\n }}\n onMouseEnter={e => { if (!isSelected) (e.currentTarget as HTMLElement).style.background = isDark ? '#334155' : '#f1f5f9'; }}\n onMouseLeave={e => { if (!isSelected) (e.currentTarget as HTMLElement).style.background = 'transparent'; }}\n >\n <div style={{\n width: 22, height: 22, borderRadius: 6, flexShrink: 0,\n background: isSelected ? acc.color : (isDark ? '#334155' : '#e2e8f0'),\n color: isSelected ? '#fff' : t.textMuted,\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n fontSize: variant === 'journey' ? 9 : 11, fontWeight: 700,\n }}>\n {variant === 'journey' ? idx + 1 : shapeIcon(node)}\n </div>\n\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{\n fontSize: 12, fontWeight: isSelected ? 600 : 400,\n color: isSelected ? acc.color : t.textPrimary,\n overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap',\n lineHeight: 1.3,\n }}>{node.label}</div>\n <div style={{ fontSize: 10, color: t.textMuted, lineHeight: 1.2, marginTop: 1 }}>\n {variant === 'question'\n ? `${answers.length} answer${answers.length !== 1 ? 's' : ''}`\n : `${inEdges(node.id)}↓ ${outEdges(node.id)}→`}\n </div>\n </div>\n\n {isSelected && <span style={{ fontSize: 10, color: acc.color, flexShrink: 0 }}>◉</span>}\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n","import React, { useState } from 'react';\nimport type { DiagramNode, DiagramEdge, DiagramVariant } from '../core/types.js';\nimport {\n NODE_H,\n Q_BASE_H,\n Q_ANS_ROW_H,\n Q_CARD_PAD,\n estimateTextW,\n nodeWidth,\n answerCardW,\n questionNodeW,\n questionNodeH,\n bezierPath,\n bezierPathVia,\n} from './layout.js';\nimport { ACCENT as C, variantAccent, type ThemeColors } from './theme.js';\n\n// Static style objects hoisted to module scope so React diffing doesn't see a\n// fresh `{}` on every render. Anything stable enough to be a constant lives\n// here; per-node theme-derived styles still allocate inline.\nconst STYLE_LABEL: React.CSSProperties = { pointerEvents: 'none', userSelect: 'none' };\nconst STYLE_BLUR: React.CSSProperties = { filter: 'blur(4px)' };\nconst STYLE_EDGE_HIT: React.CSSProperties = { cursor: 'pointer' };\nconst STYLE_NO_EVENTS: React.CSSProperties = { pointerEvents: 'none' };\nconst STYLE_PORT_HOVER: React.CSSProperties = { cursor: 'crosshair', filter: 'drop-shadow(0 1px 3px rgba(0,0,0,0.18))' };\nconst STYLE_WAYPOINT: React.CSSProperties = { cursor: 'grab', filter: 'drop-shadow(0 1px 2px rgba(0,0,0,0.25))' };\nconst STYLE_EDGE_LABEL_HIT: React.CSSProperties = { cursor: 'text' };\n\n// ── Standard node shape ────────────────────────────────────────────────────\nexport function NodeShape({ node, selected, variant, stepNumber, t, isDark, w }: {\n node: DiagramNode; selected: boolean; variant: DiagramVariant;\n stepNumber?: number; t: ThemeColors; isDark: boolean; w: number;\n}) {\n const acc = variantAccent(variant, isDark);\n const cx = w / 2, cy = NODE_H / 2;\n const stroke = selected ? acc.color : t.nodeStroke;\n const fill = selected ? t.nodeSelectedFill : t.nodeFill;\n const sw = selected ? 1.75 : 1.25;\n\n const glow = selected && (\n <>\n {node.shape === 'circle' ? (\n <>\n <circle cx={cx} cy={cy} r={NODE_H / 2 + 3} fill=\"none\" stroke={acc.color} strokeWidth={6} opacity={0.18} style={STYLE_BLUR} />\n <circle cx={cx} cy={cy} r={NODE_H / 2 + 1.5} fill=\"none\" stroke={acc.color} strokeWidth={1} opacity={0.55} />\n </>\n ) : node.shape === 'diamond' ? (\n <>\n <polygon points={`${cx},${-5} ${w + 5},${cy} ${cx},${NODE_H + 5} ${-5},${cy}`}\n fill=\"none\" stroke={acc.color} strokeWidth={6} opacity={0.18} style={STYLE_BLUR} />\n <polygon points={`${cx},${-2} ${w + 2},${cy} ${cx},${NODE_H + 2} ${-2},${cy}`}\n fill=\"none\" stroke={acc.color} strokeWidth={1} opacity={0.55} />\n </>\n ) : (\n <>\n <rect x={-4} y={-4} width={w + 8} height={NODE_H + 8} rx={18}\n fill=\"none\" stroke={acc.color} strokeWidth={6} opacity={0.18} style={STYLE_BLUR} />\n <rect x={-1.5} y={-1.5} width={w + 3} height={NODE_H + 3} rx={15.5}\n fill=\"none\" stroke={acc.color} strokeWidth={1} opacity={0.5} />\n </>\n )}\n </>\n );\n\n const badgeColor = isDark ? C.emeraldDark : C.emerald;\n const badge = variant === 'journey' && stepNumber !== undefined && (\n <>\n <circle cx={14} cy={14} r={10} fill={badgeColor} />\n <text x={14} y={18} textAnchor=\"middle\" fontSize={9} fill=\"white\" fontWeight=\"700\" style={STYLE_LABEL}>{stepNumber}</text>\n </>\n );\n\n switch (node.shape) {\n case 'diamond': {\n const pts = `${cx},0 ${w},${cy} ${cx},${NODE_H} 0,${cy}`;\n return <>{glow}<polygon points={pts} fill={fill} stroke={stroke} strokeWidth={sw} filter=\"url(#nodeShadow)\" />{badge}</>;\n }\n case 'circle':\n return <>{glow}<circle cx={cx} cy={cy} r={NODE_H / 2 - 1} fill={fill} stroke={stroke} strokeWidth={sw} filter=\"url(#nodeShadow)\" />{badge}</>;\n case 'parallelogram':\n return <>{glow}<polygon points={`14,0 ${w},0 ${w - 14},${NODE_H} 0,${NODE_H}`} fill={fill} stroke={stroke} strokeWidth={sw} filter=\"url(#nodeShadow)\" />{badge}</>;\n default:\n return <>{glow}<rect width={w} height={NODE_H} rx={14} fill={fill} stroke={stroke} strokeWidth={sw} filter=\"url(#nodeShadow)\" />{badge}</>;\n }\n}\n\n// ── Question node ──────────────────────────────────────────────────────────\nconst ANSWER_LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n\nexport function QuestionNode({ node, selected, edges, isDark, onAnswerPortDown, qW }: {\n node: DiagramNode; selected: boolean; edges: DiagramEdge[];\n isDark: boolean; qW: number;\n onAnswerPortDown: (e: React.MouseEvent, nodeId: string, answer: string, portX: number, portY: number) => void;\n}) {\n const answers: string[] = (node.metadata?.answers as string[] | undefined) ?? [];\n const totalH = questionNodeH(answers);\n const amber = isDark ? C.amberDark : C.amber;\n const amberSoft = isDark ? 'rgba(251,191,36,0.14)' : '#fef9ee';\n const amberLine = isDark ? 'rgba(251,191,36,0.18)' : '#fde68a';\n const nodeBg = isDark ? '#1e293b' : '#ffffff';\n const nodeBorder = selected ? amber : (isDark ? 'rgba(251,191,36,0.25)' : '#fde68a');\n const cardBg = isDark ? '#0f172a' : '#fffdf7';\n const cardBgConnected = isDark ? 'rgba(251,191,36,0.12)' : '#fef3c7';\n const cardBorder = isDark ? '#1e293b' : '#fde68a';\n const textMain = isDark ? '#f1f5f9' : '#1e293b';\n const textSub = isDark ? '#64748b' : '#94a3b8';\n const textAns = isDark ? '#cbd5e1' : '#374151';\n\n const portRowY = Q_BASE_H + Q_ANS_ROW_H - 8;\n\n const glow = selected && (\n <>\n <rect x={-4} y={-4} width={qW + 8} height={totalH + 8} rx={18}\n fill=\"none\" stroke={amber} strokeWidth={6} opacity={0.2}\n style={STYLE_BLUR} />\n <rect x={-1.5} y={-1.5} width={qW + 3} height={totalH + 3} rx={15.5}\n fill=\"none\" stroke={amber} strokeWidth={1} opacity={0.55} />\n </>\n );\n\n return (\n <>\n {glow}\n <rect width={qW} height={totalH} rx={14} fill={nodeBg} stroke={nodeBorder} strokeWidth={selected ? 2 : 1.5} filter=\"url(#nodeShadow)\" />\n <clipPath id={`qhdr-${node.id}`}>\n <rect width={qW} height={Q_BASE_H} rx={14} />\n </clipPath>\n <rect width={qW} height={Q_BASE_H} fill={amberSoft} clipPath={`url(#qhdr-${node.id})`} />\n <rect x={0} y={0} width={4} height={Q_BASE_H} rx={2} fill={amber} />\n <rect x={12} y={14} width={28} height={28} rx={8} fill={amber} />\n <text x={26} y={33} textAnchor=\"middle\" fontSize={15} fontWeight=\"900\" fill=\"white\" style={STYLE_LABEL}>?</text>\n <text style={STYLE_LABEL}\n fontFamily=\"ui-sans-serif,system-ui,sans-serif\">\n <tspan x={50} y={27} fontSize={9} fontWeight={700} fill={textSub} letterSpacing={0.6} textAnchor=\"start\">QUESTION</tspan>\n <tspan x={50} dy={15} fontSize={13} fontWeight={700} fill={selected ? amber : textMain} textAnchor=\"start\">\n {node.label}\n </tspan>\n </text>\n <line x1={0} y1={Q_BASE_H} x2={qW} y2={Q_BASE_H} stroke={amberLine} strokeWidth={1} />\n {answers.length === 0 && (\n <>\n <text x={qW / 2} y={Q_BASE_H + 22} textAnchor=\"middle\" fontSize={10} fill={amber} opacity={0.4} fontWeight={600} style={STYLE_LABEL}>\n No answers yet\n </text>\n <text x={qW / 2} y={Q_BASE_H + 36} textAnchor=\"middle\" fontSize={9} fill={textSub} opacity={0.7} style={STYLE_LABEL}>\n Open panel → Add Answer\n </text>\n </>\n )}\n {answers.map((ans, i) => {\n const prevW = answers.slice(0, i).reduce((s, a) => s + answerCardW(a) + Q_CARD_PAD, 0);\n const cW = answerCardW(ans);\n const cardX = Q_CARD_PAD + prevW;\n const cardY = Q_BASE_H + 7;\n const cardH = Q_ANS_ROW_H - 20;\n const cx = cardX + cW / 2;\n const connected = edges.some(e => e.from === node.id && e.label === ans);\n const letter = i < 26 ? ANSWER_LETTERS[i] : `${i + 1}`;\n const maxChars = Math.max(2, Math.floor((cW - 20) / 7.5));\n const displayAns = ans.length > maxChars ? ans.slice(0, maxChars - 1) + '…' : ans;\n\n return (\n <g key={ans + i}>\n <rect x={cardX} y={cardY} width={cW} height={cardH} rx={8}\n fill={connected ? cardBgConnected : cardBg}\n stroke={connected ? amber : cardBorder} strokeWidth={connected ? 1.5 : 1} />\n <rect x={cx - 11} y={cardY + 7} width={22} height={22} rx={6}\n fill={connected ? amber : (isDark ? '#1e293b' : '#fef3c7')} />\n <text x={cx} y={cardY + 22} textAnchor=\"middle\" fontSize={10} fontWeight={800}\n fill={connected ? '#fff' : amber}\n style={STYLE_LABEL}>\n {letter}\n </text>\n <text x={cx} y={cardY + 46} textAnchor=\"middle\" fontSize={11} fontWeight={500}\n fill={connected ? (isDark ? '#fef3c7' : '#92400e') : textAns}\n fontFamily=\"ui-sans-serif,system-ui,sans-serif\"\n style={STYLE_LABEL}>\n {displayAns}\n </text>\n <circle\n cx={cx} cy={portRowY} r={7}\n fill={connected ? amber : (isDark ? '#0f172a' : '#fff')}\n stroke={amber} strokeWidth={1.5}\n style={STYLE_PORT_HOVER}\n onMouseDown={e => onAnswerPortDown(e, node.id, ans, cx, portRowY)}\n />\n <path\n d={`M ${cx - 3} ${portRowY - 2} L ${cx} ${portRowY + 2} L ${cx + 3} ${portRowY - 2}`}\n fill=\"none\" stroke={connected ? '#fff' : amber} strokeWidth={1.5} strokeLinecap=\"round\" strokeLinejoin=\"round\"\n style={STYLE_NO_EVENTS}\n />\n </g>\n );\n })}\n </>\n );\n}\n\n// ── Edge ───────────────────────────────────────────────────────────────────\nexport function EdgeLine({ edge, nodes, variant, t, isDark, acc, editing, editValue, onEditChange, onEditCommit, onEditCancel, onDoubleClick, onContextMenu, onWaypointDown }: {\n edge: DiagramEdge; nodes: DiagramNode[]; variant: DiagramVariant;\n t: ThemeColors; isDark: boolean;\n acc: { color: string };\n editing?: boolean;\n editValue?: string;\n onEditChange?: (v: string) => void;\n onEditCommit?: () => void;\n onEditCancel?: () => void;\n onDoubleClick?: (edgeId: string) => void;\n onContextMenu?: (e: React.MouseEvent, edgeId: string) => void;\n onWaypointDown?: (e: React.MouseEvent, edgeId: string) => void;\n}) {\n const [hovered, setHovered] = useState(false);\n const from = nodes.find(n => n.id === edge.from);\n const to = nodes.find(n => n.id === edge.to);\n if (!from || !to) return null;\n\n let x1: number, y1: number, exitDir: 'bottom' | 'right' | 'left' = 'bottom';\n const amberColor = isDark ? C.amberDark : C.amber;\n\n if (variant === 'question') {\n const answers: string[] = (from.metadata?.answers as string[] | undefined) ?? [];\n const idx = answers.indexOf(edge.label ?? '');\n if (idx >= 0) {\n const prevW = answers.slice(0, idx).reduce((s, a) => s + answerCardW(a) + Q_CARD_PAD, 0);\n const cW = answerCardW(answers[idx]);\n x1 = (from.x ?? 0) + Q_CARD_PAD + prevW + cW / 2;\n y1 = (from.y ?? 0) + Q_BASE_H + Q_ANS_ROW_H - 8;\n exitDir = 'bottom';\n } else {\n const fqW = questionNodeW(from);\n x1 = (from.x ?? 0) + fqW / 2;\n y1 = (from.y ?? 0) + questionNodeH(answers);\n }\n } else {\n const fnW = nodeWidth(from.label);\n x1 = (from.x ?? 0) + fnW / 2;\n y1 = (from.y ?? 0) + NODE_H;\n }\n\n const toW = variant === 'question' ? questionNodeW(to) : nodeWidth(to.label);\n const x2 = (to.x ?? 0) + toW / 2;\n const y2 = to.y ?? 0;\n const wp = edge.waypoint;\n const d = wp ? bezierPathVia(x1, y1, wp.x, wp.y, x2, y2) : bezierPath(x1, y1, x2, y2, exitDir);\n // Handle position: at the waypoint when set; otherwise at the natural midpoint of the cubic.\n const hx = wp ? wp.x : (x1 + x2) / 2;\n const hy = wp ? wp.y : (y1 + y2) / 2;\n const mx = hx, my = hy - 8;\n const dash = edge.style === 'dashed' ? '7 4' : edge.style === 'dotted' ? '2 4' : undefined;\n const edgeClr = variant === 'question' ? amberColor : t.edgeColor;\n\n const isAmber = variant === 'question';\n const labelW = edge.label ? Math.max(60, Math.ceil(estimateTextW(edge.label, 7) + 18)) : 60;\n const showHandle = !!onWaypointDown && (hovered || !!wp);\n // The `edge-flow` / `edge-flow-amber` classes apply an animated flowing\n // dasharray for solid edges. When the user explicitly picks `dashed` or\n // `dotted`, honor that pattern statically — the animation would override\n // it and confuse the chosen meaning.\n const flowClass = dash ? undefined : isAmber ? 'edge-flow-amber' : 'edge-flow';\n return (\n <g\n onDoubleClick={(e) => { e.stopPropagation(); onDoubleClick?.(edge.id); }}\n onContextMenu={(e) => { onContextMenu?.(e, edge.id); }}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n >\n <path d={d} fill=\"none\" stroke=\"transparent\" strokeWidth={14} style={STYLE_EDGE_HIT} />\n <path\n d={d} fill=\"none\" stroke={edgeClr}\n strokeWidth={isAmber ? 2 : 1.5}\n strokeLinecap=\"round\"\n className={flowClass}\n strokeDasharray={dash}\n markerEnd={isAmber ? 'url(#arrowAmber)' : 'url(#arrowhead)'}\n opacity={isAmber ? 0.85 : 0.9}\n style={STYLE_NO_EVENTS}\n />\n {showHandle && (\n <circle\n cx={hx} cy={hy} r={wp ? 5 : 4}\n fill={wp ? acc.color : (isDark ? '#1e293b' : '#fff')}\n stroke={acc.color} strokeWidth={1.5}\n style={STYLE_WAYPOINT}\n onMouseDown={(e) => { e.stopPropagation(); onWaypointDown?.(e, edge.id); }}\n />\n )}\n {editing && !isAmber ? (\n <foreignObject x={mx - labelW / 2} y={my - 12} width={labelW} height={22}>\n <input\n autoFocus\n value={editValue ?? ''}\n onChange={(e) => onEditChange?.(e.target.value)}\n onBlur={() => onEditCommit?.()}\n onKeyDown={(e) => {\n if (e.key === 'Enter') { e.preventDefault(); onEditCommit?.(); }\n if (e.key === 'Escape') { e.preventDefault(); onEditCancel?.(); }\n }}\n onMouseDown={(e) => e.stopPropagation()}\n style={{\n width: '100%', height: '100%', border: 'none', borderRadius: 6,\n outline: `2px solid ${acc.color}`,\n textAlign: 'center', fontSize: 10, fontWeight: 500,\n background: t.inputBg, color: t.inputText,\n boxSizing: 'border-box', padding: '0 6px', fontFamily: 'inherit',\n }}\n />\n </foreignObject>\n ) : edge.label && !isAmber ? (\n <>\n <rect x={mx - labelW / 2} y={my - 11} width={labelW} height={19} rx={5}\n fill={t.panelBg} stroke={t.cardBorder} strokeWidth={1}\n style={STYLE_EDGE_LABEL_HIT} />\n <text x={mx} y={my + 4} textAnchor=\"middle\" fontSize={10} fill={t.textSecondary}\n fontFamily=\"ui-sans-serif,system-ui,sans-serif\" fontWeight=\"500\"\n style={STYLE_LABEL}>{edge.label}</text>\n </>\n ) : null}\n </g>\n );\n}\n","import type { DiagramNode, DiagramVariant } from '../core/types.js';\n\n// Fixed heights; widths are dynamic per-node.\nexport const NODE_H = 48;\nexport const Q_BASE_H = 68;\nexport const Q_ANS_ROW_H = 80;\nexport const GRID = 24;\nexport const Q_CARD_PAD = 8;\n\n// Width bounds.\nexport const MIN_NODE_W = 120;\nexport const MAX_NODE_W = 320;\nexport const MIN_Q_W = 220;\nexport const MAX_Q_W = 400;\n\n/** Estimate text width at ~7.5px/char (13px ui-sans-serif mixed-case). */\nexport function estimateTextW(text: string, pxPerChar = 7.5): number {\n return text.length * pxPerChar;\n}\n\n/** Dynamic width for standard nodes based on label length. */\nexport function nodeWidth(label: string): number {\n return Math.min(MAX_NODE_W, Math.max(MIN_NODE_W, Math.ceil(estimateTextW(label) + 48)));\n}\n\n/** Width of a single answer card based on its text content. */\nexport function answerCardW(ans: string): number {\n return Math.max(86, Math.ceil(Math.max(estimateTextW(ans, 7.5) + 20, 56) + 32));\n}\n\n/** Dynamic width for question nodes — header vs. sum of side-by-side answer cards. */\nexport function questionNodeW(node: DiagramNode): number {\n const answers = (node.metadata?.answers as string[] | undefined) ?? [];\n const headerW = estimateTextW(node.label, 8) + 80;\n if (answers.length === 0) return Math.max(MIN_Q_W, Math.ceil(headerW));\n const cardsW =\n answers.reduce((s, a) => s + answerCardW(a), 0) +\n (answers.length - 1) * Q_CARD_PAD +\n 2 * Q_CARD_PAD;\n return Math.max(MIN_Q_W, Math.ceil(Math.max(headerW, cardsW)));\n}\n\nexport function questionNodeH(answers: string[]): number {\n return Q_BASE_H + (answers.length === 0 ? 48 : Q_ANS_ROW_H);\n}\n\n/** Variant-aware width × height for a node, in canvas units. */\nexport function nodeDims(node: DiagramNode, variant: DiagramVariant): { w: number; h: number } {\n if (variant === 'question') {\n const answers = (node.metadata?.answers as string[] | undefined) ?? [];\n return { w: questionNodeW(node), h: questionNodeH(answers) };\n }\n return { w: nodeWidth(node.label), h: NODE_H };\n}\n\n/** Snap a value to the nearest grid step. */\nexport function snap(v: number): number {\n return Math.round(v / GRID) * GRID;\n}\n\n/**\n * Cubic-bezier path between two ports. The default `bottom` direction pulls the\n * source control point straight down and the target control point straight up,\n * producing the natural S-curve used by the canvas. `right`/`left` exits add\n * lateral pull for ports that emerge from a node's side (answer cards).\n */\nexport function bezierPath(\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n exitDir: 'bottom' | 'right' | 'left' = 'bottom',\n): string {\n if (exitDir === 'right') {\n const dx = Math.abs(x2 - x1),\n dy = Math.abs(y2 - y1);\n const c = Math.max(60, (dx + dy) * 0.45);\n return `M ${x1} ${y1} C ${x1 + c} ${y1}, ${x2} ${y2 - c * 0.5}, ${x2} ${y2}`;\n }\n if (exitDir === 'left') {\n const dx = Math.abs(x2 - x1),\n dy = Math.abs(y2 - y1);\n const c = Math.max(60, (dx + dy) * 0.45);\n return `M ${x1} ${y1} C ${x1 - c} ${y1}, ${x2} ${y2 - c * 0.5}, ${x2} ${y2}`;\n }\n const dy = y2 - y1;\n const dyAbs = Math.abs(dy);\n const dxAbs = Math.abs(x2 - x1);\n const base = dy > 0 ? dyAbs * 0.55 : Math.max(90, dyAbs * 0.5 + dxAbs * 0.28);\n const curve = Math.max(36, Math.min(220, base));\n return `M ${x1} ${y1} C ${x1} ${y1 + curve}, ${x2} ${y2 - curve}, ${x2} ${y2}`;\n}\n\n/**\n * Two-segment cubic path that passes through `(wx, wy)` as a hard waypoint.\n * Each segment uses the same vertical-pull logic as `bezierPath`. The result\n * is one continuous path command: `M src C ... wx wy C ... dst`.\n */\nexport function bezierPathVia(\n x1: number,\n y1: number,\n wx: number,\n wy: number,\n x2: number,\n y2: number,\n): string {\n const seg1 = bezierPath(x1, y1, wx, wy, 'bottom');\n const seg2 = bezierPath(wx, wy, x2, y2, 'bottom');\n // seg2 starts with `M wx wy ` — strip it so the path continues from\n // the end of seg1 (which is already at `wx, wy`).\n const seg2NoM = seg2.replace(/^M\\s+-?[\\d.]+\\s+-?[\\d.]+\\s+/, '');\n return seg1 + ' ' + seg2NoM;\n}\n\n/** Approximate midpoint of the cubic path produced by `bezierPath`. */\nexport function bezierMidpoint(\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n): { x: number; y: number } {\n // The cubic uses control points (x1, y1+curve) and (x2, y2-curve). At t=0.5\n // a cubic bezier evaluates to (P0+3P1+3P2+P3)/8. So Y is:\n // (y1 + 3(y1+curve) + 3(y2-curve) + y2) / 8 = (4y1 + 4y2) / 8 = (y1+y2)/2\n // X collapses similarly since both control points share the endpoint X.\n return { x: (x1 + x2) / 2, y: (y1 + y2) / 2 };\n}\n","import React, { useCallback, useRef } from 'react';\nimport type { DiagramModel, DiagramNode } from '../core/types.js';\n\nconst W = 168;\nconst H = 112;\nconst PAD = 18;\n\ninterface NodeBox { id: string; x: number; y: number; w: number; h: number }\n\nexport interface MinimapProps {\n model: DiagramModel;\n /** Canvas viewport size (the visible SVG element bounds, in CSS pixels). */\n viewportW: number;\n viewportH: number;\n /** Current pan/zoom transform from the parent canvas. */\n transform: { x: number; y: number; scale: number };\n /** Compute width+height for a node, matching the canvas's measurements. */\n measureNode(node: DiagramNode): { w: number; h: number };\n /** Center the canvas on a content-space point. */\n onCenterOn(contentX: number, contentY: number): void;\n isDark: boolean;\n accentColor: string;\n}\n\nexport function Minimap({\n model, viewportW, viewportH, transform, measureNode, onCenterOn, isDark, accentColor,\n}: MinimapProps) {\n const dragRef = useRef<{ active: boolean } | null>(null);\n\n const boxes: NodeBox[] = model.nodes.map(n => {\n const { w, h } = measureNode(n);\n return { id: n.id, x: n.x ?? 0, y: n.y ?? 0, w, h };\n });\n\n if (boxes.length === 0) return null;\n\n // Content bounding box, plus the current viewport rect (in content space).\n const vx = -transform.x / transform.scale;\n const vy = -transform.y / transform.scale;\n const vw = viewportW / transform.scale;\n const vh = viewportH / transform.scale;\n\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const b of boxes) {\n minX = Math.min(minX, b.x); minY = Math.min(minY, b.y);\n maxX = Math.max(maxX, b.x + b.w); maxY = Math.max(maxY, b.y + b.h);\n }\n // Include the viewport so the user always sees their current position.\n minX = Math.min(minX, vx); minY = Math.min(minY, vy);\n maxX = Math.max(maxX, vx + vw); maxY = Math.max(maxY, vy + vh);\n\n const contentW = Math.max(1, maxX - minX);\n const contentH = Math.max(1, maxY - minY);\n const scale = Math.min((W - PAD * 2) / contentW, (H - PAD * 2) / contentH);\n const offsetX = (W - contentW * scale) / 2 - minX * scale;\n const offsetY = (H - contentH * scale) / 2 - minY * scale;\n\n const project = (x: number, y: number) => ({\n x: offsetX + x * scale,\n y: offsetY + y * scale,\n });\n\n const unproject = (mx: number, my: number) => ({\n x: (mx - offsetX) / scale,\n y: (my - offsetY) / scale,\n });\n\n const panTo = useCallback((e: React.MouseEvent<SVGSVGElement>) => {\n const rect = e.currentTarget.getBoundingClientRect();\n const mx = e.clientX - rect.left;\n const my = e.clientY - rect.top;\n const { x, y } = unproject(mx, my);\n onCenterOn(x, y);\n }, [onCenterOn, scale, offsetX, offsetY]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const onMouseDown = (e: React.MouseEvent<SVGSVGElement>) => {\n e.stopPropagation();\n dragRef.current = { active: true };\n panTo(e);\n };\n const onMouseMove = (e: React.MouseEvent<SVGSVGElement>) => {\n if (!dragRef.current?.active) return;\n panTo(e);\n };\n const onMouseUp = () => { dragRef.current = null; };\n\n const bg = isDark ? 'rgba(15,23,42,0.92)' : 'rgba(255,255,255,0.94)';\n const border = isDark ? '#334155' : '#e2e8f0';\n const nodeFill = isDark ? '#475569' : '#cbd5e1';\n const viewStroke = accentColor;\n const viewFill = `${accentColor}22`;\n\n // Viewport rect projected into mini-space.\n const vp1 = project(vx, vy);\n const vp2 = project(vx + vw, vy + vh);\n const vpRect = {\n x: Math.max(0, Math.min(W, vp1.x)),\n y: Math.max(0, Math.min(H, vp1.y)),\n w: Math.max(2, Math.min(W, vp2.x) - Math.max(0, vp1.x)),\n h: Math.max(2, Math.min(H, vp2.y) - Math.max(0, vp1.y)),\n };\n\n return (\n <div\n aria-label=\"Minimap — click to re-center the viewport\"\n role=\"img\"\n style={{\n position: 'absolute', bottom: 14, right: 14,\n background: bg, border: `1px solid ${border}`,\n borderRadius: 10, padding: 6,\n boxShadow: isDark ? '0 8px 20px rgba(0,0,0,0.45)' : '0 6px 18px rgba(15,23,42,0.08)',\n backdropFilter: 'blur(6px)',\n }}\n >\n <svg\n width={W} height={H}\n style={{ display: 'block', cursor: 'grab', borderRadius: 6 }}\n onMouseDown={onMouseDown}\n onMouseMove={onMouseMove}\n onMouseUp={onMouseUp}\n onMouseLeave={onMouseUp}\n >\n <rect width={W} height={H} rx={6} fill={isDark ? '#0f172a' : '#fafbfc'} />\n {boxes.map(b => {\n const p = project(b.x, b.y);\n return (\n <rect\n key={b.id}\n x={p.x} y={p.y}\n width={Math.max(2, b.w * scale)} height={Math.max(2, b.h * scale)}\n rx={2} fill={nodeFill}\n />\n );\n })}\n <rect\n x={vpRect.x} y={vpRect.y}\n width={vpRect.w} height={vpRect.h}\n rx={3}\n fill={viewFill} stroke={viewStroke} strokeWidth={1.25}\n />\n </svg>\n </div>\n );\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport type { ThemeColors } from './theme.js';\n\nexport interface CtxMenuState {\n x: number;\n y: number;\n nodeId: string | null;\n edgeId?: string | null;\n}\n\nexport interface ContextMenuProps {\n x: number; y: number; nodeId: string | null; edgeId?: string | null;\n isDark: boolean; t: ThemeColors; acc: { color: string };\n canUndo: boolean; canRedo: boolean;\n onUndo(): void; onRedo(): void; onReCenter(): void; onAddNode(): void;\n onDuplicate(): void; onRename(): void; onDelete(): void; onDisconnect(): void;\n onEdgeRename?(): void;\n onEdgeStyle?(style: 'solid' | 'dashed' | 'dotted'): void;\n onEdgeArrowhead?(arrow: 'arrow' | 'none'): void;\n onEdgeDelete?(): void;\n onEdgeResetRouting?(): void;\n currentEdgeStyle?: 'solid' | 'dashed' | 'dotted';\n currentEdgeArrow?: 'arrow' | 'none' | 'open';\n edgeHasWaypoint?: boolean;\n containerRef: React.RefObject<HTMLDivElement | null>;\n}\n\nexport function ContextMenu({\n x, y, nodeId, edgeId, isDark, t, acc, canUndo, canRedo,\n onUndo, onRedo, onReCenter, onAddNode, onDuplicate, onRename, onDelete, onDisconnect,\n onEdgeRename, onEdgeStyle, onEdgeArrowhead, onEdgeDelete, onEdgeResetRouting,\n currentEdgeStyle, currentEdgeArrow, edgeHasWaypoint, containerRef,\n}: ContextMenuProps) {\n const menuRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState({ x, y });\n\n useEffect(() => {\n if (!menuRef.current || !containerRef.current) return;\n const m = menuRef.current.getBoundingClientRect();\n const c = containerRef.current.getBoundingClientRect();\n let nx = x, ny = y;\n if (nx + m.width > c.right - 8) nx = x - m.width;\n if (ny + m.height > c.bottom - 8) ny = y - m.height;\n setPos({ x: nx, y: ny });\n }, [x, y, containerRef]);\n\n const bg = isDark ? '#1e293b' : '#ffffff';\n const border = isDark ? '#334155' : '#e2e8f0';\n const hoverBg = isDark ? '#334155' : '#f1f5f9';\n const dividerColor = isDark ? '#334155' : '#f1f5f9';\n const text = t.textPrimary;\n const muted = t.textMuted;\n\n const item = (label: string, onClick: () => void, color?: string, disabled?: boolean): React.ReactNode => (\n <button\n key={label}\n onClick={disabled ? undefined : onClick}\n style={{\n display: 'flex', alignItems: 'center', gap: 10,\n width: '100%', padding: '7px 14px', background: 'none', border: 'none',\n textAlign: 'left', cursor: disabled ? 'default' : 'pointer',\n fontSize: 12, fontFamily: 'ui-sans-serif,system-ui,sans-serif',\n color: disabled ? muted : (color ?? text),\n opacity: disabled ? 0.4 : 1,\n borderRadius: 6,\n }}\n onMouseEnter={e => { if (!disabled) (e.currentTarget as HTMLElement).style.background = hoverBg; }}\n onMouseLeave={e => { (e.currentTarget as HTMLElement).style.background = 'none'; }}\n >\n {label}\n </button>\n );\n\n const divider = <div style={{ height: 1, background: dividerColor, margin: '4px 0' }} />;\n\n return (\n <div\n ref={menuRef}\n onMouseDown={e => e.stopPropagation()}\n style={{\n position: 'fixed', left: pos.x, top: pos.y, zIndex: 9999,\n background: bg, border: `1px solid ${border}`,\n borderRadius: 10, padding: '5px 0', minWidth: 180,\n boxShadow: isDark ? '0 8px 32px rgba(0,0,0,0.5)' : '0 8px 32px rgba(0,0,0,0.12)',\n fontFamily: 'ui-sans-serif,system-ui,sans-serif',\n }}\n >\n {edgeId ? (\n <>\n <div style={{ padding: '4px 14px 6px', fontSize: 10, fontWeight: 700, color: muted, textTransform: 'uppercase', letterSpacing: 0.8 }}>Edge</div>\n {item('Rename label (dbl-click)', () => onEdgeRename?.())}\n {divider}\n <div style={{ padding: '4px 14px 2px', fontSize: 9, fontWeight: 700, color: muted, textTransform: 'uppercase', letterSpacing: 0.8 }}>Style</div>\n {item(`Solid${currentEdgeStyle === 'solid' || !currentEdgeStyle ? ' ✓' : ''}`, () => onEdgeStyle?.('solid'))}\n {item(`Dashed${currentEdgeStyle === 'dashed' ? ' ✓' : ''}`, () => onEdgeStyle?.('dashed'))}\n {item(`Dotted${currentEdgeStyle === 'dotted' ? ' ✓' : ''}`, () => onEdgeStyle?.('dotted'))}\n {divider}\n <div style={{ padding: '4px 14px 2px', fontSize: 9, fontWeight: 700, color: muted, textTransform: 'uppercase', letterSpacing: 0.8 }}>Arrowhead</div>\n {item(`Arrow${currentEdgeArrow !== 'none' ? ' ✓' : ''}`, () => onEdgeArrowhead?.('arrow'))}\n {item(`None${currentEdgeArrow === 'none' ? ' ✓' : ''}`, () => onEdgeArrowhead?.('none'))}\n {divider}\n {item('Reset routing', () => onEdgeResetRouting?.(), undefined, !edgeHasWaypoint)}\n {item('Delete edge', () => onEdgeDelete?.(), '#ef4444')}\n </>\n ) : nodeId ? (\n <>\n <div style={{ padding: '4px 14px 6px', fontSize: 10, fontWeight: 700, color: muted, textTransform: 'uppercase', letterSpacing: 0.8 }}>Node</div>\n {item('Rename (dbl-click)', onRename)}\n {item('Duplicate', onDuplicate)}\n {item('Disconnect all edges', onDisconnect)}\n {divider}\n {item('Delete node', onDelete, '#ef4444')}\n </>\n ) : (\n <>\n <div style={{ padding: '4px 14px 6px', fontSize: 10, fontWeight: 700, color: muted, textTransform: 'uppercase', letterSpacing: 0.8 }}>Canvas</div>\n {item('Add node here', onAddNode, acc.color)}\n {item('Re-center (Ctrl+0)', onReCenter)}\n {divider}\n {item('Undo (Ctrl+Z)', onUndo, undefined, !canUndo)}\n {item('Redo (Ctrl+Y)', onRedo, undefined, !canRedo)}\n </>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport { NodeShape, QuestionNode, EdgeLine } from './render.js';\nimport { Minimap } from './Minimap.js';\nimport { ContextMenu, type CtxMenuState as CtxMenu } from './ContextMenu.js';\nimport type { DiagramModel, DiagramNode, DiagramEdge, DiagramVariant } from '../core/types.js';\nimport type { ThemeColors, VariantAccent } from './theme.js';\nimport type { AlignGuideV, AlignGuideH } from './alignment.js';\nimport type { HistoryApi } from './hooks/useHistory.js';\nimport { NODE_H, GRID, nodeDims, bezierPath } from './layout.js';\n\n// ── Hoisted static styles ──────────────────────────────────────────────────\nconst STYLE_LABEL: React.CSSProperties = { pointerEvents: 'none', userSelect: 'none' };\nconst STYLE_LIVE_PORT: React.CSSProperties = { opacity: 0.85, pointerEvents: 'none' };\nconst STYLE_NODE_GRAB: React.CSSProperties = { cursor: 'grab' };\nconst STYLE_NODE_GRABBING: React.CSSProperties = { cursor: 'grabbing' };\nconst STYLE_PORT_VISIBLE: React.CSSProperties = { cursor: 'crosshair', opacity: 1, transition: 'opacity 0.15s', pointerEvents: 'all', filter: 'drop-shadow(0 1px 3px rgba(0,0,0,0.25))' };\nconst STYLE_PORT_HIDDEN: React.CSSProperties = { cursor: 'crosshair', opacity: 0, transition: 'opacity 0.15s', pointerEvents: 'none', filter: 'drop-shadow(0 1px 3px rgba(0,0,0,0.25))' };\n\ninterface Transform { x: number; y: number; scale: number }\ninterface LiveEdge {\n fromId: string; fromX: number; fromY: number;\n exitDir: 'bottom' | 'right' | 'left'; answerLabel?: string; toX: number; toY: number;\n}\ninterface DragState { nodeId: string; ox: number; oy: number }\n\nexport interface DiagramCanvasProps {\n model: DiagramModel;\n variant: DiagramVariant;\n variantLabel: string;\n t: ThemeColors;\n isDark: boolean;\n acc: VariantAccent;\n transform: Transform;\n setTransform: React.Dispatch<React.SetStateAction<Transform>>;\n // Selection\n selected: string | null;\n selectedSet: Set<string>;\n hoveredId: string | null;\n setHoveredId: (id: string | null) => void;\n // Drag\n drag: DragState | null;\n pan: { ox: number; oy: number; tx: number; ty: number } | null;\n liveEdge: LiveEdge | null;\n boxSel: { sx: number; sy: number; cx: number; cy: number; additive: boolean } | null;\n // Align guides\n alignGuides: { x?: AlignGuideV; y?: AlignGuideH } | null;\n // Edge editing\n editingEdgeId: string | null;\n editEdgeLabel: string;\n setEditEdgeLabel: (v: string) => void;\n commitEdgeEdit: () => void;\n setEditingEdgeId: (v: string | null) => void;\n beginEditEdge: (edgeId: string) => void;\n onEdgeContextMenu: (e: React.MouseEvent, edgeId: string) => void;\n setWaypointDrag: (edgeId: string) => void;\n // Node editing\n editingId: string | null;\n editLabel: string;\n setEditLabel: (v: string) => void;\n commitEdit: () => void;\n setEditingId: (v: string | null) => void;\n // Node interactions\n onNodeMouseDown: (e: React.MouseEvent, id: string) => void;\n onNodeMouseUp: (e: React.MouseEvent, id: string) => void;\n onNodeDblClick: (e: React.MouseEvent, id: string) => void;\n onNodeContextMenu: (e: React.MouseEvent, id: string) => void;\n onPortMouseDown: (e: React.MouseEvent, nodeId: string) => void;\n onAnswerPortDown: (e: React.MouseEvent, nodeId: string, answer: string, portX: number, portY: number) => void;\n // SVG interactions\n onSvgMouseDown: (e: React.MouseEvent) => void;\n onMouseMove: (e: React.MouseEvent) => void;\n onMouseUp: () => void;\n onSvgContextMenu: (e: React.MouseEvent) => void;\n // Canvas features\n reducedMotion: boolean;\n isCoarse: boolean;\n portR: number;\n shadowClr: string;\n arrowClr: string;\n amberArrow: string;\n // Viewport (for minimap)\n viewport: { w: number; h: number };\n // Refs\n svgRef: React.RefObject<SVGSVGElement | null>;\n containerRef: React.RefObject<HTMLDivElement | null>;\n // Context menu\n ctxMenu: CtxMenu | null;\n history: Pick<HistoryApi<DiagramModel>, 'canUndo' | 'canRedo'>;\n onCtxUndo: () => void;\n onCtxRedo: () => void;\n onCtxReCenter: () => void;\n onCtxAddNode: () => void;\n onCtxDuplicate: () => void;\n onCtxRename: () => void;\n onCtxDelete: () => void;\n onCtxDisconnect: () => void;\n ctxEdgeStyle: 'solid' | 'dashed' | 'dotted';\n ctxEdgeArrow: 'arrow' | 'none';\n ctxEdgeHasWaypoint: boolean;\n onCtxEdgeRename: () => void;\n onCtxEdgeStyle: (s: 'solid' | 'dashed' | 'dotted') => void;\n onCtxEdgeArrowhead: (a: 'arrow' | 'none') => void;\n onCtxEdgeDelete: () => void;\n onCtxEdgeResetRouting: () => void;\n}\n\n/**\n * The SVG canvas layer of the flowchart editor — background grid, edges,\n * nodes, live-edge preview, alignment guides, box-select overlay, minimap,\n * and context menu. Extracted from `DiagramEditor` so the orchestrator\n * focuses on state + handlers while this component owns rendering.\n */\nexport function DiagramCanvas(props: DiagramCanvasProps) {\n const {\n model, variant, variantLabel, t, isDark, acc,\n transform, setTransform,\n selected, selectedSet, hoveredId, setHoveredId,\n drag, pan, liveEdge, boxSel,\n alignGuides,\n editingEdgeId, editEdgeLabel, setEditEdgeLabel, commitEdgeEdit, setEditingEdgeId, beginEditEdge, onEdgeContextMenu, setWaypointDrag,\n editingId, editLabel, setEditLabel, commitEdit, setEditingId,\n onNodeMouseDown, onNodeMouseUp, onNodeDblClick, onNodeContextMenu, onPortMouseDown, onAnswerPortDown,\n onSvgMouseDown, onMouseMove, onMouseUp, onSvgContextMenu,\n reducedMotion, isCoarse, portR, shadowClr, arrowClr, amberArrow,\n viewport,\n svgRef, containerRef,\n ctxMenu, history,\n onCtxUndo, onCtxRedo, onCtxReCenter, onCtxAddNode, onCtxDuplicate, onCtxRename, onCtxDelete, onCtxDisconnect,\n ctxEdgeStyle, ctxEdgeArrow, ctxEdgeHasWaypoint,\n onCtxEdgeRename, onCtxEdgeStyle, onCtxEdgeArrowhead, onCtxEdgeDelete, onCtxEdgeResetRouting,\n } = props;\n\n return (\n <div ref={containerRef as React.RefObject<HTMLDivElement>} style={{ flex: 1, overflow: 'hidden', position: 'relative', background: t.canvas }}>\n <svg\n ref={svgRef as React.RefObject<SVGSVGElement>}\n width=\"100%\" height=\"100%\"\n role=\"application\"\n aria-label={`${variantLabel} diagram editor. ${model.nodes.length} ${variantLabel.toLowerCase()}s, ${model.edges.length} connections. Scroll to zoom, drag to pan, click a ${variantLabel.toLowerCase()} to select.`}\n tabIndex={0}\n style={{ display: 'block', cursor: pan ? 'grabbing' : drag ? 'grabbing' : liveEdge ? 'crosshair' : 'default', userSelect: 'none', outline: 'none' }}\n onMouseDown={onSvgMouseDown}\n onMouseMove={onMouseMove}\n onMouseUp={onMouseUp}\n onMouseLeave={onMouseUp}\n onContextMenu={onSvgContextMenu}\n >\n <defs>\n <style>{reducedMotion ? `\n .edge-flow { stroke-dasharray: 0; }\n .edge-flow-amber { stroke-dasharray: 0; }\n .edge-live { stroke-dasharray: 4 4; }\n ` : `\n @keyframes edgeFlow { to { stroke-dashoffset: -13; } }\n @keyframes edgeFlowFast { to { stroke-dashoffset: -13; } }\n .edge-flow { stroke-dasharray: 8 5; animation: edgeFlow 0.9s linear infinite; }\n .edge-flow-amber { stroke-dasharray: 6 4; animation: edgeFlowFast 0.65s linear infinite; }\n .edge-live { stroke-dasharray: 7 5; animation: edgeFlow 0.55s linear infinite; }\n `}</style>\n <pattern id=\"dots\" width={GRID} height={GRID} patternUnits=\"userSpaceOnUse\">\n <circle cx={GRID / 2} cy={GRID / 2} r={1.1} fill={t.dot} />\n </pattern>\n <filter id=\"nodeShadow\" x=\"-25%\" y=\"-25%\" width=\"150%\" height=\"160%\">\n <feDropShadow dx=\"0\" dy=\"3\" stdDeviation=\"5\" floodColor={shadowClr} floodOpacity=\"1\" />\n </filter>\n <marker id=\"arrowhead\" markerWidth=\"9\" markerHeight=\"7\" refX=\"8\" refY=\"3.5\" orient=\"auto\" markerUnits=\"strokeWidth\">\n <path d=\"M0,0.5 L9,3.5 L0,6.5 L2.2,3.5 Z\" fill={arrowClr} />\n </marker>\n <marker id=\"arrowAmber\" markerWidth=\"9\" markerHeight=\"7\" refX=\"8\" refY=\"3.5\" orient=\"auto\" markerUnits=\"strokeWidth\">\n <path d=\"M0,0.5 L9,3.5 L0,6.5 L2.2,3.5 Z\" fill={amberArrow} />\n </marker>\n <marker id=\"arrowLive\" markerWidth=\"9\" markerHeight=\"7\" refX=\"8\" refY=\"3.5\" orient=\"auto\" markerUnits=\"strokeWidth\">\n <path d=\"M0,0.5 L9,3.5 L0,6.5 L2.2,3.5 Z\" fill={acc.color} />\n </marker>\n </defs>\n\n <rect width=\"100%\" height=\"100%\" fill=\"url(#dots)\" data-bg=\"1\" />\n\n <g transform={`translate(${transform.x},${transform.y}) scale(${transform.scale})`}>\n {model.edges.map(e => (\n <EdgeLine\n key={e.id} edge={e} nodes={model.nodes} variant={variant} t={t} isDark={isDark} acc={acc}\n editing={editingEdgeId === e.id}\n editValue={editEdgeLabel}\n onEditChange={setEditEdgeLabel}\n onEditCommit={commitEdgeEdit}\n onEditCancel={() => setEditingEdgeId(null)}\n onDoubleClick={beginEditEdge}\n onContextMenu={onEdgeContextMenu}\n onWaypointDown={(ev, edgeId) => setWaypointDrag(edgeId)}\n />\n ))}\n\n {liveEdge && (() => {\n const d = bezierPath(liveEdge.fromX, liveEdge.fromY, liveEdge.toX, liveEdge.toY, liveEdge.exitDir);\n return <path d={d} fill=\"none\" stroke={acc.color} strokeWidth={2} strokeLinecap=\"round\" className=\"edge-live\" opacity={0.8} markerEnd=\"url(#arrowLive)\" />;\n })()}\n\n {alignGuides?.x && (\n <line\n x1={alignGuides.x.pos} x2={alignGuides.x.pos}\n y1={alignGuides.x.minY} y2={alignGuides.x.maxY}\n stroke={acc.color} strokeWidth={1 / transform.scale}\n strokeDasharray={`${4 / transform.scale} ${3 / transform.scale}`}\n opacity={0.85} pointerEvents=\"none\"\n />\n )}\n {alignGuides?.y && (\n <line\n y1={alignGuides.y.pos} y2={alignGuides.y.pos}\n x1={alignGuides.y.minX} x2={alignGuides.y.maxX}\n stroke={acc.color} strokeWidth={1 / transform.scale}\n strokeDasharray={`${4 / transform.scale} ${3 / transform.scale}`}\n opacity={0.85} pointerEvents=\"none\"\n />\n )}\n\n {model.nodes.map((node, idx) => {\n const isHovered = hoveredId === node.id;\n const isQuestion = variant === 'question';\n const { w: nW } = nodeDims(node, variant);\n const isSelected = selectedSet.has(node.id);\n\n return (\n <g\n key={node.id}\n transform={`translate(${node.x ?? 0},${node.y ?? 0})`}\n role=\"button\"\n tabIndex={0}\n aria-label={`${variantLabel} ${variant === 'journey' ? idx + 1 + ': ' : ''}${node.label}${isSelected ? ', selected' : ''}`}\n style={drag?.nodeId === node.id ? STYLE_NODE_GRABBING : STYLE_NODE_GRAB}\n onMouseDown={e => onNodeMouseDown(e, node.id)}\n onMouseUp={e => onNodeMouseUp(e, node.id)}\n onDoubleClick={e => onNodeDblClick(e, node.id)}\n onContextMenu={e => onNodeContextMenu(e, node.id)}\n onMouseEnter={() => setHoveredId(node.id)}\n onMouseLeave={() => setHoveredId(null)}\n onFocus={() => setHoveredId(node.id)}\n onBlur={() => setHoveredId(null)}\n onKeyDown={e => {\n if (e.key === 'F2' || (e.key === 'Enter' && !e.ctrlKey && !e.metaKey)) {\n e.preventDefault();\n setEditingId(node.id);\n setEditLabel(node.label);\n }\n }}\n >\n <title>{`${variantLabel}: ${node.label}`}</title>\n {isQuestion ? (\n <QuestionNode node={node} selected={isSelected} edges={model.edges} isDark={isDark} onAnswerPortDown={onAnswerPortDown} qW={nW} />\n ) : (\n <>\n <NodeShape node={node} selected={isSelected} variant={variant} stepNumber={variant === 'journey' ? idx + 1 : undefined} t={t} isDark={isDark} w={nW} />\n {editingId === node.id ? (\n <foreignObject x={6} y={6} width={nW - 12} height={NODE_H - 12}>\n <input\n autoFocus\n value={editLabel}\n onChange={e => setEditLabel(e.target.value)}\n onBlur={commitEdit}\n onKeyDown={e => { if (e.key === 'Enter') commitEdit(); if (e.key === 'Escape') setEditingId(null); }}\n style={{ width: '100%', height: '100%', border: 'none', borderRadius: 6, outline: `2px solid ${acc.color}`, textAlign: 'center', fontSize: 13, fontWeight: 500, background: t.inputBg, boxSizing: 'border-box', padding: '0 6px', fontFamily: 'inherit', color: t.inputText }}\n />\n </foreignObject>\n ) : (\n <text x={nW / 2} y={NODE_H / 2 + 5} textAnchor=\"middle\" fontSize={13} fontWeight=\"500\" fontFamily=\"ui-sans-serif,system-ui,sans-serif\" fill={isSelected ? acc.color : t.textPrimary} style={STYLE_LABEL}>\n {node.label}\n </text>\n )}\n <circle\n cx={nW / 2} cy={NODE_H + 1} r={portR}\n fill={acc.color} stroke={isDark ? '#0f172a' : 'white'} strokeWidth={2}\n style={isHovered || isCoarse ? STYLE_PORT_VISIBLE : STYLE_PORT_HIDDEN}\n onMouseDown={e => onPortMouseDown(e, node.id)}\n />\n </>\n )}\n\n {liveEdge && liveEdge.fromId !== node.id && (\n <circle cx={nW / 2} cy={-1} r={portR} fill={acc.color} stroke={isDark ? '#0f172a' : 'white'} strokeWidth={2} style={STYLE_LIVE_PORT} />\n )}\n </g>\n );\n })}\n </g>\n </svg>\n\n {boxSel && Math.abs(boxSel.cx - boxSel.sx) + Math.abs(boxSel.cy - boxSel.sy) > 4 && containerRef.current && (() => {\n const rect = containerRef.current.getBoundingClientRect();\n const left = Math.min(boxSel.sx, boxSel.cx) - rect.left;\n const top = Math.min(boxSel.sy, boxSel.cy) - rect.top;\n const w = Math.abs(boxSel.cx - boxSel.sx);\n const h = Math.abs(boxSel.cy - boxSel.sy);\n return (\n <div\n style={{\n position: 'absolute', left, top, width: w, height: h,\n border: `1px dashed ${acc.color}`,\n background: isDark ? 'rgba(99,102,241,0.10)' : 'rgba(99,102,241,0.08)',\n pointerEvents: 'none', borderRadius: 4,\n }}\n />\n );\n })()}\n\n {model.nodes.length === 0 && (\n <div style={{ position: 'absolute', inset: 0, display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', pointerEvents: 'none', gap: 8 }}>\n <div style={{ fontSize: 36, opacity: 0.1, color: t.textPrimary }}>{variant === 'question' ? '?' : variant === 'journey' ? '↗' : '⬡'}</div>\n <div style={{ fontSize: 13, color: t.textMuted, fontWeight: 500 }}>Click <strong style={{ color: acc.color }}>+ {variantLabel}</strong> to start</div>\n </div>\n )}\n\n {model.nodes.length > 0 && viewport.w > 0 && (\n <Minimap\n model={model}\n viewportW={viewport.w}\n viewportH={viewport.h}\n transform={transform}\n isDark={isDark}\n accentColor={acc.color}\n measureNode={(n) => nodeDims(n, variant)}\n onCenterOn={(cx, cy) => {\n setTransform(tr => ({ ...tr, x: viewport.w / 2 - cx * tr.scale, y: viewport.h / 2 - cy * tr.scale }));\n }}\n />\n )}\n\n {ctxMenu && (\n <ContextMenu\n x={ctxMenu.x} y={ctxMenu.y}\n nodeId={ctxMenu.nodeId} edgeId={ctxMenu.edgeId}\n isDark={isDark} t={t} acc={acc}\n canUndo={history.canUndo}\n canRedo={history.canRedo}\n onUndo={onCtxUndo}\n onRedo={onCtxRedo}\n onReCenter={onCtxReCenter}\n onAddNode={onCtxAddNode}\n onDuplicate={onCtxDuplicate}\n onRename={onCtxRename}\n onDelete={onCtxDelete}\n onDisconnect={onCtxDisconnect}\n currentEdgeStyle={ctxEdgeStyle}\n currentEdgeArrow={ctxEdgeArrow}\n edgeHasWaypoint={ctxEdgeHasWaypoint}\n onEdgeRename={onCtxEdgeRename}\n onEdgeStyle={onCtxEdgeStyle}\n onEdgeArrowhead={onCtxEdgeArrowhead}\n onEdgeDelete={onCtxEdgeDelete}\n onEdgeResetRouting={onCtxEdgeResetRouting}\n containerRef={containerRef}\n />\n )}\n </div>\n );\n}\n","import { useCallback, useRef, useState } from 'react';\n\nconst MAX_HISTORY = 80;\n\nexport interface HistoryApi<T> {\n state: T;\n /** Replace state without recording history (e.g. mid-drag). */\n apply: (next: T) => void;\n /** Replace state AND push the previous-to-this snapshot onto the undo stack. */\n applyAndPush: (next: T) => void;\n undo: () => void;\n redo: () => void;\n canUndo: boolean;\n canRedo: boolean;\n}\n\n/**\n * Linear undo/redo history bounded to MAX_HISTORY entries. The initial value\n * counts as the first entry, so calling `applyAndPush` then `undo` returns to\n * the initial state. `onChange` fires for every state replacement, including\n * undo/redo navigation.\n */\nexport function useHistory<T>(initial: T, onChange?: (next: T) => void): HistoryApi<T> {\n const [state, setState] = useState<T>(initial);\n const stackRef = useRef<T[]>([initial]);\n const idxRef = useRef(0);\n // Force re-renders when canUndo/canRedo flip (refs alone don't trigger renders).\n const [, setTick] = useState(0);\n const bump = () => setTick((n) => n + 1);\n\n const apply = useCallback(\n (next: T) => {\n setState(next);\n onChange?.(next);\n },\n [onChange],\n );\n\n const applyAndPush = useCallback(\n (next: T) => {\n const stack = stackRef.current.slice(0, idxRef.current + 1);\n stack.push(next);\n if (stack.length > MAX_HISTORY) stack.shift();\n stackRef.current = stack;\n idxRef.current = stack.length - 1;\n setState(next);\n onChange?.(next);\n bump();\n },\n [onChange],\n );\n\n const undo = useCallback(() => {\n if (idxRef.current <= 0) return;\n idxRef.current--;\n const next = stackRef.current[idxRef.current];\n setState(next);\n onChange?.(next);\n bump();\n }, [onChange]);\n\n const redo = useCallback(() => {\n if (idxRef.current >= stackRef.current.length - 1) return;\n idxRef.current++;\n const next = stackRef.current[idxRef.current];\n setState(next);\n onChange?.(next);\n bump();\n }, [onChange]);\n\n return {\n state,\n apply,\n applyAndPush,\n undo,\n redo,\n canUndo: idxRef.current > 0,\n canRedo: idxRef.current < stackRef.current.length - 1,\n };\n}\n","import { useEffect, type RefObject } from 'react';\n\ninterface Transform {\n x: number;\n y: number;\n scale: number;\n}\n\n/**\n * Attaches a non-passive wheel listener that pans + zooms `transform` around\n * the cursor position. Non-passive is required so we can `preventDefault()`\n * the page scroll on the canvas.\n */\nexport function useCanvasWheel(\n ref: RefObject<SVGSVGElement>,\n setTransform: (updater: (t: Transform) => Transform) => void,\n options: { min?: number; max?: number; factor?: number } = {},\n): void {\n const { min = 0.15, max = 3, factor = 0.1 } = options;\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n const onWheel = (e: WheelEvent) => {\n e.preventDefault();\n const rect = el.getBoundingClientRect();\n const px = e.clientX - rect.left;\n const py = e.clientY - rect.top;\n const delta = e.deltaY > 0 ? 1 - factor : 1 + factor;\n setTransform((tr) => {\n const scale = Math.min(max, Math.max(min, tr.scale * delta));\n return {\n scale,\n x: px - (px - tr.x) * (scale / tr.scale),\n y: py - (py - tr.y) * (scale / tr.scale),\n };\n });\n };\n el.addEventListener('wheel', onWheel, { passive: false });\n return () => el.removeEventListener('wheel', onWheel);\n }, [ref, setTransform, min, max, factor]);\n}\n","import { useEffect, type RefObject } from 'react';\n\ninterface Transform {\n x: number;\n y: number;\n scale: number;\n}\n\ninterface UseCanvasTouchOptions {\n /** Current pan/zoom transform — read at touch-start to seed the gesture. */\n transform: Transform;\n /** Updater applied while the gesture runs. */\n setTransform: (next: Transform | ((tr: Transform) => Transform)) => void;\n /** Fired after ~550 ms of stationary contact. Cancelled by movement. */\n onLongPress: (clientX: number, clientY: number) => void;\n /** Min/max scale for pinch zoom (defaults match the wheel hook). */\n minScale?: number;\n maxScale?: number;\n /** Long-press duration and pixels-of-slop allowance before cancel. */\n longPressMs?: number;\n longPressSlop?: number;\n}\n\n/**\n * Touch gesture wiring for the canvas SVG: single-finger pan on the\n * background, two-finger pinch zoom anywhere, and long-press to fire\n * `onLongPress` (typically opens the context menu). The synthetic `click`\n * that follows a fired long-press is swallowed so the menu isn't dismissed\n * immediately.\n */\nexport function useCanvasTouch(\n ref: RefObject<SVGSVGElement>,\n {\n transform,\n setTransform,\n onLongPress,\n minScale = 0.15,\n maxScale = 3,\n longPressMs = 550,\n longPressSlop = 8,\n }: UseCanvasTouchOptions,\n): void {\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n\n let touchPan: { ox: number; oy: number; tx: number; ty: number } | null = null;\n let pinch: { dist: number; cx: number; cy: number; scale: number; tx: number; ty: number } | null = null;\n let longPressTimer: ReturnType<typeof setTimeout> | null = null;\n let longPressStart: { x: number; y: number } | null = null;\n let longPressFired = false;\n\n const dist = (a: Touch, b: Touch) => Math.hypot(a.clientX - b.clientX, a.clientY - b.clientY);\n\n const cancelLongPress = () => {\n if (longPressTimer) {\n clearTimeout(longPressTimer);\n longPressTimer = null;\n }\n longPressStart = null;\n };\n\n const onStart = (e: TouchEvent) => {\n if (e.touches.length === 2) {\n e.preventDefault();\n cancelLongPress();\n const [a, b] = [e.touches[0], e.touches[1]];\n const rect = el.getBoundingClientRect();\n pinch = {\n dist: dist(a, b),\n cx: (a.clientX + b.clientX) / 2 - rect.left,\n cy: (a.clientY + b.clientY) / 2 - rect.top,\n scale: transform.scale,\n tx: transform.x,\n ty: transform.y,\n };\n touchPan = null;\n return;\n }\n if (e.touches.length === 1) {\n const target = e.target as SVGElement | null;\n const t0 = e.touches[0];\n longPressFired = false;\n longPressStart = { x: t0.clientX, y: t0.clientY };\n longPressTimer = setTimeout(() => {\n if (!longPressStart) return;\n longPressFired = true;\n touchPan = null;\n onLongPress(longPressStart.x, longPressStart.y);\n }, longPressMs);\n if (target?.dataset.bg !== '1' && target !== el) return;\n touchPan = { ox: t0.clientX, oy: t0.clientY, tx: transform.x, ty: transform.y };\n }\n };\n\n const onMove = (e: TouchEvent) => {\n if (pinch && e.touches.length === 2) {\n e.preventDefault();\n const [a, b] = [e.touches[0], e.touches[1]];\n const ratio = dist(a, b) / pinch.dist;\n const scale = Math.min(maxScale, Math.max(minScale, pinch.scale * ratio));\n setTransform({\n scale,\n x: pinch.cx - (pinch.cx - pinch.tx) * (scale / pinch.scale),\n y: pinch.cy - (pinch.cy - pinch.ty) * (scale / pinch.scale),\n });\n return;\n }\n if (e.touches.length === 1) {\n const t0 = e.touches[0];\n if (\n longPressStart &&\n (Math.abs(t0.clientX - longPressStart.x) > longPressSlop ||\n Math.abs(t0.clientY - longPressStart.y) > longPressSlop)\n ) {\n cancelLongPress();\n }\n if (touchPan) {\n e.preventDefault();\n const pan = touchPan;\n setTransform((tr) => ({\n ...tr,\n x: pan.tx + (t0.clientX - pan.ox),\n y: pan.ty + (t0.clientY - pan.oy),\n }));\n }\n }\n };\n\n const onEnd = (e: TouchEvent) => {\n cancelLongPress();\n if (longPressFired) {\n e.preventDefault();\n longPressFired = false;\n }\n if (e.touches.length === 0) {\n touchPan = null;\n pinch = null;\n }\n if (e.touches.length === 1) pinch = null;\n };\n\n el.addEventListener('touchstart', onStart, { passive: false });\n el.addEventListener('touchmove', onMove, { passive: false });\n el.addEventListener('touchend', onEnd);\n el.addEventListener('touchcancel', onEnd);\n return () => {\n cancelLongPress();\n el.removeEventListener('touchstart', onStart);\n el.removeEventListener('touchmove', onMove);\n el.removeEventListener('touchend', onEnd);\n el.removeEventListener('touchcancel', onEnd);\n };\n }, [ref, transform.scale, transform.x, transform.y, setTransform, onLongPress, minScale, maxScale, longPressMs, longPressSlop]);\n}\n","import { useEffect, useState, type RefObject } from 'react';\n\n/**\n * Observes a ref'd element's bounding rect and reports its current size.\n * Returns `{ w: 0, h: 0 }` until the element mounts; updates on every\n * ResizeObserver tick. No-ops when `ResizeObserver` is unavailable (older\n * non-browser test envs).\n */\nexport function useElementSize<E extends Element>(\n ref: RefObject<E | null>,\n): { w: number; h: number } {\n const [size, setSize] = useState<{ w: number; h: number }>({ w: 0, h: 0 });\n\n useEffect(() => {\n const el = ref.current;\n if (!el || typeof ResizeObserver === 'undefined') return;\n const measure = () => {\n const r = el.getBoundingClientRect();\n setSize({ w: r.width, h: r.height });\n };\n const ro = new ResizeObserver(measure);\n ro.observe(el);\n measure();\n return () => ro.disconnect();\n }, [ref]);\n\n return size;\n}\n","/**\n * Alignment guides and snap-to-sibling logic, used while dragging a single\n * node. Pure functions — no DOM, no React — so they can be unit tested.\n */\n\nexport const ALIGN_SNAP_THRESHOLD = 4; // canvas-space pixels\n\nexport interface AlignBox {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nexport interface AlignGuideV {\n pos: number; // x position in canvas coords\n minY: number; // line extent (vertical guide)\n maxY: number;\n}\n\nexport interface AlignGuideH {\n pos: number; // y position in canvas coords\n minX: number; // line extent (horizontal guide)\n maxX: number;\n}\n\nexport interface AlignResult {\n x: number;\n y: number;\n guideX?: AlignGuideV;\n guideY?: AlignGuideH;\n}\n\n/**\n * Given a dragged box and a list of other boxes, return the snapped\n * position and any alignment guides that should be shown.\n *\n * Snaps the left, horizontal-center, or right edge to a matching axis on\n * any sibling within ALIGN_SNAP_THRESHOLD. Likewise for top, vertical-center,\n * and bottom. The closest match per axis wins.\n */\nexport function findSiblingSnap(\n dragged: AlignBox,\n others: AlignBox[],\n threshold: number = ALIGN_SNAP_THRESHOLD,\n): AlignResult {\n const dL = dragged.x;\n const dC = dragged.x + dragged.w / 2;\n const dR = dragged.x + dragged.w;\n const dT = dragged.y;\n const dM = dragged.y + dragged.h / 2;\n const dB = dragged.y + dragged.h;\n\n let bestX: { delta: number; pos: number; otherIdx: number } | null = null;\n let bestY: { delta: number; pos: number; otherIdx: number } | null = null;\n\n others.forEach((o, idx) => {\n const oL = o.x;\n const oC = o.x + o.w / 2;\n const oR = o.x + o.w;\n const oT = o.y;\n const oM = o.y + o.h / 2;\n const oB = o.y + o.h;\n\n const xCandidates: { delta: number; pos: number }[] = [\n { delta: oL - dL, pos: oL }, // left -> left\n { delta: oC - dC, pos: oC }, // center -> center\n { delta: oR - dR, pos: oR }, // right -> right\n ];\n for (const c of xCandidates) {\n if (Math.abs(c.delta) < threshold && (!bestX || Math.abs(c.delta) < Math.abs(bestX.delta))) {\n bestX = { delta: c.delta, pos: c.pos, otherIdx: idx };\n }\n }\n\n const yCandidates: { delta: number; pos: number }[] = [\n { delta: oT - dT, pos: oT }, // top -> top\n { delta: oM - dM, pos: oM }, // middle -> middle\n { delta: oB - dB, pos: oB }, // bottom -> bottom\n ];\n for (const c of yCandidates) {\n if (Math.abs(c.delta) < threshold && (!bestY || Math.abs(c.delta) < Math.abs(bestY.delta))) {\n bestY = { delta: c.delta, pos: c.pos, otherIdx: idx };\n }\n }\n });\n\n let x = dragged.x;\n let y = dragged.y;\n let guideX: AlignGuideV | undefined;\n let guideY: AlignGuideH | undefined;\n\n if (bestX) {\n const bx = bestX as { delta: number; pos: number; otherIdx: number };\n x = dragged.x + bx.delta;\n const o = others[bx.otherIdx];\n guideX = {\n pos: bx.pos,\n minY: Math.min(y, o.y) - 12,\n maxY: Math.max(y + dragged.h, o.y + o.h) + 12,\n };\n }\n if (bestY) {\n const by = bestY as { delta: number; pos: number; otherIdx: number };\n y = dragged.y + by.delta;\n const o = others[by.otherIdx];\n guideY = {\n pos: by.pos,\n minX: Math.min(x, o.x) - 12,\n maxX: Math.max(x + dragged.w, o.x + o.w) + 12,\n };\n }\n\n return { x, y, guideX, guideY };\n}\n","/**\n * Geometric graph traversal — picks the nearest sibling node in a given\n * direction from an origin point. Used by the Alt+Arrow keyboard shortcut.\n */\n\nexport interface TraversalCandidate {\n id: string;\n x: number; // center x\n y: number; // center y\n}\n\nexport type Direction = 'up' | 'down' | 'left' | 'right';\n\n/**\n * Returns the id of the candidate node closest to `(fromX, fromY)` that lies\n * within the angular cone of `dir` (45° each side of the axis), or null if\n * nothing qualifies. Distance is Euclidean from origin to candidate center.\n */\nexport function nearestInDirection(\n fromX: number,\n fromY: number,\n dir: Direction,\n candidates: TraversalCandidate[],\n): string | null {\n const matches = candidates.filter((c) => {\n const dx = c.x - fromX;\n const dy = c.y - fromY;\n if (dx === 0 && dy === 0) return false;\n if (dir === 'right') return dx > 0 && Math.abs(dy) <= Math.abs(dx);\n if (dir === 'left') return dx < 0 && Math.abs(dy) <= Math.abs(dx);\n if (dir === 'down') return dy > 0 && Math.abs(dx) <= Math.abs(dy);\n return dy < 0 && Math.abs(dx) <= Math.abs(dy); // up\n });\n if (matches.length === 0) return null;\n matches.sort(\n (a, b) =>\n Math.hypot(a.x - fromX, a.y - fromY) -\n Math.hypot(b.x - fromX, b.y - fromY),\n );\n return matches[0].id;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAA,iBAAgE;;;ACAhE,IAAAC,gBAAgC;;;ACAhC,mBAAgE;AAqGxD;AAxFD,SAAS,aAAa,EAAE,MAAM,SAAS,SAAS,GAAsB;AAC3E,QAAM,CAAC,MAAM,OAAO,QAAI,uBAAS,EAAE;AACnC,QAAM,CAAC,UAAU,WAAW,QAAI,uBAAwB,IAAI;AAC5D,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAwB,IAAI;AACtD,QAAM,kBAAc,qBAA4B,IAAI;AACpD,QAAM,mBAAe,qBAAyB,IAAI;AAClD,QAAM,gBAAY,qBAAuB,IAAI;AAI7C,8BAAU,MAAM;AACd,QAAI,CAAC,KAAM;AACX,YAAQ,EAAE;AACV,gBAAY,IAAI;AAChB,aAAS,IAAI;AACb,UAAM,KAAK,sBAAsB,MAAM,YAAY,SAAS,MAAM,CAAC;AACnE,WAAO,MAAM,qBAAqB,EAAE;AAAA,EACtC,GAAG,CAAC,IAAI,CAAC;AAIT,8BAAU,MAAM;AACd,QAAI,CAAC,KAAM;AACX,UAAM,QAAQ,CAAC,MAAqB;AAClC,UAAI,EAAE,QAAQ,UAAU;AACtB,UAAE,eAAe;AACjB,gBAAQ;AACR;AAAA,MACF;AACA,UAAI,EAAE,QAAQ,MAAO;AACrB,YAAM,OAAO,UAAU;AACvB,UAAI,CAAC,KAAM;AACX,YAAM,aAAa,KAAK;AAAA,QACtB;AAAA,MACF;AACA,UAAI,WAAW,WAAW,EAAG;AAC7B,YAAM,QAAQ,WAAW,CAAC;AAC1B,YAAM,OAAO,WAAW,WAAW,SAAS,CAAC;AAC7C,YAAM,SAAS,SAAS;AACxB,UAAI,EAAE,YAAY,WAAW,OAAO;AAAE,UAAE,eAAe;AAAG,aAAK,MAAM;AAAA,MAAG,WAC/D,CAAC,EAAE,YAAY,WAAW,MAAM;AAAE,UAAE,eAAe;AAAG,cAAM,MAAM;AAAA,MAAG;AAAA,IAChF;AACA,WAAO,iBAAiB,WAAW,KAAK;AACxC,WAAO,MAAM,OAAO,oBAAoB,WAAW,KAAK;AAAA,EAC1D,GAAG,CAAC,MAAM,OAAO,CAAC;AAElB,QAAM,aAAS,0BAAY,CAAC,SAAe;AACzC,aAAS,IAAI;AACb,gBAAY,KAAK,IAAI;AACrB,UAAM,SAAS,IAAI,WAAW;AAC9B,WAAO,SAAS,MAAM;AACpB,YAAM,SAAS,OAAO,OAAO,WAAW,WAAW,OAAO,SAAS;AACnE,cAAQ,MAAM;AAAA,IAChB;AACA,WAAO,UAAU,MAAM,SAAS,kBAAkB,KAAK,IAAI,EAAE;AAC7D,WAAO,WAAW,IAAI;AAAA,EACxB,GAAG,CAAC,CAAC;AAEL,QAAM,eAAW,0BAAY,MAAM;AACjC,UAAMC,WAAU,KAAK,KAAK;AAC1B,QAAI,CAACA,UAAS;AACZ,eAAS,uCAAuC;AAChD;AAAA,IACF;AACA,QAAI;AACF,eAASA,QAAO;AAChB,cAAQ;AAAA,IACV,SAAS,GAAG;AACV,eAAU,EAAY,OAAO;AAAA,IAC/B;AAAA,EACF,GAAG,CAAC,MAAM,UAAU,OAAO,CAAC;AAE5B,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,UAAU,KAAK,KAAK;AAC1B,QAAM,WAAW,CAAC,UAAU,OAAO,QAAQ,WAAW,GAAG,IAAI,SAAS;AACtE,QAAM,YAAY,QAAQ,SAAS;AAEnC,SACE,4CAAC,SAAI,MAAK,gBAAe,SAAS,SAAS,OAAO,EAAE,UAClD;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,MAAK;AAAA,MACL,cAAW;AAAA,MACX,mBAAgB;AAAA,MAChB,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,MAClC,OAAO,EAAE;AAAA,MAET;AAAA,qDAAC,YAAO,OAAO,EAAE,QACf;AAAA,sDAAC,SAAI,OAAO,EAAE,UAAU;AAAA,UACxB,4CAAC,QAAG,IAAG,oBAAmB,OAAO,EAAE,OAAO,4BAAc;AAAA,UACxD,4CAAC,UAAK,OAAO,EAAE,YAAY,6BAAe;AAAA,WAC5C;AAAA,QAEA,6CAAC,SAAI,OAAO,EAAE,MACZ;AAAA,sDAAC,WAAM,SAAQ,uBAAsB,OAAO,EAAE,OAAO,0BAAY;AAAA,UACjE;AAAA,YAAC;AAAA;AAAA,cACC,IAAG;AAAA,cACH,KAAK;AAAA,cACL,OAAO;AAAA,cACP,UAAU,CAAC,MAAM;AAAE,wBAAQ,EAAE,OAAO,KAAK;AAAG,yBAAS,IAAI;AAAA,cAAG;AAAA,cAC5D,aAAa;AAAA,cACb,YAAY;AAAA,cACZ,OAAO,EAAE;AAAA;AAAA,UACX;AAAA,UAEA,6CAAC,SAAI,OAAO,EAAE,SACZ;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,KAAK;AAAA,gBACL,MAAK;AAAA,gBACL,QAAO;AAAA,gBACP,OAAO,EAAE;AAAA,gBACT,UAAU,CAAC,MAAM;AACf,wBAAM,IAAI,EAAE,OAAO,QAAQ,CAAC;AAC5B,sBAAI,EAAG,QAAO,CAAC;AACf,oBAAE,OAAO,QAAQ;AAAA,gBACnB;AAAA;AAAA,YACF;AAAA,YACA,4CAAC,YAAO,MAAK,UAAS,SAAS,MAAM,aAAa,SAAS,MAAM,GAAG,OAAO,EAAE,SAAS,+BAEtF;AAAA,YACA,4CAAC,UAAK,OAAO,EAAE,UAAW,sBAAY,+BAA8B;AAAA,aACtE;AAAA,UAEA,4CAAC,SAAI,OAAO,EAAE,QAAQ,aAAU,UAC7B,kBACC,6CAAC,UAAK,OAAO,EAAE,OAAO;AAAA;AAAA,YAAG;AAAA,aAAM,IAC7B,WACF,6CAAC,UAAK,OAAO,EAAE,IAAI;AAAA;AAAA,YAAW;AAAA,aAAS,IACrC,MACN;AAAA,WACF;AAAA,QAEA,6CAAC,YAAO,OAAO,EAAE,QACf;AAAA,sDAAC,YAAO,MAAK,UAAS,SAAS,SAAS,OAAO,EAAE,WAAW,oBAAM;AAAA,UAClE;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS;AAAA,cACT,UAAU,CAAC;AAAA,cACX,OAAO,EAAE,GAAG,EAAE,WAAW,GAAI,YAAY,OAAO,EAAE,kBAAmB;AAAA,cACtE;AAAA;AAAA,UAED;AAAA,WACF;AAAA;AAAA;AAAA,EACF,GACF;AAEJ;AAEA,IAAM,cACJ;AAKF,IAAM,IAAI;AAAA,EACR,UAAU;AAAA,IACR,UAAU;AAAA,IAAS,OAAO;AAAA,IAAG,QAAQ;AAAA,IACrC,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,SAAS;AAAA,IAAQ,YAAY;AAAA,IAAU,gBAAgB;AAAA,IACvD,SAAS;AAAA,IAAI,YAAY;AAAA,EAC3B;AAAA,EACA,QAAQ;AAAA,IACN,OAAO;AAAA,IAAoB,WAAW;AAAA,IACtC,YAAY;AAAA,IAAW,OAAO;AAAA,IAC9B,QAAQ;AAAA,IAAqB,cAAc;AAAA,IAC3C,WAAW;AAAA,IACX,SAAS;AAAA,IAAQ,eAAe;AAAA,IAAU,UAAU;AAAA,EACtD;AAAA,EACA,QAAQ;AAAA,IACN,SAAS;AAAA,IAAa,cAAc;AAAA,IACpC,SAAS;AAAA,IAAQ,YAAY;AAAA,IAAU,KAAK;AAAA,EAC9C;AAAA,EACA,UAAU;AAAA,IACR,OAAO;AAAA,IAAG,QAAQ;AAAA,IAAG,cAAc;AAAA,IACnC,YAAY;AAAA,IAAW,WAAW;AAAA,EACpC;AAAA,EACA,OAAO;AAAA,IACL,QAAQ;AAAA,IAAG,UAAU;AAAA,IAAI,YAAY;AAAA,IAAK,eAAe;AAAA,IACzD,OAAO;AAAA,IAAW,YAAY;AAAA,EAChC;AAAA,EACA,YAAY,EAAE,YAAY,QAAQ,UAAU,IAAI,OAAO,UAAU;AAAA,EACjE,MAAM,EAAE,SAAS,IAAI,SAAS,QAAQ,eAAe,UAAU,KAAK,IAAI,UAAU,OAAO;AAAA,EACzF,OAAO;AAAA,IACL,UAAU;AAAA,IAAI,YAAY;AAAA,IAAK,OAAO;AAAA,IACtC,eAAe;AAAA,IAAK,eAAe;AAAA,EACrC;AAAA,EACA,UAAU;AAAA,IACR,OAAO;AAAA,IAAQ,WAAW;AAAA,IAC1B,SAAS;AAAA,IAAa,cAAc;AAAA,IACpC,YAAY;AAAA,IAAW,OAAO;AAAA,IAC9B,QAAQ;AAAA,IAAqB,SAAS;AAAA,IACtC,YAAY;AAAA,IACZ,UAAU;AAAA,IAAI,YAAY;AAAA,IAAM,QAAQ;AAAA,IACxC,WAAW;AAAA,EACb;AAAA,EACA,SAAS;AAAA,IACP,SAAS;AAAA,IAAQ,YAAY;AAAA,IAAU,KAAK;AAAA,IAC5C,SAAS;AAAA,IAAa,cAAc;AAAA,IACpC,YAAY;AAAA,IACZ,QAAQ;AAAA,EACV;AAAA,EACA,YAAY,EAAE,SAAS,OAAO;AAAA,EAC9B,SAAS;AAAA,IACP,SAAS;AAAA,IAAY,cAAc;AAAA,IAAG,QAAQ;AAAA,IAC9C,YAAY;AAAA,IAAW,OAAO;AAAA,IAAQ,QAAQ;AAAA,IAC9C,UAAU;AAAA,IAAI,YAAY;AAAA,IAAK,YAAY;AAAA,IAC3C,eAAe;AAAA,EACjB;AAAA,EACA,UAAU;AAAA,IACR,UAAU;AAAA,IAAI,OAAO;AAAA,IAAW,MAAM;AAAA,IACtC,UAAU;AAAA,IAAU,cAAc;AAAA,IAAY,YAAY;AAAA,EAC5D;AAAA,EACA,QAAQ,EAAE,SAAS,QAAQ,YAAY,UAAU,WAAW,GAAG;AAAA,EAC/D,OAAO,EAAE,UAAU,IAAI,OAAO,WAAW,YAAY,IAAI;AAAA,EACzD,IAAI,EAAE,UAAU,IAAI,OAAO,WAAW,YAAY,IAAI;AAAA,EACtD,QAAQ;AAAA,IACN,SAAS;AAAA,IAAa,WAAW;AAAA,IACjC,SAAS;AAAA,IAAQ,gBAAgB;AAAA,IAAY,KAAK;AAAA,IAClD,YAAY;AAAA,EACd;AAAA,EACA,WAAW;AAAA,IACT,SAAS;AAAA,IAAY,cAAc;AAAA,IAAG,QAAQ;AAAA,IAC9C,YAAY;AAAA,IAAe,OAAO;AAAA,IAClC,QAAQ;AAAA,IACR,UAAU;AAAA,IAAI,YAAY;AAAA,IAAK,YAAY;AAAA,EAC7C;AAAA,EACA,WAAW;AAAA,IACT,SAAS;AAAA,IAAY,cAAc;AAAA,IAAG,QAAQ;AAAA,IAC9C,YAAY;AAAA,IAAW,OAAO;AAAA,IAAQ,QAAQ;AAAA,IAC9C,UAAU;AAAA,IAAI,YAAY;AAAA,IAAK,YAAY;AAAA,IAC3C,eAAe;AAAA,EACjB;AAAA,EACA,mBAAmB,EAAE,QAAQ,eAAe,YAAY,uBAAuB;AACjF;;;AChNO,IAAM,aAA0B;AAAA,EACrC,QAAQ;AAAA,EAAW,KAAK;AAAA,EACxB,UAAU;AAAA,EAAW,YAAY;AAAA,EAAW,kBAAkB;AAAA,EAC9D,WAAW;AAAA,EACX,aAAa;AAAA,EAAW,eAAe;AAAA,EAAW,WAAW;AAAA,EAC7D,SAAS;AAAA,EAAW,aAAa;AAAA,EACjC,SAAS;AAAA,EAAW,aAAa;AAAA,EACjC,SAAS;AAAA,EAAW,aAAa;AAAA,EAAW,WAAW;AAAA,EACvD,QAAQ;AAAA,EAAW,YAAY;AAAA,EAC/B,eAAe;AAAA,EACf,WAAW;AAAA,EACX,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EAAW,YAAY;AAAA,EACjC,YAAY;AAAA,EAAW,gBAAgB;AAAA,EACvC,WAAW;AAAA,EACX,UAAU;AACZ;AAGO,IAAM,YAAyB;AAAA,EACpC,QAAQ;AAAA,EAAW,KAAK;AAAA,EACxB,UAAU;AAAA,EAAW,YAAY;AAAA,EAAW,kBAAkB;AAAA,EAC9D,WAAW;AAAA,EACX,aAAa;AAAA,EAAW,eAAe;AAAA,EAAW,WAAW;AAAA,EAC7D,SAAS;AAAA,EAAW,aAAa;AAAA,EACjC,SAAS;AAAA,EAAW,aAAa;AAAA,EACjC,SAAS;AAAA,EAAW,aAAa;AAAA,EAAW,WAAW;AAAA,EACvD,QAAQ;AAAA,EAAW,YAAY;AAAA,EAC/B,eAAe;AAAA,EACf,WAAW;AAAA,EACX,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EAAW,YAAY;AAAA,EACjC,YAAY;AAAA,EAAW,gBAAgB;AAAA,EACvC,WAAW;AAAA,EACX,UAAU;AACZ;AAEO,IAAM,SAAS;AAAA,EACpB,QAAQ;AAAA,EAAW,YAAY;AAAA,EAC/B,aAAa;AAAA,EAAW,YAAY;AAAA,EACpC,cAAc;AAAA,EAAwB,kBAAkB;AAAA,EACxD,OAAO;AAAA,EAAW,YAAY;AAAA,EAAW,aAAa;AAAA,EAAW,WAAW;AAAA,EAC5E,WAAW;AAAA,EAAW,gBAAgB;AAAA,EAAyB,iBAAiB;AAAA,EAChF,SAAS;AAAA,EAAW,cAAc;AAAA,EAAW,aAAa;AAAA,EAC1D,aAAa;AAAA,EAAW,kBAAkB;AAAA,EAAyB,mBAAmB;AACxF;AAaO,SAAS,YAAY,QAAyB;AACnD,SAAO,SAAS,qBAAqB;AACvC;AAKO,SAAS,WAAW,QAAyB;AAClD,SAAO,SAAS,YAAY;AAC9B;AAEO,SAAS,cAAc,SAAyB,QAAgC;AACrF,MAAI,YAAY,YAAY;AAC1B,WAAO,SACH,EAAE,OAAO,OAAO,WAAW,MAAM,OAAO,gBAAgB,QAAQ,OAAO,iBAAiB,MAAM,OAAO,UAAU,IAC/G,EAAE,OAAO,OAAO,OAAO,MAAM,OAAO,YAAY,QAAQ,OAAO,aAAa,MAAM,OAAO,UAAU;AAAA,EACzG;AACA,MAAI,YAAY,WAAW;AACzB,WAAO,SACH,EAAE,OAAO,OAAO,aAAa,MAAM,OAAO,kBAAkB,QAAQ,OAAO,mBAAmB,MAAM,OAAO,YAAY,IACvH,EAAE,OAAO,OAAO,SAAS,MAAM,OAAO,cAAc,QAAQ,WAAW,MAAM,OAAO,YAAY;AAAA,EACtG;AACA,SAAO,SACH,EAAE,OAAO,WAAW,MAAM,wBAAwB,QAAQ,uBAAuB,MAAM,OAAO,WAAW,IACzG,EAAE,OAAO,OAAO,QAAQ,MAAM,WAAW,QAAQ,WAAW,MAAM,OAAO,WAAW;AAC1F;;;AFjGM,IAAAC,sBAAA;AAvBN,IAAM,cAAsD;AAAA,EAC1D,EAAE,KAAK,WAAW,OAAO,UAAU;AAAA,EACnC,EAAE,KAAK,YAAY,OAAO,WAAW;AAAA,EACrC,EAAE,KAAK,QAAQ,OAAO,OAAO;AAAA,EAC7B,EAAE,KAAK,OAAO,OAAO,MAAM;AAAA,EAC3B,EAAE,KAAK,OAAO,OAAO,MAAM;AAC7B;AASO,SAAS,QAAQ,EAAE,UAAU,UAAU,gBAAgB,cAAc,KAAK,GAAiB;AAChG,QAAM,CAAC,YAAY,aAAa,QAAI,wBAAS,KAAK;AAClD,QAAM,UAAU,iBACZ,YAAY,OAAO,OAAK,eAAe,SAAS,EAAE,GAAG,CAAC,IACtD;AAEJ,SACE,8CAAC,SAAI,OAAO,KACV;AAAA,kDAAC,SAAI,OAAO,OACV;AAAA,mDAAC,SAAI,OAAO,UAAU;AAAA,MACtB,6CAAC,UAAK,uBAAS;AAAA,MACf,6CAAC,UAAK,OAAO,EAAE,OAAO,UAAU,eAAe,YAAY,IAAI,GAAG,eAAC;AAAA,MACnE,6CAAC,UAAK,OAAO,EAAE,OAAO,OAAO,OAAO,GAAG,sBAAQ;AAAA,OACjD;AAAA,IAEA,6CAAC,SAAI,OAAO,SAAS;AAAA,IAErB,8CAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,GAAG,YAAY,SAAS,GACzD;AAAA,qBAAe,YACd,6CAAC,YAAO,SAAS,MAAM,cAAc,IAAI,GAAG,cAAW,kBAAiB,OAAO,UAAU,2BAEzF;AAAA,MAED,QAAQ,SAAS,KAChB,8EACE;AAAA,qDAAC,UAAK,OAAO,EAAE,UAAU,IAAI,OAAO,UAAU,WAAW,QAAQ,QAAQ,GAAG,2BAAQ;AAAA,QACnF,QAAQ,IAAI,OACX,6CAAC,YAAmB,SAAS,MAAM,SAAS,EAAE,GAAG,GAAG,cAAY,aAAa,EAAE,KAAK,IAAI,OAAO,WAC5F,YAAE,SADQ,EAAE,GAEf,CACD;AAAA,SACH;AAAA,OAEJ;AAAA,IACC,YACC;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,SAAS,MAAM,cAAc,KAAK;AAAA,QAClC;AAAA;AAAA,IACF;AAAA,KAEJ;AAEJ;AAIA,IAAM,MAA2B;AAAA,EAC/B,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,KAAK;AAAA,EACL,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,YAAY,UAAU;AAAA,EACtB,cAAc,aAAa,UAAU,WAAW;AAAA,EAChD,YAAY;AACd;AACA,IAAM,QAA6B;AAAA,EACjC,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,KAAK;AAAA,EACL,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO,UAAU;AAAA,EACjB,eAAe;AAAA,EACf,YAAY;AACd;AACA,IAAM,WAAgC;AAAA,EACpC,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,YAAY,OAAO;AAAA,EACnB,WAAW,WAAW,OAAO,WAAW;AAC1C;AACA,IAAM,UAA+B;AAAA,EACnC,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,YAAY,UAAU;AAAA,EACtB,QAAQ;AACV;AACA,IAAM,WAAgC;AAAA,EACpC,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,OAAO,UAAU;AAAA,EACjB,QAAQ,aAAa,UAAU,WAAW;AAAA,EAC1C,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,eAAe;AACjB;AACA,IAAM,YAAiC;AAAA,EACrC,SAAS;AAAA,EACT,YAAY,OAAO;AAAA,EACnB,OAAO,OAAO;AAAA,EACd,QAAQ,aAAa,OAAO,gBAAgB;AAAA,EAC5C,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,eAAe;AACjB;;;AG3HA,IAAAC,gBAAmD;;;AC2B5C,SAAS,aAAa,QAAgB,UAAkD;AAC7F,QAAM,QAAQ,OAAO,QAAQ,QAAQ;AACrC,MAAI,UAAU,SAAS,MAAM,MAAM,OAAO,MAAM,GAAG,EAAE;AACrD,SAAO,MAAM,GAAG,MAAM,GAAG,SAAS;AACpC;AAEO,SAAS,OAAO,QAAgB,UAA4C;AACjF,QAAM,UAAU,OAAO,QAAQ,uBAAuB,MAAM;AAC5D,QAAM,KAAK,IAAI,OAAO,IAAI,OAAO,SAAS;AAC1C,MAAI,MAAM;AACV,aAAW,QAAQ,UAAU;AAC3B,UAAM,QAAQ,GAAG,KAAK,KAAK,EAAE;AAC7B,QAAI,OAAO;AACT,YAAM,IAAI,SAAS,MAAM,CAAC,GAAG,EAAE;AAC/B,UAAI,IAAI,IAAK,OAAM;AAAA,IACrB;AAAA,EACF;AACA,SAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAC5B;;;ADqGM,IAAAC,sBAAA;AAnIN,IAAM,SAA4D;AAAA,EAChE,EAAE,KAAK,aAAa,OAAO,OAAO,MAAM,SAAI;AAAA,EAC5C,EAAE,KAAK,WAAW,OAAO,YAAY,MAAM,SAAI;AAAA,EAC/C,EAAE,KAAK,UAAU,OAAO,UAAU,MAAM,SAAI;AAAA,EAC5C,EAAE,KAAK,iBAAiB,OAAO,OAAO,MAAM,SAAI;AAClD;AAEO,SAAS,WAAW,EAAE,QAAQ,OAAO,eAAe,UAAU,aAAa,SAAS,OAAO,GAAG,IAAI,GAAoB;AAC3H,QAAMC,cAAa,YAAY;AAC/B,QAAM,aAAaA,cAAa,WAAW;AAG3C,QAAM,KAAK,MAAM,SAAS,YAAY;AACtC,QAAM,KAAK,OAAO,cAAc,SAAS,MAAM;AAC/C,QAAM,cAAc,GAAG;AACvB,QAAM,cAAc,GAAG;AACvB,QAAM,eAAe,GAAG;AAExB,QAAM,OAAO,MAAM,MAAM,KAAK,OAAK,EAAE,OAAO,MAAM;AAClD,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAS,MAAM,SAAS,EAAE;AACpD,QAAM,CAAC,cAAc,eAAe,QAAI,wBAAS,KAAK;AACtD,QAAM,CAAC,YAAY,aAAa,QAAI,wBAA6B,KAAK;AACtE,QAAM,CAAC,aAAa,cAAc,QAAI,wBAAS,EAAE;AACjD,QAAM,CAAC,iBAAiB,kBAAkB,QAAI,wBAAS,EAAE;AACzD,QAAM,CAAC,cAAc,eAAe,QAAI,wBAAS,EAAE;AACnD,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,EAAE;AAC7C,QAAM,CAAC,cAAc,eAAe,QAAI,wBAAS,KAAK;AACtD,QAAM,eAAW,sBAAyB,IAAI;AAE9C,+BAAU,MAAM;AACd,aAAS,MAAM,SAAS,EAAE;AAC1B,oBAAgB,KAAK;AACrB,oBAAgB,KAAK;AACrB,mBAAe,EAAE;AAAG,uBAAmB,EAAE;AAAG,oBAAgB,EAAE;AAAG,iBAAa,EAAE;AAChF,eAAW,MAAM,SAAS,SAAS,MAAM,GAAG,EAAE;AAAA,EAChD,GAAG,CAAC,MAAM,CAAC;AAEX,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,WAAW,MAAM,MAAM,OAAO,OAAK,EAAE,SAAS,MAAM;AAC1D,QAAM,aAAa,MAAM,MAAM,OAAO,OAAK,EAAE,OAAO,MAAM;AAC1D,QAAM,UAAqB,KAAK,UAAU,WAAoC,CAAC;AAE/E,QAAM,cAAc,MAAM;AACxB,QAAI,UAAU,KAAK,SAAS,CAAC,MAAM,KAAK,EAAG;AAC3C,kBAAc,EAAE,GAAG,OAAO,OAAO,MAAM,MAAM,IAAI,OAAK,EAAE,OAAO,SAAS,EAAE,GAAG,GAAG,OAAO,MAAM,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC;AAAA,EAC9G;AAEA,QAAM,WAAW,CAAC,UAAqB;AACrC,kBAAc,EAAE,GAAG,OAAO,OAAO,MAAM,MAAM,IAAI,OAAK,EAAE,OAAO,SAAS,EAAE,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC;AAAA,EAChG;AAEA,QAAM,aAAa,CAAC,WAAmB;AACrC,kBAAc,EAAE,GAAG,OAAO,OAAO,MAAM,MAAM,OAAO,OAAK,EAAE,OAAO,MAAM,EAAE,CAAC;AAAA,EAC7E;AAEA,QAAM,kBAAkB,CAAC,QAAgB,QAAgB;AACvD,kBAAc,EAAE,GAAG,OAAO,OAAO,MAAM,MAAM,IAAI,OAAK,EAAE,OAAO,SAAS,EAAE,GAAG,GAAG,OAAO,OAAO,OAAU,IAAI,CAAC,EAAE,CAAC;AAAA,EAClH;AAEA,QAAM,YAAY,MAAM;AACtB,QAAI,eAAe,OAAO;AACxB,UAAI,CAAC,YAAY,KAAK,EAAG;AACzB,YAAM,QAAQ,OAAO,QAAQ,MAAM,KAAK;AACxC,YAAM,UAAuB,EAAE,IAAI,OAAO,OAAO,YAAY,KAAK,GAAG,OAAO,aAAa,IAAI,KAAK,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,KAAK,SAAS,SAAS,IAAI;AAC/J,YAAM,UAAuB,EAAE,IAAI,OAAO,KAAK,MAAM,KAAK,GAAG,MAAM,QAAQ,IAAI,OAAO,OAAO,gBAAgB,KAAK,KAAK,OAAU;AACjI,oBAAc,EAAE,GAAG,OAAO,OAAO,CAAC,GAAG,MAAM,OAAO,OAAO,GAAG,OAAO,CAAC,GAAG,MAAM,OAAO,OAAO,EAAE,CAAC;AAAA,IAChG,OAAO;AACL,UAAI,CAAC,gBAAgB,MAAM,MAAM,KAAK,OAAK,EAAE,SAAS,UAAU,EAAE,OAAO,YAAY,EAAG;AACxF,YAAM,UAAuB,EAAE,IAAI,OAAO,KAAK,MAAM,KAAK,GAAG,MAAM,QAAQ,IAAI,cAAc,OAAO,gBAAgB,KAAK,KAAK,OAAU;AACxI,oBAAc,EAAE,GAAG,OAAO,OAAO,CAAC,GAAG,MAAM,OAAO,OAAO,EAAE,CAAC;AAAA,IAC9D;AACA,mBAAe,EAAE;AAAG,uBAAmB,EAAE;AAAG,oBAAgB,EAAE;AAAG,oBAAgB,KAAK;AAAA,EACxF;AAEA,QAAM,YAAY,MAAM;AACtB,UAAM,UAAU,UAAU,KAAK;AAC/B,QAAI,CAAC,WAAW,QAAQ,SAAS,OAAO,EAAG;AAC3C,UAAM,UAAU,CAAC,GAAG,SAAS,OAAO;AACpC,kBAAc,EAAE,GAAG,OAAO,OAAO,MAAM,MAAM,IAAI,OAAK,EAAE,OAAO,SAAS,EAAE,GAAG,GAAG,UAAU,EAAE,GAAI,EAAE,YAAY,CAAC,GAAI,SAAS,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC;AAC9I,iBAAa,EAAE;AAAG,oBAAgB,KAAK;AAAA,EACzC;AAEA,QAAM,eAAe,CAAC,QAAgB;AACpC,UAAM,UAAU,QAAQ,OAAO,OAAK,MAAM,GAAG;AAC7C,UAAM,eAAe,MAAM,MAAM,OAAO,OAAK,EAAE,EAAE,SAAS,UAAU,EAAE,UAAU,IAAI;AACpF,kBAAc;AAAA,MACZ,GAAG;AAAA,MACH,OAAO,MAAM,MAAM,IAAI,OAAK,EAAE,OAAO,SAAS,EAAE,GAAG,GAAG,UAAU,EAAE,GAAI,EAAE,YAAY,CAAC,GAAI,SAAS,QAAQ,EAAE,IAAI,CAAC;AAAA,MACjH,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,QAAM,aAAa,CAAC,KAAa,QAAgB;AAC/C,UAAM,OAAO,MAAM;AACnB,QAAI,OAAO,KAAK,QAAQ,QAAQ,OAAQ;AACxC,UAAM,MAAM,CAAC,GAAG,OAAO;AACvB,KAAC,IAAI,GAAG,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,IAAI,GAAG,CAAC;AAC5C,kBAAc,EAAE,GAAG,OAAO,OAAO,MAAM,MAAM,IAAI,OAAK,EAAE,OAAO,SAAS,EAAE,GAAG,GAAG,UAAU,EAAE,GAAI,EAAE,YAAY,CAAC,GAAI,SAAS,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;AAAA,EAC5I;AAEA,QAAM,aAAkC;AAAA,IACtC,OAAO;AAAA,IAAQ,SAAS;AAAA,IACxB,QAAQ,eAAe,GAAG,WAAW;AAAA,IACrC,cAAc;AAAA,IAAG,UAAU;AAAA,IAAI,SAAS;AAAA,IACxC,WAAW;AAAA,IAAc,YAAY;AAAA,IACrC,OAAO,GAAG;AAAA,IAAW,YAAY,GAAG;AAAA,IACpC,YAAY;AAAA,EACd;AAEA,QAAM,cAAmC;AAAA,IACvC,MAAM;AAAA,IAAG,SAAS;AAAA,IAAS,YAAY;AAAA,IAAa,OAAO;AAAA,IAC3D,QAAQ;AAAA,IAAQ,cAAc;AAAA,IAAG,QAAQ;AAAA,IAAW,UAAU;AAAA,IAAI,YAAY;AAAA,IAAK,YAAY;AAAA,EACjG;AAEA,QAAM,iBAAsC;AAAA,IAC1C,SAAS;AAAA,IAAY,YAAY,GAAG;AAAA,IAAU,OAAO,GAAG;AAAA,IACxD,QAAQ;AAAA,IAAQ,cAAc;AAAA,IAAG,QAAQ;AAAA,IAAW,UAAU;AAAA,IAAI,YAAY;AAAA,EAChF;AAEA,QAAM,kBAAuC;AAAA,IAC3C,SAAS;AAAA,IAAQ,YAAY;AAAA,IAAU,gBAAgB;AAAA,IAAU,KAAK;AAAA,IACtE,WAAW;AAAA,IAAI,OAAO;AAAA,IAAQ,SAAS;AAAA,IAAS,YAAY;AAAA,IAC5D,OAAO;AAAA,IAAa,QAAQ,gBAAgB,YAAY;AAAA,IACxD,cAAc;AAAA,IAAI,QAAQ;AAAA,IAAW,UAAU;AAAA,IAAI,YAAY;AAAA,IAAK,YAAY;AAAA,IAChF,YAAY;AAAA,EACd;AAEA,SACE,8CAAC,SAAI,OAAO,EAAE,OAAO,KAAK,UAAU,KAAK,YAAY,GAAG,SAAS,YAAY,aAAa,GAAG,WAAW,IAAI,SAAS,QAAQ,eAAe,UAAU,UAAU,SAAS,GAEvK;AAAA,kDAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MAAa,YAAY;AAAA,MAAK,UAAU;AAAA,MAAI,eAAe;AAAA,MACpE,eAAe;AAAA,MAAa,OAAO;AAAA,MACnC,cAAc,aAAa,YAAY;AAAA,MAAI,YAAY;AAAA,MACvD,SAAS;AAAA,MAAQ,YAAY;AAAA,MAAU,KAAK;AAAA,IAC9C,GACE;AAAA,mDAAC,SAAI,OAAO,EAAE,OAAO,GAAG,QAAQ,GAAG,cAAc,OAAO,YAAY,YAAY,GAAG;AAAA,MACnF,6CAAC,UAAM,UAAAA,cAAa,oBAAoB,YAAY,YAAY,gBAAgB,eAAc;AAAA,OAChG;AAAA,IAEA,8CAAC,SAAI,OAAO,EAAE,MAAM,GAAG,WAAW,QAAQ,SAAS,QAAQ,eAAe,SAAS,GAEjF;AAAA,oDAAC,aAAQ,OAAO,EAAE,SAAS,aAAa,cAAc,aAAa,GAAG,aAAa,GAAG,GACpF;AAAA,qDAAC,WAAM,OAAO,EAAE,SAAS,SAAS,UAAU,IAAI,YAAY,KAAK,OAAO,GAAG,WAAW,cAAc,GAAG,eAAe,aAAa,eAAe,IAAI,GAAG,kBAAI;AAAA,QAC7J;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,OAAO;AAAA,YACP,UAAU,OAAK,SAAS,EAAE,OAAO,KAAK;AAAA,YACtC,QAAQ;AAAA,YACR,WAAW,OAAK,EAAE,QAAQ,WAAW,YAAY;AAAA,YACjD,OAAO;AAAA,YACP,aAAY;AAAA;AAAA,QACd;AAAA,SACF;AAAA,MAGC,CAACA,eACA,8CAAC,aAAQ,OAAO,EAAE,SAAS,aAAa,cAAc,aAAa,GAAG,aAAa,GAAG,GACpF;AAAA,qDAAC,WAAM,OAAO,EAAE,SAAS,SAAS,UAAU,IAAI,YAAY,KAAK,OAAO,GAAG,WAAW,cAAc,GAAG,eAAe,aAAa,eAAe,IAAI,GAAG,mBAAK;AAAA,QAC9J,6CAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,qBAAqB,WAAW,KAAK,EAAE,GACnE,iBAAO,IAAI,CAAAC,OAAK;AACf,gBAAM,UAAU,KAAK,SAAS,iBAAiBA,GAAE;AACjD,iBACE,8CAAC,YAAmB,SAAS,MAAM,SAASA,GAAE,GAAG,GAAG,gBAAc,QAAQ,OAAO;AAAA,YAC/E,SAAS;AAAA,YAAQ,eAAe;AAAA,YAAU,YAAY;AAAA,YAAU,KAAK;AAAA,YACrE,SAAS;AAAA,YAAW,cAAc;AAAA,YAAG,QAAQ;AAAA,YAAW,YAAY;AAAA,YACpE,YAAY,SAAS,cAAc,GAAG;AAAA,YACtC,OAAO,SAAS,SAAS,GAAG;AAAA,YAC5B,QAAQ,SAAS,eAAe,WAAW,KAAK,eAAe,GAAG,cAAc;AAAA,UAClF,GACE;AAAA,yDAAC,UAAK,OAAO,EAAE,UAAU,IAAI,YAAY,EAAE,GAAI,UAAAA,GAAE,MAAK;AAAA,YACtD,6CAAC,UAAK,OAAO,EAAE,UAAU,IAAI,YAAY,IAAI,GAAI,UAAAA,GAAE,OAAM;AAAA,eAR9CA,GAAE,GASf;AAAA,QAEJ,CAAC,GACH;AAAA,SACF;AAAA,MAIDD,eACC,8CAAC,aAAQ,OAAO,EAAE,SAAS,aAAa,cAAc,aAAa,GAAG,aAAa,IAAI,MAAM,EAAE,GAC7F;AAAA,sDAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,gBAAgB,iBAAiB,cAAc,GAAG,GACrG;AAAA,uDAAC,WAAM,OAAO,EAAE,SAAS,SAAS,UAAU,IAAI,YAAY,KAAK,OAAO,GAAG,WAAW,eAAe,aAAa,eAAe,IAAI,GAAG,qBAAO;AAAA,UAC/I,6CAAC,UAAK,OAAO,EAAE,UAAU,IAAI,OAAO,GAAG,WAAW,YAAY,SAAS,YAAY,WAAW,SAAS,WAAW,cAAc,IAAI,YAAY,IAAI,GAAI,kBAAQ,QAAO;AAAA,WACzK;AAAA,QAEC,QAAQ,WAAW,KAAK,CAAC,gBACxB,6CAAC,SAAI,OAAO,EAAE,UAAU,IAAI,OAAO,GAAG,WAAW,WAAW,UAAU,SAAS,UAAU,WAAW,SAAS,GAAG,iDAA8B;AAAA,QAG/I,QAAQ,IAAI,CAAC,KAAK,MAAM;AACvB,gBAAM,YAAY,MAAM,MAAM,KAAK,OAAK,EAAE,SAAS,UAAU,EAAE,UAAU,GAAG;AAC5E,gBAAM,aAAa,MAAM,MAAM,KAAK,OAAK;AAAE,kBAAM,IAAI,MAAM,MAAM,KAAK,QAAM,GAAG,SAAS,UAAU,GAAG,UAAU,GAAG;AAAG,mBAAO,KAAK,EAAE,OAAO,EAAE;AAAA,UAAI,CAAC;AACjJ,iBACE,8CAAC,SAAkB,OAAO,EAAE,SAAS,QAAQ,YAAY,cAAc,KAAK,GAAG,cAAc,GAAG,cAAc,IAAI,QAAQ,aAAa,GAAG,UAAU,IAAI,UAAU,UAAU,YAAY,GAAG,QAAQ,WAAW,SAAS,SAAS,gCAAgC,GAC9P;AAAA,yDAAC,SAAI,OAAO,EAAE,OAAO,GAAG,WAAW,WAAW,YAAY,aAAa,YAAY,EAAE,GAAG;AAAA,YACxF,8CAAC,SAAI,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,WAAW,GACtD;AAAA,2DAAC,SAAI,OAAO,EAAE,UAAU,IAAI,YAAY,KAAK,OAAO,GAAG,aAAa,cAAc,YAAY,IAAI,GAAG,UAAU,UAAU,cAAc,YAAY,YAAY,SAAS,GAAI,eAAI;AAAA,cAC/K,aAAa,cAAc,8CAAC,SAAI,OAAO,EAAE,UAAU,IAAI,OAAO,aAAa,SAAS,KAAK,GAAG;AAAA;AAAA,gBAAG,WAAW;AAAA,iBAAM;AAAA,cAChH,CAAC,aAAa,6CAAC,SAAI,OAAO,EAAE,UAAU,IAAI,OAAO,GAAG,WAAW,WAAW,SAAS,GAAG,kCAAoB;AAAA,eAC7G;AAAA,YACA,8CAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,SAAS,WAAW,KAAK,EAAE,GACjF;AAAA,2DAAC,YAAO,SAAS,MAAM,WAAW,GAAG,EAAE,GAAG,UAAU,MAAM,GAAG,OAAO,EAAE,YAAY,QAAQ,QAAQ,QAAQ,OAAO,GAAG,WAAW,QAAQ,WAAW,UAAU,IAAI,SAAS,WAAW,SAAS,MAAM,IAAI,MAAM,EAAE,GAAG,oBAAC;AAAA,cACnN,6CAAC,YAAO,SAAS,MAAM,WAAW,GAAG,CAAC,GAAG,UAAU,MAAM,QAAQ,SAAS,GAAG,OAAO,EAAE,YAAY,QAAQ,QAAQ,QAAQ,OAAO,GAAG,WAAW,QAAQ,WAAW,UAAU,IAAI,SAAS,WAAW,SAAS,MAAM,QAAQ,SAAS,IAAI,MAAM,EAAE,GAAG,oBAAC;AAAA,eACtP;AAAA,YACA,6CAAC,YAAO,SAAS,MAAM,aAAa,GAAG,GAAG,OAAO,EAAE,YAAY,QAAQ,QAAQ,QAAQ,OAAO,GAAG,WAAW,QAAQ,WAAW,UAAU,IAAI,SAAS,YAAY,YAAY,EAAE,GAAG,OAAM,UAAS,oBAAC;AAAA,eAX3L,MAAM,CAYhB;AAAA,QAEJ,CAAC;AAAA,QAEA,eACC,8CAAC,SAAI,MAAK,SAAQ,cAAW,mBAAkB,WAAW,OAAK;AAAE,cAAI,EAAE,QAAQ,UAAU;AAAE,4BAAgB,KAAK;AAAG,yBAAa,EAAE;AAAA,UAAG;AAAA,QAAE,GAAG,OAAO,EAAE,WAAW,IAAI,YAAY,GAAG,WAAW,cAAc,IAAI,SAAS,IAAI,QAAQ,eAAe,YAAY,GAAG,GAC/P;AAAA,uDAAC,WAAM,WAAS,MAAC,OAAO,WAAW,UAAU,OAAK,aAAa,EAAE,OAAO,KAAK,GAAG,WAAW,OAAK,EAAE,QAAQ,WAAW,UAAU,GAAG,aAAY,qBAAe,OAAO,EAAE,GAAG,YAAY,cAAc,EAAE,GAAG;AAAA,UACxM,8CAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,EAAE,GACpC;AAAA,yDAAC,YAAO,SAAS,WAAW,OAAO,aAAa,wBAAU;AAAA,YAC1D,6CAAC,YAAO,SAAS,MAAM;AAAE,8BAAgB,KAAK;AAAG,2BAAa,EAAE;AAAA,YAAG,GAAG,OAAO,gBAAgB,oBAAM;AAAA,aACrG;AAAA,WACF,IAEA,8CAAC,YAAO,SAAS,MAAM,gBAAgB,IAAI,GAAG,OAAO,iBACnD;AAAA,uDAAC,UAAK,OAAO,EAAE,UAAU,IAAI,YAAY,EAAE,GAAG,eAAC;AAAA,UAAO;AAAA,WACxD;AAAA,QAGD,QAAQ,SAAS,KAChB,8CAAC,SAAI,OAAO,EAAE,WAAW,IAAI,SAAS,YAAY,YAAY,SAAS,0BAA0B,WAAW,cAAc,GAAG,QAAQ,aAAa,YAAY,GAAG,GAC/J;AAAA,uDAAC,SAAI,OAAO,EAAE,UAAU,IAAI,YAAY,KAAK,OAAO,aAAa,eAAe,aAAa,eAAe,KAAK,cAAc,EAAE,GAAG,4BAAc;AAAA,UAClJ,6CAAC,SAAI,OAAO,EAAE,UAAU,IAAI,OAAO,GAAG,eAAe,YAAY,IAAI,GAAG,uGAAoF;AAAA,WAC9J;AAAA,SAEJ;AAAA,MAID,CAACA,eACA,8CAAC,aAAQ,OAAO,EAAE,SAAS,aAAa,cAAc,aAAa,GAAG,aAAa,IAAI,MAAM,EAAE,GAC7F;AAAA,sDAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,gBAAgB,iBAAiB,cAAc,GAAG,GACrG;AAAA,uDAAC,WAAM,OAAO,EAAE,SAAS,SAAS,UAAU,IAAI,YAAY,KAAK,OAAO,GAAG,WAAW,eAAe,aAAa,eAAe,IAAI,GAAG,sBAAQ;AAAA,UAChJ,6CAAC,UAAK,OAAO,EAAE,UAAU,IAAI,OAAO,GAAG,WAAW,YAAY,SAAS,YAAY,WAAW,SAAS,WAAW,cAAc,IAAI,YAAY,IAAI,GAAI,mBAAS,QAAO;AAAA,WAC1K;AAAA,QAEC,SAAS,WAAW,KAAK,CAAC,gBACzB,6CAAC,SAAI,OAAO,EAAE,UAAU,IAAI,OAAO,GAAG,WAAW,WAAW,UAAU,SAAS,UAAU,WAAW,SAAS,GAAG,yCAA2B;AAAA,QAG5I,SAAS,IAAI,UAAQ;AACpB,gBAAM,SAAS,MAAM,MAAM,KAAK,OAAK,EAAE,OAAO,KAAK,EAAE;AACrD,iBACE,8CAAC,SAAkB,OAAO,EAAE,SAAS,QAAQ,YAAY,cAAc,KAAK,GAAG,cAAc,GAAG,cAAc,IAAI,QAAQ,aAAa,GAAG,UAAU,IAAI,UAAU,UAAU,YAAY,GAAG,QAAQ,WAAW,SAAS,SAAS,gCAAgC,GAC9P;AAAA,yDAAC,SAAI,OAAO,EAAE,OAAO,GAAG,WAAW,WAAW,YAAY,aAAa,YAAY,EAAE,GAAG;AAAA,YACxF,8CAAC,SAAI,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,WAAW,GACtD;AAAA,4DAAC,SAAI,OAAO,EAAE,UAAU,IAAI,YAAY,KAAK,OAAO,GAAG,aAAa,cAAc,GAAG,UAAU,UAAU,cAAc,YAAY,YAAY,SAAS,GAAG;AAAA;AAAA,gBAAG,QAAQ,SAAS,KAAK;AAAA,iBAAG;AAAA,cACvL,6CAAC,WAAM,OAAO,KAAK,SAAS,IAAI,UAAU,OAAK,gBAAgB,KAAK,IAAI,EAAE,OAAO,KAAK,GAAG,aAAY,yBAAwB,OAAO,EAAE,GAAG,YAAY,UAAU,IAAI,SAAS,UAAU,GAAG;AAAA,eAC3L;AAAA,YACA,6CAAC,YAAO,SAAS,MAAM,WAAW,KAAK,EAAE,GAAG,OAAO,EAAE,YAAY,QAAQ,QAAQ,QAAQ,OAAO,GAAG,WAAW,QAAQ,WAAW,UAAU,IAAI,SAAS,YAAY,YAAY,EAAE,GAAG,OAAM,UAAS,oBAAC;AAAA,eAN7L,KAAK,EAOf;AAAA,QAEJ,CAAC;AAAA,QAEA,eACC,8CAAC,SAAI,MAAK,SAAQ,cAAW,mBAAkB,WAAW,OAAK;AAAE,cAAI,EAAE,QAAQ,SAAU,iBAAgB,KAAK;AAAA,QAAG,GAAG,OAAO,EAAE,WAAW,IAAI,YAAY,GAAG,WAAW,cAAc,IAAI,SAAS,IAAI,QAAQ,eAAe,YAAY,GAAG,GACzO;AAAA,uDAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,GAAG,cAAc,GAAG,GACpD,WAAC,OAAO,UAAU,EAAY,IAAI,UAClC,6CAAC,YAAkB,SAAS,MAAM,cAAc,IAAI,GAAG,OAAO;AAAA,YAC5D,MAAM;AAAA,YAAG,SAAS;AAAA,YAAS,QAAQ;AAAA,YAAQ,cAAc;AAAA,YAAG,QAAQ;AAAA,YAAW,UAAU;AAAA,YAAI,YAAY;AAAA,YACzG,YAAY,eAAe,OAAO,cAAc,GAAG;AAAA,YACnD,OAAO,eAAe,OAAO,SAAS,GAAG;AAAA,UAC3C,GACG,mBAAS,QAAQ,eAAe,mBALtB,IAMb,CACD,GACH;AAAA,UACC,eAAe,QACd,6CAAC,WAAM,WAAS,MAAC,OAAO,aAAa,UAAU,OAAK,eAAe,EAAE,OAAO,KAAK,GAAG,WAAW,OAAK,EAAE,QAAQ,WAAW,UAAU,GAAG,aAAY,uBAAiB,OAAO,EAAE,GAAG,YAAY,cAAc,EAAE,GAAG,IAE9M,8CAAC,YAAO,OAAO,cAAc,UAAU,OAAK,gBAAgB,EAAE,OAAO,KAAK,GAAG,OAAO,EAAE,GAAG,YAAY,cAAc,GAAG,YAAY,OAAO,GACvI;AAAA,yDAAC,YAAO,OAAM,IAAG,iCAAc;AAAA,YAC9B,WAAW,IAAI,OAAK,6CAAC,YAAkB,OAAO,EAAE,IAAK,YAAE,SAAtB,EAAE,EAA0B,CAAS;AAAA,aACzE;AAAA,UAEF,6CAAC,WAAM,OAAO,iBAAiB,UAAU,OAAK,mBAAmB,EAAE,OAAO,KAAK,GAAG,aAAY,yBAAwB,OAAO,EAAE,GAAG,YAAY,cAAc,GAAG,GAAG;AAAA,UAClK,8CAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,EAAE,GACpC;AAAA,0DAAC,YAAO,SAAS,WAAW,OAAO,aAAa;AAAA;AAAA,cAAK;AAAA,eAAW;AAAA,YAChE,6CAAC,YAAO,SAAS,MAAM,gBAAgB,KAAK,GAAG,OAAO,gBAAgB,oBAAM;AAAA,aAC9E;AAAA,WACF,IAEA,8CAAC,YAAO,SAAS,MAAM,gBAAgB,IAAI,GAAG,OAAO,iBACnD;AAAA,uDAAC,UAAK,OAAO,EAAE,UAAU,IAAI,YAAY,EAAE,GAAG,eAAC;AAAA,UAAO;AAAA,UAAM;AAAA,WAC9D;AAAA,SAEJ;AAAA,OAEJ;AAAA,KACF;AAEJ;;;AEzTA,IAAAE,iBAAyE;;;ACAzE,IAAAC,gBAA+B;AA2FvB,IAAAC,sBAAA;AArFR,IAAM,WAAW;AACjB,IAAM,aAAa;AACnB,IAAM,QAAQ;AACd,IAAM,WAAW;AAEjB,IAAM,SAAS;AACf,IAAM,cAAc;AAGpB,IAAM,iBAAsC,EAAE,QAAQ,OAAO;AAC7D,IAAM,qBAA0C,EAAE,QAAQ,WAAW;AACrE,IAAM,uBAA4C,EAAE,QAAQ,WAAW,YAAY,OAAO;AAC1F,IAAM,uBAA4C,EAAE,QAAQ,UAAU;AACtE,IAAM,wBAA6C,EAAE,eAAe,QAAQ,YAAY,OAAO;AAC/F,IAAM,qBAA0C,EAAE,SAAS,KAAK;AAmChE,SAAS,UAAU,MAAc,YAAY,GAAW;AACtD,SAAO,KAAK,SAAS;AACvB;AAOO,SAAS,eAAe,OAA4B;AACzD,QAAM;AAAA,IACJ;AAAA,IAAO;AAAA,IAAQ;AAAA,IAAU;AAAA,IAAG;AAAA,IAAQ;AAAA,IAAM;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAClE;AAAA,IAAU;AAAA,IAAW;AAAA,IACrB;AAAA,IAAM;AAAA,IACN;AAAA,IAAa;AAAA,IACb;AAAA,EACF,IAAI;AAGJ,QAAM,qBAAiB,uBAAQ,MAAM;AACnC,QAAI,CAAC,MAAM,OAAQ,QAAO;AAC1B,UAAM,MAAM,SAAS,UAAU,OAAK,EAAE,OAAO,KAAK,EAAE;AACpD,QAAI,MAAM,EAAG,QAAO;AACpB,UAAM,OAAO,SAAS,MAAM;AAC5B,UAAM,CAAC,KAAK,IAAI,KAAK,OAAO,KAAK,CAAC;AAClC,SAAK,OAAO,KAAK,WAAW,GAAG,KAAK;AACpC,WAAO;AAAA,EACT,GAAG,CAAC,UAAU,IAAI,CAAC;AAEnB,MAAI,OAAO,WAAW,KAAK,SAAS,WAAW,GAAG;AAChD,WACE,8CAAC,SAAI,OAAO;AAAA,MACV,UAAU;AAAA,MAAY,OAAO;AAAA,MAAG,SAAS;AAAA,MAAQ,eAAe;AAAA,MAChE,YAAY;AAAA,MAAU,gBAAgB;AAAA,MAAU,KAAK;AAAA,MACrD,OAAO,EAAE;AAAA,MAAW,eAAe;AAAA,IACrC,GACE;AAAA,mDAAC,SAAI,OAAO,EAAE,UAAU,IAAI,SAAS,MAAM,OAAO,EAAE,YAAY,GAAG,oBAAC;AAAA,MACpE,8CAAC,SAAI,OAAO,EAAE,UAAU,IAAI,YAAY,IAAI,GAAG;AAAA;AAAA,QACvC,6CAAC,YAAO,OAAO,EAAE,OAAO,OAAO,GAAG,qBAAO;AAAA,QAAS;AAAA,QAAM,6CAAC,YAAO,OAAO,EAAE,OAAO,OAAO,GAAG,uBAAS;AAAA,QAAS;AAAA,SACpH;AAAA,OACF;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,OAAO;AAAA,MAAQ,QAAQ;AAAA,MACvB,OAAO,EAAE,SAAS,SAAS,QAAQ,MAAM,SAAS,aAAa,WAAW,YAAY,OAAO;AAAA,MAE7F;AAAA,sDAAC,UACC;AAAA,uDAAC,aAAQ,IAAG,WAAU,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,cAAa,kBACpE,uDAAC,YAAO,IAAI,IAAI,IAAI,IAAI,GAAG,KAAK,MAAM,EAAE,KAAK,GAC/C;AAAA,UACA,6CAAC,YAAO,IAAG,aAAY,GAAE,QAAO,GAAE,QAAO,OAAM,QAAO,QAAO,QAC3D,uDAAC,kBAAa,IAAI,GAAG,IAAI,GAAG,cAAc,GAAG,YAAY,YAAY,MAAM,GAAG,GAChF;AAAA,UACA,6CAAC,YAAO,IAAG,YAAW,aAAa,GAAG,cAAc,GAAG,MAAM,KAAK,MAAM,KAAK,QAAO,QAAO,aAAY,eACrG,uDAAC,UAAK,GAAE,mCAAkC,MAAM,EAAE,OAAO,GAC3D;AAAA,WACF;AAAA,QAEA,6CAAC,UAAK,OAAO,QAAQ,QAAQ,QAAQ,MAAK,iBAAgB;AAAA,QAGzD,OAAO,IAAI,UAAQ;AAClB,gBAAM,IAAI,OAAO,IAAI;AACrB,gBAAM,MAAM,aAAa;AACzB,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,IAAI;AAAA,cAAG,IAAI;AAAA,cACX,IAAI,MAAM;AAAA,cAAG,IAAI,SAAS;AAAA,cAC1B,QAAQ,EAAE;AAAA,cAAU,aAAa;AAAA,cAAM,iBAAgB;AAAA;AAAA,YAHlD,QAAQ,IAAI;AAAA,UAInB;AAAA,QAEJ,CAAC;AAAA,QAGA,eAAe,IAAI,CAAC,KAAK,QAAQ;AAChC,gBAAM,IAAI,KAAK,GAAG;AAClB,gBAAM,QAAQ,OAAO,IAAI,IAAI;AAC7B,gBAAM,MAAM,OAAO,IAAI,EAAE;AACzB,gBAAM,eAAe,aAAa,IAAI;AACtC,gBAAM,aAAa,MAAM,UAAU,KAAK,OAAO,IAAI;AACnD,gBAAM,SAAS,IAAI,SAAS,IAAI;AAChC,gBAAM,SAAS,eAAe,SAAS,EAAE;AACzC,gBAAM,OAAO,IAAI,UAAU,WAAW,QAAQ;AAC9C,gBAAM,cAAc,MAAM,SAAS,qBAAqB;AACxD,gBAAM,aAAa,aAAa,EAAE,GAAG,aAAa,GAAG,mBAAmB,IAAI;AAE5E,cAAI,QAAQ;AACV,kBAAM,SAAS;AACf,kBAAM,QAAQ;AACd,kBAAM,QAAQ,IAAI;AAClB,kBAAM,IAAI,KAAK,MAAM,IAAI,KAAK,MAAM,SAAS,KAAK,IAAI,KAAK,KAAK,SAAS,KAAK,IAAI,QAAQ,EAAE,KAAK,MAAM,IAAI,QAAQ,EAAE;AACrH,mBACE,8CAAC,OAAe,aAAa,CAAC,MAAM,eAAe,GAAG,IAAI,EAAE,GAAG,OAAO,YAClE;AAAA,+BAAgB,eAChB;AAAA,gBAAC;AAAA;AAAA,kBAAK,GAAG,WAAW;AAAA,kBAAG,GAAG,IAAI;AAAA,kBAAI,OAAO,UAAU,WAAW,KAAK;AAAA,kBAAG,QAAQ,QAAQ;AAAA,kBAAI,IAAI;AAAA,kBAC5F,MAAM;AAAA,kBAAa,SAAS,SAAS,OAAO;AAAA;AAAA,cAAK;AAAA,cAErD,6CAAC,UAAK,GAAM,MAAK,QAAO,QAAgB,aAAa,KAAK,iBAAiB,MAAM,WAAU,kBAAiB;AAAA,cAC5G,6CAAC,UAAK,GAAG,SAAS,QAAQ,GAAG,GAAG,QAAQ,IAAI,UAAU,IAAI,MAAM,eAAe,SAAS,EAAE,aAAa,YAAY,KAChH,cAAI,OACP;AAAA,iBARM,IAAI,EASZ;AAAA,UAEJ;AAEA,gBAAM,UAAU,QAAQ,OAAO;AAC/B,iBACE,8CAAC,OAAe,aAAa,CAAC,MAAM,eAAe,GAAG,IAAI,EAAE,GAAG,OAAO,YAClE;AAAA,6BAAgB,eAChB;AAAA,cAAC;AAAA;AAAA,gBAAK,GAAG,WAAW;AAAA,gBAAG,GAAG,IAAI;AAAA,gBAAI,OAAO,UAAU,WAAW,KAAK;AAAA,gBAAG,QAAQ,QAAQ;AAAA,gBAAI,IAAI;AAAA,gBAC5F,MAAM;AAAA,gBAAa,SAAS,SAAS,OAAO;AAAA;AAAA,YAAK;AAAA,YAErD,6CAAC,UAAK,IAAI,OAAO,IAAI,GAAG,IAAI,KAAK,IAAI,GAAG,QAAgB,aAAa,KAAK,iBAAiB,MAAM,WAAU,kBAAiB;AAAA,YAC5H;AAAA,cAAC;AAAA;AAAA,gBAAK,GAAG,SAAS,UAAU,IAAI,KAAK,IAAI,IAAI;AAAA,gBAAG,GAAG,IAAI;AAAA,gBAAI,OAAO,UAAU,IAAI,KAAK,IAAI;AAAA,gBAAI,QAAQ;AAAA,gBAAI,IAAI;AAAA,gBAC3G,MAAM,EAAE;AAAA,gBAAQ,QAAQ,eAAe,SAAS,EAAE;AAAA,gBAAY,aAAa,eAAe,OAAO;AAAA;AAAA,YAAG;AAAA,YACtG,6CAAC,UAAK,GAAG,QAAQ,GAAG,IAAI,GAAG,YAAW,UAAS,UAAU,IAAI,MAAM,eAAe,SAAS,EAAE,aAAa,YAAY,KACnH,cAAI,OACP;AAAA,eAVM,IAAI,EAWZ;AAAA,QAEJ,CAAC;AAAA,QAGA,OAAO,IAAI,UAAQ;AAClB,gBAAM,IAAI,OAAO,IAAI;AACrB,gBAAM,IAAI,OAAO;AACjB,iBACE,8CAAC,OACC;AAAA;AAAA,cAAC;AAAA;AAAA,gBAAK,GAAG,IAAI,IAAI;AAAA,gBAAG,GAAG;AAAA,gBAAY,OAAO;AAAA,gBAAG,QAAQ;AAAA,gBAAU,IAAI;AAAA,gBACjE,MAAM,EAAE;AAAA,gBAAW,QAAQ,EAAE;AAAA,gBAAa,aAAa;AAAA,gBAAM,QAAO;AAAA;AAAA,YAAkB;AAAA,YACvF,cAAc,OACb,6CAAC,mBAAc,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,aAAa,IAAI,OAAO,IAAI,IAAI,QAAQ,IAC1E;AAAA,cAAC;AAAA;AAAA,gBACC,WAAS;AAAA,gBACT,cAAc;AAAA,gBACd,QAAQ,CAAC,MAAM;AAAE,8BAAY,MAAM,EAAE,cAAc,MAAM,KAAK,CAAC;AAAG,+BAAa,IAAI;AAAA,gBAAG;AAAA,gBACtF,WAAW,CAAC,MAAM;AAChB,sBAAI,EAAE,QAAQ,SAAS;AAAE,gCAAY,MAAO,EAAE,OAA4B,MAAM,KAAK,CAAC;AAAG,iCAAa,IAAI;AAAA,kBAAG;AAC7G,sBAAI,EAAE,QAAQ,SAAU,cAAa,IAAI;AAAA,gBAC3C;AAAA,gBACA,OAAO;AAAA,kBACL,OAAO;AAAA,kBAAQ,QAAQ;AAAA,kBAAQ,QAAQ;AAAA,kBAAQ,cAAc;AAAA,kBAC7D,SAAS,aAAa,MAAM;AAAA,kBAAI,WAAW;AAAA,kBAAU,UAAU;AAAA,kBAC/D,YAAY;AAAA,kBAAK,YAAY,EAAE;AAAA,kBAAS,OAAO,EAAE;AAAA,kBACjD,WAAW;AAAA,kBAAc,SAAS;AAAA,kBAAS,YAAY;AAAA,gBACzD;AAAA;AAAA,YACF,GACF,IAEA;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBAAM,GAAG,aAAa,WAAW,IAAI;AAAA,gBAAG,YAAW;AAAA,gBACnD,UAAU;AAAA,gBAAI,YAAY;AAAA,gBAAK,MAAM,EAAE;AAAA,gBACvC,MAAK;AAAA,gBACL,UAAU;AAAA,gBACV,cAAY,SAAS,IAAI;AAAA,gBACzB,OAAO;AAAA,gBACP,eAAe,MAAM,aAAa,IAAI;AAAA,gBACtC,WAAW,CAAC,MAAM;AAAE,sBAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,MAAM;AAAE,sBAAE,eAAe;AAAG,iCAAa,IAAI;AAAA,kBAAG;AAAA,gBAAE;AAAA,gBAExG;AAAA;AAAA,YACH;AAAA,YAEF;AAAA,cAAC;AAAA;AAAA,gBACC,IAAI,IAAI,IAAI,IAAI;AAAA,gBAAI,IAAI,aAAa;AAAA,gBAAI,GAAG;AAAA,gBAC5C,MAAK;AAAA,gBACL,MAAK;AAAA,gBACL,UAAU;AAAA,gBACV,cAAY,gBAAgB,IAAI;AAAA,gBAChC,OAAO;AAAA,gBACP,SAAS,MAAM,YAAY,IAAI;AAAA,gBAC/B,WAAW,CAAC,MAAM;AAAE,sBAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AAAE,sBAAE,eAAe;AAAG,gCAAY,IAAI;AAAA,kBAAG;AAAA,gBAAE;AAAA,gBAEvG,wDAAC,WAAM;AAAA;AAAA,kBAAc;AAAA,mBAAK;AAAA;AAAA,YAC5B;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBAAK,GAAG,IAAI,IAAI,IAAI;AAAA,gBAAI,GAAG,aAAa;AAAA,gBAAI,YAAW;AAAA,gBAAS,UAAU;AAAA,gBACzE,MAAM,EAAE;AAAA,gBAAW,OAAO;AAAA,gBAAuB;AAAA;AAAA,YAAC;AAAA,eAhD9C,OAAO,IAAI,EAiDnB;AAAA,QAEJ,CAAC;AAAA;AAAA;AAAA,EACH;AAEJ;;;ACjPA,IAAAC,gBAAwB;;;ACAxB,IAAAC,gBAAoC;AAO7B,SAAS,UAAU,OAA2C;AACnE,QAAM,CAAC,SAAS,UAAU,QAAI;AAAA,IAAkB,MAC9C,OAAO,WAAW,cACd,OAAO,WAAW,8BAA8B,EAAE,UAClD;AAAA,EACN;AACA,+BAAU,MAAM;AACd,QAAI,UAAU,UAAU,OAAO,WAAW,YAAa;AACvD,UAAM,KAAK,OAAO,WAAW,8BAA8B;AAC3D,UAAM,UAAU,CAAC,MAA2B,WAAW,EAAE,OAAO;AAChE,OAAG,iBAAiB,UAAU,OAAO;AACrC,WAAO,MAAM,GAAG,oBAAoB,UAAU,OAAO;AAAA,EACvD,GAAG,CAAC,KAAK,CAAC;AACV,SAAO,UAAU,UAAW,UAAU,UAAU;AAClD;AAMO,SAAS,qBAA8B;AAC5C,QAAM,CAAC,QAAQ,SAAS,QAAI;AAAA,IAAkB,MAC5C,OAAO,WAAW,cACd,OAAO,WAAW,mBAAmB,EAAE,UACvC;AAAA,EACN;AACA,+BAAU,MAAM;AACd,QAAI,OAAO,WAAW,YAAa;AACnC,UAAM,KAAK,OAAO,WAAW,mBAAmB;AAChD,UAAM,UAAU,CAAC,MAA2B,UAAU,EAAE,OAAO;AAC/D,OAAG,iBAAiB,UAAU,OAAO;AACrC,WAAO,MAAM,GAAG,oBAAoB,UAAU,OAAO;AAAA,EACvD,GAAG,CAAC,CAAC;AACL,SAAO;AACT;AAMO,SAAS,0BAAmC;AACjD,QAAM,CAAC,SAAS,UAAU,QAAI;AAAA,IAAkB,MAC9C,OAAO,WAAW,cACd,OAAO,WAAW,kCAAkC,EAAE,UACtD;AAAA,EACN;AACA,+BAAU,MAAM;AACd,QAAI,OAAO,WAAW,YAAa;AACnC,UAAM,KAAK,OAAO,WAAW,kCAAkC;AAC/D,UAAM,UAAU,CAAC,MAA2B,WAAW,EAAE,OAAO;AAChE,OAAG,iBAAiB,UAAU,OAAO;AACrC,WAAO,MAAM,GAAG,oBAAoB,UAAU,OAAO;AAAA,EACvD,GAAG,CAAC,CAAC;AACL,SAAO;AACT;;;AD7CO,SAAS,eACd,OACA,WACA,UAC2B;AAC3B,QAAM,SAAS,UAAU,KAAK;AAC9B,QAAM,QAAI;AAAA,IACR,OAAO,EAAE,GAAI,SAAS,SAAS,OAAO,SAAS,OAAQ,GAAI,aAAa,CAAC,EAAG;AAAA;AAAA;AAAA;AAAA,IAI5E,CAAC,QAAQ,SAAS;AAAA,EACpB;AACA,SAAO,EAAE,GAAG,OAAO;AACrB;;;AE9BA,IAAAC,gBAA4B;;;ACE5B,IAAM,aAAqC;AAAA,EACzC,WAAW;AAAA,EACX,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,eAAe;AACjB;AACA,IAAM,cAAsC;AAAA,EAC1C,WAAW;AAAA,EACX,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,eAAe;AACjB;AAEA,SAAS,WAAW,MAA2B;AAC7C,QAAM,QAAQ,KAAK,SAAS;AAC5B,QAAM,OAAO,WAAW,KAAK,KAAK;AAClC,QAAM,QAAQ,YAAY,KAAK,KAAK;AACpC,SAAO,KAAK,KAAK,EAAE,GAAG,IAAI,IAAI,KAAK,KAAK,IAAI,KAAK;AACnD;AAEA,SAAS,UAAU,MAA2B;AAC5C,QAAM,QAAQ,KAAK,SAAS;AAC5B,QAAM,YAAY,KAAK,aAAa;AAEpC,MAAI,UAAU,YAAY,UAAU,SAAU,QAAO,cAAc,SAAS,QAAQ;AACpF,SAAO,cAAc,SAAS,QAAQ;AACxC;AAEA,SAAS,WAAW,MAA2B;AAC7C,QAAM,QAAQ,UAAU,IAAI;AAC5B,SAAO,KAAK,QACR,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,MAAM,KAAK,EAAE,KACnD,KAAK,KAAK,IAAI,IAAI,KAAK,IAAI,KAAK,EAAE;AACxC;AAEA,SAAS,gBAAgB,OAA6B;AACpD,QAAM,QAAkB,CAAC,UAAU;AACnC,MAAI,MAAM,MAAO,OAAM,QAAQ;AAAA,SAAe,MAAM,KAAK;AAAA,IAAO;AAChE,aAAW,QAAQ,MAAM,MAAO,OAAM,KAAK,WAAW,IAAI,CAAC;AAC3D,aAAW,QAAQ,MAAM,MAAO,OAAM,KAAK,WAAW,IAAI,CAAC;AAC3D,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,SAAS,KAA8B;AAC9C,SAAO,IAAI,UAAU,WAAW,SAAS;AAC3C;AAEA,SAAS,eAAe,OAA6B;AACnD,QAAM,QAAkB,CAAC,iBAAiB;AAC1C,MAAI,MAAM,MAAO,OAAM,QAAQ;AAAA,SAAe,MAAM,KAAK;AAAA,IAAO;AAChE,aAAW,SAAU,MAAM,UAAU,CAAC,EAAI,OAAM,KAAK,iBAAiB,KAAK,EAAE;AAC7E,aAAW,OAAQ,MAAM,YAAY,CAAC,GAAI;AACxC,UAAM,KAAK,KAAK,IAAI,IAAI,GAAG,SAAS,GAAG,CAAC,GAAG,IAAI,EAAE,KAAK,IAAI,KAAK,EAAE;AAAA,EACnE;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAiBO,SAAS,UAAU,OAA6B;AACrD,SAAO,MAAM,SAAS,aAAa,eAAe,KAAK,IAAI,gBAAgB,KAAK;AAClF;;;AC1EA,SAAS,UAAU,MAAqC;AACtD,UAAQ,KAAK,OAAO;AAAA,IAClB,KAAK;AAAW,aAAO,CAAC,MAAM,IAAI;AAAA,IAClC,KAAK;AAAU,aAAO,CAAC,KAAK,GAAG;AAAA,IAC/B,KAAK;AAAiB,aAAO,CAAC,KAAK,GAAG;AAAA,IACtC;AAAS,aAAO,CAAC,KAAK,GAAG;AAAA,EAC3B;AACF;AAEA,SAASC,iBAAgB,OAA6B;AACpD,QAAM,QAAkB,CAAC,WAAW;AACpC,MAAI,MAAM,MAAO,OAAM,KAAK,SAAS,MAAM,KAAK,EAAE;AAClD,QAAM,KAAK,EAAE;AAEb,aAAW,QAAQ,MAAM,OAAO;AAC9B,UAAM,CAAC,MAAM,KAAK,IAAI,UAAU,IAAI;AACpC,UAAM,KAAK,UAAU,KAAK,KAAK,QAAQ,KAAK,EAAE,IAAI,IAAI,GAAG,KAAK,EAAE;AAAA,EAClE;AACA,QAAM,KAAK,EAAE;AAEb,aAAW,QAAQ,MAAM,OAAO;AAC9B,UAAM,QAAQ,KAAK,UAAU,WAAW,gBACpC,KAAK,UAAU,WAAW,gBAC1B;AACJ,UAAM,QAAQ,KAAK,QAAQ,MAAM,KAAK,KAAK,KAAK;AAChD,UAAM,KAAK,GAAG,KAAK,IAAI,IAAI,KAAK,IAAI,KAAK,EAAE,GAAG,KAAK,EAAE;AAAA,EACvD;AAEA,QAAM,KAAK,SAAS;AACpB,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAASC,UAAS,KAA8B;AAC9C,SAAO,IAAI,UAAU,WAAW,QAAQ;AAC1C;AAEA,SAASC,gBAAe,OAA6B;AACnD,QAAM,QAAkB,CAAC,WAAW;AACpC,MAAI,MAAM,MAAO,OAAM,KAAK,SAAS,MAAM,KAAK,EAAE;AAClD,QAAM,KAAK,EAAE;AAEb,aAAW,SAAU,MAAM,UAAU,CAAC,GAAI;AACxC,UAAM,KAAK,eAAe,KAAK,EAAE;AAAA,EACnC;AACA,QAAM,KAAK,EAAE;AAEb,aAAW,OAAQ,MAAM,YAAY,CAAC,GAAI;AACxC,UAAM,KAAK,GAAG,IAAI,IAAI,IAAID,UAAS,GAAG,CAAC,IAAI,IAAI,EAAE,MAAM,IAAI,KAAK,EAAE;AAAA,EACpE;AAEA,QAAM,KAAK,SAAS;AACpB,SAAO,MAAM,KAAK,IAAI;AACxB;AAkBO,SAAS,WAAW,OAA6B;AACtD,SAAO,MAAM,SAAS,aAAaC,gBAAe,KAAK,IAAIF,iBAAgB,KAAK;AAClF;;;AClEO,SAAS,OAAO,OAA6B;AAClD,SAAO,KAAK,UAAU,OAAO,MAAM,CAAC;AACtC;;;ACPA,IAAM,SAAS;AACf,IAAM,WAAW;AACjB,IAAM,cAAc;AACpB,IAAM,aAAa;AACnB,IAAM,aAAa;AACnB,IAAM,aAAa;AACnB,IAAM,UAAU;AAChB,IAAM,UAAU;AAChB,IAAM,QAAQ;AACd,IAAM,QAAQ;AAEd,SAAS,cAAc,MAAc,YAAY,KAAa;AAC5D,SAAO,KAAK,SAAS;AACvB;AAEA,SAAS,UAAU,OAAuB;AACxC,SAAO,KAAK,IAAI,YAAY,KAAK,IAAI,YAAY,KAAK,KAAK,cAAc,KAAK,IAAI,EAAE,CAAC,CAAC;AACxF;AAEA,SAAS,YAAY,KAAqB;AACxC,SAAO,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,IAAI,cAAc,KAAK,GAAG,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC;AAChF;AAEA,SAAS,cAAc,MAA2B;AAChD,QAAM,UAAW,KAAK,UAAU,WAAoC,CAAC;AACrE,QAAM,UAAU,cAAc,KAAK,OAAO,CAAC,IAAI;AAC/C,MAAI,QAAQ,WAAW,EAAG,QAAO,KAAK,IAAI,SAAS,KAAK,KAAK,OAAO,CAAC;AACrE,QAAM,SAAS,QAAQ,OAAO,CAACG,IAAG,MAAMA,KAAI,YAAY,CAAC,GAAG,CAAC,KACxD,QAAQ,SAAS,KAAK,aAAa,IAAI;AAC5C,SAAO,KAAK,IAAI,SAAS,KAAK,KAAK,KAAK,IAAI,SAAS,MAAM,CAAC,CAAC;AAC/D;AAEA,SAAS,cAAc,SAA2B;AAChD,SAAO,YAAY,QAAQ,WAAW,IAAI,KAAK;AACjD;AAEA,SAAS,WAAW,IAAY,IAAY,IAAY,IAAoB;AAC1E,QAAM,KAAK,KAAK;AAChB,QAAM,QAAQ,KAAK,IAAI,EAAE;AACzB,QAAM,QAAQ,KAAK,IAAI,KAAK,EAAE;AAC9B,QAAM,OAAO,KAAK,IAAI,QAAQ,OAAO,KAAK,IAAI,IAAI,QAAQ,MAAM,QAAQ,IAAI;AAC5E,QAAM,QAAQ,KAAK,IAAI,IAAI,KAAK,IAAI,KAAK,IAAI,CAAC;AAC9C,SAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,KAAK,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,KAAK,EAAE,IAAI,EAAE;AAC9E;AAIA,SAAS,WAAW,MAAmB,SAA2C;AAChF,SAAO,YAAY,cAAc,CAAC,CAAC,KAAK,UAAU;AACpD;AAGA,SAAS,cAAc,OAA6C;AAClE,QAAM,QAAQ,oBAAI,IAAuB;AACzC,QAAM,QAAQ,MAAM,MAAM,IAAI,OAAK;AACjC,UAAM,IAAI,WAAW,GAAG,MAAM,OAAO,IAAI,cAAc,CAAC,IAAI,UAAU,EAAE,KAAK;AAC7E,UAAM,IAAI,WAAW,GAAG,MAAM,OAAO,IACjC,cAAe,EAAE,UAAU,WAAoC,CAAC,CAAC,IACjE;AACJ,WAAO,EAAE,MAAM,GAAG,GAAG,EAAE;AAAA,EACzB,CAAC;AAED,QAAM,gBAAgB,MAAM,MAAM,CAAAA,OAAK,OAAOA,GAAE,KAAK,MAAM,YAAY,OAAOA,GAAE,KAAK,MAAM,QAAQ;AACnG,MAAI,eAAe;AACjB,eAAWA,MAAK,OAAO;AACrB,YAAM,IAAIA,GAAE,KAAK,IAAI,EAAE,GAAGA,GAAE,KAAK,GAAa,GAAGA,GAAE,KAAK,GAAa,GAAGA,GAAE,GAAG,GAAGA,GAAE,EAAE,CAAC;AAAA,IACvF;AACA,WAAO;AAAA,EACT;AAGA,QAAM,QAAQ,IAAI,IAAI,MAAM,MAAM,IAAI,OAAK,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AACrD,aAAW,KAAK,MAAM,MAAO,OAAM,IAAI,EAAE,KAAK,MAAM,IAAI,EAAE,EAAE,KAAK,KAAK,CAAC;AAEvE,QAAM,SAAS,oBAAI,IAAoB;AACvC,QAAM,QAAQ,MAAM,MAAM,OAAO,QAAM,MAAM,IAAI,EAAE,EAAE,KAAK,OAAO,CAAC,EAAE,IAAI,OAAK,EAAE,EAAE;AACjF,aAAW,MAAM,MAAO,QAAO,IAAI,IAAI,CAAC;AACxC,MAAI,OAAO;AACX,SAAO,OAAO,MAAM,QAAQ;AAC1B,UAAM,MAAM,MAAM,MAAM;AACxB,UAAM,QAAQ,OAAO,IAAI,GAAG,KAAK;AACjC,eAAW,KAAK,MAAM,OAAO;AAC3B,UAAI,EAAE,SAAS,KAAK;AAClB,cAAM,OAAO,OAAO,IAAI,EAAE,EAAE,KAAK;AACjC,YAAI,OAAO,QAAQ,GAAG;AACpB,iBAAO,IAAI,EAAE,IAAI,QAAQ,CAAC;AAC1B,gBAAM,KAAK,EAAE,EAAE;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,QAAM,MAAM,QAAQ,OAAK;AAAE,QAAI,CAAC,OAAO,IAAI,EAAE,EAAE,EAAG,QAAO,IAAI,EAAE,IAAI,CAAC;AAAA,EAAG,CAAC;AAExE,QAAM,UAAU,oBAAI,IAA0B;AAC9C,aAAWA,MAAK,OAAO;AACrB,UAAM,QAAQ,OAAO,IAAIA,GAAE,KAAK,EAAE,KAAK;AACvC,QAAI,CAAC,QAAQ,IAAI,KAAK,EAAG,SAAQ,IAAI,OAAO,CAAC,CAAC;AAC9C,YAAQ,IAAI,KAAK,EAAG,KAAKA,EAAC;AAAA,EAC5B;AAEA,MAAI,IAAI;AACR,aAAW,SAAS,CAAC,GAAG,QAAQ,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC,GAAG;AAC7D,UAAM,MAAM,QAAQ,IAAI,KAAK;AAC7B,QAAI,IAAI;AACR,QAAI,OAAO;AACX,eAAWA,MAAK,KAAK;AACnB,YAAM,IAAIA,GAAE,KAAK,IAAI,EAAE,GAAG,GAAG,GAAGA,GAAE,GAAG,GAAGA,GAAE,EAAE,CAAC;AAC7C,WAAKA,GAAE,IAAI;AACX,aAAO,KAAK,IAAI,MAAMA,GAAE,CAAC;AAAA,IAC3B;AACA,SAAK,OAAO;AAAA,EACd;AACA,SAAO;AACT;AAEA,SAAS,UAAUA,IAAmB;AACpC,SAAOA,GAAE,QAAQ,MAAM,OAAO,EAAE,QAAQ,MAAM,MAAM,EAAE,QAAQ,MAAM,MAAM,EAAE,QAAQ,MAAM,QAAQ;AACpG;AAGA,IAAM,SAAS;AAAA,EACb,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AAAA,EACP,WAAW;AAAA,EACX,WAAW;AAAA,EACX,aAAa;AACf;AAEA,SAAS,mBAAmB,MAAmB,KAAwB;AACrE,QAAM,KAAK,IAAI,IAAI,IAAI,IAAI;AAC3B,QAAM,KAAK,IAAI,IAAI,IAAI,IAAI;AAC3B,QAAM,QAAQ,KAAK,SAAS;AAC5B,QAAM,QAAQ,YAAY,EAAE,QAAQ,KAAK,GAAG,gIAAgI,OAAO,IAAI,KAAK,UAAU,KAAK,KAAK,CAAC;AAEjN,MAAI,UAAU;AACd,MAAI,UAAU,WAAW;AACvB,UAAM,MAAM,GAAG,EAAE,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE;AACvF,cAAU,oBAAoB,GAAG,WAAW,OAAO,QAAQ,aAAa,OAAO,UAAU;AAAA,EAC3F,WAAW,UAAU,UAAU;AAC7B,UAAM,IAAI,KAAK,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI;AACvC,cAAU,eAAe,EAAE,SAAS,EAAE,QAAQ,CAAC,WAAW,OAAO,QAAQ,aAAa,OAAO,UAAU;AAAA,EACzG,WAAW,UAAU,iBAAiB;AACpC,UAAM,MAAM,GAAG,IAAI,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,CAAC;AAC7H,cAAU,oBAAoB,GAAG,WAAW,OAAO,QAAQ,aAAa,OAAO,UAAU;AAAA,EAC3F,OAAO;AACL,cAAU,YAAY,IAAI,CAAC,QAAQ,IAAI,CAAC,YAAY,IAAI,CAAC,aAAa,IAAI,CAAC,mBAAmB,OAAO,QAAQ,aAAa,OAAO,UAAU;AAAA,EAC7I;AACA,SAAO,UAAU;AACnB;AAEA,SAAS,mBAAmB,MAAmB,KAAwB;AACrE,QAAM,UAAW,KAAK,UAAU,WAAoC,CAAC;AACrE,QAAM,SAAS,QAAQ,KAAK,GAAG,QAAQ,mBAAmB,GAAG,CAAC;AAC9D,QAAM,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI;AAC/C,QAAM,QAAkB,CAAC;AAGzB,QAAM,KAAK,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC,aAAa,CAAC,mBAAmB,OAAO,QAAQ,aAAa,OAAO,SAAS,kDAAkD;AAG7K,QAAM,KAAK,uBAAuB,MAAM,cAAc,CAAC,QAAQ,CAAC,YAAY,CAAC,aAAa,QAAQ,+BAA+B;AACjI,QAAM,KAAK,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC,aAAa,QAAQ,WAAW,OAAO,SAAS,qBAAqB,MAAM,MAAM;AAG/H,QAAM,KAAK,YAAY,CAAC,QAAQ,CAAC,uBAAuB,QAAQ,kBAAkB,OAAO,KAAK,KAAK;AAGnG,QAAM,KAAK,YAAY,IAAI,EAAE,QAAQ,IAAI,EAAE,yCAAyC,OAAO,KAAK,KAAK;AACrG,QAAM,KAAK,YAAY,IAAI,EAAE,QAAQ,IAAI,EAAE,+EAA+E;AAG1H,QAAM,KAAK,YAAY,IAAI,EAAE,QAAQ,IAAI,EAAE,4FAA4F,OAAO,OAAO,wCAAwC;AAC7L,QAAM,KAAK,YAAY,IAAI,EAAE,QAAQ,IAAI,EAAE,6FAA6F,OAAO,IAAI,KAAK,UAAU,KAAK,KAAK,CAAC,SAAS;AAGtL,QAAM,KAAK,aAAa,CAAC,SAAS,IAAI,QAAQ,SAAS,IAAI,CAAC,SAAS,IAAI,QAAQ,aAAa,OAAO,SAAS,sBAAsB;AAEpI,MAAI,QAAQ,WAAW,GAAG;AACxB,UAAM,KAAK,YAAY,IAAI,IAAI,CAAC,QAAQ,IAAI,WAAW,EAAE,+CAA+C,OAAO,KAAK,yDAAyD;AAAA,EAC/K,OAAO;AACL,UAAM,UAAU;AAChB,YAAQ,QAAQ,CAAC,KAAK,MAAM;AAC1B,YAAM,QAAQ,QAAQ,MAAM,GAAG,CAAC,EAAE,OAAO,CAACA,IAAG,MAAMA,KAAI,YAAY,CAAC,IAAI,YAAY,CAAC;AACrF,YAAM,KAAK,YAAY,GAAG;AAC1B,YAAM,QAAQ,IAAI,aAAa;AAC/B,YAAM,QAAQ,IAAI,WAAW;AAC7B,YAAM,QAAQ,cAAc;AAC5B,YAAM,KAAK,QAAQ,KAAK;AACxB,YAAM,SAAS,IAAI,KAAK,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;AAC7C,YAAM,WAAW,KAAK,IAAI,GAAG,KAAK,OAAO,KAAK,MAAM,GAAG,CAAC;AACxD,YAAM,aAAa,IAAI,SAAS,WAAW,IAAI,MAAM,GAAG,WAAW,CAAC,IAAI,WAAM;AAE9E,YAAM,KAAK,YAAY,KAAK,QAAQ,KAAK,YAAY,EAAE,aAAa,KAAK,kBAAkB,OAAO,WAAW,aAAa,OAAO,SAAS,sBAAsB;AAChK,YAAM,KAAK,YAAY,KAAK,EAAE,QAAQ,QAAQ,CAAC,kDAAkD;AACjG,YAAM,KAAK,YAAY,EAAE,QAAQ,QAAQ,EAAE,iEAAiE,OAAO,KAAK,KAAK,UAAU,MAAM,CAAC,SAAS;AACvJ,YAAM,KAAK,YAAY,EAAE,QAAQ,QAAQ,EAAE,2HAA2H,UAAU,UAAU,CAAC,SAAS;AAAA,IACtM,CAAC;AAAA,EACH;AAEA,SAAO,MAAM,KAAK,EAAE;AACtB;AAEA,SAAS,WAAW,MAAmB,OAA+B,SAAkC,OAA8B;AACpI,QAAM,UAAU,MAAM,IAAI,KAAK,IAAI;AACnC,QAAM,QAAQ,MAAM,IAAI,KAAK,EAAE;AAC/B,MAAI,CAAC,WAAW,CAAC,MAAO,QAAO;AAE/B,MAAI,IAAY;AAChB,QAAM,WAAW,MAAM,KAAK,OAAK,EAAE,OAAO,KAAK,IAAI;AAEnD,MAAI,YAAY,WAAW,UAAU,OAAO,GAAG;AAC7C,UAAM,UAAW,SAAS,UAAU,WAAoC,CAAC;AACzE,UAAM,MAAM,QAAQ,QAAQ,KAAK,SAAS,EAAE;AAC5C,QAAI,OAAO,GAAG;AACZ,YAAM,QAAQ,QAAQ,MAAM,GAAG,GAAG,EAAE,OAAO,CAACA,IAAG,MAAMA,KAAI,YAAY,CAAC,IAAI,YAAY,CAAC;AACvF,YAAM,KAAK,YAAY,QAAQ,GAAG,CAAC;AACnC,WAAK,QAAQ,IAAI,aAAa,QAAQ,KAAK;AAC3C,WAAK,QAAQ,IAAI,WAAW,cAAc;AAAA,IAC5C,OAAO;AACL,WAAK,QAAQ,IAAI,QAAQ,IAAI;AAC7B,WAAK,QAAQ,IAAI,QAAQ;AAAA,IAC3B;AAAA,EACF,OAAO;AACL,SAAK,QAAQ,IAAI,QAAQ,IAAI;AAC7B,SAAK,QAAQ,IAAI,QAAQ;AAAA,EAC3B;AACA,QAAM,KAAK,MAAM,IAAI,MAAM,IAAI;AAC/B,QAAM,KAAK,MAAM;AAEjB,QAAM,OAAO,KAAK,UAAU,WAAW,4BACnC,KAAK,UAAU,WAAW,4BAA4B;AAC1D,QAAM,SAAS,KAAK,cAAc,SAAS,KAAK;AAChD,QAAM,IAAI,WAAW,IAAI,IAAI,IAAI,EAAE;AAEnC,MAAI,MAAM,YAAY,CAAC,yBAAyB,OAAO,IAAI,uBAAuB,IAAI,GAAG,MAAM;AAE/F,MAAI,KAAK,OAAO;AACd,UAAM,QAAQ,KAAK,MAAM;AACzB,UAAM,QAAQ,KAAK,MAAM;AACzB,UAAM,SAAS,cAAc,KAAK,OAAO,CAAC,IAAI;AAC9C,WAAO,YAAY,OAAO,SAAS,CAAC,QAAQ,OAAO,EAAE,YAAY,MAAM,8BAA8B,OAAO,EAAE,aAAa,OAAO,UAAU;AAC5I,WAAO,YAAY,IAAI,QAAQ,OAAO,CAAC,gGAAgG,OAAO,IAAI,KAAK,UAAU,KAAK,KAAK,CAAC;AAAA,EAC9K;AACA,SAAO;AACT;AAcO,SAAS,MAAM,OAA6B;AACjD,QAAM,QAAQ,cAAc,KAAK;AACjC,MAAI,OAAO,GAAG,OAAO;AACrB,aAAW,KAAK,MAAM,OAAO,GAAG;AAC9B,WAAO,KAAK,IAAI,MAAM,EAAE,IAAI,EAAE,CAAC;AAC/B,WAAO,KAAK,IAAI,MAAM,EAAE,IAAI,EAAE,CAAC;AAAA,EACjC;AACA,QAAM,QAAQ,OAAO;AACrB,QAAM,SAAS,OAAO,WAAW,MAAM,QAAQ,KAAK;AAEpD,QAAM,OAAO;AAAA,IACX;AAAA,IACA;AAAA,IACA,yCAAyC,OAAO,GAAG;AAAA,IACnD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,mDAAmD,OAAO,IAAI;AAAA,IAC9D;AAAA,IACA;AAAA,EACF,EAAE,KAAK,EAAE;AAET,QAAM,UAAU,MAAM,QAClB,YAAY,QAAQ,CAAC,yHAAyH,OAAO,IAAI,KAAK,UAAU,MAAM,KAAK,CAAC,YACpL;AAEJ,QAAM,QAAQ,MAAM,MAAM,IAAI,OAAK,WAAW,GAAG,OAAO,MAAM,SAAS,MAAM,KAAK,CAAC,EAAE,KAAK,IAAI;AAC9F,QAAM,QAAQ,MAAM,MAAM,IAAI,OAAK;AACjC,UAAM,IAAI,MAAM,IAAI,EAAE,EAAE;AACxB,WAAO,WAAW,GAAG,MAAM,OAAO,IAAI,mBAAmB,GAAG,CAAC,IAAI,mBAAmB,GAAG,CAAC;AAAA,EAC1F,CAAC,EAAE,KAAK,IAAI;AAEZ,SAAO,kDAAkD,KAAK,aAAa,MAAM,kBAAkB,KAAK,IAAI,MAAM;AAAA,EAAO,IAAI;AAAA,eAAkB,KAAK,aAAa,MAAM,WAAW,OAAO,EAAE;AAAA,eAAqB,KAAK,aAAa,MAAM;AAAA,EAA6B,OAAO;AAAA,EAAK,KAAK;AAAA,EAAK,KAAK;AAAA;AAClS;AAWA,eAAsB,MAAM,OAAoC;AAC9D,MAAI,OAAO,aAAa,aAAa;AACnC,UAAM,IAAI,MAAM,sGAAsG;AAAA,EACxH;AACA,QAAM,MAAM,MAAM,KAAK;AACvB,QAAM,OAAO,IAAI,KAAK,CAAC,GAAG,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACtD,QAAM,MAAM,IAAI,gBAAgB,IAAI;AAEpC,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,MAAM,IAAI,MAAM;AACtB,QAAI,SAAS,MAAM;AACjB,YAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,YAAM,QAAQ,OAAO,oBAAoB;AACzC,aAAO,QAAQ,IAAI,eAAe;AAClC,aAAO,SAAS,IAAI,gBAAgB;AACpC,YAAM,MAAM,OAAO,WAAW,IAAI;AAClC,UAAI,MAAM,OAAO,KAAK;AACtB,UAAI,UAAU,KAAK,GAAG,CAAC;AACvB,UAAI,gBAAgB,GAAG;AACvB,aAAO,OAAO,OAAK,IAAI,QAAQ,CAAC,IAAI,OAAO,IAAI,MAAM,sBAAsB,CAAC,GAAG,WAAW;AAAA,IAC5F;AACA,QAAI,UAAU,MAAM;AAAE,UAAI,gBAAgB,GAAG;AAAG,aAAO,IAAI,MAAM,uBAAuB,CAAC;AAAA,IAAG;AAC5F,QAAI,MAAM;AAAA,EACZ,CAAC;AACH;;;AJ3TO,SAAS,aACd,OACA,UACA,WAAmB,WACnB,WACyC;AACzC,aAAO,2BAAY,OAAO,WAAyB;AACjD,QAAI;AACJ,YAAQ,QAAQ;AAAA,MACd,KAAK;AAAW,kBAAU,UAAU,KAAK;AAAG;AAAA,MAC5C,KAAK;AAAY,kBAAU,WAAW,KAAK;AAAG;AAAA,MAC9C,KAAK;AAAQ,kBAAU,OAAO,KAAK;AAAG;AAAA,MACtC,KAAK;AAAO,kBAAU,MAAM,KAAK;AAAG;AAAA,MACpC,KAAK;AAAO,kBAAU,MAAM,MAAM,KAAK;AAAG;AAAA,MAC1C;AAAS;AAAA,IACX;AACA,QAAI,UAAU;AAAE,eAAS,QAAQ,OAAO;AAAG,kBAAY,eAAe,OAAO,YAAY,CAAC,EAAE;AAAG;AAAA,IAAQ;AACvG,UAAM,MAAM,mBAAmB,OAC3B,IAAI,gBAAgB,OAAO,IAC3B,IAAI,gBAAgB,IAAI,KAAK,CAAC,OAAO,GAAG,EAAE,MAAM,aAAa,CAAC,CAAC;AACnE,UAAM,IAAI,SAAS,cAAc,GAAG;AACpC,MAAE,OAAO;AACT,MAAE,WAAW,GAAG,QAAQ,IAAI,WAAW,aAAa,SAAS,MAAM;AACnE,MAAE,MAAM;AACR,QAAI,gBAAgB,GAAG;AACvB,gBAAY,cAAc,EAAE,QAAQ,EAAE;AAAA,EACxC,GAAG,CAAC,OAAO,UAAU,UAAU,SAAS,CAAC;AAC3C;;;AKjDA,IAAAC,gBAA4B;;;ACYrB,IAAM,QAAN,MAAM,OAAM;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASR,YAAY,MAAmB,OAAgB,SAA0B;AACvE,SAAK,OAAO,EAAE,MAAM,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC,GAAI,OAAO,OAAO,CAAC,GAAG,OAAO,CAAC,GAAG,QAAQ,CAAC,GAAG,UAAU,CAAC,EAAE;AAAA,EAC7G;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,SAAS,MAA2B;AACzC,UAAM,IAAI,IAAI,OAAM,KAAK,MAAM,KAAK,OAAO,KAAK,OAAO;AACvD,MAAE,OAAO,gBAAgB,IAAI;AAC7B,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,WAAW,SAA+B;AACxC,SAAK,KAAK,UAAU;AACpB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQ,MAAyB;AAC/B,QAAI,KAAK,KAAK,MAAM,KAAK,OAAK,EAAE,OAAO,KAAK,EAAE,GAAG;AAC/C,YAAM,IAAI,MAAM,iBAAiB,KAAK,EAAE,kBAAkB;AAAA,IAC5D;AACA,SAAK,KAAK,MAAM,KAAK,EAAE,GAAG,KAAK,CAAC;AAChC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,IAAY,OAA+C;AACpE,UAAM,OAAO,KAAK,KAAK,MAAM,KAAK,OAAK,EAAE,OAAO,EAAE;AAClD,QAAI,CAAC,KAAM,OAAM,IAAI,MAAM,SAAS,EAAE,aAAa;AACnD,WAAO,OAAO,MAAM,KAAK;AACzB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,IAAkB;AAC3B,SAAK,KAAK,QAAQ,KAAK,KAAK,MAAM,OAAO,OAAK,EAAE,OAAO,EAAE;AACzD,SAAK,KAAK,QAAQ,KAAK,KAAK,MAAM,OAAO,OAAK,EAAE,SAAS,MAAM,EAAE,OAAO,EAAE;AAC1E,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,QAAQ,MAAyB;AAC/B,QAAI,KAAK,KAAK,MAAM,KAAK,OAAK,EAAE,OAAO,KAAK,EAAE,GAAG;AAC/C,YAAM,IAAI,MAAM,iBAAiB,KAAK,EAAE,kBAAkB;AAAA,IAC5D;AACA,QAAI,CAAC,KAAK,KAAK,MAAM,KAAK,OAAK,EAAE,OAAO,KAAK,IAAI,GAAG;AAClD,YAAM,IAAI,MAAM,SAAS,KAAK,EAAE,qCAAqC,KAAK,IAAI,GAAG;AAAA,IACnF;AACA,QAAI,CAAC,KAAK,KAAK,MAAM,KAAK,OAAK,EAAE,OAAO,KAAK,EAAE,GAAG;AAChD,YAAM,IAAI,MAAM,SAAS,KAAK,EAAE,qCAAqC,KAAK,EAAE,GAAG;AAAA,IACjF;AACA,SAAK,KAAK,MAAM,KAAK,EAAE,GAAG,KAAK,CAAC;AAChC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAA8B;AAC5B,UAAM,SAA4B,CAAC;AACnC,UAAM,UAAU,oBAAI,IAAY;AAChC,eAAW,KAAK,KAAK,KAAK,OAAO;AAC/B,UAAI,QAAQ,IAAI,EAAE,EAAE,EAAG,QAAO,KAAK,EAAE,MAAM,qBAAqB,IAAI,EAAE,IAAI,SAAS,sBAAsB,EAAE,EAAE,IAAI,CAAC;AAClH,cAAQ,IAAI,EAAE,EAAE;AAAA,IAClB;AACA,UAAM,UAAU,oBAAI,IAAY;AAChC,eAAW,KAAK,KAAK,KAAK,OAAO;AAC/B,UAAI,QAAQ,IAAI,EAAE,EAAE,EAAG,QAAO,KAAK,EAAE,MAAM,qBAAqB,IAAI,EAAE,IAAI,SAAS,sBAAsB,EAAE,EAAE,IAAI,CAAC;AAClH,cAAQ,IAAI,EAAE,EAAE;AAChB,UAAI,CAAC,QAAQ,IAAI,EAAE,IAAI,EAAG,QAAO,KAAK,EAAE,MAAM,iBAAiB,IAAI,EAAE,IAAI,SAAS,SAAS,EAAE,EAAE,qCAAqC,EAAE,IAAI,IAAI,CAAC;AAC/I,UAAI,CAAC,QAAQ,IAAI,EAAE,EAAE,EAAG,QAAO,KAAK,EAAE,MAAM,eAAe,IAAI,EAAE,IAAI,SAAS,SAAS,EAAE,EAAE,qCAAqC,EAAE,EAAE,IAAI,CAAC;AAAA,IAC3I;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,WAAW,IAAkB;AAC3B,SAAK,KAAK,QAAQ,KAAK,KAAK,MAAM,OAAO,OAAK,EAAE,OAAO,EAAE;AACzD,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,SAAS,MAAoB;AAC3B,QAAI,CAAC,KAAK,KAAK,OAAQ,SAAS,IAAI,GAAG;AACrC,WAAK,KAAK,OAAQ,KAAK,IAAI;AAAA,IAC7B;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAW,SAAgC;AACzC,SAAK,KAAK,SAAU,KAAK,EAAE,GAAG,QAAQ,CAAC;AACvC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAuB;AACrB,WAAO,gBAAgB,KAAK,IAAI;AAAA,EAClC;AACF;;;ACjJA,SAAS,cAAc,KAAqE;AAE1F,QAAM,WAAkC;AAAA,IACtC,CAAC,8BAA8B,SAAS;AAAA,IACxC,CAAC,4BAA4B,QAAQ;AAAA,IACrC,CAAC,wBAAwB,eAAe;AAAA,IACxC,CAAC,8BAA8B,WAAW;AAAA,IAC1C,CAAC,wBAAwB,WAAW;AAAA,EACtC;AACA,aAAW,CAAC,IAAI,KAAK,KAAK,UAAU;AAClC,UAAM,IAAI,IAAI,MAAM,EAAE;AACtB,QAAI,EAAG,QAAO,EAAE,IAAI,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,QAAQ,gBAAgB,EAAE,GAAG,MAAM;AAAA,EAC3E;AACA,SAAO;AACT;AAIA,IAAM,UAAU;AAEhB,SAAS,YAAY,WAAuC;AAC1D,SAAO,UAAU,WAAW,IAAI,IAAI,WAAW;AACjD;AAEA,SAAS,gBAAgB,WAAqC;AAC5D,SAAO,UAAU,SAAS,GAAG,IAAI,UAAU;AAC7C;AAEA,SAAS,eAAe,OAAwB;AAC9C,QAAM,QAAQ,IAAI,MAAM,WAAW;AACnC,QAAM,UAAU,oBAAI,IAAqB;AACzC,QAAM,aAAuB,CAAC;AAE9B,QAAM,aAAa,CAAC,IAAY,UAAmB;AACjD,QAAI,CAAC,QAAQ,IAAI,EAAE,GAAG;AACpB,cAAQ,IAAI,IAAI,IAAI;AACpB,YAAM,WAAW,QAAQ,EAAE,MAAM,IAAI;AACrC,YAAM,QAAQ,EAAE,IAAI,OAAO,IAAI,OAAO,aAAa,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC,EAAG,CAAC;AAAA,IACxF;AAAA,EACF;AAEA,aAAW,QAAQ,OAAO;AACxB,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,CAAC,QAAS;AAEd,QACE,QAAQ,WAAW,IAAI,KACvB,QAAQ,WAAW,OAAO,KAC1B,QAAQ,WAAW,WAAW,KAC9B,QAAQ,WAAW,QAAQ,KAC3B,QAAQ,WAAW,WAAW,KAC9B,QAAQ,WAAW,QAAQ,KAC3B,QAAQ,WAAW,QAAQ,KAC3B,QAAQ,WAAW,YAAY,EAC/B;AAGF,UAAM,eAAe,QAAQ,MAAM,oBAAoB;AACvD,QAAI,cAAc;AAAE,iBAAW,KAAK,aAAa,CAAC,CAAC;AAAG;AAAA,IAAU;AAChE,QAAI,UAAU,KAAK,OAAO,GAAG;AAAE,iBAAW,IAAI;AAAG;AAAA,IAAU;AAE3D,UAAM,eAAe,WAAW,WAAW,SAAS,CAAC;AAErD,UAAM,YAAY,QAAQ,MAAM,OAAO;AACvC,QAAI,WAAW;AACb,YAAM,UAAU,UAAU,CAAC,EAAE,KAAK;AAClC,YAAM,YAAY,UAAU,CAAC;AAC7B,YAAM,QAAQ,UAAU,CAAC,GAAG,QAAQ,gBAAgB,EAAE;AACtD,YAAM,QAAQ,UAAU,CAAC,EAAE,KAAK;AAChC,YAAM,QAAQ,YAAY,SAAS;AACnC,YAAM,YAAY,gBAAgB,SAAS;AAE3C,YAAM,WAAW,cAAc,OAAO;AACtC,YAAM,SAAS,cAAc,KAAK;AAElC,UAAI,YAAY,CAAC,QAAQ,IAAI,SAAS,EAAE,GAAG;AACzC,gBAAQ,IAAI,SAAS,IAAI,IAAI;AAC7B,cAAM,WAAW,eAAe,EAAE,OAAO,aAAa,IAAI;AAC1D,cAAM,QAAQ,EAAE,GAAG,UAAU,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC,EAAG,CAAC;AAAA,MAClE,WAAW,CAAC,UAAU;AACpB,mBAAW,QAAQ,QAAQ,QAAQ,EAAE,GAAG,YAAY;AAAA,MACtD;AACA,UAAI,UAAU,CAAC,QAAQ,IAAI,OAAO,EAAE,GAAG;AACrC,gBAAQ,IAAI,OAAO,IAAI,IAAI;AAC3B,cAAM,WAAW,eAAe,EAAE,OAAO,aAAa,IAAI;AAC1D,cAAM,QAAQ,EAAE,GAAG,QAAQ,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC,EAAG,CAAC;AAAA,MAChE,WAAW,CAAC,QAAQ;AAClB,mBAAW,MAAM,QAAQ,QAAQ,EAAE,GAAG,YAAY;AAAA,MACpD;AAEA,YAAM,SAAS,UAAU,MAAM,QAAQ,QAAQ,QAAQ,EAAE;AACzD,YAAM,OAAO,QAAQ,MAAM,MAAM,QAAQ,QAAQ,EAAE;AACnD,YAAM,QAAQ;AAAA,QACZ,IAAI,OAAO,KAAK,MAAM,OAAO,EAAE,KAAK;AAAA,QACpC,MAAM;AAAA,QAAQ,IAAI;AAAA,QAClB,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,QACzB;AAAA,QACA,GAAI,cAAc,SAAS,EAAE,UAAU,IAAI,CAAC;AAAA,MAC9C,CAAC;AACD;AAAA,IACF;AAEA,UAAM,WAAW,cAAc,OAAO;AACtC,QAAI,YAAY,CAAC,QAAQ,IAAI,SAAS,EAAE,GAAG;AACzC,cAAQ,IAAI,SAAS,IAAI,IAAI;AAC7B,YAAM,WAAW,eAAe,EAAE,OAAO,aAAa,IAAI;AAC1D,YAAM,QAAQ,EAAE,GAAG,UAAU,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC,EAAG,CAAC;AAAA,IAClE;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,OAAiB,OAAuB;AAC7D,QAAM,QAAQ,IAAI,MAAM,YAAY,KAAK;AAEzC,aAAW,QAAQ,OAAO;AACxB,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,CAAC,WAAW,QAAQ,WAAW,iBAAiB,KAAK,QAAQ,WAAW,IAAI,EAAG;AAEnF,UAAM,mBAAmB,QAAQ,MAAM,uBAAuB;AAC9D,QAAI,kBAAkB;AACpB,YAAM,SAAS,iBAAiB,CAAC,EAAE,KAAK,CAAC;AACzC;AAAA,IACF;AAEA,UAAM,aAAa,QAAQ,MAAM,iBAAiB;AAClD,QAAI,YAAY;AACd,YAAM,SAAS,WAAW,CAAC,EAAE,KAAK,CAAC;AACnC;AAAA,IACF;AAGA,UAAM,WAAW,QAAQ,MAAM,6CAA6C;AAC5E,QAAI,UAAU;AACZ,YAAM,OAAO,SAAS,CAAC,EAAE,KAAK;AAC9B,YAAM,QAAQ,SAAS,CAAC;AACxB,YAAM,KAAK,SAAS,CAAC,EAAE,KAAK;AAC5B,YAAM,QAAQ,SAAS,CAAC,EAAE,KAAK;AAC/B,YAAM,SAAS,IAAI;AACnB,YAAM,SAAS,EAAE;AACjB,YAAM,WAAW,MAAM,OAAO,EAAE,YAAY,CAAC;AAC7C,YAAM,WAAW,EAAE,IAAI,OAAO,KAAK,QAAQ,GAAG,MAAM,IAAI,OAAO,OAAO,MAAM,WAAW,IAAI,IAAI,WAAW,QAAQ,CAAC;AAAA,IACrH;AAAA,EACF;AAEA,SAAO;AACT;AAoBO,SAAS,YAAY,SAAwB;AAGlD,QAAM,UAAU,QAAQ,QAAQ,yCAAyC,EAAE;AAC3E,QAAM,WAAW,QAAQ,MAAM,IAAI;AAGnC,MAAI,WAAW;AACf,MAAI;AACJ,MAAI,SAAS,CAAC,GAAG,KAAK,MAAM,OAAO;AACjC,UAAM,QAAQ,SAAS,UAAU,CAAC,GAAG,MAAM,IAAI,KAAK,EAAE,KAAK,MAAM,KAAK;AACtE,QAAI,UAAU,IAAI;AAChB,YAAM,UAAU,SAAS,MAAM,GAAG,KAAK;AACvC,iBAAW,MAAM,SAAS;AACxB,cAAM,KAAK,GAAG,MAAM,iBAAiB;AACrC,YAAI,GAAI,SAAQ,GAAG,CAAC,EAAE,KAAK;AAAA,MAC7B;AACA,iBAAW,QAAQ;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,QAAQ,SAAS,MAAM,QAAQ;AACrC,QAAM,eAAe,MAAM,KAAK,OAAK,EAAE,KAAK,CAAC;AAE7C,MAAI,cAAc,KAAK,EAAE,WAAW,iBAAiB,GAAG;AACtD,UAAMC,KAAI,cAAc,OAAO,KAAK;AACpC,WAAOA;AAAA,EACT;AAEA,QAAM,IAAI,eAAe,KAAK;AAC9B,MAAI,OAAO;AAET,UAAM,OAAO,EAAE,OAAO;AACtB,SAAK,QAAQ;AACb,WAAO,MAAM,SAAS,IAAI;AAAA,EAC5B;AACA,SAAO;AACT;;;ACnMO,SAAS,SAAS,MAAoC;AAC3D,QAAM,OAAqB,OAAO,SAAS,WAAW,KAAK,MAAM,IAAI,IAAI;AACzE,MAAI,CAAC,KAAK,QAAQ,CAAC,MAAM,QAAQ,KAAK,KAAK,KAAK,CAAC,MAAM,QAAQ,KAAK,KAAK,GAAG;AAC1E,UAAM,IAAI,MAAM,2BAA2B;AAAA,EAC7C;AACA,SAAO,MAAM,SAAS,IAAI;AAC5B;;;AHGO,SAAS,YACd,cACA,UAKI,CAAC,GACmB;AACxB,QAAM,EAAE,cAAc,WAAW,WAAW,QAAQ,IAAI;AACxD,QAAM,cAAc,YAAY,CAAC,QAAgB,MAAM,GAAG;AAC1D,aAAO,2BAAY,CAAC,SAAiB;AACnC,QAAI;AACF,YAAM,SAAS,KAAK,KAAK,EAAE,WAAW,GAAG,IACrC,SAAS,IAAI,EAAE,OAAO,IACtB,YAAY,IAAI,EAAE,OAAO;AAC7B,UAAI,gBAAgB,OAAO,SAAS,cAAc;AAChD,oBAAY,6BAA6B,YAAY,WAAW;AAChE;AAAA,MACF;AACA,mBAAa,YAAY,UAAU,MAAM,IAAI,MAAM;AACnD,kBAAY,+BAA+B;AAAA,IAC7C,SAAS,KAAK;AACZ,kBAAY,kBAAmB,IAAc,OAAO,EAAE;AAAA,IACxD;AAAA,EACF,GAAG,CAAC,cAAc,cAAc,WAAW,WAAW,OAAO,CAAC;AAChE;;;AIjDA,IAAAC,gBAAsC;AAQtC,IAAI,YAAY;AAOT,SAAS,WAAW;AACzB,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAAkB,CAAC,CAAC;AAEhD,QAAM,gBAAY,2BAAY,CAAC,SAAiB,OAAsB,WAAW;AAC/E,UAAM,KAAK,EAAE;AACb,cAAU,UAAQ,CAAC,GAAG,MAAM,EAAE,IAAI,SAAS,KAAK,CAAC,CAAC;AAClD,eAAW,MAAM;AACf,gBAAU,UAAQ,KAAK,OAAO,OAAK,EAAE,OAAO,EAAE,CAAC;AAAA,IACjD,GAAG,GAAI;AAAA,EACT,GAAG,CAAC,CAAC;AAEL,QAAM,mBAAe,2BAAY,CAAC,OAAe;AAC/C,cAAU,UAAQ,KAAK,OAAO,OAAK,EAAE,OAAO,EAAE,CAAC;AAAA,EACjD,GAAG,CAAC,CAAC;AAEL,SAAO,EAAE,QAAQ,WAAW,aAAa;AAC3C;;;ACJI,IAAAC,sBAAA;AAxBJ,IAAM,eAAe;AAAA,EACnB,SAAS,EAAE,IAAI,WAAW,QAAQ,WAAW,MAAM,UAAU;AAAA,EAC7D,OAAO,EAAE,IAAI,WAAW,QAAQ,WAAW,MAAM,UAAU;AAAA,EAC3D,MAAM,EAAE,IAAI,WAAW,QAAQ,WAAW,MAAM,UAAU;AAC5D;AAEA,IAAM,iBAAsC;AAAA,EAC1C,UAAU;AAAA,EACV,KAAK;AAAA,EACL,OAAO;AAAA,EACP,SAAS;AAAA,EACT,eAAe;AAAA,EACf,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,eAAe;AACjB;AAMO,SAAS,eAAe,EAAE,QAAQ,UAAU,GAAyD;AAC1G,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,SACE,6CAAC,SAAI,OAAO,gBACT,iBAAO,IAAI,OAAK;AACf,UAAM,IAAI,aAAa,EAAE,IAAI;AAC7B,WACE;AAAA,MAAC;AAAA;AAAA,QAEC,MAAK;AAAA,QACL,aAAU;AAAA,QACV,OAAO;AAAA,UACL,YAAY,EAAE;AAAA,UACd,QAAQ,aAAa,EAAE,MAAM;AAAA,UAC7B,OAAO,EAAE;AAAA,UACT,SAAS;AAAA,UACT,cAAc;AAAA,UACd,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,YAAY;AAAA,UACZ,WAAW;AAAA,UACX,eAAe;AAAA,UACf,QAAQ;AAAA,UACR,UAAU;AAAA,QACZ;AAAA,QACA,SAAS,MAAM,UAAU,EAAE,EAAE;AAAA,QAE5B;AAAA,YAAE,SAAS,aAAa;AAAA,UACxB,EAAE,SAAS,WAAW;AAAA,UACtB,EAAE;AAAA;AAAA;AAAA,MArBE,EAAE;AAAA,IAsBT;AAAA,EAEJ,CAAC,GACH;AAEJ;;;AC1CO,SAAS,WACd,MACA,SACc;AACd,MAAI,SAAS,YAAY;AACvB,WAAO,EAAE,MAAM,YAAY,OAAO,CAAC,GAAG,OAAO,CAAC,GAAG,QAAQ,CAAC,GAAG,UAAU,CAAC,EAAE;AAAA,EAC5E;AACA,SAAO,EAAE,MAAM,aAAa,SAAS,WAAW,aAAa,OAAO,CAAC,GAAG,OAAO,CAAC,EAAE;AACpF;AAEA,IAAM,mBAAiC;AAAA,EACrC,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AAAA,IACL,EAAE,IAAI,SAAW,OAAO,SAAoB,OAAO,UAAc,GAAG,KAAK,GAAG,GAAG;AAAA,IAC/E,EAAE,IAAI,SAAW,OAAO,eAAoB,OAAO,aAAc,GAAG,KAAK,GAAG,IAAI;AAAA,IAChF,EAAE,IAAI,SAAW,OAAO,kBAAoB,OAAO,WAAc,GAAG,KAAK,GAAG,IAAI;AAAA,IAChF,EAAE,IAAI,WAAW,OAAO,qBAAoB,OAAO,aAAc,GAAG,IAAK,GAAG,IAAI;AAAA,IAChF,EAAE,IAAI,SAAW,OAAO,kBAAoB,OAAO,aAAc,GAAG,KAAK,GAAG,IAAI;AAAA,IAChF,EAAE,IAAI,QAAW,OAAO,QAAoB,OAAO,UAAc,GAAG,KAAK,GAAG,IAAI;AAAA,EAClF;AAAA,EACA,OAAO;AAAA,IACL,EAAE,IAAI,MAAM,MAAM,SAAW,IAAI,QAAQ;AAAA,IACzC,EAAE,IAAI,MAAM,MAAM,SAAW,IAAI,QAAQ;AAAA,IACzC,EAAE,IAAI,MAAM,MAAM,SAAW,IAAI,WAAW,OAAO,MAAM;AAAA,IACzD,EAAE,IAAI,MAAM,MAAM,SAAW,IAAI,SAAW,OAAO,MAAM,OAAO,SAAS;AAAA,IACzE,EAAE,IAAI,MAAM,MAAM,WAAW,IAAI,OAAO;AAAA,IACxC,EAAE,IAAI,MAAM,MAAM,SAAW,IAAI,QAAW,OAAO,SAAS;AAAA,EAC9D;AACF;AAEA,IAAM,kBAAgC;AAAA,EACpC,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AAAA,IACL;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,OAAO;AAAA,MACP,GAAG;AAAA,MAAK,GAAG;AAAA,MACX,UAAU,EAAE,SAAS,CAAC,YAAY,YAAY,IAAI,EAAE;AAAA,IACtD;AAAA,IACA,EAAE,IAAI,OAAU,OAAO,oBAAqB,OAAO,aAAa,GAAG,IAAK,GAAG,IAAI;AAAA,IAC/E,EAAE,IAAI,UAAU,OAAO,iBAAqB,OAAO,aAAa,GAAG,KAAK,GAAG,IAAI;AAAA,IAC/E,EAAE,IAAI,MAAU,OAAO,mBAAqB,OAAO,aAAa,GAAG,KAAK,GAAG,IAAI;AAAA,EACjF;AAAA,EACA,OAAO;AAAA,IACL,EAAE,IAAI,MAAM,MAAM,QAAQ,IAAI,OAAU,OAAO,WAAW;AAAA,IAC1D,EAAE,IAAI,MAAM,MAAM,QAAQ,IAAI,UAAU,OAAO,WAAW;AAAA,IAC1D,EAAE,IAAI,MAAM,MAAM,QAAQ,IAAI,MAAU,OAAO,KAAK;AAAA,EACtD;AACF;AAEA,IAAM,iBAA+B;AAAA,EACnC,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AAAA,IACL,EAAE,IAAI,MAAM,OAAO,WAAoB,OAAO,aAAa,GAAG,IAAK,GAAG,GAAG;AAAA,IACzE,EAAE,IAAI,MAAM,OAAO,gBAAoB,OAAO,aAAa,GAAG,IAAK,GAAG,IAAI;AAAA,IAC1E,EAAE,IAAI,MAAM,OAAO,oBAAoB,OAAO,aAAa,GAAG,IAAK,GAAG,IAAI;AAAA,IAC1E,EAAE,IAAI,MAAM,OAAO,eAAoB,OAAO,aAAa,GAAG,IAAK,GAAG,IAAI;AAAA,IAC1E,EAAE,IAAI,MAAM,OAAO,kBAAoB,OAAO,aAAa,GAAG,IAAK,GAAG,IAAI;AAAA,EAC5E;AAAA,EACA,OAAO;AAAA,IACL,EAAE,IAAI,OAAO,MAAM,MAAM,IAAI,KAAK;AAAA,IAClC,EAAE,IAAI,OAAO,MAAM,MAAM,IAAI,KAAK;AAAA,IAClC,EAAE,IAAI,OAAO,MAAM,MAAM,IAAI,KAAK;AAAA,IAClC,EAAE,IAAI,OAAO,MAAM,MAAM,IAAI,KAAK;AAAA,EACpC;AACF;AAEA,IAAM,kBAAgC;AAAA,EACpC,MAAM;AAAA,EACN,OAAO,CAAC;AAAA,EACR,OAAO,CAAC;AAAA,EACR,QAAQ,CAAC,QAAQ,OAAO,QAAQ;AAAA,EAChC,UAAU;AAAA,IACR,EAAE,IAAI,MAAM,MAAM,QAAU,IAAI,OAAU,OAAO,eAAe;AAAA,IAChE,EAAE,IAAI,MAAM,MAAM,OAAU,IAAI,UAAU,OAAO,cAAc;AAAA,IAC/D,EAAE,IAAI,MAAM,MAAM,UAAU,IAAI,OAAU,OAAO,kBAAkB,OAAO,SAAS;AAAA,IACnF,EAAE,IAAI,MAAM,MAAM,OAAU,IAAI,QAAU,OAAO,kBAAkB,OAAO,SAAS;AAAA,EACrF;AACF;AAWO,SAAS,qBAAqB,UAA0B,aAA2B;AACxF,MAAI,YAAY,WAAY,QAAO,WAAW,eAAe;AAC7D,MAAI,YAAY,UAAY,QAAO,WAAW,cAAc;AAC5D,SAAO,WAAW,gBAAgB;AACpC;AAMO,SAAS,sBAAoC;AAClD,SAAO,WAAW,eAAe;AACnC;AAEA,SAAS,WAAW,GAA+B;AACjD,SAAO;AAAA,IACL,GAAG;AAAA,IACH,OAAO,EAAE,MAAM,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,UAAU,EAAE,WAAW,EAAE,GAAG,EAAE,SAAS,IAAI,OAAU,EAAE;AAAA,IAC1F,OAAO,EAAE,MAAM,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE;AAAA,IACpC,QAAQ,EAAE,SAAS,CAAC,GAAG,EAAE,MAAM,IAAI;AAAA,IACnC,UAAU,EAAE,UAAU,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,EAAE;AAAA,EACjD;AACF;;;ACpIA,IAAAC,iBAA0B;AAgB1B,IAAM,UAAU,CAAC,MAA8B;AAC7C,QAAM,MAAM,EAAE;AACd,SAAO,CAAC,EAAE,QAAQ,IAAI,YAAY,WAAW,IAAI,YAAY,cAAc,IAAI;AACjF;AAmBO,SAAS,kBAAkB,UAAwB,MAAuB;AAC/E,gCAAU,MAAM;AACd,UAAM,QAAQ,CAAC,MAAqB;AAClC,UAAI,QAAQ,CAAC,EAAG;AAChB,iBAAW,OAAO,UAAU;AAC1B,YAAI,IAAI,MAAM,CAAC,GAAG;AAChB,gBAAM,UAAU,IAAI,IAAI,CAAC;AACzB,cAAI,QAAS,GAAE,eAAe;AAC9B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,WAAO,iBAAiB,WAAW,KAAK;AACxC,WAAO,MAAM,OAAO,oBAAoB,WAAW,KAAK;AAAA,EAE1D,GAAG,IAAI;AACT;;;AhBuSM,IAAAC,sBAAA;AAhVN,IAAMC,UAAS;AACf,IAAMC,eAAc;AA0BpB,IAAMC,cAAkC;AAAA,EACtC,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,SAAS;AAAA,EACT,aAAa;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,WAAW;AAAA,EACX,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,OAAO;AAAA,EACP,WAAW;AAAA,EACX,aAAa;AAAA,EACb,WAAW;AACb;AACA,IAAMC,aAAiC;AAAA,EACrC,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,SAAS;AAAA,EACT,aAAa;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,WAAW;AAAA,EACX,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,OAAO;AAAA,EACP,WAAW;AAAA,EACX,aAAa;AAAA,EACb,WAAW;AACb;AAGA,IAAMC,YAAW;AACjB,IAAMC,cAAa;AACnB,IAAM,UAAU;AAChB,IAAMC,SAAQ;AACd,IAAMC,YAAW;AAwCjB,IAAM,iBAAiB;AAEvB,SAAS,oBAAoB,GAAgC;AAC3D,MAAI,KAAK,EAAE,SAAS,YAAY;AAC9B,WAAO,EAAE,GAAG,GAAG,QAAQ,EAAE,UAAU,CAAC,GAAG,UAAU,EAAE,YAAY,CAAC,EAAE;AAAA,EACpE;AACA,SAAO,oBAAoB;AAC7B;AAcO,SAAS,eAAe;AAAA,EAC7B;AAAA,EAAc;AAAA,EAAU;AAAA,EAAU,SAAS;AAAA,EAC3C;AAAA,EAAgB,cAAc;AAAA,EAAM,QAAQ;AAAA,EAC5C;AACF,GAAwB;AACtB,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAuB,MAAM,oBAAoB,YAAY,CAAC;AACxF,QAAM,EAAE,QAAQ,WAAW,aAAa,IAAI,SAAS;AACrD,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAwB,IAAI;AAC5D,QAAM,CAAC,MAAM,OAAO,QAAI,yBAA2B,IAAI;AACvD,QAAM,CAAC,WAAW,YAAY,QAAI,yBAAwB,IAAI;AAC9D,QAAM,CAAC,WAAW,YAAY,QAAI,yBAAS,EAAE;AAC7C,QAAM,iBAAa,uBAAuB,CAAC,oBAAoB,YAAY,CAAC,CAAC;AAC7E,QAAM,oBAAgB,uBAAO,CAAC;AAC9B,QAAM,aAAS,uBAAsB,IAAI;AAEzC,QAAM,EAAE,GAAG,OAAO,IAAI,eAAe,OAAO,gBAAgB,EAAE,OAAOL,aAAY,MAAMC,WAAU,CAAC;AAElG,QAAM,SAAS,MAAM,UAAU,CAAC;AAChC,QAAM,WAAW,MAAM,YAAY,CAAC;AAGpC,QAAM,WAAO,wBAAQ,MAAM;AACzB,UAAM,UAAU,OAAO,OAAO,CAAC,GAAG,MAAM,KAAK,IAAI,GAAG,EAAE,MAAM,GAAG,CAAC;AAChE,WAAO,KAAK,IAAI,SAAS,UAAU,IAAI,EAAE;AAAA,EAC3C,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,SAASI,YAAW,IAAI,KAAK,IAAI,GAAG,OAAO,MAAM,IAAI;AAC3D,QAAM,SAASF,cAAaD,YAAW,KAAK,SAAS,SAASE,SAAQ;AAEtE,QAAM,SAAS,CAAC,SAAiB;AAC/B,UAAM,MAAM,OAAO,QAAQ,IAAI;AAC/B,QAAI,MAAM,EAAG,QAAOC,YAAW,OAAO;AACtC,WAAOA,YAAW,MAAM,OAAO,OAAO;AAAA,EACxC;AACA,QAAM,OAAO,CAAC,QAAgBF,cAAaD,YAAW,KAAK,MAAME;AAEjE,QAAM,kBAAc,4BAAY,CAAC,MAAoB;AACnD,UAAM,QAAQ,WAAW,QAAQ,MAAM,GAAG,cAAc,UAAU,CAAC;AACnE,UAAM,KAAK,CAAC;AACZ,QAAI,MAAM,SAAS,GAAI,OAAM,MAAM;AACnC,eAAW,UAAU;AACrB,kBAAc,UAAU,MAAM,SAAS;AAAA,EACzC,GAAG,CAAC,CAAC;AAEL,QAAM,mBAAe,4BAAY,CAAC,MAAoB;AACpD,aAAS,CAAC;AAAG,eAAW,CAAC;AAAG,gBAAY,CAAC;AAAA,EAC3C,GAAG,CAAC,UAAU,WAAW,CAAC;AAE1B,QAAM,WAAO,4BAAY,MAAM;AAC7B,QAAI,cAAc,WAAW,EAAG;AAChC,kBAAc;AACd,UAAM,IAAI,WAAW,QAAQ,cAAc,OAAO;AAClD,aAAS,CAAC;AAAG,eAAW,CAAC;AAAA,EAC3B,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,WAAO,4BAAY,MAAM;AAC7B,QAAI,cAAc,WAAW,WAAW,QAAQ,SAAS,EAAG;AAC5D,kBAAc;AACd,UAAM,IAAI,WAAW,QAAQ,cAAc,OAAO;AAClD,aAAS,CAAC;AAAG,eAAW,CAAC;AAAA,EAC3B,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,WAAW,MAAM;AACrB,UAAM,OAAO,QAAQ,OAAO,SAAS,CAAC;AACtC,iBAAa,EAAE,GAAG,OAAO,QAAQ,CAAC,GAAG,QAAQ,IAAI,EAAE,CAAC;AAAA,EACtD;AAEA,QAAM,cAAc,CAAC,SAAiB,YAAoB;AACxD,QAAI,CAAC,WAAW,YAAY,WAAW,OAAO,SAAS,OAAO,EAAG;AACjE,iBAAa;AAAA,MACX,GAAG;AAAA,MACH,QAAQ,OAAO,IAAI,OAAK,MAAM,UAAU,UAAU,CAAC;AAAA,MACnD,UAAU,SAAS,IAAI,QAAM;AAAA,QAC3B,GAAG;AAAA,QACH,MAAM,EAAE,SAAS,UAAU,UAAU,EAAE;AAAA,QACvC,IAAI,EAAE,OAAO,UAAU,UAAU,EAAE;AAAA,MACrC,EAAE;AAAA,IACJ,CAAC;AAAA,EACH;AAEA,QAAM,cAAc,CAAC,SAAiB;AACpC,iBAAa;AAAA,MACX,GAAG;AAAA,MACH,QAAQ,OAAO,OAAO,OAAK,MAAM,IAAI;AAAA,MACrC,UAAU,SAAS,OAAO,OAAK,EAAE,SAAS,QAAQ,EAAE,OAAO,IAAI;AAAA,IACjE,CAAC;AAAA,EACH;AAEA,QAAM,aAAa,MAAM;AACvB,QAAI,OAAO,SAAS,GAAG;AAErB,YAAM,IAAI,QAAQ,OAAO,SAAS,CAAC;AACnC,YAAM,IAAI,QAAQ,OAAO,SAAS,CAAC;AACnC,mBAAa;AAAA,QACX,GAAG;AAAA,QACH,QAAQ,CAAC,GAAG,QAAQ,GAAG,CAAC;AAAA,QACxB,UAAU,CAAC,GAAG,UAAU,EAAE,IAAI,OAAO,KAAK,QAAQ,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO,WAAW,OAAO,QAAQ,CAAC;AAAA,MACzG,CAAC;AACD;AAAA,IACF;AACA,UAAM,OAAO,OAAO,CAAC;AACrB,UAAM,KAAK,OAAO,KAAK,IAAI,GAAG,OAAO,SAAS,CAAC,CAAC,KAAK;AACrD,iBAAa;AAAA,MACX,GAAG;AAAA,MACH,UAAU,CAAC,GAAG,UAAU,EAAE,IAAI,OAAO,KAAK,QAAQ,GAAG,MAAM,IAAI,OAAO,WAAW,OAAO,QAAQ,CAAC;AAAA,IACnG,CAAC;AAAA,EACH;AAEA,QAAM,gBAAgB,CAAC,IAAY,UAAoC;AACrE,iBAAa;AAAA,MACX,GAAG;AAAA,MACH,UAAU,SAAS,IAAI,OAAK,EAAE,OAAO,KAAK,EAAE,GAAG,GAAG,GAAG,MAAM,IAAI,CAAC;AAAA,IAClE,CAAC;AAAA,EACH;AAEA,QAAM,gBAAgB,CAAC,OAAe;AACpC,iBAAa,EAAE,GAAG,OAAO,UAAU,SAAS,OAAO,OAAK,EAAE,OAAO,EAAE,EAAE,CAAC;AACtE,QAAI,aAAa,GAAI,aAAY,IAAI;AAAA,EACvC;AAEA,QAAM,qBAAiB,4BAAY,CAAC,IAAY,UAAkB;AAChE,UAAM,UAAU,SAAS,UAAU,OAAK,EAAE,OAAO,EAAE;AACnD,QAAI,UAAU,KAAK,UAAU,QAAS;AACtC,UAAM,OAAO,SAAS,MAAM;AAC5B,UAAM,CAAC,KAAK,IAAI,KAAK,OAAO,SAAS,CAAC;AACtC,SAAK,OAAO,OAAO,GAAG,KAAK;AAC3B,iBAAa,EAAE,GAAG,OAAO,UAAU,KAAK,CAAC;AAAA,EAC3C,GAAG,CAAC,UAAU,OAAO,YAAY,CAAC;AAGlC,QAAM,cAA4B;AAAA,IAChC,EAAE,OAAO,QAAM,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,KAAK,KAAK,MAAM;AAAE,WAAK;AAAG,aAAO;AAAA,IAAM,EAAE;AAAA,IAC7F,EAAE,OAAO,QAAM,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,OAAQ,EAAE,YAAY,EAAE,QAAQ,MAAO,KAAK,MAAM;AAAE,WAAK;AAAG,aAAO;AAAA,IAAM,EAAE;AAAA,IAChI,EAAE,OAAO,OAAK,EAAE,QAAQ,UAAU,KAAK,MAAM;AAAE,kBAAY,IAAI;AAAG,mBAAa,IAAI;AAAG,aAAO;AAAA,IAAM,EAAE;AAAA,IACrG,EAAE,OAAO,QAAM,EAAE,QAAQ,YAAY,EAAE,QAAQ,gBAAgB,CAAC,CAAC,UAAU,KAAK,MAAM;AAAE,oBAAc,QAAS;AAAG,aAAO;AAAA,IAAM,EAAE;AAAA,EACnI;AACA,oBAAkB,aAAa,CAAC,MAAM,MAAM,QAAQ,CAAC;AAGrD,QAAM,eAAe,aAAa,OAAO,UAAU,YAAY,CAAC,QAAQ,UAAU,KAAK,SAAS,CAAC;AACjG,QAAM,eAAe,YAAY,cAAc;AAAA,IAC7C,cAAc;AAAA,IACd,WAAW;AAAA,IACX,WAAW,CAAC,QAAQ,UAAU,KAAK,SAAS;AAAA,IAC5C,SAAS,CAAC,QAAQ,UAAU,KAAK,OAAO;AAAA,EAC1C,CAAC;AAOD,QAAM,iBAAiB,CAAC,GAAqB,OAAe;AAC1D,UAAM,MAAO,EAAE,OAAuB;AACtC,QAAI,QAAQ,WAAW,QAAQ,YAAY,QAAQ,SAAU;AAC7D,UAAM,MAAM,SAAS,UAAU,OAAK,EAAE,OAAO,EAAE;AAC/C,QAAI,MAAM,EAAG;AACb,MAAE,eAAe;AACjB,gBAAY,EAAE;AACd,YAAQ,EAAE,IAAI,QAAQ,EAAE,SAAS,aAAa,KAAK,WAAW,KAAK,QAAQ,MAAM,CAAC;AAAA,EACpF;AAEA,gCAAU,MAAM;AACd,QAAI,CAAC,KAAM;AACX,UAAM,QAAQD,cAAaD,YAAW;AACtC,UAAM,SAAS,CAAC,OAAmB;AACjC,YAAM,KAAK,GAAG,UAAU,KAAK;AAC7B,UAAI,CAAC,KAAK,UAAU,KAAK,IAAI,EAAE,IAAI,eAAgB;AACnD,YAAM,MAAM,OAAO;AACnB,UAAI,CAAC,IAAK;AACV,YAAM,OAAO,IAAI,sBAAsB;AACvC,YAAM,SAAS,GAAG,UAAU,KAAK;AACjC,YAAM,MAAM,KAAK,OAAO,SAAS,QAAQE,SAAQ,KAAKA,MAAK;AAC3D,YAAM,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,SAAS,SAAS,GAAG,GAAG,CAAC;AAC3D,UAAI,SAAS,KAAK,aAAa,KAAK,OAAQ;AAC5C,cAAQ,EAAE,GAAG,MAAM,QAAQ,MAAM,WAAW,KAAK,CAAC;AAAA,IACpD;AACA,UAAM,OAAO,MAAM;AACjB,UAAI,KAAK,UAAU,KAAK,cAAc,KAAK,aAAa;AACtD,uBAAe,KAAK,IAAI,KAAK,SAAS;AAAA,MACxC;AACA,cAAQ,IAAI;AAAA,IACd;AACA,WAAO,iBAAiB,aAAa,MAAM;AAC3C,WAAO,iBAAiB,WAAW,IAAI;AACvC,WAAO,MAAM;AACX,aAAO,oBAAoB,aAAa,MAAM;AAC9C,aAAO,oBAAoB,WAAW,IAAI;AAAA,IAC5C;AAAA,EACF,GAAG,CAAC,MAAM,SAAS,QAAQ,cAAc,CAAC;AAG1C,QAAM,cAAc,WAAW,SAAS,KAAK,OAAK,EAAE,OAAO,QAAQ,IAAI;AAEvE,SACC,8CAAC,SAAI,WAAU,kBAAiB,OAAO;AAAA,IACpC,SAAS;AAAA,IAAQ,eAAe;AAAA,IAAU;AAAA,IAAQ,OAAO;AAAA,IACzD,YAAY;AAAA,IAAsC,YAAY,EAAE;AAAA,IAChE,UAAU;AAAA,EACZ,GACE;AAAA,iDAAC,kBAAe,QAAgB,WAAW,cAAc;AAAA,IACzD,6CAAC,WAAO;AAAA;AAAA,+BAEiB,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,+BAKX,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,SAIlC;AAAA,IACF,6CAAC,WAAQ,UAAU,cAAc,UAAU,cAAc,eAAe,QAAW,gBAAgC,aAA0B;AAAA,IAG7I,8CAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MAAQ,KAAK;AAAA,MAAG,SAAS;AAAA,MAClC,YAAY,EAAE;AAAA,MAAS,cAAc,aAAa,EAAE,WAAW;AAAA,MAC/D,YAAY;AAAA,MAAU,UAAU;AAAA,IAClC,GACE;AAAA,mDAAC,YAAO,SAAS,UAAU,OAAO,WAAW,GAAG,qBAAO;AAAA,MACvD,6CAAC,YAAO,SAAS,YAAY,OAAO,WAAW,GAAG,uBAAS;AAAA,MAC3D,6CAAC,SAAI,OAAO,EAAE,OAAO,GAAG,QAAQ,IAAI,YAAY,EAAE,aAAa,QAAQ,QAAQ,GAAG;AAAA,MAClF,6CAAC,YAAO,SAAS,MAAM,OAAOE,UAAS,CAAC,GAAG,OAAM,iBAAgB,oBAAC;AAAA,MAClE,6CAAC,YAAO,SAAS,MAAM,OAAOA,UAAS,CAAC,GAAG,OAAM,iBAAgB,oBAAC;AAAA,MAClE,8CAAC,UAAK,OAAO,EAAE,YAAY,QAAQ,UAAU,IAAI,OAAO,EAAE,UAAU,GACjE;AAAA,eAAO;AAAA,QAAO;AAAA,QAAO,OAAO,WAAW,IAAI,KAAK;AAAA,QAAI;AAAA,QAAI,SAAS;AAAA,QAAO;AAAA,QAAS,SAAS,WAAW,IAAI,KAAK;AAAA,QAAI;AAAA,SACrH;AAAA,OACF;AAAA,IAEA,8CAAC,SAAI,OAAO,EAAE,MAAM,GAAG,SAAS,QAAQ,UAAU,SAAS,GAEzD;AAAA,mDAAC,SAAI,OAAO,EAAE,MAAM,GAAG,UAAU,QAAQ,YAAY,EAAE,QAAQ,UAAU,WAAW,GAClF;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UAAc;AAAA,UAAgB;AAAA,UAC9B;AAAA,UAAM;AAAA,UACN;AAAA,UAAY;AAAA,UAAgB;AAAA,UAC5B;AAAA,UAAgB;AAAA,UAChB;AAAA,UAAoB;AAAA,UAAsB;AAAA,UAC1C;AAAA,UAAY;AAAA,UACZ;AAAA,UAA0B;AAAA,UAC1B;AAAA;AAAA,MACF,GACF;AAAA,MAGC,eACC,8CAAC,SAAI,OAAO;AAAA,QACV,OAAO;AAAA,QAAK,UAAU;AAAA,QAAQ,YAAY;AAAA,QAC1C,YAAY,EAAE;AAAA,QAAS,YAAY,aAAa,EAAE,WAAW;AAAA,QAC7D,SAAS;AAAA,QAAa,WAAW;AAAA,MACnC,GACE;AAAA,qDAAC,SAAI,OAAO,EAAE,UAAU,IAAI,YAAY,KAAK,OAAO,EAAE,WAAW,eAAe,aAAa,eAAe,KAAK,cAAc,GAAG,GAAG,qBAAO;AAAA,QAE5I,6CAAC,SAAM,GAAM,mBAAK;AAAA,QAClB;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,aAAa,YAAY;AAAA,YAChC,UAAU,CAAC,MAAM,aAAa,EAAE,OAAO,KAAK;AAAA,YAC5C,SAAS,MAAM,aAAa,YAAY,KAAK;AAAA,YAC7C,QAAQ,MAAM;AAAE,kBAAI,aAAa,cAAc,YAAY,MAAO,eAAc,YAAY,IAAI,EAAE,OAAO,UAAU,CAAC;AAAG,2BAAa,EAAE;AAAA,YAAG;AAAA,YACzI,WAAW,CAAC,MAAM;AAAE,kBAAI,EAAE,QAAQ,QAAS,CAAC,EAAE,OAA4B,KAAK;AAAA,YAAG;AAAA,YAClF,OAAO,MAAM,CAAC;AAAA;AAAA,QAChB;AAAA,QAEA,6CAAC,SAAM,GAAM,kBAAI;AAAA,QACjB,6CAAC,YAAO,OAAO,YAAY,MAAM,UAAU,CAAC,MAAM,cAAc,YAAY,IAAI,EAAE,MAAM,EAAE,OAAO,MAAM,CAAC,GAAG,OAAO,MAAM,CAAC,GACtH,iBAAO,IAAI,OAAK,6CAAC,YAAe,OAAO,GAAI,eAAd,CAAgB,CAAS,GACzD;AAAA,QAEA,6CAAC,SAAM,GAAM,gBAAE;AAAA,QACf,6CAAC,YAAO,OAAO,YAAY,IAAI,UAAU,CAAC,MAAM,cAAc,YAAY,IAAI,EAAE,IAAI,EAAE,OAAO,MAAM,CAAC,GAAG,OAAO,MAAM,CAAC,GAClH,iBAAO,IAAI,OAAK,6CAAC,YAAe,OAAO,GAAI,eAAd,CAAgB,CAAS,GACzD;AAAA,QAEA,6CAAC,SAAM,GAAM,mBAAK;AAAA,QAClB,6CAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,EAAE,GAClC,WAAC,SAAS,QAAQ,EAAY,IAAI,CAAAC,OAClC;AAAA,UAAC;AAAA;AAAA,YAEC,SAAS,MAAM,cAAc,YAAY,IAAI,EAAE,OAAOA,GAAE,CAAC;AAAA,YACzD,OAAO;AAAA,cACL,MAAM;AAAA,cAAG,SAAS;AAAA,cAClB,QAAQ,eAAe,YAAY,UAAUA,MAAM,CAAC,YAAY,SAASA,OAAM,UAAWT,UAAS,EAAE,WAAW;AAAA,cAChH,YAAY,YAAY,UAAUS,MAAM,CAAC,YAAY,SAASA,OAAM,UAAWR,eAAc,EAAE;AAAA,cAC/F,OAAO,YAAY,UAAUQ,MAAM,CAAC,YAAY,SAASA,OAAM,UAAWT,UAAS,EAAE;AAAA,cACrF,cAAc;AAAA,cAAG,UAAU;AAAA,cAAI,YAAY;AAAA,cAAK,QAAQ;AAAA,cAAW,YAAY;AAAA,YACjF;AAAA,YAEC,UAAAS,OAAM,UAAU,uBAAa;AAAA;AAAA,UAVzBA;AAAA,QAWP,CACD,GACH;AAAA,QAEA,6CAAC,SAAI,OAAO,EAAE,QAAQ,GAAG,GAAG;AAAA,QAC5B;AAAA,UAAC;AAAA;AAAA,YACC,SAAS,MAAM,cAAc,YAAY,EAAE;AAAA,YAC3C,OAAO,EAAE,GAAGD,UAAS,CAAC,GAAG,OAAO,QAAQ,OAAO,WAAW,QAAQ,aAAa,SAAS,YAAY,SAAS,GAAG;AAAA,YACjH;AAAA;AAAA,QAAc;AAAA,SACjB;AAAA,OAEJ;AAAA,IAEA,8CAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MAAY,UAAU;AAAA,MAAI,OAAO,EAAE;AAAA,MAAW,YAAY,EAAE;AAAA,MACrE,WAAW,aAAa,EAAE,WAAW;AAAA,MAAI,SAAS;AAAA,MAAQ,KAAK;AAAA,IACjE,GACE;AAAA,oDAAC,UAAM;AAAA,eAAO;AAAA,QAAO;AAAA,SAAO;AAAA,MAC5B,8CAAC,UAAM;AAAA,iBAAS;AAAA,QAAO;AAAA,SAAS;AAAA,MAChC,6CAAC,UAAK,OAAO,EAAE,YAAY,OAAO,GAAG,qEAAoD;AAAA,OAC3F;AAAA,KACF;AAEJ;AAGA,SAAS,aAAkC;AACzC,SAAO;AAAA,IACL,SAAS;AAAA,IAAY,YAAYR;AAAA,IAAQ,OAAO;AAAA,IAAQ,QAAQ;AAAA,IAChE,cAAc;AAAA,IAAG,QAAQ;AAAA,IAAW,UAAU;AAAA,IAAI,YAAY;AAAA,IAAK,YAAY;AAAA,EACjF;AACF;AACA,SAASQ,UAAS,GAA2C;AAC3D,SAAO;AAAA,IACL,SAAS;AAAA,IAAY,YAAY;AAAA,IAAe,OAAO,EAAE;AAAA,IACzD,QAAQ,aAAa,EAAE,WAAW;AAAA,IAAI,cAAc;AAAA,IAAG,QAAQ;AAAA,IAC/D,UAAU;AAAA,IAAI,YAAY;AAAA,IAAK,YAAY;AAAA,EAC7C;AACF;AACA,SAAS,MAAM,GAA2C;AACxD,SAAO;AAAA,IACL,OAAO;AAAA,IAAQ,WAAW;AAAA,IAAc,SAAS;AAAA,IACjD,QAAQ,eAAe,EAAE,WAAW;AAAA,IAAI,cAAc;AAAA,IACtD,YAAY,EAAE;AAAA,IAAS,OAAO,EAAE;AAAA,IAAW,UAAU;AAAA,IACrD,YAAY;AAAA,IAAW,SAAS;AAAA,IAAQ,cAAc;AAAA,EACxD;AACF;AAEA,SAAS,MAAM,EAAE,GAAG,SAAS,GAAwD;AACnF,SACE,6CAAC,SAAI,OAAO,EAAE,UAAU,IAAI,YAAY,KAAK,OAAO,EAAE,WAAW,eAAe,aAAa,eAAe,KAAK,cAAc,EAAE,GAC9H,UACH;AAEJ;;;AiB7eA,IAAAE,iBAAgC;AAyC1B,IAAAC,sBAAA;AAzBC,SAAS,cAAc;AAAA,EAC5B;AAAA,EAAO;AAAA,EAAU;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAG;AAAA,EAAK;AAAA,EAAM;AAAA,EAAU;AAC5D,GAAuB;AACrB,QAAM,CAAC,QAAQ,SAAS,QAAI,yBAAS,EAAE;AAEvC,QAAM,YAAY,CAAC,SAAsB;AACvC,QAAI,YAAY,WAAY,QAAO;AACnC,QAAI,YAAY,UAAW,QAAO;AAClC,YAAQ,KAAK,OAAO;AAAA,MAClB,KAAK;AAAW,eAAO;AAAA,MACvB,KAAK;AAAU,eAAO;AAAA,MACtB,KAAK;AAAiB,eAAO;AAAA,MAC7B;AAAS,eAAO;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,WAAW,MAAM,MAAM;AAAA,IAAO,OAClC,EAAE,MAAM,YAAY,EAAE,SAAS,OAAO,YAAY,CAAC;AAAA,EACrD;AAEA,QAAM,UAAU,CAAC,OAAe,MAAM,MAAM,OAAO,OAAK,EAAE,OAAO,EAAE,EAAE;AACrE,QAAM,WAAW,CAAC,OAAe,MAAM,MAAM,OAAO,OAAK,EAAE,SAAS,EAAE,EAAE;AAExE,MAAI,CAAC,MAAM;AACT,WACE,8CAAC,SAAI,OAAO;AAAA,MACV,OAAO;AAAA,MAAI,YAAY;AAAA,MACvB,YAAY,EAAE;AAAA,MAAS,aAAa,aAAa,EAAE,WAAW;AAAA,MAC9D,SAAS;AAAA,MAAQ,eAAe;AAAA,MAAU,YAAY;AAAA,MAAU,YAAY;AAAA,MAAG,KAAK;AAAA,IACtF,GACE;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,SAAS;AAAA,UACT,OAAM;AAAA,UACN,iBAAe;AAAA,UACf,cAAW;AAAA,UACX,OAAO,EAAE,YAAY,QAAQ,QAAQ,QAAQ,QAAQ,WAAW,OAAO,EAAE,WAAW,SAAS,GAAG,cAAc,GAAG,UAAU,IAAI,YAAY,EAAE;AAAA,UAC9I;AAAA;AAAA,MAAC;AAAA,MACF,6CAAC,SAAI,OAAO,EAAE,UAAU,IAAI,OAAO,EAAE,WAAW,YAAY,KAAK,aAAa,eAAe,WAAW,kBAAkB,eAAe,IAAI,GAC1I,gBAAM,MAAM,QACf;AAAA,OACF;AAAA,EAEJ;AAEA,SACE,8CAAC,SAAI,OAAO;AAAA,IACV,OAAO;AAAA,IAAK,YAAY;AAAA,IACxB,YAAY,EAAE;AAAA,IAAS,aAAa,aAAa,EAAE,WAAW;AAAA,IAC9D,SAAS;AAAA,IAAQ,eAAe;AAAA,IAAU,UAAU;AAAA,EACtD,GACE;AAAA,kDAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MAAQ,YAAY;AAAA,MAAU,gBAAgB;AAAA,MACvD,SAAS;AAAA,MAAa,cAAc,aAAa,EAAE,WAAW;AAAA,MAAI,YAAY;AAAA,IAChF,GACE;AAAA,oDAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,EAAE,GAC1D;AAAA,qDAAC,UAAK,OAAO,EAAE,UAAU,IAAI,YAAY,KAAK,OAAO,EAAE,eAAe,eAAe,aAAa,eAAe,IAAI,GAClH,sBAAY,aAAa,cAAc,YAAY,YAAY,UAAU,SAC5E;AAAA,QACA,6CAAC,UAAK,OAAO;AAAA,UACX,UAAU;AAAA,UAAI,YAAY;AAAA,UAAK,OAAO,EAAE;AAAA,UACxC,YAAY,SAAS,YAAY;AAAA,UACjC,SAAS;AAAA,UAAW,cAAc;AAAA,QACpC,GAAI,gBAAM,MAAM,QAAO;AAAA,SACzB;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,SAAS;AAAA,UACT,OAAO,EAAE,YAAY,QAAQ,QAAQ,QAAQ,QAAQ,WAAW,OAAO,EAAE,WAAW,SAAS,WAAW,cAAc,GAAG,UAAU,IAAI,YAAY,EAAE;AAAA,UACrJ,OAAM;AAAA,UACN,iBAAe;AAAA,UACf,cAAW;AAAA,UACZ;AAAA;AAAA,MAAC;AAAA,OACJ;AAAA,IAEA,6CAAC,SAAI,OAAO,EAAE,SAAS,YAAY,cAAc,aAAa,EAAE,aAAa,IAAI,YAAY,EAAE,GAC7F,wDAAC,SAAI,OAAO,EAAE,UAAU,WAAW,GACjC;AAAA,mDAAC,UAAK,OAAO,EAAE,UAAU,YAAY,MAAM,GAAG,KAAK,OAAO,WAAW,oBAAoB,UAAU,IAAI,OAAO,EAAE,WAAW,eAAe,OAAO,GAAG,oBAAC;AAAA,MACrJ;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,UACP,UAAU,OAAK,UAAU,EAAE,OAAO,KAAK;AAAA,UACvC,aAAY;AAAA,UACZ,OAAO;AAAA,YACL,OAAO;AAAA,YAAQ,SAAS;AAAA,YACxB,QAAQ,eAAe,EAAE,WAAW;AAAA,YAAI,cAAc;AAAA,YACtD,UAAU;AAAA,YAAI,YAAY,EAAE;AAAA,YAAS,OAAO,EAAE;AAAA,YAC9C,SAAS;AAAA,YAAQ,WAAW;AAAA,YAAc,YAAY;AAAA,UACxD;AAAA;AAAA,MACF;AAAA,OACF,GACF;AAAA,IAEA,8CAAC,SAAI,OAAO,EAAE,MAAM,GAAG,WAAW,QAAQ,SAAS,WAAW,SAAS,QAAQ,eAAe,UAAU,KAAK,EAAE,GAC5G;AAAA,eAAS,WAAW,KACnB,6CAAC,SAAI,OAAO,EAAE,WAAW,UAAU,SAAS,UAAU,UAAU,IAAI,OAAO,EAAE,WAAW,WAAW,SAAS,GACzG,gBAAM,MAAM,WAAW,IAAI,iBAAiB,cAC/C;AAAA,MAED,SAAS,IAAI,CAAC,MAAM,QAAQ;AAC3B,cAAM,aAAa,aAAa,KAAK;AACrC,cAAM,UAAW,KAAK,UAAU,WAAoC,CAAC;AACrE,eACE;AAAA,UAAC;AAAA;AAAA,YAEC,SAAS,MAAM,SAAS,KAAK,EAAE;AAAA,YAC/B,OAAO;AAAA,cACL,SAAS;AAAA,cAAQ,YAAY;AAAA,cAAU,KAAK;AAAA,cAC5C,OAAO;AAAA,cAAQ,SAAS;AAAA,cAAW,WAAW;AAAA,cAC9C,YAAY,aAAa,IAAI,OAAO;AAAA,cACpC,QAAQ,aAAa,eAAe,IAAI,MAAM,KAAK;AAAA,cACnD,cAAc;AAAA,cAAG,QAAQ;AAAA,cAAW,YAAY;AAAA,cAChD,YAAY;AAAA,YACd;AAAA,YACA,cAAc,OAAK;AAAE,kBAAI,CAAC,WAAY,CAAC,EAAE,cAA8B,MAAM,aAAa,SAAS,YAAY;AAAA,YAAW;AAAA,YAC1H,cAAc,OAAK;AAAE,kBAAI,CAAC,WAAY,CAAC,EAAE,cAA8B,MAAM,aAAa;AAAA,YAAe;AAAA,YAEzG;AAAA,2DAAC,SAAI,OAAO;AAAA,gBACV,OAAO;AAAA,gBAAI,QAAQ;AAAA,gBAAI,cAAc;AAAA,gBAAG,YAAY;AAAA,gBACpD,YAAY,aAAa,IAAI,QAAS,SAAS,YAAY;AAAA,gBAC3D,OAAO,aAAa,SAAS,EAAE;AAAA,gBAC/B,SAAS;AAAA,gBAAQ,YAAY;AAAA,gBAAU,gBAAgB;AAAA,gBACvD,UAAU,YAAY,YAAY,IAAI;AAAA,gBAAI,YAAY;AAAA,cACxD,GACG,sBAAY,YAAY,MAAM,IAAI,UAAU,IAAI,GACnD;AAAA,cAEA,8CAAC,SAAI,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,GACjC;AAAA,6DAAC,SAAI,OAAO;AAAA,kBACV,UAAU;AAAA,kBAAI,YAAY,aAAa,MAAM;AAAA,kBAC7C,OAAO,aAAa,IAAI,QAAQ,EAAE;AAAA,kBAClC,UAAU;AAAA,kBAAU,cAAc;AAAA,kBAAY,YAAY;AAAA,kBAC1D,YAAY;AAAA,gBACd,GAAI,eAAK,OAAM;AAAA,gBACf,6CAAC,SAAI,OAAO,EAAE,UAAU,IAAI,OAAO,EAAE,WAAW,YAAY,KAAK,WAAW,EAAE,GAC3E,sBAAY,aACT,GAAG,QAAQ,MAAM,UAAU,QAAQ,WAAW,IAAI,MAAM,EAAE,KAC1D,GAAG,QAAQ,KAAK,EAAE,CAAC,UAAK,SAAS,KAAK,EAAE,CAAC,UAC/C;AAAA,iBACF;AAAA,cAEC,cAAc,6CAAC,UAAK,OAAO,EAAE,UAAU,IAAI,OAAO,IAAI,OAAO,YAAY,EAAE,GAAG,oBAAC;AAAA;AAAA;AAAA,UArC3E,KAAK;AAAA,QAsCZ;AAAA,MAEJ,CAAC;AAAA,OACH;AAAA,KACF;AAEJ;;;ACjKA,IAAAC,iBAAgC;;;ACGzB,IAAMC,UAAS;AACf,IAAMC,YAAW;AACjB,IAAMC,eAAc;AACpB,IAAM,OAAO;AACb,IAAMC,cAAa;AAGnB,IAAMC,cAAa;AACnB,IAAMC,cAAa;AACnB,IAAMC,WAAU;AAIhB,SAASC,eAAc,MAAc,YAAY,KAAa;AACnE,SAAO,KAAK,SAAS;AACvB;AAGO,SAASC,WAAU,OAAuB;AAC/C,SAAO,KAAK,IAAIC,aAAY,KAAK,IAAIC,aAAY,KAAK,KAAKH,eAAc,KAAK,IAAI,EAAE,CAAC,CAAC;AACxF;AAGO,SAASI,aAAY,KAAqB;AAC/C,SAAO,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,IAAIJ,eAAc,KAAK,GAAG,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC;AAChF;AAGO,SAASK,eAAc,MAA2B;AACvD,QAAM,UAAW,KAAK,UAAU,WAAoC,CAAC;AACrE,QAAM,UAAUL,eAAc,KAAK,OAAO,CAAC,IAAI;AAC/C,MAAI,QAAQ,WAAW,EAAG,QAAO,KAAK,IAAIM,UAAS,KAAK,KAAK,OAAO,CAAC;AACrE,QAAM,SACJ,QAAQ,OAAO,CAACC,IAAG,MAAMA,KAAIH,aAAY,CAAC,GAAG,CAAC,KAC7C,QAAQ,SAAS,KAAKI,cACvB,IAAIA;AACN,SAAO,KAAK,IAAIF,UAAS,KAAK,KAAK,KAAK,IAAI,SAAS,MAAM,CAAC,CAAC;AAC/D;AAEO,SAASG,eAAc,SAA2B;AACvD,SAAOC,aAAY,QAAQ,WAAW,IAAI,KAAKC;AACjD;AAGO,SAAS,SAAS,MAAmB,SAAmD;AAC7F,MAAI,YAAY,YAAY;AAC1B,UAAM,UAAW,KAAK,UAAU,WAAoC,CAAC;AACrE,WAAO,EAAE,GAAGN,eAAc,IAAI,GAAG,GAAGI,eAAc,OAAO,EAAE;AAAA,EAC7D;AACA,SAAO,EAAE,GAAGR,WAAU,KAAK,KAAK,GAAG,GAAGW,QAAO;AAC/C;AAGO,SAAS,KAAK,GAAmB;AACtC,SAAO,KAAK,MAAM,IAAI,IAAI,IAAI;AAChC;AAQO,SAASC,YACd,IACA,IACA,IACA,IACA,UAAuC,UAC/B;AACR,MAAI,YAAY,SAAS;AACvB,UAAM,KAAK,KAAK,IAAI,KAAK,EAAE,GACzBC,MAAK,KAAK,IAAI,KAAK,EAAE;AACvB,UAAM,IAAI,KAAK,IAAI,KAAK,KAAKA,OAAM,IAAI;AACvC,WAAO,KAAK,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,KAAK,IAAI,GAAG,KAAK,EAAE,IAAI,EAAE;AAAA,EAC5E;AACA,MAAI,YAAY,QAAQ;AACtB,UAAM,KAAK,KAAK,IAAI,KAAK,EAAE,GACzBA,MAAK,KAAK,IAAI,KAAK,EAAE;AACvB,UAAM,IAAI,KAAK,IAAI,KAAK,KAAKA,OAAM,IAAI;AACvC,WAAO,KAAK,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,KAAK,IAAI,GAAG,KAAK,EAAE,IAAI,EAAE;AAAA,EAC5E;AACA,QAAM,KAAK,KAAK;AAChB,QAAM,QAAQ,KAAK,IAAI,EAAE;AACzB,QAAM,QAAQ,KAAK,IAAI,KAAK,EAAE;AAC9B,QAAM,OAAO,KAAK,IAAI,QAAQ,OAAO,KAAK,IAAI,IAAI,QAAQ,MAAM,QAAQ,IAAI;AAC5E,QAAM,QAAQ,KAAK,IAAI,IAAI,KAAK,IAAI,KAAK,IAAI,CAAC;AAC9C,SAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,KAAK,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,KAAK,EAAE,IAAI,EAAE;AAC9E;AAOO,SAAS,cACd,IACA,IACA,IACA,IACA,IACA,IACQ;AACR,QAAM,OAAOD,YAAW,IAAI,IAAI,IAAI,IAAI,QAAQ;AAChD,QAAM,OAAOA,YAAW,IAAI,IAAI,IAAI,IAAI,QAAQ;AAGhD,QAAM,UAAU,KAAK,QAAQ,+BAA+B,EAAE;AAC9D,SAAO,OAAO,MAAM;AACtB;;;ADtEQ,IAAAE,sBAAA;AAtBR,IAAM,cAAmC,EAAE,eAAe,QAAQ,YAAY,OAAO;AACrF,IAAM,aAAkC,EAAE,QAAQ,YAAY;AAC9D,IAAM,iBAAsC,EAAE,QAAQ,UAAU;AAChE,IAAM,kBAAuC,EAAE,eAAe,OAAO;AACrE,IAAM,mBAAwC,EAAE,QAAQ,aAAa,QAAQ,0CAA0C;AACvH,IAAM,iBAAsC,EAAE,QAAQ,QAAQ,QAAQ,0CAA0C;AAChH,IAAM,uBAA4C,EAAE,QAAQ,OAAO;AAG5D,SAAS,UAAU,EAAE,MAAM,UAAU,SAAS,YAAY,GAAG,QAAQ,EAAE,GAG3E;AACD,QAAM,MAAM,cAAc,SAAS,MAAM;AACzC,QAAM,KAAK,IAAI,GAAG,KAAKC,UAAS;AAChC,QAAM,SAAS,WAAW,IAAI,QAAQ,EAAE;AACxC,QAAM,OAAO,WAAW,EAAE,mBAAmB,EAAE;AAC/C,QAAM,KAAK,WAAW,OAAO;AAE7B,QAAM,OAAO,YACX,6EACG,eAAK,UAAU,WACd,8EACE;AAAA,iDAAC,YAAO,IAAQ,IAAQ,GAAGA,UAAS,IAAI,GAAG,MAAK,QAAO,QAAQ,IAAI,OAAO,aAAa,GAAG,SAAS,MAAM,OAAO,YAAY;AAAA,IAC5H,6CAAC,YAAO,IAAQ,IAAQ,GAAGA,UAAS,IAAI,KAAK,MAAK,QAAO,QAAQ,IAAI,OAAO,aAAa,GAAG,SAAS,MAAM;AAAA,KAC7G,IACE,KAAK,UAAU,YACjB,8EACE;AAAA;AAAA,MAAC;AAAA;AAAA,QAAQ,QAAQ,GAAG,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAIA,UAAS,CAAC,IAAI,EAAE,IAAI,EAAE;AAAA,QACzE,MAAK;AAAA,QAAO,QAAQ,IAAI;AAAA,QAAO,aAAa;AAAA,QAAG,SAAS;AAAA,QAAM,OAAO;AAAA;AAAA,IAAY;AAAA,IACnF;AAAA,MAAC;AAAA;AAAA,QAAQ,QAAQ,GAAG,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAIA,UAAS,CAAC,IAAI,EAAE,IAAI,EAAE;AAAA,QACzE,MAAK;AAAA,QAAO,QAAQ,IAAI;AAAA,QAAO,aAAa;AAAA,QAAG,SAAS;AAAA;AAAA,IAAM;AAAA,KAClE,IAEA,8EACE;AAAA;AAAA,MAAC;AAAA;AAAA,QAAK,GAAG;AAAA,QAAI,GAAG;AAAA,QAAI,OAAO,IAAI;AAAA,QAAG,QAAQA,UAAS;AAAA,QAAG,IAAI;AAAA,QACxD,MAAK;AAAA,QAAO,QAAQ,IAAI;AAAA,QAAO,aAAa;AAAA,QAAG,SAAS;AAAA,QAAM,OAAO;AAAA;AAAA,IAAY;AAAA,IACnF;AAAA,MAAC;AAAA;AAAA,QAAK,GAAG;AAAA,QAAM,GAAG;AAAA,QAAM,OAAO,IAAI;AAAA,QAAG,QAAQA,UAAS;AAAA,QAAG,IAAI;AAAA,QAC5D,MAAK;AAAA,QAAO,QAAQ,IAAI;AAAA,QAAO,aAAa;AAAA,QAAG,SAAS;AAAA;AAAA,IAAK;AAAA,KACjE,GAEJ;AAGF,QAAM,aAAa,SAAS,OAAE,cAAc,OAAE;AAC9C,QAAM,QAAQ,YAAY,aAAa,eAAe,UACpD,8EACE;AAAA,iDAAC,YAAO,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,MAAM,YAAY;AAAA,IACjD,6CAAC,UAAK,GAAG,IAAI,GAAG,IAAI,YAAW,UAAS,UAAU,GAAG,MAAK,SAAQ,YAAW,OAAM,OAAO,aAAc,sBAAW;AAAA,KACrH;AAGF,UAAQ,KAAK,OAAO;AAAA,IAClB,KAAK,WAAW;AACd,YAAM,MAAM,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAIA,OAAM,MAAM,EAAE;AACtD,aAAO,8EAAG;AAAA;AAAA,QAAK,6CAAC,aAAQ,QAAQ,KAAK,MAAY,QAAgB,aAAa,IAAI,QAAO,oBAAmB;AAAA,QAAG;AAAA,SAAM;AAAA,IACvH;AAAA,IACA,KAAK;AACH,aAAO,8EAAG;AAAA;AAAA,QAAK,6CAAC,YAAO,IAAQ,IAAQ,GAAGA,UAAS,IAAI,GAAG,MAAY,QAAgB,aAAa,IAAI,QAAO,oBAAmB;AAAA,QAAG;AAAA,SAAM;AAAA,IAC5I,KAAK;AACH,aAAO,8EAAG;AAAA;AAAA,QAAK,6CAAC,aAAQ,QAAQ,QAAQ,CAAC,MAAM,IAAI,EAAE,IAAIA,OAAM,MAAMA,OAAM,IAAI,MAAY,QAAgB,aAAa,IAAI,QAAO,oBAAmB;AAAA,QAAG;AAAA,SAAM;AAAA,IACjK;AACE,aAAO,8EAAG;AAAA;AAAA,QAAK,6CAAC,UAAK,OAAO,GAAG,QAAQA,SAAQ,IAAI,IAAI,MAAY,QAAgB,aAAa,IAAI,QAAO,oBAAmB;AAAA,QAAG;AAAA,SAAM;AAAA,EAC3I;AACF;AAGA,IAAM,iBAAiB;AAEhB,SAAS,aAAa,EAAE,MAAM,UAAU,OAAO,QAAQ,kBAAkB,GAAG,GAIhF;AACD,QAAM,UAAqB,KAAK,UAAU,WAAoC,CAAC;AAC/E,QAAM,SAASC,eAAc,OAAO;AACpC,QAAM,QAAQ,SAAS,OAAE,YAAY,OAAE;AACvC,QAAM,YAAY,SAAS,0BAA0B;AACrD,QAAM,YAAY,SAAS,0BAA0B;AACrD,QAAM,SAAS,SAAS,YAAY;AACpC,QAAM,aAAa,WAAW,QAAS,SAAS,0BAA0B;AAC1E,QAAM,SAAS,SAAS,YAAY;AACpC,QAAM,kBAAkB,SAAS,0BAA0B;AAC3D,QAAM,aAAa,SAAS,YAAY;AACxC,QAAM,WAAW,SAAS,YAAY;AACtC,QAAM,UAAU,SAAS,YAAY;AACrC,QAAM,UAAU,SAAS,YAAY;AAErC,QAAM,WAAWC,YAAWC,eAAc;AAE1C,QAAM,OAAO,YACX,8EACE;AAAA;AAAA,MAAC;AAAA;AAAA,QAAK,GAAG;AAAA,QAAI,GAAG;AAAA,QAAI,OAAO,KAAK;AAAA,QAAG,QAAQ,SAAS;AAAA,QAAG,IAAI;AAAA,QACzD,MAAK;AAAA,QAAO,QAAQ;AAAA,QAAO,aAAa;AAAA,QAAG,SAAS;AAAA,QACpD,OAAO;AAAA;AAAA,IAAY;AAAA,IACrB;AAAA,MAAC;AAAA;AAAA,QAAK,GAAG;AAAA,QAAM,GAAG;AAAA,QAAM,OAAO,KAAK;AAAA,QAAG,QAAQ,SAAS;AAAA,QAAG,IAAI;AAAA,QAC7D,MAAK;AAAA,QAAO,QAAQ;AAAA,QAAO,aAAa;AAAA,QAAG,SAAS;AAAA;AAAA,IAAM;AAAA,KAC9D;AAGF,SACE,8EACG;AAAA;AAAA,IACD,6CAAC,UAAK,OAAO,IAAI,QAAQ,QAAQ,IAAI,IAAI,MAAM,QAAQ,QAAQ,YAAY,aAAa,WAAW,IAAI,KAAK,QAAO,oBAAmB;AAAA,IACtI,6CAAC,cAAS,IAAI,QAAQ,KAAK,EAAE,IAC3B,uDAAC,UAAK,OAAO,IAAI,QAAQD,WAAU,IAAI,IAAI,GAC7C;AAAA,IACA,6CAAC,UAAK,OAAO,IAAI,QAAQA,WAAU,MAAM,WAAW,UAAU,aAAa,KAAK,EAAE,KAAK;AAAA,IACvF,6CAAC,UAAK,GAAG,GAAG,GAAG,GAAG,OAAO,GAAG,QAAQA,WAAU,IAAI,GAAG,MAAM,OAAO;AAAA,IAClE,6CAAC,UAAK,GAAG,IAAI,GAAG,IAAI,OAAO,IAAI,QAAQ,IAAI,IAAI,GAAG,MAAM,OAAO;AAAA,IAC/D,6CAAC,UAAK,GAAG,IAAI,GAAG,IAAI,YAAW,UAAS,UAAU,IAAI,YAAW,OAAM,MAAK,SAAQ,OAAO,aAAa,eAAC;AAAA,IACzG;AAAA,MAAC;AAAA;AAAA,QAAK,OAAO;AAAA,QACX,YAAW;AAAA,QACX;AAAA,uDAAC,WAAM,GAAG,IAAI,GAAG,IAAI,UAAU,GAAG,YAAY,KAAK,MAAM,SAAS,eAAe,KAAK,YAAW,SAAQ,sBAAQ;AAAA,UACjH,6CAAC,WAAM,GAAG,IAAI,IAAI,IAAI,UAAU,IAAI,YAAY,KAAK,MAAM,WAAW,QAAQ,UAAU,YAAW,SAChG,eAAK,OACR;AAAA;AAAA;AAAA,IACF;AAAA,IACA,6CAAC,UAAK,IAAI,GAAG,IAAIA,WAAU,IAAI,IAAI,IAAIA,WAAU,QAAQ,WAAW,aAAa,GAAG;AAAA,IACnF,QAAQ,WAAW,KAClB,8EACE;AAAA,mDAAC,UAAK,GAAG,KAAK,GAAG,GAAGA,YAAW,IAAI,YAAW,UAAS,UAAU,IAAI,MAAM,OAAO,SAAS,KAAK,YAAY,KAAK,OAAO,aAAa,4BAErI;AAAA,MACA,6CAAC,UAAK,GAAG,KAAK,GAAG,GAAGA,YAAW,IAAI,YAAW,UAAS,UAAU,GAAG,MAAM,SAAS,SAAS,KAAK,OAAO,aAAa,0CAErH;AAAA,OACF;AAAA,IAED,QAAQ,IAAI,CAAC,KAAK,MAAM;AACvB,YAAM,QAAQ,QAAQ,MAAM,GAAG,CAAC,EAAE,OAAO,CAACE,IAAG,MAAMA,KAAIC,aAAY,CAAC,IAAIC,aAAY,CAAC;AACrF,YAAM,KAAKD,aAAY,GAAG;AAC1B,YAAM,QAAQC,cAAa;AAC3B,YAAM,QAAQJ,YAAW;AACzB,YAAM,QAAQC,eAAc;AAC5B,YAAM,KAAK,QAAQ,KAAK;AACxB,YAAM,YAAY,MAAM,KAAK,OAAK,EAAE,SAAS,KAAK,MAAM,EAAE,UAAU,GAAG;AACvE,YAAM,SAAS,IAAI,KAAK,eAAe,CAAC,IAAI,GAAG,IAAI,CAAC;AACpD,YAAM,WAAW,KAAK,IAAI,GAAG,KAAK,OAAO,KAAK,MAAM,GAAG,CAAC;AACxD,YAAM,aAAa,IAAI,SAAS,WAAW,IAAI,MAAM,GAAG,WAAW,CAAC,IAAI,WAAM;AAE9E,aACE,8CAAC,OACC;AAAA;AAAA,UAAC;AAAA;AAAA,YAAK,GAAG;AAAA,YAAO,GAAG;AAAA,YAAO,OAAO;AAAA,YAAI,QAAQ;AAAA,YAAO,IAAI;AAAA,YACtD,MAAM,YAAY,kBAAkB;AAAA,YACpC,QAAQ,YAAY,QAAQ;AAAA,YAAY,aAAa,YAAY,MAAM;AAAA;AAAA,QAAG;AAAA,QAC5E;AAAA,UAAC;AAAA;AAAA,YAAK,GAAG,KAAK;AAAA,YAAI,GAAG,QAAQ;AAAA,YAAG,OAAO;AAAA,YAAI,QAAQ;AAAA,YAAI,IAAI;AAAA,YACzD,MAAM,YAAY,QAAS,SAAS,YAAY;AAAA;AAAA,QAAY;AAAA,QAC9D;AAAA,UAAC;AAAA;AAAA,YAAK,GAAG;AAAA,YAAI,GAAG,QAAQ;AAAA,YAAI,YAAW;AAAA,YAAS,UAAU;AAAA,YAAI,YAAY;AAAA,YACxE,MAAM,YAAY,SAAS;AAAA,YAC3B,OAAO;AAAA,YACN;AAAA;AAAA,QACH;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YAAK,GAAG;AAAA,YAAI,GAAG,QAAQ;AAAA,YAAI,YAAW;AAAA,YAAS,UAAU;AAAA,YAAI,YAAY;AAAA,YACxE,MAAM,YAAa,SAAS,YAAY,YAAa;AAAA,YACrD,YAAW;AAAA,YACX,OAAO;AAAA,YACN;AAAA;AAAA,QACH;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YAAQ,IAAI;AAAA,YAAU,GAAG;AAAA,YACzB,MAAM,YAAY,QAAS,SAAS,YAAY;AAAA,YAChD,QAAQ;AAAA,YAAO,aAAa;AAAA,YAC5B,OAAO;AAAA,YACP,aAAa,OAAK,iBAAiB,GAAG,KAAK,IAAI,KAAK,IAAI,QAAQ;AAAA;AAAA,QAClE;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,GAAG,KAAK,KAAK,CAAC,IAAI,WAAW,CAAC,MAAM,EAAE,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,CAAC;AAAA,YAClF,MAAK;AAAA,YAAO,QAAQ,YAAY,SAAS;AAAA,YAAO,aAAa;AAAA,YAAK,eAAc;AAAA,YAAQ,gBAAe;AAAA,YACvG,OAAO;AAAA;AAAA,QACT;AAAA,WA5BM,MAAM,CA6Bd;AAAA,IAEJ,CAAC;AAAA,KACH;AAEJ;AAGO,SAAS,SAAS,EAAE,MAAM,OAAO,SAAS,GAAG,QAAQ,KAAK,SAAS,WAAW,cAAc,cAAc,cAAc,eAAe,eAAe,eAAe,GAYzK;AACD,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAS,KAAK;AAC5C,QAAM,OAAO,MAAM,KAAK,OAAK,EAAE,OAAO,KAAK,IAAI;AAC/C,QAAM,KAAK,MAAM,KAAK,OAAK,EAAE,OAAO,KAAK,EAAE;AAC3C,MAAI,CAAC,QAAQ,CAAC,GAAI,QAAO;AAEzB,MAAI,IAAY,IAAY,UAAuC;AACnE,QAAM,aAAa,SAAS,OAAE,YAAY,OAAE;AAE5C,MAAI,YAAY,YAAY;AAC1B,UAAM,UAAqB,KAAK,UAAU,WAAoC,CAAC;AAC/E,UAAM,MAAM,QAAQ,QAAQ,KAAK,SAAS,EAAE;AAC5C,QAAI,OAAO,GAAG;AACZ,YAAM,QAAQ,QAAQ,MAAM,GAAG,GAAG,EAAE,OAAO,CAACC,IAAG,MAAMA,KAAIC,aAAY,CAAC,IAAIC,aAAY,CAAC;AACvF,YAAM,KAAKD,aAAY,QAAQ,GAAG,CAAC;AACnC,YAAM,KAAK,KAAK,KAAKC,cAAa,QAAQ,KAAK;AAC/C,YAAM,KAAK,KAAK,KAAKJ,YAAWC,eAAc;AAC9C,gBAAU;AAAA,IACZ,OAAO;AACL,YAAM,MAAMI,eAAc,IAAI;AAC9B,YAAM,KAAK,KAAK,KAAK,MAAM;AAC3B,YAAM,KAAK,KAAK,KAAKN,eAAc,OAAO;AAAA,IAC5C;AAAA,EACF,OAAO;AACL,UAAM,MAAMO,WAAU,KAAK,KAAK;AAChC,UAAM,KAAK,KAAK,KAAK,MAAM;AAC3B,UAAM,KAAK,KAAK,KAAKR;AAAA,EACvB;AAEA,QAAM,MAAM,YAAY,aAAaO,eAAc,EAAE,IAAIC,WAAU,GAAG,KAAK;AAC3E,QAAM,MAAM,GAAG,KAAK,KAAK,MAAM;AAC/B,QAAM,KAAK,GAAG,KAAK;AACnB,QAAM,KAAK,KAAK;AAChB,QAAM,IAAI,KAAK,cAAc,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,EAAE,IAAIC,YAAW,IAAI,IAAI,IAAI,IAAI,OAAO;AAE7F,QAAM,KAAK,KAAK,GAAG,KAAK,KAAK,MAAM;AACnC,QAAM,KAAK,KAAK,GAAG,KAAK,KAAK,MAAM;AACnC,QAAM,KAAK,IAAI,KAAK,KAAK;AACzB,QAAM,OAAO,KAAK,UAAU,WAAW,QAAQ,KAAK,UAAU,WAAW,QAAQ;AACjF,QAAM,UAAU,YAAY,aAAa,aAAa,EAAE;AAExD,QAAM,UAAU,YAAY;AAC5B,QAAM,SAAS,KAAK,QAAQ,KAAK,IAAI,IAAI,KAAK,KAAKC,eAAc,KAAK,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI;AACzF,QAAM,aAAa,CAAC,CAAC,mBAAmB,WAAW,CAAC,CAAC;AAKrD,QAAM,YAAY,OAAO,SAAY,UAAU,oBAAoB;AACnE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAe,CAAC,MAAM;AAAE,UAAE,gBAAgB;AAAG,wBAAgB,KAAK,EAAE;AAAA,MAAG;AAAA,MACvE,eAAe,CAAC,MAAM;AAAE,wBAAgB,GAAG,KAAK,EAAE;AAAA,MAAG;AAAA,MACrD,cAAc,MAAM,WAAW,IAAI;AAAA,MACnC,cAAc,MAAM,WAAW,KAAK;AAAA,MAEpC;AAAA,qDAAC,UAAK,GAAM,MAAK,QAAO,QAAO,eAAc,aAAa,IAAI,OAAO,gBAAgB;AAAA,QACrF;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YAAM,MAAK;AAAA,YAAO,QAAQ;AAAA,YAC1B,aAAa,UAAU,IAAI;AAAA,YAC3B,eAAc;AAAA,YACd,WAAW;AAAA,YACX,iBAAiB;AAAA,YACjB,WAAW,UAAU,qBAAqB;AAAA,YAC1C,SAAS,UAAU,OAAO;AAAA,YAC1B,OAAO;AAAA;AAAA,QACT;AAAA,QACC,cACC;AAAA,UAAC;AAAA;AAAA,YACC,IAAI;AAAA,YAAI,IAAI;AAAA,YAAI,GAAG,KAAK,IAAI;AAAA,YAC5B,MAAM,KAAK,IAAI,QAAS,SAAS,YAAY;AAAA,YAC7C,QAAQ,IAAI;AAAA,YAAO,aAAa;AAAA,YAChC,OAAO;AAAA,YACP,aAAa,CAAC,MAAM;AAAE,gBAAE,gBAAgB;AAAG,+BAAiB,GAAG,KAAK,EAAE;AAAA,YAAG;AAAA;AAAA,QAC3E;AAAA,QAED,WAAW,CAAC,UACX,6CAAC,mBAAc,GAAG,KAAK,SAAS,GAAG,GAAG,KAAK,IAAI,OAAO,QAAQ,QAAQ,IACpE;AAAA,UAAC;AAAA;AAAA,YACC,WAAS;AAAA,YACT,OAAO,aAAa;AAAA,YACpB,UAAU,CAAC,MAAM,eAAe,EAAE,OAAO,KAAK;AAAA,YAC9C,QAAQ,MAAM,eAAe;AAAA,YAC7B,WAAW,CAAC,MAAM;AAChB,kBAAI,EAAE,QAAQ,SAAS;AAAE,kBAAE,eAAe;AAAG,+BAAe;AAAA,cAAG;AAC/D,kBAAI,EAAE,QAAQ,UAAU;AAAE,kBAAE,eAAe;AAAG,+BAAe;AAAA,cAAG;AAAA,YAClE;AAAA,YACA,aAAa,CAAC,MAAM,EAAE,gBAAgB;AAAA,YACtC,OAAO;AAAA,cACL,OAAO;AAAA,cAAQ,QAAQ;AAAA,cAAQ,QAAQ;AAAA,cAAQ,cAAc;AAAA,cAC7D,SAAS,aAAa,IAAI,KAAK;AAAA,cAC/B,WAAW;AAAA,cAAU,UAAU;AAAA,cAAI,YAAY;AAAA,cAC/C,YAAY,EAAE;AAAA,cAAS,OAAO,EAAE;AAAA,cAChC,WAAW;AAAA,cAAc,SAAS;AAAA,cAAS,YAAY;AAAA,YACzD;AAAA;AAAA,QACF,GACF,IACE,KAAK,SAAS,CAAC,UACjB,8EACE;AAAA;AAAA,YAAC;AAAA;AAAA,cAAK,GAAG,KAAK,SAAS;AAAA,cAAG,GAAG,KAAK;AAAA,cAAI,OAAO;AAAA,cAAQ,QAAQ;AAAA,cAAI,IAAI;AAAA,cACnE,MAAM,EAAE;AAAA,cAAS,QAAQ,EAAE;AAAA,cAAY,aAAa;AAAA,cACpD,OAAO;AAAA;AAAA,UAAsB;AAAA,UAC/B;AAAA,YAAC;AAAA;AAAA,cAAK,GAAG;AAAA,cAAI,GAAG,KAAK;AAAA,cAAG,YAAW;AAAA,cAAS,UAAU;AAAA,cAAI,MAAM,EAAE;AAAA,cAChE,YAAW;AAAA,cAAqC,YAAW;AAAA,cAC3D,OAAO;AAAA,cAAc,eAAK;AAAA;AAAA,UAAM;AAAA,WACpC,IACE;AAAA;AAAA;AAAA,EACN;AAEJ;;;AEhUA,IAAAC,iBAA2C;AAkHrC,IAAAC,sBAAA;AA/GN,IAAM,IAAI;AACV,IAAM,IAAI;AACV,IAAM,MAAM;AAmBL,SAAS,QAAQ;AAAA,EACtB;AAAA,EAAO;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAa;AAAA,EAAY;AAAA,EAAQ;AAC3E,GAAiB;AACf,QAAM,cAAU,uBAAmC,IAAI;AAEvD,QAAM,QAAmB,MAAM,MAAM,IAAI,OAAK;AAC5C,UAAM,EAAE,GAAG,EAAE,IAAI,YAAY,CAAC;AAC9B,WAAO,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,KAAK,GAAG,GAAG,EAAE,KAAK,GAAG,GAAG,EAAE;AAAA,EACpD,CAAC;AAED,MAAI,MAAM,WAAW,EAAG,QAAO;AAG/B,QAAM,KAAK,CAAC,UAAU,IAAI,UAAU;AACpC,QAAM,KAAK,CAAC,UAAU,IAAI,UAAU;AACpC,QAAM,KAAK,YAAY,UAAU;AACjC,QAAM,KAAK,YAAY,UAAU;AAEjC,MAAI,OAAO,UAAU,OAAO,UAAU,OAAO,WAAW,OAAO;AAC/D,aAAW,KAAK,OAAO;AACrB,WAAO,KAAK,IAAI,MAAM,EAAE,CAAC;AAAG,WAAO,KAAK,IAAI,MAAM,EAAE,CAAC;AACrD,WAAO,KAAK,IAAI,MAAM,EAAE,IAAI,EAAE,CAAC;AAAG,WAAO,KAAK,IAAI,MAAM,EAAE,IAAI,EAAE,CAAC;AAAA,EACnE;AAEA,SAAO,KAAK,IAAI,MAAM,EAAE;AAAG,SAAO,KAAK,IAAI,MAAM,EAAE;AACnD,SAAO,KAAK,IAAI,MAAM,KAAK,EAAE;AAAG,SAAO,KAAK,IAAI,MAAM,KAAK,EAAE;AAE7D,QAAM,WAAW,KAAK,IAAI,GAAG,OAAO,IAAI;AACxC,QAAM,WAAW,KAAK,IAAI,GAAG,OAAO,IAAI;AACxC,QAAM,QAAQ,KAAK,KAAK,IAAI,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,QAAQ;AACzE,QAAM,WAAW,IAAI,WAAW,SAAS,IAAI,OAAO;AACpD,QAAM,WAAW,IAAI,WAAW,SAAS,IAAI,OAAO;AAEpD,QAAM,UAAU,CAAC,GAAW,OAAe;AAAA,IACzC,GAAG,UAAU,IAAI;AAAA,IACjB,GAAG,UAAU,IAAI;AAAA,EACnB;AAEA,QAAM,YAAY,CAAC,IAAY,QAAgB;AAAA,IAC7C,IAAI,KAAK,WAAW;AAAA,IACpB,IAAI,KAAK,WAAW;AAAA,EACtB;AAEA,QAAM,YAAQ,4BAAY,CAAC,MAAuC;AAChE,UAAM,OAAO,EAAE,cAAc,sBAAsB;AACnD,UAAM,KAAK,EAAE,UAAU,KAAK;AAC5B,UAAM,KAAK,EAAE,UAAU,KAAK;AAC5B,UAAM,EAAE,GAAG,EAAE,IAAI,UAAU,IAAI,EAAE;AACjC,eAAW,GAAG,CAAC;AAAA,EACjB,GAAG,CAAC,YAAY,OAAO,SAAS,OAAO,CAAC;AAExC,QAAM,cAAc,CAAC,MAAuC;AAC1D,MAAE,gBAAgB;AAClB,YAAQ,UAAU,EAAE,QAAQ,KAAK;AACjC,UAAM,CAAC;AAAA,EACT;AACA,QAAM,cAAc,CAAC,MAAuC;AAC1D,QAAI,CAAC,QAAQ,SAAS,OAAQ;AAC9B,UAAM,CAAC;AAAA,EACT;AACA,QAAM,YAAY,MAAM;AAAE,YAAQ,UAAU;AAAA,EAAM;AAElD,QAAM,KAAK,SAAS,wBAAwB;AAC5C,QAAM,SAAS,SAAS,YAAY;AACpC,QAAM,WAAW,SAAS,YAAY;AACtC,QAAM,aAAa;AACnB,QAAM,WAAW,GAAG,WAAW;AAG/B,QAAM,MAAM,QAAQ,IAAI,EAAE;AAC1B,QAAM,MAAM,QAAQ,KAAK,IAAI,KAAK,EAAE;AACpC,QAAM,SAAS;AAAA,IACb,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC;AAAA,IACjC,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC;AAAA,IACjC,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC;AAAA,IACtD,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC;AAAA,EACxD;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,cAAW;AAAA,MACX,MAAK;AAAA,MACL,OAAO;AAAA,QACL,UAAU;AAAA,QAAY,QAAQ;AAAA,QAAI,OAAO;AAAA,QACzC,YAAY;AAAA,QAAI,QAAQ,aAAa,MAAM;AAAA,QAC3C,cAAc;AAAA,QAAI,SAAS;AAAA,QAC3B,WAAW,SAAS,gCAAgC;AAAA,QACpD,gBAAgB;AAAA,MAClB;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,UAAG,QAAQ;AAAA,UAClB,OAAO,EAAE,SAAS,SAAS,QAAQ,QAAQ,cAAc,EAAE;AAAA,UAC3D;AAAA,UACA;AAAA,UACA;AAAA,UACA,cAAc;AAAA,UAEd;AAAA,yDAAC,UAAK,OAAO,GAAG,QAAQ,GAAG,IAAI,GAAG,MAAM,SAAS,YAAY,WAAW;AAAA,YACvE,MAAM,IAAI,OAAK;AACd,oBAAM,IAAI,QAAQ,EAAE,GAAG,EAAE,CAAC;AAC1B,qBACE;AAAA,gBAAC;AAAA;AAAA,kBAEC,GAAG,EAAE;AAAA,kBAAG,GAAG,EAAE;AAAA,kBACb,OAAO,KAAK,IAAI,GAAG,EAAE,IAAI,KAAK;AAAA,kBAAG,QAAQ,KAAK,IAAI,GAAG,EAAE,IAAI,KAAK;AAAA,kBAChE,IAAI;AAAA,kBAAG,MAAM;AAAA;AAAA,gBAHR,EAAE;AAAA,cAIT;AAAA,YAEJ,CAAC;AAAA,YACD;AAAA,cAAC;AAAA;AAAA,gBACC,GAAG,OAAO;AAAA,gBAAG,GAAG,OAAO;AAAA,gBACvB,OAAO,OAAO;AAAA,gBAAG,QAAQ,OAAO;AAAA,gBAChC,IAAI;AAAA,gBACJ,MAAM;AAAA,gBAAU,QAAQ;AAAA,gBAAY,aAAa;AAAA;AAAA,YACnD;AAAA;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;;;AC/IA,IAAAC,iBAAmD;AAsD/C,IAAAC,uBAAA;AA3BG,SAAS,YAAY;AAAA,EAC1B;AAAA,EAAG;AAAA,EAAG;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAG;AAAA,EAAK;AAAA,EAAS;AAAA,EAC/C;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAY;AAAA,EAAW;AAAA,EAAa;AAAA,EAAU;AAAA,EAAU;AAAA,EACxE;AAAA,EAAc;AAAA,EAAa;AAAA,EAAiB;AAAA,EAAc;AAAA,EAC1D;AAAA,EAAkB;AAAA,EAAkB;AAAA,EAAiB;AACvD,GAAqB;AACnB,QAAM,cAAU,uBAAuB,IAAI;AAC3C,QAAM,CAAC,KAAK,MAAM,QAAI,yBAAS,EAAE,GAAG,EAAE,CAAC;AAEvC,gCAAU,MAAM;AACd,QAAI,CAAC,QAAQ,WAAW,CAAC,aAAa,QAAS;AAC/C,UAAM,IAAI,QAAQ,QAAQ,sBAAsB;AAChD,UAAM,IAAI,aAAa,QAAQ,sBAAsB;AACrD,QAAI,KAAK,GAAG,KAAK;AACjB,QAAI,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAG,MAAK,IAAI,EAAE;AAC3C,QAAI,KAAK,EAAE,SAAS,EAAE,SAAS,EAAG,MAAK,IAAI,EAAE;AAC7C,WAAO,EAAE,GAAG,IAAI,GAAG,GAAG,CAAC;AAAA,EACzB,GAAG,CAAC,GAAG,GAAG,YAAY,CAAC;AAEvB,QAAM,KAAK,SAAS,YAAY;AAChC,QAAM,SAAS,SAAS,YAAY;AACpC,QAAM,UAAU,SAAS,YAAY;AACrC,QAAM,eAAe,SAAS,YAAY;AAC1C,QAAM,OAAO,EAAE;AACf,QAAM,QAAQ,EAAE;AAEhB,QAAM,OAAO,CAAC,OAAe,SAAqB,OAAgB,aAChE;AAAA,IAAC;AAAA;AAAA,MAEC,SAAS,WAAW,SAAY;AAAA,MAChC,OAAO;AAAA,QACL,SAAS;AAAA,QAAQ,YAAY;AAAA,QAAU,KAAK;AAAA,QAC5C,OAAO;AAAA,QAAQ,SAAS;AAAA,QAAY,YAAY;AAAA,QAAQ,QAAQ;AAAA,QAChE,WAAW;AAAA,QAAQ,QAAQ,WAAW,YAAY;AAAA,QAClD,UAAU;AAAA,QAAI,YAAY;AAAA,QAC1B,OAAO,WAAW,QAAS,SAAS;AAAA,QACpC,SAAS,WAAW,MAAM;AAAA,QAC1B,cAAc;AAAA,MAChB;AAAA,MACA,cAAc,OAAK;AAAE,YAAI,CAAC,SAAU,CAAC,EAAE,cAA8B,MAAM,aAAa;AAAA,MAAS;AAAA,MACjG,cAAc,OAAK;AAAE,QAAC,EAAE,cAA8B,MAAM,aAAa;AAAA,MAAQ;AAAA,MAEhF;AAAA;AAAA,IAdI;AAAA,EAeP;AAGF,QAAMC,WAAU,8CAAC,SAAI,OAAO,EAAE,QAAQ,GAAG,YAAY,cAAc,QAAQ,QAAQ,GAAG;AAEtF,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,aAAa,OAAK,EAAE,gBAAgB;AAAA,MACpC,OAAO;AAAA,QACL,UAAU;AAAA,QAAS,MAAM,IAAI;AAAA,QAAG,KAAK,IAAI;AAAA,QAAG,QAAQ;AAAA,QACpD,YAAY;AAAA,QAAI,QAAQ,aAAa,MAAM;AAAA,QAC3C,cAAc;AAAA,QAAI,SAAS;AAAA,QAAS,UAAU;AAAA,QAC9C,WAAW,SAAS,+BAA+B;AAAA,QACnD,YAAY;AAAA,MACd;AAAA,MAEC,mBACC,gFACE;AAAA,sDAAC,SAAI,OAAO,EAAE,SAAS,gBAAgB,UAAU,IAAI,YAAY,KAAK,OAAO,OAAO,eAAe,aAAa,eAAe,IAAI,GAAG,kBAAI;AAAA,QACzI,KAAK,4BAA4B,MAAM,eAAe,CAAC;AAAA,QACvDA;AAAA,QACD,8CAAC,SAAI,OAAO,EAAE,SAAS,gBAAgB,UAAU,GAAG,YAAY,KAAK,OAAO,OAAO,eAAe,aAAa,eAAe,IAAI,GAAG,mBAAK;AAAA,QACzI,KAAK,QAAQ,qBAAqB,WAAW,CAAC,mBAAmB,YAAO,EAAE,IAAI,MAAM,cAAc,OAAO,CAAC;AAAA,QAC1G,KAAK,SAAS,qBAAqB,WAAW,YAAO,EAAE,IAAI,MAAM,cAAc,QAAQ,CAAC;AAAA,QACxF,KAAK,SAAS,qBAAqB,WAAW,YAAO,EAAE,IAAI,MAAM,cAAc,QAAQ,CAAC;AAAA,QACxFA;AAAA,QACD,8CAAC,SAAI,OAAO,EAAE,SAAS,gBAAgB,UAAU,GAAG,YAAY,KAAK,OAAO,OAAO,eAAe,aAAa,eAAe,IAAI,GAAG,uBAAS;AAAA,QAC7I,KAAK,QAAQ,qBAAqB,SAAS,YAAO,EAAE,IAAI,MAAM,kBAAkB,OAAO,CAAC;AAAA,QACxF,KAAK,OAAO,qBAAqB,SAAS,YAAO,EAAE,IAAI,MAAM,kBAAkB,MAAM,CAAC;AAAA,QACtFA;AAAA,QACA,KAAK,iBAAiB,MAAM,qBAAqB,GAAG,QAAW,CAAC,eAAe;AAAA,QAC/E,KAAK,eAAe,MAAM,eAAe,GAAG,SAAS;AAAA,SACxD,IACE,SACF,gFACE;AAAA,sDAAC,SAAI,OAAO,EAAE,SAAS,gBAAgB,UAAU,IAAI,YAAY,KAAK,OAAO,OAAO,eAAe,aAAa,eAAe,IAAI,GAAG,kBAAI;AAAA,QACzI,KAAK,sBAAsB,QAAQ;AAAA,QACnC,KAAK,aAAa,WAAW;AAAA,QAC7B,KAAK,wBAAwB,YAAY;AAAA,QACzCA;AAAA,QACA,KAAK,eAAe,UAAU,SAAS;AAAA,SAC1C,IAEA,gFACE;AAAA,sDAAC,SAAI,OAAO,EAAE,SAAS,gBAAgB,UAAU,IAAI,YAAY,KAAK,OAAO,OAAO,eAAe,aAAa,eAAe,IAAI,GAAG,oBAAM;AAAA,QAC3I,KAAK,iBAAiB,WAAW,IAAI,KAAK;AAAA,QAC1C,KAAK,sBAAsB,UAAU;AAAA,QACrCA;AAAA,QACA,KAAK,iBAAiB,QAAQ,QAAW,CAAC,OAAO;AAAA,QACjD,KAAK,iBAAiB,QAAQ,QAAW,CAAC,OAAO;AAAA,SACpD;AAAA;AAAA,EAEJ;AAEJ;;;ACsBQ,IAAAC,uBAAA;AAxIR,IAAMC,eAAmC,EAAE,eAAe,QAAQ,YAAY,OAAO;AACrF,IAAM,kBAAuC,EAAE,SAAS,MAAM,eAAe,OAAO;AACpF,IAAM,kBAAuC,EAAE,QAAQ,OAAO;AAC9D,IAAM,sBAA2C,EAAE,QAAQ,WAAW;AACtE,IAAM,qBAA0C,EAAE,QAAQ,aAAa,SAAS,GAAG,YAAY,iBAAiB,eAAe,OAAO,QAAQ,0CAA0C;AACxL,IAAM,oBAAyC,EAAE,QAAQ,aAAa,SAAS,GAAG,YAAY,iBAAiB,eAAe,QAAQ,QAAQ,0CAA0C;AAgGjL,SAAS,cAAc,OAA2B;AACvD,QAAM;AAAA,IACJ;AAAA,IAAO;AAAA,IAAS;AAAA,IAAc;AAAA,IAAG;AAAA,IAAQ;AAAA,IACzC;AAAA,IAAW;AAAA,IACX;AAAA,IAAU;AAAA,IAAa;AAAA,IAAW;AAAA,IAClC;AAAA,IAAM;AAAA,IAAK;AAAA,IAAU;AAAA,IACrB;AAAA,IACA;AAAA,IAAe;AAAA,IAAe;AAAA,IAAkB;AAAA,IAAgB;AAAA,IAAkB;AAAA,IAAe;AAAA,IAAmB;AAAA,IACpH;AAAA,IAAW;AAAA,IAAW;AAAA,IAAc;AAAA,IAAY;AAAA,IAChD;AAAA,IAAiB;AAAA,IAAe;AAAA,IAAgB;AAAA,IAAmB;AAAA,IAAiB;AAAA,IACpF;AAAA,IAAgB;AAAA,IAAa;AAAA,IAAW;AAAA,IACxC;AAAA,IAAe;AAAA,IAAU;AAAA,IAAO;AAAA,IAAW;AAAA,IAAU;AAAA,IACrD;AAAA,IACA;AAAA,IAAQ;AAAA,IACR;AAAA,IAAS;AAAA,IACT;AAAA,IAAW;AAAA,IAAW;AAAA,IAAe;AAAA,IAAc;AAAA,IAAgB;AAAA,IAAa;AAAA,IAAa;AAAA,IAC7F;AAAA,IAAc;AAAA,IAAc;AAAA,IAC5B;AAAA,IAAiB;AAAA,IAAgB;AAAA,IAAoB;AAAA,IAAiB;AAAA,EACxE,IAAI;AAEJ,SACE,+CAAC,SAAI,KAAK,cAAiD,OAAO,EAAE,MAAM,GAAG,UAAU,UAAU,UAAU,YAAY,YAAY,EAAE,OAAO,GAC1I;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,OAAM;AAAA,QAAO,QAAO;AAAA,QACpB,MAAK;AAAA,QACL,cAAY,GAAG,YAAY,oBAAoB,MAAM,MAAM,MAAM,IAAI,aAAa,YAAY,CAAC,MAAM,MAAM,MAAM,MAAM,sDAAsD,aAAa,YAAY,CAAC;AAAA,QACvM,UAAU;AAAA,QACV,OAAO,EAAE,SAAS,SAAS,QAAQ,MAAM,aAAa,OAAO,aAAa,WAAW,cAAc,WAAW,YAAY,QAAQ,SAAS,OAAO;AAAA,QAClJ,aAAa;AAAA,QACb;AAAA,QACA;AAAA,QACA,cAAc;AAAA,QACd,eAAe;AAAA,QAEf;AAAA,yDAAC,UACC;AAAA,0DAAC,WAAO,0BAAgB;AAAA;AAAA;AAAA;AAAA,cAIpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAMF;AAAA,YACF,8CAAC,aAAQ,IAAG,QAAO,OAAO,MAAM,QAAQ,MAAM,cAAa,kBACzD,wDAAC,YAAO,IAAI,OAAO,GAAG,IAAI,OAAO,GAAG,GAAG,KAAK,MAAM,EAAE,KAAK,GAC3D;AAAA,YACA,8CAAC,YAAO,IAAG,cAAa,GAAE,QAAO,GAAE,QAAO,OAAM,QAAO,QAAO,QAC5D,wDAAC,kBAAa,IAAG,KAAI,IAAG,KAAI,cAAa,KAAI,YAAY,WAAW,cAAa,KAAI,GACvF;AAAA,YACA,8CAAC,YAAO,IAAG,aAAY,aAAY,KAAI,cAAa,KAAI,MAAK,KAAI,MAAK,OAAM,QAAO,QAAO,aAAY,eACpG,wDAAC,UAAK,GAAE,mCAAkC,MAAM,UAAU,GAC5D;AAAA,YACA,8CAAC,YAAO,IAAG,cAAa,aAAY,KAAI,cAAa,KAAI,MAAK,KAAI,MAAK,OAAM,QAAO,QAAO,aAAY,eACrG,wDAAC,UAAK,GAAE,mCAAkC,MAAM,YAAY,GAC9D;AAAA,YACA,8CAAC,YAAO,IAAG,aAAY,aAAY,KAAI,cAAa,KAAI,MAAK,KAAI,MAAK,OAAM,QAAO,QAAO,aAAY,eACpG,wDAAC,UAAK,GAAE,mCAAkC,MAAM,IAAI,OAAO,GAC7D;AAAA,aACF;AAAA,UAEA,8CAAC,UAAK,OAAM,QAAO,QAAO,QAAO,MAAK,cAAa,WAAQ,KAAI;AAAA,UAE/D,+CAAC,OAAE,WAAW,aAAa,UAAU,CAAC,IAAI,UAAU,CAAC,WAAW,UAAU,KAAK,KAC5E;AAAA,kBAAM,MAAM,IAAI,OACf;AAAA,cAAC;AAAA;AAAA,gBACY,MAAM;AAAA,gBAAG,OAAO,MAAM;AAAA,gBAAO;AAAA,gBAAkB;AAAA,gBAAM;AAAA,gBAAgB;AAAA,gBAChF,SAAS,kBAAkB,EAAE;AAAA,gBAC7B,WAAW;AAAA,gBACX,cAAc;AAAA,gBACd,cAAc;AAAA,gBACd,cAAc,MAAM,iBAAiB,IAAI;AAAA,gBACzC,eAAe;AAAA,gBACf,eAAe;AAAA,gBACf,gBAAgB,CAAC,IAAI,WAAW,gBAAgB,MAAM;AAAA;AAAA,cARjD,EAAE;AAAA,YAST,CACD;AAAA,YAEA,aAAa,MAAM;AAClB,oBAAM,IAAIC,YAAW,SAAS,OAAO,SAAS,OAAO,SAAS,KAAK,SAAS,KAAK,SAAS,OAAO;AACjG,qBAAO,8CAAC,UAAK,GAAM,MAAK,QAAO,QAAQ,IAAI,OAAO,aAAa,GAAG,eAAc,SAAQ,WAAU,aAAY,SAAS,KAAK,WAAU,mBAAkB;AAAA,YAC1J,GAAG;AAAA,YAEF,aAAa,KACZ;AAAA,cAAC;AAAA;AAAA,gBACC,IAAI,YAAY,EAAE;AAAA,gBAAK,IAAI,YAAY,EAAE;AAAA,gBACzC,IAAI,YAAY,EAAE;AAAA,gBAAM,IAAI,YAAY,EAAE;AAAA,gBAC1C,QAAQ,IAAI;AAAA,gBAAO,aAAa,IAAI,UAAU;AAAA,gBAC9C,iBAAiB,GAAG,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK;AAAA,gBAC9D,SAAS;AAAA,gBAAM,eAAc;AAAA;AAAA,YAC/B;AAAA,YAED,aAAa,KACZ;AAAA,cAAC;AAAA;AAAA,gBACC,IAAI,YAAY,EAAE;AAAA,gBAAK,IAAI,YAAY,EAAE;AAAA,gBACzC,IAAI,YAAY,EAAE;AAAA,gBAAM,IAAI,YAAY,EAAE;AAAA,gBAC1C,QAAQ,IAAI;AAAA,gBAAO,aAAa,IAAI,UAAU;AAAA,gBAC9C,iBAAiB,GAAG,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK;AAAA,gBAC9D,SAAS;AAAA,gBAAM,eAAc;AAAA;AAAA,YAC/B;AAAA,YAGD,MAAM,MAAM,IAAI,CAAC,MAAM,QAAQ;AAC9B,oBAAM,YAAY,cAAc,KAAK;AACrC,oBAAMC,cAAa,YAAY;AAC/B,oBAAM,EAAE,GAAG,GAAG,IAAI,SAAS,MAAM,OAAO;AACxC,oBAAM,aAAa,YAAY,IAAI,KAAK,EAAE;AAE1C,qBACE;AAAA,gBAAC;AAAA;AAAA,kBAEC,WAAW,aAAa,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC;AAAA,kBAClD,MAAK;AAAA,kBACL,UAAU;AAAA,kBACV,cAAY,GAAG,YAAY,IAAI,YAAY,YAAY,MAAM,IAAI,OAAO,EAAE,GAAG,KAAK,KAAK,GAAG,aAAa,eAAe,EAAE;AAAA,kBACxH,OAAO,MAAM,WAAW,KAAK,KAAK,sBAAsB;AAAA,kBACxD,aAAa,OAAK,gBAAgB,GAAG,KAAK,EAAE;AAAA,kBAC5C,WAAW,OAAK,cAAc,GAAG,KAAK,EAAE;AAAA,kBACxC,eAAe,OAAK,eAAe,GAAG,KAAK,EAAE;AAAA,kBAC7C,eAAe,OAAK,kBAAkB,GAAG,KAAK,EAAE;AAAA,kBAChD,cAAc,MAAM,aAAa,KAAK,EAAE;AAAA,kBACxC,cAAc,MAAM,aAAa,IAAI;AAAA,kBACrC,SAAS,MAAM,aAAa,KAAK,EAAE;AAAA,kBACnC,QAAQ,MAAM,aAAa,IAAI;AAAA,kBAC/B,WAAW,OAAK;AACd,wBAAI,EAAE,QAAQ,QAAS,EAAE,QAAQ,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,SAAU;AACrE,wBAAE,eAAe;AACjB,mCAAa,KAAK,EAAE;AACpB,mCAAa,KAAK,KAAK;AAAA,oBACzB;AAAA,kBACF;AAAA,kBAEA;AAAA,kEAAC,WAAO,aAAG,YAAY,KAAK,KAAK,KAAK,IAAG;AAAA,oBACxCA,cACC,8CAAC,gBAAa,MAAY,UAAU,YAAY,OAAO,MAAM,OAAO,QAAgB,kBAAoC,IAAI,IAAI,IAEhI,gFACE;AAAA,oEAAC,aAAU,MAAY,UAAU,YAAY,SAAkB,YAAY,YAAY,YAAY,MAAM,IAAI,QAAW,GAAM,QAAgB,GAAG,IAAI;AAAA,sBACpJ,cAAc,KAAK,KAClB,8CAAC,mBAAc,GAAG,GAAG,GAAG,GAAG,OAAO,KAAK,IAAI,QAAQC,UAAS,IAC1D;AAAA,wBAAC;AAAA;AAAA,0BACC,WAAS;AAAA,0BACT,OAAO;AAAA,0BACP,UAAU,OAAK,aAAa,EAAE,OAAO,KAAK;AAAA,0BAC1C,QAAQ;AAAA,0BACR,WAAW,OAAK;AAAE,gCAAI,EAAE,QAAQ,QAAS,YAAW;AAAG,gCAAI,EAAE,QAAQ,SAAU,cAAa,IAAI;AAAA,0BAAG;AAAA,0BACnG,OAAO,EAAE,OAAO,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,cAAc,GAAG,SAAS,aAAa,IAAI,KAAK,IAAI,WAAW,UAAU,UAAU,IAAI,YAAY,KAAK,YAAY,EAAE,SAAS,WAAW,cAAc,SAAS,SAAS,YAAY,WAAW,OAAO,EAAE,UAAU;AAAA;AAAA,sBAC9Q,GACF,IAEA,8CAAC,UAAK,GAAG,KAAK,GAAG,GAAGA,UAAS,IAAI,GAAG,YAAW,UAAS,UAAU,IAAI,YAAW,OAAM,YAAW,sCAAqC,MAAM,aAAa,IAAI,QAAQ,EAAE,aAAa,OAAOH,cACzL,eAAK,OACR;AAAA,sBAEF;AAAA,wBAAC;AAAA;AAAA,0BACC,IAAI,KAAK;AAAA,0BAAG,IAAIG,UAAS;AAAA,0BAAG,GAAG;AAAA,0BAC/B,MAAM,IAAI;AAAA,0BAAO,QAAQ,SAAS,YAAY;AAAA,0BAAS,aAAa;AAAA,0BACpE,OAAO,aAAa,WAAW,qBAAqB;AAAA,0BACpD,aAAa,OAAK,gBAAgB,GAAG,KAAK,EAAE;AAAA;AAAA,sBAC9C;AAAA,uBACF;AAAA,oBAGD,YAAY,SAAS,WAAW,KAAK,MACpC,8CAAC,YAAO,IAAI,KAAK,GAAG,IAAI,IAAI,GAAG,OAAO,MAAM,IAAI,OAAO,QAAQ,SAAS,YAAY,SAAS,aAAa,GAAG,OAAO,iBAAiB;AAAA;AAAA;AAAA,gBAtDlI,KAAK;AAAA,cAwDZ;AAAA,YAEJ,CAAC;AAAA,aACH;AAAA;AAAA;AAAA,IACF;AAAA,IAEC,UAAU,KAAK,IAAI,OAAO,KAAK,OAAO,EAAE,IAAI,KAAK,IAAI,OAAO,KAAK,OAAO,EAAE,IAAI,KAAK,aAAa,YAAY,MAAM;AACjH,YAAM,OAAO,aAAa,QAAQ,sBAAsB;AACxD,YAAM,OAAO,KAAK,IAAI,OAAO,IAAI,OAAO,EAAE,IAAI,KAAK;AACnD,YAAM,MAAM,KAAK,IAAI,OAAO,IAAI,OAAO,EAAE,IAAI,KAAK;AAClD,YAAM,IAAI,KAAK,IAAI,OAAO,KAAK,OAAO,EAAE;AACxC,YAAM,IAAI,KAAK,IAAI,OAAO,KAAK,OAAO,EAAE;AACxC,aACE;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,UAAU;AAAA,YAAY;AAAA,YAAM;AAAA,YAAK,OAAO;AAAA,YAAG,QAAQ;AAAA,YACnD,QAAQ,cAAc,IAAI,KAAK;AAAA,YAC/B,YAAY,SAAS,0BAA0B;AAAA,YAC/C,eAAe;AAAA,YAAQ,cAAc;AAAA,UACvC;AAAA;AAAA,MACF;AAAA,IAEJ,GAAG;AAAA,IAEF,MAAM,MAAM,WAAW,KACtB,+CAAC,SAAI,OAAO,EAAE,UAAU,YAAY,OAAO,GAAG,SAAS,QAAQ,eAAe,UAAU,YAAY,UAAU,gBAAgB,UAAU,eAAe,QAAQ,KAAK,EAAE,GACpK;AAAA,oDAAC,SAAI,OAAO,EAAE,UAAU,IAAI,SAAS,KAAK,OAAO,EAAE,YAAY,GAAI,sBAAY,aAAa,MAAM,YAAY,YAAY,WAAM,UAAI;AAAA,MACpI,+CAAC,SAAI,OAAO,EAAE,UAAU,IAAI,OAAO,EAAE,WAAW,YAAY,IAAI,GAAG;AAAA;AAAA,QAAM,+CAAC,YAAO,OAAO,EAAE,OAAO,IAAI,MAAM,GAAG;AAAA;AAAA,UAAG;AAAA,WAAa;AAAA,QAAS;AAAA,SAAS;AAAA,OAClJ;AAAA,IAGD,MAAM,MAAM,SAAS,KAAK,SAAS,IAAI,KACtC;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW,SAAS;AAAA,QACpB,WAAW,SAAS;AAAA,QACpB;AAAA,QACA;AAAA,QACA,aAAa,IAAI;AAAA,QACjB,aAAa,CAAC,MAAM,SAAS,GAAG,OAAO;AAAA,QACvC,YAAY,CAAC,IAAI,OAAO;AACtB,uBAAa,SAAO,EAAE,GAAG,IAAI,GAAG,SAAS,IAAI,IAAI,KAAK,GAAG,OAAO,GAAG,SAAS,IAAI,IAAI,KAAK,GAAG,MAAM,EAAE;AAAA,QACtG;AAAA;AAAA,IACF;AAAA,IAGD,WACC;AAAA,MAAC;AAAA;AAAA,QACC,GAAG,QAAQ;AAAA,QAAG,GAAG,QAAQ;AAAA,QACzB,QAAQ,QAAQ;AAAA,QAAQ,QAAQ,QAAQ;AAAA,QACxC;AAAA,QAAgB;AAAA,QAAM;AAAA,QACtB,SAAS,QAAQ;AAAA,QACjB,SAAS,QAAQ;AAAA,QACjB,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,aAAa;AAAA,QACb,UAAU;AAAA,QACV,UAAU;AAAA,QACV,cAAc;AAAA,QACd,kBAAkB;AAAA,QAClB,kBAAkB;AAAA,QAClB,iBAAiB;AAAA,QACjB,cAAc;AAAA,QACd,aAAa;AAAA,QACb,iBAAiB;AAAA,QACjB,cAAc;AAAA,QACd,oBAAoB;AAAA,QACpB;AAAA;AAAA,IACF;AAAA,KAEJ;AAEJ;;;ACnWA,IAAAC,iBAA8C;AAE9C,IAAM,cAAc;AAoBb,SAAS,WAAc,SAAY,UAA6C;AACrF,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAY,OAAO;AAC7C,QAAM,eAAW,uBAAY,CAAC,OAAO,CAAC;AACtC,QAAM,aAAS,uBAAO,CAAC;AAEvB,QAAM,CAAC,EAAE,OAAO,QAAI,yBAAS,CAAC;AAC9B,QAAM,OAAO,MAAM,QAAQ,CAAC,MAAM,IAAI,CAAC;AAEvC,QAAM,YAAQ;AAAA,IACZ,CAAC,SAAY;AACX,eAAS,IAAI;AACb,iBAAW,IAAI;AAAA,IACjB;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAEA,QAAM,mBAAe;AAAA,IACnB,CAAC,SAAY;AACX,YAAM,QAAQ,SAAS,QAAQ,MAAM,GAAG,OAAO,UAAU,CAAC;AAC1D,YAAM,KAAK,IAAI;AACf,UAAI,MAAM,SAAS,YAAa,OAAM,MAAM;AAC5C,eAAS,UAAU;AACnB,aAAO,UAAU,MAAM,SAAS;AAChC,eAAS,IAAI;AACb,iBAAW,IAAI;AACf,WAAK;AAAA,IACP;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAEA,QAAM,WAAO,4BAAY,MAAM;AAC7B,QAAI,OAAO,WAAW,EAAG;AACzB,WAAO;AACP,UAAM,OAAO,SAAS,QAAQ,OAAO,OAAO;AAC5C,aAAS,IAAI;AACb,eAAW,IAAI;AACf,SAAK;AAAA,EACP,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,WAAO,4BAAY,MAAM;AAC7B,QAAI,OAAO,WAAW,SAAS,QAAQ,SAAS,EAAG;AACnD,WAAO;AACP,UAAM,OAAO,SAAS,QAAQ,OAAO,OAAO;AAC5C,aAAS,IAAI;AACb,eAAW,IAAI;AACf,SAAK;AAAA,EACP,GAAG,CAAC,QAAQ,CAAC;AAEb,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,OAAO,UAAU;AAAA,IAC1B,SAAS,OAAO,UAAU,SAAS,QAAQ,SAAS;AAAA,EACtD;AACF;;;AC/EA,IAAAC,iBAA0C;AAanC,SAAS,eACd,KACA,cACA,UAA2D,CAAC,GACtD;AACN,QAAM,EAAE,MAAM,MAAM,MAAM,GAAG,SAAS,IAAI,IAAI;AAC9C,gCAAU,MAAM;AACd,UAAM,KAAK,IAAI;AACf,QAAI,CAAC,GAAI;AACT,UAAM,UAAU,CAAC,MAAkB;AACjC,QAAE,eAAe;AACjB,YAAM,OAAO,GAAG,sBAAsB;AACtC,YAAM,KAAK,EAAE,UAAU,KAAK;AAC5B,YAAM,KAAK,EAAE,UAAU,KAAK;AAC5B,YAAM,QAAQ,EAAE,SAAS,IAAI,IAAI,SAAS,IAAI;AAC9C,mBAAa,CAAC,OAAO;AACnB,cAAM,QAAQ,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,GAAG,QAAQ,KAAK,CAAC;AAC3D,eAAO;AAAA,UACL;AAAA,UACA,GAAG,MAAM,KAAK,GAAG,MAAM,QAAQ,GAAG;AAAA,UAClC,GAAG,MAAM,KAAK,GAAG,MAAM,QAAQ,GAAG;AAAA,QACpC;AAAA,MACF,CAAC;AAAA,IACH;AACA,OAAG,iBAAiB,SAAS,SAAS,EAAE,SAAS,MAAM,CAAC;AACxD,WAAO,MAAM,GAAG,oBAAoB,SAAS,OAAO;AAAA,EACtD,GAAG,CAAC,KAAK,cAAc,KAAK,KAAK,MAAM,CAAC;AAC1C;;;ACxCA,IAAAC,iBAA0C;AA8BnC,SAAS,eACd,KACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,WAAW;AAAA,EACX,cAAc;AAAA,EACd,gBAAgB;AAClB,GACM;AACN,gCAAU,MAAM;AACd,UAAM,KAAK,IAAI;AACf,QAAI,CAAC,GAAI;AAET,QAAI,WAAsE;AAC1E,QAAI,QAAgG;AACpG,QAAI,iBAAuD;AAC3D,QAAI,iBAAkD;AACtD,QAAI,iBAAiB;AAErB,UAAM,OAAO,CAAC,GAAU,MAAa,KAAK,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO;AAE5F,UAAM,kBAAkB,MAAM;AAC5B,UAAI,gBAAgB;AAClB,qBAAa,cAAc;AAC3B,yBAAiB;AAAA,MACnB;AACA,uBAAiB;AAAA,IACnB;AAEA,UAAM,UAAU,CAAC,MAAkB;AACjC,UAAI,EAAE,QAAQ,WAAW,GAAG;AAC1B,UAAE,eAAe;AACjB,wBAAgB;AAChB,cAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AAC1C,cAAM,OAAO,GAAG,sBAAsB;AACtC,gBAAQ;AAAA,UACN,MAAM,KAAK,GAAG,CAAC;AAAA,UACf,KAAK,EAAE,UAAU,EAAE,WAAW,IAAI,KAAK;AAAA,UACvC,KAAK,EAAE,UAAU,EAAE,WAAW,IAAI,KAAK;AAAA,UACvC,OAAO,UAAU;AAAA,UACjB,IAAI,UAAU;AAAA,UACd,IAAI,UAAU;AAAA,QAChB;AACA,mBAAW;AACX;AAAA,MACF;AACA,UAAI,EAAE,QAAQ,WAAW,GAAG;AAC1B,cAAM,SAAS,EAAE;AACjB,cAAM,KAAK,EAAE,QAAQ,CAAC;AACtB,yBAAiB;AACjB,yBAAiB,EAAE,GAAG,GAAG,SAAS,GAAG,GAAG,QAAQ;AAChD,yBAAiB,WAAW,MAAM;AAChC,cAAI,CAAC,eAAgB;AACrB,2BAAiB;AACjB,qBAAW;AACX,sBAAY,eAAe,GAAG,eAAe,CAAC;AAAA,QAChD,GAAG,WAAW;AACd,YAAI,QAAQ,QAAQ,OAAO,OAAO,WAAW,GAAI;AACjD,mBAAW,EAAE,IAAI,GAAG,SAAS,IAAI,GAAG,SAAS,IAAI,UAAU,GAAG,IAAI,UAAU,EAAE;AAAA,MAChF;AAAA,IACF;AAEA,UAAM,SAAS,CAAC,MAAkB;AAChC,UAAI,SAAS,EAAE,QAAQ,WAAW,GAAG;AACnC,UAAE,eAAe;AACjB,cAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AAC1C,cAAM,QAAQ,KAAK,GAAG,CAAC,IAAI,MAAM;AACjC,cAAM,QAAQ,KAAK,IAAI,UAAU,KAAK,IAAI,UAAU,MAAM,QAAQ,KAAK,CAAC;AACxE,qBAAa;AAAA,UACX;AAAA,UACA,GAAG,MAAM,MAAM,MAAM,KAAK,MAAM,OAAO,QAAQ,MAAM;AAAA,UACrD,GAAG,MAAM,MAAM,MAAM,KAAK,MAAM,OAAO,QAAQ,MAAM;AAAA,QACvD,CAAC;AACD;AAAA,MACF;AACA,UAAI,EAAE,QAAQ,WAAW,GAAG;AAC1B,cAAM,KAAK,EAAE,QAAQ,CAAC;AACtB,YACE,mBACC,KAAK,IAAI,GAAG,UAAU,eAAe,CAAC,IAAI,iBACzC,KAAK,IAAI,GAAG,UAAU,eAAe,CAAC,IAAI,gBAC5C;AACA,0BAAgB;AAAA,QAClB;AACA,YAAI,UAAU;AACZ,YAAE,eAAe;AACjB,gBAAM,MAAM;AACZ,uBAAa,CAAC,QAAQ;AAAA,YACpB,GAAG;AAAA,YACH,GAAG,IAAI,MAAM,GAAG,UAAU,IAAI;AAAA,YAC9B,GAAG,IAAI,MAAM,GAAG,UAAU,IAAI;AAAA,UAChC,EAAE;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AAEA,UAAM,QAAQ,CAAC,MAAkB;AAC/B,sBAAgB;AAChB,UAAI,gBAAgB;AAClB,UAAE,eAAe;AACjB,yBAAiB;AAAA,MACnB;AACA,UAAI,EAAE,QAAQ,WAAW,GAAG;AAC1B,mBAAW;AACX,gBAAQ;AAAA,MACV;AACA,UAAI,EAAE,QAAQ,WAAW,EAAG,SAAQ;AAAA,IACtC;AAEA,OAAG,iBAAiB,cAAc,SAAS,EAAE,SAAS,MAAM,CAAC;AAC7D,OAAG,iBAAiB,aAAa,QAAQ,EAAE,SAAS,MAAM,CAAC;AAC3D,OAAG,iBAAiB,YAAY,KAAK;AACrC,OAAG,iBAAiB,eAAe,KAAK;AACxC,WAAO,MAAM;AACX,sBAAgB;AAChB,SAAG,oBAAoB,cAAc,OAAO;AAC5C,SAAG,oBAAoB,aAAa,MAAM;AAC1C,SAAG,oBAAoB,YAAY,KAAK;AACxC,SAAG,oBAAoB,eAAe,KAAK;AAAA,IAC7C;AAAA,EACF,GAAG,CAAC,KAAK,UAAU,OAAO,UAAU,GAAG,UAAU,GAAG,cAAc,aAAa,UAAU,UAAU,aAAa,aAAa,CAAC;AAChI;;;AC1JA,IAAAC,iBAAoD;AAQ7C,SAAS,eACd,KAC0B;AAC1B,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAmC,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;AAEzE,gCAAU,MAAM;AACd,UAAM,KAAK,IAAI;AACf,QAAI,CAAC,MAAM,OAAO,mBAAmB,YAAa;AAClD,UAAM,UAAU,MAAM;AACpB,YAAM,IAAI,GAAG,sBAAsB;AACnC,cAAQ,EAAE,GAAG,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC;AAAA,IACrC;AACA,UAAM,KAAK,IAAI,eAAe,OAAO;AACrC,OAAG,QAAQ,EAAE;AACb,YAAQ;AACR,WAAO,MAAM,GAAG,WAAW;AAAA,EAC7B,GAAG,CAAC,GAAG,CAAC;AAER,SAAO;AACT;;;ACtBO,IAAM,uBAAuB;AAoC7B,SAAS,gBACd,SACA,QACA,YAAoB,sBACP;AACb,QAAM,KAAK,QAAQ;AACnB,QAAM,KAAK,QAAQ,IAAI,QAAQ,IAAI;AACnC,QAAM,KAAK,QAAQ,IAAI,QAAQ;AAC/B,QAAM,KAAK,QAAQ;AACnB,QAAM,KAAK,QAAQ,IAAI,QAAQ,IAAI;AACnC,QAAM,KAAK,QAAQ,IAAI,QAAQ;AAE/B,MAAI,QAAiE;AACrE,MAAI,QAAiE;AAErE,SAAO,QAAQ,CAAC,GAAG,QAAQ;AACzB,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,EAAE,IAAI,EAAE,IAAI;AACvB,UAAM,KAAK,EAAE,IAAI,EAAE;AACnB,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,EAAE,IAAI,EAAE,IAAI;AACvB,UAAM,KAAK,EAAE,IAAI,EAAE;AAEnB,UAAM,cAAgD;AAAA,MACpD,EAAE,OAAO,KAAK,IAAI,KAAK,GAAG;AAAA;AAAA,MAC1B,EAAE,OAAO,KAAK,IAAI,KAAK,GAAG;AAAA;AAAA,MAC1B,EAAE,OAAO,KAAK,IAAI,KAAK,GAAG;AAAA;AAAA,IAC5B;AACA,eAAW,KAAK,aAAa;AAC3B,UAAI,KAAK,IAAI,EAAE,KAAK,IAAI,cAAc,CAAC,SAAS,KAAK,IAAI,EAAE,KAAK,IAAI,KAAK,IAAI,MAAM,KAAK,IAAI;AAC1F,gBAAQ,EAAE,OAAO,EAAE,OAAO,KAAK,EAAE,KAAK,UAAU,IAAI;AAAA,MACtD;AAAA,IACF;AAEA,UAAM,cAAgD;AAAA,MACpD,EAAE,OAAO,KAAK,IAAI,KAAK,GAAG;AAAA;AAAA,MAC1B,EAAE,OAAO,KAAK,IAAI,KAAK,GAAG;AAAA;AAAA,MAC1B,EAAE,OAAO,KAAK,IAAI,KAAK,GAAG;AAAA;AAAA,IAC5B;AACA,eAAW,KAAK,aAAa;AAC3B,UAAI,KAAK,IAAI,EAAE,KAAK,IAAI,cAAc,CAAC,SAAS,KAAK,IAAI,EAAE,KAAK,IAAI,KAAK,IAAI,MAAM,KAAK,IAAI;AAC1F,gBAAQ,EAAE,OAAO,EAAE,OAAO,KAAK,EAAE,KAAK,UAAU,IAAI;AAAA,MACtD;AAAA,IACF;AAAA,EACF,CAAC;AAED,MAAI,IAAI,QAAQ;AAChB,MAAI,IAAI,QAAQ;AAChB,MAAI;AACJ,MAAI;AAEJ,MAAI,OAAO;AACT,UAAM,KAAK;AACX,QAAI,QAAQ,IAAI,GAAG;AACnB,UAAM,IAAI,OAAO,GAAG,QAAQ;AAC5B,aAAS;AAAA,MACP,KAAK,GAAG;AAAA,MACR,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC,IAAI;AAAA,MACzB,MAAM,KAAK,IAAI,IAAI,QAAQ,GAAG,EAAE,IAAI,EAAE,CAAC,IAAI;AAAA,IAC7C;AAAA,EACF;AACA,MAAI,OAAO;AACT,UAAM,KAAK;AACX,QAAI,QAAQ,IAAI,GAAG;AACnB,UAAM,IAAI,OAAO,GAAG,QAAQ;AAC5B,aAAS;AAAA,MACP,KAAK,GAAG;AAAA,MACR,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC,IAAI;AAAA,MACzB,MAAM,KAAK,IAAI,IAAI,QAAQ,GAAG,EAAE,IAAI,EAAE,CAAC,IAAI;AAAA,IAC7C;AAAA,EACF;AAEA,SAAO,EAAE,GAAG,GAAG,QAAQ,OAAO;AAChC;;;AChGO,SAAS,mBACd,OACA,OACA,KACA,YACe;AACf,QAAM,UAAU,WAAW,OAAO,CAAC,MAAM;AACvC,UAAM,KAAK,EAAE,IAAI;AACjB,UAAM,KAAK,EAAE,IAAI;AACjB,QAAI,OAAO,KAAK,OAAO,EAAG,QAAO;AACjC,QAAI,QAAQ,QAAS,QAAO,KAAK,KAAK,KAAK,IAAI,EAAE,KAAK,KAAK,IAAI,EAAE;AACjE,QAAI,QAAQ,OAAQ,QAAO,KAAK,KAAK,KAAK,IAAI,EAAE,KAAK,KAAK,IAAI,EAAE;AAChE,QAAI,QAAQ,OAAQ,QAAO,KAAK,KAAK,KAAK,IAAI,EAAE,KAAK,KAAK,IAAI,EAAE;AAChE,WAAO,KAAK,KAAK,KAAK,IAAI,EAAE,KAAK,KAAK,IAAI,EAAE;AAAA,EAC9C,CAAC;AACD,MAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,UAAQ;AAAA,IACN,CAAC,GAAG,MACF,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,IAAI,KAAK,IACnC,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,IAAI,KAAK;AAAA,EACvC;AACA,SAAO,QAAQ,CAAC,EAAE;AACpB;;;AlC4DW,IAAAC,uBAAA;AAhEX,IAAM,gBAAqC,EAAE,UAAU,YAAY,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,IAAI,UAAU,UAAU,MAAM,iBAAiB,YAAY,UAAU,QAAQ,EAAE;AAC3L,IAAM,iBAAsC,EAAE,MAAM,GAAG,SAAS,QAAQ,UAAU,SAAS;AA4DpF,SAAS,cAAc,OAA2B;AAEvD,MAAI,MAAM,cAAc,SAAS,YAAY;AAC3C,WAAO;AAAA,MAAC;AAAA;AAAA,QACN,cAAc,MAAM;AAAA,QACpB,UAAU,MAAM;AAAA,QAChB,UAAU,MAAM;AAAA,QAChB,QAAQ,MAAM;AAAA,QACd,gBAAgB,MAAM;AAAA,QACtB,aAAa,MAAM;AAAA,QACnB,OAAO,MAAM;AAAA,QACb,gBAAgB,MAAM;AAAA;AAAA,IACxB;AAAA,EACF;AACA,SAAO,8CAAC,mBAAiB,GAAG,OAAO;AACrC;AAEA,SAAS,gBAAgB;AAAA,EACvB;AAAA,EAAc;AAAA,EAAU;AAAA,EAAU,SAAS;AAAA,EAC3C;AAAA,EAAgB,cAAc;AAAA,EAAM,UAAU;AAAA,EAAa,QAAQ;AAAA,EACnE;AACF,GAAuB;AACrB,QAAM,OAAqB,eACvB,EAAE,GAAG,cAAc,SAAS,aAAa,WAAW,QAAQ,IAC5D,qBAAqB,OAAO;AAChC,QAAM,aAAS,4BAAY,CAAC,MAAoB,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC;AACzE,QAAM,UAAU,WAAyB,MAAM,MAAM;AACrD,QAAM,EAAE,OAAO,OAAO,OAAO,YAAY,cAAc,MAAM,KAAK,IAAI;AACtE,QAAM,EAAE,QAAQ,WAAW,aAAa,IAAI,SAAS;AACrD,QAAM,CAAC,WAAW,YAAY,QAAI,yBAAoB,EAAE,GAAG,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC;AAChF,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAwB,IAAI;AAC5D,QAAM,CAAC,aAAa,cAAc,QAAI,yBAAsB,MAAM,oBAAI,IAAI,CAAC;AAC3E,QAAM,CAAC,MAAM,OAAO,QAAI,yBAA2B,IAAI;AACvD,QAAM,CAAC,KAAK,MAAM,QAAI,yBAAoE,IAAI;AAC9F,QAAM,CAAC,QAAQ,SAAS,QAAI,yBAAuF,IAAI;AACvH,QAAM,CAAC,UAAU,WAAW,QAAI,yBAA0B,IAAI;AAC9D,QAAM,CAAC,aAAa,cAAc,QAAI,yBAAsD,IAAI;AAChG,QAAM,CAAC,cAAc,eAAe,QAAI,yBAAwB,IAAI;AACpE,QAAM,0BAAsB,uBAAuD,IAAI;AACvF,QAAM,mBAAe,uBAA8D,IAAI;AAEvF,QAAM,gBAAY,4BAAY,CAAC,OAAsB;AACnD,gBAAY,EAAE;AACd,mBAAe,KAAK,oBAAI,IAAI,CAAC,EAAE,CAAC,IAAI,oBAAI,IAAI,CAAC;AAAA,EAC/C,GAAG,CAAC,CAAC;AAEL,QAAM,mBAAe,4BAAY,CAAC,OAAe;AAC/C,mBAAe,UAAQ;AACrB,YAAM,OAAO,IAAI,IAAI,IAAI;AACzB,UAAI,KAAK,IAAI,EAAE,GAAG;AAChB,aAAK,OAAO,EAAE;AACd,cAAM,OAAO,KAAK,OAAO,MAAM,KAAK,IAAI,EAAE,KAAK,OAAO,CAAC,IAAI;AAC3D,oBAAY,IAAI;AAAA,MAClB,OAAO;AACL,aAAK,IAAI,EAAE;AACX,oBAAY,EAAE;AAAA,MAChB;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,qBAAiB,4BAAY,MAAM;AACvC,gBAAY,IAAI;AAChB,mBAAe,oBAAI,IAAI,CAAC;AAAA,EAC1B,GAAG,CAAC,CAAC;AACL,QAAM,CAAC,WAAW,YAAY,QAAI,yBAAwB,IAAI;AAC9D,QAAM,CAAC,WAAW,YAAY,QAAI,yBAAS,EAAE;AAC7C,QAAM,CAAC,eAAe,gBAAgB,QAAI,yBAAwB,IAAI;AACtE,QAAM,CAAC,eAAe,gBAAgB,QAAI,yBAAS,EAAE;AACrD,QAAM,CAAC,WAAW,YAAY,QAAI,yBAAwB,IAAI;AAC9D,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAyB,IAAI;AAC3D,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAS,IAAI;AAC3C,QAAM,CAAC,cAAc,eAAe,QAAI,yBAAS,EAAE;AACnD,QAAM,aAAS,uBAAsB,IAAI;AACzC,QAAM,mBAAe,uBAAuB,IAAI;AAEhD,QAAM,gBAAgB,wBAAwB;AAC9C,QAAM,EAAE,GAAG,OAAO,IAAI,eAAe,OAAO,gBAAgB,EAAE,OAAO,YAAY,MAAM,UAAU,CAAC;AAClG,QAAM,WAAW,mBAAmB;AACpC,QAAM,QAAQ,WAAW,IAAI;AAG7B,QAAM,WAAW,eAAe,MAAM;AAGtC,QAAM,eAAW,4BAAY,MAAM;AACjC,QAAI,CAAC,OAAO,QAAS;AACrB,UAAM,OAAO,OAAO,QAAQ,sBAAsB;AAClD,UAAMC,KAAI,KAAK,OAAOC,KAAI,KAAK;AAC/B,QAAI,MAAM,MAAM,WAAW,GAAG;AAAE,mBAAa,EAAE,GAAGD,KAAI,GAAG,GAAGC,KAAI,GAAG,OAAO,EAAE,CAAC;AAAG;AAAA,IAAQ;AACxF,QAAI,OAAO,UAAU,OAAO,UAAU,OAAO,WAAW,OAAO;AAC/D,eAAW,KAAK,MAAM,OAAO;AAC3B,YAAM,KAAK,EAAE,KAAK,GAAG,KAAK,EAAE,KAAK;AACjC,YAAM,EAAE,GAAG,IAAI,GAAG,GAAG,IAAI,SAAS,GAAG,OAAO;AAC5C,aAAO,KAAK,IAAI,MAAM,EAAE;AAAG,aAAO,KAAK,IAAI,MAAM,EAAE;AACnD,aAAO,KAAK,IAAI,MAAM,KAAK,EAAE;AAAG,aAAO,KAAK,IAAI,MAAM,KAAK,EAAE;AAAA,IAC/D;AACA,UAAM,MAAM;AACZ,UAAM,UAAUD,KAAI,MAAM,MAAM,OAAO,QAAQ;AAC/C,UAAM,UAAUC,KAAI,MAAM,MAAM,OAAO,QAAQ;AAC/C,UAAM,QAAQ,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,QAAQ,MAAM,CAAC,CAAC;AACnE,UAAM,MAAM,OAAO,QAAQ,GAAG,MAAM,OAAO,QAAQ;AACnD,iBAAa,EAAE,OAAO,GAAGD,KAAI,IAAI,KAAK,OAAO,GAAGC,KAAI,IAAI,KAAK,MAAM,CAAC;AAAA,EACtE,GAAG,CAAC,MAAM,OAAO,OAAO,CAAC;AAEzB,QAAM,iBAAa,4BAAY,CAAC,WAAmB;AACjD,UAAM,OAAO,MAAM,MAAM,KAAK,OAAK,EAAE,OAAO,MAAM;AAClD,QAAI,CAAC,QAAQ,CAAC,OAAO,QAAS;AAC9B,UAAM,OAAO,OAAO,QAAQ,sBAAsB;AAClD,UAAM,EAAE,GAAG,IAAI,GAAG,GAAG,IAAI,SAAS,MAAM,OAAO;AAC/C,UAAM,MAAM,KAAK,KAAK,KAAK,KAAK;AAChC,UAAM,MAAM,KAAK,KAAK,KAAK,KAAK;AAChC,UAAM,QAAQ,KAAK,IAAI,KAAK,IAAI,UAAU,OAAO,GAAG,GAAG,GAAG;AAC1D,iBAAa,EAAE,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,OAAO,GAAG,KAAK,SAAS,IAAI,KAAK,MAAM,CAAC;AACvF,cAAU,MAAM;AAAA,EAClB,GAAG,CAAC,MAAM,OAAO,SAAS,UAAU,OAAO,SAAS,CAAC;AAErD,QAAM,mBAAe,4BAAY,CAAC,QAAkB;AAClD,QAAI,IAAI,WAAW,EAAG;AACtB,UAAM,QAAQ,IAAI,IAAI,GAAG;AACzB,UAAM,QAAQ,oBAAI,IAAoB;AACtC,UAAM,WAAW,aAAa,QAAQ,MAAM,KAAK;AACjD,UAAM,WAAW,aAAa,KAAK,MAAM,KAAK;AAC9C,UAAM,WAA0B,CAAC;AACjC,eAAW,SAAS,KAAK;AACvB,YAAM,IAAI,MAAM,MAAM,KAAK,OAAK,EAAE,OAAO,KAAK;AAC9C,UAAI,CAAC,EAAG;AACR,YAAM,QAAQ,SAAS;AACvB,YAAM,IAAI,OAAO,KAAK;AACtB,eAAS,KAAK;AAAA,QACZ,GAAG;AAAA,QAAG,IAAI;AAAA,QACV,OAAO,IAAI,WAAW,IAAI,EAAE,QAAQ,YAAY,EAAE;AAAA,QAClD,IAAI,EAAE,KAAK,KAAK;AAAA,QAAI,IAAI,EAAE,KAAK,KAAK;AAAA,MACtC,CAAC;AAAA,IACH;AACA,UAAM,WAA0B,CAAC;AACjC,eAAW,KAAK,MAAM,OAAO;AAC3B,UAAI,MAAM,IAAI,EAAE,IAAI,KAAK,MAAM,IAAI,EAAE,EAAE,GAAG;AACxC,iBAAS,KAAK,EAAE,GAAG,GAAG,IAAI,SAAS,GAAG,MAAM,MAAM,IAAI,EAAE,IAAI,GAAI,IAAI,MAAM,IAAI,EAAE,EAAE,EAAG,CAAC;AAAA,MACxF;AAAA,IACF;AACA,UAAM,IAAI,EAAE,GAAG,OAAO,OAAO,CAAC,GAAG,MAAM,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC,GAAG,MAAM,OAAO,GAAG,QAAQ,EAAE;AACjG,iBAAa,CAAC;AACd,UAAM,SAAS,SAAS,IAAI,OAAK,EAAE,EAAE;AACrC,gBAAY,OAAO,OAAO,SAAS,CAAC,KAAK,IAAI;AAC7C,mBAAe,IAAI,IAAI,MAAM,CAAC;AAAA,EAChC,GAAG,CAAC,OAAO,YAAY,CAAC;AAExB,QAAM,oBAAgB,4BAAY,CAAC,WAAmB;AAAE,iBAAa,CAAC,MAAM,CAAC;AAAA,EAAG,GAAG,CAAC,YAAY,CAAC;AAGjG,gCAAU,MAAM;AACd,QAAI,CAAC,QAAS;AACd,UAAM,QAAQ,MAAM,WAAW,IAAI;AACnC,WAAO,iBAAiB,aAAa,KAAK;AAC1C,WAAO,MAAM,OAAO,oBAAoB,aAAa,KAAK;AAAA,EAC5D,GAAG,CAAC,OAAO,CAAC;AAGZ,QAAM,cAA4B;AAAA,IAChC,EAAE,OAAO,QAAM,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,OAAO,CAAC,EAAE,UAAU,KAAK,MAAM;AAAE,WAAK;AAAG,aAAO;AAAA,IAAM,EAAE;AAAA,IAC5G,EAAE,OAAO,QAAM,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,OAAQ,EAAE,YAAY,EAAE,QAAQ,MAAO,KAAK,MAAM;AAAE,WAAK;AAAG,aAAO;AAAA,IAAM,EAAE;AAAA,IAChI,EAAE,OAAO,QAAM,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,KAAK,KAAK,MAAM;AAAE,eAAS;AAAG,aAAO;AAAA,IAAM,EAAE;AAAA,IACjG;AAAA,MACE,OAAO,QAAM,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,OAAO,EAAE,QAAQ,QAAQ,YAAY,OAAO;AAAA,MAC/F,KAAK,MAAM;AAAE,qBAAa,MAAM,KAAK,WAAW,CAAC;AAAG,eAAO;AAAA,MAAM;AAAA,IACnE;AAAA,IACA;AAAA,MACE,OAAO,QAAM,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,OAAO,EAAE,QAAQ,QAAQ,YAAY,OAAO;AAAA,MAC/F,KAAK,MAAM;AACT,cAAM,MAAM,IAAI,IAAI,WAAW;AAC/B,cAAM,QAAQ,MAAM,MAAM,OAAO,OAAK,IAAI,IAAI,EAAE,EAAE,CAAC;AACnD,cAAM,QAAQ,MAAM,MAAM,OAAO,QAAM,IAAI,IAAI,GAAG,IAAI,KAAK,IAAI,IAAI,GAAG,EAAE,CAAC;AACzE,qBAAa,UAAU;AAAA,UACrB,OAAO,MAAM,IAAI,QAAM,EAAE,GAAG,EAAE,EAAE;AAAA,UAChC,OAAO,MAAM,IAAI,SAAO,EAAE,GAAG,GAAG,EAAE;AAAA,QACpC;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA;AAAA,MACE,OAAO,QAAM,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,OAAO,EAAE,QAAQ;AAAA,MACpE,KAAK,MAAM;AACT,cAAM,OAAO,aAAa;AAC1B,YAAI,CAAC,QAAQ,KAAK,MAAM,WAAW,EAAG,QAAO;AAC7C,cAAM,QAAQ,oBAAI,IAAoB;AACtC,cAAM,WAAW,aAAa,QAAQ,MAAM,KAAK;AACjD,cAAM,WAAW,aAAa,KAAK,MAAM,KAAK;AAC9C,cAAM,WAA0B,KAAK,MAAM,IAAI,OAAK;AAClD,gBAAM,QAAQ,SAAS;AACvB,gBAAM,IAAI,EAAE,IAAI,KAAK;AACrB,iBAAO,EAAE,GAAG,GAAG,IAAI,OAAO,IAAI,EAAE,KAAK,KAAK,IAAI,IAAI,EAAE,KAAK,KAAK,GAAG;AAAA,QACnE,CAAC;AACD,cAAM,WAA0B,KAAK,MAAM,IAAI,SAAO;AAAA,UACpD,GAAG;AAAA,UAAI,IAAI,SAAS;AAAA,UACpB,MAAM,MAAM,IAAI,GAAG,IAAI,KAAK,GAAG;AAAA,UAC/B,IAAI,MAAM,IAAI,GAAG,EAAE,KAAK,GAAG;AAAA,QAC7B,EAAE;AACF,cAAM,IAAI,EAAE,GAAG,OAAO,OAAO,CAAC,GAAG,MAAM,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC,GAAG,MAAM,OAAO,GAAG,QAAQ,EAAE;AACjG,qBAAa,CAAC;AACd,cAAM,SAAS,SAAS,IAAI,OAAK,EAAE,EAAE;AACrC,oBAAY,OAAO,OAAO,SAAS,CAAC,CAAC;AACrC,uBAAe,IAAI,IAAI,MAAM,CAAC;AAC9B,wBAAgB,UAAU,OAAO,MAAM,IAAI,aAAa,YAAY,CAAC,GAAG,OAAO,WAAW,IAAI,KAAK,GAAG,GAAG;AACzG,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA;AAAA,MACE,OAAO,OAAK,EAAE,QAAQ;AAAA,MACtB,KAAK,MAAM;AACT,YAAI,QAAS,YAAW,IAAI;AAC5B,YAAI,SAAU,aAAY,IAAI;AAC9B,YAAI,UAAW,cAAa,IAAI;AAChC,YAAI,OAAQ,WAAU,IAAI;AAC1B,YAAI,YAAY,OAAO,EAAG,gBAAe;AACzC,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA;AAAA,MACE,OAAO,QAAM,EAAE,QAAQ,YAAY,EAAE,QAAQ,gBAAgB,YAAY,OAAO;AAAA,MAChF,KAAK,MAAM;AACT,cAAM,MAAM,IAAI,IAAI,WAAW;AAC/B,cAAM,UAAU;AAAA,UACd,GAAG;AAAA,UACH,OAAO,MAAM,MAAM,OAAO,OAAK,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;AAAA,UAC7C,OAAO,MAAM,MAAM,OAAO,QAAM,CAAC,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;AAAA,QACtE;AACA,qBAAa,OAAO;AACpB,uBAAe;AACf,wBAAgB,WAAW,IAAI,IAAI,IAAI,aAAa,YAAY,CAAC,GAAG,IAAI,SAAS,IAAI,KAAK,GAAG,GAAG;AAChG,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA;AAAA,MACE,OAAO,OAAK,YAAY,OAAO,KAAK,EAAE,UAAU,CAAC,CAAC,aAAa,EAAE,QAAQ,aAAa,EAAE,QAAQ,eAAe,EAAE,QAAQ,eAAe,EAAE,QAAQ;AAAA,MAClJ,KAAK,CAAC,MAAM;AACV,cAAM,SAAS,EAAE,QAAQ,cAAc,SAAS,EAAE,QAAQ,eAAe,UAAU,EAAE,QAAQ,YAAY,OAAO;AAChH,cAAM,SAAS,MAAM,MAAM,KAAK,OAAK,EAAE,OAAO,QAAQ;AACtD,YAAI,CAAC,OAAQ,QAAO;AACpB,cAAM,KAAK,SAAS,QAAQ,OAAO;AACnC,cAAM,MAAM,OAAO,KAAK,KAAK,GAAG,IAAI;AACpC,cAAM,MAAM,OAAO,KAAK,KAAK,GAAG,IAAI;AACpC,cAAM,aAAa,MAAM,MACtB,OAAO,OAAK,EAAE,OAAO,QAAQ,EAC7B,IAAI,OAAK;AACR,gBAAM,IAAI,SAAS,GAAG,OAAO;AAC7B,iBAAO,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,KAAK,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE,KAAK,KAAK,EAAE,IAAI,EAAE;AAAA,QACtE,CAAC;AACH,cAAM,aAAa,mBAAmB,IAAI,IAAI,QAAQ,UAAU;AAChE,YAAI,YAAY;AACd,oBAAU,UAAU;AACpB,0BAAgB,YAAY,MAAM,MAAM,KAAK,OAAK,EAAE,OAAO,UAAU,GAAG,SAAS,EAAE,GAAG;AAAA,QACxF;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA;AAAA,MACE,OAAO,OAAK,YAAY,OAAO,MAAM,EAAE,QAAQ,aAAa,EAAE,QAAQ,eAAe,EAAE,QAAQ,eAAe,EAAE,QAAQ;AAAA,MACxH,KAAK,CAAC,MAAM;AACV,cAAM,SAAS,EAAE,QAAQ,cAAc,SAAS,EAAE,QAAQ,eAAe,UAAU,EAAE,QAAQ,YAAY,OAAO;AAChH,cAAM,OAAO,EAAE,WAAW,OAAO,IAAI;AACrC,cAAM,KAAK,WAAW,SAAS,CAAC,OAAO,WAAW,UAAU,OAAO;AACnE,cAAM,KAAK,WAAW,OAAO,CAAC,OAAO,WAAW,SAAS,OAAO;AAChE,cAAM,MAAM;AACZ,cAAM,UAAU;AAAA,UACd,GAAG;AAAA,UACH,OAAO,MAAM,MAAM,IAAI,OAAK,IAAI,IAAI,EAAE,EAAE,IACpC,EAAE,GAAG,GAAG,GAAG,MAAM,EAAE,KAAK,KAAK,EAAE,GAAG,GAAG,MAAM,EAAE,KAAK,KAAK,EAAE,EAAE,IAC3D,CAAC;AAAA,QACP;AACA,qBAAa,OAAO;AACpB,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,oBAAkB,aAAa,CAAC,MAAM,MAAM,UAAU,UAAU,aAAa,SAAS,UAAU,WAAW,QAAQ,OAAO,cAAc,eAAe,cAAc,CAAC;AAEtK,QAAM,eAAW,4BAAY,CAAC,SAAiB,YAAoB;AACjE,UAAM,OAAO,OAAO,QAAS,sBAAsB;AACnD,WAAO,EAAE,IAAI,UAAU,KAAK,OAAO,UAAU,KAAK,UAAU,OAAO,IAAI,UAAU,KAAK,MAAM,UAAU,KAAK,UAAU,MAAM;AAAA,EAC7H,GAAG,CAAC,SAAS,CAAC;AAEd,iBAAe,QAAQ,YAAY;AAEnC,QAAM,wBAAoB,4BAAY,CAAC,GAAW,MAAc;AAC9D,eAAW,EAAE,GAAG,GAAG,QAAQ,KAAK,CAAC;AAAA,EACnC,GAAG,CAAC,CAAC;AACL,iBAAe,QAAQ,EAAE,WAAW,cAAc,aAAa,kBAAkB,CAAC;AAElF,QAAM,kBAAkB,CAAC,GAAqB,WAAmB;AAC/D,MAAE,gBAAgB;AAClB,UAAM,OAAO,MAAM,MAAM,KAAK,OAAK,EAAE,OAAO,MAAM;AAClD,UAAM,EAAE,GAAG,EAAE,IAAI,SAAS,EAAE,SAAS,EAAE,OAAO;AAC9C,UAAM,KAAKC,WAAU,KAAK,KAAK;AAC/B,gBAAY,EAAE,QAAQ,QAAQ,QAAQ,KAAK,KAAK,KAAK,KAAK,GAAG,QAAQ,KAAK,KAAK,KAAKC,SAAQ,SAAS,UAAU,KAAK,GAAG,KAAK,EAAE,CAAC;AAAA,EACjI;AAEA,QAAM,mBAAmB,CAAC,GAAqB,QAAgB,QAAgB,aAAqB,gBAAwB;AAC1H,MAAE,gBAAgB;AAClB,UAAM,OAAO,MAAM,MAAM,KAAK,OAAK,EAAE,OAAO,MAAM;AAClD,UAAM,EAAE,GAAG,EAAE,IAAI,SAAS,EAAE,SAAS,EAAE,OAAO;AAC9C,gBAAY,EAAE,QAAQ,QAAQ,QAAQ,KAAK,KAAK,KAAK,aAAa,QAAQ,KAAK,KAAK,KAAK,aAAa,SAAS,UAAU,aAAa,QAAQ,KAAK,GAAG,KAAK,EAAE,CAAC;AAAA,EAChK;AAEA,QAAM,kBAAkB,CAAC,GAAqB,OAAe;AAC3D,MAAE,gBAAgB;AAClB,QAAI,SAAU;AACd,UAAM,OAAO,MAAM,MAAM,KAAK,OAAK,EAAE,OAAO,EAAE;AAE9C,QAAI,EAAE,UAAU;AACd,mBAAa,EAAE;AACf;AAAA,IACF;AAEA,UAAM,QAAQ,YAAY,IAAI,EAAE;AAChC,QAAI,SAAS,YAAY,OAAO,GAAG;AAEjC,kBAAY,EAAE;AACd,YAAM,UAAU,oBAAI,IAAwC;AAC5D,iBAAW,OAAO,aAAa;AAC7B,cAAM,IAAI,MAAM,MAAM,KAAK,OAAK,EAAE,OAAO,GAAG;AAC5C,YAAI,CAAC,EAAG;AACR,gBAAQ,IAAI,KAAK;AAAA,UACf,IAAI,EAAE,WAAW,UAAU,KAAK,EAAE,KAAK,KAAK,UAAU;AAAA,UACtD,IAAI,EAAE,WAAW,UAAU,KAAK,EAAE,KAAK,KAAK,UAAU;AAAA,QACxD,CAAC;AAAA,MACH;AACA,0BAAoB,UAAU;AAAA,IAChC,OAAO;AACL,gBAAU,EAAE;AACZ,0BAAoB,UAAU;AAAA,IAChC;AACA,YAAQ,EAAE,QAAQ,IAAI,IAAI,EAAE,WAAW,UAAU,KAAK,KAAK,KAAK,KAAK,UAAU,QAAQ,IAAI,EAAE,WAAW,UAAU,KAAK,KAAK,KAAK,KAAK,UAAU,OAAO,CAAC;AAAA,EAC1J;AAEA,QAAM,gBAAgB,CAAC,GAAqB,aAAqB;AAC/D,QAAI,CAAC,YAAY,SAAS,WAAW,SAAU;AAC/C,MAAE,gBAAgB;AAClB,UAAM,QAAQ,SAAS;AACvB,QAAI;AACJ,QAAI,OAAO;AACT,YAAM,WAAW,MAAM,MAAM,KAAK,QAAM,GAAG,SAAS,SAAS,UAAU,GAAG,UAAU,KAAK;AACzF,UAAI,UAAU;AACZ,kBAAU,EAAE,GAAG,OAAO,OAAO,MAAM,MAAM,IAAI,QAAM,GAAG,OAAO,SAAS,KAAK,EAAE,GAAG,IAAI,IAAI,SAAS,IAAI,EAAE,EAAE;AAAA,MAC3G,OAAO;AACL,kBAAU,EAAE,GAAG,OAAO,OAAO,CAAC,GAAG,MAAM,OAAO,EAAE,IAAI,OAAO,KAAK,MAAM,KAAK,GAAG,MAAM,SAAS,QAAQ,IAAI,UAAU,MAAM,CAAC,EAAE;AAAA,MAC9H;AAAA,IACF,OAAO;AACL,gBAAU,EAAE,GAAG,OAAO,OAAO,CAAC,GAAG,MAAM,OAAO,EAAE,IAAI,OAAO,KAAK,MAAM,KAAK,GAAG,MAAM,SAAS,QAAQ,IAAI,SAAS,CAAC,EAAE;AAAA,IACvH;AACA,iBAAa,OAAO;AACpB,gBAAY,IAAI;AAAA,EAClB;AAEA,QAAM,iBAAiB,CAAC,MAAwB;AAC9C,QAAI,SAAS;AAAE,iBAAW,IAAI;AAAG;AAAA,IAAQ;AACzC,QAAK,EAAE,OAAsB,QAAQ,OAAO,OAAO,EAAE,WAAW,OAAO,SAAS;AAC9E,UAAI,EAAE,UAAU;AAEd,kBAAU,EAAE,IAAI,EAAE,SAAS,IAAI,EAAE,SAAS,IAAI,EAAE,SAAS,IAAI,EAAE,SAAS,UAAU,KAAK,CAAC;AAAA,MAC1F,OAAO;AACL,uBAAe;AACf,eAAO,EAAE,IAAI,EAAE,SAAS,IAAI,EAAE,SAAS,IAAI,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;AAAA,MAC3E;AAAA,IACF;AAAA,EACF;AAEA,QAAM,mBAAmB,CAAC,MAAwB;AAChD,MAAE,eAAe;AACjB,eAAW,EAAE,GAAG,EAAE,SAAS,GAAG,EAAE,SAAS,QAAQ,KAAK,CAAC;AAAA,EACzD;AAEA,QAAM,oBAAoB,CAAC,GAAqB,WAAmB;AACjE,MAAE,eAAe;AAAG,MAAE,gBAAgB;AAItC,QAAI,CAAC,YAAY,IAAI,MAAM,EAAG,WAAU,MAAM;AAC9C,eAAW,EAAE,GAAG,EAAE,SAAS,GAAG,EAAE,SAAS,OAAO,CAAC;AAAA,EACnD;AAEA,QAAM,cAAc,CAAC,MAAwB;AAC3C,QAAI,UAAU;AACZ,YAAM,EAAE,GAAG,EAAE,IAAI,SAAS,EAAE,SAAS,EAAE,OAAO;AAC9C,kBAAY,QAAM,KAAK,EAAE,GAAG,IAAI,KAAK,GAAG,KAAK,EAAE,IAAI,IAAI;AACvD;AAAA,IACF;AACA,QAAI,cAAc;AAChB,YAAM,EAAE,GAAG,EAAE,IAAI,SAAS,EAAE,SAAS,EAAE,OAAO;AAC9C,YAAM,KAAK,KAAK,CAAC,GAAG,KAAK,KAAK,CAAC;AAC/B,YAAM,UAAU;AAAA,QACd,GAAG;AAAA,QACH,OAAO,MAAM,MAAM,IAAI,QAAM,GAAG,OAAO,eAAe,EAAE,GAAG,IAAI,UAAU,EAAE,GAAG,IAAI,GAAG,GAAG,EAAE,IAAI,EAAE;AAAA,MAClG;AACA,iBAAW,OAAO;AAClB;AAAA,IACF;AACA,QAAI,MAAM;AACR,YAAM,KAAK,MAAM,EAAE,UAAU,KAAK,KAAK,UAAU,KAAK,UAAU,KAAK;AACrE,YAAM,KAAK,MAAM,EAAE,UAAU,KAAK,KAAK,UAAU,KAAK,UAAU,KAAK;AACrE,YAAM,UAAU,oBAAoB;AACpC,UAAI,WAAW,QAAQ,OAAO,GAAG;AAC/B,cAAM,UAAU;AAAA,UACd,GAAG;AAAA,UACH,OAAO,MAAM,MAAM,IAAI,OAAK;AAC1B,kBAAM,IAAI,QAAQ,IAAI,EAAE,EAAE;AAC1B,gBAAI,CAAC,EAAG,QAAO;AACf,mBAAO;AAAA,cACL,GAAG;AAAA,cACH,GAAG,MAAM,EAAE,UAAU,EAAE,KAAK,UAAU,KAAK,UAAU,KAAK;AAAA,cAC1D,GAAG,MAAM,EAAE,UAAU,EAAE,KAAK,UAAU,KAAK,UAAU,KAAK;AAAA,YAC5D;AAAA,UACF,CAAC;AAAA,QACH;AACA,mBAAW,OAAO;AAAA,MACpB,OAAO;AACL,cAAM,UAAU,MAAM,MAAM,KAAK,OAAK,EAAE,OAAO,KAAK,MAAM;AAC1D,YAAI,CAAC,QAAS;AACd,cAAM,EAAE,GAAG,IAAI,GAAG,GAAG,IAAI,SAAS,SAAS,OAAO;AAClD,cAAM,SAAS,MAAM,MAClB,OAAO,OAAK,EAAE,OAAO,KAAK,MAAM,EAChC,IAAI,OAAK;AACR,gBAAM,IAAI,SAAS,GAAG,OAAO;AAC7B,iBAAO,EAAE,GAAG,EAAE,KAAK,GAAG,GAAG,EAAE,KAAK,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE;AAAA,QACpD,CAAC;AACH,cAAM,aAAa,gBAAgB,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,MAAM;AACzE,uBAAe,WAAW,UAAU,WAAW,SAAS,EAAE,GAAG,WAAW,QAAQ,GAAG,WAAW,OAAO,IAAI,IAAI;AAC7G,cAAM,UAAU,EAAE,GAAG,OAAO,OAAO,MAAM,MAAM,IAAI,OAAK,EAAE,OAAO,KAAK,SAAS,EAAE,GAAG,GAAG,GAAG,WAAW,GAAG,GAAG,WAAW,EAAE,IAAI,CAAC,EAAE;AAC/H,mBAAW,OAAO;AAAA,MACpB;AAAA,IACF,WAAW,KAAK;AACd,mBAAa,SAAO,EAAE,GAAG,IAAI,GAAG,IAAI,MAAM,EAAE,UAAU,IAAI,KAAK,GAAG,IAAI,MAAM,EAAE,UAAU,IAAI,IAAI,EAAE;AAAA,IACpG,WAAW,QAAQ;AACjB,gBAAU,OAAK,IAAI,EAAE,GAAG,GAAG,IAAI,EAAE,SAAS,IAAI,EAAE,QAAQ,IAAI,IAAI;AAAA,IAClE;AAAA,EACF;AAEA,QAAM,YAAY,MAAM;AACtB,QAAI,QAAQ;AACV,YAAM,UAAU,KAAK,IAAI,OAAO,KAAK,OAAO,EAAE,IAAI,KAAK,KAAK,IAAI,OAAO,KAAK,OAAO,EAAE,IAAI;AACzF,UAAI,WAAW,OAAO,SAAS;AAC7B,cAAM,OAAO,OAAO,QAAQ,sBAAsB;AAClD,cAAM,KAAK,KAAK,IAAI,OAAO,IAAI,OAAO,EAAE,IAAI,KAAK;AACjD,cAAM,KAAK,KAAK,IAAI,OAAO,IAAI,OAAO,EAAE,IAAI,KAAK;AACjD,cAAM,KAAK,KAAK,IAAI,OAAO,IAAI,OAAO,EAAE,IAAI,KAAK;AACjD,cAAM,KAAK,KAAK,IAAI,OAAO,IAAI,OAAO,EAAE,IAAI,KAAK;AAEjD,cAAM,OAAO,KAAK,UAAU,KAAK,UAAU;AAC3C,cAAM,OAAO,KAAK,UAAU,KAAK,UAAU;AAC3C,cAAM,OAAO,KAAK,UAAU,KAAK,UAAU;AAC3C,cAAM,OAAO,KAAK,UAAU,KAAK,UAAU;AAC3C,cAAM,OAAO,IAAI,IAAY,OAAO,WAAW,cAAc,CAAC,CAAC;AAC/D,mBAAW,KAAK,MAAM,OAAO;AAC3B,gBAAM,KAAK,EAAE,KAAK,GAAG,KAAK,EAAE,KAAK;AACjC,gBAAM,EAAE,GAAG,IAAI,GAAG,GAAG,IAAI,SAAS,GAAG,OAAO;AAC5C,cAAI,KAAK,MAAM,OAAO,MAAM,OAAO,KAAK,MAAM,OAAO,MAAM,IAAK,MAAK,IAAI,EAAE,EAAE;AAAA,QAC/E;AACA,cAAM,MAAM,MAAM,KAAK,IAAI;AAC3B,uBAAe,IAAI;AACnB,oBAAY,IAAI,SAAS,IAAI,IAAI,SAAS,CAAC,IAAI,IAAI;AAAA,MACrD;AACA,gBAAU,IAAI;AAAA,IAChB;AAEA,QAAI,KAAM,cAAa,KAAK;AAC5B,QAAI,cAAc;AAAE,mBAAa,KAAK;AAAG,sBAAgB,IAAI;AAAA,IAAG;AAChE,wBAAoB,UAAU;AAC9B,mBAAe,IAAI;AACnB,YAAQ,IAAI;AAAG,WAAO,IAAI;AAC1B,QAAI,SAAU,aAAY,IAAI;AAAA,EAChC;AAEA,QAAM,iBAAiB,CAAC,GAAqB,OAAe;AAC1D,MAAE,gBAAgB;AAClB,UAAM,OAAO,MAAM,MAAM,KAAK,OAAK,EAAE,OAAO,EAAE;AAC9C,iBAAa,EAAE;AAAG,iBAAa,KAAK,KAAK;AAAA,EAC3C;AAEA,QAAM,aAAa,MAAM;AACvB,QAAI,CAAC,UAAW;AAChB,UAAM,KAAK,EAAE,GAAG,OAAO,OAAO,MAAM,MAAM,IAAI,OAAK,EAAE,OAAO,YAAY,EAAE,GAAG,GAAG,OAAO,UAAU,IAAI,CAAC,EAAE;AACxG,iBAAa,EAAE;AACf,iBAAa,IAAI;AAAA,EACnB;AAEA,QAAM,UAAU,CAAC,gBAA2C;AAC1D,UAAM,KAAK,OAAO,QAAQ,MAAM,KAAK;AACrC,UAAM,IAAI,cACN,EAAE,GAAG,KAAK,YAAY,CAAC,GAAG,GAAG,KAAK,YAAY,CAAC,EAAE,IACjD,EAAE,GAAG,KAAK,MAAM,KAAK,OAAO,IAAI,GAAG,GAAG,GAAG,KAAK,MAAM,KAAK,OAAO,IAAI,GAAG,EAAE;AAC7E,UAAM,QAAQ,YAAY,aAAa,iBAAiB,YAAY,YAAY,QAAQ,MAAM,MAAM,SAAS,CAAC,KAAK;AACnH,UAAM,WAAW,YAAY,aAAa,EAAE,SAAS,CAAC,EAAE,IAAI;AAC5D,UAAM,UAAU,EAAE,GAAG,OAAO,OAAO,CAAC,GAAG,MAAM,OAAO,EAAE,IAAI,OAAO,OAAO,aAAsB,UAAU,GAAG,EAAE,CAAC,EAAE;AAChH,iBAAa,OAAO;AAAG,cAAU,EAAE;AACnC,oBAAgB,SAAS,aAAa,YAAY,CAAC,KAAK,KAAK,IAAI;AAAA,EACnE;AAEA,QAAM,aAAa,CAAC,WAAmB;AACrC,UAAM,OAAO,MAAM,MAAM,KAAK,OAAK,EAAE,OAAO,MAAM;AAClD,UAAM,UAAU,EAAE,GAAG,OAAO,OAAO,MAAM,MAAM,OAAO,OAAK,EAAE,OAAO,MAAM,GAAG,OAAO,MAAM,MAAM,OAAO,OAAK,EAAE,SAAS,UAAU,EAAE,OAAO,MAAM,EAAE;AAClJ,iBAAa,OAAO;AACpB,QAAI,YAAY,IAAI,MAAM,GAAG;AAC3B,YAAM,OAAO,IAAI,IAAI,WAAW;AAAG,WAAK,OAAO,MAAM;AACrD,qBAAe,IAAI;AACnB,UAAI,aAAa,OAAQ,aAAY,KAAK,OAAO,MAAM,KAAK,IAAI,EAAE,KAAK,OAAO,CAAC,IAAI,IAAI;AAAA,IACzF;AACA,QAAI,KAAM,iBAAgB,WAAW,aAAa,YAAY,CAAC,KAAK,KAAK,KAAK,IAAI;AAAA,EACpF;AAEA,QAAM,iBAAiB,MAAM;AAC3B,QAAI,YAAY,SAAS,EAAG;AAC5B,QAAI,YAAY,SAAS,KAAK,UAAU;AAAE,iBAAW,QAAQ;AAAG;AAAA,IAAQ;AACxE,UAAM,MAAM,IAAI,IAAI,WAAW;AAC/B,UAAM,UAAU;AAAA,MACd,GAAG;AAAA,MACH,OAAO,MAAM,MAAM,OAAO,OAAK,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;AAAA,MAC7C,OAAO,MAAM,MAAM,OAAO,QAAM,CAAC,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;AAAA,IACtE;AACA,iBAAa,OAAO;AACpB,mBAAe;AACf,oBAAgB,WAAW,IAAI,IAAI,IAAI,aAAa,YAAY,CAAC,IAAI;AAAA,EACvE;AAEA,QAAM,gBAAgB,CAAC,WAAmB;AACxC,UAAM,OAAO,MAAM,MAAM,KAAK,OAAK,EAAE,OAAO,MAAM;AAClD,QAAI,CAAC,KAAM;AAGX,QAAI,YAAY,WAAY;AAC5B,qBAAiB,MAAM;AACvB,qBAAiB,KAAK,SAAS,EAAE;AAAA,EACnC;AAEA,QAAM,iBAAiB,MAAM;AAC3B,QAAI,CAAC,cAAe;AACpB,UAAM,OAAO,cAAc,KAAK;AAChC,UAAM,UAAU;AAAA,MACd,GAAG;AAAA,MACH,OAAO,MAAM,MAAM,IAAI,OAAK,EAAE,OAAO,gBACjC,EAAE,GAAG,GAAG,GAAI,OAAO,EAAE,OAAO,KAAK,IAAI,EAAE,OAAO,OAAU,EAAG,IAC3D,CAAC;AAAA,IACP;AACA,iBAAa,OAAO;AACpB,qBAAiB,IAAI;AAAA,EACvB;AAEA,QAAM,oBAAoB,CAAC,GAAqB,WAAmB;AACjE,MAAE,eAAe;AAAG,MAAE,gBAAgB;AACtC,eAAW,EAAE,GAAG,EAAE,SAAS,GAAG,EAAE,SAAS,QAAQ,MAAM,OAAO,CAAC;AAAA,EACjE;AAEA,QAAM,eAAe,CAAC,QAAgB,UAAyC;AAC7E,UAAM,UAAU,EAAE,GAAG,OAAO,OAAO,MAAM,MAAM,IAAI,OAAK,EAAE,OAAO,SAAS,EAAE,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE;AAC/F,iBAAa,OAAO;AAAA,EACtB;AAEA,QAAM,mBAAmB,CAAC,QAAgB,cAAgC;AACxE,UAAM,UAAU,EAAE,GAAG,OAAO,OAAO,MAAM,MAAM,IAAI,OAAK,EAAE,OAAO,SAAS,EAAE,GAAG,GAAG,UAAU,IAAI,CAAC,EAAE;AACnG,iBAAa,OAAO;AAAA,EACtB;AAEA,QAAM,aAAa,CAAC,WAAmB;AACrC,UAAM,UAAU,EAAE,GAAG,OAAO,OAAO,MAAM,MAAM,OAAO,OAAK,EAAE,OAAO,MAAM,EAAE;AAC5E,iBAAa,OAAO;AAAA,EACtB;AAEA,QAAM,mBAAmB,CAAC,WAAmB;AAC3C,UAAM,UAAU;AAAA,MACd,GAAG;AAAA,MACH,OAAO,MAAM,MAAM,IAAI,OAAK;AAC1B,YAAI,EAAE,OAAO,OAAQ,QAAO;AAC5B,cAAM,EAAE,UAAU,UAAU,GAAG,KAAK,IAAI;AACxC,aAAK;AACL,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AACA,iBAAa,OAAO;AAAA,EACtB;AAEA,QAAM,eAAe,aAAa,OAAO,UAAU,WAAW,CAAC,QAAQ,UAAU,KAAK,SAAS,CAAC;AAEhG,QAAM,6BAAyB,4BAAY,CAAC,OAAmC;AAAA,IAC7E,GAAG;AAAA,IACH,OAAO,EAAE,MAAM,IAAI,CAAC,GAAG,OAAO;AAAA,MAC5B,GAAG;AAAA,MACH,GAAG,EAAE,KAAK,KAAK,KAAM,IAAI,IAAK,GAAG;AAAA,MACjC,GAAG,EAAE,KAAK,KAAK,KAAK,KAAK,MAAM,IAAI,CAAC,IAAI,GAAG;AAAA,IAC7C,EAAE;AAAA,EACJ,IAAI,CAAC,CAAC;AACN,QAAM,eAAe,YAAY,cAAc;AAAA,IAC7C,WAAW;AAAA,IACX,WAAW,CAAC,QAAQ,UAAU,KAAK,SAAS;AAAA,IAC5C,SAAS,CAAC,QAAQ,UAAU,KAAK,OAAO;AAAA,EAC1C,CAAC;AAED,QAAM,MAAM,cAAc,SAAS,MAAM;AACzC,QAAM,eAAe,YAAY,aAAa,aAAa,YAAY,YAAY,SAAS;AAC5F,QAAM,YAAY,YAAY,MAAM;AACpC,QAAM,WAAW,WAAW,MAAM;AAClC,QAAM,aAAa,SAAS,OAAE,YAAY,OAAE;AAE5C,SACE,+CAAC,SAAI,WAAU,cAAa,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,QAAQ,OAAO,QAAQ,YAAY,sCAAsC,WAAW,cAAc,YAAY,EAAE,SAAS,UAAU,WAAW,GAC3N;AAAA,kDAAC,kBAAe,QAAgB,WAAW,cAAc;AAAA,IACzD,8CAAC,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+BAMiB,IAAI,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,+BAKT,IAAI,KAAK;AAAA;AAAA;AAAA;AAAA,+BAIT,IAAI,KAAK;AAAA;AAAA;AAAA,SAGhC;AAAA,IAEF;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QAAS,aAAU;AAAA,QAAS,eAAY;AAAA,QAC7C,OAAO;AAAA,QACP;AAAA;AAAA,IAAa;AAAA,IACf,8CAAC,WAAQ,UAAU,cAAc,UAAU,cAAc,eAAe,QAAW,gBAAgC,aAA0B;AAAA,IAG7I,+CAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,GAAG,SAAS,YAAY,YAAY,EAAE,SAAS,cAAc,aAAa,EAAE,WAAW,IAAI,YAAY,UAAU,UAAU,OAAO,GACpK;AAAA,qDAAC,YAAO,SAAS,MAAM,QAAQ,GAAG,OAAO,QAAQ,IAAI,OAAO,MAAM,GAAG;AAAA;AAAA,QAAG;AAAA,SAAa;AAAA,MACpF,YAAY,OAAO,KAClB,gFACE;AAAA,sDAAC,SAAI,OAAO,EAAE,OAAO,GAAG,QAAQ,IAAI,YAAY,EAAE,aAAa,QAAQ,QAAQ,GAAG;AAAA,QAClF,8CAAC,YAAO,SAAS,gBAAgB,OAAO,EAAE,GAAG,QAAQ,eAAe,MAAM,GAAG,OAAO,WAAW,QAAQ,aAAa,SAAS,YAAY,SAAS,GAAG,GAClJ,sBAAY,OAAO,IAAI,WAAW,YAAY,IAAI,MAAM,UAC3D;AAAA,SACF;AAAA,MAED,YACC,+CAAC,UAAK,OAAO,EAAE,UAAU,IAAI,OAAO,IAAI,OAAO,YAAY,KAAK,YAAY,EAAE,GAC3E;AAAA,iBAAS,cAAc,YAAY,SAAS,WAAW,aAAQ;AAAA,QAChE,8CAAC,UAAK,OAAO,EAAE,YAAY,KAAK,OAAO,EAAE,WAAW,YAAY,EAAE,GAAG,+BAAiB;AAAA,SACxF;AAAA,MAEF,+CAAC,UAAK,OAAO,EAAE,YAAY,QAAQ,UAAU,IAAI,OAAO,EAAE,UAAU,GACjE;AAAA,oBAAY,aAAa,sCAAmC;AAAA,QAAmB;AAAA,SAClF;AAAA,OACF;AAAA,IAEC,YAAY,eACX,8CAAC,SAAI,OAAO,EAAE,SAAS,YAAY,YAAY,IAAI,MAAM,cAAc,aAAa,IAAI,MAAM,IAAI,UAAU,IAAI,OAAO,IAAI,OAAO,YAAY,IAAI,GAC/I,sBAAY,aAAa,gFAA2E,mEACvG;AAAA,IAGF,+CAAC,SAAI,OAAO,gBAEV;AAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UAAc;AAAA,UAAoB;AAAA,UAClC;AAAA,UAAgB;AAAA,UAAM;AAAA,UACtB,MAAM;AAAA,UAAS,UAAU,MAAM,WAAW,OAAK,CAAC,CAAC;AAAA,UACjD,UAAU;AAAA;AAAA,MACZ;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UAAc;AAAA,UAAkB;AAAA,UAChC;AAAA,UAAM;AAAA,UAAgB;AAAA,UACtB;AAAA,UAAsB;AAAA,UACtB;AAAA,UAAoB;AAAA,UACpB;AAAA,UAAsB;AAAA,UACtB;AAAA,UAAY;AAAA,UAAU;AAAA,UAAoB;AAAA,UAC1C;AAAA,UACA;AAAA,UAA8B;AAAA,UAC9B;AAAA,UAAoC;AAAA,UACpC;AAAA,UAAoC;AAAA,UACpC;AAAA,UAAsC;AAAA,UACtC;AAAA,UAAsB;AAAA,UAAsB;AAAA,UAC5C;AAAA,UAAwB;AAAA,UACxB;AAAA,UAAkC;AAAA,UAClC;AAAA,UAAgC;AAAA,UAChC;AAAA,UAAkC;AAAA,UAClC;AAAA,UAAgC;AAAA,UAA0B;AAAA,UAC1D;AAAA,UACA;AAAA,UAA8B;AAAA,UAAoB;AAAA,UAClD;AAAA,UAAsB;AAAA,UAAoB;AAAA,UAC1C;AAAA,UACA;AAAA,UAAgB;AAAA,UAChB;AAAA,UAAkB;AAAA,UAClB,eAAe,SAAS,SAAS,MAAM,MAAM,KAAK,OAAK,EAAE,OAAO,QAAQ,MAAM,IAAI,SAAY,SAAS;AAAA,UACvG,eAAgB,SAAS,SAAS,MAAM,MAAM,KAAK,OAAK,EAAE,OAAO,QAAQ,MAAM,IAAI,SAAY,aAAa;AAAA,UAC5G,oBAAoB,CAAC,EAAE,SAAS,SAAS,MAAM,MAAM,KAAK,OAAK,EAAE,OAAO,QAAQ,MAAM,IAAI,SAAY;AAAA,UACtG,WAAW,MAAM;AAAE,iBAAK;AAAG,uBAAW,IAAI;AAAA,UAAG;AAAA,UAC7C,WAAW,MAAM;AAAE,iBAAK;AAAG,uBAAW,IAAI;AAAA,UAAG;AAAA,UAC7C,eAAe,MAAM;AAAE,qBAAS;AAAG,uBAAW,IAAI;AAAA,UAAG;AAAA,UACrD,cAAc,MAAM;AAClB,kBAAM,OAAO,OAAO,QAAS,sBAAsB;AACnD,kBAAM,MAAM,QAAS,IAAI,KAAK,OAAO,UAAU,KAAK,UAAU;AAC9D,kBAAM,MAAM,QAAS,IAAI,KAAK,MAAM,UAAU,KAAK,UAAU;AAC7D,oBAAQ,EAAE,GAAG,IAAI,GAAG,GAAG,CAAC;AAAG,uBAAW,IAAI;AAAA,UAC5C;AAAA,UACA,gBAAgB,MAAM;AAAE,gBAAI,SAAS,QAAQ;AAAE,4BAAc,QAAQ,MAAM;AAAG,yBAAW,IAAI;AAAA,YAAG;AAAA,UAAE;AAAA,UAClG,aAAa,MAAM;AACjB,gBAAI,SAAS,QAAQ;AACnB,oBAAM,OAAO,MAAM,MAAM,KAAK,OAAK,EAAE,OAAO,QAAQ,MAAM;AAC1D,2BAAa,QAAQ,MAAM;AAAG,2BAAa,KAAK,KAAK;AAAG,yBAAW,IAAI;AAAA,YACzE;AAAA,UACF;AAAA,UACA,aAAa,MAAM;AAAE,gBAAI,SAAS,QAAQ;AAAE,yBAAW,QAAQ,MAAM;AAAG,yBAAW,IAAI;AAAA,YAAG;AAAA,UAAE;AAAA,UAC5F,iBAAiB,MAAM;AACrB,gBAAI,SAAS,QAAQ;AACnB,oBAAM,IAAI,EAAE,GAAG,OAAO,OAAO,MAAM,MAAM,OAAO,OAAK,EAAE,SAAS,QAAQ,UAAU,EAAE,OAAO,QAAQ,MAAM,EAAE;AAC3G,2BAAa,CAAC;AAAG,yBAAW,IAAI;AAAA,YAClC;AAAA,UACF;AAAA,UACA,iBAAiB,MAAM;AAAE,gBAAI,SAAS,QAAQ;AAAE,4BAAc,QAAQ,MAAM;AAAG,yBAAW,IAAI;AAAA,YAAG;AAAA,UAAE;AAAA,UACnG,gBAAgB,CAACC,OAAM;AAAE,gBAAI,SAAS,QAAQ;AAAE,2BAAa,QAAQ,QAAQA,EAAC;AAAG,yBAAW,IAAI;AAAA,YAAG;AAAA,UAAE;AAAA,UACrG,oBAAoB,CAAC,MAAM;AAAE,gBAAI,SAAS,QAAQ;AAAE,+BAAiB,QAAQ,QAAQ,CAAC;AAAG,yBAAW,IAAI;AAAA,YAAG;AAAA,UAAE;AAAA,UAC7G,iBAAiB,MAAM;AAAE,gBAAI,SAAS,QAAQ;AAAE,yBAAW,QAAQ,MAAM;AAAG,yBAAW,IAAI;AAAA,YAAG;AAAA,UAAE;AAAA,UAChG,uBAAuB,MAAM;AAAE,gBAAI,SAAS,QAAQ;AAAE,+BAAiB,QAAQ,MAAM;AAAG,yBAAW,IAAI;AAAA,YAAG;AAAA,UAAE;AAAA;AAAA,MAC9G;AAAA,MAEC,YACC,8CAAC,cAA0B,QAAQ,UAAU,OAAc,eAAe,OAAK;AAAE,qBAAa,CAAC;AAAA,MAAG,GAAG,SAAkB,QAAgB,GAAM,OAA5H,QAAsI;AAAA,OAE3J;AAAA,IAEA,+CAAC,SAAI,OAAO,EAAE,SAAS,YAAY,UAAU,IAAI,OAAO,EAAE,WAAW,YAAY,EAAE,UAAU,WAAW,aAAa,EAAE,WAAW,IAAI,SAAS,QAAQ,KAAK,IAAI,UAAU,QAAQ,UAAU,UAAU,WAAW,GAAG,GAClN;AAAA,qDAAC,UAAM;AAAA,cAAM,MAAM;AAAA,QAAO;AAAA,QAAE,aAAa,YAAY;AAAA,QAAE;AAAA,SAAC;AAAA,MACxD,+CAAC,UAAM;AAAA,cAAM,MAAM;AAAA,QAAO;AAAA,SAAY;AAAA,MACtC,+CAAC,UAAM;AAAA,aAAK,MAAM,UAAU,QAAQ,GAAG;AAAA,QAAE;AAAA,SAAM;AAAA,MAC/C,8CAAC,UAAK,OAAO,EAAE,YAAY,QAAQ,YAAY,UAAU,UAAU,UAAU,cAAc,WAAW,GAAG,kFAA2D;AAAA,MACnK,YAAY,8CAAC,UAAK,OAAO,EAAE,OAAO,IAAI,MAAM,GAAI,gBAAM,MAAM,KAAK,OAAK,EAAE,OAAO,QAAQ,GAAG,OAAM;AAAA,OACnG;AAAA,KACF;AAEJ;AAEA,SAAS,QAAQ,QAAgB,QAAsC;AACrE,QAAM,gBAAgB,WAAW;AACjC,SAAO;AAAA,IACL,SAAS;AAAA,IAAe,YAAY;AAAA,IAAU,KAAK;AAAA,IACnD,SAAS;AAAA,IACT,YAAY,gBAAgB,gBAAgB;AAAA,IAC5C,OAAO,gBAAgB,YAAY;AAAA,IACnC,QAAQ,gBAAgB,aAAa,SAAS,YAAY,SAAS,KAAK;AAAA,IACxE,cAAc;AAAA,IAAG,QAAQ;AAAA,IAAW,UAAU;AAAA,IAAI,YAAY;AAAA,IAAK,YAAY;AAAA,EACjF;AACF;","names":["import_react","import_react","trimmed","import_jsx_runtime","import_react","import_jsx_runtime","isQuestion","s","import_react","import_react","import_jsx_runtime","import_react","import_react","import_react","exportFlowchart","msgArrow","exportSequence","s","import_react","m","import_react","import_jsx_runtime","import_react","import_jsx_runtime","INDIGO","INDIGO_SOFT","lightTheme","darkTheme","HEADER_H","HEADER_PAD","ROW_H","SIDE_PAD","ghostBtn","s","import_react","import_jsx_runtime","import_react","NODE_H","Q_BASE_H","Q_ANS_ROW_H","Q_CARD_PAD","MIN_NODE_W","MAX_NODE_W","MIN_Q_W","estimateTextW","nodeWidth","MAX_NODE_W","MIN_NODE_W","answerCardW","questionNodeW","MIN_Q_W","s","Q_CARD_PAD","questionNodeH","Q_BASE_H","Q_ANS_ROW_H","NODE_H","bezierPath","dy","import_jsx_runtime","NODE_H","questionNodeH","Q_BASE_H","Q_ANS_ROW_H","s","answerCardW","Q_CARD_PAD","questionNodeW","nodeWidth","bezierPath","estimateTextW","import_react","import_jsx_runtime","import_react","import_jsx_runtime","divider","import_jsx_runtime","STYLE_LABEL","bezierPath","isQuestion","NODE_H","import_react","import_react","import_react","import_react","import_jsx_runtime","W","H","nodeWidth","NODE_H","s"]}