@geektech/tsone 0.2.1 → 0.3.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.
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../lib/dom/index.ts"],
4
4
  "sourcesContent": [
5
- "/**\n * 零依赖最小 DOM 实现。\n *\n * 供 SSR(CLI 项目渲染、docs 静态构建)与测试环境使用,\n * 覆盖 TSone 框架与测试实际依赖的 DOM 面(节点树、事件、CSS 选择器、\n * innerHTML 序列化/解析、history/location/localStorage 等)。\n * 仅面向本项目所需场景,不追求完整浏览器兼容。\n */\n\nexport const enum DomNodeType {\n ELEMENT_NODE = 1,\n TEXT_NODE = 3,\n COMMENT_NODE = 8,\n DOCUMENT_NODE = 9,\n DOCUMENT_FRAGMENT_NODE = 11,\n}\n\nexport class DOMException extends Error {\n public readonly code: number;\n\n constructor(message: string, name = 'Error') {\n super(message);\n this.name = name;\n this.code = 0;\n }\n}\n\ntype EventListenerRecord =\n | ((event: Event) => void)\n | { handleEvent(event: Event): void };\n\ninterface ListenerEntry {\n listener: EventListenerRecord;\n capture: boolean;\n once: boolean;\n passive: boolean;\n}\n\n/**\n * EventTarget 基类:addEventListener / removeEventListener / dispatchEvent。\n */\nexport class EventTarget {\n private readonly listenerMap = new Map<string, ListenerEntry[]>();\n\n public addEventListener(\n type: string,\n listener: EventListenerRecord | null,\n options?: boolean | AddEventListenerOptions\n ): void {\n if (!listener) {\n return;\n }\n const capture =\n typeof options === 'boolean' ? options : (options?.capture ?? false);\n const once = typeof options === 'object' ? (options.once ?? false) : false;\n const passive =\n typeof options === 'object' ? (options.passive ?? false) : false;\n let entries = this.listenerMap.get(type);\n if (!entries) {\n entries = [];\n this.listenerMap.set(type, entries);\n }\n if (\n entries.some(\n (entry) => entry.listener === listener && entry.capture === capture\n )\n ) {\n return;\n }\n entries.push({ listener, capture, once, passive });\n }\n\n public removeEventListener(\n type: string,\n listener: EventListenerRecord | null,\n options?: boolean | EventListenerOptions\n ): void {\n if (!listener) {\n return;\n }\n const capture =\n typeof options === 'boolean' ? options : (options?.capture ?? false);\n const entries = this.listenerMap.get(type);\n if (!entries) {\n return;\n }\n const index = entries.findIndex(\n (entry) => entry.listener === listener && entry.capture === capture\n );\n if (index >= 0) {\n entries.splice(index, 1);\n }\n if (entries.length === 0) {\n this.listenerMap.delete(type);\n }\n }\n\n public dispatchEvent(event: Event): boolean {\n if (!(event instanceof Event)) {\n throw new TypeError('dispatchEvent requires an Event instance');\n }\n if (event.dispatched) {\n throw new Error('Event has already been dispatched');\n }\n return dispatchOnTarget(this, event);\n }\n\n /** @internal 返回本节点的监听器。 */\n public getListeners(type: string): ListenerEntry[] {\n return this.listenerMap.get(type) ?? [];\n }\n}\n\nexport class Event {\n public static readonly NONE = 0;\n public static readonly CAPTURING_PHASE = 1;\n public static readonly AT_TARGET = 2;\n public static readonly BUBBLING_PHASE = 3;\n\n public readonly type: string;\n public readonly bubbles: boolean;\n public readonly cancelable: boolean;\n public readonly composed: boolean;\n public target: EventTarget | null = null;\n public currentTarget: EventTarget | null = null;\n public eventPhase = Event.NONE;\n public defaultPrevented = false;\n public readonly isTrusted = false;\n public readonly timeStamp: number;\n public cancelBubble = false;\n\n /** @internal */\n public dispatched = false;\n /** @internal */\n private propagationStopped = false;\n /** @internal */\n private immediateStopped = false;\n /** @internal */\n private canceled = false;\n\n constructor(type: string, init?: EventInit) {\n this.type = type;\n this.bubbles = init?.bubbles ?? false;\n this.cancelable = init?.cancelable ?? false;\n this.composed = init?.composed ?? false;\n this.timeStamp = Date.now();\n }\n\n public preventDefault(): void {\n if (this.cancelable) {\n this.canceled = true;\n }\n }\n\n public stopPropagation(): void {\n this.propagationStopped = true;\n this.cancelBubble = true;\n }\n\n public stopImmediatePropagation(): void {\n this.propagationStopped = true;\n this.immediateStopped = true;\n this.cancelBubble = true;\n }\n\n /** @internal */\n public propagationPrevented(): boolean {\n return this.propagationStopped;\n }\n\n /** @internal */\n public immediatePrevented(): boolean {\n return this.immediateStopped;\n }\n\n /** @internal */\n public wasCanceled(): boolean {\n return this.canceled;\n }\n}\n\nexport class CustomEvent<T = unknown> extends Event {\n public readonly detail: T;\n\n constructor(type: string, init?: CustomEventInit<T>) {\n super(type, init);\n this.detail = init?.detail as T;\n }\n}\n\nexport class MouseEvent extends Event {\n public readonly clientX: number;\n public readonly clientY: number;\n public readonly button: number;\n public readonly buttons: number;\n public readonly relatedTarget: unknown;\n\n constructor(type: string, init?: MouseEventInit) {\n super(type, init);\n this.clientX = init?.clientX ?? 0;\n this.clientY = init?.clientY ?? 0;\n this.button = init?.button ?? 0;\n this.buttons = init?.buttons ?? 0;\n this.relatedTarget = init?.relatedTarget ?? null;\n }\n}\n\nexport class KeyboardEvent extends Event {\n public readonly key: string;\n public readonly code: string;\n\n constructor(type: string, init?: KeyboardEventInit) {\n super(type, init);\n this.key = init?.key ?? '';\n this.code = init?.code ?? '';\n }\n}\n\nfunction invokeListener(listener: ListenerEntry, event: Event): void {\n const record = listener.listener;\n if (typeof record === 'function') {\n record.call(event.currentTarget, event);\n } else {\n record.handleEvent(event);\n }\n}\n\nfunction dispatchOnTarget(target: EventTarget, event: Event): boolean {\n event.dispatched = true;\n event.target = target;\n\n const chain = buildEventPath(target);\n const capturePath = [...chain].reverse();\n const targetIndex = capturePath.length - 1;\n\n event.eventPhase = Event.CAPTURING_PHASE;\n for (let index = 0; index < targetIndex; index += 1) {\n const current = capturePath[index];\n if (event.propagationPrevented()) {\n break;\n }\n event.currentTarget = current;\n runListeners(current, event, true);\n }\n\n if (!event.propagationPrevented()) {\n event.eventPhase = Event.AT_TARGET;\n event.currentTarget = target;\n runListeners(target, event, true);\n if (!event.immediatePrevented()) {\n runListeners(target, event, false);\n }\n }\n\n if (event.bubbles && !event.propagationPrevented()) {\n event.eventPhase = Event.BUBBLING_PHASE;\n for (let index = capturePath.length - 2; index >= 0; index -= 1) {\n const current = capturePath[index];\n if (event.propagationPrevented()) {\n break;\n }\n event.currentTarget = current;\n runListeners(current, event, false);\n }\n }\n\n event.eventPhase = Event.NONE;\n event.currentTarget = null;\n return !event.wasCanceled();\n}\n\nfunction runListeners(\n target: EventTarget,\n event: Event,\n capture: boolean\n): void {\n const listeners = target.getListeners(event.type);\n for (const entry of [...listeners]) {\n if (entry.capture !== capture) {\n continue;\n }\n if (event.immediatePrevented()) {\n break;\n }\n if (entry.once) {\n target.removeEventListener(event.type, entry.listener, {\n capture: entry.capture,\n });\n }\n invokeListener(entry, event);\n }\n}\n\nfunction buildEventPath(target: EventTarget): EventTarget[] {\n const path: EventTarget[] = [];\n let current: EventTarget | null = target;\n while (current) {\n path.push(current);\n const node = current as unknown as Node;\n if (node.nodeType === DomNodeType.DOCUMENT_NODE) {\n const view = (node as Document).defaultView;\n if (view) {\n path.push(view);\n }\n break;\n }\n const parent = node.parentNode;\n if (parent) {\n current = parent;\n continue;\n }\n break;\n }\n return path;\n}\n\nexport class DOMTokenList implements Iterable<string> {\n private readonly element: Element;\n private readonly attributeName: string;\n\n constructor(element: Element, attributeName = 'class') {\n this.element = element;\n this.attributeName = attributeName;\n }\n\n public get length(): number {\n return this.tokens().length;\n }\n\n public get value(): string {\n return this.element.getAttribute(this.attributeName) ?? '';\n }\n\n public set value(value: string) {\n this.setTokens(splitTokens(value));\n }\n\n public item(index: number): string | null {\n return this.tokens()[index] ?? null;\n }\n\n public contains(token: string): boolean {\n return this.tokens().includes(token);\n }\n\n public add(...tokens: string[]): void {\n const current = new Set(this.tokens());\n for (const token of tokens) {\n if (token) {\n current.add(token);\n }\n }\n this.setTokens([...current]);\n }\n\n public remove(...tokens: string[]): void {\n const current = new Set(this.tokens());\n for (const token of tokens) {\n current.delete(token);\n }\n this.setTokens([...current]);\n }\n\n public toggle(token: string, force?: boolean): boolean {\n const current = new Set(this.tokens());\n const shouldAdd = force ?? !current.has(token);\n if (shouldAdd) {\n current.add(token);\n } else {\n current.delete(token);\n }\n this.setTokens([...current]);\n return shouldAdd;\n }\n\n public replace(oldToken: string, newToken: string): boolean {\n const current = this.tokens();\n const index = current.indexOf(oldToken);\n if (index < 0) {\n return false;\n }\n current[index] = newToken;\n this.setTokens(current);\n return true;\n }\n\n public [Symbol.iterator](): Iterator<string> {\n return this.tokens()[Symbol.iterator]();\n }\n\n public forEach(\n callback: (value: string, index: number, list: DOMTokenList) => void\n ): void {\n this.tokens().forEach((value, index) => callback(value, index, this));\n }\n\n public toString(): string {\n return this.value;\n }\n\n private tokens(): string[] {\n return splitTokens(this.element.getAttribute(this.attributeName) ?? '');\n }\n\n private setTokens(tokens: string[]): void {\n const value = tokens.filter(Boolean).join(' ');\n if (value) {\n this.element.setAttribute(this.attributeName, value);\n } else {\n this.element.removeAttribute(this.attributeName);\n }\n }\n}\n\nfunction splitTokens(value: string): string[] {\n return value.trim().split(/\\s+/).filter(Boolean);\n}\n\nfunction normalizeCssProperty(property: string): string {\n return property.replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`);\n}\n\ninterface StyleTarget {\n properties: Map<string, { value: string; priority: string }>;\n setProperty(property: string, value: string, priority?: string): void;\n getPropertyValue(property: string): string;\n getPropertyPriority(property: string): string;\n removeProperty(property: string): string;\n item(index: number): string;\n readonly length: number;\n cssText: string;\n}\n\n/**\n * 创建 CSSStyleDeclaration 代理,支持任意 camelCase 属性访问与赋值。\n */\nexport function createStyleDeclaration(): CSSStyleDeclaration {\n const properties = new Map<string, { value: string; priority: string }>();\n\n const target: StyleTarget = {\n properties,\n\n setProperty(property: string, value: string, priority = ''): void {\n const name = normalizeCssProperty(property);\n if (value === '') {\n properties.delete(name);\n } else {\n properties.set(name, { value, priority });\n }\n },\n\n getPropertyValue(property: string): string {\n return properties.get(normalizeCssProperty(property))?.value ?? '';\n },\n\n getPropertyPriority(property: string): string {\n return properties.get(normalizeCssProperty(property))?.priority ?? '';\n },\n\n removeProperty(property: string): string {\n const name = normalizeCssProperty(property);\n const previous = properties.get(name)?.value ?? '';\n properties.delete(name);\n return previous;\n },\n\n item(index: number): string {\n return [...properties.keys()][index] ?? '';\n },\n\n get length(): number {\n return properties.size;\n },\n\n get cssText(): string {\n return [...properties.entries()]\n .map(\n ([name, entry]) =>\n `${name}: ${entry.value}${entry.priority ? ` ${entry.priority}` : ''};`\n )\n .join(' ');\n },\n\n set cssText(value: string) {\n properties.clear();\n for (const declaration of value.split(';')) {\n const trimmed = declaration.trim();\n if (!trimmed) {\n continue;\n }\n const separator = trimmed.indexOf(':');\n if (separator < 0) {\n continue;\n }\n const name = trimmed.slice(0, separator).trim();\n const propertyValue = trimmed.slice(separator + 1).trim();\n if (name) {\n target.setProperty(name, propertyValue);\n }\n }\n },\n };\n\n const handler: ProxyHandler<StyleTarget> = {\n get(t, property, receiver) {\n if (typeof property === 'symbol') {\n return Reflect.get(t, property, receiver);\n }\n if (property in t) {\n const value = Reflect.get(t, property, receiver);\n return typeof value === 'function' ? value.bind(t) : value;\n }\n return t.getPropertyValue(property);\n },\n set(t, property, value, receiver) {\n if (typeof property === 'symbol') {\n return Reflect.set(t, property, value, receiver);\n }\n if (property in t) {\n return Reflect.set(t, property, value, receiver);\n }\n t.setProperty(property, String(value));\n return true;\n },\n has(t, property) {\n if (typeof property === 'symbol') {\n return Reflect.has(t, property);\n }\n if (property in t) {\n return true;\n }\n return t.getPropertyValue(property) !== '';\n },\n ownKeys() {\n return [\n ...Reflect.ownKeys(target),\n ...[...properties.keys()].map((name) => camelCaseProperty(name)),\n ];\n },\n getOwnPropertyDescriptor(t, property) {\n if (typeof property === 'symbol') {\n return Reflect.getOwnPropertyDescriptor(t, property);\n }\n if (property in t) {\n return Reflect.getOwnPropertyDescriptor(t, property);\n }\n const value = t.getPropertyValue(property);\n if (value !== '') {\n return { configurable: true, enumerable: true, writable: true, value };\n }\n return undefined;\n },\n };\n\n return new Proxy(target, handler) as unknown as CSSStyleDeclaration;\n}\n\nfunction camelCaseProperty(property: string): string {\n return property.replace(/-([a-z])/g, (_match, char: string) =>\n char.toUpperCase()\n );\n}\n\n/**\n * 类数组节点列表:支持 .length、.item()、数值索引与迭代。\n */\nexport class NodeList<T extends Node = Node> implements Iterable<T> {\n /** @internal */\n private readonly items: T[];\n\n constructor(items: T[] = []) {\n this.items = items;\n for (let index = 0; index < items.length; index += 1) {\n Object.defineProperty(this, String(index), {\n configurable: true,\n enumerable: true,\n get: () => this.items[index],\n });\n }\n }\n\n public get length(): number {\n return this.items.length;\n }\n\n public item(index: number): T | null {\n return this.items[index] ?? null;\n }\n\n public [Symbol.iterator](): Iterator<T> {\n return this.items[Symbol.iterator]();\n }\n\n public forEach(\n callback: (value: T, index: number, list: NodeList<T>) => void\n ): void {\n this.items.forEach((value, index) => callback(value, index, this));\n }\n\n public entries(): IterableIterator<[number, T]> {\n return this.items.entries();\n }\n\n public keys(): IterableIterator<number> {\n return this.items.keys();\n }\n\n public values(): IterableIterator<T> {\n return this.items.values();\n }\n\n public toArray(): T[] {\n return [...this.items];\n }\n}\n\n/**\n * Node 基类:节点树、父子关系、文本内容。\n */\nexport class Node extends EventTarget {\n public static readonly ELEMENT_NODE = DomNodeType.ELEMENT_NODE;\n public static readonly TEXT_NODE = DomNodeType.TEXT_NODE;\n public static readonly COMMENT_NODE = DomNodeType.COMMENT_NODE;\n public static readonly DOCUMENT_NODE = DomNodeType.DOCUMENT_NODE;\n public static readonly DOCUMENT_FRAGMENT_NODE =\n DomNodeType.DOCUMENT_FRAGMENT_NODE;\n\n public readonly nodeType: number;\n public readonly nodeName: string;\n public parentNode: Node | null = null;\n public ownerDocument: Document | null = null;\n\n /** @internal */\n public childList: Node[] = [];\n\n constructor(nodeType: number, nodeName: string) {\n super();\n this.nodeType = nodeType;\n this.nodeName = nodeName;\n }\n\n public get parentElement(): Element | null {\n const parent = this.parentNode;\n return parent instanceof Element ? parent : null;\n }\n\n public get childNodes(): NodeList<Node> {\n return new NodeList([...this.childList]);\n }\n\n public get firstChild(): Node | null {\n return this.childList[0] ?? null;\n }\n\n public get lastChild(): Node | null {\n return this.childList[this.childList.length - 1] ?? null;\n }\n\n public get nextSibling(): Node | null {\n const parent = this.parentNode;\n if (!parent) {\n return null;\n }\n const index = parent.childList.indexOf(this);\n return index >= 0 ? (parent.childList[index + 1] ?? null) : null;\n }\n\n public get previousSibling(): Node | null {\n const parent = this.parentNode;\n if (!parent) {\n return null;\n }\n const index = parent.childList.indexOf(this);\n return index > 0 ? parent.childList[index - 1] : null;\n }\n\n public get textContent(): string {\n let text = '';\n for (const child of this.childList) {\n if (child.nodeType === DomNodeType.TEXT_NODE) {\n text += (child as Text).data;\n } else if (child.nodeType === DomNodeType.ELEMENT_NODE) {\n text += child.textContent;\n }\n }\n return text;\n }\n\n public set textContent(value: string) {\n this.childList = [];\n if (value) {\n const textNode = new Text(value);\n textNode.ownerDocument = this.ownerDocument;\n textNode.parentNode = this;\n this.childList.push(textNode);\n }\n }\n\n public hasChildNodes(): boolean {\n return this.childList.length > 0;\n }\n\n public appendChild<T extends Node>(node: T): T {\n if (node === (this as Node)) {\n throw new Error('Cannot append a node to itself');\n }\n this.insertBefore(node, null);\n return node;\n }\n\n public insertBefore<T extends Node>(node: T, reference: Node | null): T {\n if (node === (this as Node)) {\n throw new Error('Cannot insert a node before itself');\n }\n if (node.parentNode) {\n node.parentNode.removeChild(node);\n }\n node.parentNode = this;\n if (node.ownerDocument === null) {\n node.ownerDocument = this.ownerDocument;\n }\n if (reference === null) {\n this.childList.push(node);\n return node;\n }\n const index = this.childList.indexOf(reference);\n if (index < 0) {\n throw new Error('Reference node is not a child of this node');\n }\n this.childList.splice(index, 0, node);\n return node;\n }\n\n public removeChild<T extends Node>(node: T): T {\n const index = this.childList.indexOf(node);\n if (index < 0) {\n throw new Error('Node is not a child of this node');\n }\n this.childList.splice(index, 1);\n node.parentNode = null;\n return node;\n }\n\n public replaceChild<T extends Node>(newChild: T, oldChild: Node): T {\n const index = this.childList.indexOf(oldChild);\n if (index < 0) {\n throw new Error('Old child is not a child of this node');\n }\n if (newChild.parentNode) {\n newChild.parentNode.removeChild(newChild);\n }\n newChild.parentNode = this;\n if (newChild.ownerDocument === null) {\n newChild.ownerDocument = this.ownerDocument;\n }\n this.childList[index] = newChild;\n oldChild.parentNode = null;\n return newChild;\n }\n\n public replaceChildren(...nodes: Node[]): void {\n for (const child of [...this.childList]) {\n this.removeChild(child);\n }\n for (const node of nodes) {\n this.appendChild(node);\n }\n }\n\n public contains(node: Node | null): boolean {\n if (!node) {\n return false;\n }\n let current: Node | null = node;\n while (current) {\n if (current === this) {\n return true;\n }\n current = current.parentNode;\n }\n return false;\n }\n\n public remove(): void {\n this.parentNode?.removeChild(this);\n }\n\n public cloneNode(deep = false): Node {\n const clone = this.createClone();\n if (deep) {\n for (const child of this.childList) {\n clone.appendChild(child.cloneNode(true) as Node);\n }\n }\n return clone;\n }\n\n /** @internal */\n protected createClone(): Node {\n const clone = new Node(this.nodeType, this.nodeName);\n clone.ownerDocument = this.ownerDocument;\n return clone;\n }\n\n public getRootNode(): Node {\n if (!this.parentNode) {\n return this;\n }\n let parent = this.parentNode;\n while (parent.parentNode) {\n parent = parent.parentNode;\n }\n return parent;\n }\n\n public isConnected(): boolean {\n return this.getRootNode().nodeType === DomNodeType.DOCUMENT_NODE;\n }\n}\n\n/**\n * Element:标签节点。\n */\nexport class Element extends Node {\n public readonly namespaceURI: string | null;\n\n /** @internal */\n private readonly attributeList: Array<{ name: string; value: string }> = [];\n /** @internal */\n private styleValue: CSSStyleDeclaration | undefined;\n /** @internal */\n private classListValue: DOMTokenList | undefined;\n /** @internal */\n private datasetProxy: Record<string, string> | undefined;\n\n constructor(tagName: string, namespaceURI: string | null = null) {\n super(DomNodeType.ELEMENT_NODE, tagName.toUpperCase());\n this.namespaceURI = namespaceURI;\n }\n\n public get tagName(): string {\n return this.nodeName;\n }\n\n public get localName(): string {\n return this.nodeName.toLowerCase();\n }\n\n public get id(): string {\n return this.getAttribute('id') ?? '';\n }\n\n public set id(value: string) {\n this.setAttribute('id', value);\n }\n\n public get className(): string {\n return this.getAttribute('class') ?? '';\n }\n\n public set className(value: string) {\n this.setAttribute('class', value);\n }\n\n public get classList(): DOMTokenList {\n if (!this.classListValue) {\n this.classListValue = new DOMTokenList(this, 'class');\n }\n return this.classListValue;\n }\n\n public get style(): CSSStyleDeclaration {\n if (!this.styleValue) {\n this.styleValue = createStyleDeclaration();\n }\n return this.styleValue;\n }\n\n public get dataset(): Record<string, string> {\n if (!this.datasetProxy) {\n this.datasetProxy = createDatasetProxy(this);\n }\n return this.datasetProxy;\n }\n\n public get children(): NodeList<Element> {\n return new NodeList(\n this.childList.filter(\n (child): child is Element => child.nodeType === DomNodeType.ELEMENT_NODE\n )\n );\n }\n\n public get firstElementChild(): Element | null {\n return this.children.item(0);\n }\n\n public get lastElementChild(): Element | null {\n return this.children.item(this.children.length - 1);\n }\n\n public get childElementCount(): number {\n return this.children.length;\n }\n\n public get attributes(): NamedNodeMap {\n return new NamedNodeMap(this);\n }\n\n public getAttribute(name: string): string | null {\n const entry = this.findAttribute(name);\n return entry ? entry.value : null;\n }\n\n public getAttributeNames(): string[] {\n return this.attributeList.map((entry) => entry.name);\n }\n\n public setAttribute(name: string, value: unknown): void {\n const stringValue = String(value);\n if (name === 'style') {\n this.styleValue = createStyleDeclaration();\n this.styleValue.cssText = stringValue;\n }\n const entry = this.findAttribute(name);\n if (entry) {\n entry.value = stringValue;\n } else {\n this.attributeList.push({ name, value: stringValue });\n }\n }\n\n public removeAttribute(name: string): void {\n if (name === 'style') {\n this.styleValue = createStyleDeclaration();\n }\n const index = this.attributeList.findIndex((entry) => entry.name === name);\n if (index >= 0) {\n this.attributeList.splice(index, 1);\n }\n }\n\n public hasAttribute(name: string): boolean {\n return this.findAttribute(name) !== undefined;\n }\n\n public toggleAttribute(name: string, force?: boolean): boolean {\n const shouldAdd = force ?? !this.hasAttribute(name);\n if (shouldAdd) {\n this.setAttribute(name, '');\n } else {\n this.removeAttribute(name);\n }\n return shouldAdd;\n }\n\n public hasAttributes(): boolean {\n return this.attributeList.length > 0;\n }\n\n public get innerHTML(): string {\n return serializeChildren(this);\n }\n\n public set innerHTML(value: string) {\n this.replaceChildren(...parseHtmlFragment(value, this.ownerDocument));\n }\n\n public get outerHTML(): string {\n return serializeNode(this);\n }\n\n public get value(): string {\n return this.getAttribute('value') ?? '';\n }\n\n public set value(value: string) {\n this.setAttribute('value', value);\n }\n\n public querySelector(selector: string): Element | null {\n return querySelectorAll(this, selector).item(0);\n }\n\n public querySelectorAll(selector: string): NodeList<Element> {\n return querySelectorAll(this, selector);\n }\n\n public getElementsByTagName(tagName: string): NodeList<Element> {\n const lowered = tagName.toLowerCase();\n const results: Element[] = [];\n collectElements(this, (element) => {\n if (element.localName === lowered) {\n results.push(element);\n }\n });\n return new NodeList(results);\n }\n\n public matches(selector: string): boolean {\n return matchSelector(this, selector);\n }\n\n public closest(selector: string): Element | null {\n if (this.matches(selector)) {\n return this;\n }\n let parent = this.parentElement;\n while (parent) {\n if (parent.matches(selector)) {\n return parent;\n }\n parent = parent.parentElement;\n }\n return null;\n }\n\n public getBoundingClientRect(): DOMRect {\n return {\n x: 0,\n y: 0,\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n width: 0,\n height: 0,\n toJSON(): Record<string, number> {\n return {\n x: 0,\n y: 0,\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n width: 0,\n height: 0,\n };\n },\n };\n }\n\n public scrollIntoView(): void {}\n\n public focus(): void {}\n\n public blur(): void {}\n\n public click(): void {\n this.dispatchEvent(\n new MouseEvent('click', { bubbles: true, cancelable: true })\n );\n }\n\n public append(...nodes: (Node | string)[]): void {\n for (const node of nodes) {\n if (typeof node === 'string') {\n const textNode = new Text(node);\n textNode.ownerDocument = this.ownerDocument;\n this.appendChild(textNode);\n } else {\n this.appendChild(node);\n }\n }\n }\n\n public prepend(...nodes: (Node | string)[]): void {\n const reference = this.firstChild;\n for (const node of nodes) {\n if (typeof node === 'string') {\n const textNode = new Text(node);\n textNode.ownerDocument = this.ownerDocument;\n this.insertBefore(textNode, reference);\n } else {\n this.insertBefore(node, reference);\n }\n }\n }\n\n public before(...nodes: (Node | string)[]): void {\n const parent = this.parentNode;\n if (!parent) {\n return;\n }\n for (const node of nodes) {\n if (typeof node === 'string') {\n const textNode = new Text(node);\n textNode.ownerDocument = this.ownerDocument;\n parent.insertBefore(textNode, this);\n } else {\n parent.insertBefore(node, this);\n }\n }\n }\n\n public after(...nodes: (Node | string)[]): void {\n const parent = this.parentNode;\n if (!parent) {\n return;\n }\n const reference = this.nextSibling;\n for (const node of nodes) {\n if (typeof node === 'string') {\n const textNode = new Text(node);\n textNode.ownerDocument = this.ownerDocument;\n parent.insertBefore(textNode, reference);\n } else {\n parent.insertBefore(node, reference);\n }\n }\n }\n\n public replaceWith(...nodes: (Node | string)[]): void {\n const parent = this.parentNode;\n if (!parent) {\n return;\n }\n const reference = this.nextSibling;\n parent.removeChild(this);\n for (const node of nodes) {\n if (typeof node === 'string') {\n const textNode = new Text(node);\n textNode.ownerDocument = this.ownerDocument;\n parent.insertBefore(textNode, reference);\n } else {\n parent.insertBefore(node, reference);\n }\n }\n }\n\n public setAttributeNS(\n _namespace: string,\n name: string,\n value: unknown\n ): void {\n this.setAttribute(name, value);\n }\n\n public removeAttributeNS(_namespace: string, name: string): void {\n this.removeAttribute(name);\n }\n\n public hasAttributeNS(_namespace: string, name: string): boolean {\n return this.hasAttribute(name);\n }\n\n public getAttributeNS(_namespace: string, name: string): string | null {\n return this.getAttribute(name);\n }\n\n /** @internal */\n public findAttribute(\n name: string\n ): { name: string; value: string } | undefined {\n return this.attributeList.find((entry) => entry.name === name);\n }\n\n /** @internal */\n public attributeEntries(): Array<{ name: string; value: string }> {\n return [...this.attributeList];\n }\n\n /** @internal 供序列化读取内联样式。 */\n public inlineStyleText(): string {\n return this.styleValue?.cssText ?? '';\n }\n\n /** @internal */\n protected createClone(): Node {\n const clone = createElementForTag(this.localName, this.ownerDocument);\n for (const entry of this.attributeList) {\n clone.setAttribute(entry.name, entry.value);\n }\n return clone;\n }\n}\n\nexport class HTMLElement extends Element {\n constructor(tagName: string) {\n super(tagName);\n }\n}\n\nexport class NamedNodeMap implements Iterable<{ name: string; value: string }> {\n private readonly element: Element;\n\n constructor(element: Element) {\n this.element = element;\n for (let index = 0; index < element.attributeEntries().length; index += 1) {\n Object.defineProperty(this, String(index), {\n configurable: true,\n enumerable: true,\n get: () => this.element.attributeEntries()[index] ?? null,\n });\n }\n }\n\n public get length(): number {\n return this.element.attributeEntries().length;\n }\n\n public item(index: number): { name: string; value: string } | null {\n return this.element.attributeEntries()[index] ?? null;\n }\n\n public getNamedItem(name: string): { name: string; value: string } | null {\n return this.element.findAttribute(name) ?? null;\n }\n\n public setNamedItem(attr: { name: string; value: string }): void {\n this.element.setAttribute(attr.name, attr.value);\n }\n\n public removeNamedItem(name: string): void {\n this.element.removeAttribute(name);\n }\n\n public [Symbol.iterator](): Iterator<{ name: string; value: string }> {\n return this.element.attributeEntries()[Symbol.iterator]();\n }\n}\n\nexport class HTMLOptionElement extends HTMLElement {\n /** @internal */\n private selectedValue: boolean | undefined;\n\n constructor(tagName = 'option') {\n super(tagName);\n }\n\n public get value(): string {\n return this.getAttribute('value') ?? this.textContent;\n }\n\n public set value(value: string) {\n this.setAttribute('value', value);\n }\n\n public get text(): string {\n return this.textContent;\n }\n\n public get label(): string {\n return this.getAttribute('label') ?? this.textContent;\n }\n\n public get selected(): boolean {\n return this.hasSelectedValue();\n }\n\n public set selected(value: boolean) {\n this.setSelectedRaw(value);\n if (value) {\n const select = this.parentElement;\n if (select instanceof HTMLSelectElement && !select.multiple) {\n for (const option of select.options.toArray()) {\n if (option !== this) {\n option.setSelectedRaw(false);\n }\n }\n }\n }\n }\n\n /** @internal */\n public setSelectedRaw(value: boolean): void {\n this.selectedValue = value;\n if (value) {\n this.setAttribute('selected', '');\n } else {\n this.removeAttribute('selected');\n }\n }\n\n /** @internal */\n public hasSelectedValue(): boolean {\n if (this.selectedValue !== undefined) {\n return this.selectedValue;\n }\n return this.hasAttribute('selected');\n }\n}\n\nexport class HTMLSelectElement extends HTMLElement {\n constructor(tagName = 'select') {\n super(tagName);\n }\n\n public get multiple(): boolean {\n return this.hasAttribute('multiple');\n }\n\n public set multiple(value: boolean) {\n if (value) {\n this.setAttribute('multiple', '');\n } else {\n this.removeAttribute('multiple');\n }\n }\n\n public get options(): HTMLOptionsCollection {\n const options: HTMLOptionElement[] = [];\n collectElements(this, (element) => {\n if (element instanceof HTMLOptionElement) {\n options.push(element);\n }\n });\n return new HTMLOptionsCollection(options);\n }\n\n public get selectedOptions(): NodeList<HTMLOptionElement> {\n return new NodeList(\n this.options.toArray().filter((option) => option.hasSelectedValue())\n );\n }\n\n public get selectedIndex(): number {\n return this.options\n .toArray()\n .findIndex((option) => option.hasSelectedValue());\n }\n\n public set selectedIndex(index: number) {\n const options = this.options.toArray();\n options.forEach((option, optionIndex) =>\n option.setSelectedRaw(optionIndex === index)\n );\n }\n\n public get value(): string {\n const options = this.options.toArray();\n const selected = options.find((option) => option.hasSelectedValue());\n if (selected) {\n return selected.value;\n }\n if (!this.multiple && options.length > 0) {\n return options[0].value;\n }\n return '';\n }\n\n public set value(value: string) {\n const options = this.options.toArray();\n for (const option of options) {\n const shouldSelect = option.value === value;\n if (shouldSelect) {\n if (this.multiple) {\n option.setSelectedRaw(true);\n } else {\n for (const other of options) {\n other.setSelectedRaw(other === option);\n }\n return;\n }\n }\n }\n }\n\n public add(option: HTMLOptionElement): void {\n this.appendChild(option);\n }\n\n public removeOption(index: number): void {\n const options = this.options.toArray();\n const option = options[index];\n if (option) {\n option.remove();\n }\n }\n}\n\nexport class HTMLOptionsCollection implements Iterable<HTMLOptionElement> {\n private readonly items: HTMLOptionElement[];\n\n constructor(items: HTMLOptionElement[]) {\n this.items = items;\n for (let index = 0; index < items.length; index += 1) {\n Object.defineProperty(this, String(index), {\n configurable: true,\n enumerable: true,\n get: () => this.items[index],\n });\n }\n }\n\n public get length(): number {\n return this.items.length;\n }\n\n public item(index: number): HTMLOptionElement | null {\n return this.items[index] ?? null;\n }\n\n public get value(): string {\n return this.items.find((option) => option.hasSelectedValue())?.value ?? '';\n }\n\n public get selectedIndex(): number {\n return this.items.findIndex((option) => option.hasSelectedValue());\n }\n\n public toArray(): HTMLOptionElement[] {\n return [...this.items];\n }\n\n public [Symbol.iterator](): Iterator<HTMLOptionElement> {\n return this.items[Symbol.iterator]();\n }\n}\n\nexport class HTMLInputElement extends HTMLElement {\n /** @internal */\n private inputValue: string | undefined;\n /** @internal */\n private checkedValue: boolean | undefined;\n\n constructor(tagName = 'input') {\n super(tagName);\n }\n\n public get type(): string {\n return this.getAttribute('type') ?? 'text';\n }\n\n public set type(value: string) {\n this.setAttribute('type', value);\n }\n\n public get name(): string {\n return this.getAttribute('name') ?? '';\n }\n\n public set name(value: string) {\n this.setAttribute('name', value);\n }\n\n public get value(): string {\n return this.inputValue ?? this.getAttribute('value') ?? '';\n }\n\n public set value(value: string) {\n this.inputValue = value;\n }\n\n public get defaultValue(): string {\n return this.getAttribute('value') ?? '';\n }\n\n public get checked(): boolean {\n return this.checkedValue ?? this.hasAttribute('checked');\n }\n\n public set checked(value: boolean) {\n this.checkedValue = value;\n }\n\n public get disabled(): boolean {\n return this.hasAttribute('disabled');\n }\n\n public set disabled(value: boolean) {\n if (value) {\n this.setAttribute('disabled', '');\n } else {\n this.removeAttribute('disabled');\n }\n }\n\n /** @internal */\n protected createClone(): Node {\n const clone = super.createClone() as HTMLInputElement;\n clone.inputValue = this.inputValue;\n clone.checkedValue = this.checkedValue;\n return clone;\n }\n}\n\nexport class HTMLTextAreaElement extends HTMLElement {\n /** @internal */\n private textareaValue: string | undefined;\n\n constructor(tagName = 'textarea') {\n super(tagName);\n }\n\n public get value(): string {\n return this.textareaValue ?? this.textContent;\n }\n\n public set value(value: string) {\n this.textareaValue = value;\n }\n}\n\nexport class HTMLButtonElement extends HTMLElement {\n constructor(tagName = 'button') {\n super(tagName);\n }\n\n public get type(): string {\n return this.getAttribute('type') ?? 'submit';\n }\n}\n\nexport class HTMLStyleElement extends HTMLElement {\n constructor(tagName = 'style') {\n super(tagName);\n }\n}\n\nexport class HTMLAnchorElement extends HTMLElement {\n constructor(tagName = 'a') {\n super(tagName);\n }\n\n public get href(): string {\n return this.getAttribute('href') ?? '';\n }\n\n public set href(value: string) {\n this.setAttribute('href', value);\n }\n}\n\nexport class Text extends Node {\n public data: string;\n\n constructor(data = '') {\n super(DomNodeType.TEXT_NODE, '#text');\n this.data = data;\n }\n\n public get nodeValue(): string {\n return this.data;\n }\n\n public set nodeValue(value: string) {\n this.data = value;\n }\n\n public get textContent(): string {\n return this.data;\n }\n\n public set textContent(value: string) {\n this.data = value;\n }\n\n public get wholeText(): string {\n return this.data;\n }\n\n /** @internal */\n protected createClone(): Node {\n const clone = new Text(this.data);\n clone.ownerDocument = this.ownerDocument;\n return clone;\n }\n}\n\nexport class Comment extends Node {\n public data: string;\n\n constructor(data = '') {\n super(DomNodeType.COMMENT_NODE, '#comment');\n this.data = data;\n }\n\n public get nodeValue(): string {\n return this.data;\n }\n\n public set nodeValue(value: string) {\n this.data = value;\n }\n\n /** @internal */\n protected createClone(): Node {\n const clone = new Comment(this.data);\n clone.ownerDocument = this.ownerDocument;\n return clone;\n }\n}\n\nexport class DocumentFragment extends Node {\n constructor() {\n super(DomNodeType.DOCUMENT_FRAGMENT_NODE, '#document-fragment');\n }\n}\n\nexport class Document extends Node {\n public readonly defaultView: DomWindow | null = null;\n\n constructor() {\n super(DomNodeType.DOCUMENT_NODE, '#document');\n }\n\n public createElement(tagName: string): HTMLElement {\n return createElementForTag(tagName, this);\n }\n\n public createElementNS(namespaceURI: string, tagName: string): HTMLElement {\n const element = createElementForTag(tagName, this);\n (element as { namespaceURI: string | null }).namespaceURI = namespaceURI;\n return element;\n }\n\n public createTextNode(data: string): Text {\n const text = new Text(data);\n text.ownerDocument = this;\n return text;\n }\n\n public createComment(data: string): Comment {\n const comment = new Comment(data);\n comment.ownerDocument = this;\n return comment;\n }\n\n public createDocumentFragment(): DocumentFragment {\n const fragment = new DocumentFragment();\n fragment.ownerDocument = this;\n return fragment;\n }\n\n public createEvent(type: string): Event {\n if (type === 'MouseEvent' || type === 'mouseevent') {\n return new MouseEvent('');\n }\n if (type === 'KeyboardEvent' || type === 'keyboardevent') {\n return new KeyboardEvent('');\n }\n if (type === 'CustomEvent' || type === 'customevent') {\n return new CustomEvent('');\n }\n return new Event('');\n }\n\n public get documentElement(): HTMLElement {\n const html = this.childList.find(\n (child) => child.nodeType === DomNodeType.ELEMENT_NODE\n ) as HTMLElement | undefined;\n if (html) {\n return html;\n }\n const created = createElementForTag('html', this);\n this.appendChild(created);\n return created;\n }\n\n public get head(): HTMLElement {\n return this.ensureDocumentChild('head');\n }\n\n public get body(): HTMLElement {\n return this.ensureDocumentChild('body');\n }\n\n public get title(): string {\n const titleElement = this.querySelector('title');\n return titleElement?.textContent ?? '';\n }\n\n public set title(value: string) {\n let titleElement = this.querySelector('title');\n if (!titleElement) {\n titleElement = createElementForTag('title', this);\n this.head.appendChild(titleElement);\n }\n titleElement.textContent = value;\n }\n\n public querySelector(selector: string): Element | null {\n return querySelectorAll(this, selector).item(0);\n }\n\n public querySelectorAll(selector: string): NodeList<Element> {\n return querySelectorAll(this, selector);\n }\n\n public getElementById(id: string): Element | null {\n let result: Element | null = null;\n collectElements(this, (element) => {\n if (!result && element.id === id) {\n result = element;\n }\n });\n return result;\n }\n\n public getElementsByTagName(tagName: string): NodeList<Element> {\n return this.documentElement.getElementsByTagName(tagName);\n }\n\n /** @internal */\n protected createClone(): Node {\n return new Document();\n }\n\n private ensureDocumentChild(tagName: 'head' | 'body'): HTMLElement {\n const documentElement = this.documentElement;\n let child = documentElement.childList.find(\n (node) =>\n node.nodeType === DomNodeType.ELEMENT_NODE &&\n (node as Element).localName === tagName\n ) as HTMLElement | undefined;\n if (!child) {\n child = createElementForTag(tagName, this);\n documentElement.appendChild(child);\n }\n return child;\n }\n}\n\n/**\n * History / Location / Storage 等浏览器环境对象。\n */\nexport class Location {\n /** @internal */\n private url: URL;\n\n constructor(url: string) {\n this.url = new URL(url);\n }\n\n public get href(): string {\n return this.url.href;\n }\n\n public set href(value: string) {\n this.url = new URL(value, this.url.href);\n }\n\n public get origin(): string {\n return this.url.origin;\n }\n\n public get protocol(): string {\n return this.url.protocol;\n }\n\n public get host(): string {\n return this.url.host;\n }\n\n public get hostname(): string {\n return this.url.hostname;\n }\n\n public get port(): string {\n return this.url.port;\n }\n\n public get pathname(): string {\n return this.url.pathname;\n }\n\n public set pathname(value: string) {\n const url = this.url;\n const next = new URL(value, url.href);\n url.pathname = next.pathname;\n }\n\n public get search(): string {\n return this.url.search;\n }\n\n public set search(value: string) {\n this.url.search = value.startsWith('?') ? value : `?${value}`;\n }\n\n public get hash(): string {\n return this.url.hash;\n }\n\n public set hash(value: string) {\n const nextHash = value.startsWith('#') ? value : `#${value}`;\n this.url.hash = nextHash;\n }\n\n public get username(): string {\n return this.url.username;\n }\n\n public get password(): string {\n return this.url.password;\n }\n\n public assign(value: string): void {\n this.url = new URL(value, this.url.href);\n }\n\n public replace(value: string): void {\n this.url = new URL(value, this.url.href);\n }\n\n public reload(): void {}\n\n public toString(): string {\n return this.url.href;\n }\n\n /** @internal */\n public getHashPath(): string {\n return this.url.hash.slice(1);\n }\n\n /** @internal */\n public getHrefWithoutHash(): string {\n const url = this.url;\n return `${url.origin}${url.pathname}${url.search}`;\n }\n}\n\ninterface HistoryEntry {\n state: unknown;\n url: string;\n}\n\nexport class History {\n /** @internal */\n private readonly windowRef: DomWindow;\n /** @internal */\n private entries: HistoryEntry[] = [];\n /** @internal */\n private index = 0;\n /** @internal */\n public scrollRestoration: 'auto' | 'manual' = 'auto';\n\n constructor(windowRef: DomWindow) {\n this.windowRef = windowRef;\n this.entries = [{ state: null, url: windowRef.location.href }];\n }\n\n public get length(): number {\n return this.entries.length;\n }\n\n public get state(): unknown {\n return this.entries[this.index]?.state ?? null;\n }\n\n public pushState(state: unknown, _unusedTitle: string, url?: string): void {\n const nextUrl = url\n ? new URL(url, this.windowRef.location.href).href\n : this.windowRef.location.href;\n this.entries = this.entries.slice(0, this.index + 1);\n this.entries.push({ state, url: nextUrl });\n this.index = this.entries.length - 1;\n this.windowRef.setLocationUrl(nextUrl);\n }\n\n public replaceState(\n state: unknown,\n _unusedTitle: string,\n url?: string\n ): void {\n const nextUrl = url\n ? new URL(url, this.windowRef.location.href).href\n : this.windowRef.location.href;\n this.entries[this.index] = { state, url: nextUrl };\n this.windowRef.setLocationUrl(nextUrl);\n }\n\n public back(): void {\n this.go(-1);\n }\n\n public forward(): void {\n this.go(1);\n }\n\n public go(delta = 0): void {\n const nextIndex = this.index + delta;\n if (nextIndex < 0 || nextIndex >= this.entries.length) {\n return;\n }\n this.index = nextIndex;\n this.windowRef.setLocationUrl(this.entries[nextIndex].url);\n this.windowRef.dispatchEvent(\n new Event('popstate', { bubbles: false, cancelable: false })\n );\n }\n}\n\nexport class Storage {\n private readonly store = new Map<string, string>();\n\n public get length(): number {\n return this.store.size;\n }\n\n public key(index: number): string | null {\n return [...this.store.keys()][index] ?? null;\n }\n\n public getItem(key: string): string | null {\n return this.store.has(key) ? (this.store.get(key) as string) : null;\n }\n\n public setItem(key: string, value: string): void {\n this.store.set(key, String(value));\n }\n\n public removeItem(key: string): void {\n this.store.delete(key);\n }\n\n public clear(): void {\n this.store.clear();\n }\n}\n\nexport class Navigator {\n public readonly userAgent = 'TSone/0.2.1';\n public readonly platform = 'TSone';\n public readonly language = 'zh-CN';\n public readonly languages = ['zh-CN'];\n public readonly onLine = true;\n public readonly maxTouchPoints = 0;\n}\n\nexport interface MediaQueryList {\n readonly media: string;\n readonly matches: boolean;\n onchange: ((event: Event) => void) | null;\n addEventListener(type: string, listener: EventListenerRecord): void;\n removeEventListener(type: string, listener: EventListenerRecord): void;\n addListener(listener: EventListenerRecord): void;\n removeListener(listener: EventListenerRecord): void;\n dispatchEvent(event: Event): boolean;\n}\n\nexport function createMatchMedia(\n _windowRef: DomWindow,\n query: string\n): MediaQueryList {\n const listeners = new Set<EventListenerRecord>();\n const matches = false;\n const list: MediaQueryList = {\n media: query,\n matches,\n onchange: null,\n addEventListener(type, listener) {\n if (type === 'change') {\n listeners.add(listener);\n }\n },\n removeEventListener(type, listener) {\n if (type === 'change') {\n listeners.delete(listener);\n }\n },\n addListener(listener) {\n listeners.add(listener);\n },\n removeListener(listener) {\n listeners.delete(listener);\n },\n dispatchEvent(event) {\n for (const listener of [...listeners]) {\n if (typeof listener === 'function') {\n listener.call(list, event);\n } else {\n listener.handleEvent(event);\n }\n }\n return true;\n },\n };\n return list;\n}\n\nexport class ResizeObserver {\n public observe(): void {}\n public unobserve(): void {}\n public disconnect(): void {}\n}\n\nexport const DOM_GLOBAL_KEYS: readonly string[] = [\n 'window',\n 'document',\n 'Node',\n 'Text',\n 'Comment',\n 'Element',\n 'HTMLElement',\n 'HTMLInputElement',\n 'HTMLTextAreaElement',\n 'HTMLSelectElement',\n 'HTMLButtonElement',\n 'HTMLOptionElement',\n 'HTMLStyleElement',\n 'HTMLAnchorElement',\n 'DocumentFragment',\n 'Document',\n 'Event',\n 'MouseEvent',\n 'KeyboardEvent',\n 'CustomEvent',\n 'EventTarget',\n 'DOMException',\n 'history',\n 'location',\n 'navigator',\n 'localStorage',\n 'matchMedia',\n 'getComputedStyle',\n 'requestAnimationFrame',\n 'cancelAnimationFrame',\n 'ResizeObserver',\n];\n\n/**\n * DomWindow:模拟的浏览器 window 环境。\n */\nexport class DomWindow extends EventTarget {\n public readonly window: DomWindow = this;\n public readonly document: Document;\n public readonly location: Location;\n public readonly history: History;\n public readonly localStorage = new Storage();\n public readonly navigator = new Navigator();\n public readonly Node = Node;\n public readonly Text = Text;\n public readonly Comment = Comment;\n public readonly Element = Element;\n public readonly HTMLElement = HTMLElement;\n public readonly HTMLInputElement = HTMLInputElement;\n public readonly HTMLTextAreaElement = HTMLTextAreaElement;\n public readonly HTMLSelectElement = HTMLSelectElement;\n public readonly HTMLButtonElement = HTMLButtonElement;\n public readonly HTMLOptionElement = HTMLOptionElement;\n public readonly HTMLStyleElement = HTMLStyleElement;\n public readonly HTMLAnchorElement = HTMLAnchorElement;\n public readonly DocumentFragment = DocumentFragment;\n public readonly Document = Document;\n public readonly Event = Event;\n public readonly MouseEvent = MouseEvent;\n public readonly KeyboardEvent = KeyboardEvent;\n public readonly CustomEvent = CustomEvent;\n public readonly EventTarget = EventTarget;\n public readonly DOMException = DOMException;\n public readonly NodeList = NodeList;\n\n constructor(options: { url?: string } = {}) {\n super();\n const url = options.url ?? 'http://localhost/';\n this.location = new Location(url);\n this.history = new History(this);\n this.document = new Document();\n (this.document as { defaultView: DomWindow | null }).defaultView = this;\n setupDocumentTree(this.document);\n }\n\n public matchMedia(query: string): MediaQueryList {\n return createMatchMedia(this, query);\n }\n\n public getComputedStyle(element: Element): CSSStyleDeclaration {\n return element.style;\n }\n\n public requestAnimationFrame(callback: FrameRequestCallback): number {\n return setTimeout(() => callback(Date.now()), 0) as unknown as number;\n }\n\n public cancelAnimationFrame(handle: number): void {\n clearTimeout(handle as unknown as ReturnType<typeof setTimeout>);\n }\n\n /** @internal */\n public setLocationUrl(url: string): void {\n this.location.href = url;\n }\n\n /** @internal 安装到目标对象上的全局属性名。 */\n public installKeys(): string[] {\n return [...DOM_GLOBAL_KEYS];\n }\n}\n\nexport interface DomWindowOptions {\n url?: string;\n}\n\n/**\n * 创建隔离的 DOM window 环境。\n */\nexport function createDomWindow(options: DomWindowOptions = {}): DomWindow {\n return new DomWindow(options);\n}\n\n/**\n * 将 DOM window 的全局属性安装到目标对象(默认 globalThis),\n * 返回可恢复旧值的函数。\n */\nexport function installDomGlobals(\n windowRef: DomWindow,\n target: Record<string, unknown> = globalThis as Record<string, unknown>\n): () => void {\n const previous = new Map<string, PropertyDescriptor | undefined>();\n const keys = windowRef.installKeys();\n for (const key of keys) {\n previous.set(key, Object.getOwnPropertyDescriptor(target, key));\n }\n for (const key of keys) {\n Object.defineProperty(target, key, {\n configurable: true,\n enumerable: true,\n writable: true,\n value: (windowRef as unknown as Record<string, unknown>)[key],\n });\n }\n Object.defineProperty(target, 'window', {\n configurable: true,\n enumerable: true,\n writable: true,\n value: windowRef,\n });\n\n return () => {\n for (const key of keys) {\n const descriptor = previous.get(key);\n if (descriptor) {\n Object.defineProperty(target, key, descriptor);\n } else {\n Reflect.deleteProperty(target, key);\n }\n }\n };\n}\n\n/**\n * 解析 HTML 片段为节点列表(innerHTML setter 用)。\n */\nexport function parseHtmlFragment(\n source: string,\n documentRef: Document | null\n): Node[] {\n const root = new DocumentFragment();\n if (documentRef) {\n root.ownerDocument = documentRef;\n }\n parseInto(root, source, documentRef);\n return [...root.childList];\n}\n\nfunction parseInto(\n parent: Node,\n source: string,\n documentRef: Document | null\n): void {\n const stack: Element[] = [];\n let current: Node = parent;\n let index = 0;\n const length = source.length;\n\n const append = (node: Node): void => {\n if (node.ownerDocument === null) {\n node.ownerDocument = documentRef;\n }\n current.appendChild(node);\n };\n\n while (index < length) {\n const openIndex = source.indexOf('<', index);\n if (openIndex < 0) {\n append(new Text(source.slice(index)));\n break;\n }\n if (openIndex > index) {\n append(new Text(source.slice(index, openIndex)));\n }\n if (source.startsWith('<!--', openIndex)) {\n const closeIndex = source.indexOf('-->', openIndex + 4);\n const commentEnd = closeIndex < 0 ? length : closeIndex;\n append(new Comment(source.slice(openIndex + 4, commentEnd)));\n index = closeIndex < 0 ? length : closeIndex + 3;\n continue;\n }\n const tagEnd = findTagEnd(source, openIndex);\n if (tagEnd < 0) {\n append(new Text(source.slice(openIndex)));\n break;\n }\n const tagSource = source.slice(openIndex + 1, tagEnd);\n const trimmed = tagSource.trim();\n if (trimmed.startsWith('/')) {\n const tagName = trimmed.slice(1).trim().toLowerCase();\n if (stack.length > 0 && stack[stack.length - 1].localName === tagName) {\n stack.pop();\n current = stack[stack.length - 1] ?? parent;\n }\n index = tagEnd + 1;\n continue;\n }\n const selfClosing = trimmed.endsWith('/');\n const parsed = parseTag(trimmed.replace(/\\/$/, '').trim());\n if (!parsed) {\n index = tagEnd + 1;\n continue;\n }\n const element = createElementForTag(parsed.name, documentRef);\n for (const attr of parsed.attributes) {\n element.setAttribute(attr.name, attr.value);\n }\n append(element);\n if (VOID_TAGS.has(parsed.name) || selfClosing) {\n index = tagEnd + 1;\n continue;\n }\n if (RAW_TEXT_TAGS.has(parsed.name)) {\n const closeTag = `</${parsed.name}>`;\n const rawEnd = source.toLowerCase().indexOf(closeTag, tagEnd + 1);\n const rawText = source.slice(tagEnd + 1, rawEnd < 0 ? length : rawEnd);\n element.appendChild(\n documentRef?.createTextNode(rawText) ?? new Text(rawText)\n );\n index = rawEnd < 0 ? length : rawEnd + closeTag.length;\n continue;\n }\n stack.push(element);\n current = element;\n index = tagEnd + 1;\n }\n}\n\nconst VOID_TAGS = new Set([\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr',\n]);\n\nconst RAW_TEXT_TAGS = new Set(['script', 'style', 'textarea', 'title']);\n\nfunction findTagEnd(source: string, openIndex: number): number {\n let inQuote: string | null = null;\n for (let index = openIndex + 1; index < source.length; index += 1) {\n const char = source[index];\n if (inQuote) {\n if (char === inQuote) {\n inQuote = null;\n }\n continue;\n }\n if (char === '\"' || char === \"'\") {\n inQuote = char;\n continue;\n }\n if (char === '>') {\n return index;\n }\n }\n return -1;\n}\n\nfunction parseTag(\n source: string\n): { name: string; attributes: Array<{ name: string; value: string }> } | null {\n const match = source.match(/^([a-zA-Z][a-zA-Z0-9-]*)\\s*(.*)$/);\n if (!match) {\n return null;\n }\n const name = match[1].toLowerCase();\n const attributes: Array<{ name: string; value: string }> = [];\n const attributeSource = match[2];\n const pattern =\n /([a-zA-Z_:][a-zA-Z0-9_:.-]*)(?:\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)'|([^\\s\"'=<>`]+)))?/g;\n let attributeMatch: RegExpExecArray | null;\n while ((attributeMatch = pattern.exec(attributeSource)) !== null) {\n const attrName = attributeMatch[1];\n const value =\n attributeMatch[2] ?? attributeMatch[3] ?? attributeMatch[4] ?? '';\n attributes.push({ name: attrName, value: decodeEntities(value) });\n }\n return { name, attributes };\n}\n\nfunction decodeEntities(value: string): string {\n return value\n .replace(/&amp;/g, '&')\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&#39;/g, \"'\")\n .replace(/&nbsp;/g, '\\u00a0');\n}\n\nfunction encodeText(value: string): string {\n return value\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;');\n}\n\nfunction encodeAttribute(value: string): string {\n return encodeText(value).replace(/\"/g, '&quot;');\n}\n\nfunction serializeNode(node: Node): string {\n switch (node.nodeType) {\n case DomNodeType.TEXT_NODE:\n return encodeText((node as Text).data);\n case DomNodeType.COMMENT_NODE:\n return `<!--${(node as Comment).data}-->`;\n case DomNodeType.ELEMENT_NODE:\n return serializeElement(node as Element);\n default:\n return '';\n }\n}\n\nfunction serializeElement(element: Element): string {\n const tag = element.localName;\n const attributes: string[] = [];\n for (const entry of element.attributeEntries()) {\n if (entry.name === 'style') {\n continue;\n }\n attributes.push(`${entry.name}=\"${encodeAttribute(entry.value)}\"`);\n }\n const inlineStyle = element.inlineStyleText();\n if (inlineStyle) {\n attributes.push(`style=\"${encodeAttribute(inlineStyle)}\"`);\n }\n const attributeText = attributes.length > 0 ? ` ${attributes.join(' ')}` : '';\n if (VOID_TAGS.has(tag)) {\n return `<${tag}${attributeText}>`;\n }\n if (RAW_TEXT_TAGS.has(tag)) {\n return `<${tag}${attributeText}>${element.textContent}</${tag}>`;\n }\n return `<${tag}${attributeText}>${serializeChildren(element)}</${tag}>`;\n}\n\nfunction serializeChildren(element: Element): string {\n return element.childList.map((child) => serializeNode(child)).join('');\n}\n\n/**\n * CSS 选择器引擎:支持 tag、#id、.class、[attr]、[attr=value]、复合与后代选择器。\n */\nfunction parseSelector(selector: string): SimpleSelector[][] {\n return selector.split(',').map((group) => {\n const segments: SimpleSelector[] = [];\n let index = 0;\n while (index < group.length) {\n while (index < group.length && group[index] === ' ') {\n index += 1;\n }\n if (index >= group.length) {\n break;\n }\n if (group[index] === '>') {\n segments.push({ type: 'child' });\n index += 1;\n continue;\n }\n const start = index;\n while (\n index < group.length &&\n group[index] !== ' ' &&\n group[index] !== '>'\n ) {\n index += 1;\n }\n segments.push(parseCompound(group.slice(start, index)));\n }\n return segments;\n });\n}\n\ntype SimpleSelector =\n | { type: 'universal' }\n | { type: 'tag'; name: string }\n | { type: 'id'; id: string }\n | { type: 'class'; className: string }\n | { type: 'attribute'; name: string; operator?: string; value?: string }\n | { type: 'compound'; parts: SimpleSelector[] }\n | { type: 'child' };\n\nfunction parseCompound(source: string): SimpleSelector {\n const selectors: SimpleSelector[] = [];\n let index = 0;\n while (index < source.length) {\n const char = source[index];\n if (char === '*') {\n selectors.push({ type: 'universal' });\n index += 1;\n } else if (char === '#') {\n const end = scanIdentifier(source, index + 1);\n selectors.push({ type: 'id', id: source.slice(index + 1, end) });\n index = end;\n } else if (char === '.') {\n const end = scanIdentifier(source, index + 1);\n selectors.push({\n type: 'class',\n className: source.slice(index + 1, end),\n });\n index = end;\n } else if (char === '[') {\n const end = source.indexOf(']', index);\n const inner = source\n .slice(index + 1, end < 0 ? source.length : end)\n .trim();\n const attrMatch = inner.match(\n /^([a-zA-Z_:][a-zA-Z0-9_:.-]*)(?:([~|^$*]?=)(?:\"([^\"]*)\"|'([^']*)'|([^\\s\"'=<>`]+)))?$/\n );\n if (attrMatch) {\n selectors.push({\n type: 'attribute',\n name: attrMatch[1],\n operator: attrMatch[2],\n value: attrMatch[3] ?? attrMatch[4] ?? attrMatch[5],\n });\n } else {\n selectors.push({ type: 'attribute', name: inner });\n }\n index = end < 0 ? source.length : end + 1;\n } else if (/[a-zA-Z_]/.test(char)) {\n const end = scanIdentifier(source, index);\n selectors.push({\n type: 'tag',\n name: source.slice(index, end).toLowerCase(),\n });\n index = end;\n } else {\n index += 1;\n }\n }\n if (selectors.length === 1) {\n return selectors[0];\n }\n return { type: 'compound', parts: selectors };\n}\n\nfunction scanIdentifier(source: string, start: number): number {\n let index = start;\n while (index < source.length && /[a-zA-Z0-9:_-]/.test(source[index])) {\n index += 1;\n }\n return index;\n}\n\nfunction matchSelector(element: Element, selector: string): boolean {\n const groups = parseSelector(selector);\n return groups.some((group) => matchGroup(element, group));\n}\n\nfunction matchGroup(element: Element, group: SimpleSelector[]): boolean {\n let index = group.length - 1;\n if (index < 0) {\n return true;\n }\n\n // The rightmost compound must match the queried element itself.\n if (!matchSegment(element, group[index])) {\n return false;\n }\n if (index === 0) {\n return true;\n }\n\n // Remaining compounds must match ancestors, right to left.\n let current: Element | null = element.parentElement;\n index -= 1;\n while (current) {\n const selector = group[index];\n if (!selector) {\n return true;\n }\n if (selector.type === 'child') {\n // The previously matched element must be the immediate child of this parent.\n const parentSelector = group[index - 1];\n if (!parentSelector || !matchSegment(current, parentSelector)) {\n return false;\n }\n index -= 2;\n if (index < 0) {\n return true;\n }\n current = current.parentElement;\n continue;\n }\n if (matchSegment(current, selector)) {\n index -= 1;\n if (index < 0) {\n return true;\n }\n }\n current = current.parentElement;\n }\n return false;\n}\n\nfunction matchSegment(element: Element, selector: SimpleSelector): boolean {\n switch (selector.type) {\n case 'universal':\n return true;\n case 'tag':\n return element.localName === selector.name;\n case 'id':\n return element.id === selector.id;\n case 'class':\n return element.classList.contains(selector.className);\n case 'attribute':\n return matchAttribute(element, selector);\n case 'compound':\n return selector.parts.every((part) => matchSegment(element, part));\n case 'child':\n return false;\n default:\n return false;\n }\n}\n\nfunction matchAttribute(\n element: Element,\n selector: { name: string; operator?: string; value?: string }\n): boolean {\n const attributeValue = element.getAttribute(selector.name);\n if (!selector.operator) {\n return attributeValue !== null;\n }\n if (attributeValue === null) {\n return false;\n }\n const expected = selector.value ?? '';\n switch (selector.operator) {\n case '=':\n return attributeValue === expected;\n case '~=':\n return attributeValue.split(/\\s+/).includes(expected);\n case '|=':\n return (\n attributeValue === expected || attributeValue.startsWith(`${expected}-`)\n );\n case '^=':\n return attributeValue.startsWith(expected);\n case '$=':\n return attributeValue.endsWith(expected);\n case '*=':\n return attributeValue.includes(expected);\n default:\n return false;\n }\n}\n\nfunction querySelectorAll(root: Node, selector: string): NodeList<Element> {\n const results: Element[] = [];\n collectElements(root, (element) => {\n if (element !== root && matchSelector(element, selector)) {\n results.push(element);\n }\n });\n return new NodeList(results);\n}\n\nfunction collectElements(root: Node, visit: (element: Element) => void): void {\n for (const child of root.childList) {\n if (child.nodeType === DomNodeType.ELEMENT_NODE) {\n visit(child as Element);\n collectElements(child, visit);\n }\n }\n}\n\nfunction createElementForTag(\n tagName: string,\n documentRef: Document | null\n): HTMLElement {\n const tag = tagName.toLowerCase();\n let element: HTMLElement;\n if (tag === 'input') {\n element = new HTMLInputElement(tag);\n } else if (tag === 'textarea') {\n element = new HTMLTextAreaElement(tag);\n } else if (tag === 'select') {\n element = new HTMLSelectElement(tag);\n } else if (tag === 'option') {\n element = new HTMLOptionElement(tag);\n } else if (tag === 'button') {\n element = new HTMLButtonElement(tag);\n } else if (tag === 'style') {\n element = new HTMLStyleElement(tag);\n } else if (tag === 'a') {\n element = new HTMLAnchorElement(tag);\n } else {\n element = new HTMLElement(tag);\n }\n element.ownerDocument = documentRef;\n return element;\n}\n\nfunction setupDocumentTree(documentRef: Document): void {\n const html = documentRef.createElement('html');\n html.setAttribute('lang', 'en');\n documentRef.appendChild(html);\n const head = documentRef.createElement('head');\n const body = documentRef.createElement('body');\n html.appendChild(head);\n html.appendChild(body);\n}\n\nfunction createDatasetProxy(element: Element): Record<string, string> {\n const handler: ProxyHandler<Record<string, string>> = {\n get(_target, property: string) {\n if (typeof property === 'symbol') {\n return undefined;\n }\n return element.getAttribute(`data-${toKebabCase(property)}`) ?? '';\n },\n set(_target, property: string, value: string): boolean {\n if (typeof property === 'symbol') {\n return true;\n }\n if (value === '' || value === null || value === undefined) {\n element.removeAttribute(`data-${toKebabCase(property)}`);\n } else {\n element.setAttribute(`data-${toKebabCase(property)}`, String(value));\n }\n return true;\n },\n deleteProperty(_target, property: string): boolean {\n if (typeof property !== 'symbol') {\n element.removeAttribute(`data-${toKebabCase(property)}`);\n }\n return true;\n },\n has(_target, property: string): boolean {\n if (typeof property === 'symbol') {\n return false;\n }\n return element.hasAttribute(`data-${toKebabCase(property)}`);\n },\n ownKeys() {\n const keys: string[] = [];\n for (const entry of element.attributeEntries()) {\n if (entry.name.startsWith('data-')) {\n keys.push(toCamelCase(entry.name.slice(5)));\n }\n }\n return keys;\n },\n getOwnPropertyDescriptor(_target, property: string) {\n if (typeof property === 'symbol') {\n return undefined;\n }\n if (element.hasAttribute(`data-${toKebabCase(property)}`)) {\n return {\n configurable: true,\n enumerable: true,\n writable: true,\n value: element.getAttribute(`data-${toKebabCase(property)}`),\n };\n }\n return undefined;\n },\n };\n return new Proxy({}, handler);\n}\n\nfunction toKebabCase(value: string): string {\n return value.replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`);\n}\n\nfunction toCamelCase(value: string): string {\n return value.replace(/-([a-z])/g, (_match, char: string) =>\n char.toUpperCase()\n );\n}\n"
5
+ "/**\n * 零依赖最小 DOM 实现。\n *\n * 供 SSR(CLI 项目渲染、docs 静态构建)与测试环境使用,\n * 覆盖 TSone 框架与测试实际依赖的 DOM 面(节点树、事件、CSS 选择器、\n * innerHTML 序列化/解析、history/location/localStorage 等)。\n * 仅面向本项目所需场景,不追求完整浏览器兼容。\n */\n\nexport const enum DomNodeType {\n ELEMENT_NODE = 1,\n TEXT_NODE = 3,\n COMMENT_NODE = 8,\n DOCUMENT_NODE = 9,\n DOCUMENT_FRAGMENT_NODE = 11,\n}\n\nexport class DOMException extends Error {\n public readonly code: number;\n\n constructor(message: string, name = 'Error') {\n super(message);\n this.name = name;\n this.code = 0;\n }\n}\n\ntype EventListenerRecord =\n | ((event: Event) => void)\n | { handleEvent(event: Event): void };\n\ninterface ListenerEntry {\n listener: EventListenerRecord;\n capture: boolean;\n once: boolean;\n passive: boolean;\n}\n\n/**\n * EventTarget 基类:addEventListener / removeEventListener / dispatchEvent。\n */\nexport class EventTarget {\n private readonly listenerMap = new Map<string, ListenerEntry[]>();\n\n public addEventListener(\n type: string,\n listener: EventListenerRecord | null,\n options?: boolean | AddEventListenerOptions\n ): void {\n if (!listener) {\n return;\n }\n const capture =\n typeof options === 'boolean' ? options : (options?.capture ?? false);\n const once = typeof options === 'object' ? (options.once ?? false) : false;\n const passive =\n typeof options === 'object' ? (options.passive ?? false) : false;\n let entries = this.listenerMap.get(type);\n if (!entries) {\n entries = [];\n this.listenerMap.set(type, entries);\n }\n if (\n entries.some(\n (entry) => entry.listener === listener && entry.capture === capture\n )\n ) {\n return;\n }\n entries.push({ listener, capture, once, passive });\n }\n\n public removeEventListener(\n type: string,\n listener: EventListenerRecord | null,\n options?: boolean | EventListenerOptions\n ): void {\n if (!listener) {\n return;\n }\n const capture =\n typeof options === 'boolean' ? options : (options?.capture ?? false);\n const entries = this.listenerMap.get(type);\n if (!entries) {\n return;\n }\n const index = entries.findIndex(\n (entry) => entry.listener === listener && entry.capture === capture\n );\n if (index >= 0) {\n entries.splice(index, 1);\n }\n if (entries.length === 0) {\n this.listenerMap.delete(type);\n }\n }\n\n public dispatchEvent(event: Event): boolean {\n if (!(event instanceof Event)) {\n throw new TypeError('dispatchEvent requires an Event instance');\n }\n if (event.dispatched) {\n throw new Error('Event has already been dispatched');\n }\n return dispatchOnTarget(this, event);\n }\n\n /** @internal 返回本节点的监听器。 */\n public getListeners(type: string): ListenerEntry[] {\n return this.listenerMap.get(type) ?? [];\n }\n}\n\nexport class Event {\n public static readonly NONE = 0;\n public static readonly CAPTURING_PHASE = 1;\n public static readonly AT_TARGET = 2;\n public static readonly BUBBLING_PHASE = 3;\n\n public readonly type: string;\n public readonly bubbles: boolean;\n public readonly cancelable: boolean;\n public readonly composed: boolean;\n public target: EventTarget | null = null;\n public currentTarget: EventTarget | null = null;\n public eventPhase = Event.NONE;\n public defaultPrevented = false;\n public readonly isTrusted = false;\n public readonly timeStamp: number;\n public cancelBubble = false;\n\n /** @internal */\n public dispatched = false;\n /** @internal */\n private propagationStopped = false;\n /** @internal */\n private immediateStopped = false;\n /** @internal */\n private canceled = false;\n\n constructor(type: string, init?: EventInit) {\n this.type = type;\n this.bubbles = init?.bubbles ?? false;\n this.cancelable = init?.cancelable ?? false;\n this.composed = init?.composed ?? false;\n this.timeStamp = Date.now();\n }\n\n public preventDefault(): void {\n if (this.cancelable) {\n this.canceled = true;\n }\n }\n\n public stopPropagation(): void {\n this.propagationStopped = true;\n this.cancelBubble = true;\n }\n\n public stopImmediatePropagation(): void {\n this.propagationStopped = true;\n this.immediateStopped = true;\n this.cancelBubble = true;\n }\n\n /** @internal */\n public propagationPrevented(): boolean {\n return this.propagationStopped;\n }\n\n /** @internal */\n public immediatePrevented(): boolean {\n return this.immediateStopped;\n }\n\n /** @internal */\n public wasCanceled(): boolean {\n return this.canceled;\n }\n}\n\nexport class CustomEvent<T = unknown> extends Event {\n public readonly detail: T;\n\n constructor(type: string, init?: CustomEventInit<T>) {\n super(type, init);\n this.detail = init?.detail as T;\n }\n}\n\nexport class MouseEvent extends Event {\n public readonly clientX: number;\n public readonly clientY: number;\n public readonly button: number;\n public readonly buttons: number;\n public readonly relatedTarget: unknown;\n\n constructor(type: string, init?: MouseEventInit) {\n super(type, init);\n this.clientX = init?.clientX ?? 0;\n this.clientY = init?.clientY ?? 0;\n this.button = init?.button ?? 0;\n this.buttons = init?.buttons ?? 0;\n this.relatedTarget = init?.relatedTarget ?? null;\n }\n}\n\nexport class KeyboardEvent extends Event {\n public readonly key: string;\n public readonly code: string;\n\n constructor(type: string, init?: KeyboardEventInit) {\n super(type, init);\n this.key = init?.key ?? '';\n this.code = init?.code ?? '';\n }\n}\n\nfunction invokeListener(listener: ListenerEntry, event: Event): void {\n const record = listener.listener;\n if (typeof record === 'function') {\n record.call(event.currentTarget, event);\n } else {\n record.handleEvent(event);\n }\n}\n\nfunction dispatchOnTarget(target: EventTarget, event: Event): boolean {\n event.dispatched = true;\n event.target = target;\n\n const chain = buildEventPath(target);\n const capturePath = [...chain].reverse();\n const targetIndex = capturePath.length - 1;\n\n event.eventPhase = Event.CAPTURING_PHASE;\n for (let index = 0; index < targetIndex; index += 1) {\n const current = capturePath[index];\n if (event.propagationPrevented()) {\n break;\n }\n event.currentTarget = current;\n runListeners(current, event, true);\n }\n\n if (!event.propagationPrevented()) {\n event.eventPhase = Event.AT_TARGET;\n event.currentTarget = target;\n runListeners(target, event, true);\n if (!event.immediatePrevented()) {\n runListeners(target, event, false);\n }\n }\n\n if (event.bubbles && !event.propagationPrevented()) {\n event.eventPhase = Event.BUBBLING_PHASE;\n for (let index = capturePath.length - 2; index >= 0; index -= 1) {\n const current = capturePath[index];\n if (event.propagationPrevented()) {\n break;\n }\n event.currentTarget = current;\n runListeners(current, event, false);\n }\n }\n\n event.eventPhase = Event.NONE;\n event.currentTarget = null;\n return !event.wasCanceled();\n}\n\nfunction runListeners(\n target: EventTarget,\n event: Event,\n capture: boolean\n): void {\n const listeners = target.getListeners(event.type);\n for (const entry of [...listeners]) {\n if (entry.capture !== capture) {\n continue;\n }\n if (event.immediatePrevented()) {\n break;\n }\n if (entry.once) {\n target.removeEventListener(event.type, entry.listener, {\n capture: entry.capture,\n });\n }\n invokeListener(entry, event);\n }\n}\n\nfunction buildEventPath(target: EventTarget): EventTarget[] {\n const path: EventTarget[] = [];\n let current: EventTarget | null = target;\n while (current) {\n path.push(current);\n const node = current as unknown as Node;\n if (node.nodeType === DomNodeType.DOCUMENT_NODE) {\n const view = (node as Document).defaultView;\n if (view) {\n path.push(view);\n }\n break;\n }\n const parent = node.parentNode;\n if (parent) {\n current = parent;\n continue;\n }\n break;\n }\n return path;\n}\n\nexport class DOMTokenList implements Iterable<string> {\n private readonly element: Element;\n private readonly attributeName: string;\n\n constructor(element: Element, attributeName = 'class') {\n this.element = element;\n this.attributeName = attributeName;\n }\n\n public get length(): number {\n return this.tokens().length;\n }\n\n public get value(): string {\n return this.element.getAttribute(this.attributeName) ?? '';\n }\n\n public set value(value: string) {\n this.setTokens(splitTokens(value));\n }\n\n public item(index: number): string | null {\n return this.tokens()[index] ?? null;\n }\n\n public contains(token: string): boolean {\n return this.tokens().includes(token);\n }\n\n public add(...tokens: string[]): void {\n const current = new Set(this.tokens());\n for (const token of tokens) {\n if (token) {\n current.add(token);\n }\n }\n this.setTokens([...current]);\n }\n\n public remove(...tokens: string[]): void {\n const current = new Set(this.tokens());\n for (const token of tokens) {\n current.delete(token);\n }\n this.setTokens([...current]);\n }\n\n public toggle(token: string, force?: boolean): boolean {\n const current = new Set(this.tokens());\n const shouldAdd = force ?? !current.has(token);\n if (shouldAdd) {\n current.add(token);\n } else {\n current.delete(token);\n }\n this.setTokens([...current]);\n return shouldAdd;\n }\n\n public replace(oldToken: string, newToken: string): boolean {\n const current = this.tokens();\n const index = current.indexOf(oldToken);\n if (index < 0) {\n return false;\n }\n current[index] = newToken;\n this.setTokens(current);\n return true;\n }\n\n public [Symbol.iterator](): Iterator<string> {\n return this.tokens()[Symbol.iterator]();\n }\n\n public forEach(\n callback: (value: string, index: number, list: DOMTokenList) => void\n ): void {\n this.tokens().forEach((value, index) => callback(value, index, this));\n }\n\n public toString(): string {\n return this.value;\n }\n\n private tokens(): string[] {\n return splitTokens(this.element.getAttribute(this.attributeName) ?? '');\n }\n\n private setTokens(tokens: string[]): void {\n const value = tokens.filter(Boolean).join(' ');\n if (value) {\n this.element.setAttribute(this.attributeName, value);\n } else {\n this.element.removeAttribute(this.attributeName);\n }\n }\n}\n\nfunction splitTokens(value: string): string[] {\n return value.trim().split(/\\s+/).filter(Boolean);\n}\n\nfunction normalizeCssProperty(property: string): string {\n return property.replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`);\n}\n\ninterface StyleTarget {\n properties: Map<string, { value: string; priority: string }>;\n setProperty(property: string, value: string, priority?: string): void;\n getPropertyValue(property: string): string;\n getPropertyPriority(property: string): string;\n removeProperty(property: string): string;\n item(index: number): string;\n readonly length: number;\n cssText: string;\n}\n\n/**\n * 创建 CSSStyleDeclaration 代理,支持任意 camelCase 属性访问与赋值。\n */\nexport function createStyleDeclaration(): CSSStyleDeclaration {\n const properties = new Map<string, { value: string; priority: string }>();\n\n const target: StyleTarget = {\n properties,\n\n setProperty(property: string, value: string, priority = ''): void {\n const name = normalizeCssProperty(property);\n if (value === '') {\n properties.delete(name);\n } else {\n properties.set(name, { value, priority });\n }\n },\n\n getPropertyValue(property: string): string {\n return properties.get(normalizeCssProperty(property))?.value ?? '';\n },\n\n getPropertyPriority(property: string): string {\n return properties.get(normalizeCssProperty(property))?.priority ?? '';\n },\n\n removeProperty(property: string): string {\n const name = normalizeCssProperty(property);\n const previous = properties.get(name)?.value ?? '';\n properties.delete(name);\n return previous;\n },\n\n item(index: number): string {\n return [...properties.keys()][index] ?? '';\n },\n\n get length(): number {\n return properties.size;\n },\n\n get cssText(): string {\n return [...properties.entries()]\n .map(\n ([name, entry]) =>\n `${name}: ${entry.value}${entry.priority ? ` ${entry.priority}` : ''};`\n )\n .join(' ');\n },\n\n set cssText(value: string) {\n properties.clear();\n for (const declaration of value.split(';')) {\n const trimmed = declaration.trim();\n if (!trimmed) {\n continue;\n }\n const separator = trimmed.indexOf(':');\n if (separator < 0) {\n continue;\n }\n const name = trimmed.slice(0, separator).trim();\n const propertyValue = trimmed.slice(separator + 1).trim();\n if (name) {\n target.setProperty(name, propertyValue);\n }\n }\n },\n };\n\n const handler: ProxyHandler<StyleTarget> = {\n get(t, property, receiver) {\n if (typeof property === 'symbol') {\n return Reflect.get(t, property, receiver);\n }\n if (property in t) {\n const value = Reflect.get(t, property, receiver);\n return typeof value === 'function' ? value.bind(t) : value;\n }\n return t.getPropertyValue(property);\n },\n set(t, property, value, receiver) {\n if (typeof property === 'symbol') {\n return Reflect.set(t, property, value, receiver);\n }\n if (property in t) {\n return Reflect.set(t, property, value, receiver);\n }\n t.setProperty(property, String(value));\n return true;\n },\n has(t, property) {\n if (typeof property === 'symbol') {\n return Reflect.has(t, property);\n }\n if (property in t) {\n return true;\n }\n return t.getPropertyValue(property) !== '';\n },\n ownKeys() {\n return [\n ...Reflect.ownKeys(target),\n ...[...properties.keys()].map((name) => camelCaseProperty(name)),\n ];\n },\n getOwnPropertyDescriptor(t, property) {\n if (typeof property === 'symbol') {\n return Reflect.getOwnPropertyDescriptor(t, property);\n }\n if (property in t) {\n return Reflect.getOwnPropertyDescriptor(t, property);\n }\n const value = t.getPropertyValue(property);\n if (value !== '') {\n return { configurable: true, enumerable: true, writable: true, value };\n }\n return undefined;\n },\n };\n\n return new Proxy(target, handler) as unknown as CSSStyleDeclaration;\n}\n\nfunction camelCaseProperty(property: string): string {\n return property.replace(/-([a-z])/g, (_match, char: string) =>\n char.toUpperCase()\n );\n}\n\n/**\n * 类数组节点列表:支持 .length、.item()、数值索引与迭代。\n */\nexport class NodeList<T extends Node = Node> implements Iterable<T> {\n /** @internal */\n private readonly items: T[];\n\n constructor(items: T[] = []) {\n this.items = items;\n for (let index = 0; index < items.length; index += 1) {\n Object.defineProperty(this, String(index), {\n configurable: true,\n enumerable: true,\n get: () => this.items[index],\n });\n }\n }\n\n public get length(): number {\n return this.items.length;\n }\n\n public item(index: number): T | null {\n return this.items[index] ?? null;\n }\n\n public [Symbol.iterator](): Iterator<T> {\n return this.items[Symbol.iterator]();\n }\n\n public forEach(\n callback: (value: T, index: number, list: NodeList<T>) => void\n ): void {\n this.items.forEach((value, index) => callback(value, index, this));\n }\n\n public entries(): IterableIterator<[number, T]> {\n return this.items.entries();\n }\n\n public keys(): IterableIterator<number> {\n return this.items.keys();\n }\n\n public values(): IterableIterator<T> {\n return this.items.values();\n }\n\n public toArray(): T[] {\n return [...this.items];\n }\n}\n\n/**\n * Node 基类:节点树、父子关系、文本内容。\n */\nexport class Node extends EventTarget {\n public static readonly ELEMENT_NODE = DomNodeType.ELEMENT_NODE;\n public static readonly TEXT_NODE = DomNodeType.TEXT_NODE;\n public static readonly COMMENT_NODE = DomNodeType.COMMENT_NODE;\n public static readonly DOCUMENT_NODE = DomNodeType.DOCUMENT_NODE;\n public static readonly DOCUMENT_FRAGMENT_NODE =\n DomNodeType.DOCUMENT_FRAGMENT_NODE;\n\n public readonly nodeType: number;\n public readonly nodeName: string;\n public parentNode: Node | null = null;\n public ownerDocument: Document | null = null;\n\n /** @internal */\n public childList: Node[] = [];\n\n constructor(nodeType: number, nodeName: string) {\n super();\n this.nodeType = nodeType;\n this.nodeName = nodeName;\n }\n\n public get parentElement(): Element | null {\n const parent = this.parentNode;\n return parent instanceof Element ? parent : null;\n }\n\n public get childNodes(): NodeList<Node> {\n return new NodeList([...this.childList]);\n }\n\n public get firstChild(): Node | null {\n return this.childList[0] ?? null;\n }\n\n public get lastChild(): Node | null {\n return this.childList[this.childList.length - 1] ?? null;\n }\n\n public get nextSibling(): Node | null {\n const parent = this.parentNode;\n if (!parent) {\n return null;\n }\n const index = parent.childList.indexOf(this);\n return index >= 0 ? (parent.childList[index + 1] ?? null) : null;\n }\n\n public get previousSibling(): Node | null {\n const parent = this.parentNode;\n if (!parent) {\n return null;\n }\n const index = parent.childList.indexOf(this);\n return index > 0 ? parent.childList[index - 1] : null;\n }\n\n public get textContent(): string {\n let text = '';\n for (const child of this.childList) {\n if (child.nodeType === DomNodeType.TEXT_NODE) {\n text += (child as Text).data;\n } else if (child.nodeType === DomNodeType.ELEMENT_NODE) {\n text += child.textContent;\n }\n }\n return text;\n }\n\n public set textContent(value: string) {\n this.childList = [];\n if (value) {\n const textNode = new Text(value);\n textNode.ownerDocument = this.ownerDocument;\n textNode.parentNode = this;\n this.childList.push(textNode);\n }\n }\n\n public hasChildNodes(): boolean {\n return this.childList.length > 0;\n }\n\n public appendChild<T extends Node>(node: T): T {\n if (node === (this as Node)) {\n throw new Error('Cannot append a node to itself');\n }\n this.insertBefore(node, null);\n return node;\n }\n\n public insertBefore<T extends Node>(node: T, reference: Node | null): T {\n if (node === (this as Node)) {\n throw new Error('Cannot insert a node before itself');\n }\n if (node.parentNode) {\n node.parentNode.removeChild(node);\n }\n node.parentNode = this;\n if (node.ownerDocument === null) {\n node.ownerDocument = this.ownerDocument;\n }\n if (reference === null) {\n this.childList.push(node);\n return node;\n }\n const index = this.childList.indexOf(reference);\n if (index < 0) {\n throw new Error('Reference node is not a child of this node');\n }\n this.childList.splice(index, 0, node);\n return node;\n }\n\n public removeChild<T extends Node>(node: T): T {\n const index = this.childList.indexOf(node);\n if (index < 0) {\n throw new Error('Node is not a child of this node');\n }\n this.childList.splice(index, 1);\n node.parentNode = null;\n return node;\n }\n\n public replaceChild<T extends Node>(newChild: T, oldChild: Node): T {\n const index = this.childList.indexOf(oldChild);\n if (index < 0) {\n throw new Error('Old child is not a child of this node');\n }\n if (newChild.parentNode) {\n newChild.parentNode.removeChild(newChild);\n }\n newChild.parentNode = this;\n if (newChild.ownerDocument === null) {\n newChild.ownerDocument = this.ownerDocument;\n }\n this.childList[index] = newChild;\n oldChild.parentNode = null;\n return newChild;\n }\n\n public replaceChildren(...nodes: Node[]): void {\n for (const child of [...this.childList]) {\n this.removeChild(child);\n }\n for (const node of nodes) {\n this.appendChild(node);\n }\n }\n\n public contains(node: Node | null): boolean {\n if (!node) {\n return false;\n }\n let current: Node | null = node;\n while (current) {\n if (current === this) {\n return true;\n }\n current = current.parentNode;\n }\n return false;\n }\n\n public remove(): void {\n this.parentNode?.removeChild(this);\n }\n\n public cloneNode(deep = false): Node {\n const clone = this.createClone();\n if (deep) {\n for (const child of this.childList) {\n clone.appendChild(child.cloneNode(true) as Node);\n }\n }\n return clone;\n }\n\n /** @internal */\n protected createClone(): Node {\n const clone = new Node(this.nodeType, this.nodeName);\n clone.ownerDocument = this.ownerDocument;\n return clone;\n }\n\n public getRootNode(): Node {\n if (!this.parentNode) {\n return this;\n }\n let parent = this.parentNode;\n while (parent.parentNode) {\n parent = parent.parentNode;\n }\n return parent;\n }\n\n public isConnected(): boolean {\n return this.getRootNode().nodeType === DomNodeType.DOCUMENT_NODE;\n }\n}\n\n/**\n * Element:标签节点。\n */\nexport class Element extends Node {\n public readonly namespaceURI: string | null;\n\n /** @internal */\n private readonly attributeList: Array<{ name: string; value: string }> = [];\n /** @internal */\n private styleValue: CSSStyleDeclaration | undefined;\n /** @internal */\n private classListValue: DOMTokenList | undefined;\n /** @internal */\n private datasetProxy: Record<string, string> | undefined;\n\n constructor(tagName: string, namespaceURI: string | null = null) {\n super(DomNodeType.ELEMENT_NODE, tagName.toUpperCase());\n this.namespaceURI = namespaceURI;\n }\n\n public get tagName(): string {\n return this.nodeName;\n }\n\n public get localName(): string {\n return this.nodeName.toLowerCase();\n }\n\n public get id(): string {\n return this.getAttribute('id') ?? '';\n }\n\n public set id(value: string) {\n this.setAttribute('id', value);\n }\n\n public get className(): string {\n return this.getAttribute('class') ?? '';\n }\n\n public set className(value: string) {\n this.setAttribute('class', value);\n }\n\n public get classList(): DOMTokenList {\n if (!this.classListValue) {\n this.classListValue = new DOMTokenList(this, 'class');\n }\n return this.classListValue;\n }\n\n public get style(): CSSStyleDeclaration {\n if (!this.styleValue) {\n this.styleValue = createStyleDeclaration();\n }\n return this.styleValue;\n }\n\n public get dataset(): Record<string, string> {\n if (!this.datasetProxy) {\n this.datasetProxy = createDatasetProxy(this);\n }\n return this.datasetProxy;\n }\n\n public get children(): NodeList<Element> {\n return new NodeList(\n this.childList.filter(\n (child): child is Element => child.nodeType === DomNodeType.ELEMENT_NODE\n )\n );\n }\n\n public get firstElementChild(): Element | null {\n return this.children.item(0);\n }\n\n public get lastElementChild(): Element | null {\n return this.children.item(this.children.length - 1);\n }\n\n public get childElementCount(): number {\n return this.children.length;\n }\n\n public get attributes(): NamedNodeMap {\n return new NamedNodeMap(this);\n }\n\n public getAttribute(name: string): string | null {\n const entry = this.findAttribute(name);\n return entry ? entry.value : null;\n }\n\n public getAttributeNames(): string[] {\n return this.attributeList.map((entry) => entry.name);\n }\n\n public setAttribute(name: string, value: unknown): void {\n const stringValue = String(value);\n if (name === 'style') {\n this.styleValue = createStyleDeclaration();\n this.styleValue.cssText = stringValue;\n }\n const entry = this.findAttribute(name);\n if (entry) {\n entry.value = stringValue;\n } else {\n this.attributeList.push({ name, value: stringValue });\n }\n }\n\n public removeAttribute(name: string): void {\n if (name === 'style') {\n this.styleValue = createStyleDeclaration();\n }\n const index = this.attributeList.findIndex((entry) => entry.name === name);\n if (index >= 0) {\n this.attributeList.splice(index, 1);\n }\n }\n\n public hasAttribute(name: string): boolean {\n return this.findAttribute(name) !== undefined;\n }\n\n public toggleAttribute(name: string, force?: boolean): boolean {\n const shouldAdd = force ?? !this.hasAttribute(name);\n if (shouldAdd) {\n this.setAttribute(name, '');\n } else {\n this.removeAttribute(name);\n }\n return shouldAdd;\n }\n\n public hasAttributes(): boolean {\n return this.attributeList.length > 0;\n }\n\n public get innerHTML(): string {\n return serializeChildren(this);\n }\n\n public set innerHTML(value: string) {\n this.replaceChildren(...parseHtmlFragment(value, this.ownerDocument));\n }\n\n public get outerHTML(): string {\n return serializeNode(this);\n }\n\n public get value(): string {\n return this.getAttribute('value') ?? '';\n }\n\n public set value(value: string) {\n this.setAttribute('value', value);\n }\n\n public querySelector(selector: string): Element | null {\n return querySelectorAll(this, selector).item(0);\n }\n\n public querySelectorAll(selector: string): NodeList<Element> {\n return querySelectorAll(this, selector);\n }\n\n public getElementsByTagName(tagName: string): NodeList<Element> {\n const lowered = tagName.toLowerCase();\n const results: Element[] = [];\n collectElements(this, (element) => {\n if (element.localName === lowered) {\n results.push(element);\n }\n });\n return new NodeList(results);\n }\n\n public matches(selector: string): boolean {\n return matchSelector(this, selector);\n }\n\n public closest(selector: string): Element | null {\n if (this.matches(selector)) {\n return this;\n }\n let parent = this.parentElement;\n while (parent) {\n if (parent.matches(selector)) {\n return parent;\n }\n parent = parent.parentElement;\n }\n return null;\n }\n\n public getBoundingClientRect(): DOMRect {\n return {\n x: 0,\n y: 0,\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n width: 0,\n height: 0,\n toJSON(): Record<string, number> {\n return {\n x: 0,\n y: 0,\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n width: 0,\n height: 0,\n };\n },\n };\n }\n\n public scrollIntoView(): void {}\n\n public focus(): void {}\n\n public blur(): void {}\n\n public click(): void {\n this.dispatchEvent(\n new MouseEvent('click', { bubbles: true, cancelable: true })\n );\n }\n\n public append(...nodes: (Node | string)[]): void {\n for (const node of nodes) {\n if (typeof node === 'string') {\n const textNode = new Text(node);\n textNode.ownerDocument = this.ownerDocument;\n this.appendChild(textNode);\n } else {\n this.appendChild(node);\n }\n }\n }\n\n public prepend(...nodes: (Node | string)[]): void {\n const reference = this.firstChild;\n for (const node of nodes) {\n if (typeof node === 'string') {\n const textNode = new Text(node);\n textNode.ownerDocument = this.ownerDocument;\n this.insertBefore(textNode, reference);\n } else {\n this.insertBefore(node, reference);\n }\n }\n }\n\n public before(...nodes: (Node | string)[]): void {\n const parent = this.parentNode;\n if (!parent) {\n return;\n }\n for (const node of nodes) {\n if (typeof node === 'string') {\n const textNode = new Text(node);\n textNode.ownerDocument = this.ownerDocument;\n parent.insertBefore(textNode, this);\n } else {\n parent.insertBefore(node, this);\n }\n }\n }\n\n public after(...nodes: (Node | string)[]): void {\n const parent = this.parentNode;\n if (!parent) {\n return;\n }\n const reference = this.nextSibling;\n for (const node of nodes) {\n if (typeof node === 'string') {\n const textNode = new Text(node);\n textNode.ownerDocument = this.ownerDocument;\n parent.insertBefore(textNode, reference);\n } else {\n parent.insertBefore(node, reference);\n }\n }\n }\n\n public replaceWith(...nodes: (Node | string)[]): void {\n const parent = this.parentNode;\n if (!parent) {\n return;\n }\n const reference = this.nextSibling;\n parent.removeChild(this);\n for (const node of nodes) {\n if (typeof node === 'string') {\n const textNode = new Text(node);\n textNode.ownerDocument = this.ownerDocument;\n parent.insertBefore(textNode, reference);\n } else {\n parent.insertBefore(node, reference);\n }\n }\n }\n\n public setAttributeNS(\n _namespace: string,\n name: string,\n value: unknown\n ): void {\n this.setAttribute(name, value);\n }\n\n public removeAttributeNS(_namespace: string, name: string): void {\n this.removeAttribute(name);\n }\n\n public hasAttributeNS(_namespace: string, name: string): boolean {\n return this.hasAttribute(name);\n }\n\n public getAttributeNS(_namespace: string, name: string): string | null {\n return this.getAttribute(name);\n }\n\n /** @internal */\n public findAttribute(\n name: string\n ): { name: string; value: string } | undefined {\n return this.attributeList.find((entry) => entry.name === name);\n }\n\n /** @internal */\n public attributeEntries(): Array<{ name: string; value: string }> {\n return [...this.attributeList];\n }\n\n /** @internal 供序列化读取内联样式。 */\n public inlineStyleText(): string {\n return this.styleValue?.cssText ?? '';\n }\n\n /** @internal */\n protected createClone(): Node {\n const clone = createElementForTag(this.localName, this.ownerDocument);\n for (const entry of this.attributeList) {\n clone.setAttribute(entry.name, entry.value);\n }\n return clone;\n }\n}\n\nexport class HTMLElement extends Element {\n constructor(tagName: string) {\n super(tagName);\n }\n}\n\nexport class NamedNodeMap implements Iterable<{ name: string; value: string }> {\n private readonly element: Element;\n\n constructor(element: Element) {\n this.element = element;\n for (let index = 0; index < element.attributeEntries().length; index += 1) {\n Object.defineProperty(this, String(index), {\n configurable: true,\n enumerable: true,\n get: () => this.element.attributeEntries()[index] ?? null,\n });\n }\n }\n\n public get length(): number {\n return this.element.attributeEntries().length;\n }\n\n public item(index: number): { name: string; value: string } | null {\n return this.element.attributeEntries()[index] ?? null;\n }\n\n public getNamedItem(name: string): { name: string; value: string } | null {\n return this.element.findAttribute(name) ?? null;\n }\n\n public setNamedItem(attr: { name: string; value: string }): void {\n this.element.setAttribute(attr.name, attr.value);\n }\n\n public removeNamedItem(name: string): void {\n this.element.removeAttribute(name);\n }\n\n public [Symbol.iterator](): Iterator<{ name: string; value: string }> {\n return this.element.attributeEntries()[Symbol.iterator]();\n }\n}\n\nexport class HTMLOptionElement extends HTMLElement {\n /** @internal */\n private selectedValue: boolean | undefined;\n\n constructor(tagName = 'option') {\n super(tagName);\n }\n\n public get value(): string {\n return this.getAttribute('value') ?? this.textContent;\n }\n\n public set value(value: string) {\n this.setAttribute('value', value);\n }\n\n public get text(): string {\n return this.textContent;\n }\n\n public get label(): string {\n return this.getAttribute('label') ?? this.textContent;\n }\n\n public get selected(): boolean {\n return this.hasSelectedValue();\n }\n\n public set selected(value: boolean) {\n this.setSelectedRaw(value);\n if (value) {\n const select = this.parentElement;\n if (select instanceof HTMLSelectElement && !select.multiple) {\n for (const option of select.options.toArray()) {\n if (option !== this) {\n option.setSelectedRaw(false);\n }\n }\n }\n }\n }\n\n /** @internal */\n public setSelectedRaw(value: boolean): void {\n this.selectedValue = value;\n if (value) {\n this.setAttribute('selected', '');\n } else {\n this.removeAttribute('selected');\n }\n }\n\n /** @internal */\n public hasSelectedValue(): boolean {\n if (this.selectedValue !== undefined) {\n return this.selectedValue;\n }\n return this.hasAttribute('selected');\n }\n}\n\nexport class HTMLSelectElement extends HTMLElement {\n constructor(tagName = 'select') {\n super(tagName);\n }\n\n public get multiple(): boolean {\n return this.hasAttribute('multiple');\n }\n\n public set multiple(value: boolean) {\n if (value) {\n this.setAttribute('multiple', '');\n } else {\n this.removeAttribute('multiple');\n }\n }\n\n public get options(): HTMLOptionsCollection {\n const options: HTMLOptionElement[] = [];\n collectElements(this, (element) => {\n if (element instanceof HTMLOptionElement) {\n options.push(element);\n }\n });\n return new HTMLOptionsCollection(options);\n }\n\n public get selectedOptions(): NodeList<HTMLOptionElement> {\n return new NodeList(\n this.options.toArray().filter((option) => option.hasSelectedValue())\n );\n }\n\n public get selectedIndex(): number {\n return this.options\n .toArray()\n .findIndex((option) => option.hasSelectedValue());\n }\n\n public set selectedIndex(index: number) {\n const options = this.options.toArray();\n options.forEach((option, optionIndex) =>\n option.setSelectedRaw(optionIndex === index)\n );\n }\n\n public get value(): string {\n const options = this.options.toArray();\n const selected = options.find((option) => option.hasSelectedValue());\n if (selected) {\n return selected.value;\n }\n if (!this.multiple && options.length > 0) {\n return options[0].value;\n }\n return '';\n }\n\n public set value(value: string) {\n const options = this.options.toArray();\n for (const option of options) {\n const shouldSelect = option.value === value;\n if (shouldSelect) {\n if (this.multiple) {\n option.setSelectedRaw(true);\n } else {\n for (const other of options) {\n other.setSelectedRaw(other === option);\n }\n return;\n }\n }\n }\n }\n\n public add(option: HTMLOptionElement): void {\n this.appendChild(option);\n }\n\n public removeOption(index: number): void {\n const options = this.options.toArray();\n const option = options[index];\n if (option) {\n option.remove();\n }\n }\n}\n\nexport class HTMLOptionsCollection implements Iterable<HTMLOptionElement> {\n private readonly items: HTMLOptionElement[];\n\n constructor(items: HTMLOptionElement[]) {\n this.items = items;\n for (let index = 0; index < items.length; index += 1) {\n Object.defineProperty(this, String(index), {\n configurable: true,\n enumerable: true,\n get: () => this.items[index],\n });\n }\n }\n\n public get length(): number {\n return this.items.length;\n }\n\n public item(index: number): HTMLOptionElement | null {\n return this.items[index] ?? null;\n }\n\n public get value(): string {\n return this.items.find((option) => option.hasSelectedValue())?.value ?? '';\n }\n\n public get selectedIndex(): number {\n return this.items.findIndex((option) => option.hasSelectedValue());\n }\n\n public toArray(): HTMLOptionElement[] {\n return [...this.items];\n }\n\n public [Symbol.iterator](): Iterator<HTMLOptionElement> {\n return this.items[Symbol.iterator]();\n }\n}\n\nexport class HTMLInputElement extends HTMLElement {\n /** @internal */\n private inputValue: string | undefined;\n /** @internal */\n private checkedValue: boolean | undefined;\n\n constructor(tagName = 'input') {\n super(tagName);\n }\n\n public get type(): string {\n return this.getAttribute('type') ?? 'text';\n }\n\n public set type(value: string) {\n this.setAttribute('type', value);\n }\n\n public get name(): string {\n return this.getAttribute('name') ?? '';\n }\n\n public set name(value: string) {\n this.setAttribute('name', value);\n }\n\n public get value(): string {\n return this.inputValue ?? this.getAttribute('value') ?? '';\n }\n\n public set value(value: string) {\n this.inputValue = value;\n }\n\n public get defaultValue(): string {\n return this.getAttribute('value') ?? '';\n }\n\n public get checked(): boolean {\n return this.checkedValue ?? this.hasAttribute('checked');\n }\n\n public set checked(value: boolean) {\n this.checkedValue = value;\n }\n\n public get disabled(): boolean {\n return this.hasAttribute('disabled');\n }\n\n public set disabled(value: boolean) {\n if (value) {\n this.setAttribute('disabled', '');\n } else {\n this.removeAttribute('disabled');\n }\n }\n\n /** @internal */\n protected createClone(): Node {\n const clone = super.createClone() as HTMLInputElement;\n clone.inputValue = this.inputValue;\n clone.checkedValue = this.checkedValue;\n return clone;\n }\n}\n\nexport class HTMLTextAreaElement extends HTMLElement {\n /** @internal */\n private textareaValue: string | undefined;\n\n constructor(tagName = 'textarea') {\n super(tagName);\n }\n\n public get value(): string {\n return this.textareaValue ?? this.textContent;\n }\n\n public set value(value: string) {\n this.textareaValue = value;\n }\n}\n\nexport class HTMLButtonElement extends HTMLElement {\n constructor(tagName = 'button') {\n super(tagName);\n }\n\n public get type(): string {\n return this.getAttribute('type') ?? 'submit';\n }\n}\n\nexport class HTMLStyleElement extends HTMLElement {\n constructor(tagName = 'style') {\n super(tagName);\n }\n}\n\nexport class HTMLAnchorElement extends HTMLElement {\n constructor(tagName = 'a') {\n super(tagName);\n }\n\n public get href(): string {\n return this.getAttribute('href') ?? '';\n }\n\n public set href(value: string) {\n this.setAttribute('href', value);\n }\n}\n\nexport class Text extends Node {\n public data: string;\n\n constructor(data = '') {\n super(DomNodeType.TEXT_NODE, '#text');\n this.data = data;\n }\n\n public get nodeValue(): string {\n return this.data;\n }\n\n public set nodeValue(value: string) {\n this.data = value;\n }\n\n public get textContent(): string {\n return this.data;\n }\n\n public set textContent(value: string) {\n this.data = value;\n }\n\n public get wholeText(): string {\n return this.data;\n }\n\n /** @internal */\n protected createClone(): Node {\n const clone = new Text(this.data);\n clone.ownerDocument = this.ownerDocument;\n return clone;\n }\n}\n\nexport class Comment extends Node {\n public data: string;\n\n constructor(data = '') {\n super(DomNodeType.COMMENT_NODE, '#comment');\n this.data = data;\n }\n\n public get nodeValue(): string {\n return this.data;\n }\n\n public set nodeValue(value: string) {\n this.data = value;\n }\n\n /** @internal */\n protected createClone(): Node {\n const clone = new Comment(this.data);\n clone.ownerDocument = this.ownerDocument;\n return clone;\n }\n}\n\nexport class DocumentFragment extends Node {\n constructor() {\n super(DomNodeType.DOCUMENT_FRAGMENT_NODE, '#document-fragment');\n }\n}\n\nexport class Document extends Node {\n public readonly defaultView: DomWindow | null = null;\n\n constructor() {\n super(DomNodeType.DOCUMENT_NODE, '#document');\n }\n\n public createElement(tagName: string): HTMLElement {\n return createElementForTag(tagName, this);\n }\n\n public createElementNS(namespaceURI: string, tagName: string): HTMLElement {\n const element = createElementForTag(tagName, this);\n (element as { namespaceURI: string | null }).namespaceURI = namespaceURI;\n return element;\n }\n\n public createTextNode(data: string): Text {\n const text = new Text(data);\n text.ownerDocument = this;\n return text;\n }\n\n public createComment(data: string): Comment {\n const comment = new Comment(data);\n comment.ownerDocument = this;\n return comment;\n }\n\n public createDocumentFragment(): DocumentFragment {\n const fragment = new DocumentFragment();\n fragment.ownerDocument = this;\n return fragment;\n }\n\n public createEvent(type: string): Event {\n if (type === 'MouseEvent' || type === 'mouseevent') {\n return new MouseEvent('');\n }\n if (type === 'KeyboardEvent' || type === 'keyboardevent') {\n return new KeyboardEvent('');\n }\n if (type === 'CustomEvent' || type === 'customevent') {\n return new CustomEvent('');\n }\n return new Event('');\n }\n\n public get documentElement(): HTMLElement {\n const html = this.childList.find(\n (child) => child.nodeType === DomNodeType.ELEMENT_NODE\n ) as HTMLElement | undefined;\n if (html) {\n return html;\n }\n const created = createElementForTag('html', this);\n this.appendChild(created);\n return created;\n }\n\n public get head(): HTMLElement {\n return this.ensureDocumentChild('head');\n }\n\n public get body(): HTMLElement {\n return this.ensureDocumentChild('body');\n }\n\n public get title(): string {\n const titleElement = this.querySelector('title');\n return titleElement?.textContent ?? '';\n }\n\n public set title(value: string) {\n let titleElement = this.querySelector('title');\n if (!titleElement) {\n titleElement = createElementForTag('title', this);\n this.head.appendChild(titleElement);\n }\n titleElement.textContent = value;\n }\n\n public querySelector(selector: string): Element | null {\n return querySelectorAll(this, selector).item(0);\n }\n\n public querySelectorAll(selector: string): NodeList<Element> {\n return querySelectorAll(this, selector);\n }\n\n public getElementById(id: string): Element | null {\n let result: Element | null = null;\n collectElements(this, (element) => {\n if (!result && element.id === id) {\n result = element;\n }\n });\n return result;\n }\n\n public getElementsByTagName(tagName: string): NodeList<Element> {\n return this.documentElement.getElementsByTagName(tagName);\n }\n\n /** @internal */\n protected createClone(): Node {\n return new Document();\n }\n\n private ensureDocumentChild(tagName: 'head' | 'body'): HTMLElement {\n const documentElement = this.documentElement;\n let child = documentElement.childList.find(\n (node) =>\n node.nodeType === DomNodeType.ELEMENT_NODE &&\n (node as Element).localName === tagName\n ) as HTMLElement | undefined;\n if (!child) {\n child = createElementForTag(tagName, this);\n documentElement.appendChild(child);\n }\n return child;\n }\n}\n\n/**\n * History / Location / Storage 等浏览器环境对象。\n */\nexport class Location {\n /** @internal */\n private url: URL;\n\n constructor(url: string) {\n this.url = new URL(url);\n }\n\n public get href(): string {\n return this.url.href;\n }\n\n public set href(value: string) {\n this.url = new URL(value, this.url.href);\n }\n\n public get origin(): string {\n return this.url.origin;\n }\n\n public get protocol(): string {\n return this.url.protocol;\n }\n\n public get host(): string {\n return this.url.host;\n }\n\n public get hostname(): string {\n return this.url.hostname;\n }\n\n public get port(): string {\n return this.url.port;\n }\n\n public get pathname(): string {\n return this.url.pathname;\n }\n\n public set pathname(value: string) {\n const url = this.url;\n const next = new URL(value, url.href);\n url.pathname = next.pathname;\n }\n\n public get search(): string {\n return this.url.search;\n }\n\n public set search(value: string) {\n this.url.search = value.startsWith('?') ? value : `?${value}`;\n }\n\n public get hash(): string {\n return this.url.hash;\n }\n\n public set hash(value: string) {\n const nextHash = value.startsWith('#') ? value : `#${value}`;\n this.url.hash = nextHash;\n }\n\n public get username(): string {\n return this.url.username;\n }\n\n public get password(): string {\n return this.url.password;\n }\n\n public assign(value: string): void {\n this.url = new URL(value, this.url.href);\n }\n\n public replace(value: string): void {\n this.url = new URL(value, this.url.href);\n }\n\n public reload(): void {}\n\n public toString(): string {\n return this.url.href;\n }\n\n /** @internal */\n public getHashPath(): string {\n return this.url.hash.slice(1);\n }\n\n /** @internal */\n public getHrefWithoutHash(): string {\n const url = this.url;\n return `${url.origin}${url.pathname}${url.search}`;\n }\n}\n\ninterface HistoryEntry {\n state: unknown;\n url: string;\n}\n\nexport class History {\n /** @internal */\n private readonly windowRef: DomWindow;\n /** @internal */\n private entries: HistoryEntry[] = [];\n /** @internal */\n private index = 0;\n /** @internal */\n public scrollRestoration: 'auto' | 'manual' = 'auto';\n\n constructor(windowRef: DomWindow) {\n this.windowRef = windowRef;\n this.entries = [{ state: null, url: windowRef.location.href }];\n }\n\n public get length(): number {\n return this.entries.length;\n }\n\n public get state(): unknown {\n return this.entries[this.index]?.state ?? null;\n }\n\n public pushState(state: unknown, _unusedTitle: string, url?: string): void {\n const nextUrl = url\n ? new URL(url, this.windowRef.location.href).href\n : this.windowRef.location.href;\n this.entries = this.entries.slice(0, this.index + 1);\n this.entries.push({ state, url: nextUrl });\n this.index = this.entries.length - 1;\n this.windowRef.setLocationUrl(nextUrl);\n }\n\n public replaceState(\n state: unknown,\n _unusedTitle: string,\n url?: string\n ): void {\n const nextUrl = url\n ? new URL(url, this.windowRef.location.href).href\n : this.windowRef.location.href;\n this.entries[this.index] = { state, url: nextUrl };\n this.windowRef.setLocationUrl(nextUrl);\n }\n\n public back(): void {\n this.go(-1);\n }\n\n public forward(): void {\n this.go(1);\n }\n\n public go(delta = 0): void {\n const nextIndex = this.index + delta;\n if (nextIndex < 0 || nextIndex >= this.entries.length) {\n return;\n }\n this.index = nextIndex;\n this.windowRef.setLocationUrl(this.entries[nextIndex].url);\n this.windowRef.dispatchEvent(\n new Event('popstate', { bubbles: false, cancelable: false })\n );\n }\n}\n\nexport class Storage {\n private readonly store = new Map<string, string>();\n\n public get length(): number {\n return this.store.size;\n }\n\n public key(index: number): string | null {\n return [...this.store.keys()][index] ?? null;\n }\n\n public getItem(key: string): string | null {\n return this.store.has(key) ? (this.store.get(key) as string) : null;\n }\n\n public setItem(key: string, value: string): void {\n this.store.set(key, String(value));\n }\n\n public removeItem(key: string): void {\n this.store.delete(key);\n }\n\n public clear(): void {\n this.store.clear();\n }\n}\n\nexport class Navigator {\n public readonly userAgent = 'TSone/0.3.0';\n public readonly platform = 'TSone';\n public readonly language = 'zh-CN';\n public readonly languages = ['zh-CN'];\n public readonly onLine = true;\n public readonly maxTouchPoints = 0;\n}\n\nexport interface MediaQueryList {\n readonly media: string;\n readonly matches: boolean;\n onchange: ((event: Event) => void) | null;\n addEventListener(type: string, listener: EventListenerRecord): void;\n removeEventListener(type: string, listener: EventListenerRecord): void;\n addListener(listener: EventListenerRecord): void;\n removeListener(listener: EventListenerRecord): void;\n dispatchEvent(event: Event): boolean;\n}\n\nexport function createMatchMedia(\n _windowRef: DomWindow,\n query: string\n): MediaQueryList {\n const listeners = new Set<EventListenerRecord>();\n const matches = false;\n const list: MediaQueryList = {\n media: query,\n matches,\n onchange: null,\n addEventListener(type, listener) {\n if (type === 'change') {\n listeners.add(listener);\n }\n },\n removeEventListener(type, listener) {\n if (type === 'change') {\n listeners.delete(listener);\n }\n },\n addListener(listener) {\n listeners.add(listener);\n },\n removeListener(listener) {\n listeners.delete(listener);\n },\n dispatchEvent(event) {\n for (const listener of [...listeners]) {\n if (typeof listener === 'function') {\n listener.call(list, event);\n } else {\n listener.handleEvent(event);\n }\n }\n return true;\n },\n };\n return list;\n}\n\nexport class ResizeObserver {\n public observe(): void {}\n public unobserve(): void {}\n public disconnect(): void {}\n}\n\nexport const DOM_GLOBAL_KEYS: readonly string[] = [\n 'window',\n 'document',\n 'Node',\n 'Text',\n 'Comment',\n 'Element',\n 'HTMLElement',\n 'HTMLInputElement',\n 'HTMLTextAreaElement',\n 'HTMLSelectElement',\n 'HTMLButtonElement',\n 'HTMLOptionElement',\n 'HTMLStyleElement',\n 'HTMLAnchorElement',\n 'DocumentFragment',\n 'Document',\n 'Event',\n 'MouseEvent',\n 'KeyboardEvent',\n 'CustomEvent',\n 'EventTarget',\n 'DOMException',\n 'history',\n 'location',\n 'navigator',\n 'localStorage',\n 'matchMedia',\n 'getComputedStyle',\n 'requestAnimationFrame',\n 'cancelAnimationFrame',\n 'ResizeObserver',\n];\n\n/**\n * DomWindow:模拟的浏览器 window 环境。\n */\nexport class DomWindow extends EventTarget {\n public readonly window: DomWindow = this;\n public readonly document: Document;\n public readonly location: Location;\n public readonly history: History;\n public readonly localStorage = new Storage();\n public readonly navigator = new Navigator();\n public readonly Node = Node;\n public readonly Text = Text;\n public readonly Comment = Comment;\n public readonly Element = Element;\n public readonly HTMLElement = HTMLElement;\n public readonly HTMLInputElement = HTMLInputElement;\n public readonly HTMLTextAreaElement = HTMLTextAreaElement;\n public readonly HTMLSelectElement = HTMLSelectElement;\n public readonly HTMLButtonElement = HTMLButtonElement;\n public readonly HTMLOptionElement = HTMLOptionElement;\n public readonly HTMLStyleElement = HTMLStyleElement;\n public readonly HTMLAnchorElement = HTMLAnchorElement;\n public readonly DocumentFragment = DocumentFragment;\n public readonly Document = Document;\n public readonly Event = Event;\n public readonly MouseEvent = MouseEvent;\n public readonly KeyboardEvent = KeyboardEvent;\n public readonly CustomEvent = CustomEvent;\n public readonly EventTarget = EventTarget;\n public readonly DOMException = DOMException;\n public readonly NodeList = NodeList;\n\n constructor(options: { url?: string } = {}) {\n super();\n const url = options.url ?? 'http://localhost/';\n this.location = new Location(url);\n this.history = new History(this);\n this.document = new Document();\n (this.document as { defaultView: DomWindow | null }).defaultView = this;\n setupDocumentTree(this.document);\n }\n\n public matchMedia(query: string): MediaQueryList {\n return createMatchMedia(this, query);\n }\n\n public getComputedStyle(element: Element): CSSStyleDeclaration {\n return element.style;\n }\n\n public requestAnimationFrame(callback: FrameRequestCallback): number {\n return setTimeout(() => callback(Date.now()), 0) as unknown as number;\n }\n\n public cancelAnimationFrame(handle: number): void {\n clearTimeout(handle as unknown as ReturnType<typeof setTimeout>);\n }\n\n /** @internal */\n public setLocationUrl(url: string): void {\n this.location.href = url;\n }\n\n /** @internal 安装到目标对象上的全局属性名。 */\n public installKeys(): string[] {\n return [...DOM_GLOBAL_KEYS];\n }\n}\n\nexport interface DomWindowOptions {\n url?: string;\n}\n\n/**\n * 创建隔离的 DOM window 环境。\n */\nexport function createDomWindow(options: DomWindowOptions = {}): DomWindow {\n return new DomWindow(options);\n}\n\n/**\n * 将 DOM window 的全局属性安装到目标对象(默认 globalThis),\n * 返回可恢复旧值的函数。\n */\nexport function installDomGlobals(\n windowRef: DomWindow,\n target: Record<string, unknown> = globalThis as Record<string, unknown>\n): () => void {\n const previous = new Map<string, PropertyDescriptor | undefined>();\n const keys = windowRef.installKeys();\n for (const key of keys) {\n previous.set(key, Object.getOwnPropertyDescriptor(target, key));\n }\n for (const key of keys) {\n Object.defineProperty(target, key, {\n configurable: true,\n enumerable: true,\n writable: true,\n value: (windowRef as unknown as Record<string, unknown>)[key],\n });\n }\n Object.defineProperty(target, 'window', {\n configurable: true,\n enumerable: true,\n writable: true,\n value: windowRef,\n });\n\n return () => {\n for (const key of keys) {\n const descriptor = previous.get(key);\n if (descriptor) {\n Object.defineProperty(target, key, descriptor);\n } else {\n Reflect.deleteProperty(target, key);\n }\n }\n };\n}\n\n/**\n * 解析 HTML 片段为节点列表(innerHTML setter 用)。\n */\nexport function parseHtmlFragment(\n source: string,\n documentRef: Document | null\n): Node[] {\n const root = new DocumentFragment();\n if (documentRef) {\n root.ownerDocument = documentRef;\n }\n parseInto(root, source, documentRef);\n return [...root.childList];\n}\n\nfunction parseInto(\n parent: Node,\n source: string,\n documentRef: Document | null\n): void {\n const stack: Element[] = [];\n let current: Node = parent;\n let index = 0;\n const length = source.length;\n\n const append = (node: Node): void => {\n if (node.ownerDocument === null) {\n node.ownerDocument = documentRef;\n }\n current.appendChild(node);\n };\n\n while (index < length) {\n const openIndex = source.indexOf('<', index);\n if (openIndex < 0) {\n append(new Text(source.slice(index)));\n break;\n }\n if (openIndex > index) {\n append(new Text(source.slice(index, openIndex)));\n }\n if (source.startsWith('<!--', openIndex)) {\n const closeIndex = source.indexOf('-->', openIndex + 4);\n const commentEnd = closeIndex < 0 ? length : closeIndex;\n append(new Comment(source.slice(openIndex + 4, commentEnd)));\n index = closeIndex < 0 ? length : closeIndex + 3;\n continue;\n }\n const tagEnd = findTagEnd(source, openIndex);\n if (tagEnd < 0) {\n append(new Text(source.slice(openIndex)));\n break;\n }\n const tagSource = source.slice(openIndex + 1, tagEnd);\n const trimmed = tagSource.trim();\n if (trimmed.startsWith('/')) {\n const tagName = trimmed.slice(1).trim().toLowerCase();\n if (stack.length > 0 && stack[stack.length - 1].localName === tagName) {\n stack.pop();\n current = stack[stack.length - 1] ?? parent;\n }\n index = tagEnd + 1;\n continue;\n }\n const selfClosing = trimmed.endsWith('/');\n const parsed = parseTag(trimmed.replace(/\\/$/, '').trim());\n if (!parsed) {\n index = tagEnd + 1;\n continue;\n }\n const element = createElementForTag(parsed.name, documentRef);\n for (const attr of parsed.attributes) {\n element.setAttribute(attr.name, attr.value);\n }\n append(element);\n if (VOID_TAGS.has(parsed.name) || selfClosing) {\n index = tagEnd + 1;\n continue;\n }\n if (RAW_TEXT_TAGS.has(parsed.name)) {\n const closeTag = `</${parsed.name}>`;\n const rawEnd = source.toLowerCase().indexOf(closeTag, tagEnd + 1);\n const rawText = source.slice(tagEnd + 1, rawEnd < 0 ? length : rawEnd);\n element.appendChild(\n documentRef?.createTextNode(rawText) ?? new Text(rawText)\n );\n index = rawEnd < 0 ? length : rawEnd + closeTag.length;\n continue;\n }\n stack.push(element);\n current = element;\n index = tagEnd + 1;\n }\n}\n\nconst VOID_TAGS = new Set([\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr',\n]);\n\nconst RAW_TEXT_TAGS = new Set(['script', 'style', 'textarea', 'title']);\n\nfunction findTagEnd(source: string, openIndex: number): number {\n let inQuote: string | null = null;\n for (let index = openIndex + 1; index < source.length; index += 1) {\n const char = source[index];\n if (inQuote) {\n if (char === inQuote) {\n inQuote = null;\n }\n continue;\n }\n if (char === '\"' || char === \"'\") {\n inQuote = char;\n continue;\n }\n if (char === '>') {\n return index;\n }\n }\n return -1;\n}\n\nfunction parseTag(\n source: string\n): { name: string; attributes: Array<{ name: string; value: string }> } | null {\n const match = source.match(/^([a-zA-Z][a-zA-Z0-9-]*)\\s*(.*)$/);\n if (!match) {\n return null;\n }\n const name = match[1].toLowerCase();\n const attributes: Array<{ name: string; value: string }> = [];\n const attributeSource = match[2];\n const pattern =\n /([a-zA-Z_:][a-zA-Z0-9_:.-]*)(?:\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)'|([^\\s\"'=<>`]+)))?/g;\n let attributeMatch: RegExpExecArray | null;\n while ((attributeMatch = pattern.exec(attributeSource)) !== null) {\n const attrName = attributeMatch[1];\n const value =\n attributeMatch[2] ?? attributeMatch[3] ?? attributeMatch[4] ?? '';\n attributes.push({ name: attrName, value: decodeEntities(value) });\n }\n return { name, attributes };\n}\n\nfunction decodeEntities(value: string): string {\n return value\n .replace(/&amp;/g, '&')\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&#39;/g, \"'\")\n .replace(/&nbsp;/g, '\\u00a0');\n}\n\nfunction encodeText(value: string): string {\n return value\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;');\n}\n\nfunction encodeAttribute(value: string): string {\n return encodeText(value).replace(/\"/g, '&quot;');\n}\n\nfunction serializeNode(node: Node): string {\n switch (node.nodeType) {\n case DomNodeType.TEXT_NODE:\n return encodeText((node as Text).data);\n case DomNodeType.COMMENT_NODE:\n return `<!--${(node as Comment).data}-->`;\n case DomNodeType.ELEMENT_NODE:\n return serializeElement(node as Element);\n default:\n return '';\n }\n}\n\nfunction serializeElement(element: Element): string {\n const tag = element.localName;\n const attributes: string[] = [];\n for (const entry of element.attributeEntries()) {\n if (entry.name === 'style') {\n continue;\n }\n attributes.push(`${entry.name}=\"${encodeAttribute(entry.value)}\"`);\n }\n const inlineStyle = element.inlineStyleText();\n if (inlineStyle) {\n attributes.push(`style=\"${encodeAttribute(inlineStyle)}\"`);\n }\n const attributeText = attributes.length > 0 ? ` ${attributes.join(' ')}` : '';\n if (VOID_TAGS.has(tag)) {\n return `<${tag}${attributeText}>`;\n }\n if (RAW_TEXT_TAGS.has(tag)) {\n return `<${tag}${attributeText}>${element.textContent}</${tag}>`;\n }\n return `<${tag}${attributeText}>${serializeChildren(element)}</${tag}>`;\n}\n\nfunction serializeChildren(element: Element): string {\n return element.childList.map((child) => serializeNode(child)).join('');\n}\n\n/**\n * CSS 选择器引擎:支持 tag、#id、.class、[attr]、[attr=value]、复合与后代选择器。\n */\nfunction parseSelector(selector: string): SimpleSelector[][] {\n return selector.split(',').map((group) => {\n const segments: SimpleSelector[] = [];\n let index = 0;\n while (index < group.length) {\n while (index < group.length && group[index] === ' ') {\n index += 1;\n }\n if (index >= group.length) {\n break;\n }\n if (group[index] === '>') {\n segments.push({ type: 'child' });\n index += 1;\n continue;\n }\n const start = index;\n while (\n index < group.length &&\n group[index] !== ' ' &&\n group[index] !== '>'\n ) {\n index += 1;\n }\n segments.push(parseCompound(group.slice(start, index)));\n }\n return segments;\n });\n}\n\ntype SimpleSelector =\n | { type: 'universal' }\n | { type: 'tag'; name: string }\n | { type: 'id'; id: string }\n | { type: 'class'; className: string }\n | { type: 'attribute'; name: string; operator?: string; value?: string }\n | { type: 'compound'; parts: SimpleSelector[] }\n | { type: 'child' };\n\nfunction parseCompound(source: string): SimpleSelector {\n const selectors: SimpleSelector[] = [];\n let index = 0;\n while (index < source.length) {\n const char = source[index];\n if (char === '*') {\n selectors.push({ type: 'universal' });\n index += 1;\n } else if (char === '#') {\n const end = scanIdentifier(source, index + 1);\n selectors.push({ type: 'id', id: source.slice(index + 1, end) });\n index = end;\n } else if (char === '.') {\n const end = scanIdentifier(source, index + 1);\n selectors.push({\n type: 'class',\n className: source.slice(index + 1, end),\n });\n index = end;\n } else if (char === '[') {\n const end = source.indexOf(']', index);\n const inner = source\n .slice(index + 1, end < 0 ? source.length : end)\n .trim();\n const attrMatch = inner.match(\n /^([a-zA-Z_:][a-zA-Z0-9_:.-]*)(?:([~|^$*]?=)(?:\"([^\"]*)\"|'([^']*)'|([^\\s\"'=<>`]+)))?$/\n );\n if (attrMatch) {\n selectors.push({\n type: 'attribute',\n name: attrMatch[1],\n operator: attrMatch[2],\n value: attrMatch[3] ?? attrMatch[4] ?? attrMatch[5],\n });\n } else {\n selectors.push({ type: 'attribute', name: inner });\n }\n index = end < 0 ? source.length : end + 1;\n } else if (/[a-zA-Z_]/.test(char)) {\n const end = scanIdentifier(source, index);\n selectors.push({\n type: 'tag',\n name: source.slice(index, end).toLowerCase(),\n });\n index = end;\n } else {\n index += 1;\n }\n }\n if (selectors.length === 1) {\n return selectors[0];\n }\n return { type: 'compound', parts: selectors };\n}\n\nfunction scanIdentifier(source: string, start: number): number {\n let index = start;\n while (index < source.length && /[a-zA-Z0-9:_-]/.test(source[index])) {\n index += 1;\n }\n return index;\n}\n\nfunction matchSelector(element: Element, selector: string): boolean {\n const groups = parseSelector(selector);\n return groups.some((group) => matchGroup(element, group));\n}\n\nfunction matchGroup(element: Element, group: SimpleSelector[]): boolean {\n let index = group.length - 1;\n if (index < 0) {\n return true;\n }\n\n // The rightmost compound must match the queried element itself.\n if (!matchSegment(element, group[index])) {\n return false;\n }\n if (index === 0) {\n return true;\n }\n\n // Remaining compounds must match ancestors, right to left.\n let current: Element | null = element.parentElement;\n index -= 1;\n while (current) {\n const selector = group[index];\n if (!selector) {\n return true;\n }\n if (selector.type === 'child') {\n // The previously matched element must be the immediate child of this parent.\n const parentSelector = group[index - 1];\n if (!parentSelector || !matchSegment(current, parentSelector)) {\n return false;\n }\n index -= 2;\n if (index < 0) {\n return true;\n }\n current = current.parentElement;\n continue;\n }\n if (matchSegment(current, selector)) {\n index -= 1;\n if (index < 0) {\n return true;\n }\n }\n current = current.parentElement;\n }\n return false;\n}\n\nfunction matchSegment(element: Element, selector: SimpleSelector): boolean {\n switch (selector.type) {\n case 'universal':\n return true;\n case 'tag':\n return element.localName === selector.name;\n case 'id':\n return element.id === selector.id;\n case 'class':\n return element.classList.contains(selector.className);\n case 'attribute':\n return matchAttribute(element, selector);\n case 'compound':\n return selector.parts.every((part) => matchSegment(element, part));\n case 'child':\n return false;\n default:\n return false;\n }\n}\n\nfunction matchAttribute(\n element: Element,\n selector: { name: string; operator?: string; value?: string }\n): boolean {\n const attributeValue = element.getAttribute(selector.name);\n if (!selector.operator) {\n return attributeValue !== null;\n }\n if (attributeValue === null) {\n return false;\n }\n const expected = selector.value ?? '';\n switch (selector.operator) {\n case '=':\n return attributeValue === expected;\n case '~=':\n return attributeValue.split(/\\s+/).includes(expected);\n case '|=':\n return (\n attributeValue === expected || attributeValue.startsWith(`${expected}-`)\n );\n case '^=':\n return attributeValue.startsWith(expected);\n case '$=':\n return attributeValue.endsWith(expected);\n case '*=':\n return attributeValue.includes(expected);\n default:\n return false;\n }\n}\n\nfunction querySelectorAll(root: Node, selector: string): NodeList<Element> {\n const results: Element[] = [];\n collectElements(root, (element) => {\n if (element !== root && matchSelector(element, selector)) {\n results.push(element);\n }\n });\n return new NodeList(results);\n}\n\nfunction collectElements(root: Node, visit: (element: Element) => void): void {\n for (const child of root.childList) {\n if (child.nodeType === DomNodeType.ELEMENT_NODE) {\n visit(child as Element);\n collectElements(child, visit);\n }\n }\n}\n\nfunction createElementForTag(\n tagName: string,\n documentRef: Document | null\n): HTMLElement {\n const tag = tagName.toLowerCase();\n let element: HTMLElement;\n if (tag === 'input') {\n element = new HTMLInputElement(tag);\n } else if (tag === 'textarea') {\n element = new HTMLTextAreaElement(tag);\n } else if (tag === 'select') {\n element = new HTMLSelectElement(tag);\n } else if (tag === 'option') {\n element = new HTMLOptionElement(tag);\n } else if (tag === 'button') {\n element = new HTMLButtonElement(tag);\n } else if (tag === 'style') {\n element = new HTMLStyleElement(tag);\n } else if (tag === 'a') {\n element = new HTMLAnchorElement(tag);\n } else {\n element = new HTMLElement(tag);\n }\n element.ownerDocument = documentRef;\n return element;\n}\n\nfunction setupDocumentTree(documentRef: Document): void {\n const html = documentRef.createElement('html');\n html.setAttribute('lang', 'en');\n documentRef.appendChild(html);\n const head = documentRef.createElement('head');\n const body = documentRef.createElement('body');\n html.appendChild(head);\n html.appendChild(body);\n}\n\nfunction createDatasetProxy(element: Element): Record<string, string> {\n const handler: ProxyHandler<Record<string, string>> = {\n get(_target, property: string) {\n if (typeof property === 'symbol') {\n return undefined;\n }\n return element.getAttribute(`data-${toKebabCase(property)}`) ?? '';\n },\n set(_target, property: string, value: string): boolean {\n if (typeof property === 'symbol') {\n return true;\n }\n if (value === '' || value === null || value === undefined) {\n element.removeAttribute(`data-${toKebabCase(property)}`);\n } else {\n element.setAttribute(`data-${toKebabCase(property)}`, String(value));\n }\n return true;\n },\n deleteProperty(_target, property: string): boolean {\n if (typeof property !== 'symbol') {\n element.removeAttribute(`data-${toKebabCase(property)}`);\n }\n return true;\n },\n has(_target, property: string): boolean {\n if (typeof property === 'symbol') {\n return false;\n }\n return element.hasAttribute(`data-${toKebabCase(property)}`);\n },\n ownKeys() {\n const keys: string[] = [];\n for (const entry of element.attributeEntries()) {\n if (entry.name.startsWith('data-')) {\n keys.push(toCamelCase(entry.name.slice(5)));\n }\n }\n return keys;\n },\n getOwnPropertyDescriptor(_target, property: string) {\n if (typeof property === 'symbol') {\n return undefined;\n }\n if (element.hasAttribute(`data-${toKebabCase(property)}`)) {\n return {\n configurable: true,\n enumerable: true,\n writable: true,\n value: element.getAttribute(`data-${toKebabCase(property)}`),\n };\n }\n return undefined;\n },\n };\n return new Proxy({}, handler);\n}\n\nfunction toKebabCase(value: string): string {\n return value.replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`);\n}\n\nfunction toCamelCase(value: string): string {\n return value.replace(/-([a-z])/g, (_match, char: string) =>\n char.toUpperCase()\n );\n}\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "7D13E902DBE25F4664756E2164756E21",
7
+ "mappings": "AASO,IAAW,IAAX,CAAW,IAAX,CACL,iBAAe,GAAf,eACA,cAAY,GAAZ,YACA,iBAAe,GAAf,eACA,kBAAgB,GAAhB,gBACA,2BAAyB,IAAzB,2BALgB,SAQX,MAAM,UAAqB,KAAM,CACtB,KAEhB,WAAW,CAAC,EAAiB,EAAO,QAAS,CAC3C,MAAM,CAAO,EACb,KAAK,KAAO,EACZ,KAAK,KAAO,EAEhB,CAgBO,MAAM,CAAY,CACN,YAAc,IAAI,IAE5B,gBAAgB,CACrB,EACA,EACA,EACM,CACN,GAAI,CAAC,EACH,OAEF,IAAM,EACJ,OAAO,IAAY,UAAY,EAAW,GAAS,SAAW,GAC1D,EAAO,OAAO,IAAY,SAAY,EAAQ,MAAQ,GAAS,GAC/D,EACJ,OAAO,IAAY,SAAY,EAAQ,SAAW,GAAS,GACzD,EAAU,KAAK,YAAY,IAAI,CAAI,EACvC,GAAI,CAAC,EACH,EAAU,CAAC,EACX,KAAK,YAAY,IAAI,EAAM,CAAO,EAEpC,GACE,EAAQ,KACN,CAAC,IAAU,EAAM,WAAa,GAAY,EAAM,UAAY,CAC9D,EAEA,OAEF,EAAQ,KAAK,CAAE,WAAU,UAAS,OAAM,SAAQ,CAAC,EAG5C,mBAAmB,CACxB,EACA,EACA,EACM,CACN,GAAI,CAAC,EACH,OAEF,IAAM,EACJ,OAAO,IAAY,UAAY,EAAW,GAAS,SAAW,GAC1D,EAAU,KAAK,YAAY,IAAI,CAAI,EACzC,GAAI,CAAC,EACH,OAEF,IAAM,EAAQ,EAAQ,UACpB,CAAC,IAAU,EAAM,WAAa,GAAY,EAAM,UAAY,CAC9D,EACA,GAAI,GAAS,EACX,EAAQ,OAAO,EAAO,CAAC,EAEzB,GAAI,EAAQ,SAAW,EACrB,KAAK,YAAY,OAAO,CAAI,EAIzB,aAAa,CAAC,EAAuB,CAC1C,GAAI,EAAE,aAAiB,GACrB,MAAU,UAAU,0CAA0C,EAEhE,GAAI,EAAM,WACR,MAAU,MAAM,mCAAmC,EAErD,OAAO,GAAiB,KAAM,CAAK,EAI9B,YAAY,CAAC,EAA+B,CACjD,OAAO,KAAK,YAAY,IAAI,CAAI,GAAK,CAAC,EAE1C,CAEO,MAAM,CAAM,OACM,MAAO,QACP,iBAAkB,QAClB,WAAY,QACZ,gBAAiB,EAExB,KACA,QACA,WACA,SACT,OAA6B,KAC7B,cAAoC,KACpC,WAAa,EAAM,KACnB,iBAAmB,GACV,UAAY,GACZ,UACT,aAAe,GAGf,WAAa,GAEZ,mBAAqB,GAErB,iBAAmB,GAEnB,SAAW,GAEnB,WAAW,CAAC,EAAc,EAAkB,CAC1C,KAAK,KAAO,EACZ,KAAK,QAAU,GAAM,SAAW,GAChC,KAAK,WAAa,GAAM,YAAc,GACtC,KAAK,SAAW,GAAM,UAAY,GAClC,KAAK,UAAY,KAAK,IAAI,EAGrB,cAAc,EAAS,CAC5B,GAAI,KAAK,WACP,KAAK,SAAW,GAIb,eAAe,EAAS,CAC7B,KAAK,mBAAqB,GAC1B,KAAK,aAAe,GAGf,wBAAwB,EAAS,CACtC,KAAK,mBAAqB,GAC1B,KAAK,iBAAmB,GACxB,KAAK,aAAe,GAIf,oBAAoB,EAAY,CACrC,OAAO,KAAK,mBAIP,kBAAkB,EAAY,CACnC,OAAO,KAAK,iBAIP,WAAW,EAAY,CAC5B,OAAO,KAAK,SAEhB,CAEO,MAAM,UAAiC,CAAM,CAClC,OAEhB,WAAW,CAAC,EAAc,EAA2B,CACnD,MAAM,EAAM,CAAI,EAChB,KAAK,OAAS,GAAM,OAExB,CAEO,MAAM,UAAmB,CAAM,CACpB,QACA,QACA,OACA,QACA,cAEhB,WAAW,CAAC,EAAc,EAAuB,CAC/C,MAAM,EAAM,CAAI,EAChB,KAAK,QAAU,GAAM,SAAW,EAChC,KAAK,QAAU,GAAM,SAAW,EAChC,KAAK,OAAS,GAAM,QAAU,EAC9B,KAAK,QAAU,GAAM,SAAW,EAChC,KAAK,cAAgB,GAAM,eAAiB,KAEhD,CAEO,MAAM,UAAsB,CAAM,CACvB,IACA,KAEhB,WAAW,CAAC,EAAc,EAA0B,CAClD,MAAM,EAAM,CAAI,EAChB,KAAK,IAAM,GAAM,KAAO,GACxB,KAAK,KAAO,GAAM,MAAQ,GAE9B,CAEA,SAAS,EAAc,CAAC,EAAyB,EAAoB,CACnE,IAAM,EAAS,EAAS,SACxB,GAAI,OAAO,IAAW,WACpB,EAAO,KAAK,EAAM,cAAe,CAAK,EAEtC,OAAO,YAAY,CAAK,EAI5B,SAAS,EAAgB,CAAC,EAAqB,EAAuB,CACpE,EAAM,WAAa,GACnB,EAAM,OAAS,EAGf,IAAM,EAAc,CAAC,GADP,GAAe,CAAM,CACN,EAAE,QAAQ,EACjC,EAAc,EAAY,OAAS,EAEzC,EAAM,WAAa,EAAM,gBACzB,QAAS,EAAQ,EAAG,EAAQ,EAAa,GAAS,EAAG,CACnD,IAAM,EAAU,EAAY,GAC5B,GAAI,EAAM,qBAAqB,EAC7B,MAEF,EAAM,cAAgB,EACtB,EAAa,EAAS,EAAO,EAAI,EAGnC,GAAI,CAAC,EAAM,qBAAqB,GAI9B,GAHA,EAAM,WAAa,EAAM,UACzB,EAAM,cAAgB,EACtB,EAAa,EAAQ,EAAO,EAAI,EAC5B,CAAC,EAAM,mBAAmB,EAC5B,EAAa,EAAQ,EAAO,EAAK,EAIrC,GAAI,EAAM,SAAW,CAAC,EAAM,qBAAqB,EAAG,CAClD,EAAM,WAAa,EAAM,eACzB,QAAS,EAAQ,EAAY,OAAS,EAAG,GAAS,EAAG,GAAS,EAAG,CAC/D,IAAM,EAAU,EAAY,GAC5B,GAAI,EAAM,qBAAqB,EAC7B,MAEF,EAAM,cAAgB,EACtB,EAAa,EAAS,EAAO,EAAK,GAMtC,OAFA,EAAM,WAAa,EAAM,KACzB,EAAM,cAAgB,KACf,CAAC,EAAM,YAAY,EAG5B,SAAS,CAAY,CACnB,EACA,EACA,EACM,CACN,IAAM,EAAY,EAAO,aAAa,EAAM,IAAI,EAChD,QAAW,IAAS,CAAC,GAAG,CAAS,EAAG,CAClC,GAAI,EAAM,UAAY,EACpB,SAEF,GAAI,EAAM,mBAAmB,EAC3B,MAEF,GAAI,EAAM,KACR,EAAO,oBAAoB,EAAM,KAAM,EAAM,SAAU,CACrD,QAAS,EAAM,OACjB,CAAC,EAEH,GAAe,EAAO,CAAK,GAI/B,SAAS,EAAc,CAAC,EAAoC,CAC1D,IAAM,EAAsB,CAAC,EACzB,EAA8B,EAClC,MAAO,EAAS,CACd,EAAK,KAAK,CAAO,EACjB,IAAM,EAAO,EACb,GAAI,EAAK,WAAa,EAA2B,CAC/C,IAAM,EAAQ,EAAkB,YAChC,GAAI,EACF,EAAK,KAAK,CAAI,EAEhB,MAEF,IAAM,EAAS,EAAK,WACpB,GAAI,EAAQ,CACV,EAAU,EACV,SAEF,MAEF,OAAO,EAGF,MAAM,CAAyC,CACnC,QACA,cAEjB,WAAW,CAAC,EAAkB,EAAgB,QAAS,CACrD,KAAK,QAAU,EACf,KAAK,cAAgB,KAGZ,OAAM,EAAW,CAC1B,OAAO,KAAK,OAAO,EAAE,UAGZ,MAAK,EAAW,CACzB,OAAO,KAAK,QAAQ,aAAa,KAAK,aAAa,GAAK,MAG/C,MAAK,CAAC,EAAe,CAC9B,KAAK,UAAU,EAAY,CAAK,CAAC,EAG5B,IAAI,CAAC,EAA8B,CACxC,OAAO,KAAK,OAAO,EAAE,IAAU,KAG1B,QAAQ,CAAC,EAAwB,CACtC,OAAO,KAAK,OAAO,EAAE,SAAS,CAAK,EAG9B,GAAG,IAAI,EAAwB,CACpC,IAAM,EAAU,IAAI,IAAI,KAAK,OAAO,CAAC,EACrC,QAAW,KAAS,EAClB,GAAI,EACF,EAAQ,IAAI,CAAK,EAGrB,KAAK,UAAU,CAAC,GAAG,CAAO,CAAC,EAGtB,MAAM,IAAI,EAAwB,CACvC,IAAM,EAAU,IAAI,IAAI,KAAK,OAAO,CAAC,EACrC,QAAW,KAAS,EAClB,EAAQ,OAAO,CAAK,EAEtB,KAAK,UAAU,CAAC,GAAG,CAAO,CAAC,EAGtB,MAAM,CAAC,EAAe,EAA0B,CACrD,IAAM,EAAU,IAAI,IAAI,KAAK,OAAO,CAAC,EAC/B,EAAY,GAAS,CAAC,EAAQ,IAAI,CAAK,EAC7C,GAAI,EACF,EAAQ,IAAI,CAAK,EAEjB,OAAQ,OAAO,CAAK,EAGtB,OADA,KAAK,UAAU,CAAC,GAAG,CAAO,CAAC,EACpB,EAGF,OAAO,CAAC,EAAkB,EAA2B,CAC1D,IAAM,EAAU,KAAK,OAAO,EACtB,EAAQ,EAAQ,QAAQ,CAAQ,EACtC,GAAI,EAAQ,EACV,MAAO,GAIT,OAFA,EAAQ,GAAS,EACjB,KAAK,UAAU,CAAO,EACf,IAGD,OAAO,SAAS,EAAqB,CAC3C,OAAO,KAAK,OAAO,EAAE,OAAO,UAAU,EAGjC,OAAO,CACZ,EACM,CACN,KAAK,OAAO,EAAE,QAAQ,CAAC,EAAO,IAAU,EAAS,EAAO,EAAO,IAAI,CAAC,EAG/D,QAAQ,EAAW,CACxB,OAAO,KAAK,MAGN,MAAM,EAAa,CACzB,OAAO,EAAY,KAAK,QAAQ,aAAa,KAAK,aAAa,GAAK,EAAE,EAGhE,SAAS,CAAC,EAAwB,CACxC,IAAM,EAAQ,EAAO,OAAO,OAAO,EAAE,KAAK,GAAG,EAC7C,GAAI,EACF,KAAK,QAAQ,aAAa,KAAK,cAAe,CAAK,EAEnD,UAAK,QAAQ,gBAAgB,KAAK,aAAa,EAGrD,CAEA,SAAS,CAAW,CAAC,EAAyB,CAC5C,OAAO,EAAM,KAAK,EAAE,MAAM,KAAK,EAAE,OAAO,OAAO,EAGjD,SAAS,CAAoB,CAAC,EAA0B,CACtD,OAAO,EAAS,QAAQ,SAAU,CAAC,IAAU,IAAI,EAAM,YAAY,GAAG,EAiBjE,SAAS,CAAsB,EAAwB,CAC5D,IAAM,EAAa,IAAI,IAEjB,EAAsB,CAC1B,aAEA,WAAW,CAAC,EAAkB,EAAe,EAAW,GAAU,CAChE,IAAM,EAAO,EAAqB,CAAQ,EAC1C,GAAI,IAAU,GACZ,EAAW,OAAO,CAAI,EAEtB,OAAW,IAAI,EAAM,CAAE,QAAO,UAAS,CAAC,GAI5C,gBAAgB,CAAC,EAA0B,CACzC,OAAO,EAAW,IAAI,EAAqB,CAAQ,CAAC,GAAG,OAAS,IAGlE,mBAAmB,CAAC,EAA0B,CAC5C,OAAO,EAAW,IAAI,EAAqB,CAAQ,CAAC,GAAG,UAAY,IAGrE,cAAc,CAAC,EAA0B,CACvC,IAAM,EAAO,EAAqB,CAAQ,EACpC,EAAW,EAAW,IAAI,CAAI,GAAG,OAAS,GAEhD,OADA,EAAW,OAAO,CAAI,EACf,GAGT,IAAI,CAAC,EAAuB,CAC1B,MAAO,CAAC,GAAG,EAAW,KAAK,CAAC,EAAE,IAAU,OAGtC,OAAM,EAAW,CACnB,OAAO,EAAW,SAGhB,QAAO,EAAW,CACpB,MAAO,CAAC,GAAG,EAAW,QAAQ,CAAC,EAC5B,IACC,EAAE,EAAM,KACN,GAAG,MAAS,EAAM,QAAQ,EAAM,SAAW,IAAI,EAAM,WAAa,KACtE,EACC,KAAK,GAAG,MAGT,QAAO,CAAC,EAAe,CACzB,EAAW,MAAM,EACjB,QAAW,KAAe,EAAM,MAAM,GAAG,EAAG,CAC1C,IAAM,EAAU,EAAY,KAAK,EACjC,GAAI,CAAC,EACH,SAEF,IAAM,EAAY,EAAQ,QAAQ,GAAG,EACrC,GAAI,EAAY,EACd,SAEF,IAAM,EAAO,EAAQ,MAAM,EAAG,CAAS,EAAE,KAAK,EACxC,EAAgB,EAAQ,MAAM,EAAY,CAAC,EAAE,KAAK,EACxD,GAAI,EACF,EAAO,YAAY,EAAM,CAAa,GAI9C,EAqDA,OAAO,IAAI,MAAM,EAnD0B,CACzC,GAAG,CAAC,EAAG,EAAU,EAAU,CACzB,GAAI,OAAO,IAAa,SACtB,OAAO,QAAQ,IAAI,EAAG,EAAU,CAAQ,EAE1C,GAAI,KAAY,EAAG,CACjB,IAAM,EAAQ,QAAQ,IAAI,EAAG,EAAU,CAAQ,EAC/C,OAAO,OAAO,IAAU,WAAa,EAAM,KAAK,CAAC,EAAI,EAEvD,OAAO,EAAE,iBAAiB,CAAQ,GAEpC,GAAG,CAAC,EAAG,EAAU,EAAO,EAAU,CAChC,GAAI,OAAO,IAAa,SACtB,OAAO,QAAQ,IAAI,EAAG,EAAU,EAAO,CAAQ,EAEjD,GAAI,KAAY,EACd,OAAO,QAAQ,IAAI,EAAG,EAAU,EAAO,CAAQ,EAGjD,OADA,EAAE,YAAY,EAAU,OAAO,CAAK,CAAC,EAC9B,IAET,GAAG,CAAC,EAAG,EAAU,CACf,GAAI,OAAO,IAAa,SACtB,OAAO,QAAQ,IAAI,EAAG,CAAQ,EAEhC,GAAI,KAAY,EACd,MAAO,GAET,OAAO,EAAE,iBAAiB,CAAQ,IAAM,IAE1C,OAAO,EAAG,CACR,MAAO,CACL,GAAG,QAAQ,QAAQ,CAAM,EACzB,GAAG,CAAC,GAAG,EAAW,KAAK,CAAC,EAAE,IAAI,CAAC,IAAS,GAAkB,CAAI,CAAC,CACjE,GAEF,wBAAwB,CAAC,EAAG,EAAU,CACpC,GAAI,OAAO,IAAa,SACtB,OAAO,QAAQ,yBAAyB,EAAG,CAAQ,EAErD,GAAI,KAAY,EACd,OAAO,QAAQ,yBAAyB,EAAG,CAAQ,EAErD,IAAM,EAAQ,EAAE,iBAAiB,CAAQ,EACzC,GAAI,IAAU,GACZ,MAAO,CAAE,aAAc,GAAM,WAAY,GAAM,SAAU,GAAM,OAAM,EAEvE,OAEJ,CAEgC,EAGlC,SAAS,EAAiB,CAAC,EAA0B,CACnD,OAAO,EAAS,QAAQ,YAAa,CAAC,EAAQ,IAC5C,EAAK,YAAY,CACnB,EAMK,MAAM,CAAuD,CAEjD,MAEjB,WAAW,CAAC,EAAa,CAAC,EAAG,CAC3B,KAAK,MAAQ,EACb,QAAS,EAAQ,EAAG,EAAQ,EAAM,OAAQ,GAAS,EACjD,OAAO,eAAe,KAAM,OAAO,CAAK,EAAG,CACzC,aAAc,GACd,WAAY,GACZ,IAAK,IAAM,KAAK,MAAM,EACxB,CAAC,KAIM,OAAM,EAAW,CAC1B,OAAO,KAAK,MAAM,OAGb,IAAI,CAAC,EAAyB,CACnC,OAAO,KAAK,MAAM,IAAU,MAGtB,OAAO,SAAS,EAAgB,CACtC,OAAO,KAAK,MAAM,OAAO,UAAU,EAG9B,OAAO,CACZ,EACM,CACN,KAAK,MAAM,QAAQ,CAAC,EAAO,IAAU,EAAS,EAAO,EAAO,IAAI,CAAC,EAG5D,OAAO,EAAkC,CAC9C,OAAO,KAAK,MAAM,QAAQ,EAGrB,IAAI,EAA6B,CACtC,OAAO,KAAK,MAAM,KAAK,EAGlB,MAAM,EAAwB,CACnC,OAAO,KAAK,MAAM,OAAO,EAGpB,OAAO,EAAQ,CACpB,MAAO,CAAC,GAAG,KAAK,KAAK,EAEzB,CAKO,MAAM,UAAa,CAAY,OACb,cAAe,QACf,WAAY,QACZ,cAAe,QACf,eAAgB,QAChB,wBACrB,GAEc,SACA,SACT,WAA0B,KAC1B,cAAiC,KAGjC,UAAoB,CAAC,EAE5B,WAAW,CAAC,EAAkB,EAAkB,CAC9C,MAAM,EACN,KAAK,SAAW,EAChB,KAAK,SAAW,KAGP,cAAa,EAAmB,CACzC,IAAM,EAAS,KAAK,WACpB,OAAO,aAAkB,EAAU,EAAS,QAGnC,WAAU,EAAmB,CACtC,OAAO,IAAI,EAAS,CAAC,GAAG,KAAK,SAAS,CAAC,KAG9B,WAAU,EAAgB,CACnC,OAAO,KAAK,UAAU,IAAM,QAGnB,UAAS,EAAgB,CAClC,OAAO,KAAK,UAAU,KAAK,UAAU,OAAS,IAAM,QAG3C,YAAW,EAAgB,CACpC,IAAM,EAAS,KAAK,WACpB,GAAI,CAAC,EACH,OAAO,KAET,IAAM,EAAQ,EAAO,UAAU,QAAQ,IAAI,EAC3C,OAAO,GAAS,EAAK,EAAO,UAAU,EAAQ,IAAM,KAAQ,QAGnD,gBAAe,EAAgB,CACxC,IAAM,EAAS,KAAK,WACpB,GAAI,CAAC,EACH,OAAO,KAET,IAAM,EAAQ,EAAO,UAAU,QAAQ,IAAI,EAC3C,OAAO,EAAQ,EAAI,EAAO,UAAU,EAAQ,GAAK,QAGxC,YAAW,EAAW,CAC/B,IAAI,EAAO,GACX,QAAW,KAAS,KAAK,UACvB,GAAI,EAAM,WAAa,EACrB,GAAS,EAAe,KACnB,QAAI,EAAM,WAAa,EAC5B,GAAQ,EAAM,YAGlB,OAAO,KAGE,YAAW,CAAC,EAAe,CAEpC,GADA,KAAK,UAAY,CAAC,EACd,EAAO,CACT,IAAM,EAAW,IAAI,EAAK,CAAK,EAC/B,EAAS,cAAgB,KAAK,cAC9B,EAAS,WAAa,KACtB,KAAK,UAAU,KAAK,CAAQ,GAIzB,aAAa,EAAY,CAC9B,OAAO,KAAK,UAAU,OAAS,EAG1B,WAA2B,CAAC,EAAY,CAC7C,GAAI,IAAU,KACZ,MAAU,MAAM,gCAAgC,EAGlD,OADA,KAAK,aAAa,EAAM,IAAI,EACrB,EAGF,YAA4B,CAAC,EAAS,EAA2B,CACtE,GAAI,IAAU,KACZ,MAAU,MAAM,oCAAoC,EAEtD,GAAI,EAAK,WACP,EAAK,WAAW,YAAY,CAAI,EAGlC,GADA,EAAK,WAAa,KACd,EAAK,gBAAkB,KACzB,EAAK,cAAgB,KAAK,cAE5B,GAAI,IAAc,KAEhB,OADA,KAAK,UAAU,KAAK,CAAI,EACjB,EAET,IAAM,EAAQ,KAAK,UAAU,QAAQ,CAAS,EAC9C,GAAI,EAAQ,EACV,MAAU,MAAM,4CAA4C,EAG9D,OADA,KAAK,UAAU,OAAO,EAAO,EAAG,CAAI,EAC7B,EAGF,WAA2B,CAAC,EAAY,CAC7C,IAAM,EAAQ,KAAK,UAAU,QAAQ,CAAI,EACzC,GAAI,EAAQ,EACV,MAAU,MAAM,kCAAkC,EAIpD,OAFA,KAAK,UAAU,OAAO,EAAO,CAAC,EAC9B,EAAK,WAAa,KACX,EAGF,YAA4B,CAAC,EAAa,EAAmB,CAClE,IAAM,EAAQ,KAAK,UAAU,QAAQ,CAAQ,EAC7C,GAAI,EAAQ,EACV,MAAU,MAAM,uCAAuC,EAEzD,GAAI,EAAS,WACX,EAAS,WAAW,YAAY,CAAQ,EAG1C,GADA,EAAS,WAAa,KAClB,EAAS,gBAAkB,KAC7B,EAAS,cAAgB,KAAK,cAIhC,OAFA,KAAK,UAAU,GAAS,EACxB,EAAS,WAAa,KACf,EAGF,eAAe,IAAI,EAAqB,CAC7C,QAAW,IAAS,CAAC,GAAG,KAAK,SAAS,EACpC,KAAK,YAAY,CAAK,EAExB,QAAW,KAAQ,EACjB,KAAK,YAAY,CAAI,EAIlB,QAAQ,CAAC,EAA4B,CAC1C,GAAI,CAAC,EACH,MAAO,GAET,IAAI,EAAuB,EAC3B,MAAO,EAAS,CACd,GAAI,IAAY,KACd,MAAO,GAET,EAAU,EAAQ,WAEpB,MAAO,GAGF,MAAM,EAAS,CACpB,KAAK,YAAY,YAAY,IAAI,EAG5B,SAAS,CAAC,EAAO,GAAa,CACnC,IAAM,EAAQ,KAAK,YAAY,EAC/B,GAAI,EACF,QAAW,KAAS,KAAK,UACvB,EAAM,YAAY,EAAM,UAAU,EAAI,CAAS,EAGnD,OAAO,EAIC,WAAW,EAAS,CAC5B,IAAM,EAAQ,IAAI,EAAK,KAAK,SAAU,KAAK,QAAQ,EAEnD,OADA,EAAM,cAAgB,KAAK,cACpB,EAGF,WAAW,EAAS,CACzB,GAAI,CAAC,KAAK,WACR,OAAO,KAET,IAAI,EAAS,KAAK,WAClB,MAAO,EAAO,WACZ,EAAS,EAAO,WAElB,OAAO,EAGF,WAAW,EAAY,CAC5B,OAAO,KAAK,YAAY,EAAE,WAAa,EAE3C,CAKO,MAAM,UAAgB,CAAK,CAChB,aAGC,cAAwD,CAAC,EAElE,WAEA,eAEA,aAER,WAAW,CAAC,EAAiB,EAA8B,KAAM,CAC/D,MAAM,EAA0B,EAAQ,YAAY,CAAC,EACrD,KAAK,aAAe,KAGX,QAAO,EAAW,CAC3B,OAAO,KAAK,YAGH,UAAS,EAAW,CAC7B,OAAO,KAAK,SAAS,YAAY,KAGxB,GAAE,EAAW,CACtB,OAAO,KAAK,aAAa,IAAI,GAAK,MAGzB,GAAE,CAAC,EAAe,CAC3B,KAAK,aAAa,KAAM,CAAK,KAGpB,UAAS,EAAW,CAC7B,OAAO,KAAK,aAAa,OAAO,GAAK,MAG5B,UAAS,CAAC,EAAe,CAClC,KAAK,aAAa,QAAS,CAAK,KAGvB,UAAS,EAAiB,CACnC,GAAI,CAAC,KAAK,eACR,KAAK,eAAiB,IAAI,EAAa,KAAM,OAAO,EAEtD,OAAO,KAAK,kBAGH,MAAK,EAAwB,CACtC,GAAI,CAAC,KAAK,WACR,KAAK,WAAa,EAAuB,EAE3C,OAAO,KAAK,cAGH,QAAO,EAA2B,CAC3C,GAAI,CAAC,KAAK,aACR,KAAK,aAAe,GAAmB,IAAI,EAE7C,OAAO,KAAK,gBAGH,SAAQ,EAAsB,CACvC,OAAO,IAAI,EACT,KAAK,UAAU,OACb,CAAC,IAA4B,EAAM,WAAa,CAClD,CACF,KAGS,kBAAiB,EAAmB,CAC7C,OAAO,KAAK,SAAS,KAAK,CAAC,KAGlB,iBAAgB,EAAmB,CAC5C,OAAO,KAAK,SAAS,KAAK,KAAK,SAAS,OAAS,CAAC,KAGzC,kBAAiB,EAAW,CACrC,OAAO,KAAK,SAAS,UAGZ,WAAU,EAAiB,CACpC,OAAO,IAAI,EAAa,IAAI,EAGvB,YAAY,CAAC,EAA6B,CAC/C,IAAM,EAAQ,KAAK,cAAc,CAAI,EACrC,OAAO,EAAQ,EAAM,MAAQ,KAGxB,iBAAiB,EAAa,CACnC,OAAO,KAAK,cAAc,IAAI,CAAC,IAAU,EAAM,IAAI,EAG9C,YAAY,CAAC,EAAc,EAAsB,CACtD,IAAM,EAAc,OAAO,CAAK,EAChC,GAAI,IAAS,QACX,KAAK,WAAa,EAAuB,EACzC,KAAK,WAAW,QAAU,EAE5B,IAAM,EAAQ,KAAK,cAAc,CAAI,EACrC,GAAI,EACF,EAAM,MAAQ,EAEd,UAAK,cAAc,KAAK,CAAE,OAAM,MAAO,CAAY,CAAC,EAIjD,eAAe,CAAC,EAAoB,CACzC,GAAI,IAAS,QACX,KAAK,WAAa,EAAuB,EAE3C,IAAM,EAAQ,KAAK,cAAc,UAAU,CAAC,IAAU,EAAM,OAAS,CAAI,EACzE,GAAI,GAAS,EACX,KAAK,cAAc,OAAO,EAAO,CAAC,EAI/B,YAAY,CAAC,EAAuB,CACzC,OAAO,KAAK,cAAc,CAAI,IAAM,OAG/B,eAAe,CAAC,EAAc,EAA0B,CAC7D,IAAM,EAAY,GAAS,CAAC,KAAK,aAAa,CAAI,EAClD,GAAI,EACF,KAAK,aAAa,EAAM,EAAE,EAE1B,UAAK,gBAAgB,CAAI,EAE3B,OAAO,EAGF,aAAa,EAAY,CAC9B,OAAO,KAAK,cAAc,OAAS,KAG1B,UAAS,EAAW,CAC7B,OAAO,GAAkB,IAAI,KAGpB,UAAS,CAAC,EAAe,CAClC,KAAK,gBAAgB,GAAG,GAAkB,EAAO,KAAK,aAAa,CAAC,KAG3D,UAAS,EAAW,CAC7B,OAAO,GAAc,IAAI,KAGhB,MAAK,EAAW,CACzB,OAAO,KAAK,aAAa,OAAO,GAAK,MAG5B,MAAK,CAAC,EAAe,CAC9B,KAAK,aAAa,QAAS,CAAK,EAG3B,aAAa,CAAC,EAAkC,CACrD,OAAO,EAAiB,KAAM,CAAQ,EAAE,KAAK,CAAC,EAGzC,gBAAgB,CAAC,EAAqC,CAC3D,OAAO,EAAiB,KAAM,CAAQ,EAGjC,oBAAoB,CAAC,EAAoC,CAC9D,IAAM,EAAU,EAAQ,YAAY,EAC9B,EAAqB,CAAC,EAM5B,OALA,EAAgB,KAAM,CAAC,IAAY,CACjC,GAAI,EAAQ,YAAc,EACxB,EAAQ,KAAK,CAAO,EAEvB,EACM,IAAI,EAAS,CAAO,EAGtB,OAAO,CAAC,EAA2B,CACxC,OAAO,GAAc,KAAM,CAAQ,EAG9B,OAAO,CAAC,EAAkC,CAC/C,GAAI,KAAK,QAAQ,CAAQ,EACvB,OAAO,KAET,IAAI,EAAS,KAAK,cAClB,MAAO,EAAQ,CACb,GAAI,EAAO,QAAQ,CAAQ,EACzB,OAAO,EAET,EAAS,EAAO,cAElB,OAAO,KAGF,qBAAqB,EAAY,CACtC,MAAO,CACL,EAAG,EACH,EAAG,EACH,IAAK,EACL,KAAM,EACN,MAAO,EACP,OAAQ,EACR,MAAO,EACP,OAAQ,EACR,MAAM,EAA2B,CAC/B,MAAO,CACL,EAAG,EACH,EAAG,EACH,IAAK,EACL,KAAM,EACN,MAAO,EACP,OAAQ,EACR,MAAO,EACP,OAAQ,CACV,EAEJ,EAGK,cAAc,EAAS,EAEvB,KAAK,EAAS,EAEd,IAAI,EAAS,EAEb,KAAK,EAAS,CACnB,KAAK,cACH,IAAI,EAAW,QAAS,CAAE,QAAS,GAAM,WAAY,EAAK,CAAC,CAC7D,EAGK,MAAM,IAAI,EAAgC,CAC/C,QAAW,KAAQ,EACjB,GAAI,OAAO,IAAS,SAAU,CAC5B,IAAM,EAAW,IAAI,EAAK,CAAI,EAC9B,EAAS,cAAgB,KAAK,cAC9B,KAAK,YAAY,CAAQ,EAEzB,UAAK,YAAY,CAAI,EAKpB,OAAO,IAAI,EAAgC,CAChD,IAAM,EAAY,KAAK,WACvB,QAAW,KAAQ,EACjB,GAAI,OAAO,IAAS,SAAU,CAC5B,IAAM,EAAW,IAAI,EAAK,CAAI,EAC9B,EAAS,cAAgB,KAAK,cAC9B,KAAK,aAAa,EAAU,CAAS,EAErC,UAAK,aAAa,EAAM,CAAS,EAKhC,MAAM,IAAI,EAAgC,CAC/C,IAAM,EAAS,KAAK,WACpB,GAAI,CAAC,EACH,OAEF,QAAW,KAAQ,EACjB,GAAI,OAAO,IAAS,SAAU,CAC5B,IAAM,EAAW,IAAI,EAAK,CAAI,EAC9B,EAAS,cAAgB,KAAK,cAC9B,EAAO,aAAa,EAAU,IAAI,EAElC,OAAO,aAAa,EAAM,IAAI,EAK7B,KAAK,IAAI,EAAgC,CAC9C,IAAM,EAAS,KAAK,WACpB,GAAI,CAAC,EACH,OAEF,IAAM,EAAY,KAAK,YACvB,QAAW,KAAQ,EACjB,GAAI,OAAO,IAAS,SAAU,CAC5B,IAAM,EAAW,IAAI,EAAK,CAAI,EAC9B,EAAS,cAAgB,KAAK,cAC9B,EAAO,aAAa,EAAU,CAAS,EAEvC,OAAO,aAAa,EAAM,CAAS,EAKlC,WAAW,IAAI,EAAgC,CACpD,IAAM,EAAS,KAAK,WACpB,GAAI,CAAC,EACH,OAEF,IAAM,EAAY,KAAK,YACvB,EAAO,YAAY,IAAI,EACvB,QAAW,KAAQ,EACjB,GAAI,OAAO,IAAS,SAAU,CAC5B,IAAM,EAAW,IAAI,EAAK,CAAI,EAC9B,EAAS,cAAgB,KAAK,cAC9B,EAAO,aAAa,EAAU,CAAS,EAEvC,OAAO,aAAa,EAAM,CAAS,EAKlC,cAAc,CACnB,EACA,EACA,EACM,CACN,KAAK,aAAa,EAAM,CAAK,EAGxB,iBAAiB,CAAC,EAAoB,EAAoB,CAC/D,KAAK,gBAAgB,CAAI,EAGpB,cAAc,CAAC,EAAoB,EAAuB,CAC/D,OAAO,KAAK,aAAa,CAAI,EAGxB,cAAc,CAAC,EAAoB,EAA6B,CACrE,OAAO,KAAK,aAAa,CAAI,EAIxB,aAAa,CAClB,EAC6C,CAC7C,OAAO,KAAK,cAAc,KAAK,CAAC,IAAU,EAAM,OAAS,CAAI,EAIxD,gBAAgB,EAA2C,CAChE,MAAO,CAAC,GAAG,KAAK,aAAa,EAIxB,eAAe,EAAW,CAC/B,OAAO,KAAK,YAAY,SAAW,GAI3B,WAAW,EAAS,CAC5B,IAAM,EAAQ,EAAoB,KAAK,UAAW,KAAK,aAAa,EACpE,QAAW,KAAS,KAAK,cACvB,EAAM,aAAa,EAAM,KAAM,EAAM,KAAK,EAE5C,OAAO,EAEX,CAEO,MAAM,UAAoB,CAAQ,CACvC,WAAW,CAAC,EAAiB,CAC3B,MAAM,CAAO,EAEjB,CAEO,MAAM,CAAkE,CAC5D,QAEjB,WAAW,CAAC,EAAkB,CAC5B,KAAK,QAAU,EACf,QAAS,EAAQ,EAAG,EAAQ,EAAQ,iBAAiB,EAAE,OAAQ,GAAS,EACtE,OAAO,eAAe,KAAM,OAAO,CAAK,EAAG,CACzC,aAAc,GACd,WAAY,GACZ,IAAK,IAAM,KAAK,QAAQ,iBAAiB,EAAE,IAAU,IACvD,CAAC,KAIM,OAAM,EAAW,CAC1B,OAAO,KAAK,QAAQ,iBAAiB,EAAE,OAGlC,IAAI,CAAC,EAAuD,CACjE,OAAO,KAAK,QAAQ,iBAAiB,EAAE,IAAU,KAG5C,YAAY,CAAC,EAAsD,CACxE,OAAO,KAAK,QAAQ,cAAc,CAAI,GAAK,KAGtC,YAAY,CAAC,EAA6C,CAC/D,KAAK,QAAQ,aAAa,EAAK,KAAM,EAAK,KAAK,EAG1C,eAAe,CAAC,EAAoB,CACzC,KAAK,QAAQ,gBAAgB,CAAI,GAG3B,OAAO,SAAS,EAA8C,CACpE,OAAO,KAAK,QAAQ,iBAAiB,EAAE,OAAO,UAAU,EAE5D,CAEO,MAAM,UAA0B,CAAY,CAEzC,cAER,WAAW,CAAC,EAAU,SAAU,CAC9B,MAAM,CAAO,KAGJ,MAAK,EAAW,CACzB,OAAO,KAAK,aAAa,OAAO,GAAK,KAAK,eAGjC,MAAK,CAAC,EAAe,CAC9B,KAAK,aAAa,QAAS,CAAK,KAGvB,KAAI,EAAW,CACxB,OAAO,KAAK,eAGH,MAAK,EAAW,CACzB,OAAO,KAAK,aAAa,OAAO,GAAK,KAAK,eAGjC,SAAQ,EAAY,CAC7B,OAAO,KAAK,iBAAiB,KAGpB,SAAQ,CAAC,EAAgB,CAElC,GADA,KAAK,eAAe,CAAK,EACrB,EAAO,CACT,IAAM,EAAS,KAAK,cACpB,GAAI,aAAkB,GAAqB,CAAC,EAAO,UACjD,QAAW,KAAU,EAAO,QAAQ,QAAQ,EAC1C,GAAI,IAAW,KACb,EAAO,eAAe,EAAK,IAQ9B,cAAc,CAAC,EAAsB,CAE1C,GADA,KAAK,cAAgB,EACjB,EACF,KAAK,aAAa,WAAY,EAAE,EAEhC,UAAK,gBAAgB,UAAU,EAK5B,gBAAgB,EAAY,CACjC,GAAI,KAAK,gBAAkB,OACzB,OAAO,KAAK,cAEd,OAAO,KAAK,aAAa,UAAU,EAEvC,CAEO,MAAM,UAA0B,CAAY,CACjD,WAAW,CAAC,EAAU,SAAU,CAC9B,MAAM,CAAO,KAGJ,SAAQ,EAAY,CAC7B,OAAO,KAAK,aAAa,UAAU,KAG1B,SAAQ,CAAC,EAAgB,CAClC,GAAI,EACF,KAAK,aAAa,WAAY,EAAE,EAEhC,UAAK,gBAAgB,UAAU,KAIxB,QAAO,EAA0B,CAC1C,IAAM,EAA+B,CAAC,EAMtC,OALA,EAAgB,KAAM,CAAC,IAAY,CACjC,GAAI,aAAmB,EACrB,EAAQ,KAAK,CAAO,EAEvB,EACM,IAAI,EAAsB,CAAO,KAG/B,gBAAe,EAAgC,CACxD,OAAO,IAAI,EACT,KAAK,QAAQ,QAAQ,EAAE,OAAO,CAAC,IAAW,EAAO,iBAAiB,CAAC,CACrE,KAGS,cAAa,EAAW,CACjC,OAAO,KAAK,QACT,QAAQ,EACR,UAAU,CAAC,IAAW,EAAO,iBAAiB,CAAC,KAGzC,cAAa,CAAC,EAAe,CACtB,KAAK,QAAQ,QAAQ,EAC7B,QAAQ,CAAC,EAAQ,IACvB,EAAO,eAAe,IAAgB,CAAK,CAC7C,KAGS,MAAK,EAAW,CACzB,IAAM,EAAU,KAAK,QAAQ,QAAQ,EAC/B,EAAW,EAAQ,KAAK,CAAC,IAAW,EAAO,iBAAiB,CAAC,EACnE,GAAI,EACF,OAAO,EAAS,MAElB,GAAI,CAAC,KAAK,UAAY,EAAQ,OAAS,EACrC,OAAO,EAAQ,GAAG,MAEpB,MAAO,MAGE,MAAK,CAAC,EAAe,CAC9B,IAAM,EAAU,KAAK,QAAQ,QAAQ,EACrC,QAAW,KAAU,EAEnB,GADqB,EAAO,QAAU,EAEpC,GAAI,KAAK,SACP,EAAO,eAAe,EAAI,EACrB,KACL,QAAW,KAAS,EAClB,EAAM,eAAe,IAAU,CAAM,EAEvC,QAMD,GAAG,CAAC,EAAiC,CAC1C,KAAK,YAAY,CAAM,EAGlB,YAAY,CAAC,EAAqB,CAEvC,IAAM,EADU,KAAK,QAAQ,QAAQ,EACd,GACvB,GAAI,EACF,EAAO,OAAO,EAGpB,CAEO,MAAM,CAA6D,CACvD,MAEjB,WAAW,CAAC,EAA4B,CACtC,KAAK,MAAQ,EACb,QAAS,EAAQ,EAAG,EAAQ,EAAM,OAAQ,GAAS,EACjD,OAAO,eAAe,KAAM,OAAO,CAAK,EAAG,CACzC,aAAc,GACd,WAAY,GACZ,IAAK,IAAM,KAAK,MAAM,EACxB,CAAC,KAIM,OAAM,EAAW,CAC1B,OAAO,KAAK,MAAM,OAGb,IAAI,CAAC,EAAyC,CACnD,OAAO,KAAK,MAAM,IAAU,QAGnB,MAAK,EAAW,CACzB,OAAO,KAAK,MAAM,KAAK,CAAC,IAAW,EAAO,iBAAiB,CAAC,GAAG,OAAS,MAG/D,cAAa,EAAW,CACjC,OAAO,KAAK,MAAM,UAAU,CAAC,IAAW,EAAO,iBAAiB,CAAC,EAG5D,OAAO,EAAwB,CACpC,MAAO,CAAC,GAAG,KAAK,KAAK,GAGf,OAAO,SAAS,EAAgC,CACtD,OAAO,KAAK,MAAM,OAAO,UAAU,EAEvC,CAEO,MAAM,UAAyB,CAAY,CAExC,WAEA,aAER,WAAW,CAAC,EAAU,QAAS,CAC7B,MAAM,CAAO,KAGJ,KAAI,EAAW,CACxB,OAAO,KAAK,aAAa,MAAM,GAAK,UAG3B,KAAI,CAAC,EAAe,CAC7B,KAAK,aAAa,OAAQ,CAAK,KAGtB,KAAI,EAAW,CACxB,OAAO,KAAK,aAAa,MAAM,GAAK,MAG3B,KAAI,CAAC,EAAe,CAC7B,KAAK,aAAa,OAAQ,CAAK,KAGtB,MAAK,EAAW,CACzB,OAAO,KAAK,YAAc,KAAK,aAAa,OAAO,GAAK,MAG/C,MAAK,CAAC,EAAe,CAC9B,KAAK,WAAa,KAGT,aAAY,EAAW,CAChC,OAAO,KAAK,aAAa,OAAO,GAAK,MAG5B,QAAO,EAAY,CAC5B,OAAO,KAAK,cAAgB,KAAK,aAAa,SAAS,KAG9C,QAAO,CAAC,EAAgB,CACjC,KAAK,aAAe,KAGX,SAAQ,EAAY,CAC7B,OAAO,KAAK,aAAa,UAAU,KAG1B,SAAQ,CAAC,EAAgB,CAClC,GAAI,EACF,KAAK,aAAa,WAAY,EAAE,EAEhC,UAAK,gBAAgB,UAAU,EAKzB,WAAW,EAAS,CAC5B,IAAM,EAAQ,MAAM,YAAY,EAGhC,OAFA,EAAM,WAAa,KAAK,WACxB,EAAM,aAAe,KAAK,aACnB,EAEX,CAEO,MAAM,UAA4B,CAAY,CAE3C,cAER,WAAW,CAAC,EAAU,WAAY,CAChC,MAAM,CAAO,KAGJ,MAAK,EAAW,CACzB,OAAO,KAAK,eAAiB,KAAK,eAGzB,MAAK,CAAC,EAAe,CAC9B,KAAK,cAAgB,EAEzB,CAEO,MAAM,UAA0B,CAAY,CACjD,WAAW,CAAC,EAAU,SAAU,CAC9B,MAAM,CAAO,KAGJ,KAAI,EAAW,CACxB,OAAO,KAAK,aAAa,MAAM,GAAK,SAExC,CAEO,MAAM,UAAyB,CAAY,CAChD,WAAW,CAAC,EAAU,QAAS,CAC7B,MAAM,CAAO,EAEjB,CAEO,MAAM,UAA0B,CAAY,CACjD,WAAW,CAAC,EAAU,IAAK,CACzB,MAAM,CAAO,KAGJ,KAAI,EAAW,CACxB,OAAO,KAAK,aAAa,MAAM,GAAK,MAG3B,KAAI,CAAC,EAAe,CAC7B,KAAK,aAAa,OAAQ,CAAK,EAEnC,CAEO,MAAM,UAAa,CAAK,CACtB,KAEP,WAAW,CAAC,EAAO,GAAI,CACrB,MAAM,EAAuB,OAAO,EACpC,KAAK,KAAO,KAGH,UAAS,EAAW,CAC7B,OAAO,KAAK,QAGH,UAAS,CAAC,EAAe,CAClC,KAAK,KAAO,KAGH,YAAW,EAAW,CAC/B,OAAO,KAAK,QAGH,YAAW,CAAC,EAAe,CACpC,KAAK,KAAO,KAGH,UAAS,EAAW,CAC7B,OAAO,KAAK,KAIJ,WAAW,EAAS,CAC5B,IAAM,EAAQ,IAAI,EAAK,KAAK,IAAI,EAEhC,OADA,EAAM,cAAgB,KAAK,cACpB,EAEX,CAEO,MAAM,UAAgB,CAAK,CACzB,KAEP,WAAW,CAAC,EAAO,GAAI,CACrB,MAAM,EAA0B,UAAU,EAC1C,KAAK,KAAO,KAGH,UAAS,EAAW,CAC7B,OAAO,KAAK,QAGH,UAAS,CAAC,EAAe,CAClC,KAAK,KAAO,EAIJ,WAAW,EAAS,CAC5B,IAAM,EAAQ,IAAI,EAAQ,KAAK,IAAI,EAEnC,OADA,EAAM,cAAgB,KAAK,cACpB,EAEX,CAEO,MAAM,UAAyB,CAAK,CACzC,WAAW,EAAG,CACZ,MAAM,GAAoC,oBAAoB,EAElE,CAEO,MAAM,UAAiB,CAAK,CACjB,YAAgC,KAEhD,WAAW,EAAG,CACZ,MAAM,EAA2B,WAAW,EAGvC,aAAa,CAAC,EAA8B,CACjD,OAAO,EAAoB,EAAS,IAAI,EAGnC,eAAe,CAAC,EAAsB,EAA8B,CACzE,IAAM,EAAU,EAAoB,EAAS,IAAI,EAEjD,OADC,EAA4C,aAAe,EACrD,EAGF,cAAc,CAAC,EAAoB,CACxC,IAAM,EAAO,IAAI,EAAK,CAAI,EAE1B,OADA,EAAK,cAAgB,KACd,EAGF,aAAa,CAAC,EAAuB,CAC1C,IAAM,EAAU,IAAI,EAAQ,CAAI,EAEhC,OADA,EAAQ,cAAgB,KACjB,EAGF,sBAAsB,EAAqB,CAChD,IAAM,EAAW,IAAI,EAErB,OADA,EAAS,cAAgB,KAClB,EAGF,WAAW,CAAC,EAAqB,CACtC,GAAI,IAAS,cAAgB,IAAS,aACpC,OAAO,IAAI,EAAW,EAAE,EAE1B,GAAI,IAAS,iBAAmB,IAAS,gBACvC,OAAO,IAAI,EAAc,EAAE,EAE7B,GAAI,IAAS,eAAiB,IAAS,cACrC,OAAO,IAAI,EAAY,EAAE,EAE3B,OAAO,IAAI,EAAM,EAAE,KAGV,gBAAe,EAAgB,CACxC,IAAM,EAAO,KAAK,UAAU,KAC1B,CAAC,IAAU,EAAM,WAAa,CAChC,EACA,GAAI,EACF,OAAO,EAET,IAAM,EAAU,EAAoB,OAAQ,IAAI,EAEhD,OADA,KAAK,YAAY,CAAO,EACjB,KAGE,KAAI,EAAgB,CAC7B,OAAO,KAAK,oBAAoB,MAAM,KAG7B,KAAI,EAAgB,CAC7B,OAAO,KAAK,oBAAoB,MAAM,KAG7B,MAAK,EAAW,CAEzB,OADqB,KAAK,cAAc,OAAO,GAC1B,aAAe,MAG3B,MAAK,CAAC,EAAe,CAC9B,IAAI,EAAe,KAAK,cAAc,OAAO,EAC7C,GAAI,CAAC,EACH,EAAe,EAAoB,QAAS,IAAI,EAChD,KAAK,KAAK,YAAY,CAAY,EAEpC,EAAa,YAAc,EAGtB,aAAa,CAAC,EAAkC,CACrD,OAAO,EAAiB,KAAM,CAAQ,EAAE,KAAK,CAAC,EAGzC,gBAAgB,CAAC,EAAqC,CAC3D,OAAO,EAAiB,KAAM,CAAQ,EAGjC,cAAc,CAAC,EAA4B,CAChD,IAAI,EAAyB,KAM7B,OALA,EAAgB,KAAM,CAAC,IAAY,CACjC,GAAI,CAAC,GAAU,EAAQ,KAAO,EAC5B,EAAS,EAEZ,EACM,EAGF,oBAAoB,CAAC,EAAoC,CAC9D,OAAO,KAAK,gBAAgB,qBAAqB,CAAO,EAIhD,WAAW,EAAS,CAC5B,OAAO,IAAI,EAGL,mBAAmB,CAAC,EAAuC,CACjE,IAAM,EAAkB,KAAK,gBACzB,EAAQ,EAAgB,UAAU,KACpC,CAAC,IACC,EAAK,WAAa,GACjB,EAAiB,YAAc,CACpC,EACA,GAAI,CAAC,EACH,EAAQ,EAAoB,EAAS,IAAI,EACzC,EAAgB,YAAY,CAAK,EAEnC,OAAO,EAEX,CAKO,MAAM,CAAS,CAEZ,IAER,WAAW,CAAC,EAAa,CACvB,KAAK,IAAM,IAAI,IAAI,CAAG,KAGb,KAAI,EAAW,CACxB,OAAO,KAAK,IAAI,QAGP,KAAI,CAAC,EAAe,CAC7B,KAAK,IAAM,IAAI,IAAI,EAAO,KAAK,IAAI,IAAI,KAG9B,OAAM,EAAW,CAC1B,OAAO,KAAK,IAAI,UAGP,SAAQ,EAAW,CAC5B,OAAO,KAAK,IAAI,YAGP,KAAI,EAAW,CACxB,OAAO,KAAK,IAAI,QAGP,SAAQ,EAAW,CAC5B,OAAO,KAAK,IAAI,YAGP,KAAI,EAAW,CACxB,OAAO,KAAK,IAAI,QAGP,SAAQ,EAAW,CAC5B,OAAO,KAAK,IAAI,YAGP,SAAQ,CAAC,EAAe,CACjC,IAAM,EAAM,KAAK,IACX,EAAO,IAAI,IAAI,EAAO,EAAI,IAAI,EACpC,EAAI,SAAW,EAAK,YAGX,OAAM,EAAW,CAC1B,OAAO,KAAK,IAAI,UAGP,OAAM,CAAC,EAAe,CAC/B,KAAK,IAAI,OAAS,EAAM,WAAW,GAAG,EAAI,EAAQ,IAAI,OAG7C,KAAI,EAAW,CACxB,OAAO,KAAK,IAAI,QAGP,KAAI,CAAC,EAAe,CAC7B,IAAM,EAAW,EAAM,WAAW,GAAG,EAAI,EAAQ,IAAI,IACrD,KAAK,IAAI,KAAO,KAGP,SAAQ,EAAW,CAC5B,OAAO,KAAK,IAAI,YAGP,SAAQ,EAAW,CAC5B,OAAO,KAAK,IAAI,SAGX,MAAM,CAAC,EAAqB,CACjC,KAAK,IAAM,IAAI,IAAI,EAAO,KAAK,IAAI,IAAI,EAGlC,OAAO,CAAC,EAAqB,CAClC,KAAK,IAAM,IAAI,IAAI,EAAO,KAAK,IAAI,IAAI,EAGlC,MAAM,EAAS,EAEf,QAAQ,EAAW,CACxB,OAAO,KAAK,IAAI,KAIX,WAAW,EAAW,CAC3B,OAAO,KAAK,IAAI,KAAK,MAAM,CAAC,EAIvB,kBAAkB,EAAW,CAClC,IAAM,EAAM,KAAK,IACjB,MAAO,GAAG,EAAI,SAAS,EAAI,WAAW,EAAI,SAE9C,CAOO,MAAM,CAAQ,CAEF,UAET,QAA0B,CAAC,EAE3B,MAAQ,EAET,kBAAuC,OAE9C,WAAW,CAAC,EAAsB,CAChC,KAAK,UAAY,EACjB,KAAK,QAAU,CAAC,CAAE,MAAO,KAAM,IAAK,EAAU,SAAS,IAAK,CAAC,KAGpD,OAAM,EAAW,CAC1B,OAAO,KAAK,QAAQ,UAGX,MAAK,EAAY,CAC1B,OAAO,KAAK,QAAQ,KAAK,QAAQ,OAAS,KAGrC,SAAS,CAAC,EAAgB,EAAsB,EAAoB,CACzE,IAAM,EAAU,EACZ,IAAI,IAAI,EAAK,KAAK,UAAU,SAAS,IAAI,EAAE,KAC3C,KAAK,UAAU,SAAS,KAC5B,KAAK,QAAU,KAAK,QAAQ,MAAM,EAAG,KAAK,MAAQ,CAAC,EACnD,KAAK,QAAQ,KAAK,CAAE,QAAO,IAAK,CAAQ,CAAC,EACzC,KAAK,MAAQ,KAAK,QAAQ,OAAS,EACnC,KAAK,UAAU,eAAe,CAAO,EAGhC,YAAY,CACjB,EACA,EACA,EACM,CACN,IAAM,EAAU,EACZ,IAAI,IAAI,EAAK,KAAK,UAAU,SAAS,IAAI,EAAE,KAC3C,KAAK,UAAU,SAAS,KAC5B,KAAK,QAAQ,KAAK,OAAS,CAAE,QAAO,IAAK,CAAQ,EACjD,KAAK,UAAU,eAAe,CAAO,EAGhC,IAAI,EAAS,CAClB,KAAK,GAAG,EAAE,EAGL,OAAO,EAAS,CACrB,KAAK,GAAG,CAAC,EAGJ,EAAE,CAAC,EAAQ,EAAS,CACzB,IAAM,EAAY,KAAK,MAAQ,EAC/B,GAAI,EAAY,GAAK,GAAa,KAAK,QAAQ,OAC7C,OAEF,KAAK,MAAQ,EACb,KAAK,UAAU,eAAe,KAAK,QAAQ,GAAW,GAAG,EACzD,KAAK,UAAU,cACb,IAAI,EAAM,WAAY,CAAE,QAAS,GAAO,WAAY,EAAM,CAAC,CAC7D,EAEJ,CAEO,MAAM,EAAQ,CACF,MAAQ,IAAI,OAElB,OAAM,EAAW,CAC1B,OAAO,KAAK,MAAM,KAGb,GAAG,CAAC,EAA8B,CACvC,MAAO,CAAC,GAAG,KAAK,MAAM,KAAK,CAAC,EAAE,IAAU,KAGnC,OAAO,CAAC,EAA4B,CACzC,OAAO,KAAK,MAAM,IAAI,CAAG,EAAK,KAAK,MAAM,IAAI,CAAG,EAAe,KAG1D,OAAO,CAAC,EAAa,EAAqB,CAC/C,KAAK,MAAM,IAAI,EAAK,OAAO,CAAK,CAAC,EAG5B,UAAU,CAAC,EAAmB,CACnC,KAAK,MAAM,OAAO,CAAG,EAGhB,KAAK,EAAS,CACnB,KAAK,MAAM,MAAM,EAErB,CAEO,MAAM,EAAU,CACL,UAAY,cACZ,SAAW,QACX,SAAW,QACX,UAAY,CAAC,OAAO,EACpB,OAAS,GACT,eAAiB,CACnC,CAaO,SAAS,EAAgB,CAC9B,EACA,EACgB,CAChB,IAAM,EAAY,IAAI,IAChB,EAAU,GACV,EAAuB,CAC3B,MAAO,EACP,QAHc,GAId,SAAU,KACV,gBAAgB,CAAC,EAAM,EAAU,CAC/B,GAAI,IAAS,SACX,EAAU,IAAI,CAAQ,GAG1B,mBAAmB,CAAC,EAAM,EAAU,CAClC,GAAI,IAAS,SACX,EAAU,OAAO,CAAQ,GAG7B,WAAW,CAAC,EAAU,CACpB,EAAU,IAAI,CAAQ,GAExB,cAAc,CAAC,EAAU,CACvB,EAAU,OAAO,CAAQ,GAE3B,aAAa,CAAC,EAAO,CACnB,QAAW,IAAY,CAAC,GAAG,CAAS,EAClC,GAAI,OAAO,IAAa,WACtB,EAAS,KAAK,EAAM,CAAK,EAEzB,OAAS,YAAY,CAAK,EAG9B,MAAO,GAEX,EACA,OAAO,EAGF,MAAM,EAAe,CACnB,OAAO,EAAS,EAChB,SAAS,EAAS,EAClB,UAAU,EAAS,EAC5B,CAEO,IAAM,GAAqC,CAChD,SACA,WACA,OACA,OACA,UACA,UACA,cACA,mBACA,sBACA,oBACA,oBACA,oBACA,mBACA,oBACA,mBACA,WACA,QACA,aACA,gBACA,cACA,cACA,eACA,UACA,WACA,YACA,eACA,aACA,mBACA,wBACA,uBACA,gBACF,EAKO,MAAM,WAAkB,CAAY,CACzB,OAAoB,KACpB,SACA,SACA,QACA,aAAe,IAAI,GACnB,UAAY,IAAI,GAChB,KAAO,EACP,KAAO,EACP,QAAU,EACV,QAAU,EACV,YAAc,EACd,iBAAmB,EACnB,oBAAsB,EACtB,kBAAoB,EACpB,kBAAoB,EACpB,kBAAoB,EACpB,iBAAmB,EACnB,kBAAoB,EACpB,iBAAmB,EACnB,SAAW,EACX,MAAQ,EACR,WAAa,EACb,cAAgB,EAChB,YAAc,EACd,YAAc,EACd,aAAe,EACf,SAAW,EAE3B,WAAW,CAAC,EAA4B,CAAC,EAAG,CAC1C,MAAM,EACN,IAAM,EAAM,EAAQ,KAAO,oBAC3B,KAAK,SAAW,IAAI,EAAS,CAAG,EAChC,KAAK,QAAU,IAAI,EAAQ,IAAI,EAC/B,KAAK,SAAW,IAAI,EACnB,KAAK,SAA+C,YAAc,KACnE,GAAkB,KAAK,QAAQ,EAG1B,UAAU,CAAC,EAA+B,CAC/C,OAAO,GAAiB,KAAM,CAAK,EAG9B,gBAAgB,CAAC,EAAuC,CAC7D,OAAO,EAAQ,MAGV,qBAAqB,CAAC,EAAwC,CACnE,OAAO,WAAW,IAAM,EAAS,KAAK,IAAI,CAAC,EAAG,CAAC,EAG1C,oBAAoB,CAAC,EAAsB,CAChD,aAAa,CAAkD,EAI1D,cAAc,CAAC,EAAmB,CACvC,KAAK,SAAS,KAAO,EAIhB,WAAW,EAAa,CAC7B,MAAO,CAAC,GAAG,EAAe,EAE9B,CASO,SAAS,EAAe,CAAC,EAA4B,CAAC,EAAc,CACzE,OAAO,IAAI,GAAU,CAAO,EAOvB,SAAS,EAAiB,CAC/B,EACA,EAAkC,WACtB,CACZ,IAAM,EAAW,IAAI,IACf,EAAO,EAAU,YAAY,EACnC,QAAW,KAAO,EAChB,EAAS,IAAI,EAAK,OAAO,yBAAyB,EAAQ,CAAG,CAAC,EAEhE,QAAW,KAAO,EAChB,OAAO,eAAe,EAAQ,EAAK,CACjC,aAAc,GACd,WAAY,GACZ,SAAU,GACV,MAAQ,EAAiD,EAC3D,CAAC,EASH,OAPA,OAAO,eAAe,EAAQ,SAAU,CACtC,aAAc,GACd,WAAY,GACZ,SAAU,GACV,MAAO,CACT,CAAC,EAEM,IAAM,CACX,QAAW,KAAO,EAAM,CACtB,IAAM,EAAa,EAAS,IAAI,CAAG,EACnC,GAAI,EACF,OAAO,eAAe,EAAQ,EAAK,CAAU,EAE7C,aAAQ,eAAe,EAAQ,CAAG,IASnC,SAAS,EAAiB,CAC/B,EACA,EACQ,CACR,IAAM,EAAO,IAAI,EACjB,GAAI,EACF,EAAK,cAAgB,EAGvB,OADA,GAAU,EAAM,EAAQ,CAAW,EAC5B,CAAC,GAAG,EAAK,SAAS,EAG3B,SAAS,EAAS,CAChB,EACA,EACA,EACM,CACN,IAAM,EAAmB,CAAC,EACtB,EAAgB,EAChB,EAAQ,EACN,EAAS,EAAO,OAEhB,EAAS,CAAC,IAAqB,CACnC,GAAI,EAAK,gBAAkB,KACzB,EAAK,cAAgB,EAEvB,EAAQ,YAAY,CAAI,GAG1B,MAAO,EAAQ,EAAQ,CACrB,IAAM,EAAY,EAAO,QAAQ,IAAK,CAAK,EAC3C,GAAI,EAAY,EAAG,CACjB,EAAO,IAAI,EAAK,EAAO,MAAM,CAAK,CAAC,CAAC,EACpC,MAEF,GAAI,EAAY,EACd,EAAO,IAAI,EAAK,EAAO,MAAM,EAAO,CAAS,CAAC,CAAC,EAEjD,GAAI,EAAO,WAAW,OAAQ,CAAS,EAAG,CACxC,IAAM,EAAa,EAAO,QAAQ,MAAO,EAAY,CAAC,EAChD,EAAa,EAAa,EAAI,EAAS,EAC7C,EAAO,IAAI,EAAQ,EAAO,MAAM,EAAY,EAAG,CAAU,CAAC,CAAC,EAC3D,EAAQ,EAAa,EAAI,EAAS,EAAa,EAC/C,SAEF,IAAM,EAAS,GAAW,EAAQ,CAAS,EAC3C,GAAI,EAAS,EAAG,CACd,EAAO,IAAI,EAAK,EAAO,MAAM,CAAS,CAAC,CAAC,EACxC,MAGF,IAAM,EADY,EAAO,MAAM,EAAY,EAAG,CAAM,EAC1B,KAAK,EAC/B,GAAI,EAAQ,WAAW,GAAG,EAAG,CAC3B,IAAM,EAAU,EAAQ,MAAM,CAAC,EAAE,KAAK,EAAE,YAAY,EACpD,GAAI,EAAM,OAAS,GAAK,EAAM,EAAM,OAAS,GAAG,YAAc,EAC5D,EAAM,IAAI,EACV,EAAU,EAAM,EAAM,OAAS,IAAM,EAEvC,EAAQ,EAAS,EACjB,SAEF,IAAM,GAAc,EAAQ,SAAS,GAAG,EAClC,EAAS,GAAS,EAAQ,QAAQ,MAAO,EAAE,EAAE,KAAK,CAAC,EACzD,GAAI,CAAC,EAAQ,CACX,EAAQ,EAAS,EACjB,SAEF,IAAM,EAAU,EAAoB,EAAO,KAAM,CAAW,EAC5D,QAAW,KAAQ,EAAO,WACxB,EAAQ,aAAa,EAAK,KAAM,EAAK,KAAK,EAG5C,GADA,EAAO,CAAO,EACV,GAAU,IAAI,EAAO,IAAI,GAAK,GAAa,CAC7C,EAAQ,EAAS,EACjB,SAEF,GAAI,GAAc,IAAI,EAAO,IAAI,EAAG,CAClC,IAAM,EAAW,KAAK,EAAO,QACvB,EAAS,EAAO,YAAY,EAAE,QAAQ,EAAU,EAAS,CAAC,EAC1D,EAAU,EAAO,MAAM,EAAS,EAAG,EAAS,EAAI,EAAS,CAAM,EACrE,EAAQ,YACN,GAAa,eAAe,CAAO,GAAK,IAAI,EAAK,CAAO,CAC1D,EACA,EAAQ,EAAS,EAAI,EAAS,EAAS,EAAS,OAChD,SAEF,EAAM,KAAK,CAAO,EAClB,EAAU,EACV,EAAQ,EAAS,GAIrB,IAAM,GAAY,IAAI,IAAI,CACxB,OACA,OACA,KACA,MACA,QACA,KACA,MACA,QACA,OACA,OACA,QACA,SACA,QACA,KACF,CAAC,EAEK,GAAgB,IAAI,IAAI,CAAC,SAAU,QAAS,WAAY,OAAO,CAAC,EAEtE,SAAS,EAAU,CAAC,EAAgB,EAA2B,CAC7D,IAAI,EAAyB,KAC7B,QAAS,EAAQ,EAAY,EAAG,EAAQ,EAAO,OAAQ,GAAS,EAAG,CACjE,IAAM,EAAO,EAAO,GACpB,GAAI,EAAS,CACX,GAAI,IAAS,EACX,EAAU,KAEZ,SAEF,GAAI,IAAS,KAAO,IAAS,IAAK,CAChC,EAAU,EACV,SAEF,GAAI,IAAS,IACX,OAAO,EAGX,MAAO,GAGT,SAAS,EAAQ,CACf,EAC6E,CAC7E,IAAM,EAAQ,EAAO,MAAM,kCAAkC,EAC7D,GAAI,CAAC,EACH,OAAO,KAET,IAAM,EAAO,EAAM,GAAG,YAAY,EAC5B,EAAqD,CAAC,EACtD,EAAkB,EAAM,GACxB,EACJ,kFACE,EACJ,OAAQ,EAAiB,EAAQ,KAAK,CAAe,KAAO,KAAM,CAChE,IAAM,EAAW,EAAe,GAC1B,EACJ,EAAe,IAAM,EAAe,IAAM,EAAe,IAAM,GACjE,EAAW,KAAK,CAAE,KAAM,EAAU,MAAO,GAAe,CAAK,CAAE,CAAC,EAElE,MAAO,CAAE,OAAM,YAAW,EAG5B,SAAS,EAAc,CAAC,EAAuB,CAC7C,OAAO,EACJ,QAAQ,SAAU,GAAG,EACrB,QAAQ,QAAS,GAAG,EACpB,QAAQ,QAAS,GAAG,EACpB,QAAQ,UAAW,GAAG,EACtB,QAAQ,SAAU,GAAG,EACrB,QAAQ,UAAW,GAAQ,EAGhC,SAAS,EAAU,CAAC,EAAuB,CACzC,OAAO,EACJ,QAAQ,KAAM,OAAO,EACrB,QAAQ,KAAM,MAAM,EACpB,QAAQ,KAAM,MAAM,EAGzB,SAAS,CAAe,CAAC,EAAuB,CAC9C,OAAO,GAAW,CAAK,EAAE,QAAQ,KAAM,QAAQ,EAGjD,SAAS,EAAa,CAAC,EAAoB,CACzC,OAAQ,EAAK,cACN,GACH,OAAO,GAAY,EAAc,IAAI,MAClC,GACH,MAAO,OAAQ,EAAiB,cAC7B,GACH,OAAO,GAAiB,CAAe,UAEvC,MAAO,IAIb,SAAS,EAAgB,CAAC,EAA0B,CAClD,IAAM,EAAM,EAAQ,UACd,EAAuB,CAAC,EAC9B,QAAW,KAAS,EAAQ,iBAAiB,EAAG,CAC9C,GAAI,EAAM,OAAS,QACjB,SAEF,EAAW,KAAK,GAAG,EAAM,SAAS,EAAgB,EAAM,KAAK,IAAI,EAEnE,IAAM,EAAc,EAAQ,gBAAgB,EAC5C,GAAI,EACF,EAAW,KAAK,UAAU,EAAgB,CAAW,IAAI,EAE3D,IAAM,EAAgB,EAAW,OAAS,EAAI,IAAI,EAAW,KAAK,GAAG,IAAM,GAC3E,GAAI,GAAU,IAAI,CAAG,EACnB,MAAO,IAAI,IAAM,KAEnB,GAAI,GAAc,IAAI,CAAG,EACvB,MAAO,IAAI,IAAM,KAAiB,EAAQ,gBAAgB,KAE5D,MAAO,IAAI,IAAM,KAAiB,GAAkB,CAAO,MAAM,KAGnE,SAAS,EAAiB,CAAC,EAA0B,CACnD,OAAO,EAAQ,UAAU,IAAI,CAAC,IAAU,GAAc,CAAK,CAAC,EAAE,KAAK,EAAE,EAMvE,SAAS,EAAa,CAAC,EAAsC,CAC3D,OAAO,EAAS,MAAM,GAAG,EAAE,IAAI,CAAC,IAAU,CACxC,IAAM,EAA6B,CAAC,EAChC,EAAQ,EACZ,MAAO,EAAQ,EAAM,OAAQ,CAC3B,MAAO,EAAQ,EAAM,QAAU,EAAM,KAAW,IAC9C,GAAS,EAEX,GAAI,GAAS,EAAM,OACjB,MAEF,GAAI,EAAM,KAAW,IAAK,CACxB,EAAS,KAAK,CAAE,KAAM,OAAQ,CAAC,EAC/B,GAAS,EACT,SAEF,IAAM,EAAQ,EACd,MACE,EAAQ,EAAM,QACd,EAAM,KAAW,KACjB,EAAM,KAAW,IAEjB,GAAS,EAEX,EAAS,KAAK,GAAc,EAAM,MAAM,EAAO,CAAK,CAAC,CAAC,EAExD,OAAO,EACR,EAYH,SAAS,EAAa,CAAC,EAAgC,CACrD,IAAM,EAA8B,CAAC,EACjC,EAAQ,EACZ,MAAO,EAAQ,EAAO,OAAQ,CAC5B,IAAM,EAAO,EAAO,GACpB,GAAI,IAAS,IACX,EAAU,KAAK,CAAE,KAAM,WAAY,CAAC,EACpC,GAAS,EACJ,QAAI,IAAS,IAAK,CACvB,IAAM,EAAM,EAAe,EAAQ,EAAQ,CAAC,EAC5C,EAAU,KAAK,CAAE,KAAM,KAAM,GAAI,EAAO,MAAM,EAAQ,EAAG,CAAG,CAAE,CAAC,EAC/D,EAAQ,EACH,QAAI,IAAS,IAAK,CACvB,IAAM,EAAM,EAAe,EAAQ,EAAQ,CAAC,EAC5C,EAAU,KAAK,CACb,KAAM,QACN,UAAW,EAAO,MAAM,EAAQ,EAAG,CAAG,CACxC,CAAC,EACD,EAAQ,EACH,QAAI,IAAS,IAAK,CACvB,IAAM,EAAM,EAAO,QAAQ,IAAK,CAAK,EAC/B,EAAQ,EACX,MAAM,EAAQ,EAAG,EAAM,EAAI,EAAO,OAAS,CAAG,EAC9C,KAAK,EACF,EAAY,EAAM,MACtB,sFACF,EACA,GAAI,EACF,EAAU,KAAK,CACb,KAAM,YACN,KAAM,EAAU,GAChB,SAAU,EAAU,GACpB,MAAO,EAAU,IAAM,EAAU,IAAM,EAAU,EACnD,CAAC,EAED,OAAU,KAAK,CAAE,KAAM,YAAa,KAAM,CAAM,CAAC,EAEnD,EAAQ,EAAM,EAAI,EAAO,OAAS,EAAM,EACnC,QAAI,YAAY,KAAK,CAAI,EAAG,CACjC,IAAM,EAAM,EAAe,EAAQ,CAAK,EACxC,EAAU,KAAK,CACb,KAAM,MACN,KAAM,EAAO,MAAM,EAAO,CAAG,EAAE,YAAY,CAC7C,CAAC,EACD,EAAQ,EAER,QAAS,EAGb,GAAI,EAAU,SAAW,EACvB,OAAO,EAAU,GAEnB,MAAO,CAAE,KAAM,WAAY,MAAO,CAAU,EAG9C,SAAS,CAAc,CAAC,EAAgB,EAAuB,CAC7D,IAAI,EAAQ,EACZ,MAAO,EAAQ,EAAO,QAAU,iBAAiB,KAAK,EAAO,EAAM,EACjE,GAAS,EAEX,OAAO,EAGT,SAAS,EAAa,CAAC,EAAkB,EAA2B,CAElE,OADe,GAAc,CAAQ,EACvB,KAAK,CAAC,IAAU,GAAW,EAAS,CAAK,CAAC,EAG1D,SAAS,EAAU,CAAC,EAAkB,EAAkC,CACtE,IAAI,EAAQ,EAAM,OAAS,EAC3B,GAAI,EAAQ,EACV,MAAO,GAIT,GAAI,CAAC,EAAa,EAAS,EAAM,EAAM,EACrC,MAAO,GAET,GAAI,IAAU,EACZ,MAAO,GAIT,IAAI,EAA0B,EAAQ,cACtC,GAAS,EACT,MAAO,EAAS,CACd,IAAM,EAAW,EAAM,GACvB,GAAI,CAAC,EACH,MAAO,GAET,GAAI,EAAS,OAAS,QAAS,CAE7B,IAAM,EAAiB,EAAM,EAAQ,GACrC,GAAI,CAAC,GAAkB,CAAC,EAAa,EAAS,CAAc,EAC1D,MAAO,GAGT,GADA,GAAS,EACL,EAAQ,EACV,MAAO,GAET,EAAU,EAAQ,cAClB,SAEF,GAAI,EAAa,EAAS,CAAQ,GAEhC,GADA,GAAS,EACL,EAAQ,EACV,MAAO,GAGX,EAAU,EAAQ,cAEpB,MAAO,GAGT,SAAS,CAAY,CAAC,EAAkB,EAAmC,CACzE,OAAQ,EAAS,UACV,YACH,MAAO,OACJ,MACH,OAAO,EAAQ,YAAc,EAAS,SACnC,KACH,OAAO,EAAQ,KAAO,EAAS,OAC5B,QACH,OAAO,EAAQ,UAAU,SAAS,EAAS,SAAS,MACjD,YACH,OAAO,GAAe,EAAS,CAAQ,MACpC,WACH,OAAO,EAAS,MAAM,MAAM,CAAC,IAAS,EAAa,EAAS,CAAI,CAAC,MAC9D,QACH,MAAO,WAEP,MAAO,IAIb,SAAS,EAAc,CACrB,EACA,EACS,CACT,IAAM,EAAiB,EAAQ,aAAa,EAAS,IAAI,EACzD,GAAI,CAAC,EAAS,SACZ,OAAO,IAAmB,KAE5B,GAAI,IAAmB,KACrB,MAAO,GAET,IAAM,EAAW,EAAS,OAAS,GACnC,OAAQ,EAAS,cACV,IACH,OAAO,IAAmB,MACvB,KACH,OAAO,EAAe,MAAM,KAAK,EAAE,SAAS,CAAQ,MACjD,KACH,OACE,IAAmB,GAAY,EAAe,WAAW,GAAG,IAAW,MAEtE,KACH,OAAO,EAAe,WAAW,CAAQ,MACtC,KACH,OAAO,EAAe,SAAS,CAAQ,MACpC,KACH,OAAO,EAAe,SAAS,CAAQ,UAEvC,MAAO,IAIb,SAAS,CAAgB,CAAC,EAAY,EAAqC,CACzE,IAAM,EAAqB,CAAC,EAM5B,OALA,EAAgB,EAAM,CAAC,IAAY,CACjC,GAAI,IAAY,GAAQ,GAAc,EAAS,CAAQ,EACrD,EAAQ,KAAK,CAAO,EAEvB,EACM,IAAI,EAAS,CAAO,EAG7B,SAAS,CAAe,CAAC,EAAY,EAAyC,CAC5E,QAAW,KAAS,EAAK,UACvB,GAAI,EAAM,WAAa,EACrB,EAAM,CAAgB,EACtB,EAAgB,EAAO,CAAK,EAKlC,SAAS,CAAmB,CAC1B,EACA,EACa,CACb,IAAM,EAAM,EAAQ,YAAY,EAC5B,EACJ,GAAI,IAAQ,QACV,EAAU,IAAI,EAAiB,CAAG,EAC7B,QAAI,IAAQ,WACjB,EAAU,IAAI,EAAoB,CAAG,EAChC,QAAI,IAAQ,SACjB,EAAU,IAAI,EAAkB,CAAG,EAC9B,QAAI,IAAQ,SACjB,EAAU,IAAI,EAAkB,CAAG,EAC9B,QAAI,IAAQ,SACjB,EAAU,IAAI,EAAkB,CAAG,EAC9B,QAAI,IAAQ,QACjB,EAAU,IAAI,EAAiB,CAAG,EAC7B,QAAI,IAAQ,IACjB,EAAU,IAAI,EAAkB,CAAG,EAEnC,OAAU,IAAI,EAAY,CAAG,EAG/B,OADA,EAAQ,cAAgB,EACjB,EAGT,SAAS,EAAiB,CAAC,EAA6B,CACtD,IAAM,EAAO,EAAY,cAAc,MAAM,EAC7C,EAAK,aAAa,OAAQ,IAAI,EAC9B,EAAY,YAAY,CAAI,EAC5B,IAAM,EAAO,EAAY,cAAc,MAAM,EACvC,EAAO,EAAY,cAAc,MAAM,EAC7C,EAAK,YAAY,CAAI,EACrB,EAAK,YAAY,CAAI,EAGvB,SAAS,EAAkB,CAAC,EAA0C,CAuDpE,OAAO,IAAI,MAAM,CAAC,EAtDoC,CACpD,GAAG,CAAC,EAAS,EAAkB,CAC7B,GAAI,OAAO,IAAa,SACtB,OAEF,OAAO,EAAQ,aAAa,QAAQ,EAAY,CAAQ,GAAG,GAAK,IAElE,GAAG,CAAC,EAAS,EAAkB,EAAwB,CACrD,GAAI,OAAO,IAAa,SACtB,MAAO,GAET,GAAI,IAAU,IAAM,IAAU,MAAQ,IAAU,OAC9C,EAAQ,gBAAgB,QAAQ,EAAY,CAAQ,GAAG,EAEvD,OAAQ,aAAa,QAAQ,EAAY,CAAQ,IAAK,OAAO,CAAK,CAAC,EAErE,MAAO,IAET,cAAc,CAAC,EAAS,EAA2B,CACjD,GAAI,OAAO,IAAa,SACtB,EAAQ,gBAAgB,QAAQ,EAAY,CAAQ,GAAG,EAEzD,MAAO,IAET,GAAG,CAAC,EAAS,EAA2B,CACtC,GAAI,OAAO,IAAa,SACtB,MAAO,GAET,OAAO,EAAQ,aAAa,QAAQ,EAAY,CAAQ,GAAG,GAE7D,OAAO,EAAG,CACR,IAAM,EAAiB,CAAC,EACxB,QAAW,KAAS,EAAQ,iBAAiB,EAC3C,GAAI,EAAM,KAAK,WAAW,OAAO,EAC/B,EAAK,KAAK,GAAY,EAAM,KAAK,MAAM,CAAC,CAAC,CAAC,EAG9C,OAAO,GAET,wBAAwB,CAAC,EAAS,EAAkB,CAClD,GAAI,OAAO,IAAa,SACtB,OAEF,GAAI,EAAQ,aAAa,QAAQ,EAAY,CAAQ,GAAG,EACtD,MAAO,CACL,aAAc,GACd,WAAY,GACZ,SAAU,GACV,MAAO,EAAQ,aAAa,QAAQ,EAAY,CAAQ,GAAG,CAC7D,EAEF,OAEJ,CAC4B,EAG9B,SAAS,CAAW,CAAC,EAAuB,CAC1C,OAAO,EAAM,QAAQ,SAAU,CAAC,IAAU,IAAI,EAAM,YAAY,GAAG,EAGrE,SAAS,EAAW,CAAC,EAAuB,CAC1C,OAAO,EAAM,QAAQ,YAAa,CAAC,EAAQ,IACzC,EAAK,YAAY,CACnB",
8
+ "debugId": "6D3BCEF99138322664756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -0,0 +1,26 @@
1
+ class l{styleElement;styles=new Map;constructor(){this.styleElement=document.createElement("style"),document.head.appendChild(this.styleElement)}addStyle(e,t){this.styles.set(e,t),this.updateStyles()}removeStyle(e){this.styles.delete(e),this.updateStyles()}clearStyles(){this.styles.clear(),this.styleElement.textContent=""}destroy(){this.clearStyles(),this.styleElement.remove()}convertToCSS(e){return Object.entries(e).map(([t,n])=>`${t.replace(/([A-Z])/g,"-$1").toLowerCase()}: ${n};`).join(`
2
+ `)}updateStyles(){let e="";this.styles.forEach((t)=>{if(e+=`${t.selector} {
3
+ ${this.convertToCSS(t.properties)}
4
+ }
5
+ `,t.hover)e+=`${t.selector}:hover {
6
+ ${this.convertToCSS(t.hover)}
7
+ }
8
+ `;if(t.media)Object.entries(t.media).forEach(([n,r])=>{e+=`@media ${n} {
9
+ ${t.selector} {
10
+ ${this.convertToCSS(r)}
11
+ }
12
+ }
13
+ `})}),this.styleElement.textContent=e}}function S(e){return e.map((t)=>i(t)).join(`
14
+
15
+ `)}function i(e,t=""){if("atRule"in e){let r=e.rules.map((s)=>i(s,`${t} `)).join(`
16
+
17
+ `);return`${t}${e.atRule} {
18
+ ${r}
19
+ ${t}}`}let n=Object.entries(e.properties).map(([r,s])=>`${t} ${o(r)}: ${String(s)};`).join(`
20
+ `);return`${t}${e.selector} {
21
+ ${n}
22
+ ${t}}`}function o(e){if(e.startsWith("--")||e.includes("-"))return e;return e.replace(/[A-Z]/g,(t)=>`-${t.toLowerCase()}`)}
23
+ export{l as Ca,S as Da};
24
+
25
+ //# debugId=E95DD9BDDD5C24A364756E2164756E21
26
+ //# sourceMappingURL=index-939sv8vt.js.map