instruckt 0.4.21 → 0.4.22
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/instruckt.cjs.js +100 -23
- package/dist/instruckt.cjs.js.map +1 -1
- package/dist/instruckt.d.mts +6 -2
- package/dist/instruckt.d.ts +6 -2
- package/dist/instruckt.esm.js +100 -23
- package/dist/instruckt.esm.js.map +1 -1
- package/dist/instruckt.iife.js +22 -22
- package/dist/instruckt.iife.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/api.ts","../src/ui/styles.ts","../src/ui/toolbar.ts","../src/ui/highlight.ts","../node_modules/modern-screenshot/dist/index.mjs","../src/ui/screenshot.ts","../src/ui/popup.ts","../src/ui/markers.ts","../src/selector.ts","../src/adapters/livewire.ts","../src/adapters/vue.ts","../src/adapters/svelte.ts","../src/adapters/react.ts","../src/instruckt.ts"],"sourcesContent":["import { Instruckt } from './instruckt'\nimport type { InstrucktConfig, Annotation, AnnotationIntent, AnnotationSeverity, AnnotationStatus, FrameworkContext } from './types'\nimport type { AnnotationPayload } from './api'\n\nexport { Instruckt }\nexport type { InstrucktConfig, Annotation, AnnotationPayload, AnnotationIntent, AnnotationSeverity, AnnotationStatus, FrameworkContext }\n\n/**\n * Initialize instruckt.\n *\n * @example\n * instruckt.init({ endpoint: '/instruckt' })\n *\n * @example CDN\n * <script src=\"instruckt.iife.js\"></script>\n * <script>Instruckt.init({ endpoint: '/instruckt' })</script>\n */\nexport function init(config: InstrucktConfig): Instruckt {\n return new Instruckt(config)\n}\n","import type { Annotation } from './types'\n\n/** Read Laravel's XSRF-TOKEN cookie for CSRF protection */\nfunction getCsrfToken(): string {\n const match = document.cookie.match(/(?:^|;\\s*)XSRF-TOKEN=([^;]+)/)\n return match ? decodeURIComponent(match[1]) : ''\n}\n\nfunction headers(): Record<string, string> {\n const h: Record<string, string> = {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'X-Requested-With': 'XMLHttpRequest',\n }\n const csrf = getCsrfToken()\n if (csrf) h['X-XSRF-TOKEN'] = csrf\n return h\n}\n\n/** Convert snake_case API response to camelCase for JS types */\nexport function toCamelCase(obj: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(obj)) {\n const camel = k.replace(/_([a-z])/g, (_, c) => c.toUpperCase())\n out[camel] = Array.isArray(v)\n ? v.map(item => (item && typeof item === 'object' && !Array.isArray(item)) ? toCamelCase(item as Record<string, unknown>) : item)\n : (v && typeof v === 'object' && !Array.isArray(v)) ? toCamelCase(v as Record<string, unknown>) : v\n }\n return out\n}\n\n/** Convert camelCase JS payload to snake_case for Laravel API */\nfunction toSnake(obj: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(obj)) {\n const snake = k.replace(/[A-Z]/g, c => `_${c.toLowerCase()}`)\n out[snake] = (v && typeof v === 'object' && !Array.isArray(v)) ? toSnake(v as Record<string, unknown>) : v\n }\n return out\n}\n\nexport type AnnotationPayload = Omit<\n Annotation,\n 'id' | 'status' | 'thread' | 'createdAt'\n>\n\nexport class InstrucktApi {\n constructor(private readonly endpoint: string) {}\n\n async getAnnotations(): Promise<Annotation[]> {\n const res = await fetch(`${this.endpoint}/annotations`, {\n headers: headers(),\n })\n if (!res.ok) throw new Error(`instruckt: failed to load annotations (${res.status})`)\n const raw: Record<string, unknown>[] = await res.json()\n return raw.map(r => toCamelCase(r) as unknown as Annotation)\n }\n\n async addAnnotation(data: AnnotationPayload): Promise<Annotation> {\n const res = await fetch(`${this.endpoint}/annotations`, {\n method: 'POST',\n headers: headers(),\n body: JSON.stringify(toSnake(data as unknown as Record<string, unknown>)),\n })\n if (!res.ok) throw new Error(`instruckt: failed to add annotation (${res.status})`)\n return toCamelCase(await res.json()) as unknown as Annotation\n }\n\n async updateAnnotation(\n annotationId: string,\n data: Partial<Pick<Annotation, 'status' | 'comment'>>,\n ): Promise<Annotation> {\n const res = await fetch(`${this.endpoint}/annotations/${annotationId}`, {\n method: 'PATCH',\n headers: headers(),\n body: JSON.stringify(toSnake(data as unknown as Record<string, unknown>)),\n })\n if (!res.ok) throw new Error(`instruckt: failed to update annotation (${res.status})`)\n return toCamelCase(await res.json()) as unknown as Annotation\n }\n\n}\n","/** Global styles injected into document.head — ONLY what must affect the host page */\nexport const GLOBAL_CSS = /* css */ `\nbody.ik-annotating,\nbody.ik-annotating * { cursor: crosshair !important; }\n`\n\n/** Toolbar shadow DOM styles — fully isolated */\nexport const TOOLBAR_CSS = /* css */ `\n:host {\n all: initial;\n display: block;\n position: fixed;\n z-index: 2147483646;\n}\n\n* { box-sizing: border-box; }\n\n:host-context([data-instruckt-theme=\"dark\"]),\n@media (prefers-color-scheme: dark) {\n :host {\n --ik-bg: #1c1c1e; --ik-bg2: #2c2c2e; --ik-border: #38383a;\n --ik-text: #f4f4f5; --ik-muted: #a1a1aa;\n --ik-shadow: 0 8px 32px rgba(0,0,0,.4), 0 0 0 1px rgba(255,255,255,.06);\n }\n}\n\n:host {\n --ik-accent: #6366f1;\n --ik-accent-h: #4f46e5;\n --ik-bg: #ffffff;\n --ik-bg2: #f4f4f5;\n --ik-border: #e4e4e7;\n --ik-text: #18181b;\n --ik-muted: #a1a1aa;\n --ik-shadow: 0 8px 32px rgba(0,0,0,.08), 0 0 0 1px rgba(0,0,0,.04);\n}\n\n.toolbar {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 2px;\n background: var(--ik-bg);\n border-radius: 12px;\n padding: 6px;\n box-shadow: var(--ik-shadow);\n user-select: none;\n touch-action: none;\n cursor: grab;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n}\n.toolbar:active { cursor: grabbing; }\n\n.btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 34px;\n height: 34px;\n border-radius: 8px;\n border: none;\n background: transparent;\n color: var(--ik-muted);\n cursor: pointer;\n padding: 0;\n position: relative;\n transition: background .15s ease, color .15s ease;\n}\n.btn svg { display: block; }\n.btn:hover { background: var(--ik-bg2); color: var(--ik-text); }\n.btn[data-tooltip]::before {\n content: attr(data-tooltip);\n position: absolute;\n right: calc(100% + 8px);\n top: 50%;\n transform: translateY(-50%);\n white-space: nowrap;\n font-size: 11px;\n padding: 4px 8px;\n border-radius: 6px;\n background: var(--ik-text);\n color: var(--ik-bg);\n pointer-events: none;\n opacity: 0;\n transition: opacity .1s ease;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n}\n.btn[data-tooltip]:hover::before { opacity: 1; }\n.btn.active { background: var(--ik-accent); color: #fff; }\n.btn.active:hover { background: var(--ik-accent-h); }\n\n.divider { width: 18px; height: 1px; background: var(--ik-border); margin: 3px 0; }\n\n.badge {\n position: absolute;\n top: -3px; right: -3px;\n min-width: 16px; height: 16px;\n background: #ef4444;\n color: #fff;\n border-radius: 8px;\n font-size: 10px; font-weight: 600;\n display: flex; align-items: center; justify-content: center;\n padding: 0 4px;\n line-height: 1;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n}\n\n.minimize-btn { color: var(--ik-muted); opacity: .6; }\n.minimize-btn:hover { opacity: 1; }\n\n.danger-btn { color: var(--ik-muted); opacity: .6; }\n.danger-btn:hover { opacity: 1; color: #ef4444; }\n\n.clear-wrap {\n position: relative;\n display: flex;\n align-items: center;\n}\n.clear-all-btn {\n display: none;\n position: absolute;\n right: 100%;\n top: 0;\n background: var(--ik-bg);\n box-shadow: var(--ik-shadow);\n border-radius: 8px;\n}\n/* clear-all tooltip inherits from .btn[data-tooltip]::before */\n/* Invisible bridge so hover doesn't break crossing the gap */\n.clear-all-btn::after {\n content: '';\n position: absolute;\n top: 0;\n left: 100%;\n width: 6px;\n height: 100%;\n}\n/* Clear-page tooltip shows above-left so it doesn't cover the clear-all button */\n.clear-wrap > .btn:first-child[data-tooltip]::before {\n right: 0;\n left: auto;\n top: auto;\n bottom: calc(100% + 8px);\n transform: none;\n}\n.clear-wrap:hover .clear-all-btn { display: flex; align-items: center; justify-content: center; }\n\n.fab {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border-radius: 50%;\n border: none;\n background: var(--ik-bg);\n color: var(--ik-muted);\n box-shadow: var(--ik-shadow);\n cursor: pointer;\n padding: 0;\n transition: color .15s ease, transform .15s ease;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n}\n.fab:hover { color: var(--ik-accent); transform: scale(1.1); }\n.fab { position: relative; }\n\n.fab-badge {\n position: absolute;\n top: -4px; right: -4px;\n min-width: 16px; height: 16px;\n background: #6366f1;\n color: #fff;\n border-radius: 8px;\n font-size: 9px; font-weight: 700;\n display: flex; align-items: center; justify-content: center;\n padding: 0 3px;\n line-height: 1;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n}\n`\n\n/** Popup shadow DOM styles — fully isolated */\nexport const POPUP_CSS = /* css */ `\n:host {\n all: initial;\n display: block;\n position: fixed;\n z-index: 2147483647;\n}\n\n* { box-sizing: border-box; }\n\n:host {\n --ik-accent: #6366f1;\n --ik-accent-h: #4f46e5;\n --ik-bg: #ffffff;\n --ik-bg2: #f8f8f8;\n --ik-border: #e4e4e7;\n --ik-text: #18181b;\n --ik-muted: #71717a;\n --ik-shadow: 0 4px 24px rgba(0,0,0,.12);\n --ik-radius: 10px;\n --ik-hl: rgba(99,102,241,.15);\n}\n\n@media (prefers-color-scheme: dark) {\n :host {\n --ik-bg: #1c1c1e; --ik-bg2: #2c2c2e; --ik-border: #3a3a3c;\n --ik-text: #f4f4f5; --ik-muted: #a1a1aa;\n --ik-shadow: 0 4px 24px rgba(0,0,0,.5);\n --ik-hl: rgba(99,102,241,.2);\n }\n}\n\n.popup {\n width: 340px;\n background: var(--ik-bg);\n border: 1px solid var(--ik-border);\n border-radius: var(--ik-radius);\n box-shadow: var(--ik-shadow);\n padding: 14px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n font-size: 13px;\n color: var(--ik-text);\n animation: pop-in .12s ease;\n}\n@keyframes pop-in {\n from { opacity:0; transform: scale(.95) translateY(4px); }\n to { opacity:1; transform: scale(1) translateY(0); }\n}\n\n.header { display:flex; align-items:center; justify-content:space-between; margin-bottom:10px; }\n.element-tag {\n font-size:11px; font-family:ui-monospace,monospace; color:var(--ik-muted);\n background:var(--ik-bg2); border-radius:4px; padding:2px 6px;\n max-width:220px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;\n}\n.close-btn {\n background:none; border:none; color:var(--ik-muted);\n cursor:pointer; font-size:18px; line-height:1; padding:0;\n}\n\n.fw-badge {\n display:inline-flex; align-items:center; gap:4px;\n font-size:10px; font-weight:700; text-transform:uppercase; letter-spacing:.05em;\n color:var(--ik-accent); background:var(--ik-hl); border-radius:4px;\n padding:2px 6px; margin-bottom:8px;\n}\n.selected-text {\n font-size:12px; color:var(--ik-muted); background:var(--ik-bg2);\n border-left:3px solid var(--ik-accent); padding:4px 8px;\n border-radius:0 4px 4px 0; margin-bottom:10px;\n overflow:hidden; text-overflow:ellipsis; white-space:nowrap;\n}\n\n.label {\n font-size:10px; font-weight:700; text-transform:uppercase;\n letter-spacing:.05em; color:var(--ik-muted); margin-bottom:4px;\n}\n.row { display:flex; gap:6px; margin-bottom:10px; }\n.chips { display:flex; gap:4px; flex-wrap:wrap; }\n\n.chip {\n font-size:11px; padding:3px 8px; border-radius:12px;\n border:1px solid var(--ik-border); background:transparent;\n color:var(--ik-muted); cursor:pointer; transition:all .1s;\n}\n.chip:hover { border-color:var(--ik-accent); color:var(--ik-accent); }\n.chip.sel { background:var(--ik-accent); border-color:var(--ik-accent); color:#fff; }\n.chip.blocking.sel { background:#ef4444; border-color:#ef4444; }\n.chip.important.sel { background:#f97316; border-color:#f97316; }\n.chip.suggestion.sel{ background:#22c55e; border-color:#22c55e; }\n\n.screenshot-slot { margin-bottom: 10px; }\n\n.btn-capture {\n display: flex;\n align-items: center;\n gap: 6px;\n width: 100%;\n padding: 8px 10px;\n border: 1px dashed var(--ik-border);\n border-radius: 6px;\n background: var(--ik-bg2);\n color: var(--ik-muted);\n font-size: 12px;\n font-family: inherit;\n cursor: pointer;\n transition: border-color .15s, color .15s;\n}\n.btn-capture:hover {\n border-color: var(--ik-accent);\n color: var(--ik-accent);\n}\n.btn-capture svg { flex-shrink: 0; }\n\n.screenshot-preview {\n position: relative;\n border-radius: 6px;\n overflow: hidden;\n border: 1px solid var(--ik-border);\n margin-bottom: 10px;\n}\n.screenshot-preview img {\n display: block;\n width: 100%;\n max-height: 200px;\n object-fit: contain;\n background: var(--ik-bg2);\n}\n.screenshot-remove {\n position: absolute;\n top: 4px; right: 4px;\n width: 20px; height: 20px;\n border-radius: 50%;\n border: none;\n background: rgba(0,0,0,.6);\n color: #fff;\n font-size: 12px;\n line-height: 1;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n}\n.screenshot-remove:hover { background: #ef4444; }\n\ntextarea {\n width:100%; min-height:80px; resize:vertical;\n border:1px solid var(--ik-border); border-radius:6px;\n background:var(--ik-bg2); color:var(--ik-text);\n font-family:inherit; font-size:13px; padding:8px 10px;\n outline:none; transition:border-color .15s; margin-bottom:10px;\n}\ntextarea:focus { border-color:var(--ik-accent); }\ntextarea::placeholder { color:var(--ik-muted); }\n\n.actions { display:flex; justify-content:flex-end; gap:6px; }\n\n.btn-secondary {\n padding:6px 14px; border-radius:6px; border:1px solid var(--ik-border);\n background:transparent; color:var(--ik-muted); font-size:12px; cursor:pointer; transition:all .1s;\n}\n.btn-secondary:hover { border-color:var(--ik-muted); color:var(--ik-text); }\n\n.btn-primary {\n padding:6px 14px; border-radius:6px; border:none;\n background:var(--ik-accent); color:#fff;\n font-size:12px; font-weight:700; cursor:pointer; transition:background .1s;\n}\n.btn-primary:hover { background:var(--ik-accent-h); }\n.btn-primary:disabled { opacity:.5; cursor:not-allowed; }\n\n.btn-danger {\n padding:6px 14px; border-radius:6px; border:1px solid #ef4444;\n background:transparent; color:#ef4444;\n font-size:12px; cursor:pointer; transition:all .1s;\n}\n.btn-danger:hover { background:#ef4444; color:#fff; }\n\n/* Thread view */\n.thread { margin-top:10px; border-top:1px solid var(--ik-border); padding-top:10px; }\n.msg { margin-bottom:8px; }\n.msg-role {\n font-size:10px; font-weight:700; text-transform:uppercase;\n letter-spacing:.05em; margin-bottom:2px;\n}\n.msg-role.human { color:var(--ik-accent); }\n.msg-role.agent { color:#22c55e; }\n.msg-content { font-size:12px; line-height:1.5; }\n\n.status-badge {\n display:inline-flex; align-items:center; gap:4px;\n font-size:10px; font-weight:700; text-transform:uppercase; letter-spacing:.05em;\n border-radius:4px; padding:2px 6px;\n}\n.status-badge.pending { background:rgba(99,102,241,.15); color:var(--ik-accent); }\n.status-badge.resolved { background:rgba(34,197,94,.15); color:#22c55e; }\n.status-badge.dismissed { background:var(--ik-bg2); color:var(--ik-muted); }\n`\n\n/** Marker pin styles injected into document.head — pins overlay the page */\nexport const MARKER_CSS = /* css */ `\n.ik-marker {\n position: absolute;\n z-index: 2147483645;\n width: 24px; height: 24px;\n border-radius: 50%;\n background: var(--ik-marker-default, #6366f1);\n color: #fff;\n font-size: 11px; font-weight: 700;\n display: flex; align-items: center; justify-content: center;\n cursor: pointer;\n box-shadow: 0 2px 8px color-mix(in srgb, var(--ik-marker-default, #6366f1) 40%, transparent);\n transition: transform .15s ease;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n pointer-events: all;\n user-select: none;\n}\n.ik-marker:hover { transform: scale(1.15); }\n.ik-marker.has-screenshot { background: var(--ik-marker-screenshot, #22c55e); box-shadow: 0 2px 8px color-mix(in srgb, var(--ik-marker-screenshot, #22c55e) 40%, transparent); }\n.ik-marker.dismissed { background: var(--ik-marker-dismissed, #71717a); box-shadow: 0 2px 8px rgba(0,0,0,.2); }\n`\n\n/** Inject styles into document.head (idempotent) */\nexport function injectGlobalStyles(colors?: import('../types').MarkerColors): void {\n if (document.getElementById('instruckt-global')) return\n const vars = colors\n ? `:root {${colors.default ? ` --ik-marker-default: ${colors.default};` : ''}${colors.screenshot ? ` --ik-marker-screenshot: ${colors.screenshot};` : ''}${colors.dismissed ? ` --ik-marker-dismissed: ${colors.dismissed};` : ''} }\\n`\n : ''\n const style = document.createElement('style')\n style.id = 'instruckt-global'\n style.textContent = vars + GLOBAL_CSS + MARKER_CSS\n document.head.appendChild(style)\n}\n","import type { KeyBindings } from '../types'\nimport { TOOLBAR_CSS } from './styles'\n\nexport type ToolbarMode = 'idle' | 'annotating' | 'frozen'\n\ninterface ToolbarCallbacks {\n onToggleAnnotate: (active: boolean) => void\n onFreezeAnimations: (frozen: boolean) => void\n onScreenshot: () => void\n onCopy: () => void\n onClearPage?: () => void\n onClearAll?: () => void\n onMinimize?: (minimized: boolean) => void\n}\n\n// ── Inline SVG icons (24x24, 2px stroke) ─────────────────────\n\nconst ICONS = {\n annotate: `<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 20h9\"/><path d=\"M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4 12.5-12.5z\"/></svg>`,\n freeze: `<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"6\" y=\"4\" width=\"4\" height=\"16\" rx=\"1\"/><rect x=\"14\" y=\"4\" width=\"4\" height=\"16\" rx=\"1\"/></svg>`,\n copy: `<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\"/><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"/></svg>`,\n check: `<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"/></svg>`,\n clear: `<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"3 6 5 6 21 6\"/><path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\"/></svg>`,\n minimize: `<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"7 13 12 18 17 13\"/><line x1=\"12\" y1=\"6\" x2=\"12\" y2=\"18\"/></svg>`,\n screenshot: `<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z\"/><circle cx=\"12\" cy=\"13\" r=\"4\"/></svg>`,\n logo: `<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 20h9\"/><path d=\"M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4 12.5-12.5z\"/></svg>`,\n} as const\n\nexport class Toolbar {\n private host!: HTMLElement\n private shadow!: ShadowRoot\n private toolbarEl!: HTMLDivElement\n private fab!: HTMLButtonElement\n private fabBadge: HTMLSpanElement | null = null\n private annotateBtn!: HTMLButtonElement\n private freezeBtn!: HTMLButtonElement\n private copyBtn!: HTMLButtonElement\n private annotateActive = false\n private freezeActive = false\n private minimized = false\n private totalCount = 0\n private dragging = false\n private dragOffset = { x: 0, y: 0 }\n\n private keys: KeyBindings\n\n constructor(\n private readonly position: string,\n private readonly callbacks: ToolbarCallbacks,\n keys?: KeyBindings,\n ) {\n this.keys = keys ?? {}\n this.build()\n this.setupDrag()\n }\n\n private build(): void {\n this.host = document.createElement('div')\n this.host.setAttribute('data-instruckt', 'toolbar')\n this.shadow = this.host.attachShadow({ mode: 'open' })\n\n const style = document.createElement('style')\n style.textContent = TOOLBAR_CSS\n this.shadow.appendChild(style)\n\n // Full toolbar\n this.toolbarEl = document.createElement('div')\n this.toolbarEl.className = 'toolbar'\n\n const k = this.keys\n this.annotateBtn = this.makeBtn(ICONS.annotate, `Annotate elements (${(k.annotate ?? 'A').toUpperCase()})`, () => {\n const next = !this.annotateActive\n this.setAnnotateActive(next)\n this.callbacks.onToggleAnnotate(next)\n })\n\n this.freezeBtn = this.makeBtn(ICONS.freeze, `Freeze page (${(k.freeze ?? 'F').toUpperCase()})`, () => {\n const next = !this.freezeActive\n this.setFreezeActive(next)\n this.callbacks.onFreezeAnimations(next)\n })\n\n const screenshotBtn = this.makeBtn(ICONS.screenshot, `Screenshot region (${(k.screenshot ?? 'C').toUpperCase()})`, () => {\n this.callbacks.onScreenshot()\n })\n\n this.copyBtn = this.makeBtn(ICONS.copy, 'Copy annotations as markdown', () => {\n this.callbacks.onCopy()\n this.copyBtn.innerHTML = ICONS.check\n setTimeout(() => { this.copyBtn.innerHTML = ICONS.copy }, 1200)\n })\n\n const clearWrap = document.createElement('div')\n clearWrap.className = 'clear-wrap'\n\n const clearBtn = this.makeBtn(ICONS.clear, `Clear this page (${(k.clearPage ?? 'X').toUpperCase()})`, () => {\n this.callbacks.onClearPage?.()\n })\n clearBtn.classList.add('danger-btn')\n\n const clearAllBtn = this.makeBtn(\n `<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10 10-4.5 10-10S17.5 2 12 2\"/><line x1=\"4.93\" y1=\"4.93\" x2=\"19.07\" y2=\"19.07\"/></svg>`,\n 'Delete all instructions.',\n () => this.callbacks.onClearAll?.(),\n )\n clearAllBtn.classList.add('danger-btn', 'clear-all-btn')\n\n clearWrap.appendChild(clearBtn)\n clearWrap.appendChild(clearAllBtn)\n\n const minimizeBtn = this.makeBtn(ICONS.minimize, 'Minimize toolbar', () => {\n this.setMinimized(true)\n })\n minimizeBtn.classList.add('minimize-btn')\n\n const mkDiv = () => { const d = document.createElement('div'); d.className = 'divider'; return d }\n\n this.toolbarEl.append(\n this.annotateBtn, screenshotBtn, mkDiv(), this.freezeBtn, mkDiv(),\n this.copyBtn, clearWrap, mkDiv(), minimizeBtn,\n )\n this.shadow.appendChild(this.toolbarEl)\n\n // Floating action button (minimized state)\n this.fab = document.createElement('button')\n this.fab.className = 'fab'\n this.fab.title = 'Open instruckt toolbar'\n this.fab.setAttribute('aria-label', 'Open instruckt toolbar')\n this.fab.innerHTML = ICONS.logo\n this.fab.style.display = 'none'\n this.fab.addEventListener('click', (e) => {\n e.stopPropagation()\n this.setMinimized(false)\n })\n this.shadow.appendChild(this.fab)\n\n // Prevent toolbar clicks from reaching page handlers (e.g. Alpine @click.outside)\n // Shadow DOM stopPropagation only works within the shadow tree — clicks still\n // re-dispatch from the host element into the regular DOM.\n this.host.addEventListener('click', (e) => e.stopPropagation())\n this.host.addEventListener('mousedown', (e) => e.stopPropagation())\n this.host.addEventListener('pointerdown', (e) => e.stopPropagation())\n\n this.applyPosition()\n const root = document.getElementById('instruckt-root') ?? document.body\n root.appendChild(this.host)\n }\n\n private makeBtn(iconHtml: string, tooltip: string, onClick: () => void): HTMLButtonElement {\n const btn = document.createElement('button')\n btn.className = 'btn'\n btn.setAttribute('data-tooltip', tooltip)\n btn.setAttribute('aria-label', tooltip)\n btn.innerHTML = iconHtml\n btn.addEventListener('click', (e) => {\n e.stopPropagation()\n onClick()\n })\n return btn\n }\n\n private applyPosition(): void {\n const m = '16px'\n Object.assign(this.host.style, {\n position: 'fixed',\n zIndex: '2147483646',\n bottom: this.position.includes('bottom') ? m : 'auto',\n top: this.position.includes('top') ? m : 'auto',\n right: this.position.includes('right') ? m : 'auto',\n left: this.position.includes('left') ? m : 'auto',\n })\n }\n\n private setupDrag(): void {\n this.shadow.addEventListener('mousedown', (evt) => {\n const e = evt as MouseEvent\n if ((e.target as Element).closest('.btn') || (e.target as Element).closest('.fab')) return\n this.dragging = true\n const rect = this.host.getBoundingClientRect()\n this.dragOffset = { x: e.clientX - rect.left, y: e.clientY - rect.top }\n e.preventDefault()\n })\n\n document.addEventListener('mousemove', (e) => {\n if (!this.dragging) return\n Object.assign(this.host.style, {\n left: `${e.clientX - this.dragOffset.x}px`,\n top: `${e.clientY - this.dragOffset.y}px`,\n right: 'auto',\n bottom: 'auto',\n })\n })\n\n document.addEventListener('mouseup', () => { this.dragging = false })\n }\n\n private setMinimized(min: boolean): void {\n this.minimized = min\n this.toolbarEl.style.display = min ? 'none' : ''\n this.fab.style.display = min ? '' : 'none'\n this.updateFabBadge()\n this.callbacks.onMinimize?.(min)\n }\n\n private updateFabBadge(): void {\n if (this.totalCount > 0 && this.minimized) {\n if (!this.fabBadge) {\n this.fabBadge = document.createElement('span')\n this.fabBadge.className = 'fab-badge'\n this.fab.appendChild(this.fabBadge)\n }\n this.fabBadge.textContent = this.totalCount > 99 ? '99+' : String(this.totalCount)\n } else {\n this.fabBadge?.remove()\n this.fabBadge = null\n }\n }\n\n isMinimized(): boolean {\n return this.minimized\n }\n\n /** Programmatically minimize without firing callback */\n minimize(): void {\n this.minimized = true\n this.toolbarEl.style.display = 'none'\n this.fab.style.display = ''\n this.updateFabBadge()\n }\n\n setAnnotateActive(active: boolean): void {\n this.annotateActive = active\n this.annotateBtn.classList.toggle('active', active)\n document.body.classList.toggle('ik-annotating', active)\n }\n\n setFreezeActive(active: boolean): void {\n this.freezeActive = active\n this.freezeBtn.classList.toggle('active', active)\n }\n\n // Keep for compatibility — resolves visual mode from instruckt.ts\n setMode(mode: ToolbarMode): void {\n this.setAnnotateActive(mode === 'annotating')\n }\n\n setAnnotationCount(count: number): void {\n let badge = this.annotateBtn.querySelector('.badge')\n if (count > 0) {\n if (!badge) {\n badge = document.createElement('span')\n badge.className = 'badge'\n this.annotateBtn.appendChild(badge)\n }\n badge.textContent = count > 99 ? '99+' : String(count)\n } else {\n badge?.remove()\n }\n }\n\n setTotalCount(count: number): void {\n this.totalCount = count\n this.updateFabBadge()\n }\n\n destroy(): void {\n this.host.remove()\n document.body.classList.remove('ik-annotating')\n }\n}\n","/** Hover highlight overlay — uses all inline styles, no CSS class needed */\nexport class ElementHighlight {\n private el: HTMLElement\n\n constructor() {\n this.el = document.createElement('div')\n // All styling inline to avoid any host-page CSS interference\n Object.assign(this.el.style, {\n position: 'fixed',\n pointerEvents: 'none', // MUST be none — prevents swallowing clicks\n zIndex: '2147483644',\n border: '2px solid rgba(99,102,241,0.7)',\n background: 'rgba(99,102,241,0.1)',\n borderRadius: '3px',\n transition: 'all 0.06s ease',\n display: 'none',\n })\n this.el.setAttribute('data-instruckt', 'highlight')\n const root = document.getElementById('instruckt-root') ?? document.body\n root.appendChild(this.el)\n }\n\n show(el: Element): void {\n const rect = el.getBoundingClientRect()\n if (rect.width === 0 && rect.height === 0) {\n this.hide()\n return\n }\n Object.assign(this.el.style, {\n display: 'block',\n left: `${rect.left}px`,\n top: `${rect.top}px`,\n width: `${rect.width}px`,\n height: `${rect.height}px`,\n })\n }\n\n hide(): void {\n this.el.style.display = 'none'\n }\n\n destroy(): void {\n this.el.remove()\n }\n}\n","function changeJpegDpi(uint8Array, dpi) {\n uint8Array[13] = 1;\n uint8Array[14] = dpi >> 8;\n uint8Array[15] = dpi & 255;\n uint8Array[16] = dpi >> 8;\n uint8Array[17] = dpi & 255;\n return uint8Array;\n}\n\nconst _P = \"p\".charCodeAt(0);\nconst _H = \"H\".charCodeAt(0);\nconst _Y = \"Y\".charCodeAt(0);\nconst _S = \"s\".charCodeAt(0);\nlet pngDataTable;\nfunction createPngDataTable() {\n const crcTable = new Int32Array(256);\n for (let n = 0; n < 256; n++) {\n let c = n;\n for (let k = 0; k < 8; k++) {\n c = c & 1 ? 3988292384 ^ c >>> 1 : c >>> 1;\n }\n crcTable[n] = c;\n }\n return crcTable;\n}\nfunction calcCrc(uint8Array) {\n let c = -1;\n if (!pngDataTable)\n pngDataTable = createPngDataTable();\n for (let n = 0; n < uint8Array.length; n++) {\n c = pngDataTable[(c ^ uint8Array[n]) & 255] ^ c >>> 8;\n }\n return c ^ -1;\n}\nfunction searchStartOfPhys(uint8Array) {\n const length = uint8Array.length - 1;\n for (let i = length; i >= 4; i--) {\n if (uint8Array[i - 4] === 9 && uint8Array[i - 3] === _P && uint8Array[i - 2] === _H && uint8Array[i - 1] === _Y && uint8Array[i] === _S) {\n return i - 3;\n }\n }\n return 0;\n}\nfunction changePngDpi(uint8Array, dpi, overwritepHYs = false) {\n const physChunk = new Uint8Array(13);\n dpi *= 39.3701;\n physChunk[0] = _P;\n physChunk[1] = _H;\n physChunk[2] = _Y;\n physChunk[3] = _S;\n physChunk[4] = dpi >>> 24;\n physChunk[5] = dpi >>> 16;\n physChunk[6] = dpi >>> 8;\n physChunk[7] = dpi & 255;\n physChunk[8] = physChunk[4];\n physChunk[9] = physChunk[5];\n physChunk[10] = physChunk[6];\n physChunk[11] = physChunk[7];\n physChunk[12] = 1;\n const crc = calcCrc(physChunk);\n const crcChunk = new Uint8Array(4);\n crcChunk[0] = crc >>> 24;\n crcChunk[1] = crc >>> 16;\n crcChunk[2] = crc >>> 8;\n crcChunk[3] = crc & 255;\n if (overwritepHYs) {\n const startingIndex = searchStartOfPhys(uint8Array);\n uint8Array.set(physChunk, startingIndex);\n uint8Array.set(crcChunk, startingIndex + 13);\n return uint8Array;\n } else {\n const chunkLength = new Uint8Array(4);\n chunkLength[0] = 0;\n chunkLength[1] = 0;\n chunkLength[2] = 0;\n chunkLength[3] = 9;\n const finalHeader = new Uint8Array(54);\n finalHeader.set(uint8Array, 0);\n finalHeader.set(chunkLength, 33);\n finalHeader.set(physChunk, 37);\n finalHeader.set(crcChunk, 50);\n return finalHeader;\n }\n}\nconst b64PhysSignature1 = \"AAlwSFlz\";\nconst b64PhysSignature2 = \"AAAJcEhZ\";\nconst b64PhysSignature3 = \"AAAACXBI\";\nfunction detectPhysChunkFromDataUrl(dataUrl) {\n let b64index = dataUrl.indexOf(b64PhysSignature1);\n if (b64index === -1) {\n b64index = dataUrl.indexOf(b64PhysSignature2);\n }\n if (b64index === -1) {\n b64index = dataUrl.indexOf(b64PhysSignature3);\n }\n return b64index;\n}\n\nconst PREFIX = \"[modern-screenshot]\";\nconst IN_BROWSER = typeof window !== \"undefined\";\nconst SUPPORT_WEB_WORKER = IN_BROWSER && \"Worker\" in window;\nconst SUPPORT_ATOB = IN_BROWSER && \"atob\" in window;\nconst SUPPORT_BTOA = IN_BROWSER && \"btoa\" in window;\nconst USER_AGENT = IN_BROWSER ? window.navigator?.userAgent : \"\";\nconst IN_CHROME = USER_AGENT.includes(\"Chrome\");\nconst IN_SAFARI = USER_AGENT.includes(\"AppleWebKit\") && !IN_CHROME;\nconst IN_FIREFOX = USER_AGENT.includes(\"Firefox\");\nconst isContext = (value) => value && \"__CONTEXT__\" in value;\nconst isCssFontFaceRule = (rule) => rule.constructor.name === \"CSSFontFaceRule\";\nconst isCSSImportRule = (rule) => rule.constructor.name === \"CSSImportRule\";\nconst isLayerBlockRule = (rule) => rule.constructor.name === \"CSSLayerBlockRule\";\nconst isElementNode = (node) => node.nodeType === 1;\nconst isSVGElementNode = (node) => typeof node.className === \"object\";\nconst isSVGImageElementNode = (node) => node.tagName === \"image\";\nconst isSVGUseElementNode = (node) => node.tagName === \"use\";\nconst isHTMLElementNode = (node) => isElementNode(node) && typeof node.style !== \"undefined\" && !isSVGElementNode(node);\nconst isCommentNode = (node) => node.nodeType === 8;\nconst isTextNode = (node) => node.nodeType === 3;\nconst isImageElement = (node) => node.tagName === \"IMG\";\nconst isVideoElement = (node) => node.tagName === \"VIDEO\";\nconst isCanvasElement = (node) => node.tagName === \"CANVAS\";\nconst isTextareaElement = (node) => node.tagName === \"TEXTAREA\";\nconst isInputElement = (node) => node.tagName === \"INPUT\";\nconst isStyleElement = (node) => node.tagName === \"STYLE\";\nconst isScriptElement = (node) => node.tagName === \"SCRIPT\";\nconst isSelectElement = (node) => node.tagName === \"SELECT\";\nconst isSlotElement = (node) => node.tagName === \"SLOT\";\nconst isIFrameElement = (node) => node.tagName === \"IFRAME\";\nconst consoleWarn = (...args) => console.warn(PREFIX, ...args);\nfunction supportWebp(ownerDocument) {\n const canvas = ownerDocument?.createElement?.(\"canvas\");\n if (canvas) {\n canvas.height = canvas.width = 1;\n }\n return Boolean(canvas) && \"toDataURL\" in canvas && Boolean(canvas.toDataURL(\"image/webp\").includes(\"image/webp\"));\n}\nconst isDataUrl = (url) => url.startsWith(\"data:\");\nfunction resolveUrl(url, baseUrl) {\n if (url.match(/^[a-z]+:\\/\\//i))\n return url;\n if (IN_BROWSER && url.match(/^\\/\\//))\n return window.location.protocol + url;\n if (url.match(/^[a-z]+:/i))\n return url;\n if (!IN_BROWSER)\n return url;\n const doc = getDocument().implementation.createHTMLDocument();\n const base = doc.createElement(\"base\");\n const a = doc.createElement(\"a\");\n doc.head.appendChild(base);\n doc.body.appendChild(a);\n if (baseUrl)\n base.href = baseUrl;\n a.href = url;\n return a.href;\n}\nfunction getDocument(target) {\n return (target && isElementNode(target) ? target?.ownerDocument : target) ?? window.document;\n}\nconst XMLNS = \"http://www.w3.org/2000/svg\";\nfunction createSvg(width, height, ownerDocument) {\n const svg = getDocument(ownerDocument).createElementNS(XMLNS, \"svg\");\n svg.setAttributeNS(null, \"width\", width.toString());\n svg.setAttributeNS(null, \"height\", height.toString());\n svg.setAttributeNS(null, \"viewBox\", `0 0 ${width} ${height}`);\n return svg;\n}\nfunction svgToDataUrl(svg, removeControlCharacter) {\n let xhtml = new XMLSerializer().serializeToString(svg);\n if (removeControlCharacter) {\n xhtml = xhtml.replace(/[\\u0000-\\u0008\\v\\f\\u000E-\\u001F\\uD800-\\uDFFF\\uFFFE\\uFFFF]/gu, \"\");\n }\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(xhtml)}`;\n}\nasync function canvasToBlob(canvas, type = \"image/png\", quality = 1) {\n try {\n return await new Promise((resolve, reject) => {\n canvas.toBlob((blob) => {\n if (blob) {\n resolve(blob);\n } else {\n reject(new Error(\"Blob is null\"));\n }\n }, type, quality);\n });\n } catch (error) {\n if (SUPPORT_ATOB) {\n return dataUrlToBlob(canvas.toDataURL(type, quality));\n }\n throw error;\n }\n}\nfunction dataUrlToBlob(dataUrl) {\n const [header, base64] = dataUrl.split(\",\");\n const type = header.match(/data:(.+);/)?.[1] ?? void 0;\n const decoded = window.atob(base64);\n const length = decoded.length;\n const buffer = new Uint8Array(length);\n for (let i = 0; i < length; i += 1) {\n buffer[i] = decoded.charCodeAt(i);\n }\n return new Blob([buffer], { type });\n}\nfunction readBlob(blob, type) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result);\n reader.onerror = () => reject(reader.error);\n reader.onabort = () => reject(new Error(`Failed read blob to ${type}`));\n if (type === \"dataUrl\") {\n reader.readAsDataURL(blob);\n } else if (type === \"arrayBuffer\") {\n reader.readAsArrayBuffer(blob);\n }\n });\n}\nconst blobToDataUrl = (blob) => readBlob(blob, \"dataUrl\");\nconst blobToArrayBuffer = (blob) => readBlob(blob, \"arrayBuffer\");\nfunction createImage(url, ownerDocument) {\n const img = getDocument(ownerDocument).createElement(\"img\");\n img.decoding = \"sync\";\n img.loading = \"eager\";\n img.src = url;\n return img;\n}\nfunction loadMedia(media, options) {\n return new Promise((resolve) => {\n const { timeout, ownerDocument, onError: userOnError, onWarn } = options ?? {};\n const node = typeof media === \"string\" ? createImage(media, getDocument(ownerDocument)) : media;\n let timer = null;\n let removeEventListeners = null;\n function onResolve() {\n resolve(node);\n timer && clearTimeout(timer);\n removeEventListeners?.();\n }\n if (timeout) {\n timer = setTimeout(onResolve, timeout);\n }\n if (isVideoElement(node)) {\n const currentSrc = node.currentSrc || node.src;\n if (!currentSrc) {\n if (node.poster) {\n return loadMedia(node.poster, options).then(resolve);\n }\n return onResolve();\n }\n if (node.readyState >= 2) {\n return onResolve();\n }\n const onLoadeddata = onResolve;\n const onError = (error) => {\n onWarn?.(\n \"Failed video load\",\n currentSrc,\n error\n );\n userOnError?.(error);\n onResolve();\n };\n removeEventListeners = () => {\n node.removeEventListener(\"loadeddata\", onLoadeddata);\n node.removeEventListener(\"error\", onError);\n };\n node.addEventListener(\"loadeddata\", onLoadeddata, { once: true });\n node.addEventListener(\"error\", onError, { once: true });\n } else {\n const currentSrc = isSVGImageElementNode(node) ? node.href.baseVal : node.currentSrc || node.src;\n if (!currentSrc) {\n return onResolve();\n }\n const onLoad = async () => {\n if (isImageElement(node) && \"decode\" in node) {\n try {\n await node.decode();\n } catch (error) {\n onWarn?.(\n \"Failed to decode image, trying to render anyway\",\n node.dataset.originalSrc || currentSrc,\n error\n );\n }\n }\n onResolve();\n };\n const onError = (error) => {\n onWarn?.(\n \"Failed image load\",\n node.dataset.originalSrc || currentSrc,\n error\n );\n onResolve();\n };\n if (isImageElement(node) && node.complete) {\n return onLoad();\n }\n removeEventListeners = () => {\n node.removeEventListener(\"load\", onLoad);\n node.removeEventListener(\"error\", onError);\n };\n node.addEventListener(\"load\", onLoad, { once: true });\n node.addEventListener(\"error\", onError, { once: true });\n }\n });\n}\nasync function waitUntilLoad(node, options) {\n if (isHTMLElementNode(node)) {\n if (isImageElement(node) || isVideoElement(node)) {\n await loadMedia(node, options);\n } else {\n await Promise.all(\n [\"img\", \"video\"].flatMap((selectors) => {\n return Array.from(node.querySelectorAll(selectors)).map((el) => loadMedia(el, options));\n })\n );\n }\n }\n}\nconst uuid = /* @__PURE__ */ function uuid2() {\n let counter = 0;\n const random = () => `0000${(Math.random() * 36 ** 4 << 0).toString(36)}`.slice(-4);\n return () => {\n counter += 1;\n return `u${random()}${counter}`;\n };\n}();\nfunction splitFontFamily(fontFamily) {\n return fontFamily?.split(\",\").map((val) => val.trim().replace(/\"|'/g, \"\").toLowerCase()).filter(Boolean);\n}\n\nlet uid = 0;\nfunction createLogger(debug) {\n const prefix = `${PREFIX}[#${uid}]`;\n uid++;\n return {\n // eslint-disable-next-line no-console\n time: (label) => debug && console.time(`${prefix} ${label}`),\n // eslint-disable-next-line no-console\n timeEnd: (label) => debug && console.timeEnd(`${prefix} ${label}`),\n warn: (...args) => debug && consoleWarn(...args)\n };\n}\n\nfunction getDefaultRequestInit(bypassingCache) {\n return {\n cache: bypassingCache ? \"no-cache\" : \"force-cache\"\n };\n}\n\nasync function orCreateContext(node, options) {\n return isContext(node) ? node : createContext(node, { ...options, autoDestruct: true });\n}\nasync function createContext(node, options) {\n const { scale = 1, workerUrl, workerNumber = 1 } = options || {};\n const debug = Boolean(options?.debug);\n const features = options?.features ?? true;\n const ownerDocument = node.ownerDocument ?? (IN_BROWSER ? window.document : void 0);\n const ownerWindow = node.ownerDocument?.defaultView ?? (IN_BROWSER ? window : void 0);\n const requests = /* @__PURE__ */ new Map();\n const context = {\n // Options\n width: 0,\n height: 0,\n quality: 1,\n type: \"image/png\",\n scale,\n backgroundColor: null,\n style: null,\n filter: null,\n maximumCanvasSize: 0,\n timeout: 3e4,\n progress: null,\n debug,\n fetch: {\n requestInit: getDefaultRequestInit(options?.fetch?.bypassingCache),\n placeholderImage: \"data:image/png;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\",\n bypassingCache: false,\n ...options?.fetch\n },\n fetchFn: null,\n font: {},\n drawImageInterval: 100,\n workerUrl: null,\n workerNumber,\n onCloneEachNode: null,\n onCloneNode: null,\n onEmbedNode: null,\n onCreateForeignObjectSvg: null,\n includeStyleProperties: null,\n autoDestruct: false,\n ...options,\n // InternalContext\n __CONTEXT__: true,\n log: createLogger(debug),\n node,\n ownerDocument,\n ownerWindow,\n dpi: scale === 1 ? null : 96 * scale,\n svgStyleElement: createStyleElement(ownerDocument),\n svgDefsElement: ownerDocument?.createElementNS(XMLNS, \"defs\"),\n svgStyles: /* @__PURE__ */ new Map(),\n defaultComputedStyles: /* @__PURE__ */ new Map(),\n workers: [\n ...Array.from({\n length: SUPPORT_WEB_WORKER && workerUrl && workerNumber ? workerNumber : 0\n })\n ].map(() => {\n try {\n const worker = new Worker(workerUrl);\n worker.onmessage = async (event) => {\n const { url, result } = event.data;\n if (result) {\n requests.get(url)?.resolve?.(result);\n } else {\n requests.get(url)?.reject?.(new Error(`Error receiving message from worker: ${url}`));\n }\n };\n worker.onmessageerror = (event) => {\n const { url } = event.data;\n requests.get(url)?.reject?.(new Error(`Error receiving message from worker: ${url}`));\n };\n return worker;\n } catch (error) {\n context.log.warn(\"Failed to new Worker\", error);\n return null;\n }\n }).filter(Boolean),\n fontFamilies: /* @__PURE__ */ new Map(),\n fontCssTexts: /* @__PURE__ */ new Map(),\n acceptOfImage: `${[\n supportWebp(ownerDocument) && \"image/webp\",\n \"image/svg+xml\",\n \"image/*\",\n \"*/*\"\n ].filter(Boolean).join(\",\")};q=0.8`,\n requests,\n drawImageCount: 0,\n tasks: [],\n features,\n isEnable: (key) => {\n if (key === \"restoreScrollPosition\") {\n return typeof features === \"boolean\" ? false : features[key] ?? false;\n }\n if (typeof features === \"boolean\") {\n return features;\n }\n return features[key] ?? true;\n },\n shadowRoots: []\n };\n context.log.time(\"wait until load\");\n await waitUntilLoad(node, { timeout: context.timeout, onWarn: context.log.warn });\n context.log.timeEnd(\"wait until load\");\n const { width, height } = resolveBoundingBox(node, context);\n context.width = width;\n context.height = height;\n return context;\n}\nfunction createStyleElement(ownerDocument) {\n if (!ownerDocument)\n return void 0;\n const style = ownerDocument.createElement(\"style\");\n const cssText = style.ownerDocument.createTextNode(`\n.______background-clip--text {\n background-clip: text;\n -webkit-background-clip: text;\n}\n`);\n style.appendChild(cssText);\n return style;\n}\nfunction resolveBoundingBox(node, context) {\n let { width, height } = context;\n if (isElementNode(node) && (!width || !height)) {\n const box = node.getBoundingClientRect();\n width = width || box.width || Number(node.getAttribute(\"width\")) || 0;\n height = height || box.height || Number(node.getAttribute(\"height\")) || 0;\n }\n return { width, height };\n}\n\nasync function imageToCanvas(image, context) {\n const {\n log,\n timeout,\n drawImageCount,\n drawImageInterval\n } = context;\n log.time(\"image to canvas\");\n const loaded = await loadMedia(image, { timeout, onWarn: context.log.warn });\n const { canvas, context2d } = createCanvas(image.ownerDocument, context);\n const drawImage = () => {\n try {\n context2d?.drawImage(loaded, 0, 0, canvas.width, canvas.height);\n } catch (error) {\n context.log.warn(\"Failed to drawImage\", error);\n }\n };\n drawImage();\n if (context.isEnable(\"fixSvgXmlDecode\")) {\n for (let i = 0; i < drawImageCount; i++) {\n await new Promise((resolve) => {\n setTimeout(() => {\n context2d?.clearRect(0, 0, canvas.width, canvas.height);\n drawImage();\n resolve();\n }, i + drawImageInterval);\n });\n }\n }\n context.drawImageCount = 0;\n log.timeEnd(\"image to canvas\");\n return canvas;\n}\nfunction createCanvas(ownerDocument, context) {\n const { width, height, scale, backgroundColor, maximumCanvasSize: max } = context;\n const canvas = ownerDocument.createElement(\"canvas\");\n canvas.width = Math.floor(width * scale);\n canvas.height = Math.floor(height * scale);\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n if (max) {\n if (canvas.width > max || canvas.height > max) {\n if (canvas.width > max && canvas.height > max) {\n if (canvas.width > canvas.height) {\n canvas.height *= max / canvas.width;\n canvas.width = max;\n } else {\n canvas.width *= max / canvas.height;\n canvas.height = max;\n }\n } else if (canvas.width > max) {\n canvas.height *= max / canvas.width;\n canvas.width = max;\n } else {\n canvas.width *= max / canvas.height;\n canvas.height = max;\n }\n }\n }\n const context2d = canvas.getContext(\"2d\");\n if (context2d && backgroundColor) {\n context2d.fillStyle = backgroundColor;\n context2d.fillRect(0, 0, canvas.width, canvas.height);\n }\n return { canvas, context2d };\n}\n\nfunction cloneCanvas(canvas, context) {\n if (canvas.ownerDocument) {\n try {\n const dataURL = canvas.toDataURL();\n if (dataURL !== \"data:,\") {\n return createImage(dataURL, canvas.ownerDocument);\n }\n } catch (error) {\n context.log.warn(\"Failed to clone canvas\", error);\n }\n }\n const cloned = canvas.cloneNode(false);\n const ctx = canvas.getContext(\"2d\");\n const clonedCtx = cloned.getContext(\"2d\");\n try {\n if (ctx && clonedCtx) {\n clonedCtx.putImageData(\n ctx.getImageData(0, 0, canvas.width, canvas.height),\n 0,\n 0\n );\n }\n return cloned;\n } catch (error) {\n context.log.warn(\"Failed to clone canvas\", error);\n }\n return cloned;\n}\n\nfunction cloneIframe(iframe, context) {\n try {\n if (iframe?.contentDocument?.body) {\n return cloneNode(iframe.contentDocument.body, context);\n }\n } catch (error) {\n context.log.warn(\"Failed to clone iframe\", error);\n }\n return iframe.cloneNode(false);\n}\n\nfunction cloneImage(image) {\n const cloned = image.cloneNode(false);\n if (image.currentSrc && image.currentSrc !== image.src) {\n cloned.src = image.currentSrc;\n cloned.srcset = \"\";\n }\n if (cloned.loading === \"lazy\") {\n cloned.loading = \"eager\";\n }\n return cloned;\n}\n\nasync function cloneVideo(video, context) {\n if (video.ownerDocument && !video.currentSrc && video.poster) {\n return createImage(video.poster, video.ownerDocument);\n }\n const cloned = video.cloneNode(false);\n cloned.crossOrigin = \"anonymous\";\n if (video.currentSrc && video.currentSrc !== video.src) {\n cloned.src = video.currentSrc;\n }\n const ownerDocument = cloned.ownerDocument;\n if (ownerDocument) {\n let canPlay = true;\n await loadMedia(cloned, { onError: () => canPlay = false, onWarn: context.log.warn });\n if (!canPlay) {\n if (video.poster) {\n return createImage(video.poster, video.ownerDocument);\n }\n return cloned;\n }\n cloned.currentTime = video.currentTime;\n await new Promise((resolve) => {\n cloned.addEventListener(\"seeked\", resolve, { once: true });\n });\n const canvas = ownerDocument.createElement(\"canvas\");\n canvas.width = video.offsetWidth;\n canvas.height = video.offsetHeight;\n try {\n const ctx = canvas.getContext(\"2d\");\n if (ctx)\n ctx.drawImage(cloned, 0, 0, canvas.width, canvas.height);\n } catch (error) {\n context.log.warn(\"Failed to clone video\", error);\n if (video.poster) {\n return createImage(video.poster, video.ownerDocument);\n }\n return cloned;\n }\n return cloneCanvas(canvas, context);\n }\n return cloned;\n}\n\nfunction cloneElement(node, context) {\n if (isCanvasElement(node)) {\n return cloneCanvas(node, context);\n }\n if (isIFrameElement(node)) {\n return cloneIframe(node, context);\n }\n if (isImageElement(node)) {\n return cloneImage(node);\n }\n if (isVideoElement(node)) {\n return cloneVideo(node, context);\n }\n return node.cloneNode(false);\n}\n\nfunction getSandBox(context) {\n let sandbox = context.sandbox;\n if (!sandbox) {\n const { ownerDocument } = context;\n try {\n if (ownerDocument) {\n sandbox = ownerDocument.createElement(\"iframe\");\n sandbox.id = `__SANDBOX__${uuid()}`;\n sandbox.width = \"0\";\n sandbox.height = \"0\";\n sandbox.style.visibility = \"hidden\";\n sandbox.style.position = \"fixed\";\n ownerDocument.body.appendChild(sandbox);\n sandbox.srcdoc = '<!DOCTYPE html><meta charset=\"UTF-8\"><title></title><body>';\n context.sandbox = sandbox;\n }\n } catch (error) {\n context.log.warn(\"Failed to getSandBox\", error);\n }\n }\n return sandbox;\n}\n\nconst ignoredStyles = [\n \"width\",\n \"height\",\n \"-webkit-text-fill-color\"\n];\nconst includedAttributes = [\n \"stroke\",\n \"fill\"\n];\nfunction getDefaultStyle(node, pseudoElement, context) {\n const { defaultComputedStyles } = context;\n const nodeName = node.nodeName.toLowerCase();\n const isSvgNode = isSVGElementNode(node) && nodeName !== \"svg\";\n const attributes = isSvgNode ? includedAttributes.map((name) => [name, node.getAttribute(name)]).filter(([, value]) => value !== null) : [];\n const key = [\n isSvgNode && \"svg\",\n nodeName,\n attributes.map((name, value) => `${name}=${value}`).join(\",\"),\n pseudoElement\n ].filter(Boolean).join(\":\");\n if (defaultComputedStyles.has(key))\n return defaultComputedStyles.get(key);\n const sandbox = getSandBox(context);\n const sandboxWindow = sandbox?.contentWindow;\n if (!sandboxWindow)\n return /* @__PURE__ */ new Map();\n const sandboxDocument = sandboxWindow?.document;\n let root;\n let el;\n if (isSvgNode) {\n root = sandboxDocument.createElementNS(XMLNS, \"svg\");\n el = root.ownerDocument.createElementNS(root.namespaceURI, nodeName);\n attributes.forEach(([name, value]) => {\n el.setAttributeNS(null, name, value);\n });\n root.appendChild(el);\n } else {\n root = el = sandboxDocument.createElement(nodeName);\n }\n el.textContent = \" \";\n sandboxDocument.body.appendChild(root);\n const computedStyle = sandboxWindow.getComputedStyle(el, pseudoElement);\n const styles = /* @__PURE__ */ new Map();\n for (let len = computedStyle.length, i = 0; i < len; i++) {\n const name = computedStyle.item(i);\n if (ignoredStyles.includes(name))\n continue;\n styles.set(name, computedStyle.getPropertyValue(name));\n }\n sandboxDocument.body.removeChild(root);\n defaultComputedStyles.set(key, styles);\n return styles;\n}\n\nfunction getDiffStyle(style, defaultStyle, includeStyleProperties) {\n const diffStyle = /* @__PURE__ */ new Map();\n const prefixs = [];\n const prefixTree = /* @__PURE__ */ new Map();\n if (includeStyleProperties) {\n for (const name of includeStyleProperties) {\n applyTo(name);\n }\n } else {\n for (let len = style.length, i = 0; i < len; i++) {\n const name = style.item(i);\n applyTo(name);\n }\n }\n for (let len = prefixs.length, i = 0; i < len; i++) {\n prefixTree.get(prefixs[i])?.forEach((value, name) => diffStyle.set(name, value));\n }\n function applyTo(name) {\n const value = style.getPropertyValue(name);\n const priority = style.getPropertyPriority(name);\n const subIndex = name.lastIndexOf(\"-\");\n const prefix = subIndex > -1 ? name.substring(0, subIndex) : void 0;\n if (prefix) {\n let map = prefixTree.get(prefix);\n if (!map) {\n map = /* @__PURE__ */ new Map();\n prefixTree.set(prefix, map);\n }\n map.set(name, [value, priority]);\n }\n if (defaultStyle.get(name) === value && !priority)\n return;\n if (prefix) {\n prefixs.push(prefix);\n } else {\n diffStyle.set(name, [value, priority]);\n }\n }\n return diffStyle;\n}\n\nfunction copyCssStyles(node, cloned, isRoot, context) {\n const { ownerWindow, includeStyleProperties, currentParentNodeStyle } = context;\n const clonedStyle = cloned.style;\n const computedStyle = ownerWindow.getComputedStyle(node);\n const defaultStyle = getDefaultStyle(node, null, context);\n currentParentNodeStyle?.forEach((_, key) => {\n defaultStyle.delete(key);\n });\n const style = getDiffStyle(computedStyle, defaultStyle, includeStyleProperties);\n style.delete(\"transition-property\");\n style.delete(\"all\");\n style.delete(\"d\");\n style.delete(\"content\");\n if (isRoot) {\n style.delete(\"margin-top\");\n style.delete(\"margin-right\");\n style.delete(\"margin-bottom\");\n style.delete(\"margin-left\");\n style.delete(\"margin-block-start\");\n style.delete(\"margin-block-end\");\n style.delete(\"margin-inline-start\");\n style.delete(\"margin-inline-end\");\n style.set(\"box-sizing\", [\"border-box\", \"\"]);\n }\n if (style.get(\"background-clip\")?.[0] === \"text\") {\n cloned.classList.add(\"______background-clip--text\");\n }\n if (IN_CHROME) {\n if (!style.has(\"font-kerning\"))\n style.set(\"font-kerning\", [\"normal\", \"\"]);\n if ((style.get(\"overflow-x\")?.[0] === \"hidden\" || style.get(\"overflow-y\")?.[0] === \"hidden\") && style.get(\"text-overflow\")?.[0] === \"ellipsis\" && node.scrollWidth === node.clientWidth) {\n style.set(\"text-overflow\", [\"clip\", \"\"]);\n }\n }\n for (let len = clonedStyle.length, i = 0; i < len; i++) {\n clonedStyle.removeProperty(clonedStyle.item(i));\n }\n style.forEach(([value, priority], name) => {\n clonedStyle.setProperty(name, value, priority);\n });\n return style;\n}\n\nfunction copyInputValue(node, cloned) {\n if (isTextareaElement(node) || isInputElement(node) || isSelectElement(node)) {\n cloned.setAttribute(\"value\", node.value);\n }\n}\n\nconst pseudoClasses = [\n \"::before\",\n \"::after\"\n // '::placeholder', TODO\n];\nconst scrollbarPseudoClasses = [\n \"::-webkit-scrollbar\",\n \"::-webkit-scrollbar-button\",\n // '::-webkit-scrollbar:horizontal', TODO\n \"::-webkit-scrollbar-thumb\",\n \"::-webkit-scrollbar-track\",\n \"::-webkit-scrollbar-track-piece\",\n // '::-webkit-scrollbar:vertical', TODO\n \"::-webkit-scrollbar-corner\",\n \"::-webkit-resizer\"\n];\nfunction copyPseudoClass(node, cloned, copyScrollbar, context, addWordToFontFamilies) {\n const { ownerWindow, svgStyleElement, svgStyles, currentNodeStyle } = context;\n if (!svgStyleElement || !ownerWindow)\n return;\n function copyBy(pseudoClass) {\n const computedStyle = ownerWindow.getComputedStyle(node, pseudoClass);\n let content = computedStyle.getPropertyValue(\"content\");\n if (!content || content === \"none\")\n return;\n addWordToFontFamilies?.(content);\n content = content.replace(/(')|(\")|(counter\\(.+\\))/g, \"\");\n const klasses = [uuid()];\n const defaultStyle = getDefaultStyle(node, pseudoClass, context);\n currentNodeStyle?.forEach((_, key) => {\n defaultStyle.delete(key);\n });\n const style = getDiffStyle(computedStyle, defaultStyle, context.includeStyleProperties);\n style.delete(\"content\");\n style.delete(\"-webkit-locale\");\n if (style.get(\"background-clip\")?.[0] === \"text\") {\n cloned.classList.add(\"______background-clip--text\");\n }\n const cloneStyle = [\n `content: '${content}';`\n ];\n style.forEach(([value, priority], name) => {\n cloneStyle.push(`${name}: ${value}${priority ? \" !important\" : \"\"};`);\n });\n if (cloneStyle.length === 1)\n return;\n try {\n cloned.className = [cloned.className, ...klasses].join(\" \");\n } catch (err) {\n context.log.warn(\"Failed to copyPseudoClass\", err);\n return;\n }\n const cssText = cloneStyle.join(\"\\n \");\n let allClasses = svgStyles.get(cssText);\n if (!allClasses) {\n allClasses = [];\n svgStyles.set(cssText, allClasses);\n }\n allClasses.push(`.${klasses[0]}${pseudoClass}`);\n }\n pseudoClasses.forEach(copyBy);\n if (copyScrollbar)\n scrollbarPseudoClasses.forEach(copyBy);\n}\n\nconst excludeParentNodes = /* @__PURE__ */ new Set([\n \"symbol\"\n // test/fixtures/svg.symbol.html\n]);\nasync function appendChildNode(node, cloned, child, context, addWordToFontFamilies) {\n if (isElementNode(child) && (isStyleElement(child) || isScriptElement(child)))\n return;\n if (context.filter && !context.filter(child))\n return;\n if (excludeParentNodes.has(cloned.nodeName) || excludeParentNodes.has(child.nodeName)) {\n context.currentParentNodeStyle = void 0;\n } else {\n context.currentParentNodeStyle = context.currentNodeStyle;\n }\n const childCloned = await cloneNode(child, context, false, addWordToFontFamilies);\n if (context.isEnable(\"restoreScrollPosition\")) {\n restoreScrollPosition(node, childCloned);\n }\n cloned.appendChild(childCloned);\n}\nasync function cloneChildNodes(node, cloned, context, addWordToFontFamilies) {\n let firstChild = node.firstChild;\n if (isElementNode(node)) {\n if (node.shadowRoot) {\n firstChild = node.shadowRoot?.firstChild;\n context.shadowRoots.push(node.shadowRoot);\n }\n }\n for (let child = firstChild; child; child = child.nextSibling) {\n if (isCommentNode(child))\n continue;\n if (isElementNode(child) && isSlotElement(child) && typeof child.assignedNodes === \"function\") {\n const nodes = child.assignedNodes();\n for (let i = 0; i < nodes.length; i++) {\n await appendChildNode(node, cloned, nodes[i], context, addWordToFontFamilies);\n }\n } else {\n await appendChildNode(node, cloned, child, context, addWordToFontFamilies);\n }\n }\n}\nfunction restoreScrollPosition(node, chlidCloned) {\n if (!isHTMLElementNode(node) || !isHTMLElementNode(chlidCloned))\n return;\n const { scrollTop, scrollLeft } = node;\n if (!scrollTop && !scrollLeft) {\n return;\n }\n const { transform } = chlidCloned.style;\n const matrix = new DOMMatrix(transform);\n const { a, b, c, d } = matrix;\n matrix.a = 1;\n matrix.b = 0;\n matrix.c = 0;\n matrix.d = 1;\n matrix.translateSelf(-scrollLeft, -scrollTop);\n matrix.a = a;\n matrix.b = b;\n matrix.c = c;\n matrix.d = d;\n chlidCloned.style.transform = matrix.toString();\n}\nfunction applyCssStyleWithOptions(cloned, context) {\n const { backgroundColor, width, height, style: styles } = context;\n const clonedStyle = cloned.style;\n if (backgroundColor)\n clonedStyle.setProperty(\"background-color\", backgroundColor, \"important\");\n if (width)\n clonedStyle.setProperty(\"width\", `${width}px`, \"important\");\n if (height)\n clonedStyle.setProperty(\"height\", `${height}px`, \"important\");\n if (styles) {\n for (const name in styles) clonedStyle[name] = styles[name];\n }\n}\nconst NORMAL_ATTRIBUTE_RE = /^[\\w-:]+$/;\nasync function cloneNode(node, context, isRoot = false, addWordToFontFamilies) {\n const { ownerDocument, ownerWindow, fontFamilies, onCloneEachNode } = context;\n if (ownerDocument && isTextNode(node)) {\n if (addWordToFontFamilies && /\\S/.test(node.data)) {\n addWordToFontFamilies(node.data);\n }\n return ownerDocument.createTextNode(node.data);\n }\n if (ownerDocument && ownerWindow && isElementNode(node) && (isHTMLElementNode(node) || isSVGElementNode(node))) {\n const cloned2 = await cloneElement(node, context);\n if (context.isEnable(\"removeAbnormalAttributes\")) {\n const names = cloned2.getAttributeNames();\n for (let len = names.length, i = 0; i < len; i++) {\n const name = names[i];\n if (!NORMAL_ATTRIBUTE_RE.test(name)) {\n cloned2.removeAttribute(name);\n }\n }\n }\n const style = context.currentNodeStyle = copyCssStyles(node, cloned2, isRoot, context);\n if (isRoot)\n applyCssStyleWithOptions(cloned2, context);\n let copyScrollbar = false;\n if (context.isEnable(\"copyScrollbar\")) {\n const overflow = [\n style.get(\"overflow-x\")?.[0],\n style.get(\"overflow-y\")?.[0]\n ];\n copyScrollbar = overflow.includes(\"scroll\") || (overflow.includes(\"auto\") || overflow.includes(\"overlay\")) && (node.scrollHeight > node.clientHeight || node.scrollWidth > node.clientWidth);\n }\n const textTransform = style.get(\"text-transform\")?.[0];\n const families = splitFontFamily(style.get(\"font-family\")?.[0]);\n const addWordToFontFamilies2 = families ? (word) => {\n if (textTransform === \"uppercase\") {\n word = word.toUpperCase();\n } else if (textTransform === \"lowercase\") {\n word = word.toLowerCase();\n } else if (textTransform === \"capitalize\") {\n word = word[0].toUpperCase() + word.substring(1);\n }\n families.forEach((family) => {\n let fontFamily = fontFamilies.get(family);\n if (!fontFamily) {\n fontFamilies.set(family, fontFamily = /* @__PURE__ */ new Set());\n }\n word.split(\"\").forEach((text) => fontFamily.add(text));\n });\n } : void 0;\n copyPseudoClass(\n node,\n cloned2,\n copyScrollbar,\n context,\n addWordToFontFamilies2\n );\n copyInputValue(node, cloned2);\n if (!isVideoElement(node)) {\n await cloneChildNodes(\n node,\n cloned2,\n context,\n addWordToFontFamilies2\n );\n }\n await onCloneEachNode?.(cloned2);\n return cloned2;\n }\n const cloned = node.cloneNode(false);\n await cloneChildNodes(node, cloned, context);\n await onCloneEachNode?.(cloned);\n return cloned;\n}\n\nfunction destroyContext(context) {\n context.ownerDocument = void 0;\n context.ownerWindow = void 0;\n context.svgStyleElement = void 0;\n context.svgDefsElement = void 0;\n context.svgStyles.clear();\n context.defaultComputedStyles.clear();\n if (context.sandbox) {\n try {\n context.sandbox.remove();\n } catch (err) {\n context.log.warn(\"Failed to destroyContext\", err);\n }\n context.sandbox = void 0;\n }\n context.workers = [];\n context.fontFamilies.clear();\n context.fontCssTexts.clear();\n context.requests.clear();\n context.tasks = [];\n context.shadowRoots = [];\n}\n\nfunction baseFetch(options) {\n const { url, timeout, responseType, ...requestInit } = options;\n const controller = new AbortController();\n const timer = timeout ? setTimeout(() => controller.abort(), timeout) : void 0;\n return fetch(url, { signal: controller.signal, ...requestInit }).then((response) => {\n if (!response.ok) {\n throw new Error(\"Failed fetch, not 2xx response\", { cause: response });\n }\n switch (responseType) {\n case \"arrayBuffer\":\n return response.arrayBuffer();\n case \"dataUrl\":\n return response.blob().then(blobToDataUrl);\n case \"text\":\n default:\n return response.text();\n }\n }).finally(() => clearTimeout(timer));\n}\nfunction contextFetch(context, options) {\n const { url: rawUrl, requestType = \"text\", responseType = \"text\", imageDom } = options;\n let url = rawUrl;\n const {\n timeout,\n acceptOfImage,\n requests,\n fetchFn,\n fetch: {\n requestInit,\n bypassingCache,\n placeholderImage\n },\n font,\n workers,\n fontFamilies\n } = context;\n if (requestType === \"image\" && (IN_SAFARI || IN_FIREFOX)) {\n context.drawImageCount++;\n }\n let request = requests.get(rawUrl);\n if (!request) {\n if (bypassingCache) {\n if (bypassingCache instanceof RegExp && bypassingCache.test(url)) {\n url += (/\\?/.test(url) ? \"&\" : \"?\") + (/* @__PURE__ */ new Date()).getTime();\n }\n }\n const canFontMinify = requestType.startsWith(\"font\") && font && font.minify;\n const fontTexts = /* @__PURE__ */ new Set();\n if (canFontMinify) {\n const families = requestType.split(\";\")[1].split(\",\");\n families.forEach((family) => {\n if (!fontFamilies.has(family))\n return;\n fontFamilies.get(family).forEach((text) => fontTexts.add(text));\n });\n }\n const needFontMinify = canFontMinify && fontTexts.size;\n const baseFetchOptions = {\n url,\n timeout,\n responseType: needFontMinify ? \"arrayBuffer\" : responseType,\n headers: requestType === \"image\" ? { accept: acceptOfImage } : void 0,\n ...requestInit\n };\n request = {\n type: requestType,\n resolve: void 0,\n reject: void 0,\n response: null\n };\n request.response = (async () => {\n if (fetchFn && requestType === \"image\") {\n const result = await fetchFn(rawUrl);\n if (result)\n return result;\n }\n if (!IN_SAFARI && rawUrl.startsWith(\"http\") && workers.length) {\n return new Promise((resolve, reject) => {\n const worker = workers[requests.size & workers.length - 1];\n worker.postMessage({ rawUrl, ...baseFetchOptions });\n request.resolve = resolve;\n request.reject = reject;\n });\n }\n return baseFetch(baseFetchOptions);\n })().catch((error) => {\n requests.delete(rawUrl);\n if (requestType === \"image\" && placeholderImage) {\n context.log.warn(\"Failed to fetch image base64, trying to use placeholder image\", url);\n return typeof placeholderImage === \"string\" ? placeholderImage : placeholderImage(imageDom);\n }\n throw error;\n });\n requests.set(rawUrl, request);\n }\n return request.response;\n}\n\nasync function replaceCssUrlToDataUrl(cssText, baseUrl, context, isImage) {\n if (!hasCssUrl(cssText))\n return cssText;\n for (const [rawUrl, url] of parseCssUrls(cssText, baseUrl)) {\n try {\n const dataUrl = await contextFetch(\n context,\n {\n url,\n requestType: isImage ? \"image\" : \"text\",\n responseType: \"dataUrl\"\n }\n );\n cssText = cssText.replace(toRE(rawUrl), `$1${dataUrl}$3`);\n } catch (error) {\n context.log.warn(\"Failed to fetch css data url\", rawUrl, error);\n }\n }\n return cssText;\n}\nfunction hasCssUrl(cssText) {\n return /url\\((['\"]?)([^'\"]+?)\\1\\)/.test(cssText);\n}\nconst URL_RE = /url\\((['\"]?)([^'\"]+?)\\1\\)/g;\nfunction parseCssUrls(cssText, baseUrl) {\n const result = [];\n cssText.replace(URL_RE, (raw, quotation, url) => {\n result.push([url, resolveUrl(url, baseUrl)]);\n return raw;\n });\n return result.filter(([url]) => !isDataUrl(url));\n}\nfunction toRE(url) {\n const escaped = url.replace(/([.*+?^${}()|\\[\\]\\/\\\\])/g, \"\\\\$1\");\n return new RegExp(`(url\\\\(['\"]?)(${escaped})(['\"]?\\\\))`, \"g\");\n}\n\nconst properties = [\n \"background-image\",\n \"border-image-source\",\n \"-webkit-border-image\",\n \"-webkit-mask-image\",\n \"list-style-image\"\n];\nfunction embedCssStyleImage(style, context) {\n return properties.map((property) => {\n const value = style.getPropertyValue(property);\n if (!value || value === \"none\") {\n return null;\n }\n if (IN_SAFARI || IN_FIREFOX) {\n context.drawImageCount++;\n }\n return replaceCssUrlToDataUrl(value, null, context, true).then((newValue) => {\n if (!newValue || value === newValue)\n return;\n style.setProperty(\n property,\n newValue,\n style.getPropertyPriority(property)\n );\n });\n }).filter(Boolean);\n}\n\nfunction embedImageElement(cloned, context) {\n if (isImageElement(cloned)) {\n const originalSrc = cloned.currentSrc || cloned.src;\n if (!isDataUrl(originalSrc)) {\n return [\n contextFetch(context, {\n url: originalSrc,\n imageDom: cloned,\n requestType: \"image\",\n responseType: \"dataUrl\"\n }).then((url) => {\n if (!url)\n return;\n cloned.srcset = \"\";\n cloned.dataset.originalSrc = originalSrc;\n cloned.src = url || \"\";\n })\n ];\n }\n if (IN_SAFARI || IN_FIREFOX) {\n context.drawImageCount++;\n }\n } else if (isSVGElementNode(cloned) && !isDataUrl(cloned.href.baseVal)) {\n const originalSrc = cloned.href.baseVal;\n return [\n contextFetch(context, {\n url: originalSrc,\n imageDom: cloned,\n requestType: \"image\",\n responseType: \"dataUrl\"\n }).then((url) => {\n if (!url)\n return;\n cloned.dataset.originalSrc = originalSrc;\n cloned.href.baseVal = url || \"\";\n })\n ];\n }\n return [];\n}\n\nfunction embedSvgUse(cloned, context) {\n const { ownerDocument, svgDefsElement } = context;\n const href = cloned.getAttribute(\"href\") ?? cloned.getAttribute(\"xlink:href\");\n if (!href)\n return [];\n const [svgUrl, id] = href.split(\"#\");\n if (id) {\n const query = `#${id}`;\n const definition = context.shadowRoots.reduce(\n (res, root) => {\n return res ?? root.querySelector(`svg ${query}`);\n },\n ownerDocument?.querySelector(`svg ${query}`)\n );\n if (svgUrl) {\n cloned.setAttribute(\"href\", query);\n }\n if (svgDefsElement?.querySelector(query))\n return [];\n if (definition) {\n svgDefsElement?.appendChild(definition.cloneNode(true));\n return [];\n } else if (svgUrl) {\n return [\n contextFetch(context, {\n url: svgUrl,\n responseType: \"text\"\n }).then((svgData) => {\n svgDefsElement?.insertAdjacentHTML(\"beforeend\", svgData);\n })\n ];\n }\n }\n return [];\n}\n\nfunction embedNode(cloned, context) {\n const { tasks } = context;\n if (isElementNode(cloned)) {\n if (isImageElement(cloned) || isSVGImageElementNode(cloned)) {\n tasks.push(...embedImageElement(cloned, context));\n }\n if (isSVGUseElementNode(cloned)) {\n tasks.push(...embedSvgUse(cloned, context));\n }\n }\n if (isHTMLElementNode(cloned)) {\n tasks.push(...embedCssStyleImage(cloned.style, context));\n }\n cloned.childNodes.forEach((child) => {\n embedNode(child, context);\n });\n}\n\nasync function embedWebFont(clone, context) {\n const {\n ownerDocument,\n svgStyleElement,\n fontFamilies,\n fontCssTexts,\n tasks,\n font\n } = context;\n if (!ownerDocument || !svgStyleElement || !fontFamilies.size) {\n return;\n }\n if (font && font.cssText) {\n const cssText = filterPreferredFormat(font.cssText, context);\n svgStyleElement.appendChild(ownerDocument.createTextNode(`${cssText}\n`));\n } else {\n const styleSheets = Array.from(ownerDocument.styleSheets).filter((styleSheet) => {\n try {\n return \"cssRules\" in styleSheet && Boolean(styleSheet.cssRules.length);\n } catch (error) {\n context.log.warn(`Error while reading CSS rules from ${styleSheet.href}`, error);\n return false;\n }\n });\n await Promise.all(\n styleSheets.flatMap((styleSheet) => {\n return Array.from(styleSheet.cssRules).map(async (cssRule, index) => {\n if (isCSSImportRule(cssRule)) {\n let importIndex = index + 1;\n const baseUrl = cssRule.href;\n let cssText = \"\";\n try {\n cssText = await contextFetch(context, {\n url: baseUrl,\n requestType: \"text\",\n responseType: \"text\"\n });\n } catch (error) {\n context.log.warn(`Error fetch remote css import from ${baseUrl}`, error);\n }\n const replacedCssText = cssText.replace(\n URL_RE,\n (raw, quotation, url) => raw.replace(url, resolveUrl(url, baseUrl))\n );\n for (const rule of parseCss(replacedCssText)) {\n try {\n styleSheet.insertRule(\n rule,\n rule.startsWith(\"@import\") ? importIndex += 1 : styleSheet.cssRules.length\n );\n } catch (error) {\n context.log.warn(\"Error inserting rule from remote css import\", { rule, error });\n }\n }\n }\n });\n })\n );\n const cssRules = [];\n styleSheets.forEach((sheet) => {\n unwrapCssLayers(sheet.cssRules, cssRules);\n });\n cssRules.filter((cssRule) => isCssFontFaceRule(cssRule) && hasCssUrl(cssRule.style.getPropertyValue(\"src\")) && splitFontFamily(cssRule.style.getPropertyValue(\"font-family\"))?.some((val) => fontFamilies.has(val))).forEach((value) => {\n const rule = value;\n const cssText = fontCssTexts.get(rule.cssText);\n if (cssText) {\n svgStyleElement.appendChild(ownerDocument.createTextNode(`${cssText}\n`));\n } else {\n tasks.push(\n replaceCssUrlToDataUrl(\n rule.cssText,\n rule.parentStyleSheet ? rule.parentStyleSheet.href : null,\n context\n ).then((cssText2) => {\n cssText2 = filterPreferredFormat(cssText2, context);\n fontCssTexts.set(rule.cssText, cssText2);\n svgStyleElement.appendChild(ownerDocument.createTextNode(`${cssText2}\n`));\n })\n );\n }\n });\n }\n}\nconst COMMENTS_RE = /(\\/\\*[\\s\\S]*?\\*\\/)/g;\nconst KEYFRAMES_RE = /((@.*?keyframes [\\s\\S]*?){([\\s\\S]*?}\\s*?)})/gi;\nfunction parseCss(source) {\n if (source == null)\n return [];\n const result = [];\n let cssText = source.replace(COMMENTS_RE, \"\");\n while (true) {\n const matches = KEYFRAMES_RE.exec(cssText);\n if (!matches)\n break;\n result.push(matches[0]);\n }\n cssText = cssText.replace(KEYFRAMES_RE, \"\");\n const IMPORT_RE = /@import[\\s\\S]*?url\\([^)]*\\)[\\s\\S]*?;/gi;\n const UNIFIED_RE = new RegExp(\n // eslint-disable-next-line\n \"((\\\\s*?(?:\\\\/\\\\*[\\\\s\\\\S]*?\\\\*\\\\/)?\\\\s*?@media[\\\\s\\\\S]*?){([\\\\s\\\\S]*?)}\\\\s*?})|(([\\\\s\\\\S]*?){([\\\\s\\\\S]*?)})\",\n \"gi\"\n );\n while (true) {\n let matches = IMPORT_RE.exec(cssText);\n if (!matches) {\n matches = UNIFIED_RE.exec(cssText);\n if (!matches) {\n break;\n } else {\n IMPORT_RE.lastIndex = UNIFIED_RE.lastIndex;\n }\n } else {\n UNIFIED_RE.lastIndex = IMPORT_RE.lastIndex;\n }\n result.push(matches[0]);\n }\n return result;\n}\nconst URL_WITH_FORMAT_RE = /url\\([^)]+\\)\\s*format\\(([\"']?)([^\"']+)\\1\\)/g;\nconst FONT_SRC_RE = /src:\\s*(?:url\\([^)]+\\)\\s*format\\([^)]+\\)[,;]\\s*)+/g;\nfunction filterPreferredFormat(str, context) {\n const { font } = context;\n const preferredFormat = font ? font?.preferredFormat : void 0;\n return preferredFormat ? str.replace(FONT_SRC_RE, (match) => {\n while (true) {\n const [src, , format] = URL_WITH_FORMAT_RE.exec(match) || [];\n if (!format)\n return \"\";\n if (format === preferredFormat)\n return `src: ${src};`;\n }\n }) : str;\n}\nfunction unwrapCssLayers(rules, out = []) {\n for (const rule of Array.from(rules)) {\n if (isLayerBlockRule(rule)) {\n out.push(...unwrapCssLayers(rule.cssRules));\n } else if (\"cssRules\" in rule) {\n unwrapCssLayers(rule.cssRules, out);\n } else {\n out.push(rule);\n }\n }\n return out;\n}\n\nasync function domToForeignObjectSvg(node, options) {\n const context = await orCreateContext(node, options);\n if (isElementNode(context.node) && isSVGElementNode(context.node))\n return context.node;\n const {\n ownerDocument,\n log,\n tasks,\n svgStyleElement,\n svgDefsElement,\n svgStyles,\n font,\n progress,\n autoDestruct,\n onCloneNode,\n onEmbedNode,\n onCreateForeignObjectSvg\n } = context;\n log.time(\"clone node\");\n const clone = await cloneNode(context.node, context, true);\n if (svgStyleElement && ownerDocument) {\n let allCssText = \"\";\n svgStyles.forEach((klasses, cssText) => {\n allCssText += `${klasses.join(\",\\n\")} {\n ${cssText}\n}\n`;\n });\n svgStyleElement.appendChild(ownerDocument.createTextNode(allCssText));\n }\n log.timeEnd(\"clone node\");\n await onCloneNode?.(clone);\n if (font !== false && isElementNode(clone)) {\n log.time(\"embed web font\");\n await embedWebFont(clone, context);\n log.timeEnd(\"embed web font\");\n }\n log.time(\"embed node\");\n embedNode(clone, context);\n const count = tasks.length;\n let current = 0;\n const runTask = async () => {\n while (true) {\n const task = tasks.pop();\n if (!task)\n break;\n try {\n await task;\n } catch (error) {\n context.log.warn(\"Failed to run task\", error);\n }\n progress?.(++current, count);\n }\n };\n progress?.(current, count);\n await Promise.all([...Array.from({ length: 4 })].map(runTask));\n log.timeEnd(\"embed node\");\n await onEmbedNode?.(clone);\n const svg = createForeignObjectSvg(clone, context);\n svgDefsElement && svg.insertBefore(svgDefsElement, svg.children[0]);\n svgStyleElement && svg.insertBefore(svgStyleElement, svg.children[0]);\n autoDestruct && destroyContext(context);\n await onCreateForeignObjectSvg?.(svg);\n return svg;\n}\nfunction createForeignObjectSvg(clone, context) {\n const { width, height } = context;\n const svg = createSvg(width, height, clone.ownerDocument);\n const foreignObject = svg.ownerDocument.createElementNS(svg.namespaceURI, \"foreignObject\");\n foreignObject.setAttributeNS(null, \"x\", \"0%\");\n foreignObject.setAttributeNS(null, \"y\", \"0%\");\n foreignObject.setAttributeNS(null, \"width\", \"100%\");\n foreignObject.setAttributeNS(null, \"height\", \"100%\");\n foreignObject.append(clone);\n svg.appendChild(foreignObject);\n return svg;\n}\n\nasync function domToCanvas(node, options) {\n const context = await orCreateContext(node, options);\n const svg = await domToForeignObjectSvg(context);\n const dataUrl = svgToDataUrl(svg, context.isEnable(\"removeControlCharacter\"));\n if (!context.autoDestruct) {\n context.svgStyleElement = createStyleElement(context.ownerDocument);\n context.svgDefsElement = context.ownerDocument?.createElementNS(XMLNS, \"defs\");\n context.svgStyles.clear();\n }\n const image = createImage(dataUrl, svg.ownerDocument);\n return await imageToCanvas(image, context);\n}\n\nasync function domToBlob(node, options) {\n const context = await orCreateContext(node, options);\n const { log, type, quality, dpi } = context;\n const canvas = await domToCanvas(context);\n log.time(\"canvas to blob\");\n const blob = await canvasToBlob(canvas, type, quality);\n if ([\"image/png\", \"image/jpeg\"].includes(type) && dpi) {\n const arrayBuffer = await blobToArrayBuffer(blob.slice(0, 33));\n let uint8Array = new Uint8Array(arrayBuffer);\n if (type === \"image/png\") {\n uint8Array = changePngDpi(uint8Array, dpi);\n } else if (type === \"image/jpeg\") {\n uint8Array = changeJpegDpi(uint8Array, dpi);\n }\n log.timeEnd(\"canvas to blob\");\n return new Blob([uint8Array, blob.slice(33)], { type });\n }\n log.timeEnd(\"canvas to blob\");\n return blob;\n}\n\nasync function domToDataUrl(node, options) {\n const context = await orCreateContext(node, options);\n const { log, quality, type, dpi } = context;\n const canvas = await domToCanvas(context);\n log.time(\"canvas to data url\");\n let dataUrl = canvas.toDataURL(type, quality);\n if ([\"image/png\", \"image/jpeg\"].includes(type) && dpi && SUPPORT_ATOB && SUPPORT_BTOA) {\n const [format, body] = dataUrl.split(\",\");\n let headerLength = 0;\n let overwritepHYs = false;\n if (type === \"image/png\") {\n const b64Index = detectPhysChunkFromDataUrl(body);\n if (b64Index >= 0) {\n headerLength = Math.ceil((b64Index + 28) / 3) * 4;\n overwritepHYs = true;\n } else {\n headerLength = 33 / 3 * 4;\n }\n } else if (type === \"image/jpeg\") {\n headerLength = 18 / 3 * 4;\n }\n const stringHeader = body.substring(0, headerLength);\n const restOfData = body.substring(headerLength);\n const headerBytes = window.atob(stringHeader);\n const uint8Array = new Uint8Array(headerBytes.length);\n for (let i = 0; i < uint8Array.length; i++) {\n uint8Array[i] = headerBytes.charCodeAt(i);\n }\n const finalArray = type === \"image/png\" ? changePngDpi(uint8Array, dpi, overwritepHYs) : changeJpegDpi(uint8Array, dpi);\n const base64Header = window.btoa(String.fromCharCode(...finalArray));\n dataUrl = [format, \",\", base64Header, restOfData].join(\"\");\n }\n log.timeEnd(\"canvas to data url\");\n return dataUrl;\n}\n\nasync function domToSvg(node, options) {\n const context = await orCreateContext(node, options);\n const { width, height, ownerDocument } = context;\n const dataUrl = await domToDataUrl(context);\n const svg = createSvg(width, height, ownerDocument);\n const svgImage = svg.ownerDocument.createElementNS(svg.namespaceURI, \"image\");\n svgImage.setAttributeNS(null, \"href\", dataUrl);\n svgImage.setAttributeNS(null, \"height\", \"100%\");\n svgImage.setAttributeNS(null, \"width\", \"100%\");\n svg.appendChild(svgImage);\n return svgToDataUrl(svg, context.isEnable(\"removeControlCharacter\"));\n}\n\nasync function domToImage(node, options) {\n const context = await orCreateContext(node, options);\n const { ownerDocument, width, height, scale, type } = context;\n const url = type === \"image/svg+xml\" ? await domToSvg(context) : await domToDataUrl(context);\n const image = createImage(url, ownerDocument);\n image.width = Math.floor(width * scale);\n image.height = Math.floor(height * scale);\n image.style.width = `${width}px`;\n image.style.height = `${height}px`;\n return image;\n}\n\nasync function domToJpeg(node, options) {\n return domToDataUrl(\n await orCreateContext(node, { ...options, type: \"image/jpeg\" })\n );\n}\n\nasync function domToPixel(node, options) {\n const context = await orCreateContext(node, options);\n const canvas = await domToCanvas(context);\n return canvas.getContext(\"2d\").getImageData(0, 0, canvas.width, canvas.height).data;\n}\n\nasync function domToPng(node, options) {\n return domToDataUrl(\n await orCreateContext(node, { ...options, type: \"image/png\" })\n );\n}\n\nasync function domToWebp(node, options) {\n return domToDataUrl(\n await orCreateContext(node, { ...options, type: \"image/webp\" })\n );\n}\n\nexport { createContext, destroyContext, domToBlob, domToCanvas, domToDataUrl, domToForeignObjectSvg, domToImage, domToJpeg, domToPixel, domToPng, domToSvg, domToWebp, loadMedia, waitUntilLoad };\n","import { domToPng } from 'modern-screenshot'\n\n/** Filter out instruckt UI elements */\nfunction nodeFilter(node: HTMLElement): boolean {\n if (node.getAttribute?.('data-instruckt')) return false\n return true\n}\n\n// ── Screen Capture API fallback ──────────────────────────────\n\nlet activeStream: MediaStream | null = null\n\nasync function getStream(): Promise<MediaStream> {\n if (activeStream && activeStream.active) return activeStream\n activeStream = await navigator.mediaDevices.getDisplayMedia({\n video: { displaySurface: 'browser' },\n preferCurrentTab: true,\n } as any)\n activeStream.getVideoTracks()[0].addEventListener('ended', () => {\n activeStream = null\n })\n return activeStream\n}\n\nasync function grabFrame(stream: MediaStream): Promise<ImageBitmap> {\n const video = document.createElement('video')\n video.srcObject = stream\n video.muted = true\n await video.play()\n await new Promise(r => requestAnimationFrame(() => requestAnimationFrame(r)))\n const bitmap = await createImageBitmap(video)\n video.pause()\n video.srcObject = null\n return bitmap\n}\n\nfunction captureRectFromStream(stream: MediaStream, rect: DOMRect): Promise<string> {\n return grabFrame(stream).then(bitmap => {\n const dpr = window.devicePixelRatio || 1\n const canvas = document.createElement('canvas')\n canvas.width = rect.width * dpr\n canvas.height = rect.height * dpr\n const ctx = canvas.getContext('2d')!\n ctx.drawImage(\n bitmap,\n rect.x * dpr, rect.y * dpr,\n rect.width * dpr, rect.height * dpr,\n 0, 0, canvas.width, canvas.height,\n )\n bitmap.close()\n return canvas.toDataURL('image/png')\n })\n}\n\n// ── Public API ───────────────────────────────────────────────\n\n/** Capture a DOM element as a base64 PNG data URL */\nexport async function captureElement(el: Element): Promise<string | null> {\n // Try modern-screenshot first (no permission needed)\n try {\n const dataUrl = await domToPng(el as HTMLElement, {\n scale: 2,\n filter: nodeFilter,\n })\n if (dataUrl) return dataUrl\n } catch { /* fall through */ }\n // Fall back to Screen Capture API (works on shadow DOM / Flux)\n try {\n const stream = await getStream()\n return await captureRectFromStream(stream, el.getBoundingClientRect())\n } catch (err) {\n console.warn('[instruckt] captureElement failed:', err)\n return null\n }\n}\n\n/** Capture a rectangular region of the viewport as a base64 PNG data URL */\nexport async function captureRegion(rect: DOMRect): Promise<string | null> {\n // Try modern-screenshot first (no permission needed)\n try {\n const full = await domToPng(document.body, {\n scale: 2,\n filter: nodeFilter,\n })\n if (full) return await cropImage(full, rect)\n } catch { /* fall through */ }\n // Fall back to Screen Capture API (works on shadow DOM / Flux)\n try {\n const stream = await getStream()\n return await captureRectFromStream(stream, rect)\n } catch (err) {\n console.warn('[instruckt] captureRegion failed:', err)\n return null\n }\n}\n\n/** Crop a data URL image to a rectangle */\nfunction cropImage(dataUrl: string, rect: DOMRect): Promise<string> {\n return new Promise((resolve, reject) => {\n const img = new Image()\n img.onload = () => {\n const ratio = 2\n const canvas = document.createElement('canvas')\n canvas.width = rect.width * ratio\n canvas.height = rect.height * ratio\n const ctx = canvas.getContext('2d')!\n ctx.drawImage(\n img,\n rect.x * ratio, rect.y * ratio,\n rect.width * ratio, rect.height * ratio,\n 0, 0,\n rect.width * ratio, rect.height * ratio,\n )\n resolve(canvas.toDataURL('image/png'))\n }\n img.onerror = reject\n img.src = dataUrl\n })\n}\n\n/** Interactive region selector — returns the selected DOMRect or null if cancelled */\nexport function selectRegion(): Promise<DOMRect | null> {\n return new Promise((resolve) => {\n const overlay = document.createElement('div')\n Object.assign(overlay.style, {\n position: 'fixed',\n inset: '0',\n zIndex: '2147483647',\n cursor: 'crosshair',\n background: 'rgba(0,0,0,0.1)',\n })\n overlay.setAttribute('data-instruckt', 'region-select')\n\n const box = document.createElement('div')\n Object.assign(box.style, {\n position: 'fixed',\n border: '2px dashed #6366f1',\n background: 'rgba(99,102,241,0.08)',\n borderRadius: '4px',\n display: 'none',\n pointerEvents: 'none',\n })\n overlay.appendChild(box)\n\n let startX = 0, startY = 0, dragging = false\n\n const onMouseDown = (e: MouseEvent) => {\n startX = e.clientX\n startY = e.clientY\n dragging = true\n box.style.display = 'block'\n updateBox(e)\n }\n\n const onMouseMove = (e: MouseEvent) => {\n if (!dragging) return\n updateBox(e)\n }\n\n const updateBox = (e: MouseEvent) => {\n const x = Math.min(startX, e.clientX)\n const y = Math.min(startY, e.clientY)\n const w = Math.abs(e.clientX - startX)\n const h = Math.abs(e.clientY - startY)\n Object.assign(box.style, {\n left: `${x}px`,\n top: `${y}px`,\n width: `${w}px`,\n height: `${h}px`,\n })\n }\n\n const onMouseUp = (e: MouseEvent) => {\n if (!dragging) return\n dragging = false\n const x = Math.min(startX, e.clientX)\n const y = Math.min(startY, e.clientY)\n const w = Math.abs(e.clientX - startX)\n const h = Math.abs(e.clientY - startY)\n cleanup()\n if (w < 10 || h < 10) {\n resolve(null)\n } else {\n resolve(new DOMRect(x, y, w, h))\n }\n }\n\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n cleanup()\n resolve(null)\n }\n }\n\n const cleanup = () => {\n overlay.remove()\n document.removeEventListener('keydown', onKeyDown, true)\n }\n\n overlay.addEventListener('mousedown', onMouseDown)\n overlay.addEventListener('mousemove', onMouseMove)\n overlay.addEventListener('mouseup', onMouseUp)\n document.addEventListener('keydown', onKeyDown, true)\n document.body.appendChild(overlay)\n })\n}\n","import type { Annotation, PendingAnnotation } from '../types'\nimport { POPUP_CSS } from './styles'\nimport { captureElement } from './screenshot'\n\ninterface PopupResult {\n comment: string\n screenshot?: string\n}\n\ninterface PopupCallbacks {\n onSubmit: (result: PopupResult) => void\n onCancel: () => void\n}\n\ninterface EditCallbacks {\n onSave: (annotation: Annotation, newComment: string) => void\n onDelete: (annotation: Annotation) => void\n}\n\n/** Resolve screenshot URL from annotation data */\nfunction screenshotUrl(screenshot: string | undefined, endpoint?: string): string | null {\n if (!screenshot) return null\n if (screenshot.startsWith('data:')) return screenshot\n // Backend path like \"screenshots/01ABC.png\" — serve via endpoint\n const base = endpoint ?? '/instruckt'\n return `${base}/${screenshot}`\n}\n\nfunction esc(s: string): string {\n return String(s ?? '').replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"')\n}\n\n/** Annotation popup — rendered in its own shadow DOM for CSS isolation */\nexport class AnnotationPopup {\n private host: HTMLElement | null = null\n private shadow: ShadowRoot | null = null\n\n // ── New annotation popup ──────────────────────────────────────\n\n showNew(pending: PendingAnnotation, callbacks: PopupCallbacks): void {\n this.destroy()\n this.host = document.createElement('div')\n this.host.setAttribute('data-instruckt', 'popup')\n this.stopHostPropagation(this.host)\n this.shadow = this.host.attachShadow({ mode: 'open' })\n\n const style = document.createElement('style')\n style.textContent = POPUP_CSS\n this.shadow.appendChild(style)\n\n const popup = document.createElement('div')\n popup.className = 'popup'\n\n const fwBadge = pending.framework\n ? `<div class=\"fw-badge\">${esc(pending.framework.component)}</div>`\n : ''\n const selText = pending.selectedText\n ? `<div class=\"selected-text\">\"${esc(pending.selectedText.slice(0, 80))}\"</div>`\n : ''\n const hasScreenshot = !!pending.screenshot\n\n popup.innerHTML = `\n <div class=\"header\">\n <span class=\"element-tag\" title=\"${esc(pending.elementPath)}\">${esc(pending.elementLabel)}</span>\n <button class=\"close-btn\" title=\"Cancel (Esc)\">✕</button>\n </div>\n ${fwBadge}${selText}\n <div class=\"screenshot-slot\">${hasScreenshot\n ? `<div class=\"screenshot-preview\"><img src=\"${pending.screenshot}\" alt=\"Screenshot\" /><button class=\"screenshot-remove\" title=\"Remove screenshot\">✕</button></div>`\n : `<button class=\"btn-capture\" data-action=\"capture\"><svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z\"/><circle cx=\"12\" cy=\"13\" r=\"4\"/></svg> Capture screenshot</button>`\n }</div>\n <textarea placeholder=\"${hasScreenshot ? 'Add a note (optional)' : 'What needs to change here?'}\" rows=\"3\"></textarea>\n <div class=\"actions\">\n <button class=\"btn-secondary\" data-action=\"cancel\">Cancel</button>\n <button class=\"btn-primary\" data-action=\"submit\" ${hasScreenshot ? '' : 'disabled'}>Add note</button>\n </div>\n `\n\n let currentScreenshot = pending.screenshot ?? null\n const textarea = popup.querySelector('textarea')!\n const submitBtn = popup.querySelector<HTMLButtonElement>('[data-action=\"submit\"]')!\n const screenshotSlot = popup.querySelector('.screenshot-slot')!\n\n const updateSubmitState = () => {\n submitBtn.disabled = !currentScreenshot && textarea.value.trim().length === 0\n }\n\n const attachScreenshotEvents = () => {\n // Capture button\n const captureBtn = screenshotSlot.querySelector('[data-action=\"capture\"]')\n captureBtn?.addEventListener('click', async () => {\n captureBtn.textContent = 'Capturing...'\n const dataUrl = await captureElement(pending.element)\n if (dataUrl) {\n currentScreenshot = dataUrl\n screenshotSlot.innerHTML = `<div class=\"screenshot-preview\"><img src=\"${dataUrl}\" alt=\"Screenshot\" /><button class=\"screenshot-remove\" title=\"Remove screenshot\">✕</button></div>`\n textarea.placeholder = 'Add a note (optional)'\n attachScreenshotEvents()\n updateSubmitState()\n } else {\n captureBtn.textContent = 'Capture failed'\n setTimeout(() => { if (captureBtn.parentElement) captureBtn.innerHTML = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z\"/><circle cx=\"12\" cy=\"13\" r=\"4\"/></svg> Capture screenshot` }, 1500)\n }\n })\n\n // Remove button\n const removeBtn = screenshotSlot.querySelector('.screenshot-remove')\n removeBtn?.addEventListener('click', () => {\n currentScreenshot = null\n screenshotSlot.innerHTML = `<button class=\"btn-capture\" data-action=\"capture\"><svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z\"/><circle cx=\"12\" cy=\"13\" r=\"4\"/></svg> Capture screenshot</button>`\n textarea.placeholder = 'What needs to change here?'\n attachScreenshotEvents()\n updateSubmitState()\n })\n }\n\n attachScreenshotEvents()\n\n textarea.addEventListener('input', updateSubmitState)\n textarea.addEventListener('keydown', (e) => {\n // Stop ALL keyboard events from reaching page forms (React, Inertia, etc.)\n e.stopPropagation()\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n if (!submitBtn.disabled) submitBtn.click()\n }\n if (e.key === 'Escape') { callbacks.onCancel(); this.destroy() }\n })\n\n popup.querySelector('[data-action=\"cancel\"]')!.addEventListener('click', () => {\n callbacks.onCancel(); this.destroy()\n })\n popup.querySelector('.close-btn')!.addEventListener('click', () => {\n callbacks.onCancel(); this.destroy()\n })\n submitBtn.addEventListener('click', () => {\n const comment = textarea.value.trim()\n if (!comment && !currentScreenshot) return\n callbacks.onSubmit({ comment: comment || '(screenshot)', screenshot: currentScreenshot ?? undefined })\n this.destroy()\n })\n\n this.shadow.appendChild(popup)\n ;(document.getElementById('instruckt-root') ?? document.body).appendChild(this.host)\n\n this.positionHost(pending.x, pending.y)\n this.setupOutsideClick()\n textarea.focus()\n }\n\n // ── Edit existing annotation ──────────────────────────────────\n\n showEdit(annotation: Annotation, callbacks: EditCallbacks, endpoint?: string): void {\n this.destroy()\n this.host = document.createElement('div')\n this.host.setAttribute('data-instruckt', 'popup')\n this.stopHostPropagation(this.host)\n this.shadow = this.host.attachShadow({ mode: 'open' })\n\n const style = document.createElement('style')\n style.textContent = POPUP_CSS\n this.shadow.appendChild(style)\n\n const popup = document.createElement('div')\n popup.className = 'popup'\n\n const fwBadge = annotation.framework\n ? `<div class=\"fw-badge\">${esc(annotation.framework.component)}</div>`\n : ''\n const ssUrl = screenshotUrl(annotation.screenshot, endpoint)\n const screenshotPreview = ssUrl\n ? `<div class=\"screenshot-preview screenshot-slot\"><img src=\"${ssUrl}\" alt=\"Screenshot\" /><button class=\"screenshot-remove\" title=\"Remove screenshot\">✕</button></div>`\n : ''\n const commentText = annotation.comment === '(screenshot)' ? '' : annotation.comment\n\n popup.innerHTML = `\n <div class=\"header\">\n <span class=\"element-tag\" title=\"${esc(annotation.elementPath)}\">${esc(annotation.element)}</span>\n <button class=\"close-btn\">✕</button>\n </div>\n ${fwBadge}${screenshotPreview}\n <textarea rows=\"3\">${esc(commentText)}</textarea>\n <div class=\"actions\">\n <button class=\"btn-danger\" data-action=\"delete\">Remove</button>\n <button class=\"btn-primary\" data-action=\"save\">Save</button>\n </div>\n `\n\n popup.querySelector('.close-btn')!.addEventListener('click', () => this.destroy())\n\n // Screenshot remove button\n const ssRemoveBtn = popup.querySelector('.screenshot-remove')\n ssRemoveBtn?.addEventListener('click', () => {\n callbacks.onSave(annotation, annotation.comment)\n // Remove screenshot visually\n const slot = popup.querySelector('.screenshot-slot')\n if (slot) slot.remove()\n })\n\n const textarea = popup.querySelector('textarea')!\n const saveBtn = popup.querySelector<HTMLButtonElement>('[data-action=\"save\"]')!\n const deleteBtn = popup.querySelector<HTMLButtonElement>('[data-action=\"delete\"]')!\n\n textarea.addEventListener('keydown', (e) => {\n e.stopPropagation()\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n saveBtn.click()\n }\n if (e.key === 'Escape') this.destroy()\n })\n\n saveBtn.addEventListener('click', () => {\n const newComment = textarea.value.trim()\n if (!newComment) return\n callbacks.onSave(annotation, newComment)\n this.destroy()\n })\n\n deleteBtn.addEventListener('click', () => {\n callbacks.onDelete(annotation)\n this.destroy()\n })\n\n this.shadow.appendChild(popup)\n ;(document.getElementById('instruckt-root') ?? document.body).appendChild(this.host)\n\n // Position near the marker\n const markerX = (annotation.x / 100) * window.innerWidth\n const markerY = annotation.y - window.scrollY\n this.positionHost(markerX, markerY)\n this.setupOutsideClick()\n textarea.focus()\n textarea.setSelectionRange(textarea.value.length, textarea.value.length)\n }\n\n // ── Helpers ───────────────────────────────────────────────────\n\n /** Prevent popup interactions from reaching page handlers (e.g. @click.outside, form submit) */\n private stopHostPropagation(host: HTMLElement): void {\n for (const evt of ['click', 'mousedown', 'pointerdown', 'keydown', 'keyup', 'keypress', 'submit'] as const) {\n host.addEventListener(evt, (e) => e.stopPropagation())\n }\n }\n\n private positionHost(x: number, y: number): void {\n if (!this.host) return\n // Use popover=\"manual\" to render in the top layer (above native popovers)\n this.host.setAttribute('popover', 'manual')\n try { this.host.showPopover() } catch { /* fallback to z-index */ }\n Object.assign(this.host.style, { position: 'fixed', zIndex: '2147483647', left: '-9999px', top: '0' })\n\n requestAnimationFrame(() => {\n if (!this.host) return\n const w = 340 + 20\n const h = this.host.querySelector('.popup')?.getBoundingClientRect().height ?? 300\n const vw = window.innerWidth\n const vh = window.innerHeight\n const left = Math.max(10, Math.min(x + 10, vw - w))\n const top = Math.max(10, Math.min(y + 10, vh - h - 10))\n Object.assign(this.host.style, { left: `${left}px`, top: `${top}px` })\n })\n }\n\n private boundOutside = (e: MouseEvent): void => {\n if (this.host && !this.host.contains(e.target as Node)) {\n this.destroy()\n }\n }\n\n private setupOutsideClick(): void {\n setTimeout(() => document.addEventListener('mousedown', this.boundOutside), 0)\n }\n\n destroy(): void {\n this.host?.remove()\n this.host = null\n this.shadow = null\n document.removeEventListener('mousedown', this.boundOutside)\n }\n}\n","import type { Annotation } from '../types'\n\ntype MarkerClickHandler = (annotation: Annotation) => void\n\ninterface MarkerEl {\n el: HTMLElement\n annotationId: string\n}\n\n/** Manages numbered annotation pins rendered directly on the page */\nexport class AnnotationMarkers {\n private container: HTMLElement\n private markers: Map<string, MarkerEl> = new Map()\n\n constructor(private readonly onClick: MarkerClickHandler) {\n // Fixed-position container over the page, pointer-events passthrough\n this.container = document.createElement('div')\n Object.assign(this.container.style, {\n position: 'fixed',\n inset: '0',\n pointerEvents: 'none',\n zIndex: '2147483645',\n })\n this.container.setAttribute('data-instruckt', 'markers')\n const root = document.getElementById('instruckt-root') ?? document.body\n root.appendChild(this.container)\n }\n\n /** Add or update a marker for an annotation */\n upsert(annotation: Annotation, index: number): void {\n const existing = this.markers.get(annotation.id)\n\n if (existing) {\n this.updateStyle(existing.el, annotation)\n return\n }\n\n const el = document.createElement('div')\n const ssClass = annotation.screenshot ? ' has-screenshot' : ''\n el.className = `ik-marker ${this.statusClass(annotation.status)}${ssClass}`\n el.textContent = String(index)\n el.title = annotation.comment === '(screenshot)' ? 'Screenshot' : annotation.comment.slice(0, 60)\n el.style.pointerEvents = 'all'\n\n // Position: annotation.x is % of viewport width, annotation.y is px from top (scroll-adjusted)\n // Convert back to viewport-relative for fixed positioning\n el.style.left = `${(annotation.x / 100) * window.innerWidth}px`\n el.style.top = `${annotation.y - window.scrollY}px`\n\n el.addEventListener('click', (e) => {\n e.stopPropagation()\n this.onClick(annotation)\n })\n\n this.container.appendChild(el)\n this.markers.set(annotation.id, { el, annotationId: annotation.id })\n }\n\n /** Update an existing marker after its annotation status changed */\n update(annotation: Annotation): void {\n const marker = this.markers.get(annotation.id)\n if (!marker) return\n this.updateStyle(marker.el, annotation)\n }\n\n private updateStyle(el: HTMLElement, annotation: Annotation): void {\n const ssClass = annotation.screenshot ? ' has-screenshot' : ''\n el.className = `ik-marker ${this.statusClass(annotation.status)}${ssClass}`\n el.title = annotation.comment === '(screenshot)' ? 'Screenshot' : annotation.comment.slice(0, 60)\n }\n\n private statusClass(status: string): string {\n if (status === 'resolved') return 'resolved'\n if (status === 'dismissed') return 'dismissed'\n return ''\n }\n\n /** Reposition all markers (e.g. after scroll or resize) */\n reposition(annotations: Annotation[]): void {\n annotations.forEach(annotation => {\n const marker = this.markers.get(annotation.id)\n if (!marker) return\n marker.el.style.left = `${(annotation.x / 100) * window.innerWidth}px`\n marker.el.style.top = `${annotation.y - window.scrollY}px`\n })\n }\n\n remove(annotationId: string): void {\n const marker = this.markers.get(annotationId)\n if (!marker) return\n marker.el.remove()\n this.markers.delete(annotationId)\n }\n\n /** Show or hide all markers */\n setVisible(visible: boolean): void {\n this.container.style.display = visible ? '' : 'none'\n }\n\n /** Remove all markers without destroying the container */\n clear(): void {\n for (const { el } of this.markers.values()) {\n el.remove()\n }\n this.markers.clear()\n }\n\n destroy(): void {\n this.container.remove()\n this.markers.clear()\n }\n}\n","/**\n * CSS selector and element path generation.\n * Produces unique, grep-able selectors for any DOM element.\n */\n\n/** Build a unique CSS selector for an element */\nexport function getElementSelector(el: Element): string {\n if (el.id) {\n return `#${CSS.escape(el.id)}`\n }\n\n const path: string[] = []\n let current: Element | null = el\n\n while (current && current !== document.documentElement) {\n const tag = current.tagName.toLowerCase()\n const parent: Element | null = current.parentElement\n\n if (!parent) {\n path.unshift(tag)\n break\n }\n\n // Try unique class combo\n const classes = Array.from(current.classList)\n .filter(c => !c.match(/^(hover|focus|active|visited|is-|has-)/)) // skip state classes\n .slice(0, 3)\n\n if (classes.length > 0) {\n const classSelector = `${tag}.${classes.map(CSS.escape).join('.')}`\n const matches = parent.querySelectorAll(classSelector)\n if (matches.length === 1) {\n path.unshift(classSelector)\n break\n }\n }\n\n // Fall back to nth-child\n const siblings = Array.from(parent.children).filter((c: Element) => c.tagName === current!.tagName)\n if (siblings.length === 1) {\n path.unshift(tag)\n } else {\n const index = siblings.indexOf(current) + 1\n path.unshift(`${tag}:nth-of-type(${index})`)\n }\n\n current = parent\n }\n\n return path.join(' > ')\n}\n\n/** Short element identifier for markdown output (grep-friendly) */\nexport function getElementName(el: Element): string {\n const tag = el.tagName.toLowerCase()\n\n const wireModel = el.getAttribute('wire:model') || el.getAttribute('wire:click')\n if (wireModel) return `${tag}[wire:${wireModel.split('.')[0]}]`\n\n if (el.id) return `${tag}#${el.id}`\n\n const firstClass = el.classList[0]\n if (firstClass) return `${tag}.${firstClass}`\n\n return tag\n}\n\n/** Human-readable HTML-like label for the popup UI */\nexport function getElementLabel(el: Element): string {\n const tag = el.tagName.toLowerCase()\n const text = (el.textContent || '').trim().replace(/\\s+/g, ' ').slice(0, 40)\n\n // Build a short opening tag with key attributes\n const attrs: string[] = []\n if (el.id) attrs.push(`id=\"${el.id}\"`)\n const role = el.getAttribute('role')\n if (role) attrs.push(`role=\"${role}\"`)\n const wireAttr = el.getAttribute('wire:model') || el.getAttribute('wire:click')\n if (wireAttr) attrs.push(`wire:${el.hasAttribute('wire:model') ? 'model' : 'click'}=\"${wireAttr}\"`)\n\n const attrStr = attrs.length ? ' ' + attrs.join(' ') : ''\n const openTag = `<${tag}${attrStr}>`\n\n if (text) return `${openTag} ${text}`\n return openTag\n}\n\n/** Get nearby readable text for context */\nexport function getNearbyText(el: Element): string {\n const text = (el.textContent || '').trim().replace(/\\s+/g, ' ')\n return text.slice(0, 120)\n}\n\n/** CSS classes as a space-separated string, filtering noise */\nexport function getCssClasses(el: Element): string {\n return Array.from(el.classList)\n .filter(c => !c.match(/^(instruckt-)/)) // exclude our own classes\n .join(' ')\n}\n\n/** Get bounding box relative to the page */\nexport function getPageBoundingBox(el: Element): { x: number; y: number; width: number; height: number } {\n const rect = el.getBoundingClientRect()\n return {\n x: rect.left + window.scrollX,\n y: rect.top + window.scrollY,\n width: rect.width,\n height: rect.height,\n }\n}\n","import type { FrameworkContext } from '../types'\n\ndeclare global {\n interface Window {\n Livewire?: { find(id: string): unknown }\n }\n}\n\nexport function isAvailable(): boolean {\n return typeof window.Livewire !== 'undefined'\n}\n\n/** Walk up the DOM from el to find the nearest wire:id ancestor */\nexport function detect(el: Element): Element | null {\n let node: Element | null = el\n while (node && node !== document.documentElement) {\n if (node.getAttribute('wire:id')) return node\n node = node.parentElement\n }\n return null\n}\n\n/** Get Livewire component context for an element */\nexport function getContext(el: Element): FrameworkContext | null {\n if (!isAvailable()) return null\n\n const wireEl = detect(el)\n if (!wireEl) return null\n\n const wireId = wireEl.getAttribute('wire:id')!\n\n // In Livewire v3, the component name lives in the wire:snapshot attribute\n let componentName = 'Unknown'\n const snapshotAttr = wireEl.getAttribute('wire:snapshot')\n if (snapshotAttr) {\n try {\n const snapshot = JSON.parse(snapshotAttr)\n componentName = snapshot?.memo?.name ?? 'Unknown'\n } catch {\n // malformed snapshot\n }\n }\n\n return {\n framework: 'livewire',\n component: componentName,\n wire_id: wireId,\n }\n}\n","import type { FrameworkContext } from '../types'\n\ninterface VueInstance {\n $options?: { name?: string; __name?: string }\n type?: { name?: string; __name?: string }\n uid?: number\n props?: Record<string, unknown>\n setupState?: Record<string, unknown>\n}\n\ninterface VueElement extends Element {\n __vue__?: VueInstance\n __vueParentComponent?: VueInstance\n _vei?: unknown\n}\n\nexport function isAvailable(): boolean {\n // Vue 3: mounts with data-v-app attribute; Vue 2: exposes global Vue constructor\n return !!(document.querySelector('[data-v-app]') || (window as unknown as Record<string, unknown>)['Vue'])\n}\n\n/** Walk up the DOM to find the nearest Vue component */\nexport function detect(el: Element): VueInstance | null {\n let node: VueElement | null = el as VueElement\n while (node && node !== document.documentElement) {\n const instance = node.__vueParentComponent ?? node.__vue__\n if (instance) return instance\n node = node.parentElement as VueElement | null\n }\n return null\n}\n\n/** Get Vue component context for an element */\nexport function getContext(el: Element): FrameworkContext | null {\n const instance = detect(el)\n if (!instance) return null\n\n // Support Vue 2 ($options.name) and Vue 3 (type.name or type.__name)\n const name =\n instance.$options?.name ??\n instance.$options?.__name ??\n instance.type?.name ??\n instance.type?.__name ??\n 'Anonymous'\n\n const data: Record<string, unknown> = {}\n\n // Vue 3 props\n if (instance.props) {\n Object.assign(data, instance.props)\n }\n\n // Vue 3 setup state (public reactive refs)\n if (instance.setupState) {\n for (const [key, value] of Object.entries(instance.setupState)) {\n if (!key.startsWith('_') && typeof value !== 'function') {\n try {\n data[key] = JSON.parse(JSON.stringify(value))\n } catch {\n data[key] = String(value)\n }\n }\n }\n }\n\n return {\n framework: 'vue',\n component: name,\n component_uid: instance.uid !== undefined ? String(instance.uid) : undefined,\n data,\n }\n}\n","import type { FrameworkContext } from '../types'\n\ninterface SvelteMeta {\n loc?: { file?: string }\n ctx?: unknown[]\n}\n\ninterface SvelteElement extends Element {\n __svelte_meta?: SvelteMeta\n __svelte?: unknown\n}\n\n/** Walk up DOM to find nearest Svelte component element */\nexport function detect(el: Element): SvelteMeta | null {\n let node: SvelteElement | null = el as SvelteElement\n while (node && node !== document.documentElement) {\n if (node.__svelte_meta) return node.__svelte_meta\n node = node.parentElement as SvelteElement | null\n }\n return null\n}\n\n/** Get Svelte component context for an element */\nexport function getContext(el: Element): FrameworkContext | null {\n const meta = detect(el)\n if (!meta) return null\n\n // Extract component name from file path e.g. \"/src/components/Button.svelte\" → \"Button\"\n const filePath = meta.loc?.file ?? ''\n const component = filePath\n ? filePath.split('/').pop()?.replace(/\\.svelte$/, '') ?? 'Unknown'\n : 'Unknown'\n\n return {\n framework: 'svelte',\n component,\n data: filePath ? { file: filePath } : undefined,\n }\n}\n","import type { FrameworkContext } from '../types'\n\ninterface ReactFiber {\n type: unknown\n memoizedProps: Record<string, unknown> | null\n pendingProps: Record<string, unknown> | null\n return: ReactFiber | null\n key: string | null\n}\n\ninterface ReactElement extends Element {\n [key: string]: unknown\n}\n\nfunction getFiberKey(el: Element): string | null {\n for (const key of Object.keys(el)) {\n if (key.startsWith('__reactFiber$') || key.startsWith('__reactInternalInstance$')) {\n return key\n }\n }\n return null\n}\n\nfunction getComponentName(fiber: ReactFiber): string {\n let node: ReactFiber | null = fiber\n while (node) {\n const { type } = node\n if (typeof type === 'function' && (type as { name?: string }).name) {\n const name = (type as { name: string }).name\n // Skip React internals (start with lowercase = intrinsic HTML element function)\n if (name[0] === name[0].toUpperCase() && name.length > 1) return name\n }\n if (typeof type === 'object' && type !== null && (type as { displayName?: string }).displayName) {\n return (type as { displayName: string }).displayName\n }\n node = node.return\n }\n return 'Component'\n}\n\nfunction getProps(fiber: ReactFiber): Record<string, unknown> {\n const props = fiber.memoizedProps ?? fiber.pendingProps ?? {}\n const result: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(props)) {\n if (k === 'children' || typeof v === 'function') continue\n try {\n result[k] = JSON.parse(JSON.stringify(v))\n } catch {\n result[k] = String(v)\n }\n }\n return result\n}\n\nexport function isAvailable(): boolean {\n // React attaches fiber data to DOM nodes with __reactFiber$ prefix\n const root = document.getElementById('root') ?? document.getElementById('app') ?? document.body.firstElementChild\n if (!root) return false\n return getFiberKey(root) !== null\n}\n\nexport function getContext(el: Element): FrameworkContext | null {\n let node: Element | null = el\n while (node && node !== document.documentElement) {\n const key = getFiberKey(node)\n if (key) {\n const fiber = (node as ReactElement)[key] as ReactFiber\n if (fiber) {\n const component = getComponentName(fiber)\n const data = getProps(fiber)\n return { framework: 'react', component, data }\n }\n }\n node = node.parentElement\n }\n return null\n}\n","import type { Annotation, InstrucktConfig, PendingAnnotation } from './types'\nimport { InstrucktApi } from './api'\nimport type { AnnotationPayload } from './api'\nimport { Toolbar } from './ui/toolbar'\nimport { ElementHighlight } from './ui/highlight'\nimport { AnnotationPopup } from './ui/popup'\nimport { AnnotationMarkers } from './ui/markers'\nimport { injectGlobalStyles } from './ui/styles'\nimport { getElementSelector, getElementName, getElementLabel, getNearbyText, getCssClasses, getPageBoundingBox } from './selector'\nimport { captureElement, captureRegion, selectRegion } from './ui/screenshot'\nimport * as livewireAdapter from './adapters/livewire'\nimport * as vueAdapter from './adapters/vue'\nimport * as svelteAdapter from './adapters/svelte'\nimport * as reactAdapter from './adapters/react'\n\n// Re-export for api.ts consumers\nexport type { AnnotationPayload }\n\n/** Normalize URL to pathname for page-scoping (ignore query/hash) */\nfunction pageKey(): string {\n return window.location.pathname\n}\n\nexport class Instruckt {\n private config: Required<Pick<InstrucktConfig, 'endpoint' | 'theme' | 'position'>> & InstrucktConfig\n private api: InstrucktApi\n private toolbar: Toolbar | null = null\n private highlight: ElementHighlight | null = null\n private popup: AnnotationPopup | null = null\n private markers: AnnotationMarkers | null = null\n private annotations: Annotation[] = []\n private isAnnotating = false\n private isFrozen = false\n private frozenStyleEl: HTMLStyleElement | null = null\n private frozenPopovers: { el: HTMLElement; original: string }[] = []\n private rafId: number | null = null\n private pendingMouseTarget: Element | null = null\n private highlightLocked = false\n private pollTimer: ReturnType<typeof setInterval> | null = null\n private boundKeydown: (e: KeyboardEvent) => void\n private boundReposition = (): void => {\n this.markers?.reposition(this.annotations)\n }\n\n constructor(config: InstrucktConfig) {\n this.config = {\n adapters: ['livewire', 'vue', 'svelte', 'react'],\n theme: 'auto',\n position: 'bottom-right',\n ...config,\n }\n this.api = new InstrucktApi(config.endpoint)\n this.boundKeydown = this.onKeydown.bind(this)\n this.init()\n }\n\n private init(): void {\n injectGlobalStyles(this.config.colors)\n\n if (this.config.theme !== 'auto') {\n document.documentElement.setAttribute('data-instruckt-theme', this.config.theme)\n }\n\n this.toolbar = new Toolbar(this.config.position, {\n onToggleAnnotate: (active) => {\n this.setAnnotating(active)\n },\n onFreezeAnimations: (frozen) => {\n this.setFrozen(frozen)\n },\n onScreenshot: () => this.startRegionCapture(),\n onCopy: () => this.copyToClipboard(true),\n onClearPage: () => this.clearPage(),\n onClearAll: () => this.clearEverything(),\n onMinimize: (min) => this.onMinimize(min),\n }, this.config.keys)\n\n this.highlight = new ElementHighlight()\n this.popup = new AnnotationPopup()\n this.markers = new AnnotationMarkers((annotation) => this.onMarkerClick(annotation))\n\n document.addEventListener('keydown', this.boundKeydown)\n window.addEventListener('scroll', this.boundReposition, { passive: true })\n window.addEventListener('resize', this.boundReposition, { passive: true })\n\n // Survive SPA navigation across frameworks\n document.addEventListener('livewire:navigated', () => this.reattach())\n document.addEventListener('inertia:navigate', () => this.syncMarkers())\n window.addEventListener('popstate', () => {\n setTimeout(() => this.reattach(), 0)\n })\n\n // Load persisted annotations from the backend\n this.loadAnnotations()\n\n this.syncMarkers()\n }\n\n private makeToolbarCallbacks() {\n return {\n onToggleAnnotate: (active: boolean) => {\n this.setAnnotating(active)\n },\n onFreezeAnimations: (frozen: boolean) => {\n this.setFrozen(frozen)\n },\n onScreenshot: () => this.startRegionCapture(),\n onCopy: () => this.copyToClipboard(true),\n onClearPage: () => this.clearPage(),\n onClearAll: () => this.clearEverything(),\n onMinimize: (min: boolean) => this.onMinimize(min),\n }\n }\n\n private reattach(): void {\n const wasAnnotating = this.isAnnotating\n const wasFrozen = this.isFrozen\n const wasMinimized = this.toolbar?.isMinimized() ?? false\n\n // Detach current listeners before rebuilding\n if (this.isAnnotating) this.detachAnnotateListeners()\n if (this.isFrozen) this.setFrozen(false)\n this.isAnnotating = false\n this.isFrozen = false\n\n // Remove any stale instruckt DOM (Livewire caches and restores old HTML on back nav)\n document.querySelectorAll('[data-instruckt]').forEach(el => el.remove())\n\n // Rebuild everything fresh\n this.toolbar = new Toolbar(this.config.position, this.makeToolbarCallbacks())\n if (wasMinimized) this.toolbar.minimize()\n\n this.markers = new AnnotationMarkers((annotation) => this.onMarkerClick(annotation))\n this.highlight = new ElementHighlight()\n\n if (wasMinimized) this.markers.setVisible(false)\n\n // Re-inject global styles (Livewire may have swapped <head> content)\n const existing = document.getElementById('instruckt-global')\n if (existing) existing.remove()\n injectGlobalStyles(this.config.colors)\n\n this.syncMarkers()\n\n // Restore active modes\n if (wasAnnotating && !wasMinimized) this.setAnnotating(true)\n }\n\n // ── Minimize ────────────────────────────────────────────────────\n\n private onMinimize(minimized: boolean): void {\n if (minimized) {\n // Deactivate everything when minimized\n if (this.isAnnotating) this.setAnnotating(false)\n if (this.isFrozen) this.setFrozen(false)\n this.toolbar?.setAnnotateActive(false)\n this.toolbar?.setFreezeActive(false)\n this.markers?.setVisible(false)\n this.popup?.destroy()\n } else {\n // Show markers again when restored\n this.markers?.setVisible(true)\n }\n }\n\n // ── Persistence ─────────────────────────────────────────────────\n\n private static STORAGE_KEY = 'instruckt:annotations'\n\n private async loadAnnotations(): Promise<void> {\n // Always load localStorage first as baseline\n this.loadFromStorage()\n\n try {\n const remote = await this.api.getAnnotations()\n if (remote.length > 0) {\n // Merge: remote is source of truth, but keep any local-only annotations\n const remoteIds = new Set(remote.map(a => a.id))\n const localOnly = this.annotations.filter(a => !remoteIds.has(a.id))\n this.annotations = [...remote, ...localOnly]\n this.saveToStorage()\n }\n } catch {\n // No backend — localStorage already loaded above\n }\n this.syncMarkers()\n }\n\n private saveToStorage(): void {\n try {\n localStorage.setItem(Instruckt.STORAGE_KEY, JSON.stringify(this.annotations))\n } catch { /* storage full or unavailable */ }\n }\n\n private loadFromStorage(): void {\n try {\n const raw = localStorage.getItem(Instruckt.STORAGE_KEY)\n if (raw) this.annotations = JSON.parse(raw)\n } catch { /* corrupt or unavailable */ }\n }\n\n /** Start or stop polling based on whether there are active annotations */\n private updatePolling(): void {\n const hasActive = this.totalActiveCount() > 0\n if (hasActive && !this.pollTimer) {\n this.pollTimer = setInterval(() => this.pollForChanges(), 3000)\n } else if (!hasActive && this.pollTimer) {\n clearInterval(this.pollTimer)\n this.pollTimer = null\n }\n }\n\n /** Poll API for status changes (e.g. agent resolved via MCP) */\n private async pollForChanges(): Promise<void> {\n try {\n const remote = await this.api.getAnnotations()\n let changed = false\n for (const r of remote) {\n const local = this.annotations.find(a => a.id === r.id)\n if (local && local.status !== r.status) {\n local.status = r.status\n local.resolvedAt = r.resolvedAt\n local.resolvedBy = r.resolvedBy\n changed = true\n }\n }\n if (changed) {\n this.saveToStorage()\n this.syncMarkers()\n }\n } catch { /* no backend or network error — skip */ }\n }\n\n // ── Page-scoped markers ─────────────────────────────────────────\n\n private syncMarkers(): void {\n this.markers?.clear()\n const current = pageKey()\n let idx = 0\n for (const a of this.annotations) {\n if (a.status === 'resolved' || a.status === 'dismissed') continue\n if (this.annotationPageKey(a) === current) {\n idx++\n this.markers?.upsert(a, idx)\n }\n }\n this.toolbar?.setAnnotationCount(this.pageAnnotations().length)\n this.toolbar?.setTotalCount(this.totalActiveCount())\n this.updatePolling()\n }\n\n private annotationPageKey(a: Annotation): string {\n try {\n return new URL(a.url).pathname\n } catch {\n return a.url\n }\n }\n\n private pageAnnotations(): Annotation[] {\n const current = pageKey()\n return this.annotations.filter(a =>\n this.annotationPageKey(a) === current &&\n a.status !== 'resolved' && a.status !== 'dismissed'\n )\n }\n\n private totalActiveCount(): number {\n return this.annotations.filter(a => a.status !== 'resolved' && a.status !== 'dismissed').length\n }\n\n // ── Annotate mode ─────────────────────────────────────────────\n\n private setAnnotating(active: boolean): void {\n this.isAnnotating = active\n this.toolbar?.setAnnotateActive(active)\n if (active) {\n this.attachAnnotateListeners()\n } else {\n this.detachAnnotateListeners()\n this.highlight?.hide()\n if (this.rafId !== null) { cancelAnimationFrame(this.rafId); this.rafId = null }\n }\n // When frozen, toggle pointer-events based on annotate state\n this.updateFreezeStyles()\n }\n\n // ── Freeze mode ──────────────────────────────────────────────\n\n private setFrozen(frozen: boolean): void {\n this.isFrozen = frozen\n this.toolbar?.setFreezeActive(frozen)\n if (frozen) {\n this.updateFreezeStyles()\n this.freezePopovers()\n // Use window (not document) so we intercept before Livewire/Alpine handlers\n // on document. Capture on window fires before capture on document.\n for (const evt of this.freezeBlockEvents) {\n window.addEventListener(evt, this.boundFreezeClick, true)\n }\n window.addEventListener('submit', this.boundFreezeSubmit, true)\n // Block events that close dropdowns/popovers (window capture to beat frameworks)\n for (const evt of this.freezePassiveEvents) {\n window.addEventListener(evt, this.boundFreezePassive, true)\n }\n } else {\n this.frozenStyleEl?.remove()\n this.frozenStyleEl = null\n this.unfreezePopovers()\n for (const evt of this.freezeBlockEvents) {\n window.removeEventListener(evt, this.boundFreezeClick, true)\n }\n window.removeEventListener('submit', this.boundFreezeSubmit, true)\n for (const evt of this.freezePassiveEvents) {\n window.removeEventListener(evt, this.boundFreezePassive, true)\n }\n }\n }\n\n /** Pull open popovers out of the top layer so the rest of the page is clickable */\n private freezePopovers(): void {\n this.frozenPopovers = []\n const openSelector = ':popover-open, .\\\\:popover-open'\n document.querySelectorAll('[popover]').forEach((el) => {\n const htmlEl = el as HTMLElement\n const val = htmlEl.getAttribute('popover') ?? ''\n let isOpen = false\n try { isOpen = htmlEl.matches(openSelector) } catch {\n try { isOpen = htmlEl.matches('.\\\\:popover-open') } catch { /* ignore */ }\n }\n if (!isOpen) return\n // Save position before removing popover attribute\n const rect = htmlEl.getBoundingClientRect()\n this.frozenPopovers.push({ el: htmlEl, original: val })\n // Remove popover attribute — pulls element out of top layer\n htmlEl.removeAttribute('popover')\n // Keep it visible with inline styles\n htmlEl.style.setProperty('display', 'block', 'important')\n htmlEl.style.setProperty('position', 'fixed', 'important')\n htmlEl.style.setProperty('z-index', '2147483644', 'important')\n htmlEl.style.setProperty('top', `${rect.top}px`, 'important')\n htmlEl.style.setProperty('left', `${rect.left}px`, 'important')\n htmlEl.style.setProperty('width', `${rect.width}px`, 'important')\n // Add the polyfill class so Flux thinks it's still open\n htmlEl.classList.add(':popover-open')\n })\n }\n\n /** Restore popover attributes */\n private unfreezePopovers(): void {\n for (const { el, original } of this.frozenPopovers) {\n // Remove inline overrides\n for (const prop of ['display', 'position', 'z-index', 'top', 'left', 'width']) {\n el.style.removeProperty(prop)\n }\n el.classList.remove(':popover-open')\n el.setAttribute('popover', original || 'auto')\n }\n this.frozenPopovers = []\n }\n\n private freezeBlockEvents = ['click', 'mousedown', 'pointerdown', 'pointerup', 'mouseup', 'touchstart', 'touchend', 'auxclick'] as const\n private freezePassiveEvents = ['focusin', 'focusout', 'blur', 'pointerleave', 'mouseleave', 'mouseout'] as const\n\n /** Update freeze CSS — pointer-events only blocked when NOT annotating */\n private updateFreezeStyles(): void {\n if (!this.isFrozen) return\n this.frozenStyleEl?.remove()\n this.frozenStyleEl = document.createElement('style')\n this.frozenStyleEl.id = 'instruckt-freeze'\n const pointerBlock = this.isAnnotating ? '' : `\n a[href], a[wire\\\\:navigate], [wire\\\\:click], [wire\\\\:navigate],\n [x-on\\\\:click], [@click], [v-on\\\\:click], [onclick],\n button, input[type=\"submit\"], select, [role=\"button\"], [role=\"link\"],\n [tabindex] {\n pointer-events: none !important;\n cursor: not-allowed !important;\n }\n `\n this.frozenStyleEl.textContent = `\n *, *::before, *::after {\n animation-play-state: paused !important;\n transition: none !important;\n }\n video { filter: none !important; }\n ${pointerBlock}\n `\n document.head.appendChild(this.frozenStyleEl)\n }\n\n /** Block interactions on the page when frozen (except instruckt UI) */\n private boundFreezeClick = (e: Event): void => {\n if (this.isInstruckt(e.target)) return\n // When annotating, only let 'click' through (annotate handler needs it).\n // Always block mousedown/pointerdown/touchstart to prevent framework\n // handlers (Alpine @click.outside, Livewire wire:navigate) from firing.\n if (this.isAnnotating && e.type === 'click') return\n e.preventDefault()\n e.stopPropagation()\n e.stopImmediatePropagation()\n }\n\n private boundFreezeSubmit = (e: Event): void => {\n e.preventDefault()\n e.stopPropagation()\n e.stopImmediatePropagation()\n }\n\n /** Block focus/hover events that JS dropdowns use to auto-close.\n * Block ALL of these — even on instruckt elements — because frameworks\n * like Flux check if focusin target is contained in the popover and\n * close it if it's not (e.g. focus moved to our popup textarea). */\n private boundFreezePassive = (e: Event): void => {\n e.stopPropagation()\n e.stopImmediatePropagation()\n }\n\n // ── Event listeners ───────────────────────────────────────────\n\n private boundMouseMove = (e: MouseEvent): void => {\n if (this.highlightLocked) return\n this.pendingMouseTarget = e.target as Element\n if (this.rafId === null) {\n this.rafId = requestAnimationFrame(() => {\n this.rafId = null\n if (this.highlightLocked) return\n if (this.pendingMouseTarget && !this.isInstruckt(this.pendingMouseTarget)) {\n this.highlight?.show(this.pendingMouseTarget)\n } else {\n this.highlight?.hide()\n }\n })\n }\n }\n\n private boundMouseLeave = (): void => {\n if (this.highlightLocked) return\n this.highlight?.hide()\n }\n\n /** Block mousedown/pointerdown in annotation mode so SPA frameworks can't navigate */\n private boundAnnotateBlock = (e: Event): void => {\n if (this.isInstruckt(e.target)) return\n e.preventDefault()\n e.stopPropagation()\n e.stopImmediatePropagation()\n }\n\n private boundClick = (e: MouseEvent): void => {\n const target = e.target as Element\n if (this.isInstruckt(target)) return\n // Always block clicks in annotation mode — prevents SPA navigation\n // from changing the page before the user can finish their note.\n e.preventDefault()\n e.stopPropagation()\n e.stopImmediatePropagation()\n\n const selectedText = window.getSelection()?.toString().trim() || undefined\n const elementPath = getElementSelector(target)\n const elementName = getElementName(target)\n const elementLabel = getElementLabel(target)\n const cssClasses = getCssClasses(target)\n const nearbyText = getNearbyText(target) || undefined\n const boundingBox = getPageBoundingBox(target)\n const framework = this.detectFramework(target) ?? undefined\n\n this.highlight?.show(target)\n this.highlightLocked = true\n\n const pending: PendingAnnotation = {\n element: target,\n elementPath,\n elementName,\n elementLabel,\n cssClasses,\n boundingBox,\n x: e.clientX,\n y: e.clientY,\n selectedText,\n nearbyText,\n framework,\n }\n\n this.showAnnotationPopup(pending)\n }\n\n private showAnnotationPopup(pending: PendingAnnotation): void {\n this.popup?.showNew(pending, {\n onSubmit: (result) => {\n this.highlightLocked = false\n this.highlight?.hide()\n this.submitAnnotation(pending, result.comment, result.screenshot)\n },\n onCancel: () => {\n this.highlightLocked = false\n this.highlight?.hide()\n },\n })\n }\n\n private attachAnnotateListeners(): void {\n document.addEventListener('mousemove', this.boundMouseMove)\n document.addEventListener('mouseleave', this.boundMouseLeave)\n // Block mousedown/pointerdown first — SPA frameworks (Livewire wire:navigate,\n // Inertia) intercept these before click fires\n for (const evt of ['mousedown', 'pointerdown'] as const) {\n window.addEventListener(evt, this.boundAnnotateBlock, true)\n }\n // Use window capture to fire before framework handlers on document\n window.addEventListener('click', this.boundClick, true)\n }\n\n private detachAnnotateListeners(): void {\n document.removeEventListener('mousemove', this.boundMouseMove)\n document.removeEventListener('mouseleave', this.boundMouseLeave)\n for (const evt of ['mousedown', 'pointerdown'] as const) {\n window.removeEventListener(evt, this.boundAnnotateBlock, true)\n }\n window.removeEventListener('click', this.boundClick, true)\n }\n\n private isInstruckt(el: EventTarget | null): boolean {\n if (!el || !(el instanceof Element)) return false\n return el.closest('[data-instruckt]') !== null\n }\n\n // ── Region screenshot ────────────────────────────────────────\n\n private async startRegionCapture(): Promise<void> {\n // Temporarily exit annotation mode so the crosshair doesn't interfere\n const wasAnnotating = this.isAnnotating\n if (wasAnnotating) this.setAnnotating(false)\n\n const rect = await selectRegion()\n if (!rect) {\n if (wasAnnotating) this.setAnnotating(true)\n return\n }\n\n const screenshot = await captureRegion(rect)\n if (!screenshot) {\n if (wasAnnotating) this.setAnnotating(true)\n return\n }\n\n // Find the element at the center of the selected region\n const centerX = rect.x + rect.width / 2\n const centerY = rect.y + rect.height / 2\n const target = document.elementFromPoint(centerX, centerY) ?? document.body\n\n const pending: PendingAnnotation = {\n element: target,\n elementPath: getElementSelector(target),\n elementName: getElementName(target),\n elementLabel: getElementLabel(target),\n cssClasses: getCssClasses(target),\n boundingBox: getPageBoundingBox(target),\n x: centerX,\n y: centerY,\n nearbyText: getNearbyText(target) || undefined,\n screenshot,\n framework: this.detectFramework(target) ?? undefined,\n }\n\n this.showAnnotationPopup(pending)\n }\n\n // ── Framework detection ───────────────────────────────────────\n\n private detectFramework(el: Element) {\n const adapters = this.config.adapters ?? []\n if (adapters.includes('livewire')) {\n const ctx = livewireAdapter.getContext(el)\n if (ctx) return ctx\n }\n if (adapters.includes('vue')) {\n const ctx = vueAdapter.getContext(el)\n if (ctx) return ctx\n }\n if (adapters.includes('svelte')) {\n const ctx = svelteAdapter.getContext(el)\n if (ctx) return ctx\n }\n if (adapters.includes('react')) {\n const ctx = reactAdapter.getContext(el)\n if (ctx) return ctx\n }\n return null\n }\n\n // ── Submit ────────────────────────────────────────────────────\n\n private async submitAnnotation(pending: PendingAnnotation, comment: string, screenshot?: string): Promise<void> {\n const payload: AnnotationPayload = {\n x: (pending.x / window.innerWidth) * 100,\n y: pending.y + window.scrollY,\n comment,\n element: pending.elementName,\n elementPath: pending.elementPath,\n cssClasses: pending.cssClasses,\n boundingBox: pending.boundingBox,\n selectedText: pending.selectedText,\n nearbyText: pending.nearbyText,\n screenshot,\n intent: 'fix',\n severity: 'important',\n framework: pending.framework,\n url: window.location.href,\n }\n\n let annotation: Annotation\n try {\n annotation = await this.api.addAnnotation(payload)\n } catch {\n // No backend — create a local-only annotation\n annotation = {\n ...payload,\n id: crypto.randomUUID(),\n status: 'pending',\n createdAt: new Date().toISOString(),\n }\n }\n this.annotations.push(annotation)\n this.saveToStorage()\n this.syncMarkers()\n this.config.onAnnotationAdd?.(annotation)\n this.copyAnnotations()\n }\n\n // ── Marker click — edit or delete ─────────────────────────────\n\n private onMarkerClick(annotation: Annotation): void {\n this.popup?.showEdit(annotation, {\n onSave: async (a, newComment) => {\n try {\n const updated = await this.api.updateAnnotation(a.id, { comment: newComment })\n this.onAnnotationUpdated(updated)\n } catch {\n // No backend — update locally\n this.onAnnotationUpdated({ ...a, comment: newComment, updatedAt: new Date().toISOString() })\n }\n },\n onDelete: async (a) => {\n try {\n await this.api.updateAnnotation(a.id, { status: 'dismissed' })\n } catch { /* no backend — just remove locally */ }\n this.removeAnnotation(a.id)\n },\n }, this.config.endpoint)\n }\n\n private onAnnotationUpdated(updated: Annotation): void {\n const idx = this.annotations.findIndex(a => a.id === updated.id)\n if (idx >= 0) {\n this.annotations[idx] = updated\n }\n this.saveToStorage()\n this.syncMarkers()\n }\n\n private removeAnnotation(id: string): void {\n this.annotations = this.annotations.filter(a => a.id !== id)\n this.saveToStorage()\n this.syncMarkers()\n }\n\n // ── Clear ───────────────────────────────────────────────────────\n\n private async clearPage(): Promise<void> {\n const page = this.pageAnnotations()\n for (const a of page) {\n try {\n await this.api.updateAnnotation(a.id, { status: 'dismissed' })\n } catch { /* best effort */ }\n }\n this.annotations = this.annotations.filter(a => !page.includes(a))\n this.saveToStorage()\n this.syncMarkers()\n }\n\n private async clearEverything(): Promise<void> {\n const active = this.annotations.filter(a => a.status !== 'resolved' && a.status !== 'dismissed')\n for (const a of active) {\n try {\n await this.api.updateAnnotation(a.id, { status: 'dismissed' })\n } catch { /* best effort */ }\n }\n this.annotations = []\n this.saveToStorage()\n this.syncMarkers()\n }\n\n // ── Keyboard ──────────────────────────────────────────────────\n\n private onKeydown(e: KeyboardEvent): void {\n if (this.toolbar?.isMinimized()) return\n const target = e.target as HTMLElement\n if (['INPUT', 'TEXTAREA', 'SELECT'].includes(target.tagName)) return\n if (target.closest('[contenteditable=\"true\"]')) return\n // Shadow DOM retargets e.target to the host element — check if a popup is open\n if (this.isInstruckt(target)) return\n\n const keys = this.config.keys ?? {}\n const noMod = !e.metaKey && !e.ctrlKey && !e.altKey\n if (e.key === (keys.annotate ?? 'a') && noMod) {\n this.setAnnotating(!this.isAnnotating)\n }\n if (e.key === (keys.freeze ?? 'f') && noMod) {\n this.setFrozen(!this.isFrozen)\n }\n if (e.key === (keys.screenshot ?? 'c') && noMod) {\n this.startRegionCapture()\n }\n if (e.key === (keys.clearPage ?? 'x') && noMod) {\n this.clearPage()\n }\n if (e.key === 'Escape') {\n if (this.isAnnotating) this.setAnnotating(false)\n if (this.isFrozen) this.setFrozen(false)\n }\n }\n\n // ── Copy / export ─────────────────────────────────────────────\n\n /** Auto-copy on annotation submit — only in secure contexts to avoid focus side-effects */\n private copyAnnotations(): void {\n this.copyToClipboard(false)\n }\n\n /** Copy to clipboard. With fallback=true, uses execCommand for non-secure contexts (user-initiated only). */\n private copyToClipboard(fallback: boolean): void {\n const md = this.exportMarkdown()\n if (window.isSecureContext) {\n navigator.clipboard.writeText(md).catch(() => { /* unavailable */ })\n } else if (fallback) {\n try {\n const el = document.createElement('textarea')\n el.value = md\n el.style.cssText = 'position:fixed;left:-9999px'\n document.body.appendChild(el)\n el.select()\n document.execCommand('copy')\n el.remove()\n } catch { /* unavailable */ }\n }\n }\n\n exportMarkdown(): string {\n const pending = this.annotations.filter(a => a.status !== 'resolved' && a.status !== 'dismissed')\n if (pending.length === 0) {\n return `# UI Feedback\\n\\nNo open annotations.`\n }\n\n // Group by page\n const byPage = new Map<string, Annotation[]>()\n for (const a of pending) {\n const key = this.annotationPageKey(a)\n if (!byPage.has(key)) byPage.set(key, [])\n byPage.get(key)!.push(a)\n }\n\n const multiPage = byPage.size > 1\n const lines: string[] = []\n\n if (multiPage) {\n lines.push(`# UI Feedback`)\n lines.push('')\n }\n\n for (const [path, annotations] of byPage) {\n if (multiPage) {\n lines.push(`## ${path}`)\n } else {\n lines.push(`# UI Feedback: ${path}`)\n }\n lines.push('')\n\n const hPrefix = multiPage ? '###' : '##'\n\n annotations.forEach((a, i) => {\n // Feedback-first heading with element context\n const componentSuffix = a.framework?.component ? ` in \\`${a.framework.component}\\`` : ''\n lines.push(`${hPrefix} ${i + 1}. ${a.comment}`)\n lines.push(`- Element: \\`${a.element}\\`${componentSuffix}`)\n\n // File path if available (e.g. Svelte)\n if (a.framework?.data?.file) {\n lines.push(`- File: \\`${a.framework.data.file}\\``)\n }\n\n if (a.cssClasses) {\n lines.push(`- Classes: \\`${a.cssClasses}\\``)\n }\n if (a.selectedText) {\n lines.push(`- Text: \"${a.selectedText}\"`)\n } else if (a.nearbyText) {\n lines.push(`- Text: \"${a.nearbyText.slice(0, 100)}\"`)\n }\n if (a.screenshot) {\n // If stored as a relative path (from backend), show the full path\n if (!a.screenshot.startsWith('data:')) {\n lines.push(`- Screenshot: \\`storage/app/_instruckt/${a.screenshot}\\``)\n } else {\n lines.push(`- Screenshot: attached`)\n }\n }\n lines.push('')\n })\n }\n\n // Add MCP instructions when a backend is configured\n const hasScreenshots = pending.some(a => a.screenshot && !a.screenshot.startsWith('data:'))\n lines.push('---')\n lines.push('')\n if (hasScreenshots) {\n lines.push('Use the `instruckt.get_screenshot` MCP tool to view screenshots. After making changes, use `instruckt.resolve` to mark each annotation as resolved.')\n } else {\n lines.push('After making changes, use the `instruckt.resolve` MCP tool to mark each annotation as resolved.')\n }\n\n return lines.join('\\n').trim()\n }\n\n // ── Public API ────────────────────────────────────────────────\n\n getAnnotations(): Annotation[] { return [...this.annotations] }\n\n destroy(): void {\n this.setAnnotating(false)\n this.setFrozen(false)\n document.removeEventListener('keydown', this.boundKeydown)\n window.removeEventListener('scroll', this.boundReposition)\n window.removeEventListener('resize', this.boundReposition)\n this.toolbar?.destroy()\n this.highlight?.destroy()\n this.popup?.destroy()\n this.markers?.destroy()\n if (this.rafId !== null) cancelAnimationFrame(this.rafId)\n if (this.pollTimer !== null) clearInterval(this.pollTimer)\n }\n}\n"],"mappings":"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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+K9B,IAAM;AAAA;AAAA,EAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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","names":["_a","_b","_a","_a","_a","_b","_c","_d","_a","_a","_a","_a","detect","_a","getContext","detect","getContext","_a","_a","getContext","_a","e","getContext"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/api.ts","../src/ui/styles.ts","../src/ui/toolbar.ts","../src/ui/highlight.ts","../node_modules/modern-screenshot/dist/index.mjs","../src/ui/screenshot.ts","../src/ui/popup.ts","../src/ui/markers.ts","../src/selector.ts","../src/adapters/livewire.ts","../src/adapters/vue.ts","../src/adapters/svelte.ts","../src/adapters/react.ts","../src/adapters/blade.ts","../src/instruckt.ts"],"sourcesContent":["import { Instruckt } from './instruckt'\nimport type { InstrucktConfig, Annotation, AnnotationIntent, AnnotationSeverity, AnnotationStatus, FrameworkContext } from './types'\nimport type { AnnotationPayload } from './api'\n\nexport { Instruckt }\nexport type { InstrucktConfig, Annotation, AnnotationPayload, AnnotationIntent, AnnotationSeverity, AnnotationStatus, FrameworkContext }\n\n/**\n * Initialize instruckt.\n *\n * @example\n * instruckt.init({ endpoint: '/instruckt' })\n *\n * @example CDN\n * <script src=\"instruckt.iife.js\"></script>\n * <script>Instruckt.init({ endpoint: '/instruckt' })</script>\n */\nexport function init(config: InstrucktConfig): Instruckt {\n return new Instruckt(config)\n}\n","import type { Annotation } from './types'\n\n/** Read Laravel's XSRF-TOKEN cookie for CSRF protection */\nfunction getCsrfToken(): string {\n const match = document.cookie.match(/(?:^|;\\s*)XSRF-TOKEN=([^;]+)/)\n return match ? decodeURIComponent(match[1]) : ''\n}\n\nfunction headers(): Record<string, string> {\n const h: Record<string, string> = {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'X-Requested-With': 'XMLHttpRequest',\n }\n const csrf = getCsrfToken()\n if (csrf) h['X-XSRF-TOKEN'] = csrf\n return h\n}\n\n/** Convert snake_case API response to camelCase for JS types */\nexport function toCamelCase(obj: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(obj)) {\n const camel = k.replace(/_([a-z])/g, (_, c) => c.toUpperCase())\n out[camel] = Array.isArray(v)\n ? v.map(item => (item && typeof item === 'object' && !Array.isArray(item)) ? toCamelCase(item as Record<string, unknown>) : item)\n : (v && typeof v === 'object' && !Array.isArray(v)) ? toCamelCase(v as Record<string, unknown>) : v\n }\n return out\n}\n\n/** Convert camelCase JS payload to snake_case for Laravel API */\nfunction toSnake(obj: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(obj)) {\n const snake = k.replace(/[A-Z]/g, c => `_${c.toLowerCase()}`)\n out[snake] = (v && typeof v === 'object' && !Array.isArray(v)) ? toSnake(v as Record<string, unknown>) : v\n }\n return out\n}\n\nexport type AnnotationPayload = Omit<\n Annotation,\n 'id' | 'status' | 'thread' | 'createdAt'\n>\n\nexport class InstrucktApi {\n constructor(private readonly endpoint: string) {}\n\n async getAnnotations(): Promise<Annotation[]> {\n const res = await fetch(`${this.endpoint}/annotations`, {\n headers: headers(),\n })\n if (!res.ok) throw new Error(`instruckt: failed to load annotations (${res.status})`)\n const raw: Record<string, unknown>[] = await res.json()\n return raw.map(r => toCamelCase(r) as unknown as Annotation)\n }\n\n async addAnnotation(data: AnnotationPayload): Promise<Annotation> {\n const res = await fetch(`${this.endpoint}/annotations`, {\n method: 'POST',\n headers: headers(),\n body: JSON.stringify(toSnake(data as unknown as Record<string, unknown>)),\n })\n if (!res.ok) throw new Error(`instruckt: failed to add annotation (${res.status})`)\n return toCamelCase(await res.json()) as unknown as Annotation\n }\n\n async updateAnnotation(\n annotationId: string,\n data: Partial<Pick<Annotation, 'status' | 'comment'>>,\n ): Promise<Annotation> {\n const res = await fetch(`${this.endpoint}/annotations/${annotationId}`, {\n method: 'PATCH',\n headers: headers(),\n body: JSON.stringify(toSnake(data as unknown as Record<string, unknown>)),\n })\n if (!res.ok) throw new Error(`instruckt: failed to update annotation (${res.status})`)\n return toCamelCase(await res.json()) as unknown as Annotation\n }\n\n}\n","/** Global styles injected into document.head — ONLY what must affect the host page */\nexport const GLOBAL_CSS = /* css */ `\nbody.ik-annotating,\nbody.ik-annotating * { cursor: crosshair !important; }\n`\n\n/** Toolbar shadow DOM styles — fully isolated */\nexport const TOOLBAR_CSS = /* css */ `\n:host {\n all: initial;\n display: block;\n position: fixed;\n z-index: 2147483646;\n}\n\n* { box-sizing: border-box; }\n\n:host-context([data-instruckt-theme=\"dark\"]),\n@media (prefers-color-scheme: dark) {\n :host {\n --ik-bg: #1c1c1e; --ik-bg2: #2c2c2e; --ik-border: #38383a;\n --ik-text: #f4f4f5; --ik-muted: #a1a1aa;\n --ik-shadow: 0 8px 32px rgba(0,0,0,.4), 0 0 0 1px rgba(255,255,255,.06);\n }\n}\n\n:host {\n --ik-accent: #6366f1;\n --ik-accent-h: #4f46e5;\n --ik-bg: #ffffff;\n --ik-bg2: #f4f4f5;\n --ik-border: #e4e4e7;\n --ik-text: #18181b;\n --ik-muted: #a1a1aa;\n --ik-shadow: 0 8px 32px rgba(0,0,0,.08), 0 0 0 1px rgba(0,0,0,.04);\n}\n\n.toolbar {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 2px;\n background: var(--ik-bg);\n border-radius: 12px;\n padding: 6px;\n box-shadow: var(--ik-shadow);\n user-select: none;\n touch-action: none;\n cursor: grab;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n}\n.toolbar:active { cursor: grabbing; }\n\n.btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 34px;\n height: 34px;\n border-radius: 8px;\n border: none;\n background: transparent;\n color: var(--ik-muted);\n cursor: pointer;\n padding: 0;\n position: relative;\n transition: background .15s ease, color .15s ease;\n}\n.btn svg { display: block; }\n.btn:hover { background: var(--ik-bg2); color: var(--ik-text); }\n.btn[data-tooltip]::before {\n content: attr(data-tooltip);\n position: absolute;\n right: calc(100% + 8px);\n top: 50%;\n transform: translateY(-50%);\n white-space: nowrap;\n font-size: 11px;\n padding: 4px 8px;\n border-radius: 6px;\n background: var(--ik-text);\n color: var(--ik-bg);\n pointer-events: none;\n opacity: 0;\n transition: opacity .1s ease;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n}\n.btn[data-tooltip]:hover::before { opacity: 1; }\n.btn.active { background: var(--ik-accent); color: #fff; }\n.btn.active:hover { background: var(--ik-accent-h); }\n\n.divider { width: 18px; height: 1px; background: var(--ik-border); margin: 3px 0; }\n\n.badge {\n position: absolute;\n top: -3px; right: -3px;\n min-width: 16px; height: 16px;\n background: #ef4444;\n color: #fff;\n border-radius: 8px;\n font-size: 10px; font-weight: 600;\n display: flex; align-items: center; justify-content: center;\n padding: 0 4px;\n line-height: 1;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n}\n\n.minimize-btn { color: var(--ik-muted); opacity: .6; }\n.minimize-btn:hover { opacity: 1; }\n\n.danger-btn { color: var(--ik-muted); opacity: .6; }\n.danger-btn:hover { opacity: 1; color: #ef4444; }\n\n.clear-wrap {\n position: relative;\n display: flex;\n align-items: center;\n}\n.clear-all-btn {\n display: none;\n position: absolute;\n right: 100%;\n top: 0;\n background: var(--ik-bg);\n box-shadow: var(--ik-shadow);\n border-radius: 8px;\n}\n/* clear-all tooltip inherits from .btn[data-tooltip]::before */\n/* Invisible bridge so hover doesn't break crossing the gap */\n.clear-all-btn::after {\n content: '';\n position: absolute;\n top: 0;\n left: 100%;\n width: 6px;\n height: 100%;\n}\n/* Clear-page tooltip shows above-left so it doesn't cover the clear-all button */\n.clear-wrap > .btn:first-child[data-tooltip]::before {\n right: 0;\n left: auto;\n top: auto;\n bottom: calc(100% + 8px);\n transform: none;\n}\n.clear-wrap:hover .clear-all-btn { display: flex; align-items: center; justify-content: center; }\n\n.fab {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border-radius: 50%;\n border: none;\n background: var(--ik-bg);\n color: var(--ik-muted);\n box-shadow: var(--ik-shadow);\n cursor: pointer;\n padding: 0;\n transition: color .15s ease, transform .15s ease;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n}\n.fab:hover { color: var(--ik-accent); transform: scale(1.1); }\n.fab { position: relative; }\n\n.fab-badge {\n position: absolute;\n top: -4px; right: -4px;\n min-width: 16px; height: 16px;\n background: #6366f1;\n color: #fff;\n border-radius: 8px;\n font-size: 9px; font-weight: 700;\n display: flex; align-items: center; justify-content: center;\n padding: 0 3px;\n line-height: 1;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n}\n`\n\n/** Popup shadow DOM styles — fully isolated */\nexport const POPUP_CSS = /* css */ `\n:host {\n all: initial;\n display: block;\n position: fixed;\n z-index: 2147483647;\n}\n\n* { box-sizing: border-box; }\n\n:host {\n --ik-accent: #6366f1;\n --ik-accent-h: #4f46e5;\n --ik-bg: #ffffff;\n --ik-bg2: #f8f8f8;\n --ik-border: #e4e4e7;\n --ik-text: #18181b;\n --ik-muted: #71717a;\n --ik-shadow: 0 4px 24px rgba(0,0,0,.12);\n --ik-radius: 10px;\n --ik-hl: rgba(99,102,241,.15);\n}\n\n@media (prefers-color-scheme: dark) {\n :host {\n --ik-bg: #1c1c1e; --ik-bg2: #2c2c2e; --ik-border: #3a3a3c;\n --ik-text: #f4f4f5; --ik-muted: #a1a1aa;\n --ik-shadow: 0 4px 24px rgba(0,0,0,.5);\n --ik-hl: rgba(99,102,241,.2);\n }\n}\n\n.popup {\n width: 340px;\n background: var(--ik-bg);\n border: 1px solid var(--ik-border);\n border-radius: var(--ik-radius);\n box-shadow: var(--ik-shadow);\n padding: 14px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n font-size: 13px;\n color: var(--ik-text);\n animation: pop-in .12s ease;\n}\n@keyframes pop-in {\n from { opacity:0; transform: scale(.95) translateY(4px); }\n to { opacity:1; transform: scale(1) translateY(0); }\n}\n\n.header { display:flex; align-items:center; justify-content:space-between; margin-bottom:10px; }\n.element-tag {\n font-size:11px; font-family:ui-monospace,monospace; color:var(--ik-muted);\n background:var(--ik-bg2); border-radius:4px; padding:2px 6px;\n max-width:220px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;\n}\n.close-btn {\n background:none; border:none; color:var(--ik-muted);\n cursor:pointer; font-size:18px; line-height:1; padding:0;\n}\n\n.fw-badge {\n display:inline-flex; align-items:center; gap:4px;\n font-size:10px; font-weight:700; text-transform:uppercase; letter-spacing:.05em;\n color:var(--ik-accent); background:var(--ik-hl); border-radius:4px;\n padding:2px 6px; margin-bottom:8px;\n}\n.selected-text {\n font-size:12px; color:var(--ik-muted); background:var(--ik-bg2);\n border-left:3px solid var(--ik-accent); padding:4px 8px;\n border-radius:0 4px 4px 0; margin-bottom:10px;\n overflow:hidden; text-overflow:ellipsis; white-space:nowrap;\n}\n\n.label {\n font-size:10px; font-weight:700; text-transform:uppercase;\n letter-spacing:.05em; color:var(--ik-muted); margin-bottom:4px;\n}\n.row { display:flex; gap:6px; margin-bottom:10px; }\n.chips { display:flex; gap:4px; flex-wrap:wrap; }\n\n.chip {\n font-size:11px; padding:3px 8px; border-radius:12px;\n border:1px solid var(--ik-border); background:transparent;\n color:var(--ik-muted); cursor:pointer; transition:all .1s;\n}\n.chip:hover { border-color:var(--ik-accent); color:var(--ik-accent); }\n.chip.sel { background:var(--ik-accent); border-color:var(--ik-accent); color:#fff; }\n.chip.blocking.sel { background:#ef4444; border-color:#ef4444; }\n.chip.important.sel { background:#f97316; border-color:#f97316; }\n.chip.suggestion.sel{ background:#22c55e; border-color:#22c55e; }\n\n.screenshot-slot { margin-bottom: 10px; }\n\n.btn-capture {\n display: flex;\n align-items: center;\n gap: 6px;\n width: 100%;\n padding: 8px 10px;\n border: 1px dashed var(--ik-border);\n border-radius: 6px;\n background: var(--ik-bg2);\n color: var(--ik-muted);\n font-size: 12px;\n font-family: inherit;\n cursor: pointer;\n transition: border-color .15s, color .15s;\n}\n.btn-capture:hover {\n border-color: var(--ik-accent);\n color: var(--ik-accent);\n}\n.btn-capture svg { flex-shrink: 0; }\n\n.screenshot-preview {\n position: relative;\n border-radius: 6px;\n overflow: hidden;\n border: 1px solid var(--ik-border);\n margin-bottom: 10px;\n}\n.screenshot-preview img {\n display: block;\n width: 100%;\n max-height: 200px;\n object-fit: contain;\n background: var(--ik-bg2);\n}\n.screenshot-remove {\n position: absolute;\n top: 4px; right: 4px;\n width: 20px; height: 20px;\n border-radius: 50%;\n border: none;\n background: rgba(0,0,0,.6);\n color: #fff;\n font-size: 12px;\n line-height: 1;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n}\n.screenshot-remove:hover { background: #ef4444; }\n\ntextarea {\n width:100%; min-height:80px; resize:vertical;\n border:1px solid var(--ik-border); border-radius:6px;\n background:var(--ik-bg2); color:var(--ik-text);\n font-family:inherit; font-size:13px; padding:8px 10px;\n outline:none; transition:border-color .15s; margin-bottom:10px;\n}\ntextarea:focus { border-color:var(--ik-accent); }\ntextarea::placeholder { color:var(--ik-muted); }\n\n.actions { display:flex; justify-content:flex-end; gap:6px; }\n\n.btn-secondary {\n padding:6px 14px; border-radius:6px; border:1px solid var(--ik-border);\n background:transparent; color:var(--ik-muted); font-size:12px; cursor:pointer; transition:all .1s;\n}\n.btn-secondary:hover { border-color:var(--ik-muted); color:var(--ik-text); }\n\n.btn-primary {\n padding:6px 14px; border-radius:6px; border:none;\n background:var(--ik-accent); color:#fff;\n font-size:12px; font-weight:700; cursor:pointer; transition:background .1s;\n}\n.btn-primary:hover { background:var(--ik-accent-h); }\n.btn-primary:disabled { opacity:.5; cursor:not-allowed; }\n\n.btn-danger {\n padding:6px 14px; border-radius:6px; border:1px solid #ef4444;\n background:transparent; color:#ef4444;\n font-size:12px; cursor:pointer; transition:all .1s;\n}\n.btn-danger:hover { background:#ef4444; color:#fff; }\n\n/* Thread view */\n.thread { margin-top:10px; border-top:1px solid var(--ik-border); padding-top:10px; }\n.msg { margin-bottom:8px; }\n.msg-role {\n font-size:10px; font-weight:700; text-transform:uppercase;\n letter-spacing:.05em; margin-bottom:2px;\n}\n.msg-role.human { color:var(--ik-accent); }\n.msg-role.agent { color:#22c55e; }\n.msg-content { font-size:12px; line-height:1.5; }\n\n.status-badge {\n display:inline-flex; align-items:center; gap:4px;\n font-size:10px; font-weight:700; text-transform:uppercase; letter-spacing:.05em;\n border-radius:4px; padding:2px 6px;\n}\n.status-badge.pending { background:rgba(99,102,241,.15); color:var(--ik-accent); }\n.status-badge.resolved { background:rgba(34,197,94,.15); color:#22c55e; }\n.status-badge.dismissed { background:var(--ik-bg2); color:var(--ik-muted); }\n`\n\n/** Marker pin styles injected into document.head — pins overlay the page */\nexport const MARKER_CSS = /* css */ `\n.ik-marker {\n position: absolute;\n z-index: 2147483645;\n width: 24px; height: 24px;\n border-radius: 50%;\n background: var(--ik-marker-default, #6366f1);\n color: #fff;\n font-size: 11px; font-weight: 700;\n display: flex; align-items: center; justify-content: center;\n cursor: pointer;\n box-shadow: 0 2px 8px color-mix(in srgb, var(--ik-marker-default, #6366f1) 40%, transparent);\n transition: transform .15s ease;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n pointer-events: all;\n user-select: none;\n}\n.ik-marker:hover { transform: scale(1.15); }\n.ik-marker.has-screenshot { background: var(--ik-marker-screenshot, #22c55e); box-shadow: 0 2px 8px color-mix(in srgb, var(--ik-marker-screenshot, #22c55e) 40%, transparent); }\n.ik-marker.dismissed { background: var(--ik-marker-dismissed, #71717a); box-shadow: 0 2px 8px rgba(0,0,0,.2); }\n`\n\n/** Inject styles into document.head (idempotent) */\nexport function injectGlobalStyles(colors?: import('../types').MarkerColors): void {\n if (document.getElementById('instruckt-global')) return\n const vars = colors\n ? `:root {${colors.default ? ` --ik-marker-default: ${colors.default};` : ''}${colors.screenshot ? ` --ik-marker-screenshot: ${colors.screenshot};` : ''}${colors.dismissed ? ` --ik-marker-dismissed: ${colors.dismissed};` : ''} }\\n`\n : ''\n const style = document.createElement('style')\n style.id = 'instruckt-global'\n style.textContent = vars + GLOBAL_CSS + MARKER_CSS\n document.head.appendChild(style)\n}\n","import type { KeyBindings } from '../types'\nimport { TOOLBAR_CSS } from './styles'\n\nexport type ToolbarMode = 'idle' | 'annotating' | 'frozen'\n\ninterface ToolbarCallbacks {\n onToggleAnnotate: (active: boolean) => void\n onFreezeAnimations: (frozen: boolean) => void\n onScreenshot: () => void\n onCopy: () => void\n onClearPage?: () => void\n onClearAll?: () => void\n onMinimize?: (minimized: boolean) => void\n}\n\n// ── Inline SVG icons (24x24, 2px stroke) ─────────────────────\n\nconst ICONS = {\n annotate: `<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 20h9\"/><path d=\"M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4 12.5-12.5z\"/></svg>`,\n freeze: `<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"6\" y=\"4\" width=\"4\" height=\"16\" rx=\"1\"/><rect x=\"14\" y=\"4\" width=\"4\" height=\"16\" rx=\"1\"/></svg>`,\n copy: `<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\"/><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"/></svg>`,\n check: `<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"/></svg>`,\n clear: `<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"3 6 5 6 21 6\"/><path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\"/></svg>`,\n minimize: `<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"7 13 12 18 17 13\"/><line x1=\"12\" y1=\"6\" x2=\"12\" y2=\"18\"/></svg>`,\n screenshot: `<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z\"/><circle cx=\"12\" cy=\"13\" r=\"4\"/></svg>`,\n logo: `<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 20h9\"/><path d=\"M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4 12.5-12.5z\"/></svg>`,\n} as const\n\nexport class Toolbar {\n private host!: HTMLElement\n private shadow!: ShadowRoot\n private toolbarEl!: HTMLDivElement\n private fab!: HTMLButtonElement\n private fabBadge: HTMLSpanElement | null = null\n private annotateBtn!: HTMLButtonElement\n private freezeBtn!: HTMLButtonElement\n private copyBtn!: HTMLButtonElement\n private annotateActive = false\n private freezeActive = false\n private minimized = false\n private totalCount = 0\n private dragging = false\n private dragOffset = { x: 0, y: 0 }\n\n private keys: KeyBindings\n\n constructor(\n private readonly position: string,\n private readonly callbacks: ToolbarCallbacks,\n keys?: KeyBindings,\n ) {\n this.keys = keys ?? {}\n this.build()\n this.setupDrag()\n }\n\n private build(): void {\n this.host = document.createElement('div')\n this.host.setAttribute('data-instruckt', 'toolbar')\n this.shadow = this.host.attachShadow({ mode: 'open' })\n\n const style = document.createElement('style')\n style.textContent = TOOLBAR_CSS\n this.shadow.appendChild(style)\n\n // Full toolbar\n this.toolbarEl = document.createElement('div')\n this.toolbarEl.className = 'toolbar'\n\n const k = this.keys\n this.annotateBtn = this.makeBtn(ICONS.annotate, `Annotate elements (${(k.annotate ?? 'A').toUpperCase()})`, () => {\n const next = !this.annotateActive\n this.setAnnotateActive(next)\n this.callbacks.onToggleAnnotate(next)\n })\n\n this.freezeBtn = this.makeBtn(ICONS.freeze, `Freeze page (${(k.freeze ?? 'F').toUpperCase()})`, () => {\n const next = !this.freezeActive\n this.setFreezeActive(next)\n this.callbacks.onFreezeAnimations(next)\n })\n\n const screenshotBtn = this.makeBtn(ICONS.screenshot, `Screenshot region (${(k.screenshot ?? 'C').toUpperCase()})`, () => {\n this.callbacks.onScreenshot()\n })\n\n this.copyBtn = this.makeBtn(ICONS.copy, 'Copy annotations as markdown', () => {\n this.callbacks.onCopy()\n this.copyBtn.innerHTML = ICONS.check\n setTimeout(() => { this.copyBtn.innerHTML = ICONS.copy }, 1200)\n })\n\n const clearWrap = document.createElement('div')\n clearWrap.className = 'clear-wrap'\n\n const clearBtn = this.makeBtn(ICONS.clear, `Clear this page (${(k.clearPage ?? 'X').toUpperCase()})`, () => {\n this.callbacks.onClearPage?.()\n })\n clearBtn.classList.add('danger-btn')\n\n const clearAllBtn = this.makeBtn(\n `<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10 10-4.5 10-10S17.5 2 12 2\"/><line x1=\"4.93\" y1=\"4.93\" x2=\"19.07\" y2=\"19.07\"/></svg>`,\n 'Delete all instructions.',\n () => this.callbacks.onClearAll?.(),\n )\n clearAllBtn.classList.add('danger-btn', 'clear-all-btn')\n\n clearWrap.appendChild(clearBtn)\n clearWrap.appendChild(clearAllBtn)\n\n const minimizeBtn = this.makeBtn(ICONS.minimize, 'Minimize toolbar', () => {\n this.setMinimized(true)\n })\n minimizeBtn.classList.add('minimize-btn')\n\n const mkDiv = () => { const d = document.createElement('div'); d.className = 'divider'; return d }\n\n this.toolbarEl.append(\n this.annotateBtn, screenshotBtn, mkDiv(), this.freezeBtn, mkDiv(),\n this.copyBtn, clearWrap, mkDiv(), minimizeBtn,\n )\n this.shadow.appendChild(this.toolbarEl)\n\n // Floating action button (minimized state)\n this.fab = document.createElement('button')\n this.fab.className = 'fab'\n this.fab.title = 'Open instruckt toolbar'\n this.fab.setAttribute('aria-label', 'Open instruckt toolbar')\n this.fab.innerHTML = ICONS.logo\n this.fab.style.display = 'none'\n this.fab.addEventListener('click', (e) => {\n e.stopPropagation()\n this.setMinimized(false)\n })\n this.shadow.appendChild(this.fab)\n\n // Prevent toolbar clicks from reaching page handlers (e.g. Alpine @click.outside)\n // Shadow DOM stopPropagation only works within the shadow tree — clicks still\n // re-dispatch from the host element into the regular DOM.\n this.host.addEventListener('click', (e) => e.stopPropagation())\n this.host.addEventListener('mousedown', (e) => e.stopPropagation())\n this.host.addEventListener('pointerdown', (e) => e.stopPropagation())\n\n this.applyPosition()\n const root = document.getElementById('instruckt-root') ?? document.body\n root.appendChild(this.host)\n }\n\n private makeBtn(iconHtml: string, tooltip: string, onClick: () => void): HTMLButtonElement {\n const btn = document.createElement('button')\n btn.className = 'btn'\n btn.setAttribute('data-tooltip', tooltip)\n btn.setAttribute('aria-label', tooltip)\n btn.innerHTML = iconHtml\n btn.addEventListener('click', (e) => {\n e.stopPropagation()\n onClick()\n })\n return btn\n }\n\n private applyPosition(): void {\n const m = '16px'\n Object.assign(this.host.style, {\n position: 'fixed',\n zIndex: '2147483646',\n bottom: this.position.includes('bottom') ? m : 'auto',\n top: this.position.includes('top') ? m : 'auto',\n right: this.position.includes('right') ? m : 'auto',\n left: this.position.includes('left') ? m : 'auto',\n })\n }\n\n private setupDrag(): void {\n this.shadow.addEventListener('mousedown', (evt) => {\n const e = evt as MouseEvent\n if ((e.target as Element).closest('.btn') || (e.target as Element).closest('.fab')) return\n this.dragging = true\n const rect = this.host.getBoundingClientRect()\n this.dragOffset = { x: e.clientX - rect.left, y: e.clientY - rect.top }\n e.preventDefault()\n })\n\n document.addEventListener('mousemove', (e) => {\n if (!this.dragging) return\n Object.assign(this.host.style, {\n left: `${e.clientX - this.dragOffset.x}px`,\n top: `${e.clientY - this.dragOffset.y}px`,\n right: 'auto',\n bottom: 'auto',\n })\n })\n\n document.addEventListener('mouseup', () => { this.dragging = false })\n }\n\n private setMinimized(min: boolean): void {\n this.minimized = min\n this.toolbarEl.style.display = min ? 'none' : ''\n this.fab.style.display = min ? '' : 'none'\n this.updateFabBadge()\n this.callbacks.onMinimize?.(min)\n }\n\n private updateFabBadge(): void {\n if (this.totalCount > 0 && this.minimized) {\n if (!this.fabBadge) {\n this.fabBadge = document.createElement('span')\n this.fabBadge.className = 'fab-badge'\n this.fab.appendChild(this.fabBadge)\n }\n this.fabBadge.textContent = this.totalCount > 99 ? '99+' : String(this.totalCount)\n } else {\n this.fabBadge?.remove()\n this.fabBadge = null\n }\n }\n\n isMinimized(): boolean {\n return this.minimized\n }\n\n /** Programmatically minimize without firing callback */\n minimize(): void {\n this.minimized = true\n this.toolbarEl.style.display = 'none'\n this.fab.style.display = ''\n this.updateFabBadge()\n }\n\n setAnnotateActive(active: boolean): void {\n this.annotateActive = active\n this.annotateBtn.classList.toggle('active', active)\n document.body.classList.toggle('ik-annotating', active)\n }\n\n setFreezeActive(active: boolean): void {\n this.freezeActive = active\n this.freezeBtn.classList.toggle('active', active)\n }\n\n // Keep for compatibility — resolves visual mode from instruckt.ts\n setMode(mode: ToolbarMode): void {\n this.setAnnotateActive(mode === 'annotating')\n }\n\n setAnnotationCount(count: number): void {\n let badge = this.annotateBtn.querySelector('.badge')\n if (count > 0) {\n if (!badge) {\n badge = document.createElement('span')\n badge.className = 'badge'\n this.annotateBtn.appendChild(badge)\n }\n badge.textContent = count > 99 ? '99+' : String(count)\n } else {\n badge?.remove()\n }\n }\n\n setTotalCount(count: number): void {\n this.totalCount = count\n this.updateFabBadge()\n }\n\n destroy(): void {\n this.host.remove()\n document.body.classList.remove('ik-annotating')\n }\n}\n","/** Hover highlight overlay — uses all inline styles, no CSS class needed */\nexport class ElementHighlight {\n private el: HTMLElement\n\n constructor() {\n this.el = document.createElement('div')\n // All styling inline to avoid any host-page CSS interference\n Object.assign(this.el.style, {\n position: 'fixed',\n pointerEvents: 'none', // MUST be none — prevents swallowing clicks\n zIndex: '2147483644',\n border: '2px solid rgba(99,102,241,0.7)',\n background: 'rgba(99,102,241,0.1)',\n borderRadius: '3px',\n transition: 'all 0.06s ease',\n display: 'none',\n })\n this.el.setAttribute('data-instruckt', 'highlight')\n const root = document.getElementById('instruckt-root') ?? document.body\n root.appendChild(this.el)\n }\n\n show(el: Element): void {\n const rect = el.getBoundingClientRect()\n if (rect.width === 0 && rect.height === 0) {\n this.hide()\n return\n }\n Object.assign(this.el.style, {\n display: 'block',\n left: `${rect.left}px`,\n top: `${rect.top}px`,\n width: `${rect.width}px`,\n height: `${rect.height}px`,\n })\n }\n\n hide(): void {\n this.el.style.display = 'none'\n }\n\n destroy(): void {\n this.el.remove()\n }\n}\n","function changeJpegDpi(uint8Array, dpi) {\n uint8Array[13] = 1;\n uint8Array[14] = dpi >> 8;\n uint8Array[15] = dpi & 255;\n uint8Array[16] = dpi >> 8;\n uint8Array[17] = dpi & 255;\n return uint8Array;\n}\n\nconst _P = \"p\".charCodeAt(0);\nconst _H = \"H\".charCodeAt(0);\nconst _Y = \"Y\".charCodeAt(0);\nconst _S = \"s\".charCodeAt(0);\nlet pngDataTable;\nfunction createPngDataTable() {\n const crcTable = new Int32Array(256);\n for (let n = 0; n < 256; n++) {\n let c = n;\n for (let k = 0; k < 8; k++) {\n c = c & 1 ? 3988292384 ^ c >>> 1 : c >>> 1;\n }\n crcTable[n] = c;\n }\n return crcTable;\n}\nfunction calcCrc(uint8Array) {\n let c = -1;\n if (!pngDataTable)\n pngDataTable = createPngDataTable();\n for (let n = 0; n < uint8Array.length; n++) {\n c = pngDataTable[(c ^ uint8Array[n]) & 255] ^ c >>> 8;\n }\n return c ^ -1;\n}\nfunction searchStartOfPhys(uint8Array) {\n const length = uint8Array.length - 1;\n for (let i = length; i >= 4; i--) {\n if (uint8Array[i - 4] === 9 && uint8Array[i - 3] === _P && uint8Array[i - 2] === _H && uint8Array[i - 1] === _Y && uint8Array[i] === _S) {\n return i - 3;\n }\n }\n return 0;\n}\nfunction changePngDpi(uint8Array, dpi, overwritepHYs = false) {\n const physChunk = new Uint8Array(13);\n dpi *= 39.3701;\n physChunk[0] = _P;\n physChunk[1] = _H;\n physChunk[2] = _Y;\n physChunk[3] = _S;\n physChunk[4] = dpi >>> 24;\n physChunk[5] = dpi >>> 16;\n physChunk[6] = dpi >>> 8;\n physChunk[7] = dpi & 255;\n physChunk[8] = physChunk[4];\n physChunk[9] = physChunk[5];\n physChunk[10] = physChunk[6];\n physChunk[11] = physChunk[7];\n physChunk[12] = 1;\n const crc = calcCrc(physChunk);\n const crcChunk = new Uint8Array(4);\n crcChunk[0] = crc >>> 24;\n crcChunk[1] = crc >>> 16;\n crcChunk[2] = crc >>> 8;\n crcChunk[3] = crc & 255;\n if (overwritepHYs) {\n const startingIndex = searchStartOfPhys(uint8Array);\n uint8Array.set(physChunk, startingIndex);\n uint8Array.set(crcChunk, startingIndex + 13);\n return uint8Array;\n } else {\n const chunkLength = new Uint8Array(4);\n chunkLength[0] = 0;\n chunkLength[1] = 0;\n chunkLength[2] = 0;\n chunkLength[3] = 9;\n const finalHeader = new Uint8Array(54);\n finalHeader.set(uint8Array, 0);\n finalHeader.set(chunkLength, 33);\n finalHeader.set(physChunk, 37);\n finalHeader.set(crcChunk, 50);\n return finalHeader;\n }\n}\nconst b64PhysSignature1 = \"AAlwSFlz\";\nconst b64PhysSignature2 = \"AAAJcEhZ\";\nconst b64PhysSignature3 = \"AAAACXBI\";\nfunction detectPhysChunkFromDataUrl(dataUrl) {\n let b64index = dataUrl.indexOf(b64PhysSignature1);\n if (b64index === -1) {\n b64index = dataUrl.indexOf(b64PhysSignature2);\n }\n if (b64index === -1) {\n b64index = dataUrl.indexOf(b64PhysSignature3);\n }\n return b64index;\n}\n\nconst PREFIX = \"[modern-screenshot]\";\nconst IN_BROWSER = typeof window !== \"undefined\";\nconst SUPPORT_WEB_WORKER = IN_BROWSER && \"Worker\" in window;\nconst SUPPORT_ATOB = IN_BROWSER && \"atob\" in window;\nconst SUPPORT_BTOA = IN_BROWSER && \"btoa\" in window;\nconst USER_AGENT = IN_BROWSER ? window.navigator?.userAgent : \"\";\nconst IN_CHROME = USER_AGENT.includes(\"Chrome\");\nconst IN_SAFARI = USER_AGENT.includes(\"AppleWebKit\") && !IN_CHROME;\nconst IN_FIREFOX = USER_AGENT.includes(\"Firefox\");\nconst isContext = (value) => value && \"__CONTEXT__\" in value;\nconst isCssFontFaceRule = (rule) => rule.constructor.name === \"CSSFontFaceRule\";\nconst isCSSImportRule = (rule) => rule.constructor.name === \"CSSImportRule\";\nconst isLayerBlockRule = (rule) => rule.constructor.name === \"CSSLayerBlockRule\";\nconst isElementNode = (node) => node.nodeType === 1;\nconst isSVGElementNode = (node) => typeof node.className === \"object\";\nconst isSVGImageElementNode = (node) => node.tagName === \"image\";\nconst isSVGUseElementNode = (node) => node.tagName === \"use\";\nconst isHTMLElementNode = (node) => isElementNode(node) && typeof node.style !== \"undefined\" && !isSVGElementNode(node);\nconst isCommentNode = (node) => node.nodeType === 8;\nconst isTextNode = (node) => node.nodeType === 3;\nconst isImageElement = (node) => node.tagName === \"IMG\";\nconst isVideoElement = (node) => node.tagName === \"VIDEO\";\nconst isCanvasElement = (node) => node.tagName === \"CANVAS\";\nconst isTextareaElement = (node) => node.tagName === \"TEXTAREA\";\nconst isInputElement = (node) => node.tagName === \"INPUT\";\nconst isStyleElement = (node) => node.tagName === \"STYLE\";\nconst isScriptElement = (node) => node.tagName === \"SCRIPT\";\nconst isSelectElement = (node) => node.tagName === \"SELECT\";\nconst isSlotElement = (node) => node.tagName === \"SLOT\";\nconst isIFrameElement = (node) => node.tagName === \"IFRAME\";\nconst consoleWarn = (...args) => console.warn(PREFIX, ...args);\nfunction supportWebp(ownerDocument) {\n const canvas = ownerDocument?.createElement?.(\"canvas\");\n if (canvas) {\n canvas.height = canvas.width = 1;\n }\n return Boolean(canvas) && \"toDataURL\" in canvas && Boolean(canvas.toDataURL(\"image/webp\").includes(\"image/webp\"));\n}\nconst isDataUrl = (url) => url.startsWith(\"data:\");\nfunction resolveUrl(url, baseUrl) {\n if (url.match(/^[a-z]+:\\/\\//i))\n return url;\n if (IN_BROWSER && url.match(/^\\/\\//))\n return window.location.protocol + url;\n if (url.match(/^[a-z]+:/i))\n return url;\n if (!IN_BROWSER)\n return url;\n const doc = getDocument().implementation.createHTMLDocument();\n const base = doc.createElement(\"base\");\n const a = doc.createElement(\"a\");\n doc.head.appendChild(base);\n doc.body.appendChild(a);\n if (baseUrl)\n base.href = baseUrl;\n a.href = url;\n return a.href;\n}\nfunction getDocument(target) {\n return (target && isElementNode(target) ? target?.ownerDocument : target) ?? window.document;\n}\nconst XMLNS = \"http://www.w3.org/2000/svg\";\nfunction createSvg(width, height, ownerDocument) {\n const svg = getDocument(ownerDocument).createElementNS(XMLNS, \"svg\");\n svg.setAttributeNS(null, \"width\", width.toString());\n svg.setAttributeNS(null, \"height\", height.toString());\n svg.setAttributeNS(null, \"viewBox\", `0 0 ${width} ${height}`);\n return svg;\n}\nfunction svgToDataUrl(svg, removeControlCharacter) {\n let xhtml = new XMLSerializer().serializeToString(svg);\n if (removeControlCharacter) {\n xhtml = xhtml.replace(/[\\u0000-\\u0008\\v\\f\\u000E-\\u001F\\uD800-\\uDFFF\\uFFFE\\uFFFF]/gu, \"\");\n }\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(xhtml)}`;\n}\nasync function canvasToBlob(canvas, type = \"image/png\", quality = 1) {\n try {\n return await new Promise((resolve, reject) => {\n canvas.toBlob((blob) => {\n if (blob) {\n resolve(blob);\n } else {\n reject(new Error(\"Blob is null\"));\n }\n }, type, quality);\n });\n } catch (error) {\n if (SUPPORT_ATOB) {\n return dataUrlToBlob(canvas.toDataURL(type, quality));\n }\n throw error;\n }\n}\nfunction dataUrlToBlob(dataUrl) {\n const [header, base64] = dataUrl.split(\",\");\n const type = header.match(/data:(.+);/)?.[1] ?? void 0;\n const decoded = window.atob(base64);\n const length = decoded.length;\n const buffer = new Uint8Array(length);\n for (let i = 0; i < length; i += 1) {\n buffer[i] = decoded.charCodeAt(i);\n }\n return new Blob([buffer], { type });\n}\nfunction readBlob(blob, type) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result);\n reader.onerror = () => reject(reader.error);\n reader.onabort = () => reject(new Error(`Failed read blob to ${type}`));\n if (type === \"dataUrl\") {\n reader.readAsDataURL(blob);\n } else if (type === \"arrayBuffer\") {\n reader.readAsArrayBuffer(blob);\n }\n });\n}\nconst blobToDataUrl = (blob) => readBlob(blob, \"dataUrl\");\nconst blobToArrayBuffer = (blob) => readBlob(blob, \"arrayBuffer\");\nfunction createImage(url, ownerDocument) {\n const img = getDocument(ownerDocument).createElement(\"img\");\n img.decoding = \"sync\";\n img.loading = \"eager\";\n img.src = url;\n return img;\n}\nfunction loadMedia(media, options) {\n return new Promise((resolve) => {\n const { timeout, ownerDocument, onError: userOnError, onWarn } = options ?? {};\n const node = typeof media === \"string\" ? createImage(media, getDocument(ownerDocument)) : media;\n let timer = null;\n let removeEventListeners = null;\n function onResolve() {\n resolve(node);\n timer && clearTimeout(timer);\n removeEventListeners?.();\n }\n if (timeout) {\n timer = setTimeout(onResolve, timeout);\n }\n if (isVideoElement(node)) {\n const currentSrc = node.currentSrc || node.src;\n if (!currentSrc) {\n if (node.poster) {\n return loadMedia(node.poster, options).then(resolve);\n }\n return onResolve();\n }\n if (node.readyState >= 2) {\n return onResolve();\n }\n const onLoadeddata = onResolve;\n const onError = (error) => {\n onWarn?.(\n \"Failed video load\",\n currentSrc,\n error\n );\n userOnError?.(error);\n onResolve();\n };\n removeEventListeners = () => {\n node.removeEventListener(\"loadeddata\", onLoadeddata);\n node.removeEventListener(\"error\", onError);\n };\n node.addEventListener(\"loadeddata\", onLoadeddata, { once: true });\n node.addEventListener(\"error\", onError, { once: true });\n } else {\n const currentSrc = isSVGImageElementNode(node) ? node.href.baseVal : node.currentSrc || node.src;\n if (!currentSrc) {\n return onResolve();\n }\n const onLoad = async () => {\n if (isImageElement(node) && \"decode\" in node) {\n try {\n await node.decode();\n } catch (error) {\n onWarn?.(\n \"Failed to decode image, trying to render anyway\",\n node.dataset.originalSrc || currentSrc,\n error\n );\n }\n }\n onResolve();\n };\n const onError = (error) => {\n onWarn?.(\n \"Failed image load\",\n node.dataset.originalSrc || currentSrc,\n error\n );\n onResolve();\n };\n if (isImageElement(node) && node.complete) {\n return onLoad();\n }\n removeEventListeners = () => {\n node.removeEventListener(\"load\", onLoad);\n node.removeEventListener(\"error\", onError);\n };\n node.addEventListener(\"load\", onLoad, { once: true });\n node.addEventListener(\"error\", onError, { once: true });\n }\n });\n}\nasync function waitUntilLoad(node, options) {\n if (isHTMLElementNode(node)) {\n if (isImageElement(node) || isVideoElement(node)) {\n await loadMedia(node, options);\n } else {\n await Promise.all(\n [\"img\", \"video\"].flatMap((selectors) => {\n return Array.from(node.querySelectorAll(selectors)).map((el) => loadMedia(el, options));\n })\n );\n }\n }\n}\nconst uuid = /* @__PURE__ */ function uuid2() {\n let counter = 0;\n const random = () => `0000${(Math.random() * 36 ** 4 << 0).toString(36)}`.slice(-4);\n return () => {\n counter += 1;\n return `u${random()}${counter}`;\n };\n}();\nfunction splitFontFamily(fontFamily) {\n return fontFamily?.split(\",\").map((val) => val.trim().replace(/\"|'/g, \"\").toLowerCase()).filter(Boolean);\n}\n\nlet uid = 0;\nfunction createLogger(debug) {\n const prefix = `${PREFIX}[#${uid}]`;\n uid++;\n return {\n // eslint-disable-next-line no-console\n time: (label) => debug && console.time(`${prefix} ${label}`),\n // eslint-disable-next-line no-console\n timeEnd: (label) => debug && console.timeEnd(`${prefix} ${label}`),\n warn: (...args) => debug && consoleWarn(...args)\n };\n}\n\nfunction getDefaultRequestInit(bypassingCache) {\n return {\n cache: bypassingCache ? \"no-cache\" : \"force-cache\"\n };\n}\n\nasync function orCreateContext(node, options) {\n return isContext(node) ? node : createContext(node, { ...options, autoDestruct: true });\n}\nasync function createContext(node, options) {\n const { scale = 1, workerUrl, workerNumber = 1 } = options || {};\n const debug = Boolean(options?.debug);\n const features = options?.features ?? true;\n const ownerDocument = node.ownerDocument ?? (IN_BROWSER ? window.document : void 0);\n const ownerWindow = node.ownerDocument?.defaultView ?? (IN_BROWSER ? window : void 0);\n const requests = /* @__PURE__ */ new Map();\n const context = {\n // Options\n width: 0,\n height: 0,\n quality: 1,\n type: \"image/png\",\n scale,\n backgroundColor: null,\n style: null,\n filter: null,\n maximumCanvasSize: 0,\n timeout: 3e4,\n progress: null,\n debug,\n fetch: {\n requestInit: getDefaultRequestInit(options?.fetch?.bypassingCache),\n placeholderImage: \"data:image/png;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\",\n bypassingCache: false,\n ...options?.fetch\n },\n fetchFn: null,\n font: {},\n drawImageInterval: 100,\n workerUrl: null,\n workerNumber,\n onCloneEachNode: null,\n onCloneNode: null,\n onEmbedNode: null,\n onCreateForeignObjectSvg: null,\n includeStyleProperties: null,\n autoDestruct: false,\n ...options,\n // InternalContext\n __CONTEXT__: true,\n log: createLogger(debug),\n node,\n ownerDocument,\n ownerWindow,\n dpi: scale === 1 ? null : 96 * scale,\n svgStyleElement: createStyleElement(ownerDocument),\n svgDefsElement: ownerDocument?.createElementNS(XMLNS, \"defs\"),\n svgStyles: /* @__PURE__ */ new Map(),\n defaultComputedStyles: /* @__PURE__ */ new Map(),\n workers: [\n ...Array.from({\n length: SUPPORT_WEB_WORKER && workerUrl && workerNumber ? workerNumber : 0\n })\n ].map(() => {\n try {\n const worker = new Worker(workerUrl);\n worker.onmessage = async (event) => {\n const { url, result } = event.data;\n if (result) {\n requests.get(url)?.resolve?.(result);\n } else {\n requests.get(url)?.reject?.(new Error(`Error receiving message from worker: ${url}`));\n }\n };\n worker.onmessageerror = (event) => {\n const { url } = event.data;\n requests.get(url)?.reject?.(new Error(`Error receiving message from worker: ${url}`));\n };\n return worker;\n } catch (error) {\n context.log.warn(\"Failed to new Worker\", error);\n return null;\n }\n }).filter(Boolean),\n fontFamilies: /* @__PURE__ */ new Map(),\n fontCssTexts: /* @__PURE__ */ new Map(),\n acceptOfImage: `${[\n supportWebp(ownerDocument) && \"image/webp\",\n \"image/svg+xml\",\n \"image/*\",\n \"*/*\"\n ].filter(Boolean).join(\",\")};q=0.8`,\n requests,\n drawImageCount: 0,\n tasks: [],\n features,\n isEnable: (key) => {\n if (key === \"restoreScrollPosition\") {\n return typeof features === \"boolean\" ? false : features[key] ?? false;\n }\n if (typeof features === \"boolean\") {\n return features;\n }\n return features[key] ?? true;\n },\n shadowRoots: []\n };\n context.log.time(\"wait until load\");\n await waitUntilLoad(node, { timeout: context.timeout, onWarn: context.log.warn });\n context.log.timeEnd(\"wait until load\");\n const { width, height } = resolveBoundingBox(node, context);\n context.width = width;\n context.height = height;\n return context;\n}\nfunction createStyleElement(ownerDocument) {\n if (!ownerDocument)\n return void 0;\n const style = ownerDocument.createElement(\"style\");\n const cssText = style.ownerDocument.createTextNode(`\n.______background-clip--text {\n background-clip: text;\n -webkit-background-clip: text;\n}\n`);\n style.appendChild(cssText);\n return style;\n}\nfunction resolveBoundingBox(node, context) {\n let { width, height } = context;\n if (isElementNode(node) && (!width || !height)) {\n const box = node.getBoundingClientRect();\n width = width || box.width || Number(node.getAttribute(\"width\")) || 0;\n height = height || box.height || Number(node.getAttribute(\"height\")) || 0;\n }\n return { width, height };\n}\n\nasync function imageToCanvas(image, context) {\n const {\n log,\n timeout,\n drawImageCount,\n drawImageInterval\n } = context;\n log.time(\"image to canvas\");\n const loaded = await loadMedia(image, { timeout, onWarn: context.log.warn });\n const { canvas, context2d } = createCanvas(image.ownerDocument, context);\n const drawImage = () => {\n try {\n context2d?.drawImage(loaded, 0, 0, canvas.width, canvas.height);\n } catch (error) {\n context.log.warn(\"Failed to drawImage\", error);\n }\n };\n drawImage();\n if (context.isEnable(\"fixSvgXmlDecode\")) {\n for (let i = 0; i < drawImageCount; i++) {\n await new Promise((resolve) => {\n setTimeout(() => {\n context2d?.clearRect(0, 0, canvas.width, canvas.height);\n drawImage();\n resolve();\n }, i + drawImageInterval);\n });\n }\n }\n context.drawImageCount = 0;\n log.timeEnd(\"image to canvas\");\n return canvas;\n}\nfunction createCanvas(ownerDocument, context) {\n const { width, height, scale, backgroundColor, maximumCanvasSize: max } = context;\n const canvas = ownerDocument.createElement(\"canvas\");\n canvas.width = Math.floor(width * scale);\n canvas.height = Math.floor(height * scale);\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n if (max) {\n if (canvas.width > max || canvas.height > max) {\n if (canvas.width > max && canvas.height > max) {\n if (canvas.width > canvas.height) {\n canvas.height *= max / canvas.width;\n canvas.width = max;\n } else {\n canvas.width *= max / canvas.height;\n canvas.height = max;\n }\n } else if (canvas.width > max) {\n canvas.height *= max / canvas.width;\n canvas.width = max;\n } else {\n canvas.width *= max / canvas.height;\n canvas.height = max;\n }\n }\n }\n const context2d = canvas.getContext(\"2d\");\n if (context2d && backgroundColor) {\n context2d.fillStyle = backgroundColor;\n context2d.fillRect(0, 0, canvas.width, canvas.height);\n }\n return { canvas, context2d };\n}\n\nfunction cloneCanvas(canvas, context) {\n if (canvas.ownerDocument) {\n try {\n const dataURL = canvas.toDataURL();\n if (dataURL !== \"data:,\") {\n return createImage(dataURL, canvas.ownerDocument);\n }\n } catch (error) {\n context.log.warn(\"Failed to clone canvas\", error);\n }\n }\n const cloned = canvas.cloneNode(false);\n const ctx = canvas.getContext(\"2d\");\n const clonedCtx = cloned.getContext(\"2d\");\n try {\n if (ctx && clonedCtx) {\n clonedCtx.putImageData(\n ctx.getImageData(0, 0, canvas.width, canvas.height),\n 0,\n 0\n );\n }\n return cloned;\n } catch (error) {\n context.log.warn(\"Failed to clone canvas\", error);\n }\n return cloned;\n}\n\nfunction cloneIframe(iframe, context) {\n try {\n if (iframe?.contentDocument?.body) {\n return cloneNode(iframe.contentDocument.body, context);\n }\n } catch (error) {\n context.log.warn(\"Failed to clone iframe\", error);\n }\n return iframe.cloneNode(false);\n}\n\nfunction cloneImage(image) {\n const cloned = image.cloneNode(false);\n if (image.currentSrc && image.currentSrc !== image.src) {\n cloned.src = image.currentSrc;\n cloned.srcset = \"\";\n }\n if (cloned.loading === \"lazy\") {\n cloned.loading = \"eager\";\n }\n return cloned;\n}\n\nasync function cloneVideo(video, context) {\n if (video.ownerDocument && !video.currentSrc && video.poster) {\n return createImage(video.poster, video.ownerDocument);\n }\n const cloned = video.cloneNode(false);\n cloned.crossOrigin = \"anonymous\";\n if (video.currentSrc && video.currentSrc !== video.src) {\n cloned.src = video.currentSrc;\n }\n const ownerDocument = cloned.ownerDocument;\n if (ownerDocument) {\n let canPlay = true;\n await loadMedia(cloned, { onError: () => canPlay = false, onWarn: context.log.warn });\n if (!canPlay) {\n if (video.poster) {\n return createImage(video.poster, video.ownerDocument);\n }\n return cloned;\n }\n cloned.currentTime = video.currentTime;\n await new Promise((resolve) => {\n cloned.addEventListener(\"seeked\", resolve, { once: true });\n });\n const canvas = ownerDocument.createElement(\"canvas\");\n canvas.width = video.offsetWidth;\n canvas.height = video.offsetHeight;\n try {\n const ctx = canvas.getContext(\"2d\");\n if (ctx)\n ctx.drawImage(cloned, 0, 0, canvas.width, canvas.height);\n } catch (error) {\n context.log.warn(\"Failed to clone video\", error);\n if (video.poster) {\n return createImage(video.poster, video.ownerDocument);\n }\n return cloned;\n }\n return cloneCanvas(canvas, context);\n }\n return cloned;\n}\n\nfunction cloneElement(node, context) {\n if (isCanvasElement(node)) {\n return cloneCanvas(node, context);\n }\n if (isIFrameElement(node)) {\n return cloneIframe(node, context);\n }\n if (isImageElement(node)) {\n return cloneImage(node);\n }\n if (isVideoElement(node)) {\n return cloneVideo(node, context);\n }\n return node.cloneNode(false);\n}\n\nfunction getSandBox(context) {\n let sandbox = context.sandbox;\n if (!sandbox) {\n const { ownerDocument } = context;\n try {\n if (ownerDocument) {\n sandbox = ownerDocument.createElement(\"iframe\");\n sandbox.id = `__SANDBOX__${uuid()}`;\n sandbox.width = \"0\";\n sandbox.height = \"0\";\n sandbox.style.visibility = \"hidden\";\n sandbox.style.position = \"fixed\";\n ownerDocument.body.appendChild(sandbox);\n sandbox.srcdoc = '<!DOCTYPE html><meta charset=\"UTF-8\"><title></title><body>';\n context.sandbox = sandbox;\n }\n } catch (error) {\n context.log.warn(\"Failed to getSandBox\", error);\n }\n }\n return sandbox;\n}\n\nconst ignoredStyles = [\n \"width\",\n \"height\",\n \"-webkit-text-fill-color\"\n];\nconst includedAttributes = [\n \"stroke\",\n \"fill\"\n];\nfunction getDefaultStyle(node, pseudoElement, context) {\n const { defaultComputedStyles } = context;\n const nodeName = node.nodeName.toLowerCase();\n const isSvgNode = isSVGElementNode(node) && nodeName !== \"svg\";\n const attributes = isSvgNode ? includedAttributes.map((name) => [name, node.getAttribute(name)]).filter(([, value]) => value !== null) : [];\n const key = [\n isSvgNode && \"svg\",\n nodeName,\n attributes.map((name, value) => `${name}=${value}`).join(\",\"),\n pseudoElement\n ].filter(Boolean).join(\":\");\n if (defaultComputedStyles.has(key))\n return defaultComputedStyles.get(key);\n const sandbox = getSandBox(context);\n const sandboxWindow = sandbox?.contentWindow;\n if (!sandboxWindow)\n return /* @__PURE__ */ new Map();\n const sandboxDocument = sandboxWindow?.document;\n let root;\n let el;\n if (isSvgNode) {\n root = sandboxDocument.createElementNS(XMLNS, \"svg\");\n el = root.ownerDocument.createElementNS(root.namespaceURI, nodeName);\n attributes.forEach(([name, value]) => {\n el.setAttributeNS(null, name, value);\n });\n root.appendChild(el);\n } else {\n root = el = sandboxDocument.createElement(nodeName);\n }\n el.textContent = \" \";\n sandboxDocument.body.appendChild(root);\n const computedStyle = sandboxWindow.getComputedStyle(el, pseudoElement);\n const styles = /* @__PURE__ */ new Map();\n for (let len = computedStyle.length, i = 0; i < len; i++) {\n const name = computedStyle.item(i);\n if (ignoredStyles.includes(name))\n continue;\n styles.set(name, computedStyle.getPropertyValue(name));\n }\n sandboxDocument.body.removeChild(root);\n defaultComputedStyles.set(key, styles);\n return styles;\n}\n\nfunction getDiffStyle(style, defaultStyle, includeStyleProperties) {\n const diffStyle = /* @__PURE__ */ new Map();\n const prefixs = [];\n const prefixTree = /* @__PURE__ */ new Map();\n if (includeStyleProperties) {\n for (const name of includeStyleProperties) {\n applyTo(name);\n }\n } else {\n for (let len = style.length, i = 0; i < len; i++) {\n const name = style.item(i);\n applyTo(name);\n }\n }\n for (let len = prefixs.length, i = 0; i < len; i++) {\n prefixTree.get(prefixs[i])?.forEach((value, name) => diffStyle.set(name, value));\n }\n function applyTo(name) {\n const value = style.getPropertyValue(name);\n const priority = style.getPropertyPriority(name);\n const subIndex = name.lastIndexOf(\"-\");\n const prefix = subIndex > -1 ? name.substring(0, subIndex) : void 0;\n if (prefix) {\n let map = prefixTree.get(prefix);\n if (!map) {\n map = /* @__PURE__ */ new Map();\n prefixTree.set(prefix, map);\n }\n map.set(name, [value, priority]);\n }\n if (defaultStyle.get(name) === value && !priority)\n return;\n if (prefix) {\n prefixs.push(prefix);\n } else {\n diffStyle.set(name, [value, priority]);\n }\n }\n return diffStyle;\n}\n\nfunction copyCssStyles(node, cloned, isRoot, context) {\n const { ownerWindow, includeStyleProperties, currentParentNodeStyle } = context;\n const clonedStyle = cloned.style;\n const computedStyle = ownerWindow.getComputedStyle(node);\n const defaultStyle = getDefaultStyle(node, null, context);\n currentParentNodeStyle?.forEach((_, key) => {\n defaultStyle.delete(key);\n });\n const style = getDiffStyle(computedStyle, defaultStyle, includeStyleProperties);\n style.delete(\"transition-property\");\n style.delete(\"all\");\n style.delete(\"d\");\n style.delete(\"content\");\n if (isRoot) {\n style.delete(\"margin-top\");\n style.delete(\"margin-right\");\n style.delete(\"margin-bottom\");\n style.delete(\"margin-left\");\n style.delete(\"margin-block-start\");\n style.delete(\"margin-block-end\");\n style.delete(\"margin-inline-start\");\n style.delete(\"margin-inline-end\");\n style.set(\"box-sizing\", [\"border-box\", \"\"]);\n }\n if (style.get(\"background-clip\")?.[0] === \"text\") {\n cloned.classList.add(\"______background-clip--text\");\n }\n if (IN_CHROME) {\n if (!style.has(\"font-kerning\"))\n style.set(\"font-kerning\", [\"normal\", \"\"]);\n if ((style.get(\"overflow-x\")?.[0] === \"hidden\" || style.get(\"overflow-y\")?.[0] === \"hidden\") && style.get(\"text-overflow\")?.[0] === \"ellipsis\" && node.scrollWidth === node.clientWidth) {\n style.set(\"text-overflow\", [\"clip\", \"\"]);\n }\n }\n for (let len = clonedStyle.length, i = 0; i < len; i++) {\n clonedStyle.removeProperty(clonedStyle.item(i));\n }\n style.forEach(([value, priority], name) => {\n clonedStyle.setProperty(name, value, priority);\n });\n return style;\n}\n\nfunction copyInputValue(node, cloned) {\n if (isTextareaElement(node) || isInputElement(node) || isSelectElement(node)) {\n cloned.setAttribute(\"value\", node.value);\n }\n}\n\nconst pseudoClasses = [\n \"::before\",\n \"::after\"\n // '::placeholder', TODO\n];\nconst scrollbarPseudoClasses = [\n \"::-webkit-scrollbar\",\n \"::-webkit-scrollbar-button\",\n // '::-webkit-scrollbar:horizontal', TODO\n \"::-webkit-scrollbar-thumb\",\n \"::-webkit-scrollbar-track\",\n \"::-webkit-scrollbar-track-piece\",\n // '::-webkit-scrollbar:vertical', TODO\n \"::-webkit-scrollbar-corner\",\n \"::-webkit-resizer\"\n];\nfunction copyPseudoClass(node, cloned, copyScrollbar, context, addWordToFontFamilies) {\n const { ownerWindow, svgStyleElement, svgStyles, currentNodeStyle } = context;\n if (!svgStyleElement || !ownerWindow)\n return;\n function copyBy(pseudoClass) {\n const computedStyle = ownerWindow.getComputedStyle(node, pseudoClass);\n let content = computedStyle.getPropertyValue(\"content\");\n if (!content || content === \"none\")\n return;\n addWordToFontFamilies?.(content);\n content = content.replace(/(')|(\")|(counter\\(.+\\))/g, \"\");\n const klasses = [uuid()];\n const defaultStyle = getDefaultStyle(node, pseudoClass, context);\n currentNodeStyle?.forEach((_, key) => {\n defaultStyle.delete(key);\n });\n const style = getDiffStyle(computedStyle, defaultStyle, context.includeStyleProperties);\n style.delete(\"content\");\n style.delete(\"-webkit-locale\");\n if (style.get(\"background-clip\")?.[0] === \"text\") {\n cloned.classList.add(\"______background-clip--text\");\n }\n const cloneStyle = [\n `content: '${content}';`\n ];\n style.forEach(([value, priority], name) => {\n cloneStyle.push(`${name}: ${value}${priority ? \" !important\" : \"\"};`);\n });\n if (cloneStyle.length === 1)\n return;\n try {\n cloned.className = [cloned.className, ...klasses].join(\" \");\n } catch (err) {\n context.log.warn(\"Failed to copyPseudoClass\", err);\n return;\n }\n const cssText = cloneStyle.join(\"\\n \");\n let allClasses = svgStyles.get(cssText);\n if (!allClasses) {\n allClasses = [];\n svgStyles.set(cssText, allClasses);\n }\n allClasses.push(`.${klasses[0]}${pseudoClass}`);\n }\n pseudoClasses.forEach(copyBy);\n if (copyScrollbar)\n scrollbarPseudoClasses.forEach(copyBy);\n}\n\nconst excludeParentNodes = /* @__PURE__ */ new Set([\n \"symbol\"\n // test/fixtures/svg.symbol.html\n]);\nasync function appendChildNode(node, cloned, child, context, addWordToFontFamilies) {\n if (isElementNode(child) && (isStyleElement(child) || isScriptElement(child)))\n return;\n if (context.filter && !context.filter(child))\n return;\n if (excludeParentNodes.has(cloned.nodeName) || excludeParentNodes.has(child.nodeName)) {\n context.currentParentNodeStyle = void 0;\n } else {\n context.currentParentNodeStyle = context.currentNodeStyle;\n }\n const childCloned = await cloneNode(child, context, false, addWordToFontFamilies);\n if (context.isEnable(\"restoreScrollPosition\")) {\n restoreScrollPosition(node, childCloned);\n }\n cloned.appendChild(childCloned);\n}\nasync function cloneChildNodes(node, cloned, context, addWordToFontFamilies) {\n let firstChild = node.firstChild;\n if (isElementNode(node)) {\n if (node.shadowRoot) {\n firstChild = node.shadowRoot?.firstChild;\n context.shadowRoots.push(node.shadowRoot);\n }\n }\n for (let child = firstChild; child; child = child.nextSibling) {\n if (isCommentNode(child))\n continue;\n if (isElementNode(child) && isSlotElement(child) && typeof child.assignedNodes === \"function\") {\n const nodes = child.assignedNodes();\n for (let i = 0; i < nodes.length; i++) {\n await appendChildNode(node, cloned, nodes[i], context, addWordToFontFamilies);\n }\n } else {\n await appendChildNode(node, cloned, child, context, addWordToFontFamilies);\n }\n }\n}\nfunction restoreScrollPosition(node, chlidCloned) {\n if (!isHTMLElementNode(node) || !isHTMLElementNode(chlidCloned))\n return;\n const { scrollTop, scrollLeft } = node;\n if (!scrollTop && !scrollLeft) {\n return;\n }\n const { transform } = chlidCloned.style;\n const matrix = new DOMMatrix(transform);\n const { a, b, c, d } = matrix;\n matrix.a = 1;\n matrix.b = 0;\n matrix.c = 0;\n matrix.d = 1;\n matrix.translateSelf(-scrollLeft, -scrollTop);\n matrix.a = a;\n matrix.b = b;\n matrix.c = c;\n matrix.d = d;\n chlidCloned.style.transform = matrix.toString();\n}\nfunction applyCssStyleWithOptions(cloned, context) {\n const { backgroundColor, width, height, style: styles } = context;\n const clonedStyle = cloned.style;\n if (backgroundColor)\n clonedStyle.setProperty(\"background-color\", backgroundColor, \"important\");\n if (width)\n clonedStyle.setProperty(\"width\", `${width}px`, \"important\");\n if (height)\n clonedStyle.setProperty(\"height\", `${height}px`, \"important\");\n if (styles) {\n for (const name in styles) clonedStyle[name] = styles[name];\n }\n}\nconst NORMAL_ATTRIBUTE_RE = /^[\\w-:]+$/;\nasync function cloneNode(node, context, isRoot = false, addWordToFontFamilies) {\n const { ownerDocument, ownerWindow, fontFamilies, onCloneEachNode } = context;\n if (ownerDocument && isTextNode(node)) {\n if (addWordToFontFamilies && /\\S/.test(node.data)) {\n addWordToFontFamilies(node.data);\n }\n return ownerDocument.createTextNode(node.data);\n }\n if (ownerDocument && ownerWindow && isElementNode(node) && (isHTMLElementNode(node) || isSVGElementNode(node))) {\n const cloned2 = await cloneElement(node, context);\n if (context.isEnable(\"removeAbnormalAttributes\")) {\n const names = cloned2.getAttributeNames();\n for (let len = names.length, i = 0; i < len; i++) {\n const name = names[i];\n if (!NORMAL_ATTRIBUTE_RE.test(name)) {\n cloned2.removeAttribute(name);\n }\n }\n }\n const style = context.currentNodeStyle = copyCssStyles(node, cloned2, isRoot, context);\n if (isRoot)\n applyCssStyleWithOptions(cloned2, context);\n let copyScrollbar = false;\n if (context.isEnable(\"copyScrollbar\")) {\n const overflow = [\n style.get(\"overflow-x\")?.[0],\n style.get(\"overflow-y\")?.[0]\n ];\n copyScrollbar = overflow.includes(\"scroll\") || (overflow.includes(\"auto\") || overflow.includes(\"overlay\")) && (node.scrollHeight > node.clientHeight || node.scrollWidth > node.clientWidth);\n }\n const textTransform = style.get(\"text-transform\")?.[0];\n const families = splitFontFamily(style.get(\"font-family\")?.[0]);\n const addWordToFontFamilies2 = families ? (word) => {\n if (textTransform === \"uppercase\") {\n word = word.toUpperCase();\n } else if (textTransform === \"lowercase\") {\n word = word.toLowerCase();\n } else if (textTransform === \"capitalize\") {\n word = word[0].toUpperCase() + word.substring(1);\n }\n families.forEach((family) => {\n let fontFamily = fontFamilies.get(family);\n if (!fontFamily) {\n fontFamilies.set(family, fontFamily = /* @__PURE__ */ new Set());\n }\n word.split(\"\").forEach((text) => fontFamily.add(text));\n });\n } : void 0;\n copyPseudoClass(\n node,\n cloned2,\n copyScrollbar,\n context,\n addWordToFontFamilies2\n );\n copyInputValue(node, cloned2);\n if (!isVideoElement(node)) {\n await cloneChildNodes(\n node,\n cloned2,\n context,\n addWordToFontFamilies2\n );\n }\n await onCloneEachNode?.(cloned2);\n return cloned2;\n }\n const cloned = node.cloneNode(false);\n await cloneChildNodes(node, cloned, context);\n await onCloneEachNode?.(cloned);\n return cloned;\n}\n\nfunction destroyContext(context) {\n context.ownerDocument = void 0;\n context.ownerWindow = void 0;\n context.svgStyleElement = void 0;\n context.svgDefsElement = void 0;\n context.svgStyles.clear();\n context.defaultComputedStyles.clear();\n if (context.sandbox) {\n try {\n context.sandbox.remove();\n } catch (err) {\n context.log.warn(\"Failed to destroyContext\", err);\n }\n context.sandbox = void 0;\n }\n context.workers = [];\n context.fontFamilies.clear();\n context.fontCssTexts.clear();\n context.requests.clear();\n context.tasks = [];\n context.shadowRoots = [];\n}\n\nfunction baseFetch(options) {\n const { url, timeout, responseType, ...requestInit } = options;\n const controller = new AbortController();\n const timer = timeout ? setTimeout(() => controller.abort(), timeout) : void 0;\n return fetch(url, { signal: controller.signal, ...requestInit }).then((response) => {\n if (!response.ok) {\n throw new Error(\"Failed fetch, not 2xx response\", { cause: response });\n }\n switch (responseType) {\n case \"arrayBuffer\":\n return response.arrayBuffer();\n case \"dataUrl\":\n return response.blob().then(blobToDataUrl);\n case \"text\":\n default:\n return response.text();\n }\n }).finally(() => clearTimeout(timer));\n}\nfunction contextFetch(context, options) {\n const { url: rawUrl, requestType = \"text\", responseType = \"text\", imageDom } = options;\n let url = rawUrl;\n const {\n timeout,\n acceptOfImage,\n requests,\n fetchFn,\n fetch: {\n requestInit,\n bypassingCache,\n placeholderImage\n },\n font,\n workers,\n fontFamilies\n } = context;\n if (requestType === \"image\" && (IN_SAFARI || IN_FIREFOX)) {\n context.drawImageCount++;\n }\n let request = requests.get(rawUrl);\n if (!request) {\n if (bypassingCache) {\n if (bypassingCache instanceof RegExp && bypassingCache.test(url)) {\n url += (/\\?/.test(url) ? \"&\" : \"?\") + (/* @__PURE__ */ new Date()).getTime();\n }\n }\n const canFontMinify = requestType.startsWith(\"font\") && font && font.minify;\n const fontTexts = /* @__PURE__ */ new Set();\n if (canFontMinify) {\n const families = requestType.split(\";\")[1].split(\",\");\n families.forEach((family) => {\n if (!fontFamilies.has(family))\n return;\n fontFamilies.get(family).forEach((text) => fontTexts.add(text));\n });\n }\n const needFontMinify = canFontMinify && fontTexts.size;\n const baseFetchOptions = {\n url,\n timeout,\n responseType: needFontMinify ? \"arrayBuffer\" : responseType,\n headers: requestType === \"image\" ? { accept: acceptOfImage } : void 0,\n ...requestInit\n };\n request = {\n type: requestType,\n resolve: void 0,\n reject: void 0,\n response: null\n };\n request.response = (async () => {\n if (fetchFn && requestType === \"image\") {\n const result = await fetchFn(rawUrl);\n if (result)\n return result;\n }\n if (!IN_SAFARI && rawUrl.startsWith(\"http\") && workers.length) {\n return new Promise((resolve, reject) => {\n const worker = workers[requests.size & workers.length - 1];\n worker.postMessage({ rawUrl, ...baseFetchOptions });\n request.resolve = resolve;\n request.reject = reject;\n });\n }\n return baseFetch(baseFetchOptions);\n })().catch((error) => {\n requests.delete(rawUrl);\n if (requestType === \"image\" && placeholderImage) {\n context.log.warn(\"Failed to fetch image base64, trying to use placeholder image\", url);\n return typeof placeholderImage === \"string\" ? placeholderImage : placeholderImage(imageDom);\n }\n throw error;\n });\n requests.set(rawUrl, request);\n }\n return request.response;\n}\n\nasync function replaceCssUrlToDataUrl(cssText, baseUrl, context, isImage) {\n if (!hasCssUrl(cssText))\n return cssText;\n for (const [rawUrl, url] of parseCssUrls(cssText, baseUrl)) {\n try {\n const dataUrl = await contextFetch(\n context,\n {\n url,\n requestType: isImage ? \"image\" : \"text\",\n responseType: \"dataUrl\"\n }\n );\n cssText = cssText.replace(toRE(rawUrl), `$1${dataUrl}$3`);\n } catch (error) {\n context.log.warn(\"Failed to fetch css data url\", rawUrl, error);\n }\n }\n return cssText;\n}\nfunction hasCssUrl(cssText) {\n return /url\\((['\"]?)([^'\"]+?)\\1\\)/.test(cssText);\n}\nconst URL_RE = /url\\((['\"]?)([^'\"]+?)\\1\\)/g;\nfunction parseCssUrls(cssText, baseUrl) {\n const result = [];\n cssText.replace(URL_RE, (raw, quotation, url) => {\n result.push([url, resolveUrl(url, baseUrl)]);\n return raw;\n });\n return result.filter(([url]) => !isDataUrl(url));\n}\nfunction toRE(url) {\n const escaped = url.replace(/([.*+?^${}()|\\[\\]\\/\\\\])/g, \"\\\\$1\");\n return new RegExp(`(url\\\\(['\"]?)(${escaped})(['\"]?\\\\))`, \"g\");\n}\n\nconst properties = [\n \"background-image\",\n \"border-image-source\",\n \"-webkit-border-image\",\n \"-webkit-mask-image\",\n \"list-style-image\"\n];\nfunction embedCssStyleImage(style, context) {\n return properties.map((property) => {\n const value = style.getPropertyValue(property);\n if (!value || value === \"none\") {\n return null;\n }\n if (IN_SAFARI || IN_FIREFOX) {\n context.drawImageCount++;\n }\n return replaceCssUrlToDataUrl(value, null, context, true).then((newValue) => {\n if (!newValue || value === newValue)\n return;\n style.setProperty(\n property,\n newValue,\n style.getPropertyPriority(property)\n );\n });\n }).filter(Boolean);\n}\n\nfunction embedImageElement(cloned, context) {\n if (isImageElement(cloned)) {\n const originalSrc = cloned.currentSrc || cloned.src;\n if (!isDataUrl(originalSrc)) {\n return [\n contextFetch(context, {\n url: originalSrc,\n imageDom: cloned,\n requestType: \"image\",\n responseType: \"dataUrl\"\n }).then((url) => {\n if (!url)\n return;\n cloned.srcset = \"\";\n cloned.dataset.originalSrc = originalSrc;\n cloned.src = url || \"\";\n })\n ];\n }\n if (IN_SAFARI || IN_FIREFOX) {\n context.drawImageCount++;\n }\n } else if (isSVGElementNode(cloned) && !isDataUrl(cloned.href.baseVal)) {\n const originalSrc = cloned.href.baseVal;\n return [\n contextFetch(context, {\n url: originalSrc,\n imageDom: cloned,\n requestType: \"image\",\n responseType: \"dataUrl\"\n }).then((url) => {\n if (!url)\n return;\n cloned.dataset.originalSrc = originalSrc;\n cloned.href.baseVal = url || \"\";\n })\n ];\n }\n return [];\n}\n\nfunction embedSvgUse(cloned, context) {\n const { ownerDocument, svgDefsElement } = context;\n const href = cloned.getAttribute(\"href\") ?? cloned.getAttribute(\"xlink:href\");\n if (!href)\n return [];\n const [svgUrl, id] = href.split(\"#\");\n if (id) {\n const query = `#${id}`;\n const definition = context.shadowRoots.reduce(\n (res, root) => {\n return res ?? root.querySelector(`svg ${query}`);\n },\n ownerDocument?.querySelector(`svg ${query}`)\n );\n if (svgUrl) {\n cloned.setAttribute(\"href\", query);\n }\n if (svgDefsElement?.querySelector(query))\n return [];\n if (definition) {\n svgDefsElement?.appendChild(definition.cloneNode(true));\n return [];\n } else if (svgUrl) {\n return [\n contextFetch(context, {\n url: svgUrl,\n responseType: \"text\"\n }).then((svgData) => {\n svgDefsElement?.insertAdjacentHTML(\"beforeend\", svgData);\n })\n ];\n }\n }\n return [];\n}\n\nfunction embedNode(cloned, context) {\n const { tasks } = context;\n if (isElementNode(cloned)) {\n if (isImageElement(cloned) || isSVGImageElementNode(cloned)) {\n tasks.push(...embedImageElement(cloned, context));\n }\n if (isSVGUseElementNode(cloned)) {\n tasks.push(...embedSvgUse(cloned, context));\n }\n }\n if (isHTMLElementNode(cloned)) {\n tasks.push(...embedCssStyleImage(cloned.style, context));\n }\n cloned.childNodes.forEach((child) => {\n embedNode(child, context);\n });\n}\n\nasync function embedWebFont(clone, context) {\n const {\n ownerDocument,\n svgStyleElement,\n fontFamilies,\n fontCssTexts,\n tasks,\n font\n } = context;\n if (!ownerDocument || !svgStyleElement || !fontFamilies.size) {\n return;\n }\n if (font && font.cssText) {\n const cssText = filterPreferredFormat(font.cssText, context);\n svgStyleElement.appendChild(ownerDocument.createTextNode(`${cssText}\n`));\n } else {\n const styleSheets = Array.from(ownerDocument.styleSheets).filter((styleSheet) => {\n try {\n return \"cssRules\" in styleSheet && Boolean(styleSheet.cssRules.length);\n } catch (error) {\n context.log.warn(`Error while reading CSS rules from ${styleSheet.href}`, error);\n return false;\n }\n });\n await Promise.all(\n styleSheets.flatMap((styleSheet) => {\n return Array.from(styleSheet.cssRules).map(async (cssRule, index) => {\n if (isCSSImportRule(cssRule)) {\n let importIndex = index + 1;\n const baseUrl = cssRule.href;\n let cssText = \"\";\n try {\n cssText = await contextFetch(context, {\n url: baseUrl,\n requestType: \"text\",\n responseType: \"text\"\n });\n } catch (error) {\n context.log.warn(`Error fetch remote css import from ${baseUrl}`, error);\n }\n const replacedCssText = cssText.replace(\n URL_RE,\n (raw, quotation, url) => raw.replace(url, resolveUrl(url, baseUrl))\n );\n for (const rule of parseCss(replacedCssText)) {\n try {\n styleSheet.insertRule(\n rule,\n rule.startsWith(\"@import\") ? importIndex += 1 : styleSheet.cssRules.length\n );\n } catch (error) {\n context.log.warn(\"Error inserting rule from remote css import\", { rule, error });\n }\n }\n }\n });\n })\n );\n const cssRules = [];\n styleSheets.forEach((sheet) => {\n unwrapCssLayers(sheet.cssRules, cssRules);\n });\n cssRules.filter((cssRule) => isCssFontFaceRule(cssRule) && hasCssUrl(cssRule.style.getPropertyValue(\"src\")) && splitFontFamily(cssRule.style.getPropertyValue(\"font-family\"))?.some((val) => fontFamilies.has(val))).forEach((value) => {\n const rule = value;\n const cssText = fontCssTexts.get(rule.cssText);\n if (cssText) {\n svgStyleElement.appendChild(ownerDocument.createTextNode(`${cssText}\n`));\n } else {\n tasks.push(\n replaceCssUrlToDataUrl(\n rule.cssText,\n rule.parentStyleSheet ? rule.parentStyleSheet.href : null,\n context\n ).then((cssText2) => {\n cssText2 = filterPreferredFormat(cssText2, context);\n fontCssTexts.set(rule.cssText, cssText2);\n svgStyleElement.appendChild(ownerDocument.createTextNode(`${cssText2}\n`));\n })\n );\n }\n });\n }\n}\nconst COMMENTS_RE = /(\\/\\*[\\s\\S]*?\\*\\/)/g;\nconst KEYFRAMES_RE = /((@.*?keyframes [\\s\\S]*?){([\\s\\S]*?}\\s*?)})/gi;\nfunction parseCss(source) {\n if (source == null)\n return [];\n const result = [];\n let cssText = source.replace(COMMENTS_RE, \"\");\n while (true) {\n const matches = KEYFRAMES_RE.exec(cssText);\n if (!matches)\n break;\n result.push(matches[0]);\n }\n cssText = cssText.replace(KEYFRAMES_RE, \"\");\n const IMPORT_RE = /@import[\\s\\S]*?url\\([^)]*\\)[\\s\\S]*?;/gi;\n const UNIFIED_RE = new RegExp(\n // eslint-disable-next-line\n \"((\\\\s*?(?:\\\\/\\\\*[\\\\s\\\\S]*?\\\\*\\\\/)?\\\\s*?@media[\\\\s\\\\S]*?){([\\\\s\\\\S]*?)}\\\\s*?})|(([\\\\s\\\\S]*?){([\\\\s\\\\S]*?)})\",\n \"gi\"\n );\n while (true) {\n let matches = IMPORT_RE.exec(cssText);\n if (!matches) {\n matches = UNIFIED_RE.exec(cssText);\n if (!matches) {\n break;\n } else {\n IMPORT_RE.lastIndex = UNIFIED_RE.lastIndex;\n }\n } else {\n UNIFIED_RE.lastIndex = IMPORT_RE.lastIndex;\n }\n result.push(matches[0]);\n }\n return result;\n}\nconst URL_WITH_FORMAT_RE = /url\\([^)]+\\)\\s*format\\(([\"']?)([^\"']+)\\1\\)/g;\nconst FONT_SRC_RE = /src:\\s*(?:url\\([^)]+\\)\\s*format\\([^)]+\\)[,;]\\s*)+/g;\nfunction filterPreferredFormat(str, context) {\n const { font } = context;\n const preferredFormat = font ? font?.preferredFormat : void 0;\n return preferredFormat ? str.replace(FONT_SRC_RE, (match) => {\n while (true) {\n const [src, , format] = URL_WITH_FORMAT_RE.exec(match) || [];\n if (!format)\n return \"\";\n if (format === preferredFormat)\n return `src: ${src};`;\n }\n }) : str;\n}\nfunction unwrapCssLayers(rules, out = []) {\n for (const rule of Array.from(rules)) {\n if (isLayerBlockRule(rule)) {\n out.push(...unwrapCssLayers(rule.cssRules));\n } else if (\"cssRules\" in rule) {\n unwrapCssLayers(rule.cssRules, out);\n } else {\n out.push(rule);\n }\n }\n return out;\n}\n\nasync function domToForeignObjectSvg(node, options) {\n const context = await orCreateContext(node, options);\n if (isElementNode(context.node) && isSVGElementNode(context.node))\n return context.node;\n const {\n ownerDocument,\n log,\n tasks,\n svgStyleElement,\n svgDefsElement,\n svgStyles,\n font,\n progress,\n autoDestruct,\n onCloneNode,\n onEmbedNode,\n onCreateForeignObjectSvg\n } = context;\n log.time(\"clone node\");\n const clone = await cloneNode(context.node, context, true);\n if (svgStyleElement && ownerDocument) {\n let allCssText = \"\";\n svgStyles.forEach((klasses, cssText) => {\n allCssText += `${klasses.join(\",\\n\")} {\n ${cssText}\n}\n`;\n });\n svgStyleElement.appendChild(ownerDocument.createTextNode(allCssText));\n }\n log.timeEnd(\"clone node\");\n await onCloneNode?.(clone);\n if (font !== false && isElementNode(clone)) {\n log.time(\"embed web font\");\n await embedWebFont(clone, context);\n log.timeEnd(\"embed web font\");\n }\n log.time(\"embed node\");\n embedNode(clone, context);\n const count = tasks.length;\n let current = 0;\n const runTask = async () => {\n while (true) {\n const task = tasks.pop();\n if (!task)\n break;\n try {\n await task;\n } catch (error) {\n context.log.warn(\"Failed to run task\", error);\n }\n progress?.(++current, count);\n }\n };\n progress?.(current, count);\n await Promise.all([...Array.from({ length: 4 })].map(runTask));\n log.timeEnd(\"embed node\");\n await onEmbedNode?.(clone);\n const svg = createForeignObjectSvg(clone, context);\n svgDefsElement && svg.insertBefore(svgDefsElement, svg.children[0]);\n svgStyleElement && svg.insertBefore(svgStyleElement, svg.children[0]);\n autoDestruct && destroyContext(context);\n await onCreateForeignObjectSvg?.(svg);\n return svg;\n}\nfunction createForeignObjectSvg(clone, context) {\n const { width, height } = context;\n const svg = createSvg(width, height, clone.ownerDocument);\n const foreignObject = svg.ownerDocument.createElementNS(svg.namespaceURI, \"foreignObject\");\n foreignObject.setAttributeNS(null, \"x\", \"0%\");\n foreignObject.setAttributeNS(null, \"y\", \"0%\");\n foreignObject.setAttributeNS(null, \"width\", \"100%\");\n foreignObject.setAttributeNS(null, \"height\", \"100%\");\n foreignObject.append(clone);\n svg.appendChild(foreignObject);\n return svg;\n}\n\nasync function domToCanvas(node, options) {\n const context = await orCreateContext(node, options);\n const svg = await domToForeignObjectSvg(context);\n const dataUrl = svgToDataUrl(svg, context.isEnable(\"removeControlCharacter\"));\n if (!context.autoDestruct) {\n context.svgStyleElement = createStyleElement(context.ownerDocument);\n context.svgDefsElement = context.ownerDocument?.createElementNS(XMLNS, \"defs\");\n context.svgStyles.clear();\n }\n const image = createImage(dataUrl, svg.ownerDocument);\n return await imageToCanvas(image, context);\n}\n\nasync function domToBlob(node, options) {\n const context = await orCreateContext(node, options);\n const { log, type, quality, dpi } = context;\n const canvas = await domToCanvas(context);\n log.time(\"canvas to blob\");\n const blob = await canvasToBlob(canvas, type, quality);\n if ([\"image/png\", \"image/jpeg\"].includes(type) && dpi) {\n const arrayBuffer = await blobToArrayBuffer(blob.slice(0, 33));\n let uint8Array = new Uint8Array(arrayBuffer);\n if (type === \"image/png\") {\n uint8Array = changePngDpi(uint8Array, dpi);\n } else if (type === \"image/jpeg\") {\n uint8Array = changeJpegDpi(uint8Array, dpi);\n }\n log.timeEnd(\"canvas to blob\");\n return new Blob([uint8Array, blob.slice(33)], { type });\n }\n log.timeEnd(\"canvas to blob\");\n return blob;\n}\n\nasync function domToDataUrl(node, options) {\n const context = await orCreateContext(node, options);\n const { log, quality, type, dpi } = context;\n const canvas = await domToCanvas(context);\n log.time(\"canvas to data url\");\n let dataUrl = canvas.toDataURL(type, quality);\n if ([\"image/png\", \"image/jpeg\"].includes(type) && dpi && SUPPORT_ATOB && SUPPORT_BTOA) {\n const [format, body] = dataUrl.split(\",\");\n let headerLength = 0;\n let overwritepHYs = false;\n if (type === \"image/png\") {\n const b64Index = detectPhysChunkFromDataUrl(body);\n if (b64Index >= 0) {\n headerLength = Math.ceil((b64Index + 28) / 3) * 4;\n overwritepHYs = true;\n } else {\n headerLength = 33 / 3 * 4;\n }\n } else if (type === \"image/jpeg\") {\n headerLength = 18 / 3 * 4;\n }\n const stringHeader = body.substring(0, headerLength);\n const restOfData = body.substring(headerLength);\n const headerBytes = window.atob(stringHeader);\n const uint8Array = new Uint8Array(headerBytes.length);\n for (let i = 0; i < uint8Array.length; i++) {\n uint8Array[i] = headerBytes.charCodeAt(i);\n }\n const finalArray = type === \"image/png\" ? changePngDpi(uint8Array, dpi, overwritepHYs) : changeJpegDpi(uint8Array, dpi);\n const base64Header = window.btoa(String.fromCharCode(...finalArray));\n dataUrl = [format, \",\", base64Header, restOfData].join(\"\");\n }\n log.timeEnd(\"canvas to data url\");\n return dataUrl;\n}\n\nasync function domToSvg(node, options) {\n const context = await orCreateContext(node, options);\n const { width, height, ownerDocument } = context;\n const dataUrl = await domToDataUrl(context);\n const svg = createSvg(width, height, ownerDocument);\n const svgImage = svg.ownerDocument.createElementNS(svg.namespaceURI, \"image\");\n svgImage.setAttributeNS(null, \"href\", dataUrl);\n svgImage.setAttributeNS(null, \"height\", \"100%\");\n svgImage.setAttributeNS(null, \"width\", \"100%\");\n svg.appendChild(svgImage);\n return svgToDataUrl(svg, context.isEnable(\"removeControlCharacter\"));\n}\n\nasync function domToImage(node, options) {\n const context = await orCreateContext(node, options);\n const { ownerDocument, width, height, scale, type } = context;\n const url = type === \"image/svg+xml\" ? await domToSvg(context) : await domToDataUrl(context);\n const image = createImage(url, ownerDocument);\n image.width = Math.floor(width * scale);\n image.height = Math.floor(height * scale);\n image.style.width = `${width}px`;\n image.style.height = `${height}px`;\n return image;\n}\n\nasync function domToJpeg(node, options) {\n return domToDataUrl(\n await orCreateContext(node, { ...options, type: \"image/jpeg\" })\n );\n}\n\nasync function domToPixel(node, options) {\n const context = await orCreateContext(node, options);\n const canvas = await domToCanvas(context);\n return canvas.getContext(\"2d\").getImageData(0, 0, canvas.width, canvas.height).data;\n}\n\nasync function domToPng(node, options) {\n return domToDataUrl(\n await orCreateContext(node, { ...options, type: \"image/png\" })\n );\n}\n\nasync function domToWebp(node, options) {\n return domToDataUrl(\n await orCreateContext(node, { ...options, type: \"image/webp\" })\n );\n}\n\nexport { createContext, destroyContext, domToBlob, domToCanvas, domToDataUrl, domToForeignObjectSvg, domToImage, domToJpeg, domToPixel, domToPng, domToSvg, domToWebp, loadMedia, waitUntilLoad };\n","import { domToPng } from 'modern-screenshot'\n\n/** Filter out instruckt UI elements */\nfunction nodeFilter(node: HTMLElement): boolean {\n if (node.getAttribute?.('data-instruckt')) return false\n return true\n}\n\n// ── Screen Capture API fallback ──────────────────────────────\n\nlet activeStream: MediaStream | null = null\n\nasync function getStream(): Promise<MediaStream> {\n if (activeStream && activeStream.active) return activeStream\n activeStream = await navigator.mediaDevices.getDisplayMedia({\n video: { displaySurface: 'browser' },\n preferCurrentTab: true,\n } as any)\n activeStream.getVideoTracks()[0].addEventListener('ended', () => {\n activeStream = null\n })\n return activeStream\n}\n\nasync function grabFrame(stream: MediaStream): Promise<ImageBitmap> {\n const video = document.createElement('video')\n video.srcObject = stream\n video.muted = true\n await video.play()\n await new Promise(r => requestAnimationFrame(() => requestAnimationFrame(r)))\n const bitmap = await createImageBitmap(video)\n video.pause()\n video.srcObject = null\n return bitmap\n}\n\nfunction captureRectFromStream(stream: MediaStream, rect: DOMRect): Promise<string> {\n return grabFrame(stream).then(bitmap => {\n const dpr = window.devicePixelRatio || 1\n const canvas = document.createElement('canvas')\n canvas.width = rect.width * dpr\n canvas.height = rect.height * dpr\n const ctx = canvas.getContext('2d')!\n ctx.drawImage(\n bitmap,\n rect.x * dpr, rect.y * dpr,\n rect.width * dpr, rect.height * dpr,\n 0, 0, canvas.width, canvas.height,\n )\n bitmap.close()\n return canvas.toDataURL('image/png')\n })\n}\n\n// ── Public API ───────────────────────────────────────────────\n\n/** Capture a DOM element as a base64 PNG data URL */\nexport async function captureElement(el: Element): Promise<string | null> {\n // Try modern-screenshot first (no permission needed)\n try {\n const dataUrl = await domToPng(el as HTMLElement, {\n scale: 2,\n filter: nodeFilter,\n })\n if (dataUrl) return dataUrl\n } catch { /* fall through */ }\n // Fall back to Screen Capture API (works on shadow DOM / Flux)\n try {\n const stream = await getStream()\n return await captureRectFromStream(stream, el.getBoundingClientRect())\n } catch (err) {\n console.warn('[instruckt] captureElement failed:', err)\n return null\n }\n}\n\n/** Capture a rectangular region of the viewport as a base64 PNG data URL */\nexport async function captureRegion(rect: DOMRect): Promise<string | null> {\n // Try modern-screenshot first (no permission needed)\n try {\n const full = await domToPng(document.body, {\n scale: 2,\n filter: nodeFilter,\n })\n if (full) return await cropImage(full, rect)\n } catch { /* fall through */ }\n // Fall back to Screen Capture API (works on shadow DOM / Flux)\n try {\n const stream = await getStream()\n return await captureRectFromStream(stream, rect)\n } catch (err) {\n console.warn('[instruckt] captureRegion failed:', err)\n return null\n }\n}\n\n/** Crop a data URL image to a rectangle */\nfunction cropImage(dataUrl: string, rect: DOMRect): Promise<string> {\n return new Promise((resolve, reject) => {\n const img = new Image()\n img.onload = () => {\n const ratio = 2\n const canvas = document.createElement('canvas')\n canvas.width = rect.width * ratio\n canvas.height = rect.height * ratio\n const ctx = canvas.getContext('2d')!\n ctx.drawImage(\n img,\n rect.x * ratio, rect.y * ratio,\n rect.width * ratio, rect.height * ratio,\n 0, 0,\n rect.width * ratio, rect.height * ratio,\n )\n resolve(canvas.toDataURL('image/png'))\n }\n img.onerror = reject\n img.src = dataUrl\n })\n}\n\n/** Interactive region selector — returns the selected DOMRect or null if cancelled */\nexport function selectRegion(): Promise<DOMRect | null> {\n return new Promise((resolve) => {\n const overlay = document.createElement('div')\n Object.assign(overlay.style, {\n position: 'fixed',\n inset: '0',\n zIndex: '2147483647',\n cursor: 'crosshair',\n background: 'rgba(0,0,0,0.1)',\n })\n overlay.setAttribute('data-instruckt', 'region-select')\n\n const box = document.createElement('div')\n Object.assign(box.style, {\n position: 'fixed',\n border: '2px dashed #6366f1',\n background: 'rgba(99,102,241,0.08)',\n borderRadius: '4px',\n display: 'none',\n pointerEvents: 'none',\n })\n overlay.appendChild(box)\n\n let startX = 0, startY = 0, dragging = false\n\n const onMouseDown = (e: MouseEvent) => {\n startX = e.clientX\n startY = e.clientY\n dragging = true\n box.style.display = 'block'\n updateBox(e)\n }\n\n const onMouseMove = (e: MouseEvent) => {\n if (!dragging) return\n updateBox(e)\n }\n\n const updateBox = (e: MouseEvent) => {\n const x = Math.min(startX, e.clientX)\n const y = Math.min(startY, e.clientY)\n const w = Math.abs(e.clientX - startX)\n const h = Math.abs(e.clientY - startY)\n Object.assign(box.style, {\n left: `${x}px`,\n top: `${y}px`,\n width: `${w}px`,\n height: `${h}px`,\n })\n }\n\n const onMouseUp = (e: MouseEvent) => {\n if (!dragging) return\n dragging = false\n const x = Math.min(startX, e.clientX)\n const y = Math.min(startY, e.clientY)\n const w = Math.abs(e.clientX - startX)\n const h = Math.abs(e.clientY - startY)\n cleanup()\n if (w < 10 || h < 10) {\n resolve(null)\n } else {\n resolve(new DOMRect(x, y, w, h))\n }\n }\n\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n cleanup()\n resolve(null)\n }\n }\n\n const cleanup = () => {\n overlay.remove()\n document.removeEventListener('keydown', onKeyDown, true)\n }\n\n overlay.addEventListener('mousedown', onMouseDown)\n overlay.addEventListener('mousemove', onMouseMove)\n overlay.addEventListener('mouseup', onMouseUp)\n document.addEventListener('keydown', onKeyDown, true)\n document.body.appendChild(overlay)\n })\n}\n","import type { Annotation, PendingAnnotation } from '../types'\nimport { POPUP_CSS } from './styles'\nimport { captureElement } from './screenshot'\n\ninterface PopupResult {\n comment: string\n screenshot?: string\n}\n\ninterface PopupCallbacks {\n onSubmit: (result: PopupResult) => void\n onCancel: () => void\n}\n\ninterface EditCallbacks {\n onSave: (annotation: Annotation, newComment: string) => void\n onDelete: (annotation: Annotation) => void\n}\n\n/** Resolve screenshot URL from annotation data */\nfunction screenshotUrl(screenshot: string | undefined, endpoint?: string): string | null {\n if (!screenshot) return null\n if (screenshot.startsWith('data:')) return screenshot\n // Backend path like \"screenshots/01ABC.png\" — serve via endpoint\n const base = endpoint ?? '/instruckt'\n return `${base}/${screenshot}`\n}\n\nfunction esc(s: string): string {\n return String(s ?? '').replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"')\n}\n\n/** Annotation popup — rendered in its own shadow DOM for CSS isolation */\nexport class AnnotationPopup {\n private host: HTMLElement | null = null\n private shadow: ShadowRoot | null = null\n\n // ── New annotation popup ──────────────────────────────────────\n\n showNew(pending: PendingAnnotation, callbacks: PopupCallbacks): void {\n this.destroy()\n this.host = document.createElement('div')\n this.host.setAttribute('data-instruckt', 'popup')\n this.stopHostPropagation(this.host)\n this.shadow = this.host.attachShadow({ mode: 'open' })\n\n const style = document.createElement('style')\n style.textContent = POPUP_CSS\n this.shadow.appendChild(style)\n\n const popup = document.createElement('div')\n popup.className = 'popup'\n\n const fwBadge = pending.framework\n ? `<div class=\"fw-badge\">${esc(pending.framework.component)}</div>`\n : ''\n const selText = pending.selectedText\n ? `<div class=\"selected-text\">\"${esc(pending.selectedText.slice(0, 80))}\"</div>`\n : ''\n const hasScreenshot = !!pending.screenshot\n\n popup.innerHTML = `\n <div class=\"header\">\n <span class=\"element-tag\" title=\"${esc(pending.elementPath)}\">${esc(pending.elementLabel)}</span>\n <button class=\"close-btn\" title=\"Cancel (Esc)\">✕</button>\n </div>\n ${fwBadge}${selText}\n <div class=\"screenshot-slot\">${hasScreenshot\n ? `<div class=\"screenshot-preview\"><img src=\"${pending.screenshot}\" alt=\"Screenshot\" /><button class=\"screenshot-remove\" title=\"Remove screenshot\">✕</button></div>`\n : `<button class=\"btn-capture\" data-action=\"capture\"><svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z\"/><circle cx=\"12\" cy=\"13\" r=\"4\"/></svg> Capture screenshot</button>`\n }</div>\n <textarea placeholder=\"${hasScreenshot ? 'Add a note (optional)' : 'What needs to change here?'}\" rows=\"3\"></textarea>\n <div class=\"actions\">\n <button class=\"btn-secondary\" data-action=\"cancel\">Cancel</button>\n <button class=\"btn-primary\" data-action=\"submit\" ${hasScreenshot ? '' : 'disabled'}>Add note</button>\n </div>\n `\n\n let currentScreenshot = pending.screenshot ?? null\n const textarea = popup.querySelector('textarea')!\n const submitBtn = popup.querySelector<HTMLButtonElement>('[data-action=\"submit\"]')!\n const screenshotSlot = popup.querySelector('.screenshot-slot')!\n\n const updateSubmitState = () => {\n submitBtn.disabled = !currentScreenshot && textarea.value.trim().length === 0\n }\n\n const attachScreenshotEvents = () => {\n // Capture button\n const captureBtn = screenshotSlot.querySelector('[data-action=\"capture\"]')\n captureBtn?.addEventListener('click', async () => {\n captureBtn.textContent = 'Capturing...'\n const dataUrl = await captureElement(pending.element)\n if (dataUrl) {\n currentScreenshot = dataUrl\n screenshotSlot.innerHTML = `<div class=\"screenshot-preview\"><img src=\"${dataUrl}\" alt=\"Screenshot\" /><button class=\"screenshot-remove\" title=\"Remove screenshot\">✕</button></div>`\n textarea.placeholder = 'Add a note (optional)'\n attachScreenshotEvents()\n updateSubmitState()\n } else {\n captureBtn.textContent = 'Capture failed'\n setTimeout(() => { if (captureBtn.parentElement) captureBtn.innerHTML = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z\"/><circle cx=\"12\" cy=\"13\" r=\"4\"/></svg> Capture screenshot` }, 1500)\n }\n })\n\n // Remove button\n const removeBtn = screenshotSlot.querySelector('.screenshot-remove')\n removeBtn?.addEventListener('click', () => {\n currentScreenshot = null\n screenshotSlot.innerHTML = `<button class=\"btn-capture\" data-action=\"capture\"><svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z\"/><circle cx=\"12\" cy=\"13\" r=\"4\"/></svg> Capture screenshot</button>`\n textarea.placeholder = 'What needs to change here?'\n attachScreenshotEvents()\n updateSubmitState()\n })\n }\n\n attachScreenshotEvents()\n\n textarea.addEventListener('input', updateSubmitState)\n textarea.addEventListener('keydown', (e) => {\n // Stop ALL keyboard events from reaching page forms (React, Inertia, etc.)\n e.stopPropagation()\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n if (!submitBtn.disabled) submitBtn.click()\n }\n if (e.key === 'Escape') { callbacks.onCancel(); this.destroy() }\n })\n\n popup.querySelector('[data-action=\"cancel\"]')!.addEventListener('click', () => {\n callbacks.onCancel(); this.destroy()\n })\n popup.querySelector('.close-btn')!.addEventListener('click', () => {\n callbacks.onCancel(); this.destroy()\n })\n submitBtn.addEventListener('click', () => {\n const comment = textarea.value.trim()\n if (!comment && !currentScreenshot) return\n callbacks.onSubmit({ comment: comment || '(screenshot)', screenshot: currentScreenshot ?? undefined })\n this.destroy()\n })\n\n this.shadow.appendChild(popup)\n ;(document.getElementById('instruckt-root') ?? document.body).appendChild(this.host)\n\n this.positionHost(pending.x, pending.y)\n this.setupOutsideClick()\n textarea.focus()\n }\n\n // ── Edit existing annotation ──────────────────────────────────\n\n showEdit(annotation: Annotation, callbacks: EditCallbacks, endpoint?: string): void {\n this.destroy()\n this.host = document.createElement('div')\n this.host.setAttribute('data-instruckt', 'popup')\n this.stopHostPropagation(this.host)\n this.shadow = this.host.attachShadow({ mode: 'open' })\n\n const style = document.createElement('style')\n style.textContent = POPUP_CSS\n this.shadow.appendChild(style)\n\n const popup = document.createElement('div')\n popup.className = 'popup'\n\n const fwBadge = annotation.framework\n ? `<div class=\"fw-badge\">${esc(annotation.framework.component)}</div>`\n : ''\n const ssUrl = screenshotUrl(annotation.screenshot, endpoint)\n const screenshotPreview = ssUrl\n ? `<div class=\"screenshot-preview screenshot-slot\"><img src=\"${ssUrl}\" alt=\"Screenshot\" /><button class=\"screenshot-remove\" title=\"Remove screenshot\">✕</button></div>`\n : ''\n const commentText = annotation.comment === '(screenshot)' ? '' : annotation.comment\n\n popup.innerHTML = `\n <div class=\"header\">\n <span class=\"element-tag\" title=\"${esc(annotation.elementPath)}\">${esc(annotation.element)}</span>\n <button class=\"close-btn\">✕</button>\n </div>\n ${fwBadge}${screenshotPreview}\n <textarea rows=\"3\">${esc(commentText)}</textarea>\n <div class=\"actions\">\n <button class=\"btn-danger\" data-action=\"delete\">Remove</button>\n <button class=\"btn-primary\" data-action=\"save\">Save</button>\n </div>\n `\n\n popup.querySelector('.close-btn')!.addEventListener('click', () => this.destroy())\n\n // Screenshot remove button\n const ssRemoveBtn = popup.querySelector('.screenshot-remove')\n ssRemoveBtn?.addEventListener('click', () => {\n callbacks.onSave(annotation, annotation.comment)\n // Remove screenshot visually\n const slot = popup.querySelector('.screenshot-slot')\n if (slot) slot.remove()\n })\n\n const textarea = popup.querySelector('textarea')!\n const saveBtn = popup.querySelector<HTMLButtonElement>('[data-action=\"save\"]')!\n const deleteBtn = popup.querySelector<HTMLButtonElement>('[data-action=\"delete\"]')!\n\n textarea.addEventListener('keydown', (e) => {\n e.stopPropagation()\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n saveBtn.click()\n }\n if (e.key === 'Escape') this.destroy()\n })\n\n saveBtn.addEventListener('click', () => {\n const newComment = textarea.value.trim()\n if (!newComment) return\n callbacks.onSave(annotation, newComment)\n this.destroy()\n })\n\n deleteBtn.addEventListener('click', () => {\n callbacks.onDelete(annotation)\n this.destroy()\n })\n\n this.shadow.appendChild(popup)\n ;(document.getElementById('instruckt-root') ?? document.body).appendChild(this.host)\n\n // Position near the marker\n const markerX = (annotation.x / 100) * window.innerWidth\n const markerY = annotation.y - window.scrollY\n this.positionHost(markerX, markerY)\n this.setupOutsideClick()\n textarea.focus()\n textarea.setSelectionRange(textarea.value.length, textarea.value.length)\n }\n\n // ── Helpers ───────────────────────────────────────────────────\n\n /** Prevent popup interactions from reaching page handlers (e.g. @click.outside, form submit) */\n private stopHostPropagation(host: HTMLElement): void {\n for (const evt of ['click', 'mousedown', 'pointerdown', 'keydown', 'keyup', 'keypress', 'submit'] as const) {\n host.addEventListener(evt, (e) => e.stopPropagation())\n }\n }\n\n private positionHost(x: number, y: number): void {\n if (!this.host) return\n // Use popover=\"manual\" to render in the top layer (above native popovers)\n this.host.setAttribute('popover', 'manual')\n try { this.host.showPopover() } catch { /* fallback to z-index */ }\n Object.assign(this.host.style, { position: 'fixed', zIndex: '2147483647', left: '-9999px', top: '0' })\n\n requestAnimationFrame(() => {\n if (!this.host) return\n const w = 340 + 20\n const h = this.host.querySelector('.popup')?.getBoundingClientRect().height ?? 300\n const vw = window.innerWidth\n const vh = window.innerHeight\n const left = Math.max(10, Math.min(x + 10, vw - w))\n const top = Math.max(10, Math.min(y + 10, vh - h - 10))\n Object.assign(this.host.style, { left: `${left}px`, top: `${top}px` })\n })\n }\n\n private boundOutside = (e: MouseEvent): void => {\n if (this.host && !this.host.contains(e.target as Node)) {\n this.destroy()\n }\n }\n\n private setupOutsideClick(): void {\n setTimeout(() => document.addEventListener('mousedown', this.boundOutside), 0)\n }\n\n destroy(): void {\n this.host?.remove()\n this.host = null\n this.shadow = null\n document.removeEventListener('mousedown', this.boundOutside)\n }\n}\n","import type { Annotation } from '../types'\n\ntype MarkerClickHandler = (annotation: Annotation) => void\n\ninterface MarkerEl {\n el: HTMLElement\n annotationId: string\n}\n\n/** Manages numbered annotation pins rendered directly on the page */\nexport class AnnotationMarkers {\n private container: HTMLElement\n private markers: Map<string, MarkerEl> = new Map()\n\n constructor(private readonly onClick: MarkerClickHandler) {\n // Fixed-position container over the page, pointer-events passthrough\n this.container = document.createElement('div')\n Object.assign(this.container.style, {\n position: 'fixed',\n inset: '0',\n pointerEvents: 'none',\n zIndex: '2147483645',\n })\n this.container.setAttribute('data-instruckt', 'markers')\n const root = document.getElementById('instruckt-root') ?? document.body\n root.appendChild(this.container)\n }\n\n /** Add or update a marker for an annotation */\n upsert(annotation: Annotation, index: number): void {\n const existing = this.markers.get(annotation.id)\n\n if (existing) {\n this.updateStyle(existing.el, annotation)\n return\n }\n\n const el = document.createElement('div')\n const ssClass = annotation.screenshot ? ' has-screenshot' : ''\n el.className = `ik-marker ${this.statusClass(annotation.status)}${ssClass}`\n el.textContent = String(index)\n el.title = annotation.comment === '(screenshot)' ? 'Screenshot' : annotation.comment.slice(0, 60)\n el.style.pointerEvents = 'all'\n\n // Position: annotation.x is % of viewport width, annotation.y is px from top (scroll-adjusted)\n // Convert back to viewport-relative for fixed positioning\n el.style.left = `${(annotation.x / 100) * window.innerWidth}px`\n el.style.top = `${annotation.y - window.scrollY}px`\n\n el.addEventListener('click', (e) => {\n e.stopPropagation()\n this.onClick(annotation)\n })\n\n this.container.appendChild(el)\n this.markers.set(annotation.id, { el, annotationId: annotation.id })\n }\n\n /** Update an existing marker after its annotation status changed */\n update(annotation: Annotation): void {\n const marker = this.markers.get(annotation.id)\n if (!marker) return\n this.updateStyle(marker.el, annotation)\n }\n\n private updateStyle(el: HTMLElement, annotation: Annotation): void {\n const ssClass = annotation.screenshot ? ' has-screenshot' : ''\n el.className = `ik-marker ${this.statusClass(annotation.status)}${ssClass}`\n el.title = annotation.comment === '(screenshot)' ? 'Screenshot' : annotation.comment.slice(0, 60)\n }\n\n private statusClass(status: string): string {\n if (status === 'resolved') return 'resolved'\n if (status === 'dismissed') return 'dismissed'\n return ''\n }\n\n /** Reposition all markers (e.g. after scroll or resize) */\n reposition(annotations: Annotation[]): void {\n annotations.forEach(annotation => {\n const marker = this.markers.get(annotation.id)\n if (!marker) return\n marker.el.style.left = `${(annotation.x / 100) * window.innerWidth}px`\n marker.el.style.top = `${annotation.y - window.scrollY}px`\n })\n }\n\n remove(annotationId: string): void {\n const marker = this.markers.get(annotationId)\n if (!marker) return\n marker.el.remove()\n this.markers.delete(annotationId)\n }\n\n /** Show or hide all markers */\n setVisible(visible: boolean): void {\n this.container.style.display = visible ? '' : 'none'\n }\n\n /** Remove all markers without destroying the container */\n clear(): void {\n for (const { el } of this.markers.values()) {\n el.remove()\n }\n this.markers.clear()\n }\n\n destroy(): void {\n this.container.remove()\n this.markers.clear()\n }\n}\n","/**\n * CSS selector and element path generation.\n * Produces unique, grep-able selectors for any DOM element.\n */\n\n/** Build a unique CSS selector for an element */\nexport function getElementSelector(el: Element): string {\n if (el.id) {\n return `#${CSS.escape(el.id)}`\n }\n\n const path: string[] = []\n let current: Element | null = el\n\n while (current && current !== document.documentElement) {\n const tag = current.tagName.toLowerCase()\n const parent: Element | null = current.parentElement\n\n if (!parent) {\n path.unshift(tag)\n break\n }\n\n // Try unique class combo\n const classes = Array.from(current.classList)\n .filter(c => !c.match(/^(hover|focus|active|visited|is-|has-)/)) // skip state classes\n .slice(0, 3)\n\n if (classes.length > 0) {\n const classSelector = `${tag}.${classes.map(CSS.escape).join('.')}`\n const matches = parent.querySelectorAll(classSelector)\n if (matches.length === 1) {\n path.unshift(classSelector)\n break\n }\n }\n\n // Fall back to nth-child\n const siblings = Array.from(parent.children).filter((c: Element) => c.tagName === current!.tagName)\n if (siblings.length === 1) {\n path.unshift(tag)\n } else {\n const index = siblings.indexOf(current) + 1\n path.unshift(`${tag}:nth-of-type(${index})`)\n }\n\n current = parent\n }\n\n return path.join(' > ')\n}\n\n/** Short element identifier for markdown output (grep-friendly) */\nexport function getElementName(el: Element): string {\n const tag = el.tagName.toLowerCase()\n\n const wireModel = el.getAttribute('wire:model') || el.getAttribute('wire:click')\n if (wireModel) return `${tag}[wire:${wireModel.split('.')[0]}]`\n\n if (el.id) return `${tag}#${el.id}`\n\n const firstClass = el.classList[0]\n if (firstClass) return `${tag}.${firstClass}`\n\n return tag\n}\n\n/** Human-readable HTML-like label for the popup UI */\nexport function getElementLabel(el: Element): string {\n const tag = el.tagName.toLowerCase()\n const text = (el.textContent || '').trim().replace(/\\s+/g, ' ').slice(0, 40)\n\n // Build a short opening tag with key attributes\n const attrs: string[] = []\n if (el.id) attrs.push(`id=\"${el.id}\"`)\n const role = el.getAttribute('role')\n if (role) attrs.push(`role=\"${role}\"`)\n const wireAttr = el.getAttribute('wire:model') || el.getAttribute('wire:click')\n if (wireAttr) attrs.push(`wire:${el.hasAttribute('wire:model') ? 'model' : 'click'}=\"${wireAttr}\"`)\n\n const attrStr = attrs.length ? ' ' + attrs.join(' ') : ''\n const openTag = `<${tag}${attrStr}>`\n\n if (text) return `${openTag} ${text}`\n return openTag\n}\n\n/** Get nearby readable text for context */\nexport function getNearbyText(el: Element): string {\n const text = (el.textContent || '').trim().replace(/\\s+/g, ' ')\n return text.slice(0, 120)\n}\n\n/** CSS classes as a space-separated string, filtering noise */\nexport function getCssClasses(el: Element): string {\n return Array.from(el.classList)\n .filter(c => !c.match(/^(instruckt-)/)) // exclude our own classes\n .join(' ')\n}\n\n/** Get bounding box relative to the page */\nexport function getPageBoundingBox(el: Element): { x: number; y: number; width: number; height: number } {\n const rect = el.getBoundingClientRect()\n return {\n x: rect.left + window.scrollX,\n y: rect.top + window.scrollY,\n width: rect.width,\n height: rect.height,\n }\n}\n","import type { FrameworkContext } from '../types'\n\ndeclare global {\n interface Window {\n Livewire?: { find(id: string): unknown }\n }\n}\n\nexport function isAvailable(): boolean {\n return typeof window.Livewire !== 'undefined'\n}\n\n/** Walk up the DOM from el to find the nearest wire:id ancestor */\nexport function detect(el: Element): Element | null {\n let node: Element | null = el\n while (node && node !== document.documentElement) {\n if (node.getAttribute('wire:id')) return node\n node = node.parentElement\n }\n return null\n}\n\n/** Get Livewire component context for an element */\nexport function getContext(el: Element): FrameworkContext | null {\n if (!isAvailable()) return null\n\n const wireEl = detect(el)\n if (!wireEl) return null\n\n const wireId = wireEl.getAttribute('wire:id')!\n\n // In Livewire v3+, component metadata lives in the wire:snapshot attribute\n let componentName = 'Unknown'\n let className: string | undefined\n const snapshotAttr = wireEl.getAttribute('wire:snapshot')\n if (snapshotAttr) {\n try {\n const snapshot = JSON.parse(snapshotAttr)\n componentName = snapshot?.memo?.name ?? 'Unknown'\n // The snapshot memo may contain the full class name\n className = snapshot?.memo?.path ?? snapshot?.memo?.name\n } catch {\n // malformed snapshot\n }\n }\n\n return {\n framework: 'livewire',\n component: componentName,\n wire_id: wireId,\n class_name: className,\n }\n}\n","import type { FrameworkContext } from '../types'\n\ninterface VueInstance {\n $options?: { name?: string; __name?: string; __file?: string }\n type?: { name?: string; __name?: string; __file?: string }\n uid?: number\n props?: Record<string, unknown>\n setupState?: Record<string, unknown>\n parent?: VueInstance\n}\n\ninterface VueElement extends Element {\n __vue__?: VueInstance\n __vueParentComponent?: VueInstance\n _vei?: unknown\n}\n\nexport function isAvailable(): boolean {\n // Vue 3: mounts with data-v-app attribute; Vue 2: exposes global Vue constructor\n return !!(document.querySelector('[data-v-app]') || (window as unknown as Record<string, unknown>)['Vue'])\n}\n\n/** Check if a Vue instance's file path points to user code */\nfunction isUserFile(file: string | undefined): boolean {\n if (!file) return false\n return !file.includes('node_modules')\n}\n\nfunction getInstanceFile(instance: VueInstance): string | undefined {\n return instance.type?.__file ?? instance.$options?.__file\n}\n\nfunction getInstanceName(instance: VueInstance): string {\n return (\n instance.$options?.name ??\n instance.$options?.__name ??\n instance.type?.name ??\n instance.type?.__name ??\n 'Anonymous'\n )\n}\n\n/**\n * Walk up the DOM to find the best Vue component.\n * Prefers user-land components (not from node_modules) over library components.\n */\nexport function detect(el: Element): VueInstance | null {\n let firstMatch: VueInstance | null = null\n let node: VueElement | null = el as VueElement\n\n while (node && node !== document.documentElement) {\n const instance = node.__vueParentComponent ?? node.__vue__\n if (instance) {\n const file = getInstanceFile(instance)\n\n // If this is a user component, return immediately\n if (isUserFile(file)) return instance\n\n // Keep the first match as fallback\n if (!firstMatch) firstMatch = instance\n }\n node = node.parentElement as VueElement | null\n }\n\n // If no user component found via DOM walk, try walking the Vue parent chain\n // from the first match (reaches components that don't own a DOM element)\n if (firstMatch?.parent) {\n let instance: VueInstance | undefined = firstMatch.parent\n while (instance) {\n const file = getInstanceFile(instance)\n if (isUserFile(file)) return instance\n instance = instance.parent\n }\n }\n\n return firstMatch\n}\n\n/** Get Vue component context for an element */\nexport function getContext(el: Element): FrameworkContext | null {\n const instance = detect(el)\n if (!instance) return null\n\n const name = getInstanceName(instance)\n\n const data: Record<string, unknown> = {}\n\n // Vue 3 props\n if (instance.props) {\n Object.assign(data, instance.props)\n }\n\n // Vue 3 setup state (public reactive refs)\n if (instance.setupState) {\n for (const [key, value] of Object.entries(instance.setupState)) {\n if (!key.startsWith('_') && typeof value !== 'function') {\n try {\n data[key] = JSON.parse(JSON.stringify(value))\n } catch {\n data[key] = String(value)\n }\n }\n }\n }\n\n const file = getInstanceFile(instance)\n\n return {\n framework: 'vue',\n component: name,\n source_file: file,\n component_uid: instance.uid !== undefined ? String(instance.uid) : undefined,\n data,\n }\n}\n","import type { FrameworkContext } from '../types'\n\ninterface SvelteMeta {\n loc?: { file?: string }\n ctx?: unknown[]\n}\n\ninterface SvelteElement extends Element {\n __svelte_meta?: SvelteMeta\n __svelte?: unknown\n}\n\n/** Walk up DOM to find nearest Svelte component element */\nexport function detect(el: Element): SvelteMeta | null {\n let node: SvelteElement | null = el as SvelteElement\n while (node && node !== document.documentElement) {\n if (node.__svelte_meta) return node.__svelte_meta\n node = node.parentElement as SvelteElement | null\n }\n return null\n}\n\n/** Get Svelte component context for an element */\nexport function getContext(el: Element): FrameworkContext | null {\n const meta = detect(el)\n if (!meta) return null\n\n // Extract component name from file path e.g. \"/src/components/Button.svelte\" → \"Button\"\n const filePath = meta.loc?.file ?? ''\n const component = filePath\n ? filePath.split('/').pop()?.replace(/\\.svelte$/, '') ?? 'Unknown'\n : 'Unknown'\n\n return {\n framework: 'svelte',\n component,\n source_file: filePath || undefined,\n data: filePath ? { file: filePath } : undefined,\n }\n}\n","import type { FrameworkContext } from '../types'\n\ninterface DebugSource {\n fileName: string\n lineNumber: number\n columnNumber?: number\n}\n\ninterface ReactFiber {\n type: unknown\n memoizedProps: Record<string, unknown> | null\n pendingProps: Record<string, unknown> | null\n return: ReactFiber | null\n key: string | null\n _debugSource?: DebugSource\n _debugOwner?: ReactFiber\n}\n\ninterface ReactElement extends Element {\n [key: string]: unknown\n}\n\nfunction getFiberKey(el: Element): string | null {\n for (const key of Object.keys(el)) {\n if (key.startsWith('__reactFiber$') || key.startsWith('__reactInternalInstance$')) {\n return key\n }\n }\n return null\n}\n\n/** Check if a debug source points to user code (not node_modules) */\nfunction isUserSource(source: DebugSource | undefined): boolean {\n if (!source) return false\n return !source.fileName.includes('node_modules')\n}\n\n/** Check if a fiber is a user-land component (not from a library) */\nfunction isUserComponent(fiber: ReactFiber): boolean {\n const { type } = fiber\n if (typeof type !== 'function' && typeof type !== 'object') return false\n\n // If debug source is available, use it to check\n if (fiber._debugSource) {\n return isUserSource(fiber._debugSource)\n }\n\n return true\n}\n\ninterface ComponentInfo {\n name: string\n source?: DebugSource\n}\n\n/**\n * Walk up the fiber tree to find the best component match.\n * Prefers user-land components (not from node_modules) over library components.\n * Falls back to the first named component if no user component is found.\n */\nfunction findComponent(fiber: ReactFiber): ComponentInfo {\n let firstMatch: ComponentInfo | null = null\n let node: ReactFiber | null = fiber\n\n while (node) {\n const { type } = node\n let name: string | null = null\n\n if (typeof type === 'function' && (type as { name?: string }).name) {\n const n = (type as { name: string }).name\n if (n[0] === n[0].toUpperCase() && n.length > 1) name = n\n }\n if (!name && typeof type === 'object' && type !== null && (type as { displayName?: string }).displayName) {\n name = (type as { displayName: string }).displayName\n }\n\n if (name) {\n const info: ComponentInfo = { name, source: node._debugSource }\n\n // If this is a user-land component, return it immediately\n if (isUserSource(node._debugSource)) return info\n\n // Keep the first match as fallback\n if (!firstMatch) firstMatch = info\n }\n\n node = node.return\n }\n\n return firstMatch ?? { name: 'Component' }\n}\n\nfunction getProps(fiber: ReactFiber): Record<string, unknown> {\n const props = fiber.memoizedProps ?? fiber.pendingProps ?? {}\n const result: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(props)) {\n if (k === 'children' || typeof v === 'function') continue\n try {\n result[k] = JSON.parse(JSON.stringify(v))\n } catch {\n result[k] = String(v)\n }\n }\n return result\n}\n\nexport function isAvailable(): boolean {\n // React attaches fiber data to DOM nodes with __reactFiber$ prefix\n const root = document.getElementById('root') ?? document.getElementById('app') ?? document.body.firstElementChild\n if (!root) return false\n return getFiberKey(root) !== null\n}\n\nexport function getContext(el: Element): FrameworkContext | null {\n let node: Element | null = el\n while (node && node !== document.documentElement) {\n const key = getFiberKey(node)\n if (key) {\n const fiber = (node as ReactElement)[key] as ReactFiber\n if (fiber) {\n const { name, source } = findComponent(fiber)\n const data = getProps(fiber)\n return {\n framework: 'react',\n component: name,\n source_file: source?.fileName,\n source_line: source?.lineNumber,\n data,\n }\n }\n }\n node = node.parentElement\n }\n return null\n}\n","import type { FrameworkContext } from '../types'\n\ninterface BladeViewEntry {\n name: string\n file: string\n}\n\n/** Check if the server injected Blade view tracking data */\nexport function isAvailable(): boolean {\n return document.getElementById('instruckt-views') !== null\n}\n\n/** Get all tracked Blade views from the server-injected script tag */\nfunction getTrackedViews(): BladeViewEntry[] {\n const el = document.getElementById('instruckt-views')\n if (!el) return []\n\n try {\n return JSON.parse(el.textContent ?? '[]')\n } catch {\n return []\n }\n}\n\n/**\n * Get Blade view context for an element.\n *\n * Since Blade templates compile to flat HTML (no component boundaries in the DOM),\n * we use the server-injected view list to identify the most likely template.\n * The heuristic: the last non-layout view is usually the page-level template\n * that rendered the element.\n */\nexport function getContext(_el: Element): FrameworkContext | null {\n const views = getTrackedViews()\n if (views.length === 0) return null\n\n // Pick the most specific view (last one that isn't a layout/component partial)\n // Layouts are typically first, page views come after\n const pageView = views.length > 1\n ? views.find(v => !v.name.startsWith('layouts.') && !v.name.startsWith('components.')) ?? views[views.length - 1]\n : views[0]\n\n return {\n framework: 'blade',\n component: pageView.name,\n source_file: pageView.file,\n data: { views: views.map(v => v.file) },\n }\n}\n","import type { Annotation, InstrucktConfig, PendingAnnotation } from './types'\nimport { InstrucktApi } from './api'\nimport type { AnnotationPayload } from './api'\nimport { Toolbar } from './ui/toolbar'\nimport { ElementHighlight } from './ui/highlight'\nimport { AnnotationPopup } from './ui/popup'\nimport { AnnotationMarkers } from './ui/markers'\nimport { injectGlobalStyles } from './ui/styles'\nimport { getElementSelector, getElementName, getElementLabel, getNearbyText, getCssClasses, getPageBoundingBox } from './selector'\nimport { captureElement, captureRegion, selectRegion } from './ui/screenshot'\nimport * as livewireAdapter from './adapters/livewire'\nimport * as vueAdapter from './adapters/vue'\nimport * as svelteAdapter from './adapters/svelte'\nimport * as reactAdapter from './adapters/react'\nimport * as bladeAdapter from './adapters/blade'\n\n// Re-export for api.ts consumers\nexport type { AnnotationPayload }\n\n/** Normalize URL to pathname for page-scoping (ignore query/hash) */\nfunction pageKey(): string {\n return window.location.pathname\n}\n\nexport class Instruckt {\n private config: Required<Pick<InstrucktConfig, 'endpoint' | 'theme' | 'position'>> & InstrucktConfig\n private api: InstrucktApi\n private toolbar: Toolbar | null = null\n private highlight: ElementHighlight | null = null\n private popup: AnnotationPopup | null = null\n private markers: AnnotationMarkers | null = null\n private annotations: Annotation[] = []\n private isAnnotating = false\n private isFrozen = false\n private frozenStyleEl: HTMLStyleElement | null = null\n private frozenPopovers: { el: HTMLElement; original: string }[] = []\n private rafId: number | null = null\n private pendingMouseTarget: Element | null = null\n private highlightLocked = false\n private pollTimer: ReturnType<typeof setInterval> | null = null\n private boundKeydown: (e: KeyboardEvent) => void\n private boundReposition = (): void => {\n this.markers?.reposition(this.annotations)\n }\n\n constructor(config: InstrucktConfig) {\n this.config = {\n adapters: ['livewire', 'vue', 'svelte', 'react', 'blade'],\n theme: 'auto',\n position: 'bottom-right',\n ...config,\n }\n this.api = new InstrucktApi(config.endpoint)\n this.boundKeydown = this.onKeydown.bind(this)\n this.init()\n }\n\n private init(): void {\n injectGlobalStyles(this.config.colors)\n\n if (this.config.theme !== 'auto') {\n document.documentElement.setAttribute('data-instruckt-theme', this.config.theme)\n }\n\n this.toolbar = new Toolbar(this.config.position, {\n onToggleAnnotate: (active) => {\n this.setAnnotating(active)\n },\n onFreezeAnimations: (frozen) => {\n this.setFrozen(frozen)\n },\n onScreenshot: () => this.startRegionCapture(),\n onCopy: () => this.copyToClipboard(true),\n onClearPage: () => this.clearPage(),\n onClearAll: () => this.clearEverything(),\n onMinimize: (min) => this.onMinimize(min),\n }, this.config.keys)\n\n this.highlight = new ElementHighlight()\n this.popup = new AnnotationPopup()\n this.markers = new AnnotationMarkers((annotation) => this.onMarkerClick(annotation))\n\n document.addEventListener('keydown', this.boundKeydown)\n window.addEventListener('scroll', this.boundReposition, { passive: true })\n window.addEventListener('resize', this.boundReposition, { passive: true })\n\n // Survive SPA navigation across frameworks\n document.addEventListener('livewire:navigated', () => this.reattach())\n document.addEventListener('inertia:navigate', () => this.syncMarkers())\n window.addEventListener('popstate', () => {\n setTimeout(() => this.reattach(), 0)\n })\n\n // Load persisted annotations from the backend\n this.loadAnnotations()\n\n this.syncMarkers()\n }\n\n private makeToolbarCallbacks() {\n return {\n onToggleAnnotate: (active: boolean) => {\n this.setAnnotating(active)\n },\n onFreezeAnimations: (frozen: boolean) => {\n this.setFrozen(frozen)\n },\n onScreenshot: () => this.startRegionCapture(),\n onCopy: () => this.copyToClipboard(true),\n onClearPage: () => this.clearPage(),\n onClearAll: () => this.clearEverything(),\n onMinimize: (min: boolean) => this.onMinimize(min),\n }\n }\n\n private reattach(): void {\n const wasAnnotating = this.isAnnotating\n const wasFrozen = this.isFrozen\n const wasMinimized = this.toolbar?.isMinimized() ?? false\n\n // Detach current listeners before rebuilding\n if (this.isAnnotating) this.detachAnnotateListeners()\n if (this.isFrozen) this.setFrozen(false)\n this.isAnnotating = false\n this.isFrozen = false\n\n // Remove any stale instruckt DOM (Livewire caches and restores old HTML on back nav)\n document.querySelectorAll('[data-instruckt]').forEach(el => el.remove())\n\n // Rebuild everything fresh\n this.toolbar = new Toolbar(this.config.position, this.makeToolbarCallbacks())\n if (wasMinimized) this.toolbar.minimize()\n\n this.markers = new AnnotationMarkers((annotation) => this.onMarkerClick(annotation))\n this.highlight = new ElementHighlight()\n\n if (wasMinimized) this.markers.setVisible(false)\n\n // Re-inject global styles (Livewire may have swapped <head> content)\n const existing = document.getElementById('instruckt-global')\n if (existing) existing.remove()\n injectGlobalStyles(this.config.colors)\n\n this.syncMarkers()\n\n // Restore active modes\n if (wasAnnotating && !wasMinimized) this.setAnnotating(true)\n }\n\n // ── Minimize ────────────────────────────────────────────────────\n\n private onMinimize(minimized: boolean): void {\n if (minimized) {\n // Deactivate everything when minimized\n if (this.isAnnotating) this.setAnnotating(false)\n if (this.isFrozen) this.setFrozen(false)\n this.toolbar?.setAnnotateActive(false)\n this.toolbar?.setFreezeActive(false)\n this.markers?.setVisible(false)\n this.popup?.destroy()\n } else {\n // Show markers again when restored\n this.markers?.setVisible(true)\n }\n }\n\n // ── Persistence ─────────────────────────────────────────────────\n\n private static STORAGE_KEY = 'instruckt:annotations'\n\n private async loadAnnotations(): Promise<void> {\n // Always load localStorage first as baseline\n this.loadFromStorage()\n\n try {\n const remote = await this.api.getAnnotations()\n // Merge: remote is source of truth, but keep any local-only annotations\n const remoteIds = new Set(remote.map(a => a.id))\n const localOnly = this.annotations.filter(a => !remoteIds.has(a.id))\n this.annotations = [...remote, ...localOnly]\n this.saveToStorage()\n } catch {\n // No backend — localStorage already loaded above\n }\n this.syncMarkers()\n }\n\n private saveToStorage(): void {\n try {\n localStorage.setItem(Instruckt.STORAGE_KEY, JSON.stringify(this.annotations))\n } catch { /* storage full or unavailable */ }\n }\n\n private loadFromStorage(): void {\n try {\n const raw = localStorage.getItem(Instruckt.STORAGE_KEY)\n if (raw) this.annotations = JSON.parse(raw)\n } catch { /* corrupt or unavailable */ }\n }\n\n /** Start or stop polling based on whether there are active annotations */\n private updatePolling(): void {\n const hasActive = this.totalActiveCount() > 0\n if (hasActive && !this.pollTimer) {\n this.pollTimer = setInterval(() => this.pollForChanges(), 3000)\n } else if (!hasActive && this.pollTimer) {\n clearInterval(this.pollTimer)\n this.pollTimer = null\n }\n }\n\n /** Poll API for status changes (e.g. agent resolved via MCP) */\n private async pollForChanges(): Promise<void> {\n try {\n const remote = await this.api.getAnnotations()\n let changed = false\n for (const r of remote) {\n const local = this.annotations.find(a => a.id === r.id)\n if (local && local.status !== r.status) {\n local.status = r.status\n local.resolvedAt = r.resolvedAt\n local.resolvedBy = r.resolvedBy\n changed = true\n }\n }\n if (changed) {\n this.saveToStorage()\n this.syncMarkers()\n }\n } catch { /* no backend or network error — skip */ }\n }\n\n // ── Page-scoped markers ─────────────────────────────────────────\n\n private syncMarkers(): void {\n this.markers?.clear()\n const current = pageKey()\n let idx = 0\n for (const a of this.annotations) {\n if (a.status === 'resolved' || a.status === 'dismissed') continue\n if (this.annotationPageKey(a) === current) {\n idx++\n this.markers?.upsert(a, idx)\n }\n }\n this.toolbar?.setAnnotationCount(this.pageAnnotations().length)\n this.toolbar?.setTotalCount(this.totalActiveCount())\n this.updatePolling()\n }\n\n private annotationPageKey(a: Annotation): string {\n try {\n return new URL(a.url).pathname\n } catch {\n return a.url\n }\n }\n\n private pageAnnotations(): Annotation[] {\n const current = pageKey()\n return this.annotations.filter(a =>\n this.annotationPageKey(a) === current &&\n a.status !== 'resolved' && a.status !== 'dismissed'\n )\n }\n\n private totalActiveCount(): number {\n return this.annotations.filter(a => a.status !== 'resolved' && a.status !== 'dismissed').length\n }\n\n // ── Annotate mode ─────────────────────────────────────────────\n\n private setAnnotating(active: boolean): void {\n this.isAnnotating = active\n this.toolbar?.setAnnotateActive(active)\n if (active) {\n this.attachAnnotateListeners()\n } else {\n this.detachAnnotateListeners()\n this.highlight?.hide()\n if (this.rafId !== null) { cancelAnimationFrame(this.rafId); this.rafId = null }\n }\n // When frozen, toggle pointer-events based on annotate state\n this.updateFreezeStyles()\n }\n\n // ── Freeze mode ──────────────────────────────────────────────\n\n private setFrozen(frozen: boolean): void {\n this.isFrozen = frozen\n this.toolbar?.setFreezeActive(frozen)\n if (frozen) {\n this.updateFreezeStyles()\n this.freezePopovers()\n // Use window (not document) so we intercept before Livewire/Alpine handlers\n // on document. Capture on window fires before capture on document.\n for (const evt of this.freezeBlockEvents) {\n window.addEventListener(evt, this.boundFreezeClick, true)\n }\n window.addEventListener('submit', this.boundFreezeSubmit, true)\n // Block events that close dropdowns/popovers (window capture to beat frameworks)\n for (const evt of this.freezePassiveEvents) {\n window.addEventListener(evt, this.boundFreezePassive, true)\n }\n } else {\n this.frozenStyleEl?.remove()\n this.frozenStyleEl = null\n this.unfreezePopovers()\n for (const evt of this.freezeBlockEvents) {\n window.removeEventListener(evt, this.boundFreezeClick, true)\n }\n window.removeEventListener('submit', this.boundFreezeSubmit, true)\n for (const evt of this.freezePassiveEvents) {\n window.removeEventListener(evt, this.boundFreezePassive, true)\n }\n }\n }\n\n /** Pull open popovers out of the top layer so the rest of the page is clickable */\n private freezePopovers(): void {\n this.frozenPopovers = []\n const openSelector = ':popover-open, .\\\\:popover-open'\n document.querySelectorAll('[popover]').forEach((el) => {\n const htmlEl = el as HTMLElement\n const val = htmlEl.getAttribute('popover') ?? ''\n let isOpen = false\n try { isOpen = htmlEl.matches(openSelector) } catch {\n try { isOpen = htmlEl.matches('.\\\\:popover-open') } catch { /* ignore */ }\n }\n if (!isOpen) return\n // Save position before removing popover attribute\n const rect = htmlEl.getBoundingClientRect()\n this.frozenPopovers.push({ el: htmlEl, original: val })\n // Remove popover attribute — pulls element out of top layer\n htmlEl.removeAttribute('popover')\n // Keep it visible with inline styles\n htmlEl.style.setProperty('display', 'block', 'important')\n htmlEl.style.setProperty('position', 'fixed', 'important')\n htmlEl.style.setProperty('z-index', '2147483644', 'important')\n htmlEl.style.setProperty('top', `${rect.top}px`, 'important')\n htmlEl.style.setProperty('left', `${rect.left}px`, 'important')\n htmlEl.style.setProperty('width', `${rect.width}px`, 'important')\n // Add the polyfill class so Flux thinks it's still open\n htmlEl.classList.add(':popover-open')\n })\n }\n\n /** Restore popover attributes */\n private unfreezePopovers(): void {\n for (const { el, original } of this.frozenPopovers) {\n // Remove inline overrides\n for (const prop of ['display', 'position', 'z-index', 'top', 'left', 'width']) {\n el.style.removeProperty(prop)\n }\n el.classList.remove(':popover-open')\n el.setAttribute('popover', original || 'auto')\n }\n this.frozenPopovers = []\n }\n\n private freezeBlockEvents = ['click', 'mousedown', 'pointerdown', 'pointerup', 'mouseup', 'touchstart', 'touchend', 'auxclick'] as const\n private freezePassiveEvents = ['focusin', 'focusout', 'blur', 'pointerleave', 'mouseleave', 'mouseout'] as const\n\n /** Update freeze CSS — pointer-events only blocked when NOT annotating */\n private updateFreezeStyles(): void {\n if (!this.isFrozen) return\n this.frozenStyleEl?.remove()\n this.frozenStyleEl = document.createElement('style')\n this.frozenStyleEl.id = 'instruckt-freeze'\n const pointerBlock = this.isAnnotating ? '' : `\n a[href], a[wire\\\\:navigate], [wire\\\\:click], [wire\\\\:navigate],\n [x-on\\\\:click], [@click], [v-on\\\\:click], [onclick],\n button, input[type=\"submit\"], select, [role=\"button\"], [role=\"link\"],\n [tabindex] {\n pointer-events: none !important;\n cursor: not-allowed !important;\n }\n `\n this.frozenStyleEl.textContent = `\n *, *::before, *::after {\n animation-play-state: paused !important;\n transition: none !important;\n }\n video { filter: none !important; }\n ${pointerBlock}\n `\n document.head.appendChild(this.frozenStyleEl)\n }\n\n /** Block interactions on the page when frozen (except instruckt UI) */\n private boundFreezeClick = (e: Event): void => {\n if (this.isInstruckt(e.target)) return\n // When annotating, only let 'click' through (annotate handler needs it).\n // Always block mousedown/pointerdown/touchstart to prevent framework\n // handlers (Alpine @click.outside, Livewire wire:navigate) from firing.\n if (this.isAnnotating && e.type === 'click') return\n e.preventDefault()\n e.stopPropagation()\n e.stopImmediatePropagation()\n }\n\n private boundFreezeSubmit = (e: Event): void => {\n e.preventDefault()\n e.stopPropagation()\n e.stopImmediatePropagation()\n }\n\n /** Block focus/hover events that JS dropdowns use to auto-close.\n * Block ALL of these — even on instruckt elements — because frameworks\n * like Flux check if focusin target is contained in the popover and\n * close it if it's not (e.g. focus moved to our popup textarea). */\n private boundFreezePassive = (e: Event): void => {\n e.stopPropagation()\n e.stopImmediatePropagation()\n }\n\n // ── Event listeners ───────────────────────────────────────────\n\n private boundMouseMove = (e: MouseEvent): void => {\n if (this.highlightLocked) return\n this.pendingMouseTarget = e.target as Element\n if (this.rafId === null) {\n this.rafId = requestAnimationFrame(() => {\n this.rafId = null\n if (this.highlightLocked) return\n if (this.pendingMouseTarget && !this.isInstruckt(this.pendingMouseTarget)) {\n this.highlight?.show(this.pendingMouseTarget)\n } else {\n this.highlight?.hide()\n }\n })\n }\n }\n\n private boundMouseLeave = (): void => {\n if (this.highlightLocked) return\n this.highlight?.hide()\n }\n\n /** Block mousedown/pointerdown in annotation mode so SPA frameworks can't navigate */\n private boundAnnotateBlock = (e: Event): void => {\n if (this.isInstruckt(e.target)) return\n e.preventDefault()\n e.stopPropagation()\n e.stopImmediatePropagation()\n }\n\n private boundClick = (e: MouseEvent): void => {\n const target = e.target as Element\n if (this.isInstruckt(target)) return\n // Always block clicks in annotation mode — prevents SPA navigation\n // from changing the page before the user can finish their note.\n e.preventDefault()\n e.stopPropagation()\n e.stopImmediatePropagation()\n\n const selectedText = window.getSelection()?.toString().trim() || undefined\n const elementPath = getElementSelector(target)\n const elementName = getElementName(target)\n const elementLabel = getElementLabel(target)\n const cssClasses = getCssClasses(target)\n const nearbyText = getNearbyText(target) || undefined\n const boundingBox = getPageBoundingBox(target)\n const framework = this.detectFramework(target) ?? undefined\n\n this.highlight?.show(target)\n this.highlightLocked = true\n\n const pending: PendingAnnotation = {\n element: target,\n elementPath,\n elementName,\n elementLabel,\n cssClasses,\n boundingBox,\n x: e.clientX,\n y: e.clientY,\n selectedText,\n nearbyText,\n framework,\n }\n\n this.showAnnotationPopup(pending)\n }\n\n private showAnnotationPopup(pending: PendingAnnotation): void {\n this.popup?.showNew(pending, {\n onSubmit: (result) => {\n this.highlightLocked = false\n this.highlight?.hide()\n this.submitAnnotation(pending, result.comment, result.screenshot)\n },\n onCancel: () => {\n this.highlightLocked = false\n this.highlight?.hide()\n },\n })\n }\n\n private attachAnnotateListeners(): void {\n document.addEventListener('mousemove', this.boundMouseMove)\n document.addEventListener('mouseleave', this.boundMouseLeave)\n // Block mousedown/pointerdown first — SPA frameworks (Livewire wire:navigate,\n // Inertia) intercept these before click fires\n for (const evt of ['mousedown', 'pointerdown'] as const) {\n window.addEventListener(evt, this.boundAnnotateBlock, true)\n }\n // Use window capture to fire before framework handlers on document\n window.addEventListener('click', this.boundClick, true)\n }\n\n private detachAnnotateListeners(): void {\n document.removeEventListener('mousemove', this.boundMouseMove)\n document.removeEventListener('mouseleave', this.boundMouseLeave)\n for (const evt of ['mousedown', 'pointerdown'] as const) {\n window.removeEventListener(evt, this.boundAnnotateBlock, true)\n }\n window.removeEventListener('click', this.boundClick, true)\n }\n\n private isInstruckt(el: EventTarget | null): boolean {\n if (!el || !(el instanceof Element)) return false\n return el.closest('[data-instruckt]') !== null\n }\n\n // ── Region screenshot ────────────────────────────────────────\n\n private async startRegionCapture(): Promise<void> {\n // Temporarily exit annotation mode so the crosshair doesn't interfere\n const wasAnnotating = this.isAnnotating\n if (wasAnnotating) this.setAnnotating(false)\n\n const rect = await selectRegion()\n if (!rect) {\n if (wasAnnotating) this.setAnnotating(true)\n return\n }\n\n const screenshot = await captureRegion(rect)\n if (!screenshot) {\n if (wasAnnotating) this.setAnnotating(true)\n return\n }\n\n // Find the element at the center of the selected region\n const centerX = rect.x + rect.width / 2\n const centerY = rect.y + rect.height / 2\n const target = document.elementFromPoint(centerX, centerY) ?? document.body\n\n const pending: PendingAnnotation = {\n element: target,\n elementPath: getElementSelector(target),\n elementName: getElementName(target),\n elementLabel: getElementLabel(target),\n cssClasses: getCssClasses(target),\n boundingBox: getPageBoundingBox(target),\n x: centerX,\n y: centerY,\n nearbyText: getNearbyText(target) || undefined,\n screenshot,\n framework: this.detectFramework(target) ?? undefined,\n }\n\n this.showAnnotationPopup(pending)\n }\n\n // ── Framework detection ───────────────────────────────────────\n\n private detectFramework(el: Element) {\n const adapters = this.config.adapters ?? []\n if (adapters.includes('livewire')) {\n const ctx = livewireAdapter.getContext(el)\n if (ctx) return ctx\n }\n if (adapters.includes('vue')) {\n const ctx = vueAdapter.getContext(el)\n if (ctx) return ctx\n }\n if (adapters.includes('svelte')) {\n const ctx = svelteAdapter.getContext(el)\n if (ctx) return ctx\n }\n if (adapters.includes('react')) {\n const ctx = reactAdapter.getContext(el)\n if (ctx) return ctx\n }\n // Blade is last — it's a fallback when no JS framework claims the element\n if (adapters.includes('blade')) {\n const ctx = bladeAdapter.getContext(el)\n if (ctx) return ctx\n }\n return null\n }\n\n // ── Submit ────────────────────────────────────────────────────\n\n private async submitAnnotation(pending: PendingAnnotation, comment: string, screenshot?: string): Promise<void> {\n const payload: AnnotationPayload = {\n x: (pending.x / window.innerWidth) * 100,\n y: pending.y + window.scrollY,\n comment,\n element: pending.elementName,\n elementPath: pending.elementPath,\n cssClasses: pending.cssClasses,\n boundingBox: pending.boundingBox,\n selectedText: pending.selectedText,\n nearbyText: pending.nearbyText,\n screenshot,\n intent: 'fix',\n severity: 'important',\n framework: pending.framework,\n url: window.location.href,\n }\n\n let annotation: Annotation\n try {\n annotation = await this.api.addAnnotation(payload)\n } catch {\n // No backend — create a local-only annotation\n annotation = {\n ...payload,\n id: crypto.randomUUID(),\n status: 'pending',\n createdAt: new Date().toISOString(),\n }\n }\n this.annotations.push(annotation)\n this.saveToStorage()\n this.syncMarkers()\n this.config.onAnnotationAdd?.(annotation)\n this.copyAnnotations()\n }\n\n // ── Marker click — edit or delete ─────────────────────────────\n\n private onMarkerClick(annotation: Annotation): void {\n this.popup?.showEdit(annotation, {\n onSave: async (a, newComment) => {\n try {\n const updated = await this.api.updateAnnotation(a.id, { comment: newComment })\n this.onAnnotationUpdated(updated)\n } catch {\n // No backend — update locally\n this.onAnnotationUpdated({ ...a, comment: newComment, updatedAt: new Date().toISOString() })\n }\n },\n onDelete: async (a) => {\n try {\n await this.api.updateAnnotation(a.id, { status: 'dismissed' })\n } catch { /* no backend — just remove locally */ }\n this.removeAnnotation(a.id)\n },\n }, this.config.endpoint)\n }\n\n private onAnnotationUpdated(updated: Annotation): void {\n const idx = this.annotations.findIndex(a => a.id === updated.id)\n if (idx >= 0) {\n this.annotations[idx] = updated\n }\n this.saveToStorage()\n this.syncMarkers()\n }\n\n private removeAnnotation(id: string): void {\n this.annotations = this.annotations.filter(a => a.id !== id)\n this.saveToStorage()\n this.syncMarkers()\n }\n\n // ── Clear ───────────────────────────────────────────────────────\n\n private async clearPage(): Promise<void> {\n const page = this.pageAnnotations()\n for (const a of page) {\n try {\n await this.api.updateAnnotation(a.id, { status: 'dismissed' })\n } catch { /* best effort */ }\n }\n this.annotations = this.annotations.filter(a => !page.includes(a))\n this.saveToStorage()\n this.syncMarkers()\n }\n\n private async clearEverything(): Promise<void> {\n const active = this.annotations.filter(a => a.status !== 'resolved' && a.status !== 'dismissed')\n for (const a of active) {\n try {\n await this.api.updateAnnotation(a.id, { status: 'dismissed' })\n } catch { /* best effort */ }\n }\n this.annotations = []\n this.saveToStorage()\n this.syncMarkers()\n }\n\n // ── Keyboard ──────────────────────────────────────────────────\n\n private onKeydown(e: KeyboardEvent): void {\n if (this.toolbar?.isMinimized()) return\n const target = e.target as HTMLElement\n if (['INPUT', 'TEXTAREA', 'SELECT'].includes(target.tagName)) return\n if (target.closest('[contenteditable=\"true\"]')) return\n // Shadow DOM retargets e.target to the host element — check if a popup is open\n if (this.isInstruckt(target)) return\n\n const keys = this.config.keys ?? {}\n const noMod = !e.metaKey && !e.ctrlKey && !e.altKey\n if (e.key === (keys.annotate ?? 'a') && noMod) {\n this.setAnnotating(!this.isAnnotating)\n }\n if (e.key === (keys.freeze ?? 'f') && noMod) {\n this.setFrozen(!this.isFrozen)\n }\n if (e.key === (keys.screenshot ?? 'c') && noMod) {\n this.startRegionCapture()\n }\n if (e.key === (keys.clearPage ?? 'x') && noMod) {\n this.clearPage()\n }\n if (e.key === 'Escape') {\n if (this.isAnnotating) this.setAnnotating(false)\n if (this.isFrozen) this.setFrozen(false)\n }\n }\n\n // ── Copy / export ─────────────────────────────────────────────\n\n /** Auto-copy on annotation submit — only in secure contexts to avoid focus side-effects */\n private copyAnnotations(): void {\n this.copyToClipboard(false)\n }\n\n /** Copy to clipboard. With fallback=true, uses execCommand for non-secure contexts (user-initiated only). */\n private copyToClipboard(fallback: boolean): void {\n const md = this.exportMarkdown()\n if (window.isSecureContext) {\n navigator.clipboard.writeText(md).catch(() => { /* unavailable */ })\n } else if (fallback) {\n try {\n const el = document.createElement('textarea')\n el.value = md\n el.style.cssText = 'position:fixed;left:-9999px'\n document.body.appendChild(el)\n el.select()\n document.execCommand('copy')\n el.remove()\n } catch { /* unavailable */ }\n }\n }\n\n exportMarkdown(): string {\n const pending = this.annotations.filter(a => a.status !== 'resolved' && a.status !== 'dismissed')\n if (pending.length === 0) {\n return `# UI Feedback\\n\\nNo open annotations.`\n }\n\n // Group by page\n const byPage = new Map<string, Annotation[]>()\n for (const a of pending) {\n const key = this.annotationPageKey(a)\n if (!byPage.has(key)) byPage.set(key, [])\n byPage.get(key)!.push(a)\n }\n\n const multiPage = byPage.size > 1\n const lines: string[] = []\n\n if (multiPage) {\n lines.push(`# UI Feedback`)\n lines.push('')\n }\n\n for (const [path, annotations] of byPage) {\n if (multiPage) {\n lines.push(`## ${path}`)\n } else {\n lines.push(`# UI Feedback: ${path}`)\n }\n lines.push('')\n\n const hPrefix = multiPage ? '###' : '##'\n\n annotations.forEach((a, i) => {\n // Feedback-first heading with element context\n const componentSuffix = a.framework?.component ? ` in \\`${a.framework.component}\\`` : ''\n lines.push(`${hPrefix} ${i + 1}. ${a.comment}`)\n lines.push(`- ID: \\`${a.id}\\``)\n lines.push(`- Element: \\`${a.element}\\`${componentSuffix}`)\n\n // Source file path (resolved server-side or from framework dev mode)\n if (a.framework?.source_file) {\n const loc = a.framework.source_line ? `${a.framework.source_file}:${a.framework.source_line}` : a.framework.source_file\n lines.push(`- Source: \\`${loc}\\``)\n } else if (a.framework?.data?.file) {\n lines.push(`- File: \\`${a.framework.data.file}\\``)\n }\n\n if (a.cssClasses) {\n lines.push(`- Classes: \\`${a.cssClasses}\\``)\n }\n if (a.selectedText) {\n lines.push(`- Text: \"${a.selectedText}\"`)\n } else if (a.nearbyText) {\n lines.push(`- Text: \"${a.nearbyText.slice(0, 100)}\"`)\n }\n if (a.screenshot) {\n // If stored as a relative path (from backend), show the full path\n if (!a.screenshot.startsWith('data:')) {\n lines.push(`- Screenshot: \\`storage/app/_instruckt/${a.screenshot}\\``)\n } else {\n lines.push(`- Screenshot: attached`)\n }\n }\n lines.push('')\n })\n }\n\n // Add MCP instructions when a backend is configured\n const hasScreenshots = pending.some(a => a.screenshot && !a.screenshot.startsWith('data:'))\n lines.push('---')\n lines.push('')\n if (hasScreenshots) {\n lines.push('Use the `instruckt.get_screenshot` MCP tool to view screenshots. After making changes, use `instruckt.resolve` to mark each annotation as resolved.')\n } else {\n lines.push('After making changes, use the `instruckt.resolve` MCP tool to mark each annotation as resolved.')\n }\n\n return lines.join('\\n').trim()\n }\n\n // ── Public API ────────────────────────────────────────────────\n\n getAnnotations(): Annotation[] { return [...this.annotations] }\n\n destroy(): void {\n this.setAnnotating(false)\n this.setFrozen(false)\n document.removeEventListener('keydown', this.boundKeydown)\n window.removeEventListener('scroll', this.boundReposition)\n window.removeEventListener('resize', this.boundReposition)\n this.toolbar?.destroy()\n this.highlight?.destroy()\n this.popup?.destroy()\n this.markers?.destroy()\n if (this.rafId !== null) cancelAnimationFrame(this.rafId)\n if (this.pollTimer !== null) clearInterval(this.pollTimer)\n }\n}\n"],"mappings":"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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+K9B,IAAM;AAAA;AAAA,EAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyM5B,IAAM;AAAA;AAAA,EAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuB7B,SAAS,mBAAmB,QAAgD;AACjF,MAAI,SAAS,eAAe,kBAAkB,EAAG;AACjD,QAAM,OAAO,SACT,UAAU,OAAO,UAAU,yBAAyB,OAAO,OAAO,MAAM,EAAE,GAAG,OAAO,aAAa,4BAA4B,OAAO,UAAU,MAAM,EAAE,GAAG,OAAO,YAAY,2BAA2B,OAAO,SAAS,MAAM,EAAE;AAAA,IAC/N;AACJ,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,KAAK;AACX,QAAM,cAAc,OAAO,aAAa;AACxC,WAAS,KAAK,YAAY,KAAK;AACjC;;;AC9YA,IAAM,QAAQ;AAAA,EACZ,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,MAAM;AACR;AAEO,IAAM,UAAN,MAAc;AAAA,EAkBnB,YACmB,UACA,WACjB,MACA;AAHiB;AACA;AAfnB,SAAQ,WAAmC;AAI3C,SAAQ,iBAAiB;AACzB,SAAQ,eAAe;AACvB,SAAQ,YAAY;AACpB,SAAQ,aAAa;AACrB,SAAQ,WAAW;AACnB,SAAQ,aAAa,EAAE,GAAG,GAAG,GAAG,EAAE;AAShC,SAAK,OAAO,sBAAQ,CAAC;AACrB,SAAK,MAAM;AACX,SAAK,UAAU;AAAA,EACjB;AAAA,EAEQ,QAAc;AAxDxB,QAAAA,KAAA;AAyDI,SAAK,OAAO,SAAS,cAAc,KAAK;AACxC,SAAK,KAAK,aAAa,kBAAkB,SAAS;AAClD,SAAK,SAAS,KAAK,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAErD,UAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,UAAM,cAAc;AACpB,SAAK,OAAO,YAAY,KAAK;AAG7B,SAAK,YAAY,SAAS,cAAc,KAAK;AAC7C,SAAK,UAAU,YAAY;AAE3B,UAAM,IAAI,KAAK;AACf,SAAK,cAAc,KAAK,QAAQ,MAAM,UAAU,wBAAuBA,MAAA,EAAE,aAAF,OAAAA,MAAc,KAAK,YAAY,CAAC,KAAK,MAAM;AAChH,YAAM,OAAO,CAAC,KAAK;AACnB,WAAK,kBAAkB,IAAI;AAC3B,WAAK,UAAU,iBAAiB,IAAI;AAAA,IACtC,CAAC;AAED,SAAK,YAAY,KAAK,QAAQ,MAAM,QAAQ,kBAAiB,OAAE,WAAF,YAAY,KAAK,YAAY,CAAC,KAAK,MAAM;AACpG,YAAM,OAAO,CAAC,KAAK;AACnB,WAAK,gBAAgB,IAAI;AACzB,WAAK,UAAU,mBAAmB,IAAI;AAAA,IACxC,CAAC;AAED,UAAM,gBAAgB,KAAK,QAAQ,MAAM,YAAY,wBAAuB,OAAE,eAAF,YAAgB,KAAK,YAAY,CAAC,KAAK,MAAM;AACvH,WAAK,UAAU,aAAa;AAAA,IAC9B,CAAC;AAED,SAAK,UAAU,KAAK,QAAQ,MAAM,MAAM,gCAAgC,MAAM;AAC5E,WAAK,UAAU,OAAO;AACtB,WAAK,QAAQ,YAAY,MAAM;AAC/B,iBAAW,MAAM;AAAE,aAAK,QAAQ,YAAY,MAAM;AAAA,MAAK,GAAG,IAAI;AAAA,IAChE,CAAC;AAED,UAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,cAAU,YAAY;AAEtB,UAAM,WAAW,KAAK,QAAQ,MAAM,OAAO,sBAAqB,OAAE,cAAF,YAAe,KAAK,YAAY,CAAC,KAAK,MAAM;AA/FhH,UAAAA,KAAAC;AAgGM,OAAAA,OAAAD,MAAA,KAAK,WAAU,gBAAf,gBAAAC,IAAA,KAAAD;AAAA,IACF,CAAC;AACD,aAAS,UAAU,IAAI,YAAY;AAEnC,UAAM,cAAc,KAAK;AAAA,MACvB;AAAA,MACA;AAAA,MACA,MAAG;AAvGT,YAAAA,KAAAC;AAuGY,gBAAAA,OAAAD,MAAA,KAAK,WAAU,eAAf,gBAAAC,IAAA,KAAAD;AAAA;AAAA,IACR;AACA,gBAAY,UAAU,IAAI,cAAc,eAAe;AAEvD,cAAU,YAAY,QAAQ;AAC9B,cAAU,YAAY,WAAW;AAEjC,UAAM,cAAc,KAAK,QAAQ,MAAM,UAAU,oBAAoB,MAAM;AACzE,WAAK,aAAa,IAAI;AAAA,IACxB,CAAC;AACD,gBAAY,UAAU,IAAI,cAAc;AAExC,UAAM,QAAQ,MAAM;AAAE,YAAM,IAAI,SAAS,cAAc,KAAK;AAAG,QAAE,YAAY;AAAW,aAAO;AAAA,IAAE;AAEjG,SAAK,UAAU;AAAA,MACb,KAAK;AAAA,MAAa;AAAA,MAAe,MAAM;AAAA,MAAG,KAAK;AAAA,MAAW,MAAM;AAAA,MAChE,KAAK;AAAA,MAAS;AAAA,MAAW,MAAM;AAAA,MAAG;AAAA,IACpC;AACA,SAAK,OAAO,YAAY,KAAK,SAAS;AAGtC,SAAK,MAAM,SAAS,cAAc,QAAQ;AAC1C,SAAK,IAAI,YAAY;AACrB,SAAK,IAAI,QAAQ;AACjB,SAAK,IAAI,aAAa,cAAc,wBAAwB;AAC5D,SAAK,IAAI,YAAY,MAAM;AAC3B,SAAK,IAAI,MAAM,UAAU;AACzB,SAAK,IAAI,iBAAiB,SAAS,CAAC,MAAM;AACxC,QAAE,gBAAgB;AAClB,WAAK,aAAa,KAAK;AAAA,IACzB,CAAC;AACD,SAAK,OAAO,YAAY,KAAK,GAAG;AAKhC,SAAK,KAAK,iBAAiB,SAAS,CAAC,MAAM,EAAE,gBAAgB,CAAC;AAC9D,SAAK,KAAK,iBAAiB,aAAa,CAAC,MAAM,EAAE,gBAAgB,CAAC;AAClE,SAAK,KAAK,iBAAiB,eAAe,CAAC,MAAM,EAAE,gBAAgB,CAAC;AAEpE,SAAK,cAAc;AACnB,UAAM,QAAO,cAAS,eAAe,gBAAgB,MAAxC,YAA6C,SAAS;AACnE,SAAK,YAAY,KAAK,IAAI;AAAA,EAC5B;AAAA,EAEQ,QAAQ,UAAkB,SAAiB,SAAwC;AACzF,UAAM,MAAM,SAAS,cAAc,QAAQ;AAC3C,QAAI,YAAY;AAChB,QAAI,aAAa,gBAAgB,OAAO;AACxC,QAAI,aAAa,cAAc,OAAO;AACtC,QAAI,YAAY;AAChB,QAAI,iBAAiB,SAAS,CAAC,MAAM;AACnC,QAAE,gBAAgB;AAClB,cAAQ;AAAA,IACV,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEQ,gBAAsB;AAC5B,UAAM,IAAI;AACV,WAAO,OAAO,KAAK,KAAK,OAAO;AAAA,MAC7B,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,QAAQ,KAAK,SAAS,SAAS,QAAQ,IAAI,IAAI;AAAA,MAC/C,KAAK,KAAK,SAAS,SAAS,KAAK,IAAI,IAAI;AAAA,MACzC,OAAO,KAAK,SAAS,SAAS,OAAO,IAAI,IAAI;AAAA,MAC7C,MAAM,KAAK,SAAS,SAAS,MAAM,IAAI,IAAI;AAAA,IAC7C,CAAC;AAAA,EACH;AAAA,EAEQ,YAAkB;AACxB,SAAK,OAAO,iBAAiB,aAAa,CAAC,QAAQ;AACjD,YAAM,IAAI;AACV,UAAK,EAAE,OAAmB,QAAQ,MAAM,KAAM,EAAE,OAAmB,QAAQ,MAAM,EAAG;AACpF,WAAK,WAAW;AAChB,YAAM,OAAO,KAAK,KAAK,sBAAsB;AAC7C,WAAK,aAAa,EAAE,GAAG,EAAE,UAAU,KAAK,MAAM,GAAG,EAAE,UAAU,KAAK,IAAI;AACtE,QAAE,eAAe;AAAA,IACnB,CAAC;AAED,aAAS,iBAAiB,aAAa,CAAC,MAAM;AAC5C,UAAI,CAAC,KAAK,SAAU;AACpB,aAAO,OAAO,KAAK,KAAK,OAAO;AAAA,QAC7B,MAAM,GAAG,EAAE,UAAU,KAAK,WAAW,CAAC;AAAA,QACtC,KAAK,GAAG,EAAE,UAAU,KAAK,WAAW,CAAC;AAAA,QACrC,OAAO;AAAA,QACP,QAAQ;AAAA,MACV,CAAC;AAAA,IACH,CAAC;AAED,aAAS,iBAAiB,WAAW,MAAM;AAAE,WAAK,WAAW;AAAA,IAAM,CAAC;AAAA,EACtE;AAAA,EAEQ,aAAa,KAAoB;AApM3C,QAAAA,KAAA;AAqMI,SAAK,YAAY;AACjB,SAAK,UAAU,MAAM,UAAU,MAAM,SAAS;AAC9C,SAAK,IAAI,MAAM,UAAU,MAAM,KAAK;AACpC,SAAK,eAAe;AACpB,WAAAA,MAAA,KAAK,WAAU,eAAf,wBAAAA,KAA4B;AAAA,EAC9B;AAAA,EAEQ,iBAAuB;AA5MjC,QAAAA;AA6MI,QAAI,KAAK,aAAa,KAAK,KAAK,WAAW;AACzC,UAAI,CAAC,KAAK,UAAU;AAClB,aAAK,WAAW,SAAS,cAAc,MAAM;AAC7C,aAAK,SAAS,YAAY;AAC1B,aAAK,IAAI,YAAY,KAAK,QAAQ;AAAA,MACpC;AACA,WAAK,SAAS,cAAc,KAAK,aAAa,KAAK,QAAQ,OAAO,KAAK,UAAU;AAAA,IACnF,OAAO;AACL,OAAAA,MAAA,KAAK,aAAL,gBAAAA,IAAe;AACf,WAAK,WAAW;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,cAAuB;AACrB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,WAAiB;AACf,SAAK,YAAY;AACjB,SAAK,UAAU,MAAM,UAAU;AAC/B,SAAK,IAAI,MAAM,UAAU;AACzB,SAAK,eAAe;AAAA,EACtB;AAAA,EAEA,kBAAkB,QAAuB;AACvC,SAAK,iBAAiB;AACtB,SAAK,YAAY,UAAU,OAAO,UAAU,MAAM;AAClD,aAAS,KAAK,UAAU,OAAO,iBAAiB,MAAM;AAAA,EACxD;AAAA,EAEA,gBAAgB,QAAuB;AACrC,SAAK,eAAe;AACpB,SAAK,UAAU,UAAU,OAAO,UAAU,MAAM;AAAA,EAClD;AAAA;AAAA,EAGA,QAAQ,MAAyB;AAC/B,SAAK,kBAAkB,SAAS,YAAY;AAAA,EAC9C;AAAA,EAEA,mBAAmB,OAAqB;AACtC,QAAI,QAAQ,KAAK,YAAY,cAAc,QAAQ;AACnD,QAAI,QAAQ,GAAG;AACb,UAAI,CAAC,OAAO;AACV,gBAAQ,SAAS,cAAc,MAAM;AACrC,cAAM,YAAY;AAClB,aAAK,YAAY,YAAY,KAAK;AAAA,MACpC;AACA,YAAM,cAAc,QAAQ,KAAK,QAAQ,OAAO,KAAK;AAAA,IACvD,OAAO;AACL,qCAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,cAAc,OAAqB;AACjC,SAAK,aAAa;AAClB,SAAK,eAAe;AAAA,EACtB;AAAA,EAEA,UAAgB;AACd,SAAK,KAAK,OAAO;AACjB,aAAS,KAAK,UAAU,OAAO,eAAe;AAAA,EAChD;AACF;;;AC5QO,IAAM,mBAAN,MAAuB;AAAA,EAG5B,cAAc;AAJhB,QAAAE;AAKI,SAAK,KAAK,SAAS,cAAc,KAAK;AAEtC,WAAO,OAAO,KAAK,GAAG,OAAO;AAAA,MAC3B,UAAU;AAAA,MACV,eAAe;AAAA;AAAA,MACf,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,SAAS;AAAA,IACX,CAAC;AACD,SAAK,GAAG,aAAa,kBAAkB,WAAW;AAClD,UAAM,QAAOA,MAAA,SAAS,eAAe,gBAAgB,MAAxC,OAAAA,MAA6C,SAAS;AACnE,SAAK,YAAY,KAAK,EAAE;AAAA,EAC1B;AAAA,EAEA,KAAK,IAAmB;AACtB,UAAM,OAAO,GAAG,sBAAsB;AACtC,QAAI,KAAK,UAAU,KAAK,KAAK,WAAW,GAAG;AACzC,WAAK,KAAK;AACV;AAAA,IACF;AACA,WAAO,OAAO,KAAK,GAAG,OAAO;AAAA,MAC3B,SAAS;AAAA,MACT,MAAM,GAAG,KAAK,IAAI;AAAA,MAClB,KAAK,GAAG,KAAK,GAAG;AAAA,MAChB,OAAO,GAAG,KAAK,KAAK;AAAA,MACpB,QAAQ,GAAG,KAAK,MAAM;AAAA,IACxB,CAAC;AAAA,EACH;AAAA,EAEA,OAAa;AACX,SAAK,GAAG,MAAM,UAAU;AAAA,EAC1B;AAAA,EAEA,UAAgB;AACd,SAAK,GAAG,OAAO;AAAA,EACjB;AACF;;;AC5CA,SAAS,cAAc,YAAY,KAAK;AACtC,aAAW,EAAE,IAAI;AACjB,aAAW,EAAE,IAAI,OAAO;AACxB,aAAW,EAAE,IAAI,MAAM;AACvB,aAAW,EAAE,IAAI,OAAO;AACxB,aAAW,EAAE,IAAI,MAAM;AACvB,SAAO;AACT;AAEA,IAAM,KAAK,IAAI,WAAW,CAAC;AAC3B,IAAM,KAAK,IAAI,WAAW,CAAC;AAC3B,IAAM,KAAK,IAAI,WAAW,CAAC;AAC3B,IAAM,KAAK,IAAI,WAAW,CAAC;AAC3B,IAAI;AACJ,SAAS,qBAAqB;AAC5B,QAAM,WAAW,IAAI,WAAW,GAAG;AACnC,WAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,QAAI,IAAI;AACR,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAI,IAAI,IAAI,aAAa,MAAM,IAAI,MAAM;AAAA,IAC3C;AACA,aAAS,CAAC,IAAI;AAAA,EAChB;AACA,SAAO;AACT;AACA,SAAS,QAAQ,YAAY;AAC3B,MAAI,IAAI;AACR,MAAI,CAAC;AACH,mBAAe,mBAAmB;AACpC,WAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC1C,QAAI,cAAc,IAAI,WAAW,CAAC,KAAK,GAAG,IAAI,MAAM;AAAA,EACtD;AACA,SAAO,IAAI;AACb;AACA,SAAS,kBAAkB,YAAY;AACrC,QAAM,SAAS,WAAW,SAAS;AACnC,WAAS,IAAI,QAAQ,KAAK,GAAG,KAAK;AAChC,QAAI,WAAW,IAAI,CAAC,MAAM,KAAK,WAAW,IAAI,CAAC,MAAM,MAAM,WAAW,IAAI,CAAC,MAAM,MAAM,WAAW,IAAI,CAAC,MAAM,MAAM,WAAW,CAAC,MAAM,IAAI;AACvI,aAAO,IAAI;AAAA,IACb;AAAA,EACF;AACA,SAAO;AACT;AACA,SAAS,aAAa,YAAY,KAAK,gBAAgB,OAAO;AAC5D,QAAM,YAAY,IAAI,WAAW,EAAE;AACnC,SAAO;AACP,YAAU,CAAC,IAAI;AACf,YAAU,CAAC,IAAI;AACf,YAAU,CAAC,IAAI;AACf,YAAU,CAAC,IAAI;AACf,YAAU,CAAC,IAAI,QAAQ;AACvB,YAAU,CAAC,IAAI,QAAQ;AACvB,YAAU,CAAC,IAAI,QAAQ;AACvB,YAAU,CAAC,IAAI,MAAM;AACrB,YAAU,CAAC,IAAI,UAAU,CAAC;AAC1B,YAAU,CAAC,IAAI,UAAU,CAAC;AAC1B,YAAU,EAAE,IAAI,UAAU,CAAC;AAC3B,YAAU,EAAE,IAAI,UAAU,CAAC;AAC3B,YAAU,EAAE,IAAI;AAChB,QAAM,MAAM,QAAQ,SAAS;AAC7B,QAAM,WAAW,IAAI,WAAW,CAAC;AACjC,WAAS,CAAC,IAAI,QAAQ;AACtB,WAAS,CAAC,IAAI,QAAQ;AACtB,WAAS,CAAC,IAAI,QAAQ;AACtB,WAAS,CAAC,IAAI,MAAM;AACpB,MAAI,eAAe;AACjB,UAAM,gBAAgB,kBAAkB,UAAU;AAClD,eAAW,IAAI,WAAW,aAAa;AACvC,eAAW,IAAI,UAAU,gBAAgB,EAAE;AAC3C,WAAO;AAAA,EACT,OAAO;AACL,UAAM,cAAc,IAAI,WAAW,CAAC;AACpC,gBAAY,CAAC,IAAI;AACjB,gBAAY,CAAC,IAAI;AACjB,gBAAY,CAAC,IAAI;AACjB,gBAAY,CAAC,IAAI;AACjB,UAAM,cAAc,IAAI,WAAW,EAAE;AACrC,gBAAY,IAAI,YAAY,CAAC;AAC7B,gBAAY,IAAI,aAAa,EAAE;AAC/B,gBAAY,IAAI,WAAW,EAAE;AAC7B,gBAAY,IAAI,UAAU,EAAE;AAC5B,WAAO;AAAA,EACT;AACF;AACA,IAAM,oBAAoB;AAC1B,IAAM,oBAAoB;AAC1B,IAAM,oBAAoB;AAC1B,SAAS,2BAA2B,SAAS;AAC3C,MAAI,WAAW,QAAQ,QAAQ,iBAAiB;AAChD,MAAI,aAAa,IAAI;AACnB,eAAW,QAAQ,QAAQ,iBAAiB;AAAA,EAC9C;AACA,MAAI,aAAa,IAAI;AACnB,eAAW,QAAQ,QAAQ,iBAAiB;AAAA,EAC9C;AACA,SAAO;AACT;AAEA,IAAM,SAAS;AACf,IAAM,aAAa,OAAO,WAAW;AACrC,IAAM,qBAAqB,cAAc,YAAY;AACrD,IAAM,eAAe,cAAc,UAAU;AAC7C,IAAM,eAAe,cAAc,UAAU;AAtG7C;AAuGA,IAAM,aAAa,cAAa,YAAO,cAAP,mBAAkB,YAAY;AAC9D,IAAM,YAAY,WAAW,SAAS,QAAQ;AAC9C,IAAM,YAAY,WAAW,SAAS,aAAa,KAAK,CAAC;AACzD,IAAM,aAAa,WAAW,SAAS,SAAS;AAChD,IAAM,YAAY,CAAC,UAAU,SAAS,iBAAiB;AACvD,IAAM,oBAAoB,CAAC,SAAS,KAAK,YAAY,SAAS;AAC9D,IAAM,kBAAkB,CAAC,SAAS,KAAK,YAAY,SAAS;AAC5D,IAAM,mBAAmB,CAAC,SAAS,KAAK,YAAY,SAAS;AAC7D,IAAM,gBAAgB,CAAC,SAAS,KAAK,aAAa;AAClD,IAAM,mBAAmB,CAAC,SAAS,OAAO,KAAK,cAAc;AAC7D,IAAM,wBAAwB,CAAC,SAAS,KAAK,YAAY;AACzD,IAAM,sBAAsB,CAAC,SAAS,KAAK,YAAY;AACvD,IAAM,oBAAoB,CAAC,SAAS,cAAc,IAAI,KAAK,OAAO,KAAK,UAAU,eAAe,CAAC,iBAAiB,IAAI;AACtH,IAAM,gBAAgB,CAAC,SAAS,KAAK,aAAa;AAClD,IAAM,aAAa,CAAC,SAAS,KAAK,aAAa;AAC/C,IAAM,iBAAiB,CAAC,SAAS,KAAK,YAAY;AAClD,IAAM,iBAAiB,CAAC,SAAS,KAAK,YAAY;AAClD,IAAM,kBAAkB,CAAC,SAAS,KAAK,YAAY;AACnD,IAAM,oBAAoB,CAAC,SAAS,KAAK,YAAY;AACrD,IAAM,iBAAiB,CAAC,SAAS,KAAK,YAAY;AAClD,IAAM,iBAAiB,CAAC,SAAS,KAAK,YAAY;AAClD,IAAM,kBAAkB,CAAC,SAAS,KAAK,YAAY;AACnD,IAAM,kBAAkB,CAAC,SAAS,KAAK,YAAY;AACnD,IAAM,gBAAgB,CAAC,SAAS,KAAK,YAAY;AACjD,IAAM,kBAAkB,CAAC,SAAS,KAAK,YAAY;AACnD,IAAM,cAAc,IAAI,SAAS,QAAQ,KAAK,QAAQ,GAAG,IAAI;AAC7D,SAAS,YAAY,eAAe;AAjIpC,MAAAC;AAkIE,QAAM,UAASA,MAAA,+CAAe,kBAAf,gBAAAA,IAAA,oBAA+B;AAC9C,MAAI,QAAQ;AACV,WAAO,SAAS,OAAO,QAAQ;AAAA,EACjC;AACA,SAAO,QAAQ,MAAM,KAAK,eAAe,UAAU,QAAQ,OAAO,UAAU,YAAY,EAAE,SAAS,YAAY,CAAC;AAClH;AACA,IAAM,YAAY,CAAC,QAAQ,IAAI,WAAW,OAAO;AACjD,SAAS,WAAW,KAAK,SAAS;AAChC,MAAI,IAAI,MAAM,eAAe;AAC3B,WAAO;AACT,MAAI,cAAc,IAAI,MAAM,OAAO;AACjC,WAAO,OAAO,SAAS,WAAW;AACpC,MAAI,IAAI,MAAM,WAAW;AACvB,WAAO;AACT,MAAI,CAAC;AACH,WAAO;AACT,QAAM,MAAM,YAAY,EAAE,eAAe,mBAAmB;AAC5D,QAAM,OAAO,IAAI,cAAc,MAAM;AACrC,QAAM,IAAI,IAAI,cAAc,GAAG;AAC/B,MAAI,KAAK,YAAY,IAAI;AACzB,MAAI,KAAK,YAAY,CAAC;AACtB,MAAI;AACF,SAAK,OAAO;AACd,IAAE,OAAO;AACT,SAAO,EAAE;AACX;AACA,SAAS,YAAY,QAAQ;AA5J7B,MAAAA;AA6JE,UAAQA,MAAA,UAAU,cAAc,MAAM,IAAI,iCAAQ,gBAAgB,WAA1D,OAAAA,MAAqE,OAAO;AACtF;AACA,IAAM,QAAQ;AACd,SAAS,UAAU,OAAO,QAAQ,eAAe;AAC/C,QAAM,MAAM,YAAY,aAAa,EAAE,gBAAgB,OAAO,KAAK;AACnE,MAAI,eAAe,MAAM,SAAS,MAAM,SAAS,CAAC;AAClD,MAAI,eAAe,MAAM,UAAU,OAAO,SAAS,CAAC;AACpD,MAAI,eAAe,MAAM,WAAW,OAAO,KAAK,IAAI,MAAM,EAAE;AAC5D,SAAO;AACT;AACA,SAAS,aAAa,KAAK,wBAAwB;AACjD,MAAI,QAAQ,IAAI,cAAc,EAAE,kBAAkB,GAAG;AACrD,MAAI,wBAAwB;AAC1B,YAAQ,MAAM,QAAQ,+DAA+D,EAAE;AAAA,EACzF;AACA,SAAO,oCAAoC,mBAAmB,KAAK,CAAC;AACtE;AA8BA,SAAS,SAAS,MAAM,MAAM;AAC5B,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,SAAS,IAAI,WAAW;AAC9B,WAAO,SAAS,MAAM,QAAQ,OAAO,MAAM;AAC3C,WAAO,UAAU,MAAM,OAAO,OAAO,KAAK;AAC1C,WAAO,UAAU,MAAM,OAAO,IAAI,MAAM,uBAAuB,IAAI,EAAE,CAAC;AACtE,QAAI,SAAS,WAAW;AACtB,aAAO,cAAc,IAAI;AAAA,IAC3B,WAAW,SAAS,eAAe;AACjC,aAAO,kBAAkB,IAAI;AAAA,IAC/B;AAAA,EACF,CAAC;AACH;AACA,IAAM,gBAAgB,CAAC,SAAS,SAAS,MAAM,SAAS;AAExD,SAAS,YAAY,KAAK,eAAe;AACvC,QAAM,MAAM,YAAY,aAAa,EAAE,cAAc,KAAK;AAC1D,MAAI,WAAW;AACf,MAAI,UAAU;AACd,MAAI,MAAM;AACV,SAAO;AACT;AACA,SAAS,UAAU,OAAO,SAAS;AACjC,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,EAAE,SAAS,eAAe,SAAS,aAAa,OAAO,IAAI,4BAAW,CAAC;AAC7E,UAAM,OAAO,OAAO,UAAU,WAAW,YAAY,OAAO,YAAY,aAAa,CAAC,IAAI;AAC1F,QAAI,QAAQ;AACZ,QAAI,uBAAuB;AAC3B,aAAS,YAAY;AACnB,cAAQ,IAAI;AACZ,eAAS,aAAa,KAAK;AAC3B;AAAA,IACF;AACA,QAAI,SAAS;AACX,cAAQ,WAAW,WAAW,OAAO;AAAA,IACvC;AACA,QAAI,eAAe,IAAI,GAAG;AACxB,YAAM,aAAa,KAAK,cAAc,KAAK;AAC3C,UAAI,CAAC,YAAY;AACf,YAAI,KAAK,QAAQ;AACf,iBAAO,UAAU,KAAK,QAAQ,OAAO,EAAE,KAAK,OAAO;AAAA,QACrD;AACA,eAAO,UAAU;AAAA,MACnB;AACA,UAAI,KAAK,cAAc,GAAG;AACxB,eAAO,UAAU;AAAA,MACnB;AACA,YAAM,eAAe;AACrB,YAAM,UAAU,CAAC,UAAU;AACzB;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA;AAEF,mDAAc;AACd,kBAAU;AAAA,MACZ;AACA,6BAAuB,MAAM;AAC3B,aAAK,oBAAoB,cAAc,YAAY;AACnD,aAAK,oBAAoB,SAAS,OAAO;AAAA,MAC3C;AACA,WAAK,iBAAiB,cAAc,cAAc,EAAE,MAAM,KAAK,CAAC;AAChE,WAAK,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AAAA,IACxD,OAAO;AACL,YAAM,aAAa,sBAAsB,IAAI,IAAI,KAAK,KAAK,UAAU,KAAK,cAAc,KAAK;AAC7F,UAAI,CAAC,YAAY;AACf,eAAO,UAAU;AAAA,MACnB;AACA,YAAM,SAAS,YAAY;AACzB,YAAI,eAAe,IAAI,KAAK,YAAY,MAAM;AAC5C,cAAI;AACF,kBAAM,KAAK,OAAO;AAAA,UACpB,SAAS,OAAO;AACd;AAAA,cACE;AAAA,cACA,KAAK,QAAQ,eAAe;AAAA,cAC5B;AAAA;AAAA,UAEJ;AAAA,QACF;AACA,kBAAU;AAAA,MACZ;AACA,YAAM,UAAU,CAAC,UAAU;AACzB;AAAA,UACE;AAAA,UACA,KAAK,QAAQ,eAAe;AAAA,UAC5B;AAAA;AAEF,kBAAU;AAAA,MACZ;AACA,UAAI,eAAe,IAAI,KAAK,KAAK,UAAU;AACzC,eAAO,OAAO;AAAA,MAChB;AACA,6BAAuB,MAAM;AAC3B,aAAK,oBAAoB,QAAQ,MAAM;AACvC,aAAK,oBAAoB,SAAS,OAAO;AAAA,MAC3C;AACA,WAAK,iBAAiB,QAAQ,QAAQ,EAAE,MAAM,KAAK,CAAC;AACpD,WAAK,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AAAA,IACxD;AAAA,EACF,CAAC;AACH;AACA,eAAe,cAAc,MAAM,SAAS;AAC1C,MAAI,kBAAkB,IAAI,GAAG;AAC3B,QAAI,eAAe,IAAI,KAAK,eAAe,IAAI,GAAG;AAChD,YAAM,UAAU,MAAM,OAAO;AAAA,IAC/B,OAAO;AACL,YAAM,QAAQ;AAAA,QACZ,CAAC,OAAO,OAAO,EAAE,QAAQ,CAAC,cAAc;AACtC,iBAAO,MAAM,KAAK,KAAK,iBAAiB,SAAS,CAAC,EAAE,IAAI,CAAC,OAAO,UAAU,IAAI,OAAO,CAAC;AAAA,QACxF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;AACA,IAAM,OAAuB,0BAAS,QAAQ;AAC5C,MAAI,UAAU;AACd,QAAM,SAAS,MAAM,QAAQ,KAAK,OAAO,IAAI,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC,GAAG,MAAM,EAAE;AAClF,SAAO,MAAM;AACX,eAAW;AACX,WAAO,IAAI,OAAO,CAAC,GAAG,OAAO;AAAA,EAC/B;AACF,GAAE;AACF,SAAS,gBAAgB,YAAY;AACnC,SAAO,yCAAY,MAAM,KAAK,IAAI,CAAC,QAAQ,IAAI,KAAK,EAAE,QAAQ,QAAQ,EAAE,EAAE,YAAY,GAAG,OAAO;AAClG;AAEA,IAAI,MAAM;AACV,SAAS,aAAa,OAAO;AAC3B,QAAM,SAAS,GAAG,MAAM,KAAK,GAAG;AAChC;AACA,SAAO;AAAA;AAAA,IAEL,MAAM,CAAC,UAAU,SAAS,QAAQ,KAAK,GAAG,MAAM,IAAI,KAAK,EAAE;AAAA;AAAA,IAE3D,SAAS,CAAC,UAAU,SAAS,QAAQ,QAAQ,GAAG,MAAM,IAAI,KAAK,EAAE;AAAA,IACjE,MAAM,IAAI,SAAS,SAAS,YAAY,GAAG,IAAI;AAAA,EACjD;AACF;AAEA,SAAS,sBAAsB,gBAAgB;AAC7C,SAAO;AAAA,IACL,OAAO,iBAAiB,aAAa;AAAA,EACvC;AACF;AAEA,eAAe,gBAAgB,MAAM,SAAS;AAC5C,SAAO,UAAU,IAAI,IAAI,OAAO,cAAc,MAAM,iCAAK,UAAL,EAAc,cAAc,KAAK,EAAC;AACxF;AACA,eAAe,cAAc,MAAM,SAAS;AAhW5C,MAAAC,KAAA;AAiWE,QAAM,EAAE,QAAQ,GAAG,WAAW,eAAe,EAAE,IAAI,WAAW,CAAC;AAC/D,QAAM,QAAQ,QAAQ,mCAAS,KAAK;AACpC,QAAM,YAAWA,MAAA,mCAAS,aAAT,OAAAA,MAAqB;AACtC,QAAM,iBAAgB,UAAK,kBAAL,YAAuB,aAAa,OAAO,WAAW;AAC5E,QAAM,eAAc,gBAAK,kBAAL,mBAAoB,gBAApB,YAAoC,aAAa,SAAS;AAC9E,QAAM,WAA2B,oBAAI,IAAI;AACzC,QAAM,UAAU;AAAA;AAAA,IAEd,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN;AAAA,IACA,iBAAiB;AAAA,IACjB,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,mBAAmB;AAAA,IACnB,SAAS;AAAA,IACT,UAAU;AAAA,IACV;AAAA,IACA,OAAO;AAAA,MACL,aAAa,uBAAsB,wCAAS,UAAT,mBAAgB,cAAc;AAAA,MACjE,kBAAkB;AAAA,MAClB,gBAAgB;AAAA,OACb,mCAAS;AAAA,IAEd,SAAS;AAAA,IACT,MAAM,CAAC;AAAA,IACP,mBAAmB;AAAA,IACnB,WAAW;AAAA,IACX;AAAA,IACA,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,aAAa;AAAA,IACb,0BAA0B;AAAA,IAC1B,wBAAwB;AAAA,IACxB,cAAc;AAAA,KACX,UA/BW;AAAA;AAAA,IAiCd,aAAa;AAAA,IACb,KAAK,aAAa,KAAK;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK,UAAU,IAAI,OAAO,KAAK;AAAA,IAC/B,iBAAiB,mBAAmB,aAAa;AAAA,IACjD,gBAAgB,+CAAe,gBAAgB,OAAO;AAAA,IACtD,WAA2B,oBAAI,IAAI;AAAA,IACnC,uBAAuC,oBAAI,IAAI;AAAA,IAC/C,SAAS;AAAA,MACP,GAAG,MAAM,KAAK;AAAA,QACZ,QAAQ,sBAAsB,aAAa,eAAe,eAAe;AAAA,MAC3E,CAAC;AAAA,IACH,EAAE,IAAI,MAAM;AACV,UAAI;AACF,cAAM,SAAS,IAAI,OAAO,SAAS;AACnC,eAAO,YAAY,OAAO,UAAU;AAzZ5C,cAAAA,KAAAC,KAAAC,KAAAC;AA0ZU,gBAAM,EAAE,KAAK,OAAO,IAAI,MAAM;AAC9B,cAAI,QAAQ;AACV,aAAAF,OAAAD,MAAA,SAAS,IAAI,GAAG,MAAhB,gBAAAA,IAAmB,YAAnB,gBAAAC,IAAA,KAAAD,KAA6B;AAAA,UAC/B,OAAO;AACL,aAAAG,OAAAD,MAAA,SAAS,IAAI,GAAG,MAAhB,gBAAAA,IAAmB,WAAnB,gBAAAC,IAAA,KAAAD,KAA4B,IAAI,MAAM,wCAAwC,GAAG,EAAE;AAAA,UACrF;AAAA,QACF;AACA,eAAO,iBAAiB,CAAC,UAAU;AAja3C,cAAAF,KAAAC;AAkaU,gBAAM,EAAE,IAAI,IAAI,MAAM;AACtB,WAAAA,OAAAD,MAAA,SAAS,IAAI,GAAG,MAAhB,gBAAAA,IAAmB,WAAnB,gBAAAC,IAAA,KAAAD,KAA4B,IAAI,MAAM,wCAAwC,GAAG,EAAE;AAAA,QACrF;AACA,eAAO;AAAA,MACT,SAAS,OAAO;AACd,gBAAQ,IAAI,KAAK,wBAAwB,KAAK;AAC9C,eAAO;AAAA,MACT;AAAA,IACF,CAAC,EAAE,OAAO,OAAO;AAAA,IACjB,cAA8B,oBAAI,IAAI;AAAA,IACtC,cAA8B,oBAAI,IAAI;AAAA,IACtC,eAAe,GAAG;AAAA,MAChB,YAAY,aAAa,KAAK;AAAA,MAC9B;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,CAAC;AAAA,IAC3B;AAAA,IACA,gBAAgB;AAAA,IAChB,OAAO,CAAC;AAAA,IACR;AAAA,IACA,UAAU,CAAC,QAAQ;AAvbvB,UAAAA,KAAAC;AAwbM,UAAI,QAAQ,yBAAyB;AACnC,eAAO,OAAO,aAAa,YAAY,SAAQD,MAAA,SAAS,GAAG,MAAZ,OAAAA,MAAiB;AAAA,MAClE;AACA,UAAI,OAAO,aAAa,WAAW;AACjC,eAAO;AAAA,MACT;AACA,cAAOC,MAAA,SAAS,GAAG,MAAZ,OAAAA,MAAiB;AAAA,IAC1B;AAAA,IACA,aAAa,CAAC;AAAA,EAChB;AACA,UAAQ,IAAI,KAAK,iBAAiB;AAClC,QAAM,cAAc,MAAM,EAAE,SAAS,QAAQ,SAAS,QAAQ,QAAQ,IAAI,KAAK,CAAC;AAChF,UAAQ,IAAI,QAAQ,iBAAiB;AACrC,QAAM,EAAE,OAAO,OAAO,IAAI,mBAAmB,MAAM,OAAO;AAC1D,UAAQ,QAAQ;AAChB,UAAQ,SAAS;AACjB,SAAO;AACT;AACA,SAAS,mBAAmB,eAAe;AACzC,MAAI,CAAC;AACH,WAAO;AACT,QAAM,QAAQ,cAAc,cAAc,OAAO;AACjD,QAAM,UAAU,MAAM,cAAc,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA,CAKpD;AACC,QAAM,YAAY,OAAO;AACzB,SAAO;AACT;AACA,SAAS,mBAAmB,MAAM,SAAS;AACzC,MAAI,EAAE,OAAO,OAAO,IAAI;AACxB,MAAI,cAAc,IAAI,MAAM,CAAC,SAAS,CAAC,SAAS;AAC9C,UAAM,MAAM,KAAK,sBAAsB;AACvC,YAAQ,SAAS,IAAI,SAAS,OAAO,KAAK,aAAa,OAAO,CAAC,KAAK;AACpE,aAAS,UAAU,IAAI,UAAU,OAAO,KAAK,aAAa,QAAQ,CAAC,KAAK;AAAA,EAC1E;AACA,SAAO,EAAE,OAAO,OAAO;AACzB;AAEA,eAAe,cAAc,OAAO,SAAS;AAC3C,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AACJ,MAAI,KAAK,iBAAiB;AAC1B,QAAM,SAAS,MAAM,UAAU,OAAO,EAAE,SAAS,QAAQ,QAAQ,IAAI,KAAK,CAAC;AAC3E,QAAM,EAAE,QAAQ,UAAU,IAAI,aAAa,MAAM,eAAe,OAAO;AACvE,QAAM,YAAY,MAAM;AACtB,QAAI;AACF,6CAAW,UAAU,QAAQ,GAAG,GAAG,OAAO,OAAO,OAAO;AAAA,IAC1D,SAAS,OAAO;AACd,cAAQ,IAAI,KAAK,uBAAuB,KAAK;AAAA,IAC/C;AAAA,EACF;AACA,YAAU;AACV,MAAI,QAAQ,SAAS,iBAAiB,GAAG;AACvC,aAAS,IAAI,GAAG,IAAI,gBAAgB,KAAK;AACvC,YAAM,IAAI,QAAQ,CAAC,YAAY;AAC7B,mBAAW,MAAM;AACf,iDAAW,UAAU,GAAG,GAAG,OAAO,OAAO,OAAO;AAChD,oBAAU;AACV,kBAAQ;AAAA,QACV,GAAG,IAAI,iBAAiB;AAAA,MAC1B,CAAC;AAAA,IACH;AAAA,EACF;AACA,UAAQ,iBAAiB;AACzB,MAAI,QAAQ,iBAAiB;AAC7B,SAAO;AACT;AACA,SAAS,aAAa,eAAe,SAAS;AAC5C,QAAM,EAAE,OAAO,QAAQ,OAAO,iBAAiB,mBAAmB,IAAI,IAAI;AAC1E,QAAM,SAAS,cAAc,cAAc,QAAQ;AACnD,SAAO,QAAQ,KAAK,MAAM,QAAQ,KAAK;AACvC,SAAO,SAAS,KAAK,MAAM,SAAS,KAAK;AACzC,SAAO,MAAM,QAAQ,GAAG,KAAK;AAC7B,SAAO,MAAM,SAAS,GAAG,MAAM;AAC/B,MAAI,KAAK;AACP,QAAI,OAAO,QAAQ,OAAO,OAAO,SAAS,KAAK;AAC7C,UAAI,OAAO,QAAQ,OAAO,OAAO,SAAS,KAAK;AAC7C,YAAI,OAAO,QAAQ,OAAO,QAAQ;AAChC,iBAAO,UAAU,MAAM,OAAO;AAC9B,iBAAO,QAAQ;AAAA,QACjB,OAAO;AACL,iBAAO,SAAS,MAAM,OAAO;AAC7B,iBAAO,SAAS;AAAA,QAClB;AAAA,MACF,WAAW,OAAO,QAAQ,KAAK;AAC7B,eAAO,UAAU,MAAM,OAAO;AAC9B,eAAO,QAAQ;AAAA,MACjB,OAAO;AACL,eAAO,SAAS,MAAM,OAAO;AAC7B,eAAO,SAAS;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AACA,QAAM,YAAY,OAAO,WAAW,IAAI;AACxC,MAAI,aAAa,iBAAiB;AAChC,cAAU,YAAY;AACtB,cAAU,SAAS,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AAAA,EACtD;AACA,SAAO,EAAE,QAAQ,UAAU;AAC7B;AAEA,SAAS,YAAY,QAAQ,SAAS;AACpC,MAAI,OAAO,eAAe;AACxB,QAAI;AACF,YAAM,UAAU,OAAO,UAAU;AACjC,UAAI,YAAY,UAAU;AACxB,eAAO,YAAY,SAAS,OAAO,aAAa;AAAA,MAClD;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,IAAI,KAAK,0BAA0B,KAAK;AAAA,IAClD;AAAA,EACF;AACA,QAAM,SAAS,OAAO,UAAU,KAAK;AACrC,QAAM,MAAM,OAAO,WAAW,IAAI;AAClC,QAAM,YAAY,OAAO,WAAW,IAAI;AACxC,MAAI;AACF,QAAI,OAAO,WAAW;AACpB,gBAAU;AAAA,QACR,IAAI,aAAa,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AAAA,QAClD;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,YAAQ,IAAI,KAAK,0BAA0B,KAAK;AAAA,EAClD;AACA,SAAO;AACT;AAEA,SAAS,YAAY,QAAQ,SAAS;AAjkBtC,MAAAD;AAkkBE,MAAI;AACF,SAAIA,MAAA,iCAAQ,oBAAR,gBAAAA,IAAyB,MAAM;AACjC,aAAO,UAAU,OAAO,gBAAgB,MAAM,OAAO;AAAA,IACvD;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,IAAI,KAAK,0BAA0B,KAAK;AAAA,EAClD;AACA,SAAO,OAAO,UAAU,KAAK;AAC/B;AAEA,SAAS,WAAW,OAAO;AACzB,QAAM,SAAS,MAAM,UAAU,KAAK;AACpC,MAAI,MAAM,cAAc,MAAM,eAAe,MAAM,KAAK;AACtD,WAAO,MAAM,MAAM;AACnB,WAAO,SAAS;AAAA,EAClB;AACA,MAAI,OAAO,YAAY,QAAQ;AAC7B,WAAO,UAAU;AAAA,EACnB;AACA,SAAO;AACT;AAEA,eAAe,WAAW,OAAO,SAAS;AACxC,MAAI,MAAM,iBAAiB,CAAC,MAAM,cAAc,MAAM,QAAQ;AAC5D,WAAO,YAAY,MAAM,QAAQ,MAAM,aAAa;AAAA,EACtD;AACA,QAAM,SAAS,MAAM,UAAU,KAAK;AACpC,SAAO,cAAc;AACrB,MAAI,MAAM,cAAc,MAAM,eAAe,MAAM,KAAK;AACtD,WAAO,MAAM,MAAM;AAAA,EACrB;AACA,QAAM,gBAAgB,OAAO;AAC7B,MAAI,eAAe;AACjB,QAAI,UAAU;AACd,UAAM,UAAU,QAAQ,EAAE,SAAS,MAAM,UAAU,OAAO,QAAQ,QAAQ,IAAI,KAAK,CAAC;AACpF,QAAI,CAAC,SAAS;AACZ,UAAI,MAAM,QAAQ;AAChB,eAAO,YAAY,MAAM,QAAQ,MAAM,aAAa;AAAA,MACtD;AACA,aAAO;AAAA,IACT;AACA,WAAO,cAAc,MAAM;AAC3B,UAAM,IAAI,QAAQ,CAAC,YAAY;AAC7B,aAAO,iBAAiB,UAAU,SAAS,EAAE,MAAM,KAAK,CAAC;AAAA,IAC3D,CAAC;AACD,UAAM,SAAS,cAAc,cAAc,QAAQ;AACnD,WAAO,QAAQ,MAAM;AACrB,WAAO,SAAS,MAAM;AACtB,QAAI;AACF,YAAM,MAAM,OAAO,WAAW,IAAI;AAClC,UAAI;AACF,YAAI,UAAU,QAAQ,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AAAA,IAC3D,SAAS,OAAO;AACd,cAAQ,IAAI,KAAK,yBAAyB,KAAK;AAC/C,UAAI,MAAM,QAAQ;AAChB,eAAO,YAAY,MAAM,QAAQ,MAAM,aAAa;AAAA,MACtD;AACA,aAAO;AAAA,IACT;AACA,WAAO,YAAY,QAAQ,OAAO;AAAA,EACpC;AACA,SAAO;AACT;AAEA,SAAS,aAAa,MAAM,SAAS;AACnC,MAAI,gBAAgB,IAAI,GAAG;AACzB,WAAO,YAAY,MAAM,OAAO;AAAA,EAClC;AACA,MAAI,gBAAgB,IAAI,GAAG;AACzB,WAAO,YAAY,MAAM,OAAO;AAAA,EAClC;AACA,MAAI,eAAe,IAAI,GAAG;AACxB,WAAO,WAAW,IAAI;AAAA,EACxB;AACA,MAAI,eAAe,IAAI,GAAG;AACxB,WAAO,WAAW,MAAM,OAAO;AAAA,EACjC;AACA,SAAO,KAAK,UAAU,KAAK;AAC7B;AAEA,SAAS,WAAW,SAAS;AAC3B,MAAI,UAAU,QAAQ;AACtB,MAAI,CAAC,SAAS;AACZ,UAAM,EAAE,cAAc,IAAI;AAC1B,QAAI;AACF,UAAI,eAAe;AACjB,kBAAU,cAAc,cAAc,QAAQ;AAC9C,gBAAQ,KAAK,cAAc,KAAK,CAAC;AACjC,gBAAQ,QAAQ;AAChB,gBAAQ,SAAS;AACjB,gBAAQ,MAAM,aAAa;AAC3B,gBAAQ,MAAM,WAAW;AACzB,sBAAc,KAAK,YAAY,OAAO;AACtC,gBAAQ,SAAS;AACjB,gBAAQ,UAAU;AAAA,MACpB;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,IAAI,KAAK,wBAAwB,KAAK;AAAA,IAChD;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAM,gBAAgB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AACF;AACA,IAAM,qBAAqB;AAAA,EACzB;AAAA,EACA;AACF;AACA,SAAS,gBAAgB,MAAM,eAAe,SAAS;AACrD,QAAM,EAAE,sBAAsB,IAAI;AAClC,QAAM,WAAW,KAAK,SAAS,YAAY;AAC3C,QAAM,YAAY,iBAAiB,IAAI,KAAK,aAAa;AACzD,QAAM,aAAa,YAAY,mBAAmB,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,aAAa,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC;AAC1I,QAAM,MAAM;AAAA,IACV,aAAa;AAAA,IACb;AAAA,IACA,WAAW,IAAI,CAAC,MAAM,UAAU,GAAG,IAAI,IAAI,KAAK,EAAE,EAAE,KAAK,GAAG;AAAA,IAC5D;AAAA,EACF,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAC1B,MAAI,sBAAsB,IAAI,GAAG;AAC/B,WAAO,sBAAsB,IAAI,GAAG;AACtC,QAAM,UAAU,WAAW,OAAO;AAClC,QAAM,gBAAgB,mCAAS;AAC/B,MAAI,CAAC;AACH,WAAuB,oBAAI,IAAI;AACjC,QAAM,kBAAkB,+CAAe;AACvC,MAAI;AACJ,MAAI;AACJ,MAAI,WAAW;AACb,WAAO,gBAAgB,gBAAgB,OAAO,KAAK;AACnD,SAAK,KAAK,cAAc,gBAAgB,KAAK,cAAc,QAAQ;AACnE,eAAW,QAAQ,CAAC,CAAC,MAAM,KAAK,MAAM;AACpC,SAAG,eAAe,MAAM,MAAM,KAAK;AAAA,IACrC,CAAC;AACD,SAAK,YAAY,EAAE;AAAA,EACrB,OAAO;AACL,WAAO,KAAK,gBAAgB,cAAc,QAAQ;AAAA,EACpD;AACA,KAAG,cAAc;AACjB,kBAAgB,KAAK,YAAY,IAAI;AACrC,QAAM,gBAAgB,cAAc,iBAAiB,IAAI,aAAa;AACtE,QAAM,SAAyB,oBAAI,IAAI;AACvC,WAAS,MAAM,cAAc,QAAQ,IAAI,GAAG,IAAI,KAAK,KAAK;AACxD,UAAM,OAAO,cAAc,KAAK,CAAC;AACjC,QAAI,cAAc,SAAS,IAAI;AAC7B;AACF,WAAO,IAAI,MAAM,cAAc,iBAAiB,IAAI,CAAC;AAAA,EACvD;AACA,kBAAgB,KAAK,YAAY,IAAI;AACrC,wBAAsB,IAAI,KAAK,MAAM;AACrC,SAAO;AACT;AAEA,SAAS,aAAa,OAAO,cAAc,wBAAwB;AA/tBnE,MAAAA;AAguBE,QAAM,YAA4B,oBAAI,IAAI;AAC1C,QAAM,UAAU,CAAC;AACjB,QAAM,aAA6B,oBAAI,IAAI;AAC3C,MAAI,wBAAwB;AAC1B,eAAW,QAAQ,wBAAwB;AACzC,cAAQ,IAAI;AAAA,IACd;AAAA,EACF,OAAO;AACL,aAAS,MAAM,MAAM,QAAQ,IAAI,GAAG,IAAI,KAAK,KAAK;AAChD,YAAM,OAAO,MAAM,KAAK,CAAC;AACzB,cAAQ,IAAI;AAAA,IACd;AAAA,EACF;AACA,WAAS,MAAM,QAAQ,QAAQ,IAAI,GAAG,IAAI,KAAK,KAAK;AAClD,KAAAA,MAAA,WAAW,IAAI,QAAQ,CAAC,CAAC,MAAzB,gBAAAA,IAA4B,QAAQ,CAAC,OAAO,SAAS,UAAU,IAAI,MAAM,KAAK;AAAA,EAChF;AACA,WAAS,QAAQ,MAAM;AACrB,UAAM,QAAQ,MAAM,iBAAiB,IAAI;AACzC,UAAM,WAAW,MAAM,oBAAoB,IAAI;AAC/C,UAAM,WAAW,KAAK,YAAY,GAAG;AACrC,UAAM,SAAS,WAAW,KAAK,KAAK,UAAU,GAAG,QAAQ,IAAI;AAC7D,QAAI,QAAQ;AACV,UAAI,MAAM,WAAW,IAAI,MAAM;AAC/B,UAAI,CAAC,KAAK;AACR,cAAsB,oBAAI,IAAI;AAC9B,mBAAW,IAAI,QAAQ,GAAG;AAAA,MAC5B;AACA,UAAI,IAAI,MAAM,CAAC,OAAO,QAAQ,CAAC;AAAA,IACjC;AACA,QAAI,aAAa,IAAI,IAAI,MAAM,SAAS,CAAC;AACvC;AACF,QAAI,QAAQ;AACV,cAAQ,KAAK,MAAM;AAAA,IACrB,OAAO;AACL,gBAAU,IAAI,MAAM,CAAC,OAAO,QAAQ,CAAC;AAAA,IACvC;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,cAAc,MAAM,QAAQ,QAAQ,SAAS;AAxwBtD,MAAAA,KAAA;AAywBE,QAAM,EAAE,aAAa,wBAAwB,uBAAuB,IAAI;AACxE,QAAM,cAAc,OAAO;AAC3B,QAAM,gBAAgB,YAAY,iBAAiB,IAAI;AACvD,QAAM,eAAe,gBAAgB,MAAM,MAAM,OAAO;AACxD,mEAAwB,QAAQ,CAAC,GAAG,QAAQ;AAC1C,iBAAa,OAAO,GAAG;AAAA,EACzB;AACA,QAAM,QAAQ,aAAa,eAAe,cAAc,sBAAsB;AAC9E,QAAM,OAAO,qBAAqB;AAClC,QAAM,OAAO,KAAK;AAClB,QAAM,OAAO,GAAG;AAChB,QAAM,OAAO,SAAS;AACtB,MAAI,QAAQ;AACV,UAAM,OAAO,YAAY;AACzB,UAAM,OAAO,cAAc;AAC3B,UAAM,OAAO,eAAe;AAC5B,UAAM,OAAO,aAAa;AAC1B,UAAM,OAAO,oBAAoB;AACjC,UAAM,OAAO,kBAAkB;AAC/B,UAAM,OAAO,qBAAqB;AAClC,UAAM,OAAO,mBAAmB;AAChC,UAAM,IAAI,cAAc,CAAC,cAAc,EAAE,CAAC;AAAA,EAC5C;AACA,QAAIA,MAAA,MAAM,IAAI,iBAAiB,MAA3B,gBAAAA,IAA+B,QAAO,QAAQ;AAChD,WAAO,UAAU,IAAI,6BAA6B;AAAA,EACpD;AACA,MAAI,WAAW;AACb,QAAI,CAAC,MAAM,IAAI,cAAc;AAC3B,YAAM,IAAI,gBAAgB,CAAC,UAAU,EAAE,CAAC;AAC1C,WAAK,WAAM,IAAI,YAAY,MAAtB,mBAA0B,QAAO,cAAY,WAAM,IAAI,YAAY,MAAtB,mBAA0B,QAAO,eAAa,WAAM,IAAI,eAAe,MAAzB,mBAA6B,QAAO,cAAc,KAAK,gBAAgB,KAAK,aAAa;AACvL,YAAM,IAAI,iBAAiB,CAAC,QAAQ,EAAE,CAAC;AAAA,IACzC;AAAA,EACF;AACA,WAAS,MAAM,YAAY,QAAQ,IAAI,GAAG,IAAI,KAAK,KAAK;AACtD,gBAAY,eAAe,YAAY,KAAK,CAAC,CAAC;AAAA,EAChD;AACA,QAAM,QAAQ,CAAC,CAAC,OAAO,QAAQ,GAAG,SAAS;AACzC,gBAAY,YAAY,MAAM,OAAO,QAAQ;AAAA,EAC/C,CAAC;AACD,SAAO;AACT;AAEA,SAAS,eAAe,MAAM,QAAQ;AACpC,MAAI,kBAAkB,IAAI,KAAK,eAAe,IAAI,KAAK,gBAAgB,IAAI,GAAG;AAC5E,WAAO,aAAa,SAAS,KAAK,KAAK;AAAA,EACzC;AACF;AAEA,IAAM,gBAAgB;AAAA,EACpB;AAAA,EACA;AAAA;AAEF;AACA,IAAM,yBAAyB;AAAA,EAC7B;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AACF;AACA,SAAS,gBAAgB,MAAM,QAAQ,eAAe,SAAS,uBAAuB;AACpF,QAAM,EAAE,aAAa,iBAAiB,WAAW,iBAAiB,IAAI;AACtE,MAAI,CAAC,mBAAmB,CAAC;AACvB;AACF,WAAS,OAAO,aAAa;AA70B/B,QAAAA;AA80BI,UAAM,gBAAgB,YAAY,iBAAiB,MAAM,WAAW;AACpE,QAAI,UAAU,cAAc,iBAAiB,SAAS;AACtD,QAAI,CAAC,WAAW,YAAY;AAC1B;AACF,mEAAwB;AACxB,cAAU,QAAQ,QAAQ,4BAA4B,EAAE;AACxD,UAAM,UAAU,CAAC,KAAK,CAAC;AACvB,UAAM,eAAe,gBAAgB,MAAM,aAAa,OAAO;AAC/D,yDAAkB,QAAQ,CAAC,GAAG,QAAQ;AACpC,mBAAa,OAAO,GAAG;AAAA,IACzB;AACA,UAAM,QAAQ,aAAa,eAAe,cAAc,QAAQ,sBAAsB;AACtF,UAAM,OAAO,SAAS;AACtB,UAAM,OAAO,gBAAgB;AAC7B,UAAIA,MAAA,MAAM,IAAI,iBAAiB,MAA3B,gBAAAA,IAA+B,QAAO,QAAQ;AAChD,aAAO,UAAU,IAAI,6BAA6B;AAAA,IACpD;AACA,UAAM,aAAa;AAAA,MACjB,aAAa,OAAO;AAAA,IACtB;AACA,UAAM,QAAQ,CAAC,CAAC,OAAO,QAAQ,GAAG,SAAS;AACzC,iBAAW,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,WAAW,gBAAgB,EAAE,GAAG;AAAA,IACtE,CAAC;AACD,QAAI,WAAW,WAAW;AACxB;AACF,QAAI;AACF,aAAO,YAAY,CAAC,OAAO,WAAW,GAAG,OAAO,EAAE,KAAK,GAAG;AAAA,IAC5D,SAAS,KAAK;AACZ,cAAQ,IAAI,KAAK,6BAA6B,GAAG;AACjD;AAAA,IACF;AACA,UAAM,UAAU,WAAW,KAAK,MAAM;AACtC,QAAI,aAAa,UAAU,IAAI,OAAO;AACtC,QAAI,CAAC,YAAY;AACf,mBAAa,CAAC;AACd,gBAAU,IAAI,SAAS,UAAU;AAAA,IACnC;AACA,eAAW,KAAK,IAAI,QAAQ,CAAC,CAAC,GAAG,WAAW,EAAE;AAAA,EAChD;AACA,gBAAc,QAAQ,MAAM;AAC5B,MAAI;AACF,2BAAuB,QAAQ,MAAM;AACzC;AAEA,IAAM,qBAAqC,oBAAI,IAAI;AAAA,EACjD;AAAA;AAEF,CAAC;AACD,eAAe,gBAAgB,MAAM,QAAQ,OAAO,SAAS,uBAAuB;AAClF,MAAI,cAAc,KAAK,MAAM,eAAe,KAAK,KAAK,gBAAgB,KAAK;AACzE;AACF,MAAI,QAAQ,UAAU,CAAC,QAAQ,OAAO,KAAK;AACzC;AACF,MAAI,mBAAmB,IAAI,OAAO,QAAQ,KAAK,mBAAmB,IAAI,MAAM,QAAQ,GAAG;AACrF,YAAQ,yBAAyB;AAAA,EACnC,OAAO;AACL,YAAQ,yBAAyB,QAAQ;AAAA,EAC3C;AACA,QAAM,cAAc,MAAM,UAAU,OAAO,SAAS,OAAO,qBAAqB;AAChF,MAAI,QAAQ,SAAS,uBAAuB,GAAG;AAC7C,0BAAsB,MAAM,WAAW;AAAA,EACzC;AACA,SAAO,YAAY,WAAW;AAChC;AACA,eAAe,gBAAgB,MAAM,QAAQ,SAAS,uBAAuB;AA94B7E,MAAAA;AA+4BE,MAAI,aAAa,KAAK;AACtB,MAAI,cAAc,IAAI,GAAG;AACvB,QAAI,KAAK,YAAY;AACnB,oBAAaA,MAAA,KAAK,eAAL,gBAAAA,IAAiB;AAC9B,cAAQ,YAAY,KAAK,KAAK,UAAU;AAAA,IAC1C;AAAA,EACF;AACA,WAAS,QAAQ,YAAY,OAAO,QAAQ,MAAM,aAAa;AAC7D,QAAI,cAAc,KAAK;AACrB;AACF,QAAI,cAAc,KAAK,KAAK,cAAc,KAAK,KAAK,OAAO,MAAM,kBAAkB,YAAY;AAC7F,YAAM,QAAQ,MAAM,cAAc;AAClC,eAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,cAAM,gBAAgB,MAAM,QAAQ,MAAM,CAAC,GAAG,SAAS,qBAAqB;AAAA,MAC9E;AAAA,IACF,OAAO;AACL,YAAM,gBAAgB,MAAM,QAAQ,OAAO,SAAS,qBAAqB;AAAA,IAC3E;AAAA,EACF;AACF;AACA,SAAS,sBAAsB,MAAM,aAAa;AAChD,MAAI,CAAC,kBAAkB,IAAI,KAAK,CAAC,kBAAkB,WAAW;AAC5D;AACF,QAAM,EAAE,WAAW,WAAW,IAAI;AAClC,MAAI,CAAC,aAAa,CAAC,YAAY;AAC7B;AAAA,EACF;AACA,QAAM,EAAE,UAAU,IAAI,YAAY;AAClC,QAAM,SAAS,IAAI,UAAU,SAAS;AACtC,QAAM,EAAE,GAAG,GAAG,GAAG,EAAE,IAAI;AACvB,SAAO,IAAI;AACX,SAAO,IAAI;AACX,SAAO,IAAI;AACX,SAAO,IAAI;AACX,SAAO,cAAc,CAAC,YAAY,CAAC,SAAS;AAC5C,SAAO,IAAI;AACX,SAAO,IAAI;AACX,SAAO,IAAI;AACX,SAAO,IAAI;AACX,cAAY,MAAM,YAAY,OAAO,SAAS;AAChD;AACA,SAAS,yBAAyB,QAAQ,SAAS;AACjD,QAAM,EAAE,iBAAiB,OAAO,QAAQ,OAAO,OAAO,IAAI;AAC1D,QAAM,cAAc,OAAO;AAC3B,MAAI;AACF,gBAAY,YAAY,oBAAoB,iBAAiB,WAAW;AAC1E,MAAI;AACF,gBAAY,YAAY,SAAS,GAAG,KAAK,MAAM,WAAW;AAC5D,MAAI;AACF,gBAAY,YAAY,UAAU,GAAG,MAAM,MAAM,WAAW;AAC9D,MAAI,QAAQ;AACV,eAAW,QAAQ,OAAQ,aAAY,IAAI,IAAI,OAAO,IAAI;AAAA,EAC5D;AACF;AACA,IAAM,sBAAsB;AAC5B,eAAe,UAAU,MAAM,SAAS,SAAS,OAAO,uBAAuB;AAt8B/E,MAAAA,KAAA;AAu8BE,QAAM,EAAE,eAAe,aAAa,cAAc,gBAAgB,IAAI;AACtE,MAAI,iBAAiB,WAAW,IAAI,GAAG;AACrC,QAAI,yBAAyB,KAAK,KAAK,KAAK,IAAI,GAAG;AACjD,4BAAsB,KAAK,IAAI;AAAA,IACjC;AACA,WAAO,cAAc,eAAe,KAAK,IAAI;AAAA,EAC/C;AACA,MAAI,iBAAiB,eAAe,cAAc,IAAI,MAAM,kBAAkB,IAAI,KAAK,iBAAiB,IAAI,IAAI;AAC9G,UAAM,UAAU,MAAM,aAAa,MAAM,OAAO;AAChD,QAAI,QAAQ,SAAS,0BAA0B,GAAG;AAChD,YAAM,QAAQ,QAAQ,kBAAkB;AACxC,eAAS,MAAM,MAAM,QAAQ,IAAI,GAAG,IAAI,KAAK,KAAK;AAChD,cAAM,OAAO,MAAM,CAAC;AACpB,YAAI,CAAC,oBAAoB,KAAK,IAAI,GAAG;AACnC,kBAAQ,gBAAgB,IAAI;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AACA,UAAM,QAAQ,QAAQ,mBAAmB,cAAc,MAAM,SAAS,QAAQ,OAAO;AACrF,QAAI;AACF,+BAAyB,SAAS,OAAO;AAC3C,QAAI,gBAAgB;AACpB,QAAI,QAAQ,SAAS,eAAe,GAAG;AACrC,YAAM,WAAW;AAAA,SACfA,MAAA,MAAM,IAAI,YAAY,MAAtB,gBAAAA,IAA0B;AAAA,SAC1B,WAAM,IAAI,YAAY,MAAtB,mBAA0B;AAAA,MAC5B;AACA,sBAAgB,SAAS,SAAS,QAAQ,MAAM,SAAS,SAAS,MAAM,KAAK,SAAS,SAAS,SAAS,OAAO,KAAK,eAAe,KAAK,gBAAgB,KAAK,cAAc,KAAK;AAAA,IAClL;AACA,UAAM,iBAAgB,WAAM,IAAI,gBAAgB,MAA1B,mBAA8B;AACpD,UAAM,WAAW,iBAAgB,WAAM,IAAI,aAAa,MAAvB,mBAA2B,EAAE;AAC9D,UAAM,yBAAyB,WAAW,CAAC,SAAS;AAClD,UAAI,kBAAkB,aAAa;AACjC,eAAO,KAAK,YAAY;AAAA,MAC1B,WAAW,kBAAkB,aAAa;AACxC,eAAO,KAAK,YAAY;AAAA,MAC1B,WAAW,kBAAkB,cAAc;AACzC,eAAO,KAAK,CAAC,EAAE,YAAY,IAAI,KAAK,UAAU,CAAC;AAAA,MACjD;AACA,eAAS,QAAQ,CAAC,WAAW;AAC3B,YAAI,aAAa,aAAa,IAAI,MAAM;AACxC,YAAI,CAAC,YAAY;AACf,uBAAa,IAAI,QAAQ,aAA6B,oBAAI,IAAI,CAAC;AAAA,QACjE;AACA,aAAK,MAAM,EAAE,EAAE,QAAQ,CAAC,SAAS,WAAW,IAAI,IAAI,CAAC;AAAA,MACvD,CAAC;AAAA,IACH,IAAI;AACJ;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,mBAAe,MAAM,OAAO;AAC5B,QAAI,CAAC,eAAe,IAAI,GAAG;AACzB,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,WAAM,mDAAkB;AACxB,WAAO;AAAA,EACT;AACA,QAAM,SAAS,KAAK,UAAU,KAAK;AACnC,QAAM,gBAAgB,MAAM,QAAQ,OAAO;AAC3C,SAAM,mDAAkB;AACxB,SAAO;AACT;AAEA,SAAS,eAAe,SAAS;AAC/B,UAAQ,gBAAgB;AACxB,UAAQ,cAAc;AACtB,UAAQ,kBAAkB;AAC1B,UAAQ,iBAAiB;AACzB,UAAQ,UAAU,MAAM;AACxB,UAAQ,sBAAsB,MAAM;AACpC,MAAI,QAAQ,SAAS;AACnB,QAAI;AACF,cAAQ,QAAQ,OAAO;AAAA,IACzB,SAAS,KAAK;AACZ,cAAQ,IAAI,KAAK,4BAA4B,GAAG;AAAA,IAClD;AACA,YAAQ,UAAU;AAAA,EACpB;AACA,UAAQ,UAAU,CAAC;AACnB,UAAQ,aAAa,MAAM;AAC3B,UAAQ,aAAa,MAAM;AAC3B,UAAQ,SAAS,MAAM;AACvB,UAAQ,QAAQ,CAAC;AACjB,UAAQ,cAAc,CAAC;AACzB;AAEA,SAAS,UAAU,SAAS;AAC1B,QAAuDA,MAAA,SAA/C,OAAK,SAAS,aAviCxB,IAuiCyDA,KAAhB,wBAAgBA,KAAhB,CAA/B,OAAK,WAAS;AACtB,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,QAAQ,UAAU,WAAW,MAAM,WAAW,MAAM,GAAG,OAAO,IAAI;AACxE,SAAO,MAAM,KAAK,iBAAE,QAAQ,WAAW,UAAW,YAAa,EAAE,KAAK,CAAC,aAAa;AAClF,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,kCAAkC,EAAE,OAAO,SAAS,CAAC;AAAA,IACvE;AACA,YAAQ,cAAc;AAAA,MACpB,KAAK;AACH,eAAO,SAAS,YAAY;AAAA,MAC9B,KAAK;AACH,eAAO,SAAS,KAAK,EAAE,KAAK,aAAa;AAAA,MAC3C,KAAK;AAAA,MACL;AACE,eAAO,SAAS,KAAK;AAAA,IACzB;AAAA,EACF,CAAC,EAAE,QAAQ,MAAM,aAAa,KAAK,CAAC;AACtC;AACA,SAAS,aAAa,SAAS,SAAS;AACtC,QAAM,EAAE,KAAK,QAAQ,cAAc,QAAQ,eAAe,QAAQ,SAAS,IAAI;AAC/E,MAAI,MAAM;AACV,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AACJ,MAAI,gBAAgB,YAAY,aAAa,aAAa;AACxD,YAAQ;AAAA,EACV;AACA,MAAI,UAAU,SAAS,IAAI,MAAM;AACjC,MAAI,CAAC,SAAS;AACZ,QAAI,gBAAgB;AAClB,UAAI,0BAA0B,UAAU,eAAe,KAAK,GAAG,GAAG;AAChE,gBAAQ,KAAK,KAAK,GAAG,IAAI,MAAM,QAAwB,oBAAI,KAAK,GAAG,QAAQ;AAAA,MAC7E;AAAA,IACF;AACA,UAAM,gBAAgB,YAAY,WAAW,MAAM,KAAK,QAAQ,KAAK;AACrE,UAAM,YAA4B,oBAAI,IAAI;AAC1C,QAAI,eAAe;AACjB,YAAM,WAAW,YAAY,MAAM,GAAG,EAAE,CAAC,EAAE,MAAM,GAAG;AACpD,eAAS,QAAQ,CAAC,WAAW;AAC3B,YAAI,CAAC,aAAa,IAAI,MAAM;AAC1B;AACF,qBAAa,IAAI,MAAM,EAAE,QAAQ,CAAC,SAAS,UAAU,IAAI,IAAI,CAAC;AAAA,MAChE,CAAC;AAAA,IACH;AACA,UAAM,iBAAiB,iBAAiB,UAAU;AAClD,UAAM,mBAAmB;AAAA,MACvB;AAAA,MACA;AAAA,MACA,cAAc,iBAAiB,gBAAgB;AAAA,MAC/C,SAAS,gBAAgB,UAAU,EAAE,QAAQ,cAAc,IAAI;AAAA,OAC5D;AAEL,cAAU;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,UAAU;AAAA,IACZ;AACA,YAAQ,YAAY,YAAY;AAC9B,UAAI,WAAW,gBAAgB,SAAS;AACtC,cAAM,SAAS,MAAM,QAAQ,MAAM;AACnC,YAAI;AACF,iBAAO;AAAA,MACX;AACA,UAAI,CAAC,aAAa,OAAO,WAAW,MAAM,KAAK,QAAQ,QAAQ;AAC7D,eAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,gBAAM,SAAS,QAAQ,SAAS,OAAO,QAAQ,SAAS,CAAC;AACzD,iBAAO,YAAY,iBAAE,UAAW,iBAAkB;AAClD,kBAAQ,UAAU;AAClB,kBAAQ,SAAS;AAAA,QACnB,CAAC;AAAA,MACH;AACA,aAAO,UAAU,gBAAgB;AAAA,IACnC,GAAG,EAAE,MAAM,CAAC,UAAU;AACpB,eAAS,OAAO,MAAM;AACtB,UAAI,gBAAgB,WAAW,kBAAkB;AAC/C,gBAAQ,IAAI,KAAK,iEAAiE,GAAG;AACrF,eAAO,OAAO,qBAAqB,WAAW,mBAAmB,iBAAiB,QAAQ;AAAA,MAC5F;AACA,YAAM;AAAA,IACR,CAAC;AACD,aAAS,IAAI,QAAQ,OAAO;AAAA,EAC9B;AACA,SAAO,QAAQ;AACjB;AAEA,eAAe,uBAAuB,SAAS,SAAS,SAAS,SAAS;AACxE,MAAI,CAAC,UAAU,OAAO;AACpB,WAAO;AACT,aAAW,CAAC,QAAQ,GAAG,KAAK,aAAa,SAAS,OAAO,GAAG;AAC1D,QAAI;AACF,YAAM,UAAU,MAAM;AAAA,QACpB;AAAA,QACA;AAAA,UACE;AAAA,UACA,aAAa,UAAU,UAAU;AAAA,UACjC,cAAc;AAAA,QAChB;AAAA,MACF;AACA,gBAAU,QAAQ,QAAQ,KAAK,MAAM,GAAG,KAAK,OAAO,IAAI;AAAA,IAC1D,SAAS,OAAO;AACd,cAAQ,IAAI,KAAK,gCAAgC,QAAQ,KAAK;AAAA,IAChE;AAAA,EACF;AACA,SAAO;AACT;AACA,SAAS,UAAU,SAAS;AAC1B,SAAO,4BAA4B,KAAK,OAAO;AACjD;AACA,IAAM,SAAS;AACf,SAAS,aAAa,SAAS,SAAS;AACtC,QAAM,SAAS,CAAC;AAChB,UAAQ,QAAQ,QAAQ,CAAC,KAAK,WAAW,QAAQ;AAC/C,WAAO,KAAK,CAAC,KAAK,WAAW,KAAK,OAAO,CAAC,CAAC;AAC3C,WAAO;AAAA,EACT,CAAC;AACD,SAAO,OAAO,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,GAAG,CAAC;AACjD;AACA,SAAS,KAAK,KAAK;AACjB,QAAM,UAAU,IAAI,QAAQ,4BAA4B,MAAM;AAC9D,SAAO,IAAI,OAAO,iBAAiB,OAAO,eAAe,GAAG;AAC9D;AAEA,IAAM,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACA,SAAS,mBAAmB,OAAO,SAAS;AAC1C,SAAO,WAAW,IAAI,CAAC,aAAa;AAClC,UAAM,QAAQ,MAAM,iBAAiB,QAAQ;AAC7C,QAAI,CAAC,SAAS,UAAU,QAAQ;AAC9B,aAAO;AAAA,IACT;AACA,QAAI,aAAa,YAAY;AAC3B,cAAQ;AAAA,IACV;AACA,WAAO,uBAAuB,OAAO,MAAM,SAAS,IAAI,EAAE,KAAK,CAAC,aAAa;AAC3E,UAAI,CAAC,YAAY,UAAU;AACzB;AACF,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA,MAAM,oBAAoB,QAAQ;AAAA,MACpC;AAAA,IACF,CAAC;AAAA,EACH,CAAC,EAAE,OAAO,OAAO;AACnB;AAEA,SAAS,kBAAkB,QAAQ,SAAS;AAC1C,MAAI,eAAe,MAAM,GAAG;AAC1B,UAAM,cAAc,OAAO,cAAc,OAAO;AAChD,QAAI,CAAC,UAAU,WAAW,GAAG;AAC3B,aAAO;AAAA,QACL,aAAa,SAAS;AAAA,UACpB,KAAK;AAAA,UACL,UAAU;AAAA,UACV,aAAa;AAAA,UACb,cAAc;AAAA,QAChB,CAAC,EAAE,KAAK,CAAC,QAAQ;AACf,cAAI,CAAC;AACH;AACF,iBAAO,SAAS;AAChB,iBAAO,QAAQ,cAAc;AAC7B,iBAAO,MAAM,OAAO;AAAA,QACtB,CAAC;AAAA,MACH;AAAA,IACF;AACA,QAAI,aAAa,YAAY;AAC3B,cAAQ;AAAA,IACV;AAAA,EACF,WAAW,iBAAiB,MAAM,KAAK,CAAC,UAAU,OAAO,KAAK,OAAO,GAAG;AACtE,UAAM,cAAc,OAAO,KAAK;AAChC,WAAO;AAAA,MACL,aAAa,SAAS;AAAA,QACpB,KAAK;AAAA,QACL,UAAU;AAAA,QACV,aAAa;AAAA,QACb,cAAc;AAAA,MAChB,CAAC,EAAE,KAAK,CAAC,QAAQ;AACf,YAAI,CAAC;AACH;AACF,eAAO,QAAQ,cAAc;AAC7B,eAAO,KAAK,UAAU,OAAO;AAAA,MAC/B,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO,CAAC;AACV;AAEA,SAAS,YAAY,QAAQ,SAAS;AAlvCtC,MAAAA;AAmvCE,QAAM,EAAE,eAAe,eAAe,IAAI;AAC1C,QAAM,QAAOA,MAAA,OAAO,aAAa,MAAM,MAA1B,OAAAA,MAA+B,OAAO,aAAa,YAAY;AAC5E,MAAI,CAAC;AACH,WAAO,CAAC;AACV,QAAM,CAAC,QAAQ,EAAE,IAAI,KAAK,MAAM,GAAG;AACnC,MAAI,IAAI;AACN,UAAM,QAAQ,IAAI,EAAE;AACpB,UAAM,aAAa,QAAQ,YAAY;AAAA,MACrC,CAAC,KAAK,SAAS;AACb,eAAO,oBAAO,KAAK,cAAc,OAAO,KAAK,EAAE;AAAA,MACjD;AAAA,MACA,+CAAe,cAAc,OAAO,KAAK;AAAA,IAC3C;AACA,QAAI,QAAQ;AACV,aAAO,aAAa,QAAQ,KAAK;AAAA,IACnC;AACA,QAAI,iDAAgB,cAAc;AAChC,aAAO,CAAC;AACV,QAAI,YAAY;AACd,uDAAgB,YAAY,WAAW,UAAU,IAAI;AACrD,aAAO,CAAC;AAAA,IACV,WAAW,QAAQ;AACjB,aAAO;AAAA,QACL,aAAa,SAAS;AAAA,UACpB,KAAK;AAAA,UACL,cAAc;AAAA,QAChB,CAAC,EAAE,KAAK,CAAC,YAAY;AACnB,2DAAgB,mBAAmB,aAAa;AAAA,QAClD,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACA,SAAO,CAAC;AACV;AAEA,SAAS,UAAU,QAAQ,SAAS;AAClC,QAAM,EAAE,MAAM,IAAI;AAClB,MAAI,cAAc,MAAM,GAAG;AACzB,QAAI,eAAe,MAAM,KAAK,sBAAsB,MAAM,GAAG;AAC3D,YAAM,KAAK,GAAG,kBAAkB,QAAQ,OAAO,CAAC;AAAA,IAClD;AACA,QAAI,oBAAoB,MAAM,GAAG;AAC/B,YAAM,KAAK,GAAG,YAAY,QAAQ,OAAO,CAAC;AAAA,IAC5C;AAAA,EACF;AACA,MAAI,kBAAkB,MAAM,GAAG;AAC7B,UAAM,KAAK,GAAG,mBAAmB,OAAO,OAAO,OAAO,CAAC;AAAA,EACzD;AACA,SAAO,WAAW,QAAQ,CAAC,UAAU;AACnC,cAAU,OAAO,OAAO;AAAA,EAC1B,CAAC;AACH;AAEA,eAAe,aAAa,OAAO,SAAS;AAC1C,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AACJ,MAAI,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,aAAa,MAAM;AAC5D;AAAA,EACF;AACA,MAAI,QAAQ,KAAK,SAAS;AACxB,UAAM,UAAU,sBAAsB,KAAK,SAAS,OAAO;AAC3D,oBAAgB,YAAY,cAAc,eAAe,GAAG,OAAO;AAAA,CACtE,CAAC;AAAA,EACA,OAAO;AACL,UAAM,cAAc,MAAM,KAAK,cAAc,WAAW,EAAE,OAAO,CAAC,eAAe;AAC/E,UAAI;AACF,eAAO,cAAc,cAAc,QAAQ,WAAW,SAAS,MAAM;AAAA,MACvE,SAAS,OAAO;AACd,gBAAQ,IAAI,KAAK,sCAAsC,WAAW,IAAI,IAAI,KAAK;AAC/E,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AACD,UAAM,QAAQ;AAAA,MACZ,YAAY,QAAQ,CAAC,eAAe;AAClC,eAAO,MAAM,KAAK,WAAW,QAAQ,EAAE,IAAI,OAAO,SAAS,UAAU;AACnE,cAAI,gBAAgB,OAAO,GAAG;AAC5B,gBAAI,cAAc,QAAQ;AAC1B,kBAAM,UAAU,QAAQ;AACxB,gBAAI,UAAU;AACd,gBAAI;AACF,wBAAU,MAAM,aAAa,SAAS;AAAA,gBACpC,KAAK;AAAA,gBACL,aAAa;AAAA,gBACb,cAAc;AAAA,cAChB,CAAC;AAAA,YACH,SAAS,OAAO;AACd,sBAAQ,IAAI,KAAK,sCAAsC,OAAO,IAAI,KAAK;AAAA,YACzE;AACA,kBAAM,kBAAkB,QAAQ;AAAA,cAC9B;AAAA,cACA,CAAC,KAAK,WAAW,QAAQ,IAAI,QAAQ,KAAK,WAAW,KAAK,OAAO,CAAC;AAAA,YACpE;AACA,uBAAW,QAAQ,SAAS,eAAe,GAAG;AAC5C,kBAAI;AACF,2BAAW;AAAA,kBACT;AAAA,kBACA,KAAK,WAAW,SAAS,IAAI,eAAe,IAAI,WAAW,SAAS;AAAA,gBACtE;AAAA,cACF,SAAS,OAAO;AACd,wBAAQ,IAAI,KAAK,+CAA+C,EAAE,MAAM,MAAM,CAAC;AAAA,cACjF;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AACA,UAAM,WAAW,CAAC;AAClB,gBAAY,QAAQ,CAAC,UAAU;AAC7B,sBAAgB,MAAM,UAAU,QAAQ;AAAA,IAC1C,CAAC;AACD,aAAS,OAAO,CAAC,YAAS;AAv2C9B,UAAAA;AAu2CiC,+BAAkB,OAAO,KAAK,UAAU,QAAQ,MAAM,iBAAiB,KAAK,CAAC,OAAKA,MAAA,gBAAgB,QAAQ,MAAM,iBAAiB,aAAa,CAAC,MAA7D,gBAAAA,IAAgE,KAAK,CAAC,QAAQ,aAAa,IAAI,GAAG;AAAA,KAAE,EAAE,QAAQ,CAAC,UAAU;AACtO,YAAM,OAAO;AACb,YAAM,UAAU,aAAa,IAAI,KAAK,OAAO;AAC7C,UAAI,SAAS;AACX,wBAAgB,YAAY,cAAc,eAAe,GAAG,OAAO;AAAA,CAC1E,CAAC;AAAA,MACI,OAAO;AACL,cAAM;AAAA,UACJ;AAAA,YACE,KAAK;AAAA,YACL,KAAK,mBAAmB,KAAK,iBAAiB,OAAO;AAAA,YACrD;AAAA,UACF,EAAE,KAAK,CAAC,aAAa;AACnB,uBAAW,sBAAsB,UAAU,OAAO;AAClD,yBAAa,IAAI,KAAK,SAAS,QAAQ;AACvC,4BAAgB,YAAY,cAAc,eAAe,GAAG,QAAQ;AAAA,CAC/E,CAAC;AAAA,UACQ,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF;AACA,IAAM,cAAc;AACpB,IAAM,eAAe;AACrB,SAAS,SAAS,QAAQ;AACxB,MAAI,UAAU;AACZ,WAAO,CAAC;AACV,QAAM,SAAS,CAAC;AAChB,MAAI,UAAU,OAAO,QAAQ,aAAa,EAAE;AAC5C,SAAO,MAAM;AACX,UAAM,UAAU,aAAa,KAAK,OAAO;AACzC,QAAI,CAAC;AACH;AACF,WAAO,KAAK,QAAQ,CAAC,CAAC;AAAA,EACxB;AACA,YAAU,QAAQ,QAAQ,cAAc,EAAE;AAC1C,QAAM,YAAY;AAClB,QAAM,aAAa,IAAI;AAAA;AAAA,IAErB;AAAA,IACA;AAAA,EACF;AACA,SAAO,MAAM;AACX,QAAI,UAAU,UAAU,KAAK,OAAO;AACpC,QAAI,CAAC,SAAS;AACZ,gBAAU,WAAW,KAAK,OAAO;AACjC,UAAI,CAAC,SAAS;AACZ;AAAA,MACF,OAAO;AACL,kBAAU,YAAY,WAAW;AAAA,MACnC;AAAA,IACF,OAAO;AACL,iBAAW,YAAY,UAAU;AAAA,IACnC;AACA,WAAO,KAAK,QAAQ,CAAC,CAAC;AAAA,EACxB;AACA,SAAO;AACT;AACA,IAAM,qBAAqB;AAC3B,IAAM,cAAc;AACpB,SAAS,sBAAsB,KAAK,SAAS;AAC3C,QAAM,EAAE,KAAK,IAAI;AACjB,QAAM,kBAAkB,OAAO,6BAAM,kBAAkB;AACvD,SAAO,kBAAkB,IAAI,QAAQ,aAAa,CAAC,UAAU;AAC3D,WAAO,MAAM;AACX,YAAM,CAAC,KAAK,EAAE,MAAM,IAAI,mBAAmB,KAAK,KAAK,KAAK,CAAC;AAC3D,UAAI,CAAC;AACH,eAAO;AACT,UAAI,WAAW;AACb,eAAO,QAAQ,GAAG;AAAA,IACtB;AAAA,EACF,CAAC,IAAI;AACP;AACA,SAAS,gBAAgB,OAAO,MAAM,CAAC,GAAG;AACxC,aAAW,QAAQ,MAAM,KAAK,KAAK,GAAG;AACpC,QAAI,iBAAiB,IAAI,GAAG;AAC1B,UAAI,KAAK,GAAG,gBAAgB,KAAK,QAAQ,CAAC;AAAA,IAC5C,WAAW,cAAc,MAAM;AAC7B,sBAAgB,KAAK,UAAU,GAAG;AAAA,IACpC,OAAO;AACL,UAAI,KAAK,IAAI;AAAA,IACf;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,sBAAsB,MAAM,SAAS;AAClD,QAAM,UAAU,MAAM,gBAAgB,MAAM,OAAO;AACnD,MAAI,cAAc,QAAQ,IAAI,KAAK,iBAAiB,QAAQ,IAAI;AAC9D,WAAO,QAAQ;AACjB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AACJ,MAAI,KAAK,YAAY;AACrB,QAAM,QAAQ,MAAM,UAAU,QAAQ,MAAM,SAAS,IAAI;AACzD,MAAI,mBAAmB,eAAe;AACpC,QAAI,aAAa;AACjB,cAAU,QAAQ,CAAC,SAAS,YAAY;AACtC,oBAAc,GAAG,QAAQ,KAAK,KAAK,CAAC;AAAA,IACtC,OAAO;AAAA;AAAA;AAAA,IAGP,CAAC;AACD,oBAAgB,YAAY,cAAc,eAAe,UAAU,CAAC;AAAA,EACtE;AACA,MAAI,QAAQ,YAAY;AACxB,SAAM,2CAAc;AACpB,MAAI,SAAS,SAAS,cAAc,KAAK,GAAG;AAC1C,QAAI,KAAK,gBAAgB;AACzB,UAAM,aAAa,OAAO,OAAO;AACjC,QAAI,QAAQ,gBAAgB;AAAA,EAC9B;AACA,MAAI,KAAK,YAAY;AACrB,YAAU,OAAO,OAAO;AACxB,QAAM,QAAQ,MAAM;AACpB,MAAI,UAAU;AACd,QAAM,UAAU,YAAY;AAC1B,WAAO,MAAM;AACX,YAAM,OAAO,MAAM,IAAI;AACvB,UAAI,CAAC;AACH;AACF,UAAI;AACF,cAAM;AAAA,MACR,SAAS,OAAO;AACd,gBAAQ,IAAI,KAAK,sBAAsB,KAAK;AAAA,MAC9C;AACA,2CAAW,EAAE,SAAS;AAAA,IACxB;AAAA,EACF;AACA,uCAAW,SAAS;AACpB,QAAM,QAAQ,IAAI,CAAC,GAAG,MAAM,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,IAAI,OAAO,CAAC;AAC7D,MAAI,QAAQ,YAAY;AACxB,SAAM,2CAAc;AACpB,QAAM,MAAM,uBAAuB,OAAO,OAAO;AACjD,oBAAkB,IAAI,aAAa,gBAAgB,IAAI,SAAS,CAAC,CAAC;AAClE,qBAAmB,IAAI,aAAa,iBAAiB,IAAI,SAAS,CAAC,CAAC;AACpE,kBAAgB,eAAe,OAAO;AACtC,SAAM,qEAA2B;AACjC,SAAO;AACT;AACA,SAAS,uBAAuB,OAAO,SAAS;AAC9C,QAAM,EAAE,OAAO,OAAO,IAAI;AAC1B,QAAM,MAAM,UAAU,OAAO,QAAQ,MAAM,aAAa;AACxD,QAAM,gBAAgB,IAAI,cAAc,gBAAgB,IAAI,cAAc,eAAe;AACzF,gBAAc,eAAe,MAAM,KAAK,IAAI;AAC5C,gBAAc,eAAe,MAAM,KAAK,IAAI;AAC5C,gBAAc,eAAe,MAAM,SAAS,MAAM;AAClD,gBAAc,eAAe,MAAM,UAAU,MAAM;AACnD,gBAAc,OAAO,KAAK;AAC1B,MAAI,YAAY,aAAa;AAC7B,SAAO;AACT;AAEA,eAAe,YAAY,MAAM,SAAS;AA5gD1C,MAAAA;AA6gDE,QAAM,UAAU,MAAM,gBAAgB,MAAM,OAAO;AACnD,QAAM,MAAM,MAAM,sBAAsB,OAAO;AAC/C,QAAM,UAAU,aAAa,KAAK,QAAQ,SAAS,wBAAwB,CAAC;AAC5E,MAAI,CAAC,QAAQ,cAAc;AACzB,YAAQ,kBAAkB,mBAAmB,QAAQ,aAAa;AAClE,YAAQ,kBAAiBA,MAAA,QAAQ,kBAAR,gBAAAA,IAAuB,gBAAgB,OAAO;AACvE,YAAQ,UAAU,MAAM;AAAA,EAC1B;AACA,QAAM,QAAQ,YAAY,SAAS,IAAI,aAAa;AACpD,SAAO,MAAM,cAAc,OAAO,OAAO;AAC3C;AAuBA,eAAe,aAAa,MAAM,SAAS;AACzC,QAAM,UAAU,MAAM,gBAAgB,MAAM,OAAO;AACnD,QAAM,EAAE,KAAK,SAAS,MAAM,IAAI,IAAI;AACpC,QAAM,SAAS,MAAM,YAAY,OAAO;AACxC,MAAI,KAAK,oBAAoB;AAC7B,MAAI,UAAU,OAAO,UAAU,MAAM,OAAO;AAC5C,MAAI,CAAC,aAAa,YAAY,EAAE,SAAS,IAAI,KAAK,OAAO,gBAAgB,cAAc;AACrF,UAAM,CAAC,QAAQ,IAAI,IAAI,QAAQ,MAAM,GAAG;AACxC,QAAI,eAAe;AACnB,QAAI,gBAAgB;AACpB,QAAI,SAAS,aAAa;AACxB,YAAM,WAAW,2BAA2B,IAAI;AAChD,UAAI,YAAY,GAAG;AACjB,uBAAe,KAAK,MAAM,WAAW,MAAM,CAAC,IAAI;AAChD,wBAAgB;AAAA,MAClB,OAAO;AACL,uBAAe,KAAK,IAAI;AAAA,MAC1B;AAAA,IACF,WAAW,SAAS,cAAc;AAChC,qBAAe,KAAK,IAAI;AAAA,IAC1B;AACA,UAAM,eAAe,KAAK,UAAU,GAAG,YAAY;AACnD,UAAM,aAAa,KAAK,UAAU,YAAY;AAC9C,UAAM,cAAc,OAAO,KAAK,YAAY;AAC5C,UAAM,aAAa,IAAI,WAAW,YAAY,MAAM;AACpD,aAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC1C,iBAAW,CAAC,IAAI,YAAY,WAAW,CAAC;AAAA,IAC1C;AACA,UAAM,aAAa,SAAS,cAAc,aAAa,YAAY,KAAK,aAAa,IAAI,cAAc,YAAY,GAAG;AACtH,UAAM,eAAe,OAAO,KAAK,OAAO,aAAa,GAAG,UAAU,CAAC;AACnE,cAAU,CAAC,QAAQ,KAAK,cAAc,UAAU,EAAE,KAAK,EAAE;AAAA,EAC3D;AACA,MAAI,QAAQ,oBAAoB;AAChC,SAAO;AACT;AAuCA,eAAe,SAAS,MAAM,SAAS;AACrC,SAAO;AAAA,IACL,MAAM,gBAAgB,MAAM,iCAAK,UAAL,EAAc,MAAM,YAAY,EAAC;AAAA,EAC/D;AACF;;;ACxnDA,SAAS,WAAW,MAA4B;AAHhD,MAAAI;AAIE,OAAIA,MAAA,KAAK,iBAAL,gBAAAA,IAAA,WAAoB,kBAAmB,QAAO;AAClD,SAAO;AACT;AAIA,IAAI,eAAmC;AAEvC,eAAe,YAAkC;AAC/C,MAAI,gBAAgB,aAAa,OAAQ,QAAO;AAChD,iBAAe,MAAM,UAAU,aAAa,gBAAgB;AAAA,IAC1D,OAAO,EAAE,gBAAgB,UAAU;AAAA,IACnC,kBAAkB;AAAA,EACpB,CAAQ;AACR,eAAa,eAAe,EAAE,CAAC,EAAE,iBAAiB,SAAS,MAAM;AAC/D,mBAAe;AAAA,EACjB,CAAC;AACD,SAAO;AACT;AAEA,eAAe,UAAU,QAA2C;AAClE,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,YAAY;AAClB,QAAM,QAAQ;AACd,QAAM,MAAM,KAAK;AACjB,QAAM,IAAI,QAAQ,OAAK,sBAAsB,MAAM,sBAAsB,CAAC,CAAC,CAAC;AAC5E,QAAM,SAAS,MAAM,kBAAkB,KAAK;AAC5C,QAAM,MAAM;AACZ,QAAM,YAAY;AAClB,SAAO;AACT;AAEA,SAAS,sBAAsB,QAAqB,MAAgC;AAClF,SAAO,UAAU,MAAM,EAAE,KAAK,YAAU;AACtC,UAAM,MAAM,OAAO,oBAAoB;AACvC,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,QAAQ,KAAK,QAAQ;AAC5B,WAAO,SAAS,KAAK,SAAS;AAC9B,UAAM,MAAM,OAAO,WAAW,IAAI;AAClC,QAAI;AAAA,MACF;AAAA,MACA,KAAK,IAAI;AAAA,MAAK,KAAK,IAAI;AAAA,MACvB,KAAK,QAAQ;AAAA,MAAK,KAAK,SAAS;AAAA,MAChC;AAAA,MAAG;AAAA,MAAG,OAAO;AAAA,MAAO,OAAO;AAAA,IAC7B;AACA,WAAO,MAAM;AACb,WAAO,OAAO,UAAU,WAAW;AAAA,EACrC,CAAC;AACH;AAKA,eAAsB,eAAe,IAAqC;AAExE,MAAI;AACF,UAAM,UAAU,MAAM,SAAS,IAAmB;AAAA,MAChD,OAAO;AAAA,MACP,QAAQ;AAAA,IACV,CAAC;AACD,QAAI,QAAS,QAAO;AAAA,EACtB,SAAQ;AAAA,EAAqB;AAE7B,MAAI;AACF,UAAM,SAAS,MAAM,UAAU;AAC/B,WAAO,MAAM,sBAAsB,QAAQ,GAAG,sBAAsB,CAAC;AAAA,EACvE,SAAS,KAAK;AACZ,YAAQ,KAAK,sCAAsC,GAAG;AACtD,WAAO;AAAA,EACT;AACF;AAGA,eAAsB,cAAc,MAAuC;AAEzE,MAAI;AACF,UAAM,OAAO,MAAM,SAAS,SAAS,MAAM;AAAA,MACzC,OAAO;AAAA,MACP,QAAQ;AAAA,IACV,CAAC;AACD,QAAI,KAAM,QAAO,MAAM,UAAU,MAAM,IAAI;AAAA,EAC7C,SAAQ;AAAA,EAAqB;AAE7B,MAAI;AACF,UAAM,SAAS,MAAM,UAAU;AAC/B,WAAO,MAAM,sBAAsB,QAAQ,IAAI;AAAA,EACjD,SAAS,KAAK;AACZ,YAAQ,KAAK,qCAAqC,GAAG;AACrD,WAAO;AAAA,EACT;AACF;AAGA,SAAS,UAAU,SAAiB,MAAgC;AAClE,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,MAAM,IAAI,MAAM;AACtB,QAAI,SAAS,MAAM;AACjB,YAAM,QAAQ;AACd,YAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,aAAO,QAAQ,KAAK,QAAQ;AAC5B,aAAO,SAAS,KAAK,SAAS;AAC9B,YAAM,MAAM,OAAO,WAAW,IAAI;AAClC,UAAI;AAAA,QACF;AAAA,QACA,KAAK,IAAI;AAAA,QAAO,KAAK,IAAI;AAAA,QACzB,KAAK,QAAQ;AAAA,QAAO,KAAK,SAAS;AAAA,QAClC;AAAA,QAAG;AAAA,QACH,KAAK,QAAQ;AAAA,QAAO,KAAK,SAAS;AAAA,MACpC;AACA,cAAQ,OAAO,UAAU,WAAW,CAAC;AAAA,IACvC;AACA,QAAI,UAAU;AACd,QAAI,MAAM;AAAA,EACZ,CAAC;AACH;AAGO,SAAS,eAAwC;AACtD,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,WAAO,OAAO,QAAQ,OAAO;AAAA,MAC3B,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,YAAY;AAAA,IACd,CAAC;AACD,YAAQ,aAAa,kBAAkB,eAAe;AAEtD,UAAM,MAAM,SAAS,cAAc,KAAK;AACxC,WAAO,OAAO,IAAI,OAAO;AAAA,MACvB,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,SAAS;AAAA,MACT,eAAe;AAAA,IACjB,CAAC;AACD,YAAQ,YAAY,GAAG;AAEvB,QAAI,SAAS,GAAG,SAAS,GAAG,WAAW;AAEvC,UAAM,cAAc,CAAC,MAAkB;AACrC,eAAS,EAAE;AACX,eAAS,EAAE;AACX,iBAAW;AACX,UAAI,MAAM,UAAU;AACpB,gBAAU,CAAC;AAAA,IACb;AAEA,UAAM,cAAc,CAAC,MAAkB;AACrC,UAAI,CAAC,SAAU;AACf,gBAAU,CAAC;AAAA,IACb;AAEA,UAAM,YAAY,CAAC,MAAkB;AACnC,YAAM,IAAI,KAAK,IAAI,QAAQ,EAAE,OAAO;AACpC,YAAM,IAAI,KAAK,IAAI,QAAQ,EAAE,OAAO;AACpC,YAAM,IAAI,KAAK,IAAI,EAAE,UAAU,MAAM;AACrC,YAAM,IAAI,KAAK,IAAI,EAAE,UAAU,MAAM;AACrC,aAAO,OAAO,IAAI,OAAO;AAAA,QACvB,MAAM,GAAG,CAAC;AAAA,QACV,KAAK,GAAG,CAAC;AAAA,QACT,OAAO,GAAG,CAAC;AAAA,QACX,QAAQ,GAAG,CAAC;AAAA,MACd,CAAC;AAAA,IACH;AAEA,UAAM,YAAY,CAAC,MAAkB;AACnC,UAAI,CAAC,SAAU;AACf,iBAAW;AACX,YAAM,IAAI,KAAK,IAAI,QAAQ,EAAE,OAAO;AACpC,YAAM,IAAI,KAAK,IAAI,QAAQ,EAAE,OAAO;AACpC,YAAM,IAAI,KAAK,IAAI,EAAE,UAAU,MAAM;AACrC,YAAM,IAAI,KAAK,IAAI,EAAE,UAAU,MAAM;AACrC,cAAQ;AACR,UAAI,IAAI,MAAM,IAAI,IAAI;AACpB,gBAAQ,IAAI;AAAA,MACd,OAAO;AACL,gBAAQ,IAAI,QAAQ,GAAG,GAAG,GAAG,CAAC,CAAC;AAAA,MACjC;AAAA,IACF;AAEA,UAAM,YAAY,CAAC,MAAqB;AACtC,UAAI,EAAE,QAAQ,UAAU;AACtB,gBAAQ;AACR,gBAAQ,IAAI;AAAA,MACd;AAAA,IACF;AAEA,UAAM,UAAU,MAAM;AACpB,cAAQ,OAAO;AACf,eAAS,oBAAoB,WAAW,WAAW,IAAI;AAAA,IACzD;AAEA,YAAQ,iBAAiB,aAAa,WAAW;AACjD,YAAQ,iBAAiB,aAAa,WAAW;AACjD,YAAQ,iBAAiB,WAAW,SAAS;AAC7C,aAAS,iBAAiB,WAAW,WAAW,IAAI;AACpD,aAAS,KAAK,YAAY,OAAO;AAAA,EACnC,CAAC;AACH;;;ACzLA,SAAS,cAAc,YAAgC,UAAkC;AACvF,MAAI,CAAC,WAAY,QAAO;AACxB,MAAI,WAAW,WAAW,OAAO,EAAG,QAAO;AAE3C,QAAM,OAAO,8BAAY;AACzB,SAAO,GAAG,IAAI,IAAI,UAAU;AAC9B;AAEA,SAAS,IAAI,GAAmB;AAC9B,SAAO,OAAO,gBAAK,EAAE,EAAE,QAAQ,MAAM,OAAO,EAAE,QAAQ,MAAM,MAAM,EAAE,QAAQ,MAAM,MAAM,EAAE,QAAQ,MAAM,QAAQ;AAClH;AAGO,IAAM,kBAAN,MAAsB;AAAA,EAAtB;AACL,SAAQ,OAA2B;AACnC,SAAQ,SAA4B;AAqOpC,SAAQ,eAAe,CAAC,MAAwB;AAC9C,UAAI,KAAK,QAAQ,CAAC,KAAK,KAAK,SAAS,EAAE,MAAc,GAAG;AACtD,aAAK,QAAQ;AAAA,MACf;AAAA,IACF;AAAA;AAAA;AAAA,EArOA,QAAQ,SAA4B,WAAiC;AAvCvE,QAAAC,KAAA;AAwCI,SAAK,QAAQ;AACb,SAAK,OAAO,SAAS,cAAc,KAAK;AACxC,SAAK,KAAK,aAAa,kBAAkB,OAAO;AAChD,SAAK,oBAAoB,KAAK,IAAI;AAClC,SAAK,SAAS,KAAK,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAErD,UAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,UAAM,cAAc;AACpB,SAAK,OAAO,YAAY,KAAK;AAE7B,UAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,UAAM,YAAY;AAElB,UAAM,UAAU,QAAQ,YACpB,yBAAyB,IAAI,QAAQ,UAAU,SAAS,CAAC,WACzD;AACJ,UAAM,UAAU,QAAQ,eACpB,+BAA+B,IAAI,QAAQ,aAAa,MAAM,GAAG,EAAE,CAAC,CAAC,YACrE;AACJ,UAAM,gBAAgB,CAAC,CAAC,QAAQ;AAEhC,UAAM,YAAY;AAAA;AAAA,2CAEqB,IAAI,QAAQ,WAAW,CAAC,KAAK,IAAI,QAAQ,YAAY,CAAC;AAAA;AAAA;AAAA,QAGzF,OAAO,GAAG,OAAO;AAAA,qCACY,gBAC3B,6CAA6C,QAAQ,UAAU,2GAC/D,oWACJ;AAAA,+BACyB,gBAAgB,0BAA0B,4BAA4B;AAAA;AAAA;AAAA,2DAG1C,gBAAgB,KAAK,UAAU;AAAA;AAAA;AAItF,QAAI,qBAAoBA,MAAA,QAAQ,eAAR,OAAAA,MAAsB;AAC9C,UAAM,WAAW,MAAM,cAAc,UAAU;AAC/C,UAAM,YAAY,MAAM,cAAiC,wBAAwB;AACjF,UAAM,iBAAiB,MAAM,cAAc,kBAAkB;AAE7D,UAAM,oBAAoB,MAAM;AAC9B,gBAAU,WAAW,CAAC,qBAAqB,SAAS,MAAM,KAAK,EAAE,WAAW;AAAA,IAC9E;AAEA,UAAM,yBAAyB,MAAM;AAEnC,YAAM,aAAa,eAAe,cAAc,yBAAyB;AACzE,+CAAY,iBAAiB,SAAS,YAAY;AAChD,mBAAW,cAAc;AACzB,cAAM,UAAU,MAAM,eAAe,QAAQ,OAAO;AACpD,YAAI,SAAS;AACX,8BAAoB;AACpB,yBAAe,YAAY,6CAA6C,OAAO;AAC/E,mBAAS,cAAc;AACvB,iCAAuB;AACvB,4BAAkB;AAAA,QACpB,OAAO;AACL,qBAAW,cAAc;AACzB,qBAAW,MAAM;AAAE,gBAAI,WAAW,cAAe,YAAW,YAAY;AAAA,UAA0S,GAAG,IAAI;AAAA,QAC3X;AAAA,MACF;AAGA,YAAM,YAAY,eAAe,cAAc,oBAAoB;AACnE,6CAAW,iBAAiB,SAAS,MAAM;AACzC,4BAAoB;AACpB,uBAAe,YAAY;AAC3B,iBAAS,cAAc;AACvB,+BAAuB;AACvB,0BAAkB;AAAA,MACpB;AAAA,IACF;AAEA,2BAAuB;AAEvB,aAAS,iBAAiB,SAAS,iBAAiB;AACpD,aAAS,iBAAiB,WAAW,CAAC,MAAM;AAE1C,QAAE,gBAAgB;AAClB,UAAI,EAAE,QAAQ,WAAW,CAAC,EAAE,UAAU;AACpC,UAAE,eAAe;AACjB,YAAI,CAAC,UAAU,SAAU,WAAU,MAAM;AAAA,MAC3C;AACA,UAAI,EAAE,QAAQ,UAAU;AAAE,kBAAU,SAAS;AAAG,aAAK,QAAQ;AAAA,MAAE;AAAA,IACjE,CAAC;AAED,UAAM,cAAc,wBAAwB,EAAG,iBAAiB,SAAS,MAAM;AAC7E,gBAAU,SAAS;AAAG,WAAK,QAAQ;AAAA,IACrC,CAAC;AACD,UAAM,cAAc,YAAY,EAAG,iBAAiB,SAAS,MAAM;AACjE,gBAAU,SAAS;AAAG,WAAK,QAAQ;AAAA,IACrC,CAAC;AACD,cAAU,iBAAiB,SAAS,MAAM;AACxC,YAAM,UAAU,SAAS,MAAM,KAAK;AACpC,UAAI,CAAC,WAAW,CAAC,kBAAmB;AACpC,gBAAU,SAAS,EAAE,SAAS,WAAW,gBAAgB,YAAY,gDAAqB,OAAU,CAAC;AACrG,WAAK,QAAQ;AAAA,IACf,CAAC;AAED,SAAK,OAAO,YAAY,KAAK;AAC5B,MAAC,cAAS,eAAe,gBAAgB,MAAxC,YAA6C,SAAS,MAAM,YAAY,KAAK,IAAI;AAEnF,SAAK,aAAa,QAAQ,GAAG,QAAQ,CAAC;AACtC,SAAK,kBAAkB;AACvB,aAAS,MAAM;AAAA,EACjB;AAAA;AAAA,EAIA,SAAS,YAAwB,WAA0B,UAAyB;AAxJtF,QAAAA;AAyJI,SAAK,QAAQ;AACb,SAAK,OAAO,SAAS,cAAc,KAAK;AACxC,SAAK,KAAK,aAAa,kBAAkB,OAAO;AAChD,SAAK,oBAAoB,KAAK,IAAI;AAClC,SAAK,SAAS,KAAK,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAErD,UAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,UAAM,cAAc;AACpB,SAAK,OAAO,YAAY,KAAK;AAE7B,UAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,UAAM,YAAY;AAElB,UAAM,UAAU,WAAW,YACvB,yBAAyB,IAAI,WAAW,UAAU,SAAS,CAAC,WAC5D;AACJ,UAAM,QAAQ,cAAc,WAAW,YAAY,QAAQ;AAC3D,UAAM,oBAAoB,QACtB,6DAA6D,KAAK,2GAClE;AACJ,UAAM,cAAc,WAAW,YAAY,iBAAiB,KAAK,WAAW;AAE5E,UAAM,YAAY;AAAA;AAAA,2CAEqB,IAAI,WAAW,WAAW,CAAC,KAAK,IAAI,WAAW,OAAO,CAAC;AAAA;AAAA;AAAA,QAG1F,OAAO,GAAG,iBAAiB;AAAA,2BACR,IAAI,WAAW,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAOvC,UAAM,cAAc,YAAY,EAAG,iBAAiB,SAAS,MAAM,KAAK,QAAQ,CAAC;AAGjF,UAAM,cAAc,MAAM,cAAc,oBAAoB;AAC5D,+CAAa,iBAAiB,SAAS,MAAM;AAC3C,gBAAU,OAAO,YAAY,WAAW,OAAO;AAE/C,YAAM,OAAO,MAAM,cAAc,kBAAkB;AACnD,UAAI,KAAM,MAAK,OAAO;AAAA,IACxB;AAEA,UAAM,WAAW,MAAM,cAAc,UAAU;AAC/C,UAAM,UAAU,MAAM,cAAiC,sBAAsB;AAC7E,UAAM,YAAY,MAAM,cAAiC,wBAAwB;AAEjF,aAAS,iBAAiB,WAAW,CAAC,MAAM;AAC1C,QAAE,gBAAgB;AAClB,UAAI,EAAE,QAAQ,WAAW,CAAC,EAAE,UAAU;AACpC,UAAE,eAAe;AACjB,gBAAQ,MAAM;AAAA,MAChB;AACA,UAAI,EAAE,QAAQ,SAAU,MAAK,QAAQ;AAAA,IACvC,CAAC;AAED,YAAQ,iBAAiB,SAAS,MAAM;AACtC,YAAM,aAAa,SAAS,MAAM,KAAK;AACvC,UAAI,CAAC,WAAY;AACjB,gBAAU,OAAO,YAAY,UAAU;AACvC,WAAK,QAAQ;AAAA,IACf,CAAC;AAED,cAAU,iBAAiB,SAAS,MAAM;AACxC,gBAAU,SAAS,UAAU;AAC7B,WAAK,QAAQ;AAAA,IACf,CAAC;AAED,SAAK,OAAO,YAAY,KAAK;AAC5B,MAACA,MAAA,SAAS,eAAe,gBAAgB,MAAxC,OAAAA,MAA6C,SAAS,MAAM,YAAY,KAAK,IAAI;AAGnF,UAAM,UAAW,WAAW,IAAI,MAAO,OAAO;AAC9C,UAAM,UAAU,WAAW,IAAI,OAAO;AACtC,SAAK,aAAa,SAAS,OAAO;AAClC,SAAK,kBAAkB;AACvB,aAAS,MAAM;AACf,aAAS,kBAAkB,SAAS,MAAM,QAAQ,SAAS,MAAM,MAAM;AAAA,EACzE;AAAA;AAAA;AAAA,EAKQ,oBAAoB,MAAyB;AACnD,eAAW,OAAO,CAAC,SAAS,aAAa,eAAe,WAAW,SAAS,YAAY,QAAQ,GAAY;AAC1G,WAAK,iBAAiB,KAAK,CAAC,MAAM,EAAE,gBAAgB,CAAC;AAAA,IACvD;AAAA,EACF;AAAA,EAEQ,aAAa,GAAW,GAAiB;AAC/C,QAAI,CAAC,KAAK,KAAM;AAEhB,SAAK,KAAK,aAAa,WAAW,QAAQ;AAC1C,QAAI;AAAE,WAAK,KAAK,YAAY;AAAA,IAAE,SAAQ;AAAA,IAA4B;AAClE,WAAO,OAAO,KAAK,KAAK,OAAO,EAAE,UAAU,SAAS,QAAQ,cAAc,MAAM,WAAW,KAAK,IAAI,CAAC;AAErG,0BAAsB,MAAM;AA5PhC,UAAAA,KAAA;AA6PM,UAAI,CAAC,KAAK,KAAM;AAChB,YAAM,IAAI,MAAM;AAChB,YAAM,KAAI,MAAAA,MAAA,KAAK,KAAK,cAAc,QAAQ,MAAhC,gBAAAA,IAAmC,wBAAwB,WAA3D,YAAqE;AAC/E,YAAM,KAAK,OAAO;AAClB,YAAM,KAAK,OAAO;AAClB,YAAM,OAAO,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,CAAC;AAClD,YAAM,MAAO,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;AACvD,aAAO,OAAO,KAAK,KAAK,OAAO,EAAE,MAAM,GAAG,IAAI,MAAM,KAAK,GAAG,GAAG,KAAK,CAAC;AAAA,IACvE,CAAC;AAAA,EACH;AAAA,EAQQ,oBAA0B;AAChC,eAAW,MAAM,SAAS,iBAAiB,aAAa,KAAK,YAAY,GAAG,CAAC;AAAA,EAC/E;AAAA,EAEA,UAAgB;AAlRlB,QAAAA;AAmRI,KAAAA,MAAA,KAAK,SAAL,gBAAAA,IAAW;AACX,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,aAAS,oBAAoB,aAAa,KAAK,YAAY;AAAA,EAC7D;AACF;;;AC9QO,IAAM,oBAAN,MAAwB;AAAA,EAI7B,YAA6B,SAA6B;AAA7B;AAF7B,SAAQ,UAAiC,oBAAI,IAAI;AAZnD,QAAAC;AAgBI,SAAK,YAAY,SAAS,cAAc,KAAK;AAC7C,WAAO,OAAO,KAAK,UAAU,OAAO;AAAA,MAClC,UAAU;AAAA,MACV,OAAO;AAAA,MACP,eAAe;AAAA,MACf,QAAQ;AAAA,IACV,CAAC;AACD,SAAK,UAAU,aAAa,kBAAkB,SAAS;AACvD,UAAM,QAAOA,MAAA,SAAS,eAAe,gBAAgB,MAAxC,OAAAA,MAA6C,SAAS;AACnE,SAAK,YAAY,KAAK,SAAS;AAAA,EACjC;AAAA;AAAA,EAGA,OAAO,YAAwB,OAAqB;AAClD,UAAM,WAAW,KAAK,QAAQ,IAAI,WAAW,EAAE;AAE/C,QAAI,UAAU;AACZ,WAAK,YAAY,SAAS,IAAI,UAAU;AACxC;AAAA,IACF;AAEA,UAAM,KAAK,SAAS,cAAc,KAAK;AACvC,UAAM,UAAU,WAAW,aAAa,oBAAoB;AAC5D,OAAG,YAAY,aAAa,KAAK,YAAY,WAAW,MAAM,CAAC,GAAG,OAAO;AACzE,OAAG,cAAc,OAAO,KAAK;AAC7B,OAAG,QAAQ,WAAW,YAAY,iBAAiB,eAAe,WAAW,QAAQ,MAAM,GAAG,EAAE;AAChG,OAAG,MAAM,gBAAgB;AAIzB,OAAG,MAAM,OAAO,GAAI,WAAW,IAAI,MAAO,OAAO,UAAU;AAC3D,OAAG,MAAM,MAAM,GAAG,WAAW,IAAI,OAAO,OAAO;AAE/C,OAAG,iBAAiB,SAAS,CAAC,MAAM;AAClC,QAAE,gBAAgB;AAClB,WAAK,QAAQ,UAAU;AAAA,IACzB,CAAC;AAED,SAAK,UAAU,YAAY,EAAE;AAC7B,SAAK,QAAQ,IAAI,WAAW,IAAI,EAAE,IAAI,cAAc,WAAW,GAAG,CAAC;AAAA,EACrE;AAAA;AAAA,EAGA,OAAO,YAA8B;AACnC,UAAM,SAAS,KAAK,QAAQ,IAAI,WAAW,EAAE;AAC7C,QAAI,CAAC,OAAQ;AACb,SAAK,YAAY,OAAO,IAAI,UAAU;AAAA,EACxC;AAAA,EAEQ,YAAY,IAAiB,YAA8B;AACjE,UAAM,UAAU,WAAW,aAAa,oBAAoB;AAC5D,OAAG,YAAY,aAAa,KAAK,YAAY,WAAW,MAAM,CAAC,GAAG,OAAO;AACzE,OAAG,QAAQ,WAAW,YAAY,iBAAiB,eAAe,WAAW,QAAQ,MAAM,GAAG,EAAE;AAAA,EAClG;AAAA,EAEQ,YAAY,QAAwB;AAC1C,QAAI,WAAW,WAAY,QAAO;AAClC,QAAI,WAAW,YAAa,QAAO;AACnC,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,WAAW,aAAiC;AAC1C,gBAAY,QAAQ,gBAAc;AAChC,YAAM,SAAS,KAAK,QAAQ,IAAI,WAAW,EAAE;AAC7C,UAAI,CAAC,OAAQ;AACb,aAAO,GAAG,MAAM,OAAO,GAAI,WAAW,IAAI,MAAO,OAAO,UAAU;AAClE,aAAO,GAAG,MAAM,MAAM,GAAG,WAAW,IAAI,OAAO,OAAO;AAAA,IACxD,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,cAA4B;AACjC,UAAM,SAAS,KAAK,QAAQ,IAAI,YAAY;AAC5C,QAAI,CAAC,OAAQ;AACb,WAAO,GAAG,OAAO;AACjB,SAAK,QAAQ,OAAO,YAAY;AAAA,EAClC;AAAA;AAAA,EAGA,WAAW,SAAwB;AACjC,SAAK,UAAU,MAAM,UAAU,UAAU,KAAK;AAAA,EAChD;AAAA;AAAA,EAGA,QAAc;AACZ,eAAW,EAAE,GAAG,KAAK,KAAK,QAAQ,OAAO,GAAG;AAC1C,SAAG,OAAO;AAAA,IACZ;AACA,SAAK,QAAQ,MAAM;AAAA,EACrB;AAAA,EAEA,UAAgB;AACd,SAAK,UAAU,OAAO;AACtB,SAAK,QAAQ,MAAM;AAAA,EACrB;AACF;;;ACzGO,SAAS,mBAAmB,IAAqB;AACtD,MAAI,GAAG,IAAI;AACT,WAAO,IAAI,IAAI,OAAO,GAAG,EAAE,CAAC;AAAA,EAC9B;AAEA,QAAM,OAAiB,CAAC;AACxB,MAAI,UAA0B;AAE9B,SAAO,WAAW,YAAY,SAAS,iBAAiB;AACtD,UAAM,MAAM,QAAQ,QAAQ,YAAY;AACxC,UAAM,SAAyB,QAAQ;AAEvC,QAAI,CAAC,QAAQ;AACX,WAAK,QAAQ,GAAG;AAChB;AAAA,IACF;AAGA,UAAM,UAAU,MAAM,KAAK,QAAQ,SAAS,EACzC,OAAO,OAAK,CAAC,EAAE,MAAM,wCAAwC,CAAC,EAC9D,MAAM,GAAG,CAAC;AAEb,QAAI,QAAQ,SAAS,GAAG;AACtB,YAAM,gBAAgB,GAAG,GAAG,IAAI,QAAQ,IAAI,IAAI,MAAM,EAAE,KAAK,GAAG,CAAC;AACjE,YAAM,UAAU,OAAO,iBAAiB,aAAa;AACrD,UAAI,QAAQ,WAAW,GAAG;AACxB,aAAK,QAAQ,aAAa;AAC1B;AAAA,MACF;AAAA,IACF;AAGA,UAAM,WAAW,MAAM,KAAK,OAAO,QAAQ,EAAE,OAAO,CAAC,MAAe,EAAE,YAAY,QAAS,OAAO;AAClG,QAAI,SAAS,WAAW,GAAG;AACzB,WAAK,QAAQ,GAAG;AAAA,IAClB,OAAO;AACL,YAAM,QAAQ,SAAS,QAAQ,OAAO,IAAI;AAC1C,WAAK,QAAQ,GAAG,GAAG,gBAAgB,KAAK,GAAG;AAAA,IAC7C;AAEA,cAAU;AAAA,EACZ;AAEA,SAAO,KAAK,KAAK,KAAK;AACxB;AAGO,SAAS,eAAe,IAAqB;AAClD,QAAM,MAAM,GAAG,QAAQ,YAAY;AAEnC,QAAM,YAAY,GAAG,aAAa,YAAY,KAAK,GAAG,aAAa,YAAY;AAC/E,MAAI,UAAW,QAAO,GAAG,GAAG,SAAS,UAAU,MAAM,GAAG,EAAE,CAAC,CAAC;AAE5D,MAAI,GAAG,GAAI,QAAO,GAAG,GAAG,IAAI,GAAG,EAAE;AAEjC,QAAM,aAAa,GAAG,UAAU,CAAC;AACjC,MAAI,WAAY,QAAO,GAAG,GAAG,IAAI,UAAU;AAE3C,SAAO;AACT;AAGO,SAAS,gBAAgB,IAAqB;AACnD,QAAM,MAAM,GAAG,QAAQ,YAAY;AACnC,QAAM,QAAQ,GAAG,eAAe,IAAI,KAAK,EAAE,QAAQ,QAAQ,GAAG,EAAE,MAAM,GAAG,EAAE;AAG3E,QAAM,QAAkB,CAAC;AACzB,MAAI,GAAG,GAAI,OAAM,KAAK,OAAO,GAAG,EAAE,GAAG;AACrC,QAAM,OAAO,GAAG,aAAa,MAAM;AACnC,MAAI,KAAM,OAAM,KAAK,SAAS,IAAI,GAAG;AACrC,QAAM,WAAW,GAAG,aAAa,YAAY,KAAK,GAAG,aAAa,YAAY;AAC9E,MAAI,SAAU,OAAM,KAAK,QAAQ,GAAG,aAAa,YAAY,IAAI,UAAU,OAAO,KAAK,QAAQ,GAAG;AAElG,QAAM,UAAU,MAAM,SAAS,MAAM,MAAM,KAAK,GAAG,IAAI;AACvD,QAAM,UAAU,IAAI,GAAG,GAAG,OAAO;AAEjC,MAAI,KAAM,QAAO,GAAG,OAAO,IAAI,IAAI;AACnC,SAAO;AACT;AAGO,SAAS,cAAc,IAAqB;AACjD,QAAM,QAAQ,GAAG,eAAe,IAAI,KAAK,EAAE,QAAQ,QAAQ,GAAG;AAC9D,SAAO,KAAK,MAAM,GAAG,GAAG;AAC1B;AAGO,SAAS,cAAc,IAAqB;AACjD,SAAO,MAAM,KAAK,GAAG,SAAS,EAC3B,OAAO,OAAK,CAAC,EAAE,MAAM,eAAe,CAAC,EACrC,KAAK,GAAG;AACb;AAGO,SAAS,mBAAmB,IAAsE;AACvG,QAAM,OAAO,GAAG,sBAAsB;AACtC,SAAO;AAAA,IACL,GAAG,KAAK,OAAO,OAAO;AAAA,IACtB,GAAG,KAAK,MAAM,OAAO;AAAA,IACrB,OAAO,KAAK;AAAA,IACZ,QAAQ,KAAK;AAAA,EACf;AACF;;;ACrGO,SAAS,cAAuB;AACrC,SAAO,OAAO,OAAO,aAAa;AACpC;AAGO,SAAS,OAAO,IAA6B;AAClD,MAAI,OAAuB;AAC3B,SAAO,QAAQ,SAAS,SAAS,iBAAiB;AAChD,QAAI,KAAK,aAAa,SAAS,EAAG,QAAO;AACzC,WAAO,KAAK;AAAA,EACd;AACA,SAAO;AACT;AAGO,SAAS,WAAW,IAAsC;AAvBjE,MAAAC,KAAA;AAwBE,MAAI,CAAC,YAAY,EAAG,QAAO;AAE3B,QAAM,SAAS,OAAO,EAAE;AACxB,MAAI,CAAC,OAAQ,QAAO;AAEpB,QAAM,SAAS,OAAO,aAAa,SAAS;AAG5C,MAAI,gBAAgB;AACpB,MAAI;AACJ,QAAM,eAAe,OAAO,aAAa,eAAe;AACxD,MAAI,cAAc;AAChB,QAAI;AACF,YAAM,WAAW,KAAK,MAAM,YAAY;AACxC,uBAAgB,MAAAA,MAAA,qCAAU,SAAV,gBAAAA,IAAgB,SAAhB,YAAwB;AAExC,mBAAY,gDAAU,SAAV,mBAAgB,SAAhB,aAAwB,0CAAU,SAAV,mBAAgB;AAAA,IACtD,SAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO;AAAA,IACL,WAAW;AAAA,IACX,WAAW;AAAA,IACX,SAAS;AAAA,IACT,YAAY;AAAA,EACd;AACF;;;AC7BA,SAAS,WAAW,MAAmC;AACrD,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,CAAC,KAAK,SAAS,cAAc;AACtC;AAEA,SAAS,gBAAgB,UAA2C;AA5BpE,MAAAC,KAAA;AA6BE,UAAO,MAAAA,MAAA,SAAS,SAAT,gBAAAA,IAAe,WAAf,aAAyB,cAAS,aAAT,mBAAmB;AACrD;AAEA,SAAS,gBAAgB,UAA+B;AAhCxD,MAAAA,KAAA;AAiCE,UACE,wBAAAA,MAAA,SAAS,aAAT,gBAAAA,IAAmB,SAAnB,aACA,cAAS,aAAT,mBAAmB,WADnB,aAEA,cAAS,SAAT,mBAAe,SAFf,aAGA,cAAS,SAAT,mBAAe,WAHf,YAIA;AAEJ;AAMO,SAASC,QAAO,IAAiC;AA9CxD,MAAAD;AA+CE,MAAI,aAAiC;AACrC,MAAI,OAA0B;AAE9B,SAAO,QAAQ,SAAS,SAAS,iBAAiB;AAChD,UAAM,YAAWA,MAAA,KAAK,yBAAL,OAAAA,MAA6B,KAAK;AACnD,QAAI,UAAU;AACZ,YAAM,OAAO,gBAAgB,QAAQ;AAGrC,UAAI,WAAW,IAAI,EAAG,QAAO;AAG7B,UAAI,CAAC,WAAY,cAAa;AAAA,IAChC;AACA,WAAO,KAAK;AAAA,EACd;AAIA,MAAI,yCAAY,QAAQ;AACtB,QAAI,WAAoC,WAAW;AACnD,WAAO,UAAU;AACf,YAAM,OAAO,gBAAgB,QAAQ;AACrC,UAAI,WAAW,IAAI,EAAG,QAAO;AAC7B,iBAAW,SAAS;AAAA,IACtB;AAAA,EACF;AAEA,SAAO;AACT;AAGO,SAASE,YAAW,IAAsC;AAC/D,QAAM,WAAWD,QAAO,EAAE;AAC1B,MAAI,CAAC,SAAU,QAAO;AAEtB,QAAM,OAAO,gBAAgB,QAAQ;AAErC,QAAM,OAAgC,CAAC;AAGvC,MAAI,SAAS,OAAO;AAClB,WAAO,OAAO,MAAM,SAAS,KAAK;AAAA,EACpC;AAGA,MAAI,SAAS,YAAY;AACvB,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,SAAS,UAAU,GAAG;AAC9D,UAAI,CAAC,IAAI,WAAW,GAAG,KAAK,OAAO,UAAU,YAAY;AACvD,YAAI;AACF,eAAK,GAAG,IAAI,KAAK,MAAM,KAAK,UAAU,KAAK,CAAC;AAAA,QAC9C,SAAQ;AACN,eAAK,GAAG,IAAI,OAAO,KAAK;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,OAAO,gBAAgB,QAAQ;AAErC,SAAO;AAAA,IACL,WAAW;AAAA,IACX,WAAW;AAAA,IACX,aAAa;AAAA,IACb,eAAe,SAAS,QAAQ,SAAY,OAAO,SAAS,GAAG,IAAI;AAAA,IACnE;AAAA,EACF;AACF;;;ACrGO,SAASE,QAAO,IAAgC;AACrD,MAAI,OAA6B;AACjC,SAAO,QAAQ,SAAS,SAAS,iBAAiB;AAChD,QAAI,KAAK,cAAe,QAAO,KAAK;AACpC,WAAO,KAAK;AAAA,EACd;AACA,SAAO;AACT;AAGO,SAASC,YAAW,IAAsC;AAvBjE,MAAAC,KAAA;AAwBE,QAAM,OAAOF,QAAO,EAAE;AACtB,MAAI,CAAC,KAAM,QAAO;AAGlB,QAAM,YAAW,MAAAE,MAAA,KAAK,QAAL,gBAAAA,IAAU,SAAV,YAAkB;AACnC,QAAM,YAAY,YACd,oBAAS,MAAM,GAAG,EAAE,IAAI,MAAxB,mBAA2B,QAAQ,aAAa,QAAhD,YAAuD,YACvD;AAEJ,SAAO;AAAA,IACL,WAAW;AAAA,IACX;AAAA,IACA,aAAa,YAAY;AAAA,IACzB,MAAM,WAAW,EAAE,MAAM,SAAS,IAAI;AAAA,EACxC;AACF;;;ACjBA,SAAS,YAAY,IAA4B;AAC/C,aAAW,OAAO,OAAO,KAAK,EAAE,GAAG;AACjC,QAAI,IAAI,WAAW,eAAe,KAAK,IAAI,WAAW,0BAA0B,GAAG;AACjF,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAGA,SAAS,aAAa,QAA0C;AAC9D,MAAI,CAAC,OAAQ,QAAO;AACpB,SAAO,CAAC,OAAO,SAAS,SAAS,cAAc;AACjD;AAyBA,SAAS,cAAc,OAAkC;AACvD,MAAI,aAAmC;AACvC,MAAI,OAA0B;AAE9B,SAAO,MAAM;AACX,UAAM,EAAE,KAAK,IAAI;AACjB,QAAI,OAAsB;AAE1B,QAAI,OAAO,SAAS,cAAe,KAA2B,MAAM;AAClE,YAAM,IAAK,KAA0B;AACrC,UAAI,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,YAAY,KAAK,EAAE,SAAS,EAAG,QAAO;AAAA,IAC1D;AACA,QAAI,CAAC,QAAQ,OAAO,SAAS,YAAY,SAAS,QAAS,KAAkC,aAAa;AACxG,aAAQ,KAAiC;AAAA,IAC3C;AAEA,QAAI,MAAM;AACR,YAAM,OAAsB,EAAE,MAAM,QAAQ,KAAK,aAAa;AAG9D,UAAI,aAAa,KAAK,YAAY,EAAG,QAAO;AAG5C,UAAI,CAAC,WAAY,cAAa;AAAA,IAChC;AAEA,WAAO,KAAK;AAAA,EACd;AAEA,SAAO,kCAAc,EAAE,MAAM,YAAY;AAC3C;AAEA,SAAS,SAAS,OAA4C;AA5F9D,MAAAC,KAAA;AA6FE,QAAM,SAAQ,MAAAA,MAAA,MAAM,kBAAN,OAAAA,MAAuB,MAAM,iBAA7B,YAA6C,CAAC;AAC5D,QAAM,SAAkC,CAAC;AACzC,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC1C,QAAI,MAAM,cAAc,OAAO,MAAM,WAAY;AACjD,QAAI;AACF,aAAO,CAAC,IAAI,KAAK,MAAM,KAAK,UAAU,CAAC,CAAC;AAAA,IAC1C,SAAQ;AACN,aAAO,CAAC,IAAI,OAAO,CAAC;AAAA,IACtB;AAAA,EACF;AACA,SAAO;AACT;AASO,SAASC,YAAW,IAAsC;AAC/D,MAAI,OAAuB;AAC3B,SAAO,QAAQ,SAAS,SAAS,iBAAiB;AAChD,UAAM,MAAM,YAAY,IAAI;AAC5B,QAAI,KAAK;AACP,YAAM,QAAS,KAAsB,GAAG;AACxC,UAAI,OAAO;AACT,cAAM,EAAE,MAAM,OAAO,IAAI,cAAc,KAAK;AAC5C,cAAM,OAAO,SAAS,KAAK;AAC3B,eAAO;AAAA,UACL,WAAW;AAAA,UACX,WAAW;AAAA,UACX,aAAa,iCAAQ;AAAA,UACrB,aAAa,iCAAQ;AAAA,UACrB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,WAAO,KAAK;AAAA,EACd;AACA,SAAO;AACT;;;ACzHA,SAAS,kBAAoC;AAb7C,MAAAC;AAcE,QAAM,KAAK,SAAS,eAAe,iBAAiB;AACpD,MAAI,CAAC,GAAI,QAAO,CAAC;AAEjB,MAAI;AACF,WAAO,KAAK,OAAMA,MAAA,GAAG,gBAAH,OAAAA,MAAkB,IAAI;AAAA,EAC1C,SAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAUO,SAASC,YAAW,KAAuC;AAhClE,MAAAD;AAiCE,QAAM,QAAQ,gBAAgB;AAC9B,MAAI,MAAM,WAAW,EAAG,QAAO;AAI/B,QAAM,WAAW,MAAM,SAAS,KAC5BA,MAAA,MAAM,KAAK,OAAK,CAAC,EAAE,KAAK,WAAW,UAAU,KAAK,CAAC,EAAE,KAAK,WAAW,aAAa,CAAC,MAAnF,OAAAA,MAAwF,MAAM,MAAM,SAAS,CAAC,IAC9G,MAAM,CAAC;AAEX,SAAO;AAAA,IACL,WAAW;AAAA,IACX,WAAW,SAAS;AAAA,IACpB,aAAa,SAAS;AAAA,IACtB,MAAM,EAAE,OAAO,MAAM,IAAI,OAAK,EAAE,IAAI,EAAE;AAAA,EACxC;AACF;;;AC5BA,SAAS,UAAkB;AACzB,SAAO,OAAO,SAAS;AACzB;AAEO,IAAM,aAAN,MAAM,WAAU;AAAA,EAqBrB,YAAY,QAAyB;AAlBrC,SAAQ,UAA0B;AAClC,SAAQ,YAAqC;AAC7C,SAAQ,QAAgC;AACxC,SAAQ,UAAoC;AAC5C,SAAQ,cAA4B,CAAC;AACrC,SAAQ,eAAe;AACvB,SAAQ,WAAW;AACnB,SAAQ,gBAAyC;AACjD,SAAQ,iBAA0D,CAAC;AACnE,SAAQ,QAAuB;AAC/B,SAAQ,qBAAqC;AAC7C,SAAQ,kBAAkB;AAC1B,SAAQ,YAAmD;AAE3D,SAAQ,kBAAkB,MAAY;AAzCxC,UAAAE;AA0CI,OAAAA,MAAA,KAAK,YAAL,gBAAAA,IAAc,WAAW,KAAK;AAAA,IAChC;AA6TA,SAAQ,oBAAoB,CAAC,SAAS,aAAa,eAAe,aAAa,WAAW,cAAc,YAAY,UAAU;AAC9H,SAAQ,sBAAsB,CAAC,WAAW,YAAY,QAAQ,gBAAgB,cAAc,UAAU;AA6BtG;AAAA,SAAQ,mBAAmB,CAAC,MAAmB;AAC7C,UAAI,KAAK,YAAY,EAAE,MAAM,EAAG;AAIhC,UAAI,KAAK,gBAAgB,EAAE,SAAS,QAAS;AAC7C,QAAE,eAAe;AACjB,QAAE,gBAAgB;AAClB,QAAE,yBAAyB;AAAA,IAC7B;AAEA,SAAQ,oBAAoB,CAAC,MAAmB;AAC9C,QAAE,eAAe;AACjB,QAAE,gBAAgB;AAClB,QAAE,yBAAyB;AAAA,IAC7B;AAMA;AAAA;AAAA;AAAA;AAAA,SAAQ,qBAAqB,CAAC,MAAmB;AAC/C,QAAE,gBAAgB;AAClB,QAAE,yBAAyB;AAAA,IAC7B;AAIA;AAAA,SAAQ,iBAAiB,CAAC,MAAwB;AAChD,UAAI,KAAK,gBAAiB;AAC1B,WAAK,qBAAqB,EAAE;AAC5B,UAAI,KAAK,UAAU,MAAM;AACvB,aAAK,QAAQ,sBAAsB,MAAM;AAta/C,cAAAA,KAAA;AAuaQ,eAAK,QAAQ;AACb,cAAI,KAAK,gBAAiB;AAC1B,cAAI,KAAK,sBAAsB,CAAC,KAAK,YAAY,KAAK,kBAAkB,GAAG;AACzE,aAAAA,MAAA,KAAK,cAAL,gBAAAA,IAAgB,KAAK,KAAK;AAAA,UAC5B,OAAO;AACL,uBAAK,cAAL,mBAAgB;AAAA,UAClB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,SAAQ,kBAAkB,MAAY;AAlbxC,UAAAA;AAmbI,UAAI,KAAK,gBAAiB;AAC1B,OAAAA,MAAA,KAAK,cAAL,gBAAAA,IAAgB;AAAA,IAClB;AAGA;AAAA,SAAQ,qBAAqB,CAAC,MAAmB;AAC/C,UAAI,KAAK,YAAY,EAAE,MAAM,EAAG;AAChC,QAAE,eAAe;AACjB,QAAE,gBAAgB;AAClB,QAAE,yBAAyB;AAAA,IAC7B;AAEA,SAAQ,aAAa,CAAC,MAAwB;AA/bhD,UAAAA,KAAA;AAgcI,YAAM,SAAS,EAAE;AACjB,UAAI,KAAK,YAAY,MAAM,EAAG;AAG9B,QAAE,eAAe;AACjB,QAAE,gBAAgB;AAClB,QAAE,yBAAyB;AAE3B,YAAM,iBAAeA,MAAA,OAAO,aAAa,MAApB,gBAAAA,IAAuB,WAAW,WAAU;AACjE,YAAM,cAAc,mBAAmB,MAAM;AAC7C,YAAM,cAAc,eAAe,MAAM;AACzC,YAAM,eAAe,gBAAgB,MAAM;AAC3C,YAAM,aAAa,cAAc,MAAM;AACvC,YAAM,aAAa,cAAc,MAAM,KAAK;AAC5C,YAAM,cAAc,mBAAmB,MAAM;AAC7C,YAAM,aAAY,UAAK,gBAAgB,MAAM,MAA3B,YAAgC;AAElD,iBAAK,cAAL,mBAAgB,KAAK;AACrB,WAAK,kBAAkB;AAEvB,YAAM,UAA6B;AAAA,QACjC,SAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,GAAG,EAAE;AAAA,QACL,GAAG,EAAE;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,WAAK,oBAAoB,OAAO;AAAA,IAClC;AArbE,SAAK,SAAS;AAAA,MACZ,UAAU,CAAC,YAAY,OAAO,UAAU,SAAS,OAAO;AAAA,MACxD,OAAO;AAAA,MACP,UAAU;AAAA,OACP;AAEL,SAAK,MAAM,IAAI,aAAa,OAAO,QAAQ;AAC3C,SAAK,eAAe,KAAK,UAAU,KAAK,IAAI;AAC5C,SAAK,KAAK;AAAA,EACZ;AAAA,EAEQ,OAAa;AACnB,uBAAmB,KAAK,OAAO,MAAM;AAErC,QAAI,KAAK,OAAO,UAAU,QAAQ;AAChC,eAAS,gBAAgB,aAAa,wBAAwB,KAAK,OAAO,KAAK;AAAA,IACjF;AAEA,SAAK,UAAU,IAAI,QAAQ,KAAK,OAAO,UAAU;AAAA,MAC/C,kBAAkB,CAAC,WAAW;AAC5B,aAAK,cAAc,MAAM;AAAA,MAC3B;AAAA,MACA,oBAAoB,CAAC,WAAW;AAC9B,aAAK,UAAU,MAAM;AAAA,MACvB;AAAA,MACA,cAAc,MAAM,KAAK,mBAAmB;AAAA,MAC5C,QAAQ,MAAM,KAAK,gBAAgB,IAAI;AAAA,MACvC,aAAa,MAAM,KAAK,UAAU;AAAA,MAClC,YAAY,MAAM,KAAK,gBAAgB;AAAA,MACvC,YAAY,CAAC,QAAQ,KAAK,WAAW,GAAG;AAAA,IAC1C,GAAG,KAAK,OAAO,IAAI;AAEnB,SAAK,YAAY,IAAI,iBAAiB;AACtC,SAAK,QAAQ,IAAI,gBAAgB;AACjC,SAAK,UAAU,IAAI,kBAAkB,CAAC,eAAe,KAAK,cAAc,UAAU,CAAC;AAEnF,aAAS,iBAAiB,WAAW,KAAK,YAAY;AACtD,WAAO,iBAAiB,UAAU,KAAK,iBAAiB,EAAE,SAAS,KAAK,CAAC;AACzE,WAAO,iBAAiB,UAAU,KAAK,iBAAiB,EAAE,SAAS,KAAK,CAAC;AAGzE,aAAS,iBAAiB,sBAAsB,MAAM,KAAK,SAAS,CAAC;AACrE,aAAS,iBAAiB,oBAAoB,MAAM,KAAK,YAAY,CAAC;AACtE,WAAO,iBAAiB,YAAY,MAAM;AACxC,iBAAW,MAAM,KAAK,SAAS,GAAG,CAAC;AAAA,IACrC,CAAC;AAGD,SAAK,gBAAgB;AAErB,SAAK,YAAY;AAAA,EACnB;AAAA,EAEQ,uBAAuB;AAC7B,WAAO;AAAA,MACL,kBAAkB,CAAC,WAAoB;AACrC,aAAK,cAAc,MAAM;AAAA,MAC3B;AAAA,MACA,oBAAoB,CAAC,WAAoB;AACvC,aAAK,UAAU,MAAM;AAAA,MACvB;AAAA,MACA,cAAc,MAAM,KAAK,mBAAmB;AAAA,MAC5C,QAAQ,MAAM,KAAK,gBAAgB,IAAI;AAAA,MACvC,aAAa,MAAM,KAAK,UAAU;AAAA,MAClC,YAAY,MAAM,KAAK,gBAAgB;AAAA,MACvC,YAAY,CAAC,QAAiB,KAAK,WAAW,GAAG;AAAA,IACnD;AAAA,EACF;AAAA,EAEQ,WAAiB;AAnH3B,QAAAA,KAAA;AAoHI,UAAM,gBAAgB,KAAK;AAC3B,UAAM,YAAY,KAAK;AACvB,UAAM,gBAAe,MAAAA,MAAA,KAAK,YAAL,gBAAAA,IAAc,kBAAd,YAA+B;AAGpD,QAAI,KAAK,aAAc,MAAK,wBAAwB;AACpD,QAAI,KAAK,SAAU,MAAK,UAAU,KAAK;AACvC,SAAK,eAAe;AACpB,SAAK,WAAW;AAGhB,aAAS,iBAAiB,kBAAkB,EAAE,QAAQ,QAAM,GAAG,OAAO,CAAC;AAGvE,SAAK,UAAU,IAAI,QAAQ,KAAK,OAAO,UAAU,KAAK,qBAAqB,CAAC;AAC5E,QAAI,aAAc,MAAK,QAAQ,SAAS;AAExC,SAAK,UAAU,IAAI,kBAAkB,CAAC,eAAe,KAAK,cAAc,UAAU,CAAC;AACnF,SAAK,YAAY,IAAI,iBAAiB;AAEtC,QAAI,aAAc,MAAK,QAAQ,WAAW,KAAK;AAG/C,UAAM,WAAW,SAAS,eAAe,kBAAkB;AAC3D,QAAI,SAAU,UAAS,OAAO;AAC9B,uBAAmB,KAAK,OAAO,MAAM;AAErC,SAAK,YAAY;AAGjB,QAAI,iBAAiB,CAAC,aAAc,MAAK,cAAc,IAAI;AAAA,EAC7D;AAAA;AAAA,EAIQ,WAAW,WAA0B;AAvJ/C,QAAAA,KAAA;AAwJI,QAAI,WAAW;AAEb,UAAI,KAAK,aAAc,MAAK,cAAc,KAAK;AAC/C,UAAI,KAAK,SAAU,MAAK,UAAU,KAAK;AACvC,OAAAA,MAAA,KAAK,YAAL,gBAAAA,IAAc,kBAAkB;AAChC,iBAAK,YAAL,mBAAc,gBAAgB;AAC9B,iBAAK,YAAL,mBAAc,WAAW;AACzB,iBAAK,UAAL,mBAAY;AAAA,IACd,OAAO;AAEL,iBAAK,YAAL,mBAAc,WAAW;AAAA,IAC3B;AAAA,EACF;AAAA,EAMA,MAAc,kBAAiC;AAE7C,SAAK,gBAAgB;AAErB,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,IAAI,eAAe;AAE7C,YAAM,YAAY,IAAI,IAAI,OAAO,IAAI,OAAK,EAAE,EAAE,CAAC;AAC/C,YAAM,YAAY,KAAK,YAAY,OAAO,OAAK,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;AACnE,WAAK,cAAc,CAAC,GAAG,QAAQ,GAAG,SAAS;AAC3C,WAAK,cAAc;AAAA,IACrB,SAAQ;AAAA,IAER;AACA,SAAK,YAAY;AAAA,EACnB;AAAA,EAEQ,gBAAsB;AAC5B,QAAI;AACF,mBAAa,QAAQ,WAAU,aAAa,KAAK,UAAU,KAAK,WAAW,CAAC;AAAA,IAC9E,SAAQ;AAAA,IAAoC;AAAA,EAC9C;AAAA,EAEQ,kBAAwB;AAC9B,QAAI;AACF,YAAM,MAAM,aAAa,QAAQ,WAAU,WAAW;AACtD,UAAI,IAAK,MAAK,cAAc,KAAK,MAAM,GAAG;AAAA,IAC5C,SAAQ;AAAA,IAA+B;AAAA,EACzC;AAAA;AAAA,EAGQ,gBAAsB;AAC5B,UAAM,YAAY,KAAK,iBAAiB,IAAI;AAC5C,QAAI,aAAa,CAAC,KAAK,WAAW;AAChC,WAAK,YAAY,YAAY,MAAM,KAAK,eAAe,GAAG,GAAI;AAAA,IAChE,WAAW,CAAC,aAAa,KAAK,WAAW;AACvC,oBAAc,KAAK,SAAS;AAC5B,WAAK,YAAY;AAAA,IACnB;AAAA,EACF;AAAA;AAAA,EAGA,MAAc,iBAAgC;AAC5C,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,IAAI,eAAe;AAC7C,UAAI,UAAU;AACd,iBAAW,KAAK,QAAQ;AACtB,cAAM,QAAQ,KAAK,YAAY,KAAK,OAAK,EAAE,OAAO,EAAE,EAAE;AACtD,YAAI,SAAS,MAAM,WAAW,EAAE,QAAQ;AACtC,gBAAM,SAAS,EAAE;AACjB,gBAAM,aAAa,EAAE;AACrB,gBAAM,aAAa,EAAE;AACrB,oBAAU;AAAA,QACZ;AAAA,MACF;AACA,UAAI,SAAS;AACX,aAAK,cAAc;AACnB,aAAK,YAAY;AAAA,MACnB;AAAA,IACF,SAAQ;AAAA,IAA2C;AAAA,EACrD;AAAA;AAAA,EAIQ,cAAoB;AA1O9B,QAAAA,KAAA;AA2OI,KAAAA,MAAA,KAAK,YAAL,gBAAAA,IAAc;AACd,UAAM,UAAU,QAAQ;AACxB,QAAI,MAAM;AACV,eAAW,KAAK,KAAK,aAAa;AAChC,UAAI,EAAE,WAAW,cAAc,EAAE,WAAW,YAAa;AACzD,UAAI,KAAK,kBAAkB,CAAC,MAAM,SAAS;AACzC;AACA,mBAAK,YAAL,mBAAc,OAAO,GAAG;AAAA,MAC1B;AAAA,IACF;AACA,eAAK,YAAL,mBAAc,mBAAmB,KAAK,gBAAgB,EAAE;AACxD,eAAK,YAAL,mBAAc,cAAc,KAAK,iBAAiB;AAClD,SAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,kBAAkB,GAAuB;AAC/C,QAAI;AACF,aAAO,IAAI,IAAI,EAAE,GAAG,EAAE;AAAA,IACxB,SAAQ;AACN,aAAO,EAAE;AAAA,IACX;AAAA,EACF;AAAA,EAEQ,kBAAgC;AACtC,UAAM,UAAU,QAAQ;AACxB,WAAO,KAAK,YAAY;AAAA,MAAO,OAC7B,KAAK,kBAAkB,CAAC,MAAM,WAC9B,EAAE,WAAW,cAAc,EAAE,WAAW;AAAA,IAC1C;AAAA,EACF;AAAA,EAEQ,mBAA2B;AACjC,WAAO,KAAK,YAAY,OAAO,OAAK,EAAE,WAAW,cAAc,EAAE,WAAW,WAAW,EAAE;AAAA,EAC3F;AAAA;AAAA,EAIQ,cAAc,QAAuB;AAhR/C,QAAAA,KAAA;AAiRI,SAAK,eAAe;AACpB,KAAAA,MAAA,KAAK,YAAL,gBAAAA,IAAc,kBAAkB;AAChC,QAAI,QAAQ;AACV,WAAK,wBAAwB;AAAA,IAC/B,OAAO;AACL,WAAK,wBAAwB;AAC7B,iBAAK,cAAL,mBAAgB;AAChB,UAAI,KAAK,UAAU,MAAM;AAAE,6BAAqB,KAAK,KAAK;AAAG,aAAK,QAAQ;AAAA,MAAK;AAAA,IACjF;AAEA,SAAK,mBAAmB;AAAA,EAC1B;AAAA;AAAA,EAIQ,UAAU,QAAuB;AAhS3C,QAAAA,KAAA;AAiSI,SAAK,WAAW;AAChB,KAAAA,MAAA,KAAK,YAAL,gBAAAA,IAAc,gBAAgB;AAC9B,QAAI,QAAQ;AACV,WAAK,mBAAmB;AACxB,WAAK,eAAe;AAGpB,iBAAW,OAAO,KAAK,mBAAmB;AACxC,eAAO,iBAAiB,KAAK,KAAK,kBAAkB,IAAI;AAAA,MAC1D;AACA,aAAO,iBAAiB,UAAU,KAAK,mBAAmB,IAAI;AAE9D,iBAAW,OAAO,KAAK,qBAAqB;AAC1C,eAAO,iBAAiB,KAAK,KAAK,oBAAoB,IAAI;AAAA,MAC5D;AAAA,IACF,OAAO;AACL,iBAAK,kBAAL,mBAAoB;AACpB,WAAK,gBAAgB;AACrB,WAAK,iBAAiB;AACtB,iBAAW,OAAO,KAAK,mBAAmB;AACxC,eAAO,oBAAoB,KAAK,KAAK,kBAAkB,IAAI;AAAA,MAC7D;AACA,aAAO,oBAAoB,UAAU,KAAK,mBAAmB,IAAI;AACjE,iBAAW,OAAO,KAAK,qBAAqB;AAC1C,eAAO,oBAAoB,KAAK,KAAK,oBAAoB,IAAI;AAAA,MAC/D;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGQ,iBAAuB;AAC7B,SAAK,iBAAiB,CAAC;AACvB,UAAM,eAAe;AACrB,aAAS,iBAAiB,WAAW,EAAE,QAAQ,CAAC,OAAO;AAlU3D,UAAAA;AAmUM,YAAM,SAAS;AACf,YAAM,OAAMA,MAAA,OAAO,aAAa,SAAS,MAA7B,OAAAA,MAAkC;AAC9C,UAAI,SAAS;AACb,UAAI;AAAE,iBAAS,OAAO,QAAQ,YAAY;AAAA,MAAE,SAAQ;AAClD,YAAI;AAAE,mBAAS,OAAO,QAAQ,kBAAkB;AAAA,QAAE,SAAQC,IAAA;AAAA,QAAe;AAAA,MAC3E;AACA,UAAI,CAAC,OAAQ;AAEb,YAAM,OAAO,OAAO,sBAAsB;AAC1C,WAAK,eAAe,KAAK,EAAE,IAAI,QAAQ,UAAU,IAAI,CAAC;AAEtD,aAAO,gBAAgB,SAAS;AAEhC,aAAO,MAAM,YAAY,WAAW,SAAS,WAAW;AACxD,aAAO,MAAM,YAAY,YAAY,SAAS,WAAW;AACzD,aAAO,MAAM,YAAY,WAAW,cAAc,WAAW;AAC7D,aAAO,MAAM,YAAY,OAAO,GAAG,KAAK,GAAG,MAAM,WAAW;AAC5D,aAAO,MAAM,YAAY,QAAQ,GAAG,KAAK,IAAI,MAAM,WAAW;AAC9D,aAAO,MAAM,YAAY,SAAS,GAAG,KAAK,KAAK,MAAM,WAAW;AAEhE,aAAO,UAAU,IAAI,eAAe;AAAA,IACtC,CAAC;AAAA,EACH;AAAA;AAAA,EAGQ,mBAAyB;AAC/B,eAAW,EAAE,IAAI,SAAS,KAAK,KAAK,gBAAgB;AAElD,iBAAW,QAAQ,CAAC,WAAW,YAAY,WAAW,OAAO,QAAQ,OAAO,GAAG;AAC7E,WAAG,MAAM,eAAe,IAAI;AAAA,MAC9B;AACA,SAAG,UAAU,OAAO,eAAe;AACnC,SAAG,aAAa,WAAW,YAAY,MAAM;AAAA,IAC/C;AACA,SAAK,iBAAiB,CAAC;AAAA,EACzB;AAAA;AAAA,EAMQ,qBAA2B;AA5WrC,QAAAD;AA6WI,QAAI,CAAC,KAAK,SAAU;AACpB,KAAAA,MAAA,KAAK,kBAAL,gBAAAA,IAAoB;AACpB,SAAK,gBAAgB,SAAS,cAAc,OAAO;AACnD,SAAK,cAAc,KAAK;AACxB,UAAM,eAAe,KAAK,eAAe,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAS9C,SAAK,cAAc,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAM3B,YAAY;AAAA;AAElB,aAAS,KAAK,YAAY,KAAK,aAAa;AAAA,EAC9C;AAAA,EAkGQ,oBAAoB,SAAkC;AArehE,QAAAA;AAseI,KAAAA,MAAA,KAAK,UAAL,gBAAAA,IAAY,QAAQ,SAAS;AAAA,MAC3B,UAAU,CAAC,WAAW;AAve5B,YAAAA;AAweQ,aAAK,kBAAkB;AACvB,SAAAA,MAAA,KAAK,cAAL,gBAAAA,IAAgB;AAChB,aAAK,iBAAiB,SAAS,OAAO,SAAS,OAAO,UAAU;AAAA,MAClE;AAAA,MACA,UAAU,MAAM;AA5etB,YAAAA;AA6eQ,aAAK,kBAAkB;AACvB,SAAAA,MAAA,KAAK,cAAL,gBAAAA,IAAgB;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,0BAAgC;AACtC,aAAS,iBAAiB,aAAa,KAAK,cAAc;AAC1D,aAAS,iBAAiB,cAAc,KAAK,eAAe;AAG5D,eAAW,OAAO,CAAC,aAAa,aAAa,GAAY;AACvD,aAAO,iBAAiB,KAAK,KAAK,oBAAoB,IAAI;AAAA,IAC5D;AAEA,WAAO,iBAAiB,SAAS,KAAK,YAAY,IAAI;AAAA,EACxD;AAAA,EAEQ,0BAAgC;AACtC,aAAS,oBAAoB,aAAa,KAAK,cAAc;AAC7D,aAAS,oBAAoB,cAAc,KAAK,eAAe;AAC/D,eAAW,OAAO,CAAC,aAAa,aAAa,GAAY;AACvD,aAAO,oBAAoB,KAAK,KAAK,oBAAoB,IAAI;AAAA,IAC/D;AACA,WAAO,oBAAoB,SAAS,KAAK,YAAY,IAAI;AAAA,EAC3D;AAAA,EAEQ,YAAY,IAAiC;AACnD,QAAI,CAAC,MAAM,EAAE,cAAc,SAAU,QAAO;AAC5C,WAAO,GAAG,QAAQ,kBAAkB,MAAM;AAAA,EAC5C;AAAA;AAAA,EAIA,MAAc,qBAAoC;AA/gBpD,QAAAA,KAAA;AAihBI,UAAM,gBAAgB,KAAK;AAC3B,QAAI,cAAe,MAAK,cAAc,KAAK;AAE3C,UAAM,OAAO,MAAM,aAAa;AAChC,QAAI,CAAC,MAAM;AACT,UAAI,cAAe,MAAK,cAAc,IAAI;AAC1C;AAAA,IACF;AAEA,UAAM,aAAa,MAAM,cAAc,IAAI;AAC3C,QAAI,CAAC,YAAY;AACf,UAAI,cAAe,MAAK,cAAc,IAAI;AAC1C;AAAA,IACF;AAGA,UAAM,UAAU,KAAK,IAAI,KAAK,QAAQ;AACtC,UAAM,UAAU,KAAK,IAAI,KAAK,SAAS;AACvC,UAAM,UAASA,MAAA,SAAS,iBAAiB,SAAS,OAAO,MAA1C,OAAAA,MAA+C,SAAS;AAEvE,UAAM,UAA6B;AAAA,MACjC,SAAS;AAAA,MACT,aAAa,mBAAmB,MAAM;AAAA,MACtC,aAAa,eAAe,MAAM;AAAA,MAClC,cAAc,gBAAgB,MAAM;AAAA,MACpC,YAAY,cAAc,MAAM;AAAA,MAChC,aAAa,mBAAmB,MAAM;AAAA,MACtC,GAAG;AAAA,MACH,GAAG;AAAA,MACH,YAAY,cAAc,MAAM,KAAK;AAAA,MACrC;AAAA,MACA,YAAW,UAAK,gBAAgB,MAAM,MAA3B,YAAgC;AAAA,IAC7C;AAEA,SAAK,oBAAoB,OAAO;AAAA,EAClC;AAAA;AAAA,EAIQ,gBAAgB,IAAa;AAxjBvC,QAAAA;AAyjBI,UAAM,YAAWA,MAAA,KAAK,OAAO,aAAZ,OAAAA,MAAwB,CAAC;AAC1C,QAAI,SAAS,SAAS,UAAU,GAAG;AACjC,YAAM,MAAsB,WAAW,EAAE;AACzC,UAAI,IAAK,QAAO;AAAA,IAClB;AACA,QAAI,SAAS,SAAS,KAAK,GAAG;AAC5B,YAAM,MAAiBE,YAAW,EAAE;AACpC,UAAI,IAAK,QAAO;AAAA,IAClB;AACA,QAAI,SAAS,SAAS,QAAQ,GAAG;AAC/B,YAAM,MAAoBA,YAAW,EAAE;AACvC,UAAI,IAAK,QAAO;AAAA,IAClB;AACA,QAAI,SAAS,SAAS,OAAO,GAAG;AAC9B,YAAM,MAAmBA,YAAW,EAAE;AACtC,UAAI,IAAK,QAAO;AAAA,IAClB;AAEA,QAAI,SAAS,SAAS,OAAO,GAAG;AAC9B,YAAM,MAAmBA,YAAW,EAAE;AACtC,UAAI,IAAK,QAAO;AAAA,IAClB;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAIA,MAAc,iBAAiB,SAA4B,SAAiB,YAAoC;AAplBlH,QAAAF,KAAA;AAqlBI,UAAM,UAA6B;AAAA,MACjC,GAAI,QAAQ,IAAI,OAAO,aAAc;AAAA,MACrC,GAAG,QAAQ,IAAI,OAAO;AAAA,MACtB;AAAA,MACA,SAAS,QAAQ;AAAA,MACjB,aAAa,QAAQ;AAAA,MACrB,YAAY,QAAQ;AAAA,MACpB,aAAa,QAAQ;AAAA,MACrB,cAAc,QAAQ;AAAA,MACtB,YAAY,QAAQ;AAAA,MACpB;AAAA,MACA,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,WAAW,QAAQ;AAAA,MACnB,KAAK,OAAO,SAAS;AAAA,IACvB;AAEA,QAAI;AACJ,QAAI;AACF,mBAAa,MAAM,KAAK,IAAI,cAAc,OAAO;AAAA,IACnD,SAAQ;AAEN,mBAAa,iCACR,UADQ;AAAA,QAEX,IAAI,OAAO,WAAW;AAAA,QACtB,QAAQ;AAAA,QACR,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC;AAAA,IACF;AACA,SAAK,YAAY,KAAK,UAAU;AAChC,SAAK,cAAc;AACnB,SAAK,YAAY;AACjB,WAAAA,MAAA,KAAK,QAAO,oBAAZ,wBAAAA,KAA8B;AAC9B,SAAK,gBAAgB;AAAA,EACvB;AAAA;AAAA,EAIQ,cAAc,YAA8B;AA3nBtD,QAAAA;AA4nBI,KAAAA,MAAA,KAAK,UAAL,gBAAAA,IAAY,SAAS,YAAY;AAAA,MAC/B,QAAQ,OAAO,GAAG,eAAe;AAC/B,YAAI;AACF,gBAAM,UAAU,MAAM,KAAK,IAAI,iBAAiB,EAAE,IAAI,EAAE,SAAS,WAAW,CAAC;AAC7E,eAAK,oBAAoB,OAAO;AAAA,QAClC,SAAQ;AAEN,eAAK,oBAAoB,iCAAK,IAAL,EAAQ,SAAS,YAAY,YAAW,oBAAI,KAAK,GAAE,YAAY,EAAE,EAAC;AAAA,QAC7F;AAAA,MACF;AAAA,MACA,UAAU,OAAO,MAAM;AACrB,YAAI;AACF,gBAAM,KAAK,IAAI,iBAAiB,EAAE,IAAI,EAAE,QAAQ,YAAY,CAAC;AAAA,QAC/D,SAAQ;AAAA,QAAyC;AACjD,aAAK,iBAAiB,EAAE,EAAE;AAAA,MAC5B;AAAA,IACF,GAAG,KAAK,OAAO;AAAA,EACjB;AAAA,EAEQ,oBAAoB,SAA2B;AACrD,UAAM,MAAM,KAAK,YAAY,UAAU,OAAK,EAAE,OAAO,QAAQ,EAAE;AAC/D,QAAI,OAAO,GAAG;AACZ,WAAK,YAAY,GAAG,IAAI;AAAA,IAC1B;AACA,SAAK,cAAc;AACnB,SAAK,YAAY;AAAA,EACnB;AAAA,EAEQ,iBAAiB,IAAkB;AACzC,SAAK,cAAc,KAAK,YAAY,OAAO,OAAK,EAAE,OAAO,EAAE;AAC3D,SAAK,cAAc;AACnB,SAAK,YAAY;AAAA,EACnB;AAAA;AAAA,EAIA,MAAc,YAA2B;AACvC,UAAM,OAAO,KAAK,gBAAgB;AAClC,eAAW,KAAK,MAAM;AACpB,UAAI;AACF,cAAM,KAAK,IAAI,iBAAiB,EAAE,IAAI,EAAE,QAAQ,YAAY,CAAC;AAAA,MAC/D,SAAQ;AAAA,MAAoB;AAAA,IAC9B;AACA,SAAK,cAAc,KAAK,YAAY,OAAO,OAAK,CAAC,KAAK,SAAS,CAAC,CAAC;AACjE,SAAK,cAAc;AACnB,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,MAAc,kBAAiC;AAC7C,UAAM,SAAS,KAAK,YAAY,OAAO,OAAK,EAAE,WAAW,cAAc,EAAE,WAAW,WAAW;AAC/F,eAAW,KAAK,QAAQ;AACtB,UAAI;AACF,cAAM,KAAK,IAAI,iBAAiB,EAAE,IAAI,EAAE,QAAQ,YAAY,CAAC;AAAA,MAC/D,SAAQ;AAAA,MAAoB;AAAA,IAC9B;AACA,SAAK,cAAc,CAAC;AACpB,SAAK,cAAc;AACnB,SAAK,YAAY;AAAA,EACnB;AAAA;AAAA,EAIQ,UAAU,GAAwB;AA1rB5C,QAAAA,KAAA;AA2rBI,SAAIA,MAAA,KAAK,YAAL,gBAAAA,IAAc,cAAe;AACjC,UAAM,SAAS,EAAE;AACjB,QAAI,CAAC,SAAS,YAAY,QAAQ,EAAE,SAAS,OAAO,OAAO,EAAG;AAC9D,QAAI,OAAO,QAAQ,0BAA0B,EAAG;AAEhD,QAAI,KAAK,YAAY,MAAM,EAAG;AAE9B,UAAM,QAAO,UAAK,OAAO,SAAZ,YAAoB,CAAC;AAClC,UAAM,QAAQ,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE;AAC7C,QAAI,EAAE,UAAS,UAAK,aAAL,YAAiB,QAAQ,OAAO;AAC7C,WAAK,cAAc,CAAC,KAAK,YAAY;AAAA,IACvC;AACA,QAAI,EAAE,UAAS,UAAK,WAAL,YAAe,QAAQ,OAAO;AAC3C,WAAK,UAAU,CAAC,KAAK,QAAQ;AAAA,IAC/B;AACA,QAAI,EAAE,UAAS,UAAK,eAAL,YAAmB,QAAQ,OAAO;AAC/C,WAAK,mBAAmB;AAAA,IAC1B;AACA,QAAI,EAAE,UAAS,UAAK,cAAL,YAAkB,QAAQ,OAAO;AAC9C,WAAK,UAAU;AAAA,IACjB;AACA,QAAI,EAAE,QAAQ,UAAU;AACtB,UAAI,KAAK,aAAc,MAAK,cAAc,KAAK;AAC/C,UAAI,KAAK,SAAU,MAAK,UAAU,KAAK;AAAA,IACzC;AAAA,EACF;AAAA;AAAA;AAAA,EAKQ,kBAAwB;AAC9B,SAAK,gBAAgB,KAAK;AAAA,EAC5B;AAAA;AAAA,EAGQ,gBAAgB,UAAyB;AAC/C,UAAM,KAAK,KAAK,eAAe;AAC/B,QAAI,OAAO,iBAAiB;AAC1B,gBAAU,UAAU,UAAU,EAAE,EAAE,MAAM,MAAM;AAAA,MAAoB,CAAC;AAAA,IACrE,WAAW,UAAU;AACnB,UAAI;AACF,cAAM,KAAK,SAAS,cAAc,UAAU;AAC5C,WAAG,QAAQ;AACX,WAAG,MAAM,UAAU;AACnB,iBAAS,KAAK,YAAY,EAAE;AAC5B,WAAG,OAAO;AACV,iBAAS,YAAY,MAAM;AAC3B,WAAG,OAAO;AAAA,MACZ,SAAQ;AAAA,MAAoB;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,iBAAyB;AACvB,UAAM,UAAU,KAAK,YAAY,OAAO,OAAK,EAAE,WAAW,cAAc,EAAE,WAAW,WAAW;AAChG,QAAI,QAAQ,WAAW,GAAG;AACxB,aAAO;AAAA;AAAA;AAAA,IACT;AAGA,UAAM,SAAS,oBAAI,IAA0B;AAC7C,eAAW,KAAK,SAAS;AACvB,YAAM,MAAM,KAAK,kBAAkB,CAAC;AACpC,UAAI,CAAC,OAAO,IAAI,GAAG,EAAG,QAAO,IAAI,KAAK,CAAC,CAAC;AACxC,aAAO,IAAI,GAAG,EAAG,KAAK,CAAC;AAAA,IACzB;AAEA,UAAM,YAAY,OAAO,OAAO;AAChC,UAAM,QAAkB,CAAC;AAEzB,QAAI,WAAW;AACb,YAAM,KAAK,eAAe;AAC1B,YAAM,KAAK,EAAE;AAAA,IACf;AAEA,eAAW,CAAC,MAAM,WAAW,KAAK,QAAQ;AACxC,UAAI,WAAW;AACb,cAAM,KAAK,MAAM,IAAI,EAAE;AAAA,MACzB,OAAO;AACL,cAAM,KAAK,kBAAkB,IAAI,EAAE;AAAA,MACrC;AACA,YAAM,KAAK,EAAE;AAEb,YAAM,UAAU,YAAY,QAAQ;AAEpC,kBAAY,QAAQ,CAAC,GAAG,MAAM;AA/wBpC,YAAAA,KAAA;AAixBQ,cAAM,oBAAkBA,MAAA,EAAE,cAAF,gBAAAA,IAAa,aAAY,SAAS,EAAE,UAAU,SAAS,OAAO;AACtF,cAAM,KAAK,GAAG,OAAO,IAAI,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE;AAC9C,cAAM,KAAK,WAAW,EAAE,EAAE,IAAI;AAC9B,cAAM,KAAK,gBAAgB,EAAE,OAAO,KAAK,eAAe,EAAE;AAG1D,aAAI,OAAE,cAAF,mBAAa,aAAa;AAC5B,gBAAM,MAAM,EAAE,UAAU,cAAc,GAAG,EAAE,UAAU,WAAW,IAAI,EAAE,UAAU,WAAW,KAAK,EAAE,UAAU;AAC5G,gBAAM,KAAK,eAAe,GAAG,IAAI;AAAA,QACnC,YAAW,aAAE,cAAF,mBAAa,SAAb,mBAAmB,MAAM;AAClC,gBAAM,KAAK,aAAa,EAAE,UAAU,KAAK,IAAI,IAAI;AAAA,QACnD;AAEA,YAAI,EAAE,YAAY;AAChB,gBAAM,KAAK,gBAAgB,EAAE,UAAU,IAAI;AAAA,QAC7C;AACA,YAAI,EAAE,cAAc;AAClB,gBAAM,KAAK,YAAY,EAAE,YAAY,GAAG;AAAA,QAC1C,WAAW,EAAE,YAAY;AACvB,gBAAM,KAAK,YAAY,EAAE,WAAW,MAAM,GAAG,GAAG,CAAC,GAAG;AAAA,QACtD;AACA,YAAI,EAAE,YAAY;AAEhB,cAAI,CAAC,EAAE,WAAW,WAAW,OAAO,GAAG;AACrC,kBAAM,KAAK,0CAA0C,EAAE,UAAU,IAAI;AAAA,UACvE,OAAO;AACL,kBAAM,KAAK,wBAAwB;AAAA,UACrC;AAAA,QACF;AACA,cAAM,KAAK,EAAE;AAAA,MACf,CAAC;AAAA,IACH;AAGA,UAAM,iBAAiB,QAAQ,KAAK,OAAK,EAAE,cAAc,CAAC,EAAE,WAAW,WAAW,OAAO,CAAC;AAC1F,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,EAAE;AACb,QAAI,gBAAgB;AAClB,YAAM,KAAK,qJAAqJ;AAAA,IAClK,OAAO;AACL,YAAM,KAAK,iGAAiG;AAAA,IAC9G;AAEA,WAAO,MAAM,KAAK,IAAI,EAAE,KAAK;AAAA,EAC/B;AAAA;AAAA,EAIA,iBAA+B;AAAE,WAAO,CAAC,GAAG,KAAK,WAAW;AAAA,EAAE;AAAA,EAE9D,UAAgB;AAn0BlB,QAAAA,KAAA;AAo0BI,SAAK,cAAc,KAAK;AACxB,SAAK,UAAU,KAAK;AACpB,aAAS,oBAAoB,WAAW,KAAK,YAAY;AACzD,WAAO,oBAAoB,UAAU,KAAK,eAAe;AACzD,WAAO,oBAAoB,UAAU,KAAK,eAAe;AACzD,KAAAA,MAAA,KAAK,YAAL,gBAAAA,IAAc;AACd,eAAK,cAAL,mBAAgB;AAChB,eAAK,UAAL,mBAAY;AACZ,eAAK,YAAL,mBAAc;AACd,QAAI,KAAK,UAAU,KAAM,sBAAqB,KAAK,KAAK;AACxD,QAAI,KAAK,cAAc,KAAM,eAAc,KAAK,SAAS;AAAA,EAC3D;AACF;AAAA;AAxzBa,WAgJI,cAAc;AAhJxB,IAAM,YAAN;;;AfPA,SAAS,KAAK,QAAoC;AACvD,SAAO,IAAI,UAAU,MAAM;AAC7B;","names":["_a","_b","_a","_a","_a","_b","_c","_d","_a","_a","_a","_a","_a","detect","getContext","detect","getContext","_a","_a","getContext","_a","getContext","_a","e","getContext"]}
|