@elixpo/lixsketch 5.5.20 → 5.5.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/react/{CopyPaste-KJZ34MIP.js → CopyPaste-FJN7K5LS.js} +39 -11
- package/dist/react/CopyPaste-FJN7K5LS.js.map +7 -0
- package/dist/react/{EventDispatcher-XDRQS7BD.js → EventDispatcher-O7HCQQNM.js} +13 -13
- package/dist/react/Frame-RLSMJJSK.js +11 -0
- package/dist/react/{GraphEngine-KQXHNTZQ.js → GraphEngine-MM6ALA2N.js} +105 -148
- package/dist/react/{GraphEngine-KQXHNTZQ.js.map → GraphEngine-MM6ALA2N.js.map} +2 -2
- package/dist/react/IconShape-7OPXAKLK.js +10 -0
- package/dist/react/ImageShape-LRNJQCF3.js +10 -0
- package/dist/react/Line-WWQFBNX5.js +10 -0
- package/dist/react/{SceneSerializer-VY3HY4PF.js → SceneSerializer-GSJR7ZHC.js} +32 -8
- package/dist/react/SceneSerializer-GSJR7ZHC.js.map +7 -0
- package/dist/react/{Selection-U2AR6NQS.js → Selection-ZL3G6IAO.js} +4 -4
- package/dist/react/{SketchEngine-ZFYUTKET.js → SketchEngine-BFLHJPCG.js} +21 -21
- package/dist/react/{UndoRedo-BZ6W4QTV.js → UndoRedo-NL7KLR5B.js} +2 -2
- package/dist/react/{arrowTool-LKFSZKXC.js → arrowTool-CNVGM6RX.js} +3 -3
- package/dist/react/{chunk-RFHMFWVR.js → chunk-2FMFOPGW.js} +5 -6
- package/dist/react/{chunk-RFHMFWVR.js.map → chunk-2FMFOPGW.js.map} +2 -2
- package/dist/react/{chunk-SBSM3GQD.js → chunk-2THKDSWW.js} +4 -4
- package/dist/react/{chunk-JOPQ27YH.js → chunk-4BLMNGTR.js} +3 -3
- package/dist/react/{chunk-C62SXFBL.js → chunk-4TAS67SL.js} +23 -22
- package/dist/react/chunk-4TAS67SL.js.map +7 -0
- package/dist/react/{chunk-7VBI7S7T.js → chunk-AH4PWNEB.js} +10 -11
- package/dist/react/chunk-AH4PWNEB.js.map +7 -0
- package/dist/react/{chunk-R5QXEVZ5.js → chunk-GC3KTQDA.js} +74 -15
- package/dist/react/chunk-GC3KTQDA.js.map +7 -0
- package/dist/react/{chunk-2V7G2PLX.js → chunk-GPIYXREE.js} +3 -3
- package/dist/react/{chunk-73VLPCBC.js → chunk-HFQZYCHJ.js} +3 -3
- package/dist/react/{chunk-C72OHQLE.js → chunk-ILGAFR56.js} +3 -3
- package/dist/react/{chunk-75G7XSZU.js → chunk-KVAQPCUH.js} +17 -3
- package/dist/react/chunk-KVAQPCUH.js.map +7 -0
- package/dist/react/{chunk-WEWMB35W.js → chunk-OFGJJKPH.js} +3 -3
- package/dist/react/{chunk-6G3ITAS5.js → chunk-SZD7DKYJ.js} +18 -9
- package/dist/react/chunk-SZD7DKYJ.js.map +7 -0
- package/dist/react/{chunk-MYYBFZD3.js → chunk-U3TB4KRS.js} +45 -6
- package/dist/react/chunk-U3TB4KRS.js.map +7 -0
- package/dist/react/{chunk-UQBT7F4K.js → chunk-V2QTYSBK.js} +2 -2
- package/dist/react/{chunk-2I3GH65Z.js → chunk-XFQECTTF.js} +44 -19
- package/dist/react/chunk-XFQECTTF.js.map +7 -0
- package/dist/react/{chunk-O64N5JPO.js → chunk-YF3TK7SC.js} +2 -2
- package/dist/react/{circleTool-RDOIMKKV.js → circleTool-KICNRQCI.js} +4 -4
- package/dist/react/{codeTool-VBDB2ES6.js → codeTool-NCQ73R6M.js} +4 -4
- package/dist/react/{frameTool-Z5ZDCX6H.js → frameTool-Y6KB67DO.js} +4 -4
- package/dist/react/{freehandTool-AAQCTMVM.js → freehandTool-MMULHCQ7.js} +4 -4
- package/dist/react/{iconTool-5WNDHI5T.js → iconTool-LSW2DYGB.js} +4 -4
- package/dist/react/{imageTool-ECPMT3BL.js → imageTool-2DSR32RX.js} +4 -4
- package/dist/react/index.js +141 -66
- package/dist/react/index.js.map +3 -3
- package/dist/react/{lineTool-XLOOZE3E.js → lineTool-N5I7IGT7.js} +4 -4
- package/dist/react/{rectangleTool-AEYDDJCA.js → rectangleTool-YUT7ZK2E.js} +4 -4
- package/dist/react/{textTool-5IJKTWVQ.js → textTool-IQOYPELP.js} +5 -5
- package/package.json +1 -1
- package/src/core/CopyPaste.js +34 -4
- package/src/core/GraphEngine.js +129 -185
- package/src/core/SceneSerializer.js +26 -0
- package/src/core/Selection.js +12 -11
- package/src/core/UndoRedo.js +47 -3
- package/src/react/components/canvas/MultiSelectActions.jsx +4 -1
- package/src/react/components/sidebars/IconSidebar.jsx +14 -23
- package/src/react/components/sidebars/ImageSidebar.jsx +47 -24
- package/src/react/store/useUIStore.js +71 -14
- package/src/shapes/Frame.js +19 -2
- package/src/shapes/IconShape.js +23 -25
- package/src/shapes/ImageShape.js +6 -2
- package/src/tools/frameTool.js +19 -9
- package/src/tools/iconTool.js +60 -25
- package/src/tools/imageTool.js +77 -13
- package/dist/react/CopyPaste-KJZ34MIP.js.map +0 -7
- package/dist/react/Frame-QLBAVLGW.js +0 -11
- package/dist/react/IconShape-32EYI2MA.js +0 -10
- package/dist/react/ImageShape-MYP2DVVH.js +0 -10
- package/dist/react/Line-FCCF2BOB.js +0 -10
- package/dist/react/SceneSerializer-VY3HY4PF.js.map +0 -7
- package/dist/react/chunk-2I3GH65Z.js.map +0 -7
- package/dist/react/chunk-6G3ITAS5.js.map +0 -7
- package/dist/react/chunk-75G7XSZU.js.map +0 -7
- package/dist/react/chunk-7VBI7S7T.js.map +0 -7
- package/dist/react/chunk-C62SXFBL.js.map +0 -7
- package/dist/react/chunk-MYYBFZD3.js.map +0 -7
- package/dist/react/chunk-R5QXEVZ5.js.map +0 -7
- /package/dist/react/{EventDispatcher-XDRQS7BD.js.map → EventDispatcher-O7HCQQNM.js.map} +0 -0
- /package/dist/react/{Frame-QLBAVLGW.js.map → Frame-RLSMJJSK.js.map} +0 -0
- /package/dist/react/{IconShape-32EYI2MA.js.map → IconShape-7OPXAKLK.js.map} +0 -0
- /package/dist/react/{ImageShape-MYP2DVVH.js.map → ImageShape-LRNJQCF3.js.map} +0 -0
- /package/dist/react/{Line-FCCF2BOB.js.map → Line-WWQFBNX5.js.map} +0 -0
- /package/dist/react/{Selection-U2AR6NQS.js.map → Selection-ZL3G6IAO.js.map} +0 -0
- /package/dist/react/{SketchEngine-ZFYUTKET.js.map → SketchEngine-BFLHJPCG.js.map} +0 -0
- /package/dist/react/{UndoRedo-BZ6W4QTV.js.map → UndoRedo-NL7KLR5B.js.map} +0 -0
- /package/dist/react/{arrowTool-LKFSZKXC.js.map → arrowTool-CNVGM6RX.js.map} +0 -0
- /package/dist/react/{chunk-SBSM3GQD.js.map → chunk-2THKDSWW.js.map} +0 -0
- /package/dist/react/{chunk-JOPQ27YH.js.map → chunk-4BLMNGTR.js.map} +0 -0
- /package/dist/react/{chunk-2V7G2PLX.js.map → chunk-GPIYXREE.js.map} +0 -0
- /package/dist/react/{chunk-73VLPCBC.js.map → chunk-HFQZYCHJ.js.map} +0 -0
- /package/dist/react/{chunk-C72OHQLE.js.map → chunk-ILGAFR56.js.map} +0 -0
- /package/dist/react/{chunk-WEWMB35W.js.map → chunk-OFGJJKPH.js.map} +0 -0
- /package/dist/react/{chunk-UQBT7F4K.js.map → chunk-V2QTYSBK.js.map} +0 -0
- /package/dist/react/{chunk-O64N5JPO.js.map → chunk-YF3TK7SC.js.map} +0 -0
- /package/dist/react/{circleTool-RDOIMKKV.js.map → circleTool-KICNRQCI.js.map} +0 -0
- /package/dist/react/{codeTool-VBDB2ES6.js.map → codeTool-NCQ73R6M.js.map} +0 -0
- /package/dist/react/{frameTool-Z5ZDCX6H.js.map → frameTool-Y6KB67DO.js.map} +0 -0
- /package/dist/react/{freehandTool-AAQCTMVM.js.map → freehandTool-MMULHCQ7.js.map} +0 -0
- /package/dist/react/{iconTool-5WNDHI5T.js.map → iconTool-LSW2DYGB.js.map} +0 -0
- /package/dist/react/{imageTool-ECPMT3BL.js.map → imageTool-2DSR32RX.js.map} +0 -0
- /package/dist/react/{lineTool-XLOOZE3E.js.map → lineTool-N5I7IGT7.js.map} +0 -0
- /package/dist/react/{rectangleTool-AEYDDJCA.js.map → rectangleTool-YUT7ZK2E.js.map} +0 -0
- /package/dist/react/{textTool-5IJKTWVQ.js.map → textTool-IQOYPELP.js.map} +0 -0
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/core/Selection.js"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable */\n// Multi-selection system - copied from selection.js\n\nimport { cleanupAttachments } from '../tools/arrowTool.js';\nimport { pushTransformAction, pushFrameAttachmentAction, pushDeleteAction } from './UndoRedo.js';\nimport { calculateSnap, clearSnapGuides } from './SnapGuides.js';\nimport { registerRotationAnchor } from './ScreenSpaceControls.js';\n\nlet isMultiSelecting = false;\nlet multiSelectionStart = { x: 0, y: 0 };\nlet multiSelectionRect = null;\nlet isDraggingMultiSelection = false;\n\nfunction getSVGCoordsFromMouse(e) {\n const viewBox = svg.viewBox.baseVal;\n const rect = svg.getBoundingClientRect();\n const mouseX = e.clientX - rect.left;\n const mouseY = e.clientY - rect.top;\n const svgX = viewBox.x + (mouseX / rect.width) * viewBox.width;\n const svgY = viewBox.y + (mouseY / rect.height) * viewBox.height;\n return { x: svgX, y: svgY };\n}\n\nfunction createMultiSelectionRect(startX, startY) {\n multiSelectionRect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n multiSelectionRect.setAttribute('x', startX);\n multiSelectionRect.setAttribute('y', startY);\n multiSelectionRect.setAttribute('width', 0);\n multiSelectionRect.setAttribute('height', 0);\n multiSelectionRect.setAttribute('fill', 'rgba(91, 87, 209, 0.1)');\n multiSelectionRect.setAttribute('stroke', '#5B57D1');\n multiSelectionRect.setAttribute('stroke-width', 1);\n multiSelectionRect.setAttribute('stroke-dasharray', '4 2');\n multiSelectionRect.setAttribute('style', 'pointer-events: none;');\n svg.appendChild(multiSelectionRect);\n}\n\nfunction updateMultiSelectionRect(currentX, currentY) {\n if (!multiSelectionRect) return;\n\n const x = Math.min(multiSelectionStart.x, currentX);\n const y = Math.min(multiSelectionStart.y, currentY);\n const width = Math.abs(currentX - multiSelectionStart.x);\n const height = Math.abs(currentY - multiSelectionStart.y);\n\n multiSelectionRect.setAttribute('x', x);\n multiSelectionRect.setAttribute('y', y);\n multiSelectionRect.setAttribute('width', width);\n multiSelectionRect.setAttribute('height', height);\n}\n\nfunction removeMultiSelectionRect() {\n if (multiSelectionRect && multiSelectionRect.parentNode) {\n multiSelectionRect.parentNode.removeChild(multiSelectionRect);\n }\n multiSelectionRect = null;\n // Clean up any drag-select highlights\n clearDragSelectHighlights();\n}\n\n// Track elements highlighted during drag-select\nlet dragSelectHighlights = [];\n\nfunction highlightShapesInSelectionRect(currentX, currentY) {\n // Clear previous highlights\n clearDragSelectHighlights();\n\n if (!multiSelectionStart) return;\n\n const selBounds = {\n x: Math.min(multiSelectionStart.x, currentX),\n y: Math.min(multiSelectionStart.y, currentY),\n width: Math.abs(currentX - multiSelectionStart.x),\n height: Math.abs(currentY - multiSelectionStart.y)\n };\n\n // Minimum size check to avoid highlighting on click\n if (selBounds.width < 5 && selBounds.height < 5) return;\n\n if (typeof shapes !== 'undefined') {\n shapes.forEach(shape => {\n if (isShapeInSelectionRect(shape, selBounds)) {\n // Add a semi-transparent overlay to the shape's group\n if (shape.group && typeof shape.group.getBBox === 'function') {\n let bbox;\n try { bbox = shape.group.getBBox(); } catch { return; }\n const overlay = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n overlay.setAttribute('x', bbox.x - 2);\n overlay.setAttribute('y', bbox.y - 2);\n overlay.setAttribute('width', bbox.width + 4);\n overlay.setAttribute('height', bbox.height + 4);\n overlay.setAttribute('fill', 'rgba(91, 87, 209, 0.12)');\n overlay.setAttribute('stroke', '#5B57D1');\n overlay.setAttribute('stroke-width', '1');\n overlay.setAttribute('stroke-opacity', '0.4');\n overlay.setAttribute('rx', '3');\n overlay.setAttribute('style', 'pointer-events: none;');\n overlay.setAttribute('class', 'drag-select-highlight');\n shape.group.appendChild(overlay);\n dragSelectHighlights.push(overlay);\n }\n }\n });\n }\n}\n\nfunction clearDragSelectHighlights() {\n dragSelectHighlights.forEach(el => {\n if (el.parentNode) el.parentNode.removeChild(el);\n });\n dragSelectHighlights = [];\n}\n\nfunction isShapeInSelectionRect(shape, selectionBounds) {\n let shapeBounds;\n\n switch (shape.shapeName) {\n case 'rectangle':\n shapeBounds = {\n x: shape.x,\n y: shape.y,\n width: shape.width,\n height: shape.height\n };\n break;\n case 'circle':\n shapeBounds = {\n x: shape.x - shape.rx,\n y: shape.y - shape.ry,\n width: shape.rx * 2,\n height: shape.ry * 2\n };\n break;\n case 'line':\n shapeBounds = {\n x: Math.min(shape.startPoint.x, shape.endPoint.x),\n y: Math.min(shape.startPoint.y, shape.endPoint.y),\n width: Math.abs(shape.endPoint.x - shape.startPoint.x),\n height: Math.abs(shape.endPoint.y - shape.startPoint.y)\n };\n break;\n case 'arrow':\n const minX = Math.min(shape.startPoint.x, shape.endPoint.x);\n const minY = Math.min(shape.startPoint.y, shape.endPoint.y);\n const maxX = Math.max(shape.startPoint.x, shape.endPoint.x);\n const maxY = Math.max(shape.startPoint.y, shape.endPoint.y);\n shapeBounds = {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY\n };\n break;\n case 'freehandStroke':\n shapeBounds = {\n x: shape.x,\n y: shape.y,\n width: shape.width,\n height: shape.height\n };\n break;\n case 'text':\n case 'code':\n const textOrCodeEl = shape.group ? shape.group.querySelector('text') : null;\n if (textOrCodeEl && shape.group.style.display !== 'none') {\n try {\n const bbox = textOrCodeEl.getBBox();\n const transform = shape.group.transform.baseVal.consolidate();\n const matrix = transform ? transform.matrix : { e: 0, f: 0 };\n shapeBounds = {\n x: bbox.x + matrix.e,\n y: bbox.y + matrix.f,\n width: bbox.width,\n height: bbox.height\n };\n } catch {\n shapeBounds = { x: 0, y: 0, width: 0, height: 0 };\n }\n } else {\n shapeBounds = { x: 0, y: 0, width: 0, height: 0 };\n }\n break;\n case 'image':\n if (shape.element) {\n shapeBounds = {\n x: parseFloat(shape.element.getAttribute('x')),\n y: parseFloat(shape.element.getAttribute('y')),\n width: parseFloat(shape.element.getAttribute('width')),\n height: parseFloat(shape.element.getAttribute('height'))\n };\n } else {\n shapeBounds = { x: shape.x, y: shape.y, width: shape.width, height: shape.height };\n }\n break;\n case 'frame':\n shapeBounds = {\n x: shape.x,\n y: shape.y,\n width: shape.width,\n height: shape.height\n };\n break;\n case 'icon':\n shapeBounds = {\n x: shape.x,\n y: shape.y,\n width: shape.width,\n height: shape.height\n };\n break;\n default:\n shapeBounds = {\n x: shape.x || 0,\n y: shape.y || 0,\n width: shape.width || 0,\n height: shape.height || 0\n };\n }\n\n return !(selectionBounds.x > shapeBounds.x + shapeBounds.width ||\n selectionBounds.x + selectionBounds.width < shapeBounds.x ||\n selectionBounds.y > shapeBounds.y + shapeBounds.height ||\n selectionBounds.y + selectionBounds.height < shapeBounds.y);\n}\n\nclass MultiSelection {\n constructor() {\n this.selectedShapes = new Set();\n this.group = null;\n this.anchors = [];\n this.outline = null;\n this.rotationAnchor = null;\n this.rotationLine = null;\n this.selectionPadding = 12;\n this.bounds = null;\n this.initialPositions = new Map();\n\n this.isDragging = false;\n this.isResizing = false;\n this.isRotating = false;\n this.resizingAnchorIndex = null;\n this.dragStart = { x: 0, y: 0 };\n this.rotationCenter = { x: 0, y: 0 };\n this.startRotationMouseAngle = 0;\n this._undoSnapshots = new Map(); // Stores initial state for undo tracking\n this.initialRotation = 0;\n }\n\n // Capture current state of all selected shapes for undo\n _snapshotForUndo() {\n this._undoSnapshots.clear();\n this.selectedShapes.forEach(shape => {\n this._undoSnapshots.set(shape, this._captureShapeState(shape));\n });\n }\n\n _captureShapeState(shape) {\n switch (shape.shapeName) {\n case 'line':\n case 'arrow':\n return {\n startPoint: { ...shape.startPoint },\n endPoint: { ...shape.endPoint },\n x: shape.x, y: shape.y,\n width: shape.width || 0, height: shape.height || 0,\n rotation: shape.rotation || 0\n };\n case 'circle':\n return { x: shape.x, y: shape.y, rx: shape.rx, ry: shape.ry, rotation: shape.rotation || 0, width: shape.width, height: shape.height };\n case 'freehandStroke':\n return { x: shape.x, y: shape.y, width: shape.width, height: shape.height, rotation: shape.rotation || 0, points: JSON.parse(JSON.stringify(shape.points)) };\n default:\n return { x: shape.x || 0, y: shape.y || 0, width: shape.width || 0, height: shape.height || 0, rotation: shape.rotation || 0 };\n }\n }\n\n // Push undo actions for all shapes that changed\n _pushUndoForAll() {\n this.selectedShapes.forEach(shape => {\n const oldState = this._undoSnapshots.get(shape);\n if (!oldState) return;\n const newState = this._captureShapeState(shape);\n // Check if anything actually changed\n const changed = Object.keys(oldState).some(key => {\n if (key === 'points' || key === 'startPoint' || key === 'endPoint') return JSON.stringify(oldState[key]) !== JSON.stringify(newState[key]);\n return oldState[key] !== newState[key];\n });\n if (changed) {\n pushTransformAction(shape, oldState, newState);\n }\n });\n this._undoSnapshots.clear();\n }\n\n addShape(shape) {\n this.selectedShapes.add(shape);\n shape.isSelected = true;\n this.updateControls();\n }\n\n removeShape(shape) {\n this.selectedShapes.delete(shape);\n shape.isSelected = false;\n if (this.selectedShapes.size === 0) {\n this.clearSelection();\n } else {\n this.updateControls();\n }\n }\n\n clearSelection() {\n this.selectedShapes.forEach(shape => {\n shape.isSelected = false;\n if (typeof shape.removeSelection === 'function') {\n shape.removeSelection();\n }\n });\n this.selectedShapes.clear();\n this.removeControls();\n if (typeof currentShape !== 'undefined') {\n currentShape = null;\n }\n if (typeof disableAllSideBars === 'function') {\n disableAllSideBars();\n }\n }\n\n selectShapesInRect(selectionBounds) {\n this.clearSelection();\n\n if (typeof shapes !== 'undefined') {\n shapes.forEach(shape => {\n if (isShapeInSelectionRect(shape, selectionBounds)) {\n this.addShape(shape);\n }\n });\n }\n\n if (this.selectedShapes.size === 1) {\n if (typeof currentShape !== 'undefined') {\n currentShape = Array.from(this.selectedShapes)[0];\n }\n } else {\n if (typeof currentShape !== 'undefined') {\n currentShape = null;\n }\n }\n }\n\n getBounds() {\n if (this.selectedShapes.size === 0) return null;\n\n let minX = Infinity, minY = Infinity;\n let maxX = -Infinity, maxY = -Infinity;\n\n this.selectedShapes.forEach(shape => {\n const shapeBounds = this.getShapeBounds(shape);\n minX = Math.min(minX, shapeBounds.x);\n minY = Math.min(minY, shapeBounds.y);\n maxX = Math.max(maxX, shapeBounds.x + shapeBounds.width);\n maxY = Math.max(maxY, shapeBounds.y + shapeBounds.height);\n });\n\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY\n };\n }\n\n getShapeBounds(shape) {\n switch (shape.shapeName) {\n case 'rectangle':\n case 'frame':\n return {\n x: shape.x,\n y: shape.y,\n width: shape.width,\n height: shape.height\n };\n case 'circle':\n return {\n x: shape.x - shape.rx,\n y: shape.y - shape.ry,\n width: shape.rx * 2,\n height: shape.ry * 2\n };\n case 'line':\n case 'arrow':\n return {\n x: Math.min(shape.startPoint.x, shape.endPoint.x),\n y: Math.min(shape.startPoint.y, shape.endPoint.y),\n width: Math.abs(shape.endPoint.x - shape.startPoint.x),\n height: Math.abs(shape.endPoint.y - shape.startPoint.y)\n };\n case 'freehandStroke':\n return {\n x: shape.x,\n y: shape.y,\n width: shape.width,\n height: shape.height\n };\n case 'text':\n const textElement = shape.group ? shape.group.querySelector('text') : null;\n if (textElement) {\n const bbox = textElement.getBBox();\n const transform = shape.group.transform.baseVal.consolidate();\n const matrix = transform ? transform.matrix : { e: 0, f: 0 };\n return {\n x: bbox.x + matrix.e,\n y: bbox.y + matrix.f,\n width: bbox.width,\n height: bbox.height\n };\n }\n return { x: 0, y: 0, width: 0, height: 0 };\n case 'image':\n if (shape.element) {\n return {\n x: parseFloat(shape.element.getAttribute('x')),\n y: parseFloat(shape.element.getAttribute('y')),\n width: parseFloat(shape.element.getAttribute('width')),\n height: parseFloat(shape.element.getAttribute('height'))\n };\n }\n return { x: shape.x, y: shape.y, width: shape.width, height: shape.height };\n case 'icon':\n return {\n x: shape.x,\n y: shape.y,\n width: shape.width,\n height: shape.height\n };\n default:\n return {\n x: shape.x || 0,\n y: shape.y || 0,\n width: shape.width || 0,\n height: shape.height || 0\n };\n }\n }\n\n updateControls() {\n this.removeControls();\n if (this.selectedShapes.size === 0) return;\n\n this.bounds = this.getBounds();\n if (!this.bounds) return;\n\n this.createControls();\n }\n\n createControls() {\n this.createRotatedControls(0);\n }\n\n createOutline(x, y, width, height) {\n const zoom = window.currentZoom || 1;\n const outlinePoints = [\n [x, y],\n [x + width, y],\n [x + width, y + height],\n [x, y + height],\n [x, y]\n ];\n\n this.outline = document.createElementNS('http://www.w3.org/2000/svg', 'polyline');\n this.outline.setAttribute('points', outlinePoints.map(p => p.join(',')).join(' '));\n this.outline.setAttribute('fill', 'none');\n this.outline.setAttribute('stroke', '#5B57D1');\n this.outline.setAttribute('stroke-width', 2);\n this.outline.setAttribute('stroke-dasharray', `${8 / zoom} ${4 / zoom}`);\n this.outline.setAttribute('vector-effect', 'non-scaling-stroke');\n this.outline.setAttribute('style', 'pointer-events: none;');\n this.group.appendChild(this.outline);\n }\n\n createResizeAnchors(x, y, width, height) {\n const zoom = window.currentZoom || 1;\n const anchorSize = 12 / zoom;\n const anchorPositions = [\n { x: x, y: y, index: 0 },\n { x: x + width, y: y, index: 1 },\n { x: x, y: y + height, index: 2 },\n { x: x + width, y: y + height, index: 3 },\n { x: x + width / 2, y: y, index: 4 },\n { x: x + width / 2, y: y + height, index: 5 },\n { x: x, y: y + height / 2, index: 6 },\n { x: x + width, y: y + height / 2, index: 7 }\n ];\n\n this.anchors = [];\n anchorPositions.forEach((pos) => {\n const anchor = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n anchor.setAttribute('x', pos.x - anchorSize / 2);\n anchor.setAttribute('y', pos.y - anchorSize / 2);\n anchor.setAttribute('width', anchorSize);\n anchor.setAttribute('height', anchorSize);\n anchor.setAttribute('class', 'multi-selection-anchor');\n anchor.setAttribute('data-index', pos.index);\n anchor.setAttribute('fill', '#121212');\n anchor.setAttribute('stroke', '#5B57D1');\n anchor.setAttribute('stroke-width', 2);\n anchor.setAttribute('vector-effect', 'non-scaling-stroke');\n anchor.setAttribute('style', 'pointer-events: all; cursor: pointer;');\n\n const cursors = ['nw-resize', 'ne-resize', 'sw-resize', 'se-resize', 'n-resize', 's-resize', 'w-resize', 'e-resize'];\n anchor.style.cursor = cursors[pos.index];\n\n anchor.addEventListener('pointerdown', (e) => this.startResize(e, pos.index));\n\n this.group.appendChild(anchor);\n this.anchors.push(anchor);\n });\n }\n\n createRotationAnchor(x, y, width, height) {\n const zoom = window.currentZoom || 1;\n const rotationAnchorPos = { x: x + width / 2, y: y - 30 / zoom };\n\n this.rotationAnchor = document.createElementNS('http://www.w3.org/2000/svg', 'circle');\n this.rotationAnchor.setAttribute('cx', rotationAnchorPos.x);\n this.rotationAnchor.setAttribute('cy', rotationAnchorPos.y);\n this.rotationAnchor.setAttribute('r', 8 / zoom);\n this.rotationAnchor.setAttribute('class', 'multi-selection-rotation-anchor');\n this.rotationAnchor.setAttribute('fill', '#121212');\n this.rotationAnchor.setAttribute('stroke', '#5B57D1');\n this.rotationAnchor.setAttribute('stroke-width', 2);\n this.rotationAnchor.setAttribute('vector-effect', 'non-scaling-stroke');\n this.rotationAnchor.setAttribute('style', 'pointer-events: all; cursor: grab;');\n\n this.rotationAnchor.addEventListener('pointerdown', (e) => this.startRotation(e));\n\n this.rotationLine = document.createElementNS('http://www.w3.org/2000/svg', 'line');\n this.rotationLine.setAttribute('x1', rotationAnchorPos.x);\n this.rotationLine.setAttribute('y1', rotationAnchorPos.y);\n this.rotationLine.setAttribute('x2', x + width / 2);\n this.rotationLine.setAttribute('y2', y);\n this.rotationLine.setAttribute('stroke', '#5B57D1');\n this.rotationLine.setAttribute('stroke-width', 1);\n this.rotationLine.setAttribute('stroke-dasharray', `${3 / zoom} ${3 / zoom}`);\n this.rotationLine.setAttribute('vector-effect', 'non-scaling-stroke');\n this.rotationLine.setAttribute('style', 'pointer-events: none;');\n\n this.group.appendChild(this.rotationLine);\n this.group.appendChild(this.rotationAnchor);\n registerRotationAnchor(this.rotationAnchor, {\n radius: 8,\n edgeY: y,\n line: this.rotationLine,\n lineEnd: '1',\n });\n }\n\n removeControls() {\n if (this.group && this.group.parentNode) {\n this.group.parentNode.removeChild(this.group);\n }\n this.group = null;\n this.anchors = [];\n this.outline = null;\n this.rotationAnchor = null;\n this.rotationLine = null;\n }\n\n isPointInBounds(x, y) {\n if (!this.bounds) return false;\n\n const padding = this.selectionPadding;\n return x >= this.bounds.x - padding && x <= this.bounds.x + this.bounds.width + padding &&\n y >= this.bounds.y - padding && y <= this.bounds.y + this.bounds.height + padding;\n }\n\n move(dx, dy) {\n this.selectedShapes.forEach(shape => {\n // Skip shapes whose parent frame is also selected \u2014 the frame's move()\n // will already move them, so moving them independently causes double-move offset\n if (shape.parentFrame && this.selectedShapes.has(shape.parentFrame)) {\n return;\n }\n\n if (typeof shape.move === 'function') {\n shape.move(dx, dy);\n }\n\n if (typeof shape.updateAttachedArrows === 'function') {\n shape.updateAttachedArrows();\n }\n });\n\n this.updateControls();\n}\n\n startRotation(e) {\n e.stopPropagation();\n e.preventDefault();\n\n this.isRotating = true;\n\n const currentBounds = this.getBounds();\n this.rotationCenter = {\n x: currentBounds.x + currentBounds.width / 2,\n y: currentBounds.y + currentBounds.height / 2\n };\n\n const { x: mouseX, y: mouseY } = getSVGCoordsFromMouse(e);\n this.startRotationMouseAngle = Math.atan2(mouseY - this.rotationCenter.y, mouseX - this.rotationCenter.x) * 180 / Math.PI;\n\n this.storeInitialPositions();\n\n // Snapshot for undo tracking\n this._snapshotForUndo();\n\n const onMouseMove = (event) => {\n if (this.isRotating) {\n this.handleRotation(event);\n }\n };\n\n const onMouseUp = () => {\n this.isRotating = false;\n this.initialPositions.clear();\n\n // Push undo for all rotated shapes\n this._pushUndoForAll();\n\n if (typeof svg !== 'undefined') {\n svg.removeEventListener('pointermove', onMouseMove);\n svg.removeEventListener('pointerup', onMouseUp);\n svg.style.cursor = 'default';\n }\n };\n\n if (typeof svg !== 'undefined') {\n svg.addEventListener('pointermove', onMouseMove);\n svg.addEventListener('pointerup', onMouseUp);\n svg.style.cursor = 'grabbing';\n }\n }\n\n storeInitialPositions() {\n this.initialPositions.clear();\n\n const initialBounds = this.getBounds();\n this.initialPositions.set('initialBounds', {\n x: initialBounds.x,\n y: initialBounds.y,\n width: initialBounds.width,\n height: initialBounds.height\n });\n\n this.selectedShapes.forEach(shape => {\n let shapeData;\n\n let shapeCenterX, shapeCenterY;\n\n switch (shape.shapeName) {\n case 'rectangle':\n case 'frame':\n shapeCenterX = shape.x + shape.width / 2;\n shapeCenterY = shape.y + shape.height / 2;\n shapeData = {\n x: shape.x,\n y: shape.y,\n width: shape.width || 0,\n height: shape.height || 0,\n rotation: shape.rotation || 0,\n centerX: shapeCenterX,\n centerY: shapeCenterY,\n relativeX: shapeCenterX - this.rotationCenter.x,\n relativeY: shapeCenterY - this.rotationCenter.y\n };\n break;\n case 'icon':\n shapeCenterX = shape.x + shape.width / 2;\n shapeCenterY = shape.y + shape.height / 2;\n shapeData = {\n x: shape.x,\n y: shape.y,\n width: shape.width || 0,\n height: shape.height || 0,\n rotation: shape.rotation || 0,\n centerX: shapeCenterX,\n centerY: shapeCenterY,\n relativeX: shapeCenterX - this.rotationCenter.x,\n relativeY: shapeCenterY - this.rotationCenter.y\n };\n break;\n\n case 'circle':\n shapeCenterX = shape.x;\n shapeCenterY = shape.y;\n shapeData = {\n x: shape.x,\n y: shape.y,\n rx: shape.rx || 0,\n ry: shape.ry || 0,\n rotation: shape.rotation || 0,\n centerX: shapeCenterX,\n centerY: shapeCenterY,\n relativeX: shapeCenterX - this.rotationCenter.x,\n relativeY: shapeCenterY - this.rotationCenter.y\n };\n break;\n\n case 'line':\n case 'arrow':\n shapeData = {\n startPoint: { ...shape.startPoint },\n endPoint: { ...shape.endPoint },\n relativeStartX: shape.startPoint.x - this.rotationCenter.x,\n relativeStartY: shape.startPoint.y - this.rotationCenter.y,\n relativeEndX: shape.endPoint.x - this.rotationCenter.x,\n relativeEndY: shape.endPoint.y - this.rotationCenter.y\n };\n break;\n\n case 'freehandStroke':\n if (!shape.points || !Array.isArray(shape.points) || shape.points.length === 0) {\n console.warn('FreehandStroke has invalid points array');\n return;\n }\n\n const validPoints = shape.points.filter(point =>\n Array.isArray(point) &&\n point.length >= 2 &&\n typeof point[0] === 'number' &&\n typeof point[1] === 'number' &&\n !isNaN(point[0]) &&\n !isNaN(point[1])\n );\n\n if (validPoints.length === 0) {\n console.warn('FreehandStroke has no valid points');\n return;\n }\n\n if (typeof shape.updateBoundingBox === 'function') {\n shape.updateBoundingBox();\n }\n\n const boundingBox = this.getShapeBounds(shape);\n\n shapeData = {\n x: boundingBox.x || 0,\n y: boundingBox.y || 0,\n width: boundingBox.width || 0,\n height: boundingBox.height || 0,\n points: validPoints.map(point => [point[0], point[1], point[2] || 0.5]),\n relativePoints: validPoints.map(point => [\n point[0] - this.rotationCenter.x,\n point[1] - this.rotationCenter.y,\n point[2] || 0.5\n ]),\n boundingBox: { ...boundingBox }\n };\n break;\n\n case 'text':\n const textBounds = this.getShapeBounds(shape);\n shapeCenterX = textBounds.x + textBounds.width / 2;\n shapeCenterY = textBounds.y + textBounds.height / 2;\n\n const currentTransform = shape.group.transform.baseVal.consolidate();\n const currentX = currentTransform ? currentTransform.matrix.e : 0;\n const currentY = currentTransform ? currentTransform.matrix.f : 0;\n\n shapeData = {\n x: currentX,\n y: currentY,\n width: shape.width || textBounds.width,\n height: shape.height || textBounds.height,\n rotation: shape.rotation || 0,\n centerX: shapeCenterX,\n centerY: shapeCenterY,\n relativeX: shapeCenterX - this.rotationCenter.x,\n relativeY: shapeCenterY - this.rotationCenter.y,\n visualBounds: textBounds,\n transformX: currentX,\n transformY: currentY\n };\n break;\n\n case 'image':\n shapeCenterX = shape.x + (shape.width || 0) / 2;\n shapeCenterY = shape.y + (shape.height || 0) / 2;\n shapeData = {\n x: shape.x || 0,\n y: shape.y || 0,\n width: shape.width || 0,\n height: shape.height || 0,\n rotation: shape.rotation || 0,\n centerX: shapeCenterX,\n centerY: shapeCenterY,\n relativeX: shapeCenterX - this.rotationCenter.x,\n relativeY: shapeCenterY - this.rotationCenter.y\n };\n break;\n\n default:\n shapeCenterX = (shape.x || 0) + (shape.width || 0) / 2;\n shapeCenterY = (shape.y || 0) + (shape.height || 0) / 2;\n shapeData = {\n x: shape.x || 0,\n y: shape.y || 0,\n width: shape.width || 0,\n height: shape.height || 0,\n rotation: shape.rotation || 0,\n centerX: shapeCenterX,\n centerY: shapeCenterY,\n relativeX: shapeCenterX - this.rotationCenter.x,\n relativeY: shapeCenterY - this.rotationCenter.y\n };\n }\n\n if (shapeData) {\n this.initialPositions.set(shape, shapeData);\n }\n });\n }\n\n handleRotation(e) {\n const { x: mouseX, y: mouseY } = getSVGCoordsFromMouse(e);\n const currentMouseAngle = Math.atan2(mouseY - this.rotationCenter.y, mouseX - this.rotationCenter.x) * 180 / Math.PI;\n const angleDiff = currentMouseAngle - this.startRotationMouseAngle;\n const angleRad = angleDiff * Math.PI / 180;\n const cosAngle = Math.cos(angleRad);\n const sinAngle = Math.sin(angleRad);\n\n this.selectedShapes.forEach(shape => {\n const initialData = this.initialPositions.get(shape);\n if (!initialData) return;\n\n if (typeof shape.removeSelection === 'function') {\n shape.removeSelection();\n }\n\n switch (shape.shapeName) {\n case 'rectangle':\n case 'frame':\n case 'image':\n case 'icon':\n const newCenterX = this.rotationCenter.x + (initialData.relativeX * cosAngle - initialData.relativeY * sinAngle);\n const newCenterY = this.rotationCenter.y + (initialData.relativeX * sinAngle + initialData.relativeY * cosAngle);\n\n shape.x = newCenterX - initialData.width / 2;\n shape.y = newCenterY - initialData.height / 2;\n shape.rotation = (initialData.rotation || 0) + angleDiff;\n\n if (typeof shape.rotate === 'function') {\n shape.rotate(shape.rotation);\n }\n if (typeof shape.draw === 'function') {\n shape.draw();\n }\n break;\n\n case 'text':\n const newTextCenterX = this.rotationCenter.x + (initialData.relativeX * cosAngle - initialData.relativeY * sinAngle);\n const newTextCenterY = this.rotationCenter.y + (initialData.relativeX * sinAngle + initialData.relativeY * cosAngle);\n\n const textElement = shape.group.querySelector('text');\n if (textElement) {\n const initialBbox = initialData.visualBounds;\n\n const newTransformX = newTextCenterX - initialBbox.width / 2;\n const newTransformY = newTextCenterY - initialBbox.height / 2;\n\n const newRotation = (initialData.rotation || 0) + angleDiff;\n\n const textCenterX = initialBbox.width / 2;\n const textCenterY = initialBbox.height / 2;\n\n shape.group.setAttribute('transform',\n `translate(${newTransformX}, ${newTransformY}) rotate(${newRotation}, ${textCenterX}, ${textCenterY})`\n );\n\n shape.x = newTransformX;\n shape.y = newTransformY;\n shape.rotation = newRotation;\n }\n\n if (typeof shape.draw === 'function') {\n shape.draw();\n }\n break;\n\n case 'circle':\n const newCircleCenterX = this.rotationCenter.x + (initialData.relativeX * cosAngle - initialData.relativeY * sinAngle);\n const newCircleCenterY = this.rotationCenter.y + (initialData.relativeX * sinAngle + initialData.relativeY * cosAngle);\n\n shape.x = newCircleCenterX;\n shape.y = newCircleCenterY;\n shape.rotation = (initialData.rotation || 0) + angleDiff;\n\n if (typeof shape.rotate === 'function') {\n shape.rotate(shape.rotation);\n }\n if (typeof shape.draw === 'function') {\n shape.draw();\n }\n break;\n\n case 'line':\n case 'arrow':\n const newStartX = this.rotationCenter.x + (initialData.relativeStartX * cosAngle - initialData.relativeStartY * sinAngle);\n const newStartY = this.rotationCenter.y + (initialData.relativeStartX * sinAngle + initialData.relativeStartY * cosAngle);\n const newEndX = this.rotationCenter.x + (initialData.relativeEndX * cosAngle - initialData.relativeEndY * sinAngle);\n const newEndY = this.rotationCenter.y + (initialData.relativeEndX * sinAngle + initialData.relativeEndY * cosAngle);\n\n shape.startPoint.x = newStartX;\n shape.startPoint.y = newStartY;\n shape.endPoint.x = newEndX;\n shape.endPoint.y = newEndY;\n\n if (shape.shapeName === 'arrow' && shape.arrowCurved && typeof shape.initializeCurveControlPoints === 'function') {\n shape.initializeCurveControlPoints();\n }\n if (typeof shape.draw === 'function') {\n shape.draw();\n }\n break;\n\n case 'freehandStroke':\n if (!initialData.relativePoints || !Array.isArray(initialData.relativePoints)) {\n console.warn('FreehandStroke missing valid relativePoints');\n break;\n }\n\n const rotatedPoints = initialData.relativePoints.map(relPoint => {\n if (!Array.isArray(relPoint) || relPoint.length < 2 ||\n typeof relPoint[0] !== 'number' || typeof relPoint[1] !== 'number' ||\n isNaN(relPoint[0]) || isNaN(relPoint[1])) {\n console.warn('Invalid relative point:', relPoint);\n return [0, 0, 0.5];\n }\n\n const newX = this.rotationCenter.x + (relPoint[0] * cosAngle - relPoint[1] * sinAngle);\n const newY = this.rotationCenter.y + (relPoint[0] * sinAngle + relPoint[1] * cosAngle);\n\n if (isNaN(newX) || isNaN(newY)) {\n console.warn('Generated NaN coordinates:', { newX, newY, relPoint, rotationCenter: this.rotationCenter });\n return [0, 0, 0.5];\n }\n\n return [newX, newY, relPoint[2] || 0.5];\n });\n\n shape.points = rotatedPoints.filter(point =>\n Array.isArray(point) &&\n point.length >= 2 &&\n typeof point[0] === 'number' &&\n typeof point[1] === 'number' &&\n !isNaN(point[0]) &&\n !isNaN(point[1])\n );\n\n if (shape.points.length === 0) {\n console.warn('No valid points after rotation');\n shape.points = [[0, 0, 0.5]];\n }\n\n if (typeof shape.updateBoundingBox === 'function') {\n shape.updateBoundingBox();\n }\n if (typeof shape.draw === 'function') {\n shape.draw();\n }\n break;\n }\n\n if (typeof shape.updateAttachedArrows === 'function') {\n shape.updateAttachedArrows();\n }\n });\n\n this.updateControlsAfterRotation();\n }\n\n updateControlsAfterRotation() {\n this.removeControls();\n if (this.selectedShapes.size === 0) return;\n\n this.bounds = this.getBounds();\n\n if (!this.bounds) {\n return;\n }\n\n this.createControls();\n }\n\n\ncreateRotatedControls(angleDiff = 0) {\n this.group = document.createElementNS('http://www.w3.org/2000/svg', 'g');\n this.group.setAttribute('id', 'multi-selection-controls');\n\n if (angleDiff !== 0) {\n const centerX = this.bounds.x + this.bounds.width / 2;\n const centerY = this.bounds.y + this.bounds.height / 2;\n this.group.setAttribute('transform', `rotate(${angleDiff} ${centerX} ${centerY})`);\n }\n\n if (typeof svg !== 'undefined') {\n svg.appendChild(this.group);\n }\n\n // Draw faint individual outlines for each selected shape\n if (this.selectedShapes.size > 1) {\n this.selectedShapes.forEach(shape => {\n const b = this.getShapeBounds(shape);\n if (!b || b.width === 0 && b.height === 0) return;\n const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n rect.setAttribute('x', b.x - 3);\n rect.setAttribute('y', b.y - 3);\n rect.setAttribute('width', b.width + 6);\n rect.setAttribute('height', b.height + 6);\n rect.setAttribute('fill', 'none');\n rect.setAttribute('stroke', '#5B57D1');\n rect.setAttribute('stroke-width', 1);\n rect.setAttribute('stroke-opacity', 0.35);\n rect.setAttribute('stroke-dasharray', '4 3');\n rect.setAttribute('rx', 3);\n rect.setAttribute('style', 'pointer-events: none;');\n this.group.appendChild(rect);\n });\n }\n\n const expandedX = this.bounds.x - this.selectionPadding;\n const expandedY = this.bounds.y - this.selectionPadding;\n const expandedWidth = this.bounds.width + 2 * this.selectionPadding;\n const expandedHeight = this.bounds.height + 2 * this.selectionPadding;\n\n this.createOutline(expandedX, expandedY, expandedWidth, expandedHeight);\n this.createResizeAnchors(expandedX, expandedY, expandedWidth, expandedHeight);\n this.createRotationAnchor(expandedX, expandedY, expandedWidth, expandedHeight);\n}\n\n startResize(e, anchorIndex) {\n e.stopPropagation();\n e.preventDefault();\n\n this.isResizing = true;\n this.resizingAnchorIndex = anchorIndex;\n\n // Snapshot for undo tracking\n this._snapshotForUndo();\n\n this.initialPositions.clear();\n const initialBounds = this.getBounds();\n\n this.selectedShapes.forEach(shape => {\n let shapeData;\n shape.removeSelection();\n switch (shape.shapeName) {\n case 'rectangle':\n case 'icon': \n shapeData = {\n x: shape.x,\n y: shape.y,\n width: shape.width,\n height: shape.height,\n rotation: shape.rotation\n };\n break;\n case 'circle':\n shapeData = {\n x: shape.x,\n y: shape.y,\n rx: shape.rx,\n ry: shape.ry,\n rotation: shape.rotation\n };\n break;\n case 'line':\n case 'arrow':\n shapeData = {\n startPoint: { ...shape.startPoint },\n endPoint: { ...shape.endPoint }\n };\n break;\n default:\n shapeData = {\n x: shape.x || 0,\n y: shape.y || 0,\n width: shape.width || 0,\n height: shape.height || 0\n };\n }\n this.initialPositions.set(shape, shapeData);\n });\n\n this.initialPositions.set('bounds', initialBounds);\n\n const onMouseMove = (event) => {\n if (this.isResizing) {\n this.handleResize(event);\n }\n };\n\n const onMouseUp = () => {\n this.isResizing = false;\n this.resizingAnchorIndex = null;\n this.initialPositions.clear();\n\n // Push undo for all resized shapes\n this._pushUndoForAll();\n\n if (typeof svg !== 'undefined') {\n svg.removeEventListener('pointermove', onMouseMove);\n svg.removeEventListener('pointerup', onMouseUp);\n svg.style.cursor = 'default';\n }\n };\n\n if (typeof svg !== 'undefined') {\n svg.addEventListener('pointermove', onMouseMove);\n svg.addEventListener('pointerup', onMouseUp);\n }\n }\n\n handleResize(e) {\n const { x: mouseX, y: mouseY } = getSVGCoordsFromMouse(e);\n const initialBounds = this.initialPositions.get('bounds');\n if (!initialBounds) return;\n\n let scaleX = 1, scaleY = 1;\n let newBounds = { ...initialBounds };\n\n switch (this.resizingAnchorIndex) {\n case 0:\n scaleX = (initialBounds.x + initialBounds.width - mouseX) / initialBounds.width;\n scaleY = (initialBounds.y + initialBounds.height - mouseY) / initialBounds.height;\n newBounds.x = mouseX;\n newBounds.y = mouseY;\n newBounds.width = initialBounds.x + initialBounds.width - mouseX;\n newBounds.height = initialBounds.y + initialBounds.height - mouseY;\n break;\n case 1:\n scaleX = (mouseX - initialBounds.x) / initialBounds.width;\n scaleY = (initialBounds.y + initialBounds.height - mouseY) / initialBounds.height;\n newBounds.y = mouseY;\n newBounds.width = mouseX - initialBounds.x;\n newBounds.height = initialBounds.y + initialBounds.height - mouseY;\n break;\n case 2:\n scaleX = (initialBounds.x + initialBounds.width - mouseX) / initialBounds.width;\n scaleY = (mouseY - initialBounds.y) / initialBounds.height;\n newBounds.x = mouseX;\n newBounds.width = initialBounds.x + initialBounds.width - mouseX;\n newBounds.height = mouseY - initialBounds.y;\n break;\n case 3:\n scaleX = (mouseX - initialBounds.x) / initialBounds.width;\n scaleY = (mouseY - initialBounds.y) / initialBounds.height;\n newBounds.width = mouseX - initialBounds.x;\n newBounds.height = mouseY - initialBounds.y;\n break;\n case 4:\n scaleY = (initialBounds.y + initialBounds.height - mouseY) / initialBounds.height;\n newBounds.y = mouseY;\n newBounds.height = initialBounds.y + initialBounds.height - mouseY;\n break;\n case 5:\n scaleY = (mouseY - initialBounds.y) / initialBounds.height;\n newBounds.height = mouseY - initialBounds.y;\n break;\n case 6:\n scaleX = (initialBounds.x + initialBounds.width - mouseX) / initialBounds.width;\n newBounds.x = mouseX;\n newBounds.width = initialBounds.x + initialBounds.width - mouseX;\n break;\n case 7:\n scaleX = (mouseX - initialBounds.x) / initialBounds.width;\n newBounds.width = mouseX - initialBounds.x;\n break;\n }\n\n scaleX = Math.max(0.1, Math.abs(scaleX));\n scaleY = Math.max(0.1, Math.abs(scaleY));\n\n this.selectedShapes.forEach(shape => {\n const initialData = this.initialPositions.get(shape);\n if (!initialData) return;\n\n switch (shape.shapeName) {\n case 'rectangle':\n case 'icon':\n const relX = (initialData.x - initialBounds.x) / initialBounds.width;\n const relY = (initialData.y - initialBounds.y) / initialBounds.height;\n const relW = initialData.width / initialBounds.width;\n const relH = initialData.height / initialBounds.height;\n\n shape.x = newBounds.x + relX * newBounds.width;\n shape.y = newBounds.y + relY * newBounds.height;\n shape.width = relW * newBounds.width;\n shape.height = relH * newBounds.height;\n shape._skipAnchors = true;\n shape.draw();\n shape._skipAnchors = false;\n break;\n\n case 'circle':\n const relXCircle = (initialData.x - initialBounds.x) / initialBounds.width;\n const relYCircle = (initialData.y - initialBounds.y) / initialBounds.height;\n\n shape.x = newBounds.x + relXCircle * newBounds.width;\n shape.y = newBounds.y + relYCircle * newBounds.height;\n shape.rx = initialData.rx * scaleX;\n shape.ry = initialData.ry * scaleY;\n shape._skipAnchors = true;\n shape.draw();\n shape._skipAnchors = false;\n break;\n\n case 'line':\n case 'arrow':\n const relStartX = (initialData.startPoint.x - initialBounds.x) / initialBounds.width;\n const relStartY = (initialData.startPoint.y - initialBounds.y) / initialBounds.height;\n const relEndX = (initialData.endPoint.x - initialBounds.x) / initialBounds.width;\n const relEndY = (initialData.endPoint.y - initialBounds.y) / initialBounds.height;\n\n shape.startPoint.x = newBounds.x + relStartX * newBounds.width;\n shape.startPoint.y = newBounds.y + relStartY * newBounds.height;\n shape.endPoint.x = newBounds.x + relEndX * newBounds.width;\n shape.endPoint.y = newBounds.y + relEndY * newBounds.height;\n\n if (shape.shapeName === 'arrow' && shape.arrowCurved) {\n if (typeof shape.initializeCurveControlPoints === 'function') {\n shape.initializeCurveControlPoints();\n }\n }\n shape.draw();\n break;\n\n default:\n const relXDefault = (initialData.x - initialBounds.x) / initialBounds.width;\n const relYDefault = (initialData.y - initialBounds.y) / initialBounds.height;\n const relWDefault = initialData.width / initialBounds.width;\n const relHDefault = initialData.height / initialBounds.height;\n\n shape.x = newBounds.x + relXDefault * newBounds.width;\n shape.y = newBounds.y + relYDefault * newBounds.height;\n if (shape.width !== undefined) shape.width = relWDefault * newBounds.width;\n if (shape.height !== undefined) shape.height = relHDefault * newBounds.height;\n\n if (typeof shape.draw === 'function') {\n shape._skipAnchors = true;\n shape.draw();\n shape._skipAnchors = false;\n }\n }\n\n if (typeof shape.updateAttachedArrows === 'function') {\n shape.updateAttachedArrows();\n }\n });\n\n this.updateControls();\n }\n\n startDrag(e) {\n this.isDragging = true;\n isDraggingMultiSelection = true;\n const { x, y } = getSVGCoordsFromMouse(e);\n this.dragStart = { x, y };\n\n // Snapshot for undo tracking\n this._snapshotForUndo();\n\n this.initialPositions.clear();\n this.selectedShapes.forEach(shape => {\n let shapeData;\n shape.removeSelection();\n switch (shape.shapeName) {\n case 'rectangle':\n case 'icon':\n shapeData = {\n x: shape.x,\n y: shape.y,\n width: shape.width,\n height: shape.height,\n rotation: shape.rotation\n };\n break;\n case 'circle':\n shapeData = {\n x: shape.x,\n y: shape.y,\n rx: shape.rx,\n ry: shape.ry,\n rotation: shape.rotation\n };\n break;\n case 'line':\n case 'arrow':\n shapeData = {\n startPoint: { ...shape.startPoint },\n endPoint: { ...shape.endPoint }\n };\n break;\n default:\n shapeData = {\n x: shape.x || 0,\n y: shape.y || 0,\n width: shape.width || 0,\n height: shape.height || 0,\n rotation: shape.rotation || 0\n };\n }\n this.initialPositions.set(shape, shapeData);\n });\n\n if (typeof svg !== 'undefined') {\n svg.style.cursor = 'move';\n }\n }\n\n handleDrag(e) {\n if (!this.isDragging) return;\n isDraggingMultiSelection = true;\n const { x, y } = getSVGCoordsFromMouse(e);\n let dx = x - this.dragStart.x;\n let dy = y - this.dragStart.y;\n\n // Shift-constrain: lock to horizontal or vertical axis\n if (e.shiftKey) {\n if (Math.abs(dx) > Math.abs(dy)) {\n dy = 0;\n } else {\n dx = 0;\n }\n }\n\n this.move(dx, dy);\n\n // Snap guides for multi-selection\n if (window.__sketchStoreApi && window.__sketchStoreApi.getState().snapToObjects) {\n const bounds = this.getBounds();\n if (bounds) {\n // Create a virtual shape representing the multi-selection bounding box\n const virtualShape = {\n shapeName: 'rectangle',\n x: bounds.x,\n y: bounds.y,\n width: bounds.width,\n height: bounds.height,\n };\n const snap = calculateSnap(virtualShape, e.shiftKey, e.clientX, e.clientY);\n if (snap.dx || snap.dy) {\n this.move(snap.dx, snap.dy);\n }\n }\n } else {\n clearSnapGuides();\n }\n\n this.dragStart = { x: x, y: y };\n }\n\n endDrag() {\n if (!this.isDragging) return;\n isDraggingMultiSelection = false;\n this.isDragging = false;\n\n // Clear snap guides on drag end\n clearSnapGuides();\n\n // Finalize freehand stroke moves (bake transform offset into points)\n this.selectedShapes.forEach(shape => {\n if (typeof shape.finalizeMove === 'function') {\n shape.finalizeMove();\n }\n // Restore isSelected flag (startDrag's removeSelection clears it)\n shape.isSelected = true;\n });\n\n // Re-parent any selected shape that now sits inside a different frame\n // (Issue #22, bug #9). The per-tool drag handlers (rectangleTool, etc.)\n // do this for single-shape drags, but a multi-selection drag bypassed\n // them and left the shape geometrically inside the frame yet logically\n // outside its child list.\n if (typeof shapes !== 'undefined' && Array.isArray(shapes)) {\n this.selectedShapes.forEach(shape => {\n if (!shape || shape.shapeName === 'frame') return;\n // Find the deepest frame whose bounds contain the shape after the drag.\n let target = null;\n for (let i = shapes.length - 1; i >= 0; i--) {\n const f = shapes[i];\n if (f.shapeName !== 'frame') continue;\n if (this.selectedShapes.has(f)) continue; // moving with us \u2014 skip\n if (typeof f.isShapeInFrame === 'function' && f.isShapeInFrame(shape)) {\n target = f;\n break;\n }\n }\n const current = shape.parentFrame || null;\n if (target === current) return;\n if (current && typeof current.removeShapeFromFrame === 'function') {\n current.removeShapeFromFrame(shape);\n }\n if (target && typeof target.addShapeToFrame === 'function') {\n target.addShapeToFrame(shape);\n if (typeof pushFrameAttachmentAction === 'function') {\n pushFrameAttachmentAction(target, shape, 'attach', current);\n }\n } else if (current && typeof pushFrameAttachmentAction === 'function') {\n pushFrameAttachmentAction(current, shape, 'detach', current);\n }\n });\n }\n\n this.initialPositions.clear();\n\n // Push undo for all moved shapes\n this._pushUndoForAll();\n\n // Refresh bounds and controls after finalizeMove may have changed positions\n this.updateControls();\n\n if (typeof svg !== 'undefined') {\n svg.style.cursor = 'default';\n }\n }\n}\n\nconst multiSelection = new MultiSelection();\n\nfunction selectShapesInRect(selectionBounds) {\n multiSelection.selectShapesInRect(selectionBounds);\n}\n\nfunction clearAllSelections() {\n multiSelection.clearSelection();\n}\n\nfunction getMultiSelectionBounds() {\n return multiSelection.getBounds();\n}\n\nfunction createMultiSelectionControls() {\n multiSelection.updateControls();\n}\n\nfunction removeMultiSelectionControls() {\n multiSelection.removeControls();\n}\n\nfunction isPointInMultiSelection(x, y) {\n return multiSelection.isPointInBounds(x, y);\n}\n\nfunction moveSelectedShapes(dx, dy) {\n multiSelection.move(dx, dy);\n}\n\nfunction handleMultiSelectionMouseDown(e) {\n if (!e.target) return false;\n const { x, y } = getSVGCoordsFromMouse(e);\n\n // Only handle multi-selection operations if we have multiple shapes selected\n if (multiSelection.selectedShapes.size > 1) {\n const anchor = e.target.closest('.multi-selection-anchor');\n if (anchor) {\n const anchorIndex = parseInt(anchor.getAttribute('data-index'));\n multiSelection.startResize(e, anchorIndex);\n return true;\n }\n\n if (e.target.closest('.multi-selection-rotation-anchor')) {\n multiSelection.startRotation(e);\n return true;\n }\n\n // Check if clicking on any shape that's part of the selection\n let clickedOnSelectedShape = null;\n for (const shape of multiSelection.selectedShapes) {\n if (shape.contains && shape.contains(x, y)) {\n clickedOnSelectedShape = shape;\n break;\n }\n }\n if (clickedOnSelectedShape) {\n // Ctrl+Click: toggle shape out of multi-selection\n if (e.ctrlKey || e.metaKey) {\n multiSelection.removeShape(clickedOnSelectedShape);\n return true;\n }\n multiSelection.startDrag(e);\n return true;\n }\n\n // Click is within the multi-selection bounding box but not directly on a shape \u2014\n // still start dragging the group (prevents accidental deselection)\n if (multiSelection.isPointInBounds(x, y)) {\n multiSelection.startDrag(e);\n return true;\n }\n\n // Click is outside the selection bounds \u2014 fall through to deselect / start new selection\n }\n\n // Check if clicking on individual shape anchors - let them handle it\n if (e.target.closest('.anchor') || e.target.closest('.rotate-anchor') || e.target.closest('.rotation-anchor')) {\n return false; // Let individual shape handlers manage their own anchors\n }\n\n // Check if clicking on any shape \u2014 prioritise non-frame shapes so that\n // shapes inside frames (text, icons, etc.) can still be selected/interacted with.\n let clickedOnShape = false;\n let clickedShape = null;\n if (typeof shapes !== 'undefined') {\n // Prefer the actual SVG event target. This remains exact regardless\n // of pan/zoom and also covers shapes whose visual bounds come from a\n // foreignObject or imported SVG rather than simple geometry.\n for (let i = shapes.length - 1; i >= 0; i--) {\n const shape = shapes[i];\n const element = shape?.group || shape?.element;\n if (element && (element === e.target || element.contains?.(e.target))) {\n clickedOnShape = true;\n clickedShape = shape;\n break;\n }\n }\n\n let fallbackFrame = null;\n for (let i = shapes.length - 1; !clickedOnShape && i >= 0; i--) {\n const shape = shapes[i];\n if (shape.contains && shape.contains(x, y)) {\n if (shape.shapeName === 'frame') {\n // Pick the smallest (most specific/innermost) frame\n if (!fallbackFrame) {\n fallbackFrame = shape;\n } else {\n const area = (shape.width || 0) * (shape.height || 0);\n const existingArea = (fallbackFrame.width || 0) * (fallbackFrame.height || 0);\n if (area < existingArea) {\n fallbackFrame = shape;\n }\n }\n } else {\n clickedOnShape = true;\n clickedShape = shape;\n break;\n }\n }\n }\n // If no non-frame shape was found, use the smallest frame\n if (!clickedOnShape && fallbackFrame) {\n clickedOnShape = true;\n clickedShape = fallbackFrame;\n }\n }\n\n // If clicking on a shape\n if (clickedOnShape && clickedShape) {\n // Ctrl+click: toggle shape in/out of multi-selection\n if (e.ctrlKey || e.metaKey) {\n if (multiSelection.selectedShapes.has(clickedShape)) {\n multiSelection.removeShape(clickedShape);\n } else {\n // If there's a current individually-selected shape, add it to multi-selection first\n if (currentShape && currentShape !== clickedShape && !multiSelection.selectedShapes.has(currentShape)) {\n multiSelection.addShape(currentShape);\n if (typeof currentShape.removeSelection === 'function') currentShape.removeSelection();\n }\n multiSelection.addShape(clickedShape);\n }\n currentShape = null;\n return true;\n }\n\n // If the clicked shape is part of the multi-selection, start dragging instead of clearing\n if (multiSelection.selectedShapes.size > 1 && multiSelection.selectedShapes.has(clickedShape)) {\n multiSelection.startDrag(e);\n return true;\n }\n\n // If it's the same shape that's already selected, let individual handlers manage it\n if (currentShape === clickedShape) {\n // Clear any other multi-selected shapes so only this one remains selected\n if (multiSelection.selectedShapes.size > 0) {\n multiSelection.clearSelection();\n }\n return false; // Let individual shape handlers manage their own interactions\n }\n\n // Normal click (no Ctrl): deselect everything and select only the clicked shape\n if (currentShape && typeof currentShape.removeSelection === 'function') {\n currentShape.removeSelection();\n }\n\n // Clear multi-selection\n multiSelection.clearSelection();\n\n // \u2500\u2500 Group expansion \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // If the clicked shape is part of a group, select ALL of its\n // group-mates as a multi-selection instead of single-selecting.\n // Subsequent drag/resize/rotate then operates on the whole group\n // via the existing multi-selection plumbing.\n if (clickedShape.groupId && typeof shapes !== 'undefined') {\n const mates = shapes.filter(s => s.groupId === clickedShape.groupId);\n if (mates.length > 1) {\n for (const m of mates) multiSelection.addShape(m);\n currentShape = null;\n multiSelection.startDrag(e);\n return true;\n }\n }\n\n // Set new current shape\n currentShape = clickedShape;\n\n // Trigger the shape's own selection handling\n if (typeof clickedShape.addAnchors === 'function') {\n clickedShape.addAnchors();\n clickedShape.isSelected = true;\n } else if (typeof clickedShape.createSelection === 'function') {\n clickedShape.createSelection();\n clickedShape.isSelected = true;\n } else if (typeof clickedShape.selectShape === 'function') {\n clickedShape.selectShape();\n clickedShape.isSelected = true;\n } else if (typeof clickedShape.selectFrame === 'function') {\n clickedShape.selectFrame();\n }\n\n // Update sidebar if function exists\n if (typeof clickedShape.updateSidebar === 'function') {\n clickedShape.updateSidebar();\n }\n\n return false; // Let individual handlers also process for drag setup\n }\n\n // If not clicking on a shape, deselect everything and start multi-selection\n if (!clickedOnShape) {\n // Deselect current individual shape\n if (typeof currentShape !== 'undefined' && currentShape && typeof currentShape.removeSelection === 'function') {\n currentShape.removeSelection();\n currentShape = null;\n }\n // Also deselect any active text editor (textTool's selectedElement)\n if (window.__deselectTextElement) {\n window.__deselectTextElement();\n }\n if (typeof disableAllSideBars === 'function') {\n disableAllSideBars();\n }\n \n multiSelectionStart = { x, y };\n isMultiSelecting = true;\n // Prevent native text selection during drag-select\n if (typeof svg !== 'undefined') {\n svg.style.userSelect = 'none';\n svg.style.webkitUserSelect = 'none';\n }\n document.body.style.userSelect = 'none';\n document.body.style.webkitUserSelect = 'none';\n createMultiSelectionRect(x, y);\n clearAllSelections();\n return true;\n }\n\n return false;\n}\n\nfunction handleMultiSelectionMouseMove(e) {\n const { x, y } = getSVGCoordsFromMouse(e);\n\n if (multiSelection.isDragging) {\n multiSelection.handleDrag(e);\n return true;\n }\n\n if (multiSelection.isResizing) {\n multiSelection.handleResize(e);\n return true;\n }\n\n if (multiSelection.isRotating) {\n multiSelection.handleRotation(e);\n return true;\n }\n\n if (isMultiSelecting) {\n updateMultiSelectionRect(x, y);\n // Live highlight shapes that fall within the selection rectangle\n highlightShapesInSelectionRect(x, y);\n return true;\n }\n\n if (multiSelection.selectedShapes.size > 1 && multiSelection.isPointInBounds(x, y)) {\n if (typeof svg !== 'undefined') {\n svg.style.cursor = 'move';\n }\n return true;\n }\n\n // Show move cursor when hovering over any shape in selection mode\n if (typeof shapes !== 'undefined' && Array.isArray(shapes)) {\n const overShape = shapes.some(shape => {\n if (typeof shape.contains === 'function') {\n return shape.contains(x, y);\n }\n return false;\n });\n if (overShape && typeof svg !== 'undefined') {\n svg.style.cursor = 'move';\n return false;\n }\n }\n\n if (typeof svg !== 'undefined' && svg.style.cursor === 'move') {\n svg.style.cursor = 'default';\n }\n\n return false;\n}\n\nfunction handleMultiSelectionMouseUp(e) {\n if (multiSelection.isDragging) {\n multiSelection.endDrag();\n return true;\n }\n\n if (multiSelection.isResizing) {\n multiSelection.isResizing = false;\n multiSelection.resizingAnchorIndex = null;\n multiSelection.initialPositions.clear();\n multiSelection._pushUndoForAll();\n multiSelection.updateControls();\n return true;\n }\n\n if (multiSelection.isRotating) {\n multiSelection.isRotating = false;\n multiSelection.initialPositions.clear();\n multiSelection._pushUndoForAll();\n return true;\n }\n\n if (isMultiSelecting) {\n const { x, y } = getSVGCoordsFromMouse(e);\n\n const selectionBounds = {\n x: Math.min(multiSelectionStart.x, x),\n y: Math.min(multiSelectionStart.y, y),\n width: Math.abs(x - multiSelectionStart.x),\n height: Math.abs(y - multiSelectionStart.y)\n };\n\n if (selectionBounds.width > 5 && selectionBounds.height > 5) {\n let shapesInBounds = [];\n if (typeof shapes !== 'undefined') {\n shapes.forEach(shape => {\n if (isShapeInSelectionRect(shape, selectionBounds)) {\n shapesInBounds.push(shape);\n }\n });\n }\n\n if (shapesInBounds.length === 1) {\n const selectedShape = shapesInBounds[0];\n multiSelection.clearSelection();\n\n if (typeof currentShape !== 'undefined') {\n currentShape = selectedShape;\n }\n\n if (typeof selectedShape.addAnchors === 'function') {\n selectedShape.addAnchors();\n selectedShape.isSelected = true;\n } else if (typeof selectedShape.createSelection === 'function') {\n selectedShape.createSelection();\n selectedShape.isSelected = true;\n } else if (typeof selectedShape.selectShape === 'function') {\n selectedShape.selectShape();\n selectedShape.isSelected = true;\n }\n\n if (typeof selectedShape.updateSidebar === 'function') {\n selectedShape.updateSidebar();\n }\n } else if (shapesInBounds.length > 1) {\n multiSelection.selectShapesInRect(selectionBounds);\n }\n }\n\n removeMultiSelectionRect();\n isMultiSelecting = false;\n isDraggingMultiSelection = false;\n // Restore text selection after drag-select\n document.body.style.userSelect = '';\n document.body.style.webkitUserSelect = '';\n if (typeof svg !== 'undefined') {\n svg.style.userSelect = '';\n svg.style.webkitUserSelect = '';\n }\n return true;\n }\n\n // Safety cleanup - always reset flags on mouse up\n isMultiSelecting = false;\n isDraggingMultiSelection = false;\n document.body.style.userSelect = '';\n document.body.style.webkitUserSelect = '';\n if (typeof svg !== 'undefined') {\n svg.style.userSelect = '';\n svg.style.webkitUserSelect = '';\n }\n return false;\n}\n\n\n// Safety net: clean up selection rect if mouse is released outside the SVG\nwindow.addEventListener('pointerup', () => {\n if (isMultiSelecting) {\n removeMultiSelectionRect();\n isMultiSelecting = false;\n isDraggingMultiSelection = false;\n document.body.style.userSelect = '';\n document.body.style.webkitUserSelect = '';\n }\n});\n\n// Delete key support for multi-selection\ndocument.addEventListener('keydown', (e) => {\n if ((e.key === 'Delete' || e.key === 'Backspace') && multiSelection.selectedShapes.size > 0) {\n // Don't delete if user is typing in an input\n const tag = e.target.tagName.toLowerCase();\n if (tag === 'input' || tag === 'textarea' || e.target.isContentEditable) return;\n e.preventDefault();\n deleteSelectedShapes();\n }\n});\n\nfunction deleteSelectedShapes() {\n if (multiSelection.selectedShapes.size === 0) return;\n\n const shapesToDelete = Array.from(multiSelection.selectedShapes);\n multiSelection.clearSelection();\n\n // Issue #24 bug #3: when deleting a (regular, non-diagram) frame, its\n // children are released back to the canvas \u2014 capture them here so we\n // can re-select them and drop the user into the pointer tool. Diagram\n // frames destroy their children together, so we skip those.\n const releasedChildren = [];\n\n shapesToDelete.forEach(shape => {\n const isFrame = shape.shapeName === 'frame';\n const isDiagramFrame = isFrame && !!shape._diagramType;\n\n // Issue #24 bug #7: for a regular (non-diagram) frame, we don't\n // want destroy() \u2014 it empties containedShapes and tears down the\n // clipGroup, leaving nothing for undo to rehydrate. Instead:\n // 1. snapshot the children references (for the undo action),\n // 2. release each child visually back to the svg root,\n // 3. detach the frame's <g>, clipGroup, clipPath from DOM.\n // The frame JS object stays alive in the undo action's `shape`\n // reference; on undo, the UndoRedo branch re-appends clipGroup +\n // clipPath and re-attaches each child via addShapeToFrame.\n let childSnapshot = null;\n if (isFrame && !isDiagramFrame) {\n childSnapshot = [...(shape.containedShapes || [])];\n for (const child of childSnapshot) {\n if (!child || child === shape) continue;\n const el = child.group || child.element;\n if (el) {\n if (shape.clipGroup && el.parentNode === shape.clipGroup) {\n shape.clipGroup.removeChild(el);\n }\n if (window.svg && el.parentNode !== window.svg) window.svg.appendChild(el);\n }\n child.parentFrame = null;\n delete child.isBeingMovedByFrame;\n releasedChildren.push(child);\n }\n\n // Clear containedShapes \u2014 undo will repopulate via\n // addShapeToFrame, which short-circuits on an existing entry.\n shape.containedShapes = [];\n\n // Detach the frame's own DOM bits \u2014 but keep the JS object\n // and its clipGroup/clipPath references intact for undo.\n if (shape.group && shape.group.parentNode) shape.group.parentNode.removeChild(shape.group);\n if (shape.clipGroup && shape.clipGroup.parentNode) shape.clipGroup.parentNode.removeChild(shape.clipGroup);\n if (shape.clipPath && shape.clipPath.parentNode) shape.clipPath.parentNode.removeChild(shape.clipPath);\n } else {\n // Non-frame OR diagram frame: standard delete path.\n if (shape.group && shape.group.parentNode) {\n shape.group.parentNode.removeChild(shape.group);\n } else if (shape.element && shape.element.parentNode) {\n shape.element.parentNode.removeChild(shape.element);\n }\n if (shape.parentFrame && typeof shape.parentFrame.removeShapeFromFrame === 'function') {\n shape.parentFrame.removeShapeFromFrame(shape);\n }\n cleanupAttachments(shape);\n if (isDiagramFrame && typeof shape.destroy === 'function') {\n shape.destroy();\n }\n }\n\n // Remove from shapes array\n const idx = shapes.indexOf(shape);\n if (idx !== -1) shapes.splice(idx, 1);\n\n // Issue #24 bug #7: record the delete on the undo stack. Without\n // this the user can't undo a multi-selection delete at all \u2014\n // the action just disappears. For frames we attach the child\n // snapshot so undo can re-attach them.\n try {\n if (childSnapshot) {\n pushDeleteAction(shape, { childSnapshot });\n } else {\n pushDeleteAction(shape);\n }\n } catch (err) {\n console.warn('[deleteSelectedShapes] pushDeleteAction failed:', err);\n }\n });\n\n // Bug #3 follow-through: auto-select the released children and switch\n // to the pointer tool so the user can immediately keep manipulating\n // them. Skip if nothing was released (no frames deleted).\n if (releasedChildren.length > 0) {\n for (const child of releasedChildren) {\n if (shapes.indexOf(child) === -1) continue;\n multiSelection.addShape(child);\n }\n if (window.__sketchStoreApi && typeof window.__sketchStoreApi.setActiveTool === 'function') {\n window.__sketchStoreApi.setActiveTool('select');\n }\n }\n}\n\n/**\n * Create a frame around all currently multi-selected shapes.\n */\nfunction frameSelectedShapes() {\n if (multiSelection.selectedShapes.size < 2) return;\n\n const bounds = multiSelection.getBounds();\n if (!bounds) return;\n\n const padding = 20;\n const fx = bounds.x - padding;\n const fy = bounds.y - padding;\n const fw = bounds.width + padding * 2;\n const fh = bounds.height + padding * 2;\n\n // Import Frame class dynamically (it's on window from SketchEngine init)\n const FrameClass = window.Frame;\n if (!FrameClass) {\n console.warn('[Selection] Frame class not available');\n return;\n }\n\n const frame = new FrameClass(fx, fy, fw, fh);\n shapes.push(frame);\n\n // Push undo action for frame creation\n if (window.historyStack) {\n window.historyStack.push({\n type: window.ACTION_CREATE || 'create',\n shape: frame,\n shapeName: 'frame'\n });\n }\n\n // Add each selected shape into the frame\n const shapesToFrame = Array.from(multiSelection.selectedShapes);\n multiSelection.clearSelection();\n\n for (const shape of shapesToFrame) {\n frame.addShapeToFrame(shape);\n }\n\n // Reorder DOM: frame group should be behind the contained shapes\n const frameEl = frame.group;\n if (frameEl && frameEl.parentNode) {\n // Move frame before its first contained shape in the shapes array\n const frameIdx = shapes.indexOf(frame);\n if (frameIdx > 0) {\n shapes.splice(frameIdx, 1);\n // Find earliest contained shape index\n let earliest = shapes.length;\n for (const s of shapesToFrame) {\n const idx = shapes.indexOf(s);\n if (idx >= 0 && idx < earliest) earliest = idx;\n }\n shapes.splice(earliest, 0, frame);\n }\n }\n\n // Select the new frame\n if (typeof frame.selectFrame === 'function') {\n frame.selectFrame();\n }\n currentShape = frame;\n}\n\n// Expose for plain scripts (sketchGeneric.js is not a module)\nwindow.clearAllSelections = clearAllSelections;\nwindow.multiSelection = multiSelection;\nwindow.deleteSelectedShapes = deleteSelectedShapes;\nwindow.frameSelectedShapes = frameSelectedShapes;\n\nexport {\n handleMultiSelectionMouseDown,\n handleMultiSelectionMouseMove,\n handleMultiSelectionMouseUp,\n clearAllSelections,\n selectShapesInRect,\n createMultiSelectionControls,\n removeMultiSelectionControls,\n removeMultiSelectionRect,\n isPointInMultiSelection,\n moveSelectedShapes,\n multiSelection,\n isDraggingMultiSelection,\n isMultiSelecting\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/shapes/IconShape.js"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable */\n// IconShape class - extracted from icons.js\n// Depends on globals: svg, shapes\nimport { updateAttachedArrows as updateArrowsForShape, cleanupAttachments } from '../tools/arrowTool.js';\n\n// Module-level state shared with iconTool via window bridge\nlet isDragging = false;\nlet hoveredFrameIcon = null;\n\n// Expose setters so iconTool.js can sync these values\nwindow.__iconShapeState = {\n set isDragging(v) { isDragging = v; },\n get isDragging() { return isDragging; },\n set hoveredFrameIcon(v) { hoveredFrameIcon = v; },\n get hoveredFrameIcon() { return hoveredFrameIcon; },\n};\n\nfunction getSVGElement() {\n return document.getElementById('freehand-canvas');\n}\n\n// Delegate to iconTool's selectIcon via window bridge\nfunction selectIcon(event) {\n if (window.__iconToolSelectIcon) {\n window.__iconToolSelectIcon(event);\n }\n}\n\nclass IconShape {\n constructor(element) {\n this.element = element;\n this.shapeName = 'icon';\n this.shapeID = `icon-${String(Date.now()).slice(0, 8)}-${Math.floor(Math.random() * 10000)}`;\n this.type = 'icon';\n\n this.parentFrame = null;\n this.isDraggedOutTemporarily = false;\n\n this.element.setAttribute('type', 'icon');\n this.element.shapeID = this.shapeID;\n\n this.group = this.element;\n this.group.setAttribute('id', this.shapeID);\n }\n\n get x() {\n return parseFloat(this.element.getAttribute('x')) || 0;\n }\n\n set x(value) {\n this.element.setAttribute('x', value);\n this.element.setAttribute('data-shape-x', value);\n }\n\n get y() {\n return parseFloat(this.element.getAttribute('y')) || 0;\n }\n\n set y(value) {\n this.element.setAttribute('y', value);\n this.element.setAttribute('data-shape-y', value);\n }\n\n get width() {\n return parseFloat(this.element.getAttribute('width')) || 100;\n }\n\n set width(value) {\n this.element.setAttribute('width', value);\n this.element.setAttribute('data-shape-width', value);\n }\n\n get height() {\n return parseFloat(this.element.getAttribute('height')) || 100;\n }\n\n set height(value) {\n this.element.setAttribute('height', value);\n this.element.setAttribute('data-shape-height', value);\n }\n\n get rotation() {\n const dataRotation = this.element.getAttribute('data-shape-rotation');\n if (dataRotation) {\n return parseFloat(dataRotation);\n }\n\n const transform = this.element.getAttribute('transform');\n if (transform) {\n const rotateMatch = transform.match(/rotate\\(([^,\\s]+)/);\n if (rotateMatch) {\n return parseFloat(rotateMatch[1]);\n }\n }\n return 0;\n }\n\n set rotation(value) {\n this.element.setAttribute('data-shape-rotation', value);\n\n const vbWidth = parseFloat(this.element.getAttribute('data-viewbox-width')) || 24;\n const vbHeight = parseFloat(this.element.getAttribute('data-viewbox-height')) || 24;\n const scale = this.width / Math.max(vbWidth, vbHeight);\n const localCenterX = this.width / 2 / scale;\n const localCenterY = this.height / 2 / scale;\n\n this.element.setAttribute('transform', `translate(${this.x}, ${this.y}) scale(${scale}) rotate(${value}, ${localCenterX}, ${localCenterY})`);\n }\n\n move(dx, dy) {\n this.x += dx;\n this.y += dy;\n\n const vbWidth = parseFloat(this.element.getAttribute('data-viewbox-width')) || 24;\n const vbHeight = parseFloat(this.element.getAttribute('data-viewbox-height')) || 24;\n const scale = this.width / Math.max(vbWidth, vbHeight);\n const localCenterX = this.width / 2 / scale;\n const localCenterY = this.height / 2 / scale;\n\n this.element.setAttribute('transform', `translate(${this.x}, ${this.y}) scale(${scale}) rotate(${this.rotation}, ${localCenterX}, ${localCenterY})`);\n\n this.element.setAttribute('x', this.x);\n this.element.setAttribute('y', this.y);\n\n this.element.setAttribute('data-shape-x', this.x);\n this.element.setAttribute('data-shape-y', this.y);\n\n updateArrowsForShape(this);\n\n if (isDragging && !this.isBeingMovedByFrame) {\n this.updateFrameContainment();\n }\n }\n updateFrameContainment() {\n if (this.isBeingMovedByFrame) return;\n\n let targetFrame = null;\n\n if (typeof shapes !== 'undefined' && Array.isArray(shapes)) {\n shapes.forEach(shape => {\n if (shape.shapeName === 'frame' && shape.isShapeInFrame(this)) {\n targetFrame = shape;\n }\n });\n }\n\n if (this.parentFrame && isDragging) {\n this.parentFrame.temporarilyRemoveFromFrame(this);\n }\n\n if (hoveredFrameIcon && hoveredFrameIcon !== targetFrame) {\n hoveredFrameIcon.removeHighlight();\n }\n\n if (targetFrame && targetFrame !== hoveredFrameIcon) {\n targetFrame.highlightFrame();\n }\n\n hoveredFrameIcon = targetFrame;\n }\n\n contains(x, y) {\n const iconX = this.x;\n const iconY = this.y;\n const iconWidth = this.width;\n const iconHeight = this.height;\n\n return x >= iconX && x <= iconX + iconWidth && y >= iconY && y <= iconY + iconHeight;\n }\n\n updateAttachedArrows() {\n updateArrowsForShape(this);\n }\n\n draw() {\n const scale = this.width / 24;\n const localCenterX = this.width / 2 / scale;\n const localCenterY = this.height / 2 / scale;\n\n this.element.setAttribute('transform', `translate(${this.x}, ${this.y}) scale(${scale}) rotate(${this.rotation}, ${localCenterX}, ${localCenterY})`);\n\n this.element.setAttribute('data-shape-x', this.x);\n this.element.setAttribute('data-shape-y', this.y);\n this.element.setAttribute('data-shape-width', this.width);\n this.element.setAttribute('data-shape-height', this.height);\n this.element.setAttribute('data-shape-rotation', this.rotation);\n\n updateArrowsForShape(this);\n }\n\n removeSelection(params) {\n if (window.__iconToolRemoveSelection) {\n window.__iconToolRemoveSelection();\n }\n this.isSelected = false;\n }\n\n // Called by handleMultiSelectionMouseDown \u2014 same as selectShape\n addAnchors() {\n selectIcon({ target: this.element, stopPropagation: () => { } });\n }\n\n selectShape() {\n selectIcon({ target: this.element, stopPropagation: () => { } });\n }\n\n remove() {\n if (typeof shapes !== 'undefined' && Array.isArray(shapes)) {\n const idx = shapes.indexOf(this);\n if (idx !== -1) shapes.splice(idx, 1);\n }\n\n if (typeof cleanupAttachments === 'function') {\n cleanupAttachments(this.element);\n }\n\n if (this.parentFrame) {\n this.parentFrame.removeShapeFromFrame(this);\n }\n\n if (this.group && this.group.parentNode) {\n this.group.parentNode.removeChild(this.group);\n }\n }\n restore(pos) {\n const svg = getSVGElement();\n\n if (!this.group.parentNode && svg) {\n svg.appendChild(this.group);\n }\n\n if (typeof shapes !== 'undefined' && Array.isArray(shapes)) {\n if (shapes.indexOf(this) === -1) {\n shapes.push(this);\n }\n }\n\n this.x = pos.x;\n this.y = pos.y;\n this.width = pos.width;\n this.height = pos.height;\n this.rotation = pos.rotation;\n\n if (pos.parentFrame) {\n this.parentFrame = pos.parentFrame;\n pos.parentFrame.addShapeToFrame(this);\n }\n\n const scale = pos.width / 24;\n const localCenterX = pos.width / 2 / scale;\n const localCenterY = pos.height / 2 / scale;\n\n this.element.setAttribute('transform', `translate(${pos.x}, ${pos.y}) scale(${scale}) rotate(${pos.rotation}, ${localCenterX}, ${localCenterY})`);\n\n this.element.setAttribute('data-shape-x', pos.x);\n this.element.setAttribute('data-shape-y', pos.y);\n this.element.setAttribute('data-shape-width', pos.width);\n this.element.setAttribute('data-shape-height', pos.height);\n this.element.setAttribute('data-shape-rotation', pos.rotation);\n\n updateArrowsForShape(this);\n }\n}\n\nexport { IconShape };\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/core/UndoRedo.js"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable */\n// Undo/Redo system - copied from undoAndRedo.js\n\n// Stacks for undo/redo\nconst undoStack = [];\nconst redoStack = [];\n\n// Import references to text-related variables and functions\nlet selectedElement = null;\nlet updateSelectionFeedback = null;\nlet svg = null;\n\nfunction notifyCollaboration() {\n if (typeof window !== 'undefined' && typeof window.__collabSceneChanged === 'function') {\n window.__collabSceneChanged();\n }\n}\n\n// Function to set references from other modules\nexport function setTextReferences(element, updateFn, svgElement) {\n selectedElement = element;\n updateSelectionFeedback = updateFn;\n svg = svgElement;\n}\n\n// Function to get current selectedElement (called from other modules)\nexport function getCurrentSelectedElement() {\n return selectedElement;\n}\n\n// Function to update selectedElement reference (called from other modules)\nexport function updateSelectedElement(element) {\n selectedElement = element;\n}\n\n// Call this after creating a new shape (e.g., Rectangle)\nexport function pushCreateAction(shape) {\n undoStack.push({\n type: 'create',\n shape: shape\n });\n \n // Clear redo stack when new action is performed\n redoStack.length = 0;\n notifyCollaboration();\n}\n\nexport function pushDeleteAction(shape, meta = null) {\n // Issue #24 bug #7: when the deleted shape is a frame, the caller may\n // pass `meta.childSnapshot` \u2014 the contained shape REFERENCES at the\n // time of delete. The undo branch uses this to re-attach the children\n // when the frame is restored, instead of leaving an empty box.\n const action = { type: 'delete', shape };\n if (meta && meta.childSnapshot) action.childSnapshot = meta.childSnapshot;\n undoStack.push(action);\n\n // Clear redo stack when new action is performed\n redoStack.length = 0;\n notifyCollaboration();\n}\n\n// Enhanced delete action to clean up attached arrows\nexport function pushDeleteActionWithAttachments(shape) {\n let affectedArrows = [];\n \n // If deleting a text element, find all attached arrows\n if (shape.type === 'text' || shape.shapeName === 'text') {\n affectedArrows = shapes.filter(s => s.shapeName === 'arrow' && \n (s.attachedToStart?.shape === shape || s.attachedToEnd?.shape === shape))\n .map(arrow => ({\n arrow: arrow,\n oldAttachments: arrow.getAttachmentState(),\n oldPoints: {\n startPoint: { ...arrow.startPoint },\n endPoint: { ...arrow.endPoint }\n }\n }));\n }\n \n undoStack.push({\n type: 'delete',\n shape: shape,\n affectedArrows: affectedArrows\n });\n \n // Clear redo stack when new action is performed\n redoStack.length = 0;\n notifyCollaboration();\n}\n\nexport function pushFrameAttachmentAction(frame, shape, action, oldFrame = null) {\n undoStack.push({\n type: 'frameAttachment',\n frame: frame,\n shape: shape,\n action: action, // 'attach' or 'detach'\n oldFrame: oldFrame, // Previous frame if shape was moved between frames\n // Store shape position for potential restoration\n shapeState: {\n x: shape.x,\n y: shape.y,\n width: shape.width || 0,\n height: shape.height || 0,\n rotation: shape.rotation || 0\n }\n });\n \n // Clear redo stack when new action is performed\n redoStack.length = 0;\n notifyCollaboration();\n}\n\nexport function pushCreateActionWithAttachments(shape) {\n undoStack.push({\n type: 'create',\n shape: shape,\n // Store any arrows that might need to reattach when this is undone\n potentialAttachments: []\n });\n \n // Clear redo stack when new action is performed\n redoStack.length = 0;\n notifyCollaboration();\n}\n\nexport function pushTransformAction(shape, oldPos, newPos) {\n if (shape.shapeName === 'frame') {\n // Handle frame transformation with contained shapes\n const containedShapesStates = shape.containedShapes.map(containedShape => ({\n shape: containedShape,\n oldState: {\n x: containedShape.x - (newPos.x - oldPos.x),\n y: containedShape.y - (newPos.y - oldPos.y),\n width: containedShape.width || 0,\n height: containedShape.height || 0,\n rotation: containedShape.rotation || 0\n },\n newState: {\n x: containedShape.x,\n y: containedShape.y,\n width: containedShape.width || 0,\n height: containedShape.height || 0,\n rotation: containedShape.rotation || 0\n }\n }));\n\n undoStack.push({\n type: 'frameTransform',\n shape: shape,\n oldPos: {\n x: oldPos.x,\n y: oldPos.y,\n width: oldPos.width,\n height: oldPos.height,\n rotation: oldPos.rotation,\n frameName: oldPos.frameName || shape.frameName\n },\n newPos: {\n x: newPos.x,\n y: newPos.y,\n width: newPos.width,\n height: newPos.height,\n rotation: newPos.rotation,\n frameName: newPos.frameName || shape.frameName\n },\n containedShapes: containedShapesStates\n });\n } else if (shape.type === 'text') {\n // Enhanced text handling - also track frame attachment changes\n const currentFrame = shape.parentFrame || null;\n \n undoStack.push({\n type: 'transform',\n shape: shape,\n oldPos: {\n x: oldPos.x,\n y: oldPos.y,\n rotation: oldPos.rotation,\n fontSize: oldPos.fontSize\n },\n newPos: {\n x: newPos.x,\n y: newPos.y,\n rotation: newPos.rotation,\n fontSize: newPos.fontSize\n },\n // Track frame attachment state\n frameAttachment: {\n oldFrame: oldPos.parentFrame || null,\n newFrame: currentFrame\n },\n // Store affected arrows with their attachment states\n affectedArrows: shapes.filter(s => s.shapeName === 'arrow' && \n (s.attachedToStart?.shape === shape || s.attachedToEnd?.shape === shape))\n .map(arrow => ({\n arrow: arrow,\n oldAttachments: arrow.getAttachmentState(),\n oldPoints: {\n startPoint: { ...arrow.startPoint },\n endPoint: { ...arrow.endPoint }\n }\n }))\n });\n } else if (shape.type === 'image') {\n // Enhanced image handling - also track frame attachment changes\n const currentFrame = shape.parentFrame || null;\n \n undoStack.push({\n type: 'transform',\n shape: shape,\n oldPos: {\n x: oldPos.x,\n y: oldPos.y,\n width: oldPos.width,\n height: oldPos.height,\n rotation: oldPos.rotation\n },\n newPos: {\n x: newPos.x,\n y: newPos.y,\n width: newPos.width,\n height: newPos.height,\n rotation: newPos.rotation\n },\n // Track frame attachment state\n frameAttachment: {\n oldFrame: oldPos.parentFrame || null,\n newFrame: currentFrame\n },\n // Store affected arrows with their attachment states\n affectedArrows: shapes.filter(s => s.shapeName === 'arrow' && \n (s.attachedToStart?.shape === shape || s.attachedToEnd?.shape === shape))\n .map(arrow => ({\n arrow: arrow,\n oldAttachments: arrow.getAttachmentState(),\n oldPoints: {\n startPoint: { ...arrow.startPoint },\n endPoint: { ...arrow.endPoint }\n }\n }))\n });\n } else if (shape.shapeName === 'circle') {\n // Enhanced circle handling - also track frame attachment changes\n const currentFrame = shape.parentFrame || null;\n \n undoStack.push({\n type: 'transform',\n shape: shape,\n oldPos: {\n x: oldPos.x,\n y: oldPos.y,\n rx: oldPos.rx,\n ry: oldPos.ry,\n rotation: oldPos.rotation\n },\n newPos: {\n x: newPos.x,\n y: newPos.y,\n rx: newPos.rx,\n ry: newPos.ry,\n rotation: newPos.rotation\n },\n // Track frame attachment state\n frameAttachment: {\n oldFrame: oldPos.parentFrame || null,\n newFrame: currentFrame\n },\n // Store affected arrows with their attachment states\n affectedArrows: shapes.filter(s => s.shapeName === 'arrow' && \n (s.attachedToStart?.shape === shape || s.attachedToEnd?.shape === shape))\n .map(arrow => ({\n arrow: arrow,\n oldAttachments: arrow.getAttachmentState(),\n oldPoints: {\n startPoint: { ...arrow.startPoint },\n endPoint: { ...arrow.endPoint }\n }\n }))\n });\n } else if (shape.shapeName === \"rectangle\") {\n // Enhanced rectangle handling - also track frame attachment changes\n const currentFrame = shape.parentFrame || null;\n \n undoStack.push({\n type: 'transform',\n shape: shape,\n oldPos: { \n x: oldPos.x, \n y: oldPos.y, \n width: oldPos.width, \n height: oldPos.height, \n rotation: oldPos.rotation\n },\n newPos: { \n x: newPos.x, \n y: newPos.y, \n width: newPos.width, \n height: newPos.height, \n rotation: newPos.rotation\n },\n // Track frame attachment state\n frameAttachment: {\n oldFrame: oldPos.parentFrame || null,\n newFrame: currentFrame\n },\n // Store affected arrows with their attachment states\n affectedArrows: shapes.filter(s => s.shapeName === 'arrow' && \n (s.attachedToStart?.shape === shape || s.attachedToEnd?.shape === shape))\n .map(arrow => ({\n arrow: arrow,\n oldAttachments: arrow.getAttachmentState(),\n oldPoints: {\n startPoint: { ...arrow.startPoint },\n endPoint: { ...arrow.endPoint }\n }\n }))\n });\n } \n else if (shape.shapeName === 'line') {\n // Enhanced line handling with curve support\n const currentFrame = shape.parentFrame || null;\n \n undoStack.push({\n type: 'transform',\n shape: shape,\n oldPos: {\n startPoint: { x: oldPos.startPoint.x, y: oldPos.startPoint.y },\n endPoint: { x: oldPos.endPoint.x, y: oldPos.endPoint.y },\n controlPoint: oldPos.controlPoint ? { x: oldPos.controlPoint.x, y: oldPos.controlPoint.y } : null,\n isCurved: oldPos.isCurved || false\n },\n newPos: {\n startPoint: { x: newPos.startPoint.x, y: newPos.startPoint.y },\n endPoint: { x: newPos.endPoint.x, y: newPos.endPoint.y },\n controlPoint: newPos.controlPoint ? { x: newPos.controlPoint.x, y: newPos.controlPoint.y } : null,\n isCurved: newPos.isCurved || false\n },\n // Track frame attachment state\n frameAttachment: {\n oldFrame: oldPos.parentFrame || null,\n newFrame: currentFrame\n }\n });\n }\n else if (shape.shapeName === 'arrow') {\n // Handle arrow transform with attachment state\n undoStack.push({\n type: 'transform',\n shape: shape,\n oldPos: {\n startPoint: { x: oldPos.startPoint.x, y: oldPos.startPoint.y },\n endPoint: { x: oldPos.endPoint.x, y: oldPos.endPoint.y },\n controlPoint1: oldPos.controlPoint1 ? { x: oldPos.controlPoint1.x, y: oldPos.controlPoint1.y } : null,\n controlPoint2: oldPos.controlPoint2 ? { x: oldPos.controlPoint2.x, y: oldPos.controlPoint2.y } : null,\n attachments: oldPos.attachments || shape.getAttachmentState()\n },\n newPos: {\n startPoint: { x: newPos.startPoint.x, y: newPos.startPoint.y },\n endPoint: { x: newPos.endPoint.x, y: newPos.endPoint.y },\n controlPoint1: newPos.controlPoint1 ? { x: newPos.controlPoint1.x, y: newPos.controlPoint1.y } : null,\n controlPoint2: newPos.controlPoint2 ? { x: newPos.controlPoint2.x, y: newPos.controlPoint2.y } : null,\n attachments: newPos.attachments || shape.getAttachmentState()\n }\n });\n } \n else if (shape.type === 'icon') {\n // Enhanced icon handling - also track frame attachment changes\n const currentFrame = shape.parentFrame || null;\n \n undoStack.push({\n type: 'transform',\n shape: shape,\n oldPos: {\n x: oldPos.x,\n y: oldPos.y,\n width: oldPos.width,\n height: oldPos.height,\n rotation: oldPos.rotation\n },\n newPos: {\n x: newPos.x,\n y: newPos.y,\n width: newPos.width,\n height: newPos.height,\n rotation: newPos.rotation\n },\n // Track frame attachment state\n frameAttachment: {\n oldFrame: oldPos.parentFrame || null,\n newFrame: currentFrame\n },\n // Store affected arrows with their attachment states\n affectedArrows: shapes.filter(s => s.shapeName === 'arrow' && \n (s.attachedToStart?.shape === shape || s.attachedToEnd?.shape === shape))\n .map(arrow => ({\n arrow: arrow,\n oldAttachments: arrow.getAttachmentState(),\n oldPoints: {\n startPoint: { ...arrow.startPoint },\n endPoint: { ...arrow.endPoint }\n }\n }))\n });\n}\n else if (shape.shapeName === 'freehandStroke') {\n // Handle freehand stroke transform\n undoStack.push({\n type: 'transform',\n shape: shape,\n oldPos: {\n points: JSON.parse(JSON.stringify(oldPos.points)),\n rotation: oldPos.rotation\n },\n newPos: {\n points: JSON.parse(JSON.stringify(newPos.points)),\n rotation: newPos.rotation\n }\n });\n }\n \n // Clear redo stack when new action is performed\n redoStack.length = 0;\n notifyCollaboration();\n}\n\nexport function pushOptionsChangeAction(shape, oldOptions) {\n undoStack.push({\n type: 'optionsChange',\n shape: shape,\n oldOptions: oldOptions\n });\n \n // Clear redo stack when new action is performed\n redoStack.length = 0;\n notifyCollaboration();\n}\n\n// Issue #34 bug #4: refresh the multi-selection outline + handles so it\n// follows the reverted geometry. Without this the selection rect stays\n// pinned to the pre-undo coordinates and the user sees a ghost rect\n// floating away from the shapes it claims to wrap.\nfunction refreshSelectionAfterAction() {\n const ms = (typeof window !== 'undefined') ? window.multiSelection : null;\n if (!ms) return;\n if (typeof ms.updateControls !== 'function') return;\n if (!ms.selectedShapes || ms.selectedShapes.size === 0) return;\n try { ms.updateControls(); } catch (err) { console.warn('[UndoRedo] selection refresh failed:', err); }\n}\n\nexport function undo() {\n if (undoStack.length === 0) return;\n const action = undoStack.pop();\n try {\n if (action.type === 'frameTransform') {\n // Handle frame transformation undo\n action.shape.x = action.oldPos.x;\n action.shape.y = action.oldPos.y;\n action.shape.width = action.oldPos.width;\n action.shape.height = action.oldPos.height;\n action.shape.rotation = action.oldPos.rotation;\n action.shape.frameName = action.oldPos.frameName;\n \n // Restore contained shapes to their old positions\n action.containedShapes.forEach(shapeData => {\n const shape = shapeData.shape;\n shape.x = shapeData.oldState.x;\n shape.y = shapeData.oldState.y;\n shape.width = shapeData.oldState.width;\n shape.height = shapeData.oldState.height;\n shape.rotation = shapeData.oldState.rotation;\n \n if (typeof shape.draw === 'function') {\n shape.draw();\n }\n });\n \n action.shape.isSelected = false;\n if (typeof action.shape.removeSelection === 'function') action.shape.removeSelection();\n action.shape.draw();\n action.shape.updateClipPath();\n \n redoStack.push(action);\n return;\n }\n \n if (action.type === 'frameAttachment') {\n // Handle frame attachment/detachment undo WITHOUT calling the methods that track undo\n if (action.action === 'attach') {\n // Undo attach: manually remove shape from frame\n const frameIndex = action.frame.containedShapes.indexOf(action.shape);\n if (frameIndex > -1) {\n action.frame.containedShapes.splice(frameIndex, 1);\n action.shape.parentFrame = null;\n \n // Move shape back to main SVG\n if (action.shape.group && action.shape.group.parentNode === action.frame.clipGroup) {\n action.frame.clipGroup.removeChild(action.shape.group);\n svg.appendChild(action.shape.group);\n }\n }\n \n // If shape was moved from another frame, restore it there\n if (action.oldFrame) {\n action.oldFrame.containedShapes.push(action.shape);\n action.shape.parentFrame = action.oldFrame;\n \n // Move to old frame's clipped group\n if (action.shape.group && action.shape.group.parentNode === svg) {\n svg.removeChild(action.shape.group);\n action.oldFrame.clipGroup.appendChild(action.shape.group);\n }\n }\n } else if (action.action === 'detach') {\n // Undo detach: manually add shape back to frame\n if (!action.frame.containedShapes.includes(action.shape)) {\n action.frame.containedShapes.push(action.shape);\n action.shape.parentFrame = action.frame;\n \n // Move to frame's clipped group\n if (action.shape.group && action.shape.group.parentNode === svg) {\n svg.removeChild(action.shape.group);\n action.frame.clipGroup.appendChild(action.shape.group);\n }\n }\n }\n \n // Restore shape state\n action.shape.x = action.shapeState.x;\n action.shape.y = action.shapeState.y;\n action.shape.width = action.shapeState.width;\n action.shape.height = action.shapeState.height;\n action.shape.rotation = action.shapeState.rotation;\n \n if (typeof action.shape.draw === 'function') {\n action.shape.draw();\n }\n \n redoStack.push(action);\n return;\n }\n\n // Handle mode conversion undo (code \u2194 text)\n if (action.type === 'create' && action.shape.type === 'modeConvert') {\n // Undo: remove the new shape, restore the old shape\n const newShape = action.shape.newShape;\n const newElement = action.shape.newElement;\n const oldShape = action.shape.oldShape;\n const oldElement = action.shape.oldElement;\n\n // Remove new shape from DOM and shapes array\n if (newElement && newElement.parentNode) {\n newElement.parentNode.removeChild(newElement);\n }\n const newIdx = shapes.indexOf(newShape);\n if (newIdx !== -1) shapes.splice(newIdx, 1);\n\n // Restore old shape to DOM and shapes array\n if (svg && oldElement) {\n svg.appendChild(oldElement);\n }\n if (oldShape) {\n shapes.push(oldShape);\n }\n\n redoStack.push(action);\n return;\n }\n\n if (action.type === 'create') {\n if (action.shape.type === 'text') {\n // Handle text creation undo\n if (action.shape.element && action.shape.element.parentNode) {\n action.shape.element.parentNode.removeChild(action.shape.element);\n } else if (action.shape.parentNode) {\n action.shape.parentNode.removeChild(action.shape);\n }\n\n // Remove from shapes array\n const idx = shapes.indexOf(action.shape.element || action.shape);\n if (idx !== -1) shapes.splice(idx, 1);\n\n // Clean up any arrow attachments to this text\n if (typeof cleanupAttachments === 'function') {\n cleanupAttachments(action.shape.element || action.shape);\n }\n } else if (action.shape.type === 'image') {\n // Handle image creation undo\n action.shape.remove();\n } else if (action.shape.type === 'icon') {\n // Handle icon creation undo - call the remove method\n action.shape.remove();\n } else {\n // Handle other shape creation undo\n const idx = shapes.indexOf(action.shape);\n if (idx !== -1) shapes.splice(idx, 1);\n if (action.shape.group && action.shape.group.parentNode) {\n action.shape.group.parentNode.removeChild(action.shape.group);\n }\n \n // Handle frame cleanup\n if (action.shape.shapeName === 'frame') {\n action.shape.destroy();\n }\n }\n redoStack.push(action);\n return;\n}\n \n if (action.type === 'delete') {\n if (action.shape.type === 'text') {\n // Handle text deletion undo\n if (svg) {\n svg.appendChild(action.shape.element || action.shape);\n // Add back to shapes array\n shapes.push(action.shape.element || action.shape);\n }\n \n // Restore arrow attachments if any existed\n if (action.affectedArrows) {\n action.affectedArrows.forEach(arrowData => {\n const arrow = arrowData.arrow;\n // Restore the old attachment state\n arrow.restoreAttachmentState(arrowData.oldAttachments);\n });\n }\n } else if (action.shape.type === 'image') {\n // Handle image deletion undo\n action.shape.restore();\n } else {\n // Handle other shape deletion undo\n shapes.push(action.shape);\n if (svg) {\n svg.appendChild(action.shape.group);\n }\n\n // Issue #24 bug #7: rehydrate frame state. The delete path\n // orphaned the frame (removed <g>, clipGroup, clipPath from\n // DOM) but kept the JS object intact. Re-attach clipGroup +\n // clipPath, then re-parent every child from the snapshot via\n // addShapeToFrame. Skip children that were subsequently\n // deleted (they'll get re-added when their own delete action\n // is undone in turn).\n if (action.shape.shapeName === 'frame' && svg) {\n if (action.shape.clipGroup && !action.shape.clipGroup.parentNode) {\n svg.appendChild(action.shape.clipGroup);\n }\n if (action.shape.clipPath && !action.shape.clipPath.parentNode) {\n const defs = svg.querySelector('defs');\n if (defs) defs.appendChild(action.shape.clipPath);\n else svg.insertBefore(action.shape.clipPath, svg.firstChild);\n }\n if (action.childSnapshot && Array.isArray(action.childSnapshot)) {\n for (const child of action.childSnapshot) {\n if (!child) continue;\n if (shapes.indexOf(child) === -1) continue;\n if (typeof action.shape.addShapeToFrame === 'function') {\n action.shape.addShapeToFrame(child);\n }\n }\n }\n }\n }\n redoStack.push(action);\n return;\n }\n \n if (action.type === 'transform') {\n // Handle frame attachment changes first\n if (action.frameAttachment) {\n // Use manual frame operations to avoid undo recursion\n if (action.frameAttachment.newFrame) {\n const frameIndex = action.frameAttachment.newFrame.containedShapes.indexOf(action.shape);\n if (frameIndex > -1) {\n action.frameAttachment.newFrame.containedShapes.splice(frameIndex, 1);\n if (action.shape.group && action.shape.group.parentNode === action.frameAttachment.newFrame.clipGroup) {\n action.frameAttachment.newFrame.clipGroup.removeChild(action.shape.group);\n svg.appendChild(action.shape.group);\n }\n }\n }\n if (action.frameAttachment.oldFrame) {\n if (!action.frameAttachment.oldFrame.containedShapes.includes(action.shape)) {\n action.frameAttachment.oldFrame.containedShapes.push(action.shape);\n action.shape.parentFrame = action.frameAttachment.oldFrame;\n if (action.shape.group && action.shape.group.parentNode === svg) {\n svg.removeChild(action.shape.group);\n action.frameAttachment.oldFrame.clipGroup.appendChild(action.shape.group);\n }\n }\n } else {\n action.shape.parentFrame = null;\n }\n }\n \n if (action.shape.type === 'text') {\n // Enhanced text transform undo\n const textElement = (action.shape.element || action.shape).querySelector('text');\n if (textElement && action.oldPos.fontSize !== undefined) {\n textElement.setAttribute('font-size', action.oldPos.fontSize + 'px');\n }\n \n // Restore position and rotation\n const centerX = textElement ? textElement.getBBox().x + textElement.getBBox().width / 2 : 0;\n const centerY = textElement ? textElement.getBBox().y + textElement.getBBox().height / 2 : 0;\n \n (action.shape.element || action.shape).setAttribute('transform', \n `translate(${action.oldPos.x}, ${action.oldPos.y}) rotate(${action.oldPos.rotation}, ${centerX}, ${centerY})`\n );\n \n (action.shape.element || action.shape).setAttribute('data-x', action.oldPos.x);\n (action.shape.element || action.shape).setAttribute('data-y', action.oldPos.y);\n \n // Update attached arrows after text undo\n if (action.affectedArrows) {\n action.affectedArrows.forEach(arrowData => {\n const arrow = arrowData.arrow;\n // Restore arrow attachments to old state\n arrow.restoreAttachmentState(arrowData.oldAttachments);\n \n // Store current state for redo\n arrowData.newPoints = {\n startPoint: { ...arrow.startPoint },\n endPoint: { ...arrow.endPoint }\n };\n arrowData.newAttachments = arrow.getAttachmentState();\n });\n }\n \n // Update feedback if selected\n if (selectedElement === (action.shape.element || action.shape) && updateSelectionFeedback) {\n setTimeout(updateSelectionFeedback, 0);\n }\n } else if (action.shape.type === 'image') {\n // Enhanced image transform undo\n action.shape.restore(action.oldPos);\n \n // Update attached arrows after image undo\n if (action.affectedArrows) {\n action.affectedArrows.forEach(arrowData => {\n const arrow = arrowData.arrow;\n // Restore arrow attachments to old state\n arrow.restoreAttachmentState(arrowData.oldAttachments);\n \n // Store current state for redo\n arrowData.newPoints = {\n startPoint: { ...arrow.startPoint },\n endPoint: { ...arrow.endPoint }\n };\n arrowData.newAttachments = arrow.getAttachmentState();\n });\n }\n } else if (action.shape.shapeName === 'circle') {\n // Enhanced circle transform undo\n action.shape.x = action.oldPos.x;\n action.shape.y = action.oldPos.y;\n action.shape.rx = action.oldPos.rx;\n action.shape.ry = action.oldPos.ry;\n action.shape.rotation = action.oldPos.rotation;\n action.shape.isSelected = false;\n if (typeof action.shape.removeSelection === 'function') action.shape.removeSelection();\n action.shape.draw();\n\n // Update attached arrows after circle undo\n if (action.affectedArrows) {\n action.affectedArrows.forEach(arrowData => {\n const arrow = arrowData.arrow;\n // Restore arrow attachments to old state\n arrow.restoreAttachmentState(arrowData.oldAttachments);\n \n // Store current state for redo\n arrowData.newPoints = {\n startPoint: { ...arrow.startPoint },\n endPoint: { ...arrow.endPoint }\n };\n arrowData.newAttachments = arrow.getAttachmentState();\n });\n }\n } else if (action.shape.shapeName === 'line') {\n // Enhanced line transform undo with curve support\n action.shape.startPoint = { x: action.oldPos.startPoint.x, y: action.oldPos.startPoint.y };\n action.shape.endPoint = { x: action.oldPos.endPoint.x, y: action.oldPos.endPoint.y };\n \n // Restore curve state\n action.shape.isCurved = action.oldPos.isCurved || false;\n if (action.oldPos.controlPoint) {\n action.shape.controlPoint = { x: action.oldPos.controlPoint.x, y: action.oldPos.controlPoint.y };\n } else {\n action.shape.controlPoint = null;\n }\n \n // Handle frame attachment changes\n if (action.frameAttachment) {\n // Remove from new frame if it exists\n if (action.frameAttachment.newFrame) {\n const frameIndex = action.frameAttachment.newFrame.containedShapes.indexOf(action.shape);\n if (frameIndex > -1) {\n action.frameAttachment.newFrame.containedShapes.splice(frameIndex, 1);\n if (action.shape.group && action.shape.group.parentNode === action.frameAttachment.newFrame.clipGroup) {\n action.frameAttachment.newFrame.clipGroup.removeChild(action.shape.group);\n svg.appendChild(action.shape.group);\n }\n }\n }\n \n // Add back to old frame if it exists\n if (action.frameAttachment.oldFrame) {\n if (!action.frameAttachment.oldFrame.containedShapes.includes(action.shape)) {\n action.frameAttachment.oldFrame.containedShapes.push(action.shape);\n action.shape.parentFrame = action.frameAttachment.oldFrame;\n if (action.shape.group && action.shape.group.parentNode === svg) {\n svg.removeChild(action.shape.group);\n action.frameAttachment.oldFrame.clipGroup.appendChild(action.shape.group);\n }\n }\n } else {\n action.shape.parentFrame = null;\n }\n }\n \n action.shape.isSelected = false;\n if (typeof action.shape.removeSelection === 'function') action.shape.removeSelection();\n action.shape.draw();\n }\n else if (action.shape.shapeName === 'arrow') {\n // Enhanced arrow transform undo with attachment restoration\n action.shape.startPoint = { x: action.oldPos.startPoint.x, y: action.oldPos.startPoint.y };\n action.shape.endPoint = { x: action.oldPos.endPoint.x, y: action.oldPos.endPoint.y };\n action.shape.controlPoint1 = action.oldPos.controlPoint1 ? \n { x: action.oldPos.controlPoint1.x, y: action.oldPos.controlPoint1.y } : null;\n action.shape.controlPoint2 = action.oldPos.controlPoint2 ? \n { x: action.oldPos.controlPoint2.x, y: action.oldPos.controlPoint2.y } : null;\n \n // Restore attachment state\n if (action.oldPos.attachments) {\n action.shape.restoreAttachmentState(action.oldPos.attachments);\n } else {\n // Clear attachments if none existed before\n action.shape.attachedToStart = null;\n action.shape.attachedToEnd = null;\n }\n \n action.shape.isSelected = false;\n action.shape.draw();\n \n\n \n } \n else if (action.shape.type === 'icon') {\n \n action.shape.restore(action.oldPos);\n \n // Update attached arrows after icon undo\n if (action.affectedArrows) {\n action.affectedArrows.forEach(arrowData => {\n const arrow = arrowData.arrow;\n // Restore arrow attachments to old state\n arrow.restoreAttachmentState(arrowData.oldAttachments);\n \n // Store current state for redo\n arrowData.newPoints = {\n startPoint: { ...arrow.startPoint },\n endPoint: { ...arrow.endPoint }\n };\n arrowData.newAttachments = arrow.getAttachmentState();\n });\n }\n }\n else if (action.shape.shapeName === 'freehandStroke') {\n // Handle freehand stroke transform undo\n action.shape.points = JSON.parse(JSON.stringify(action.oldPos.points));\n action.shape.rotation = action.oldPos.rotation;\n action.shape.isSelected = false;\n if (typeof action.shape.removeSelection === 'function') action.shape.removeSelection();\n action.shape.draw();\n } else if (action.shape.shapeName === \"rectangle\") {\n action.shape.x = action.oldPos.x;\n action.shape.y = action.oldPos.y;\n action.shape.height = action.oldPos.height;\n action.shape.width = action.oldPos.width;\n action.shape.rotation = action.oldPos.rotation;\n action.shape.isSelected = false;\n if (typeof action.shape.removeSelection === 'function') action.shape.removeSelection();\n action.shape.draw();\n\n // Update attached arrows after rectangle undo\n if (action.affectedArrows) {\n action.affectedArrows.forEach(arrowData => {\n const arrow = arrowData.arrow;\n arrow.restoreAttachmentState(arrowData.oldAttachments);\n arrowData.newPoints = {\n startPoint: { ...arrow.startPoint },\n endPoint: { ...arrow.endPoint }\n };\n arrowData.newAttachments = arrow.getAttachmentState();\n });\n }\n }\n redoStack.push(action);\n return;\n }\n \n if (action.type === 'optionsChange') {\n if (action.shape.type === 'text') {\n // Handle text options change undo\n const textElement = (action.shape.element || action.shape).querySelector('text');\n if (textElement) {\n if (action.oldOptions.color) textElement.setAttribute('fill', action.oldOptions.color);\n if (action.oldOptions.font) textElement.setAttribute('font-family', action.oldOptions.font);\n if (action.oldOptions.size) textElement.setAttribute('font-size', action.oldOptions.size);\n if (action.oldOptions.align) textElement.setAttribute('text-anchor', action.oldOptions.align);\n \n // Update feedback if selected\n if (selectedElement === (action.shape.element || action.shape) && updateSelectionFeedback) {\n setTimeout(updateSelectionFeedback, 0);\n }\n }\n } else if (action.shape.shapeName === 'arrow') {\n // Handle arrow options change undo\n action.shape.options = { ...action.oldOptions };\n action.shape.arrowOutlineStyle = action.oldOptions.arrowOutlineStyle;\n action.shape.arrowHeadStyle = action.oldOptions.arrowHeadStyle;\n action.shape.arrowCurved = action.oldOptions.arrowCurved;\n action.shape.arrowCurveAmount = action.oldOptions.arrowCurveAmount;\n action.shape.draw();\n } else {\n // Handle other shape options change undo\n action.shape.options = action.oldOptions;\n action.shape.draw();\n }\n redoStack.push(action);\n return;\n }\n } finally {\n refreshSelectionAfterAction();\n notifyCollaboration();\n }\n}\n\nexport function redo() {\n if (redoStack.length === 0) return;\n const action = redoStack.pop();\n try {\n if (action.type === 'frameTransform') {\n // Handle frame transformation redo\n action.shape.x = action.newPos.x;\n action.shape.y = action.newPos.y;\n action.shape.width = action.newPos.width;\n action.shape.height = action.newPos.height;\n action.shape.rotation = action.newPos.rotation;\n action.shape.frameName = action.newPos.frameName;\n \n // Restore contained shapes to their new positions\n action.containedShapes.forEach(shapeData => {\n const shape = shapeData.shape;\n shape.x = shapeData.newState.x;\n shape.y = shapeData.newState.y;\n shape.width = shapeData.newState.width;\n shape.height = shapeData.newState.height;\n shape.rotation = shapeData.newState.rotation;\n \n if (typeof shape.draw === 'function') {\n shape.draw();\n }\n });\n \n action.shape.isSelected = false;\n if (typeof action.shape.removeSelection === 'function') action.shape.removeSelection();\n action.shape.draw();\n action.shape.updateClipPath();\n \n undoStack.push(action);\n return;\n }\n\n \n if (action.type === 'frameAttachment') {\n // Handle frame attachment/detachment redo WITHOUT calling the methods that track undo\n if (action.action === 'attach') {\n // Redo attach: manually add shape to frame\n if (action.oldFrame) {\n // Remove from old frame\n const oldFrameIndex = action.oldFrame.containedShapes.indexOf(action.shape);\n if (oldFrameIndex > -1) {\n action.oldFrame.containedShapes.splice(oldFrameIndex, 1);\n if (action.shape.group && action.shape.group.parentNode === action.oldFrame.clipGroup) {\n action.oldFrame.clipGroup.removeChild(action.shape.group);\n svg.appendChild(action.shape.group);\n }\n }\n }\n \n // Add to new frame\n if (!action.frame.containedShapes.includes(action.shape)) {\n action.frame.containedShapes.push(action.shape);\n action.shape.parentFrame = action.frame;\n \n if (action.shape.group && action.shape.group.parentNode === svg) {\n svg.removeChild(action.shape.group);\n action.frame.clipGroup.appendChild(action.shape.group);\n }\n }\n } else if (action.action === 'detach') {\n // Redo detach: manually remove shape from frame\n const frameIndex = action.frame.containedShapes.indexOf(action.shape);\n if (frameIndex > -1) {\n action.frame.containedShapes.splice(frameIndex, 1);\n action.shape.parentFrame = null;\n \n if (action.shape.group && action.shape.group.parentNode === action.frame.clipGroup) {\n action.frame.clipGroup.removeChild(action.shape.group);\n svg.appendChild(action.shape.group);\n }\n }\n }\n \n if (typeof action.shape.draw === 'function') {\n action.shape.draw();\n }\n \n undoStack.push(action);\n return;\n }\n\n // Handle mode conversion redo (code \u2194 text)\n if (action.type === 'create' && action.shape.type === 'modeConvert') {\n // Redo: remove the old shape, restore the new shape\n const newShape = action.shape.newShape;\n const newElement = action.shape.newElement;\n const oldShape = action.shape.oldShape;\n const oldElement = action.shape.oldElement;\n\n // Remove old shape from DOM and shapes array\n if (oldElement && oldElement.parentNode) {\n oldElement.parentNode.removeChild(oldElement);\n }\n const oldIdx = shapes.indexOf(oldShape);\n if (oldIdx !== -1) shapes.splice(oldIdx, 1);\n\n // Restore new shape to DOM and shapes array\n if (svg && newElement) {\n svg.appendChild(newElement);\n }\n if (newShape) {\n shapes.push(newShape);\n }\n\n undoStack.push(action);\n return;\n }\n\n if (action.type === 'create') {\n if (action.shape.type === 'text') {\n // Handle text creation redo\n if (svg) {\n svg.appendChild(action.shape.element || action.shape);\n // Add back to shapes array\n shapes.push(action.shape.element || action.shape);\n }\n }\n else if (action.shape.type === 'image') {\n // Handle image creation redo\n action.shape.restore();\n } else if (action.shape.type === 'icon') {\n // Handle icon creation redo - append the group, not the shape object\n if (svg && action.shape.group) {\n svg.appendChild(action.shape.group);\n }\n // Add back to shapes array\n if (shapes.indexOf(action.shape) === -1) {\n shapes.push(action.shape);\n }\n } else {\n // Handle other shape creation redo\n shapes.push(action.shape);\n if (svg) {\n svg.appendChild(action.shape.group);\n }\n }\n undoStack.push(action);\n return;\n}\n \n if (action.type === 'delete') {\n if (action.shape.type === 'text') {\n // Handle text deletion redo\n if ((action.shape.element || action.shape).parentNode) {\n (action.shape.element || action.shape).parentNode.removeChild(action.shape.element || action.shape);\n }\n // Remove from shapes array\n const idx = shapes.indexOf(action.shape.element || action.shape);\n if (idx !== -1) shapes.splice(idx, 1);\n \n // Clean up arrow attachments again\n if (action.affectedArrows) {\n action.affectedArrows.forEach(arrowData => {\n const arrow = arrowData.arrow;\n // Detach from the deleted text\n if (arrow.attachedToStart && arrow.attachedToStart.shape === (action.shape.element || action.shape)) {\n arrow.detachFromShape(true);\n }\n if (arrow.attachedToEnd && arrow.attachedToEnd.shape === (action.shape.element || action.shape)) {\n arrow.detachFromShape(false);\n }\n arrow.draw();\n });\n }\n }\n else if (action.shape.type === 'image') {\n // Handle image deletion redo\n action.shape.remove();\n } else {\n // Handle other shape deletion redo\n const idx = shapes.indexOf(action.shape);\n if (idx !== -1) shapes.splice(idx, 1);\n\n // Issue #24 bug #7: for a regular frame, re-orphan instead of\n // destroy() \u2014 releases children visually, detaches the frame's\n // own DOM bits, but keeps the JS object and child references\n // intact so a subsequent undo can rehydrate again.\n if (action.shape.shapeName === 'frame' && !action.shape._diagramType && action.childSnapshot) {\n for (const child of action.childSnapshot) {\n if (!child) continue;\n const el = child.group || child.element;\n if (el && svg) {\n if (action.shape.clipGroup && el.parentNode === action.shape.clipGroup) {\n action.shape.clipGroup.removeChild(el);\n }\n if (el.parentNode !== svg) svg.appendChild(el);\n }\n child.parentFrame = null;\n delete child.isBeingMovedByFrame;\n }\n action.shape.containedShapes = [];\n if (action.shape.group && action.shape.group.parentNode) action.shape.group.parentNode.removeChild(action.shape.group);\n if (action.shape.clipGroup && action.shape.clipGroup.parentNode) action.shape.clipGroup.parentNode.removeChild(action.shape.clipGroup);\n if (action.shape.clipPath && action.shape.clipPath.parentNode) action.shape.clipPath.parentNode.removeChild(action.shape.clipPath);\n } else {\n if (action.shape.group && action.shape.group.parentNode) {\n action.shape.group.parentNode.removeChild(action.shape.group);\n }\n // Diagram frame OR no snapshot \u2192 fall back to destroy().\n if (action.shape.shapeName === 'frame' && typeof action.shape.destroy === 'function') {\n action.shape.destroy();\n }\n }\n }\n undoStack.push(action);\n return;\n }\n \n if (action.type === 'transform') {\n // Handle frame attachment changes first\n if (action.frameAttachment) {\n // Use manual frame operations to avoid undo recursion\n if (action.frameAttachment.oldFrame) {\n const oldFrameIndex = action.frameAttachment.oldFrame.containedShapes.indexOf(action.shape);\n if (oldFrameIndex > -1) {\n action.frameAttachment.oldFrame.containedShapes.splice(oldFrameIndex, 1);\n if (action.shape.group && action.shape.group.parentNode === action.frameAttachment.oldFrame.clipGroup) {\n action.frameAttachment.oldFrame.clipGroup.removeChild(action.shape.group);\n svg.appendChild(action.shape.group);\n }\n }\n }\n if (action.frameAttachment.newFrame) {\n if (!action.frameAttachment.newFrame.containedShapes.includes(action.shape)) {\n action.frameAttachment.newFrame.containedShapes.push(action.shape);\n action.shape.parentFrame = action.frameAttachment.newFrame;\n if (action.shape.group && action.shape.group.parentNode === svg) {\n svg.removeChild(action.shape.group);\n action.frameAttachment.newFrame.clipGroup.appendChild(action.shape.group);\n }\n }\n } else {\n action.shape.parentFrame = null;\n }\n }\n \n if (action.shape.type === 'text') {\n // Enhanced text transform redo\n const textElement = (action.shape.element || action.shape).querySelector('text');\n if (textElement && action.newPos.fontSize !== undefined) {\n textElement.setAttribute('font-size', action.newPos.fontSize + 'px');\n }\n \n // Restore position and rotation\n const centerX = textElement ? textElement.getBBox().x + textElement.getBBox().width / 2 : 0;\n const centerY = textElement ? textElement.getBBox().y + textElement.getBBox().height / 2 : 0;\n \n (action.shape.element || action.shape).setAttribute('transform', \n `translate(${action.newPos.x}, ${action.newPos.y}) rotate(${action.newPos.rotation}, ${centerX}, ${centerY})`\n );\n \n (action.shape.element || action.shape).setAttribute('data-x', action.newPos.x);\n (action.shape.element || action.shape).setAttribute('data-y', action.newPos.y);\n \n // Update attached arrows after text redo\n if (action.affectedArrows) {\n action.affectedArrows.forEach(arrowData => {\n const arrow = arrowData.arrow;\n // Restore arrow attachments to new state\n if (arrowData.newAttachments) {\n arrow.restoreAttachmentState(arrowData.newAttachments);\n } else {\n // If no new attachments stored, recalculate based on current text position\n arrow.updateAttachments();\n }\n });\n }\n \n // Update feedback if selected\n if (selectedElement === (action.shape.element || action.shape) && updateSelectionFeedback) {\n setTimeout(updateSelectionFeedback, 0);\n }\n } else if (action.shape.type === 'image') {\n // Enhanced image transform redo\n action.shape.restore(action.newPos);\n \n // Update attached arrows after image redo\n if (action.affectedArrows) {\n action.affectedArrows.forEach(arrowData => {\n const arrow = arrowData.arrow;\n // Restore arrow attachments to new state\n if (arrowData.newAttachments) {\n arrow.restoreAttachmentState(arrowData.newAttachments);\n } else {\n // If no new attachments stored, recalculate based on current image position\n arrow.updateAttachments();\n }\n });\n }\n } else if (action.shape.shapeName === 'circle') {\n // Enhanced circle transform redo\n action.shape.x = action.newPos.x;\n action.shape.y = action.newPos.y;\n action.shape.rx = action.newPos.rx;\n action.shape.ry = action.newPos.ry;\n action.shape.rotation = action.newPos.rotation;\n action.shape.isSelected = false;\n if (typeof action.shape.removeSelection === 'function') action.shape.removeSelection();\n action.shape.draw();\n\n // Update attached arrows after circle redo\n if (action.affectedArrows) {\n action.affectedArrows.forEach(arrowData => {\n const arrow = arrowData.arrow;\n // Restore arrow attachments to new state\n if (arrowData.newAttachments) {\n arrow.restoreAttachmentState(arrowData.newAttachments);\n } else {\n // If no new attachments stored, recalculate based on current circle position\n arrow.updateAttachments();\n }\n });\n }\n } else if (action.shape.shapeName === 'line') {\n // Enhanced line transform redo with curve support\n action.shape.startPoint = { x: action.newPos.startPoint.x, y: action.newPos.startPoint.y };\n action.shape.endPoint = { x: action.newPos.endPoint.x, y: action.newPos.endPoint.y };\n \n // Restore curve state\n action.shape.isCurved = action.newPos.isCurved || false;\n if (action.newPos.controlPoint) {\n action.shape.controlPoint = { x: action.newPos.controlPoint.x, y: action.newPos.controlPoint.y };\n } else {\n action.shape.controlPoint = null;\n }\n \n // Handle frame attachment changes\n if (action.frameAttachment) {\n // Remove from old frame if it exists\n if (action.frameAttachment.oldFrame) {\n const oldFrameIndex = action.frameAttachment.oldFrame.containedShapes.indexOf(action.shape);\n if (oldFrameIndex > -1) {\n action.frameAttachment.oldFrame.containedShapes.splice(oldFrameIndex, 1);\n if (action.shape.group && action.shape.group.parentNode === action.frameAttachment.oldFrame.clipGroup) {\n action.frameAttachment.oldFrame.clipGroup.removeChild(action.shape.group);\n svg.appendChild(action.shape.group);\n }\n }\n }\n \n // Add to new frame if it exists\n if (action.frameAttachment.newFrame) {\n if (!action.frameAttachment.newFrame.containedShapes.includes(action.shape)) {\n action.frameAttachment.newFrame.containedShapes.push(action.shape);\n action.shape.parentFrame = action.frameAttachment.newFrame;\n if (action.shape.group && action.shape.group.parentNode === svg) {\n svg.removeChild(action.shape.group);\n action.frameAttachment.newFrame.clipGroup.appendChild(action.shape.group);\n }\n }\n } else {\n action.shape.parentFrame = null;\n }\n }\n \n action.shape.isSelected = false;\n if (typeof action.shape.removeSelection === 'function') action.shape.removeSelection();\n action.shape.draw();\n }\n else if (action.shape.shapeName === 'arrow') {\n // Enhanced arrow transform redo with attachment restoration\n action.shape.startPoint = { x: action.newPos.startPoint.x, y: action.newPos.startPoint.y };\n action.shape.endPoint = { x: action.newPos.endPoint.x, y: action.newPos.endPoint.y };\n action.shape.controlPoint1 = action.newPos.controlPoint1 ? \n { x: action.newPos.controlPoint1.x, y: action.newPos.controlPoint1.y } : null;\n action.shape.controlPoint2 = action.newPos.controlPoint2 ? \n { x: action.newPos.controlPoint2.x, y: action.newPos.controlPoint2.y } : null;\n \n // Restore attachment state\n if (action.newPos.attachments) {\n action.shape.restoreAttachmentState(action.newPos.attachments);\n } else {\n // Clear attachments if none should exist\n action.shape.attachedToStart = null;\n action.shape.attachedToEnd = null;\n }\n \n action.shape.isSelected = false;\n action.shape.draw();\n \n } \n else if (action.shape.type === 'icon') {\n action.shape.restore(action.newPos);\n \n // Update attached arrows after icon redo\n if (action.affectedArrows) {\n action.affectedArrows.forEach(arrowData => {\n const arrow = arrowData.arrow;\n // Restore arrow attachments to new state\n if (arrowData.newAttachments) {\n arrow.restoreAttachmentState(arrowData.newAttachments);\n } else {\n // If no new attachments stored, recalculate based on current icon position\n arrow.updateAttachments();\n }\n });\n }\n }\n else if (action.shape.shapeName === 'freehandStroke') {\n // Handle freehand stroke transform redo\n action.shape.points = JSON.parse(JSON.stringify(action.newPos.points));\n action.shape.rotation = action.newPos.rotation;\n action.shape.isSelected = false;\n if (typeof action.shape.removeSelection === 'function') action.shape.removeSelection();\n action.shape.draw();\n } else if (action.shape.shapeName === \"rectangle\") {\n // Enhanced rectangle transform redo\n action.shape.x = action.newPos.x;\n action.shape.y = action.newPos.y;\n action.shape.height = action.newPos.height;\n action.shape.width = action.newPos.width;\n action.shape.rotation = action.newPos.rotation;\n action.shape.isSelected = false;\n if (typeof action.shape.removeSelection === 'function') action.shape.removeSelection();\n action.shape.draw();\n\n // Update attached arrows after rectangle redo\n if (action.affectedArrows) {\n action.affectedArrows.forEach(arrowData => {\n const arrow = arrowData.arrow;\n // Restore arrow attachments to new state\n if (arrowData.newAttachments) {\n arrow.restoreAttachmentState(arrowData.newAttachments);\n } else {\n // If no new attachments stored, recalculate based on current rectangle position\n arrow.updateAttachments();\n }\n });\n }\n }\n undoStack.push(action);\n return;\n }\n \n if (action.type === 'optionsChange') {\n if (action.shape.type === 'text') {\n // Handle text options change redo\n const textElement = (action.shape.element || action.shape).querySelector('text');\n if (textElement) {\n if (action.newOptions.color) textElement.setAttribute('fill', action.newOptions.color);\n if (action.newOptions.font) textElement.setAttribute('font-family', action.newOptions.font);\n if (action.newOptions.size) textElement.setAttribute('font-size', action.newOptions.size);\n if (action.newOptions.align) textElement.setAttribute('text-anchor', action.newOptions.align);\n \n // Update feedback if selected\n if (selectedElement === (action.shape.element || action.shape) && updateSelectionFeedback) {\n setTimeout(updateSelectionFeedback, 0);\n }\n }\n } else if (action.shape.shapeName === 'arrow') {\n // Handle arrow options change redo - we need to get current options as newOptions\n const currentOptions = {\n ...action.shape.options,\n arrowOutlineStyle: action.shape.arrowOutlineStyle,\n arrowHeadStyle: action.shape.arrowHeadStyle,\n arrowCurved: action.shape.arrowCurved,\n arrowCurveAmount: action.shape.arrowCurveAmount\n };\n \n // Store current state for potential future undo\n action.newOptions = currentOptions;\n \n action.shape.draw();\n } else {\n // Handle other shape options change redo - we need to get current options as newOptions\n action.newOptions = action.shape.options;\n action.shape.draw();\n }\n undoStack.push(action);\n return;\n }\n } finally {\n refreshSelectionAfterAction();\n notifyCollaboration();\n }\n}\n\n// Optional: Keyboard shortcuts\ndocument.addEventListener('keydown', (e) => {\n if ((e.ctrlKey || e.metaKey) && e.key === 'z') {\n e.preventDefault();\n undo();\n }\n if ((e.ctrlKey || e.metaKey) && (e.key === 'y' || (e.shiftKey && e.key === 'z'))) {\n e.preventDefault();\n redo();\n }\n});\n\n// Attach to buttons\ndocument.getElementById('undo')?.addEventListener('click', undo);\ndocument.getElementById('redo')?.addEventListener('click', redo);\n\n// Expose globally for plain scripts\nwindow.pushCreateAction = pushCreateAction;\nwindow.pushDeleteAction = pushDeleteAction;\nwindow.pushDeleteActionWithAttachments = pushDeleteActionWithAttachments;\nwindow.pushTransformAction = pushTransformAction;\nwindow.pushOptionsChangeAction = pushOptionsChangeAction;\nwindow.pushCreateActionWithAttachments = pushCreateActionWithAttachments;\nwindow.undo = undo;\nwindow.redo = redo;\n"],
|
|
5
|
-
"mappings": ";;;AAIA,IAAM,YAAY,CAAC;AACnB,IAAM,YAAY,CAAC;AAGnB,IAAI,kBAAkB;AACtB,IAAI,0BAA0B;AAC9B,IAAI,MAAM;AAEV,SAAS,sBAAsB;AAC3B,MAAI,OAAO,WAAW,eAAe,OAAO,OAAO,yBAAyB,YAAY;AACpF,WAAO,qBAAqB;AAAA,EAChC;AACJ;AAGO,SAAS,kBAAkB,SAAS,UAAU,YAAY;AAC7D,oBAAkB;AAClB,4BAA0B;AAC1B,QAAM;AACV;AAGO,SAAS,4BAA4B;AACxC,SAAO;AACX;AAGO,SAAS,sBAAsB,SAAS;AAC3C,oBAAkB;AACtB;AAGO,SAAS,iBAAiB,OAAO;AACpC,YAAU,KAAK;AAAA,IACX,MAAM;AAAA,IACN;AAAA,EACJ,CAAC;AAGD,YAAU,SAAS;AACnB,sBAAoB;AACxB;AAEO,SAAS,iBAAiB,OAAO,OAAO,MAAM;AAKjD,QAAM,SAAS,EAAE,MAAM,UAAU,MAAM;AACvC,MAAI,QAAQ,KAAK,cAAe,QAAO,gBAAgB,KAAK;AAC5D,YAAU,KAAK,MAAM;AAGrB,YAAU,SAAS;AACnB,sBAAoB;AACxB;AAGO,SAAS,gCAAgC,OAAO;AACnD,MAAI,iBAAiB,CAAC;AAGtB,MAAI,MAAM,SAAS,UAAU,MAAM,cAAc,QAAQ;AACrD,qBAAiB,OAAO,OAAO,OAAK,EAAE,cAAc,YAC/C,EAAE,iBAAiB,UAAU,SAAS,EAAE,eAAe,UAAU,MAAM,EACvE,IAAI,YAAU;AAAA,MACX;AAAA,MACA,gBAAgB,MAAM,mBAAmB;AAAA,MACzC,WAAW;AAAA,QACP,YAAY,EAAE,GAAG,MAAM,WAAW;AAAA,QAClC,UAAU,EAAE,GAAG,MAAM,SAAS;AAAA,MAClC;AAAA,IACJ,EAAE;AAAA,EACV;AAEA,YAAU,KAAK;AAAA,IACX,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACJ,CAAC;AAGD,YAAU,SAAS;AACnB,sBAAoB;AACxB;AAEO,SAAS,0BAA0B,OAAO,OAAO,QAAQ,WAAW,MAAM;AAC7E,YAAU,KAAK;AAAA,IACX,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA;AAAA;AAAA,IAEA,YAAY;AAAA,MACR,GAAG,MAAM;AAAA,MACT,GAAG,MAAM;AAAA,MACT,OAAO,MAAM,SAAS;AAAA,MACtB,QAAQ,MAAM,UAAU;AAAA,MACxB,UAAU,MAAM,YAAY;AAAA,IAChC;AAAA,EACJ,CAAC;AAGD,YAAU,SAAS;AACnB,sBAAoB;AACxB;AAEO,SAAS,gCAAgC,OAAO;AACnD,YAAU,KAAK;AAAA,IACX,MAAM;AAAA,IACN;AAAA;AAAA,IAEA,sBAAsB,CAAC;AAAA,EAC3B,CAAC;AAGD,YAAU,SAAS;AACnB,sBAAoB;AACxB;AAEO,SAAS,oBAAoB,OAAO,QAAQ,QAAQ;AACvD,MAAI,MAAM,cAAc,SAAS;AAE7B,UAAM,wBAAwB,MAAM,gBAAgB,IAAI,qBAAmB;AAAA,MACvE,OAAO;AAAA,MACP,UAAU;AAAA,QACN,GAAG,eAAe,KAAK,OAAO,IAAI,OAAO;AAAA,QACzC,GAAG,eAAe,KAAK,OAAO,IAAI,OAAO;AAAA,QACzC,OAAO,eAAe,SAAS;AAAA,QAC/B,QAAQ,eAAe,UAAU;AAAA,QACjC,UAAU,eAAe,YAAY;AAAA,MACzC;AAAA,MACA,UAAU;AAAA,QACN,GAAG,eAAe;AAAA,QAClB,GAAG,eAAe;AAAA,QAClB,OAAO,eAAe,SAAS;AAAA,QAC/B,QAAQ,eAAe,UAAU;AAAA,QACjC,UAAU,eAAe,YAAY;AAAA,MACzC;AAAA,IACJ,EAAE;AAEF,cAAU,KAAK;AAAA,MACX,MAAM;AAAA,MACN;AAAA,MACA,QAAQ;AAAA,QACJ,GAAG,OAAO;AAAA,QACV,GAAG,OAAO;AAAA,QACV,OAAO,OAAO;AAAA,QACd,QAAQ,OAAO;AAAA,QACf,UAAU,OAAO;AAAA,QACjB,WAAW,OAAO,aAAa,MAAM;AAAA,MACzC;AAAA,MACA,QAAQ;AAAA,QACJ,GAAG,OAAO;AAAA,QACV,GAAG,OAAO;AAAA,QACV,OAAO,OAAO;AAAA,QACd,QAAQ,OAAO;AAAA,QACf,UAAU,OAAO;AAAA,QACjB,WAAW,OAAO,aAAa,MAAM;AAAA,MACzC;AAAA,MACA,iBAAiB;AAAA,IACrB,CAAC;AAAA,EACL,WAAW,MAAM,SAAS,QAAQ;AAE9B,UAAM,eAAe,MAAM,eAAe;AAE1C,cAAU,KAAK;AAAA,MACX,MAAM;AAAA,MACN;AAAA,MACA,QAAQ;AAAA,QACJ,GAAG,OAAO;AAAA,QACV,GAAG,OAAO;AAAA,QACV,UAAU,OAAO;AAAA,QACjB,UAAU,OAAO;AAAA,MACrB;AAAA,MACA,QAAQ;AAAA,QACJ,GAAG,OAAO;AAAA,QACV,GAAG,OAAO;AAAA,QACV,UAAU,OAAO;AAAA,QACjB,UAAU,OAAO;AAAA,MACrB;AAAA;AAAA,MAEA,iBAAiB;AAAA,QACb,UAAU,OAAO,eAAe;AAAA,QAChC,UAAU;AAAA,MACd;AAAA;AAAA,MAEA,gBAAgB,OAAO,OAAO,OAAK,EAAE,cAAc,YAC9C,EAAE,iBAAiB,UAAU,SAAS,EAAE,eAAe,UAAU,MAAM,EACvE,IAAI,YAAU;AAAA,QACX;AAAA,QACA,gBAAgB,MAAM,mBAAmB;AAAA,QACzC,WAAW;AAAA,UACP,YAAY,EAAE,GAAG,MAAM,WAAW;AAAA,UAClC,UAAU,EAAE,GAAG,MAAM,SAAS;AAAA,QAClC;AAAA,MACJ,EAAE;AAAA,IACV,CAAC;AAAA,EACL,WAAW,MAAM,SAAS,SAAS;AAE/B,UAAM,eAAe,MAAM,eAAe;AAE1C,cAAU,KAAK;AAAA,MACX,MAAM;AAAA,MACN;AAAA,MACA,QAAQ;AAAA,QACJ,GAAG,OAAO;AAAA,QACV,GAAG,OAAO;AAAA,QACV,OAAO,OAAO;AAAA,QACd,QAAQ,OAAO;AAAA,QACf,UAAU,OAAO;AAAA,MACrB;AAAA,MACA,QAAQ;AAAA,QACJ,GAAG,OAAO;AAAA,QACV,GAAG,OAAO;AAAA,QACV,OAAO,OAAO;AAAA,QACd,QAAQ,OAAO;AAAA,QACf,UAAU,OAAO;AAAA,MACrB;AAAA;AAAA,MAEA,iBAAiB;AAAA,QACb,UAAU,OAAO,eAAe;AAAA,QAChC,UAAU;AAAA,MACd;AAAA;AAAA,MAEA,gBAAgB,OAAO,OAAO,OAAK,EAAE,cAAc,YAC9C,EAAE,iBAAiB,UAAU,SAAS,EAAE,eAAe,UAAU,MAAM,EACvE,IAAI,YAAU;AAAA,QACX;AAAA,QACA,gBAAgB,MAAM,mBAAmB;AAAA,QACzC,WAAW;AAAA,UACP,YAAY,EAAE,GAAG,MAAM,WAAW;AAAA,UAClC,UAAU,EAAE,GAAG,MAAM,SAAS;AAAA,QAClC;AAAA,MACJ,EAAE;AAAA,IACV,CAAC;AAAA,EACL,WAAW,MAAM,cAAc,UAAU;AAErC,UAAM,eAAe,MAAM,eAAe;AAE1C,cAAU,KAAK;AAAA,MACX,MAAM;AAAA,MACN;AAAA,MACA,QAAQ;AAAA,QACJ,GAAG,OAAO;AAAA,QACV,GAAG,OAAO;AAAA,QACV,IAAI,OAAO;AAAA,QACX,IAAI,OAAO;AAAA,QACX,UAAU,OAAO;AAAA,MACrB;AAAA,MACA,QAAQ;AAAA,QACJ,GAAG,OAAO;AAAA,QACV,GAAG,OAAO;AAAA,QACV,IAAI,OAAO;AAAA,QACX,IAAI,OAAO;AAAA,QACX,UAAU,OAAO;AAAA,MACrB;AAAA;AAAA,MAEA,iBAAiB;AAAA,QACb,UAAU,OAAO,eAAe;AAAA,QAChC,UAAU;AAAA,MACd;AAAA;AAAA,MAEA,gBAAgB,OAAO,OAAO,OAAK,EAAE,cAAc,YAC9C,EAAE,iBAAiB,UAAU,SAAS,EAAE,eAAe,UAAU,MAAM,EACvE,IAAI,YAAU;AAAA,QACX;AAAA,QACA,gBAAgB,MAAM,mBAAmB;AAAA,QACzC,WAAW;AAAA,UACP,YAAY,EAAE,GAAG,MAAM,WAAW;AAAA,UAClC,UAAU,EAAE,GAAG,MAAM,SAAS;AAAA,QAClC;AAAA,MACJ,EAAE;AAAA,IACV,CAAC;AAAA,EACL,WAAW,MAAM,cAAc,aAAa;AAExC,UAAM,eAAe,MAAM,eAAe;AAE1C,cAAU,KAAK;AAAA,MACX,MAAM;AAAA,MACN;AAAA,MACA,QAAQ;AAAA,QACJ,GAAG,OAAO;AAAA,QACV,GAAG,OAAO;AAAA,QACV,OAAO,OAAO;AAAA,QACd,QAAQ,OAAO;AAAA,QACf,UAAU,OAAO;AAAA,MACrB;AAAA,MACA,QAAQ;AAAA,QACJ,GAAG,OAAO;AAAA,QACV,GAAG,OAAO;AAAA,QACV,OAAO,OAAO;AAAA,QACd,QAAQ,OAAO;AAAA,QACf,UAAU,OAAO;AAAA,MACrB;AAAA;AAAA,MAEA,iBAAiB;AAAA,QACb,UAAU,OAAO,eAAe;AAAA,QAChC,UAAU;AAAA,MACd;AAAA;AAAA,MAEA,gBAAgB,OAAO,OAAO,OAAK,EAAE,cAAc,YAC9C,EAAE,iBAAiB,UAAU,SAAS,EAAE,eAAe,UAAU,MAAM,EACvE,IAAI,YAAU;AAAA,QACX;AAAA,QACA,gBAAgB,MAAM,mBAAmB;AAAA,QACzC,WAAW;AAAA,UACP,YAAY,EAAE,GAAG,MAAM,WAAW;AAAA,UAClC,UAAU,EAAE,GAAG,MAAM,SAAS;AAAA,QAClC;AAAA,MACJ,EAAE;AAAA,IACV,CAAC;AAAA,EACL,WACS,MAAM,cAAc,QAAQ;AAEjC,UAAM,eAAe,MAAM,eAAe;AAE1C,cAAU,KAAK;AAAA,MACX,MAAM;AAAA,MACN;AAAA,MACA,QAAQ;AAAA,QACJ,YAAY,EAAE,GAAG,OAAO,WAAW,GAAG,GAAG,OAAO,WAAW,EAAE;AAAA,QAC7D,UAAU,EAAE,GAAG,OAAO,SAAS,GAAG,GAAG,OAAO,SAAS,EAAE;AAAA,QACvD,cAAc,OAAO,eAAe,EAAE,GAAG,OAAO,aAAa,GAAG,GAAG,OAAO,aAAa,EAAE,IAAI;AAAA,QAC7F,UAAU,OAAO,YAAY;AAAA,MACjC;AAAA,MACA,QAAQ;AAAA,QACJ,YAAY,EAAE,GAAG,OAAO,WAAW,GAAG,GAAG,OAAO,WAAW,EAAE;AAAA,QAC7D,UAAU,EAAE,GAAG,OAAO,SAAS,GAAG,GAAG,OAAO,SAAS,EAAE;AAAA,QACvD,cAAc,OAAO,eAAe,EAAE,GAAG,OAAO,aAAa,GAAG,GAAG,OAAO,aAAa,EAAE,IAAI;AAAA,QAC7F,UAAU,OAAO,YAAY;AAAA,MACjC;AAAA;AAAA,MAEA,iBAAiB;AAAA,QACb,UAAU,OAAO,eAAe;AAAA,QAChC,UAAU;AAAA,MACd;AAAA,IACJ,CAAC;AAAA,EACL,WACU,MAAM,cAAc,SAAS;AAEnC,cAAU,KAAK;AAAA,MACX,MAAM;AAAA,MACN;AAAA,MACA,QAAQ;AAAA,QACJ,YAAY,EAAE,GAAG,OAAO,WAAW,GAAG,GAAG,OAAO,WAAW,EAAE;AAAA,QAC7D,UAAU,EAAE,GAAG,OAAO,SAAS,GAAG,GAAG,OAAO,SAAS,EAAE;AAAA,QACvD,eAAe,OAAO,gBAAgB,EAAE,GAAG,OAAO,cAAc,GAAG,GAAG,OAAO,cAAc,EAAE,IAAI;AAAA,QACjG,eAAe,OAAO,gBAAgB,EAAE,GAAG,OAAO,cAAc,GAAG,GAAG,OAAO,cAAc,EAAE,IAAI;AAAA,QACjG,aAAa,OAAO,eAAe,MAAM,mBAAmB;AAAA,MAChE;AAAA,MACA,QAAQ;AAAA,QACJ,YAAY,EAAE,GAAG,OAAO,WAAW,GAAG,GAAG,OAAO,WAAW,EAAE;AAAA,QAC7D,UAAU,EAAE,GAAG,OAAO,SAAS,GAAG,GAAG,OAAO,SAAS,EAAE;AAAA,QACvD,eAAe,OAAO,gBAAgB,EAAE,GAAG,OAAO,cAAc,GAAG,GAAG,OAAO,cAAc,EAAE,IAAI;AAAA,QACjG,eAAe,OAAO,gBAAgB,EAAE,GAAG,OAAO,cAAc,GAAG,GAAG,OAAO,cAAc,EAAE,IAAI;AAAA,QACjG,aAAa,OAAO,eAAe,MAAM,mBAAmB;AAAA,MAChE;AAAA,IACJ,CAAC;AAAA,EACL,WACS,MAAM,SAAS,QAAQ;AAEhC,UAAM,eAAe,MAAM,eAAe;AAE1C,cAAU,KAAK;AAAA,MACX,MAAM;AAAA,MACN;AAAA,MACA,QAAQ;AAAA,QACJ,GAAG,OAAO;AAAA,QACV,GAAG,OAAO;AAAA,QACV,OAAO,OAAO;AAAA,QACd,QAAQ,OAAO;AAAA,QACf,UAAU,OAAO;AAAA,MACrB;AAAA,MACA,QAAQ;AAAA,QACJ,GAAG,OAAO;AAAA,QACV,GAAG,OAAO;AAAA,QACV,OAAO,OAAO;AAAA,QACd,QAAQ,OAAO;AAAA,QACf,UAAU,OAAO;AAAA,MACrB;AAAA;AAAA,MAEA,iBAAiB;AAAA,QACb,UAAU,OAAO,eAAe;AAAA,QAChC,UAAU;AAAA,MACd;AAAA;AAAA,MAEA,gBAAgB,OAAO,OAAO,OAAK,EAAE,cAAc,YAC9C,EAAE,iBAAiB,UAAU,SAAS,EAAE,eAAe,UAAU,MAAM,EACvE,IAAI,YAAU;AAAA,QACX;AAAA,QACA,gBAAgB,MAAM,mBAAmB;AAAA,QACzC,WAAW;AAAA,UACP,YAAY,EAAE,GAAG,MAAM,WAAW;AAAA,UAClC,UAAU,EAAE,GAAG,MAAM,SAAS;AAAA,QAClC;AAAA,MACJ,EAAE;AAAA,IACV,CAAC;AAAA,EACL,WACa,MAAM,cAAc,kBAAkB;AAE3C,cAAU,KAAK;AAAA,MACX,MAAM;AAAA,MACN;AAAA,MACA,QAAQ;AAAA,QACJ,QAAQ,KAAK,MAAM,KAAK,UAAU,OAAO,MAAM,CAAC;AAAA,QAChD,UAAU,OAAO;AAAA,MACrB;AAAA,MACA,QAAQ;AAAA,QACJ,QAAQ,KAAK,MAAM,KAAK,UAAU,OAAO,MAAM,CAAC;AAAA,QAChD,UAAU,OAAO;AAAA,MACrB;AAAA,IACJ,CAAC;AAAA,EACL;AAGA,YAAU,SAAS;AACnB,sBAAoB;AACxB;AAEO,SAAS,wBAAwB,OAAO,YAAY;AACvD,YAAU,KAAK;AAAA,IACX,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACJ,CAAC;AAGD,YAAU,SAAS;AACnB,sBAAoB;AACxB;AAMA,SAAS,8BAA8B;AACnC,QAAM,KAAM,OAAO,WAAW,cAAe,OAAO,iBAAiB;AACrE,MAAI,CAAC,GAAI;AACT,MAAI,OAAO,GAAG,mBAAmB,WAAY;AAC7C,MAAI,CAAC,GAAG,kBAAkB,GAAG,eAAe,SAAS,EAAG;AACxD,MAAI;AAAE,OAAG,eAAe;AAAA,EAAG,SAAS,KAAK;AAAE,YAAQ,KAAK,wCAAwC,GAAG;AAAA,EAAG;AAC1G;AAEO,SAAS,OAAO;AACnB,MAAI,UAAU,WAAW,EAAG;AAC5B,QAAM,SAAS,UAAU,IAAI;AAC7B,MAAI;AACJ,QAAI,OAAO,SAAS,kBAAkB;AAElC,aAAO,MAAM,IAAI,OAAO,OAAO;AAC/B,aAAO,MAAM,IAAI,OAAO,OAAO;AAC/B,aAAO,MAAM,QAAQ,OAAO,OAAO;AACnC,aAAO,MAAM,SAAS,OAAO,OAAO;AACpC,aAAO,MAAM,WAAW,OAAO,OAAO;AACtC,aAAO,MAAM,YAAY,OAAO,OAAO;AAGvC,aAAO,gBAAgB,QAAQ,eAAa;AACxC,cAAM,QAAQ,UAAU;AACxB,cAAM,IAAI,UAAU,SAAS;AAC7B,cAAM,IAAI,UAAU,SAAS;AAC7B,cAAM,QAAQ,UAAU,SAAS;AACjC,cAAM,SAAS,UAAU,SAAS;AAClC,cAAM,WAAW,UAAU,SAAS;AAEpC,YAAI,OAAO,MAAM,SAAS,YAAY;AAClC,gBAAM,KAAK;AAAA,QACf;AAAA,MACJ,CAAC;AAED,aAAO,MAAM,aAAa;AAC1B,UAAI,OAAO,OAAO,MAAM,oBAAoB,WAAY,QAAO,MAAM,gBAAgB;AACrF,aAAO,MAAM,KAAK;AAClB,aAAO,MAAM,eAAe;AAE5B,gBAAU,KAAK,MAAM;AACrB;AAAA,IACJ;AAEA,QAAI,OAAO,SAAS,mBAAmB;AAEnC,UAAI,OAAO,WAAW,UAAU;AAE5B,cAAM,aAAa,OAAO,MAAM,gBAAgB,QAAQ,OAAO,KAAK;AACpE,YAAI,aAAa,IAAI;AACjB,iBAAO,MAAM,gBAAgB,OAAO,YAAY,CAAC;AACjD,iBAAO,MAAM,cAAc;AAG3B,cAAI,OAAO,MAAM,SAAS,OAAO,MAAM,MAAM,eAAe,OAAO,MAAM,WAAW;AAChF,mBAAO,MAAM,UAAU,YAAY,OAAO,MAAM,KAAK;AACrD,gBAAI,YAAY,OAAO,MAAM,KAAK;AAAA,UACtC;AAAA,QACJ;AAGA,YAAI,OAAO,UAAU;AACjB,iBAAO,SAAS,gBAAgB,KAAK,OAAO,KAAK;AACjD,iBAAO,MAAM,cAAc,OAAO;AAGlC,cAAI,OAAO,MAAM,SAAS,OAAO,MAAM,MAAM,eAAe,KAAK;AAC7D,gBAAI,YAAY,OAAO,MAAM,KAAK;AAClC,mBAAO,SAAS,UAAU,YAAY,OAAO,MAAM,KAAK;AAAA,UAC5D;AAAA,QACJ;AAAA,MACJ,WAAW,OAAO,WAAW,UAAU;AAEnC,YAAI,CAAC,OAAO,MAAM,gBAAgB,SAAS,OAAO,KAAK,GAAG;AACtD,iBAAO,MAAM,gBAAgB,KAAK,OAAO,KAAK;AAC9C,iBAAO,MAAM,cAAc,OAAO;AAGlC,cAAI,OAAO,MAAM,SAAS,OAAO,MAAM,MAAM,eAAe,KAAK;AAC7D,gBAAI,YAAY,OAAO,MAAM,KAAK;AAClC,mBAAO,MAAM,UAAU,YAAY,OAAO,MAAM,KAAK;AAAA,UACzD;AAAA,QACJ;AAAA,MACJ;AAGA,aAAO,MAAM,IAAI,OAAO,WAAW;AACnC,aAAO,MAAM,IAAI,OAAO,WAAW;AACnC,aAAO,MAAM,QAAQ,OAAO,WAAW;AACvC,aAAO,MAAM,SAAS,OAAO,WAAW;AACxC,aAAO,MAAM,WAAW,OAAO,WAAW;AAE1C,UAAI,OAAO,OAAO,MAAM,SAAS,YAAY;AACzC,eAAO,MAAM,KAAK;AAAA,MACtB;AAEA,gBAAU,KAAK,MAAM;AACrB;AAAA,IACJ;AAGA,QAAI,OAAO,SAAS,YAAY,OAAO,MAAM,SAAS,eAAe;AAEjE,YAAM,WAAW,OAAO,MAAM;AAC9B,YAAM,aAAa,OAAO,MAAM;AAChC,YAAM,WAAW,OAAO,MAAM;AAC9B,YAAM,aAAa,OAAO,MAAM;AAGhC,UAAI,cAAc,WAAW,YAAY;AACrC,mBAAW,WAAW,YAAY,UAAU;AAAA,MAChD;AACA,YAAM,SAAS,OAAO,QAAQ,QAAQ;AACtC,UAAI,WAAW,GAAI,QAAO,OAAO,QAAQ,CAAC;AAG1C,UAAI,OAAO,YAAY;AACnB,YAAI,YAAY,UAAU;AAAA,MAC9B;AACA,UAAI,UAAU;AACV,eAAO,KAAK,QAAQ;AAAA,MACxB;AAEA,gBAAU,KAAK,MAAM;AACrB;AAAA,IACJ;AAEA,QAAI,OAAO,SAAS,UAAU;AAC9B,UAAI,OAAO,MAAM,SAAS,QAAQ;AAE9B,YAAI,OAAO,MAAM,WAAW,OAAO,MAAM,QAAQ,YAAY;AACzD,iBAAO,MAAM,QAAQ,WAAW,YAAY,OAAO,MAAM,OAAO;AAAA,QACpE,WAAW,OAAO,MAAM,YAAY;AAChC,iBAAO,MAAM,WAAW,YAAY,OAAO,KAAK;AAAA,QACpD;AAGA,cAAM,MAAM,OAAO,QAAQ,OAAO,MAAM,WAAW,OAAO,KAAK;AAC/D,YAAI,QAAQ,GAAI,QAAO,OAAO,KAAK,CAAC;AAGpC,YAAI,OAAO,uBAAuB,YAAY;AAC1C,6BAAmB,OAAO,MAAM,WAAW,OAAO,KAAK;AAAA,QAC3D;AAAA,MACJ,WAAW,OAAO,MAAM,SAAS,SAAS;AAEtC,eAAO,MAAM,OAAO;AAAA,MACxB,WAAW,OAAO,MAAM,SAAS,QAAQ;AAErC,eAAO,MAAM,OAAO;AAAA,MACxB,OAAO;AAEH,cAAM,MAAM,OAAO,QAAQ,OAAO,KAAK;AACvC,YAAI,QAAQ,GAAI,QAAO,OAAO,KAAK,CAAC;AACpC,YAAI,OAAO,MAAM,SAAS,OAAO,MAAM,MAAM,YAAY;AACrD,iBAAO,MAAM,MAAM,WAAW,YAAY,OAAO,MAAM,KAAK;AAAA,QAChE;AAGA,YAAI,OAAO,MAAM,cAAc,SAAS;AACpC,iBAAO,MAAM,QAAQ;AAAA,QACzB;AAAA,MACJ;AACA,gBAAU,KAAK,MAAM;AACrB;AAAA,IACJ;AAEI,QAAI,OAAO,SAAS,UAAU;AAC1B,UAAI,OAAO,MAAM,SAAS,QAAQ;AAE9B,YAAI,KAAK;AACL,cAAI,YAAY,OAAO,MAAM,WAAW,OAAO,KAAK;AAEpD,iBAAO,KAAK,OAAO,MAAM,WAAW,OAAO,KAAK;AAAA,QACpD;AAGA,YAAI,OAAO,gBAAgB;AACvB,iBAAO,eAAe,QAAQ,eAAa;AACvC,kBAAM,QAAQ,UAAU;AAExB,kBAAM,uBAAuB,UAAU,cAAc;AAAA,UACzD,CAAC;AAAA,QACL;AAAA,MACJ,WAAW,OAAO,MAAM,SAAS,SAAS;AAEtC,eAAO,MAAM,QAAQ;AAAA,MACzB,OAAO;AAEH,eAAO,KAAK,OAAO,KAAK;AACxB,YAAI,KAAK;AACL,cAAI,YAAY,OAAO,MAAM,KAAK;AAAA,QACtC;AASA,YAAI,OAAO,MAAM,cAAc,WAAW,KAAK;AAC3C,cAAI,OAAO,MAAM,aAAa,CAAC,OAAO,MAAM,UAAU,YAAY;AAC9D,gBAAI,YAAY,OAAO,MAAM,SAAS;AAAA,UAC1C;AACA,cAAI,OAAO,MAAM,YAAY,CAAC,OAAO,MAAM,SAAS,YAAY;AAC5D,kBAAM,OAAO,IAAI,cAAc,MAAM;AACrC,gBAAI,KAAM,MAAK,YAAY,OAAO,MAAM,QAAQ;AAAA,gBAC3C,KAAI,aAAa,OAAO,MAAM,UAAU,IAAI,UAAU;AAAA,UAC/D;AACA,cAAI,OAAO,iBAAiB,MAAM,QAAQ,OAAO,aAAa,GAAG;AAC7D,uBAAW,SAAS,OAAO,eAAe;AACtC,kBAAI,CAAC,MAAO;AACZ,kBAAI,OAAO,QAAQ,KAAK,MAAM,GAAI;AAClC,kBAAI,OAAO,OAAO,MAAM,oBAAoB,YAAY;AACpD,uBAAO,MAAM,gBAAgB,KAAK;AAAA,cACtC;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AACA,gBAAU,KAAK,MAAM;AACrB;AAAA,IACJ;AAEA,QAAI,OAAO,SAAS,aAAa;AAE7B,UAAI,OAAO,iBAAiB;AAExB,YAAI,OAAO,gBAAgB,UAAU;AACjC,gBAAM,aAAa,OAAO,gBAAgB,SAAS,gBAAgB,QAAQ,OAAO,KAAK;AACvF,cAAI,aAAa,IAAI;AACjB,mBAAO,gBAAgB,SAAS,gBAAgB,OAAO,YAAY,CAAC;AACpE,gBAAI,OAAO,MAAM,SAAS,OAAO,MAAM,MAAM,eAAe,OAAO,gBAAgB,SAAS,WAAW;AACnG,qBAAO,gBAAgB,SAAS,UAAU,YAAY,OAAO,MAAM,KAAK;AACxE,kBAAI,YAAY,OAAO,MAAM,KAAK;AAAA,YACtC;AAAA,UACJ;AAAA,QACJ;AACA,YAAI,OAAO,gBAAgB,UAAU;AACjC,cAAI,CAAC,OAAO,gBAAgB,SAAS,gBAAgB,SAAS,OAAO,KAAK,GAAG;AACzE,mBAAO,gBAAgB,SAAS,gBAAgB,KAAK,OAAO,KAAK;AACjE,mBAAO,MAAM,cAAc,OAAO,gBAAgB;AAClD,gBAAI,OAAO,MAAM,SAAS,OAAO,MAAM,MAAM,eAAe,KAAK;AAC7D,kBAAI,YAAY,OAAO,MAAM,KAAK;AAClC,qBAAO,gBAAgB,SAAS,UAAU,YAAY,OAAO,MAAM,KAAK;AAAA,YAC5E;AAAA,UACJ;AAAA,QACJ,OAAO;AACH,iBAAO,MAAM,cAAc;AAAA,QAC/B;AAAA,MACJ;AAEA,UAAI,OAAO,MAAM,SAAS,QAAQ;AAE9B,cAAM,eAAe,OAAO,MAAM,WAAW,OAAO,OAAO,cAAc,MAAM;AAC/E,YAAI,eAAe,OAAO,OAAO,aAAa,QAAW;AACrD,sBAAY,aAAa,aAAa,OAAO,OAAO,WAAW,IAAI;AAAA,QACvE;AAGA,cAAM,UAAU,cAAc,YAAY,QAAQ,EAAE,IAAI,YAAY,QAAQ,EAAE,QAAQ,IAAI;AAC1F,cAAM,UAAU,cAAc,YAAY,QAAQ,EAAE,IAAI,YAAY,QAAQ,EAAE,SAAS,IAAI;AAE3F,SAAC,OAAO,MAAM,WAAW,OAAO,OAAO;AAAA,UAAa;AAAA,UAChD,aAAa,OAAO,OAAO,CAAC,KAAK,OAAO,OAAO,CAAC,YAAY,OAAO,OAAO,QAAQ,KAAK,OAAO,KAAK,OAAO;AAAA,QAC9G;AAEA,SAAC,OAAO,MAAM,WAAW,OAAO,OAAO,aAAa,UAAU,OAAO,OAAO,CAAC;AAC7E,SAAC,OAAO,MAAM,WAAW,OAAO,OAAO,aAAa,UAAU,OAAO,OAAO,CAAC;AAG7E,YAAI,OAAO,gBAAgB;AACvB,iBAAO,eAAe,QAAQ,eAAa;AACvC,kBAAM,QAAQ,UAAU;AAExB,kBAAM,uBAAuB,UAAU,cAAc;AAGrD,sBAAU,YAAY;AAAA,cAClB,YAAY,EAAE,GAAG,MAAM,WAAW;AAAA,cAClC,UAAU,EAAE,GAAG,MAAM,SAAS;AAAA,YAClC;AACA,sBAAU,iBAAiB,MAAM,mBAAmB;AAAA,UACxD,CAAC;AAAA,QACL;AAGA,YAAI,qBAAqB,OAAO,MAAM,WAAW,OAAO,UAAU,yBAAyB;AACvF,qBAAW,yBAAyB,CAAC;AAAA,QACzC;AAAA,MACJ,WAAW,OAAO,MAAM,SAAS,SAAS;AAEtC,eAAO,MAAM,QAAQ,OAAO,MAAM;AAGlC,YAAI,OAAO,gBAAgB;AACvB,iBAAO,eAAe,QAAQ,eAAa;AACvC,kBAAM,QAAQ,UAAU;AAExB,kBAAM,uBAAuB,UAAU,cAAc;AAGrD,sBAAU,YAAY;AAAA,cAClB,YAAY,EAAE,GAAG,MAAM,WAAW;AAAA,cAClC,UAAU,EAAE,GAAG,MAAM,SAAS;AAAA,YAClC;AACA,sBAAU,iBAAiB,MAAM,mBAAmB;AAAA,UACxD,CAAC;AAAA,QACL;AAAA,MACJ,WAAW,OAAO,MAAM,cAAc,UAAU;AAE5C,eAAO,MAAM,IAAI,OAAO,OAAO;AAC/B,eAAO,MAAM,IAAI,OAAO,OAAO;AAC/B,eAAO,MAAM,KAAK,OAAO,OAAO;AAChC,eAAO,MAAM,KAAK,OAAO,OAAO;AAChC,eAAO,MAAM,WAAW,OAAO,OAAO;AACtC,eAAO,MAAM,aAAa;AAC1B,YAAI,OAAO,OAAO,MAAM,oBAAoB,WAAY,QAAO,MAAM,gBAAgB;AACrF,eAAO,MAAM,KAAK;AAGlB,YAAI,OAAO,gBAAgB;AACvB,iBAAO,eAAe,QAAQ,eAAa;AACvC,kBAAM,QAAQ,UAAU;AAExB,kBAAM,uBAAuB,UAAU,cAAc;AAGrD,sBAAU,YAAY;AAAA,cAClB,YAAY,EAAE,GAAG,MAAM,WAAW;AAAA,cAClC,UAAU,EAAE,GAAG,MAAM,SAAS;AAAA,YAClC;AACA,sBAAU,iBAAiB,MAAM,mBAAmB;AAAA,UACxD,CAAC;AAAA,QACL;AAAA,MACJ,WAAW,OAAO,MAAM,cAAc,QAAQ;AAE1C,eAAO,MAAM,aAAa,EAAE,GAAG,OAAO,OAAO,WAAW,GAAG,GAAG,OAAO,OAAO,WAAW,EAAE;AACzF,eAAO,MAAM,WAAW,EAAE,GAAG,OAAO,OAAO,SAAS,GAAG,GAAG,OAAO,OAAO,SAAS,EAAE;AAGnF,eAAO,MAAM,WAAW,OAAO,OAAO,YAAY;AAClD,YAAI,OAAO,OAAO,cAAc;AAC5B,iBAAO,MAAM,eAAe,EAAE,GAAG,OAAO,OAAO,aAAa,GAAG,GAAG,OAAO,OAAO,aAAa,EAAE;AAAA,QACnG,OAAO;AACH,iBAAO,MAAM,eAAe;AAAA,QAChC;AAGA,YAAI,OAAO,iBAAiB;AAExB,cAAI,OAAO,gBAAgB,UAAU;AACjC,kBAAM,aAAa,OAAO,gBAAgB,SAAS,gBAAgB,QAAQ,OAAO,KAAK;AACvF,gBAAI,aAAa,IAAI;AACjB,qBAAO,gBAAgB,SAAS,gBAAgB,OAAO,YAAY,CAAC;AACpE,kBAAI,OAAO,MAAM,SAAS,OAAO,MAAM,MAAM,eAAe,OAAO,gBAAgB,SAAS,WAAW;AACnG,uBAAO,gBAAgB,SAAS,UAAU,YAAY,OAAO,MAAM,KAAK;AACxE,oBAAI,YAAY,OAAO,MAAM,KAAK;AAAA,cACtC;AAAA,YACJ;AAAA,UACJ;AAGA,cAAI,OAAO,gBAAgB,UAAU;AACjC,gBAAI,CAAC,OAAO,gBAAgB,SAAS,gBAAgB,SAAS,OAAO,KAAK,GAAG;AACzE,qBAAO,gBAAgB,SAAS,gBAAgB,KAAK,OAAO,KAAK;AACjE,qBAAO,MAAM,cAAc,OAAO,gBAAgB;AAClD,kBAAI,OAAO,MAAM,SAAS,OAAO,MAAM,MAAM,eAAe,KAAK;AAC7D,oBAAI,YAAY,OAAO,MAAM,KAAK;AAClC,uBAAO,gBAAgB,SAAS,UAAU,YAAY,OAAO,MAAM,KAAK;AAAA,cAC5E;AAAA,YACJ;AAAA,UACJ,OAAO;AACH,mBAAO,MAAM,cAAc;AAAA,UAC/B;AAAA,QACJ;AAEA,eAAO,MAAM,aAAa;AAC1B,YAAI,OAAO,OAAO,MAAM,oBAAoB,WAAY,QAAO,MAAM,gBAAgB;AACrF,eAAO,MAAM,KAAK;AAAA,MACtB,WACU,OAAO,MAAM,cAAc,SAAS;AAE1C,eAAO,MAAM,aAAa,EAAE,GAAG,OAAO,OAAO,WAAW,GAAG,GAAG,OAAO,OAAO,WAAW,EAAE;AACzF,eAAO,MAAM,WAAW,EAAE,GAAG,OAAO,OAAO,SAAS,GAAG,GAAG,OAAO,OAAO,SAAS,EAAE;AACnF,eAAO,MAAM,gBAAgB,OAAO,OAAO,gBACvC,EAAE,GAAG,OAAO,OAAO,cAAc,GAAG,GAAG,OAAO,OAAO,cAAc,EAAE,IAAI;AAC7E,eAAO,MAAM,gBAAgB,OAAO,OAAO,gBACvC,EAAE,GAAG,OAAO,OAAO,cAAc,GAAG,GAAG,OAAO,OAAO,cAAc,EAAE,IAAI;AAG7E,YAAI,OAAO,OAAO,aAAa;AAC3B,iBAAO,MAAM,uBAAuB,OAAO,OAAO,WAAW;AAAA,QACjE,OAAO;AAEH,iBAAO,MAAM,kBAAkB;AAC/B,iBAAO,MAAM,gBAAgB;AAAA,QACjC;AAEA,eAAO,MAAM,aAAa;AAC1B,eAAO,MAAM,KAAK;AAAA,MAItB,WACS,OAAO,MAAM,SAAS,QAAQ;AAEnC,eAAO,MAAM,QAAQ,OAAO,MAAM;AAGlC,YAAI,OAAO,gBAAgB;AACvB,iBAAO,eAAe,QAAQ,eAAa;AACvC,kBAAM,QAAQ,UAAU;AAExB,kBAAM,uBAAuB,UAAU,cAAc;AAGrD,sBAAU,YAAY;AAAA,cAClB,YAAY,EAAE,GAAG,MAAM,WAAW;AAAA,cAClC,UAAU,EAAE,GAAG,MAAM,SAAS;AAAA,YAClC;AACA,sBAAU,iBAAiB,MAAM,mBAAmB;AAAA,UACxD,CAAC;AAAA,QACL;AAAA,MACJ,WACS,OAAO,MAAM,cAAc,kBAAkB;AAElD,eAAO,MAAM,SAAS,KAAK,MAAM,KAAK,UAAU,OAAO,OAAO,MAAM,CAAC;AACrE,eAAO,MAAM,WAAW,OAAO,OAAO;AACtC,eAAO,MAAM,aAAa;AAC1B,YAAI,OAAO,OAAO,MAAM,oBAAoB,WAAY,QAAO,MAAM,gBAAgB;AACrF,eAAO,MAAM,KAAK;AAAA,MACtB,WAAW,OAAO,MAAM,cAAc,aAAa;AAC/C,eAAO,MAAM,IAAI,OAAO,OAAO;AAC/B,eAAO,MAAM,IAAI,OAAO,OAAO;AAC/B,eAAO,MAAM,SAAS,OAAO,OAAO;AACpC,eAAO,MAAM,QAAQ,OAAO,OAAO;AACnC,eAAO,MAAM,WAAW,OAAO,OAAO;AACtC,eAAO,MAAM,aAAa;AAC1B,YAAI,OAAO,OAAO,MAAM,oBAAoB,WAAY,QAAO,MAAM,gBAAgB;AACrF,eAAO,MAAM,KAAK;AAGlB,YAAI,OAAO,gBAAgB;AACvB,iBAAO,eAAe,QAAQ,eAAa;AACvC,kBAAM,QAAQ,UAAU;AACxB,kBAAM,uBAAuB,UAAU,cAAc;AACrD,sBAAU,YAAY;AAAA,cAClB,YAAY,EAAE,GAAG,MAAM,WAAW;AAAA,cAClC,UAAU,EAAE,GAAG,MAAM,SAAS;AAAA,YAClC;AACA,sBAAU,iBAAiB,MAAM,mBAAmB;AAAA,UACxD,CAAC;AAAA,QACL;AAAA,MACJ;AACA,gBAAU,KAAK,MAAM;AACrB;AAAA,IACJ;AAEA,QAAI,OAAO,SAAS,iBAAiB;AACjC,UAAI,OAAO,MAAM,SAAS,QAAQ;AAE9B,cAAM,eAAe,OAAO,MAAM,WAAW,OAAO,OAAO,cAAc,MAAM;AAC/E,YAAI,aAAa;AACb,cAAI,OAAO,WAAW,MAAO,aAAY,aAAa,QAAQ,OAAO,WAAW,KAAK;AACrF,cAAI,OAAO,WAAW,KAAM,aAAY,aAAa,eAAe,OAAO,WAAW,IAAI;AAC1F,cAAI,OAAO,WAAW,KAAM,aAAY,aAAa,aAAa,OAAO,WAAW,IAAI;AACxF,cAAI,OAAO,WAAW,MAAO,aAAY,aAAa,eAAe,OAAO,WAAW,KAAK;AAG5F,cAAI,qBAAqB,OAAO,MAAM,WAAW,OAAO,UAAU,yBAAyB;AACvF,uBAAW,yBAAyB,CAAC;AAAA,UACzC;AAAA,QACJ;AAAA,MACJ,WAAW,OAAO,MAAM,cAAc,SAAS;AAE3C,eAAO,MAAM,UAAU,EAAE,GAAG,OAAO,WAAW;AAC9C,eAAO,MAAM,oBAAoB,OAAO,WAAW;AACnD,eAAO,MAAM,iBAAiB,OAAO,WAAW;AAChD,eAAO,MAAM,cAAc,OAAO,WAAW;AAC7C,eAAO,MAAM,mBAAmB,OAAO,WAAW;AAClD,eAAO,MAAM,KAAK;AAAA,MACtB,OAAO;AAEH,eAAO,MAAM,UAAU,OAAO;AAC9B,eAAO,MAAM,KAAK;AAAA,MACtB;AACA,gBAAU,KAAK,MAAM;AACrB;AAAA,IACJ;AAAA,EACA,UAAE;AACE,gCAA4B;AAC5B,wBAAoB;AAAA,EACxB;AACJ;AAEO,SAAS,OAAO;AACnB,MAAI,UAAU,WAAW,EAAG;AAC5B,QAAM,SAAS,UAAU,IAAI;AAC7B,MAAI;AACJ,QAAI,OAAO,SAAS,kBAAkB;AAElC,aAAO,MAAM,IAAI,OAAO,OAAO;AAC/B,aAAO,MAAM,IAAI,OAAO,OAAO;AAC/B,aAAO,MAAM,QAAQ,OAAO,OAAO;AACnC,aAAO,MAAM,SAAS,OAAO,OAAO;AACpC,aAAO,MAAM,WAAW,OAAO,OAAO;AACtC,aAAO,MAAM,YAAY,OAAO,OAAO;AAGvC,aAAO,gBAAgB,QAAQ,eAAa;AACxC,cAAM,QAAQ,UAAU;AACxB,cAAM,IAAI,UAAU,SAAS;AAC7B,cAAM,IAAI,UAAU,SAAS;AAC7B,cAAM,QAAQ,UAAU,SAAS;AACjC,cAAM,SAAS,UAAU,SAAS;AAClC,cAAM,WAAW,UAAU,SAAS;AAEpC,YAAI,OAAO,MAAM,SAAS,YAAY;AAClC,gBAAM,KAAK;AAAA,QACf;AAAA,MACJ,CAAC;AAED,aAAO,MAAM,aAAa;AAC1B,UAAI,OAAO,OAAO,MAAM,oBAAoB,WAAY,QAAO,MAAM,gBAAgB;AACrF,aAAO,MAAM,KAAK;AAClB,aAAO,MAAM,eAAe;AAE5B,gBAAU,KAAK,MAAM;AACrB;AAAA,IACJ;AAGA,QAAI,OAAO,SAAS,mBAAmB;AAEnC,UAAI,OAAO,WAAW,UAAU;AAE5B,YAAI,OAAO,UAAU;AAEjB,gBAAM,gBAAgB,OAAO,SAAS,gBAAgB,QAAQ,OAAO,KAAK;AAC1E,cAAI,gBAAgB,IAAI;AACpB,mBAAO,SAAS,gBAAgB,OAAO,eAAe,CAAC;AACvD,gBAAI,OAAO,MAAM,SAAS,OAAO,MAAM,MAAM,eAAe,OAAO,SAAS,WAAW;AACnF,qBAAO,SAAS,UAAU,YAAY,OAAO,MAAM,KAAK;AACxD,kBAAI,YAAY,OAAO,MAAM,KAAK;AAAA,YACtC;AAAA,UACJ;AAAA,QACJ;AAGA,YAAI,CAAC,OAAO,MAAM,gBAAgB,SAAS,OAAO,KAAK,GAAG;AACtD,iBAAO,MAAM,gBAAgB,KAAK,OAAO,KAAK;AAC9C,iBAAO,MAAM,cAAc,OAAO;AAElC,cAAI,OAAO,MAAM,SAAS,OAAO,MAAM,MAAM,eAAe,KAAK;AAC7D,gBAAI,YAAY,OAAO,MAAM,KAAK;AAClC,mBAAO,MAAM,UAAU,YAAY,OAAO,MAAM,KAAK;AAAA,UACzD;AAAA,QACJ;AAAA,MACJ,WAAW,OAAO,WAAW,UAAU;AAEnC,cAAM,aAAa,OAAO,MAAM,gBAAgB,QAAQ,OAAO,KAAK;AACpE,YAAI,aAAa,IAAI;AACjB,iBAAO,MAAM,gBAAgB,OAAO,YAAY,CAAC;AACjD,iBAAO,MAAM,cAAc;AAE3B,cAAI,OAAO,MAAM,SAAS,OAAO,MAAM,MAAM,eAAe,OAAO,MAAM,WAAW;AAChF,mBAAO,MAAM,UAAU,YAAY,OAAO,MAAM,KAAK;AACrD,gBAAI,YAAY,OAAO,MAAM,KAAK;AAAA,UACtC;AAAA,QACJ;AAAA,MACJ;AAEA,UAAI,OAAO,OAAO,MAAM,SAAS,YAAY;AACzC,eAAO,MAAM,KAAK;AAAA,MACtB;AAEA,gBAAU,KAAK,MAAM;AACrB;AAAA,IACJ;AAGA,QAAI,OAAO,SAAS,YAAY,OAAO,MAAM,SAAS,eAAe;AAEjE,YAAM,WAAW,OAAO,MAAM;AAC9B,YAAM,aAAa,OAAO,MAAM;AAChC,YAAM,WAAW,OAAO,MAAM;AAC9B,YAAM,aAAa,OAAO,MAAM;AAGhC,UAAI,cAAc,WAAW,YAAY;AACrC,mBAAW,WAAW,YAAY,UAAU;AAAA,MAChD;AACA,YAAM,SAAS,OAAO,QAAQ,QAAQ;AACtC,UAAI,WAAW,GAAI,QAAO,OAAO,QAAQ,CAAC;AAG1C,UAAI,OAAO,YAAY;AACnB,YAAI,YAAY,UAAU;AAAA,MAC9B;AACA,UAAI,UAAU;AACV,eAAO,KAAK,QAAQ;AAAA,MACxB;AAEA,gBAAU,KAAK,MAAM;AACrB;AAAA,IACJ;AAEA,QAAI,OAAO,SAAS,UAAU;AAC9B,UAAI,OAAO,MAAM,SAAS,QAAQ;AAE9B,YAAI,KAAK;AACL,cAAI,YAAY,OAAO,MAAM,WAAW,OAAO,KAAK;AAEpD,iBAAO,KAAK,OAAO,MAAM,WAAW,OAAO,KAAK;AAAA,QACpD;AAAA,MACJ,WACS,OAAO,MAAM,SAAS,SAAS;AAEpC,eAAO,MAAM,QAAQ;AAAA,MACzB,WAAW,OAAO,MAAM,SAAS,QAAQ;AAErC,YAAI,OAAO,OAAO,MAAM,OAAO;AAC3B,cAAI,YAAY,OAAO,MAAM,KAAK;AAAA,QACtC;AAEA,YAAI,OAAO,QAAQ,OAAO,KAAK,MAAM,IAAI;AACrC,iBAAO,KAAK,OAAO,KAAK;AAAA,QAC5B;AAAA,MACJ,OAAO;AAEH,eAAO,KAAK,OAAO,KAAK;AACxB,YAAI,KAAK;AACL,cAAI,YAAY,OAAO,MAAM,KAAK;AAAA,QACtC;AAAA,MACJ;AACA,gBAAU,KAAK,MAAM;AACrB;AAAA,IACJ;AAEI,QAAI,OAAO,SAAS,UAAU;AAC1B,UAAI,OAAO,MAAM,SAAS,QAAQ;AAE9B,aAAK,OAAO,MAAM,WAAW,OAAO,OAAO,YAAY;AACnD,WAAC,OAAO,MAAM,WAAW,OAAO,OAAO,WAAW,YAAY,OAAO,MAAM,WAAW,OAAO,KAAK;AAAA,QACtG;AAEA,cAAM,MAAM,OAAO,QAAQ,OAAO,MAAM,WAAW,OAAO,KAAK;AAC/D,YAAI,QAAQ,GAAI,QAAO,OAAO,KAAK,CAAC;AAGpC,YAAI,OAAO,gBAAgB;AACvB,iBAAO,eAAe,QAAQ,eAAa;AACvC,kBAAM,QAAQ,UAAU;AAExB,gBAAI,MAAM,mBAAmB,MAAM,gBAAgB,WAAW,OAAO,MAAM,WAAW,OAAO,QAAQ;AACjG,oBAAM,gBAAgB,IAAI;AAAA,YAC9B;AACA,gBAAI,MAAM,iBAAiB,MAAM,cAAc,WAAW,OAAO,MAAM,WAAW,OAAO,QAAQ;AAC7F,oBAAM,gBAAgB,KAAK;AAAA,YAC/B;AACA,kBAAM,KAAK;AAAA,UACf,CAAC;AAAA,QACL;AAAA,MACJ,WACS,OAAO,MAAM,SAAS,SAAS;AAEpC,eAAO,MAAM,OAAO;AAAA,MACxB,OAAO;AAEH,cAAM,MAAM,OAAO,QAAQ,OAAO,KAAK;AACvC,YAAI,QAAQ,GAAI,QAAO,OAAO,KAAK,CAAC;AAMpC,YAAI,OAAO,MAAM,cAAc,WAAW,CAAC,OAAO,MAAM,gBAAgB,OAAO,eAAe;AAC1F,qBAAW,SAAS,OAAO,eAAe;AACtC,gBAAI,CAAC,MAAO;AACZ,kBAAM,KAAK,MAAM,SAAS,MAAM;AAChC,gBAAI,MAAM,KAAK;AACX,kBAAI,OAAO,MAAM,aAAa,GAAG,eAAe,OAAO,MAAM,WAAW;AACpE,uBAAO,MAAM,UAAU,YAAY,EAAE;AAAA,cACzC;AACA,kBAAI,GAAG,eAAe,IAAK,KAAI,YAAY,EAAE;AAAA,YACjD;AACA,kBAAM,cAAc;AACpB,mBAAO,MAAM;AAAA,UACjB;AACA,iBAAO,MAAM,kBAAkB,CAAC;AAChC,cAAI,OAAO,MAAM,SAAS,OAAO,MAAM,MAAM,WAAY,QAAO,MAAM,MAAM,WAAW,YAAY,OAAO,MAAM,KAAK;AACrH,cAAI,OAAO,MAAM,aAAa,OAAO,MAAM,UAAU,WAAY,QAAO,MAAM,UAAU,WAAW,YAAY,OAAO,MAAM,SAAS;AACrI,cAAI,OAAO,MAAM,YAAY,OAAO,MAAM,SAAS,WAAY,QAAO,MAAM,SAAS,WAAW,YAAY,OAAO,MAAM,QAAQ;AAAA,QACrI,OAAO;AACH,cAAI,OAAO,MAAM,SAAS,OAAO,MAAM,MAAM,YAAY;AACrD,mBAAO,MAAM,MAAM,WAAW,YAAY,OAAO,MAAM,KAAK;AAAA,UAChE;AAEA,cAAI,OAAO,MAAM,cAAc,WAAW,OAAO,OAAO,MAAM,YAAY,YAAY;AAClF,mBAAO,MAAM,QAAQ;AAAA,UACzB;AAAA,QACJ;AAAA,MACJ;AACA,gBAAU,KAAK,MAAM;AACrB;AAAA,IACJ;AAEA,QAAI,OAAO,SAAS,aAAa;AAE7B,UAAI,OAAO,iBAAiB;AAExB,YAAI,OAAO,gBAAgB,UAAU;AACjC,gBAAM,gBAAgB,OAAO,gBAAgB,SAAS,gBAAgB,QAAQ,OAAO,KAAK;AAC1F,cAAI,gBAAgB,IAAI;AACpB,mBAAO,gBAAgB,SAAS,gBAAgB,OAAO,eAAe,CAAC;AACvE,gBAAI,OAAO,MAAM,SAAS,OAAO,MAAM,MAAM,eAAe,OAAO,gBAAgB,SAAS,WAAW;AACnG,qBAAO,gBAAgB,SAAS,UAAU,YAAY,OAAO,MAAM,KAAK;AACxE,kBAAI,YAAY,OAAO,MAAM,KAAK;AAAA,YACtC;AAAA,UACJ;AAAA,QACJ;AACA,YAAI,OAAO,gBAAgB,UAAU;AACjC,cAAI,CAAC,OAAO,gBAAgB,SAAS,gBAAgB,SAAS,OAAO,KAAK,GAAG;AACzE,mBAAO,gBAAgB,SAAS,gBAAgB,KAAK,OAAO,KAAK;AACjE,mBAAO,MAAM,cAAc,OAAO,gBAAgB;AAClD,gBAAI,OAAO,MAAM,SAAS,OAAO,MAAM,MAAM,eAAe,KAAK;AAC7D,kBAAI,YAAY,OAAO,MAAM,KAAK;AAClC,qBAAO,gBAAgB,SAAS,UAAU,YAAY,OAAO,MAAM,KAAK;AAAA,YAC5E;AAAA,UACJ;AAAA,QACJ,OAAO;AACH,iBAAO,MAAM,cAAc;AAAA,QAC/B;AAAA,MACJ;AAEA,UAAI,OAAO,MAAM,SAAS,QAAQ;AAE9B,cAAM,eAAe,OAAO,MAAM,WAAW,OAAO,OAAO,cAAc,MAAM;AAC/E,YAAI,eAAe,OAAO,OAAO,aAAa,QAAW;AACrD,sBAAY,aAAa,aAAa,OAAO,OAAO,WAAW,IAAI;AAAA,QACvE;AAGA,cAAM,UAAU,cAAc,YAAY,QAAQ,EAAE,IAAI,YAAY,QAAQ,EAAE,QAAQ,IAAI;AAC1F,cAAM,UAAU,cAAc,YAAY,QAAQ,EAAE,IAAI,YAAY,QAAQ,EAAE,SAAS,IAAI;AAE3F,SAAC,OAAO,MAAM,WAAW,OAAO,OAAO;AAAA,UAAa;AAAA,UAChD,aAAa,OAAO,OAAO,CAAC,KAAK,OAAO,OAAO,CAAC,YAAY,OAAO,OAAO,QAAQ,KAAK,OAAO,KAAK,OAAO;AAAA,QAC9G;AAEA,SAAC,OAAO,MAAM,WAAW,OAAO,OAAO,aAAa,UAAU,OAAO,OAAO,CAAC;AAC7E,SAAC,OAAO,MAAM,WAAW,OAAO,OAAO,aAAa,UAAU,OAAO,OAAO,CAAC;AAG7E,YAAI,OAAO,gBAAgB;AACvB,iBAAO,eAAe,QAAQ,eAAa;AACvC,kBAAM,QAAQ,UAAU;AAExB,gBAAI,UAAU,gBAAgB;AAC1B,oBAAM,uBAAuB,UAAU,cAAc;AAAA,YACzD,OAAO;AAEH,oBAAM,kBAAkB;AAAA,YAC5B;AAAA,UACJ,CAAC;AAAA,QACL;AAGA,YAAI,qBAAqB,OAAO,MAAM,WAAW,OAAO,UAAU,yBAAyB;AACvF,qBAAW,yBAAyB,CAAC;AAAA,QACzC;AAAA,MACJ,WAAW,OAAO,MAAM,SAAS,SAAS;AAEtC,eAAO,MAAM,QAAQ,OAAO,MAAM;AAGlC,YAAI,OAAO,gBAAgB;AACvB,iBAAO,eAAe,QAAQ,eAAa;AACvC,kBAAM,QAAQ,UAAU;AAExB,gBAAI,UAAU,gBAAgB;AAC1B,oBAAM,uBAAuB,UAAU,cAAc;AAAA,YACzD,OAAO;AAEH,oBAAM,kBAAkB;AAAA,YAC5B;AAAA,UACJ,CAAC;AAAA,QACL;AAAA,MACJ,WAAW,OAAO,MAAM,cAAc,UAAU;AAE5C,eAAO,MAAM,IAAI,OAAO,OAAO;AAC/B,eAAO,MAAM,IAAI,OAAO,OAAO;AAC/B,eAAO,MAAM,KAAK,OAAO,OAAO;AAChC,eAAO,MAAM,KAAK,OAAO,OAAO;AAChC,eAAO,MAAM,WAAW,OAAO,OAAO;AACtC,eAAO,MAAM,aAAa;AAC1B,YAAI,OAAO,OAAO,MAAM,oBAAoB,WAAY,QAAO,MAAM,gBAAgB;AACrF,eAAO,MAAM,KAAK;AAGlB,YAAI,OAAO,gBAAgB;AACvB,iBAAO,eAAe,QAAQ,eAAa;AACvC,kBAAM,QAAQ,UAAU;AAExB,gBAAI,UAAU,gBAAgB;AAC1B,oBAAM,uBAAuB,UAAU,cAAc;AAAA,YACzD,OAAO;AAEH,oBAAM,kBAAkB;AAAA,YAC5B;AAAA,UACJ,CAAC;AAAA,QACL;AAAA,MACJ,WAAW,OAAO,MAAM,cAAc,QAAQ;AAE1C,eAAO,MAAM,aAAa,EAAE,GAAG,OAAO,OAAO,WAAW,GAAG,GAAG,OAAO,OAAO,WAAW,EAAE;AACzF,eAAO,MAAM,WAAW,EAAE,GAAG,OAAO,OAAO,SAAS,GAAG,GAAG,OAAO,OAAO,SAAS,EAAE;AAGnF,eAAO,MAAM,WAAW,OAAO,OAAO,YAAY;AAClD,YAAI,OAAO,OAAO,cAAc;AAC5B,iBAAO,MAAM,eAAe,EAAE,GAAG,OAAO,OAAO,aAAa,GAAG,GAAG,OAAO,OAAO,aAAa,EAAE;AAAA,QACnG,OAAO;AACH,iBAAO,MAAM,eAAe;AAAA,QAChC;AAGA,YAAI,OAAO,iBAAiB;AAExB,cAAI,OAAO,gBAAgB,UAAU;AACjC,kBAAM,gBAAgB,OAAO,gBAAgB,SAAS,gBAAgB,QAAQ,OAAO,KAAK;AAC1F,gBAAI,gBAAgB,IAAI;AACpB,qBAAO,gBAAgB,SAAS,gBAAgB,OAAO,eAAe,CAAC;AACvE,kBAAI,OAAO,MAAM,SAAS,OAAO,MAAM,MAAM,eAAe,OAAO,gBAAgB,SAAS,WAAW;AACnG,uBAAO,gBAAgB,SAAS,UAAU,YAAY,OAAO,MAAM,KAAK;AACxE,oBAAI,YAAY,OAAO,MAAM,KAAK;AAAA,cACtC;AAAA,YACJ;AAAA,UACJ;AAGA,cAAI,OAAO,gBAAgB,UAAU;AACjC,gBAAI,CAAC,OAAO,gBAAgB,SAAS,gBAAgB,SAAS,OAAO,KAAK,GAAG;AACzE,qBAAO,gBAAgB,SAAS,gBAAgB,KAAK,OAAO,KAAK;AACjE,qBAAO,MAAM,cAAc,OAAO,gBAAgB;AAClD,kBAAI,OAAO,MAAM,SAAS,OAAO,MAAM,MAAM,eAAe,KAAK;AAC7D,oBAAI,YAAY,OAAO,MAAM,KAAK;AAClC,uBAAO,gBAAgB,SAAS,UAAU,YAAY,OAAO,MAAM,KAAK;AAAA,cAC5E;AAAA,YACJ;AAAA,UACJ,OAAO;AACH,mBAAO,MAAM,cAAc;AAAA,UAC/B;AAAA,QACJ;AAEA,eAAO,MAAM,aAAa;AAC1B,YAAI,OAAO,OAAO,MAAM,oBAAoB,WAAY,QAAO,MAAM,gBAAgB;AACrF,eAAO,MAAM,KAAK;AAAA,MACtB,WACU,OAAO,MAAM,cAAc,SAAS;AAE1C,eAAO,MAAM,aAAa,EAAE,GAAG,OAAO,OAAO,WAAW,GAAG,GAAG,OAAO,OAAO,WAAW,EAAE;AACzF,eAAO,MAAM,WAAW,EAAE,GAAG,OAAO,OAAO,SAAS,GAAG,GAAG,OAAO,OAAO,SAAS,EAAE;AACnF,eAAO,MAAM,gBAAgB,OAAO,OAAO,gBACvC,EAAE,GAAG,OAAO,OAAO,cAAc,GAAG,GAAG,OAAO,OAAO,cAAc,EAAE,IAAI;AAC7E,eAAO,MAAM,gBAAgB,OAAO,OAAO,gBACvC,EAAE,GAAG,OAAO,OAAO,cAAc,GAAG,GAAG,OAAO,OAAO,cAAc,EAAE,IAAI;AAG7E,YAAI,OAAO,OAAO,aAAa;AAC3B,iBAAO,MAAM,uBAAuB,OAAO,OAAO,WAAW;AAAA,QACjE,OAAO;AAEH,iBAAO,MAAM,kBAAkB;AAC/B,iBAAO,MAAM,gBAAgB;AAAA,QACjC;AAEA,eAAO,MAAM,aAAa;AAC1B,eAAO,MAAM,KAAK;AAAA,MAEtB,WACS,OAAO,MAAM,SAAS,QAAQ;AACnC,eAAO,MAAM,QAAQ,OAAO,MAAM;AAGlC,YAAI,OAAO,gBAAgB;AACvB,iBAAO,eAAe,QAAQ,eAAa;AACvC,kBAAM,QAAQ,UAAU;AAExB,gBAAI,UAAU,gBAAgB;AAC1B,oBAAM,uBAAuB,UAAU,cAAc;AAAA,YACzD,OAAO;AAEH,oBAAM,kBAAkB;AAAA,YAC5B;AAAA,UACJ,CAAC;AAAA,QACL;AAAA,MACJ,WACS,OAAO,MAAM,cAAc,kBAAkB;AAElD,eAAO,MAAM,SAAS,KAAK,MAAM,KAAK,UAAU,OAAO,OAAO,MAAM,CAAC;AACrE,eAAO,MAAM,WAAW,OAAO,OAAO;AACtC,eAAO,MAAM,aAAa;AAC1B,YAAI,OAAO,OAAO,MAAM,oBAAoB,WAAY,QAAO,MAAM,gBAAgB;AACrF,eAAO,MAAM,KAAK;AAAA,MACtB,WAAW,OAAO,MAAM,cAAc,aAAa;AAE/C,eAAO,MAAM,IAAI,OAAO,OAAO;AAC/B,eAAO,MAAM,IAAI,OAAO,OAAO;AAC/B,eAAO,MAAM,SAAS,OAAO,OAAO;AACpC,eAAO,MAAM,QAAQ,OAAO,OAAO;AACnC,eAAO,MAAM,WAAW,OAAO,OAAO;AACtC,eAAO,MAAM,aAAa;AAC1B,YAAI,OAAO,OAAO,MAAM,oBAAoB,WAAY,QAAO,MAAM,gBAAgB;AACrF,eAAO,MAAM,KAAK;AAGlB,YAAI,OAAO,gBAAgB;AACvB,iBAAO,eAAe,QAAQ,eAAa;AACvC,kBAAM,QAAQ,UAAU;AAExB,gBAAI,UAAU,gBAAgB;AAC1B,oBAAM,uBAAuB,UAAU,cAAc;AAAA,YACzD,OAAO;AAEH,oBAAM,kBAAkB;AAAA,YAC5B;AAAA,UACJ,CAAC;AAAA,QACL;AAAA,MACJ;AACA,gBAAU,KAAK,MAAM;AACrB;AAAA,IACJ;AAEA,QAAI,OAAO,SAAS,iBAAiB;AACjC,UAAI,OAAO,MAAM,SAAS,QAAQ;AAE9B,cAAM,eAAe,OAAO,MAAM,WAAW,OAAO,OAAO,cAAc,MAAM;AAC/E,YAAI,aAAa;AACb,cAAI,OAAO,WAAW,MAAO,aAAY,aAAa,QAAQ,OAAO,WAAW,KAAK;AACrF,cAAI,OAAO,WAAW,KAAM,aAAY,aAAa,eAAe,OAAO,WAAW,IAAI;AAC1F,cAAI,OAAO,WAAW,KAAM,aAAY,aAAa,aAAa,OAAO,WAAW,IAAI;AACxF,cAAI,OAAO,WAAW,MAAO,aAAY,aAAa,eAAe,OAAO,WAAW,KAAK;AAG5F,cAAI,qBAAqB,OAAO,MAAM,WAAW,OAAO,UAAU,yBAAyB;AACvF,uBAAW,yBAAyB,CAAC;AAAA,UACzC;AAAA,QACJ;AAAA,MACJ,WAAW,OAAO,MAAM,cAAc,SAAS;AAE3C,cAAM,iBAAiB;AAAA,UACnB,GAAG,OAAO,MAAM;AAAA,UAChB,mBAAmB,OAAO,MAAM;AAAA,UAChC,gBAAgB,OAAO,MAAM;AAAA,UAC7B,aAAa,OAAO,MAAM;AAAA,UAC1B,kBAAkB,OAAO,MAAM;AAAA,QACnC;AAGA,eAAO,aAAa;AAEpB,eAAO,MAAM,KAAK;AAAA,MACtB,OAAO;AAEH,eAAO,aAAa,OAAO,MAAM;AACjC,eAAO,MAAM,KAAK;AAAA,MACtB;AACA,gBAAU,KAAK,MAAM;AACrB;AAAA,IACJ;AAAA,EACA,UAAE;AACE,gCAA4B;AAC5B,wBAAoB;AAAA,EACxB;AACJ;AAGA,SAAS,iBAAiB,WAAW,CAAC,MAAM;AACxC,OAAK,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,KAAK;AAC3C,MAAE,eAAe;AACjB,SAAK;AAAA,EACT;AACA,OAAK,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,OAAQ,EAAE,YAAY,EAAE,QAAQ,MAAO;AAC9E,MAAE,eAAe;AACjB,SAAK;AAAA,EACT;AACJ,CAAC;AAGD,SAAS,eAAe,MAAM,GAAG,iBAAiB,SAAS,IAAI;AAC/D,SAAS,eAAe,MAAM,GAAG,iBAAiB,SAAS,IAAI;AAG/D,OAAO,mBAAmB;AAC1B,OAAO,mBAAmB;AAC1B,OAAO,kCAAkC;AACzC,OAAO,sBAAsB;AAC7B,OAAO,0BAA0B;AACjC,OAAO,kCAAkC;AACzC,OAAO,OAAO;AACd,OAAO,OAAO;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|