@dot-agent/compiler 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../../../node_modules/tsup/assets/cjs_shims.js","../src/parser.ts","../src/linter.ts","../src/manifest.ts","../src/id.ts","../src/zip.ts","../src/zip-core.ts","../src/pack.ts","../src/schema.ts"],"sourcesContent":["// Copyright 2026 Danilo Borges\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n\n// Parsing\nexport { initParsers, parse, parseSync, nodesOfType, nodeAtOffset, nodeToRange, positionToOffset, getContextNode } from './parser.js'\n\n// Graph / SCXML\nexport { getBehaviorScxml } from './parser.js'\n\n// DSL parsers\nexport { parseBehaviorFile, parseDescriptionFile, initBehaviorParser } from './parser.js'\n\n// Linting\nexport { lintDescription, lintBehavior, createLinter } from './linter.js'\n\n// Manifest (aboutme.json)\nexport { parseAboutme, buildAboutme, aboutmeToJson } from './manifest.js'\n\n// Agent ID\nexport { parseId, buildId, extractDigest, extractName } from './id.js'\n\n// ZIP utilities\nexport { readZip, writeZip, createZip, extractFiles, validateZipBomb, validateMagicBytes } from './zip.js'\n\n// Pack pipeline\nexport { pack, collectFiles } from './pack.js'\n\n// Types\nexport type {\n LangId,\n LintMessage,\n IdParts,\n Capability,\n AnnotatedRef,\n OntologyRef,\n PropertyType,\n PropertyDecl,\n TypeDefinition,\n AgentDecl,\n DescriptionFile,\n BehaviorFile,\n BehaviorStatement,\n StateDef,\n TriggerDecl,\n Integrity,\n AboutMe,\n PackOptions,\n PackResult,\n BuildAboutmeOptions,\n} from './types.js'\n","// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","// Copyright 2026 Danilo Borges\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n\nimport { createRequire } from 'module'\nimport { Parser, Language } from 'web-tree-sitter'\nimport type { Node, Tree } from 'web-tree-sitter'\nimport type { LangId, BehaviorFile, DescriptionFile, ParseDiagnostic } from './types.js'\nimport bpInit, { parse_behavior as bpParseBehavior, parse_description as bpParseDescription, get_graph } from '@dot-agent/parser-dsl'\n\nconst require = createRequire(import.meta.url)\nconst { descriptionWasmPath, behaviorWasmPath } = require('@dot-agent/tree-sitter') as {\n descriptionWasmPath: string\n behaviorWasmPath: string\n}\n\nlet _initialized = false\nlet _descriptionParser: Parser\nlet _behaviorParser: Parser\nlet _bpInitialized = false\n\nexport async function initBehaviorParser(): Promise<void> {\n if (_bpInitialized) return\n await bpInit()\n _bpInitialized = true\n}\n\nexport interface ParseResult<T> {\n ok: T | null\n diagnostics: ParseDiagnostic[]\n}\n\nexport function parseBehaviorFile(text: string): ParseResult<BehaviorFile> {\n return JSON.parse(bpParseBehavior(text)) as ParseResult<BehaviorFile>\n}\n\nexport function parseDescriptionFile(text: string): ParseResult<DescriptionFile> {\n return JSON.parse(bpParseDescription(text)) as ParseResult<DescriptionFile>\n}\n\nexport function getBehaviorScxml(text: string): string {\n return get_graph(text)\n}\n\nexport async function initParsers(): Promise<void> {\n if (_initialized) return\n await Parser.init()\n const descriptionLang = await Language.load(descriptionWasmPath)\n const behaviorLang = await Language.load(behaviorWasmPath)\n _descriptionParser = new Parser()\n _descriptionParser.setLanguage(descriptionLang)\n _behaviorParser = new Parser()\n _behaviorParser.setLanguage(behaviorLang)\n _initialized = true\n}\n\n/**\n * Parse source text and return a tree-sitter Tree.\n *\n * @param langId - 'description' or 'behavior'\n * @param text - source text to parse\n * @param previousTree - optional previous tree for incremental parsing (LSP use)\n */\nexport async function parse(\n langId: LangId,\n text: string,\n previousTree?: Tree\n): Promise<Tree> {\n await initParsers()\n const parser = langId === 'behavior' ? _behaviorParser : _descriptionParser\n return parser.parse(text, previousTree)!\n}\n\n/** Parse without initializing if parsers are already ready. Returns null if not initialized. */\nexport function parseSync(langId: LangId, text: string, previousTree?: Tree): Tree | null {\n if (!_initialized) return null\n const parser = langId === 'behavior' ? _behaviorParser : _descriptionParser\n return parser.parse(text, previousTree)\n}\n\n// ── AST helpers ──────────────────────────────────────────────────────────────\n\nexport function nodesOfType(tree: Tree, type: string): Node[] {\n if (!tree) return []\n return tree.rootNode.descendantsOfType(type).filter((n): n is Node => n !== null)\n}\n\nexport function nodeAtOffset(tree: Tree, offset: number): Node | null {\n if (!tree) return null\n return tree.rootNode.descendantForIndex(offset)\n}\n\nexport function nodeToRange(node: Node): {\n start: { line: number; character: number }\n end: { line: number; character: number }\n} {\n return {\n start: { line: node.startPosition.row, character: node.startPosition.column },\n end: { line: node.endPosition.row, character: node.endPosition.column },\n }\n}\n\nexport function positionToOffset(text: string, line: number, character: number): number {\n let offset = 0\n for (let i = 0; i < line; i++) {\n const nl = text.indexOf('\\n', offset)\n offset = nl === -1 ? text.length : nl + 1\n }\n return offset + character\n}\n\nexport function getContextNode(tree: Tree, offset: number): Node {\n let node = nodeAtOffset(tree, offset)\n while (node && (node.isError || node.isMissing)) {\n node = node.parent\n }\n if (!node || node.type === 'ERROR') {\n const raw = nodeAtOffset(tree, offset)\n const parent = raw?.parent\n if (parent) {\n const siblings = parent.children\n const idx = siblings.findIndex((c: Node | null) => c !== null && c.startIndex > offset)\n const prev = idx > 0 ? siblings[idx - 1] : siblings[siblings.length - 1]\n if (prev && !prev.isError) node = prev\n }\n }\n return node ?? tree.rootNode\n}\n","// Copyright 2026 Danilo Borges\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { readFileSync } from 'fs'\nimport { resolve, dirname } from 'path'\nimport { parse, nodesOfType, parseSync, initBehaviorParser, parseBehaviorFile } from './parser.js'\nimport type { LintMessage } from './types.js'\nimport type { Node, Tree } from 'web-tree-sitter'\n\nfunction nodePosition(node: Node): { line: number; col: number } {\n return { line: node.startPosition.row + 1, col: node.startPosition.column + 1 }\n}\n\n// ── Syntax error collection (reports deepest ERROR node per branch) ──────────\n\nconst MISSING_HINTS: Record<string, string> = {\n interact_stmt: \"Missing 'interact' — oriented states require 'goal … interact … on intent … on offtopic'.\",\n offtopic_handler: \"Missing 'on offtopic' handler — every state with 'interact' must handle the offtopic case.\",\n intent_handler: \"Missing at least one 'on intent' handler after 'interact'.\",\n goal_stmt: \"Missing 'goal' — every state with 'interact' must declare a goal.\",\n state_name: \"Missing state name after 'state' keyword.\",\n quoted_string: \"Missing quoted string — expected a value in double quotes.\",\n}\n\nfunction collectSyntaxErrors(root: Node, messages: LintMessage[], file: string): void {\n const seen = new Set<string>()\n\n function push(node: Node, message: string, code: string, severity: 'error' | 'warning' = 'error') {\n const key = `${node.startIndex}:${node.endIndex}:${message}`\n if (seen.has(key)) return\n seen.add(key)\n const { line, col } = nodePosition(node)\n messages.push({ file, line, col, severity, code, message })\n }\n\n function walk(node: Node) {\n if (node.isMissing) {\n const hint = MISSING_HINTS[node.type]\n push(node, hint ?? `Syntax error: missing '${node.type}'.`, 'E004')\n return\n }\n if (node.type === 'ERROR') {\n const hasNestedError = node.descendantsOfType('ERROR').some((e: Node | null) => e !== null && e.id !== node.id)\n if (!hasNestedError) {\n const snippet = node.text.replace(/\\s+/g, ' ').trim().slice(0, 40)\n push(node, snippet ? `Syntax error near '${snippet}'.` : 'Syntax error.', 'E004')\n return\n }\n }\n for (const child of node.children) {\n if (child) walk(child)\n }\n }\n\n walk(root)\n}\n\n// ── Description linting ──────────────────────────────────────────────────────\n\nconst STRICT_BLOCK_TYPES: Record<string, string> = {\n input_block: 'input',\n output_block: 'output',\n requires_block: 'requires',\n capabilities_block: 'capabilities',\n}\n\nexport async function lintDescription(text: string, file = 'agent.description'): Promise<LintMessage[]> {\n const tree = await parse('description', text)\n const messages: LintMessage[] = []\n\n collectSyntaxErrors(tree.rootNode, messages, file)\n\n // W003: default domain value\n // The grammar uses `agent_meta` nodes with key/value fields (not `domain_declaration`)\n for (const metaNode of nodesOfType(tree, 'agent_meta')) {\n const keyNode = metaNode.childForFieldName('key')\n if (keyNode?.text !== 'domain') continue\n const valueNode = metaNode.childForFieldName('value')\n if (valueNode?.text === 'example.com') {\n const { line, col } = nodePosition(valueNode)\n messages.push({\n file,\n line,\n col,\n severity: 'warning',\n code: 'W003',\n message: 'domain still has default value \"example.com\"',\n })\n }\n }\n\n // W007: no domain declared → agent will be packaged as unknown/name\n const hasDomain = nodesOfType(tree, 'agent_meta').some(\n n => n.childForFieldName('key')?.text === 'domain' && n.childForFieldName('value')?.text?.trim(),\n )\n if (!hasDomain) {\n messages.push({\n file,\n line: 1,\n col: 1,\n severity: 'warning',\n code: 'W007',\n message:\n 'No domain declared — agent will be packaged as unknown/name. Interoperability between runtimes is not guaranteed.',\n })\n }\n\n // W004: undeclared type references in input/output/requires/capabilities blocks\n const declaredTypes = new Set(\n nodesOfType(tree, 'type_decl')\n .map(n => n.childForFieldName('name')?.text)\n .filter(Boolean) as string[]\n )\n\n if (declaredTypes.size > 0) {\n for (const blockType of Object.keys(STRICT_BLOCK_TYPES)) {\n for (const blockNode of nodesOfType(tree, blockType)) {\n for (const typeRefNode of blockNode.descendantsOfType('type_reference').filter((n): n is Node => n !== null)) {\n const idNode = typeRefNode.firstNamedChild\n if (!idNode) continue\n const typeName = idNode.text\n if (!declaredTypes.has(typeName)) {\n const { line, col } = nodePosition(idNode)\n messages.push({\n file,\n line,\n col,\n severity: 'warning',\n code: 'W004',\n message: `Type '${typeName}' is not declared in this file (assuming native or external).`,\n })\n }\n }\n }\n }\n }\n\n return messages\n}\n\n// ── Behavior linting ─────────────────────────────────────────────────────────\n\nfunction levenshtein(a: string, b: string): number {\n const la = a.length, lb = b.length\n const dp: number[][] = Array.from({ length: la + 1 }, (_, i) =>\n Array.from({ length: lb + 1 }, (_, j) => (i === 0 ? j : j === 0 ? i : 0))\n )\n for (let i = 1; i <= la; i++) {\n for (let j = 1; j <= lb; j++) {\n dp[i][j] = a[i - 1] === b[j - 1]\n ? dp[i - 1][j - 1]\n : 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1])\n }\n }\n return dp[la][lb]\n}\n\nfunction closestName(token: string, candidates: string[]): string | undefined {\n let best: string | undefined\n let bestDist = Infinity\n for (const name of candidates) {\n const d = levenshtein(token.toLowerCase(), name.toLowerCase())\n if (d > 0 && d <= 2 && d < bestDist) { bestDist = d; best = name }\n }\n return best\n}\n\nconst KERNEL_LIFECYCLE_NAMES = ['init', 'welcome', 'end', 'online', 'offline']\n\nfunction collectTransitionTargets(stmts: Array<{ type: string; [k: string]: unknown }>): string[] {\n const targets: string[] = []\n for (const stmt of stmts) {\n if (!stmt || typeof stmt !== 'object') continue\n if (stmt.type === 'transition_stmt' && typeof stmt['state'] === 'string') {\n targets.push(stmt['state'])\n }\n if (stmt.type === 'intent_handler' && typeof stmt['body'] === 'string') {\n targets.push(stmt['body'])\n }\n const recurse = (v: unknown) => {\n if (Array.isArray(v)) targets.push(...collectTransitionTargets(v as Array<{ type: string }>))\n }\n if (stmt.type !== 'intent_handler') recurse(stmt['body'])\n recurse(stmt['handlers'])\n recurse(stmt['then'])\n recurse(stmt['else'])\n recurse(stmt['on_complete'])\n recurse(stmt['on_failure'])\n }\n return targets\n}\n\nfunction collectMergedStates(\n tree: Tree,\n docDir: string,\n states: Set<string>,\n visited = new Set<string>()\n): void {\n for (const mergeNode of nodesOfType(tree, 'merge_decl')) {\n const pathNode = mergeNode.childForFieldName('path')\n if (!pathNode) continue\n const filename = pathNode.text.replace(/^\"|\"$/g, '')\n const absPath = resolve(docDir, filename)\n if (visited.has(absPath)) continue\n visited.add(absPath)\n let mergedText: string\n try {\n mergedText = readFileSync(absPath, 'utf-8')\n } catch {\n continue\n }\n const mergedTree = parseSync('behavior', mergedText)\n if (!mergedTree) continue\n nodesOfType(mergedTree, 'state_decl').forEach(n => {\n const name = n.childForFieldName('name')?.text\n if (name) states.add(name)\n })\n collectMergedStates(mergedTree, dirname(absPath), states, visited)\n }\n}\n\nexport async function lintBehavior(\n text: string,\n file = 'agent.behavior',\n docPath?: string\n): Promise<LintMessage[]> {\n await initBehaviorParser()\n if (!text.endsWith('\\n')) text = text + '\\n'\n const tree = await parse('behavior', text)\n const messages: LintMessage[] = []\n\n // Rule 0: syntax errors\n collectSyntaxErrors(tree.rootNode, messages, file)\n\n for (const stateNode of nodesOfType(tree, 'state_decl')) {\n if (stateNode.hasError) continue\n const nameNode = stateNode.childForFieldName('name')\n const stateName = nameNode?.text ?? '?'\n const hasInteract = stateNode.descendantsOfType('interact_stmt').length > 0\n const hasGoal = stateNode.descendantsOfType('goal_stmt').length > 0\n const intentHandlers = stateNode.descendantsOfType('intent_handler')\n\n // W013: interact without goal (supersedes E008 — downgraded to warning)\n if (hasInteract && !hasGoal) {\n const { line, col } = nodePosition(nameNode ?? stateNode)\n messages.push({\n file, line, col, severity: 'warning', code: 'W013',\n message: `'interact' without 'goal' — the prettifier will insert one. To set it explicitly, add 'goal \"...\"' before 'interact'.`,\n })\n }\n\n // W012: goal without interact\n if (hasGoal && !hasInteract) {\n const { line, col } = nodePosition(nameNode ?? stateNode)\n messages.push({\n file, line, col, severity: 'warning', code: 'W012',\n message: `'goal' is only valid in an oriented state. Add 'interact' or remove 'goal' — the prettifier can adjust this.`,\n })\n }\n\n // E009: oriented state with no on intent handlers\n if (hasInteract && intentHandlers.length === 0) {\n const { line, col } = nodePosition(nameNode ?? stateNode)\n messages.push({\n file, line, col, severity: 'error', code: 'E009',\n message: `Oriented state '${stateName}' has no 'on intent' handlers. At least one is required.`,\n })\n }\n\n // W008: duplicate on intent label in same state (Error-level per spec)\n const seenIntents = new Map<string, true>()\n for (const handler of intentHandlers) {\n const intentNode = handler.childForFieldName('intent')\n if (!intentNode) continue\n const label = intentNode.text.replace(/^\"|\"$/g, '')\n if (seenIntents.has(label)) {\n const { line, col } = nodePosition(handler)\n messages.push({\n file, line, col, severity: 'error', code: 'W008',\n message: `Duplicate 'on intent \"${label}\"' in state '${stateName}'. The FSM cannot route ambiguous intents — use a unique label for each handler.`,\n })\n } else {\n seenIntents.set(label, true)\n }\n }\n\n // W011: on intent handler transitions to its own enclosing state\n for (const handler of intentHandlers) {\n for (const t of handler.descendantsOfType('transition_stmt')) {\n const targetNode = t.childForFieldName('state')\n if (targetNode?.text === stateName) {\n const { line, col } = nodePosition(handler)\n messages.push({\n file, line, col, severity: 'warning', code: 'W011',\n message: `'on intent' handler in state '${stateName}' transitions back to itself. The user expressed an intent but receives no progress — did you mean a different target state?`,\n })\n }\n }\n }\n\n // I001/I002: state overrides kernel lifecycle\n if (stateName === 'init' || stateName === 'end') {\n const { line, col } = nodePosition(nameNode ?? stateNode)\n if (stateName === 'init') {\n messages.push({\n file, line, col, severity: 'info', code: 'I001',\n message: `State 'init' overrides the kernel's default entry lifecycle. The kernel will use this definition instead of its built-in init sequence.`,\n })\n } else {\n messages.push({\n file, line, col, severity: 'info', code: 'I002',\n message: `State 'end' overrides the kernel's default terminal lifecycle. The kernel will treat this state as the canonical exit point.`,\n })\n }\n }\n\n // H001: state name close to (but not exact match of) kernel lifecycle names\n if (!KERNEL_LIFECYCLE_NAMES.includes(stateName)) {\n const closest = closestName(stateName, KERNEL_LIFECYCLE_NAMES)\n if (closest) {\n const { line, col } = nodePosition(nameNode ?? stateNode)\n messages.push({\n file, line, col, severity: 'hint', code: 'H001',\n message: `State name '${stateName}' resembles the kernel lifecycle name '${closest}'. If this is intentional, ignore this hint.`,\n })\n }\n }\n }\n\n // E010: parallel block with no run statements\n for (const parallelNode of nodesOfType(tree, 'parallel_stmt')) {\n if (parallelNode.hasError) continue\n if (parallelNode.descendantsOfType('run_stmt').length === 0) {\n const { line, col } = nodePosition(parallelNode)\n let stateName = '?'\n let ancestor = parallelNode.parent\n while (ancestor && ancestor.type !== 'state_decl') ancestor = ancestor.parent\n if (ancestor) stateName = ancestor.childForFieldName('name')?.text ?? '?'\n messages.push({\n file, line, col, severity: 'warning', code: 'E010',\n message: `'parallel' block in state '${stateName}' has no 'run' statements and does nothing.`,\n })\n }\n }\n\n // E011: after statement with prompts: 0\n for (const afterNode of nodesOfType(tree, 'after_stmt')) {\n if (afterNode.hasError) continue\n const countNode = afterNode.childForFieldName('count')\n if (countNode?.text === '0') {\n const { line, col } = nodePosition(countNode)\n messages.push({\n file, line, col, severity: 'error', code: 'E011',\n message: `'after 0' is invalid — prompts must be ≥ 1. Use 'after 1' for the next prompt.`,\n })\n }\n }\n\n // W002: goal_stmt text > 280 chars\n for (const stmtNode of nodesOfType(tree, 'goal_stmt')) {\n const strNode = stmtNode.descendantsOfType('quoted_string').find((n): n is Node => n !== null)\n if (!strNode) continue\n const content = strNode.text.replace(/^\"|\"$/g, '')\n if (content.length > 280) {\n const { line, col } = nodePosition(strNode)\n messages.push({\n file, line, col, severity: 'warning', code: 'W002',\n message: `Text block exceeds 280 characters (${content.length}). Consider using 'teach' to load long goal text from an external file.`,\n })\n }\n }\n\n // W010: guide_stmt text > 280 chars\n for (const stmtNode of nodesOfType(tree, 'guide_stmt')) {\n const strNode = stmtNode.descendantsOfType('quoted_string').find((n): n is Node => n !== null)\n if (!strNode) continue\n const content = strNode.text.replace(/^\"|\"$/g, '')\n if (content.length > 280) {\n const { line, col } = nodePosition(strNode)\n let p = stmtNode.parent\n while (p && p.type !== 'state_decl') p = p.parent\n const stateName = p?.childForFieldName('name')?.text ?? '?'\n messages.push({\n file, line, col, severity: 'warning', code: 'W010',\n message: `'guide' text in state '${stateName}' is ${content.length} characters (limit: 280). Consider using an external file.`,\n })\n }\n }\n\n // E005/W005: dangling transitions — state not defined (H002: hint with closest name)\n const definedStates = new Set(\n nodesOfType(tree, 'state_decl')\n .map(n => n.childForFieldName('name')?.text)\n .filter(Boolean) as string[]\n )\n\n if (docPath) {\n try {\n collectMergedStates(tree, dirname(docPath), definedStates)\n } catch {\n // path resolution failed — continue with local states only\n }\n }\n\n const stateNameList = Array.from(definedStates)\n for (const transitionNode of nodesOfType(tree, 'transition_stmt')) {\n const stateNode = transitionNode.childForFieldName('state')\n if (!stateNode) continue\n const target = stateNode.text\n if (!definedStates.has(target)) {\n const { line, col } = nodePosition(stateNode)\n const isExternal = target.includes('.')\n // H002: enrich E005 with closest state name suggestion\n const hint = !isExternal ? closestName(target, stateNameList) : undefined\n messages.push({\n file, line, col,\n severity: isExternal ? 'warning' : 'error',\n code: isExternal ? 'W005' : 'E005',\n message: isExternal\n ? `State '${target}' is not defined locally (assuming external flow reference).`\n : `State '${target}' is not defined in this file.`,\n ...(hint ? { hint: `did you mean '${hint}'?` } : {}),\n })\n }\n }\n\n // W006: dead-end interact (no handlers at all)\n for (const interactNode of nodesOfType(tree, 'interact_stmt')) {\n let ancestor = interactNode.parent\n while (ancestor && ancestor.type !== 'state_decl') ancestor = ancestor.parent\n if (!ancestor) continue\n const hasHandlers =\n ancestor.descendantsOfType('intent_handler').length +\n ancestor.descendantsOfType('offtopic_handler').length > 0\n if (!hasHandlers) {\n const { line, col } = nodePosition(interactNode)\n messages.push({\n file, line, col, severity: 'warning', code: 'W006',\n message: 'This state calls interact but has no handlers (on intent/offtopic). This will trap the agent.',\n })\n }\n }\n\n // Semantic FSM validation via behavior-parser WASM\n const fsmResult = parseBehaviorFile(text)\n if (fsmResult.ok === null) {\n const firstMsg = fsmResult.diagnostics[0]?.message ?? 'Parse error'\n messages.push({\n file, line: 1, col: 1, severity: 'error', code: 'E006',\n message: `Parse error: ${firstMsg}`,\n })\n return messages\n }\n\n const fsm = fsmResult.ok\n const allTargets = new Set(collectTransitionTargets(fsm.states.flatMap(s => s.body)))\n\n // W001: isolated state (no incoming and no outgoing transitions)\n for (const state of fsm.states) {\n const hasOutgoing = collectTransitionTargets(state.body).length > 0\n const hasIncoming = allTargets.has(state.name)\n if (!hasIncoming && !hasOutgoing) {\n messages.push({\n file, line: 1, col: 1, severity: 'warning', code: 'W001',\n message: `State \"${state.name}\" has no transitions`,\n })\n }\n }\n\n // W009: unreachable state (no incoming transitions, not the first state)\n for (let i = 1; i < fsm.states.length; i++) {\n const state = fsm.states[i]\n if (!allTargets.has(state.name)) {\n const stateNode = nodesOfType(tree, 'state_decl')\n .find(n => n.childForFieldName('name')?.text === state.name)\n const pos = stateNode ? nodePosition(stateNode) : { line: 1, col: 1 }\n messages.push({\n file, line: pos.line, col: pos.col, severity: 'warning', code: 'W009',\n message: `State '${state.name}' is unreachable — no other state transitions to it.`,\n })\n }\n }\n\n return messages\n}\n\nexport async function createLinter() {\n return { lintDescription, lintBehavior }\n}\n","// Copyright 2026 Danilo Borges\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n\nimport type { AboutMe, BuildAboutmeOptions } from './types.js'\n\nexport function parseAboutme(json: any): AboutMe {\n if (!json.schemaVersion) throw new Error('Missing schemaVersion in aboutme.json')\n if (!json.id) throw new Error('Missing id in aboutme.json')\n if (!json.name) throw new Error('Missing name in aboutme.json')\n if (!json.description) throw new Error('Missing description in aboutme.json')\n if (!json.version) throw new Error('Missing version in aboutme.json')\n if (!json.domain) throw new Error('Missing domain in aboutme.json')\n if (!json.persona) throw new Error('Missing persona in aboutme.json')\n if (!json.compiler) throw new Error('Missing compiler in aboutme.json')\n if (!Array.isArray(json.capabilities)) throw new Error('Missing capabilities array in aboutme.json')\n if (!Array.isArray(json.requires)) throw new Error('Missing requires array in aboutme.json')\n if (!json.integrity) throw new Error('Missing integrity in aboutme.json')\n\n return {\n schemaVersion: json.schemaVersion,\n id: json.id,\n name: json.name,\n description: json.description,\n version: json.version,\n domain: json.domain,\n license: json.license ?? '',\n persona: json.persona,\n purpose: json.purpose ?? 'unknown',\n compiler: json.compiler,\n commit: json.commit,\n capabilities: json.capabilities,\n requires: json.requires,\n integrity: json.integrity,\n }\n}\n\nexport function buildAboutme(opts: BuildAboutmeOptions): AboutMe {\n return {\n schemaVersion: 'dot-agent/1.0',\n id: opts.id,\n name: opts.name,\n description: opts.description,\n version: opts.version,\n domain: opts.domain,\n license: opts.license ?? '',\n persona: opts.persona,\n purpose: opts.purpose ?? 'unknown',\n compiler: opts.compiler,\n commit: opts.commit,\n capabilities: opts.capabilities ?? [],\n requires: opts.requires ?? [],\n integrity: opts.integrity,\n }\n}\n\nexport function aboutmeToJson(aboutme: AboutMe): string {\n return JSON.stringify(aboutme, null, 2)\n}\n","// Copyright 2026 Danilo Borges\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport type { IdParts } from './types.js'\n\n// Code hosting platforms whose namespace format is platform/user rather than plain domain.\n// The list is maintained by the compiler and updated via CLI releases.\nexport const KNOWN_PLATFORMS = ['github.com', 'gitlab.com', 'codeberg.org', 'sr.ht'] as const\n\nfunction parseNamespaceName(identifier: string): { namespace: string; name: string } {\n // Email namespace: @ appears before any /\n const atIdx = identifier.indexOf('@')\n if (atIdx !== -1 && (identifier.indexOf('/') === -1 || atIdx < identifier.indexOf('/'))) {\n const slashIdx = identifier.indexOf('/')\n if (slashIdx === -1) {\n throw new Error(`Invalid agent ID: email namespace requires a name after '/' (got '${identifier}')`)\n }\n return {\n namespace: identifier.slice(0, slashIdx),\n name: identifier.slice(slashIdx + 1),\n }\n }\n\n // Known code-hosting platforms: namespace is platform/user, name is the next segment.\n for (const platform of KNOWN_PLATFORMS) {\n if (identifier.startsWith(platform + '/')) {\n const afterPlatform = identifier.slice(platform.length + 1)\n const slashIdx = afterPlatform.indexOf('/')\n if (slashIdx === -1) {\n throw new Error(\n `Invalid agent ID: '${platform}' namespace requires a user segment and a name (got '${identifier}')`,\n )\n }\n return {\n namespace: platform + '/' + afterPlatform.slice(0, slashIdx),\n name: afterPlatform.slice(slashIdx + 1),\n }\n }\n }\n\n // Domain or reserved keyword (e.g. 'unknown'): last '/' separates namespace from name.\n const lastSlash = identifier.lastIndexOf('/')\n if (lastSlash === -1) {\n throw new Error(`Invalid agent ID: missing '/' separator in '${identifier}'`)\n }\n return {\n namespace: identifier.slice(0, lastSlash),\n name: identifier.slice(lastSlash + 1),\n }\n}\n\nexport function parseId(id: string): IdParts {\n if (!id) throw new Error('Invalid agent ID: empty string')\n\n // Phase 1: split on the first ':' to isolate the identifier from version~digest.\n const colonIdx = id.indexOf(':')\n\n let identifier: string\n let version: string | undefined\n let digest: string | undefined\n\n if (colonIdx === -1) {\n // Form A: namespace/name\n identifier = id\n } else {\n identifier = id.slice(0, colonIdx)\n const rest = id.slice(colonIdx + 1)\n if (!rest) throw new Error(`Invalid agent ID: empty version after ':' in '${id}'`)\n\n // Phase 2: split version~digest\n const tildeIdx = rest.indexOf('~')\n if (tildeIdx === -1) {\n // Form B: namespace/name:version\n version = rest\n } else {\n // Form D: namespace/name:version~digest\n version = rest.slice(0, tildeIdx)\n digest = rest.slice(tildeIdx + 1)\n if (!version) throw new Error(`Invalid agent ID: empty version before '~' in '${id}'`)\n if (!digest) throw new Error(`Invalid agent ID: empty digest after '~' in '${id}'`)\n }\n }\n\n // Phase 3: extract namespace and name from the identifier\n const { namespace, name } = parseNamespaceName(identifier)\n\n if (!namespace) throw new Error(`Invalid agent ID: empty namespace in '${id}'`)\n if (!name) throw new Error(`Invalid agent ID: empty name in '${id}'`)\n\n return { namespace, name, version, digest }\n}\n\nexport function buildId(parts: IdParts): string {\n const { namespace, name, version, digest } = parts\n if (!namespace || !name) {\n throw new Error('Missing required ID parts: namespace and name')\n }\n if (digest && !version) {\n throw new Error('Invalid ID parts: digest requires version')\n }\n let result = `${namespace}/${name}`\n if (version) {\n result += `:${version}`\n if (digest) result += `~${digest}`\n }\n return result\n}\n\nexport function extractDigest(id: string): string {\n try {\n return parseId(id).digest ?? ''\n } catch {\n return ''\n }\n}\n\nexport function extractName(id: string): string {\n try {\n return parseId(id).name\n } catch {\n return ''\n }\n}\n","// Copyright 2026 Danilo Borges\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport JSZip from 'jszip'\nimport { readFile, writeFile } from 'fs/promises'\nexport { createZip, extractFiles } from './zip-core.js'\n\nconst MAX_ZIP_SIZE = 500 * 1024 * 1024\nconst MAX_COMPRESSION_RATIO = 100\n\nexport async function readZip(filePath: string): Promise<JSZip> {\n const data = await readFile(filePath)\n return JSZip.loadAsync(data)\n}\n\nexport async function validateZipBomb(filePath: string): Promise<boolean> {\n const data = await readFile(filePath)\n const zip = await JSZip.loadAsync(data)\n\n let totalUncompressed = 0\n zip.forEach((_relativePath, file) => {\n if (!file.dir) {\n totalUncompressed += (file as any)._data?.uncompressedSize || 0\n }\n })\n\n const compressedSize = data.length\n const ratio = totalUncompressed / compressedSize\n\n if (totalUncompressed > MAX_ZIP_SIZE) {\n throw new Error(`ZIP uncompressed size exceeds 500MB limit: ${totalUncompressed}`)\n }\n\n if (ratio > MAX_COMPRESSION_RATIO) {\n throw new Error(`ZIP compression ratio exceeds 100x limit: ${ratio.toFixed(1)}x`)\n }\n\n return true\n}\n\nexport async function validateMagicBytes(filePath: string): Promise<boolean> {\n const data = await readFile(filePath)\n const magic = data.subarray(0, 4)\n if (!(magic[0] === 0x50 && magic[1] === 0x4b && magic[2] === 0x03 && magic[3] === 0x04)) {\n throw new Error('File is not a valid ZIP (invalid magic bytes)')\n }\n return true\n}\n\nexport async function writeZip(zip: JSZip, outPath: string): Promise<void> {\n const data = await zip.generateAsync({ type: 'arraybuffer' })\n await writeFile(outPath, Buffer.from(data))\n}\n","// Copyright 2026 Danilo Borges\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport JSZip from 'jszip'\n\nexport function createZip(): JSZip {\n return new JSZip()\n}\n\nexport async function extractFiles(zip: JSZip, filter?: string[]): Promise<Map<string, string>> {\n const files = new Map<string, string>()\n const promises: Promise<void>[] = []\n\n zip.forEach((relativePath, file) => {\n if (file.dir) return\n if (filter && !filter.some(f => relativePath.startsWith(f))) return\n promises.push(\n file.async('text').then(content => {\n files.set(relativePath, content)\n })\n )\n })\n\n await Promise.all(promises)\n return files\n}\n","// Copyright 2026 Danilo Borges\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n\nimport { readFile, stat, readdir } from 'fs/promises'\nimport { join, basename } from 'path'\nimport { execSync } from 'child_process'\nimport { createHash } from 'crypto'\nimport JSZip from 'jszip'\nimport type { PackOptions, PackResult } from './types.js'\nimport { lintDescription, lintBehavior } from './linter.js'\nimport { buildId } from './id.js'\nimport { buildAboutme, aboutmeToJson } from './manifest.js'\nimport { initBehaviorParser, parseDescriptionFile } from './parser.js'\nimport { buildTypesJson } from './schema.js'\nimport { writeZip } from './zip.js'\n\nfunction gitDescribeTags(): string | null {\n try {\n return execSync('git describe --tags --abbrev=0', { stdio: 'pipe', encoding: 'utf-8' }).trim()\n } catch {\n return null\n }\n}\n\nfunction gitRevParseShort(): string | null {\n try {\n return execSync('git rev-parse --short HEAD', { stdio: 'pipe', encoding: 'utf-8' }).trim()\n } catch {\n return null\n }\n}\n\nasync function resolveVersion(explicit?: string): Promise<string> {\n if (explicit) return explicit\n return gitDescribeTags() ?? 'v1.0.0'\n}\n\nasync function resolveCommit(explicit?: string): Promise<string | undefined> {\n if (explicit) return explicit\n return gitRevParseShort() ?? undefined\n}\n\nexport async function collectFiles(dir: string): Promise<Map<string, string>> {\n const files = new Map<string, string>()\n\n async function walk(subdir: string, prefix = '') {\n try {\n const entries = await readdir(subdir)\n for (const entry of entries) {\n if (entry === '.gitkeep' || entry.startsWith('.')) continue\n const fullPath = join(subdir, entry)\n const stats = await stat(fullPath)\n const relativePath = prefix ? `${prefix}/${entry}` : entry\n if (stats.isDirectory()) {\n await walk(fullPath, relativePath)\n } else {\n files.set(relativePath, await readFile(fullPath, 'utf-8'))\n }\n }\n } catch {\n // directory doesn't exist or can't be read\n }\n }\n\n files.set('agent.description', await readFile(join(dir, 'agent.description'), 'utf-8'))\n files.set('agent.behavior', await readFile(join(dir, 'agent.behavior'), 'utf-8'))\n\n try {\n files.set('SOUL.md', await readFile(join(dir, 'SOUL.md'), 'utf-8'))\n } catch {\n // optional\n }\n\n await walk(join(dir, 'behaviors'), 'behaviors')\n await walk(join(dir, 'guides'), 'guides')\n await walk(join(dir, 'knowledge'), 'knowledge')\n\n return files\n}\n\nexport async function pack(options: PackOptions = {}): Promise<PackResult> {\n const dir = options.dir ?? process.cwd()\n const outPath = options.out ?? join(dir, `${basename(dir)}.agent`)\n\n let descriptionText: string\n let behaviorText: string\n\n try {\n descriptionText = await readFile(join(dir, 'agent.description'), 'utf-8')\n } catch {\n throw new Error('E003: File agent.description not found')\n }\n\n try {\n behaviorText = await readFile(join(dir, 'agent.behavior'), 'utf-8')\n } catch {\n throw new Error('E007: File agent.behavior not found')\n }\n\n const [descriptionMessages, behaviorMessages] = await Promise.all([\n lintDescription(descriptionText),\n lintBehavior(behaviorText),\n ])\n\n const allMessages = [...descriptionMessages, ...behaviorMessages]\n const errors = allMessages.filter(m => m.severity === 'error')\n const warnings = allMessages.filter(m => m.severity === 'warning')\n\n if (errors.length > 0) {\n throw new Error(\n `Lint failed:\\n${errors.map(e => ` ${e.file}:${e.line}:${e.col} ${e.code} ${e.message}`).join('\\n')}`\n )\n }\n\n await initBehaviorParser()\n const descResult = parseDescriptionFile(descriptionText)\n if (descResult.ok === null) {\n const firstError = descResult.diagnostics.find(d => d.severity === 'error')\n throw new Error(`E_DESC: ${firstError?.message ?? 'parse failed'}`)\n }\n const df = descResult.ok\n\n const version = await resolveVersion(options.version)\n const commit = await resolveCommit(options.commit)\n const allFiles = await collectFiles(dir)\n\n const contentForHash = Array.from(allFiles.values()).join('')\n const sha256 = createHash('sha256').update(contentForHash).digest('hex')\n\n const namespace = df.agent.domain ?? 'unknown'\n const id = buildId({ namespace, name: df.agent.name, version, digest: commit })\n\n const typesJson = buildTypesJson(df)\n const integrity = {\n sha256,\n ...(typesJson ? { types: '.agent/types.json' } : {}),\n files: '.agent/files.json',\n }\n\n const aboutme = buildAboutme({\n id,\n name: df.agent.name,\n description: df.description ?? '',\n version,\n domain: df.agent.domain ?? '',\n license: df.agent.license ?? '',\n persona: df.persona ?? 'SOUL.md',\n purpose: 'unknown',\n compiler: 'dot-agent/1.0.0',\n commit,\n capabilities: df.capabilities.map(c => ({ id: c.name, description: c.description ?? '' })),\n requires: df.requires,\n integrity,\n })\n\n const zip = new JSZip()\n const agentFolder = zip.folder('.agent')!\n agentFolder.file('aboutme.json', aboutmeToJson(aboutme))\n\n if (typesJson) {\n agentFolder.file('types.json', typesJson)\n }\n\n const gitkeepPaths = new Set(['behaviors/.gitkeep', 'guides/.gitkeep', 'knowledge/.gitkeep'])\n const filesJson = {\n description: 'agent.description',\n behavior: 'agent.behavior',\n behaviors: Array.from(allFiles.keys()).filter(f => f.startsWith('behaviors/') && !gitkeepPaths.has(f)),\n guides: Array.from(allFiles.keys()).filter(f => f.startsWith('guides/') && !gitkeepPaths.has(f)),\n knowledge: Array.from(allFiles.keys()).filter(f => f.startsWith('knowledge/') && !gitkeepPaths.has(f)),\n }\n agentFolder.file('files.json', JSON.stringify(filesJson, null, 2))\n\n for (const [path, content] of allFiles) {\n if (!gitkeepPaths.has(path)) zip.file(path, content)\n }\n\n await writeZip(zip, outPath)\n\n return { path: outPath, id, warnings }\n}\n","// Copyright 2026 Danilo Borges\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n\nimport type { DescriptionFile, TypeDefinition, PropertyType, AnnotatedRef } from './types.js'\n\nconst STD_BASE = 'https://dot-agent.dev/schema/std/v1/'\n\nfunction propertyTypeToSchema(pt: PropertyType): object {\n switch (pt.kind) {\n case 'primitive':\n return { type: pt.value }\n case 'reference':\n return pt.value.startsWith('std.')\n ? { $ref: `${STD_BASE}${pt.value.slice(4)}.json` }\n : { $ref: `#/$defs/${pt.value}` }\n case 'array':\n return { type: 'array', items: propertyTypeToSchema(pt.value) }\n case 'enum':\n return { type: 'string', enum: pt.value }\n }\n}\n\nfunction typeDefinitionToSchema(td: TypeDefinition): object {\n const required = td.properties.filter(p => !p.is_optional).map(p => p.name)\n const properties: Record<string, object> = {}\n for (const p of td.properties) {\n properties[p.name] = {\n ...propertyTypeToSchema(p.type),\n ...(p.description ? { description: p.description } : {}),\n }\n }\n return {\n $schema: 'https://json-schema.org/draft/2020-12/schema',\n 'x-category': td.category.uri,\n ...(td.category.label ? { 'x-category-label': td.category.label } : {}),\n ...(td.concept ? { 'x-concept': td.concept.uri } : {}),\n ...(td.concept?.label ? { 'x-concept-label': td.concept.label } : {}),\n type: 'object',\n properties,\n ...(required.length ? { required } : {}),\n }\n}\n\nfunction refFromAnnotatedRef(ref: AnnotatedRef): object {\n return ref.name.startsWith('std.')\n ? { $ref: `${STD_BASE}${ref.name.slice(4)}.json` }\n : { $ref: `#/$defs/${ref.name}` }\n}\n\n/** Returns JSON Schema 2020-12 string for types.json, or null if nothing to write. */\nexport function buildTypesJson(df: DescriptionFile): string | null {\n if (df.types.length === 0 && df.input.length === 0 && df.output.length === 0) return null\n\n const defs: Record<string, object> = {}\n for (const td of df.types) {\n defs[td.name] = typeDefinitionToSchema(td)\n }\n\n return JSON.stringify(\n {\n ...(df.input.length ? { input: df.input.map(refFromAnnotatedRef) } : {}),\n ...(df.output.length ? { output: df.output.map(refFromAnnotatedRef) } : {}),\n ...(Object.keys(defs).length ? { $defs: defs } : {}),\n },\n null,\n 2\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACKA,IAAM,mBAAmB,MACvB,OAAO,aAAa,cAChB,IAAI,IAAI,QAAQ,UAAU,EAAE,EAAE,OAC7B,SAAS,iBAAiB,SAAS,cAAc,QAAQ,YAAY,MAAM,WAC1E,SAAS,cAAc,MACvB,IAAI,IAAI,WAAW,SAAS,OAAO,EAAE;AAEtC,IAAM,gBAAgC,iCAAiB;;;ACJ9D,oBAA8B;AAC9B,6BAAiC;AAGjC,wBAA8G;AAE9G,IAAMA,eAAU,6BAAc,aAAe;AAC7C,IAAM,EAAE,qBAAqB,iBAAiB,IAAIA,SAAQ,wBAAwB;AAKlF,IAAI,eAAe;AACnB,IAAI;AACJ,IAAI;AACJ,IAAI,iBAAiB;AAErB,eAAsB,qBAAoC;AACxD,MAAI,eAAgB;AACpB,YAAM,kBAAAC,SAAO;AACb,mBAAiB;AACnB;AAOO,SAAS,kBAAkB,MAAyC;AACzE,SAAO,KAAK,UAAM,kBAAAC,gBAAgB,IAAI,CAAC;AACzC;AAEO,SAAS,qBAAqB,MAA4C;AAC/E,SAAO,KAAK,UAAM,kBAAAC,mBAAmB,IAAI,CAAC;AAC5C;AAEO,SAAS,iBAAiB,MAAsB;AACrD,aAAO,6BAAU,IAAI;AACvB;AAEA,eAAsB,cAA6B;AACjD,MAAI,aAAc;AAClB,QAAM,8BAAO,KAAK;AAClB,QAAM,kBAAkB,MAAM,gCAAS,KAAK,mBAAmB;AAC/D,QAAM,eAAe,MAAM,gCAAS,KAAK,gBAAgB;AACzD,uBAAqB,IAAI,8BAAO;AAChC,qBAAmB,YAAY,eAAe;AAC9C,oBAAkB,IAAI,8BAAO;AAC7B,kBAAgB,YAAY,YAAY;AACxC,iBAAe;AACjB;AASA,eAAsB,MACpB,QACA,MACA,cACe;AACf,QAAM,YAAY;AAClB,QAAM,SAAS,WAAW,aAAa,kBAAkB;AACzD,SAAO,OAAO,MAAM,MAAM,YAAY;AACxC;AAGO,SAAS,UAAU,QAAgB,MAAc,cAAkC;AACxF,MAAI,CAAC,aAAc,QAAO;AAC1B,QAAM,SAAS,WAAW,aAAa,kBAAkB;AACzD,SAAO,OAAO,MAAM,MAAM,YAAY;AACxC;AAIO,SAAS,YAAY,MAAY,MAAsB;AAC5D,MAAI,CAAC,KAAM,QAAO,CAAC;AACnB,SAAO,KAAK,SAAS,kBAAkB,IAAI,EAAE,OAAO,CAAC,MAAiB,MAAM,IAAI;AAClF;AAEO,SAAS,aAAa,MAAY,QAA6B;AACpE,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,KAAK,SAAS,mBAAmB,MAAM;AAChD;AAEO,SAAS,YAAY,MAG1B;AACA,SAAO;AAAA,IACL,OAAO,EAAE,MAAM,KAAK,cAAc,KAAK,WAAW,KAAK,cAAc,OAAO;AAAA,IAC5E,KAAK,EAAE,MAAM,KAAK,YAAY,KAAK,WAAW,KAAK,YAAY,OAAO;AAAA,EACxE;AACF;AAEO,SAAS,iBAAiB,MAAc,MAAc,WAA2B;AACtF,MAAI,SAAS;AACb,WAAS,IAAI,GAAG,IAAI,MAAM,KAAK;AAC7B,UAAM,KAAK,KAAK,QAAQ,MAAM,MAAM;AACpC,aAAS,OAAO,KAAK,KAAK,SAAS,KAAK;AAAA,EAC1C;AACA,SAAO,SAAS;AAClB;AAEO,SAAS,eAAe,MAAY,QAAsB;AAC/D,MAAI,OAAO,aAAa,MAAM,MAAM;AACpC,SAAO,SAAS,KAAK,WAAW,KAAK,YAAY;AAC/C,WAAO,KAAK;AAAA,EACd;AACA,MAAI,CAAC,QAAQ,KAAK,SAAS,SAAS;AAClC,UAAM,MAAM,aAAa,MAAM,MAAM;AACrC,UAAM,SAAS,KAAK;AACpB,QAAI,QAAQ;AACV,YAAM,WAAW,OAAO;AACxB,YAAM,MAAM,SAAS,UAAU,CAAC,MAAmB,MAAM,QAAQ,EAAE,aAAa,MAAM;AACtF,YAAM,OAAO,MAAM,IAAI,SAAS,MAAM,CAAC,IAAI,SAAS,SAAS,SAAS,CAAC;AACvE,UAAI,QAAQ,CAAC,KAAK,QAAS,QAAO;AAAA,IACpC;AAAA,EACF;AACA,SAAO,QAAQ,KAAK;AACtB;;;ACrHA,gBAA6B;AAC7B,kBAAiC;AAKjC,SAAS,aAAa,MAA2C;AAC/D,SAAO,EAAE,MAAM,KAAK,cAAc,MAAM,GAAG,KAAK,KAAK,cAAc,SAAS,EAAE;AAChF;AAIA,IAAM,gBAAwC;AAAA,EAC5C,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,eAAe;AACjB;AAEA,SAAS,oBAAoB,MAAY,UAAyB,MAAoB;AACpF,QAAM,OAAO,oBAAI,IAAY;AAE7B,WAAS,KAAK,MAAY,SAAiB,MAAc,WAAgC,SAAS;AAChG,UAAM,MAAM,GAAG,KAAK,UAAU,IAAI,KAAK,QAAQ,IAAI,OAAO;AAC1D,QAAI,KAAK,IAAI,GAAG,EAAG;AACnB,SAAK,IAAI,GAAG;AACZ,UAAM,EAAE,MAAM,IAAI,IAAI,aAAa,IAAI;AACvC,aAAS,KAAK,EAAE,MAAM,MAAM,KAAK,UAAU,MAAM,QAAQ,CAAC;AAAA,EAC5D;AAEA,WAAS,KAAK,MAAY;AACxB,QAAI,KAAK,WAAW;AAClB,YAAM,OAAO,cAAc,KAAK,IAAI;AACpC,WAAK,MAAM,QAAQ,0BAA0B,KAAK,IAAI,MAAM,MAAM;AAClE;AAAA,IACF;AACA,QAAI,KAAK,SAAS,SAAS;AACzB,YAAM,iBAAiB,KAAK,kBAAkB,OAAO,EAAE,KAAK,CAAC,MAAmB,MAAM,QAAQ,EAAE,OAAO,KAAK,EAAE;AAC9G,UAAI,CAAC,gBAAgB;AACnB,cAAM,UAAU,KAAK,KAAK,QAAQ,QAAQ,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,EAAE;AACjE,aAAK,MAAM,UAAU,sBAAsB,OAAO,OAAO,iBAAiB,MAAM;AAChF;AAAA,MACF;AAAA,IACF;AACA,eAAW,SAAS,KAAK,UAAU;AACjC,UAAI,MAAO,MAAK,KAAK;AAAA,IACvB;AAAA,EACF;AAEA,OAAK,IAAI;AACX;AAIA,IAAM,qBAA6C;AAAA,EACjD,aAAa;AAAA,EACb,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,oBAAoB;AACtB;AAEA,eAAsB,gBAAgB,MAAc,OAAO,qBAA6C;AACtG,QAAM,OAAO,MAAM,MAAM,eAAe,IAAI;AAC5C,QAAM,WAA0B,CAAC;AAEjC,sBAAoB,KAAK,UAAU,UAAU,IAAI;AAIjD,aAAW,YAAY,YAAY,MAAM,YAAY,GAAG;AACtD,UAAM,UAAU,SAAS,kBAAkB,KAAK;AAChD,QAAI,SAAS,SAAS,SAAU;AAChC,UAAM,YAAY,SAAS,kBAAkB,OAAO;AACpD,QAAI,WAAW,SAAS,eAAe;AACrC,YAAM,EAAE,MAAM,IAAI,IAAI,aAAa,SAAS;AAC5C,eAAS,KAAK;AAAA,QACZ;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU;AAAA,QACV,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AAGA,QAAM,YAAY,YAAY,MAAM,YAAY,EAAE;AAAA,IAChD,OAAK,EAAE,kBAAkB,KAAK,GAAG,SAAS,YAAY,EAAE,kBAAkB,OAAO,GAAG,MAAM,KAAK;AAAA,EACjG;AACA,MAAI,CAAC,WAAW;AACd,aAAS,KAAK;AAAA,MACZ;AAAA,MACA,MAAM;AAAA,MACN,KAAK;AAAA,MACL,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SACE;AAAA,IACJ,CAAC;AAAA,EACH;AAGA,QAAM,gBAAgB,IAAI;AAAA,IACxB,YAAY,MAAM,WAAW,EAC1B,IAAI,OAAK,EAAE,kBAAkB,MAAM,GAAG,IAAI,EAC1C,OAAO,OAAO;AAAA,EACnB;AAEA,MAAI,cAAc,OAAO,GAAG;AAC1B,eAAW,aAAa,OAAO,KAAK,kBAAkB,GAAG;AACvD,iBAAW,aAAa,YAAY,MAAM,SAAS,GAAG;AACpD,mBAAW,eAAe,UAAU,kBAAkB,gBAAgB,EAAE,OAAO,CAAC,MAAiB,MAAM,IAAI,GAAG;AAC5G,gBAAM,SAAS,YAAY;AAC3B,cAAI,CAAC,OAAQ;AACb,gBAAM,WAAW,OAAO;AACxB,cAAI,CAAC,cAAc,IAAI,QAAQ,GAAG;AAChC,kBAAM,EAAE,MAAM,IAAI,IAAI,aAAa,MAAM;AACzC,qBAAS,KAAK;AAAA,cACZ;AAAA,cACA;AAAA,cACA;AAAA,cACA,UAAU;AAAA,cACV,MAAM;AAAA,cACN,SAAS,SAAS,QAAQ;AAAA,YAC5B,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAIA,SAAS,YAAY,GAAW,GAAmB;AACjD,QAAM,KAAK,EAAE,QAAQ,KAAK,EAAE;AAC5B,QAAM,KAAiB,MAAM;AAAA,IAAK,EAAE,QAAQ,KAAK,EAAE;AAAA,IAAG,CAAC,GAAG,MACxD,MAAM,KAAK,EAAE,QAAQ,KAAK,EAAE,GAAG,CAACC,IAAG,MAAO,MAAM,IAAI,IAAI,MAAM,IAAI,IAAI,CAAE;AAAA,EAC1E;AACA,WAAS,IAAI,GAAG,KAAK,IAAI,KAAK;AAC5B,aAAS,IAAI,GAAG,KAAK,IAAI,KAAK;AAC5B,SAAG,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAC3B,GAAG,IAAI,CAAC,EAAE,IAAI,CAAC,IACf,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;AAAA,IAC/D;AAAA,EACF;AACA,SAAO,GAAG,EAAE,EAAE,EAAE;AAClB;AAEA,SAAS,YAAY,OAAe,YAA0C;AAC5E,MAAI;AACJ,MAAI,WAAW;AACf,aAAW,QAAQ,YAAY;AAC7B,UAAM,IAAI,YAAY,MAAM,YAAY,GAAG,KAAK,YAAY,CAAC;AAC7D,QAAI,IAAI,KAAK,KAAK,KAAK,IAAI,UAAU;AAAE,iBAAW;AAAG,aAAO;AAAA,IAAK;AAAA,EACnE;AACA,SAAO;AACT;AAEA,IAAM,yBAAyB,CAAC,QAAQ,WAAW,OAAO,UAAU,SAAS;AAE7E,SAAS,yBAAyB,OAAgE;AAChG,QAAM,UAAoB,CAAC;AAC3B,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,QAAQ,OAAO,SAAS,SAAU;AACvC,QAAI,KAAK,SAAS,qBAAqB,OAAO,KAAK,OAAO,MAAM,UAAU;AACxE,cAAQ,KAAK,KAAK,OAAO,CAAC;AAAA,IAC5B;AACA,QAAI,KAAK,SAAS,oBAAoB,OAAO,KAAK,MAAM,MAAM,UAAU;AACtE,cAAQ,KAAK,KAAK,MAAM,CAAC;AAAA,IAC3B;AACA,UAAM,UAAU,CAAC,MAAe;AAC9B,UAAI,MAAM,QAAQ,CAAC,EAAG,SAAQ,KAAK,GAAG,yBAAyB,CAA4B,CAAC;AAAA,IAC9F;AACA,QAAI,KAAK,SAAS,iBAAkB,SAAQ,KAAK,MAAM,CAAC;AACxD,YAAQ,KAAK,UAAU,CAAC;AACxB,YAAQ,KAAK,MAAM,CAAC;AACpB,YAAQ,KAAK,MAAM,CAAC;AACpB,YAAQ,KAAK,aAAa,CAAC;AAC3B,YAAQ,KAAK,YAAY,CAAC;AAAA,EAC5B;AACA,SAAO;AACT;AAEA,SAAS,oBACP,MACA,QACA,QACA,UAAU,oBAAI,IAAY,GACpB;AACN,aAAW,aAAa,YAAY,MAAM,YAAY,GAAG;AACvD,UAAM,WAAW,UAAU,kBAAkB,MAAM;AACnD,QAAI,CAAC,SAAU;AACf,UAAM,WAAW,SAAS,KAAK,QAAQ,UAAU,EAAE;AACnD,UAAM,cAAU,qBAAQ,QAAQ,QAAQ;AACxC,QAAI,QAAQ,IAAI,OAAO,EAAG;AAC1B,YAAQ,IAAI,OAAO;AACnB,QAAI;AACJ,QAAI;AACF,uBAAa,wBAAa,SAAS,OAAO;AAAA,IAC5C,QAAQ;AACN;AAAA,IACF;AACA,UAAM,aAAa,UAAU,YAAY,UAAU;AACnD,QAAI,CAAC,WAAY;AACjB,gBAAY,YAAY,YAAY,EAAE,QAAQ,OAAK;AACjD,YAAM,OAAO,EAAE,kBAAkB,MAAM,GAAG;AAC1C,UAAI,KAAM,QAAO,IAAI,IAAI;AAAA,IAC3B,CAAC;AACD,wBAAoB,gBAAY,qBAAQ,OAAO,GAAG,QAAQ,OAAO;AAAA,EACnE;AACF;AAEA,eAAsB,aACpB,MACA,OAAO,kBACP,SACwB;AACxB,QAAM,mBAAmB;AACzB,MAAI,CAAC,KAAK,SAAS,IAAI,EAAG,QAAO,OAAO;AACxC,QAAM,OAAO,MAAM,MAAM,YAAY,IAAI;AACzC,QAAM,WAA0B,CAAC;AAGjC,sBAAoB,KAAK,UAAU,UAAU,IAAI;AAEjD,aAAW,aAAa,YAAY,MAAM,YAAY,GAAG;AACvD,QAAI,UAAU,SAAU;AACxB,UAAM,WAAW,UAAU,kBAAkB,MAAM;AACnD,UAAM,YAAY,UAAU,QAAQ;AACpC,UAAM,cAAc,UAAU,kBAAkB,eAAe,EAAE,SAAS;AAC1E,UAAM,UAAU,UAAU,kBAAkB,WAAW,EAAE,SAAS;AAClE,UAAM,iBAAiB,UAAU,kBAAkB,gBAAgB;AAGnE,QAAI,eAAe,CAAC,SAAS;AAC3B,YAAM,EAAE,MAAM,IAAI,IAAI,aAAa,YAAY,SAAS;AACxD,eAAS,KAAK;AAAA,QACZ;AAAA,QAAM;AAAA,QAAM;AAAA,QAAK,UAAU;AAAA,QAAW,MAAM;AAAA,QAC5C,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAGA,QAAI,WAAW,CAAC,aAAa;AAC3B,YAAM,EAAE,MAAM,IAAI,IAAI,aAAa,YAAY,SAAS;AACxD,eAAS,KAAK;AAAA,QACZ;AAAA,QAAM;AAAA,QAAM;AAAA,QAAK,UAAU;AAAA,QAAW,MAAM;AAAA,QAC5C,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAGA,QAAI,eAAe,eAAe,WAAW,GAAG;AAC9C,YAAM,EAAE,MAAM,IAAI,IAAI,aAAa,YAAY,SAAS;AACxD,eAAS,KAAK;AAAA,QACZ;AAAA,QAAM;AAAA,QAAM;AAAA,QAAK,UAAU;AAAA,QAAS,MAAM;AAAA,QAC1C,SAAS,mBAAmB,SAAS;AAAA,MACvC,CAAC;AAAA,IACH;AAGA,UAAM,cAAc,oBAAI,IAAkB;AAC1C,eAAW,WAAW,gBAAgB;AACpC,YAAM,aAAa,QAAQ,kBAAkB,QAAQ;AACrD,UAAI,CAAC,WAAY;AACjB,YAAM,QAAQ,WAAW,KAAK,QAAQ,UAAU,EAAE;AAClD,UAAI,YAAY,IAAI,KAAK,GAAG;AAC1B,cAAM,EAAE,MAAM,IAAI,IAAI,aAAa,OAAO;AAC1C,iBAAS,KAAK;AAAA,UACZ;AAAA,UAAM;AAAA,UAAM;AAAA,UAAK,UAAU;AAAA,UAAS,MAAM;AAAA,UAC1C,SAAS,yBAAyB,KAAK,gBAAgB,SAAS;AAAA,QAClE,CAAC;AAAA,MACH,OAAO;AACL,oBAAY,IAAI,OAAO,IAAI;AAAA,MAC7B;AAAA,IACF;AAGA,eAAW,WAAW,gBAAgB;AACpC,iBAAW,KAAK,QAAQ,kBAAkB,iBAAiB,GAAG;AAC5D,cAAM,aAAa,EAAE,kBAAkB,OAAO;AAC9C,YAAI,YAAY,SAAS,WAAW;AAClC,gBAAM,EAAE,MAAM,IAAI,IAAI,aAAa,OAAO;AAC1C,mBAAS,KAAK;AAAA,YACZ;AAAA,YAAM;AAAA,YAAM;AAAA,YAAK,UAAU;AAAA,YAAW,MAAM;AAAA,YAC5C,SAAS,iCAAiC,SAAS;AAAA,UACrD,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAGA,QAAI,cAAc,UAAU,cAAc,OAAO;AAC/C,YAAM,EAAE,MAAM,IAAI,IAAI,aAAa,YAAY,SAAS;AACxD,UAAI,cAAc,QAAQ;AACxB,iBAAS,KAAK;AAAA,UACZ;AAAA,UAAM;AAAA,UAAM;AAAA,UAAK,UAAU;AAAA,UAAQ,MAAM;AAAA,UACzC,SAAS;AAAA,QACX,CAAC;AAAA,MACH,OAAO;AACL,iBAAS,KAAK;AAAA,UACZ;AAAA,UAAM;AAAA,UAAM;AAAA,UAAK,UAAU;AAAA,UAAQ,MAAM;AAAA,UACzC,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AAAA,IACF;AAGA,QAAI,CAAC,uBAAuB,SAAS,SAAS,GAAG;AAC/C,YAAM,UAAU,YAAY,WAAW,sBAAsB;AAC7D,UAAI,SAAS;AACX,cAAM,EAAE,MAAM,IAAI,IAAI,aAAa,YAAY,SAAS;AACxD,iBAAS,KAAK;AAAA,UACZ;AAAA,UAAM;AAAA,UAAM;AAAA,UAAK,UAAU;AAAA,UAAQ,MAAM;AAAA,UACzC,SAAS,eAAe,SAAS,0CAA0C,OAAO;AAAA,QACpF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,aAAW,gBAAgB,YAAY,MAAM,eAAe,GAAG;AAC7D,QAAI,aAAa,SAAU;AAC3B,QAAI,aAAa,kBAAkB,UAAU,EAAE,WAAW,GAAG;AAC3D,YAAM,EAAE,MAAM,IAAI,IAAI,aAAa,YAAY;AAC/C,UAAI,YAAY;AAChB,UAAI,WAAW,aAAa;AAC5B,aAAO,YAAY,SAAS,SAAS,aAAc,YAAW,SAAS;AACvE,UAAI,SAAU,aAAY,SAAS,kBAAkB,MAAM,GAAG,QAAQ;AACtE,eAAS,KAAK;AAAA,QACZ;AAAA,QAAM;AAAA,QAAM;AAAA,QAAK,UAAU;AAAA,QAAW,MAAM;AAAA,QAC5C,SAAS,8BAA8B,SAAS;AAAA,MAClD,CAAC;AAAA,IACH;AAAA,EACF;AAGA,aAAW,aAAa,YAAY,MAAM,YAAY,GAAG;AACvD,QAAI,UAAU,SAAU;AACxB,UAAM,YAAY,UAAU,kBAAkB,OAAO;AACrD,QAAI,WAAW,SAAS,KAAK;AAC3B,YAAM,EAAE,MAAM,IAAI,IAAI,aAAa,SAAS;AAC5C,eAAS,KAAK;AAAA,QACZ;AAAA,QAAM;AAAA,QAAM;AAAA,QAAK,UAAU;AAAA,QAAS,MAAM;AAAA,QAC1C,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AAGA,aAAW,YAAY,YAAY,MAAM,WAAW,GAAG;AACrD,UAAM,UAAU,SAAS,kBAAkB,eAAe,EAAE,KAAK,CAAC,MAAiB,MAAM,IAAI;AAC7F,QAAI,CAAC,QAAS;AACd,UAAM,UAAU,QAAQ,KAAK,QAAQ,UAAU,EAAE;AACjD,QAAI,QAAQ,SAAS,KAAK;AACxB,YAAM,EAAE,MAAM,IAAI,IAAI,aAAa,OAAO;AAC1C,eAAS,KAAK;AAAA,QACZ;AAAA,QAAM;AAAA,QAAM;AAAA,QAAK,UAAU;AAAA,QAAW,MAAM;AAAA,QAC5C,SAAS,sCAAsC,QAAQ,MAAM;AAAA,MAC/D,CAAC;AAAA,IACH;AAAA,EACF;AAGA,aAAW,YAAY,YAAY,MAAM,YAAY,GAAG;AACtD,UAAM,UAAU,SAAS,kBAAkB,eAAe,EAAE,KAAK,CAAC,MAAiB,MAAM,IAAI;AAC7F,QAAI,CAAC,QAAS;AACd,UAAM,UAAU,QAAQ,KAAK,QAAQ,UAAU,EAAE;AACjD,QAAI,QAAQ,SAAS,KAAK;AACxB,YAAM,EAAE,MAAM,IAAI,IAAI,aAAa,OAAO;AAC1C,UAAI,IAAI,SAAS;AACjB,aAAO,KAAK,EAAE,SAAS,aAAc,KAAI,EAAE;AAC3C,YAAM,YAAY,GAAG,kBAAkB,MAAM,GAAG,QAAQ;AACxD,eAAS,KAAK;AAAA,QACZ;AAAA,QAAM;AAAA,QAAM;AAAA,QAAK,UAAU;AAAA,QAAW,MAAM;AAAA,QAC5C,SAAS,0BAA0B,SAAS,QAAQ,QAAQ,MAAM;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAGA,QAAM,gBAAgB,IAAI;AAAA,IACxB,YAAY,MAAM,YAAY,EAC3B,IAAI,OAAK,EAAE,kBAAkB,MAAM,GAAG,IAAI,EAC1C,OAAO,OAAO;AAAA,EACnB;AAEA,MAAI,SAAS;AACX,QAAI;AACF,0BAAoB,UAAM,qBAAQ,OAAO,GAAG,aAAa;AAAA,IAC3D,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,QAAM,gBAAgB,MAAM,KAAK,aAAa;AAC9C,aAAW,kBAAkB,YAAY,MAAM,iBAAiB,GAAG;AACjE,UAAM,YAAY,eAAe,kBAAkB,OAAO;AAC1D,QAAI,CAAC,UAAW;AAChB,UAAM,SAAS,UAAU;AACzB,QAAI,CAAC,cAAc,IAAI,MAAM,GAAG;AAC9B,YAAM,EAAE,MAAM,IAAI,IAAI,aAAa,SAAS;AAC5C,YAAM,aAAa,OAAO,SAAS,GAAG;AAEtC,YAAM,OAAO,CAAC,aAAa,YAAY,QAAQ,aAAa,IAAI;AAChE,eAAS,KAAK;AAAA,QACZ;AAAA,QAAM;AAAA,QAAM;AAAA,QACZ,UAAU,aAAa,YAAY;AAAA,QACnC,MAAM,aAAa,SAAS;AAAA,QAC5B,SAAS,aACL,UAAU,MAAM,iEAChB,UAAU,MAAM;AAAA,QACpB,GAAI,OAAO,EAAE,MAAM,iBAAiB,IAAI,KAAK,IAAI,CAAC;AAAA,MACpD,CAAC;AAAA,IACH;AAAA,EACF;AAGA,aAAW,gBAAgB,YAAY,MAAM,eAAe,GAAG;AAC7D,QAAI,WAAW,aAAa;AAC5B,WAAO,YAAY,SAAS,SAAS,aAAc,YAAW,SAAS;AACvE,QAAI,CAAC,SAAU;AACf,UAAM,cACJ,SAAS,kBAAkB,gBAAgB,EAAE,SAC3C,SAAS,kBAAkB,kBAAkB,EAAE,SAAS;AAC5D,QAAI,CAAC,aAAa;AAChB,YAAM,EAAE,MAAM,IAAI,IAAI,aAAa,YAAY;AAC/C,eAAS,KAAK;AAAA,QACZ;AAAA,QAAM;AAAA,QAAM;AAAA,QAAK,UAAU;AAAA,QAAW,MAAM;AAAA,QAC5C,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AAGA,QAAM,YAAY,kBAAkB,IAAI;AACxC,MAAI,UAAU,OAAO,MAAM;AACzB,UAAM,WAAW,UAAU,YAAY,CAAC,GAAG,WAAW;AACtD,aAAS,KAAK;AAAA,MACZ;AAAA,MAAM,MAAM;AAAA,MAAG,KAAK;AAAA,MAAG,UAAU;AAAA,MAAS,MAAM;AAAA,MAChD,SAAS,gBAAgB,QAAQ;AAAA,IACnC,CAAC;AACD,WAAO;AAAA,EACT;AAEA,QAAM,MAAM,UAAU;AACtB,QAAM,aAAa,IAAI,IAAI,yBAAyB,IAAI,OAAO,QAAQ,OAAK,EAAE,IAAI,CAAC,CAAC;AAGpF,aAAW,SAAS,IAAI,QAAQ;AAC9B,UAAM,cAAc,yBAAyB,MAAM,IAAI,EAAE,SAAS;AAClE,UAAM,cAAc,WAAW,IAAI,MAAM,IAAI;AAC7C,QAAI,CAAC,eAAe,CAAC,aAAa;AAChC,eAAS,KAAK;AAAA,QACZ;AAAA,QAAM,MAAM;AAAA,QAAG,KAAK;AAAA,QAAG,UAAU;AAAA,QAAW,MAAM;AAAA,QAClD,SAAS,UAAU,MAAM,IAAI;AAAA,MAC/B,CAAC;AAAA,IACH;AAAA,EACF;AAGA,WAAS,IAAI,GAAG,IAAI,IAAI,OAAO,QAAQ,KAAK;AAC1C,UAAM,QAAQ,IAAI,OAAO,CAAC;AAC1B,QAAI,CAAC,WAAW,IAAI,MAAM,IAAI,GAAG;AAC/B,YAAM,YAAY,YAAY,MAAM,YAAY,EAC7C,KAAK,OAAK,EAAE,kBAAkB,MAAM,GAAG,SAAS,MAAM,IAAI;AAC7D,YAAM,MAAM,YAAY,aAAa,SAAS,IAAI,EAAE,MAAM,GAAG,KAAK,EAAE;AACpE,eAAS,KAAK;AAAA,QACZ;AAAA,QAAM,MAAM,IAAI;AAAA,QAAM,KAAK,IAAI;AAAA,QAAK,UAAU;AAAA,QAAW,MAAM;AAAA,QAC/D,SAAS,UAAU,MAAM,IAAI;AAAA,MAC/B,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAsB,eAAe;AACnC,SAAO,EAAE,iBAAiB,aAAa;AACzC;;;ACzeO,SAAS,aAAa,MAAoB;AAC/C,MAAI,CAAC,KAAK,cAAe,OAAM,IAAI,MAAM,uCAAuC;AAChF,MAAI,CAAC,KAAK,GAAI,OAAM,IAAI,MAAM,4BAA4B;AAC1D,MAAI,CAAC,KAAK,KAAM,OAAM,IAAI,MAAM,8BAA8B;AAC9D,MAAI,CAAC,KAAK,YAAa,OAAM,IAAI,MAAM,qCAAqC;AAC5E,MAAI,CAAC,KAAK,QAAS,OAAM,IAAI,MAAM,iCAAiC;AACpE,MAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,gCAAgC;AAClE,MAAI,CAAC,KAAK,QAAS,OAAM,IAAI,MAAM,iCAAiC;AACpE,MAAI,CAAC,KAAK,SAAU,OAAM,IAAI,MAAM,kCAAkC;AACtE,MAAI,CAAC,MAAM,QAAQ,KAAK,YAAY,EAAG,OAAM,IAAI,MAAM,4CAA4C;AACnG,MAAI,CAAC,MAAM,QAAQ,KAAK,QAAQ,EAAG,OAAM,IAAI,MAAM,wCAAwC;AAC3F,MAAI,CAAC,KAAK,UAAW,OAAM,IAAI,MAAM,mCAAmC;AAExE,SAAO;AAAA,IACL,eAAe,KAAK;AAAA,IACpB,IAAI,KAAK;AAAA,IACT,MAAM,KAAK;AAAA,IACX,aAAa,KAAK;AAAA,IAClB,SAAS,KAAK;AAAA,IACd,QAAQ,KAAK;AAAA,IACb,SAAS,KAAK,WAAW;AAAA,IACzB,SAAS,KAAK;AAAA,IACd,SAAS,KAAK,WAAW;AAAA,IACzB,UAAU,KAAK;AAAA,IACf,QAAQ,KAAK;AAAA,IACb,cAAc,KAAK;AAAA,IACnB,UAAU,KAAK;AAAA,IACf,WAAW,KAAK;AAAA,EAClB;AACF;AAEO,SAAS,aAAa,MAAoC;AAC/D,SAAO;AAAA,IACL,eAAe;AAAA,IACf,IAAI,KAAK;AAAA,IACT,MAAM,KAAK;AAAA,IACX,aAAa,KAAK;AAAA,IAClB,SAAS,KAAK;AAAA,IACd,QAAQ,KAAK;AAAA,IACb,SAAS,KAAK,WAAW;AAAA,IACzB,SAAS,KAAK;AAAA,IACd,SAAS,KAAK,WAAW;AAAA,IACzB,UAAU,KAAK;AAAA,IACf,QAAQ,KAAK;AAAA,IACb,cAAc,KAAK,gBAAgB,CAAC;AAAA,IACpC,UAAU,KAAK,YAAY,CAAC;AAAA,IAC5B,WAAW,KAAK;AAAA,EAClB;AACF;AAEO,SAAS,cAAc,SAA0B;AACtD,SAAO,KAAK,UAAU,SAAS,MAAM,CAAC;AACxC;;;AC5CO,IAAM,kBAAkB,CAAC,cAAc,cAAc,gBAAgB,OAAO;AAEnF,SAAS,mBAAmB,YAAyD;AAEnF,QAAM,QAAQ,WAAW,QAAQ,GAAG;AACpC,MAAI,UAAU,OAAO,WAAW,QAAQ,GAAG,MAAM,MAAM,QAAQ,WAAW,QAAQ,GAAG,IAAI;AACvF,UAAM,WAAW,WAAW,QAAQ,GAAG;AACvC,QAAI,aAAa,IAAI;AACnB,YAAM,IAAI,MAAM,qEAAqE,UAAU,IAAI;AAAA,IACrG;AACA,WAAO;AAAA,MACL,WAAW,WAAW,MAAM,GAAG,QAAQ;AAAA,MACvC,MAAM,WAAW,MAAM,WAAW,CAAC;AAAA,IACrC;AAAA,EACF;AAGA,aAAW,YAAY,iBAAiB;AACtC,QAAI,WAAW,WAAW,WAAW,GAAG,GAAG;AACzC,YAAM,gBAAgB,WAAW,MAAM,SAAS,SAAS,CAAC;AAC1D,YAAM,WAAW,cAAc,QAAQ,GAAG;AAC1C,UAAI,aAAa,IAAI;AACnB,cAAM,IAAI;AAAA,UACR,sBAAsB,QAAQ,wDAAwD,UAAU;AAAA,QAClG;AAAA,MACF;AACA,aAAO;AAAA,QACL,WAAW,WAAW,MAAM,cAAc,MAAM,GAAG,QAAQ;AAAA,QAC3D,MAAM,cAAc,MAAM,WAAW,CAAC;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AAGA,QAAM,YAAY,WAAW,YAAY,GAAG;AAC5C,MAAI,cAAc,IAAI;AACpB,UAAM,IAAI,MAAM,+CAA+C,UAAU,GAAG;AAAA,EAC9E;AACA,SAAO;AAAA,IACL,WAAW,WAAW,MAAM,GAAG,SAAS;AAAA,IACxC,MAAM,WAAW,MAAM,YAAY,CAAC;AAAA,EACtC;AACF;AAEO,SAAS,QAAQ,IAAqB;AAC3C,MAAI,CAAC,GAAI,OAAM,IAAI,MAAM,gCAAgC;AAGzD,QAAM,WAAW,GAAG,QAAQ,GAAG;AAE/B,MAAI;AACJ,MAAI;AACJ,MAAI;AAEJ,MAAI,aAAa,IAAI;AAEnB,iBAAa;AAAA,EACf,OAAO;AACL,iBAAa,GAAG,MAAM,GAAG,QAAQ;AACjC,UAAM,OAAO,GAAG,MAAM,WAAW,CAAC;AAClC,QAAI,CAAC,KAAM,OAAM,IAAI,MAAM,iDAAiD,EAAE,GAAG;AAGjF,UAAM,WAAW,KAAK,QAAQ,GAAG;AACjC,QAAI,aAAa,IAAI;AAEnB,gBAAU;AAAA,IACZ,OAAO;AAEL,gBAAU,KAAK,MAAM,GAAG,QAAQ;AAChC,eAAS,KAAK,MAAM,WAAW,CAAC;AAChC,UAAI,CAAC,QAAS,OAAM,IAAI,MAAM,kDAAkD,EAAE,GAAG;AACrF,UAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,gDAAgD,EAAE,GAAG;AAAA,IACpF;AAAA,EACF;AAGA,QAAM,EAAE,WAAW,KAAK,IAAI,mBAAmB,UAAU;AAEzD,MAAI,CAAC,UAAW,OAAM,IAAI,MAAM,yCAAyC,EAAE,GAAG;AAC9E,MAAI,CAAC,KAAM,OAAM,IAAI,MAAM,oCAAoC,EAAE,GAAG;AAEpE,SAAO,EAAE,WAAW,MAAM,SAAS,OAAO;AAC5C;AAEO,SAAS,QAAQ,OAAwB;AAC9C,QAAM,EAAE,WAAW,MAAM,SAAS,OAAO,IAAI;AAC7C,MAAI,CAAC,aAAa,CAAC,MAAM;AACvB,UAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AACA,MAAI,UAAU,CAAC,SAAS;AACtB,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC7D;AACA,MAAI,SAAS,GAAG,SAAS,IAAI,IAAI;AACjC,MAAI,SAAS;AACX,cAAU,IAAI,OAAO;AACrB,QAAI,OAAQ,WAAU,IAAI,MAAM;AAAA,EAClC;AACA,SAAO;AACT;AAEO,SAAS,cAAc,IAAoB;AAChD,MAAI;AACF,WAAO,QAAQ,EAAE,EAAE,UAAU;AAAA,EAC/B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,YAAY,IAAoB;AAC9C,MAAI;AACF,WAAO,QAAQ,EAAE,EAAE;AAAA,EACrB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ACvHA,IAAAC,gBAAkB;AAClB,sBAAoC;;;ACDpC,mBAAkB;AAEX,SAAS,YAAmB;AACjC,SAAO,IAAI,aAAAC,QAAM;AACnB;AAEA,eAAsB,aAAa,KAAY,QAAiD;AAC9F,QAAM,QAAQ,oBAAI,IAAoB;AACtC,QAAM,WAA4B,CAAC;AAEnC,MAAI,QAAQ,CAAC,cAAc,SAAS;AAClC,QAAI,KAAK,IAAK;AACd,QAAI,UAAU,CAAC,OAAO,KAAK,OAAK,aAAa,WAAW,CAAC,CAAC,EAAG;AAC7D,aAAS;AAAA,MACP,KAAK,MAAM,MAAM,EAAE,KAAK,aAAW;AACjC,cAAM,IAAI,cAAc,OAAO;AAAA,MACjC,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,QAAM,QAAQ,IAAI,QAAQ;AAC1B,SAAO;AACT;;;ADlBA,IAAM,eAAe,MAAM,OAAO;AAClC,IAAM,wBAAwB;AAE9B,eAAsB,QAAQ,UAAkC;AAC9D,QAAM,OAAO,UAAM,0BAAS,QAAQ;AACpC,SAAO,cAAAC,QAAM,UAAU,IAAI;AAC7B;AAEA,eAAsB,gBAAgB,UAAoC;AACxE,QAAM,OAAO,UAAM,0BAAS,QAAQ;AACpC,QAAM,MAAM,MAAM,cAAAA,QAAM,UAAU,IAAI;AAEtC,MAAI,oBAAoB;AACxB,MAAI,QAAQ,CAAC,eAAe,SAAS;AACnC,QAAI,CAAC,KAAK,KAAK;AACb,2BAAsB,KAAa,OAAO,oBAAoB;AAAA,IAChE;AAAA,EACF,CAAC;AAED,QAAM,iBAAiB,KAAK;AAC5B,QAAM,QAAQ,oBAAoB;AAElC,MAAI,oBAAoB,cAAc;AACpC,UAAM,IAAI,MAAM,8CAA8C,iBAAiB,EAAE;AAAA,EACnF;AAEA,MAAI,QAAQ,uBAAuB;AACjC,UAAM,IAAI,MAAM,6CAA6C,MAAM,QAAQ,CAAC,CAAC,GAAG;AAAA,EAClF;AAEA,SAAO;AACT;AAEA,eAAsB,mBAAmB,UAAoC;AAC3E,QAAM,OAAO,UAAM,0BAAS,QAAQ;AACpC,QAAM,QAAQ,KAAK,SAAS,GAAG,CAAC;AAChC,MAAI,EAAE,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,MAAQ,MAAM,CAAC,MAAM,KAAQ,MAAM,CAAC,MAAM,IAAO;AACvF,UAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AACA,SAAO;AACT;AAEA,eAAsB,SAAS,KAAY,SAAgC;AACzE,QAAM,OAAO,MAAM,IAAI,cAAc,EAAE,MAAM,cAAc,CAAC;AAC5D,YAAM,2BAAU,SAAS,OAAO,KAAK,IAAI,CAAC;AAC5C;;;AEvDA,IAAAC,mBAAwC;AACxC,IAAAC,eAA+B;AAC/B,2BAAyB;AACzB,oBAA2B;AAC3B,IAAAC,gBAAkB;;;ACFlB,IAAM,WAAW;AAEjB,SAAS,qBAAqB,IAA0B;AACtD,UAAQ,GAAG,MAAM;AAAA,IACf,KAAK;AACH,aAAO,EAAE,MAAM,GAAG,MAAM;AAAA,IAC1B,KAAK;AACH,aAAO,GAAG,MAAM,WAAW,MAAM,IAC7B,EAAE,MAAM,GAAG,QAAQ,GAAG,GAAG,MAAM,MAAM,CAAC,CAAC,QAAQ,IAC/C,EAAE,MAAM,WAAW,GAAG,KAAK,GAAG;AAAA,IACpC,KAAK;AACH,aAAO,EAAE,MAAM,SAAS,OAAO,qBAAqB,GAAG,KAAK,EAAE;AAAA,IAChE,KAAK;AACH,aAAO,EAAE,MAAM,UAAU,MAAM,GAAG,MAAM;AAAA,EAC5C;AACF;AAEA,SAAS,uBAAuB,IAA4B;AAC1D,QAAM,WAAW,GAAG,WAAW,OAAO,OAAK,CAAC,EAAE,WAAW,EAAE,IAAI,OAAK,EAAE,IAAI;AAC1E,QAAM,aAAqC,CAAC;AAC5C,aAAW,KAAK,GAAG,YAAY;AAC7B,eAAW,EAAE,IAAI,IAAI;AAAA,MACnB,GAAG,qBAAqB,EAAE,IAAI;AAAA,MAC9B,GAAI,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,IAAI,CAAC;AAAA,IACxD;AAAA,EACF;AACA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,cAAc,GAAG,SAAS;AAAA,IAC1B,GAAI,GAAG,SAAS,QAAQ,EAAE,oBAAoB,GAAG,SAAS,MAAM,IAAI,CAAC;AAAA,IACrE,GAAI,GAAG,UAAU,EAAE,aAAa,GAAG,QAAQ,IAAI,IAAI,CAAC;AAAA,IACpD,GAAI,GAAG,SAAS,QAAQ,EAAE,mBAAmB,GAAG,QAAQ,MAAM,IAAI,CAAC;AAAA,IACnE,MAAM;AAAA,IACN;AAAA,IACA,GAAI,SAAS,SAAS,EAAE,SAAS,IAAI,CAAC;AAAA,EACxC;AACF;AAEA,SAAS,oBAAoB,KAA2B;AACtD,SAAO,IAAI,KAAK,WAAW,MAAM,IAC7B,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,QAAQ,IAC/C,EAAE,MAAM,WAAW,IAAI,IAAI,GAAG;AACpC;AAGO,SAAS,eAAe,IAAoC;AACjE,MAAI,GAAG,MAAM,WAAW,KAAK,GAAG,MAAM,WAAW,KAAK,GAAG,OAAO,WAAW,EAAG,QAAO;AAErF,QAAM,OAA+B,CAAC;AACtC,aAAW,MAAM,GAAG,OAAO;AACzB,SAAK,GAAG,IAAI,IAAI,uBAAuB,EAAE;AAAA,EAC3C;AAEA,SAAO,KAAK;AAAA,IACV;AAAA,MACE,GAAI,GAAG,MAAM,SAAS,EAAE,OAAO,GAAG,MAAM,IAAI,mBAAmB,EAAE,IAAI,CAAC;AAAA,MACtE,GAAI,GAAG,OAAO,SAAS,EAAE,QAAQ,GAAG,OAAO,IAAI,mBAAmB,EAAE,IAAI,CAAC;AAAA,MACzE,GAAI,OAAO,KAAK,IAAI,EAAE,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;AAAA,IACpD;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ADnDA,SAAS,kBAAiC;AACxC,MAAI;AACF,eAAO,+BAAS,kCAAkC,EAAE,OAAO,QAAQ,UAAU,QAAQ,CAAC,EAAE,KAAK;AAAA,EAC/F,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,mBAAkC;AACzC,MAAI;AACF,eAAO,+BAAS,8BAA8B,EAAE,OAAO,QAAQ,UAAU,QAAQ,CAAC,EAAE,KAAK;AAAA,EAC3F,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,eAAe,UAAoC;AAChE,MAAI,SAAU,QAAO;AACrB,SAAO,gBAAgB,KAAK;AAC9B;AAEA,eAAe,cAAc,UAAgD;AAC3E,MAAI,SAAU,QAAO;AACrB,SAAO,iBAAiB,KAAK;AAC/B;AAEA,eAAsB,aAAa,KAA2C;AAC5E,QAAM,QAAQ,oBAAI,IAAoB;AAEtC,iBAAe,KAAK,QAAgB,SAAS,IAAI;AAC/C,QAAI;AACF,YAAM,UAAU,UAAM,0BAAQ,MAAM;AACpC,iBAAW,SAAS,SAAS;AAC3B,YAAI,UAAU,cAAc,MAAM,WAAW,GAAG,EAAG;AACnD,cAAM,eAAW,mBAAK,QAAQ,KAAK;AACnC,cAAM,QAAQ,UAAM,uBAAK,QAAQ;AACjC,cAAM,eAAe,SAAS,GAAG,MAAM,IAAI,KAAK,KAAK;AACrD,YAAI,MAAM,YAAY,GAAG;AACvB,gBAAM,KAAK,UAAU,YAAY;AAAA,QACnC,OAAO;AACL,gBAAM,IAAI,cAAc,UAAM,2BAAS,UAAU,OAAO,CAAC;AAAA,QAC3D;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,QAAM,IAAI,qBAAqB,UAAM,+BAAS,mBAAK,KAAK,mBAAmB,GAAG,OAAO,CAAC;AACtF,QAAM,IAAI,kBAAkB,UAAM,+BAAS,mBAAK,KAAK,gBAAgB,GAAG,OAAO,CAAC;AAEhF,MAAI;AACF,UAAM,IAAI,WAAW,UAAM,+BAAS,mBAAK,KAAK,SAAS,GAAG,OAAO,CAAC;AAAA,EACpE,QAAQ;AAAA,EAER;AAEA,QAAM,SAAK,mBAAK,KAAK,WAAW,GAAG,WAAW;AAC9C,QAAM,SAAK,mBAAK,KAAK,QAAQ,GAAG,QAAQ;AACxC,QAAM,SAAK,mBAAK,KAAK,WAAW,GAAG,WAAW;AAE9C,SAAO;AACT;AAEA,eAAsB,KAAK,UAAuB,CAAC,GAAwB;AACzE,QAAM,MAAM,QAAQ,OAAO,QAAQ,IAAI;AACvC,QAAM,UAAU,QAAQ,WAAO,mBAAK,KAAK,OAAG,uBAAS,GAAG,CAAC,QAAQ;AAEjE,MAAI;AACJ,MAAI;AAEJ,MAAI;AACF,sBAAkB,UAAM,+BAAS,mBAAK,KAAK,mBAAmB,GAAG,OAAO;AAAA,EAC1E,QAAQ;AACN,UAAM,IAAI,MAAM,wCAAwC;AAAA,EAC1D;AAEA,MAAI;AACF,mBAAe,UAAM,+BAAS,mBAAK,KAAK,gBAAgB,GAAG,OAAO;AAAA,EACpE,QAAQ;AACN,UAAM,IAAI,MAAM,qCAAqC;AAAA,EACvD;AAEA,QAAM,CAAC,qBAAqB,gBAAgB,IAAI,MAAM,QAAQ,IAAI;AAAA,IAChE,gBAAgB,eAAe;AAAA,IAC/B,aAAa,YAAY;AAAA,EAC3B,CAAC;AAED,QAAM,cAAc,CAAC,GAAG,qBAAqB,GAAG,gBAAgB;AAChE,QAAM,SAAS,YAAY,OAAO,OAAK,EAAE,aAAa,OAAO;AAC7D,QAAM,WAAW,YAAY,OAAO,OAAK,EAAE,aAAa,SAAS;AAEjE,MAAI,OAAO,SAAS,GAAG;AACrB,UAAM,IAAI;AAAA,MACR;AAAA,EAAiB,OAAO,IAAI,OAAK,KAAK,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,GAAG,IAAI,EAAE,IAAI,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,IACtG;AAAA,EACF;AAEA,QAAM,mBAAmB;AACzB,QAAM,aAAa,qBAAqB,eAAe;AACvD,MAAI,WAAW,OAAO,MAAM;AAC1B,UAAM,aAAa,WAAW,YAAY,KAAK,OAAK,EAAE,aAAa,OAAO;AAC1E,UAAM,IAAI,MAAM,WAAW,YAAY,WAAW,cAAc,EAAE;AAAA,EACpE;AACA,QAAM,KAAK,WAAW;AAEtB,QAAM,UAAU,MAAM,eAAe,QAAQ,OAAO;AACpD,QAAM,SAAS,MAAM,cAAc,QAAQ,MAAM;AACjD,QAAM,WAAW,MAAM,aAAa,GAAG;AAEvC,QAAM,iBAAiB,MAAM,KAAK,SAAS,OAAO,CAAC,EAAE,KAAK,EAAE;AAC5D,QAAM,aAAS,0BAAW,QAAQ,EAAE,OAAO,cAAc,EAAE,OAAO,KAAK;AAEvE,QAAM,YAAY,GAAG,MAAM,UAAU;AACrC,QAAM,KAAK,QAAQ,EAAE,WAAW,MAAM,GAAG,MAAM,MAAM,SAAS,QAAQ,OAAO,CAAC;AAE9E,QAAM,YAAY,eAAe,EAAE;AACnC,QAAM,YAAY;AAAA,IAChB;AAAA,IACA,GAAI,YAAY,EAAE,OAAO,oBAAoB,IAAI,CAAC;AAAA,IAClD,OAAO;AAAA,EACT;AAEA,QAAM,UAAU,aAAa;AAAA,IAC3B;AAAA,IACA,MAAM,GAAG,MAAM;AAAA,IACf,aAAa,GAAG,eAAe;AAAA,IAC/B;AAAA,IACA,QAAQ,GAAG,MAAM,UAAU;AAAA,IAC3B,SAAS,GAAG,MAAM,WAAW;AAAA,IAC7B,SAAS,GAAG,WAAW;AAAA,IACvB,SAAS;AAAA,IACT,UAAU;AAAA,IACV;AAAA,IACA,cAAc,GAAG,aAAa,IAAI,QAAM,EAAE,IAAI,EAAE,MAAM,aAAa,EAAE,eAAe,GAAG,EAAE;AAAA,IACzF,UAAU,GAAG;AAAA,IACb;AAAA,EACF,CAAC;AAED,QAAM,MAAM,IAAI,cAAAC,QAAM;AACtB,QAAM,cAAc,IAAI,OAAO,QAAQ;AACvC,cAAY,KAAK,gBAAgB,cAAc,OAAO,CAAC;AAEvD,MAAI,WAAW;AACb,gBAAY,KAAK,cAAc,SAAS;AAAA,EAC1C;AAEA,QAAM,eAAe,oBAAI,IAAI,CAAC,sBAAsB,mBAAmB,oBAAoB,CAAC;AAC5F,QAAM,YAAY;AAAA,IAChB,aAAa;AAAA,IACb,UAAU;AAAA,IACV,WAAW,MAAM,KAAK,SAAS,KAAK,CAAC,EAAE,OAAO,OAAK,EAAE,WAAW,YAAY,KAAK,CAAC,aAAa,IAAI,CAAC,CAAC;AAAA,IACrG,QAAQ,MAAM,KAAK,SAAS,KAAK,CAAC,EAAE,OAAO,OAAK,EAAE,WAAW,SAAS,KAAK,CAAC,aAAa,IAAI,CAAC,CAAC;AAAA,IAC/F,WAAW,MAAM,KAAK,SAAS,KAAK,CAAC,EAAE,OAAO,OAAK,EAAE,WAAW,YAAY,KAAK,CAAC,aAAa,IAAI,CAAC,CAAC;AAAA,EACvG;AACA,cAAY,KAAK,cAAc,KAAK,UAAU,WAAW,MAAM,CAAC,CAAC;AAEjE,aAAW,CAAC,MAAM,OAAO,KAAK,UAAU;AACtC,QAAI,CAAC,aAAa,IAAI,IAAI,EAAG,KAAI,KAAK,MAAM,OAAO;AAAA,EACrD;AAEA,QAAM,SAAS,KAAK,OAAO;AAE3B,SAAO,EAAE,MAAM,SAAS,IAAI,SAAS;AACvC;","names":["require","bpInit","bpParseBehavior","bpParseDescription","_","import_jszip","JSZip","JSZip","import_promises","import_path","import_jszip","JSZip"]}
@@ -0,0 +1,55 @@
1
+ import { Tree, Node } from 'web-tree-sitter';
2
+ import { L as LangId, P as ParseDiagnostic, B as BehaviorFile, D as DescriptionFile, a as LintMessage, b as PackOptions, c as PackResult } from './core-DLZGpzev.cjs';
3
+ export { A as AboutMe, d as AgentDecl, e as AnnotatedRef, f as BehaviorStatement, g as BuildAboutmeOptions, C as Capability, I as IdParts, h as Integrity, O as OntologyRef, i as PropertyDecl, j as PropertyType, S as StateDef, T as TriggerDecl, k as TypeDefinition, l as aboutmeToJson, m as buildAboutme, n as buildId, o as createZip, p as extractDigest, q as extractFiles, r as extractName, s as parseAboutme, t as parseId } from './core-DLZGpzev.cjs';
4
+ import JSZip from 'jszip';
5
+
6
+ declare function initBehaviorParser(): Promise<void>;
7
+ interface ParseResult<T> {
8
+ ok: T | null;
9
+ diagnostics: ParseDiagnostic[];
10
+ }
11
+ declare function parseBehaviorFile(text: string): ParseResult<BehaviorFile>;
12
+ declare function parseDescriptionFile(text: string): ParseResult<DescriptionFile>;
13
+ declare function getBehaviorScxml(text: string): string;
14
+ declare function initParsers(): Promise<void>;
15
+ /**
16
+ * Parse source text and return a tree-sitter Tree.
17
+ *
18
+ * @param langId - 'description' or 'behavior'
19
+ * @param text - source text to parse
20
+ * @param previousTree - optional previous tree for incremental parsing (LSP use)
21
+ */
22
+ declare function parse(langId: LangId, text: string, previousTree?: Tree): Promise<Tree>;
23
+ /** Parse without initializing if parsers are already ready. Returns null if not initialized. */
24
+ declare function parseSync(langId: LangId, text: string, previousTree?: Tree): Tree | null;
25
+ declare function nodesOfType(tree: Tree, type: string): Node[];
26
+ declare function nodeAtOffset(tree: Tree, offset: number): Node | null;
27
+ declare function nodeToRange(node: Node): {
28
+ start: {
29
+ line: number;
30
+ character: number;
31
+ };
32
+ end: {
33
+ line: number;
34
+ character: number;
35
+ };
36
+ };
37
+ declare function positionToOffset(text: string, line: number, character: number): number;
38
+ declare function getContextNode(tree: Tree, offset: number): Node;
39
+
40
+ declare function lintDescription(text: string, file?: string): Promise<LintMessage[]>;
41
+ declare function lintBehavior(text: string, file?: string, docPath?: string): Promise<LintMessage[]>;
42
+ declare function createLinter(): Promise<{
43
+ lintDescription: typeof lintDescription;
44
+ lintBehavior: typeof lintBehavior;
45
+ }>;
46
+
47
+ declare function readZip(filePath: string): Promise<JSZip>;
48
+ declare function validateZipBomb(filePath: string): Promise<boolean>;
49
+ declare function validateMagicBytes(filePath: string): Promise<boolean>;
50
+ declare function writeZip(zip: JSZip, outPath: string): Promise<void>;
51
+
52
+ declare function collectFiles(dir: string): Promise<Map<string, string>>;
53
+ declare function pack(options?: PackOptions): Promise<PackResult>;
54
+
55
+ export { BehaviorFile, DescriptionFile, LangId, LintMessage, PackOptions, PackResult, collectFiles, createLinter, getBehaviorScxml, getContextNode, initBehaviorParser, initParsers, lintBehavior, lintDescription, nodeAtOffset, nodeToRange, nodesOfType, pack, parse, parseBehaviorFile, parseDescriptionFile, parseSync, positionToOffset, readZip, validateMagicBytes, validateZipBomb, writeZip };
@@ -0,0 +1,55 @@
1
+ import { Tree, Node } from 'web-tree-sitter';
2
+ import { L as LangId, P as ParseDiagnostic, B as BehaviorFile, D as DescriptionFile, a as LintMessage, b as PackOptions, c as PackResult } from './core-DLZGpzev.js';
3
+ export { A as AboutMe, d as AgentDecl, e as AnnotatedRef, f as BehaviorStatement, g as BuildAboutmeOptions, C as Capability, I as IdParts, h as Integrity, O as OntologyRef, i as PropertyDecl, j as PropertyType, S as StateDef, T as TriggerDecl, k as TypeDefinition, l as aboutmeToJson, m as buildAboutme, n as buildId, o as createZip, p as extractDigest, q as extractFiles, r as extractName, s as parseAboutme, t as parseId } from './core-DLZGpzev.js';
4
+ import JSZip from 'jszip';
5
+
6
+ declare function initBehaviorParser(): Promise<void>;
7
+ interface ParseResult<T> {
8
+ ok: T | null;
9
+ diagnostics: ParseDiagnostic[];
10
+ }
11
+ declare function parseBehaviorFile(text: string): ParseResult<BehaviorFile>;
12
+ declare function parseDescriptionFile(text: string): ParseResult<DescriptionFile>;
13
+ declare function getBehaviorScxml(text: string): string;
14
+ declare function initParsers(): Promise<void>;
15
+ /**
16
+ * Parse source text and return a tree-sitter Tree.
17
+ *
18
+ * @param langId - 'description' or 'behavior'
19
+ * @param text - source text to parse
20
+ * @param previousTree - optional previous tree for incremental parsing (LSP use)
21
+ */
22
+ declare function parse(langId: LangId, text: string, previousTree?: Tree): Promise<Tree>;
23
+ /** Parse without initializing if parsers are already ready. Returns null if not initialized. */
24
+ declare function parseSync(langId: LangId, text: string, previousTree?: Tree): Tree | null;
25
+ declare function nodesOfType(tree: Tree, type: string): Node[];
26
+ declare function nodeAtOffset(tree: Tree, offset: number): Node | null;
27
+ declare function nodeToRange(node: Node): {
28
+ start: {
29
+ line: number;
30
+ character: number;
31
+ };
32
+ end: {
33
+ line: number;
34
+ character: number;
35
+ };
36
+ };
37
+ declare function positionToOffset(text: string, line: number, character: number): number;
38
+ declare function getContextNode(tree: Tree, offset: number): Node;
39
+
40
+ declare function lintDescription(text: string, file?: string): Promise<LintMessage[]>;
41
+ declare function lintBehavior(text: string, file?: string, docPath?: string): Promise<LintMessage[]>;
42
+ declare function createLinter(): Promise<{
43
+ lintDescription: typeof lintDescription;
44
+ lintBehavior: typeof lintBehavior;
45
+ }>;
46
+
47
+ declare function readZip(filePath: string): Promise<JSZip>;
48
+ declare function validateZipBomb(filePath: string): Promise<boolean>;
49
+ declare function validateMagicBytes(filePath: string): Promise<boolean>;
50
+ declare function writeZip(zip: JSZip, outPath: string): Promise<void>;
51
+
52
+ declare function collectFiles(dir: string): Promise<Map<string, string>>;
53
+ declare function pack(options?: PackOptions): Promise<PackResult>;
54
+
55
+ export { BehaviorFile, DescriptionFile, LangId, LintMessage, PackOptions, PackResult, collectFiles, createLinter, getBehaviorScxml, getContextNode, initBehaviorParser, initParsers, lintBehavior, lintDescription, nodeAtOffset, nodeToRange, nodesOfType, pack, parse, parseBehaviorFile, parseDescriptionFile, parseSync, positionToOffset, readZip, validateMagicBytes, validateZipBomb, writeZip };