surf-cli 2.0.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"accessibility-tree.js","sources":["../../src/content/accessibility-tree.ts"],"sourcesContent":["export {};\n\ndeclare global {\n interface Window {\n __piElementMap?: Record<string, { element: WeakRef<Element>; role: string; name: string }>;\n __piLastSnapshot?: { content: string; timestamp: number };\n __piHelpers?: typeof piHelpersImpl;\n piHelpers?: typeof piHelpersImpl;\n __piRefs?: Record<string, Element>;\n }\n}\n\ninterface ModalState {\n type: 'dialog' | 'alertdialog';\n description: string;\n clearedBy: string;\n}\n\nconst VALID_ARIA_ROLES = new Set([\n \"alert\", \"alertdialog\", \"application\", \"article\", \"banner\", \"blockquote\",\n \"button\", \"caption\", \"cell\", \"checkbox\", \"code\", \"columnheader\", \"combobox\",\n \"complementary\", \"contentinfo\", \"definition\", \"deletion\", \"dialog\", \"directory\",\n \"document\", \"emphasis\", \"feed\", \"figure\", \"form\", \"generic\", \"grid\", \"gridcell\",\n \"group\", \"heading\", \"img\", \"insertion\", \"link\", \"list\", \"listbox\", \"listitem\",\n \"log\", \"main\", \"mark\", \"marquee\", \"math\", \"menu\", \"menubar\", \"menuitem\",\n \"menuitemcheckbox\", \"menuitemradio\", \"meter\", \"navigation\", \"none\", \"note\",\n \"option\", \"paragraph\", \"presentation\", \"progressbar\", \"radio\", \"radiogroup\",\n \"region\", \"row\", \"rowgroup\", \"rowheader\", \"scrollbar\", \"search\", \"searchbox\",\n \"separator\", \"slider\", \"spinbutton\", \"status\", \"strong\", \"subscript\",\n \"superscript\", \"switch\", \"tab\", \"table\", \"tablist\", \"tabpanel\", \"term\",\n \"textbox\", \"time\", \"timer\", \"toolbar\", \"tooltip\", \"tree\", \"treegrid\", \"treeitem\"\n]);\n\nfunction isFocusable(element: Element): boolean {\n const tagName = element.tagName.toLowerCase();\n if ([\"button\", \"input\", \"select\", \"textarea\"].includes(tagName)) {\n return !(element as HTMLButtonElement).disabled;\n }\n if (tagName === \"a\" && element.hasAttribute(\"href\")) return true;\n if (element.hasAttribute(\"tabindex\")) {\n const tabindex = parseInt(element.getAttribute(\"tabindex\") || \"\", 10);\n return !isNaN(tabindex) && tabindex >= 0;\n }\n if (element.getAttribute(\"contenteditable\") === \"true\") return true;\n return false;\n}\n\nfunction getExplicitRole(element: Element): string | null {\n const roleAttr = element.getAttribute(\"role\");\n if (!roleAttr) return null;\n const roles = roleAttr.split(/\\s+/).filter(r => r);\n for (const role of roles) {\n if (VALID_ARIA_ROLES.has(role)) {\n return role;\n }\n }\n return null;\n}\n\nfunction getImplicitRole(element: Element): string {\n const tag = element.tagName.toLowerCase();\n const type = element.getAttribute(\"type\");\n\n const tagRoles: Record<string, string | ((el: Element) => string)> = {\n a: (el) => el.hasAttribute(\"href\") ? \"link\" : \"generic\",\n article: \"article\",\n aside: \"complementary\",\n button: \"button\",\n datalist: \"listbox\",\n dd: \"definition\",\n details: \"group\",\n dialog: \"dialog\",\n dt: \"term\",\n fieldset: \"group\",\n figure: \"figure\",\n footer: (el) => el.closest(\"article, aside, main, nav, section\") ? \"generic\" : \"contentinfo\",\n form: (el) => el.hasAttribute(\"aria-label\") || el.hasAttribute(\"aria-labelledby\") ? \"form\" : \"generic\",\n h1: \"heading\", h2: \"heading\", h3: \"heading\", h4: \"heading\", h5: \"heading\", h6: \"heading\",\n header: (el) => el.closest(\"article, aside, main, nav, section\") ? \"generic\" : \"banner\",\n hr: \"separator\",\n img: (el) => el.getAttribute(\"alt\") === \"\" ? \"presentation\" : \"img\",\n li: \"listitem\",\n main: \"main\",\n math: \"math\",\n menu: \"list\",\n meter: \"meter\",\n nav: \"navigation\",\n ol: \"list\",\n optgroup: \"group\",\n option: \"option\",\n output: \"status\",\n p: \"paragraph\",\n progress: \"progressbar\",\n search: \"search\",\n section: (el) => el.hasAttribute(\"aria-label\") || el.hasAttribute(\"aria-labelledby\") ? \"region\" : \"generic\",\n select: (el) => {\n const s = el as HTMLSelectElement;\n return s.hasAttribute(\"multiple\") || (s.size && s.size > 1) ? \"listbox\" : \"combobox\";\n },\n table: \"table\",\n tbody: \"rowgroup\",\n td: \"cell\",\n textarea: \"textbox\",\n tfoot: \"rowgroup\",\n th: \"columnheader\",\n thead: \"rowgroup\",\n time: \"time\",\n tr: \"row\",\n ul: \"list\",\n };\n\n if (tag === \"input\") {\n const inputRoles: Record<string, string> = {\n button: \"button\",\n checkbox: \"checkbox\",\n email: \"textbox\",\n file: \"button\",\n image: \"button\",\n number: \"spinbutton\",\n radio: \"radio\",\n range: \"slider\",\n reset: \"button\",\n search: \"searchbox\",\n submit: \"button\",\n tel: \"textbox\",\n text: \"textbox\",\n url: \"textbox\",\n };\n return inputRoles[type || \"\"] || \"textbox\";\n }\n\n const roleOrFn = tagRoles[tag];\n if (typeof roleOrFn === \"function\") {\n return roleOrFn(element);\n }\n return roleOrFn || \"generic\";\n}\n\nfunction getResolvedRole(element: Element): string {\n const explicitRole = getExplicitRole(element);\n \n if (!explicitRole) {\n return getImplicitRole(element);\n }\n \n if ((explicitRole === \"none\" || explicitRole === \"presentation\") && isFocusable(element)) {\n return getImplicitRole(element);\n }\n \n return explicitRole;\n}\n\nif (!window.__piElementMap) window.__piElementMap = {};\n\nlet globalRefCounter = 0;\n\nfunction getOrAssignRef(element: Element, role: string, name: string): string {\n const existing = (element as any)._piRef as { role: string; name: string; ref: string } | undefined;\n if (existing && existing.role === role && existing.name === name) {\n return existing.ref;\n }\n \n const ref = `e${++globalRefCounter}`;\n (element as any)._piRef = { role, name, ref };\n return ref;\n}\n\nfunction detectModalStates(): ModalState[] {\n const modals: ModalState[] = [];\n \n const dialogs = document.querySelectorAll('[role=\"dialog\"], [role=\"alertdialog\"], dialog[open]');\n dialogs.forEach(dialog => {\n const style = window.getComputedStyle(dialog);\n const isVisible = style.display !== 'none' && \n style.visibility !== 'hidden' && \n style.opacity !== '0' &&\n (dialog as HTMLElement).offsetWidth > 0 &&\n (dialog as HTMLElement).offsetHeight > 0;\n if (!isVisible) return;\n \n const role = dialog.getAttribute('role') || 'dialog';\n let title = dialog.getAttribute('aria-label') || \n dialog.querySelector('[role=\"heading\"], h1, h2, h3')?.textContent?.trim() ||\n 'Dialog';\n if (title.length > 100) title = title.substring(0, 100) + '...';\n modals.push({\n type: role as 'dialog' | 'alertdialog',\n description: `${role}: ${title}`,\n clearedBy: 'computer(action=key, text=Escape)',\n });\n });\n \n return modals;\n}\n\nconst piHelpersImpl = {\n wait(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n },\n\n async waitForSelector(\n selector: string,\n options: { state?: 'visible' | 'hidden' | 'attached' | 'detached'; timeout?: number } = {}\n ): Promise<Element | null> {\n const { state = 'visible', timeout = 20000 } = options;\n\n const isElementVisible = (el: Element | null): boolean => {\n if (!el) return false;\n const style = window.getComputedStyle(el);\n return style.display !== 'none' && \n style.visibility !== 'hidden' && \n style.opacity !== '0' &&\n (el as HTMLElement).offsetWidth > 0 &&\n (el as HTMLElement).offsetHeight > 0;\n };\n\n const checkElement = (): Element | null => {\n const el = document.querySelector(selector);\n switch (state) {\n case 'attached':\n return el;\n case 'detached':\n return el ? null : document.body;\n case 'hidden':\n if (!el) return document.body;\n return isElementVisible(el) ? null : el;\n case 'visible':\n default:\n return isElementVisible(el) ? el : null;\n }\n };\n\n return new Promise((resolve, reject) => {\n const result = checkElement();\n if (result) {\n resolve(state === 'detached' || state === 'hidden' ? null : result);\n return;\n }\n\n const observer = new MutationObserver(() => {\n const result = checkElement();\n if (result) {\n observer.disconnect();\n clearTimeout(timeoutId);\n resolve(state === 'detached' || state === 'hidden' ? null : result);\n }\n });\n\n const timeoutId = setTimeout(() => {\n observer.disconnect();\n reject(new Error(`Timeout waiting for \"${selector}\" to be ${state}`));\n }, timeout);\n\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['style', 'class', 'hidden']\n });\n });\n },\n\n async waitForText(\n text: string,\n options: { selector?: string; timeout?: number } = {}\n ): Promise<Element | null> {\n const { selector, timeout = 20000 } = options;\n\n const checkText = (): Element | null => {\n const root = selector ? document.querySelector(selector) : document.body;\n if (!root) return null;\n \n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);\n while (walker.nextNode()) {\n if (walker.currentNode.textContent?.includes(text)) {\n return walker.currentNode.parentElement;\n }\n }\n return null;\n };\n\n return new Promise((resolve, reject) => {\n const result = checkText();\n if (result) {\n resolve(result);\n return;\n }\n\n const observer = new MutationObserver(() => {\n const result = checkText();\n if (result) {\n observer.disconnect();\n clearTimeout(timeoutId);\n resolve(result);\n }\n });\n\n const timeoutId = setTimeout(() => {\n observer.disconnect();\n reject(new Error(`Timeout waiting for text \"${text}\"`));\n }, timeout);\n\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n characterData: true\n });\n });\n },\n\n async waitForHidden(selector: string, timeout = 20000): Promise<void> {\n await piHelpersImpl.waitForSelector(selector, { state: 'hidden', timeout });\n },\n\n getByRole(role: string, options: { name?: string } = {}): Element | null {\n const { name } = options;\n \n const implicitRoles: Record<string, string[]> = {\n button: ['button', 'input[type=\"button\"]', 'input[type=\"submit\"]', 'input[type=\"reset\"]'],\n link: ['a[href]'],\n textbox: ['input:not([type])', 'input[type=\"text\"]', 'input[type=\"email\"]', 'input[type=\"password\"]', 'input[type=\"search\"]', 'input[type=\"tel\"]', 'input[type=\"url\"]', 'textarea'],\n checkbox: ['input[type=\"checkbox\"]'],\n radio: ['input[type=\"radio\"]'],\n combobox: ['select'],\n heading: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'],\n list: ['ul', 'ol'],\n listitem: ['li'],\n navigation: ['nav'],\n main: ['main'],\n banner: ['header'],\n contentinfo: ['footer'],\n form: ['form'],\n img: ['img'],\n table: ['table'],\n };\n\n const candidates: Element[] = [];\n candidates.push(...document.querySelectorAll(`[role=\"${role}\"]`));\n \n const implicitSelectors = implicitRoles[role];\n if (implicitSelectors) {\n for (const sel of implicitSelectors) {\n candidates.push(...document.querySelectorAll(`${sel}:not([role])`));\n }\n }\n\n if (!name) return candidates[0] || null;\n\n const normalizedName = name.toLowerCase().trim();\n for (const el of candidates) {\n const ariaLabel = el.getAttribute('aria-label')?.toLowerCase().trim();\n const textContent = el.textContent?.toLowerCase().trim();\n const title = el.getAttribute('title')?.toLowerCase().trim();\n const placeholder = el.getAttribute('placeholder')?.toLowerCase().trim();\n\n if (ariaLabel === normalizedName || textContent === normalizedName || \n title === normalizedName || placeholder === normalizedName) {\n return el;\n }\n if (ariaLabel?.includes(normalizedName) || textContent?.includes(normalizedName)) {\n return el;\n }\n }\n\n return null;\n }\n};\n\nif (!window.__piHelpers) {\n window.__piHelpers = piHelpersImpl;\n window.piHelpers = piHelpersImpl;\n}\n\nfunction getElementMap() {\n return window.__piElementMap!;\n}\n\nfunction generateAccessibilityTree(\n filter: \"all\" | \"interactive\" = \"interactive\",\n maxDepth = 15,\n refId?: string,\n forceFullSnapshot = false,\n compact = false\n): { \n pageContent: string;\n diff?: string;\n viewport: { width: number; height: number }; \n error?: string;\n modalStates?: ModalState[];\n modalLimitations?: string;\n isIncremental?: boolean;\n} {\n try {\n window.__piRefs = {};\n\n function getRole(element: Element): string {\n return getResolvedRole(element);\n }\n\n function getName(element: Element): string {\n const tag = element.tagName.toLowerCase();\n\n const labelledBy = element.getAttribute('aria-labelledby');\n if (labelledBy) {\n const names = labelledBy.split(/\\s+/).map(id => {\n const el = document.getElementById(id);\n return el?.textContent?.trim() || '';\n }).filter(Boolean);\n if (names.length) {\n const joined = names.join(' ');\n return joined.length > 100 ? joined.substring(0, 100) + '...' : joined;\n }\n }\n\n if (tag === \"select\") {\n const select = element as HTMLSelectElement;\n const selected = select.querySelector(\"option[selected]\") || \n (select.selectedIndex >= 0 ? select.options[select.selectedIndex] : null);\n if (selected?.textContent?.trim()) return selected.textContent.trim();\n }\n\n const ariaLabel = element.getAttribute(\"aria-label\");\n if (ariaLabel?.trim()) return ariaLabel.trim();\n\n const placeholder = element.getAttribute(\"placeholder\");\n if (placeholder?.trim()) return placeholder.trim();\n\n const title = element.getAttribute(\"title\");\n if (title?.trim()) return title.trim();\n\n const alt = element.getAttribute(\"alt\");\n if (alt?.trim()) return alt.trim();\n\n if (element.id) {\n const label = document.querySelector(`label[for=\"${element.id}\"]`);\n if (label?.textContent?.trim()) return label.textContent.trim();\n }\n\n if (tag === \"input\") {\n const input = element as HTMLInputElement;\n const type = element.getAttribute(\"type\") || \"\";\n const value = element.getAttribute(\"value\");\n if (type === \"submit\" && value?.trim()) return value.trim();\n if (input.value && input.value.length < 50 && input.value.trim()) return input.value.trim();\n }\n\n if ([\"button\", \"a\", \"summary\"].includes(tag)) {\n let textContent = \"\";\n for (const node of element.childNodes) {\n if (node.nodeType === Node.TEXT_NODE) {\n textContent += node.textContent;\n }\n }\n if (textContent.trim()) return textContent.trim();\n }\n\n if (/^h[1-6]$/.test(tag)) {\n const text = element.textContent;\n if (text?.trim()) {\n const t = text.trim();\n return t.length > 100 ? t.substring(0, 100) + \"...\" : t;\n }\n }\n\n if (tag === \"img\") return \"\";\n\n let directText = \"\";\n for (const node of element.childNodes) {\n if (node.nodeType === Node.TEXT_NODE) {\n directText += node.textContent;\n }\n }\n if (directText?.trim() && directText.trim().length >= 3) {\n const text = directText.trim();\n return text.length > 100 ? text.substring(0, 100) + \"...\" : text;\n }\n\n return \"\";\n }\n\n interface AriaProps {\n checked?: boolean | 'mixed';\n disabled?: boolean;\n expanded?: boolean;\n level?: number;\n pressed?: boolean | 'mixed';\n selected?: boolean;\n active?: boolean;\n }\n\n function getAriaProps(element: Element): AriaProps {\n const props: AriaProps = {};\n \n const checkedAttr = element.getAttribute('aria-checked');\n if (checkedAttr === 'true') props.checked = true;\n else if (checkedAttr === 'false') props.checked = false;\n else if (checkedAttr === 'mixed') props.checked = 'mixed';\n else if (element instanceof HTMLInputElement && (element.type === 'checkbox' || element.type === 'radio')) {\n if (element.type === 'checkbox' && element.indeterminate) {\n props.checked = 'mixed';\n } else {\n props.checked = element.checked;\n }\n }\n \n const isDisableable = element instanceof HTMLButtonElement || \n element instanceof HTMLInputElement || \n element instanceof HTMLSelectElement || \n element instanceof HTMLTextAreaElement;\n if (element.getAttribute('aria-disabled') === 'true' || \n (isDisableable && (element as HTMLButtonElement).disabled) ||\n element.closest('fieldset:disabled')) {\n props.disabled = true;\n }\n \n const expandedAttr = element.getAttribute('aria-expanded');\n if (expandedAttr === 'true') props.expanded = true;\n else if (expandedAttr === 'false') props.expanded = false;\n \n const pressedAttr = element.getAttribute('aria-pressed');\n if (pressedAttr === 'true') props.pressed = true;\n else if (pressedAttr === 'false') props.pressed = false;\n else if (pressedAttr === 'mixed') props.pressed = 'mixed';\n \n const selectedAttr = element.getAttribute('aria-selected');\n if (selectedAttr === 'true') props.selected = true;\n else if (selectedAttr === 'false') props.selected = false;\n \n const activeAttr = element.getAttribute('aria-current');\n if (activeAttr && activeAttr !== 'false') {\n props.active = true;\n }\n \n const tag = element.tagName.toLowerCase();\n if (/^h[1-6]$/.test(tag)) {\n props.level = parseInt(tag[1], 10);\n } else {\n const levelAttr = element.getAttribute('aria-level');\n if (levelAttr) props.level = parseInt(levelAttr, 10);\n }\n \n return props;\n }\n\n function formatAriaProps(props: AriaProps): string {\n const parts: string[] = [];\n \n if (props.checked !== undefined) {\n parts.push(props.checked === 'mixed' ? '[checked=mixed]' : props.checked ? '[checked]' : '[unchecked]');\n }\n if (props.disabled) parts.push('[disabled]');\n if (props.expanded !== undefined) {\n parts.push(props.expanded ? '[expanded]' : '[collapsed]');\n }\n if (props.pressed !== undefined) {\n parts.push(props.pressed === 'mixed' ? '[pressed=mixed]' : props.pressed ? '[pressed]' : '[not-pressed]');\n }\n if (props.selected !== undefined) {\n parts.push(props.selected ? '[selected]' : '[not-selected]');\n }\n if (props.active) parts.push('[active]');\n if (props.level !== undefined) {\n parts.push(`[level=${props.level}]`);\n }\n \n return parts.join(' ');\n }\n\n function isVisible(element: Element): boolean {\n const style = window.getComputedStyle(element);\n return (\n style.display !== \"none\" &&\n style.visibility !== \"hidden\" &&\n style.opacity !== \"0\" &&\n (element as HTMLElement).offsetWidth > 0 &&\n (element as HTMLElement).offsetHeight > 0\n );\n }\n\n function isInteractive(element: Element): boolean {\n const tag = element.tagName.toLowerCase();\n return (\n [\"a\", \"button\", \"input\", \"select\", \"textarea\", \"details\", \"summary\"].includes(tag) ||\n element.hasAttribute(\"onclick\") ||\n element.hasAttribute(\"tabindex\") ||\n element.getAttribute(\"role\") === \"button\" ||\n element.getAttribute(\"role\") === \"link\" ||\n element.getAttribute(\"contenteditable\") === \"true\"\n );\n }\n\n function isLandmark(element: Element): boolean {\n const tag = element.tagName.toLowerCase();\n return (\n [\"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"nav\", \"main\", \"header\", \"footer\", \"section\", \"article\", \"aside\"].includes(tag) ||\n element.hasAttribute(\"role\")\n );\n }\n\n function hasCursorPointer(element: Element): boolean {\n const style = window.getComputedStyle(element);\n return style.cursor === \"pointer\";\n }\n\n function shouldInclude(element: Element, options: { filter: string; refId: string | null; compact: boolean }): boolean {\n const tag = element.tagName.toLowerCase();\n if ([\"script\", \"style\", \"meta\", \"link\", \"title\", \"noscript\"].includes(tag)) return false;\n if (options.filter !== \"all\" && element.getAttribute(\"aria-hidden\") === \"true\") return false;\n if (options.filter !== \"all\" && !isVisible(element)) return false;\n\n if (options.filter !== \"all\" && !options.refId) {\n const rect = element.getBoundingClientRect();\n if (!(rect.top < window.innerHeight && rect.bottom > 0 && rect.left < window.innerWidth && rect.right > 0)) {\n return false;\n }\n }\n\n if (options.filter === \"interactive\") return isInteractive(element);\n if (isInteractive(element)) return true;\n if (isLandmark(element)) return true;\n if (getName(element).length > 0) return true;\n\n const role = getRole(element);\n \n // In compact mode, skip empty structural elements\n if (options.compact) {\n const emptyStructuralRoles = new Set([\"generic\", \"group\", \"region\", \"article\", \"section\", \"complementary\"]);\n if (emptyStructuralRoles.has(role) && getName(element).length === 0) {\n return false;\n }\n }\n \n return role !== \"generic\" && role !== \"img\";\n }\n\n function traverse(element: Element, depth: number): string[] {\n const lines: string[] = [];\n const options = { filter, refId: refId || null, compact };\n const elementMap = getElementMap();\n\n const include = shouldInclude(element, options) || (refId && depth === 0);\n\n if (include) {\n const role = getRole(element);\n const name = getName(element);\n const ariaProps = getAriaProps(element);\n\n const elemRefId = getOrAssignRef(element, role, name);\n window.__piRefs![elemRefId] = element;\n elementMap[elemRefId] = {\n element: new WeakRef(element),\n role,\n name,\n };\n\n const indent = \" \".repeat(depth);\n let line = `${indent}${role}`;\n if (name) {\n const escapedName = name.replace(/\\s+/g, \" \").replace(/\"/g, '\\\\\"');\n line += ` \"${escapedName}\"`;\n }\n line += ` [${elemRefId}]`;\n\n const propsStr = formatAriaProps(ariaProps);\n if (propsStr) line += ` ${propsStr}`;\n\n if (hasCursorPointer(element)) {\n line += \" [cursor=pointer]\";\n }\n\n const href = element.getAttribute(\"href\");\n if (href) line += ` href=\"${href}\"`;\n\n const type = element.getAttribute(\"type\");\n if (type) line += ` type=\"${type}\"`;\n\n const placeholder = element.getAttribute(\"placeholder\");\n if (placeholder) line += ` placeholder=\"${placeholder}\"`;\n\n lines.push(line);\n }\n\n if (depth < maxDepth) {\n for (const child of element.children) {\n lines.push(...traverse(child, include ? depth + 1 : depth));\n }\n }\n\n return lines;\n }\n\n function normalizeLineForDiff(line: string): string {\n return line.replace(/\\[e\\d+\\]/g, '[REF]');\n }\n\n function countOccurrences(lines: string[]): Map<string, number> {\n const counts = new Map<string, number>();\n for (const line of lines) {\n if (!line.trim()) continue;\n const norm = normalizeLineForDiff(line);\n counts.set(norm, (counts.get(norm) || 0) + 1);\n }\n return counts;\n }\n\n function computeSimpleDiff(oldContent: string, newContent: string): { diff: string; hasChanges: boolean } {\n const oldLines = oldContent.split('\\n');\n const newLines = newContent.split('\\n');\n \n const oldCounts = countOccurrences(oldLines);\n const newCounts = countOccurrences(newLines);\n \n const added: string[] = [];\n const removed: string[] = [];\n \n for (const line of newLines) {\n if (!line.trim()) continue;\n const norm = normalizeLineForDiff(line);\n const oldCount = oldCounts.get(norm) || 0;\n const newCount = newCounts.get(norm) || 0;\n if (newCount > oldCount) {\n added.push(line);\n oldCounts.set(norm, oldCount + 1);\n }\n }\n \n const oldCountsReset = countOccurrences(oldLines);\n for (const line of oldLines) {\n if (!line.trim()) continue;\n const norm = normalizeLineForDiff(line);\n const oldCount = oldCountsReset.get(norm) || 0;\n const newCount = newCounts.get(norm) || 0;\n if (oldCount > newCount) {\n removed.push(line);\n oldCountsReset.set(norm, oldCount - 1);\n }\n }\n \n if (added.length === 0 && removed.length === 0) {\n return { diff: '[NO CHANGES]', hasChanges: false };\n }\n \n const diffLines: string[] = [];\n if (removed.length > 0) {\n diffLines.push(...removed.map(l => `- ${l}`));\n }\n if (added.length > 0) {\n diffLines.push(...added.map(l => `+ ${l}`));\n }\n \n return { diff: diffLines.join('\\n'), hasChanges: true };\n }\n\n const elementMap = getElementMap();\n let startElement: Element | null = null;\n\n if (refId) {\n const elemRef = elementMap[refId];\n if (!elemRef) {\n return {\n error: `Element with ref_id '${refId}' not found. Use read_page without ref_id to get current elements.`,\n pageContent: \"\",\n viewport: { width: window.innerWidth, height: window.innerHeight },\n };\n }\n const element = elemRef.element.deref();\n if (!element) {\n delete elementMap[refId];\n return {\n error: `Element with ref_id '${refId}' no longer exists. Use read_page without ref_id to get current elements.`,\n pageContent: \"\",\n viewport: { width: window.innerWidth, height: window.innerHeight },\n };\n }\n startElement = element;\n } else {\n startElement = document.body;\n }\n\n const lines = startElement ? traverse(startElement, 0) : [];\n\n for (const id of Object.keys(elementMap)) {\n if (!elementMap[id].element.deref()) {\n delete elementMap[id];\n }\n }\n\n const content = lines.join(\"\\n\");\n\n if (content.length > 50000) {\n return {\n error: `Output exceeds 50000 character limit (${content.length} characters). Try using filter=\"interactive\" or specify a ref_id.`,\n pageContent: \"\",\n viewport: { width: window.innerWidth, height: window.innerHeight },\n };\n }\n\n const modalStates = detectModalStates();\n\n let diff: string | undefined;\n let isIncremental = false;\n const lastSnapshot = window.__piLastSnapshot;\n\n if (!forceFullSnapshot && !refId && lastSnapshot && \n Date.now() - lastSnapshot.timestamp < 5000) {\n const diffResult = computeSimpleDiff(lastSnapshot.content, content);\n diff = diffResult.diff;\n isIncremental = true;\n }\n\n window.__piLastSnapshot = { content, timestamp: Date.now() };\n\n return {\n pageContent: content + `\\n\\n[Viewport: ${window.innerWidth}x${window.innerHeight}]`,\n diff: isIncremental ? diff : undefined,\n viewport: { width: window.innerWidth, height: window.innerHeight },\n modalStates: modalStates.length > 0 ? modalStates : undefined,\n modalLimitations: 'Only custom modals ([role=dialog]) detected. Native alert/confirm/prompt dialogs and system file choosers cannot be detected from content scripts.',\n isIncremental,\n };\n } catch (err) {\n return {\n error: `Error generating accessibility tree: ${err instanceof Error ? err.message : \"Unknown error\"}`,\n pageContent: \"\",\n viewport: { width: window.innerWidth, height: window.innerHeight },\n };\n }\n}\n\nfunction yamlEscapeValue(str: string): string {\n if (!str.length) return '\"\"';\n if (/[\\n\\r]/.test(str) || /^[\\s]/.test(str) || /[\\s]$/.test(str) || /[:\"{}[\\]]/.test(str)) {\n return '\"' + str.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"').replace(/\\n/g, '\\\\n').replace(/\\r/g, '\\\\r') + '\"';\n }\n return str;\n}\n\nfunction generateYamlTree(\n filter: \"all\" | \"interactive\" = \"interactive\",\n maxDepth = 15\n): { yaml: string; viewport: { width: number; height: number }; error?: string } {\n try {\n window.__piRefs = {};\n \n const lines: string[] = [];\n\n function getRole(element: Element): string {\n return getResolvedRole(element);\n }\n\n function getName(element: Element): string {\n const tag = element.tagName.toLowerCase();\n\n const labelledBy = element.getAttribute('aria-labelledby');\n if (labelledBy) {\n const names = labelledBy.split(/\\s+/).map(id => {\n const el = document.getElementById(id);\n return el?.textContent?.trim() || '';\n }).filter(Boolean);\n if (names.length) {\n const joined = names.join(' ');\n return joined.length > 100 ? joined.substring(0, 100) + '...' : joined;\n }\n }\n\n if (tag === \"select\") {\n const select = element as HTMLSelectElement;\n const selected = select.querySelector(\"option[selected]\") || \n (select.selectedIndex >= 0 ? select.options[select.selectedIndex] : null);\n if (selected?.textContent?.trim()) return selected.textContent.trim();\n }\n\n const ariaLabel = element.getAttribute(\"aria-label\");\n if (ariaLabel?.trim()) return ariaLabel.trim();\n\n const placeholder = element.getAttribute(\"placeholder\");\n if (placeholder?.trim()) return placeholder.trim();\n\n const title = element.getAttribute(\"title\");\n if (title?.trim()) return title.trim();\n\n const alt = element.getAttribute(\"alt\");\n if (alt?.trim()) return alt.trim();\n\n if (element.id) {\n const label = document.querySelector(`label[for=\"${element.id}\"]`);\n if (label?.textContent?.trim()) return label.textContent.trim();\n }\n\n if (tag === \"input\") {\n const input = element as HTMLInputElement;\n const type = element.getAttribute(\"type\") || \"\";\n const value = element.getAttribute(\"value\");\n if (type === \"submit\" && value?.trim()) return value.trim();\n if (input.value && input.value.length < 50 && input.value.trim()) return input.value.trim();\n }\n\n if ([\"button\", \"a\", \"summary\"].includes(tag)) {\n let textContent = \"\";\n for (const node of element.childNodes) {\n if (node.nodeType === Node.TEXT_NODE) {\n textContent += node.textContent;\n }\n }\n if (textContent.trim()) return textContent.trim();\n }\n\n if (/^h[1-6]$/.test(tag)) {\n const text = element.textContent;\n if (text?.trim()) {\n const t = text.trim();\n return t.length > 100 ? t.substring(0, 100) + \"...\" : t;\n }\n }\n\n if (tag === \"img\") return \"\";\n\n let directText = \"\";\n for (const node of element.childNodes) {\n if (node.nodeType === Node.TEXT_NODE) {\n directText += node.textContent;\n }\n }\n if (directText?.trim() && directText.trim().length >= 3) {\n const text = directText.trim();\n return text.length > 100 ? text.substring(0, 100) + \"...\" : text;\n }\n\n return \"\";\n }\n\n interface AriaProps {\n checked?: boolean | 'mixed';\n disabled?: boolean;\n expanded?: boolean;\n level?: number;\n pressed?: boolean | 'mixed';\n selected?: boolean;\n active?: boolean;\n }\n\n function getAriaProps(element: Element): AriaProps {\n const props: AriaProps = {};\n \n const checkedAttr = element.getAttribute('aria-checked');\n if (checkedAttr === 'true') props.checked = true;\n else if (checkedAttr === 'false') props.checked = false;\n else if (checkedAttr === 'mixed') props.checked = 'mixed';\n else if (element instanceof HTMLInputElement && (element.type === 'checkbox' || element.type === 'radio')) {\n if (element.type === 'checkbox' && element.indeterminate) {\n props.checked = 'mixed';\n } else {\n props.checked = element.checked;\n }\n }\n \n const isDisableable = element instanceof HTMLButtonElement || \n element instanceof HTMLInputElement || \n element instanceof HTMLSelectElement || \n element instanceof HTMLTextAreaElement;\n if (element.getAttribute('aria-disabled') === 'true' || \n (isDisableable && (element as HTMLButtonElement).disabled) ||\n element.closest('fieldset:disabled')) {\n props.disabled = true;\n }\n \n const expandedAttr = element.getAttribute('aria-expanded');\n if (expandedAttr === 'true') props.expanded = true;\n else if (expandedAttr === 'false') props.expanded = false;\n \n const pressedAttr = element.getAttribute('aria-pressed');\n if (pressedAttr === 'true') props.pressed = true;\n else if (pressedAttr === 'false') props.pressed = false;\n else if (pressedAttr === 'mixed') props.pressed = 'mixed';\n \n const selectedAttr = element.getAttribute('aria-selected');\n if (selectedAttr === 'true') props.selected = true;\n else if (selectedAttr === 'false') props.selected = false;\n \n const activeAttr = element.getAttribute('aria-current');\n if (activeAttr && activeAttr !== 'false') {\n props.active = true;\n }\n \n const tag = element.tagName.toLowerCase();\n if (/^h[1-6]$/.test(tag)) {\n props.level = parseInt(tag[1], 10);\n } else {\n const levelAttr = element.getAttribute('aria-level');\n if (levelAttr) props.level = parseInt(levelAttr, 10);\n }\n \n return props;\n }\n\n function formatAriaProps(props: AriaProps): string {\n const parts: string[] = [];\n \n if (props.checked !== undefined) {\n parts.push(props.checked === 'mixed' ? '[checked=mixed]' : props.checked ? '[checked]' : '[unchecked]');\n }\n if (props.disabled) parts.push('[disabled]');\n if (props.expanded !== undefined) {\n parts.push(props.expanded ? '[expanded]' : '[collapsed]');\n }\n if (props.pressed !== undefined) {\n parts.push(props.pressed === 'mixed' ? '[pressed=mixed]' : props.pressed ? '[pressed]' : '[not-pressed]');\n }\n if (props.selected !== undefined) {\n parts.push(props.selected ? '[selected]' : '[not-selected]');\n }\n if (props.active) parts.push('[active]');\n if (props.level !== undefined) {\n parts.push(`[level=${props.level}]`);\n }\n \n return parts.join(' ');\n }\n\n function isVisible(element: Element): boolean {\n const style = window.getComputedStyle(element);\n return (\n style.display !== \"none\" &&\n style.visibility !== \"hidden\" &&\n style.opacity !== \"0\" &&\n (element as HTMLElement).offsetWidth > 0 &&\n (element as HTMLElement).offsetHeight > 0\n );\n }\n\n function isInteractive(element: Element): boolean {\n const tag = element.tagName.toLowerCase();\n return (\n [\"a\", \"button\", \"input\", \"select\", \"textarea\", \"details\", \"summary\"].includes(tag) ||\n element.hasAttribute(\"onclick\") ||\n element.hasAttribute(\"tabindex\") ||\n element.getAttribute(\"role\") === \"button\" ||\n element.getAttribute(\"role\") === \"link\" ||\n element.getAttribute(\"contenteditable\") === \"true\"\n );\n }\n\n function isLandmark(element: Element): boolean {\n const tag = element.tagName.toLowerCase();\n return (\n [\"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"nav\", \"main\", \"header\", \"footer\", \"section\", \"article\", \"aside\"].includes(tag) ||\n element.hasAttribute(\"role\")\n );\n }\n\n function hasCursorPointer(element: Element): boolean {\n const style = window.getComputedStyle(element);\n return style.cursor === \"pointer\";\n }\n\n function buildKey(role: string, name: string, element: Element, ariaProps: AriaProps): string {\n let key = role;\n if (name) {\n key += ' ' + yamlEscapeValue(name);\n }\n \n const ref = getOrAssignRef(element, role, name);\n window.__piRefs![ref] = element;\n key += ` [ref=${ref}]`;\n \n const propsStr = formatAriaProps(ariaProps);\n if (propsStr) key += ` ${propsStr}`;\n \n if (hasCursorPointer(element)) {\n key += ' [cursor=pointer]';\n }\n \n return key;\n }\n\n function getElementProps(element: Element): Record<string, string> {\n const props: Record<string, string> = {};\n const href = element.getAttribute(\"href\");\n if (href) props.url = href;\n const placeholder = element.getAttribute(\"placeholder\");\n if (placeholder) props.placeholder = placeholder;\n return props;\n }\n\n function traverse(element: Element, depth: number, parentIncluded: boolean): void {\n if (depth > maxDepth) return;\n \n const tag = element.tagName.toLowerCase();\n if ([\"script\", \"style\", \"meta\", \"link\", \"title\", \"noscript\"].includes(tag)) return;\n if (filter !== \"all\" && element.getAttribute(\"aria-hidden\") === \"true\") return;\n if (filter !== \"all\" && !isVisible(element)) return;\n \n if (filter !== \"all\") {\n const rect = element.getBoundingClientRect();\n if (!(rect.top < window.innerHeight && rect.bottom > 0 && rect.left < window.innerWidth && rect.right > 0)) {\n return;\n }\n }\n \n const role = getRole(element);\n const name = getName(element);\n const ariaProps = getAriaProps(element);\n \n const isInteractiveEl = isInteractive(element);\n const isLandmarkEl = isLandmark(element);\n const hasName = name.length > 0;\n \n let include: boolean;\n if (filter === \"interactive\") {\n include = isInteractiveEl;\n } else if (filter === \"all\") {\n include = true;\n } else {\n include = isInteractiveEl || isLandmarkEl || hasName || (role !== \"generic\" && role !== \"img\");\n }\n \n if (include) {\n const indent = \" \".repeat(depth);\n const key = buildKey(role, name, element, ariaProps);\n const props = getElementProps(element);\n \n const children: Element[] = [];\n for (const child of element.children) {\n children.push(child);\n }\n \n const hasChildren = children.length > 0;\n const hasProps = Object.keys(props).length > 0;\n \n if (!hasChildren && !hasProps) {\n lines.push(`${indent}- ${key}`);\n } else {\n lines.push(`${indent}- ${key}:`);\n for (const [propName, propValue] of Object.entries(props)) {\n lines.push(`${indent} - /${propName}: ${yamlEscapeValue(propValue)}`);\n }\n for (const child of children) {\n traverse(child, depth + 1, true);\n }\n }\n } else {\n for (const child of element.children) {\n traverse(child, depth, parentIncluded);\n }\n }\n }\n\n traverse(document.body, 0, false);\n\n const yaml = lines.join('\\n');\n \n if (yaml.length > 50000) {\n return {\n error: `Output exceeds 50000 character limit (${yaml.length} characters). Try using filter=\"interactive\".`,\n yaml: \"\",\n viewport: { width: window.innerWidth, height: window.innerHeight },\n };\n }\n\n return {\n yaml: yaml + `\\n\\n[Viewport: ${window.innerWidth}x${window.innerHeight}]`,\n viewport: { width: window.innerWidth, height: window.innerHeight },\n };\n } catch (err) {\n return {\n error: `Error generating YAML tree: ${err instanceof Error ? err.message : \"Unknown error\"}`,\n yaml: \"\",\n viewport: { width: window.innerWidth, height: window.innerHeight },\n };\n }\n}\n\nfunction getElementCoordinates(ref: string): { x: number; y: number; error?: string } {\n const elementMap = getElementMap();\n const elemRef = elementMap[ref];\n let element: Element | undefined;\n \n if (elemRef) {\n element = elemRef.element.deref();\n if (!element) {\n delete elementMap[ref];\n }\n }\n \n if (!element && window.__piRefs) {\n element = window.__piRefs[ref];\n }\n \n if (!element) {\n return { x: 0, y: 0, error: `Element ${ref} not found. Use read_page to get current elements.` };\n }\n\n const rect = element.getBoundingClientRect();\n const x = Math.round(rect.left + rect.width / 2);\n const y = Math.round(rect.top + rect.height / 2);\n\n return { x, y };\n}\n\nfunction setFormValue(ref: string, value: string | boolean | number): { success: boolean; error?: string } {\n const elementMap = getElementMap();\n const elemRef = elementMap[ref];\n let element: Element | undefined;\n \n if (elemRef) {\n element = elemRef.element.deref();\n if (!element) {\n delete elementMap[ref];\n }\n }\n \n if (!element && window.__piRefs) {\n element = window.__piRefs[ref];\n }\n \n if (!element) {\n return { success: false, error: `Element ${ref} not found. Use read_page to get current elements.` };\n }\n\n const tagName = element.tagName.toLowerCase();\n\n try {\n if (tagName === \"input\") {\n const input = element as HTMLInputElement;\n const type = input.type.toLowerCase();\n\n if (type === \"checkbox\" || type === \"radio\") {\n input.checked = Boolean(value);\n input.dispatchEvent(new Event(\"change\", { bubbles: true }));\n } else {\n input.value = String(value);\n input.dispatchEvent(new Event(\"input\", { bubbles: true }));\n input.dispatchEvent(new Event(\"change\", { bubbles: true }));\n }\n } else if (tagName === \"textarea\") {\n const textarea = element as HTMLTextAreaElement;\n textarea.value = String(value);\n textarea.dispatchEvent(new Event(\"input\", { bubbles: true }));\n textarea.dispatchEvent(new Event(\"change\", { bubbles: true }));\n } else if (tagName === \"select\") {\n const select = element as HTMLSelectElement;\n const strValue = String(value);\n\n let found = false;\n for (const option of select.options) {\n if (option.value === strValue || option.textContent?.trim() === strValue) {\n select.value = option.value;\n found = true;\n break;\n }\n }\n\n if (!found) {\n return { success: false, error: `Option \"${value}\" not found in select element ${ref}` };\n }\n\n select.dispatchEvent(new Event(\"change\", { bubbles: true }));\n } else if (element.getAttribute(\"contenteditable\") === \"true\") {\n element.textContent = String(value);\n element.dispatchEvent(new Event(\"input\", { bubbles: true }));\n } else {\n return { success: false, error: `Element ${ref} (${tagName}) is not a form field` };\n }\n\n return { success: true };\n } catch (err) {\n return { success: false, error: `Failed to set value: ${err instanceof Error ? err.message : \"Unknown error\"}` };\n }\n}\n\nfunction getPageText(): { text: string; title: string; url: string; error?: string } {\n try {\n const article = document.querySelector(\"article\");\n const main = document.querySelector(\"main\");\n const content = article || main || document.body;\n\n const text = content.textContent\n ?.replace(/\\s+/g, \" \")\n .trim()\n .substring(0, 50000) || \"\";\n\n return {\n text,\n title: document.title,\n url: window.location.href,\n };\n } catch (err) {\n return {\n text: \"\",\n title: \"\",\n url: \"\",\n error: `Failed to extract text: ${err instanceof Error ? err.message : \"Unknown error\"}`,\n };\n }\n}\n\nfunction scrollToElement(ref: string): { success: boolean; error?: string } {\n const elementMap = getElementMap();\n const elemRef = elementMap[ref];\n let element: Element | undefined;\n \n if (elemRef) {\n element = elemRef.element.deref();\n if (!element) {\n delete elementMap[ref];\n }\n }\n \n if (!element && window.__piRefs) {\n element = window.__piRefs[ref];\n }\n \n if (!element) {\n return { success: false, error: `Element ${ref} not found. Run read_page to get current element refs.` };\n }\n\n element.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n return { success: true };\n}\n\nfunction uploadImage(\n base64: string,\n ref?: string,\n coordinate?: [number, number],\n filename: string = \"screenshot.png\"\n): { success: boolean; error?: string } {\n try {\n const byteString = atob(base64);\n const ab = new ArrayBuffer(byteString.length);\n const ia = new Uint8Array(ab);\n for (let i = 0; i < byteString.length; i++) {\n ia[i] = byteString.charCodeAt(i);\n }\n const blob = new Blob([ab], { type: \"image/png\" });\n const file = new File([blob], filename, { type: \"image/png\" });\n\n let targetElement: HTMLElement | null = null;\n\n if (ref) {\n const elementMap = getElementMap();\n const elemRef = elementMap[ref];\n \n if (elemRef) {\n targetElement = elemRef.element.deref() as HTMLElement | null;\n if (!targetElement) {\n delete elementMap[ref];\n }\n }\n \n if (!targetElement && window.__piRefs) {\n targetElement = window.__piRefs[ref] as HTMLElement | null;\n }\n \n if (!targetElement) {\n return { success: false, error: `Element ${ref} not found. Run read_page to get current element refs.` };\n }\n } else if (coordinate) {\n targetElement = document.elementFromPoint(coordinate[0], coordinate[1]) as HTMLElement | null;\n if (!targetElement) {\n return { success: false, error: `No element at (${coordinate[0]}, ${coordinate[1]})` };\n }\n }\n\n if (!targetElement) {\n return { success: false, error: \"No target element\" };\n }\n\n if (targetElement.tagName === \"INPUT\" && (targetElement as HTMLInputElement).type === \"file\") {\n const input = targetElement as HTMLInputElement;\n const dt = new DataTransfer();\n dt.items.add(file);\n input.files = dt.files;\n input.dispatchEvent(new Event(\"change\", { bubbles: true }));\n return { success: true };\n }\n\n const dt = new DataTransfer();\n dt.items.add(file);\n\n const dropEvent = new DragEvent(\"drop\", {\n bubbles: true,\n cancelable: true,\n dataTransfer: dt,\n });\n\n targetElement.dispatchEvent(dropEvent);\n return { success: true };\n } catch (err) {\n return {\n success: false,\n error: err instanceof Error ? err.message : \"Upload failed\",\n };\n }\n}\n\nchrome.runtime.onMessage.addListener((message, sender, sendResponse) => {\n switch (message.type) {\n case \"GENERATE_ACCESSIBILITY_TREE\": {\n const options = message.options || {};\n \n if (options.format === \"yaml\") {\n const result = generateYamlTree(\n options.filter || \"interactive\",\n options.depth ?? 15\n );\n const modalStates = detectModalStates();\n if (result.error) {\n sendResponse({ error: result.error, pageContent: \"\", viewport: result.viewport });\n } else {\n sendResponse({ \n pageContent: result.yaml, \n viewport: result.viewport,\n modalStates: modalStates.length > 0 ? modalStates : undefined,\n modalLimitations: 'Only custom modals ([role=dialog]) detected. Native alert/confirm/prompt dialogs and system file choosers cannot be detected from content scripts.',\n });\n }\n } else {\n const result = generateAccessibilityTree(\n options.filter || \"interactive\",\n options.depth ?? 15,\n options.refId,\n options.forceFullSnapshot ?? false,\n options.compact ?? false\n );\n sendResponse(result);\n }\n break;\n }\n case \"GET_ELEMENT_COORDINATES\": {\n const result = getElementCoordinates(message.ref);\n sendResponse(result);\n break;\n }\n case \"CLICK_ELEMENT\": {\n const elementMap = getElementMap();\n const elemRef = elementMap[message.ref];\n let element: Element | undefined;\n if (elemRef) {\n element = elemRef.element.deref();\n if (!element) delete elementMap[message.ref];\n }\n if (!element && window.__piRefs) {\n element = window.__piRefs[message.ref];\n }\n if (!element) {\n sendResponse({ error: `Element ${message.ref} not found. Use read_page to get current elements.` });\n break;\n }\n if (message.button === \"triple\") {\n const tripleClick = new MouseEvent(\"click\", { bubbles: true, cancelable: true, view: window, detail: 3 });\n element.dispatchEvent(tripleClick);\n } else if (message.button === \"double\") {\n element.dispatchEvent(new MouseEvent(\"dblclick\", { bubbles: true, cancelable: true, view: window }));\n } else if (message.button === \"right\") {\n element.dispatchEvent(new MouseEvent(\"contextmenu\", { bubbles: true, cancelable: true, view: window }));\n } else {\n (element as HTMLElement).click();\n }\n sendResponse({ success: true });\n break;\n }\n case \"FORM_INPUT\": {\n const result = setFormValue(message.ref, message.value);\n sendResponse(result);\n break;\n }\n case \"EVAL_IN_PAGE\": {\n try {\n const script = document.createElement('script');\n script.textContent = `(function() { ${message.code} })();`;\n document.documentElement.appendChild(script);\n script.remove();\n sendResponse({ success: true });\n } catch (err) {\n sendResponse({ success: false, error: err instanceof Error ? err.message : String(err) });\n }\n break;\n }\n case \"GET_PAGE_TEXT\": {\n const result = getPageText();\n sendResponse(result);\n break;\n }\n case \"GET_FRAME_BY_SELECTOR\": {\n try {\n const iframe = document.querySelector(message.selector) as HTMLIFrameElement;\n if (!iframe || iframe.tagName.toLowerCase() !== 'iframe') {\n sendResponse({ error: `No iframe found with selector \"${message.selector}\"` });\n break;\n }\n // Return what info we can - the service worker will match by URL or name\n sendResponse({ \n url: iframe.src,\n name: iframe.name || undefined,\n });\n } catch (err) {\n sendResponse({ error: err instanceof Error ? err.message : String(err) });\n }\n break;\n }\n case \"GET_FRAME_NAME\": {\n // Return this frame's name (for frame matching by name)\n try {\n sendResponse({ name: window.name || null });\n } catch (err) {\n sendResponse({ name: null });\n }\n break;\n }\n case \"LOCATE_ROLE\": {\n try {\n const { role, name, all } = message;\n const elementMap = getElementMap();\n \n // Mapping of role to possible selectors\n const implicitRoles: Record<string, string[]> = {\n button: ['button', 'input[type=\"button\"]', 'input[type=\"submit\"]', 'input[type=\"reset\"]', '[role=\"button\"]'],\n link: ['a[href]', '[role=\"link\"]'],\n textbox: ['input:not([type])', 'input[type=\"text\"]', 'input[type=\"email\"]', 'input[type=\"password\"]', 'input[type=\"search\"]', 'input[type=\"tel\"]', 'input[type=\"url\"]', 'textarea', '[role=\"textbox\"]'],\n checkbox: ['input[type=\"checkbox\"]', '[role=\"checkbox\"]'],\n radio: ['input[type=\"radio\"]', '[role=\"radio\"]'],\n combobox: ['select', '[role=\"combobox\"]'],\n listbox: ['[role=\"listbox\"]', 'select[multiple]'],\n option: ['option', '[role=\"option\"]'],\n heading: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', '[role=\"heading\"]'],\n navigation: ['nav', '[role=\"navigation\"]'],\n main: ['main', '[role=\"main\"]'],\n img: ['img[alt]', '[role=\"img\"]'],\n dialog: ['dialog', '[role=\"dialog\"]', '[role=\"alertdialog\"]'],\n tab: ['[role=\"tab\"]'],\n tabpanel: ['[role=\"tabpanel\"]'],\n menu: ['[role=\"menu\"]'],\n menuitem: ['[role=\"menuitem\"]'],\n };\n \n // Build selectors for the role\n const selectors = implicitRoles[role] || [`[role=\"${role}\"]`];\n const candidates: Element[] = [];\n \n for (const sel of selectors) {\n try {\n candidates.push(...document.querySelectorAll(sel));\n } catch {}\n }\n \n // Filter by visibility\n const visible = candidates.filter(el => {\n const style = window.getComputedStyle(el);\n return style.display !== 'none' && \n style.visibility !== 'hidden' && \n (el as HTMLElement).offsetWidth > 0 &&\n (el as HTMLElement).offsetHeight > 0;\n });\n \n // Filter by name if provided\n let matches = visible;\n if (name) {\n const lowerName = name.toLowerCase();\n matches = visible.filter(el => {\n const ariaLabel = el.getAttribute('aria-label')?.toLowerCase();\n const text = el.textContent?.trim().toLowerCase();\n const title = el.getAttribute('title')?.toLowerCase();\n const placeholder = (el as HTMLInputElement).placeholder?.toLowerCase();\n const value = (el as HTMLInputElement).value?.toLowerCase();\n \n return ariaLabel?.includes(lowerName) || \n text?.includes(lowerName) || \n title?.includes(lowerName) ||\n placeholder?.includes(lowerName) ||\n value?.includes(lowerName);\n });\n }\n \n if (matches.length === 0) {\n sendResponse({ error: `No element found with role \"${role}\"${name ? ` and name \"${name}\"` : ''}` });\n break;\n }\n \n // Generate refs for matches\n const results = matches.map(el => {\n const ref = getOrAssignRef(el, role, name || '');\n window.__piRefs = window.__piRefs || {};\n window.__piRefs[ref] = el;\n elementMap[ref] = { element: new WeakRef(el), role, name: name || '' };\n return { ref, text: el.textContent?.trim().slice(0, 50) };\n });\n \n if (all) {\n sendResponse({ matches: results });\n } else {\n sendResponse({ ref: results[0].ref, text: results[0].text });\n }\n } catch (err) {\n sendResponse({ error: err instanceof Error ? err.message : String(err) });\n }\n break;\n }\n case \"LOCATE_TEXT\": {\n try {\n const { text, exact } = message;\n const elementMap = getElementMap();\n \n // Find elements containing the text\n const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT);\n const matches: Element[] = [];\n \n while (walker.nextNode()) {\n const nodeText = walker.currentNode.textContent || '';\n const hasMatch = exact \n ? nodeText.trim() === text \n : nodeText.toLowerCase().includes(text.toLowerCase());\n \n if (hasMatch) {\n const parent = walker.currentNode.parentElement;\n if (parent && !matches.includes(parent)) {\n // Check visibility\n const style = window.getComputedStyle(parent);\n if (style.display !== 'none' && style.visibility !== 'hidden') {\n matches.push(parent);\n }\n }\n }\n }\n \n if (matches.length === 0) {\n sendResponse({ error: `No element found with text \"${text}\"` });\n break;\n }\n \n // Pick the most specific (smallest) element\n const el = matches.sort((a, b) => \n (a.textContent?.length || 0) - (b.textContent?.length || 0)\n )[0];\n \n const role = getResolvedRole(el);\n const ref = getOrAssignRef(el, role, text);\n window.__piRefs = window.__piRefs || {};\n window.__piRefs[ref] = el;\n elementMap[ref] = { element: new WeakRef(el), role, name: text };\n \n sendResponse({ ref, text: el.textContent?.trim().slice(0, 50) });\n } catch (err) {\n sendResponse({ error: err instanceof Error ? err.message : String(err) });\n }\n break;\n }\n case \"LOCATE_LABEL\": {\n try {\n const { label } = message;\n const elementMap = getElementMap();\n \n // Find label element\n const labels = document.querySelectorAll('label');\n let input: Element | null = null;\n \n for (const lbl of labels) {\n const lblText = lbl.textContent?.trim().toLowerCase();\n if (lblText?.includes(label.toLowerCase())) {\n // Check for 'for' attribute\n const forId = lbl.getAttribute('for');\n if (forId) {\n input = document.getElementById(forId);\n }\n // Check for nested input\n if (!input) {\n input = lbl.querySelector('input, select, textarea');\n }\n if (input) break;\n }\n }\n \n // Also check aria-label and placeholder\n if (!input) {\n const lowerLabel = label.toLowerCase();\n input = document.querySelector(\n `input[aria-label*=\"${label}\" i], input[placeholder*=\"${label}\" i], ` +\n `textarea[aria-label*=\"${label}\" i], textarea[placeholder*=\"${label}\" i], ` +\n `select[aria-label*=\"${label}\" i]`\n );\n }\n \n if (!input) {\n sendResponse({ error: `No form field found with label \"${label}\"` });\n break;\n }\n \n const role = getResolvedRole(input);\n const ref = getOrAssignRef(input, role, label);\n window.__piRefs = window.__piRefs || {};\n window.__piRefs[ref] = input;\n elementMap[ref] = { element: new WeakRef(input), role, name: label };\n \n sendResponse({ ref, label });\n } catch (err) {\n sendResponse({ error: err instanceof Error ? err.message : String(err) });\n }\n break;\n }\n case \"GET_ELEMENT_TEXT\": {\n try {\n const { ref } = message;\n const elementMap = getElementMap();\n const elemRef = elementMap[ref];\n \n let element: Element | undefined;\n if (elemRef) {\n element = elemRef.element.deref();\n if (!element) delete elementMap[ref];\n }\n if (!element && window.__piRefs) {\n element = window.__piRefs[ref];\n }\n \n if (!element) {\n sendResponse({ error: `Element ${ref} not found` });\n break;\n }\n \n sendResponse({ text: element.textContent?.trim() || '' });\n } catch (err) {\n sendResponse({ error: err instanceof Error ? err.message : String(err) });\n }\n break;\n }\n case \"SCROLL_TO_ELEMENT\": {\n const result = scrollToElement(message.ref);\n sendResponse(result);\n break;\n }\n case \"UPLOAD_IMAGE\": {\n const result = uploadImage(message.base64, message.ref, message.coordinate, message.filename);\n sendResponse(result);\n break;\n }\n case \"WAIT_FOR_ELEMENT\": {\n const { selector, state = 'visible', timeout = 20000 } = message;\n const maxTimeout = Math.min(timeout, 60000);\n\n const isElementVisible = (el: Element | null): boolean => {\n if (!el) return false;\n const style = window.getComputedStyle(el);\n return style.display !== 'none' && \n style.visibility !== 'hidden' && \n style.opacity !== '0' &&\n (el as HTMLElement).offsetWidth > 0 &&\n (el as HTMLElement).offsetHeight > 0;\n };\n\n const checkElement = (): boolean => {\n const el = document.querySelector(selector);\n switch (state) {\n case 'attached': return !!el;\n case 'detached': return !el;\n case 'hidden': return !el || !isElementVisible(el);\n case 'visible':\n default: return isElementVisible(el);\n }\n };\n\n const startTime = Date.now();\n \n const waitForCondition = (): Promise<{ success: boolean; waited: number; error?: string }> => {\n return new Promise((resolve) => {\n if (checkElement()) {\n resolve({ success: true, waited: Date.now() - startTime });\n return;\n }\n\n const observer = new MutationObserver(() => {\n if (checkElement()) {\n observer.disconnect();\n clearTimeout(timeoutId);\n resolve({ success: true, waited: Date.now() - startTime });\n }\n });\n\n const timeoutId = setTimeout(() => {\n observer.disconnect();\n resolve({ \n success: false, \n waited: Date.now() - startTime,\n error: `Timeout waiting for \"${selector}\" to be ${state}` \n });\n }, maxTimeout);\n\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['style', 'class', 'hidden', 'disabled']\n });\n });\n };\n\n waitForCondition().then((waitResult) => {\n if (!waitResult.success) {\n sendResponse({ \n error: waitResult.error, \n waited: waitResult.waited,\n pageContent: \"\", \n viewport: { width: window.innerWidth, height: window.innerHeight } \n });\n return;\n }\n const treeResult = generateAccessibilityTree(\"interactive\", 15, undefined, true);\n sendResponse({ ...treeResult, waited: waitResult.waited });\n });\n return true;\n }\n case \"WAIT_FOR_URL\": {\n const { pattern, timeout = 20000 } = message;\n const maxTimeout = Math.min(timeout, 60000);\n\n const matchesPattern = (url: string): boolean => {\n if (pattern.includes('*')) {\n const regexPattern = pattern\n .replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\*\\*/g, '<<<GLOBSTAR>>>')\n .replace(/\\*/g, '[^/]*')\n .replace(/<<<GLOBSTAR>>>/g, '.*');\n return new RegExp(`^${regexPattern}$`).test(url);\n }\n return url.includes(pattern);\n };\n\n const startTime = Date.now();\n\n const waitForUrl = (): Promise<{ success: boolean; waited: number; error?: string }> => {\n return new Promise((resolve) => {\n if (matchesPattern(window.location.href)) {\n resolve({ success: true, waited: Date.now() - startTime });\n return;\n }\n\n let resolved = false;\n const checkUrl = () => {\n if (resolved) return;\n if (matchesPattern(window.location.href)) {\n resolved = true;\n clearInterval(intervalId);\n clearTimeout(timeoutId);\n window.removeEventListener('popstate', checkUrl);\n window.removeEventListener('hashchange', checkUrl);\n resolve({ success: true, waited: Date.now() - startTime });\n }\n };\n\n const intervalId = setInterval(checkUrl, 100);\n const timeoutId = setTimeout(() => {\n if (resolved) return;\n resolved = true;\n clearInterval(intervalId);\n window.removeEventListener('popstate', checkUrl);\n window.removeEventListener('hashchange', checkUrl);\n resolve({ \n success: false, \n waited: Date.now() - startTime,\n error: `Timeout waiting for URL to match \"${pattern}\". Current: ${window.location.href}` \n });\n }, maxTimeout);\n\n window.addEventListener('popstate', checkUrl);\n window.addEventListener('hashchange', checkUrl);\n });\n };\n\n waitForUrl().then((waitResult) => {\n if (!waitResult.success) {\n sendResponse({ \n error: waitResult.error, \n waited: waitResult.waited,\n pageContent: \"\", \n viewport: { width: window.innerWidth, height: window.innerHeight } \n });\n return;\n }\n const treeResult = generateAccessibilityTree(\"interactive\", 15, undefined, true);\n sendResponse({ ...treeResult, waited: waitResult.waited });\n });\n return true;\n }\n case \"WAIT_FOR_DOM_STABLE\": {\n const { stable = 100, timeout = 5000 } = message;\n const maxTimeout = Math.min(timeout, 30000);\n const startTime = Date.now();\n\n const waitForStability = (): Promise<{ success: boolean; waited: number; error?: string }> => {\n return new Promise((resolve) => {\n let lastMutationTime = Date.now();\n let resolved = false;\n\n const checkStability = () => {\n if (resolved) return;\n const timeSinceLastMutation = Date.now() - lastMutationTime;\n if (timeSinceLastMutation >= stable) {\n resolved = true;\n observer.disconnect();\n clearTimeout(timeoutId);\n clearInterval(checkInterval);\n resolve({ success: true, waited: Date.now() - startTime });\n }\n };\n\n const observer = new MutationObserver(() => {\n lastMutationTime = Date.now();\n });\n\n const timeoutId = setTimeout(() => {\n if (resolved) return;\n resolved = true;\n observer.disconnect();\n clearInterval(checkInterval);\n resolve({\n success: false,\n waited: Date.now() - startTime,\n error: `Timeout: DOM did not stabilize within ${maxTimeout}ms`\n });\n }, maxTimeout);\n\n const checkInterval = setInterval(checkStability, Math.max(10, Math.min(50, stable / 2)));\n\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: true,\n characterData: true,\n });\n\n checkStability();\n });\n };\n\n waitForStability().then((waitResult) => {\n if (!waitResult.success) {\n sendResponse({\n error: waitResult.error,\n waited: waitResult.waited,\n pageContent: \"\",\n viewport: { width: window.innerWidth, height: window.innerHeight }\n });\n return;\n }\n const treeResult = generateAccessibilityTree(\"interactive\", 15, undefined, true);\n sendResponse({ ...treeResult, waited: waitResult.waited });\n });\n return true;\n }\n case \"FORM_FILL\": {\n const { data } = message;\n if (!Array.isArray(data)) {\n sendResponse({ error: \"data must be an array of {ref, value} pairs\" });\n return true;\n }\n const elementMap = getElementMap();\n const results: { ref: string; success: boolean; error?: string }[] = [];\n for (const item of data) {\n const { ref, value } = item;\n if (!ref) {\n results.push({ ref: ref || \"unknown\", success: false, error: \"Missing ref\" });\n continue;\n }\n const elemRef = elementMap[ref];\n if (!elemRef) {\n results.push({ ref, success: false, error: \"Element not found (run page.read first)\" });\n continue;\n }\n const el = elemRef.element.deref() as HTMLElement | null;\n if (!el) {\n delete elementMap[ref];\n results.push({ ref, success: false, error: \"Element no longer exists\" });\n continue;\n }\n try {\n if (el instanceof HTMLInputElement) {\n const inputType = el.type.toLowerCase();\n if (inputType === \"checkbox\" || inputType === \"radio\") {\n const shouldCheck = value === true || value === \"true\" || value === \"1\" || value === \"checked\";\n el.checked = shouldCheck;\n el.dispatchEvent(new Event(\"change\", { bubbles: true }));\n } else {\n el.focus();\n el.value = String(value);\n el.dispatchEvent(new Event(\"input\", { bubbles: true }));\n el.dispatchEvent(new Event(\"change\", { bubbles: true }));\n }\n results.push({ ref, success: true });\n } else if (el instanceof HTMLTextAreaElement) {\n el.focus();\n el.value = String(value);\n el.dispatchEvent(new Event(\"input\", { bubbles: true }));\n el.dispatchEvent(new Event(\"change\", { bubbles: true }));\n results.push({ ref, success: true });\n } else if (el instanceof HTMLSelectElement) {\n el.value = String(value);\n el.dispatchEvent(new Event(\"change\", { bubbles: true }));\n results.push({ ref, success: true });\n } else if (el.isContentEditable) {\n el.focus();\n el.textContent = String(value);\n el.dispatchEvent(new Event(\"input\", { bubbles: true }));\n results.push({ ref, success: true });\n } else {\n results.push({ ref, success: false, error: \"Element is not fillable\" });\n }\n } catch (e) {\n results.push({ ref, success: false, error: e instanceof Error ? e.message : String(e) });\n }\n }\n const failed = results.filter(r => !r.success);\n sendResponse({\n success: failed.length === 0,\n filled: results.filter(r => r.success).length,\n failed: failed.length,\n results,\n });\n return true;\n }\n case \"GET_FILE_INPUT_SELECTOR\": {\n const { ref } = message;\n if (!ref) {\n sendResponse({ error: \"No ref provided\" });\n return true;\n }\n const elementMap = getElementMap();\n const elemRef = elementMap[ref];\n if (!elemRef) {\n sendResponse({ error: \"Element not found (run page.read first)\" });\n return true;\n }\n const el = elemRef.element.deref() as HTMLElement | null;\n if (!el) {\n delete elementMap[ref];\n sendResponse({ error: \"Element no longer exists\" });\n return true;\n }\n if (!(el instanceof HTMLInputElement) || el.type !== \"file\") {\n sendResponse({ error: \"Element is not a file input\" });\n return true;\n }\n const uniqueId = `__pi_file_${Date.now()}`;\n el.setAttribute(\"data-pi-file-id\", uniqueId);\n sendResponse({ selector: `[data-pi-file-id=\"${uniqueId}\"]` });\n return true;\n }\n case \"WAIT_FOR_NETWORK_IDLE\": {\n const { timeout = 10000 } = message;\n const maxTimeout = Math.min(timeout, 60000);\n\n const adPatterns = [\n \"doubleclick.net\", \"googlesyndication.com\", \"googletagmanager.com\",\n \"google-analytics.com\", \"facebook.net\", \"connect.facebook.net\",\n \"analytics\", \"ads\", \"tracking\", \"pixel\", \"hotjar.com\", \"clarity.ms\",\n \"mixpanel.com\", \"segment.com\", \"newrelic.com\", \"nr-data.net\",\n \"/tracker/\", \"/collector/\", \"/beacon/\", \"/telemetry/\", \"/log/\",\n \"/events/\", \"/track.\", \"/metrics/\"\n ];\n\n const nonCriticalTypes = [\"img\", \"image\", \"font\", \"icon\"];\n\n const isAdOrTracking = (url: string): boolean => {\n return adPatterns.some(pattern => url.includes(pattern));\n };\n\n const isNonCritical = (entry: PerformanceResourceTiming): boolean => {\n const type = entry.initiatorType || \"unknown\";\n if (nonCriticalTypes.includes(type)) return true;\n if (/\\.(jpg|jpeg|png|gif|webp|svg|ico|woff|woff2|ttf|eot)(\\?|$)/i.test(entry.name)) return true;\n return false;\n };\n\n const getPendingRequests = (): PerformanceResourceTiming[] => {\n const now = performance.now();\n const resources = performance.getEntriesByType(\"resource\") as PerformanceResourceTiming[];\n return resources.filter(entry => {\n if (entry.responseEnd !== 0) return false;\n if (entry.name.startsWith(\"data:\")) return false;\n if (entry.name.length > 500) return false;\n if (isAdOrTracking(entry.name)) return false;\n const loadingDuration = now - entry.startTime;\n if (loadingDuration > 10000) return false;\n if (isNonCritical(entry) && loadingDuration > 3000) return false;\n return true;\n });\n };\n\n const startTime = Date.now();\n\n const waitForIdle = (): Promise<{ success: boolean; waited: number; pendingCount?: number }> => {\n return new Promise((resolve) => {\n const check = () => {\n const pending = getPendingRequests();\n const elapsed = Date.now() - startTime;\n \n if (pending.length === 0) {\n resolve({ success: true, waited: elapsed });\n return;\n }\n \n if (elapsed >= maxTimeout) {\n resolve({ success: false, waited: elapsed, pendingCount: pending.length });\n return;\n }\n \n setTimeout(check, 100);\n };\n check();\n });\n };\n\n waitForIdle().then((waitResult) => {\n if (!waitResult.success) {\n sendResponse({ \n error: `Network not idle after ${waitResult.waited}ms (${waitResult.pendingCount} requests pending)`,\n waited: waitResult.waited,\n pageContent: \"\", \n viewport: { width: window.innerWidth, height: window.innerHeight } \n });\n return;\n }\n const treeResult = generateAccessibilityTree(\"interactive\", 15, undefined, true);\n sendResponse({ ...treeResult, waited: waitResult.waited });\n });\n return true;\n }\n case \"SEARCH_PAGE\": {\n const { term, caseSensitive, limit } = message;\n const matches = searchPageText(term, caseSensitive || false, limit || 10);\n sendResponse({ query: term, count: matches.length, matches });\n break;\n }\n case \"GET_ELEMENT_BOUNDS_FOR_ANNOTATION\": {\n const elementMap = getElementMap();\n const elements: Array<{ ref: string; tag: string; bounds: { x: number; y: number; width: number; height: number } }> = [];\n \n for (const [ref, entry] of Object.entries(elementMap)) {\n const el = entry.element.deref();\n if (!el) continue;\n \n const rect = el.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) continue;\n if (rect.bottom < 0 || rect.top > window.innerHeight) continue;\n if (rect.right < 0 || rect.left > window.innerWidth) continue;\n \n elements.push({\n ref,\n tag: el.tagName.toLowerCase(),\n bounds: {\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n },\n });\n }\n \n sendResponse({ elements });\n break;\n }\n default:\n return false;\n }\n return false;\n});\n\nfunction searchPageText(term: string, caseSensitive: boolean, limit: number) {\n const matches: Array<{\n ref: string;\n text: string;\n context: string;\n bounds: { x: number; y: number; width: number; height: number };\n elementRef: string | null;\n }> = [];\n \n const searchTerm = caseSensitive ? term : term.toLowerCase();\n const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT);\n const elementMap = getElementMap();\n let matchIndex = 0;\n \n while (walker.nextNode() && matches.length < limit) {\n const node = walker.currentNode;\n const textContent = node.textContent || \"\";\n const searchIn = caseSensitive ? textContent : textContent.toLowerCase();\n \n let pos = 0;\n while ((pos = searchIn.indexOf(searchTerm, pos)) !== -1 && matches.length < limit) {\n const parent = node.parentElement;\n if (!parent) { pos++; continue; }\n \n const range = document.createRange();\n range.setStart(node, pos);\n range.setEnd(node, Math.min(pos + term.length, textContent.length));\n const rect = range.getBoundingClientRect();\n \n if (rect.width === 0 || rect.height === 0) { pos++; continue; }\n \n const fullText = node.textContent || \"\";\n const contextStart = Math.max(0, pos - 30);\n const contextEnd = Math.min(fullText.length, pos + term.length + 30);\n const context = fullText.slice(contextStart, contextEnd).trim();\n \n let elementRef: string | null = null;\n for (const [ref, entry] of Object.entries(elementMap)) {\n const el = entry.element.deref();\n if (el && (el === parent || el.contains(parent))) {\n elementRef = ref;\n break;\n }\n }\n \n matches.push({\n ref: `m${++matchIndex}`,\n text: fullText.slice(pos, pos + term.length),\n context,\n bounds: {\n x: Math.round(rect.x),\n y: Math.round(rect.y),\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n },\n elementRef,\n });\n \n pos++;\n }\n }\n \n return matches;\n}\n"],"names":["VALID_ARIA_ROLES","isFocusable","element","tagName","tabindex","getExplicitRole","roleAttr","roles","r","role","getImplicitRole","tag","type","tagRoles","el","s","roleOrFn","getResolvedRole","explicitRole","globalRefCounter","getOrAssignRef","name","existing","ref","detectModalStates","modals","dialog","_a","_b","style","title","piHelpersImpl","ms","resolve","selector","options","state","timeout","isElementVisible","checkElement","reject","result","observer","timeoutId","text","checkText","root","walker","_c","_d","implicitRoles","candidates","implicitSelectors","sel","normalizedName","ariaLabel","textContent","placeholder","getElementMap","generateAccessibilityTree","filter","maxDepth","refId","forceFullSnapshot","compact","getRole","getName","labelledBy","names","id","joined","select","selected","alt","label","input","value","node","t","directText","getAriaProps","props","checkedAttr","isDisableable","expandedAttr","pressedAttr","selectedAttr","activeAttr","levelAttr","formatAriaProps","parts","isVisible","isInteractive","isLandmark","hasCursorPointer","shouldInclude","rect","traverse","depth","lines","elementMap","include","ariaProps","elemRefId","line","escapedName","propsStr","href","child","normalizeLineForDiff","countOccurrences","counts","norm","computeSimpleDiff","oldContent","newContent","oldLines","newLines","oldCounts","newCounts","added","removed","oldCount","oldCountsReset","newCount","diffLines","l","startElement","elemRef","content","modalStates","diff","isIncremental","lastSnapshot","err","yamlEscapeValue","str","generateYamlTree","buildKey","key","getElementProps","parentIncluded","isInteractiveEl","isLandmarkEl","hasName","indent","children","hasChildren","hasProps","propName","propValue","yaml","getElementCoordinates","x","y","setFormValue","textarea","strValue","found","option","getPageText","article","main","scrollToElement","uploadImage","base64","coordinate","filename","byteString","ab","ia","i","blob","file","targetElement","dt","dropEvent","message","sender","sendResponse","tripleClick","script","iframe","all","selectors","visible","matches","lowerName","_e","results","exact","nodeText","parent","a","b","labels","lbl","lblText","forId","lowerLabel","maxTimeout","startTime","waitResult","treeResult","pattern","matchesPattern","url","regexPattern","resolved","checkUrl","intervalId","stable","lastMutationTime","checkStability","checkInterval","data","item","inputType","shouldCheck","e","failed","uniqueId","adPatterns","nonCriticalTypes","isAdOrTracking","isNonCritical","entry","getPendingRequests","now","loadingDuration","check","pending","elapsed","term","caseSensitive","limit","searchPageText","elements","searchTerm","matchIndex","searchIn","pos","range","fullText","contextStart","contextEnd","context","elementRef"],"mappings":"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"}
1
+ {"version":3,"file":"accessibility-tree.js","sources":["../../src/content/accessibility-tree.ts"],"sourcesContent":["export {};\n\ndeclare global {\n interface Window {\n __piElementMap?: Record<string, { element: WeakRef<Element>; role: string; name: string }>;\n __piLastSnapshot?: { content: string; timestamp: number };\n __piHelpers?: typeof piHelpersImpl;\n piHelpers?: typeof piHelpersImpl;\n __piRefs?: Record<string, Element>;\n }\n}\n\ninterface ModalState {\n type: 'dialog' | 'alertdialog';\n description: string;\n clearedBy: string;\n}\n\nconst VALID_ARIA_ROLES = new Set([\n \"alert\", \"alertdialog\", \"application\", \"article\", \"banner\", \"blockquote\",\n \"button\", \"caption\", \"cell\", \"checkbox\", \"code\", \"columnheader\", \"combobox\",\n \"complementary\", \"contentinfo\", \"definition\", \"deletion\", \"dialog\", \"directory\",\n \"document\", \"emphasis\", \"feed\", \"figure\", \"form\", \"generic\", \"grid\", \"gridcell\",\n \"group\", \"heading\", \"img\", \"insertion\", \"link\", \"list\", \"listbox\", \"listitem\",\n \"log\", \"main\", \"mark\", \"marquee\", \"math\", \"menu\", \"menubar\", \"menuitem\",\n \"menuitemcheckbox\", \"menuitemradio\", \"meter\", \"navigation\", \"none\", \"note\",\n \"option\", \"paragraph\", \"presentation\", \"progressbar\", \"radio\", \"radiogroup\",\n \"region\", \"row\", \"rowgroup\", \"rowheader\", \"scrollbar\", \"search\", \"searchbox\",\n \"separator\", \"slider\", \"spinbutton\", \"status\", \"strong\", \"subscript\",\n \"superscript\", \"switch\", \"tab\", \"table\", \"tablist\", \"tabpanel\", \"term\",\n \"textbox\", \"time\", \"timer\", \"toolbar\", \"tooltip\", \"tree\", \"treegrid\", \"treeitem\"\n]);\n\nfunction isFocusable(element: Element): boolean {\n const tagName = element.tagName.toLowerCase();\n if ([\"button\", \"input\", \"select\", \"textarea\"].includes(tagName)) {\n return !(element as HTMLButtonElement).disabled;\n }\n if (tagName === \"a\" && element.hasAttribute(\"href\")) return true;\n if (element.hasAttribute(\"tabindex\")) {\n const tabindex = parseInt(element.getAttribute(\"tabindex\") || \"\", 10);\n return !isNaN(tabindex) && tabindex >= 0;\n }\n if (element.getAttribute(\"contenteditable\") === \"true\") return true;\n return false;\n}\n\nfunction getExplicitRole(element: Element): string | null {\n const roleAttr = element.getAttribute(\"role\");\n if (!roleAttr) return null;\n const roles = roleAttr.split(/\\s+/).filter(r => r);\n for (const role of roles) {\n if (VALID_ARIA_ROLES.has(role)) {\n return role;\n }\n }\n return null;\n}\n\nfunction getImplicitRole(element: Element): string {\n const tag = element.tagName.toLowerCase();\n const type = element.getAttribute(\"type\");\n\n const tagRoles: Record<string, string | ((el: Element) => string)> = {\n a: (el) => el.hasAttribute(\"href\") ? \"link\" : \"generic\",\n article: \"article\",\n aside: \"complementary\",\n button: \"button\",\n datalist: \"listbox\",\n dd: \"definition\",\n details: \"group\",\n dialog: \"dialog\",\n dt: \"term\",\n fieldset: \"group\",\n figure: \"figure\",\n footer: (el) => el.closest(\"article, aside, main, nav, section\") ? \"generic\" : \"contentinfo\",\n form: (el) => el.hasAttribute(\"aria-label\") || el.hasAttribute(\"aria-labelledby\") ? \"form\" : \"generic\",\n h1: \"heading\", h2: \"heading\", h3: \"heading\", h4: \"heading\", h5: \"heading\", h6: \"heading\",\n header: (el) => el.closest(\"article, aside, main, nav, section\") ? \"generic\" : \"banner\",\n hr: \"separator\",\n img: (el) => el.getAttribute(\"alt\") === \"\" ? \"presentation\" : \"img\",\n li: \"listitem\",\n main: \"main\",\n math: \"math\",\n menu: \"list\",\n meter: \"meter\",\n nav: \"navigation\",\n ol: \"list\",\n optgroup: \"group\",\n option: \"option\",\n output: \"status\",\n p: \"paragraph\",\n progress: \"progressbar\",\n search: \"search\",\n section: (el) => el.hasAttribute(\"aria-label\") || el.hasAttribute(\"aria-labelledby\") ? \"region\" : \"generic\",\n select: (el) => {\n const s = el as HTMLSelectElement;\n return s.hasAttribute(\"multiple\") || (s.size && s.size > 1) ? \"listbox\" : \"combobox\";\n },\n table: \"table\",\n tbody: \"rowgroup\",\n td: \"cell\",\n textarea: \"textbox\",\n tfoot: \"rowgroup\",\n th: \"columnheader\",\n thead: \"rowgroup\",\n time: \"time\",\n tr: \"row\",\n ul: \"list\",\n };\n\n if (tag === \"input\") {\n const inputRoles: Record<string, string> = {\n button: \"button\",\n checkbox: \"checkbox\",\n email: \"textbox\",\n file: \"button\",\n image: \"button\",\n number: \"spinbutton\",\n radio: \"radio\",\n range: \"slider\",\n reset: \"button\",\n search: \"searchbox\",\n submit: \"button\",\n tel: \"textbox\",\n text: \"textbox\",\n url: \"textbox\",\n };\n return inputRoles[type || \"\"] || \"textbox\";\n }\n\n const roleOrFn = tagRoles[tag];\n if (typeof roleOrFn === \"function\") {\n return roleOrFn(element);\n }\n return roleOrFn || \"generic\";\n}\n\nfunction getResolvedRole(element: Element): string {\n const explicitRole = getExplicitRole(element);\n \n if (!explicitRole) {\n return getImplicitRole(element);\n }\n \n if ((explicitRole === \"none\" || explicitRole === \"presentation\") && isFocusable(element)) {\n return getImplicitRole(element);\n }\n \n return explicitRole;\n}\n\nif (!window.__piElementMap) window.__piElementMap = {};\n\nlet globalRefCounter = 0;\n\nfunction getOrAssignRef(element: Element, role: string, name: string): string {\n const existing = (element as any)._piRef as { role: string; name: string; ref: string } | undefined;\n if (existing && existing.role === role && existing.name === name) {\n return existing.ref;\n }\n \n const ref = `e${++globalRefCounter}`;\n (element as any)._piRef = { role, name, ref };\n return ref;\n}\n\nfunction detectModalStates(): ModalState[] {\n const modals: ModalState[] = [];\n \n const dialogs = document.querySelectorAll('[role=\"dialog\"], [role=\"alertdialog\"], dialog[open]');\n dialogs.forEach(dialog => {\n const style = window.getComputedStyle(dialog);\n const isVisible = style.display !== 'none' && \n style.visibility !== 'hidden' && \n style.opacity !== '0' &&\n (dialog as HTMLElement).offsetWidth > 0 &&\n (dialog as HTMLElement).offsetHeight > 0;\n if (!isVisible) return;\n \n const role = dialog.getAttribute('role') || 'dialog';\n let title = dialog.getAttribute('aria-label') || \n dialog.querySelector('[role=\"heading\"], h1, h2, h3')?.textContent?.trim() ||\n 'Dialog';\n if (title.length > 100) title = title.substring(0, 100) + '...';\n modals.push({\n type: role as 'dialog' | 'alertdialog',\n description: `${role}: ${title}`,\n clearedBy: 'computer(action=key, text=Escape)',\n });\n });\n \n return modals;\n}\n\nconst piHelpersImpl = {\n wait(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n },\n\n async waitForSelector(\n selector: string,\n options: { state?: 'visible' | 'hidden' | 'attached' | 'detached'; timeout?: number } = {}\n ): Promise<Element | null> {\n const { state = 'visible', timeout = 20000 } = options;\n\n const isElementVisible = (el: Element | null): boolean => {\n if (!el) return false;\n const style = window.getComputedStyle(el);\n return style.display !== 'none' && \n style.visibility !== 'hidden' && \n style.opacity !== '0' &&\n (el as HTMLElement).offsetWidth > 0 &&\n (el as HTMLElement).offsetHeight > 0;\n };\n\n const checkElement = (): Element | null => {\n const el = document.querySelector(selector);\n switch (state) {\n case 'attached':\n return el;\n case 'detached':\n return el ? null : document.body;\n case 'hidden':\n if (!el) return document.body;\n return isElementVisible(el) ? null : el;\n case 'visible':\n default:\n return isElementVisible(el) ? el : null;\n }\n };\n\n return new Promise((resolve, reject) => {\n const result = checkElement();\n if (result) {\n resolve(state === 'detached' || state === 'hidden' ? null : result);\n return;\n }\n\n const observer = new MutationObserver(() => {\n const result = checkElement();\n if (result) {\n observer.disconnect();\n clearTimeout(timeoutId);\n resolve(state === 'detached' || state === 'hidden' ? null : result);\n }\n });\n\n const timeoutId = setTimeout(() => {\n observer.disconnect();\n reject(new Error(`Timeout waiting for \"${selector}\" to be ${state}`));\n }, timeout);\n\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['style', 'class', 'hidden']\n });\n });\n },\n\n async waitForText(\n text: string,\n options: { selector?: string; timeout?: number } = {}\n ): Promise<Element | null> {\n const { selector, timeout = 20000 } = options;\n\n const checkText = (): Element | null => {\n const root = selector ? document.querySelector(selector) : document.body;\n if (!root) return null;\n \n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);\n while (walker.nextNode()) {\n if (walker.currentNode.textContent?.includes(text)) {\n return walker.currentNode.parentElement;\n }\n }\n return null;\n };\n\n return new Promise((resolve, reject) => {\n const result = checkText();\n if (result) {\n resolve(result);\n return;\n }\n\n const observer = new MutationObserver(() => {\n const result = checkText();\n if (result) {\n observer.disconnect();\n clearTimeout(timeoutId);\n resolve(result);\n }\n });\n\n const timeoutId = setTimeout(() => {\n observer.disconnect();\n reject(new Error(`Timeout waiting for text \"${text}\"`));\n }, timeout);\n\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n characterData: true\n });\n });\n },\n\n async waitForHidden(selector: string, timeout = 20000): Promise<void> {\n await piHelpersImpl.waitForSelector(selector, { state: 'hidden', timeout });\n },\n\n getByRole(role: string, options: { name?: string } = {}): Element | null {\n const { name } = options;\n \n const implicitRoles: Record<string, string[]> = {\n button: ['button', 'input[type=\"button\"]', 'input[type=\"submit\"]', 'input[type=\"reset\"]'],\n link: ['a[href]'],\n textbox: ['input:not([type])', 'input[type=\"text\"]', 'input[type=\"email\"]', 'input[type=\"password\"]', 'input[type=\"search\"]', 'input[type=\"tel\"]', 'input[type=\"url\"]', 'textarea'],\n checkbox: ['input[type=\"checkbox\"]'],\n radio: ['input[type=\"radio\"]'],\n combobox: ['select'],\n heading: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'],\n list: ['ul', 'ol'],\n listitem: ['li'],\n navigation: ['nav'],\n main: ['main'],\n banner: ['header'],\n contentinfo: ['footer'],\n form: ['form'],\n img: ['img'],\n table: ['table'],\n };\n\n const candidates: Element[] = [];\n candidates.push(...document.querySelectorAll(`[role=\"${role}\"]`));\n \n const implicitSelectors = implicitRoles[role];\n if (implicitSelectors) {\n for (const sel of implicitSelectors) {\n candidates.push(...document.querySelectorAll(`${sel}:not([role])`));\n }\n }\n\n if (!name) return candidates[0] || null;\n\n const normalizedName = name.toLowerCase().trim();\n for (const el of candidates) {\n const ariaLabel = el.getAttribute('aria-label')?.toLowerCase().trim();\n const textContent = el.textContent?.toLowerCase().trim();\n const title = el.getAttribute('title')?.toLowerCase().trim();\n const placeholder = el.getAttribute('placeholder')?.toLowerCase().trim();\n\n if (ariaLabel === normalizedName || textContent === normalizedName || \n title === normalizedName || placeholder === normalizedName) {\n return el;\n }\n if (ariaLabel?.includes(normalizedName) || textContent?.includes(normalizedName)) {\n return el;\n }\n }\n\n return null;\n }\n};\n\nif (!window.__piHelpers) {\n window.__piHelpers = piHelpersImpl;\n window.piHelpers = piHelpersImpl;\n}\n\nfunction getElementMap() {\n return window.__piElementMap!;\n}\n\nfunction generateAccessibilityTree(\n filter: \"all\" | \"interactive\" = \"interactive\",\n maxDepth = 15,\n refId?: string,\n forceFullSnapshot = false,\n compact = false\n): { \n pageContent: string;\n diff?: string;\n viewport: { width: number; height: number }; \n error?: string;\n modalStates?: ModalState[];\n modalLimitations?: string;\n isIncremental?: boolean;\n} {\n try {\n window.__piRefs = {};\n\n function getRole(element: Element): string {\n return getResolvedRole(element);\n }\n\n function getName(element: Element): string {\n const tag = element.tagName.toLowerCase();\n\n const labelledBy = element.getAttribute('aria-labelledby');\n if (labelledBy) {\n const names = labelledBy.split(/\\s+/).map(id => {\n const el = document.getElementById(id);\n return el?.textContent?.trim() || '';\n }).filter(Boolean);\n if (names.length) {\n const joined = names.join(' ');\n return joined.length > 100 ? joined.substring(0, 100) + '...' : joined;\n }\n }\n\n if (tag === \"select\") {\n const select = element as HTMLSelectElement;\n const selected = select.querySelector(\"option[selected]\") || \n (select.selectedIndex >= 0 ? select.options[select.selectedIndex] : null);\n if (selected?.textContent?.trim()) return selected.textContent.trim();\n }\n\n const ariaLabel = element.getAttribute(\"aria-label\");\n if (ariaLabel?.trim()) return ariaLabel.trim();\n\n const placeholder = element.getAttribute(\"placeholder\");\n if (placeholder?.trim()) return placeholder.trim();\n\n const title = element.getAttribute(\"title\");\n if (title?.trim()) return title.trim();\n\n const alt = element.getAttribute(\"alt\");\n if (alt?.trim()) return alt.trim();\n\n if (element.id) {\n const label = document.querySelector(`label[for=\"${element.id}\"]`);\n if (label?.textContent?.trim()) return label.textContent.trim();\n }\n\n if (tag === \"input\") {\n const input = element as HTMLInputElement;\n const type = element.getAttribute(\"type\") || \"\";\n const value = element.getAttribute(\"value\");\n if (type === \"submit\" && value?.trim()) return value.trim();\n if (input.value && input.value.length < 50 && input.value.trim()) return input.value.trim();\n }\n\n if ([\"button\", \"a\", \"summary\"].includes(tag)) {\n let textContent = \"\";\n for (const node of element.childNodes) {\n if (node.nodeType === Node.TEXT_NODE) {\n textContent += node.textContent;\n }\n }\n if (textContent.trim()) return textContent.trim();\n }\n\n if (/^h[1-6]$/.test(tag)) {\n const text = element.textContent;\n if (text?.trim()) {\n const t = text.trim();\n return t.length > 100 ? t.substring(0, 100) + \"...\" : t;\n }\n }\n\n if (tag === \"img\") return \"\";\n\n let directText = \"\";\n for (const node of element.childNodes) {\n if (node.nodeType === Node.TEXT_NODE) {\n directText += node.textContent;\n }\n }\n if (directText?.trim() && directText.trim().length >= 3) {\n const text = directText.trim();\n return text.length > 100 ? text.substring(0, 100) + \"...\" : text;\n }\n\n return \"\";\n }\n\n interface AriaProps {\n checked?: boolean | 'mixed';\n disabled?: boolean;\n expanded?: boolean;\n level?: number;\n pressed?: boolean | 'mixed';\n selected?: boolean;\n active?: boolean;\n }\n\n function getAriaProps(element: Element): AriaProps {\n const props: AriaProps = {};\n \n const checkedAttr = element.getAttribute('aria-checked');\n if (checkedAttr === 'true') props.checked = true;\n else if (checkedAttr === 'false') props.checked = false;\n else if (checkedAttr === 'mixed') props.checked = 'mixed';\n else if (element instanceof HTMLInputElement && (element.type === 'checkbox' || element.type === 'radio')) {\n if (element.type === 'checkbox' && element.indeterminate) {\n props.checked = 'mixed';\n } else {\n props.checked = element.checked;\n }\n }\n \n const isDisableable = element instanceof HTMLButtonElement || \n element instanceof HTMLInputElement || \n element instanceof HTMLSelectElement || \n element instanceof HTMLTextAreaElement;\n if (element.getAttribute('aria-disabled') === 'true' || \n (isDisableable && (element as HTMLButtonElement).disabled) ||\n element.closest('fieldset:disabled')) {\n props.disabled = true;\n }\n \n const expandedAttr = element.getAttribute('aria-expanded');\n if (expandedAttr === 'true') props.expanded = true;\n else if (expandedAttr === 'false') props.expanded = false;\n \n const pressedAttr = element.getAttribute('aria-pressed');\n if (pressedAttr === 'true') props.pressed = true;\n else if (pressedAttr === 'false') props.pressed = false;\n else if (pressedAttr === 'mixed') props.pressed = 'mixed';\n \n const selectedAttr = element.getAttribute('aria-selected');\n if (selectedAttr === 'true') props.selected = true;\n else if (selectedAttr === 'false') props.selected = false;\n \n const activeAttr = element.getAttribute('aria-current');\n if (activeAttr && activeAttr !== 'false') {\n props.active = true;\n }\n \n const tag = element.tagName.toLowerCase();\n if (/^h[1-6]$/.test(tag)) {\n props.level = parseInt(tag[1], 10);\n } else {\n const levelAttr = element.getAttribute('aria-level');\n if (levelAttr) props.level = parseInt(levelAttr, 10);\n }\n \n return props;\n }\n\n function formatAriaProps(props: AriaProps): string {\n const parts: string[] = [];\n \n if (props.checked !== undefined) {\n parts.push(props.checked === 'mixed' ? '[checked=mixed]' : props.checked ? '[checked]' : '[unchecked]');\n }\n if (props.disabled) parts.push('[disabled]');\n if (props.expanded !== undefined) {\n parts.push(props.expanded ? '[expanded]' : '[collapsed]');\n }\n if (props.pressed !== undefined) {\n parts.push(props.pressed === 'mixed' ? '[pressed=mixed]' : props.pressed ? '[pressed]' : '[not-pressed]');\n }\n if (props.selected !== undefined) {\n parts.push(props.selected ? '[selected]' : '[not-selected]');\n }\n if (props.active) parts.push('[active]');\n if (props.level !== undefined) {\n parts.push(`[level=${props.level}]`);\n }\n \n return parts.join(' ');\n }\n\n function isVisible(element: Element): boolean {\n const style = window.getComputedStyle(element);\n return (\n style.display !== \"none\" &&\n style.visibility !== \"hidden\" &&\n style.opacity !== \"0\" &&\n (element as HTMLElement).offsetWidth > 0 &&\n (element as HTMLElement).offsetHeight > 0\n );\n }\n\n function isInteractive(element: Element): boolean {\n const tag = element.tagName.toLowerCase();\n return (\n [\"a\", \"button\", \"input\", \"select\", \"textarea\", \"details\", \"summary\"].includes(tag) ||\n element.hasAttribute(\"onclick\") ||\n element.hasAttribute(\"tabindex\") ||\n element.getAttribute(\"role\") === \"button\" ||\n element.getAttribute(\"role\") === \"link\" ||\n element.getAttribute(\"contenteditable\") === \"true\"\n );\n }\n\n function isLandmark(element: Element): boolean {\n const tag = element.tagName.toLowerCase();\n return (\n [\"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"nav\", \"main\", \"header\", \"footer\", \"section\", \"article\", \"aside\"].includes(tag) ||\n element.hasAttribute(\"role\")\n );\n }\n\n function hasCursorPointer(element: Element): boolean {\n const style = window.getComputedStyle(element);\n return style.cursor === \"pointer\";\n }\n\n function shouldInclude(element: Element, options: { filter: string; refId: string | null; compact: boolean }): boolean {\n const tag = element.tagName.toLowerCase();\n if ([\"script\", \"style\", \"meta\", \"link\", \"title\", \"noscript\"].includes(tag)) return false;\n if (options.filter !== \"all\" && element.getAttribute(\"aria-hidden\") === \"true\") return false;\n if (options.filter !== \"all\" && !isVisible(element)) return false;\n\n if (options.filter !== \"all\" && !options.refId) {\n const rect = element.getBoundingClientRect();\n if (!(rect.top < window.innerHeight && rect.bottom > 0 && rect.left < window.innerWidth && rect.right > 0)) {\n return false;\n }\n }\n\n if (options.filter === \"interactive\") return isInteractive(element);\n if (isInteractive(element)) return true;\n if (isLandmark(element)) return true;\n if (getName(element).length > 0) return true;\n\n const role = getRole(element);\n \n // In compact mode, skip empty structural elements\n if (options.compact) {\n const emptyStructuralRoles = new Set([\"generic\", \"group\", \"region\", \"article\", \"section\", \"complementary\"]);\n if (emptyStructuralRoles.has(role) && getName(element).length === 0) {\n return false;\n }\n }\n \n return role !== \"generic\" && role !== \"img\";\n }\n\n function traverse(element: Element, depth: number): string[] {\n const lines: string[] = [];\n const options = { filter, refId: refId || null, compact };\n const elementMap = getElementMap();\n\n const include = shouldInclude(element, options) || (refId && depth === 0);\n\n if (include) {\n const role = getRole(element);\n const name = getName(element);\n const ariaProps = getAriaProps(element);\n\n const elemRefId = getOrAssignRef(element, role, name);\n window.__piRefs![elemRefId] = element;\n elementMap[elemRefId] = {\n element: new WeakRef(element),\n role,\n name,\n };\n\n const indent = \" \".repeat(depth);\n let line = `${indent}${role}`;\n if (name) {\n const escapedName = name.replace(/\\s+/g, \" \").replace(/\"/g, '\\\\\"');\n line += ` \"${escapedName}\"`;\n }\n line += ` [${elemRefId}]`;\n\n const propsStr = formatAriaProps(ariaProps);\n if (propsStr) line += ` ${propsStr}`;\n\n if (hasCursorPointer(element)) {\n line += \" [cursor=pointer]\";\n }\n\n const href = element.getAttribute(\"href\");\n if (href) line += ` href=\"${href}\"`;\n\n const type = element.getAttribute(\"type\");\n if (type) line += ` type=\"${type}\"`;\n\n const placeholder = element.getAttribute(\"placeholder\");\n if (placeholder) line += ` placeholder=\"${placeholder}\"`;\n\n lines.push(line);\n }\n\n if (depth < maxDepth) {\n for (const child of element.children) {\n lines.push(...traverse(child, include ? depth + 1 : depth));\n }\n }\n\n return lines;\n }\n\n function normalizeLineForDiff(line: string): string {\n return line.replace(/\\[e\\d+\\]/g, '[REF]');\n }\n\n function countOccurrences(lines: string[]): Map<string, number> {\n const counts = new Map<string, number>();\n for (const line of lines) {\n if (!line.trim()) continue;\n const norm = normalizeLineForDiff(line);\n counts.set(norm, (counts.get(norm) || 0) + 1);\n }\n return counts;\n }\n\n function computeSimpleDiff(oldContent: string, newContent: string): { diff: string; hasChanges: boolean } {\n const oldLines = oldContent.split('\\n');\n const newLines = newContent.split('\\n');\n \n const oldCounts = countOccurrences(oldLines);\n const newCounts = countOccurrences(newLines);\n \n const added: string[] = [];\n const removed: string[] = [];\n \n for (const line of newLines) {\n if (!line.trim()) continue;\n const norm = normalizeLineForDiff(line);\n const oldCount = oldCounts.get(norm) || 0;\n const newCount = newCounts.get(norm) || 0;\n if (newCount > oldCount) {\n added.push(line);\n oldCounts.set(norm, oldCount + 1);\n }\n }\n \n const oldCountsReset = countOccurrences(oldLines);\n for (const line of oldLines) {\n if (!line.trim()) continue;\n const norm = normalizeLineForDiff(line);\n const oldCount = oldCountsReset.get(norm) || 0;\n const newCount = newCounts.get(norm) || 0;\n if (oldCount > newCount) {\n removed.push(line);\n oldCountsReset.set(norm, oldCount - 1);\n }\n }\n \n if (added.length === 0 && removed.length === 0) {\n return { diff: '[NO CHANGES]', hasChanges: false };\n }\n \n const diffLines: string[] = [];\n if (removed.length > 0) {\n diffLines.push(...removed.map(l => `- ${l}`));\n }\n if (added.length > 0) {\n diffLines.push(...added.map(l => `+ ${l}`));\n }\n \n return { diff: diffLines.join('\\n'), hasChanges: true };\n }\n\n const elementMap = getElementMap();\n let startElement: Element | null = null;\n\n if (refId) {\n const elemRef = elementMap[refId];\n if (!elemRef) {\n return {\n error: `Element with ref_id '${refId}' not found. Use read_page without ref_id to get current elements.`,\n pageContent: \"\",\n viewport: { width: window.innerWidth, height: window.innerHeight },\n };\n }\n const element = elemRef.element.deref();\n if (!element) {\n delete elementMap[refId];\n return {\n error: `Element with ref_id '${refId}' no longer exists. Use read_page without ref_id to get current elements.`,\n pageContent: \"\",\n viewport: { width: window.innerWidth, height: window.innerHeight },\n };\n }\n startElement = element;\n } else {\n startElement = document.body;\n }\n\n const lines = startElement ? traverse(startElement, 0) : [];\n\n for (const id of Object.keys(elementMap)) {\n if (!elementMap[id].element.deref()) {\n delete elementMap[id];\n }\n }\n\n const content = lines.join(\"\\n\");\n\n if (content.length > 50000) {\n return {\n error: `Output exceeds 50000 character limit (${content.length} characters). Try using filter=\"interactive\" or specify a ref_id.`,\n pageContent: \"\",\n viewport: { width: window.innerWidth, height: window.innerHeight },\n };\n }\n\n const modalStates = detectModalStates();\n\n let diff: string | undefined;\n let isIncremental = false;\n const lastSnapshot = window.__piLastSnapshot;\n\n if (!forceFullSnapshot && !refId && lastSnapshot && \n Date.now() - lastSnapshot.timestamp < 5000) {\n const diffResult = computeSimpleDiff(lastSnapshot.content, content);\n diff = diffResult.diff;\n isIncremental = true;\n }\n\n window.__piLastSnapshot = { content, timestamp: Date.now() };\n\n return {\n pageContent: content + `\\n\\n[Viewport: ${window.innerWidth}x${window.innerHeight}]`,\n diff: isIncremental ? diff : undefined,\n viewport: { width: window.innerWidth, height: window.innerHeight },\n modalStates: modalStates.length > 0 ? modalStates : undefined,\n modalLimitations: 'Only custom modals ([role=dialog]) detected. Native alert/confirm/prompt dialogs and system file choosers cannot be detected from content scripts.',\n isIncremental,\n };\n } catch (err) {\n return {\n error: `Error generating accessibility tree: ${err instanceof Error ? err.message : \"Unknown error\"}`,\n pageContent: \"\",\n viewport: { width: window.innerWidth, height: window.innerHeight },\n };\n }\n}\n\nfunction yamlEscapeValue(str: string): string {\n if (!str.length) return '\"\"';\n if (/[\\n\\r]/.test(str) || /^[\\s]/.test(str) || /[\\s]$/.test(str) || /[:\"{}[\\]]/.test(str)) {\n return '\"' + str.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"').replace(/\\n/g, '\\\\n').replace(/\\r/g, '\\\\r') + '\"';\n }\n return str;\n}\n\nfunction generateYamlTree(\n filter: \"all\" | \"interactive\" = \"interactive\",\n maxDepth = 15\n): { yaml: string; viewport: { width: number; height: number }; error?: string } {\n try {\n window.__piRefs = {};\n \n const lines: string[] = [];\n\n function getRole(element: Element): string {\n return getResolvedRole(element);\n }\n\n function getName(element: Element): string {\n const tag = element.tagName.toLowerCase();\n\n const labelledBy = element.getAttribute('aria-labelledby');\n if (labelledBy) {\n const names = labelledBy.split(/\\s+/).map(id => {\n const el = document.getElementById(id);\n return el?.textContent?.trim() || '';\n }).filter(Boolean);\n if (names.length) {\n const joined = names.join(' ');\n return joined.length > 100 ? joined.substring(0, 100) + '...' : joined;\n }\n }\n\n if (tag === \"select\") {\n const select = element as HTMLSelectElement;\n const selected = select.querySelector(\"option[selected]\") || \n (select.selectedIndex >= 0 ? select.options[select.selectedIndex] : null);\n if (selected?.textContent?.trim()) return selected.textContent.trim();\n }\n\n const ariaLabel = element.getAttribute(\"aria-label\");\n if (ariaLabel?.trim()) return ariaLabel.trim();\n\n const placeholder = element.getAttribute(\"placeholder\");\n if (placeholder?.trim()) return placeholder.trim();\n\n const title = element.getAttribute(\"title\");\n if (title?.trim()) return title.trim();\n\n const alt = element.getAttribute(\"alt\");\n if (alt?.trim()) return alt.trim();\n\n if (element.id) {\n const label = document.querySelector(`label[for=\"${element.id}\"]`);\n if (label?.textContent?.trim()) return label.textContent.trim();\n }\n\n if (tag === \"input\") {\n const input = element as HTMLInputElement;\n const type = element.getAttribute(\"type\") || \"\";\n const value = element.getAttribute(\"value\");\n if (type === \"submit\" && value?.trim()) return value.trim();\n if (input.value && input.value.length < 50 && input.value.trim()) return input.value.trim();\n }\n\n if ([\"button\", \"a\", \"summary\"].includes(tag)) {\n let textContent = \"\";\n for (const node of element.childNodes) {\n if (node.nodeType === Node.TEXT_NODE) {\n textContent += node.textContent;\n }\n }\n if (textContent.trim()) return textContent.trim();\n }\n\n if (/^h[1-6]$/.test(tag)) {\n const text = element.textContent;\n if (text?.trim()) {\n const t = text.trim();\n return t.length > 100 ? t.substring(0, 100) + \"...\" : t;\n }\n }\n\n if (tag === \"img\") return \"\";\n\n let directText = \"\";\n for (const node of element.childNodes) {\n if (node.nodeType === Node.TEXT_NODE) {\n directText += node.textContent;\n }\n }\n if (directText?.trim() && directText.trim().length >= 3) {\n const text = directText.trim();\n return text.length > 100 ? text.substring(0, 100) + \"...\" : text;\n }\n\n return \"\";\n }\n\n interface AriaProps {\n checked?: boolean | 'mixed';\n disabled?: boolean;\n expanded?: boolean;\n level?: number;\n pressed?: boolean | 'mixed';\n selected?: boolean;\n active?: boolean;\n }\n\n function getAriaProps(element: Element): AriaProps {\n const props: AriaProps = {};\n \n const checkedAttr = element.getAttribute('aria-checked');\n if (checkedAttr === 'true') props.checked = true;\n else if (checkedAttr === 'false') props.checked = false;\n else if (checkedAttr === 'mixed') props.checked = 'mixed';\n else if (element instanceof HTMLInputElement && (element.type === 'checkbox' || element.type === 'radio')) {\n if (element.type === 'checkbox' && element.indeterminate) {\n props.checked = 'mixed';\n } else {\n props.checked = element.checked;\n }\n }\n \n const isDisableable = element instanceof HTMLButtonElement || \n element instanceof HTMLInputElement || \n element instanceof HTMLSelectElement || \n element instanceof HTMLTextAreaElement;\n if (element.getAttribute('aria-disabled') === 'true' || \n (isDisableable && (element as HTMLButtonElement).disabled) ||\n element.closest('fieldset:disabled')) {\n props.disabled = true;\n }\n \n const expandedAttr = element.getAttribute('aria-expanded');\n if (expandedAttr === 'true') props.expanded = true;\n else if (expandedAttr === 'false') props.expanded = false;\n \n const pressedAttr = element.getAttribute('aria-pressed');\n if (pressedAttr === 'true') props.pressed = true;\n else if (pressedAttr === 'false') props.pressed = false;\n else if (pressedAttr === 'mixed') props.pressed = 'mixed';\n \n const selectedAttr = element.getAttribute('aria-selected');\n if (selectedAttr === 'true') props.selected = true;\n else if (selectedAttr === 'false') props.selected = false;\n \n const activeAttr = element.getAttribute('aria-current');\n if (activeAttr && activeAttr !== 'false') {\n props.active = true;\n }\n \n const tag = element.tagName.toLowerCase();\n if (/^h[1-6]$/.test(tag)) {\n props.level = parseInt(tag[1], 10);\n } else {\n const levelAttr = element.getAttribute('aria-level');\n if (levelAttr) props.level = parseInt(levelAttr, 10);\n }\n \n return props;\n }\n\n function formatAriaProps(props: AriaProps): string {\n const parts: string[] = [];\n \n if (props.checked !== undefined) {\n parts.push(props.checked === 'mixed' ? '[checked=mixed]' : props.checked ? '[checked]' : '[unchecked]');\n }\n if (props.disabled) parts.push('[disabled]');\n if (props.expanded !== undefined) {\n parts.push(props.expanded ? '[expanded]' : '[collapsed]');\n }\n if (props.pressed !== undefined) {\n parts.push(props.pressed === 'mixed' ? '[pressed=mixed]' : props.pressed ? '[pressed]' : '[not-pressed]');\n }\n if (props.selected !== undefined) {\n parts.push(props.selected ? '[selected]' : '[not-selected]');\n }\n if (props.active) parts.push('[active]');\n if (props.level !== undefined) {\n parts.push(`[level=${props.level}]`);\n }\n \n return parts.join(' ');\n }\n\n function isVisible(element: Element): boolean {\n const style = window.getComputedStyle(element);\n return (\n style.display !== \"none\" &&\n style.visibility !== \"hidden\" &&\n style.opacity !== \"0\" &&\n (element as HTMLElement).offsetWidth > 0 &&\n (element as HTMLElement).offsetHeight > 0\n );\n }\n\n function isInteractive(element: Element): boolean {\n const tag = element.tagName.toLowerCase();\n return (\n [\"a\", \"button\", \"input\", \"select\", \"textarea\", \"details\", \"summary\"].includes(tag) ||\n element.hasAttribute(\"onclick\") ||\n element.hasAttribute(\"tabindex\") ||\n element.getAttribute(\"role\") === \"button\" ||\n element.getAttribute(\"role\") === \"link\" ||\n element.getAttribute(\"contenteditable\") === \"true\"\n );\n }\n\n function isLandmark(element: Element): boolean {\n const tag = element.tagName.toLowerCase();\n return (\n [\"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"nav\", \"main\", \"header\", \"footer\", \"section\", \"article\", \"aside\"].includes(tag) ||\n element.hasAttribute(\"role\")\n );\n }\n\n function hasCursorPointer(element: Element): boolean {\n const style = window.getComputedStyle(element);\n return style.cursor === \"pointer\";\n }\n\n function buildKey(role: string, name: string, element: Element, ariaProps: AriaProps): string {\n let key = role;\n if (name) {\n key += ' ' + yamlEscapeValue(name);\n }\n \n const ref = getOrAssignRef(element, role, name);\n window.__piRefs![ref] = element;\n key += ` [ref=${ref}]`;\n \n const propsStr = formatAriaProps(ariaProps);\n if (propsStr) key += ` ${propsStr}`;\n \n if (hasCursorPointer(element)) {\n key += ' [cursor=pointer]';\n }\n \n return key;\n }\n\n function getElementProps(element: Element): Record<string, string> {\n const props: Record<string, string> = {};\n const href = element.getAttribute(\"href\");\n if (href) props.url = href;\n const placeholder = element.getAttribute(\"placeholder\");\n if (placeholder) props.placeholder = placeholder;\n return props;\n }\n\n function traverse(element: Element, depth: number, parentIncluded: boolean): void {\n if (depth > maxDepth) return;\n \n const tag = element.tagName.toLowerCase();\n if ([\"script\", \"style\", \"meta\", \"link\", \"title\", \"noscript\"].includes(tag)) return;\n if (filter !== \"all\" && element.getAttribute(\"aria-hidden\") === \"true\") return;\n if (filter !== \"all\" && !isVisible(element)) return;\n \n if (filter !== \"all\") {\n const rect = element.getBoundingClientRect();\n if (!(rect.top < window.innerHeight && rect.bottom > 0 && rect.left < window.innerWidth && rect.right > 0)) {\n return;\n }\n }\n \n const role = getRole(element);\n const name = getName(element);\n const ariaProps = getAriaProps(element);\n \n const isInteractiveEl = isInteractive(element);\n const isLandmarkEl = isLandmark(element);\n const hasName = name.length > 0;\n \n let include: boolean;\n if (filter === \"interactive\") {\n include = isInteractiveEl;\n } else if (filter === \"all\") {\n include = true;\n } else {\n include = isInteractiveEl || isLandmarkEl || hasName || (role !== \"generic\" && role !== \"img\");\n }\n \n if (include) {\n const indent = \" \".repeat(depth);\n const key = buildKey(role, name, element, ariaProps);\n const props = getElementProps(element);\n \n const children: Element[] = [];\n for (const child of element.children) {\n children.push(child);\n }\n \n const hasChildren = children.length > 0;\n const hasProps = Object.keys(props).length > 0;\n \n if (!hasChildren && !hasProps) {\n lines.push(`${indent}- ${key}`);\n } else {\n lines.push(`${indent}- ${key}:`);\n for (const [propName, propValue] of Object.entries(props)) {\n lines.push(`${indent} - /${propName}: ${yamlEscapeValue(propValue)}`);\n }\n for (const child of children) {\n traverse(child, depth + 1, true);\n }\n }\n } else {\n for (const child of element.children) {\n traverse(child, depth, parentIncluded);\n }\n }\n }\n\n traverse(document.body, 0, false);\n\n const yaml = lines.join('\\n');\n \n if (yaml.length > 50000) {\n return {\n error: `Output exceeds 50000 character limit (${yaml.length} characters). Try using filter=\"interactive\".`,\n yaml: \"\",\n viewport: { width: window.innerWidth, height: window.innerHeight },\n };\n }\n\n return {\n yaml: yaml + `\\n\\n[Viewport: ${window.innerWidth}x${window.innerHeight}]`,\n viewport: { width: window.innerWidth, height: window.innerHeight },\n };\n } catch (err) {\n return {\n error: `Error generating YAML tree: ${err instanceof Error ? err.message : \"Unknown error\"}`,\n yaml: \"\",\n viewport: { width: window.innerWidth, height: window.innerHeight },\n };\n }\n}\n\nfunction getElementCoordinates(ref: string): { x: number; y: number; error?: string } {\n const elementMap = getElementMap();\n const elemRef = elementMap[ref];\n let element: Element | undefined;\n \n if (elemRef) {\n element = elemRef.element.deref();\n if (!element) {\n delete elementMap[ref];\n }\n }\n \n if (!element && window.__piRefs) {\n element = window.__piRefs[ref];\n }\n \n if (!element) {\n return { x: 0, y: 0, error: `Element ${ref} not found. Use read_page to get current elements.` };\n }\n\n const rect = element.getBoundingClientRect();\n const x = Math.round(rect.left + rect.width / 2);\n const y = Math.round(rect.top + rect.height / 2);\n\n return { x, y };\n}\n\nfunction setFormValue(ref: string, value: string | boolean | number): { success: boolean; error?: string } {\n const elementMap = getElementMap();\n const elemRef = elementMap[ref];\n let element: Element | undefined;\n \n if (elemRef) {\n element = elemRef.element.deref();\n if (!element) {\n delete elementMap[ref];\n }\n }\n \n if (!element && window.__piRefs) {\n element = window.__piRefs[ref];\n }\n \n if (!element) {\n return { success: false, error: `Element ${ref} not found. Use read_page to get current elements.` };\n }\n\n const tagName = element.tagName.toLowerCase();\n\n try {\n if (tagName === \"input\") {\n const input = element as HTMLInputElement;\n const type = input.type.toLowerCase();\n\n if (type === \"checkbox\" || type === \"radio\") {\n input.checked = Boolean(value);\n input.dispatchEvent(new Event(\"change\", { bubbles: true }));\n } else {\n input.value = String(value);\n input.dispatchEvent(new Event(\"input\", { bubbles: true }));\n input.dispatchEvent(new Event(\"change\", { bubbles: true }));\n }\n } else if (tagName === \"textarea\") {\n const textarea = element as HTMLTextAreaElement;\n textarea.value = String(value);\n textarea.dispatchEvent(new Event(\"input\", { bubbles: true }));\n textarea.dispatchEvent(new Event(\"change\", { bubbles: true }));\n } else if (tagName === \"select\") {\n const select = element as HTMLSelectElement;\n const strValue = String(value);\n\n let found = false;\n for (const option of select.options) {\n if (option.value === strValue || option.textContent?.trim() === strValue) {\n select.value = option.value;\n found = true;\n break;\n }\n }\n\n if (!found) {\n return { success: false, error: `Option \"${value}\" not found in select element ${ref}` };\n }\n\n select.dispatchEvent(new Event(\"change\", { bubbles: true }));\n } else if (element.getAttribute(\"contenteditable\") === \"true\") {\n element.textContent = String(value);\n element.dispatchEvent(new Event(\"input\", { bubbles: true }));\n } else {\n return { success: false, error: `Element ${ref} (${tagName}) is not a form field` };\n }\n\n return { success: true };\n } catch (err) {\n return { success: false, error: `Failed to set value: ${err instanceof Error ? err.message : \"Unknown error\"}` };\n }\n}\n\nfunction getPageText(): { text: string; title: string; url: string; error?: string } {\n try {\n const article = document.querySelector(\"article\");\n const main = document.querySelector(\"main\");\n const content = article || main || document.body;\n\n const text = content.textContent\n ?.replace(/\\s+/g, \" \")\n .trim()\n .substring(0, 50000) || \"\";\n\n return {\n text,\n title: document.title,\n url: window.location.href,\n };\n } catch (err) {\n return {\n text: \"\",\n title: \"\",\n url: \"\",\n error: `Failed to extract text: ${err instanceof Error ? err.message : \"Unknown error\"}`,\n };\n }\n}\n\nfunction scrollToElement(ref: string): { success: boolean; error?: string } {\n const elementMap = getElementMap();\n const elemRef = elementMap[ref];\n let element: Element | undefined;\n \n if (elemRef) {\n element = elemRef.element.deref();\n if (!element) {\n delete elementMap[ref];\n }\n }\n \n if (!element && window.__piRefs) {\n element = window.__piRefs[ref];\n }\n \n if (!element) {\n return { success: false, error: `Element ${ref} not found. Run read_page to get current element refs.` };\n }\n\n element.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n return { success: true };\n}\n\nfunction uploadImage(\n base64: string,\n ref?: string,\n coordinate?: [number, number],\n filename: string = \"screenshot.png\"\n): { success: boolean; error?: string } {\n try {\n const byteString = atob(base64);\n const ab = new ArrayBuffer(byteString.length);\n const ia = new Uint8Array(ab);\n for (let i = 0; i < byteString.length; i++) {\n ia[i] = byteString.charCodeAt(i);\n }\n const blob = new Blob([ab], { type: \"image/png\" });\n const file = new File([blob], filename, { type: \"image/png\" });\n\n let targetElement: HTMLElement | null = null;\n\n if (ref) {\n const elementMap = getElementMap();\n const elemRef = elementMap[ref];\n \n if (elemRef) {\n targetElement = elemRef.element.deref() as HTMLElement | null;\n if (!targetElement) {\n delete elementMap[ref];\n }\n }\n \n if (!targetElement && window.__piRefs) {\n targetElement = window.__piRefs[ref] as HTMLElement | null;\n }\n \n if (!targetElement) {\n return { success: false, error: `Element ${ref} not found. Run read_page to get current element refs.` };\n }\n } else if (coordinate) {\n targetElement = document.elementFromPoint(coordinate[0], coordinate[1]) as HTMLElement | null;\n if (!targetElement) {\n return { success: false, error: `No element at (${coordinate[0]}, ${coordinate[1]})` };\n }\n }\n\n if (!targetElement) {\n return { success: false, error: \"No target element\" };\n }\n\n if (targetElement.tagName === \"INPUT\" && (targetElement as HTMLInputElement).type === \"file\") {\n const input = targetElement as HTMLInputElement;\n const dt = new DataTransfer();\n dt.items.add(file);\n input.files = dt.files;\n input.dispatchEvent(new Event(\"change\", { bubbles: true }));\n return { success: true };\n }\n\n const dt = new DataTransfer();\n dt.items.add(file);\n\n const dropEvent = new DragEvent(\"drop\", {\n bubbles: true,\n cancelable: true,\n dataTransfer: dt,\n });\n\n targetElement.dispatchEvent(dropEvent);\n return { success: true };\n } catch (err) {\n return {\n success: false,\n error: err instanceof Error ? err.message : \"Upload failed\",\n };\n }\n}\n\nchrome.runtime.onMessage.addListener((message, sender, sendResponse) => {\n switch (message.type) {\n case \"GENERATE_ACCESSIBILITY_TREE\": {\n const options = message.options || {};\n \n if (options.format === \"yaml\") {\n const result = generateYamlTree(\n options.filter || \"interactive\",\n options.depth ?? 15\n );\n const modalStates = detectModalStates();\n if (result.error) {\n sendResponse({ error: result.error, pageContent: \"\", viewport: result.viewport });\n } else {\n sendResponse({ \n pageContent: result.yaml, \n viewport: result.viewport,\n modalStates: modalStates.length > 0 ? modalStates : undefined,\n modalLimitations: 'Only custom modals ([role=dialog]) detected. Native alert/confirm/prompt dialogs and system file choosers cannot be detected from content scripts.',\n });\n }\n } else {\n const result = generateAccessibilityTree(\n options.filter || \"interactive\",\n options.depth ?? 15,\n options.refId,\n options.forceFullSnapshot ?? false,\n options.compact ?? false\n );\n sendResponse(result);\n }\n break;\n }\n case \"GET_ELEMENT_COORDINATES\": {\n const result = getElementCoordinates(message.ref);\n sendResponse(result);\n break;\n }\n case \"CLICK_ELEMENT\": {\n const elementMap = getElementMap();\n const elemRef = elementMap[message.ref];\n let element: Element | undefined;\n if (elemRef) {\n element = elemRef.element.deref();\n if (!element) delete elementMap[message.ref];\n }\n if (!element && window.__piRefs) {\n element = window.__piRefs[message.ref];\n }\n if (!element) {\n sendResponse({ error: `Element ${message.ref} not found. Use read_page to get current elements.` });\n break;\n }\n if (message.button === \"triple\") {\n const tripleClick = new MouseEvent(\"click\", { bubbles: true, cancelable: true, view: window, detail: 3 });\n element.dispatchEvent(tripleClick);\n } else if (message.button === \"double\") {\n element.dispatchEvent(new MouseEvent(\"dblclick\", { bubbles: true, cancelable: true, view: window }));\n } else if (message.button === \"right\") {\n element.dispatchEvent(new MouseEvent(\"contextmenu\", { bubbles: true, cancelable: true, view: window }));\n } else {\n (element as HTMLElement).click();\n }\n sendResponse({ success: true });\n break;\n }\n case \"FORM_INPUT\": {\n const result = setFormValue(message.ref, message.value);\n sendResponse(result);\n break;\n }\n case \"EVAL_IN_PAGE\": {\n try {\n const script = document.createElement('script');\n script.textContent = `(function() { ${message.code} })();`;\n document.documentElement.appendChild(script);\n script.remove();\n sendResponse({ success: true });\n } catch (err) {\n sendResponse({ success: false, error: err instanceof Error ? err.message : String(err) });\n }\n break;\n }\n case \"GET_PAGE_TEXT\": {\n const result = getPageText();\n sendResponse(result);\n break;\n }\n case \"GET_FRAME_BY_SELECTOR\": {\n try {\n const iframe = document.querySelector(message.selector) as HTMLIFrameElement;\n if (!iframe || iframe.tagName.toLowerCase() !== 'iframe') {\n sendResponse({ error: `No iframe found with selector \"${message.selector}\"` });\n break;\n }\n // Return what info we can - the service worker will match by URL or name\n sendResponse({ \n url: iframe.src,\n name: iframe.name || undefined,\n });\n } catch (err) {\n sendResponse({ error: err instanceof Error ? err.message : String(err) });\n }\n break;\n }\n case \"GET_FRAME_NAME\": {\n // Return this frame's name (for frame matching by name)\n try {\n sendResponse({ name: window.name || null });\n } catch (err) {\n sendResponse({ name: null });\n }\n break;\n }\n case \"LOCATE_ROLE\": {\n try {\n const { role, name, all } = message;\n const elementMap = getElementMap();\n \n // Mapping of role to possible selectors\n const implicitRoles: Record<string, string[]> = {\n button: ['button', 'input[type=\"button\"]', 'input[type=\"submit\"]', 'input[type=\"reset\"]', '[role=\"button\"]'],\n link: ['a[href]', '[role=\"link\"]'],\n textbox: ['input:not([type])', 'input[type=\"text\"]', 'input[type=\"email\"]', 'input[type=\"password\"]', 'input[type=\"search\"]', 'input[type=\"tel\"]', 'input[type=\"url\"]', 'textarea', '[role=\"textbox\"]'],\n checkbox: ['input[type=\"checkbox\"]', '[role=\"checkbox\"]'],\n radio: ['input[type=\"radio\"]', '[role=\"radio\"]'],\n combobox: ['select', '[role=\"combobox\"]'],\n listbox: ['[role=\"listbox\"]', 'select[multiple]'],\n option: ['option', '[role=\"option\"]'],\n heading: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', '[role=\"heading\"]'],\n navigation: ['nav', '[role=\"navigation\"]'],\n main: ['main', '[role=\"main\"]'],\n img: ['img[alt]', '[role=\"img\"]'],\n dialog: ['dialog', '[role=\"dialog\"]', '[role=\"alertdialog\"]'],\n tab: ['[role=\"tab\"]'],\n tabpanel: ['[role=\"tabpanel\"]'],\n menu: ['[role=\"menu\"]'],\n menuitem: ['[role=\"menuitem\"]'],\n };\n \n // Build selectors for the role\n const selectors = implicitRoles[role] || [`[role=\"${role}\"]`];\n const candidates: Element[] = [];\n \n for (const sel of selectors) {\n try {\n candidates.push(...document.querySelectorAll(sel));\n } catch {}\n }\n \n // Filter by visibility\n const visible = candidates.filter(el => {\n const style = window.getComputedStyle(el);\n return style.display !== 'none' && \n style.visibility !== 'hidden' && \n (el as HTMLElement).offsetWidth > 0 &&\n (el as HTMLElement).offsetHeight > 0;\n });\n \n // Filter by name if provided\n let matches = visible;\n if (name) {\n const lowerName = name.toLowerCase();\n matches = visible.filter(el => {\n const ariaLabel = el.getAttribute('aria-label')?.toLowerCase();\n const text = el.textContent?.trim().toLowerCase();\n const title = el.getAttribute('title')?.toLowerCase();\n const placeholder = (el as HTMLInputElement).placeholder?.toLowerCase();\n const value = (el as HTMLInputElement).value?.toLowerCase();\n \n return ariaLabel?.includes(lowerName) || \n text?.includes(lowerName) || \n title?.includes(lowerName) ||\n placeholder?.includes(lowerName) ||\n value?.includes(lowerName);\n });\n }\n \n if (matches.length === 0) {\n sendResponse({ error: `No element found with role \"${role}\"${name ? ` and name \"${name}\"` : ''}` });\n break;\n }\n \n // Generate refs for matches\n const results = matches.map(el => {\n const ref = getOrAssignRef(el, role, name || '');\n window.__piRefs = window.__piRefs || {};\n window.__piRefs[ref] = el;\n elementMap[ref] = { element: new WeakRef(el), role, name: name || '' };\n return { ref, text: el.textContent?.trim().slice(0, 50) };\n });\n \n if (all) {\n sendResponse({ matches: results });\n } else {\n sendResponse({ ref: results[0].ref, text: results[0].text });\n }\n } catch (err) {\n sendResponse({ error: err instanceof Error ? err.message : String(err) });\n }\n break;\n }\n case \"LOCATE_TEXT\": {\n try {\n const { text, exact } = message;\n const elementMap = getElementMap();\n \n // Find elements containing the text\n const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT);\n const matches: Element[] = [];\n \n while (walker.nextNode()) {\n const nodeText = walker.currentNode.textContent || '';\n const hasMatch = exact \n ? nodeText.trim() === text \n : nodeText.toLowerCase().includes(text.toLowerCase());\n \n if (hasMatch) {\n const parent = walker.currentNode.parentElement;\n if (parent && !matches.includes(parent)) {\n // Check visibility\n const style = window.getComputedStyle(parent);\n if (style.display !== 'none' && style.visibility !== 'hidden') {\n matches.push(parent);\n }\n }\n }\n }\n \n if (matches.length === 0) {\n sendResponse({ error: `No element found with text \"${text}\"` });\n break;\n }\n \n // Pick the most specific (smallest) element\n const el = matches.sort((a, b) => \n (a.textContent?.length || 0) - (b.textContent?.length || 0)\n )[0];\n \n const role = getResolvedRole(el);\n const ref = getOrAssignRef(el, role, text);\n window.__piRefs = window.__piRefs || {};\n window.__piRefs[ref] = el;\n elementMap[ref] = { element: new WeakRef(el), role, name: text };\n \n sendResponse({ ref, text: el.textContent?.trim().slice(0, 50) });\n } catch (err) {\n sendResponse({ error: err instanceof Error ? err.message : String(err) });\n }\n break;\n }\n case \"LOCATE_LABEL\": {\n try {\n const { label } = message;\n const elementMap = getElementMap();\n \n // Find label element\n const labels = document.querySelectorAll('label');\n let input: Element | null = null;\n \n for (const lbl of labels) {\n const lblText = lbl.textContent?.trim().toLowerCase();\n if (lblText?.includes(label.toLowerCase())) {\n // Check for 'for' attribute\n const forId = lbl.getAttribute('for');\n if (forId) {\n input = document.getElementById(forId);\n }\n // Check for nested input\n if (!input) {\n input = lbl.querySelector('input, select, textarea');\n }\n if (input) break;\n }\n }\n \n // Also check aria-label and placeholder\n if (!input) {\n const lowerLabel = label.toLowerCase();\n input = document.querySelector(\n `input[aria-label*=\"${label}\" i], input[placeholder*=\"${label}\" i], ` +\n `textarea[aria-label*=\"${label}\" i], textarea[placeholder*=\"${label}\" i], ` +\n `select[aria-label*=\"${label}\" i]`\n );\n }\n \n if (!input) {\n sendResponse({ error: `No form field found with label \"${label}\"` });\n break;\n }\n \n const role = getResolvedRole(input);\n const ref = getOrAssignRef(input, role, label);\n window.__piRefs = window.__piRefs || {};\n window.__piRefs[ref] = input;\n elementMap[ref] = { element: new WeakRef(input), role, name: label };\n \n sendResponse({ ref, label });\n } catch (err) {\n sendResponse({ error: err instanceof Error ? err.message : String(err) });\n }\n break;\n }\n case \"GET_ELEMENT_STYLES\": {\n try {\n const { selector } = message;\n const elementMap = getElementMap();\n \n // Helper to extract styles from an element\n const extractStyles = (el: Element) => {\n const s = getComputedStyle(el);\n const r = el.getBoundingClientRect();\n return {\n tag: el.tagName.toLowerCase(),\n text: (el as HTMLElement).innerText?.trim().slice(0, 80) || null,\n box: {\n x: Math.round(r.x),\n y: Math.round(r.y),\n width: Math.round(r.width),\n height: Math.round(r.height),\n },\n styles: {\n fontSize: s.fontSize,\n fontWeight: s.fontWeight,\n fontFamily: s.fontFamily.split(',')[0].trim().replace(/\"/g, ''),\n color: s.color,\n backgroundColor: s.backgroundColor,\n borderRadius: s.borderRadius,\n border: s.border !== 'none' && s.borderWidth !== '0px' ? s.border : null,\n boxShadow: s.boxShadow !== 'none' ? s.boxShadow : null,\n padding: s.padding,\n },\n };\n };\n \n // Check if selector is a ref (e.g., \"e5\")\n if (/^e\\d+$/.test(selector)) {\n const elemRef = elementMap[selector];\n let element: Element | undefined;\n if (elemRef) {\n element = elemRef.element.deref();\n if (!element) delete elementMap[selector];\n }\n if (!element && window.__piRefs) {\n element = window.__piRefs[selector];\n }\n \n if (!element) {\n sendResponse({ error: `Element ${selector} not found` });\n break;\n }\n \n sendResponse({ styles: [extractStyles(element)] });\n } else {\n // CSS selector - can match multiple elements\n const elements = document.querySelectorAll(selector);\n if (elements.length === 0) {\n sendResponse({ error: `No elements found matching \"${selector}\"` });\n break;\n }\n \n const styles = Array.from(elements).map(extractStyles);\n sendResponse({ styles });\n }\n } catch (err) {\n sendResponse({ error: err instanceof Error ? err.message : String(err) });\n }\n break;\n }\n case \"SELECT_OPTION\": {\n try {\n const { selector, values, by } = message;\n const elementMap = getElementMap();\n \n // Find the select element\n let selectEl: HTMLSelectElement | null = null;\n \n if (/^e\\d+$/.test(selector)) {\n const elemRef = elementMap[selector];\n let element: Element | undefined;\n if (elemRef) {\n element = elemRef.element.deref();\n if (!element) delete elementMap[selector];\n }\n if (!element && window.__piRefs) {\n element = window.__piRefs[selector];\n }\n \n if (!element) {\n sendResponse({ error: `Element ${selector} not found` });\n break;\n }\n if (element.tagName !== 'SELECT') {\n sendResponse({ error: `Element ${selector} is not a <select>` });\n break;\n }\n selectEl = element as HTMLSelectElement;\n } else {\n selectEl = document.querySelector(selector) as HTMLSelectElement;\n if (!selectEl) {\n sendResponse({ error: `No element found matching \"${selector}\"` });\n break;\n }\n if (selectEl.tagName !== 'SELECT') {\n sendResponse({ error: `Element \"${selector}\" is not a <select>` });\n break;\n }\n }\n \n // Clear current selection for multi-select\n if (selectEl.multiple) {\n for (const opt of selectEl.options) {\n opt.selected = false;\n }\n }\n \n const selected: string[] = [];\n const notFound: string[] = [];\n \n // For single-select, only use the first value\n const valuesToSelect = selectEl.multiple ? values : [values[0]];\n \n for (const val of valuesToSelect) {\n let found = false;\n \n for (const opt of selectEl.options) {\n let matches = false;\n \n if (by === 'index') {\n matches = opt.index === parseInt(val, 10);\n } else if (by === 'label') {\n matches = opt.text.toLowerCase().includes(val.toLowerCase());\n } else {\n // Default: match by value\n matches = opt.value === val;\n }\n \n if (matches) {\n opt.selected = true;\n selected.push(opt.value);\n found = true;\n break; // Found match for this value, move to next\n }\n }\n \n if (!found) notFound.push(val);\n }\n \n // Dispatch change event\n selectEl.dispatchEvent(new Event('change', { bubbles: true }));\n \n if (notFound.length > 0) {\n sendResponse({ \n selected, \n warning: `Values not found: ${notFound.join(', ')}` \n });\n } else {\n sendResponse({ selected });\n }\n } catch (err) {\n sendResponse({ error: err instanceof Error ? err.message : String(err) });\n }\n break;\n }\n case \"GET_ELEMENT_TEXT\": {\n try {\n const { ref } = message;\n const elementMap = getElementMap();\n const elemRef = elementMap[ref];\n \n let element: Element | undefined;\n if (elemRef) {\n element = elemRef.element.deref();\n if (!element) delete elementMap[ref];\n }\n if (!element && window.__piRefs) {\n element = window.__piRefs[ref];\n }\n \n if (!element) {\n sendResponse({ error: `Element ${ref} not found` });\n break;\n }\n \n sendResponse({ text: element.textContent?.trim() || '' });\n } catch (err) {\n sendResponse({ error: err instanceof Error ? err.message : String(err) });\n }\n break;\n }\n case \"SCROLL_TO_ELEMENT\": {\n const result = scrollToElement(message.ref);\n sendResponse(result);\n break;\n }\n case \"UPLOAD_IMAGE\": {\n const result = uploadImage(message.base64, message.ref, message.coordinate, message.filename);\n sendResponse(result);\n break;\n }\n case \"WAIT_FOR_ELEMENT\": {\n const { selector, state = 'visible', timeout = 20000 } = message;\n const maxTimeout = Math.min(timeout, 60000);\n\n const isElementVisible = (el: Element | null): boolean => {\n if (!el) return false;\n const style = window.getComputedStyle(el);\n return style.display !== 'none' && \n style.visibility !== 'hidden' && \n style.opacity !== '0' &&\n (el as HTMLElement).offsetWidth > 0 &&\n (el as HTMLElement).offsetHeight > 0;\n };\n\n const checkElement = (): boolean => {\n const el = document.querySelector(selector);\n switch (state) {\n case 'attached': return !!el;\n case 'detached': return !el;\n case 'hidden': return !el || !isElementVisible(el);\n case 'visible':\n default: return isElementVisible(el);\n }\n };\n\n const startTime = Date.now();\n \n const waitForCondition = (): Promise<{ success: boolean; waited: number; error?: string }> => {\n return new Promise((resolve) => {\n if (checkElement()) {\n resolve({ success: true, waited: Date.now() - startTime });\n return;\n }\n\n const observer = new MutationObserver(() => {\n if (checkElement()) {\n observer.disconnect();\n clearTimeout(timeoutId);\n resolve({ success: true, waited: Date.now() - startTime });\n }\n });\n\n const timeoutId = setTimeout(() => {\n observer.disconnect();\n resolve({ \n success: false, \n waited: Date.now() - startTime,\n error: `Timeout waiting for \"${selector}\" to be ${state}` \n });\n }, maxTimeout);\n\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['style', 'class', 'hidden', 'disabled']\n });\n });\n };\n\n waitForCondition().then((waitResult) => {\n if (!waitResult.success) {\n sendResponse({ \n error: waitResult.error, \n waited: waitResult.waited,\n pageContent: \"\", \n viewport: { width: window.innerWidth, height: window.innerHeight } \n });\n return;\n }\n const treeResult = generateAccessibilityTree(\"interactive\", 15, undefined, true);\n sendResponse({ ...treeResult, waited: waitResult.waited });\n });\n return true;\n }\n case \"WAIT_FOR_URL\": {\n const { pattern, timeout = 20000 } = message;\n const maxTimeout = Math.min(timeout, 60000);\n\n const matchesPattern = (url: string): boolean => {\n if (pattern.includes('*')) {\n const regexPattern = pattern\n .replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\*\\*/g, '<<<GLOBSTAR>>>')\n .replace(/\\*/g, '[^/]*')\n .replace(/<<<GLOBSTAR>>>/g, '.*');\n return new RegExp(`^${regexPattern}$`).test(url);\n }\n return url.includes(pattern);\n };\n\n const startTime = Date.now();\n\n const waitForUrl = (): Promise<{ success: boolean; waited: number; error?: string }> => {\n return new Promise((resolve) => {\n if (matchesPattern(window.location.href)) {\n resolve({ success: true, waited: Date.now() - startTime });\n return;\n }\n\n let resolved = false;\n const checkUrl = () => {\n if (resolved) return;\n if (matchesPattern(window.location.href)) {\n resolved = true;\n clearInterval(intervalId);\n clearTimeout(timeoutId);\n window.removeEventListener('popstate', checkUrl);\n window.removeEventListener('hashchange', checkUrl);\n resolve({ success: true, waited: Date.now() - startTime });\n }\n };\n\n const intervalId = setInterval(checkUrl, 100);\n const timeoutId = setTimeout(() => {\n if (resolved) return;\n resolved = true;\n clearInterval(intervalId);\n window.removeEventListener('popstate', checkUrl);\n window.removeEventListener('hashchange', checkUrl);\n resolve({ \n success: false, \n waited: Date.now() - startTime,\n error: `Timeout waiting for URL to match \"${pattern}\". Current: ${window.location.href}` \n });\n }, maxTimeout);\n\n window.addEventListener('popstate', checkUrl);\n window.addEventListener('hashchange', checkUrl);\n });\n };\n\n waitForUrl().then((waitResult) => {\n if (!waitResult.success) {\n sendResponse({ \n error: waitResult.error, \n waited: waitResult.waited,\n pageContent: \"\", \n viewport: { width: window.innerWidth, height: window.innerHeight } \n });\n return;\n }\n const treeResult = generateAccessibilityTree(\"interactive\", 15, undefined, true);\n sendResponse({ ...treeResult, waited: waitResult.waited });\n });\n return true;\n }\n case \"WAIT_FOR_DOM_STABLE\": {\n const { stable = 100, timeout = 5000 } = message;\n const maxTimeout = Math.min(timeout, 30000);\n const startTime = Date.now();\n\n const waitForStability = (): Promise<{ success: boolean; waited: number; error?: string }> => {\n return new Promise((resolve) => {\n let lastMutationTime = Date.now();\n let resolved = false;\n\n const checkStability = () => {\n if (resolved) return;\n const timeSinceLastMutation = Date.now() - lastMutationTime;\n if (timeSinceLastMutation >= stable) {\n resolved = true;\n observer.disconnect();\n clearTimeout(timeoutId);\n clearInterval(checkInterval);\n resolve({ success: true, waited: Date.now() - startTime });\n }\n };\n\n const observer = new MutationObserver(() => {\n lastMutationTime = Date.now();\n });\n\n const timeoutId = setTimeout(() => {\n if (resolved) return;\n resolved = true;\n observer.disconnect();\n clearInterval(checkInterval);\n resolve({\n success: false,\n waited: Date.now() - startTime,\n error: `Timeout: DOM did not stabilize within ${maxTimeout}ms`\n });\n }, maxTimeout);\n\n const checkInterval = setInterval(checkStability, Math.max(10, Math.min(50, stable / 2)));\n\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: true,\n characterData: true,\n });\n\n checkStability();\n });\n };\n\n waitForStability().then((waitResult) => {\n if (!waitResult.success) {\n sendResponse({\n error: waitResult.error,\n waited: waitResult.waited,\n pageContent: \"\",\n viewport: { width: window.innerWidth, height: window.innerHeight }\n });\n return;\n }\n const treeResult = generateAccessibilityTree(\"interactive\", 15, undefined, true);\n sendResponse({ ...treeResult, waited: waitResult.waited });\n });\n return true;\n }\n case \"FORM_FILL\": {\n const { data } = message;\n if (!Array.isArray(data)) {\n sendResponse({ error: \"data must be an array of {ref, value} pairs\" });\n return true;\n }\n const elementMap = getElementMap();\n const results: { ref: string; success: boolean; error?: string }[] = [];\n for (const item of data) {\n const { ref, value } = item;\n if (!ref) {\n results.push({ ref: ref || \"unknown\", success: false, error: \"Missing ref\" });\n continue;\n }\n const elemRef = elementMap[ref];\n if (!elemRef) {\n results.push({ ref, success: false, error: \"Element not found (run page.read first)\" });\n continue;\n }\n const el = elemRef.element.deref() as HTMLElement | null;\n if (!el) {\n delete elementMap[ref];\n results.push({ ref, success: false, error: \"Element no longer exists\" });\n continue;\n }\n try {\n if (el instanceof HTMLInputElement) {\n const inputType = el.type.toLowerCase();\n if (inputType === \"checkbox\" || inputType === \"radio\") {\n const shouldCheck = value === true || value === \"true\" || value === \"1\" || value === \"checked\";\n el.checked = shouldCheck;\n el.dispatchEvent(new Event(\"change\", { bubbles: true }));\n } else {\n el.focus();\n el.value = String(value);\n el.dispatchEvent(new Event(\"input\", { bubbles: true }));\n el.dispatchEvent(new Event(\"change\", { bubbles: true }));\n }\n results.push({ ref, success: true });\n } else if (el instanceof HTMLTextAreaElement) {\n el.focus();\n el.value = String(value);\n el.dispatchEvent(new Event(\"input\", { bubbles: true }));\n el.dispatchEvent(new Event(\"change\", { bubbles: true }));\n results.push({ ref, success: true });\n } else if (el instanceof HTMLSelectElement) {\n el.value = String(value);\n el.dispatchEvent(new Event(\"change\", { bubbles: true }));\n results.push({ ref, success: true });\n } else if (el.isContentEditable) {\n el.focus();\n el.textContent = String(value);\n el.dispatchEvent(new Event(\"input\", { bubbles: true }));\n results.push({ ref, success: true });\n } else {\n results.push({ ref, success: false, error: \"Element is not fillable\" });\n }\n } catch (e) {\n results.push({ ref, success: false, error: e instanceof Error ? e.message : String(e) });\n }\n }\n const failed = results.filter(r => !r.success);\n sendResponse({\n success: failed.length === 0,\n filled: results.filter(r => r.success).length,\n failed: failed.length,\n results,\n });\n return true;\n }\n case \"GET_FILE_INPUT_SELECTOR\": {\n const { ref } = message;\n if (!ref) {\n sendResponse({ error: \"No ref provided\" });\n return true;\n }\n const elementMap = getElementMap();\n const elemRef = elementMap[ref];\n if (!elemRef) {\n sendResponse({ error: \"Element not found (run page.read first)\" });\n return true;\n }\n const el = elemRef.element.deref() as HTMLElement | null;\n if (!el) {\n delete elementMap[ref];\n sendResponse({ error: \"Element no longer exists\" });\n return true;\n }\n if (!(el instanceof HTMLInputElement) || el.type !== \"file\") {\n sendResponse({ error: \"Element is not a file input\" });\n return true;\n }\n const uniqueId = `__pi_file_${Date.now()}`;\n el.setAttribute(\"data-pi-file-id\", uniqueId);\n sendResponse({ selector: `[data-pi-file-id=\"${uniqueId}\"]` });\n return true;\n }\n case \"WAIT_FOR_NETWORK_IDLE\": {\n const { timeout = 10000 } = message;\n const maxTimeout = Math.min(timeout, 60000);\n\n const adPatterns = [\n \"doubleclick.net\", \"googlesyndication.com\", \"googletagmanager.com\",\n \"google-analytics.com\", \"facebook.net\", \"connect.facebook.net\",\n \"analytics\", \"ads\", \"tracking\", \"pixel\", \"hotjar.com\", \"clarity.ms\",\n \"mixpanel.com\", \"segment.com\", \"newrelic.com\", \"nr-data.net\",\n \"/tracker/\", \"/collector/\", \"/beacon/\", \"/telemetry/\", \"/log/\",\n \"/events/\", \"/track.\", \"/metrics/\"\n ];\n\n const nonCriticalTypes = [\"img\", \"image\", \"font\", \"icon\"];\n\n const isAdOrTracking = (url: string): boolean => {\n return adPatterns.some(pattern => url.includes(pattern));\n };\n\n const isNonCritical = (entry: PerformanceResourceTiming): boolean => {\n const type = entry.initiatorType || \"unknown\";\n if (nonCriticalTypes.includes(type)) return true;\n if (/\\.(jpg|jpeg|png|gif|webp|svg|ico|woff|woff2|ttf|eot)(\\?|$)/i.test(entry.name)) return true;\n return false;\n };\n\n const getPendingRequests = (): PerformanceResourceTiming[] => {\n const now = performance.now();\n const resources = performance.getEntriesByType(\"resource\") as PerformanceResourceTiming[];\n return resources.filter(entry => {\n if (entry.responseEnd !== 0) return false;\n if (entry.name.startsWith(\"data:\")) return false;\n if (entry.name.length > 500) return false;\n if (isAdOrTracking(entry.name)) return false;\n const loadingDuration = now - entry.startTime;\n if (loadingDuration > 10000) return false;\n if (isNonCritical(entry) && loadingDuration > 3000) return false;\n return true;\n });\n };\n\n const startTime = Date.now();\n\n const waitForIdle = (): Promise<{ success: boolean; waited: number; pendingCount?: number }> => {\n return new Promise((resolve) => {\n const check = () => {\n const pending = getPendingRequests();\n const elapsed = Date.now() - startTime;\n \n if (pending.length === 0) {\n resolve({ success: true, waited: elapsed });\n return;\n }\n \n if (elapsed >= maxTimeout) {\n resolve({ success: false, waited: elapsed, pendingCount: pending.length });\n return;\n }\n \n setTimeout(check, 100);\n };\n check();\n });\n };\n\n waitForIdle().then((waitResult) => {\n if (!waitResult.success) {\n sendResponse({ \n error: `Network not idle after ${waitResult.waited}ms (${waitResult.pendingCount} requests pending)`,\n waited: waitResult.waited,\n pageContent: \"\", \n viewport: { width: window.innerWidth, height: window.innerHeight } \n });\n return;\n }\n const treeResult = generateAccessibilityTree(\"interactive\", 15, undefined, true);\n sendResponse({ ...treeResult, waited: waitResult.waited });\n });\n return true;\n }\n case \"SEARCH_PAGE\": {\n const { term, caseSensitive, limit } = message;\n const matches = searchPageText(term, caseSensitive || false, limit || 10);\n sendResponse({ query: term, count: matches.length, matches });\n break;\n }\n case \"GET_ELEMENT_BOUNDS_FOR_ANNOTATION\": {\n const elementMap = getElementMap();\n const elements: Array<{ ref: string; tag: string; bounds: { x: number; y: number; width: number; height: number } }> = [];\n \n for (const [ref, entry] of Object.entries(elementMap)) {\n const el = entry.element.deref();\n if (!el) continue;\n \n const rect = el.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) continue;\n if (rect.bottom < 0 || rect.top > window.innerHeight) continue;\n if (rect.right < 0 || rect.left > window.innerWidth) continue;\n \n elements.push({\n ref,\n tag: el.tagName.toLowerCase(),\n bounds: {\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n },\n });\n }\n \n sendResponse({ elements });\n break;\n }\n default:\n return false;\n }\n return false;\n});\n\nfunction searchPageText(term: string, caseSensitive: boolean, limit: number) {\n const matches: Array<{\n ref: string;\n text: string;\n context: string;\n bounds: { x: number; y: number; width: number; height: number };\n elementRef: string | null;\n }> = [];\n \n const searchTerm = caseSensitive ? term : term.toLowerCase();\n const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT);\n const elementMap = getElementMap();\n let matchIndex = 0;\n \n while (walker.nextNode() && matches.length < limit) {\n const node = walker.currentNode;\n const textContent = node.textContent || \"\";\n const searchIn = caseSensitive ? textContent : textContent.toLowerCase();\n \n let pos = 0;\n while ((pos = searchIn.indexOf(searchTerm, pos)) !== -1 && matches.length < limit) {\n const parent = node.parentElement;\n if (!parent) { pos++; continue; }\n \n const range = document.createRange();\n range.setStart(node, pos);\n range.setEnd(node, Math.min(pos + term.length, textContent.length));\n const rect = range.getBoundingClientRect();\n \n if (rect.width === 0 || rect.height === 0) { pos++; continue; }\n \n const fullText = node.textContent || \"\";\n const contextStart = Math.max(0, pos - 30);\n const contextEnd = Math.min(fullText.length, pos + term.length + 30);\n const context = fullText.slice(contextStart, contextEnd).trim();\n \n let elementRef: string | null = null;\n for (const [ref, entry] of Object.entries(elementMap)) {\n const el = entry.element.deref();\n if (el && (el === parent || el.contains(parent))) {\n elementRef = ref;\n break;\n }\n }\n \n matches.push({\n ref: `m${++matchIndex}`,\n text: fullText.slice(pos, pos + term.length),\n context,\n bounds: {\n x: Math.round(rect.x),\n y: Math.round(rect.y),\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n },\n elementRef,\n });\n \n pos++;\n }\n }\n \n return matches;\n}\n"],"names":["VALID_ARIA_ROLES","isFocusable","element","tagName","tabindex","getExplicitRole","roleAttr","roles","r","role","getImplicitRole","tag","type","tagRoles","el","s","roleOrFn","getResolvedRole","explicitRole","globalRefCounter","getOrAssignRef","name","existing","ref","detectModalStates","modals","dialog","_a","_b","style","title","piHelpersImpl","ms","resolve","selector","options","state","timeout","isElementVisible","checkElement","reject","result","observer","timeoutId","text","checkText","root","walker","_c","_d","implicitRoles","candidates","implicitSelectors","sel","normalizedName","ariaLabel","textContent","placeholder","getElementMap","generateAccessibilityTree","filter","maxDepth","refId","forceFullSnapshot","compact","getRole","getName","labelledBy","names","id","joined","select","selected","alt","label","input","value","node","t","directText","getAriaProps","props","checkedAttr","isDisableable","expandedAttr","pressedAttr","selectedAttr","activeAttr","levelAttr","formatAriaProps","parts","isVisible","isInteractive","isLandmark","hasCursorPointer","shouldInclude","rect","traverse","depth","lines","elementMap","include","ariaProps","elemRefId","line","escapedName","propsStr","href","child","normalizeLineForDiff","countOccurrences","counts","norm","computeSimpleDiff","oldContent","newContent","oldLines","newLines","oldCounts","newCounts","added","removed","oldCount","oldCountsReset","newCount","diffLines","l","startElement","elemRef","content","modalStates","diff","isIncremental","lastSnapshot","err","yamlEscapeValue","str","generateYamlTree","buildKey","key","getElementProps","parentIncluded","isInteractiveEl","isLandmarkEl","hasName","indent","children","hasChildren","hasProps","propName","propValue","yaml","getElementCoordinates","x","y","setFormValue","textarea","strValue","found","option","getPageText","article","main","scrollToElement","uploadImage","base64","coordinate","filename","byteString","ab","ia","i","blob","file","targetElement","dt","dropEvent","message","sender","sendResponse","tripleClick","script","iframe","all","selectors","visible","matches","lowerName","_e","results","exact","nodeText","parent","b","labels","lbl","lblText","forId","lowerLabel","extractStyles","elements","styles","values","by","selectEl","opt","notFound","valuesToSelect","val","maxTimeout","startTime","waitResult","treeResult","pattern","matchesPattern","url","regexPattern","resolved","checkUrl","intervalId","stable","lastMutationTime","checkStability","checkInterval","data","item","inputType","shouldCheck","e","failed","uniqueId","adPatterns","nonCriticalTypes","isAdOrTracking","isNonCritical","entry","getPendingRequests","now","loadingDuration","check","pending","elapsed","term","caseSensitive","limit","searchPageText","searchTerm","matchIndex","searchIn","pos","range","fullText","contextStart","contextEnd","context","elementRef"],"mappings":"AAkBA,MAAMA,MAAuB,IAAI,CAC/B,QAAS,cAAe,cAAe,UAAW,SAAU,aAC5D,SAAU,UAAW,OAAQ,WAAY,OAAQ,eAAgB,WACjE,gBAAiB,cAAe,aAAc,WAAY,SAAU,YACpE,WAAY,WAAY,OAAQ,SAAU,OAAQ,UAAW,OAAQ,WACrE,QAAS,UAAW,MAAO,YAAa,OAAQ,OAAQ,UAAW,WACnE,MAAO,OAAQ,OAAQ,UAAW,OAAQ,OAAQ,UAAW,WAC7D,mBAAoB,gBAAiB,QAAS,aAAc,OAAQ,OACpE,SAAU,YAAa,eAAgB,cAAe,QAAS,aAC/D,SAAU,MAAO,WAAY,YAAa,YAAa,SAAU,YACjE,YAAa,SAAU,aAAc,SAAU,SAAU,YACzD,cAAe,SAAU,MAAO,QAAS,UAAW,WAAY,OAChE,UAAW,OAAQ,QAAS,UAAW,UAAW,OAAQ,WAAY,UACxE,CAAC,EAED,SAASC,EAAYC,EAA2B,CAC9C,MAAMC,EAAUD,EAAQ,QAAQ,YAAA,EAChC,GAAI,CAAC,SAAU,QAAS,SAAU,UAAU,EAAE,SAASC,CAAO,EAC5D,MAAO,CAAED,EAA8B,SAEzC,GAAIC,IAAY,KAAOD,EAAQ,aAAa,MAAM,EAAG,MAAO,GAC5D,GAAIA,EAAQ,aAAa,UAAU,EAAG,CACpC,MAAME,EAAW,SAASF,EAAQ,aAAa,UAAU,GAAK,GAAI,EAAE,EACpE,MAAO,CAAC,MAAME,CAAQ,GAAKA,GAAY,CACzC,CACA,OAAIF,EAAQ,aAAa,iBAAiB,IAAM,MAElD,CAEA,SAASG,EAAgBH,EAAiC,CACxD,MAAMI,EAAWJ,EAAQ,aAAa,MAAM,EAC5C,GAAI,CAACI,EAAU,OAAO,KACtB,MAAMC,EAAQD,EAAS,MAAM,KAAK,EAAE,UAAYE,CAAC,EACjD,UAAWC,KAAQF,EACjB,GAAIP,EAAiB,IAAIS,CAAI,EAC3B,OAAOA,EAGX,OAAO,IACT,CAEA,SAASC,EAAgBR,EAA0B,CACjD,MAAMS,EAAMT,EAAQ,QAAQ,YAAA,EACtBU,EAAOV,EAAQ,aAAa,MAAM,EAElCW,EAA+D,CACnE,EAAIC,GAAOA,EAAG,aAAa,MAAM,EAAI,OAAS,UAC9C,QAAS,UACT,MAAO,gBACP,OAAQ,SACR,SAAU,UACV,GAAI,aACJ,QAAS,QACT,OAAQ,SACR,GAAI,OACJ,SAAU,QACV,OAAQ,SACR,OAASA,GAAOA,EAAG,QAAQ,oCAAoC,EAAI,UAAY,cAC/E,KAAOA,GAAOA,EAAG,aAAa,YAAY,GAAKA,EAAG,aAAa,iBAAiB,EAAI,OAAS,UAC7F,GAAI,UAAW,GAAI,UAAW,GAAI,UAAW,GAAI,UAAW,GAAI,UAAW,GAAI,UAC/E,OAASA,GAAOA,EAAG,QAAQ,oCAAoC,EAAI,UAAY,SAC/E,GAAI,YACJ,IAAMA,GAAOA,EAAG,aAAa,KAAK,IAAM,GAAK,eAAiB,MAC9D,GAAI,WACJ,KAAM,OACN,KAAM,OACN,KAAM,OACN,MAAO,QACP,IAAK,aACL,GAAI,OACJ,SAAU,QACV,OAAQ,SACR,OAAQ,SACR,EAAG,YACH,SAAU,cACV,OAAQ,SACR,QAAUA,GAAOA,EAAG,aAAa,YAAY,GAAKA,EAAG,aAAa,iBAAiB,EAAI,SAAW,UAClG,OAASA,GAAO,CACd,MAAMC,EAAID,EACV,OAAOC,EAAE,aAAa,UAAU,GAAMA,EAAE,MAAQA,EAAE,KAAO,EAAK,UAAY,UAC5E,EACA,MAAO,QACP,MAAO,WACP,GAAI,OACJ,SAAU,UACV,MAAO,WACP,GAAI,eACJ,MAAO,WACP,KAAM,OACN,GAAI,MACJ,GAAI,MAAA,EAGN,GAAIJ,IAAQ,QAiBV,MAhB2C,CACzC,OAAQ,SACR,SAAU,WACV,MAAO,UACP,KAAM,SACN,MAAO,SACP,OAAQ,aACR,MAAO,QACP,MAAO,SACP,MAAO,SACP,OAAQ,YACR,OAAQ,SACR,IAAK,UACL,KAAM,UACN,IAAK,SAAA,EAEWC,GAAQ,EAAE,GAAK,UAGnC,MAAMI,EAAWH,EAASF,CAAG,EAC7B,OAAI,OAAOK,GAAa,WACfA,EAASd,CAAO,EAElBc,GAAY,SACrB,CAEA,SAASC,EAAgBf,EAA0B,CACjD,MAAMgB,EAAeb,EAAgBH,CAAO,EAM5C,MAJI,CAACgB,IAIAA,IAAiB,QAAUA,IAAiB,iBAAmBjB,EAAYC,CAAO,EAC9EQ,EAAgBR,CAAO,EAGzBgB,CACT,CAEK,OAAO,iBAAgB,OAAO,eAAiB,CAAA,GAEpD,IAAIC,GAAmB,EAEvB,SAASC,EAAelB,EAAkBO,EAAcY,EAAsB,CAC5E,MAAMC,EAAYpB,EAAgB,OAClC,GAAIoB,GAAYA,EAAS,OAASb,GAAQa,EAAS,OAASD,EAC1D,OAAOC,EAAS,IAGlB,MAAMC,EAAM,IAAI,EAAEJ,EAAgB,GACjC,OAAAjB,EAAgB,OAAS,CAAE,KAAAO,EAAM,KAAAY,EAAM,IAAAE,CAAA,EACjCA,CACT,CAEA,SAASC,GAAkC,CACzC,MAAMC,EAAuB,CAAA,EAG7B,OADgB,SAAS,iBAAiB,qDAAqD,EACvF,QAAQC,GAAU,CAzJ5B,IAAAC,EAAAC,EA0JI,MAAMC,EAAQ,OAAO,iBAAiBH,CAAM,EAM5C,GAAI,EALcG,EAAM,UAAY,QAClBA,EAAM,aAAe,UACrBA,EAAM,UAAY,KACjBH,EAAuB,YAAc,GACrCA,EAAuB,aAAe,GACzC,OAEhB,MAAMjB,EAAOiB,EAAO,aAAa,MAAM,GAAK,SAC5C,IAAII,EAAQJ,EAAO,aAAa,YAAY,KAChCE,GAAAD,EAAAD,EAAO,cAAc,8BAA8B,IAAnD,YAAAC,EAAsD,cAAtD,YAAAC,EAAmE,SACnE,SACRE,EAAM,OAAS,MAAKA,EAAQA,EAAM,UAAU,EAAG,GAAG,EAAI,OAC1DL,EAAO,KAAK,CACV,KAAMhB,EACN,YAAa,GAAGA,CAAI,KAAKqB,CAAK,GAC9B,UAAW,mCAAA,CACZ,CACH,CAAC,EAEML,CACT,CAEA,MAAMM,EAAgB,CACpB,KAAKC,EAA2B,CAC9B,OAAO,IAAI,QAAQC,GAAW,WAAWA,EAASD,CAAE,CAAC,CACvD,EAEA,MAAM,gBACFE,EACAC,EAAwF,GAC/D,CACzB,KAAM,CAAE,MAAAC,EAAQ,UAAW,QAAAC,EAAU,KAAUF,EAEzCG,EAAoBxB,GAAgC,CACxD,GAAI,CAACA,EAAI,MAAO,GAChB,MAAMe,EAAQ,OAAO,iBAAiBf,CAAE,EACxC,OAAOe,EAAM,UAAY,QAClBA,EAAM,aAAe,UACrBA,EAAM,UAAY,KACjBf,EAAmB,YAAc,GACjCA,EAAmB,aAAe,CAC5C,EAEMyB,EAAe,IAAsB,CACzC,MAAMzB,EAAK,SAAS,cAAcoB,CAAQ,EAC1C,OAAQE,EAAA,CACN,IAAK,WACH,OAAOtB,EACT,IAAK,WACH,OAAOA,EAAK,KAAO,SAAS,KAC9B,IAAK,SACH,OAAKA,EACEwB,EAAiBxB,CAAE,EAAI,KAAOA,EADrB,SAAS,KAE3B,IAAK,UACL,QACE,OAAOwB,EAAiBxB,CAAE,EAAIA,EAAK,IAAA,CAEzC,EAEA,OAAO,IAAI,QAAQ,CAACmB,EAASO,IAAW,CACtC,MAAMC,EAASF,EAAA,EACf,GAAIE,EAAQ,CACVR,EAAQG,IAAU,YAAcA,IAAU,SAAW,KAAOK,CAAM,EAClE,MACF,CAEA,MAAMC,EAAW,IAAI,iBAAiB,IAAM,CAC1C,MAAMD,EAASF,EAAA,EACXE,IACFC,EAAS,WAAA,EACT,aAAaC,CAAS,EACtBV,EAAQG,IAAU,YAAcA,IAAU,SAAW,KAAOK,CAAM,EAEtE,CAAC,EAEKE,EAAY,WAAW,IAAM,CACjCD,EAAS,WAAA,EACTF,EAAO,IAAI,MAAM,wBAAwBN,CAAQ,WAAWE,CAAK,EAAE,CAAC,CACtE,EAAGC,CAAO,EAEVK,EAAS,QAAQ,SAAS,gBAAiB,CACzC,UAAW,GACX,QAAS,GACT,WAAY,GACZ,gBAAiB,CAAC,QAAS,QAAS,QAAQ,CAAA,CAC7C,CACH,CAAC,CACH,EAEA,MAAM,YACJE,EACAT,EAAmD,GAC1B,CACzB,KAAM,CAAE,SAAAD,EAAU,QAAAG,EAAU,GAAA,EAAUF,EAEhCU,EAAY,IAAsB,CA1P9C,IAAAlB,EA2PQ,MAAMmB,EAAOZ,EAAW,SAAS,cAAcA,CAAQ,EAAI,SAAS,KACpE,GAAI,CAACY,EAAM,OAAO,KAElB,MAAMC,EAAS,SAAS,iBAAiBD,EAAM,WAAW,SAAS,EACnE,KAAOC,EAAO,YACZ,IAAIpB,EAAAoB,EAAO,YAAY,cAAnB,MAAApB,EAAgC,SAASiB,GAC3C,OAAOG,EAAO,YAAY,cAG9B,OAAO,IACT,EAEA,OAAO,IAAI,QAAQ,CAACd,EAASO,IAAW,CACtC,MAAMC,EAASI,EAAA,EACf,GAAIJ,EAAQ,CACVR,EAAQQ,CAAM,EACd,MACF,CAEA,MAAMC,EAAW,IAAI,iBAAiB,IAAM,CAC1C,MAAMD,EAASI,EAAA,EACXJ,IACFC,EAAS,WAAA,EACT,aAAaC,CAAS,EACtBV,EAAQQ,CAAM,EAElB,CAAC,EAEKE,EAAY,WAAW,IAAM,CACjCD,EAAS,WAAA,EACTF,EAAO,IAAI,MAAM,6BAA6BI,CAAI,GAAG,CAAC,CACxD,EAAGP,CAAO,EAEVK,EAAS,QAAQ,SAAS,gBAAiB,CACzC,UAAW,GACX,QAAS,GACT,cAAe,EAAA,CAChB,CACH,CAAC,CACH,EAEA,MAAM,cAAcR,EAAkBG,EAAU,IAAsB,CACpE,MAAMN,EAAc,gBAAgBG,EAAU,CAAE,MAAO,SAAU,QAAAG,EAAS,CAC5E,EAEA,UAAU5B,EAAc0B,EAA6B,GAAoB,CAxS7E,IAAAR,EAAAC,EAAAoB,EAAAC,EAySM,KAAM,CAAE,KAAA5B,GAASc,EAEXe,EAA0C,CAC9C,OAAQ,CAAC,SAAU,uBAAwB,uBAAwB,qBAAqB,EACxF,KAAM,CAAC,SAAS,EAChB,QAAS,CAAC,oBAAqB,qBAAsB,sBAAuB,yBAA0B,uBAAwB,oBAAqB,oBAAqB,UAAU,EAClL,SAAU,CAAC,wBAAwB,EACnC,MAAO,CAAC,qBAAqB,EAC7B,SAAU,CAAC,QAAQ,EACnB,QAAS,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,IAAI,EAC5C,KAAM,CAAC,KAAM,IAAI,EACjB,SAAU,CAAC,IAAI,EACf,WAAY,CAAC,KAAK,EAClB,KAAM,CAAC,MAAM,EACb,OAAQ,CAAC,QAAQ,EACjB,YAAa,CAAC,QAAQ,EACtB,KAAM,CAAC,MAAM,EACb,IAAK,CAAC,KAAK,EACX,MAAO,CAAC,OAAO,CAAA,EAGXC,EAAwB,CAAA,EAC9BA,EAAW,KAAK,GAAG,SAAS,iBAAiB,UAAU1C,CAAI,IAAI,CAAC,EAEhE,MAAM2C,EAAoBF,EAAczC,CAAI,EAC5C,GAAI2C,EACF,UAAWC,KAAOD,EAChBD,EAAW,KAAK,GAAG,SAAS,iBAAiB,GAAGE,CAAG,cAAc,CAAC,EAItE,GAAI,CAAChC,EAAM,OAAO8B,EAAW,CAAC,GAAK,KAEnC,MAAMG,EAAiBjC,EAAK,YAAA,EAAc,KAAA,EAC1C,UAAWP,KAAMqC,EAAY,CAC3B,MAAMI,GAAY5B,EAAAb,EAAG,aAAa,YAAY,IAA5B,YAAAa,EAA+B,cAAc,OACzD6B,GAAc5B,EAAAd,EAAG,cAAH,YAAAc,EAAgB,cAAc,OAC5CE,GAAQkB,EAAAlC,EAAG,aAAa,OAAO,IAAvB,YAAAkC,EAA0B,cAAc,OAChDS,GAAcR,EAAAnC,EAAG,aAAa,aAAa,IAA7B,YAAAmC,EAAgC,cAAc,OAMlE,GAJIM,IAAcD,GAAkBE,IAAgBF,GAChDxB,IAAUwB,GAAkBG,IAAgBH,GAG5CC,GAAA,MAAAA,EAAW,SAASD,IAAmBE,GAAA,MAAAA,EAAa,SAASF,GAC/D,OAAOxC,CAEX,CAEA,OAAO,IACT,CACJ,EAEK,OAAO,cACV,OAAO,YAAciB,EACrB,OAAO,UAAYA,GAGrB,SAAS2B,GAAgB,CACvB,OAAO,OAAO,cAChB,CAEA,SAASC,EACPC,EAAgC,cAChCC,EAAW,GACXC,EACAC,EAAoB,GACpBC,EAAU,GASV,CACA,GAAI,CAGF,IAASC,EAAT,SAAiB/D,EAA0B,CACzC,OAAOe,EAAgBf,CAAO,CAChC,EAESgE,EAAT,SAAiBhE,EAA0B,CA7X/C,IAAAyB,EAAAC,EA8XM,MAAMjB,EAAMT,EAAQ,QAAQ,YAAA,EAEtBiE,EAAajE,EAAQ,aAAa,iBAAiB,EACzD,GAAIiE,EAAY,CACd,MAAMC,EAAQD,EAAW,MAAM,KAAK,EAAE,IAAIE,GAAM,CAlYxD,IAAA1C,EAmYU,MAAMb,EAAK,SAAS,eAAeuD,CAAE,EACrC,QAAO1C,EAAAb,GAAA,YAAAA,EAAI,cAAJ,YAAAa,EAAiB,SAAU,EACpC,CAAC,EAAE,OAAO,OAAO,EACjB,GAAIyC,EAAM,OAAQ,CAChB,MAAME,EAASF,EAAM,KAAK,GAAG,EAC7B,OAAOE,EAAO,OAAS,IAAMA,EAAO,UAAU,EAAG,GAAG,EAAI,MAAQA,CAClE,CACF,CAEA,GAAI3D,IAAQ,SAAU,CACpB,MAAM4D,EAASrE,EACTsE,EAAWD,EAAO,cAAc,kBAAkB,IACrDA,EAAO,eAAiB,EAAIA,EAAO,QAAQA,EAAO,aAAa,EAAI,MACtE,IAAI5C,EAAA6C,GAAA,YAAAA,EAAU,cAAV,MAAA7C,EAAuB,OAAQ,OAAO6C,EAAS,YAAY,KAAA,CACjE,CAEA,MAAMjB,EAAYrD,EAAQ,aAAa,YAAY,EACnD,GAAIqD,GAAA,MAAAA,EAAW,OAAQ,OAAOA,EAAU,KAAA,EAExC,MAAME,EAAcvD,EAAQ,aAAa,aAAa,EACtD,GAAIuD,GAAA,MAAAA,EAAa,OAAQ,OAAOA,EAAY,KAAA,EAE5C,MAAM3B,EAAQ5B,EAAQ,aAAa,OAAO,EAC1C,GAAI4B,GAAA,MAAAA,EAAO,OAAQ,OAAOA,EAAM,KAAA,EAEhC,MAAM2C,EAAMvE,EAAQ,aAAa,KAAK,EACtC,GAAIuE,GAAA,MAAAA,EAAK,OAAQ,OAAOA,EAAI,KAAA,EAE5B,GAAIvE,EAAQ,GAAI,CACd,MAAMwE,EAAQ,SAAS,cAAc,cAAcxE,EAAQ,EAAE,IAAI,EACjE,IAAI0B,EAAA8C,GAAA,YAAAA,EAAO,cAAP,MAAA9C,EAAoB,OAAQ,OAAO8C,EAAM,YAAY,KAAA,CAC3D,CAEA,GAAI/D,IAAQ,QAAS,CACnB,MAAMgE,EAAQzE,EACRU,EAAOV,EAAQ,aAAa,MAAM,GAAK,GACvC0E,EAAQ1E,EAAQ,aAAa,OAAO,EAC1C,GAAIU,IAAS,WAAYgE,GAAA,MAAAA,EAAO,QAAQ,OAAOA,EAAM,KAAA,EACrD,GAAID,EAAM,OAASA,EAAM,MAAM,OAAS,IAAMA,EAAM,MAAM,KAAA,EAAQ,OAAOA,EAAM,MAAM,KAAA,CACvF,CAEA,GAAI,CAAC,SAAU,IAAK,SAAS,EAAE,SAAShE,CAAG,EAAG,CAC5C,IAAI6C,EAAc,GAClB,UAAWqB,KAAQ3E,EAAQ,WACrB2E,EAAK,WAAa,KAAK,YACzBrB,GAAeqB,EAAK,aAGxB,GAAIrB,EAAY,KAAA,EAAQ,OAAOA,EAAY,KAAA,CAC7C,CAEA,GAAI,WAAW,KAAK7C,CAAG,EAAG,CACxB,MAAMiC,EAAO1C,EAAQ,YACrB,GAAI0C,GAAA,MAAAA,EAAM,OAAQ,CAChB,MAAMkC,EAAIlC,EAAK,KAAA,EACf,OAAOkC,EAAE,OAAS,IAAMA,EAAE,UAAU,EAAG,GAAG,EAAI,MAAQA,CACxD,CACF,CAEA,GAAInE,IAAQ,MAAO,MAAO,GAE1B,IAAIoE,EAAa,GACjB,UAAWF,KAAQ3E,EAAQ,WACrB2E,EAAK,WAAa,KAAK,YACzBE,GAAcF,EAAK,aAGvB,GAAIE,GAAA,MAAAA,EAAY,QAAUA,EAAW,KAAA,EAAO,QAAU,EAAG,CACvD,MAAMnC,EAAOmC,EAAW,KAAA,EACxB,OAAOnC,EAAK,OAAS,IAAMA,EAAK,UAAU,EAAG,GAAG,EAAI,MAAQA,CAC9D,CAEA,MAAO,EACT,EAYSoC,EAAT,SAAsB9E,EAA6B,CACjD,MAAM+E,EAAmB,CAAA,EAEnBC,EAAchF,EAAQ,aAAa,cAAc,EACnDgF,IAAgB,OAAQD,EAAM,QAAU,GACnCC,IAAgB,QAASD,EAAM,QAAU,GACzCC,IAAgB,QAASD,EAAM,QAAU,QACzC/E,aAAmB,mBAAqBA,EAAQ,OAAS,YAAcA,EAAQ,OAAS,WAC3FA,EAAQ,OAAS,YAAcA,EAAQ,cACzC+E,EAAM,QAAU,QAEhBA,EAAM,QAAU/E,EAAQ,SAI5B,MAAMiF,EAAgBjF,aAAmB,mBACnBA,aAAmB,kBACnBA,aAAmB,mBACnBA,aAAmB,qBACrCA,EAAQ,aAAa,eAAe,IAAM,QACzCiF,GAAkBjF,EAA8B,UACjDA,EAAQ,QAAQ,mBAAmB,KACrC+E,EAAM,SAAW,IAGnB,MAAMG,EAAelF,EAAQ,aAAa,eAAe,EACrDkF,IAAiB,OAAQH,EAAM,SAAW,GACrCG,IAAiB,UAASH,EAAM,SAAW,IAEpD,MAAMI,EAAcnF,EAAQ,aAAa,cAAc,EACnDmF,IAAgB,OAAQJ,EAAM,QAAU,GACnCI,IAAgB,QAASJ,EAAM,QAAU,GACzCI,IAAgB,UAASJ,EAAM,QAAU,SAElD,MAAMK,EAAepF,EAAQ,aAAa,eAAe,EACrDoF,IAAiB,OAAQL,EAAM,SAAW,GACrCK,IAAiB,UAASL,EAAM,SAAW,IAEpD,MAAMM,EAAarF,EAAQ,aAAa,cAAc,EAClDqF,GAAcA,IAAe,UAC/BN,EAAM,OAAS,IAGjB,MAAMtE,EAAMT,EAAQ,QAAQ,YAAA,EAC5B,GAAI,WAAW,KAAKS,CAAG,EACrBsE,EAAM,MAAQ,SAAStE,EAAI,CAAC,EAAG,EAAE,MAC5B,CACL,MAAM6E,EAAYtF,EAAQ,aAAa,YAAY,EAC/CsF,IAAWP,EAAM,MAAQ,SAASO,EAAW,EAAE,EACrD,CAEA,OAAOP,CACT,EAESQ,EAAT,SAAyBR,EAA0B,CACjD,MAAMS,EAAkB,CAAA,EAExB,OAAIT,EAAM,UAAY,QACpBS,EAAM,KAAKT,EAAM,UAAY,QAAU,kBAAoBA,EAAM,QAAU,YAAc,aAAa,EAEpGA,EAAM,UAAUS,EAAM,KAAK,YAAY,EACvCT,EAAM,WAAa,QACrBS,EAAM,KAAKT,EAAM,SAAW,aAAe,aAAa,EAEtDA,EAAM,UAAY,QACpBS,EAAM,KAAKT,EAAM,UAAY,QAAU,kBAAoBA,EAAM,QAAU,YAAc,eAAe,EAEtGA,EAAM,WAAa,QACrBS,EAAM,KAAKT,EAAM,SAAW,aAAe,gBAAgB,EAEzDA,EAAM,QAAQS,EAAM,KAAK,UAAU,EACnCT,EAAM,QAAU,QAClBS,EAAM,KAAK,UAAUT,EAAM,KAAK,GAAG,EAG9BS,EAAM,KAAK,GAAG,CACvB,EAESC,EAAT,SAAmBzF,EAA2B,CAC5C,MAAM2B,EAAQ,OAAO,iBAAiB3B,CAAO,EAC7C,OACE2B,EAAM,UAAY,QAClBA,EAAM,aAAe,UACrBA,EAAM,UAAY,KACjB3B,EAAwB,YAAc,GACtCA,EAAwB,aAAe,CAE5C,EAES0F,EAAT,SAAuB1F,EAA2B,CAChD,MAAMS,EAAMT,EAAQ,QAAQ,YAAA,EAC5B,MACE,CAAC,IAAK,SAAU,QAAS,SAAU,WAAY,UAAW,SAAS,EAAE,SAASS,CAAG,GACjFT,EAAQ,aAAa,SAAS,GAC9BA,EAAQ,aAAa,UAAU,GAC/BA,EAAQ,aAAa,MAAM,IAAM,UACjCA,EAAQ,aAAa,MAAM,IAAM,QACjCA,EAAQ,aAAa,iBAAiB,IAAM,MAEhD,EAES2F,EAAT,SAAoB3F,EAA2B,CAC7C,MAAMS,EAAMT,EAAQ,QAAQ,YAAA,EAC5B,MACE,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAAO,OAAQ,SAAU,SAAU,UAAW,UAAW,OAAO,EAAE,SAASS,CAAG,GACnHT,EAAQ,aAAa,MAAM,CAE/B,EAES4F,EAAT,SAA0B5F,EAA2B,CAEnD,OADc,OAAO,iBAAiBA,CAAO,EAChC,SAAW,SAC1B,EAES6F,EAAT,SAAuB7F,EAAkBiC,EAA8E,CACrH,MAAMxB,EAAMT,EAAQ,QAAQ,YAAA,EAG5B,GAFI,CAAC,SAAU,QAAS,OAAQ,OAAQ,QAAS,UAAU,EAAE,SAASS,CAAG,GACrEwB,EAAQ,SAAW,OAASjC,EAAQ,aAAa,aAAa,IAAM,QACpEiC,EAAQ,SAAW,OAAS,CAACwD,EAAUzF,CAAO,EAAG,MAAO,GAE5D,GAAIiC,EAAQ,SAAW,OAAS,CAACA,EAAQ,MAAO,CAC9C,MAAM6D,EAAO9F,EAAQ,sBAAA,EACrB,GAAI,EAAE8F,EAAK,IAAM,OAAO,aAAeA,EAAK,OAAS,GAAKA,EAAK,KAAO,OAAO,YAAcA,EAAK,MAAQ,GACtG,MAAO,EAEX,CAEA,GAAI7D,EAAQ,SAAW,cAAe,OAAOyD,EAAc1F,CAAO,EAGlE,GAFI0F,EAAc1F,CAAO,GACrB2F,EAAW3F,CAAO,GAClBgE,EAAQhE,CAAO,EAAE,OAAS,EAAG,MAAO,GAExC,MAAMO,EAAOwD,EAAQ/D,CAAO,EAG5B,OAAIiC,EAAQ,SACmB,IAAI,IAAI,CAAC,UAAW,QAAS,SAAU,UAAW,UAAW,eAAe,CAAC,EACjF,IAAI1B,CAAI,GAAKyD,EAAQhE,CAAO,EAAE,SAAW,EACzD,GAIJO,IAAS,WAAaA,IAAS,KACxC,EAESwF,EAAT,SAAkB/F,EAAkBgG,EAAyB,CAC3D,MAAMC,EAAkB,CAAA,EAClBhE,EAAU,CAAE,OAAAyB,EAAQ,MAAOE,GAAS,KAAM,QAAAE,CAAA,EAC1CoC,EAAa1C,EAAA,EAEb2C,EAAUN,EAAc7F,EAASiC,CAAO,GAAM2B,GAASoC,IAAU,EAEvE,GAAIG,EAAS,CACX,MAAM5F,EAAOwD,EAAQ/D,CAAO,EACtBmB,EAAO6C,EAAQhE,CAAO,EACtBoG,EAAYtB,EAAa9E,CAAO,EAEhCqG,EAAYnF,EAAelB,EAASO,EAAMY,CAAI,EACpD,OAAO,SAAUkF,CAAS,EAAIrG,EAC9BkG,EAAWG,CAAS,EAAI,CACtB,QAAS,IAAI,QAAQrG,CAAO,EAC5B,KAAAO,EACA,KAAAY,CAAA,EAIF,IAAImF,EAAO,GADI,KAAK,OAAON,CAAK,CACZ,GAAGzF,CAAI,GAC3B,GAAIY,EAAM,CACR,MAAMoF,EAAcpF,EAAK,QAAQ,OAAQ,GAAG,EAAE,QAAQ,KAAM,KAAK,EACjEmF,GAAQ,KAAKC,CAAW,GAC1B,CACAD,GAAQ,KAAKD,CAAS,IAEtB,MAAMG,EAAWjB,EAAgBa,CAAS,EACtCI,IAAUF,GAAQ,IAAIE,CAAQ,IAE9BZ,EAAiB5F,CAAO,IAC1BsG,GAAQ,qBAGV,MAAMG,EAAOzG,EAAQ,aAAa,MAAM,EACpCyG,IAAMH,GAAQ,UAAUG,CAAI,KAEhC,MAAM/F,EAAOV,EAAQ,aAAa,MAAM,EACpCU,IAAM4F,GAAQ,UAAU5F,CAAI,KAEhC,MAAM6C,EAAcvD,EAAQ,aAAa,aAAa,EAClDuD,IAAa+C,GAAQ,iBAAiB/C,CAAW,KAErD0C,EAAM,KAAKK,CAAI,CACjB,CAEA,GAAIN,EAAQrC,EACV,UAAW+C,KAAS1G,EAAQ,SAC1BiG,EAAM,KAAK,GAAGF,EAASW,EAAOP,EAAUH,EAAQ,EAAIA,CAAK,CAAC,EAI9D,OAAOC,CACT,EAESU,EAAT,SAA8BL,EAAsB,CAClD,OAAOA,EAAK,QAAQ,YAAa,OAAO,CAC1C,EAESM,EAAT,SAA0BX,EAAsC,CAC9D,MAAMY,MAAa,IACnB,UAAWP,KAAQL,EAAO,CACxB,GAAI,CAACK,EAAK,OAAQ,SAClB,MAAMQ,EAAOH,EAAqBL,CAAI,EACtCO,EAAO,IAAIC,GAAOD,EAAO,IAAIC,CAAI,GAAK,GAAK,CAAC,CAC9C,CACA,OAAOD,CACT,EAESE,EAAT,SAA2BC,EAAoBC,EAA2D,CACxG,MAAMC,EAAWF,EAAW,MAAM;AAAA,CAAI,EAChCG,EAAWF,EAAW,MAAM;AAAA,CAAI,EAEhCG,EAAYR,EAAiBM,CAAQ,EACrCG,EAAYT,EAAiBO,CAAQ,EAErCG,EAAkB,CAAA,EAClBC,EAAoB,CAAA,EAE1B,UAAWjB,KAAQa,EAAU,CAC3B,GAAI,CAACb,EAAK,OAAQ,SAClB,MAAMQ,EAAOH,EAAqBL,CAAI,EAChCkB,EAAWJ,EAAU,IAAIN,CAAI,GAAK,GACvBO,EAAU,IAAIP,CAAI,GAAK,GACzBU,IACbF,EAAM,KAAKhB,CAAI,EACfc,EAAU,IAAIN,EAAMU,EAAW,CAAC,EAEpC,CAEA,MAAMC,EAAiBb,EAAiBM,CAAQ,EAChD,UAAWZ,KAAQY,EAAU,CAC3B,GAAI,CAACZ,EAAK,OAAQ,SAClB,MAAMQ,EAAOH,EAAqBL,CAAI,EAChCkB,EAAWC,EAAe,IAAIX,CAAI,GAAK,EACvCY,EAAWL,EAAU,IAAIP,CAAI,GAAK,EACpCU,EAAWE,IACbH,EAAQ,KAAKjB,CAAI,EACjBmB,EAAe,IAAIX,EAAMU,EAAW,CAAC,EAEzC,CAEA,GAAIF,EAAM,SAAW,GAAKC,EAAQ,SAAW,EAC3C,MAAO,CAAE,KAAM,eAAgB,WAAY,EAAA,EAG7C,MAAMI,EAAsB,CAAA,EAC5B,OAAIJ,EAAQ,OAAS,GACnBI,EAAU,KAAK,GAAGJ,EAAQ,OAAS,KAAKK,CAAC,EAAE,CAAC,EAE1CN,EAAM,OAAS,GACjBK,EAAU,KAAK,GAAGL,EAAM,OAAS,KAAKM,CAAC,EAAE,CAAC,EAGrC,CAAE,KAAMD,EAAU,KAAK;AAAA,CAAI,EAAG,WAAY,EAAA,CACnD,EAtWA,OAAO,SAAW,CAAA,EAwWlB,MAAMzB,EAAa1C,EAAA,EACnB,IAAIqE,EAA+B,KAEnC,GAAIjE,EAAO,CACT,MAAMkE,EAAU5B,EAAWtC,CAAK,EAChC,GAAI,CAACkE,EACH,MAAO,CACL,MAAO,wBAAwBlE,CAAK,qEACpC,YAAa,GACb,SAAU,CAAE,MAAO,OAAO,WAAY,OAAQ,OAAO,WAAA,CAAY,EAGrE,MAAM5D,EAAU8H,EAAQ,QAAQ,MAAA,EAChC,GAAI,CAAC9H,EACH,cAAOkG,EAAWtC,CAAK,EAChB,CACL,MAAO,wBAAwBA,CAAK,4EACpC,YAAa,GACb,SAAU,CAAE,MAAO,OAAO,WAAY,OAAQ,OAAO,WAAA,CAAY,EAGrEiE,EAAe7H,CACjB,MACE6H,EAAe,SAAS,KAG1B,MAAM5B,EAAQ4B,EAAe9B,EAAS8B,EAAc,CAAC,EAAI,CAAA,EAEzD,UAAW1D,KAAM,OAAO,KAAK+B,CAAU,EAChCA,EAAW/B,CAAE,EAAE,QAAQ,SAC1B,OAAO+B,EAAW/B,CAAE,EAIxB,MAAM4D,EAAU9B,EAAM,KAAK;AAAA,CAAI,EAE/B,GAAI8B,EAAQ,OAAS,IACnB,MAAO,CACL,MAAO,yCAAyCA,EAAQ,MAAM,oEAC9D,YAAa,GACb,SAAU,CAAE,MAAO,OAAO,WAAY,OAAQ,OAAO,WAAA,CAAY,EAIrE,MAAMC,EAAc1G,EAAA,EAEpB,IAAI2G,EACAC,EAAgB,GACpB,MAAMC,EAAe,OAAO,iBAE5B,MAAI,CAACtE,GAAqB,CAACD,GAASuE,GAChC,KAAK,MAAQA,EAAa,UAAY,MAExCF,EADmBlB,EAAkBoB,EAAa,QAASJ,CAAO,EAChD,KAClBG,EAAgB,IAGlB,OAAO,iBAAmB,CAAE,QAAAH,EAAS,UAAW,KAAK,KAAI,EAElD,CACL,YAAaA,EAAU;AAAA;AAAA,aAAkB,OAAO,UAAU,IAAI,OAAO,WAAW,IAChF,KAAMG,EAAgBD,EAAO,OAC7B,SAAU,CAAE,MAAO,OAAO,WAAY,OAAQ,OAAO,WAAA,EACrD,YAAaD,EAAY,OAAS,EAAIA,EAAc,OACpD,iBAAkB,qJAClB,cAAAE,CAAA,CAEJ,OAASE,EAAK,CACZ,MAAO,CACL,MAAO,wCAAwCA,aAAe,MAAQA,EAAI,QAAU,eAAe,GACnG,YAAa,GACb,SAAU,CAAE,MAAO,OAAO,WAAY,OAAQ,OAAO,WAAA,CAAY,CAErE,CACF,CAEA,SAASC,EAAgBC,EAAqB,CAC5C,OAAKA,EAAI,OACL,SAAS,KAAKA,CAAG,GAAK,QAAQ,KAAKA,CAAG,GAAK,QAAQ,KAAKA,CAAG,GAAK,YAAY,KAAKA,CAAG,EAC/E,IAAMA,EAAI,QAAQ,MAAO,MAAM,EAAE,QAAQ,KAAM,KAAK,EAAE,QAAQ,MAAO,KAAK,EAAE,QAAQ,MAAO,KAAK,EAAI,IAEtGA,EAJiB,IAK1B,CAEA,SAASC,GACP7E,EAAgC,cAChCC,EAAW,GACoE,CAC/E,GAAI,CAKF,IAASI,EAAT,SAAiB/D,EAA0B,CACzC,OAAOe,EAAgBf,CAAO,CAChC,EAESgE,EAAT,SAAiBhE,EAA0B,CAh0B/C,IAAAyB,EAAAC,EAi0BM,MAAMjB,EAAMT,EAAQ,QAAQ,YAAA,EAEtBiE,EAAajE,EAAQ,aAAa,iBAAiB,EACzD,GAAIiE,EAAY,CACd,MAAMC,EAAQD,EAAW,MAAM,KAAK,EAAE,IAAIE,GAAM,CAr0BxD,IAAA1C,EAs0BU,MAAMb,EAAK,SAAS,eAAeuD,CAAE,EACrC,QAAO1C,EAAAb,GAAA,YAAAA,EAAI,cAAJ,YAAAa,EAAiB,SAAU,EACpC,CAAC,EAAE,OAAO,OAAO,EACjB,GAAIyC,EAAM,OAAQ,CAChB,MAAME,EAASF,EAAM,KAAK,GAAG,EAC7B,OAAOE,EAAO,OAAS,IAAMA,EAAO,UAAU,EAAG,GAAG,EAAI,MAAQA,CAClE,CACF,CAEA,GAAI3D,IAAQ,SAAU,CACpB,MAAM4D,EAASrE,EACTsE,EAAWD,EAAO,cAAc,kBAAkB,IACrDA,EAAO,eAAiB,EAAIA,EAAO,QAAQA,EAAO,aAAa,EAAI,MACtE,IAAI5C,EAAA6C,GAAA,YAAAA,EAAU,cAAV,MAAA7C,EAAuB,OAAQ,OAAO6C,EAAS,YAAY,KAAA,CACjE,CAEA,MAAMjB,EAAYrD,EAAQ,aAAa,YAAY,EACnD,GAAIqD,GAAA,MAAAA,EAAW,OAAQ,OAAOA,EAAU,KAAA,EAExC,MAAME,EAAcvD,EAAQ,aAAa,aAAa,EACtD,GAAIuD,GAAA,MAAAA,EAAa,OAAQ,OAAOA,EAAY,KAAA,EAE5C,MAAM3B,EAAQ5B,EAAQ,aAAa,OAAO,EAC1C,GAAI4B,GAAA,MAAAA,EAAO,OAAQ,OAAOA,EAAM,KAAA,EAEhC,MAAM2C,EAAMvE,EAAQ,aAAa,KAAK,EACtC,GAAIuE,GAAA,MAAAA,EAAK,OAAQ,OAAOA,EAAI,KAAA,EAE5B,GAAIvE,EAAQ,GAAI,CACd,MAAMwE,EAAQ,SAAS,cAAc,cAAcxE,EAAQ,EAAE,IAAI,EACjE,IAAI0B,EAAA8C,GAAA,YAAAA,EAAO,cAAP,MAAA9C,EAAoB,OAAQ,OAAO8C,EAAM,YAAY,KAAA,CAC3D,CAEA,GAAI/D,IAAQ,QAAS,CACnB,MAAMgE,EAAQzE,EACRU,EAAOV,EAAQ,aAAa,MAAM,GAAK,GACvC0E,EAAQ1E,EAAQ,aAAa,OAAO,EAC1C,GAAIU,IAAS,WAAYgE,GAAA,MAAAA,EAAO,QAAQ,OAAOA,EAAM,KAAA,EACrD,GAAID,EAAM,OAASA,EAAM,MAAM,OAAS,IAAMA,EAAM,MAAM,KAAA,EAAQ,OAAOA,EAAM,MAAM,KAAA,CACvF,CAEA,GAAI,CAAC,SAAU,IAAK,SAAS,EAAE,SAAShE,CAAG,EAAG,CAC5C,IAAI6C,EAAc,GAClB,UAAWqB,KAAQ3E,EAAQ,WACrB2E,EAAK,WAAa,KAAK,YACzBrB,GAAeqB,EAAK,aAGxB,GAAIrB,EAAY,KAAA,EAAQ,OAAOA,EAAY,KAAA,CAC7C,CAEA,GAAI,WAAW,KAAK7C,CAAG,EAAG,CACxB,MAAMiC,EAAO1C,EAAQ,YACrB,GAAI0C,GAAA,MAAAA,EAAM,OAAQ,CAChB,MAAMkC,EAAIlC,EAAK,KAAA,EACf,OAAOkC,EAAE,OAAS,IAAMA,EAAE,UAAU,EAAG,GAAG,EAAI,MAAQA,CACxD,CACF,CAEA,GAAInE,IAAQ,MAAO,MAAO,GAE1B,IAAIoE,EAAa,GACjB,UAAWF,KAAQ3E,EAAQ,WACrB2E,EAAK,WAAa,KAAK,YACzBE,GAAcF,EAAK,aAGvB,GAAIE,GAAA,MAAAA,EAAY,QAAUA,EAAW,KAAA,EAAO,QAAU,EAAG,CACvD,MAAMnC,EAAOmC,EAAW,KAAA,EACxB,OAAOnC,EAAK,OAAS,IAAMA,EAAK,UAAU,EAAG,GAAG,EAAI,MAAQA,CAC9D,CAEA,MAAO,EACT,EAYSoC,EAAT,SAAsB9E,EAA6B,CACjD,MAAM+E,EAAmB,CAAA,EAEnBC,EAAchF,EAAQ,aAAa,cAAc,EACnDgF,IAAgB,OAAQD,EAAM,QAAU,GACnCC,IAAgB,QAASD,EAAM,QAAU,GACzCC,IAAgB,QAASD,EAAM,QAAU,QACzC/E,aAAmB,mBAAqBA,EAAQ,OAAS,YAAcA,EAAQ,OAAS,WAC3FA,EAAQ,OAAS,YAAcA,EAAQ,cACzC+E,EAAM,QAAU,QAEhBA,EAAM,QAAU/E,EAAQ,SAI5B,MAAMiF,EAAgBjF,aAAmB,mBACnBA,aAAmB,kBACnBA,aAAmB,mBACnBA,aAAmB,qBACrCA,EAAQ,aAAa,eAAe,IAAM,QACzCiF,GAAkBjF,EAA8B,UACjDA,EAAQ,QAAQ,mBAAmB,KACrC+E,EAAM,SAAW,IAGnB,MAAMG,EAAelF,EAAQ,aAAa,eAAe,EACrDkF,IAAiB,OAAQH,EAAM,SAAW,GACrCG,IAAiB,UAASH,EAAM,SAAW,IAEpD,MAAMI,EAAcnF,EAAQ,aAAa,cAAc,EACnDmF,IAAgB,OAAQJ,EAAM,QAAU,GACnCI,IAAgB,QAASJ,EAAM,QAAU,GACzCI,IAAgB,UAASJ,EAAM,QAAU,SAElD,MAAMK,EAAepF,EAAQ,aAAa,eAAe,EACrDoF,IAAiB,OAAQL,EAAM,SAAW,GACrCK,IAAiB,UAASL,EAAM,SAAW,IAEpD,MAAMM,EAAarF,EAAQ,aAAa,cAAc,EAClDqF,GAAcA,IAAe,UAC/BN,EAAM,OAAS,IAGjB,MAAMtE,EAAMT,EAAQ,QAAQ,YAAA,EAC5B,GAAI,WAAW,KAAKS,CAAG,EACrBsE,EAAM,MAAQ,SAAStE,EAAI,CAAC,EAAG,EAAE,MAC5B,CACL,MAAM6E,EAAYtF,EAAQ,aAAa,YAAY,EAC/CsF,IAAWP,EAAM,MAAQ,SAASO,EAAW,EAAE,EACrD,CAEA,OAAOP,CACT,EAESQ,EAAT,SAAyBR,EAA0B,CACjD,MAAMS,EAAkB,CAAA,EAExB,OAAIT,EAAM,UAAY,QACpBS,EAAM,KAAKT,EAAM,UAAY,QAAU,kBAAoBA,EAAM,QAAU,YAAc,aAAa,EAEpGA,EAAM,UAAUS,EAAM,KAAK,YAAY,EACvCT,EAAM,WAAa,QACrBS,EAAM,KAAKT,EAAM,SAAW,aAAe,aAAa,EAEtDA,EAAM,UAAY,QACpBS,EAAM,KAAKT,EAAM,UAAY,QAAU,kBAAoBA,EAAM,QAAU,YAAc,eAAe,EAEtGA,EAAM,WAAa,QACrBS,EAAM,KAAKT,EAAM,SAAW,aAAe,gBAAgB,EAEzDA,EAAM,QAAQS,EAAM,KAAK,UAAU,EACnCT,EAAM,QAAU,QAClBS,EAAM,KAAK,UAAUT,EAAM,KAAK,GAAG,EAG9BS,EAAM,KAAK,GAAG,CACvB,EAESC,EAAT,SAAmBzF,EAA2B,CAC5C,MAAM2B,EAAQ,OAAO,iBAAiB3B,CAAO,EAC7C,OACE2B,EAAM,UAAY,QAClBA,EAAM,aAAe,UACrBA,EAAM,UAAY,KACjB3B,EAAwB,YAAc,GACtCA,EAAwB,aAAe,CAE5C,EAES0F,EAAT,SAAuB1F,EAA2B,CAChD,MAAMS,EAAMT,EAAQ,QAAQ,YAAA,EAC5B,MACE,CAAC,IAAK,SAAU,QAAS,SAAU,WAAY,UAAW,SAAS,EAAE,SAASS,CAAG,GACjFT,EAAQ,aAAa,SAAS,GAC9BA,EAAQ,aAAa,UAAU,GAC/BA,EAAQ,aAAa,MAAM,IAAM,UACjCA,EAAQ,aAAa,MAAM,IAAM,QACjCA,EAAQ,aAAa,iBAAiB,IAAM,MAEhD,EAES2F,EAAT,SAAoB3F,EAA2B,CAC7C,MAAMS,EAAMT,EAAQ,QAAQ,YAAA,EAC5B,MACE,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAAO,OAAQ,SAAU,SAAU,UAAW,UAAW,OAAO,EAAE,SAASS,CAAG,GACnHT,EAAQ,aAAa,MAAM,CAE/B,EAES4F,EAAT,SAA0B5F,EAA2B,CAEnD,OADc,OAAO,iBAAiBA,CAAO,EAChC,SAAW,SAC1B,EAESwI,EAAT,SAAkBjI,EAAcY,EAAcnB,EAAkBoG,EAA8B,CAC5F,IAAIqC,EAAMlI,EACNY,IACFsH,GAAO,IAAMJ,EAAgBlH,CAAI,GAGnC,MAAME,EAAMH,EAAelB,EAASO,EAAMY,CAAI,EAC9C,OAAO,SAAUE,CAAG,EAAIrB,EACxByI,GAAO,SAASpH,CAAG,IAEnB,MAAMmF,EAAWjB,EAAgBa,CAAS,EAC1C,OAAII,IAAUiC,GAAO,IAAIjC,CAAQ,IAE7BZ,EAAiB5F,CAAO,IAC1ByI,GAAO,qBAGFA,CACT,EAESC,EAAT,SAAyB1I,EAA0C,CACjE,MAAM+E,EAAgC,CAAA,EAChC0B,EAAOzG,EAAQ,aAAa,MAAM,EACpCyG,MAAY,IAAMA,GACtB,MAAMlD,EAAcvD,EAAQ,aAAa,aAAa,EACtD,OAAIuD,MAAmB,YAAcA,GAC9BwB,CACT,EAESgB,EAAT,SAAkB/F,EAAkBgG,EAAe2C,EAA+B,CAChF,GAAI3C,EAAQrC,EAAU,OAEtB,MAAMlD,EAAMT,EAAQ,QAAQ,YAAA,EAG5B,GAFI,CAAC,SAAU,QAAS,OAAQ,OAAQ,QAAS,UAAU,EAAE,SAASS,CAAG,GACrEiD,IAAW,OAAS1D,EAAQ,aAAa,aAAa,IAAM,QAC5D0D,IAAW,OAAS,CAAC+B,EAAUzF,CAAO,EAAG,OAE7C,GAAI0D,IAAW,MAAO,CACpB,MAAMoC,EAAO9F,EAAQ,sBAAA,EACrB,GAAI,EAAE8F,EAAK,IAAM,OAAO,aAAeA,EAAK,OAAS,GAAKA,EAAK,KAAO,OAAO,YAAcA,EAAK,MAAQ,GACtG,MAEJ,CAEA,MAAMvF,EAAOwD,EAAQ/D,CAAO,EACtBmB,EAAO6C,EAAQhE,CAAO,EACtBoG,EAAYtB,EAAa9E,CAAO,EAEhC4I,EAAkBlD,EAAc1F,CAAO,EACvC6I,EAAelD,EAAW3F,CAAO,EACjC8I,EAAU3H,EAAK,OAAS,EAE9B,IAAIgF,EASJ,GARIzC,IAAW,cACbyC,EAAUyC,EACDlF,IAAW,MACpByC,EAAU,GAEVA,EAAUyC,GAAmBC,GAAgBC,GAAYvI,IAAS,WAAaA,IAAS,MAGtF4F,EAAS,CACX,MAAM4C,EAAS,KAAK,OAAO/C,CAAK,EAC1ByC,EAAMD,EAASjI,EAAMY,EAAMnB,EAASoG,CAAS,EAC7CrB,EAAQ2D,EAAgB1I,CAAO,EAE/BgJ,EAAsB,CAAA,EAC5B,UAAWtC,KAAS1G,EAAQ,SAC1BgJ,EAAS,KAAKtC,CAAK,EAGrB,MAAMuC,EAAcD,EAAS,OAAS,EAChCE,EAAW,OAAO,KAAKnE,CAAK,EAAE,OAAS,EAE7C,GAAI,CAACkE,GAAe,CAACC,EACnBjD,EAAM,KAAK,GAAG8C,CAAM,KAAKN,CAAG,EAAE,MACzB,CACLxC,EAAM,KAAK,GAAG8C,CAAM,KAAKN,CAAG,GAAG,EAC/B,SAAW,CAACU,EAAUC,CAAS,IAAK,OAAO,QAAQrE,CAAK,EACtDkB,EAAM,KAAK,GAAG8C,CAAM,QAAQI,CAAQ,KAAKd,EAAgBe,CAAS,CAAC,EAAE,EAEvE,UAAW1C,KAASsC,EAClBjD,EAASW,EAAOV,EAAQ,EAAG,EAAI,CAEnC,CACF,KACE,WAAWU,KAAS1G,EAAQ,SAC1B+F,EAASW,EAAOV,EAAO2C,CAAc,CAG3C,EA/SA,OAAO,SAAW,CAAA,EAElB,MAAM1C,EAAkB,CAAA,EA+SxBF,EAAS,SAAS,KAAM,EAAG,EAAK,EAEhC,MAAMsD,EAAOpD,EAAM,KAAK;AAAA,CAAI,EAE5B,OAAIoD,EAAK,OAAS,IACT,CACL,MAAO,yCAAyCA,EAAK,MAAM,gDAC3D,KAAM,GACN,SAAU,CAAE,MAAO,OAAO,WAAY,OAAQ,OAAO,WAAA,CAAY,EAI9D,CACL,KAAMA,EAAO;AAAA;AAAA,aAAkB,OAAO,UAAU,IAAI,OAAO,WAAW,IACtE,SAAU,CAAE,MAAO,OAAO,WAAY,OAAQ,OAAO,WAAA,CAAY,CAErE,OAASjB,EAAK,CACZ,MAAO,CACL,MAAO,+BAA+BA,aAAe,MAAQA,EAAI,QAAU,eAAe,GAC1F,KAAM,GACN,SAAU,CAAE,MAAO,OAAO,WAAY,OAAQ,OAAO,WAAA,CAAY,CAErE,CACF,CAEA,SAASkB,GAAsBjI,EAAuD,CACpF,MAAM6E,EAAa1C,EAAA,EACbsE,EAAU5B,EAAW7E,CAAG,EAC9B,IAAIrB,EAaJ,GAXI8H,IACF9H,EAAU8H,EAAQ,QAAQ,MAAA,EACrB9H,GACH,OAAOkG,EAAW7E,CAAG,GAIrB,CAACrB,GAAW,OAAO,WACrBA,EAAU,OAAO,SAASqB,CAAG,GAG3B,CAACrB,EACH,MAAO,CAAE,EAAG,EAAG,EAAG,EAAG,MAAO,WAAWqB,CAAG,oDAAA,EAG5C,MAAMyE,EAAO9F,EAAQ,sBAAA,EACfuJ,EAAI,KAAK,MAAMzD,EAAK,KAAOA,EAAK,MAAQ,CAAC,EACzC0D,EAAI,KAAK,MAAM1D,EAAK,IAAMA,EAAK,OAAS,CAAC,EAE/C,MAAO,CAAE,EAAAyD,EAAG,EAAAC,CAAA,CACd,CAEA,SAASC,GAAapI,EAAaqD,EAAwE,CA7pC3G,IAAAjD,EA8pCE,MAAMyE,EAAa1C,EAAA,EACbsE,EAAU5B,EAAW7E,CAAG,EAC9B,IAAIrB,EAaJ,GAXI8H,IACF9H,EAAU8H,EAAQ,QAAQ,MAAA,EACrB9H,GACH,OAAOkG,EAAW7E,CAAG,GAIrB,CAACrB,GAAW,OAAO,WACrBA,EAAU,OAAO,SAASqB,CAAG,GAG3B,CAACrB,EACH,MAAO,CAAE,QAAS,GAAO,MAAO,WAAWqB,CAAG,oDAAA,EAGhD,MAAMpB,EAAUD,EAAQ,QAAQ,YAAA,EAEhC,GAAI,CACF,GAAIC,IAAY,QAAS,CACvB,MAAMwE,EAAQzE,EACRU,EAAO+D,EAAM,KAAK,YAAA,EAEpB/D,IAAS,YAAcA,IAAS,SAClC+D,EAAM,QAAU,EAAQC,EACxBD,EAAM,cAAc,IAAI,MAAM,SAAU,CAAE,QAAS,EAAA,CAAM,CAAC,IAE1DA,EAAM,MAAQ,OAAOC,CAAK,EAC1BD,EAAM,cAAc,IAAI,MAAM,QAAS,CAAE,QAAS,EAAA,CAAM,CAAC,EACzDA,EAAM,cAAc,IAAI,MAAM,SAAU,CAAE,QAAS,EAAA,CAAM,CAAC,EAE9D,SAAWxE,IAAY,WAAY,CACjC,MAAMyJ,EAAW1J,EACjB0J,EAAS,MAAQ,OAAOhF,CAAK,EAC7BgF,EAAS,cAAc,IAAI,MAAM,QAAS,CAAE,QAAS,EAAA,CAAM,CAAC,EAC5DA,EAAS,cAAc,IAAI,MAAM,SAAU,CAAE,QAAS,EAAA,CAAM,CAAC,CAC/D,SAAWzJ,IAAY,SAAU,CAC/B,MAAMoE,EAASrE,EACT2J,EAAW,OAAOjF,CAAK,EAE7B,IAAIkF,EAAQ,GACZ,UAAWC,KAAUxF,EAAO,QAC1B,GAAIwF,EAAO,QAAUF,KAAYlI,EAAAoI,EAAO,cAAP,YAAApI,EAAoB,UAAWkI,EAAU,CACxEtF,EAAO,MAAQwF,EAAO,MACtBD,EAAQ,GACR,KACF,CAGF,GAAI,CAACA,EACH,MAAO,CAAE,QAAS,GAAO,MAAO,WAAWlF,CAAK,iCAAiCrD,CAAG,EAAA,EAGtFgD,EAAO,cAAc,IAAI,MAAM,SAAU,CAAE,QAAS,EAAA,CAAM,CAAC,CAC7D,SAAWrE,EAAQ,aAAa,iBAAiB,IAAM,OACrDA,EAAQ,YAAc,OAAO0E,CAAK,EAClC1E,EAAQ,cAAc,IAAI,MAAM,QAAS,CAAE,QAAS,EAAA,CAAM,CAAC,MAE3D,OAAO,CAAE,QAAS,GAAO,MAAO,WAAWqB,CAAG,KAAKpB,CAAO,uBAAA,EAG5D,MAAO,CAAE,QAAS,EAAA,CACpB,OAASmI,EAAK,CACZ,MAAO,CAAE,QAAS,GAAO,MAAO,wBAAwBA,aAAe,MAAQA,EAAI,QAAU,eAAe,EAAA,CAC9G,CACF,CAEA,SAAS0B,IAA4E,CApuCrF,IAAArI,EAquCE,GAAI,CACF,MAAMsI,EAAU,SAAS,cAAc,SAAS,EAC1CC,EAAO,SAAS,cAAc,MAAM,EAQ1C,MAAO,CACL,OANWvI,GAFGsI,GAAWC,GAAQ,SAAS,MAEvB,cAAR,YAAAvI,EACT,QAAQ,OAAQ,KACjB,OACA,UAAU,EAAG,OAAU,GAIxB,MAAO,SAAS,MAChB,IAAK,OAAO,SAAS,IAAA,CAEzB,OAAS2G,EAAK,CACZ,MAAO,CACL,KAAM,GACN,MAAO,GACP,IAAK,GACL,MAAO,2BAA2BA,aAAe,MAAQA,EAAI,QAAU,eAAe,EAAA,CAE1F,CACF,CAEA,SAAS6B,GAAgB5I,EAAmD,CAC1E,MAAM6E,EAAa1C,EAAA,EACbsE,EAAU5B,EAAW7E,CAAG,EAC9B,IAAIrB,EAaJ,OAXI8H,IACF9H,EAAU8H,EAAQ,QAAQ,MAAA,EACrB9H,GACH,OAAOkG,EAAW7E,CAAG,GAIrB,CAACrB,GAAW,OAAO,WACrBA,EAAU,OAAO,SAASqB,CAAG,GAG1BrB,GAILA,EAAQ,eAAe,CAAE,SAAU,SAAU,MAAO,SAAU,EACvD,CAAE,QAAS,EAAA,GAJT,CAAE,QAAS,GAAO,MAAO,WAAWqB,CAAG,wDAAA,CAKlD,CAEA,SAAS6I,GACPC,EACA9I,EACA+I,EACAC,EAAmB,iBACmB,CACtC,GAAI,CACF,MAAMC,EAAa,KAAKH,CAAM,EACxBI,EAAK,IAAI,YAAYD,EAAW,MAAM,EACtCE,EAAK,IAAI,WAAWD,CAAE,EAC5B,QAASE,EAAI,EAAGA,EAAIH,EAAW,OAAQG,IACrCD,EAAGC,CAAC,EAAIH,EAAW,WAAWG,CAAC,EAEjC,MAAMC,EAAO,IAAI,KAAK,CAACH,CAAE,EAAG,CAAE,KAAM,YAAa,EAC3CI,EAAO,IAAI,KAAK,CAACD,CAAI,EAAGL,EAAU,CAAE,KAAM,YAAa,EAE7D,IAAIO,EAAoC,KAExC,GAAIvJ,EAAK,CACP,MAAM6E,EAAa1C,EAAA,EACbsE,EAAU5B,EAAW7E,CAAG,EAa9B,GAXIyG,IACF8C,EAAgB9C,EAAQ,QAAQ,MAAA,EAC3B8C,GACH,OAAO1E,EAAW7E,CAAG,GAIrB,CAACuJ,GAAiB,OAAO,WAC3BA,EAAgB,OAAO,SAASvJ,CAAG,GAGjC,CAACuJ,EACH,MAAO,CAAE,QAAS,GAAO,MAAO,WAAWvJ,CAAG,wDAAA,CAElD,SAAW+I,IACTQ,EAAgB,SAAS,iBAAiBR,EAAW,CAAC,EAAGA,EAAW,CAAC,CAAC,EAClE,CAACQ,GACH,MAAO,CAAE,QAAS,GAAO,MAAO,kBAAkBR,EAAW,CAAC,CAAC,KAAKA,EAAW,CAAC,CAAC,GAAA,EAIrF,GAAI,CAACQ,EACH,MAAO,CAAE,QAAS,GAAO,MAAO,mBAAA,EAGlC,GAAIA,EAAc,UAAY,SAAYA,EAAmC,OAAS,OAAQ,CAC5F,MAAMnG,EAAQmG,EACRC,EAAK,IAAI,aACfA,OAAAA,EAAG,MAAM,IAAIF,CAAI,EACjBlG,EAAM,MAAQoG,EAAG,MACjBpG,EAAM,cAAc,IAAI,MAAM,SAAU,CAAE,QAAS,EAAA,CAAM,CAAC,EACnD,CAAE,QAAS,EAAA,CACpB,CAEA,MAAMoG,EAAK,IAAI,aACfA,EAAG,MAAM,IAAIF,CAAI,EAEjB,MAAMG,EAAY,IAAI,UAAU,OAAQ,CACtC,QAAS,GACT,WAAY,GACZ,aAAcD,CAAA,CACf,EAED,OAAAD,EAAc,cAAcE,CAAS,EAC9B,CAAE,QAAS,EAAA,CACpB,OAAS1C,EAAK,CACZ,MAAO,CACL,QAAS,GACT,MAAOA,aAAe,MAAQA,EAAI,QAAU,eAAA,CAEhD,CACF,CAEA,OAAO,QAAQ,UAAU,YAAY,CAAC2C,EAASC,EAAQC,IAAiB,CAj2CxE,IAAAxJ,EAAAC,EAAAoB,EAk2CE,OAAQiI,EAAQ,KAAA,CACd,IAAK,8BAA+B,CAClC,MAAM9I,EAAU8I,EAAQ,SAAW,CAAA,EAEnC,GAAI9I,EAAQ,SAAW,OAAQ,CAC7B,MAAMM,EAASgG,GACbtG,EAAQ,QAAU,cAClBA,EAAQ,OAAS,EAAA,EAEb+F,EAAc1G,EAAA,EAChBiB,EAAO,MACT0I,EAAa,CAAE,MAAO1I,EAAO,MAAO,YAAa,GAAI,SAAUA,EAAO,SAAU,EAEhF0I,EAAa,CACX,YAAa1I,EAAO,KACpB,SAAUA,EAAO,SACjB,YAAayF,EAAY,OAAS,EAAIA,EAAc,OACpD,iBAAkB,oJAAA,CACnB,CAEL,KAAO,CACL,MAAMzF,EAASkB,EACbxB,EAAQ,QAAU,cAClBA,EAAQ,OAAS,GACjBA,EAAQ,MACRA,EAAQ,mBAAqB,GAC7BA,EAAQ,SAAW,EAAA,EAErBgJ,EAAa1I,CAAM,CACrB,CACA,KACF,CACA,IAAK,0BAA2B,CAC9B,MAAMA,EAAS+G,GAAsByB,EAAQ,GAAG,EAChDE,EAAa1I,CAAM,EACnB,KACF,CACA,IAAK,gBAAiB,CACpB,MAAM2D,EAAa1C,EAAA,EACbsE,EAAU5B,EAAW6E,EAAQ,GAAG,EACtC,IAAI/K,EAQJ,GAPI8H,IACF9H,EAAU8H,EAAQ,QAAQ,MAAA,EACrB9H,GAAS,OAAOkG,EAAW6E,EAAQ,GAAG,GAEzC,CAAC/K,GAAW,OAAO,WACrBA,EAAU,OAAO,SAAS+K,EAAQ,GAAG,GAEnC,CAAC/K,EAAS,CACZiL,EAAa,CAAE,MAAO,WAAWF,EAAQ,GAAG,qDAAsD,EAClG,KACF,CACA,GAAIA,EAAQ,SAAW,SAAU,CAC/B,MAAMG,EAAc,IAAI,WAAW,QAAS,CAAE,QAAS,GAAM,WAAY,GAAM,KAAM,OAAQ,OAAQ,EAAG,EACxGlL,EAAQ,cAAckL,CAAW,CACnC,MAAWH,EAAQ,SAAW,SAC5B/K,EAAQ,cAAc,IAAI,WAAW,WAAY,CAAE,QAAS,GAAM,WAAY,GAAM,KAAM,MAAA,CAAQ,CAAC,EAC1F+K,EAAQ,SAAW,QAC5B/K,EAAQ,cAAc,IAAI,WAAW,cAAe,CAAE,QAAS,GAAM,WAAY,GAAM,KAAM,MAAA,CAAQ,CAAC,EAErGA,EAAwB,MAAA,EAE3BiL,EAAa,CAAE,QAAS,GAAM,EAC9B,KACF,CACA,IAAK,aAAc,CACjB,MAAM1I,EAASkH,GAAasB,EAAQ,IAAKA,EAAQ,KAAK,EACtDE,EAAa1I,CAAM,EACnB,KACF,CACA,IAAK,eAAgB,CACnB,GAAI,CACF,MAAM4I,EAAS,SAAS,cAAc,QAAQ,EAC9CA,EAAO,YAAc,iBAAiBJ,EAAQ,IAAI,SAClD,SAAS,gBAAgB,YAAYI,CAAM,EAC3CA,EAAO,OAAA,EACPF,EAAa,CAAE,QAAS,GAAM,CAChC,OAAS7C,EAAK,CACZ6C,EAAa,CAAE,QAAS,GAAO,MAAO7C,aAAe,MAAQA,EAAI,QAAU,OAAOA,CAAG,CAAA,CAAG,CAC1F,CACA,KACF,CACA,IAAK,gBAAiB,CACpB,MAAM7F,EAASuH,GAAA,EACfmB,EAAa1I,CAAM,EACnB,KACF,CACA,IAAK,wBAAyB,CAC5B,GAAI,CACF,MAAM6I,EAAS,SAAS,cAAcL,EAAQ,QAAQ,EACtD,GAAI,CAACK,GAAUA,EAAO,QAAQ,YAAA,IAAkB,SAAU,CACxDH,EAAa,CAAE,MAAO,kCAAkCF,EAAQ,QAAQ,IAAK,EAC7E,KACF,CAEAE,EAAa,CACX,IAAKG,EAAO,IACZ,KAAMA,EAAO,MAAQ,MAAA,CACtB,CACH,OAAShD,EAAK,CACZ6C,EAAa,CAAE,MAAO7C,aAAe,MAAQA,EAAI,QAAU,OAAOA,CAAG,EAAG,CAC1E,CACA,KACF,CACA,IAAK,iBAAkB,CAErB,GAAI,CACF6C,EAAa,CAAE,KAAM,OAAO,MAAQ,KAAM,CAC5C,MAAc,CACZA,EAAa,CAAE,KAAM,KAAM,CAC7B,CACA,KACF,CACA,IAAK,cAAe,CAClB,GAAI,CACF,KAAM,CAAE,KAAA1K,EAAM,KAAAY,EAAM,IAAAkK,CAAA,EAAQN,EACtB7E,EAAa1C,EAAA,EAwBb8H,EArB0C,CAC9C,OAAQ,CAAC,SAAU,uBAAwB,uBAAwB,sBAAuB,iBAAiB,EAC3G,KAAM,CAAC,UAAW,eAAe,EACjC,QAAS,CAAC,oBAAqB,qBAAsB,sBAAuB,yBAA0B,uBAAwB,oBAAqB,oBAAqB,WAAY,kBAAkB,EACtM,SAAU,CAAC,yBAA0B,mBAAmB,EACxD,MAAO,CAAC,sBAAuB,gBAAgB,EAC/C,SAAU,CAAC,SAAU,mBAAmB,EACxC,QAAS,CAAC,mBAAoB,kBAAkB,EAChD,OAAQ,CAAC,SAAU,iBAAiB,EACpC,QAAS,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,kBAAkB,EAChE,WAAY,CAAC,MAAO,qBAAqB,EACzC,KAAM,CAAC,OAAQ,eAAe,EAC9B,IAAK,CAAC,WAAY,cAAc,EAChC,OAAQ,CAAC,SAAU,kBAAmB,sBAAsB,EAC5D,IAAK,CAAC,cAAc,EACpB,SAAU,CAAC,mBAAmB,EAC9B,KAAM,CAAC,eAAe,EACtB,SAAU,CAAC,mBAAmB,CAAA,EAIA/K,CAAI,GAAK,CAAC,UAAUA,CAAI,IAAI,EACtD0C,EAAwB,CAAA,EAE9B,UAAWE,KAAOmI,EAChB,GAAI,CACFrI,EAAW,KAAK,GAAG,SAAS,iBAAiBE,CAAG,CAAC,CACnD,MAAQ,CAAC,CAIX,MAAMoI,EAAUtI,EAAW,OAAOrC,GAAM,CACtC,MAAMe,EAAQ,OAAO,iBAAiBf,CAAE,EACxC,OAAOe,EAAM,UAAY,QAClBA,EAAM,aAAe,UACpBf,EAAmB,YAAc,GACjCA,EAAmB,aAAe,CAC5C,CAAC,EAGD,IAAI4K,EAAUD,EACd,GAAIpK,EAAM,CACR,MAAMsK,EAAYtK,EAAK,YAAA,EACvBqK,EAAUD,EAAQ,OAAO3K,GAAM,CApgDzC,IAAAa,EAAAC,EAAAoB,EAAAC,EAAA2I,EAqgDY,MAAMrI,GAAY5B,EAAAb,EAAG,aAAa,YAAY,IAA5B,YAAAa,EAA+B,cAC3CiB,GAAOhB,EAAAd,EAAG,cAAH,YAAAc,EAAgB,OAAO,cAC9BE,GAAQkB,EAAAlC,EAAG,aAAa,OAAO,IAAvB,YAAAkC,EAA0B,cAClCS,GAAeR,EAAAnC,EAAwB,cAAxB,YAAAmC,EAAqC,cACpD2B,GAASgH,EAAA9K,EAAwB,QAAxB,YAAA8K,EAA+B,cAE9C,OAAOrI,GAAA,YAAAA,EAAW,SAASoI,MACpB/I,GAAA,YAAAA,EAAM,SAAS+I,MACf7J,GAAA,YAAAA,EAAO,SAAS6J,MAChBlI,GAAA,YAAAA,EAAa,SAASkI,MACtB/G,GAAA,YAAAA,EAAO,SAAS+G,GACzB,CAAC,CACH,CAEA,GAAID,EAAQ,SAAW,EAAG,CACxBP,EAAa,CAAE,MAAO,+BAA+B1K,CAAI,IAAIY,EAAO,cAAcA,CAAI,IAAM,EAAE,EAAA,CAAI,EAClG,KACF,CAGA,MAAMwK,EAAUH,EAAQ,IAAI5K,GAAM,CAzhD1C,IAAAa,EA0hDU,MAAMJ,EAAMH,EAAeN,EAAIL,EAAMY,GAAQ,EAAE,EAC/C,cAAO,SAAW,OAAO,UAAY,CAAA,EACrC,OAAO,SAASE,CAAG,EAAIT,EACvBsF,EAAW7E,CAAG,EAAI,CAAE,QAAS,IAAI,QAAQT,CAAE,EAAG,KAAAL,EAAM,KAAMY,GAAQ,EAAA,EAC3D,CAAE,IAAAE,EAAK,MAAMI,EAAAb,EAAG,cAAH,YAAAa,EAAgB,OAAO,MAAM,EAAG,GAAE,CACxD,CAAC,EAGCwJ,EADEI,EACW,CAAE,QAASM,GAEX,CAAE,IAAKA,EAAQ,CAAC,EAAE,IAAK,KAAMA,EAAQ,CAAC,EAAE,IAAA,CAFpB,CAIrC,OAASvD,EAAK,CACZ6C,EAAa,CAAE,MAAO7C,aAAe,MAAQA,EAAI,QAAU,OAAOA,CAAG,EAAG,CAC1E,CACA,KACF,CACA,IAAK,cAAe,CAClB,GAAI,CACF,KAAM,CAAE,KAAA1F,EAAM,MAAAkJ,CAAA,EAAUb,EAClB7E,EAAa1C,EAAA,EAGbX,EAAS,SAAS,iBAAiB,SAAS,KAAM,WAAW,SAAS,EACtE2I,EAAqB,CAAA,EAE3B,KAAO3I,EAAO,YAAY,CACxB,MAAMgJ,EAAWhJ,EAAO,YAAY,aAAe,GAKnD,GAJiB+I,EACbC,EAAS,KAAA,IAAWnJ,EACpBmJ,EAAS,YAAA,EAAc,SAASnJ,EAAK,YAAA,CAAa,EAExC,CACZ,MAAMoJ,EAASjJ,EAAO,YAAY,cAClC,GAAIiJ,GAAU,CAACN,EAAQ,SAASM,CAAM,EAAG,CAEvC,MAAMnK,EAAQ,OAAO,iBAAiBmK,CAAM,EACxCnK,EAAM,UAAY,QAAUA,EAAM,aAAe,UACnD6J,EAAQ,KAAKM,CAAM,CAEvB,CACF,CACF,CAEA,GAAIN,EAAQ,SAAW,EAAG,CACxBP,EAAa,CAAE,MAAO,+BAA+BvI,CAAI,IAAK,EAC9D,KACF,CAGA,MAAM9B,EAAK4K,EAAQ,KAAK,CAAC,EAAGO,KA5kDpC,IAAAtK,EAAAC,EA6kDW,SAAAD,EAAA,EAAE,cAAF,YAAAA,EAAe,SAAU,MAAMC,EAAAqK,EAAE,cAAF,YAAArK,EAAe,SAAU,GAAA,EACzD,CAAC,EAEGnB,EAAOQ,EAAgBH,CAAE,EACzBS,EAAMH,EAAeN,EAAIL,EAAMmC,CAAI,EACzC,OAAO,SAAW,OAAO,UAAY,CAAA,EACrC,OAAO,SAASrB,CAAG,EAAIT,EACvBsF,EAAW7E,CAAG,EAAI,CAAE,QAAS,IAAI,QAAQT,CAAE,EAAG,KAAAL,EAAM,KAAMmC,CAAA,EAE1DuI,EAAa,CAAE,IAAA5J,EAAK,MAAMI,EAAAb,EAAG,cAAH,YAAAa,EAAgB,OAAO,MAAM,EAAG,GAAE,CAAG,CACjE,OAAS2G,EAAK,CACZ6C,EAAa,CAAE,MAAO7C,aAAe,MAAQA,EAAI,QAAU,OAAOA,CAAG,EAAG,CAC1E,CACA,KACF,CACA,IAAK,eAAgB,CACnB,GAAI,CACF,KAAM,CAAE,MAAA5D,GAAUuG,EACZ7E,EAAa1C,EAAA,EAGbwI,EAAS,SAAS,iBAAiB,OAAO,EAChD,IAAIvH,EAAwB,KAE5B,UAAWwH,KAAOD,EAAQ,CACxB,MAAME,GAAUxK,EAAAuK,EAAI,cAAJ,YAAAvK,EAAiB,OAAO,cACxC,GAAIwK,GAAA,MAAAA,EAAS,SAAS1H,EAAM,YAAA,GAAgB,CAE1C,MAAM2H,EAAQF,EAAI,aAAa,KAAK,EAQpC,GAPIE,IACF1H,EAAQ,SAAS,eAAe0H,CAAK,GAGlC1H,IACHA,EAAQwH,EAAI,cAAc,yBAAyB,GAEjDxH,EAAO,KACb,CACF,CAGA,GAAI,CAACA,EAAO,CACV,MAAM2H,EAAa5H,EAAM,YAAA,EACzBC,EAAQ,SAAS,cACf,sBAAsBD,CAAK,6BAA6BA,CAAK,+BACpCA,CAAK,gCAAgCA,CAAK,6BAC5CA,CAAK,MAAA,CAEhC,CAEA,GAAI,CAACC,EAAO,CACVwG,EAAa,CAAE,MAAO,mCAAmCzG,CAAK,IAAK,EACnE,KACF,CAEA,MAAMjE,EAAOQ,EAAgB0D,CAAK,EAC5BpD,EAAMH,EAAeuD,EAAOlE,EAAMiE,CAAK,EAC7C,OAAO,SAAW,OAAO,UAAY,CAAA,EACrC,OAAO,SAASnD,CAAG,EAAIoD,EACvByB,EAAW7E,CAAG,EAAI,CAAE,QAAS,IAAI,QAAQoD,CAAK,EAAG,KAAAlE,EAAM,KAAMiE,CAAA,EAE7DyG,EAAa,CAAE,IAAA5J,EAAK,MAAAmD,EAAO,CAC7B,OAAS4D,EAAK,CACZ6C,EAAa,CAAE,MAAO7C,aAAe,MAAQA,EAAI,QAAU,OAAOA,CAAG,EAAG,CAC1E,CACA,KACF,CACA,IAAK,qBAAsB,CACzB,GAAI,CACF,KAAM,CAAE,SAAApG,GAAa+I,EACf7E,EAAa1C,EAAA,EAGb6I,EAAiBzL,GAAgB,CAtpD/C,IAAAa,EAupDU,MAAMZ,EAAI,iBAAiBD,CAAE,EACvBN,EAAIM,EAAG,sBAAA,EACb,MAAO,CACL,IAAKA,EAAG,QAAQ,YAAA,EAChB,OAAOa,EAAAb,EAAmB,YAAnB,YAAAa,EAA8B,OAAO,MAAM,EAAG,MAAO,KAC5D,IAAK,CACH,EAAG,KAAK,MAAMnB,EAAE,CAAC,EACjB,EAAG,KAAK,MAAMA,EAAE,CAAC,EACjB,MAAO,KAAK,MAAMA,EAAE,KAAK,EACzB,OAAQ,KAAK,MAAMA,EAAE,MAAM,CAAA,EAE7B,OAAQ,CACN,SAAUO,EAAE,SACZ,WAAYA,EAAE,WACd,WAAYA,EAAE,WAAW,MAAM,GAAG,EAAE,CAAC,EAAE,KAAA,EAAO,QAAQ,KAAM,EAAE,EAC9D,MAAOA,EAAE,MACT,gBAAiBA,EAAE,gBACnB,aAAcA,EAAE,aAChB,OAAQA,EAAE,SAAW,QAAUA,EAAE,cAAgB,MAAQA,EAAE,OAAS,KACpE,UAAWA,EAAE,YAAc,OAASA,EAAE,UAAY,KAClD,QAASA,EAAE,OAAA,CACb,CAEJ,EAGA,GAAI,SAAS,KAAKmB,CAAQ,EAAG,CAC3B,MAAM8F,EAAU5B,EAAWlE,CAAQ,EACnC,IAAIhC,EASJ,GARI8H,IACF9H,EAAU8H,EAAQ,QAAQ,MAAA,EACrB9H,GAAS,OAAOkG,EAAWlE,CAAQ,GAEtC,CAAChC,GAAW,OAAO,WACrBA,EAAU,OAAO,SAASgC,CAAQ,GAGhC,CAAChC,EAAS,CACZiL,EAAa,CAAE,MAAO,WAAWjJ,CAAQ,aAAc,EACvD,KACF,CAEAiJ,EAAa,CAAE,OAAQ,CAACoB,EAAcrM,CAAO,CAAC,EAAG,CACnD,KAAO,CAEL,MAAMsM,EAAW,SAAS,iBAAiBtK,CAAQ,EACnD,GAAIsK,EAAS,SAAW,EAAG,CACzBrB,EAAa,CAAE,MAAO,+BAA+BjJ,CAAQ,IAAK,EAClE,KACF,CAEA,MAAMuK,EAAS,MAAM,KAAKD,CAAQ,EAAE,IAAID,CAAa,EACrDpB,EAAa,CAAE,OAAAsB,EAAQ,CACzB,CACF,OAASnE,EAAK,CACZ6C,EAAa,CAAE,MAAO7C,aAAe,MAAQA,EAAI,QAAU,OAAOA,CAAG,EAAG,CAC1E,CACA,KACF,CACA,IAAK,gBAAiB,CACpB,GAAI,CACF,KAAM,CAAE,SAAApG,EAAU,OAAAwK,EAAQ,GAAAC,CAAA,EAAO1B,EAC3B7E,EAAa1C,EAAA,EAGnB,IAAIkJ,EAAqC,KAEzC,GAAI,SAAS,KAAK1K,CAAQ,EAAG,CAC3B,MAAM8F,EAAU5B,EAAWlE,CAAQ,EACnC,IAAIhC,EASJ,GARI8H,IACF9H,EAAU8H,EAAQ,QAAQ,MAAA,EACrB9H,GAAS,OAAOkG,EAAWlE,CAAQ,GAEtC,CAAChC,GAAW,OAAO,WACrBA,EAAU,OAAO,SAASgC,CAAQ,GAGhC,CAAChC,EAAS,CACZiL,EAAa,CAAE,MAAO,WAAWjJ,CAAQ,aAAc,EACvD,KACF,CACA,GAAIhC,EAAQ,UAAY,SAAU,CAChCiL,EAAa,CAAE,MAAO,WAAWjJ,CAAQ,qBAAsB,EAC/D,KACF,CACA0K,EAAW1M,CACb,KAAO,CAEL,GADA0M,EAAW,SAAS,cAAc1K,CAAQ,EACtC,CAAC0K,EAAU,CACbzB,EAAa,CAAE,MAAO,8BAA8BjJ,CAAQ,IAAK,EACjE,KACF,CACA,GAAI0K,EAAS,UAAY,SAAU,CACjCzB,EAAa,CAAE,MAAO,YAAYjJ,CAAQ,sBAAuB,EACjE,KACF,CACF,CAGA,GAAI0K,EAAS,SACX,UAAWC,KAAOD,EAAS,QACzBC,EAAI,SAAW,GAInB,MAAMrI,EAAqB,CAAA,EACrBsI,EAAqB,CAAA,EAGrBC,EAAiBH,EAAS,SAAWF,EAAS,CAACA,EAAO,CAAC,CAAC,EAE9D,UAAWM,KAAOD,EAAgB,CAChC,IAAIjD,EAAQ,GAEZ,UAAW+C,KAAOD,EAAS,QAAS,CAClC,IAAIlB,EAAU,GAWd,GATIiB,IAAO,QACTjB,EAAUmB,EAAI,QAAU,SAASG,EAAK,EAAE,EAC/BL,IAAO,QAChBjB,EAAUmB,EAAI,KAAK,YAAA,EAAc,SAASG,EAAI,aAAa,EAG3DtB,EAAUmB,EAAI,QAAUG,EAGtBtB,EAAS,CACXmB,EAAI,SAAW,GACfrI,EAAS,KAAKqI,EAAI,KAAK,EACvB/C,EAAQ,GACR,KACF,CACF,CAEKA,GAAOgD,EAAS,KAAKE,CAAG,CAC/B,CAGAJ,EAAS,cAAc,IAAI,MAAM,SAAU,CAAE,QAAS,EAAA,CAAM,CAAC,EAEzDE,EAAS,OAAS,EACpB3B,EAAa,CACX,SAAA3G,EACA,QAAS,qBAAqBsI,EAAS,KAAK,IAAI,CAAC,EAAA,CAClD,EAED3B,EAAa,CAAE,SAAA3G,EAAU,CAE7B,OAAS8D,EAAK,CACZ6C,EAAa,CAAE,MAAO7C,aAAe,MAAQA,EAAI,QAAU,OAAOA,CAAG,EAAG,CAC1E,CACA,KACF,CACA,IAAK,mBAAoB,CACvB,GAAI,CACF,KAAM,CAAE,IAAA/G,GAAQ0J,EACV7E,EAAa1C,EAAA,EACbsE,EAAU5B,EAAW7E,CAAG,EAE9B,IAAIrB,EASJ,GARI8H,IACF9H,EAAU8H,EAAQ,QAAQ,MAAA,EACrB9H,GAAS,OAAOkG,EAAW7E,CAAG,GAEjC,CAACrB,GAAW,OAAO,WACrBA,EAAU,OAAO,SAASqB,CAAG,GAG3B,CAACrB,EAAS,CACZiL,EAAa,CAAE,MAAO,WAAW5J,CAAG,aAAc,EAClD,KACF,CAEA4J,EAAa,CAAE,OAAMnI,EAAA9C,EAAQ,cAAR,YAAA8C,EAAqB,SAAU,GAAI,CAC1D,OAASsF,EAAK,CACZ6C,EAAa,CAAE,MAAO7C,aAAe,MAAQA,EAAI,QAAU,OAAOA,CAAG,EAAG,CAC1E,CACA,KACF,CACA,IAAK,oBAAqB,CACxB,MAAM7F,EAAS0H,GAAgBc,EAAQ,GAAG,EAC1CE,EAAa1I,CAAM,EACnB,KACF,CACA,IAAK,eAAgB,CACnB,MAAMA,EAAS2H,GAAYa,EAAQ,OAAQA,EAAQ,IAAKA,EAAQ,WAAYA,EAAQ,QAAQ,EAC5FE,EAAa1I,CAAM,EACnB,KACF,CACA,IAAK,mBAAoB,CACvB,KAAM,CAAE,SAAAP,EAAU,MAAAE,EAAQ,UAAW,QAAAC,EAAU,KAAU4I,EACnDgC,EAAa,KAAK,IAAI5K,EAAS,GAAK,EAEpCC,EAAoBxB,GAAgC,CACxD,GAAI,CAACA,EAAI,MAAO,GAChB,MAAMe,EAAQ,OAAO,iBAAiBf,CAAE,EACxC,OAAOe,EAAM,UAAY,QAClBA,EAAM,aAAe,UACrBA,EAAM,UAAY,KACjBf,EAAmB,YAAc,GACjCA,EAAmB,aAAe,CAC5C,EAEMyB,EAAe,IAAe,CAClC,MAAMzB,EAAK,SAAS,cAAcoB,CAAQ,EAC1C,OAAQE,EAAA,CACN,IAAK,WAAY,MAAO,CAAC,CAACtB,EAC1B,IAAK,WAAY,MAAO,CAACA,EACzB,IAAK,SAAU,MAAO,CAACA,GAAM,CAACwB,EAAiBxB,CAAE,EACjD,IAAK,UACL,QAAS,OAAOwB,EAAiBxB,CAAE,CAAA,CAEvC,EAEMoM,EAAY,KAAK,IAAA,EAmCvB,OAhCS,IAAI,QAASjL,GAAY,CAC9B,GAAIM,IAAgB,CAClBN,EAAQ,CAAE,QAAS,GAAM,OAAQ,KAAK,IAAA,EAAQiL,EAAW,EACzD,MACF,CAEA,MAAMxK,EAAW,IAAI,iBAAiB,IAAM,CACtCH,MACFG,EAAS,WAAA,EACT,aAAaC,CAAS,EACtBV,EAAQ,CAAE,QAAS,GAAM,OAAQ,KAAK,IAAA,EAAQiL,EAAW,EAE7D,CAAC,EAEKvK,EAAY,WAAW,IAAM,CACjCD,EAAS,WAAA,EACTT,EAAQ,CACN,QAAS,GACT,OAAQ,KAAK,IAAA,EAAQiL,EACrB,MAAO,wBAAwBhL,CAAQ,WAAWE,CAAK,EAAA,CACxD,CACH,EAAG6K,CAAU,EAEbvK,EAAS,QAAQ,SAAS,gBAAiB,CACzC,UAAW,GACX,QAAS,GACT,WAAY,GACZ,gBAAiB,CAAC,QAAS,QAAS,SAAU,UAAU,CAAA,CACzD,CACH,CAAC,EAGgB,KAAMyK,GAAe,CACtC,GAAI,CAACA,EAAW,QAAS,CACvBhC,EAAa,CACX,MAAOgC,EAAW,MAClB,OAAQA,EAAW,OACnB,YAAa,GACb,SAAU,CAAE,MAAO,OAAO,WAAY,OAAQ,OAAO,WAAA,CAAY,CAClE,EACD,MACF,CACA,MAAMC,EAAazJ,EAA0B,cAAe,GAAI,OAAW,EAAI,EAC/EwH,EAAa,CAAE,GAAGiC,EAAY,OAAQD,EAAW,OAAQ,CAC3D,CAAC,EACM,EACT,CACA,IAAK,eAAgB,CACnB,KAAM,CAAE,QAAAE,EAAS,QAAAhL,EAAU,GAAA,EAAU4I,EAC/BgC,EAAa,KAAK,IAAI5K,EAAS,GAAK,EAEpCiL,EAAkBC,GAAyB,CAC/C,GAAIF,EAAQ,SAAS,GAAG,EAAG,CACzB,MAAMG,EAAeH,EAClB,QAAQ,qBAAsB,MAAM,EACpC,QAAQ,QAAS,gBAAgB,EACjC,QAAQ,MAAO,OAAO,EACtB,QAAQ,kBAAmB,IAAI,EAClC,OAAO,IAAI,OAAO,IAAIG,CAAY,GAAG,EAAE,KAAKD,CAAG,CACjD,CACA,OAAOA,EAAI,SAASF,CAAO,CAC7B,EAEMH,EAAY,KAAK,IAAA,EAyCvB,OAtCS,IAAI,QAASjL,GAAY,CAC9B,GAAIqL,EAAe,OAAO,SAAS,IAAI,EAAG,CACxCrL,EAAQ,CAAE,QAAS,GAAM,OAAQ,KAAK,IAAA,EAAQiL,EAAW,EACzD,MACF,CAEA,IAAIO,EAAW,GACf,MAAMC,EAAW,IAAM,CACjBD,GACAH,EAAe,OAAO,SAAS,IAAI,IACrCG,EAAW,GACX,cAAcE,CAAU,EACxB,aAAahL,CAAS,EACtB,OAAO,oBAAoB,WAAY+K,CAAQ,EAC/C,OAAO,oBAAoB,aAAcA,CAAQ,EACjDzL,EAAQ,CAAE,QAAS,GAAM,OAAQ,KAAK,IAAA,EAAQiL,EAAW,EAE7D,EAEMS,EAAa,YAAYD,EAAU,GAAG,EACtC/K,EAAY,WAAW,IAAM,CAC7B8K,IACJA,EAAW,GACX,cAAcE,CAAU,EACxB,OAAO,oBAAoB,WAAYD,CAAQ,EAC/C,OAAO,oBAAoB,aAAcA,CAAQ,EACjDzL,EAAQ,CACN,QAAS,GACT,OAAQ,KAAK,IAAA,EAAQiL,EACrB,MAAO,qCAAqCG,CAAO,eAAe,OAAO,SAAS,IAAI,EAAA,CACvF,EACH,EAAGJ,CAAU,EAEb,OAAO,iBAAiB,WAAYS,CAAQ,EAC5C,OAAO,iBAAiB,aAAcA,CAAQ,CAChD,CAAC,EAGU,KAAMP,GAAe,CAChC,GAAI,CAACA,EAAW,QAAS,CACvBhC,EAAa,CACX,MAAOgC,EAAW,MAClB,OAAQA,EAAW,OACnB,YAAa,GACb,SAAU,CAAE,MAAO,OAAO,WAAY,OAAQ,OAAO,WAAA,CAAY,CAClE,EACD,MACF,CACA,MAAMC,EAAazJ,EAA0B,cAAe,GAAI,OAAW,EAAI,EAC/EwH,EAAa,CAAE,GAAGiC,EAAY,OAAQD,EAAW,OAAQ,CAC3D,CAAC,EACM,EACT,CACA,IAAK,sBAAuB,CAC1B,KAAM,CAAE,OAAAS,EAAS,IAAK,QAAAvL,EAAU,KAAS4I,EACnCgC,EAAa,KAAK,IAAI5K,EAAS,GAAK,EACpC6K,EAAY,KAAK,IAAA,EAgDvB,OA7CS,IAAI,QAASjL,GAAY,CAC9B,IAAI4L,EAAmB,KAAK,IAAA,EACxBJ,EAAW,GAEf,MAAMK,EAAiB,IAAM,CAC3B,GAAIL,EAAU,OACgB,KAAK,IAAA,EAAQI,GACdD,IAC3BH,EAAW,GACX/K,EAAS,WAAA,EACT,aAAaC,CAAS,EACtB,cAAcoL,CAAa,EAC3B9L,EAAQ,CAAE,QAAS,GAAM,OAAQ,KAAK,IAAA,EAAQiL,EAAW,EAE7D,EAEMxK,EAAW,IAAI,iBAAiB,IAAM,CAC1CmL,EAAmB,KAAK,IAAA,CAC1B,CAAC,EAEKlL,EAAY,WAAW,IAAM,CAC7B8K,IACJA,EAAW,GACX/K,EAAS,WAAA,EACT,cAAcqL,CAAa,EAC3B9L,EAAQ,CACN,QAAS,GACT,OAAQ,KAAK,IAAA,EAAQiL,EACrB,MAAO,yCAAyCD,CAAU,IAAA,CAC3D,EACH,EAAGA,CAAU,EAEPc,EAAgB,YAAYD,EAAgB,KAAK,IAAI,GAAI,KAAK,IAAI,GAAIF,EAAS,CAAC,CAAC,CAAC,EAExFlL,EAAS,QAAQ,SAAS,gBAAiB,CACzC,UAAW,GACX,QAAS,GACT,WAAY,GACZ,cAAe,EAAA,CAChB,EAEDoL,EAAA,CACF,CAAC,EAGgB,KAAMX,GAAe,CACtC,GAAI,CAACA,EAAW,QAAS,CACvBhC,EAAa,CACX,MAAOgC,EAAW,MAClB,OAAQA,EAAW,OACnB,YAAa,GACb,SAAU,CAAE,MAAO,OAAO,WAAY,OAAQ,OAAO,WAAA,CAAY,CAClE,EACD,MACF,CACA,MAAMC,EAAazJ,EAA0B,cAAe,GAAI,OAAW,EAAI,EAC/EwH,EAAa,CAAE,GAAGiC,EAAY,OAAQD,EAAW,OAAQ,CAC3D,CAAC,EACM,EACT,CACA,IAAK,YAAa,CAChB,KAAM,CAAE,KAAAa,GAAS/C,EACjB,GAAI,CAAC,MAAM,QAAQ+C,CAAI,EACrB,OAAA7C,EAAa,CAAE,MAAO,8CAA+C,EAC9D,GAET,MAAM/E,EAAa1C,EAAA,EACbmI,EAA+D,CAAA,EACrE,UAAWoC,KAAQD,EAAM,CACvB,KAAM,CAAE,IAAAzM,EAAK,MAAAqD,CAAA,EAAUqJ,EACvB,GAAI,CAAC1M,EAAK,CACRsK,EAAQ,KAAK,CAAE,IAAKtK,GAAO,UAAW,QAAS,GAAO,MAAO,cAAe,EAC5E,QACF,CACA,MAAMyG,EAAU5B,EAAW7E,CAAG,EAC9B,GAAI,CAACyG,EAAS,CACZ6D,EAAQ,KAAK,CAAE,IAAAtK,EAAK,QAAS,GAAO,MAAO,0CAA2C,EACtF,QACF,CACA,MAAMT,EAAKkH,EAAQ,QAAQ,MAAA,EAC3B,GAAI,CAAClH,EAAI,CACP,OAAOsF,EAAW7E,CAAG,EACrBsK,EAAQ,KAAK,CAAE,IAAAtK,EAAK,QAAS,GAAO,MAAO,2BAA4B,EACvE,QACF,CACA,GAAI,CACF,GAAIT,aAAc,iBAAkB,CAClC,MAAMoN,EAAYpN,EAAG,KAAK,YAAA,EAC1B,GAAIoN,IAAc,YAAcA,IAAc,QAAS,CACrD,MAAMC,EAAcvJ,IAAU,IAAQA,IAAU,QAAUA,IAAU,KAAOA,IAAU,UACrF9D,EAAG,QAAUqN,EACbrN,EAAG,cAAc,IAAI,MAAM,SAAU,CAAE,QAAS,EAAA,CAAM,CAAC,CACzD,MACEA,EAAG,MAAA,EACHA,EAAG,MAAQ,OAAO8D,CAAK,EACvB9D,EAAG,cAAc,IAAI,MAAM,QAAS,CAAE,QAAS,EAAA,CAAM,CAAC,EACtDA,EAAG,cAAc,IAAI,MAAM,SAAU,CAAE,QAAS,EAAA,CAAM,CAAC,EAEzD+K,EAAQ,KAAK,CAAE,IAAAtK,EAAK,QAAS,GAAM,CACrC,MAAWT,aAAc,qBACvBA,EAAG,MAAA,EACHA,EAAG,MAAQ,OAAO8D,CAAK,EACvB9D,EAAG,cAAc,IAAI,MAAM,QAAS,CAAE,QAAS,EAAA,CAAM,CAAC,EACtDA,EAAG,cAAc,IAAI,MAAM,SAAU,CAAE,QAAS,EAAA,CAAM,CAAC,EACvD+K,EAAQ,KAAK,CAAE,IAAAtK,EAAK,QAAS,GAAM,GAC1BT,aAAc,mBACvBA,EAAG,MAAQ,OAAO8D,CAAK,EACvB9D,EAAG,cAAc,IAAI,MAAM,SAAU,CAAE,QAAS,EAAA,CAAM,CAAC,EACvD+K,EAAQ,KAAK,CAAE,IAAAtK,EAAK,QAAS,GAAM,GAC1BT,EAAG,mBACZA,EAAG,MAAA,EACHA,EAAG,YAAc,OAAO8D,CAAK,EAC7B9D,EAAG,cAAc,IAAI,MAAM,QAAS,CAAE,QAAS,EAAA,CAAM,CAAC,EACtD+K,EAAQ,KAAK,CAAE,IAAAtK,EAAK,QAAS,GAAM,GAEnCsK,EAAQ,KAAK,CAAE,IAAAtK,EAAK,QAAS,GAAO,MAAO,0BAA2B,CAE1E,OAAS6M,EAAG,CACVvC,EAAQ,KAAK,CAAE,IAAAtK,EAAK,QAAS,GAAO,MAAO6M,aAAa,MAAQA,EAAE,QAAU,OAAOA,CAAC,EAAG,CACzF,CACF,CACA,MAAMC,EAASxC,EAAQ,OAAOrL,GAAK,CAACA,EAAE,OAAO,EAC7C,OAAA2K,EAAa,CACX,QAASkD,EAAO,SAAW,EAC3B,OAAQxC,EAAQ,OAAOrL,GAAKA,EAAE,OAAO,EAAE,OACvC,OAAQ6N,EAAO,OACf,QAAAxC,CAAA,CACD,EACM,EACT,CACA,IAAK,0BAA2B,CAC9B,KAAM,CAAE,IAAAtK,GAAQ0J,EAChB,GAAI,CAAC1J,EACH,OAAA4J,EAAa,CAAE,MAAO,kBAAmB,EAClC,GAET,MAAM/E,EAAa1C,EAAA,EACbsE,EAAU5B,EAAW7E,CAAG,EAC9B,GAAI,CAACyG,EACH,OAAAmD,EAAa,CAAE,MAAO,0CAA2C,EAC1D,GAET,MAAMrK,EAAKkH,EAAQ,QAAQ,MAAA,EAC3B,GAAI,CAAClH,EACH,cAAOsF,EAAW7E,CAAG,EACrB4J,EAAa,CAAE,MAAO,2BAA4B,EAC3C,GAET,GAAI,EAAErK,aAAc,mBAAqBA,EAAG,OAAS,OACnD,OAAAqK,EAAa,CAAE,MAAO,8BAA+B,EAC9C,GAET,MAAMmD,EAAW,aAAa,KAAK,IAAA,CAAK,GACxC,OAAAxN,EAAG,aAAa,kBAAmBwN,CAAQ,EAC3CnD,EAAa,CAAE,SAAU,qBAAqBmD,CAAQ,KAAM,EACrD,EACT,CACA,IAAK,wBAAyB,CAC5B,KAAM,CAAE,QAAAjM,EAAU,GAAA,EAAU4I,EACtBgC,EAAa,KAAK,IAAI5K,EAAS,GAAK,EAEpCkM,EAAa,CACjB,kBAAmB,wBAAyB,uBAC5C,uBAAwB,eAAgB,uBACxC,YAAa,MAAO,WAAY,QAAS,aAAc,aACvD,eAAgB,cAAe,eAAgB,cAC/C,YAAa,cAAe,WAAY,cAAe,QACvD,WAAY,UAAW,WAAA,EAGnBC,EAAmB,CAAC,MAAO,QAAS,OAAQ,MAAM,EAElDC,EAAkBlB,GACfgB,EAAW,KAAKlB,GAAWE,EAAI,SAASF,CAAO,CAAC,EAGnDqB,EAAiBC,GAA8C,CACnE,MAAM/N,EAAO+N,EAAM,eAAiB,UAEpC,MADI,GAAAH,EAAiB,SAAS5N,CAAI,GAC9B,8DAA8D,KAAK+N,EAAM,IAAI,EAEnF,EAEMC,EAAqB,IAAmC,CAC5D,MAAMC,EAAM,YAAY,IAAA,EAExB,OADkB,YAAY,iBAAiB,UAAU,EACxC,OAAOF,GAAS,CAI/B,GAHIA,EAAM,cAAgB,GACtBA,EAAM,KAAK,WAAW,OAAO,GAC7BA,EAAM,KAAK,OAAS,KACpBF,EAAeE,EAAM,IAAI,EAAG,MAAO,GACvC,MAAMG,EAAkBD,EAAMF,EAAM,UAEpC,MADI,EAAAG,EAAkB,KAClBJ,EAAcC,CAAK,GAAKG,EAAkB,IAEhD,CAAC,CACH,EAEM5B,EAAY,KAAK,IAAA,EAwBvB,OArBS,IAAI,QAASjL,GAAY,CAC9B,MAAM8M,EAAQ,IAAM,CAClB,MAAMC,EAAUJ,EAAA,EACVK,EAAU,KAAK,IAAA,EAAQ/B,EAE7B,GAAI8B,EAAQ,SAAW,EAAG,CACxB/M,EAAQ,CAAE,QAAS,GAAM,OAAQgN,EAAS,EAC1C,MACF,CAEA,GAAIA,GAAWhC,EAAY,CACzBhL,EAAQ,CAAE,QAAS,GAAO,OAAQgN,EAAS,aAAcD,EAAQ,OAAQ,EACzE,MACF,CAEA,WAAWD,EAAO,GAAG,CACvB,EACAA,EAAA,CACF,CAAC,EAGW,KAAM5B,GAAe,CACjC,GAAI,CAACA,EAAW,QAAS,CACvBhC,EAAa,CACX,MAAO,0BAA0BgC,EAAW,MAAM,OAAOA,EAAW,YAAY,qBAChF,OAAQA,EAAW,OACnB,YAAa,GACb,SAAU,CAAE,MAAO,OAAO,WAAY,OAAQ,OAAO,WAAA,CAAY,CAClE,EACD,MACF,CACA,MAAMC,EAAazJ,EAA0B,cAAe,GAAI,OAAW,EAAI,EAC/EwH,EAAa,CAAE,GAAGiC,EAAY,OAAQD,EAAW,OAAQ,CAC3D,CAAC,EACM,EACT,CACA,IAAK,cAAe,CAClB,KAAM,CAAE,KAAA+B,EAAM,cAAAC,EAAe,MAAAC,CAAA,EAAUnE,EACjCS,EAAU2D,GAAeH,EAAMC,GAAiB,GAAOC,GAAS,EAAE,EACxEjE,EAAa,CAAE,MAAO+D,EAAM,MAAOxD,EAAQ,OAAQ,QAAAA,EAAS,EAC5D,KACF,CACA,IAAK,oCAAqC,CACxC,MAAMtF,EAAa1C,EAAA,EACb8I,EAAiH,CAAA,EAEvH,SAAW,CAACjL,EAAKoN,CAAK,IAAK,OAAO,QAAQvI,CAAU,EAAG,CACrD,MAAMtF,EAAK6N,EAAM,QAAQ,MAAA,EACzB,GAAI,CAAC7N,EAAI,SAET,MAAMkF,EAAOlF,EAAG,sBAAA,EACZkF,EAAK,OAAS,GAAKA,EAAK,QAAU,GAClCA,EAAK,OAAS,GAAKA,EAAK,IAAM,OAAO,aACrCA,EAAK,MAAQ,GAAKA,EAAK,KAAO,OAAO,YAEzCwG,EAAS,KAAK,CACZ,IAAAjL,EACA,IAAKT,EAAG,QAAQ,YAAA,EAChB,OAAQ,CACN,EAAGkF,EAAK,EACR,EAAGA,EAAK,EACR,MAAOA,EAAK,MACZ,OAAQA,EAAK,MAAA,CACf,CACD,CACH,CAEAmF,EAAa,CAAE,SAAAqB,EAAU,EACzB,KACF,CACA,QACE,MAAO,EAAA,CAEX,MAAO,EACT,CAAC,EAED,SAAS6C,GAAeH,EAAcC,EAAwBC,EAAe,CAC3E,MAAM1D,EAMD,CAAA,EAEC4D,EAAaH,EAAgBD,EAAOA,EAAK,YAAA,EACzCnM,EAAS,SAAS,iBAAiB,SAAS,KAAM,WAAW,SAAS,EACtEqD,EAAa1C,EAAA,EACnB,IAAI6L,EAAa,EAEjB,KAAOxM,EAAO,SAAA,GAAc2I,EAAQ,OAAS0D,GAAO,CAClD,MAAMvK,EAAO9B,EAAO,YACdS,EAAcqB,EAAK,aAAe,GAClC2K,EAAWL,EAAgB3L,EAAcA,EAAY,YAAA,EAE3D,IAAIiM,EAAM,EACV,MAAQA,EAAMD,EAAS,QAAQF,EAAYG,CAAG,KAAO,IAAM/D,EAAQ,OAAS0D,GAAO,CACjF,MAAMpD,EAASnH,EAAK,cACpB,GAAI,CAACmH,EAAQ,CAAEyD,IAAO,QAAU,CAEhC,MAAMC,EAAQ,SAAS,YAAA,EACvBA,EAAM,SAAS7K,EAAM4K,CAAG,EACxBC,EAAM,OAAO7K,EAAM,KAAK,IAAI4K,EAAMP,EAAK,OAAQ1L,EAAY,MAAM,CAAC,EAClE,MAAMwC,EAAO0J,EAAM,sBAAA,EAEnB,GAAI1J,EAAK,QAAU,GAAKA,EAAK,SAAW,EAAG,CAAEyJ,IAAO,QAAU,CAE9D,MAAME,EAAW9K,EAAK,aAAe,GAC/B+K,EAAe,KAAK,IAAI,EAAGH,EAAM,EAAE,EACnCI,EAAa,KAAK,IAAIF,EAAS,OAAQF,EAAMP,EAAK,OAAS,EAAE,EAC7DY,EAAUH,EAAS,MAAMC,EAAcC,CAAU,EAAE,KAAA,EAEzD,IAAIE,EAA4B,KAChC,SAAW,CAACxO,EAAKoN,CAAK,IAAK,OAAO,QAAQvI,CAAU,EAAG,CACrD,MAAMtF,EAAK6N,EAAM,QAAQ,MAAA,EACzB,GAAI7N,IAAOA,IAAOkL,GAAUlL,EAAG,SAASkL,CAAM,GAAI,CAChD+D,EAAaxO,EACb,KACF,CACF,CAEAmK,EAAQ,KAAK,CACX,IAAK,IAAI,EAAE6D,CAAU,GACrB,KAAMI,EAAS,MAAMF,EAAKA,EAAMP,EAAK,MAAM,EAC3C,QAAAY,EACA,OAAQ,CACN,EAAG,KAAK,MAAM9J,EAAK,CAAC,EACpB,EAAG,KAAK,MAAMA,EAAK,CAAC,EACpB,MAAO,KAAK,MAAMA,EAAK,KAAK,EAC5B,OAAQ,KAAK,MAAMA,EAAK,MAAM,CAAA,EAEhC,WAAA+J,CAAA,CACD,EAEDN,GACF,CACF,CAEA,OAAO/D,CACT"}