json-canvas-viewer 3.3.0 → 3.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/README.md +145 -156
  2. package/dist/bridges.cjs +1 -1
  3. package/dist/bridges.cjs.map +1 -1
  4. package/dist/bridges.js +1 -1
  5. package/dist/bridges.js.map +1 -1
  6. package/dist/chimp.cjs +1 -1
  7. package/dist/chimp.js +1 -1
  8. package/dist/controller-BRBUPg_j.js +2 -0
  9. package/dist/controller-BRBUPg_j.js.map +1 -0
  10. package/dist/controller-Bc-S4ZVK.cjs +2 -0
  11. package/dist/controller-Bc-S4ZVK.cjs.map +1 -0
  12. package/dist/dev.cjs +1 -1
  13. package/dist/dev.js +1 -1
  14. package/dist/index-DJQyGIFX.js +2 -0
  15. package/dist/index-DJQyGIFX.js.map +1 -0
  16. package/dist/index-DwvIUSbr.cjs +2 -0
  17. package/dist/index-DwvIUSbr.cjs.map +1 -0
  18. package/dist/index.cjs +1 -1
  19. package/dist/index.js +1 -1
  20. package/dist/modules.cjs +1 -1
  21. package/dist/modules.cjs.map +1 -1
  22. package/dist/modules.js +1 -1
  23. package/dist/modules.js.map +1 -1
  24. package/dist/react.cjs +2 -0
  25. package/dist/react.cjs.map +1 -0
  26. package/dist/react.js +2 -0
  27. package/dist/react.js.map +1 -0
  28. package/dist/renderToString-ChykAKof.js +2 -0
  29. package/dist/renderToString-ChykAKof.js.map +1 -0
  30. package/dist/renderToString-Cxh5DtRo.cjs +2 -0
  31. package/dist/renderToString-Cxh5DtRo.cjs.map +1 -0
  32. package/dist/renderer-0RqgAOLH.js +2 -0
  33. package/dist/renderer-0RqgAOLH.js.map +1 -0
  34. package/dist/renderer-BEKV7hr3.cjs +2 -0
  35. package/dist/renderer-BEKV7hr3.cjs.map +1 -0
  36. package/dist/types/bridges/reactComponent.d.ts +12 -0
  37. package/dist/types/bridges/vueComponent.vue.d.ts +8 -3
  38. package/dist/types/bridges/webpackPlugin.d.ts +7 -0
  39. package/dist/types/bridges.d.ts +1 -1
  40. package/dist/types/core/baseModule.d.ts +13 -9
  41. package/dist/types/core/controller.d.ts +6 -1
  42. package/dist/types/core/dataManager.d.ts +29 -10
  43. package/dist/types/core/declarations.d.ts +20 -14
  44. package/dist/types/core/index.d.ts +16 -5
  45. package/dist/types/core/interactionHandler.d.ts +3 -1
  46. package/dist/types/core/overlayManager.d.ts +7 -1
  47. package/dist/types/core/renderer.d.ts +10 -4
  48. package/dist/types/core/styleManager.d.ts +48 -0
  49. package/dist/types/core/utilities.d.ts +3 -6
  50. package/dist/types/dev.d.ts +1 -0
  51. package/dist/types/index.d.ts +1 -1
  52. package/dist/types/modules/controls/index.d.ts +4 -1
  53. package/dist/types/modules/minimap/index.d.ts +5 -1
  54. package/dist/types/modules/mistouchPreventer/index.d.ts +7 -5
  55. package/dist/vue.cjs +2 -0
  56. package/dist/vue.cjs.map +1 -0
  57. package/dist/vue.js +2 -0
  58. package/dist/vue.js.map +1 -0
  59. package/dist/webpackLoader.js +33 -0
  60. package/package.json +57 -40
  61. package/dist/controller--Q72jFEw.cjs +0 -2
  62. package/dist/controller--Q72jFEw.cjs.map +0 -1
  63. package/dist/controller-siZ5v-SD.js +0 -2
  64. package/dist/controller-siZ5v-SD.js.map +0 -1
  65. package/dist/index-BSkMdAcV.cjs +0 -2
  66. package/dist/index-BSkMdAcV.cjs.map +0 -1
  67. package/dist/index-u8PUIMyl.js +0 -2
  68. package/dist/index-u8PUIMyl.js.map +0 -1
  69. package/dist/renderer-CZ85ZN6O.js +0 -2
  70. package/dist/renderer-CZ85ZN6O.js.map +0 -1
  71. package/dist/renderer-D9iInH9_.cjs +0 -2
  72. package/dist/renderer-D9iInH9_.cjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"renderer-D9iInH9_.cjs","sources":["../src/core/overlayManager.ts","../src/core/interactionHandler.ts","../src/core/renderer.ts"],"sourcesContent":["import { type BaseArgs, BaseModule } from '$/baseModule';\nimport Controller from '$/controller';\nimport DataManager from '$/dataManager';\nimport InteractionHandler from '$/interactionHandler';\nimport utilities, { destroyError } from '$/utilities';\nimport type { MarkdownParser } from './declarations';\n\ntype Options = {\n\tmarkdownParser?: MarkdownParser;\n};\n\nexport default class OverlayManager extends BaseModule<Options> {\n\tprivate _overlaysLayer: HTMLDivElement | null = document.createElement('div');\n\tprivate overlays: Record<string, HTMLDivElement> = {}; // { id: node } the overlays in viewport\n\tprivate selectedId: string | null = null;\n\tprivate eventListeners: Record<string, Array<EventListener | null>> = {};\n\tprivate DM: DataManager;\n\tprivate IH: () => InteractionHandler;\n\tprivate parse: MarkdownParser;\n\n\tprivate get overlaysLayer() {\n\t\tif (!this._overlaysLayer) throw destroyError;\n\t\treturn this._overlaysLayer;\n\t}\n\n\thooks = {\n\t\tonInteractionStart: utilities.makeHook(),\n\t\tonInteractionEnd: utilities.makeHook(),\n\t};\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tthis.parse = this.options.markdownParser || ((markdown: string) => markdown);\n\t\tthis.DM = this.container.get(DataManager);\n\t\tthis.IH = this.container.get(InteractionHandler, { lazy: true });\n\t\tconst controller = this.container.get(Controller);\n\t\tcontroller.hooks.onRefresh.subscribe(this.updateOverlays);\n\n\t\tthis._overlaysLayer = document.createElement('div');\n\t\tthis._overlaysLayer.className = 'overlays';\n\t\tthis.DM.data.container.appendChild(this.overlaysLayer);\n\n\t\tthis.onStart(this.start);\n\t\tthis.onDispose(this.dispose);\n\t}\n\n\tprivate start = () => {\n\t\tthis.IH().onClick.subscribe(this.select);\n\t\tconst cbd = this.DM.data.canvasBaseDir;\n\t\tconst createOverlay = async (node: JSONCanvasNode) => {\n\t\t\tswitch (node.type) {\n\t\t\t\tcase 'text': {\n\t\t\t\t\tthis.updateOverlay(node, node.text, 'text');\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'file': {\n\t\t\t\t\tif (node.file.match(/\\.md$/i)) this.loadMarkdownForNode(node);\n\t\t\t\t\telse if (node.file.match(/\\.(png|jpg|jpeg|gif|svg|webp)$/i))\n\t\t\t\t\t\tthis.updateOverlay(node, cbd + node.file, 'image');\n\t\t\t\t\telse if (node.file.match(/\\.(mp3|wav)$/i))\n\t\t\t\t\t\tthis.updateOverlay(node, cbd + node.file, 'audio');\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'link': {\n\t\t\t\t\tthis.updateOverlay(node, node.url, 'link');\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tObject.values(this.DM.data.nodeMap).forEach(node => {\n\t\t\tcreateOverlay(node);\n\t\t});\n\t};\n\n\tprivate select = (id: string | null) => {\n\t\tconst previous = !this.selectedId ? null : this.overlays[this.selectedId];\n\t\tconst current = !id ? null : this.overlays[id];\n\t\tif (previous) previous.classList.remove('active');\n\t\tif (current) {\n\t\t\tcurrent.classList.add('active');\n\t\t\tthis.hooks.onInteractionStart();\n\t\t} else this.hooks.onInteractionEnd();\n\t\tthis.selectedId = id;\n\t};\n\n\tprivate loadMarkdownForNode = async (node: JSONCanvasFileNode) => {\n\t\tthis.updateOverlay(node, 'Loading...', 'text');\n\t\tlet parsedContent: string;\n\t\ttry {\n\t\t\tconst response = await fetch(this.DM.data.canvasBaseDir + node.file);\n\t\t\tconst result = await response.text();\n\t\t\tconst frontmatterMatch = result.match(/^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/);\n\t\t\tif (frontmatterMatch) parsedContent = await this.parse(frontmatterMatch[2]);\n\t\t\telse parsedContent = await this.parse(result);\n\t\t} catch (err) {\n\t\t\tconsole.error('[JSONCanvasViewer] Failed to load markdown:', err);\n\t\t\tparsedContent = 'Failed to load content.';\n\t\t}\n\t\tthis.updateOverlay(node, parsedContent, 'text');\n\t};\n\n\tprivate updateOverlays = () => {\n\t\tconst data = this.DM.data;\n\t\tthis.overlaysLayer.style.transform = `translate(${data.offsetX}px, ${data.offsetY}px) scale(${data.scale})`;\n\t};\n\n\tprivate async updateOverlay(node: JSONCanvasNode, content: string, type: string) {\n\t\tlet element = this.overlays[node.id];\n\t\tif (!element) {\n\t\t\telement = await this.constructOverlay(node, content, type);\n\t\t\tthis.overlaysLayer.appendChild(element);\n\t\t\tthis.overlays[node.id] = element;\n\t\t\telement.style.left = `${node.x}px`;\n\t\t\telement.style.top = `${node.y}px`;\n\t\t\telement.style.width = `${node.width}px`;\n\t\t\telement.style.height = `${node.height}px`;\n\t\t} else if (type === 'text') {\n\t\t\tconst parsedContentContainer = element.getElementsByClassName('parsed-content-wrapper')[0];\n\t\t\tparsedContentContainer.innerHTML = content;\n\t\t}\n\t}\n\n\tprivate async constructOverlay(node: JSONCanvasNode, content: string, type: string) {\n\t\tconst color = utilities.getColor(node.color);\n\t\tconst overlay = document.createElement('div');\n\t\toverlay.classList.add('overlay-container');\n\t\toverlay.id = node.id;\n\t\toverlay.style.backgroundColor = color.background;\n\t\toverlay.style.setProperty('--active-color', color.active);\n\t\tswitch (type) {\n\t\t\tcase 'text': {\n\t\t\t\toverlay.classList.add('markdown-content');\n\t\t\t\tconst parsedContentWrapper = document.createElement('div');\n\t\t\t\tparsedContentWrapper.innerHTML = await this.parse(content || '');\n\t\t\t\tparsedContentWrapper.classList.add('parsed-content-wrapper');\n\t\t\t\toverlay.appendChild(parsedContentWrapper);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'link': {\n\t\t\t\tconst iframe = document.createElement('iframe');\n\t\t\t\tiframe.src = content;\n\t\t\t\tiframe.sandbox = 'allow-scripts allow-same-origin';\n\t\t\t\tiframe.className = 'link-iframe';\n\t\t\t\tiframe.loading = 'lazy';\n\t\t\t\toverlay.appendChild(iframe);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'audio': {\n\t\t\t\tconst audio = document.createElement('audio');\n\t\t\t\taudio.className = 'audio';\n\t\t\t\taudio.src = content;\n\t\t\t\taudio.controls = true;\n\t\t\t\toverlay.appendChild(audio);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'image': {\n\t\t\t\tconst img = document.createElement('img');\n\t\t\t\timg.src = content;\n\t\t\t\timg.loading = 'lazy';\n\t\t\t\toverlay.appendChild(img);\n\t\t\t}\n\t\t}\n\t\tswitch (type) {\n\t\t\tcase 'link':\n\t\t\tcase 'audio': {\n\t\t\t\tconst clickLayer = document.createElement('div');\n\t\t\t\tclickLayer.className = 'click-layer';\n\t\t\t\toverlay.appendChild(clickLayer);\n\t\t\t}\n\t\t}\n\t\tconst overlayBorder = document.createElement('div');\n\t\toverlayBorder.className = 'overlay-border';\n\t\toverlayBorder.style.borderColor = color.border;\n\t\toverlay.appendChild(overlayBorder);\n\t\tconst onStart = () => {\n\t\t\tif (node.id === this.selectedId) this.hooks.onInteractionStart();\n\t\t};\n\t\tconst onEnd = () => {\n\t\t\tif (node.id === this.selectedId) this.hooks.onInteractionEnd();\n\t\t};\n\t\toverlay.addEventListener('pointerenter', onStart);\n\t\toverlay.addEventListener('pointerleave', onEnd);\n\t\toverlay.addEventListener('touchstart', onStart);\n\t\toverlay.addEventListener('touchend', onEnd);\n\t\tthis.eventListeners[node.id] = [onStart, onEnd];\n\t\treturn overlay;\n\t}\n\n\tprivate dispose = () => {\n\t\twhile (this.overlaysLayer.firstElementChild) {\n\t\t\tconst child = this.overlaysLayer.firstElementChild;\n\t\t\tif (this.eventListeners[child.id]) {\n\t\t\t\tconst onStart = this.eventListeners[child.id][0];\n\t\t\t\tconst onEnd = this.eventListeners[child.id][1];\n\t\t\t\tif (!onStart || !onEnd) throw destroyError;\n\t\t\t\tchild.removeEventListener('pointerenter', onStart);\n\t\t\t\tchild.removeEventListener('pointerleave', onEnd);\n\t\t\t\tchild.removeEventListener('touchstart', onStart);\n\t\t\t\tchild.removeEventListener('touchend', onEnd);\n\t\t\t\tthis.eventListeners[child.id][0] = null;\n\t\t\t\tthis.eventListeners[child.id][1] = null;\n\t\t\t}\n\t\t\tchild.remove();\n\t\t}\n\t\tthis.overlaysLayer.remove();\n\t\tthis._overlaysLayer = null;\n\t};\n}\n","import {\n\tClick,\n\ttype Ctors,\n\tDrag,\n\tMultitouchPanZoom,\n\tPointeract,\n\ttype Options as PointeractOptions,\n\tPreventDefault,\n\ttype StdEvents,\n\tWheelPanZoom,\n} from 'pointeract';\nimport { type BaseArgs, BaseModule } from '$/baseModule';\nimport DataManager from '$/dataManager';\nimport OverlayManager from '$/overlayManager';\nimport utilities from '$/utilities';\n\ntype Options = {\n\tpointeract?: PointeractOptions<Ctors<[Click, Drag, WheelPanZoom, PreventDefault, MultitouchPanZoom]>>;\n};\n\nexport default class InteractionHandler extends BaseModule<Options> {\n\tprivate pointeract: Pointeract<Ctors<[Click, Drag, WheelPanZoom, PreventDefault, MultitouchPanZoom]>>;\n\tprivate DM: DataManager;\n\tonClick = utilities.makeHook<[string | null]>();\n\tstopInteraction: Pointeract['stop'];\n\tstartInteraction: Pointeract['start'];\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tthis.DM = this.container.get(DataManager);\n\t\tconst options = Object.assign(this.options.pointeract || {}, {\n\t\t\tcoordinateOutput: 'relative',\n\t\t});\n\t\tthis.pointeract = new Pointeract(\n\t\t\tthis.DM.data.container,\n\t\t\t[Click, Drag, WheelPanZoom, PreventDefault, MultitouchPanZoom],\n\t\t\toptions,\n\t\t);\n\t\tthis.startInteraction = this.pointeract.start;\n\t\tthis.stopInteraction = this.pointeract.stop;\n\t\tconst OM = this.container.get(OverlayManager);\n\t\tOM.hooks.onInteractionStart.subscribe(this.stopInteraction);\n\t\tOM.hooks.onInteractionEnd.subscribe(this.startInteraction);\n\n\t\tthis.onStart(this.start);\n\t\tthis.onDispose(this.dispose);\n\t}\n\n\tprivate start = () => {\n\t\tthis.pointeract.on('pan', this.onPan);\n\t\tthis.pointeract.on('drag', this.onPan);\n\t\tthis.pointeract.on('zoom', this.onZoom);\n\t\tthis.pointeract.on('trueClick', this.onTrueClick);\n\t\tthis.pointeract.start();\n\t};\n\n\tprivate onPan = (event: StdEvents['pan']) => {\n\t\tthis.DM.pan(event.detail);\n\t};\n\tprivate onZoom = (event: StdEvents['zoom']) => {\n\t\tconst detail = event.detail;\n\t\tthis.DM.zoom(detail.factor, { x: detail.x, y: detail.y });\n\t};\n\n\tprivate onTrueClick = (e: StdEvents['trueClick']) => {\n\t\tconst detail = e.detail;\n\t\tfunction isUIControl(target: HTMLElement | null) {\n\t\t\tif (!target) return false;\n\t\t\treturn target.closest('.controls') || target.closest('button') || target.closest('input');\n\t\t}\n\t\tif (isUIControl(e.detail.target as HTMLElement | null)) return;\n\t\tconst node = this.DM.findNodeAt({ x: detail.x, y: detail.y });\n\t\tthis.onClick(node ? node.id : null);\n\t};\n\n\tprivate dispose = () => {\n\t\tthis.pointeract.off('pan', this.onPan);\n\t\tthis.pointeract.off('zoom', this.onZoom);\n\t\tthis.pointeract.off('trueClick', this.onTrueClick);\n\t\tthis.pointeract.dispose();\n\t};\n}\n","import { type BaseArgs, BaseModule } from '$/baseModule';\nimport Controller from '$/controller';\nimport DataManager from '$/dataManager';\nimport utilities, { destroyError } from '$/utilities';\n\ninterface viewport {\n\tleft: number;\n\tright: number;\n\ttop: number;\n\tbottom: number;\n}\n\ninterface RuntimeJSONCanvasEdge extends JSONCanvasEdge {\n\tcontrolPoints?: Array<number>;\n}\n\nconst ARROW_LENGTH = 12;\nconst ARROW_WIDTH = 7;\nconst NODE_RADIUS = 12;\nconst FONT_COLOR = '#fff';\nconst CSS_ZOOM_REDRAW_INTERVAL = 500;\n\nexport default class Renderer extends BaseModule {\n\tprivate _canvas: HTMLCanvasElement | null;\n\tprivate ctx: CanvasRenderingContext2D;\n\tprivate DM: DataManager;\n\tprivate zoomInOptimize: {\n\t\tlastDrawnScale: number;\n\t\tlastDrawnViewport: viewport;\n\t\ttimeout: NodeJS.Timeout | null;\n\t\tlastCallTime: number;\n\t} = {\n\t\tlastDrawnScale: 0,\n\t\tlastDrawnViewport: {\n\t\t\tleft: 0,\n\t\t\tright: 0,\n\t\t\ttop: 0,\n\t\t\tbottom: 0,\n\t\t},\n\t\ttimeout: null,\n\t\tlastCallTime: 0,\n\t};\n\n\tprivate get canvas() {\n\t\tif (this._canvas === null) throw destroyError;\n\t\treturn this._canvas;\n\t}\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tconst controller = this.container.get(Controller);\n\t\tcontroller.hooks.onRefresh.subscribe(this.redraw);\n\t\tcontroller.hooks.onResize.subscribe(this.optimizeDPR);\n\t\tthis.DM = this.container.get(DataManager);\n\t\tthis._canvas = document.createElement('canvas');\n\t\tthis._canvas.className = 'main-canvas';\n\t\tthis.ctx = this._canvas.getContext('2d') as CanvasRenderingContext2D;\n\t\tthis.DM.data.container.appendChild(this._canvas);\n\t\tthis.onDispose(this.dispose);\n\t}\n\n\tprivate optimizeDPR = () => {\n\t\tconst container = this.DM.data.container;\n\t\tutilities.resizeCanvasForDPR(this.canvas, container.offsetWidth, container.offsetHeight);\n\t};\n\n\tprivate redraw = () => {\n\t\tif (this.zoomInOptimize.timeout) {\n\t\t\tclearTimeout(this.zoomInOptimize.timeout);\n\t\t\tthis.zoomInOptimize.timeout = null;\n\t\t}\n\t\tconst now = Date.now();\n\t\tconst offsetX = this.DM.data.offsetX;\n\t\tconst offsetY = this.DM.data.offsetY;\n\t\tconst scale = this.DM.data.scale;\n\t\tconst currentViewport = this.getCurrentViewport(offsetX, offsetY, scale);\n\t\tif (\n\t\t\tthis.isViewportInside(currentViewport, this.zoomInOptimize.lastDrawnViewport) &&\n\t\t\tscale !== this.zoomInOptimize.lastDrawnScale\n\t\t) {\n\t\t\tconst timeSinceLast = now - this.zoomInOptimize.lastCallTime;\n\t\t\tif (timeSinceLast < CSS_ZOOM_REDRAW_INTERVAL) {\n\t\t\t\tthis.zoomInOptimize.timeout = setTimeout(() => {\n\t\t\t\t\tthis.trueRedraw(offsetX, offsetY, scale, currentViewport);\n\t\t\t\t\tthis.zoomInOptimize.lastCallTime = now;\n\t\t\t\t\tthis.zoomInOptimize.timeout = null;\n\t\t\t\t}, 60);\n\t\t\t\tthis.fakeRedraw(currentViewport, scale);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tthis.zoomInOptimize.lastCallTime = now;\n\t\tthis.trueRedraw(offsetX, offsetY, scale, currentViewport);\n\t};\n\n\tprivate trueRedraw(offsetX: number, offsetY: number, scale: number, currentViewport: viewport) {\n\t\tthis.zoomInOptimize.lastDrawnViewport = currentViewport;\n\t\tthis.zoomInOptimize.lastDrawnScale = scale;\n\t\tthis.canvas.style.transform = '';\n\t\tthis.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n\t\tthis.ctx.save();\n\t\tthis.ctx.translate(offsetX, offsetY);\n\t\tthis.ctx.scale(scale, scale);\n\t\tconst canvasData = this.DM.data.canvasData;\n\t\tcanvasData.nodes.forEach(node => {\n\t\t\tswitch (node.type) {\n\t\t\t\tcase 'group':\n\t\t\t\t\tthis.drawGroup(node, scale);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'file':\n\t\t\t\t\tthis.drawFileNode(node);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\t\tcanvasData.edges.forEach(edge => {\n\t\t\tthis.drawEdge(edge);\n\t\t});\n\t\tthis.ctx.restore();\n\t}\n\n\tprivate fakeRedraw(currentViewport: viewport, scale: number) {\n\t\tconst cssScale = scale / this.zoomInOptimize.lastDrawnScale;\n\t\tconst currentOffsetX = (this.zoomInOptimize.lastDrawnViewport.left - currentViewport.left) * scale;\n\t\tconst currentOffsetY = (this.zoomInOptimize.lastDrawnViewport.top - currentViewport.top) * scale;\n\t\tthis.canvas.style.transform = `translate(${currentOffsetX}px, ${currentOffsetY}px) scale(${cssScale})`;\n\t}\n\n\tprivate isViewportInside = (inner: viewport, outer: viewport) =>\n\t\tinner.left > outer.left &&\n\t\tinner.top > outer.top &&\n\t\tinner.right < outer.right &&\n\t\tinner.bottom < outer.bottom;\n\n\tprivate getCurrentViewport = (offsetX: number, offsetY: number, scale: number) => {\n\t\tconst left = -offsetX / scale;\n\t\tconst top = -offsetY / scale;\n\t\tconst container = this.DM.data.container;\n\t\tconst right = left + container.clientWidth / scale;\n\t\tconst bottom = top + container.clientHeight / scale;\n\t\treturn { left, top, right, bottom };\n\t};\n\n\tprivate drawLabelBar = (x: number, y: number, label: string, color: string, scale: number) => {\n\t\tconst barHeight = 30 * scale;\n\t\tconst radius = 6 * scale;\n\t\tconst yOffset = 8 * scale;\n\t\tconst fontSize = 16 * scale;\n\t\tconst xPadding = 6 * scale;\n\t\tthis.ctx.save();\n\t\tthis.ctx.translate(x, y);\n\t\tthis.ctx.scale(1 / scale, 1 / scale);\n\t\tthis.ctx.font = `${fontSize}px 'Inter', sans-serif`;\n\t\tconst barWidth = this.ctx.measureText(label).width + 2 * xPadding;\n\t\tthis.ctx.translate(0, -barHeight - yOffset);\n\t\tthis.ctx.fillStyle = color;\n\t\tthis.ctx.beginPath();\n\t\tthis.ctx.moveTo(radius, 0);\n\t\tthis.ctx.lineTo(barWidth - radius, 0);\n\t\tthis.ctx.quadraticCurveTo(barWidth, 0, barWidth, radius);\n\t\tthis.ctx.lineTo(barWidth, barHeight - radius);\n\t\tthis.ctx.quadraticCurveTo(barWidth, barHeight, barWidth - radius, barHeight);\n\t\tthis.ctx.lineTo(radius, barHeight);\n\t\tthis.ctx.quadraticCurveTo(0, barHeight, 0, barHeight - radius);\n\t\tthis.ctx.lineTo(0, radius);\n\t\tthis.ctx.quadraticCurveTo(0, 0, radius, 0);\n\t\tthis.ctx.closePath();\n\t\tthis.ctx.fill();\n\t\tthis.ctx.fillStyle = FONT_COLOR;\n\t\tthis.ctx.fillText(label, xPadding, barHeight * 0.65);\n\t\tthis.ctx.restore();\n\t};\n\n\tprivate drawNodeBackground = (node: JSONCanvasNode) => {\n\t\tconst colors = utilities.getColor(node.color);\n\t\tconst radius = NODE_RADIUS;\n\t\tthis.ctx.globalAlpha = 1.0;\n\t\tthis.ctx.fillStyle = colors.background;\n\t\tutilities.drawRoundRect(this.ctx, node.x + 1, node.y + 1, node.width - 2, node.height - 2, radius);\n\t\tthis.ctx.fill();\n\t\tthis.ctx.strokeStyle = colors.border;\n\t\tthis.ctx.lineWidth = 2;\n\t\tutilities.drawRoundRect(this.ctx, node.x, node.y, node.width, node.height, radius);\n\t\tthis.ctx.stroke();\n\t};\n\n\tprivate drawGroup = (node: JSONCanvasGroupNode, scale: number) => {\n\t\tthis.drawNodeBackground(node);\n\t\tif (node.label)\n\t\t\tthis.drawLabelBar(node.x, node.y, node.label, utilities.getColor(node.color).active, scale);\n\t};\n\n\tprivate drawFileNode = (node: JSONCanvasFileNode) => {\n\t\tthis.ctx.fillStyle = FONT_COLOR;\n\t\tthis.ctx.font = '16px sans-serif';\n\t\tthis.ctx.fillText(node.file, node.x + 5, node.y - 10);\n\t};\n\n\tprivate drawEdge = (edge: RuntimeJSONCanvasEdge) => {\n\t\tconst { fromNode, toNode } = this.getEdgeNodes(edge);\n\t\tconst gac = utilities.getAnchorCoord;\n\t\tconst [startX, startY] = gac(fromNode, edge.fromSide);\n\t\tconst [endX, endY] = gac(toNode, edge.toSide);\n\t\tconst { active } = utilities.getColor(edge.color);\n\t\tlet [startControlX, startControlY, endControlX, endControlY] = [0, 0, 0, 0];\n\t\tif (!edge.controlPoints) {\n\t\t\t[startControlX, startControlY, endControlX, endControlY] = this.getControlPoints(\n\t\t\t\tstartX,\n\t\t\t\tstartY,\n\t\t\t\tendX,\n\t\t\t\tendY,\n\t\t\t\tedge.fromSide,\n\t\t\t\tedge.toSide,\n\t\t\t);\n\t\t\tedge.controlPoints = [startControlX, startControlY, endControlX, endControlY];\n\t\t} else [startControlX, startControlY, endControlX, endControlY] = edge.controlPoints;\n\t\tthis.drawCurvedPath(\n\t\t\tstartX,\n\t\t\tstartY,\n\t\t\tendX,\n\t\t\tendY,\n\t\t\tstartControlX,\n\t\t\tstartControlY,\n\t\t\tendControlX,\n\t\t\tendControlY,\n\t\t\tactive,\n\t\t);\n\t\tthis.drawArrowhead(endX, endY, endControlX, endControlY, active);\n\t\tif (edge.label) {\n\t\t\tconst t = 0.5;\n\t\t\tconst x =\n\t\t\t\t(1 - t) ** 3 * startX +\n\t\t\t\t3 * (1 - t) ** 2 * t * startControlX +\n\t\t\t\t3 * (1 - t) * t * t * endControlX +\n\t\t\t\tt ** 3 * endX;\n\t\t\tconst y =\n\t\t\t\t(1 - t) ** 3 * startY +\n\t\t\t\t3 * (1 - t) ** 2 * t * startControlY +\n\t\t\t\t3 * (1 - t) * t * t * endControlY +\n\t\t\t\tt ** 3 * endY;\n\t\t\tthis.ctx.font = '18px sans-serif';\n\t\t\tconst metrics = this.ctx.measureText(edge.label);\n\t\t\tconst padding = 8;\n\t\t\tconst labelWidth = metrics.width + padding * 2;\n\t\t\tconst labelHeight = 20;\n\t\t\tthis.ctx.fillStyle = '#222';\n\t\t\tthis.ctx.beginPath();\n\t\t\tutilities.drawRoundRect(\n\t\t\t\tthis.ctx,\n\t\t\t\tx - labelWidth / 2,\n\t\t\t\ty - labelHeight / 2 - 2,\n\t\t\t\tlabelWidth,\n\t\t\t\tlabelHeight,\n\t\t\t\t4,\n\t\t\t);\n\t\t\tthis.ctx.fill();\n\t\t\tthis.ctx.fillStyle = '#ccc';\n\t\t\tthis.ctx.textAlign = 'center';\n\t\t\tthis.ctx.textBaseline = 'middle';\n\t\t\tthis.ctx.fillText(edge.label, x, y - 2);\n\t\t\tthis.ctx.textAlign = 'left';\n\t\t\tthis.ctx.textBaseline = 'alphabetic';\n\t\t}\n\t};\n\n\tprivate getEdgeNodes = (edge: JSONCanvasEdge) => ({\n\t\tfromNode: this.DM.data.nodeMap[edge.fromNode],\n\t\ttoNode: this.DM.data.nodeMap[edge.toNode],\n\t});\n\n\tprivate getControlPoints = (\n\t\tstartX: number,\n\t\tstartY: number,\n\t\tendX: number,\n\t\tendY: number,\n\t\tfromSide: string,\n\t\ttoSide: string,\n\t) => {\n\t\tconst distanceX = endX - startX;\n\t\tconst distanceY = endY - startY;\n\t\tconst realDistance =\n\t\t\tMath.min(Math.abs(distanceX), Math.abs(distanceY)) +\n\t\t\t0.3 * Math.max(Math.abs(distanceX), Math.abs(distanceY));\n\t\tconst clamp = (val: number, min: number, max: number) => Math.max(min, Math.min(max, val));\n\t\tconst PADDING = clamp(realDistance * 0.5, 60, 300);\n\t\tlet startControlX = startX;\n\t\tlet startControlY = startY;\n\t\tlet endControlX = endX;\n\t\tlet endControlY = endY;\n\t\tswitch (fromSide) {\n\t\t\tcase 'top':\n\t\t\t\tstartControlY = startY - PADDING;\n\t\t\t\tbreak;\n\t\t\tcase 'bottom':\n\t\t\t\tstartControlY = startY + PADDING;\n\t\t\t\tbreak;\n\t\t\tcase 'left':\n\t\t\t\tstartControlX = startX - PADDING;\n\t\t\t\tbreak;\n\t\t\tcase 'right':\n\t\t\t\tstartControlX = startX + PADDING;\n\t\t\t\tbreak;\n\t\t}\n\t\tswitch (toSide) {\n\t\t\tcase 'top':\n\t\t\t\tendControlY = endY - PADDING;\n\t\t\t\tbreak;\n\t\t\tcase 'bottom':\n\t\t\t\tendControlY = endY + PADDING;\n\t\t\t\tbreak;\n\t\t\tcase 'left':\n\t\t\t\tendControlX = endX - PADDING;\n\t\t\t\tbreak;\n\t\t\tcase 'right':\n\t\t\t\tendControlX = endX + PADDING;\n\t\t\t\tbreak;\n\t\t}\n\t\treturn [startControlX, startControlY, endControlX, endControlY];\n\t};\n\n\tprivate drawCurvedPath = (\n\t\tstartX: number,\n\t\tstartY: number,\n\t\tendX: number,\n\t\tendY: number,\n\t\tc1x: number,\n\t\tc1y: number,\n\t\tc2x: number,\n\t\tc2y: number,\n\t\tcolor: string,\n\t) => {\n\t\tthis.ctx.beginPath();\n\t\tthis.ctx.moveTo(startX, startY);\n\t\tthis.ctx.bezierCurveTo(c1x, c1y, c2x, c2y, endX, endY);\n\t\tthis.ctx.strokeStyle = color;\n\t\tthis.ctx.lineWidth = 2;\n\t\tthis.ctx.stroke();\n\t};\n\n\tprivate drawArrowhead = (tipX: number, tipY: number, fromX: number, fromY: number, color: string) => {\n\t\tconst dx = tipX - fromX;\n\t\tconst dy = tipY - fromY;\n\t\tconst length = Math.sqrt(dx * dx + dy * dy);\n\t\tif (length === 0) return;\n\t\tconst unitX = dx / length;\n\t\tconst unitY = dy / length;\n\t\tconst leftX = tipX - unitX * ARROW_LENGTH - unitY * ARROW_WIDTH;\n\t\tconst leftY = tipY - unitY * ARROW_LENGTH + unitX * ARROW_WIDTH;\n\t\tconst rightX = tipX - unitX * ARROW_LENGTH + unitY * ARROW_WIDTH;\n\t\tconst rightY = tipY - unitY * ARROW_LENGTH - unitX * ARROW_WIDTH;\n\t\tthis.ctx.beginPath();\n\t\tthis.ctx.fillStyle = color;\n\t\tthis.ctx.moveTo(tipX, tipY);\n\t\tthis.ctx.lineTo(leftX, leftY);\n\t\tthis.ctx.lineTo(rightX, rightY);\n\t\tthis.ctx.closePath();\n\t\tthis.ctx.fill();\n\t};\n\n\tprivate dispose = () => {\n\t\tif (this.zoomInOptimize.timeout) {\n\t\t\tclearTimeout(this.zoomInOptimize.timeout);\n\t\t\tthis.zoomInOptimize.timeout = null;\n\t\t}\n\t\tthis.canvas.remove();\n\t\tthis._canvas = null;\n\t};\n}\n"],"names":["OverlayManager","BaseModule","_overlaysLayer","document","createElement","overlays","selectedId","eventListeners","DM","IH","parse","overlaysLayer","this","destroyError","hooks","onInteractionStart","utilities","makeHook","onInteractionEnd","constructor","args","super","options","markdownParser","markdown","container","get","DataManager","InteractionHandler","lazy","Controller","onRefresh","subscribe","updateOverlays","className","data","appendChild","onStart","start","onDispose","dispose","onClick","select","cbd","canvasBaseDir","createOverlay","async","node","type","updateOverlay","text","file","match","loadMarkdownForNode","url","Object","values","nodeMap","forEach","id","previous","current","classList","remove","add","parsedContent","response","fetch","result","frontmatterMatch","err","console","error","style","transform","offsetX","offsetY","scale","content","element","getElementsByClassName","innerHTML","constructOverlay","left","x","top","y","width","height","color","getColor","overlay","backgroundColor","background","setProperty","active","parsedContentWrapper","iframe","src","sandbox","loading","audio","controls","img","clickLayer","overlayBorder","borderColor","border","onEnd","addEventListener","firstElementChild","child","removeEventListener","pointeract","stopInteraction","startInteraction","assign","coordinateOutput","Pointeract","Click","Drag","WheelPanZoom","PreventDefault","MultitouchPanZoom","stop","OM","on","onPan","onZoom","onTrueClick","event","pan","detail","zoom","factor","e","target","closest","findNodeAt","off","FONT_COLOR","Renderer","_canvas","ctx","zoomInOptimize","lastDrawnScale","lastDrawnViewport","right","bottom","timeout","lastCallTime","canvas","controller","redraw","onResize","optimizeDPR","getContext","resizeCanvasForDPR","offsetWidth","offsetHeight","clearTimeout","now","Date","currentViewport","getCurrentViewport","isViewportInside","setTimeout","trueRedraw","fakeRedraw","clearRect","save","translate","canvasData","nodes","drawGroup","drawFileNode","edges","edge","drawEdge","restore","cssScale","currentOffsetX","currentOffsetY","inner","outer","clientWidth","clientHeight","drawLabelBar","label","barHeight","radius","yOffset","fontSize","xPadding","font","barWidth","measureText","fillStyle","beginPath","moveTo","lineTo","quadraticCurveTo","closePath","fill","fillText","drawNodeBackground","colors","globalAlpha","drawRoundRect","strokeStyle","lineWidth","stroke","fromNode","toNode","getEdgeNodes","gac","getAnchorCoord","startX","startY","fromSide","endX","endY","toSide","startControlX","startControlY","endControlX","endControlY","controlPoints","getControlPoints","drawCurvedPath","drawArrowhead","t","padding","labelWidth","labelHeight","textAlign","textBaseline","distanceX","distanceY","realDistance","Math","min","abs","max","PADDING","val","c1x","c1y","c2x","c2y","bezierCurveTo","tipX","tipY","fromX","fromY","dx","dy","length","sqrt","unitX","unitY","leftX","leftY","rightX","rightY"],"mappings":"kFAWA,MAAqBA,UAAuBC,EAAAA,WACnCC,eAAwCC,SAASC,cAAc,OAC/DC,SAA2C,CAAA,EAC3CC,WAA4B,KAC5BC,eAA8D,CAAA,EAC9DC,GACAC,GACAC,MAER,iBAAYC,GACX,IAAKC,KAAKV,eAAgB,MAAMW,EAAAA,aAChC,OAAOD,KAAKV,cACb,CAEAY,MAAQ,CACPC,mBAAoBC,EAAAA,UAAUC,WAC9BC,iBAAkBF,EAAAA,UAAUC,YAG7B,WAAAE,IAAeC,GACdC,SAASD,GACTR,KAAKF,MAAQE,KAAKU,QAAQC,gBAAA,CAAoBC,GAAqBA,GACnEZ,KAAKJ,GAAKI,KAAKa,UAAUC,IAAIC,EAAAA,aAC7Bf,KAAKH,GAAKG,KAAKa,UAAUC,IAAIE,EAAoB,CAAEC,MAAM,IACtCjB,KAAKa,UAAUC,IAAII,EAAAA,YAC3BhB,MAAMiB,UAAUC,UAAUpB,KAAKqB,gBAE1CrB,KAAKV,eAAiBC,SAASC,cAAc,OAC7CQ,KAAKV,eAAegC,UAAY,WAChCtB,KAAKJ,GAAG2B,KAAKV,UAAUW,YAAYxB,KAAKD,eAExCC,KAAKyB,QAAQzB,KAAK0B,OAClB1B,KAAK2B,UAAU3B,KAAK4B,QACrB,CAEQF,MAAQ,KACf1B,KAAKH,KAAKgC,QAAQT,UAAUpB,KAAK8B,QACjC,MAAMC,EAAM/B,KAAKJ,GAAG2B,KAAKS,cACnBC,EAAgBC,MAAOC,IAC5B,OAAQA,EAAKC,MACZ,IAAK,OACJpC,KAAKqC,cAAcF,EAAMA,EAAKG,KAAM,QACpC,MAED,IAAK,OACAH,EAAKI,KAAKC,MAAM,UAAWxC,KAAKyC,oBAAoBN,GAC/CA,EAAKI,KAAKC,MAAM,mCACxBxC,KAAKqC,cAAcF,EAAMJ,EAAMI,EAAKI,KAAM,SAClCJ,EAAKI,KAAKC,MAAM,kBACxBxC,KAAKqC,cAAcF,EAAMJ,EAAMI,EAAKI,KAAM,SAC3C,MAED,IAAK,OACJvC,KAAKqC,cAAcF,EAAMA,EAAKO,IAAK,UAKtCC,OAAOC,OAAO5C,KAAKJ,GAAG2B,KAAKsB,SAASC,QAAQX,IAC3CF,EAAcE,MAIRL,OAAUiB,IACjB,MAAMC,EAAYhD,KAAKN,WAAoBM,KAAKP,SAASO,KAAKN,YAA1B,KAC9BuD,EAAWF,EAAY/C,KAAKP,SAASsD,GAArB,KAClBC,GAAUA,EAASE,UAAUC,OAAO,UACpCF,GACHA,EAAQC,UAAUE,IAAI,UACtBpD,KAAKE,MAAMC,sBACLH,KAAKE,MAAMI,mBAClBN,KAAKN,WAAaqD,GAGXN,oBAAsBP,MAAOC,IAEpC,IAAIkB,EADJrD,KAAKqC,cAAcF,EAAM,aAAc,QAEvC,IACC,MAAMmB,QAAiBC,MAAMvD,KAAKJ,GAAG2B,KAAKS,cAAgBG,EAAKI,MACzDiB,QAAeF,EAAShB,OACxBmB,EAAmBD,EAAOhB,MAAM,qCAChBa,EAAlBI,QAAwCzD,KAAKF,MAAM2D,EAAiB,UAC7CzD,KAAKF,MAAM0D,EACvC,OAASE,GACRC,QAAQC,MAAM,8CAA+CF,GAC7DL,EAAgB,yBACjB,CACArD,KAAKqC,cAAcF,EAAMkB,EAAe,SAGjChC,eAAiB,KACxB,MAAME,EAAOvB,KAAKJ,GAAG2B,KACrBvB,KAAKD,cAAc8D,MAAMC,UAAY,aAAavC,EAAKwC,cAAcxC,EAAKyC,oBAAoBzC,EAAK0C,UAGpG,mBAAc5B,CAAcF,EAAsB+B,EAAiB9B,GAClE,IAAI+B,EAAUnE,KAAKP,SAAS0C,EAAKY,IACjC,GAAKoB,GAQL,GAAoB,SAAT/B,EAAiB,CACI+B,EAAQC,uBAAuB,0BAA0B,GACjEC,UAAYH,CACpC,OAVCC,QAAgBnE,KAAKsE,iBAAiBnC,EAAM+B,EAAS9B,GACrDpC,KAAKD,cAAcyB,YAAY2C,GAC/BnE,KAAKP,SAAS0C,EAAKY,IAAMoB,EACzBA,EAAQN,MAAMU,KAAO,GAAGpC,EAAKqC,MAC7BL,EAAQN,MAAMY,IAAM,GAAGtC,EAAKuC,MAC5BP,EAAQN,MAAMc,MAAQ,GAAGxC,EAAKwC,UAC9BR,EAAQN,MAAMe,OAAS,GAAGzC,EAAKyC,UAKjC,CAEA,sBAAcN,CAAiBnC,EAAsB+B,EAAiB9B,GACrE,MAAMyC,EAAQzE,EAAAA,UAAU0E,SAAS3C,EAAK0C,OAChCE,EAAUxF,SAASC,cAAc,OAKvC,OAJAuF,EAAQ7B,UAAUE,IAAI,qBACtB2B,EAAQhC,GAAKZ,EAAKY,GAClBgC,EAAQlB,MAAMmB,gBAAkBH,EAAMI,WACtCF,EAAQlB,MAAMqB,YAAY,iBAAkBL,EAAMM,QAC1C/C,GACP,IAAK,OAAQ,CACZ2C,EAAQ7B,UAAUE,IAAI,oBACtB,MAAMgC,EAAuB7F,SAASC,cAAc,OACpD4F,EAAqBf,gBAAkBrE,KAAKF,MAAMoE,GAAW,IAC7DkB,EAAqBlC,UAAUE,IAAI,0BACnC2B,EAAQvD,YAAY4D,GACpB,KACD,CACA,IAAK,OAAQ,CACZ,MAAMC,EAAS9F,SAASC,cAAc,UACtC6F,EAAOC,IAAMpB,EACbmB,EAAOE,QAAU,kCACjBF,EAAO/D,UAAY,cACnB+D,EAAOG,QAAU,OACjBT,EAAQvD,YAAY6D,GACpB,KACD,CACA,IAAK,QAAS,CACb,MAAMI,EAAQlG,SAASC,cAAc,SACrCiG,EAAMnE,UAAY,QAClBmE,EAAMH,IAAMpB,EACZuB,EAAMC,UAAW,EACjBX,EAAQvD,YAAYiE,GACpB,KACD,CACA,IAAK,QAAS,CACb,MAAME,EAAMpG,SAASC,cAAc,OACnCmG,EAAIL,IAAMpB,EACVyB,EAAIH,QAAU,OACdT,EAAQvD,YAAYmE,EACrB,EAED,OAAQvD,GACP,IAAK,OACL,IAAK,QAAS,CACb,MAAMwD,EAAarG,SAASC,cAAc,OAC1CoG,EAAWtE,UAAY,cACvByD,EAAQvD,YAAYoE,EACrB,EAED,MAAMC,EAAgBtG,SAASC,cAAc,OAC7CqG,EAAcvE,UAAY,iBAC1BuE,EAAchC,MAAMiC,YAAcjB,EAAMkB,OACxChB,EAAQvD,YAAYqE,GACpB,MAAMpE,EAAU,KACXU,EAAKY,KAAO/C,KAAKN,YAAYM,KAAKE,MAAMC,sBAEvC6F,EAAQ,KACT7D,EAAKY,KAAO/C,KAAKN,YAAYM,KAAKE,MAAMI,oBAO7C,OALAyE,EAAQkB,iBAAiB,eAAgBxE,GACzCsD,EAAQkB,iBAAiB,eAAgBD,GACzCjB,EAAQkB,iBAAiB,aAAcxE,GACvCsD,EAAQkB,iBAAiB,WAAYD,GACrChG,KAAKL,eAAewC,EAAKY,IAAM,CAACtB,EAASuE,GAClCjB,CACR,CAEQnD,QAAU,KACjB,KAAO5B,KAAKD,cAAcmG,mBAAmB,CAC5C,MAAMC,EAAQnG,KAAKD,cAAcmG,kBACjC,GAAIlG,KAAKL,eAAewG,EAAMpD,IAAK,CAClC,MAAMtB,EAAUzB,KAAKL,eAAewG,EAAMpD,IAAI,GACxCiD,EAAQhG,KAAKL,eAAewG,EAAMpD,IAAI,GAC5C,IAAKtB,IAAYuE,QAAa/F,EAAAA,aAC9BkG,EAAMC,oBAAoB,eAAgB3E,GAC1C0E,EAAMC,oBAAoB,eAAgBJ,GAC1CG,EAAMC,oBAAoB,aAAc3E,GACxC0E,EAAMC,oBAAoB,WAAYJ,GACtChG,KAAKL,eAAewG,EAAMpD,IAAI,GAAK,KACnC/C,KAAKL,eAAewG,EAAMpD,IAAI,GAAK,IACpC,CACAoD,EAAMhD,QACP,CACAnD,KAAKD,cAAcoD,SACnBnD,KAAKV,eAAiB,MCzLxB,MAAqB0B,UAA2B3B,EAAAA,WACvCgH,WACAzG,GACRiC,QAAUzB,EAAAA,UAAUC,WACpBiG,gBACAC,iBAEA,WAAAhG,IAAeC,GACdC,SAASD,GACTR,KAAKJ,GAAKI,KAAKa,UAAUC,IAAIC,EAAAA,aAC7B,MAAML,EAAUiC,OAAO6D,OAAOxG,KAAKU,QAAQ2F,YAAc,GAAI,CAC5DI,iBAAkB,aAEnBzG,KAAKqG,WAAa,IAAIK,EAAAA,WACrB1G,KAAKJ,GAAG2B,KAAKV,UACb,CAAC8F,EAAAA,MAAOC,EAAAA,KAAMC,eAAcC,EAAAA,eAAgBC,EAAAA,mBAC5CrG,GAEDV,KAAKuG,iBAAmBvG,KAAKqG,WAAW3E,MACxC1B,KAAKsG,gBAAkBtG,KAAKqG,WAAWW,KACvC,MAAMC,EAAKjH,KAAKa,UAAUC,IAAI1B,GAC9B6H,EAAG/G,MAAMC,mBAAmBiB,UAAUpB,KAAKsG,iBAC3CW,EAAG/G,MAAMI,iBAAiBc,UAAUpB,KAAKuG,kBAEzCvG,KAAKyB,QAAQzB,KAAK0B,OAClB1B,KAAK2B,UAAU3B,KAAK4B,QACrB,CAEQF,MAAQ,KACf1B,KAAKqG,WAAWa,GAAG,MAAOlH,KAAKmH,OAC/BnH,KAAKqG,WAAWa,GAAG,OAAQlH,KAAKmH,OAChCnH,KAAKqG,WAAWa,GAAG,OAAQlH,KAAKoH,QAChCpH,KAAKqG,WAAWa,GAAG,YAAalH,KAAKqH,aACrCrH,KAAKqG,WAAW3E,SAGTyF,MAASG,IAChBtH,KAAKJ,GAAG2H,IAAID,EAAME,SAEXJ,OAAUE,IACjB,MAAME,EAASF,EAAME,OACrBxH,KAAKJ,GAAG6H,KAAKD,EAAOE,OAAQ,CAAElD,EAAGgD,EAAOhD,EAAGE,EAAG8C,EAAO9C,KAG9C2C,YAAeM,IACtB,MAAMH,EAASG,EAAEH,OAKjB,IAJqBI,EAILD,EAAEH,OAAOI,UAFjBA,EAAOC,QAAQ,cAAgBD,EAAOC,QAAQ,WAAaD,EAAOC,QAAQ,UAE1B,OAJxD,IAAqBD,EAKrB,MAAMzF,EAAOnC,KAAKJ,GAAGkI,WAAW,CAAEtD,EAAGgD,EAAOhD,EAAGE,EAAG8C,EAAO9C,IACzD1E,KAAK6B,QAAQM,EAAOA,EAAKY,GAAK,OAGvBnB,QAAU,KACjB5B,KAAKqG,WAAW0B,IAAI,MAAO/H,KAAKmH,OAChCnH,KAAKqG,WAAW0B,IAAI,OAAQ/H,KAAKoH,QACjCpH,KAAKqG,WAAW0B,IAAI,YAAa/H,KAAKqH,aACtCrH,KAAKqG,WAAWzE,WC/DlB,MAGMoG,EAAa,OAGnB,MAAqBC,UAAiB5I,EAAAA,WAC7B6I,QACAC,IACAvI,GACAwI,eAKJ,CACHC,eAAgB,EAChBC,kBAAmB,CAClB/D,KAAM,EACNgE,MAAO,EACP9D,IAAK,EACL+D,OAAQ,GAETC,QAAS,KACTC,aAAc,GAGf,UAAYC,GACX,GAAqB,OAAjB3I,KAAKkI,QAAkB,MAAMjI,EAAAA,aACjC,OAAOD,KAAKkI,OACb,CAEA,WAAA3H,IAAeC,GACdC,SAASD,GACT,MAAMoI,EAAa5I,KAAKa,UAAUC,IAAII,EAAAA,YACtC0H,EAAW1I,MAAMiB,UAAUC,UAAUpB,KAAK6I,QAC1CD,EAAW1I,MAAM4I,SAAS1H,UAAUpB,KAAK+I,aACzC/I,KAAKJ,GAAKI,KAAKa,UAAUC,IAAIC,EAAAA,aAC7Bf,KAAKkI,QAAU3I,SAASC,cAAc,UACtCQ,KAAKkI,QAAQ5G,UAAY,cACzBtB,KAAKmI,IAAMnI,KAAKkI,QAAQc,WAAW,MACnChJ,KAAKJ,GAAG2B,KAAKV,UAAUW,YAAYxB,KAAKkI,SACxClI,KAAK2B,UAAU3B,KAAK4B,QACrB,CAEQmH,YAAc,KACrB,MAAMlI,EAAYb,KAAKJ,GAAG2B,KAAKV,UAC/BT,EAAAA,UAAU6I,mBAAmBjJ,KAAK2I,OAAQ9H,EAAUqI,YAAarI,EAAUsI,eAGpEN,OAAS,KACZ7I,KAAKoI,eAAeK,UACvBW,aAAapJ,KAAKoI,eAAeK,SACjCzI,KAAKoI,eAAeK,QAAU,MAE/B,MAAMY,EAAMC,KAAKD,MACXtF,EAAU/D,KAAKJ,GAAG2B,KAAKwC,QACvBC,EAAUhE,KAAKJ,GAAG2B,KAAKyC,QACvBC,EAAQjE,KAAKJ,GAAG2B,KAAK0C,MACrBsF,EAAkBvJ,KAAKwJ,mBAAmBzF,EAASC,EAASC,GAClE,GACCjE,KAAKyJ,iBAAiBF,EAAiBvJ,KAAKoI,eAAeE,oBAC3DrE,IAAUjE,KAAKoI,eAAeC,eAC7B,CAED,GADsBgB,EAAMrJ,KAAKoI,eAAeM,aA5DlB,IAoE7B,OANA1I,KAAKoI,eAAeK,QAAUiB,WAAW,KACxC1J,KAAK2J,WAAW5F,EAASC,EAASC,EAAOsF,GACzCvJ,KAAKoI,eAAeM,aAAeW,EACnCrJ,KAAKoI,eAAeK,QAAU,MAC5B,SACHzI,KAAK4J,WAAWL,EAAiBtF,EAGnC,CACAjE,KAAKoI,eAAeM,aAAeW,EACnCrJ,KAAK2J,WAAW5F,EAASC,EAASC,EAAOsF,IAGlC,UAAAI,CAAW5F,EAAiBC,EAAiBC,EAAesF,GACnEvJ,KAAKoI,eAAeE,kBAAoBiB,EACxCvJ,KAAKoI,eAAeC,eAAiBpE,EACrCjE,KAAK2I,OAAO9E,MAAMC,UAAY,GAC9B9D,KAAKmI,IAAI0B,UAAU,EAAG,EAAG7J,KAAK2I,OAAOhE,MAAO3E,KAAK2I,OAAO/D,QACxD5E,KAAKmI,IAAI2B,OACT9J,KAAKmI,IAAI4B,UAAUhG,EAASC,GAC5BhE,KAAKmI,IAAIlE,MAAMA,EAAOA,GACtB,MAAM+F,EAAahK,KAAKJ,GAAG2B,KAAKyI,WAChCA,EAAWC,MAAMnH,QAAQX,IACxB,OAAQA,EAAKC,MACZ,IAAK,QACJpC,KAAKkK,UAAU/H,EAAM8B,GACrB,MACD,IAAK,OACJjE,KAAKmK,aAAahI,MAIrB6H,EAAWI,MAAMtH,QAAQuH,IACxBrK,KAAKsK,SAASD,KAEfrK,KAAKmI,IAAIoC,SACV,CAEQ,UAAAX,CAAWL,EAA2BtF,GAC7C,MAAMuG,EAAWvG,EAAQjE,KAAKoI,eAAeC,eACvCoC,GAAkBzK,KAAKoI,eAAeE,kBAAkB/D,KAAOgF,EAAgBhF,MAAQN,EACvFyG,GAAkB1K,KAAKoI,eAAeE,kBAAkB7D,IAAM8E,EAAgB9E,KAAOR,EAC3FjE,KAAK2I,OAAO9E,MAAMC,UAAY,aAAa2G,QAAqBC,cAA2BF,IAC5F,CAEQf,iBAAmB,CAACkB,EAAiBC,IAC5CD,EAAMpG,KAAOqG,EAAMrG,MACnBoG,EAAMlG,IAAMmG,EAAMnG,KAClBkG,EAAMpC,MAAQqC,EAAMrC,OACpBoC,EAAMnC,OAASoC,EAAMpC,OAEdgB,mBAAqB,CAACzF,EAAiBC,EAAiBC,KAC/D,MAAMM,GAAQR,EAAUE,EAClBQ,GAAOT,EAAUC,EACjBpD,EAAYb,KAAKJ,GAAG2B,KAAKV,UAG/B,MAAO,CAAE0D,OAAME,MAAK8D,MAFNhE,EAAO1D,EAAUgK,YAAc5G,EAElBuE,OADZ/D,EAAM5D,EAAUiK,aAAe7G,IAIvC8G,aAAe,CAACvG,EAAWE,EAAWsG,EAAenG,EAAeZ,KAC3E,MAAMgH,EAAY,GAAKhH,EACjBiH,EAAS,EAAIjH,EACbkH,EAAU,EAAIlH,EACdmH,EAAW,GAAKnH,EAChBoH,EAAW,EAAIpH,EACrBjE,KAAKmI,IAAI2B,OACT9J,KAAKmI,IAAI4B,UAAUvF,EAAGE,GACtB1E,KAAKmI,IAAIlE,MAAM,EAAIA,EAAO,EAAIA,GAC9BjE,KAAKmI,IAAImD,KAAO,GAAGF,0BACnB,MAAMG,EAAWvL,KAAKmI,IAAIqD,YAAYR,GAAOrG,MAAQ,EAAI0G,EACzDrL,KAAKmI,IAAI4B,UAAU,GAAIkB,EAAYE,GACnCnL,KAAKmI,IAAIsD,UAAY5G,EACrB7E,KAAKmI,IAAIuD,YACT1L,KAAKmI,IAAIwD,OAAOT,EAAQ,GACxBlL,KAAKmI,IAAIyD,OAAOL,EAAWL,EAAQ,GACnClL,KAAKmI,IAAI0D,iBAAiBN,EAAU,EAAGA,EAAUL,GACjDlL,KAAKmI,IAAIyD,OAAOL,EAAUN,EAAYC,GACtClL,KAAKmI,IAAI0D,iBAAiBN,EAAUN,EAAWM,EAAWL,EAAQD,GAClEjL,KAAKmI,IAAIyD,OAAOV,EAAQD,GACxBjL,KAAKmI,IAAI0D,iBAAiB,EAAGZ,EAAW,EAAGA,EAAYC,GACvDlL,KAAKmI,IAAIyD,OAAO,EAAGV,GACnBlL,KAAKmI,IAAI0D,iBAAiB,EAAG,EAAGX,EAAQ,GACxClL,KAAKmI,IAAI2D,YACT9L,KAAKmI,IAAI4D,OACT/L,KAAKmI,IAAIsD,UAAYzD,EACrBhI,KAAKmI,IAAI6D,SAAShB,EAAOK,EAAsB,IAAZJ,GACnCjL,KAAKmI,IAAIoC,WAGF0B,mBAAsB9J,IAC7B,MAAM+J,EAAS9L,EAAAA,UAAU0E,SAAS3C,EAAK0C,OAEvC7E,KAAKmI,IAAIgE,YAAc,EACvBnM,KAAKmI,IAAIsD,UAAYS,EAAOjH,WAC5B7E,EAAAA,UAAUgM,cAAcpM,KAAKmI,IAAKhG,EAAKqC,EAAI,EAAGrC,EAAKuC,EAAI,EAAGvC,EAAKwC,MAAQ,EAAGxC,EAAKyC,OAAS,EA/JtE,IAgKlB5E,KAAKmI,IAAI4D,OACT/L,KAAKmI,IAAIkE,YAAcH,EAAOnG,OAC9B/F,KAAKmI,IAAImE,UAAY,EACrBlM,EAAAA,UAAUgM,cAAcpM,KAAKmI,IAAKhG,EAAKqC,EAAGrC,EAAKuC,EAAGvC,EAAKwC,MAAOxC,EAAKyC,OAnKjD,IAoKlB5E,KAAKmI,IAAIoE,UAGFrC,UAAY,CAAC/H,EAA2B8B,KAC/CjE,KAAKiM,mBAAmB9J,GACpBA,EAAK6I,OACRhL,KAAK+K,aAAa5I,EAAKqC,EAAGrC,EAAKuC,EAAGvC,EAAK6I,MAAO5K,EAAAA,UAAU0E,SAAS3C,EAAK0C,OAAOM,OAAQlB,IAG/EkG,aAAgBhI,IACvBnC,KAAKmI,IAAIsD,UAAYzD,EACrBhI,KAAKmI,IAAImD,KAAO,kBAChBtL,KAAKmI,IAAI6D,SAAS7J,EAAKI,KAAMJ,EAAKqC,EAAI,EAAGrC,EAAKuC,EAAI,KAG3C4F,SAAYD,IACnB,MAAMmC,SAAEA,EAAAC,OAAUA,GAAWzM,KAAK0M,aAAarC,GACzCsC,EAAMvM,EAAAA,UAAUwM,gBACfC,EAAQC,GAAUH,EAAIH,EAAUnC,EAAK0C,WACrCC,EAAMC,GAAQN,EAAIF,EAAQpC,EAAK6C,SAChC/H,OAAEA,GAAW/E,EAAAA,UAAU0E,SAASuF,EAAKxF,OAC3C,IAAKsI,EAAeC,EAAeC,EAAaC,GAAe,CAAC,EAAG,EAAG,EAAG,GAwBzE,GAvBKjD,EAAKkD,eAUFJ,EAAeC,EAAeC,EAAaC,GAAejD,EAAKkD,gBATrEJ,EAAeC,EAAeC,EAAaC,GAAetN,KAAKwN,iBAC/DX,EACAC,EACAE,EACAC,EACA5C,EAAK0C,SACL1C,EAAK6C,QAEN7C,EAAKkD,cAAgB,CAACJ,EAAeC,EAAeC,EAAaC,IAElEtN,KAAKyN,eACJZ,EACAC,EACAE,EACAC,EACAE,EACAC,EACAC,EACAC,EACAnI,GAEDnF,KAAK0N,cAAcV,EAAMC,EAAMI,EAAaC,EAAanI,GACrDkF,EAAKW,MAAO,CACf,MAAM2C,EAAI,GACJnJ,GACJ,EAAImJ,IAAM,EAAId,EACf,GAAK,EAAIc,IAAM,EAAIA,EAAIR,EACvB,GAAK,EAAIQ,GAAKA,EAAIA,EAAIN,EACtBM,GAAK,EAAIX,EACJtI,GACJ,EAAIiJ,IAAM,EAAIb,EACf,GAAK,EAAIa,IAAM,EAAIA,EAAIP,EACvB,GAAK,EAAIO,GAAKA,EAAIA,EAAIL,EACtBK,GAAK,EAAIV,EACVjN,KAAKmI,IAAImD,KAAO,kBAChB,MACMsC,EAAU,EACVC,EAFU7N,KAAKmI,IAAIqD,YAAYnB,EAAKW,OAEfrG,MAAkB,EAAViJ,EAC7BE,EAAc,GACpB9N,KAAKmI,IAAIsD,UAAY,OACrBzL,KAAKmI,IAAIuD,YACTtL,EAAAA,UAAUgM,cACTpM,KAAKmI,IACL3D,EAAIqJ,EAAa,EACjBnJ,EAAIoJ,EAAc,EAAI,EACtBD,EACAC,EACA,GAED9N,KAAKmI,IAAI4D,OACT/L,KAAKmI,IAAIsD,UAAY,OACrBzL,KAAKmI,IAAI4F,UAAY,SACrB/N,KAAKmI,IAAI6F,aAAe,SACxBhO,KAAKmI,IAAI6D,SAAS3B,EAAKW,MAAOxG,EAAGE,EAAI,GACrC1E,KAAKmI,IAAI4F,UAAY,OACrB/N,KAAKmI,IAAI6F,aAAe,YACzB,GAGOtB,aAAgBrC,IAAA,CACvBmC,SAAUxM,KAAKJ,GAAG2B,KAAKsB,QAAQwH,EAAKmC,UACpCC,OAAQzM,KAAKJ,GAAG2B,KAAKsB,QAAQwH,EAAKoC,UAG3Be,iBAAmB,CAC1BX,EACAC,EACAE,EACAC,EACAF,EACAG,KAEA,MAAMe,EAAYjB,EAAOH,EACnBqB,EAAYjB,EAAOH,EACnBqB,EACLC,KAAKC,IAAID,KAAKE,IAAIL,GAAYG,KAAKE,IAAIJ,IACvC,GAAME,KAAKG,IAAIH,KAAKE,IAAIL,GAAYG,KAAKE,IAAIJ,IAExCM,GADSC,EACsB,GAAfN,EADME,EACc,GADDE,EACK,IADWH,KAAKG,IAAIF,EAAKD,KAAKC,IAAIE,EAAKE,KAAvE,IAACA,EAAaJ,EAAaE,EAEzC,IAAIpB,EAAgBN,EAChBO,EAAgBN,EAChBO,EAAcL,EACdM,EAAcL,EAClB,OAAQF,GACP,IAAK,MACJK,EAAgBN,EAAS0B,EACzB,MACD,IAAK,SACJpB,EAAgBN,EAAS0B,EACzB,MACD,IAAK,OACJrB,EAAgBN,EAAS2B,EACzB,MACD,IAAK,QACJrB,EAAgBN,EAAS2B,EAG3B,OAAQtB,GACP,IAAK,MACJI,EAAcL,EAAOuB,EACrB,MACD,IAAK,SACJlB,EAAcL,EAAOuB,EACrB,MACD,IAAK,OACJnB,EAAcL,EAAOwB,EACrB,MACD,IAAK,QACJnB,EAAcL,EAAOwB,EAGvB,MAAO,CAACrB,EAAeC,EAAeC,EAAaC,IAG5CG,eAAiB,CACxBZ,EACAC,EACAE,EACAC,EACAyB,EACAC,EACAC,EACAC,EACAhK,KAEA7E,KAAKmI,IAAIuD,YACT1L,KAAKmI,IAAIwD,OAAOkB,EAAQC,GACxB9M,KAAKmI,IAAI2G,cAAcJ,EAAKC,EAAKC,EAAKC,EAAK7B,EAAMC,GACjDjN,KAAKmI,IAAIkE,YAAcxH,EACvB7E,KAAKmI,IAAImE,UAAY,EACrBtM,KAAKmI,IAAIoE,UAGFmB,cAAgB,CAACqB,EAAcC,EAAcC,EAAeC,EAAerK,KAClF,MAAMsK,EAAKJ,EAAOE,EACZG,EAAKJ,EAAOE,EACZG,EAASjB,KAAKkB,KAAKH,EAAKA,EAAKC,EAAKA,GACxC,GAAe,IAAXC,EAAc,OAClB,MAAME,EAAQJ,EAAKE,EACbG,EAAQJ,EAAKC,EACbI,EAAQV,EAzUK,GAyUEQ,EAxUH,EAwU0BC,EACtCE,EAAQV,EA1UK,GA0UEQ,EAzUH,EAyU0BD,EACtCI,EAASZ,EA3UI,GA2UGQ,EA1UJ,EA0U2BC,EACvCI,EAASZ,EA5UI,GA4UGQ,EA3UJ,EA2U2BD,EAC7CvP,KAAKmI,IAAIuD,YACT1L,KAAKmI,IAAIsD,UAAY5G,EACrB7E,KAAKmI,IAAIwD,OAAOoD,EAAMC,GACtBhP,KAAKmI,IAAIyD,OAAO6D,EAAOC,GACvB1P,KAAKmI,IAAIyD,OAAO+D,EAAQC,GACxB5P,KAAKmI,IAAI2D,YACT9L,KAAKmI,IAAI4D,QAGFnK,QAAU,KACb5B,KAAKoI,eAAeK,UACvBW,aAAapJ,KAAKoI,eAAeK,SACjCzI,KAAKoI,eAAeK,QAAU,MAE/BzI,KAAK2I,OAAOxF,SACZnD,KAAKkI,QAAU"}