transone-cli 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,7 +3,7 @@
3
3
  "sources": ["../../transone/lib/dom/index.ts", "../src/project.ts"],
4
4
  "sourcesContent": [
5
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 this.defaultPrevented = 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 public readonly shiftKey: boolean;\n public readonly ctrlKey: boolean;\n public readonly altKey: boolean;\n public readonly metaKey: boolean;\n\n constructor(type: string, init?: KeyboardEventInit) {\n super(type, init);\n this.key = init?.key ?? '';\n this.code = init?.code ?? '';\n this.shiftKey = init?.shiftKey ?? false;\n this.ctrlKey = init?.ctrlKey ?? false;\n this.altKey = init?.altKey ?? false;\n this.metaKey = init?.metaKey ?? false;\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 get 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 const view = this.ownerDocument?.defaultView;\n // 无排版引擎时 body/documentElement 的边界即视口,给默认视口尺寸\n const width = view?.innerWidth ?? 1024;\n const height = view?.innerHeight ?? 768;\n const current = this as unknown as HTMLElement;\n const viewport =\n current === this.ownerDocument?.body ||\n current === this.ownerDocument?.documentElement;\n return {\n x: 0,\n y: 0,\n top: 0,\n left: 0,\n right: viewport ? width : 0,\n bottom: viewport ? height : 0,\n width: viewport ? width : 0,\n height: viewport ? height : 0,\n toJSON(): Record<string, number> {\n return {\n x: 0,\n y: 0,\n top: 0,\n left: 0,\n right: viewport ? width : 0,\n bottom: viewport ? height : 0,\n width: viewport ? width : 0,\n height: viewport ? height : 0,\n };\n },\n };\n }\n\n public scrollIntoView(): void {}\n\n public focus(): void {\n this.ownerDocument?.setActiveElement(this);\n }\n\n public blur(): void {\n if (this.ownerDocument?.activeElement === this) {\n this.ownerDocument.setActiveElement(null);\n }\n }\n\n public click(): void {\n // 禁用态表单控件不派发 click(真实浏览器行为)\n const candidate = this as unknown as { disabled?: boolean };\n if (candidate.disabled === true) {\n return;\n }\n this.dispatchEvent(\n new MouseEvent('click', { bubbles: true, cancelable: true })\n );\n // 表单按钮默认行为:type=reset 的按钮点击触发表单 reset 事件\n if (\n this.tagName === 'BUTTON' &&\n this.getAttribute('type') === 'reset' &&\n this.isConnected\n ) {\n this.closest('form')?.dispatchEvent(\n new Event('reset', { bubbles: true, cancelable: true })\n );\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 /** 页面语言(属性反射,无值回退空串)。 */\n public get lang(): string {\n return this.getAttribute('lang') ?? '';\n }\n\n public set lang(value: string) {\n this.setAttribute('lang', value);\n }\n\n /** 是否隐藏(布尔属性反射)。 */\n public get hidden(): boolean {\n return this.hasAttribute('hidden');\n }\n\n public set hidden(value: boolean) {\n if (value) {\n this.setAttribute('hidden', '');\n } else {\n this.removeAttribute('hidden');\n }\n }\n\n /** 键盘焦点顺序(数字属性反射;0 表示按文档顺序)。 */\n public get tabIndex(): number {\n const raw = this.getAttribute('tabindex');\n return raw === null ? 0 : Number(raw);\n }\n\n public set tabIndex(value: number) {\n if (value === 0) {\n this.removeAttribute('tabindex');\n } else {\n this.setAttribute('tabindex', String(value));\n }\n }\n\n /** 布局尺寸与偏移;无排版引擎时恒为 0,测试可覆盖 getBoundingClientRect。 */\n public get offsetWidth(): number {\n return 0;\n }\n\n public get offsetHeight(): number {\n return 0;\n }\n\n public get offsetLeft(): number {\n return 0;\n }\n\n public get offsetTop(): number {\n return 0;\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 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 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 public get placeholder(): string {\n return this.getAttribute('placeholder') ?? '';\n }\n\n public set placeholder(value: string) {\n this.setAttribute('placeholder', value);\n }\n\n public get accept(): string {\n return this.getAttribute('accept') ?? '';\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 set accept(value: string) {\n this.setAttribute('accept', value);\n }\n\n public get min(): string {\n return this.getAttribute('min') ?? '';\n }\n\n public set min(value: string) {\n this.setAttribute('min', value);\n }\n\n public get max(): string {\n return this.getAttribute('max') ?? '';\n }\n\n public set max(value: string) {\n this.setAttribute('max', value);\n }\n\n public get step(): string {\n return this.getAttribute('step') ?? '';\n }\n\n public set step(value: string) {\n this.setAttribute('step', value);\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 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 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 public get placeholder(): string {\n return this.getAttribute('placeholder') ?? '';\n }\n\n public set placeholder(value: string) {\n this.setAttribute('placeholder', value);\n }\n}\n\nexport class HTMLButtonElement extends HTMLElement {\n constructor(tagName = 'button') {\n super(tagName);\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 public get type(): string {\n return this.getAttribute('type') ?? 'submit';\n }\n}\n\nexport class HTMLTableCellElement extends HTMLElement {\n constructor(tagName = 'td') {\n super(tagName);\n }\n\n public get colSpan(): number {\n const raw = this.getAttribute('colspan');\n return raw === null ? 1 : Number(raw);\n }\n\n public set colSpan(value: number) {\n this.setAttribute('colspan', String(value));\n }\n}\n\nexport class HTMLLabelElement extends HTMLElement {\n constructor(tagName = 'label') {\n super(tagName);\n }\n\n public get htmlFor(): string {\n return this.getAttribute('for') ?? '';\n }\n\n public set htmlFor(value: string) {\n this.setAttribute('for', value);\n }\n}\n\nexport class HTMLImageElement extends HTMLElement {\n constructor(tagName = 'img') {\n super(tagName);\n }\n\n public get src(): string {\n return this.getAttribute('src') ?? '';\n }\n\n public set src(value: string) {\n this.setAttribute('src', value);\n }\n\n public get alt(): string {\n return this.getAttribute('alt') ?? '';\n }\n\n public set alt(value: string) {\n this.setAttribute('alt', value);\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 interface DomDocumentImplementation {\n createHTMLDocument(title?: string): Document;\n createDocument(): Document;\n createDocumentType(): never;\n hasFeature(): boolean;\n}\n\nexport class DomDOMImplementation implements DomDocumentImplementation {\n public createDocument(): Document {\n return new Document();\n }\n\n public createDocumentType(): never {\n throw new Error('createDocumentType is not supported in tsone DOM');\n }\n\n public hasFeature(): boolean {\n return false;\n }\n\n public createHTMLDocument(title?: string): Document {\n const document = new Document();\n const html = document.createElement('html');\n const head = document.createElement('head');\n const body = document.createElement('body');\n if (title) {\n const titleElement = document.createElement('title');\n titleElement.textContent = title;\n head.appendChild(titleElement);\n }\n html.appendChild(head);\n html.appendChild(body);\n document.appendChild(html);\n return document;\n }\n}\n\nexport class Document extends Node {\n public readonly defaultView: DomWindow | null = null;\n\n public readonly implementation: DomDocumentImplementation;\n\n private activeElementRef: Element | null = null;\n\n constructor() {\n super(DomNodeType.DOCUMENT_NODE, '#document');\n this.implementation = new DomDOMImplementation();\n }\n\n public get activeElement(): Element | null {\n return this.activeElementRef;\n }\n\n /** @internal 由 Element.focus()/blur() 维护。 */\n public setActiveElement(element: Element | null): void {\n this.activeElementRef = element;\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.5.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 'HTMLImageElement',\n 'HTMLTableCellElement',\n 'HTMLLabelElement',\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 innerWidth = 1024;\n public readonly innerHeight = 768;\n\n public setTimeout(\n handler: () => void,\n timeout?: number\n ): ReturnType<typeof setTimeout> {\n return setTimeout(handler, timeout);\n }\n\n public clearTimeout(id: ReturnType<typeof setTimeout>): void {\n clearTimeout(id);\n }\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: 'not'; selector: 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 (char === ':' && source.startsWith(':not(', index)) {\n const close = source.indexOf(')', index);\n const inner = source.slice(index + 5, close < 0 ? source.length : close);\n selectors.push({ type: 'not', selector: parseCompound(inner.trim()) });\n index = close < 0 ? source.length : close + 1;\n } else if (char === ':' && source.startsWith(':disabled', index)) {\n selectors.push({ type: 'attribute', name: 'disabled' });\n index += ':disabled'.length;\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 // ':' 是伪类(:not)起始,不属于标识符\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 'not':\n return !matchSegment(element, selector.selector);\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 if (tag === 'img') {\n element = new HTMLImageElement(tag);\n } else if (tag === 'label') {\n element = new HTMLLabelElement(tag);\n } else if (tag === 'td' || tag === 'th') {\n element = new HTMLTableCellElement(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 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 (\n element.getAttribute(`data-${toKebabCase(property)}`) ?? undefined\n );\n },\n set(_target, property: string, value: string): boolean {\n if (typeof property === 'symbol') {\n return true;\n }\n if (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
- "import {\n createDomWindow,\n installDomGlobals,\n DOM_GLOBAL_KEYS,\n} from '@geektech/transone/dom';\nimport type { AppDocumentRenderOptions, OneApp } from '@geektech/transone';\nimport type { ResolvedConfig } from './types';\n\nconst PROJECT_GLOBAL_KEYS = [...DOM_GLOBAL_KEYS, '__APP__'];\n\ntype ProjectGlobalKey = (typeof PROJECT_GLOBAL_KEYS)[number];\ntype GlobalDescriptorMap = Map<\n ProjectGlobalKey,\n PropertyDescriptor | undefined\n>;\n\ninterface ProjectEntryModule {\n app?: unknown;\n}\n\nlet projectDomQueue: Promise<void> = Promise.resolve();\n\nexport async function renderProjectHtml(\n config: ResolvedConfig,\n options: AppDocumentRenderOptions,\n entry: string = config.entry,\n route = '/'\n): Promise<string> {\n return withProjectDom(async () => {\n const module = await importProjectEntry(entry);\n const app = module.app as Partial<OneApp> | undefined;\n if (!app || typeof app.renderHtmlDocument !== 'function') {\n throw new Error(\n `TransOne entry ${entry} must export an app with renderHtmlDocument()`\n );\n }\n\n return app.renderHtmlDocument(options);\n }, route, config.build.basePath);\n}\n\nasync function withProjectDom<T>(\n callback: () => Promise<T>,\n route: string,\n basePath: string\n): Promise<T> {\n const task = projectDomQueue.then(() =>\n runWithProjectDom(callback, route, basePath)\n );\n projectDomQueue = task.then(\n () => undefined,\n () => undefined\n );\n\n return task;\n}\n\nasync function runWithProjectDom<T>(\n callback: () => Promise<T>,\n route: string,\n basePath: string\n): Promise<T> {\n const url = `http://127.0.0.1${basePath}${route === '/' ? '/' : route}`;\n const windowRef = createDomWindow({ url });\n Object.assign(windowRef, {\n Error,\n EvalError,\n RangeError,\n ReferenceError,\n SyntaxError,\n TypeError,\n URIError,\n });\n const descriptors = captureGlobalDescriptors();\n\n try {\n installDomGlobals(windowRef);\n return await callback();\n } finally {\n restoreGlobalDescriptors(descriptors);\n }\n}\n\nlet projectEntrySequence = 0;\n\nasync function importProjectEntry(entry: string): Promise<ProjectEntryModule> {\n projectEntrySequence += 1;\n return (await import(\n `${entry}?transone_entry=${projectEntrySequence}`\n )) as ProjectEntryModule;\n}\n\nfunction captureGlobalDescriptors(): GlobalDescriptorMap {\n return new Map(\n PROJECT_GLOBAL_KEYS.map((key) => [\n key,\n Object.getOwnPropertyDescriptor(globalThis, key),\n ])\n );\n}\n\nfunction restoreGlobalDescriptors(descriptors: GlobalDescriptorMap): void {\n PROJECT_GLOBAL_KEYS.forEach((key) => {\n const descriptor = descriptors.get(key);\n if (descriptor) {\n Object.defineProperty(globalThis, key, descriptor);\n return;\n }\n\n delete (globalThis as Record<string, unknown>)[key];\n });\n}\n"
6
+ "import {\n createDomWindow,\n installDomGlobals,\n DOM_GLOBAL_KEYS,\n} from 'transone/dom';\nimport type { AppDocumentRenderOptions, OneApp } from 'transone';\nimport type { ResolvedConfig } from './types';\n\nconst PROJECT_GLOBAL_KEYS = [...DOM_GLOBAL_KEYS, '__APP__'];\n\ntype ProjectGlobalKey = (typeof PROJECT_GLOBAL_KEYS)[number];\ntype GlobalDescriptorMap = Map<\n ProjectGlobalKey,\n PropertyDescriptor | undefined\n>;\n\ninterface ProjectEntryModule {\n app?: unknown;\n}\n\nlet projectDomQueue: Promise<void> = Promise.resolve();\n\nexport async function renderProjectHtml(\n config: ResolvedConfig,\n options: AppDocumentRenderOptions,\n entry: string = config.entry,\n route = '/'\n): Promise<string> {\n return withProjectDom(async () => {\n const module = await importProjectEntry(entry);\n const app = module.app as Partial<OneApp> | undefined;\n if (!app || typeof app.renderHtmlDocument !== 'function') {\n throw new Error(\n `TransOne entry ${entry} must export an app with renderHtmlDocument()`\n );\n }\n\n return app.renderHtmlDocument(options);\n }, route, config.build.basePath);\n}\n\nasync function withProjectDom<T>(\n callback: () => Promise<T>,\n route: string,\n basePath: string\n): Promise<T> {\n const task = projectDomQueue.then(() =>\n runWithProjectDom(callback, route, basePath)\n );\n projectDomQueue = task.then(\n () => undefined,\n () => undefined\n );\n\n return task;\n}\n\nasync function runWithProjectDom<T>(\n callback: () => Promise<T>,\n route: string,\n basePath: string\n): Promise<T> {\n const url = `http://127.0.0.1${basePath}${route === '/' ? '/' : route}`;\n const windowRef = createDomWindow({ url });\n Object.assign(windowRef, {\n Error,\n EvalError,\n RangeError,\n ReferenceError,\n SyntaxError,\n TypeError,\n URIError,\n });\n const descriptors = captureGlobalDescriptors();\n\n try {\n installDomGlobals(windowRef);\n return await callback();\n } finally {\n restoreGlobalDescriptors(descriptors);\n }\n}\n\nlet projectEntrySequence = 0;\n\nasync function importProjectEntry(entry: string): Promise<ProjectEntryModule> {\n projectEntrySequence += 1;\n return (await import(\n `${entry}?transone_entry=${projectEntrySequence}`\n )) as ProjectEntryModule;\n}\n\nfunction captureGlobalDescriptors(): GlobalDescriptorMap {\n return new Map(\n PROJECT_GLOBAL_KEYS.map((key) => [\n key,\n Object.getOwnPropertyDescriptor(globalThis, key),\n ])\n );\n}\n\nfunction restoreGlobalDescriptors(descriptors: GlobalDescriptorMap): void {\n PROJECT_GLOBAL_KEYS.forEach((key) => {\n const descriptor = descriptors.get(key);\n if (descriptor) {\n Object.defineProperty(globalThis, key, descriptor);\n return;\n }\n\n delete (globalThis as Record<string, unknown>)[key];\n });\n}\n"
7
7
  ],
8
8
  "mappings": ";;;;AAiBO,MAAM,qBAAqB,MAAM;AAAA,EACtB;AAAA,EAEhB,WAAW,CAAC,SAAiB,OAAO,SAAS;AAAA,IAC3C,MAAM,OAAO;AAAA,IACb,KAAK,OAAO;AAAA,IACZ,KAAK,OAAO;AAAA;AAEhB;AAAA;AAgBO,MAAM,YAAY;AAAA,EACN,cAAc,IAAI;AAAA,EAE5B,gBAAgB,CACrB,MACA,UACA,SACM;AAAA,IACN,IAAI,CAAC,UAAU;AAAA,MACb;AAAA,IACF;AAAA,IACA,MAAM,UACJ,OAAO,YAAY,YAAY,UAAW,SAAS,WAAW;AAAA,IAChE,MAAM,OAAO,OAAO,YAAY,WAAY,QAAQ,QAAQ,QAAS;AAAA,IACrE,MAAM,UACJ,OAAO,YAAY,WAAY,QAAQ,WAAW,QAAS;AAAA,IAC7D,IAAI,UAAU,KAAK,YAAY,IAAI,IAAI;AAAA,IACvC,IAAI,CAAC,SAAS;AAAA,MACZ,UAAU,CAAC;AAAA,MACX,KAAK,YAAY,IAAI,MAAM,OAAO;AAAA,IACpC;AAAA,IACA,IACE,QAAQ,KACN,CAAC,UAAU,MAAM,aAAa,YAAY,MAAM,YAAY,OAC9D,GACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,QAAQ,KAAK,EAAE,UAAU,SAAS,MAAM,QAAQ,CAAC;AAAA;AAAA,EAG5C,mBAAmB,CACxB,MACA,UACA,SACM;AAAA,IACN,IAAI,CAAC,UAAU;AAAA,MACb;AAAA,IACF;AAAA,IACA,MAAM,UACJ,OAAO,YAAY,YAAY,UAAW,SAAS,WAAW;AAAA,IAChE,MAAM,UAAU,KAAK,YAAY,IAAI,IAAI;AAAA,IACzC,IAAI,CAAC,SAAS;AAAA,MACZ;AAAA,IACF;AAAA,IACA,MAAM,QAAQ,QAAQ,UACpB,CAAC,UAAU,MAAM,aAAa,YAAY,MAAM,YAAY,OAC9D;AAAA,IACA,IAAI,SAAS,GAAG;AAAA,MACd,QAAQ,OAAO,OAAO,CAAC;AAAA,IACzB;AAAA,IACA,IAAI,QAAQ,WAAW,GAAG;AAAA,MACxB,KAAK,YAAY,OAAO,IAAI;AAAA,IAC9B;AAAA;AAAA,EAGK,aAAa,CAAC,OAAuB;AAAA,IAC1C,IAAI,EAAE,iBAAiB,QAAQ;AAAA,MAC7B,MAAM,IAAI,UAAU,0CAA0C;AAAA,IAChE;AAAA,IACA,IAAI,MAAM,YAAY;AAAA,MACpB,MAAM,IAAI,MAAM,mCAAmC;AAAA,IACrD;AAAA,IACA,OAAO,iBAAiB,MAAM,KAAK;AAAA;AAAA,EAI9B,YAAY,CAAC,MAA+B;AAAA,IACjD,OAAO,KAAK,YAAY,IAAI,IAAI,KAAK,CAAC;AAAA;AAE1C;AAAA;AAEO,MAAM,MAAM;AAAA,SACM,OAAO;AAAA,SACP,kBAAkB;AAAA,SAClB,YAAY;AAAA,SACZ,iBAAiB;AAAA,EAExB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACT,SAA6B;AAAA,EAC7B,gBAAoC;AAAA,EACpC,aAAa,MAAM;AAAA,EACnB,mBAAmB;AAAA,EACV,YAAY;AAAA,EACZ;AAAA,EACT,eAAe;AAAA,EAGf,aAAa;AAAA,EAEZ,qBAAqB;AAAA,EAErB,mBAAmB;AAAA,EAEnB,WAAW;AAAA,EAEnB,WAAW,CAAC,MAAc,MAAkB;AAAA,IAC1C,KAAK,OAAO;AAAA,IACZ,KAAK,UAAU,MAAM,WAAW;AAAA,IAChC,KAAK,aAAa,MAAM,cAAc;AAAA,IACtC,KAAK,WAAW,MAAM,YAAY;AAAA,IAClC,KAAK,YAAY,KAAK,IAAI;AAAA;AAAA,EAGrB,cAAc,GAAS;AAAA,IAC5B,IAAI,KAAK,YAAY;AAAA,MACnB,KAAK,WAAW;AAAA,MAChB,KAAK,mBAAmB;AAAA,IAC1B;AAAA;AAAA,EAGK,eAAe,GAAS;AAAA,IAC7B,KAAK,qBAAqB;AAAA,IAC1B,KAAK,eAAe;AAAA;AAAA,EAGf,wBAAwB,GAAS;AAAA,IACtC,KAAK,qBAAqB;AAAA,IAC1B,KAAK,mBAAmB;AAAA,IACxB,KAAK,eAAe;AAAA;AAAA,EAIf,oBAAoB,GAAY;AAAA,IACrC,OAAO,KAAK;AAAA;AAAA,EAIP,kBAAkB,GAAY;AAAA,IACnC,OAAO,KAAK;AAAA;AAAA,EAIP,WAAW,GAAY;AAAA,IAC5B,OAAO,KAAK;AAAA;AAEhB;AAAA;AAEO,MAAM,oBAAiC,MAAM;AAAA,EAClC;AAAA,EAEhB,WAAW,CAAC,MAAc,MAA2B;AAAA,IACnD,MAAM,MAAM,IAAI;AAAA,IAChB,KAAK,SAAS,MAAM;AAAA;AAExB;AAAA;AAEO,MAAM,mBAAmB,MAAM;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEhB,WAAW,CAAC,MAAc,MAAuB;AAAA,IAC/C,MAAM,MAAM,IAAI;AAAA,IAChB,KAAK,UAAU,MAAM,WAAW;AAAA,IAChC,KAAK,UAAU,MAAM,WAAW;AAAA,IAChC,KAAK,SAAS,MAAM,UAAU;AAAA,IAC9B,KAAK,UAAU,MAAM,WAAW;AAAA,IAChC,KAAK,gBAAgB,MAAM,iBAAiB;AAAA;AAEhD;AAAA;AAEO,MAAM,sBAAsB,MAAM;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEhB,WAAW,CAAC,MAAc,MAA0B;AAAA,IAClD,MAAM,MAAM,IAAI;AAAA,IAChB,KAAK,MAAM,MAAM,OAAO;AAAA,IACxB,KAAK,OAAO,MAAM,QAAQ;AAAA,IAC1B,KAAK,WAAW,MAAM,YAAY;AAAA,IAClC,KAAK,UAAU,MAAM,WAAW;AAAA,IAChC,KAAK,SAAS,MAAM,UAAU;AAAA,IAC9B,KAAK,UAAU,MAAM,WAAW;AAAA;AAEpC;AAEA,SAAS,cAAc,CAAC,UAAyB,OAAoB;AAAA,EACnE,MAAM,SAAS,SAAS;AAAA,EACxB,IAAI,OAAO,WAAW,YAAY;AAAA,IAChC,OAAO,KAAK,MAAM,eAAe,KAAK;AAAA,EACxC,EAAO;AAAA,IACL,OAAO,YAAY,KAAK;AAAA;AAAA;AAI5B,SAAS,gBAAgB,CAAC,QAAqB,OAAuB;AAAA,EACpE,MAAM,aAAa;AAAA,EACnB,MAAM,SAAS;AAAA,EAEf,MAAM,QAAQ,eAAe,MAAM;AAAA,EACnC,MAAM,cAAc,CAAC,GAAG,KAAK,EAAE,QAAQ;AAAA,EACvC,MAAM,cAAc,YAAY,SAAS;AAAA,EAEzC,MAAM,aAAa,MAAM;AAAA,EACzB,SAAS,QAAQ,EAAG,QAAQ,aAAa,SAAS,GAAG;AAAA,IACnD,MAAM,UAAU,YAAY;AAAA,IAC5B,IAAI,MAAM,qBAAqB,GAAG;AAAA,MAChC;AAAA,IACF;AAAA,IACA,MAAM,gBAAgB;AAAA,IACtB,aAAa,SAAS,OAAO,IAAI;AAAA,EACnC;AAAA,EAEA,IAAI,CAAC,MAAM,qBAAqB,GAAG;AAAA,IACjC,MAAM,aAAa,MAAM;AAAA,IACzB,MAAM,gBAAgB;AAAA,IACtB,aAAa,QAAQ,OAAO,IAAI;AAAA,IAChC,IAAI,CAAC,MAAM,mBAAmB,GAAG;AAAA,MAC/B,aAAa,QAAQ,OAAO,KAAK;AAAA,IACnC;AAAA,EACF;AAAA,EAEA,IAAI,MAAM,WAAW,CAAC,MAAM,qBAAqB,GAAG;AAAA,IAClD,MAAM,aAAa,MAAM;AAAA,IACzB,SAAS,QAAQ,YAAY,SAAS,EAAG,SAAS,GAAG,SAAS,GAAG;AAAA,MAC/D,MAAM,UAAU,YAAY;AAAA,MAC5B,IAAI,MAAM,qBAAqB,GAAG;AAAA,QAChC;AAAA,MACF;AAAA,MACA,MAAM,gBAAgB;AAAA,MACtB,aAAa,SAAS,OAAO,KAAK;AAAA,IACpC;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,MAAM;AAAA,EACzB,MAAM,gBAAgB;AAAA,EACtB,OAAO,CAAC,MAAM,YAAY;AAAA;AAG5B,SAAS,YAAY,CACnB,QACA,OACA,SACM;AAAA,EACN,MAAM,YAAY,OAAO,aAAa,MAAM,IAAI;AAAA,EAChD,WAAW,SAAS,CAAC,GAAG,SAAS,GAAG;AAAA,IAClC,IAAI,MAAM,YAAY,SAAS;AAAA,MAC7B;AAAA,IACF;AAAA,IACA,IAAI,MAAM,mBAAmB,GAAG;AAAA,MAC9B;AAAA,IACF;AAAA,IACA,IAAI,MAAM,MAAM;AAAA,MACd,OAAO,oBAAoB,MAAM,MAAM,MAAM,UAAU;AAAA,QACrD,SAAS,MAAM;AAAA,MACjB,CAAC;AAAA,IACH;AAAA,IACA,eAAe,OAAO,KAAK;AAAA,EAC7B;AAAA;AAGF,SAAS,cAAc,CAAC,QAAoC;AAAA,EAC1D,MAAM,OAAsB,CAAC;AAAA,EAC7B,IAAI,UAA8B;AAAA,EAClC,OAAO,SAAS;AAAA,IACd,KAAK,KAAK,OAAO;AAAA,IACjB,MAAM,OAAO;AAAA,IACb,IAAI,KAAK,aAAa,uBAA2B;AAAA,MAC/C,MAAM,OAAQ,KAAkB;AAAA,MAChC,IAAI,MAAM;AAAA,QACR,KAAK,KAAK,IAAI;AAAA,MAChB;AAAA,MACA;AAAA,IACF;AAAA,IACA,MAAM,SAAS,KAAK;AAAA,IACpB,IAAI,QAAQ;AAAA,MACV,UAAU;AAAA,MACV;AAAA,IACF;AAAA,IACA;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAAA;AAGF,MAAM,aAAyC;AAAA,EACnC;AAAA,EACA;AAAA,EAEjB,WAAW,CAAC,SAAkB,gBAAgB,SAAS;AAAA,IACrD,KAAK,UAAU;AAAA,IACf,KAAK,gBAAgB;AAAA;AAAA,MAGZ,MAAM,GAAW;AAAA,IAC1B,OAAO,KAAK,OAAO,EAAE;AAAA;AAAA,MAGZ,KAAK,GAAW;AAAA,IACzB,OAAO,KAAK,QAAQ,aAAa,KAAK,aAAa,KAAK;AAAA;AAAA,MAG/C,KAAK,CAAC,OAAe;AAAA,IAC9B,KAAK,UAAU,YAAY,KAAK,CAAC;AAAA;AAAA,EAG5B,IAAI,CAAC,OAA8B;AAAA,IACxC,OAAO,KAAK,OAAO,EAAE,UAAU;AAAA;AAAA,EAG1B,QAAQ,CAAC,OAAwB;AAAA,IACtC,OAAO,KAAK,OAAO,EAAE,SAAS,KAAK;AAAA;AAAA,EAG9B,GAAG,IAAI,QAAwB;AAAA,IACpC,MAAM,UAAU,IAAI,IAAI,KAAK,OAAO,CAAC;AAAA,IACrC,WAAW,SAAS,QAAQ;AAAA,MAC1B,IAAI,OAAO;AAAA,QACT,QAAQ,IAAI,KAAK;AAAA,MACnB;AAAA,IACF;AAAA,IACA,KAAK,UAAU,CAAC,GAAG,OAAO,CAAC;AAAA;AAAA,EAGtB,MAAM,IAAI,QAAwB;AAAA,IACvC,MAAM,UAAU,IAAI,IAAI,KAAK,OAAO,CAAC;AAAA,IACrC,WAAW,SAAS,QAAQ;AAAA,MAC1B,QAAQ,OAAO,KAAK;AAAA,IACtB;AAAA,IACA,KAAK,UAAU,CAAC,GAAG,OAAO,CAAC;AAAA;AAAA,EAGtB,MAAM,CAAC,OAAe,OAA0B;AAAA,IACrD,MAAM,UAAU,IAAI,IAAI,KAAK,OAAO,CAAC;AAAA,IACrC,MAAM,YAAY,SAAS,CAAC,QAAQ,IAAI,KAAK;AAAA,IAC7C,IAAI,WAAW;AAAA,MACb,QAAQ,IAAI,KAAK;AAAA,IACnB,EAAO;AAAA,MACL,QAAQ,OAAO,KAAK;AAAA;AAAA,IAEtB,KAAK,UAAU,CAAC,GAAG,OAAO,CAAC;AAAA,IAC3B,OAAO;AAAA;AAAA,EAGF,OAAO,CAAC,UAAkB,UAA2B;AAAA,IAC1D,MAAM,UAAU,KAAK,OAAO;AAAA,IAC5B,MAAM,QAAQ,QAAQ,QAAQ,QAAQ;AAAA,IACtC,IAAI,QAAQ,GAAG;AAAA,MACb,OAAO;AAAA,IACT;AAAA,IACA,QAAQ,SAAS;AAAA,IACjB,KAAK,UAAU,OAAO;AAAA,IACtB,OAAO;AAAA;AAAA,GAGD,OAAO,SAAS,GAAqB;AAAA,IAC3C,OAAO,KAAK,OAAO,EAAE,OAAO,UAAU;AAAA;AAAA,EAGjC,OAAO,CACZ,UACM;AAAA,IACN,KAAK,OAAO,EAAE,QAAQ,CAAC,OAAO,UAAU,SAAS,OAAO,OAAO,IAAI,CAAC;AAAA;AAAA,EAG/D,QAAQ,GAAW;AAAA,IACxB,OAAO,KAAK;AAAA;AAAA,EAGN,MAAM,GAAa;AAAA,IACzB,OAAO,YAAY,KAAK,QAAQ,aAAa,KAAK,aAAa,KAAK,EAAE;AAAA;AAAA,EAGhE,SAAS,CAAC,QAAwB;AAAA,IACxC,MAAM,QAAQ,OAAO,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,IAC7C,IAAI,OAAO;AAAA,MACT,KAAK,QAAQ,aAAa,KAAK,eAAe,KAAK;AAAA,IACrD,EAAO;AAAA,MACL,KAAK,QAAQ,gBAAgB,KAAK,aAAa;AAAA;AAAA;AAGrD;AAEA,SAAS,WAAW,CAAC,OAAyB;AAAA,EAC5C,OAAO,MAAM,KAAK,EAAE,MAAM,KAAK,EAAE,OAAO,OAAO;AAAA;AAGjD,SAAS,oBAAoB,CAAC,UAA0B;AAAA,EACtD,OAAO,SAAS,QAAQ,UAAU,CAAC,UAAU,IAAI,MAAM,YAAY,GAAG;AAAA;AAiBjE,SAAS,sBAAsB,GAAwB;AAAA,EAC5D,MAAM,aAAa,IAAI;AAAA,EAEvB,MAAM,SAAsB;AAAA,IAC1B;AAAA,IAEA,WAAW,CAAC,UAAkB,OAAe,WAAW,IAAU;AAAA,MAChE,MAAM,OAAO,qBAAqB,QAAQ;AAAA,MAC1C,IAAI,UAAU,IAAI;AAAA,QAChB,WAAW,OAAO,IAAI;AAAA,MACxB,EAAO;AAAA,QACL,WAAW,IAAI,MAAM,EAAE,OAAO,SAAS,CAAC;AAAA;AAAA;AAAA,IAI5C,gBAAgB,CAAC,UAA0B;AAAA,MACzC,OAAO,WAAW,IAAI,qBAAqB,QAAQ,CAAC,GAAG,SAAS;AAAA;AAAA,IAGlE,mBAAmB,CAAC,UAA0B;AAAA,MAC5C,OAAO,WAAW,IAAI,qBAAqB,QAAQ,CAAC,GAAG,YAAY;AAAA;AAAA,IAGrE,cAAc,CAAC,UAA0B;AAAA,MACvC,MAAM,OAAO,qBAAqB,QAAQ;AAAA,MAC1C,MAAM,WAAW,WAAW,IAAI,IAAI,GAAG,SAAS;AAAA,MAChD,WAAW,OAAO,IAAI;AAAA,MACtB,OAAO;AAAA;AAAA,IAGT,IAAI,CAAC,OAAuB;AAAA,MAC1B,OAAO,CAAC,GAAG,WAAW,KAAK,CAAC,EAAE,UAAU;AAAA;AAAA,QAGtC,MAAM,GAAW;AAAA,MACnB,OAAO,WAAW;AAAA;AAAA,QAGhB,OAAO,GAAW;AAAA,MACpB,OAAO,CAAC,GAAG,WAAW,QAAQ,CAAC,EAC5B,IACC,EAAE,MAAM,WACN,GAAG,SAAS,MAAM,QAAQ,MAAM,WAAW,IAAI,MAAM,aAAa,KACtE,EACC,KAAK,GAAG;AAAA;AAAA,QAGT,OAAO,CAAC,OAAe;AAAA,MACzB,WAAW,MAAM;AAAA,MACjB,WAAW,eAAe,MAAM,MAAM,GAAG,GAAG;AAAA,QAC1C,MAAM,UAAU,YAAY,KAAK;AAAA,QACjC,IAAI,CAAC,SAAS;AAAA,UACZ;AAAA,QACF;AAAA,QACA,MAAM,YAAY,QAAQ,QAAQ,GAAG;AAAA,QACrC,IAAI,YAAY,GAAG;AAAA,UACjB;AAAA,QACF;AAAA,QACA,MAAM,OAAO,QAAQ,MAAM,GAAG,SAAS,EAAE,KAAK;AAAA,QAC9C,MAAM,gBAAgB,QAAQ,MAAM,YAAY,CAAC,EAAE,KAAK;AAAA,QACxD,IAAI,MAAM;AAAA,UACR,OAAO,YAAY,MAAM,aAAa;AAAA,QACxC;AAAA,MACF;AAAA;AAAA,EAEJ;AAAA,EAEA,MAAM,UAAqC;AAAA,IACzC,GAAG,CAAC,GAAG,UAAU,UAAU;AAAA,MACzB,IAAI,OAAO,aAAa,UAAU;AAAA,QAChC,OAAO,QAAQ,IAAI,GAAG,UAAU,QAAQ;AAAA,MAC1C;AAAA,MACA,IAAI,YAAY,GAAG;AAAA,QACjB,MAAM,QAAQ,QAAQ,IAAI,GAAG,UAAU,QAAQ;AAAA,QAC/C,OAAO,OAAO,UAAU,aAAa,MAAM,KAAK,CAAC,IAAI;AAAA,MACvD;AAAA,MACA,OAAO,EAAE,iBAAiB,QAAQ;AAAA;AAAA,IAEpC,GAAG,CAAC,GAAG,UAAU,OAAO,UAAU;AAAA,MAChC,IAAI,OAAO,aAAa,UAAU;AAAA,QAChC,OAAO,QAAQ,IAAI,GAAG,UAAU,OAAO,QAAQ;AAAA,MACjD;AAAA,MACA,IAAI,YAAY,GAAG;AAAA,QACjB,OAAO,QAAQ,IAAI,GAAG,UAAU,OAAO,QAAQ;AAAA,MACjD;AAAA,MACA,EAAE,YAAY,UAAU,OAAO,KAAK,CAAC;AAAA,MACrC,OAAO;AAAA;AAAA,IAET,GAAG,CAAC,GAAG,UAAU;AAAA,MACf,IAAI,OAAO,aAAa,UAAU;AAAA,QAChC,OAAO,QAAQ,IAAI,GAAG,QAAQ;AAAA,MAChC;AAAA,MACA,IAAI,YAAY,GAAG;AAAA,QACjB,OAAO;AAAA,MACT;AAAA,MACA,OAAO,EAAE,iBAAiB,QAAQ,MAAM;AAAA;AAAA,IAE1C,OAAO,GAAG;AAAA,MACR,OAAO;AAAA,QACL,GAAG,QAAQ,QAAQ,MAAM;AAAA,QACzB,GAAG,CAAC,GAAG,WAAW,KAAK,CAAC,EAAE,IAAI,CAAC,SAAS,kBAAkB,IAAI,CAAC;AAAA,MACjE;AAAA;AAAA,IAEF,wBAAwB,CAAC,GAAG,UAAU;AAAA,MACpC,IAAI,OAAO,aAAa,UAAU;AAAA,QAChC,OAAO,QAAQ,yBAAyB,GAAG,QAAQ;AAAA,MACrD;AAAA,MACA,IAAI,YAAY,GAAG;AAAA,QACjB,OAAO,QAAQ,yBAAyB,GAAG,QAAQ;AAAA,MACrD;AAAA,MACA,MAAM,QAAQ,EAAE,iBAAiB,QAAQ;AAAA,MACzC,IAAI,UAAU,IAAI;AAAA,QAChB,OAAO,EAAE,cAAc,MAAM,YAAY,MAAM,UAAU,MAAM,MAAM;AAAA,MACvE;AAAA,MACA;AAAA;AAAA,EAEJ;AAAA,EAEA,OAAO,IAAI,MAAM,QAAQ,OAAO;AAAA;AAGlC,SAAS,iBAAiB,CAAC,UAA0B;AAAA,EACnD,OAAO,SAAS,QAAQ,aAAa,CAAC,QAAQ,SAC5C,KAAK,YAAY,CACnB;AAAA;AAAA;AAMK,MAAM,SAAuD;AAAA,EAEjD;AAAA,EAEjB,WAAW,CAAC,QAAa,CAAC,GAAG;AAAA,IAC3B,KAAK,QAAQ;AAAA,IACb,SAAS,QAAQ,EAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;AAAA,MACpD,OAAO,eAAe,MAAM,OAAO,KAAK,GAAG;AAAA,QACzC,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,KAAK,MAAM,KAAK,MAAM;AAAA,MACxB,CAAC;AAAA,IACH;AAAA;AAAA,MAGS,MAAM,GAAW;AAAA,IAC1B,OAAO,KAAK,MAAM;AAAA;AAAA,EAGb,IAAI,CAAC,OAAyB;AAAA,IACnC,OAAO,KAAK,MAAM,UAAU;AAAA;AAAA,GAGtB,OAAO,SAAS,GAAgB;AAAA,IACtC,OAAO,KAAK,MAAM,OAAO,UAAU;AAAA;AAAA,EAG9B,OAAO,CACZ,UACM;AAAA,IACN,KAAK,MAAM,QAAQ,CAAC,OAAO,UAAU,SAAS,OAAO,OAAO,IAAI,CAAC;AAAA;AAAA,EAG5D,OAAO,GAAkC;AAAA,IAC9C,OAAO,KAAK,MAAM,QAAQ;AAAA;AAAA,EAGrB,IAAI,GAA6B;AAAA,IACtC,OAAO,KAAK,MAAM,KAAK;AAAA;AAAA,EAGlB,MAAM,GAAwB;AAAA,IACnC,OAAO,KAAK,MAAM,OAAO;AAAA;AAAA,EAGpB,OAAO,GAAQ;AAAA,IACpB,OAAO,CAAC,GAAG,KAAK,KAAK;AAAA;AAEzB;AAAA;AAKO,MAAM,aAAa,YAAY;AAAA,SACb,eAAe;AAAA,SACf,YAAY;AAAA,SACZ,eAAe;AAAA,SACf,gBAAgB;AAAA,SAChB,yBACrB;AAAA,EAEc;AAAA,EACA;AAAA,EACT,aAA0B;AAAA,EAC1B,gBAAiC;AAAA,EAGjC,YAAoB,CAAC;AAAA,EAE5B,WAAW,CAAC,UAAkB,UAAkB;AAAA,IAC9C,MAAM;AAAA,IACN,KAAK,WAAW;AAAA,IAChB,KAAK,WAAW;AAAA;AAAA,MAGP,aAAa,GAAmB;AAAA,IACzC,MAAM,SAAS,KAAK;AAAA,IACpB,OAAO,kBAAkB,UAAU,SAAS;AAAA;AAAA,MAGnC,UAAU,GAAmB;AAAA,IACtC,OAAO,IAAI,SAAS,CAAC,GAAG,KAAK,SAAS,CAAC;AAAA;AAAA,MAG9B,UAAU,GAAgB;AAAA,IACnC,OAAO,KAAK,UAAU,MAAM;AAAA;AAAA,MAGnB,SAAS,GAAgB;AAAA,IAClC,OAAO,KAAK,UAAU,KAAK,UAAU,SAAS,MAAM;AAAA;AAAA,MAG3C,WAAW,GAAgB;AAAA,IACpC,MAAM,SAAS,KAAK;AAAA,IACpB,IAAI,CAAC,QAAQ;AAAA,MACX,OAAO;AAAA,IACT;AAAA,IACA,MAAM,QAAQ,OAAO,UAAU,QAAQ,IAAI;AAAA,IAC3C,OAAO,SAAS,IAAK,OAAO,UAAU,QAAQ,MAAM,OAAQ;AAAA;AAAA,MAGnD,eAAe,GAAgB;AAAA,IACxC,MAAM,SAAS,KAAK;AAAA,IACpB,IAAI,CAAC,QAAQ;AAAA,MACX,OAAO;AAAA,IACT;AAAA,IACA,MAAM,QAAQ,OAAO,UAAU,QAAQ,IAAI;AAAA,IAC3C,OAAO,QAAQ,IAAI,OAAO,UAAU,QAAQ,KAAK;AAAA;AAAA,MAGxC,WAAW,GAAW;AAAA,IAC/B,IAAI,OAAO;AAAA,IACX,WAAW,SAAS,KAAK,WAAW;AAAA,MAClC,IAAI,MAAM,aAAa,mBAAuB;AAAA,QAC5C,QAAS,MAAe;AAAA,MAC1B,EAAO,SAAI,MAAM,aAAa,sBAA0B;AAAA,QACtD,QAAQ,MAAM;AAAA,MAChB;AAAA,IACF;AAAA,IACA,OAAO;AAAA;AAAA,MAGE,WAAW,CAAC,OAAe;AAAA,IACpC,KAAK,YAAY,CAAC;AAAA,IAClB,IAAI,OAAO;AAAA,MACT,MAAM,WAAW,IAAI,KAAK,KAAK;AAAA,MAC/B,SAAS,gBAAgB,KAAK;AAAA,MAC9B,SAAS,aAAa;AAAA,MACtB,KAAK,UAAU,KAAK,QAAQ;AAAA,IAC9B;AAAA;AAAA,EAGK,aAAa,GAAY;AAAA,IAC9B,OAAO,KAAK,UAAU,SAAS;AAAA;AAAA,EAG1B,WAA2B,CAAC,MAAY;AAAA,IAC7C,IAAI,SAAU,MAAe;AAAA,MAC3B,MAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AAAA,IACA,KAAK,aAAa,MAAM,IAAI;AAAA,IAC5B,OAAO;AAAA;AAAA,EAGF,YAA4B,CAAC,MAAS,WAA2B;AAAA,IACtE,IAAI,SAAU,MAAe;AAAA,MAC3B,MAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AAAA,IACA,IAAI,KAAK,YAAY;AAAA,MACnB,KAAK,WAAW,YAAY,IAAI;AAAA,IAClC;AAAA,IACA,KAAK,aAAa;AAAA,IAClB,IAAI,KAAK,kBAAkB,MAAM;AAAA,MAC/B,KAAK,gBAAgB,KAAK;AAAA,IAC5B;AAAA,IACA,IAAI,cAAc,MAAM;AAAA,MACtB,KAAK,UAAU,KAAK,IAAI;AAAA,MACxB,OAAO;AAAA,IACT;AAAA,IACA,MAAM,QAAQ,KAAK,UAAU,QAAQ,SAAS;AAAA,IAC9C,IAAI,QAAQ,GAAG;AAAA,MACb,MAAM,IAAI,MAAM,4CAA4C;AAAA,IAC9D;AAAA,IACA,KAAK,UAAU,OAAO,OAAO,GAAG,IAAI;AAAA,IACpC,OAAO;AAAA;AAAA,EAGF,WAA2B,CAAC,MAAY;AAAA,IAC7C,MAAM,QAAQ,KAAK,UAAU,QAAQ,IAAI;AAAA,IACzC,IAAI,QAAQ,GAAG;AAAA,MACb,MAAM,IAAI,MAAM,kCAAkC;AAAA,IACpD;AAAA,IACA,KAAK,UAAU,OAAO,OAAO,CAAC;AAAA,IAC9B,KAAK,aAAa;AAAA,IAClB,OAAO;AAAA;AAAA,EAGF,YAA4B,CAAC,UAAa,UAAmB;AAAA,IAClE,MAAM,QAAQ,KAAK,UAAU,QAAQ,QAAQ;AAAA,IAC7C,IAAI,QAAQ,GAAG;AAAA,MACb,MAAM,IAAI,MAAM,uCAAuC;AAAA,IACzD;AAAA,IACA,IAAI,SAAS,YAAY;AAAA,MACvB,SAAS,WAAW,YAAY,QAAQ;AAAA,IAC1C;AAAA,IACA,SAAS,aAAa;AAAA,IACtB,IAAI,SAAS,kBAAkB,MAAM;AAAA,MACnC,SAAS,gBAAgB,KAAK;AAAA,IAChC;AAAA,IACA,KAAK,UAAU,SAAS;AAAA,IACxB,SAAS,aAAa;AAAA,IACtB,OAAO;AAAA;AAAA,EAGF,eAAe,IAAI,OAAqB;AAAA,IAC7C,WAAW,SAAS,CAAC,GAAG,KAAK,SAAS,GAAG;AAAA,MACvC,KAAK,YAAY,KAAK;AAAA,IACxB;AAAA,IACA,WAAW,QAAQ,OAAO;AAAA,MACxB,KAAK,YAAY,IAAI;AAAA,IACvB;AAAA;AAAA,EAGK,QAAQ,CAAC,MAA4B;AAAA,IAC1C,IAAI,CAAC,MAAM;AAAA,MACT,OAAO;AAAA,IACT;AAAA,IACA,IAAI,UAAuB;AAAA,IAC3B,OAAO,SAAS;AAAA,MACd,IAAI,YAAY,MAAM;AAAA,QACpB,OAAO;AAAA,MACT;AAAA,MACA,UAAU,QAAQ;AAAA,IACpB;AAAA,IACA,OAAO;AAAA;AAAA,EAGF,MAAM,GAAS;AAAA,IACpB,KAAK,YAAY,YAAY,IAAI;AAAA;AAAA,EAG5B,SAAS,CAAC,OAAO,OAAa;AAAA,IACnC,MAAM,QAAQ,KAAK,YAAY;AAAA,IAC/B,IAAI,MAAM;AAAA,MACR,WAAW,SAAS,KAAK,WAAW;AAAA,QAClC,MAAM,YAAY,MAAM,UAAU,IAAI,CAAS;AAAA,MACjD;AAAA,IACF;AAAA,IACA,OAAO;AAAA;AAAA,EAIC,WAAW,GAAS;AAAA,IAC5B,MAAM,QAAQ,IAAI,KAAK,KAAK,UAAU,KAAK,QAAQ;AAAA,IACnD,MAAM,gBAAgB,KAAK;AAAA,IAC3B,OAAO;AAAA;AAAA,EAGF,WAAW,GAAS;AAAA,IACzB,IAAI,CAAC,KAAK,YAAY;AAAA,MACpB,OAAO;AAAA,IACT;AAAA,IACA,IAAI,SAAS,KAAK;AAAA,IAClB,OAAO,OAAO,YAAY;AAAA,MACxB,SAAS,OAAO;AAAA,IAClB;AAAA,IACA,OAAO;AAAA;AAAA,MAGE,WAAW,GAAY;AAAA,IAChC,OAAO,KAAK,YAAY,EAAE,aAAa;AAAA;AAE3C;AAAA;AAKO,MAAM,gBAAgB,KAAK;AAAA,EAChB;AAAA,EAGC,gBAAwD,CAAC;AAAA,EAElE;AAAA,EAEA;AAAA,EAEA;AAAA,EAER,WAAW,CAAC,SAAiB,eAA8B,MAAM;AAAA,IAC/D,MAAM,sBAA0B,QAAQ,YAAY,CAAC;AAAA,IACrD,KAAK,eAAe;AAAA;AAAA,MAGX,OAAO,GAAW;AAAA,IAC3B,OAAO,KAAK;AAAA;AAAA,MAGH,SAAS,GAAW;AAAA,IAC7B,OAAO,KAAK,SAAS,YAAY;AAAA;AAAA,MAGxB,EAAE,GAAW;AAAA,IACtB,OAAO,KAAK,aAAa,IAAI,KAAK;AAAA;AAAA,MAGzB,EAAE,CAAC,OAAe;AAAA,IAC3B,KAAK,aAAa,MAAM,KAAK;AAAA;AAAA,MAGpB,SAAS,GAAW;AAAA,IAC7B,OAAO,KAAK,aAAa,OAAO,KAAK;AAAA;AAAA,MAG5B,SAAS,CAAC,OAAe;AAAA,IAClC,KAAK,aAAa,SAAS,KAAK;AAAA;AAAA,MAGvB,SAAS,GAAiB;AAAA,IACnC,IAAI,CAAC,KAAK,gBAAgB;AAAA,MACxB,KAAK,iBAAiB,IAAI,aAAa,MAAM,OAAO;AAAA,IACtD;AAAA,IACA,OAAO,KAAK;AAAA;AAAA,MAGH,KAAK,GAAwB;AAAA,IACtC,IAAI,CAAC,KAAK,YAAY;AAAA,MACpB,KAAK,aAAa,uBAAuB;AAAA,IAC3C;AAAA,IACA,OAAO,KAAK;AAAA;AAAA,MAGH,OAAO,GAA2B;AAAA,IAC3C,IAAI,CAAC,KAAK,cAAc;AAAA,MACtB,KAAK,eAAe,mBAAmB,IAAI;AAAA,IAC7C;AAAA,IACA,OAAO,KAAK;AAAA;AAAA,MAGH,QAAQ,GAAsB;AAAA,IACvC,OAAO,IAAI,SACT,KAAK,UAAU,OACb,CAAC,UAA4B,MAAM,aAAa,oBAClD,CACF;AAAA;AAAA,MAGS,iBAAiB,GAAmB;AAAA,IAC7C,OAAO,KAAK,SAAS,KAAK,CAAC;AAAA;AAAA,MAGlB,gBAAgB,GAAmB;AAAA,IAC5C,OAAO,KAAK,SAAS,KAAK,KAAK,SAAS,SAAS,CAAC;AAAA;AAAA,MAGzC,iBAAiB,GAAW;AAAA,IACrC,OAAO,KAAK,SAAS;AAAA;AAAA,MAGZ,UAAU,GAAiB;AAAA,IACpC,OAAO,IAAI,aAAa,IAAI;AAAA;AAAA,EAGvB,YAAY,CAAC,MAA6B;AAAA,IAC/C,MAAM,QAAQ,KAAK,cAAc,IAAI;AAAA,IACrC,OAAO,QAAQ,MAAM,QAAQ;AAAA;AAAA,EAGxB,iBAAiB,GAAa;AAAA,IACnC,OAAO,KAAK,cAAc,IAAI,CAAC,UAAU,MAAM,IAAI;AAAA;AAAA,EAG9C,YAAY,CAAC,MAAc,OAAsB;AAAA,IACtD,MAAM,cAAc,OAAO,KAAK;AAAA,IAChC,IAAI,SAAS,SAAS;AAAA,MACpB,KAAK,aAAa,uBAAuB;AAAA,MACzC,KAAK,WAAW,UAAU;AAAA,IAC5B;AAAA,IACA,MAAM,QAAQ,KAAK,cAAc,IAAI;AAAA,IACrC,IAAI,OAAO;AAAA,MACT,MAAM,QAAQ;AAAA,IAChB,EAAO;AAAA,MACL,KAAK,cAAc,KAAK,EAAE,MAAM,OAAO,YAAY,CAAC;AAAA;AAAA;AAAA,EAIjD,eAAe,CAAC,MAAoB;AAAA,IACzC,IAAI,SAAS,SAAS;AAAA,MACpB,KAAK,aAAa,uBAAuB;AAAA,IAC3C;AAAA,IACA,MAAM,QAAQ,KAAK,cAAc,UAAU,CAAC,UAAU,MAAM,SAAS,IAAI;AAAA,IACzE,IAAI,SAAS,GAAG;AAAA,MACd,KAAK,cAAc,OAAO,OAAO,CAAC;AAAA,IACpC;AAAA;AAAA,EAGK,YAAY,CAAC,MAAuB;AAAA,IACzC,OAAO,KAAK,cAAc,IAAI,MAAM;AAAA;AAAA,EAG/B,eAAe,CAAC,MAAc,OAA0B;AAAA,IAC7D,MAAM,YAAY,SAAS,CAAC,KAAK,aAAa,IAAI;AAAA,IAClD,IAAI,WAAW;AAAA,MACb,KAAK,aAAa,MAAM,EAAE;AAAA,IAC5B,EAAO;AAAA,MACL,KAAK,gBAAgB,IAAI;AAAA;AAAA,IAE3B,OAAO;AAAA;AAAA,EAGF,aAAa,GAAY;AAAA,IAC9B,OAAO,KAAK,cAAc,SAAS;AAAA;AAAA,MAG1B,SAAS,GAAW;AAAA,IAC7B,OAAO,kBAAkB,IAAI;AAAA;AAAA,MAGpB,SAAS,CAAC,OAAe;AAAA,IAClC,KAAK,gBAAgB,GAAG,kBAAkB,OAAO,KAAK,aAAa,CAAC;AAAA;AAAA,MAG3D,SAAS,GAAW;AAAA,IAC7B,OAAO,cAAc,IAAI;AAAA;AAAA,MAGhB,KAAK,GAAW;AAAA,IACzB,OAAO,KAAK,aAAa,OAAO,KAAK;AAAA;AAAA,MAG5B,KAAK,CAAC,OAAe;AAAA,IAC9B,KAAK,aAAa,SAAS,KAAK;AAAA;AAAA,EAG3B,aAAa,CAAC,UAAkC;AAAA,IACrD,OAAO,iBAAiB,MAAM,QAAQ,EAAE,KAAK,CAAC;AAAA;AAAA,EAGzC,gBAAgB,CAAC,UAAqC;AAAA,IAC3D,OAAO,iBAAiB,MAAM,QAAQ;AAAA;AAAA,EAGjC,oBAAoB,CAAC,SAAoC;AAAA,IAC9D,MAAM,UAAU,QAAQ,YAAY;AAAA,IACpC,MAAM,UAAqB,CAAC;AAAA,IAC5B,gBAAgB,MAAM,CAAC,YAAY;AAAA,MACjC,IAAI,QAAQ,cAAc,SAAS;AAAA,QACjC,QAAQ,KAAK,OAAO;AAAA,MACtB;AAAA,KACD;AAAA,IACD,OAAO,IAAI,SAAS,OAAO;AAAA;AAAA,EAGtB,OAAO,CAAC,UAA2B;AAAA,IACxC,OAAO,cAAc,MAAM,QAAQ;AAAA;AAAA,EAG9B,OAAO,CAAC,UAAkC;AAAA,IAC/C,IAAI,KAAK,QAAQ,QAAQ,GAAG;AAAA,MAC1B,OAAO;AAAA,IACT;AAAA,IACA,IAAI,SAAS,KAAK;AAAA,IAClB,OAAO,QAAQ;AAAA,MACb,IAAI,OAAO,QAAQ,QAAQ,GAAG;AAAA,QAC5B,OAAO;AAAA,MACT;AAAA,MACA,SAAS,OAAO;AAAA,IAClB;AAAA,IACA,OAAO;AAAA;AAAA,EAGF,qBAAqB,GAAY;AAAA,IACtC,MAAM,OAAO,KAAK,eAAe;AAAA,IAEjC,MAAM,QAAQ,MAAM,cAAc;AAAA,IAClC,MAAM,SAAS,MAAM,eAAe;AAAA,IACpC,MAAM,UAAU;AAAA,IAChB,MAAM,WACJ,YAAY,KAAK,eAAe,QAChC,YAAY,KAAK,eAAe;AAAA,IAClC,OAAO;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,KAAK;AAAA,MACL,MAAM;AAAA,MACN,OAAO,WAAW,QAAQ;AAAA,MAC1B,QAAQ,WAAW,SAAS;AAAA,MAC5B,OAAO,WAAW,QAAQ;AAAA,MAC1B,QAAQ,WAAW,SAAS;AAAA,MAC5B,MAAM,GAA2B;AAAA,QAC/B,OAAO;AAAA,UACL,GAAG;AAAA,UACH,GAAG;AAAA,UACH,KAAK;AAAA,UACL,MAAM;AAAA,UACN,OAAO,WAAW,QAAQ;AAAA,UAC1B,QAAQ,WAAW,SAAS;AAAA,UAC5B,OAAO,WAAW,QAAQ;AAAA,UAC1B,QAAQ,WAAW,SAAS;AAAA,QAC9B;AAAA;AAAA,IAEJ;AAAA;AAAA,EAGK,cAAc,GAAS;AAAA,EAEvB,KAAK,GAAS;AAAA,IACnB,KAAK,eAAe,iBAAiB,IAAI;AAAA;AAAA,EAGpC,IAAI,GAAS;AAAA,IAClB,IAAI,KAAK,eAAe,kBAAkB,MAAM;AAAA,MAC9C,KAAK,cAAc,iBAAiB,IAAI;AAAA,IAC1C;AAAA;AAAA,EAGK,KAAK,GAAS;AAAA,IAEnB,MAAM,YAAY;AAAA,IAClB,IAAI,UAAU,aAAa,MAAM;AAAA,MAC/B;AAAA,IACF;AAAA,IACA,KAAK,cACH,IAAI,WAAW,SAAS,EAAE,SAAS,MAAM,YAAY,KAAK,CAAC,CAC7D;AAAA,IAEA,IACE,KAAK,YAAY,YACjB,KAAK,aAAa,MAAM,MAAM,WAC9B,KAAK,aACL;AAAA,MACA,KAAK,QAAQ,MAAM,GAAG,cACpB,IAAI,MAAM,SAAS,EAAE,SAAS,MAAM,YAAY,KAAK,CAAC,CACxD;AAAA,IACF;AAAA;AAAA,EAGK,MAAM,IAAI,OAAgC;AAAA,IAC/C,WAAW,QAAQ,OAAO;AAAA,MACxB,IAAI,OAAO,SAAS,UAAU;AAAA,QAC5B,MAAM,WAAW,IAAI,KAAK,IAAI;AAAA,QAC9B,SAAS,gBAAgB,KAAK;AAAA,QAC9B,KAAK,YAAY,QAAQ;AAAA,MAC3B,EAAO;AAAA,QACL,KAAK,YAAY,IAAI;AAAA;AAAA,IAEzB;AAAA;AAAA,EAGK,OAAO,IAAI,OAAgC;AAAA,IAChD,MAAM,YAAY,KAAK;AAAA,IACvB,WAAW,QAAQ,OAAO;AAAA,MACxB,IAAI,OAAO,SAAS,UAAU;AAAA,QAC5B,MAAM,WAAW,IAAI,KAAK,IAAI;AAAA,QAC9B,SAAS,gBAAgB,KAAK;AAAA,QAC9B,KAAK,aAAa,UAAU,SAAS;AAAA,MACvC,EAAO;AAAA,QACL,KAAK,aAAa,MAAM,SAAS;AAAA;AAAA,IAErC;AAAA;AAAA,EAGK,MAAM,IAAI,OAAgC;AAAA,IAC/C,MAAM,SAAS,KAAK;AAAA,IACpB,IAAI,CAAC,QAAQ;AAAA,MACX;AAAA,IACF;AAAA,IACA,WAAW,QAAQ,OAAO;AAAA,MACxB,IAAI,OAAO,SAAS,UAAU;AAAA,QAC5B,MAAM,WAAW,IAAI,KAAK,IAAI;AAAA,QAC9B,SAAS,gBAAgB,KAAK;AAAA,QAC9B,OAAO,aAAa,UAAU,IAAI;AAAA,MACpC,EAAO;AAAA,QACL,OAAO,aAAa,MAAM,IAAI;AAAA;AAAA,IAElC;AAAA;AAAA,EAGK,KAAK,IAAI,OAAgC;AAAA,IAC9C,MAAM,SAAS,KAAK;AAAA,IACpB,IAAI,CAAC,QAAQ;AAAA,MACX;AAAA,IACF;AAAA,IACA,MAAM,YAAY,KAAK;AAAA,IACvB,WAAW,QAAQ,OAAO;AAAA,MACxB,IAAI,OAAO,SAAS,UAAU;AAAA,QAC5B,MAAM,WAAW,IAAI,KAAK,IAAI;AAAA,QAC9B,SAAS,gBAAgB,KAAK;AAAA,QAC9B,OAAO,aAAa,UAAU,SAAS;AAAA,MACzC,EAAO;AAAA,QACL,OAAO,aAAa,MAAM,SAAS;AAAA;AAAA,IAEvC;AAAA;AAAA,EAGK,WAAW,IAAI,OAAgC;AAAA,IACpD,MAAM,SAAS,KAAK;AAAA,IACpB,IAAI,CAAC,QAAQ;AAAA,MACX;AAAA,IACF;AAAA,IACA,MAAM,YAAY,KAAK;AAAA,IACvB,OAAO,YAAY,IAAI;AAAA,IACvB,WAAW,QAAQ,OAAO;AAAA,MACxB,IAAI,OAAO,SAAS,UAAU;AAAA,QAC5B,MAAM,WAAW,IAAI,KAAK,IAAI;AAAA,QAC9B,SAAS,gBAAgB,KAAK;AAAA,QAC9B,OAAO,aAAa,UAAU,SAAS;AAAA,MACzC,EAAO;AAAA,QACL,OAAO,aAAa,MAAM,SAAS;AAAA;AAAA,IAEvC;AAAA;AAAA,EAGK,cAAc,CACnB,YACA,MACA,OACM;AAAA,IACN,KAAK,aAAa,MAAM,KAAK;AAAA;AAAA,EAGxB,iBAAiB,CAAC,YAAoB,MAAoB;AAAA,IAC/D,KAAK,gBAAgB,IAAI;AAAA;AAAA,EAGpB,cAAc,CAAC,YAAoB,MAAuB;AAAA,IAC/D,OAAO,KAAK,aAAa,IAAI;AAAA;AAAA,EAGxB,cAAc,CAAC,YAAoB,MAA6B;AAAA,IACrE,OAAO,KAAK,aAAa,IAAI;AAAA;AAAA,EAIxB,aAAa,CAClB,MAC6C;AAAA,IAC7C,OAAO,KAAK,cAAc,KAAK,CAAC,UAAU,MAAM,SAAS,IAAI;AAAA;AAAA,EAIxD,gBAAgB,GAA2C;AAAA,IAChE,OAAO,CAAC,GAAG,KAAK,aAAa;AAAA;AAAA,EAIxB,eAAe,GAAW;AAAA,IAC/B,OAAO,KAAK,YAAY,WAAW;AAAA;AAAA,EAI3B,WAAW,GAAS;AAAA,IAC5B,MAAM,QAAQ,oBAAoB,KAAK,WAAW,KAAK,aAAa;AAAA,IACpE,WAAW,SAAS,KAAK,eAAe;AAAA,MACtC,MAAM,aAAa,MAAM,MAAM,MAAM,KAAK;AAAA,IAC5C;AAAA,IACA,OAAO;AAAA;AAEX;AAAA;AAEO,MAAM,oBAAoB,QAAQ;AAAA,EACvC,WAAW,CAAC,SAAiB;AAAA,IAC3B,MAAM,OAAO;AAAA;AAAA,MAIJ,IAAI,GAAW;AAAA,IACxB,OAAO,KAAK,aAAa,MAAM,KAAK;AAAA;AAAA,MAG3B,IAAI,CAAC,OAAe;AAAA,IAC7B,KAAK,aAAa,QAAQ,KAAK;AAAA;AAAA,MAItB,MAAM,GAAY;AAAA,IAC3B,OAAO,KAAK,aAAa,QAAQ;AAAA;AAAA,MAGxB,MAAM,CAAC,OAAgB;AAAA,IAChC,IAAI,OAAO;AAAA,MACT,KAAK,aAAa,UAAU,EAAE;AAAA,IAChC,EAAO;AAAA,MACL,KAAK,gBAAgB,QAAQ;AAAA;AAAA;AAAA,MAKtB,QAAQ,GAAW;AAAA,IAC5B,MAAM,MAAM,KAAK,aAAa,UAAU;AAAA,IACxC,OAAO,QAAQ,OAAO,IAAI,OAAO,GAAG;AAAA;AAAA,MAG3B,QAAQ,CAAC,OAAe;AAAA,IACjC,IAAI,UAAU,GAAG;AAAA,MACf,KAAK,gBAAgB,UAAU;AAAA,IACjC,EAAO;AAAA,MACL,KAAK,aAAa,YAAY,OAAO,KAAK,CAAC;AAAA;AAAA;AAAA,MAKpC,WAAW,GAAW;AAAA,IAC/B,OAAO;AAAA;AAAA,MAGE,YAAY,GAAW;AAAA,IAChC,OAAO;AAAA;AAAA,MAGE,UAAU,GAAW;AAAA,IAC9B,OAAO;AAAA;AAAA,MAGE,SAAS,GAAW;AAAA,IAC7B,OAAO;AAAA;AAEX;AAAA;AAEO,MAAM,aAAkE;AAAA,EAC5D;AAAA,EAEjB,WAAW,CAAC,SAAkB;AAAA,IAC5B,KAAK,UAAU;AAAA,IACf,SAAS,QAAQ,EAAG,QAAQ,QAAQ,iBAAiB,EAAE,QAAQ,SAAS,GAAG;AAAA,MACzE,OAAO,eAAe,MAAM,OAAO,KAAK,GAAG;AAAA,QACzC,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,KAAK,MAAM,KAAK,QAAQ,iBAAiB,EAAE,UAAU;AAAA,MACvD,CAAC;AAAA,IACH;AAAA;AAAA,MAGS,MAAM,GAAW;AAAA,IAC1B,OAAO,KAAK,QAAQ,iBAAiB,EAAE;AAAA;AAAA,EAGlC,IAAI,CAAC,OAAuD;AAAA,IACjE,OAAO,KAAK,QAAQ,iBAAiB,EAAE,UAAU;AAAA;AAAA,EAG5C,YAAY,CAAC,MAAsD;AAAA,IACxE,OAAO,KAAK,QAAQ,cAAc,IAAI,KAAK;AAAA;AAAA,EAGtC,YAAY,CAAC,MAA6C;AAAA,IAC/D,KAAK,QAAQ,aAAa,KAAK,MAAM,KAAK,KAAK;AAAA;AAAA,EAG1C,eAAe,CAAC,MAAoB;AAAA,IACzC,KAAK,QAAQ,gBAAgB,IAAI;AAAA;AAAA,GAG3B,OAAO,SAAS,GAA8C;AAAA,IACpE,OAAO,KAAK,QAAQ,iBAAiB,EAAE,OAAO,UAAU;AAAA;AAE5D;AAAA;AAEO,MAAM,0BAA0B,YAAY;AAAA,EAEzC;AAAA,EAER,WAAW,CAAC,UAAU,UAAU;AAAA,IAC9B,MAAM,OAAO;AAAA;AAAA,MAGJ,KAAK,GAAW;AAAA,IACzB,OAAO,KAAK,aAAa,OAAO,KAAK,KAAK;AAAA;AAAA,MAGjC,KAAK,CAAC,OAAe;AAAA,IAC9B,KAAK,aAAa,SAAS,KAAK;AAAA;AAAA,MAGvB,IAAI,GAAW;AAAA,IACxB,OAAO,KAAK;AAAA;AAAA,MAGH,KAAK,GAAW;AAAA,IACzB,OAAO,KAAK,aAAa,OAAO,KAAK,KAAK;AAAA;AAAA,MAGjC,QAAQ,GAAY;AAAA,IAC7B,OAAO,KAAK,iBAAiB;AAAA;AAAA,MAGpB,QAAQ,CAAC,OAAgB;AAAA,IAClC,KAAK,eAAe,KAAK;AAAA,IACzB,IAAI,OAAO;AAAA,MACT,MAAM,SAAS,KAAK;AAAA,MACpB,IAAI,kBAAkB,qBAAqB,CAAC,OAAO,UAAU;AAAA,QAC3D,WAAW,UAAU,OAAO,QAAQ,QAAQ,GAAG;AAAA,UAC7C,IAAI,WAAW,MAAM;AAAA,YACnB,OAAO,eAAe,KAAK;AAAA,UAC7B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA,EAIK,cAAc,CAAC,OAAsB;AAAA,IAC1C,KAAK,gBAAgB;AAAA,IACrB,IAAI,OAAO;AAAA,MACT,KAAK,aAAa,YAAY,EAAE;AAAA,IAClC,EAAO;AAAA,MACL,KAAK,gBAAgB,UAAU;AAAA;AAAA;AAAA,EAK5B,gBAAgB,GAAY;AAAA,IACjC,IAAI,KAAK,kBAAkB,WAAW;AAAA,MACpC,OAAO,KAAK;AAAA,IACd;AAAA,IACA,OAAO,KAAK,aAAa,UAAU;AAAA;AAEvC;AAAA;AAEO,MAAM,0BAA0B,YAAY;AAAA,EACjD,WAAW,CAAC,UAAU,UAAU;AAAA,IAC9B,MAAM,OAAO;AAAA;AAAA,MAGJ,QAAQ,GAAY;AAAA,IAC7B,OAAO,KAAK,aAAa,UAAU;AAAA;AAAA,MAG1B,QAAQ,CAAC,OAAgB;AAAA,IAClC,IAAI,OAAO;AAAA,MACT,KAAK,aAAa,YAAY,EAAE;AAAA,IAClC,EAAO;AAAA,MACL,KAAK,gBAAgB,UAAU;AAAA;AAAA;AAAA,MAIxB,QAAQ,GAAY;AAAA,IAC7B,OAAO,KAAK,aAAa,UAAU;AAAA;AAAA,MAG1B,QAAQ,CAAC,OAAgB;AAAA,IAClC,IAAI,OAAO;AAAA,MACT,KAAK,aAAa,YAAY,EAAE;AAAA,IAClC,EAAO;AAAA,MACL,KAAK,gBAAgB,UAAU;AAAA;AAAA;AAAA,MAIxB,OAAO,GAA0B;AAAA,IAC1C,MAAM,UAA+B,CAAC;AAAA,IACtC,gBAAgB,MAAM,CAAC,YAAY;AAAA,MACjC,IAAI,mBAAmB,mBAAmB;AAAA,QACxC,QAAQ,KAAK,OAAO;AAAA,MACtB;AAAA,KACD;AAAA,IACD,OAAO,IAAI,sBAAsB,OAAO;AAAA;AAAA,MAG/B,eAAe,GAAgC;AAAA,IACxD,OAAO,IAAI,SACT,KAAK,QAAQ,QAAQ,EAAE,OAAO,CAAC,WAAW,OAAO,iBAAiB,CAAC,CACrE;AAAA;AAAA,MAGS,aAAa,GAAW;AAAA,IACjC,OAAO,KAAK,QACT,QAAQ,EACR,UAAU,CAAC,WAAW,OAAO,iBAAiB,CAAC;AAAA;AAAA,MAGzC,aAAa,CAAC,OAAe;AAAA,IACtC,MAAM,UAAU,KAAK,QAAQ,QAAQ;AAAA,IACrC,QAAQ,QAAQ,CAAC,QAAQ,gBACvB,OAAO,eAAe,gBAAgB,KAAK,CAC7C;AAAA;AAAA,MAGS,KAAK,GAAW;AAAA,IACzB,MAAM,UAAU,KAAK,QAAQ,QAAQ;AAAA,IACrC,MAAM,WAAW,QAAQ,KAAK,CAAC,WAAW,OAAO,iBAAiB,CAAC;AAAA,IACnE,IAAI,UAAU;AAAA,MACZ,OAAO,SAAS;AAAA,IAClB;AAAA,IACA,IAAI,CAAC,KAAK,YAAY,QAAQ,SAAS,GAAG;AAAA,MACxC,OAAO,QAAQ,GAAG;AAAA,IACpB;AAAA,IACA,OAAO;AAAA;AAAA,MAGE,KAAK,CAAC,OAAe;AAAA,IAC9B,MAAM,UAAU,KAAK,QAAQ,QAAQ;AAAA,IACrC,WAAW,UAAU,SAAS;AAAA,MAC5B,MAAM,eAAe,OAAO,UAAU;AAAA,MACtC,IAAI,cAAc;AAAA,QAChB,IAAI,KAAK,UAAU;AAAA,UACjB,OAAO,eAAe,IAAI;AAAA,QAC5B,EAAO;AAAA,UACL,WAAW,SAAS,SAAS;AAAA,YAC3B,MAAM,eAAe,UAAU,MAAM;AAAA,UACvC;AAAA,UACA;AAAA;AAAA,MAEJ;AAAA,IACF;AAAA;AAAA,EAGK,GAAG,CAAC,QAAiC;AAAA,IAC1C,KAAK,YAAY,MAAM;AAAA;AAAA,EAGlB,YAAY,CAAC,OAAqB;AAAA,IACvC,MAAM,UAAU,KAAK,QAAQ,QAAQ;AAAA,IACrC,MAAM,SAAS,QAAQ;AAAA,IACvB,IAAI,QAAQ;AAAA,MACV,OAAO,OAAO;AAAA,IAChB;AAAA;AAEJ;AAAA;AAEO,MAAM,sBAA6D;AAAA,EACvD;AAAA,EAEjB,WAAW,CAAC,OAA4B;AAAA,IACtC,KAAK,QAAQ;AAAA,IACb,SAAS,QAAQ,EAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;AAAA,MACpD,OAAO,eAAe,MAAM,OAAO,KAAK,GAAG;AAAA,QACzC,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,KAAK,MAAM,KAAK,MAAM;AAAA,MACxB,CAAC;AAAA,IACH;AAAA;AAAA,MAGS,MAAM,GAAW;AAAA,IAC1B,OAAO,KAAK,MAAM;AAAA;AAAA,EAGb,IAAI,CAAC,OAAyC;AAAA,IACnD,OAAO,KAAK,MAAM,UAAU;AAAA;AAAA,MAGnB,KAAK,GAAW;AAAA,IACzB,OAAO,KAAK,MAAM,KAAK,CAAC,WAAW,OAAO,iBAAiB,CAAC,GAAG,SAAS;AAAA;AAAA,MAG/D,aAAa,GAAW;AAAA,IACjC,OAAO,KAAK,MAAM,UAAU,CAAC,WAAW,OAAO,iBAAiB,CAAC;AAAA;AAAA,EAG5D,OAAO,GAAwB;AAAA,IACpC,OAAO,CAAC,GAAG,KAAK,KAAK;AAAA;AAAA,GAGf,OAAO,SAAS,GAAgC;AAAA,IACtD,OAAO,KAAK,MAAM,OAAO,UAAU;AAAA;AAEvC;AAAA;AAEO,MAAM,yBAAyB,YAAY;AAAA,EAExC;AAAA,EAEA;AAAA,EAER,WAAW,CAAC,UAAU,SAAS;AAAA,IAC7B,MAAM,OAAO;AAAA;AAAA,MAGJ,IAAI,GAAW;AAAA,IACxB,OAAO,KAAK,aAAa,MAAM,KAAK;AAAA;AAAA,MAG3B,IAAI,CAAC,OAAe;AAAA,IAC7B,KAAK,aAAa,QAAQ,KAAK;AAAA;AAAA,MAGtB,IAAI,GAAW;AAAA,IACxB,OAAO,KAAK,aAAa,MAAM,KAAK;AAAA;AAAA,MAG3B,IAAI,CAAC,OAAe;AAAA,IAC7B,KAAK,aAAa,QAAQ,KAAK;AAAA;AAAA,MAGtB,KAAK,GAAW;AAAA,IACzB,OAAO,KAAK,cAAc,KAAK,aAAa,OAAO,KAAK;AAAA;AAAA,MAG/C,KAAK,CAAC,OAAe;AAAA,IAC9B,KAAK,aAAa;AAAA;AAAA,MAGT,YAAY,GAAW;AAAA,IAChC,OAAO,KAAK,aAAa,OAAO,KAAK;AAAA;AAAA,MAG5B,OAAO,GAAY;AAAA,IAC5B,OAAO,KAAK,gBAAgB,KAAK,aAAa,SAAS;AAAA;AAAA,MAG9C,OAAO,CAAC,OAAgB;AAAA,IACjC,KAAK,eAAe;AAAA;AAAA,MAGX,QAAQ,GAAY;AAAA,IAC7B,OAAO,KAAK,aAAa,UAAU;AAAA;AAAA,MAG1B,QAAQ,CAAC,OAAgB;AAAA,IAClC,IAAI,OAAO;AAAA,MACT,KAAK,aAAa,YAAY,EAAE;AAAA,IAClC,EAAO;AAAA,MACL,KAAK,gBAAgB,UAAU;AAAA;AAAA;AAAA,MAIxB,WAAW,GAAW;AAAA,IAC/B,OAAO,KAAK,aAAa,aAAa,KAAK;AAAA;AAAA,MAGlC,WAAW,CAAC,OAAe;AAAA,IACpC,KAAK,aAAa,eAAe,KAAK;AAAA;AAAA,MAG7B,MAAM,GAAW;AAAA,IAC1B,OAAO,KAAK,aAAa,QAAQ,KAAK;AAAA;AAAA,MAG7B,QAAQ,GAAY;AAAA,IAC7B,OAAO,KAAK,aAAa,UAAU;AAAA;AAAA,MAG1B,QAAQ,CAAC,OAAgB;AAAA,IAClC,IAAI,OAAO;AAAA,MACT,KAAK,aAAa,YAAY,EAAE;AAAA,IAClC,EAAO;AAAA,MACL,KAAK,gBAAgB,UAAU;AAAA;AAAA;AAAA,MAIxB,MAAM,CAAC,OAAe;AAAA,IAC/B,KAAK,aAAa,UAAU,KAAK;AAAA;AAAA,MAGxB,GAAG,GAAW;AAAA,IACvB,OAAO,KAAK,aAAa,KAAK,KAAK;AAAA;AAAA,MAG1B,GAAG,CAAC,OAAe;AAAA,IAC5B,KAAK,aAAa,OAAO,KAAK;AAAA;AAAA,MAGrB,GAAG,GAAW;AAAA,IACvB,OAAO,KAAK,aAAa,KAAK,KAAK;AAAA;AAAA,MAG1B,GAAG,CAAC,OAAe;AAAA,IAC5B,KAAK,aAAa,OAAO,KAAK;AAAA;AAAA,MAGrB,IAAI,GAAW;AAAA,IACxB,OAAO,KAAK,aAAa,MAAM,KAAK;AAAA;AAAA,MAG3B,IAAI,CAAC,OAAe;AAAA,IAC7B,KAAK,aAAa,QAAQ,KAAK;AAAA;AAAA,EAIvB,WAAW,GAAS;AAAA,IAC5B,MAAM,QAAQ,MAAM,YAAY;AAAA,IAChC,MAAM,aAAa,KAAK;AAAA,IACxB,MAAM,eAAe,KAAK;AAAA,IAC1B,OAAO;AAAA;AAEX;AAAA;AAEO,MAAM,4BAA4B,YAAY;AAAA,EAE3C;AAAA,EAER,WAAW,CAAC,UAAU,YAAY;AAAA,IAChC,MAAM,OAAO;AAAA;AAAA,MAGJ,KAAK,GAAW;AAAA,IACzB,OAAO,KAAK,iBAAiB,KAAK;AAAA;AAAA,MAGzB,KAAK,CAAC,OAAe;AAAA,IAC9B,KAAK,gBAAgB;AAAA;AAAA,MAGZ,IAAI,GAAW;AAAA,IACxB,OAAO,KAAK,aAAa,MAAM,KAAK;AAAA;AAAA,MAG3B,IAAI,CAAC,OAAe;AAAA,IAC7B,KAAK,aAAa,QAAQ,KAAK;AAAA;AAAA,MAGtB,QAAQ,GAAY;AAAA,IAC7B,OAAO,KAAK,aAAa,UAAU;AAAA;AAAA,MAG1B,QAAQ,CAAC,OAAgB;AAAA,IAClC,IAAI,OAAO;AAAA,MACT,KAAK,aAAa,YAAY,EAAE;AAAA,IAClC,EAAO;AAAA,MACL,KAAK,gBAAgB,UAAU;AAAA;AAAA;AAAA,MAIxB,WAAW,GAAW;AAAA,IAC/B,OAAO,KAAK,aAAa,aAAa,KAAK;AAAA;AAAA,MAGlC,WAAW,CAAC,OAAe;AAAA,IACpC,KAAK,aAAa,eAAe,KAAK;AAAA;AAE1C;AAAA;AAEO,MAAM,0BAA0B,YAAY;AAAA,EACjD,WAAW,CAAC,UAAU,UAAU;AAAA,IAC9B,MAAM,OAAO;AAAA;AAAA,MAGJ,QAAQ,GAAY;AAAA,IAC7B,OAAO,KAAK,aAAa,UAAU;AAAA;AAAA,MAG1B,QAAQ,CAAC,OAAgB;AAAA,IAClC,IAAI,OAAO;AAAA,MACT,KAAK,aAAa,YAAY,EAAE;AAAA,IAClC,EAAO;AAAA,MACL,KAAK,gBAAgB,UAAU;AAAA;AAAA;AAAA,MAIxB,IAAI,GAAW;AAAA,IACxB,OAAO,KAAK,aAAa,MAAM,KAAK;AAAA;AAExC;AAAA;AAEO,MAAM,6BAA6B,YAAY;AAAA,EACpD,WAAW,CAAC,UAAU,MAAM;AAAA,IAC1B,MAAM,OAAO;AAAA;AAAA,MAGJ,OAAO,GAAW;AAAA,IAC3B,MAAM,MAAM,KAAK,aAAa,SAAS;AAAA,IACvC,OAAO,QAAQ,OAAO,IAAI,OAAO,GAAG;AAAA;AAAA,MAG3B,OAAO,CAAC,OAAe;AAAA,IAChC,KAAK,aAAa,WAAW,OAAO,KAAK,CAAC;AAAA;AAE9C;AAAA;AAEO,MAAM,yBAAyB,YAAY;AAAA,EAChD,WAAW,CAAC,UAAU,SAAS;AAAA,IAC7B,MAAM,OAAO;AAAA;AAAA,MAGJ,OAAO,GAAW;AAAA,IAC3B,OAAO,KAAK,aAAa,KAAK,KAAK;AAAA;AAAA,MAG1B,OAAO,CAAC,OAAe;AAAA,IAChC,KAAK,aAAa,OAAO,KAAK;AAAA;AAElC;AAAA;AAEO,MAAM,yBAAyB,YAAY;AAAA,EAChD,WAAW,CAAC,UAAU,OAAO;AAAA,IAC3B,MAAM,OAAO;AAAA;AAAA,MAGJ,GAAG,GAAW;AAAA,IACvB,OAAO,KAAK,aAAa,KAAK,KAAK;AAAA;AAAA,MAG1B,GAAG,CAAC,OAAe;AAAA,IAC5B,KAAK,aAAa,OAAO,KAAK;AAAA;AAAA,MAGrB,GAAG,GAAW;AAAA,IACvB,OAAO,KAAK,aAAa,KAAK,KAAK;AAAA;AAAA,MAG1B,GAAG,CAAC,OAAe;AAAA,IAC5B,KAAK,aAAa,OAAO,KAAK;AAAA;AAElC;AAAA;AAEO,MAAM,yBAAyB,YAAY;AAAA,EAChD,WAAW,CAAC,UAAU,SAAS;AAAA,IAC7B,MAAM,OAAO;AAAA;AAEjB;AAAA;AAEO,MAAM,0BAA0B,YAAY;AAAA,EACjD,WAAW,CAAC,UAAU,KAAK;AAAA,IACzB,MAAM,OAAO;AAAA;AAAA,MAGJ,IAAI,GAAW;AAAA,IACxB,OAAO,KAAK,aAAa,MAAM,KAAK;AAAA;AAAA,MAG3B,IAAI,CAAC,OAAe;AAAA,IAC7B,KAAK,aAAa,QAAQ,KAAK;AAAA;AAEnC;AAAA;AAEO,MAAM,aAAa,KAAK;AAAA,EACtB;AAAA,EAEP,WAAW,CAAC,OAAO,IAAI;AAAA,IACrB,MAAM,mBAAuB,OAAO;AAAA,IACpC,KAAK,OAAO;AAAA;AAAA,MAGH,SAAS,GAAW;AAAA,IAC7B,OAAO,KAAK;AAAA;AAAA,MAGH,SAAS,CAAC,OAAe;AAAA,IAClC,KAAK,OAAO;AAAA;AAAA,MAGH,WAAW,GAAW;AAAA,IAC/B,OAAO,KAAK;AAAA;AAAA,MAGH,WAAW,CAAC,OAAe;AAAA,IACpC,KAAK,OAAO;AAAA;AAAA,MAGH,SAAS,GAAW;AAAA,IAC7B,OAAO,KAAK;AAAA;AAAA,EAIJ,WAAW,GAAS;AAAA,IAC5B,MAAM,QAAQ,IAAI,KAAK,KAAK,IAAI;AAAA,IAChC,MAAM,gBAAgB,KAAK;AAAA,IAC3B,OAAO;AAAA;AAEX;AAAA;AAEO,MAAM,gBAAgB,KAAK;AAAA,EACzB;AAAA,EAEP,WAAW,CAAC,OAAO,IAAI;AAAA,IACrB,MAAM,sBAA0B,UAAU;AAAA,IAC1C,KAAK,OAAO;AAAA;AAAA,MAGH,SAAS,GAAW;AAAA,IAC7B,OAAO,KAAK;AAAA;AAAA,MAGH,SAAS,CAAC,OAAe;AAAA,IAClC,KAAK,OAAO;AAAA;AAAA,EAIJ,WAAW,GAAS;AAAA,IAC5B,MAAM,QAAQ,IAAI,QAAQ,KAAK,IAAI;AAAA,IACnC,MAAM,gBAAgB,KAAK;AAAA,IAC3B,OAAO;AAAA;AAEX;AAAA;AAEO,MAAM,yBAAyB,KAAK;AAAA,EACzC,WAAW,GAAG;AAAA,IACZ,MAAM,iCAAoC,oBAAoB;AAAA;AAElE;AAAA;AASO,MAAM,qBAA0D;AAAA,EAC9D,cAAc,GAAa;AAAA,IAChC,OAAO,IAAI;AAAA;AAAA,EAGN,kBAAkB,GAAU;AAAA,IACjC,MAAM,IAAI,MAAM,kDAAkD;AAAA;AAAA,EAG7D,UAAU,GAAY;AAAA,IAC3B,OAAO;AAAA;AAAA,EAGF,kBAAkB,CAAC,OAA0B;AAAA,IAClD,MAAM,WAAW,IAAI;AAAA,IACrB,MAAM,OAAO,SAAS,cAAc,MAAM;AAAA,IAC1C,MAAM,OAAO,SAAS,cAAc,MAAM;AAAA,IAC1C,MAAM,OAAO,SAAS,cAAc,MAAM;AAAA,IAC1C,IAAI,OAAO;AAAA,MACT,MAAM,eAAe,SAAS,cAAc,OAAO;AAAA,MACnD,aAAa,cAAc;AAAA,MAC3B,KAAK,YAAY,YAAY;AAAA,IAC/B;AAAA,IACA,KAAK,YAAY,IAAI;AAAA,IACrB,KAAK,YAAY,IAAI;AAAA,IACrB,SAAS,YAAY,IAAI;AAAA,IACzB,OAAO;AAAA;AAEX;AAAA;AAEO,MAAM,iBAAiB,KAAK;AAAA,EACjB,cAAgC;AAAA,EAEhC;AAAA,EAER,mBAAmC;AAAA,EAE3C,WAAW,GAAG;AAAA,IACZ,MAAM,uBAA2B,WAAW;AAAA,IAC5C,KAAK,iBAAiB,IAAI;AAAA;AAAA,MAGjB,aAAa,GAAmB;AAAA,IACzC,OAAO,KAAK;AAAA;AAAA,EAIP,gBAAgB,CAAC,SAA+B;AAAA,IACrD,KAAK,mBAAmB;AAAA;AAAA,EAGnB,aAAa,CAAC,SAA8B;AAAA,IACjD,OAAO,oBAAoB,SAAS,IAAI;AAAA;AAAA,EAGnC,eAAe,CAAC,cAAsB,SAA8B;AAAA,IACzE,MAAM,UAAU,oBAAoB,SAAS,IAAI;AAAA,IAChD,QAA4C,eAAe;AAAA,IAC5D,OAAO;AAAA;AAAA,EAGF,cAAc,CAAC,MAAoB;AAAA,IACxC,MAAM,OAAO,IAAI,KAAK,IAAI;AAAA,IAC1B,KAAK,gBAAgB;AAAA,IACrB,OAAO;AAAA;AAAA,EAGF,aAAa,CAAC,MAAuB;AAAA,IAC1C,MAAM,UAAU,IAAI,QAAQ,IAAI;AAAA,IAChC,QAAQ,gBAAgB;AAAA,IACxB,OAAO;AAAA;AAAA,EAGF,sBAAsB,GAAqB;AAAA,IAChD,MAAM,WAAW,IAAI;AAAA,IACrB,SAAS,gBAAgB;AAAA,IACzB,OAAO;AAAA;AAAA,EAGF,WAAW,CAAC,MAAqB;AAAA,IACtC,IAAI,SAAS,gBAAgB,SAAS,cAAc;AAAA,MAClD,OAAO,IAAI,WAAW,EAAE;AAAA,IAC1B;AAAA,IACA,IAAI,SAAS,mBAAmB,SAAS,iBAAiB;AAAA,MACxD,OAAO,IAAI,cAAc,EAAE;AAAA,IAC7B;AAAA,IACA,IAAI,SAAS,iBAAiB,SAAS,eAAe;AAAA,MACpD,OAAO,IAAI,YAAY,EAAE;AAAA,IAC3B;AAAA,IACA,OAAO,IAAI,MAAM,EAAE;AAAA;AAAA,MAGV,eAAe,GAAgB;AAAA,IACxC,MAAM,OAAO,KAAK,UAAU,KAC1B,CAAC,UAAU,MAAM,aAAa,oBAChC;AAAA,IACA,IAAI,MAAM;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA,MAAM,UAAU,oBAAoB,QAAQ,IAAI;AAAA,IAChD,KAAK,YAAY,OAAO;AAAA,IACxB,OAAO;AAAA;AAAA,MAGE,IAAI,GAAgB;AAAA,IAC7B,OAAO,KAAK,oBAAoB,MAAM;AAAA;AAAA,MAG7B,IAAI,GAAgB;AAAA,IAC7B,OAAO,KAAK,oBAAoB,MAAM;AAAA;AAAA,MAG7B,KAAK,GAAW;AAAA,IACzB,MAAM,eAAe,KAAK,cAAc,OAAO;AAAA,IAC/C,OAAO,cAAc,eAAe;AAAA;AAAA,MAG3B,KAAK,CAAC,OAAe;AAAA,IAC9B,IAAI,eAAe,KAAK,cAAc,OAAO;AAAA,IAC7C,IAAI,CAAC,cAAc;AAAA,MACjB,eAAe,oBAAoB,SAAS,IAAI;AAAA,MAChD,KAAK,KAAK,YAAY,YAAY;AAAA,IACpC;AAAA,IACA,aAAa,cAAc;AAAA;AAAA,EAGtB,aAAa,CAAC,UAAkC;AAAA,IACrD,OAAO,iBAAiB,MAAM,QAAQ,EAAE,KAAK,CAAC;AAAA;AAAA,EAGzC,gBAAgB,CAAC,UAAqC;AAAA,IAC3D,OAAO,iBAAiB,MAAM,QAAQ;AAAA;AAAA,EAGjC,cAAc,CAAC,IAA4B;AAAA,IAChD,IAAI,SAAyB;AAAA,IAC7B,gBAAgB,MAAM,CAAC,YAAY;AAAA,MACjC,IAAI,CAAC,UAAU,QAAQ,OAAO,IAAI;AAAA,QAChC,SAAS;AAAA,MACX;AAAA,KACD;AAAA,IACD,OAAO;AAAA;AAAA,EAGF,oBAAoB,CAAC,SAAoC;AAAA,IAC9D,OAAO,KAAK,gBAAgB,qBAAqB,OAAO;AAAA;AAAA,EAIhD,WAAW,GAAS;AAAA,IAC5B,OAAO,IAAI;AAAA;AAAA,EAGL,mBAAmB,CAAC,SAAuC;AAAA,IACjE,MAAM,kBAAkB,KAAK;AAAA,IAC7B,IAAI,QAAQ,gBAAgB,UAAU,KACpC,CAAC,SACC,KAAK,aAAa,wBACjB,KAAiB,cAAc,OACpC;AAAA,IACA,IAAI,CAAC,OAAO;AAAA,MACV,QAAQ,oBAAoB,SAAS,IAAI;AAAA,MACzC,gBAAgB,YAAY,KAAK;AAAA,IACnC;AAAA,IACA,OAAO;AAAA;AAEX;AAAA;AAKO,MAAM,SAAS;AAAA,EAEZ;AAAA,EAER,WAAW,CAAC,KAAa;AAAA,IACvB,KAAK,MAAM,IAAI,IAAI,GAAG;AAAA;AAAA,MAGb,IAAI,GAAW;AAAA,IACxB,OAAO,KAAK,IAAI;AAAA;AAAA,MAGP,IAAI,CAAC,OAAe;AAAA,IAC7B,KAAK,MAAM,IAAI,IAAI,OAAO,KAAK,IAAI,IAAI;AAAA;AAAA,MAG9B,MAAM,GAAW;AAAA,IAC1B,OAAO,KAAK,IAAI;AAAA;AAAA,MAGP,QAAQ,GAAW;AAAA,IAC5B,OAAO,KAAK,IAAI;AAAA;AAAA,MAGP,IAAI,GAAW;AAAA,IACxB,OAAO,KAAK,IAAI;AAAA;AAAA,MAGP,QAAQ,GAAW;AAAA,IAC5B,OAAO,KAAK,IAAI;AAAA;AAAA,MAGP,IAAI,GAAW;AAAA,IACxB,OAAO,KAAK,IAAI;AAAA;AAAA,MAGP,QAAQ,GAAW;AAAA,IAC5B,OAAO,KAAK,IAAI;AAAA;AAAA,MAGP,QAAQ,CAAC,OAAe;AAAA,IACjC,MAAM,MAAM,KAAK;AAAA,IACjB,MAAM,OAAO,IAAI,IAAI,OAAO,IAAI,IAAI;AAAA,IACpC,IAAI,WAAW,KAAK;AAAA;AAAA,MAGX,MAAM,GAAW;AAAA,IAC1B,OAAO,KAAK,IAAI;AAAA;AAAA,MAGP,MAAM,CAAC,OAAe;AAAA,IAC/B,KAAK,IAAI,SAAS,MAAM,WAAW,GAAG,IAAI,QAAQ,IAAI;AAAA;AAAA,MAG7C,IAAI,GAAW;AAAA,IACxB,OAAO,KAAK,IAAI;AAAA;AAAA,MAGP,IAAI,CAAC,OAAe;AAAA,IAC7B,MAAM,WAAW,MAAM,WAAW,GAAG,IAAI,QAAQ,IAAI;AAAA,IACrD,KAAK,IAAI,OAAO;AAAA;AAAA,MAGP,QAAQ,GAAW;AAAA,IAC5B,OAAO,KAAK,IAAI;AAAA;AAAA,MAGP,QAAQ,GAAW;AAAA,IAC5B,OAAO,KAAK,IAAI;AAAA;AAAA,EAGX,MAAM,CAAC,OAAqB;AAAA,IACjC,KAAK,MAAM,IAAI,IAAI,OAAO,KAAK,IAAI,IAAI;AAAA;AAAA,EAGlC,OAAO,CAAC,OAAqB;AAAA,IAClC,KAAK,MAAM,IAAI,IAAI,OAAO,KAAK,IAAI,IAAI;AAAA;AAAA,EAGlC,MAAM,GAAS;AAAA,EAEf,QAAQ,GAAW;AAAA,IACxB,OAAO,KAAK,IAAI;AAAA;AAAA,EAIX,WAAW,GAAW;AAAA,IAC3B,OAAO,KAAK,IAAI,KAAK,MAAM,CAAC;AAAA;AAAA,EAIvB,kBAAkB,GAAW;AAAA,IAClC,MAAM,MAAM,KAAK;AAAA,IACjB,OAAO,GAAG,IAAI,SAAS,IAAI,WAAW,IAAI;AAAA;AAE9C;AAAA;AAOO,MAAM,QAAQ;AAAA,EAEF;AAAA,EAET,UAA0B,CAAC;AAAA,EAE3B,QAAQ;AAAA,EAET,oBAAuC;AAAA,EAE9C,WAAW,CAAC,WAAsB;AAAA,IAChC,KAAK,YAAY;AAAA,IACjB,KAAK,UAAU,CAAC,EAAE,OAAO,MAAM,KAAK,UAAU,SAAS,KAAK,CAAC;AAAA;AAAA,MAGpD,MAAM,GAAW;AAAA,IAC1B,OAAO,KAAK,QAAQ;AAAA;AAAA,MAGX,KAAK,GAAY;AAAA,IAC1B,OAAO,KAAK,QAAQ,KAAK,QAAQ,SAAS;AAAA;AAAA,EAGrC,SAAS,CAAC,OAAgB,cAAsB,KAAoB;AAAA,IACzE,MAAM,UAAU,MACZ,IAAI,IAAI,KAAK,KAAK,UAAU,SAAS,IAAI,EAAE,OAC3C,KAAK,UAAU,SAAS;AAAA,IAC5B,KAAK,UAAU,KAAK,QAAQ,MAAM,GAAG,KAAK,QAAQ,CAAC;AAAA,IACnD,KAAK,QAAQ,KAAK,EAAE,OAAO,KAAK,QAAQ,CAAC;AAAA,IACzC,KAAK,QAAQ,KAAK,QAAQ,SAAS;AAAA,IACnC,KAAK,UAAU,eAAe,OAAO;AAAA;AAAA,EAGhC,YAAY,CACjB,OACA,cACA,KACM;AAAA,IACN,MAAM,UAAU,MACZ,IAAI,IAAI,KAAK,KAAK,UAAU,SAAS,IAAI,EAAE,OAC3C,KAAK,UAAU,SAAS;AAAA,IAC5B,KAAK,QAAQ,KAAK,SAAS,EAAE,OAAO,KAAK,QAAQ;AAAA,IACjD,KAAK,UAAU,eAAe,OAAO;AAAA;AAAA,EAGhC,IAAI,GAAS;AAAA,IAClB,KAAK,GAAG,EAAE;AAAA;AAAA,EAGL,OAAO,GAAS;AAAA,IACrB,KAAK,GAAG,CAAC;AAAA;AAAA,EAGJ,EAAE,CAAC,QAAQ,GAAS;AAAA,IACzB,MAAM,YAAY,KAAK,QAAQ;AAAA,IAC/B,IAAI,YAAY,KAAK,aAAa,KAAK,QAAQ,QAAQ;AAAA,MACrD;AAAA,IACF;AAAA,IACA,KAAK,QAAQ;AAAA,IACb,KAAK,UAAU,eAAe,KAAK,QAAQ,WAAW,GAAG;AAAA,IACzD,KAAK,UAAU,cACb,IAAI,MAAM,YAAY,EAAE,SAAS,OAAO,YAAY,MAAM,CAAC,CAC7D;AAAA;AAEJ;AAAA;AAEO,MAAM,QAAQ;AAAA,EACF,QAAQ,IAAI;AAAA,MAElB,MAAM,GAAW;AAAA,IAC1B,OAAO,KAAK,MAAM;AAAA;AAAA,EAGb,GAAG,CAAC,OAA8B;AAAA,IACvC,OAAO,CAAC,GAAG,KAAK,MAAM,KAAK,CAAC,EAAE,UAAU;AAAA;AAAA,EAGnC,OAAO,CAAC,KAA4B;AAAA,IACzC,OAAO,KAAK,MAAM,IAAI,GAAG,IAAK,KAAK,MAAM,IAAI,GAAG,IAAe;AAAA;AAAA,EAG1D,OAAO,CAAC,KAAa,OAAqB;AAAA,IAC/C,KAAK,MAAM,IAAI,KAAK,OAAO,KAAK,CAAC;AAAA;AAAA,EAG5B,UAAU,CAAC,KAAmB;AAAA,IACnC,KAAK,MAAM,OAAO,GAAG;AAAA;AAAA,EAGhB,KAAK,GAAS;AAAA,IACnB,KAAK,MAAM,MAAM;AAAA;AAErB;AAAA;AAEO,MAAM,UAAU;AAAA,EACL,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY,CAAC,OAAO;AAAA,EACpB,SAAS;AAAA,EACT,iBAAiB;AACnC;AAaO,SAAS,gBAAgB,CAC9B,YACA,OACgB;AAAA,EAChB,MAAM,YAAY,IAAI;AAAA,EACtB,MAAM,UAAU;AAAA,EAChB,MAAM,OAAuB;AAAA,IAC3B,OAAO;AAAA,IACP;AAAA,IACA,UAAU;AAAA,IACV,gBAAgB,CAAC,MAAM,UAAU;AAAA,MAC/B,IAAI,SAAS,UAAU;AAAA,QACrB,UAAU,IAAI,QAAQ;AAAA,MACxB;AAAA;AAAA,IAEF,mBAAmB,CAAC,MAAM,UAAU;AAAA,MAClC,IAAI,SAAS,UAAU;AAAA,QACrB,UAAU,OAAO,QAAQ;AAAA,MAC3B;AAAA;AAAA,IAEF,WAAW,CAAC,UAAU;AAAA,MACpB,UAAU,IAAI,QAAQ;AAAA;AAAA,IAExB,cAAc,CAAC,UAAU;AAAA,MACvB,UAAU,OAAO,QAAQ;AAAA;AAAA,IAE3B,aAAa,CAAC,OAAO;AAAA,MACnB,WAAW,YAAY,CAAC,GAAG,SAAS,GAAG;AAAA,QACrC,IAAI,OAAO,aAAa,YAAY;AAAA,UAClC,SAAS,KAAK,MAAM,KAAK;AAAA,QAC3B,EAAO;AAAA,UACL,SAAS,YAAY,KAAK;AAAA;AAAA,MAE9B;AAAA,MACA,OAAO;AAAA;AAAA,EAEX;AAAA,EACA,OAAO;AAAA;AASF,IAAM,kBAAqC;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAAA;AAKO,MAAM,kBAAkB,YAAY;AAAA,EACzB,aAAa;AAAA,EACb,cAAc;AAAA,EAEvB,UAAU,CACf,SACA,SAC+B;AAAA,IAC/B,OAAO,WAAW,SAAS,OAAO;AAAA;AAAA,EAG7B,YAAY,CAAC,IAAyC;AAAA,IAC3D,aAAa,EAAE;AAAA;AAAA,EAED,SAAoB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe,IAAI;AAAA,EACnB,YAAY,IAAI;AAAA,EAChB,OAAO;AAAA,EACP,OAAO;AAAA,EACP,UAAU;AAAA,EACV,UAAU;AAAA,EACV,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,sBAAsB;AAAA,EACtB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,cAAc;AAAA,EACd,eAAe;AAAA,EACf,WAAW;AAAA,EAE3B,WAAW,CAAC,UAA4B,CAAC,GAAG;AAAA,IAC1C,MAAM;AAAA,IACN,MAAM,MAAM,QAAQ,OAAO;AAAA,IAC3B,KAAK,WAAW,IAAI,SAAS,GAAG;AAAA,IAChC,KAAK,UAAU,IAAI,QAAQ,IAAI;AAAA,IAC/B,KAAK,WAAW,IAAI;AAAA,IACnB,KAAK,SAA+C,cAAc;AAAA,IACnE,kBAAkB,KAAK,QAAQ;AAAA;AAAA,EAG1B,UAAU,CAAC,OAA+B;AAAA,IAC/C,OAAO,iBAAiB,MAAM,KAAK;AAAA;AAAA,EAG9B,gBAAgB,CAAC,SAAuC;AAAA,IAC7D,OAAO,QAAQ;AAAA;AAAA,EAGV,qBAAqB,CAAC,UAAwC;AAAA,IACnE,OAAO,WAAW,MAAM,SAAS,KAAK,IAAI,CAAC,GAAG,CAAC;AAAA;AAAA,EAG1C,oBAAoB,CAAC,QAAsB;AAAA,IAChD,aAAa,MAAkD;AAAA;AAAA,EAI1D,cAAc,CAAC,KAAmB;AAAA,IACvC,KAAK,SAAS,OAAO;AAAA;AAAA,EAIhB,WAAW,GAAa;AAAA,IAC7B,OAAO,CAAC,GAAG,eAAe;AAAA;AAE9B;AASO,SAAS,eAAe,CAAC,UAA4B,CAAC,GAAc;AAAA,EACzE,OAAO,IAAI,UAAU,OAAO;AAAA;AAOvB,SAAS,iBAAiB,CAC/B,WACA,SAAkC,YACtB;AAAA,EACZ,MAAM,WAAW,IAAI;AAAA,EACrB,MAAM,OAAO,UAAU,YAAY;AAAA,EACnC,WAAW,OAAO,MAAM;AAAA,IACtB,SAAS,IAAI,KAAK,OAAO,yBAAyB,QAAQ,GAAG,CAAC;AAAA,EAChE;AAAA,EACA,WAAW,OAAO,MAAM;AAAA,IACtB,OAAO,eAAe,QAAQ,KAAK;AAAA,MACjC,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,OAAQ,UAAiD;AAAA,IAC3D,CAAC;AAAA,EACH;AAAA,EACA,OAAO,eAAe,QAAQ,UAAU;AAAA,IACtC,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AAAA,EAED,OAAO,MAAM;AAAA,IACX,WAAW,OAAO,MAAM;AAAA,MACtB,MAAM,aAAa,SAAS,IAAI,GAAG;AAAA,MACnC,IAAI,YAAY;AAAA,QACd,OAAO,eAAe,QAAQ,KAAK,UAAU;AAAA,MAC/C,EAAO;AAAA,QACL,QAAQ,eAAe,QAAQ,GAAG;AAAA;AAAA,IAEtC;AAAA;AAAA;AAOG,SAAS,iBAAiB,CAC/B,QACA,aACQ;AAAA,EACR,MAAM,OAAO,IAAI;AAAA,EACjB,IAAI,aAAa;AAAA,IACf,KAAK,gBAAgB;AAAA,EACvB;AAAA,EACA,UAAU,MAAM,QAAQ,WAAW;AAAA,EACnC,OAAO,CAAC,GAAG,KAAK,SAAS;AAAA;AAG3B,SAAS,SAAS,CAChB,QACA,QACA,aACM;AAAA,EACN,MAAM,QAAmB,CAAC;AAAA,EAC1B,IAAI,UAAgB;AAAA,EACpB,IAAI,QAAQ;AAAA,EACZ,MAAM,SAAS,OAAO;AAAA,EAEtB,MAAM,SAAS,CAAC,SAAqB;AAAA,IACnC,IAAI,KAAK,kBAAkB,MAAM;AAAA,MAC/B,KAAK,gBAAgB;AAAA,IACvB;AAAA,IACA,QAAQ,YAAY,IAAI;AAAA;AAAA,EAG1B,OAAO,QAAQ,QAAQ;AAAA,IACrB,MAAM,YAAY,OAAO,QAAQ,KAAK,KAAK;AAAA,IAC3C,IAAI,YAAY,GAAG;AAAA,MACjB,OAAO,IAAI,KAAK,OAAO,MAAM,KAAK,CAAC,CAAC;AAAA,MACpC;AAAA,IACF;AAAA,IACA,IAAI,YAAY,OAAO;AAAA,MACrB,OAAO,IAAI,KAAK,OAAO,MAAM,OAAO,SAAS,CAAC,CAAC;AAAA,IACjD;AAAA,IACA,IAAI,OAAO,WAAW,QAAQ,SAAS,GAAG;AAAA,MACxC,MAAM,aAAa,OAAO,QAAQ,OAAO,YAAY,CAAC;AAAA,MACtD,MAAM,aAAa,aAAa,IAAI,SAAS;AAAA,MAC7C,OAAO,IAAI,QAAQ,OAAO,MAAM,YAAY,GAAG,UAAU,CAAC,CAAC;AAAA,MAC3D,QAAQ,aAAa,IAAI,SAAS,aAAa;AAAA,MAC/C;AAAA,IACF;AAAA,IACA,MAAM,SAAS,WAAW,QAAQ,SAAS;AAAA,IAC3C,IAAI,SAAS,GAAG;AAAA,MACd,OAAO,IAAI,KAAK,OAAO,MAAM,SAAS,CAAC,CAAC;AAAA,MACxC;AAAA,IACF;AAAA,IACA,MAAM,YAAY,OAAO,MAAM,YAAY,GAAG,MAAM;AAAA,IACpD,MAAM,UAAU,UAAU,KAAK;AAAA,IAC/B,IAAI,QAAQ,WAAW,GAAG,GAAG;AAAA,MAC3B,MAAM,UAAU,QAAQ,MAAM,CAAC,EAAE,KAAK,EAAE,YAAY;AAAA,MACpD,IAAI,MAAM,SAAS,KAAK,MAAM,MAAM,SAAS,GAAG,cAAc,SAAS;AAAA,QACrE,MAAM,IAAI;AAAA,QACV,UAAU,MAAM,MAAM,SAAS,MAAM;AAAA,MACvC;AAAA,MACA,QAAQ,SAAS;AAAA,MACjB;AAAA,IACF;AAAA,IACA,MAAM,cAAc,QAAQ,SAAS,GAAG;AAAA,IACxC,MAAM,SAAS,SAAS,QAAQ,QAAQ,OAAO,EAAE,EAAE,KAAK,CAAC;AAAA,IACzD,IAAI,CAAC,QAAQ;AAAA,MACX,QAAQ,SAAS;AAAA,MACjB;AAAA,IACF;AAAA,IACA,MAAM,UAAU,oBAAoB,OAAO,MAAM,WAAW;AAAA,IAC5D,WAAW,QAAQ,OAAO,YAAY;AAAA,MACpC,QAAQ,aAAa,KAAK,MAAM,KAAK,KAAK;AAAA,IAC5C;AAAA,IACA,OAAO,OAAO;AAAA,IACd,IAAI,UAAU,IAAI,OAAO,IAAI,KAAK,aAAa;AAAA,MAC7C,QAAQ,SAAS;AAAA,MACjB;AAAA,IACF;AAAA,IACA,IAAI,cAAc,IAAI,OAAO,IAAI,GAAG;AAAA,MAClC,MAAM,WAAW,KAAK,OAAO;AAAA,MAC7B,MAAM,SAAS,OAAO,YAAY,EAAE,QAAQ,UAAU,SAAS,CAAC;AAAA,MAChE,MAAM,UAAU,OAAO,MAAM,SAAS,GAAG,SAAS,IAAI,SAAS,MAAM;AAAA,MACrE,QAAQ,YACN,aAAa,eAAe,OAAO,KAAK,IAAI,KAAK,OAAO,CAC1D;AAAA,MACA,QAAQ,SAAS,IAAI,SAAS,SAAS,SAAS;AAAA,MAChD;AAAA,IACF;AAAA,IACA,MAAM,KAAK,OAAO;AAAA,IAClB,UAAU;AAAA,IACV,QAAQ,SAAS;AAAA,EACnB;AAAA;AAGF,IAAM,YAAY,IAAI,IAAI;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,gBAAgB,IAAI,IAAI,CAAC,UAAU,SAAS,YAAY,OAAO,CAAC;AAEtE,SAAS,UAAU,CAAC,QAAgB,WAA2B;AAAA,EAC7D,IAAI,UAAyB;AAAA,EAC7B,SAAS,QAAQ,YAAY,EAAG,QAAQ,OAAO,QAAQ,SAAS,GAAG;AAAA,IACjE,MAAM,OAAO,OAAO;AAAA,IACpB,IAAI,SAAS;AAAA,MACX,IAAI,SAAS,SAAS;AAAA,QACpB,UAAU;AAAA,MACZ;AAAA,MACA;AAAA,IACF;AAAA,IACA,IAAI,SAAS,OAAO,SAAS,KAAK;AAAA,MAChC,UAAU;AAAA,MACV;AAAA,IACF;AAAA,IACA,IAAI,SAAS,KAAK;AAAA,MAChB,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,QAAQ,CACf,QAC6E;AAAA,EAC7E,MAAM,QAAQ,OAAO,MAAM,kCAAkC;AAAA,EAC7D,IAAI,CAAC,OAAO;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EACA,MAAM,OAAO,MAAM,GAAG,YAAY;AAAA,EAClC,MAAM,aAAqD,CAAC;AAAA,EAC5D,MAAM,kBAAkB,MAAM;AAAA,EAC9B,MAAM,UACJ;AAAA,EACF,IAAI;AAAA,EACJ,QAAQ,iBAAiB,QAAQ,KAAK,eAAe,OAAO,MAAM;AAAA,IAChE,MAAM,WAAW,eAAe;AAAA,IAChC,MAAM,QACJ,eAAe,MAAM,eAAe,MAAM,eAAe,MAAM;AAAA,IACjE,WAAW,KAAK,EAAE,MAAM,UAAU,OAAO,eAAe,KAAK,EAAE,CAAC;AAAA,EAClE;AAAA,EACA,OAAO,EAAE,MAAM,WAAW;AAAA;AAG5B,SAAS,cAAc,CAAC,OAAuB;AAAA,EAC7C,OAAO,MACJ,QAAQ,UAAU,GAAG,EACrB,QAAQ,SAAS,GAAG,EACpB,QAAQ,SAAS,GAAG,EACpB,QAAQ,WAAW,GAAG,EACtB,QAAQ,UAAU,GAAG,EACrB,QAAQ,WAAW,MAAQ;AAAA;AAGhC,SAAS,UAAU,CAAC,OAAuB;AAAA,EACzC,OAAO,MACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM;AAAA;AAGzB,SAAS,eAAe,CAAC,OAAuB;AAAA,EAC9C,OAAO,WAAW,KAAK,EAAE,QAAQ,MAAM,QAAQ;AAAA;AAGjD,SAAS,aAAa,CAAC,MAAoB;AAAA,EACzC,QAAQ,KAAK;AAAA,SACN;AAAA,MACH,OAAO,WAAY,KAAc,IAAI;AAAA,SAClC;AAAA,MACH,OAAO,OAAQ,KAAiB;AAAA,SAC7B;AAAA,MACH,OAAO,iBAAiB,IAAe;AAAA;AAAA,MAEvC,OAAO;AAAA;AAAA;AAIb,SAAS,gBAAgB,CAAC,SAA0B;AAAA,EAClD,MAAM,MAAM,QAAQ;AAAA,EACpB,MAAM,aAAuB,CAAC;AAAA,EAC9B,WAAW,SAAS,QAAQ,iBAAiB,GAAG;AAAA,IAC9C,IAAI,MAAM,SAAS,SAAS;AAAA,MAC1B;AAAA,IACF;AAAA,IACA,WAAW,KAAK,GAAG,MAAM,SAAS,gBAAgB,MAAM,KAAK,IAAI;AAAA,EACnE;AAAA,EACA,MAAM,cAAc,QAAQ,gBAAgB;AAAA,EAC5C,IAAI,aAAa;AAAA,IACf,WAAW,KAAK,UAAU,gBAAgB,WAAW,IAAI;AAAA,EAC3D;AAAA,EACA,MAAM,gBAAgB,WAAW,SAAS,IAAI,IAAI,WAAW,KAAK,GAAG,MAAM;AAAA,EAC3E,IAAI,UAAU,IAAI,GAAG,GAAG;AAAA,IACtB,OAAO,IAAI,MAAM;AAAA,EACnB;AAAA,EACA,IAAI,cAAc,IAAI,GAAG,GAAG;AAAA,IAC1B,OAAO,IAAI,MAAM,iBAAiB,QAAQ,gBAAgB;AAAA,EAC5D;AAAA,EACA,OAAO,IAAI,MAAM,iBAAiB,kBAAkB,OAAO,MAAM;AAAA;AAGnE,SAAS,iBAAiB,CAAC,SAA0B;AAAA,EACnD,OAAO,QAAQ,UAAU,IAAI,CAAC,UAAU,cAAc,KAAK,CAAC,EAAE,KAAK,EAAE;AAAA;AAMvE,SAAS,aAAa,CAAC,UAAsC;AAAA,EAC3D,OAAO,SAAS,MAAM,GAAG,EAAE,IAAI,CAAC,UAAU;AAAA,IACxC,MAAM,WAA6B,CAAC;AAAA,IACpC,IAAI,QAAQ;AAAA,IACZ,OAAO,QAAQ,MAAM,QAAQ;AAAA,MAC3B,OAAO,QAAQ,MAAM,UAAU,MAAM,WAAW,KAAK;AAAA,QACnD,SAAS;AAAA,MACX;AAAA,MACA,IAAI,SAAS,MAAM,QAAQ;AAAA,QACzB;AAAA,MACF;AAAA,MACA,IAAI,MAAM,WAAW,KAAK;AAAA,QACxB,SAAS,KAAK,EAAE,MAAM,QAAQ,CAAC;AAAA,QAC/B,SAAS;AAAA,QACT;AAAA,MACF;AAAA,MACA,MAAM,QAAQ;AAAA,MACd,OACE,QAAQ,MAAM,UACd,MAAM,WAAW,OACjB,MAAM,WAAW,KACjB;AAAA,QACA,SAAS;AAAA,MACX;AAAA,MACA,SAAS,KAAK,cAAc,MAAM,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,IACxD;AAAA,IACA,OAAO;AAAA,GACR;AAAA;AAaH,SAAS,aAAa,CAAC,QAAgC;AAAA,EACrD,MAAM,YAA8B,CAAC;AAAA,EACrC,IAAI,QAAQ;AAAA,EACZ,OAAO,QAAQ,OAAO,QAAQ;AAAA,IAC5B,MAAM,OAAO,OAAO;AAAA,IACpB,IAAI,SAAS,KAAK;AAAA,MAChB,UAAU,KAAK,EAAE,MAAM,YAAY,CAAC;AAAA,MACpC,SAAS;AAAA,IACX,EAAO,SAAI,SAAS,KAAK;AAAA,MACvB,MAAM,MAAM,eAAe,QAAQ,QAAQ,CAAC;AAAA,MAC5C,UAAU,KAAK,EAAE,MAAM,MAAM,IAAI,OAAO,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC;AAAA,MAC/D,QAAQ;AAAA,IACV,EAAO,SAAI,SAAS,KAAK;AAAA,MACvB,MAAM,MAAM,eAAe,QAAQ,QAAQ,CAAC;AAAA,MAC5C,UAAU,KAAK;AAAA,QACb,MAAM;AAAA,QACN,WAAW,OAAO,MAAM,QAAQ,GAAG,GAAG;AAAA,MACxC,CAAC;AAAA,MACD,QAAQ;AAAA,IACV,EAAO,SAAI,SAAS,KAAK;AAAA,MACvB,MAAM,MAAM,OAAO,QAAQ,KAAK,KAAK;AAAA,MACrC,MAAM,QAAQ,OACX,MAAM,QAAQ,GAAG,MAAM,IAAI,OAAO,SAAS,GAAG,EAC9C,KAAK;AAAA,MACR,MAAM,YAAY,MAAM,MACtB,sFACF;AAAA,MACA,IAAI,WAAW;AAAA,QACb,UAAU,KAAK;AAAA,UACb,MAAM;AAAA,UACN,MAAM,UAAU;AAAA,UAChB,UAAU,UAAU;AAAA,UACpB,OAAO,UAAU,MAAM,UAAU,MAAM,UAAU;AAAA,QACnD,CAAC;AAAA,MACH,EAAO;AAAA,QACL,UAAU,KAAK,EAAE,MAAM,aAAa,MAAM,MAAM,CAAC;AAAA;AAAA,MAEnD,QAAQ,MAAM,IAAI,OAAO,SAAS,MAAM;AAAA,IAC1C,EAAO,SAAI,SAAS,OAAO,OAAO,WAAW,SAAS,KAAK,GAAG;AAAA,MAC5D,MAAM,QAAQ,OAAO,QAAQ,KAAK,KAAK;AAAA,MACvC,MAAM,QAAQ,OAAO,MAAM,QAAQ,GAAG,QAAQ,IAAI,OAAO,SAAS,KAAK;AAAA,MACvE,UAAU,KAAK,EAAE,MAAM,OAAO,UAAU,cAAc,MAAM,KAAK,CAAC,EAAE,CAAC;AAAA,MACrE,QAAQ,QAAQ,IAAI,OAAO,SAAS,QAAQ;AAAA,IAC9C,EAAO,SAAI,SAAS,OAAO,OAAO,WAAW,aAAa,KAAK,GAAG;AAAA,MAChE,UAAU,KAAK,EAAE,MAAM,aAAa,MAAM,WAAW,CAAC;AAAA,MACtD,SAAS,YAAY;AAAA,IACvB,EAAO,SAAI,YAAY,KAAK,IAAI,GAAG;AAAA,MACjC,MAAM,MAAM,eAAe,QAAQ,KAAK;AAAA,MACxC,UAAU,KAAK;AAAA,QACb,MAAM;AAAA,QACN,MAAM,OAAO,MAAM,OAAO,GAAG,EAAE,YAAY;AAAA,MAC7C,CAAC;AAAA,MACD,QAAQ;AAAA,IACV,EAAO;AAAA,MACL,SAAS;AAAA;AAAA,EAEb;AAAA,EACA,IAAI,UAAU,WAAW,GAAG;AAAA,IAC1B,OAAO,UAAU;AAAA,EACnB;AAAA,EACA,OAAO,EAAE,MAAM,YAAY,OAAO,UAAU;AAAA;AAG9C,SAAS,cAAc,CAAC,QAAgB,OAAuB;AAAA,EAC7D,IAAI,QAAQ;AAAA,EAEZ,OAAO,QAAQ,OAAO,UAAU,gBAAgB,KAAK,OAAO,MAAM,GAAG;AAAA,IACnE,SAAS;AAAA,EACX;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,aAAa,CAAC,SAAkB,UAA2B;AAAA,EAClE,MAAM,SAAS,cAAc,QAAQ;AAAA,EACrC,OAAO,OAAO,KAAK,CAAC,UAAU,WAAW,SAAS,KAAK,CAAC;AAAA;AAG1D,SAAS,UAAU,CAAC,SAAkB,OAAkC;AAAA,EACtE,IAAI,QAAQ,MAAM,SAAS;AAAA,EAC3B,IAAI,QAAQ,GAAG;AAAA,IACb,OAAO;AAAA,EACT;AAAA,EAGA,IAAI,CAAC,aAAa,SAAS,MAAM,MAAM,GAAG;AAAA,IACxC,OAAO;AAAA,EACT;AAAA,EACA,IAAI,UAAU,GAAG;AAAA,IACf,OAAO;AAAA,EACT;AAAA,EAGA,IAAI,UAA0B,QAAQ;AAAA,EACtC,SAAS;AAAA,EACT,OAAO,SAAS;AAAA,IACd,MAAM,WAAW,MAAM;AAAA,IACvB,IAAI,CAAC,UAAU;AAAA,MACb,OAAO;AAAA,IACT;AAAA,IACA,IAAI,SAAS,SAAS,SAAS;AAAA,MAE7B,MAAM,iBAAiB,MAAM,QAAQ;AAAA,MACrC,IAAI,CAAC,kBAAkB,CAAC,aAAa,SAAS,cAAc,GAAG;AAAA,QAC7D,OAAO;AAAA,MACT;AAAA,MACA,SAAS;AAAA,MACT,IAAI,QAAQ,GAAG;AAAA,QACb,OAAO;AAAA,MACT;AAAA,MACA,UAAU,QAAQ;AAAA,MAClB;AAAA,IACF;AAAA,IACA,IAAI,aAAa,SAAS,QAAQ,GAAG;AAAA,MACnC,SAAS;AAAA,MACT,IAAI,QAAQ,GAAG;AAAA,QACb,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,UAAU,QAAQ;AAAA,EACpB;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,YAAY,CAAC,SAAkB,UAAmC;AAAA,EACzE,QAAQ,SAAS;AAAA,SACV;AAAA,MACH,OAAO;AAAA,SACJ;AAAA,MACH,OAAO,QAAQ,cAAc,SAAS;AAAA,SACnC;AAAA,MACH,OAAO,QAAQ,OAAO,SAAS;AAAA,SAC5B;AAAA,MACH,OAAO,QAAQ,UAAU,SAAS,SAAS,SAAS;AAAA,SACjD;AAAA,MACH,OAAO,eAAe,SAAS,QAAQ;AAAA,SACpC;AAAA,MACH,OAAO,SAAS,MAAM,MAAM,CAAC,SAAS,aAAa,SAAS,IAAI,CAAC;AAAA,SAC9D;AAAA,MACH,OAAO,CAAC,aAAa,SAAS,SAAS,QAAQ;AAAA,SAC5C;AAAA,MACH,OAAO;AAAA;AAAA,MAEP,OAAO;AAAA;AAAA;AAIb,SAAS,cAAc,CACrB,SACA,UACS;AAAA,EACT,MAAM,iBAAiB,QAAQ,aAAa,SAAS,IAAI;AAAA,EACzD,IAAI,CAAC,SAAS,UAAU;AAAA,IACtB,OAAO,mBAAmB;AAAA,EAC5B;AAAA,EACA,IAAI,mBAAmB,MAAM;AAAA,IAC3B,OAAO;AAAA,EACT;AAAA,EACA,MAAM,WAAW,SAAS,SAAS;AAAA,EACnC,QAAQ,SAAS;AAAA,SACV;AAAA,MACH,OAAO,mBAAmB;AAAA,SACvB;AAAA,MACH,OAAO,eAAe,MAAM,KAAK,EAAE,SAAS,QAAQ;AAAA,SACjD;AAAA,MACH,OACE,mBAAmB,YAAY,eAAe,WAAW,GAAG,WAAW;AAAA,SAEtE;AAAA,MACH,OAAO,eAAe,WAAW,QAAQ;AAAA,SACtC;AAAA,MACH,OAAO,eAAe,SAAS,QAAQ;AAAA,SACpC;AAAA,MACH,OAAO,eAAe,SAAS,QAAQ;AAAA;AAAA,MAEvC,OAAO;AAAA;AAAA;AAIb,SAAS,gBAAgB,CAAC,MAAY,UAAqC;AAAA,EACzE,MAAM,UAAqB,CAAC;AAAA,EAC5B,gBAAgB,MAAM,CAAC,YAAY;AAAA,IACjC,IAAI,YAAY,QAAQ,cAAc,SAAS,QAAQ,GAAG;AAAA,MACxD,QAAQ,KAAK,OAAO;AAAA,IACtB;AAAA,GACD;AAAA,EACD,OAAO,IAAI,SAAS,OAAO;AAAA;AAG7B,SAAS,eAAe,CAAC,MAAY,OAAyC;AAAA,EAC5E,WAAW,SAAS,KAAK,WAAW;AAAA,IAClC,IAAI,MAAM,aAAa,sBAA0B;AAAA,MAC/C,MAAM,KAAgB;AAAA,MACtB,gBAAgB,OAAO,KAAK;AAAA,IAC9B;AAAA,EACF;AAAA;AAGF,SAAS,mBAAmB,CAC1B,SACA,aACa;AAAA,EACb,MAAM,MAAM,QAAQ,YAAY;AAAA,EAChC,IAAI;AAAA,EACJ,IAAI,QAAQ,SAAS;AAAA,IACnB,UAAU,IAAI,iBAAiB,GAAG;AAAA,EACpC,EAAO,SAAI,QAAQ,YAAY;AAAA,IAC7B,UAAU,IAAI,oBAAoB,GAAG;AAAA,EACvC,EAAO,SAAI,QAAQ,UAAU;AAAA,IAC3B,UAAU,IAAI,kBAAkB,GAAG;AAAA,EACrC,EAAO,SAAI,QAAQ,UAAU;AAAA,IAC3B,UAAU,IAAI,kBAAkB,GAAG;AAAA,EACrC,EAAO,SAAI,QAAQ,UAAU;AAAA,IAC3B,UAAU,IAAI,kBAAkB,GAAG;AAAA,EACrC,EAAO,SAAI,QAAQ,SAAS;AAAA,IAC1B,UAAU,IAAI,iBAAiB,GAAG;AAAA,EACpC,EAAO,SAAI,QAAQ,KAAK;AAAA,IACtB,UAAU,IAAI,kBAAkB,GAAG;AAAA,EACrC,EAAO,SAAI,QAAQ,OAAO;AAAA,IACxB,UAAU,IAAI,iBAAiB,GAAG;AAAA,EACpC,EAAO,SAAI,QAAQ,SAAS;AAAA,IAC1B,UAAU,IAAI,iBAAiB,GAAG;AAAA,EACpC,EAAO,SAAI,QAAQ,QAAQ,QAAQ,MAAM;AAAA,IACvC,UAAU,IAAI,qBAAqB,GAAG;AAAA,EACxC,EAAO;AAAA,IACL,UAAU,IAAI,YAAY,GAAG;AAAA;AAAA,EAE/B,QAAQ,gBAAgB;AAAA,EACxB,OAAO;AAAA;AAGT,SAAS,iBAAiB,CAAC,aAA6B;AAAA,EACtD,MAAM,OAAO,YAAY,cAAc,MAAM;AAAA,EAC7C,YAAY,YAAY,IAAI;AAAA,EAC5B,MAAM,OAAO,YAAY,cAAc,MAAM;AAAA,EAC7C,MAAM,OAAO,YAAY,cAAc,MAAM;AAAA,EAC7C,KAAK,YAAY,IAAI;AAAA,EACrB,KAAK,YAAY,IAAI;AAAA;AAGvB,SAAS,kBAAkB,CAAC,SAA0C;AAAA,EACpE,MAAM,UAAgD;AAAA,IACpD,GAAG,CAAC,SAAS,UAAkB;AAAA,MAC7B,IAAI,OAAO,aAAa,UAAU;AAAA,QAChC;AAAA,MACF;AAAA,MACA,OACE,QAAQ,aAAa,QAAQ,YAAY,QAAQ,GAAG,KAAK;AAAA;AAAA,IAG7D,GAAG,CAAC,SAAS,UAAkB,OAAwB;AAAA,MACrD,IAAI,OAAO,aAAa,UAAU;AAAA,QAChC,OAAO;AAAA,MACT;AAAA,MACA,IAAI,UAAU,QAAQ,UAAU,WAAW;AAAA,QACzC,QAAQ,gBAAgB,QAAQ,YAAY,QAAQ,GAAG;AAAA,MACzD,EAAO;AAAA,QACL,QAAQ,aAAa,QAAQ,YAAY,QAAQ,KAAK,OAAO,KAAK,CAAC;AAAA;AAAA,MAErE,OAAO;AAAA;AAAA,IAET,cAAc,CAAC,SAAS,UAA2B;AAAA,MACjD,IAAI,OAAO,aAAa,UAAU;AAAA,QAChC,QAAQ,gBAAgB,QAAQ,YAAY,QAAQ,GAAG;AAAA,MACzD;AAAA,MACA,OAAO;AAAA;AAAA,IAET,GAAG,CAAC,SAAS,UAA2B;AAAA,MACtC,IAAI,OAAO,aAAa,UAAU;AAAA,QAChC,OAAO;AAAA,MACT;AAAA,MACA,OAAO,QAAQ,aAAa,QAAQ,YAAY,QAAQ,GAAG;AAAA;AAAA,IAE7D,OAAO,GAAG;AAAA,MACR,MAAM,OAAiB,CAAC;AAAA,MACxB,WAAW,SAAS,QAAQ,iBAAiB,GAAG;AAAA,QAC9C,IAAI,MAAM,KAAK,WAAW,OAAO,GAAG;AAAA,UAClC,KAAK,KAAK,YAAY,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC;AAAA,QAC5C;AAAA,MACF;AAAA,MACA,OAAO;AAAA;AAAA,IAET,wBAAwB,CAAC,SAAS,UAAkB;AAAA,MAClD,IAAI,OAAO,aAAa,UAAU;AAAA,QAChC;AAAA,MACF;AAAA,MACA,IAAI,QAAQ,aAAa,QAAQ,YAAY,QAAQ,GAAG,GAAG;AAAA,QACzD,OAAO;AAAA,UACL,cAAc;AAAA,UACd,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,OAAO,QAAQ,aAAa,QAAQ,YAAY,QAAQ,GAAG;AAAA,QAC7D;AAAA,MACF;AAAA,MACA;AAAA;AAAA,EAEJ;AAAA,EACA,OAAO,IAAI,MAAM,CAAC,GAAG,OAAO;AAAA;AAG9B,SAAS,WAAW,CAAC,OAAuB;AAAA,EAC1C,OAAO,MAAM,QAAQ,UAAU,CAAC,UAAU,IAAI,MAAM,YAAY,GAAG;AAAA;AAGrE,SAAS,WAAW,CAAC,OAAuB;AAAA,EAC1C,OAAO,MAAM,QAAQ,aAAa,CAAC,QAAQ,SACzC,KAAK,YAAY,CACnB;AAAA;;;AC77FF,IAAM,sBAAsB,CAAC,GAAG,iBAAiB,SAAS;AAY1D,IAAI,kBAAiC,QAAQ,QAAQ;AAErD,eAAsB,iBAAiB,CACrC,QACA,SACA,QAAgB,OAAO,OACvB,QAAQ,KACS;AAAA,EACjB,OAAO,eAAe,YAAY;AAAA,IAChC,MAAM,SAAS,MAAM,mBAAmB,KAAK;AAAA,IAC7C,MAAM,MAAM,OAAO;AAAA,IACnB,IAAI,CAAC,OAAO,OAAO,IAAI,uBAAuB,YAAY;AAAA,MACxD,MAAM,IAAI,MACR,kBAAkB,oDACpB;AAAA,IACF;AAAA,IAEA,OAAO,IAAI,mBAAmB,OAAO;AAAA,KACpC,OAAO,OAAO,MAAM,QAAQ;AAAA;AAGjC,eAAe,cAAiB,CAC9B,UACA,OACA,UACY;AAAA,EACZ,MAAM,OAAO,gBAAgB,KAAK,MAChC,kBAAkB,UAAU,OAAO,QAAQ,CAC7C;AAAA,EACA,kBAAkB,KAAK,KACrB,MAAG;AAAA,IAAG;AAAA,KACN,MAAG;AAAA,IAAG;AAAA,GACR;AAAA,EAEA,OAAO;AAAA;AAGT,eAAe,iBAAoB,CACjC,UACA,OACA,UACY;AAAA,EACZ,MAAM,MAAM,mBAAmB,WAAW,UAAU,MAAM,MAAM;AAAA,EAChE,MAAM,YAAY,gBAAgB,EAAE,IAAI,CAAC;AAAA,EACzC,OAAO,OAAO,WAAW;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAAA,EACD,MAAM,cAAc,yBAAyB;AAAA,EAE7C,IAAI;AAAA,IACF,kBAAkB,SAAS;AAAA,IAC3B,OAAO,MAAM,SAAS;AAAA,YACtB;AAAA,IACA,yBAAyB,WAAW;AAAA;AAAA;AAIxC,IAAI,uBAAuB;AAE3B,eAAe,kBAAkB,CAAC,OAA4C;AAAA,EAC5E,wBAAwB;AAAA,EACxB,OAAQ,MACN,UAAG,wBAAwB;AAAA;AAI/B,SAAS,wBAAwB,GAAwB;AAAA,EACvD,OAAO,IAAI,IACT,oBAAoB,IAAI,CAAC,QAAQ;AAAA,IAC/B;AAAA,IACA,OAAO,yBAAyB,YAAY,GAAG;AAAA,EACjD,CAAC,CACH;AAAA;AAGF,SAAS,wBAAwB,CAAC,aAAwC;AAAA,EACxE,oBAAoB,QAAQ,CAAC,QAAQ;AAAA,IACnC,MAAM,aAAa,YAAY,IAAI,GAAG;AAAA,IACtC,IAAI,YAAY;AAAA,MACd,OAAO,eAAe,YAAY,KAAK,UAAU;AAAA,MACjD;AAAA,IACF;AAAA,IAEA,OAAQ,WAAuC;AAAA,GAChD;AAAA;",
9
9
  "debugId": "B2D457EF5744300A64756E2164756E21",
package/dist/project.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- import type { AppDocumentRenderOptions } from '@geektech/transone';
1
+ import type { AppDocumentRenderOptions } from 'transone';
2
2
  import type { ResolvedConfig } from './types';
3
3
  export declare function renderProjectHtml(config: ResolvedConfig, options: AppDocumentRenderOptions, entry?: string, route?: string): Promise<string>;
@@ -0,0 +1,24 @@
1
+ import type { BuildOptions, BuildResult, ResolvedConfig } from '../types';
2
+ import type { BuildTarget, TargetType } from './types';
3
+ import { type MpDialect } from '../mp/dialect';
4
+ /**
5
+ * 小程序目标端通用实现:同一套 mp 编译器 + MpDialect 差异层。
6
+ *
7
+ * 流水线(src/mp/):
8
+ * 入口 → 静态分析(定位 createApp root / Component 子类)
9
+ * → 逐页面编译(模板 / 样式 / data / methods / 生命周期)
10
+ * → 组件调用点属性聚合(properties)
11
+ * → 按 dialect 生成平台原生工程(app.json / app.js / 样式 / pages / components)。
12
+ *
13
+ * 依赖 TypeScript 编译器 API,仅在小程序构建路径惰性加载。
14
+ */
15
+ export declare class MpTarget implements BuildTarget {
16
+ private readonly dialect;
17
+ constructor(dialect: MpDialect);
18
+ get type(): TargetType;
19
+ get label(): string;
20
+ build(config: ResolvedConfig, _options: BuildOptions): Promise<BuildResult>;
21
+ }
22
+ export declare const mpWeixinTarget: MpTarget;
23
+ export declare const mpAlipayTarget: MpTarget;
24
+ export declare const mpBytedanceTarget: MpTarget;
@@ -2,8 +2,8 @@ import type { BuildTarget, TargetType } from './types';
2
2
  /**
3
3
  * 目标端注册表:编译器按 Target 分发代码生成(positioning 7.3)。
4
4
  *
5
- * M1 注册 web;mp-* / app-* 以占位 Target 注册,构建时给出明确的
6
- * 未实现原因与路线图阶段,M2/M3 逐个替换为真实实现。
5
+ * M1 注册 web;M2 注册 mp-weixin;M3 注册 mp-alipay / mp-bytedance;
6
+ * app-* 以占位 Target 注册,构建时给出明确的未实现原因与路线图阶段。
7
7
  */
8
8
  export declare class TargetRegistry {
9
9
  private readonly targets;
package/dist/types.d.ts CHANGED
@@ -6,6 +6,44 @@ export interface ProxyOptions {
6
6
  changeOrigin?: boolean;
7
7
  rewrite?: (path: string) => string;
8
8
  }
9
+ /** 微信小程序目标端配置(--target mp-weixin)。 */
10
+ export interface MiniProgramConfig {
11
+ /** 小程序 appid;默认 "touristappid"(微信开发者工具测试号)。 */
12
+ appId?: string;
13
+ /** 小程序产物目录;默认 dist/build/mp-weixin。 */
14
+ outDir?: string;
15
+ /** 全局导航栏标题;默认 "TransOne"。 */
16
+ navigationBarTitleText?: string;
17
+ /** 小程序专用页面路由(route → 入口文件);默认复用 config.pages。 */
18
+ pages?: Record<string, string>;
19
+ /** 合并进 app.json.window 的字段(如 backgroundTextStyle、navigationBarBackgroundColor)。 */
20
+ window?: Record<string, unknown>;
21
+ /** app.json.tabBar(底部导航,含 list 等完整配置)。 */
22
+ tabBar?: Record<string, unknown>;
23
+ /** 合并进 app.json 的其他顶层字段(subPackages、lazyCodeLoading、permission、usingComponents 等)。 */
24
+ appExtra?: Record<string, unknown>;
25
+ /** 页面级 json 合并:route -> 字段(enablePullDownRefresh、navigationBarTitleText 等)。 */
26
+ pageExtra?: Record<string, Record<string, unknown>>;
27
+ /** 样式数字长度单位:'px'(默认)或 'rpx'(数值按 1px=2rpx 换算输出)。 */
28
+ lengthUnit?: 'px' | 'rpx';
29
+ /** 需要整体复制进产物包的静态资源目录;默认 'public'(不存在则跳过)。 */
30
+ publicDir?: string;
31
+ /** App 全局数据,写入 app.js 的 App({ globalData })。 */
32
+ globalData?: Record<string, unknown>;
33
+ }
34
+ export interface ResolvedMiniProgramConfig {
35
+ appId: string;
36
+ outDir: string;
37
+ navigationBarTitleText: string;
38
+ pages: Record<string, string>;
39
+ window?: Record<string, unknown>;
40
+ tabBar?: Record<string, unknown>;
41
+ appExtra?: Record<string, unknown>;
42
+ pageExtra?: Record<string, Record<string, unknown>>;
43
+ lengthUnit: 'px' | 'rpx';
44
+ publicDir: string;
45
+ globalData?: Record<string, unknown>;
46
+ }
9
47
  export interface ServerConfig {
10
48
  host?: string;
11
49
  port?: number;
@@ -53,6 +91,8 @@ export interface UserConfig {
53
91
  server?: ServerConfig;
54
92
  build?: BuildConfig;
55
93
  library?: LibraryConfig;
94
+ /** 微信小程序目标端配置(--target mp-weixin)。 */
95
+ mp?: MiniProgramConfig;
56
96
  }
57
97
  export interface ResolveConfigOptions {
58
98
  root?: string;
@@ -64,6 +104,8 @@ export interface ResolveConfigOptions {
64
104
  base?: string;
65
105
  /** 编译目标端,默认 web。 */
66
106
  target?: TargetType;
107
+ /** 小程序产物目录,覆盖 config.mp.outDir。 */
108
+ mpOutDir?: string;
67
109
  }
68
110
  export interface BuildOptions extends ResolveConfigOptions {
69
111
  /** 构建 npm 库(读取 config.library)而不是站点。 */
@@ -91,4 +133,6 @@ export interface ResolvedConfig {
91
133
  directoryPages: boolean;
92
134
  };
93
135
  library?: ResolvedLibraryConfig;
136
+ /** 微信小程序目标端配置(--target mp-weixin)。 */
137
+ mp?: ResolvedMiniProgramConfig;
94
138
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "transone-cli",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Bun-native multi-target compiler CLI for TransOne applications: 一份 TypeScript 源码,按 Target 静态转换为 Web 与多端小程序原生工程",
5
5
  "type": "module",
6
6
  "exports": {
@@ -19,7 +19,7 @@
19
19
  "test": "bun test"
20
20
  },
21
21
  "dependencies": {
22
- "transone": "workspace:*",
22
+ "transone": "0.2.0",
23
23
  "typescript": "^5.3.3"
24
24
  },
25
25
  "files": [
@@ -32,6 +32,7 @@
32
32
  "access": "public",
33
33
  "registry": "https://registry.npmjs.org/"
34
34
  },
35
+ "homepage": "https://github.com/geektech-team/transone/tree/main/packages/transone-cli",
35
36
  "engines": {
36
37
  "bun": ">=1.3.0"
37
38
  }