@posthog/agent 2.3.341 → 2.3.346
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent.js +29 -26
- package/dist/agent.js.map +1 -1
- package/dist/posthog-api.d.ts +5 -3
- package/dist/posthog-api.js +9 -20
- package/dist/posthog-api.js.map +1 -1
- package/dist/server/agent-server.d.ts +7 -0
- package/dist/server/agent-server.js +185 -38
- package/dist/server/agent-server.js.map +1 -1
- package/dist/server/bin.cjs +185 -38
- package/dist/server/bin.cjs.map +1 -1
- package/dist/types.d.ts +3 -1
- package/package.json +1 -1
- package/src/adapters/claude/conversion/acp-to-sdk.test.ts +49 -0
- package/src/adapters/claude/conversion/acp-to-sdk.ts +23 -6
- package/src/posthog-api.test.ts +32 -0
- package/src/posthog-api.ts +13 -30
- package/src/server/agent-server.test.ts +96 -0
- package/src/server/agent-server.ts +207 -11
- package/src/server/schemas.test.ts +10 -0
- package/src/server/schemas.ts +25 -6
- package/src/test/mocks/msw-handlers.ts +4 -1
- package/src/types.ts +4 -1
package/dist/agent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../node_modules/web-tree-sitter/tree-sitter.js","../src/adapters/acp-connection.ts","../src/utils/logger.ts","../src/utils/streams.ts","../src/adapters/claude/claude-agent.ts","../package.json","../src/acp-extensions.ts","../src/enrichment/file-enricher.ts","../../enricher/src/ast-helpers.ts","../../enricher/src/languages.ts","../../enricher/src/alias-resolver.ts","../../enricher/src/call-detector.ts","../../enricher/src/parser-manager.ts","../../enricher/src/log.ts","../../enricher/src/types.ts","../../enricher/src/variant-detector.ts","../../enricher/src/detector.ts","../../enricher/src/flag-classification.ts","../../enricher/src/stale-flags.ts","../../enricher/src/comment-formatter.ts","../../enricher/src/enriched-result.ts","../../enricher/src/enricher.ts","../../enricher/src/posthog-api.ts","../../enricher/src/parse-result.ts","../src/utils/common.ts","../src/gateway-models.ts","../src/adapters/base-acp-agent.ts","../src/adapters/claude/conversion/acp-to-sdk.ts","../src/adapters/claude/conversion/sdk-to-acp.ts","../src/utils/acp-content.ts","../src/adapters/claude/hooks.ts","../src/adapters/claude/conversion/tool-use-to-acp.ts","../src/adapters/claude/mcp/tool-metadata.ts","../src/adapters/claude/plan/utils.ts","../src/adapters/claude/questions/utils.ts","../src/execution-mode.ts","../src/adapters/claude/tools.ts","../src/adapters/claude/permissions/permission-options.ts","../src/adapters/claude/permissions/permission-handlers.ts","../src/adapters/claude/session/commands.ts","../src/adapters/claude/session/mcp-config.ts","../src/adapters/claude/session/models.ts","../src/adapters/claude/session/options.ts","../src/adapters/claude/session/instructions.ts","../src/adapters/claude/session/settings.ts","../src/adapters/codex/codex-agent.ts","../src/adapters/codex/codex-client.ts","../src/adapters/codex/session-state.ts","../src/adapters/codex/settings.ts","../src/adapters/codex/spawn.ts","../src/utils/gateway.ts","../src/posthog-api.ts","../src/session-log-writer.ts","../src/agent.ts"],"sourcesContent":["// include: shell.js\n// The Module object: Our interface to the outside world. We import\n// and export values on it. There are various ways Module can be used:\n// 1. Not defined. We create it here\n// 2. A function parameter, function(moduleArg) => Promise<Module>\n// 3. pre-run appended it, var Module = {}; ..generated code..\n// 4. External script tag defines var Module.\n// We need to check if Module already exists (e.g. case 3 above).\n// Substitution will be replaced with actual code on later stage of the build,\n// this way Closure Compiler will not mangle it (e.g. case 4. above).\n// Note that if you want to run closure, and also to use Module\n// after the generated code, you will need to define var Module = {};\n// before the code. Then that object will be used in the code, and you\n// can continue to use Module afterwards as well.\nvar Module = typeof Module != \"undefined\" ? Module : {};\n\n// Determine the runtime environment we are in. You can customize this by\n// setting the ENVIRONMENT setting at compile time (see settings.js).\n// Attempt to auto-detect the environment\nvar ENVIRONMENT_IS_WEB = typeof window == \"object\";\n\nvar ENVIRONMENT_IS_WORKER = typeof importScripts == \"function\";\n\n// N.b. Electron.js environment is simultaneously a NODE-environment, but\n// also a web environment.\nvar ENVIRONMENT_IS_NODE = typeof process == \"object\" && typeof process.versions == \"object\" && typeof process.versions.node == \"string\";\n\nif (ENVIRONMENT_IS_NODE) {}\n\n// --pre-jses are emitted after the Module integration code, so that they can\n// refer to Module (if they choose; they can also define Module)\n// include: /src/lib/binding_web/prefix.js\nvar TreeSitter = function() {\n var initPromise;\n var document = typeof window == \"object\" ? {\n currentScript: window.document.currentScript\n } : null;\n class Parser {\n constructor() {\n this.initialize();\n }\n initialize() {\n throw new Error(\"cannot construct a Parser before calling `init()`\");\n }\n static init(moduleOptions) {\n if (initPromise) return initPromise;\n Module = Object.assign({}, Module, moduleOptions);\n return initPromise = new Promise(resolveInitPromise => {\n // end include: /src/lib/binding_web/prefix.js\n // Sometimes an existing Module object exists with properties\n // meant to overwrite the default module functionality. Here\n // we collect those properties and reapply _after_ we configure\n // the current environment's defaults to avoid having to be so\n // defensive during initialization.\n var moduleOverrides = Object.assign({}, Module);\n var arguments_ = [];\n var thisProgram = \"./this.program\";\n var quit_ = (status, toThrow) => {\n throw toThrow;\n };\n // `/` should be present at the end if `scriptDirectory` is not empty\n var scriptDirectory = \"\";\n function locateFile(path) {\n if (Module[\"locateFile\"]) {\n return Module[\"locateFile\"](path, scriptDirectory);\n }\n return scriptDirectory + path;\n }\n // Hooks that are implemented differently in different runtime environments.\n var readAsync, readBinary;\n if (ENVIRONMENT_IS_NODE) {\n // These modules will usually be used on Node.js. Load them eagerly to avoid\n // the complexity of lazy-loading.\n var fs = require(\"fs\");\n var nodePath = require(\"path\");\n scriptDirectory = __dirname + \"/\";\n // include: node_shell_read.js\n readBinary = filename => {\n // We need to re-wrap `file://` strings to URLs. Normalizing isn't\n // necessary in that case, the path should already be absolute.\n filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename);\n var ret = fs.readFileSync(filename);\n return ret;\n };\n readAsync = (filename, binary = true) => {\n // See the comment in the `readBinary` function.\n filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename);\n return new Promise((resolve, reject) => {\n fs.readFile(filename, binary ? undefined : \"utf8\", (err, data) => {\n if (err) reject(err); else resolve(binary ? data.buffer : data);\n });\n });\n };\n // end include: node_shell_read.js\n if (!Module[\"thisProgram\"] && process.argv.length > 1) {\n thisProgram = process.argv[1].replace(/\\\\/g, \"/\");\n }\n arguments_ = process.argv.slice(2);\n if (typeof module != \"undefined\") {\n module[\"exports\"] = Module;\n }\n quit_ = (status, toThrow) => {\n process.exitCode = status;\n throw toThrow;\n };\n } else // Note that this includes Node.js workers when relevant (pthreads is enabled).\n // Node.js workers are detected as a combination of ENVIRONMENT_IS_WORKER and\n // ENVIRONMENT_IS_NODE.\n if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {\n if (ENVIRONMENT_IS_WORKER) {\n // Check worker, not web, since window could be polyfilled\n scriptDirectory = self.location.href;\n } else if (typeof document != \"undefined\" && document.currentScript) {\n // web\n scriptDirectory = document.currentScript.src;\n }\n // blob urls look like blob:http://site.com/etc/etc and we cannot infer anything from them.\n // otherwise, slice off the final part of the url to find the script directory.\n // if scriptDirectory does not contain a slash, lastIndexOf will return -1,\n // and scriptDirectory will correctly be replaced with an empty string.\n // If scriptDirectory contains a query (starting with ?) or a fragment (starting with #),\n // they are removed because they could contain a slash.\n if (scriptDirectory.startsWith(\"blob:\")) {\n scriptDirectory = \"\";\n } else {\n scriptDirectory = scriptDirectory.substr(0, scriptDirectory.replace(/[?#].*/, \"\").lastIndexOf(\"/\") + 1);\n }\n {\n // include: web_or_worker_shell_read.js\n if (ENVIRONMENT_IS_WORKER) {\n readBinary = url => {\n var xhr = new XMLHttpRequest;\n xhr.open(\"GET\", url, false);\n xhr.responseType = \"arraybuffer\";\n xhr.send(null);\n return new Uint8Array(/** @type{!ArrayBuffer} */ (xhr.response));\n };\n }\n readAsync = url => {\n // Fetch has some additional restrictions over XHR, like it can't be used on a file:// url.\n // See https://github.com/github/fetch/pull/92#issuecomment-140665932\n // Cordova or Electron apps are typically loaded from a file:// url.\n // So use XHR on webview if URL is a file URL.\n if (isFileURI(url)) {\n return new Promise((reject, resolve) => {\n var xhr = new XMLHttpRequest;\n xhr.open(\"GET\", url, true);\n xhr.responseType = \"arraybuffer\";\n xhr.onload = () => {\n if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) {\n // file URLs can return 0\n resolve(xhr.response);\n }\n reject(xhr.status);\n };\n xhr.onerror = reject;\n xhr.send(null);\n });\n }\n return fetch(url, {\n credentials: \"same-origin\"\n }).then(response => {\n if (response.ok) {\n return response.arrayBuffer();\n }\n return Promise.reject(new Error(response.status + \" : \" + response.url));\n });\n };\n }\n } else // end include: web_or_worker_shell_read.js\n {}\n var out = Module[\"print\"] || console.log.bind(console);\n var err = Module[\"printErr\"] || console.error.bind(console);\n // Merge back in the overrides\n Object.assign(Module, moduleOverrides);\n // Free the object hierarchy contained in the overrides, this lets the GC\n // reclaim data used.\n moduleOverrides = null;\n // Emit code to handle expected values on the Module object. This applies Module.x\n // to the proper local x. This has two benefits: first, we only emit it if it is\n // expected to arrive, and second, by using a local everywhere else that can be\n // minified.\n if (Module[\"arguments\"]) arguments_ = Module[\"arguments\"];\n if (Module[\"thisProgram\"]) thisProgram = Module[\"thisProgram\"];\n if (Module[\"quit\"]) quit_ = Module[\"quit\"];\n // perform assertions in shell.js after we set up out() and err(), as otherwise if an assertion fails it cannot print the message\n // end include: shell.js\n // include: preamble.js\n // === Preamble library stuff ===\n // Documentation for the public APIs defined in this file must be updated in:\n // site/source/docs/api_reference/preamble.js.rst\n // A prebuilt local version of the documentation is available at:\n // site/build/text/docs/api_reference/preamble.js.txt\n // You can also build docs locally as HTML or other formats in site/\n // An online HTML version (which may be of a different version of Emscripten)\n // is up at http://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html\n var dynamicLibraries = Module[\"dynamicLibraries\"] || [];\n var wasmBinary;\n if (Module[\"wasmBinary\"]) wasmBinary = Module[\"wasmBinary\"];\n // Wasm globals\n var wasmMemory;\n //========================================\n // Runtime essentials\n //========================================\n // whether we are quitting the application. no code should run after this.\n // set in exit() and abort()\n var ABORT = false;\n // set by exit() and abort(). Passed to 'onExit' handler.\n // NOTE: This is also used as the process return code code in shell environments\n // but only when noExitRuntime is false.\n var EXITSTATUS;\n // Memory management\n var /** @type {!Int8Array} */ HEAP8, /** @type {!Uint8Array} */ HEAPU8, /** @type {!Int16Array} */ HEAP16, /** @type {!Uint16Array} */ HEAPU16, /** @type {!Int32Array} */ HEAP32, /** @type {!Uint32Array} */ HEAPU32, /** @type {!Float32Array} */ HEAPF32, /** @type {!Float64Array} */ HEAPF64;\n var HEAP_DATA_VIEW;\n // include: runtime_shared.js\n function updateMemoryViews() {\n var b = wasmMemory.buffer;\n Module[\"HEAP_DATA_VIEW\"] = HEAP_DATA_VIEW = new DataView(b);\n Module[\"HEAP8\"] = HEAP8 = new Int8Array(b);\n Module[\"HEAP16\"] = HEAP16 = new Int16Array(b);\n Module[\"HEAPU8\"] = HEAPU8 = new Uint8Array(b);\n Module[\"HEAPU16\"] = HEAPU16 = new Uint16Array(b);\n Module[\"HEAP32\"] = HEAP32 = new Int32Array(b);\n Module[\"HEAPU32\"] = HEAPU32 = new Uint32Array(b);\n Module[\"HEAPF32\"] = HEAPF32 = new Float32Array(b);\n Module[\"HEAPF64\"] = HEAPF64 = new Float64Array(b);\n }\n // end include: runtime_shared.js\n // In non-standalone/normal mode, we create the memory here.\n // include: runtime_init_memory.js\n // Create the wasm memory. (Note: this only applies if IMPORTED_MEMORY is defined)\n // check for full engine support (use string 'subarray' to avoid closure compiler confusion)\n if (Module[\"wasmMemory\"]) {\n wasmMemory = Module[\"wasmMemory\"];\n } else {\n var INITIAL_MEMORY = Module[\"INITIAL_MEMORY\"] || 33554432;\n wasmMemory = new WebAssembly.Memory({\n \"initial\": INITIAL_MEMORY / 65536,\n // In theory we should not need to emit the maximum if we want \"unlimited\"\n // or 4GB of memory, but VMs error on that atm, see\n // https://github.com/emscripten-core/emscripten/issues/14130\n // And in the pthreads case we definitely need to emit a maximum. So\n // always emit one.\n \"maximum\": 2147483648 / 65536\n });\n }\n updateMemoryViews();\n // end include: runtime_init_memory.js\n // include: runtime_stack_check.js\n // end include: runtime_stack_check.js\n // include: runtime_assertions.js\n // end include: runtime_assertions.js\n var __ATPRERUN__ = [];\n // functions called before the runtime is initialized\n var __ATINIT__ = [];\n // functions called during startup\n var __ATMAIN__ = [];\n // functions called during shutdown\n var __ATPOSTRUN__ = [];\n // functions called after the main() is called\n var __RELOC_FUNCS__ = [];\n var runtimeInitialized = false;\n function preRun() {\n if (Module[\"preRun\"]) {\n if (typeof Module[\"preRun\"] == \"function\") Module[\"preRun\"] = [ Module[\"preRun\"] ];\n while (Module[\"preRun\"].length) {\n addOnPreRun(Module[\"preRun\"].shift());\n }\n }\n callRuntimeCallbacks(__ATPRERUN__);\n }\n function initRuntime() {\n runtimeInitialized = true;\n callRuntimeCallbacks(__RELOC_FUNCS__);\n callRuntimeCallbacks(__ATINIT__);\n }\n function preMain() {\n callRuntimeCallbacks(__ATMAIN__);\n }\n function postRun() {\n if (Module[\"postRun\"]) {\n if (typeof Module[\"postRun\"] == \"function\") Module[\"postRun\"] = [ Module[\"postRun\"] ];\n while (Module[\"postRun\"].length) {\n addOnPostRun(Module[\"postRun\"].shift());\n }\n }\n callRuntimeCallbacks(__ATPOSTRUN__);\n }\n function addOnPreRun(cb) {\n __ATPRERUN__.unshift(cb);\n }\n function addOnInit(cb) {\n __ATINIT__.unshift(cb);\n }\n function addOnPostRun(cb) {\n __ATPOSTRUN__.unshift(cb);\n }\n // include: runtime_math.js\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/imul\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/fround\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc\n // end include: runtime_math.js\n // A counter of dependencies for calling run(). If we need to\n // do asynchronous work before running, increment this and\n // decrement it. Incrementing must happen in a place like\n // Module.preRun (used by emcc to add file preloading).\n // Note that you can add dependencies in preRun, even though\n // it happens right before run - run will be postponed until\n // the dependencies are met.\n var runDependencies = 0;\n var runDependencyWatcher = null;\n var dependenciesFulfilled = null;\n // overridden to take different actions when all run dependencies are fulfilled\n function getUniqueRunDependency(id) {\n return id;\n }\n function addRunDependency(id) {\n runDependencies++;\n Module[\"monitorRunDependencies\"]?.(runDependencies);\n }\n function removeRunDependency(id) {\n runDependencies--;\n Module[\"monitorRunDependencies\"]?.(runDependencies);\n if (runDependencies == 0) {\n if (runDependencyWatcher !== null) {\n clearInterval(runDependencyWatcher);\n runDependencyWatcher = null;\n }\n if (dependenciesFulfilled) {\n var callback = dependenciesFulfilled;\n dependenciesFulfilled = null;\n callback();\n }\n }\n }\n /** @param {string|number=} what */ function abort(what) {\n Module[\"onAbort\"]?.(what);\n what = \"Aborted(\" + what + \")\";\n // TODO(sbc): Should we remove printing and leave it up to whoever\n // catches the exception?\n err(what);\n ABORT = true;\n EXITSTATUS = 1;\n what += \". Build with -sASSERTIONS for more info.\";\n // Use a wasm runtime error, because a JS error might be seen as a foreign\n // exception, which means we'd run destructors on it. We need the error to\n // simply make the program stop.\n // FIXME This approach does not work in Wasm EH because it currently does not assume\n // all RuntimeErrors are from traps; it decides whether a RuntimeError is from\n // a trap or not based on a hidden field within the object. So at the moment\n // we don't have a way of throwing a wasm trap from JS. TODO Make a JS API that\n // allows this in the wasm spec.\n // Suppress closure compiler warning here. Closure compiler's builtin extern\n // definition for WebAssembly.RuntimeError claims it takes no arguments even\n // though it can.\n // TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure gets fixed.\n /** @suppress {checkTypes} */ var e = new WebAssembly.RuntimeError(what);\n // Throw the error whether or not MODULARIZE is set because abort is used\n // in code paths apart from instantiation where an exception is expected\n // to be thrown when abort is called.\n throw e;\n }\n // include: memoryprofiler.js\n // end include: memoryprofiler.js\n // include: URIUtils.js\n // Prefix of data URIs emitted by SINGLE_FILE and related options.\n var dataURIPrefix = \"data:application/octet-stream;base64,\";\n /**\n * Indicates whether filename is a base64 data URI.\n * @noinline\n */ var isDataURI = filename => filename.startsWith(dataURIPrefix);\n /**\n * Indicates whether filename is delivered via file protocol (as opposed to http/https)\n * @noinline\n */ var isFileURI = filename => filename.startsWith(\"file://\");\n // end include: URIUtils.js\n // include: runtime_exceptions.js\n // end include: runtime_exceptions.js\n function findWasmBinary() {\n var f = \"tree-sitter.wasm\";\n if (!isDataURI(f)) {\n return locateFile(f);\n }\n return f;\n }\n var wasmBinaryFile;\n function getBinarySync(file) {\n if (file == wasmBinaryFile && wasmBinary) {\n return new Uint8Array(wasmBinary);\n }\n if (readBinary) {\n return readBinary(file);\n }\n throw \"both async and sync fetching of the wasm failed\";\n }\n function getBinaryPromise(binaryFile) {\n // If we don't have the binary yet, load it asynchronously using readAsync.\n if (!wasmBinary) {\n // Fetch the binary using readAsync\n return readAsync(binaryFile).then(response => new Uint8Array(/** @type{!ArrayBuffer} */ (response)), // Fall back to getBinarySync if readAsync fails\n () => getBinarySync(binaryFile));\n }\n // Otherwise, getBinarySync should be able to get it synchronously\n return Promise.resolve().then(() => getBinarySync(binaryFile));\n }\n function instantiateArrayBuffer(binaryFile, imports, receiver) {\n return getBinaryPromise(binaryFile).then(binary => WebAssembly.instantiate(binary, imports)).then(receiver, reason => {\n err(`failed to asynchronously prepare wasm: ${reason}`);\n abort(reason);\n });\n }\n function instantiateAsync(binary, binaryFile, imports, callback) {\n if (!binary && typeof WebAssembly.instantiateStreaming == \"function\" && !isDataURI(binaryFile) && // Don't use streaming for file:// delivered objects in a webview, fetch them synchronously.\n !isFileURI(binaryFile) && // Avoid instantiateStreaming() on Node.js environment for now, as while\n // Node.js v18.1.0 implements it, it does not have a full fetch()\n // implementation yet.\n // Reference:\n // https://github.com/emscripten-core/emscripten/pull/16917\n !ENVIRONMENT_IS_NODE && typeof fetch == \"function\") {\n return fetch(binaryFile, {\n credentials: \"same-origin\"\n }).then(response => {\n // Suppress closure warning here since the upstream definition for\n // instantiateStreaming only allows Promise<Repsponse> rather than\n // an actual Response.\n // TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure is fixed.\n /** @suppress {checkTypes} */ var result = WebAssembly.instantiateStreaming(response, imports);\n return result.then(callback, function(reason) {\n // We expect the most common failure cause to be a bad MIME type for the binary,\n // in which case falling back to ArrayBuffer instantiation should work.\n err(`wasm streaming compile failed: ${reason}`);\n err(\"falling back to ArrayBuffer instantiation\");\n return instantiateArrayBuffer(binaryFile, imports, callback);\n });\n });\n }\n return instantiateArrayBuffer(binaryFile, imports, callback);\n }\n function getWasmImports() {\n // prepare imports\n return {\n \"env\": wasmImports,\n \"wasi_snapshot_preview1\": wasmImports,\n \"GOT.mem\": new Proxy(wasmImports, GOTHandler),\n \"GOT.func\": new Proxy(wasmImports, GOTHandler)\n };\n }\n // Create the wasm instance.\n // Receives the wasm imports, returns the exports.\n function createWasm() {\n var info = getWasmImports();\n // Load the wasm module and create an instance of using native support in the JS engine.\n // handle a generated wasm instance, receiving its exports and\n // performing other necessary setup\n /** @param {WebAssembly.Module=} module*/ function receiveInstance(instance, module) {\n wasmExports = instance.exports;\n wasmExports = relocateExports(wasmExports, 1024);\n var metadata = getDylinkMetadata(module);\n if (metadata.neededDynlibs) {\n dynamicLibraries = metadata.neededDynlibs.concat(dynamicLibraries);\n }\n mergeLibSymbols(wasmExports, \"main\");\n LDSO.init();\n loadDylibs();\n addOnInit(wasmExports[\"__wasm_call_ctors\"]);\n __RELOC_FUNCS__.push(wasmExports[\"__wasm_apply_data_relocs\"]);\n removeRunDependency(\"wasm-instantiate\");\n return wasmExports;\n }\n // wait for the pthread pool (if any)\n addRunDependency(\"wasm-instantiate\");\n // Prefer streaming instantiation if available.\n function receiveInstantiationResult(result) {\n // 'result' is a ResultObject object which has both the module and instance.\n // receiveInstance() will swap in the exports (to Module.asm) so they can be called\n receiveInstance(result[\"instance\"], result[\"module\"]);\n }\n // User shell pages can write their own Module.instantiateWasm = function(imports, successCallback) callback\n // to manually instantiate the Wasm module themselves. This allows pages to\n // run the instantiation parallel to any other async startup actions they are\n // performing.\n // Also pthreads and wasm workers initialize the wasm instance through this\n // path.\n if (Module[\"instantiateWasm\"]) {\n try {\n return Module[\"instantiateWasm\"](info, receiveInstance);\n } catch (e) {\n err(`Module.instantiateWasm callback failed with error: ${e}`);\n return false;\n }\n }\n if (!wasmBinaryFile) wasmBinaryFile = findWasmBinary();\n instantiateAsync(wasmBinary, wasmBinaryFile, info, receiveInstantiationResult);\n return {};\n }\n // include: runtime_debug.js\n // end include: runtime_debug.js\n // === Body ===\n var ASM_CONSTS = {};\n // end include: preamble.js\n /** @constructor */ function ExitStatus(status) {\n this.name = \"ExitStatus\";\n this.message = `Program terminated with exit(${status})`;\n this.status = status;\n }\n var GOT = {};\n var currentModuleWeakSymbols = new Set([]);\n var GOTHandler = {\n get(obj, symName) {\n var rtn = GOT[symName];\n if (!rtn) {\n rtn = GOT[symName] = new WebAssembly.Global({\n \"value\": \"i32\",\n \"mutable\": true\n });\n }\n if (!currentModuleWeakSymbols.has(symName)) {\n // Any non-weak reference to a symbol marks it as `required`, which\n // enabled `reportUndefinedSymbols` to report undefeind symbol errors\n // correctly.\n rtn.required = true;\n }\n return rtn;\n }\n };\n var LE_HEAP_LOAD_F32 = byteOffset => HEAP_DATA_VIEW.getFloat32(byteOffset, true);\n var LE_HEAP_LOAD_F64 = byteOffset => HEAP_DATA_VIEW.getFloat64(byteOffset, true);\n var LE_HEAP_LOAD_I16 = byteOffset => HEAP_DATA_VIEW.getInt16(byteOffset, true);\n var LE_HEAP_LOAD_I32 = byteOffset => HEAP_DATA_VIEW.getInt32(byteOffset, true);\n var LE_HEAP_LOAD_U32 = byteOffset => HEAP_DATA_VIEW.getUint32(byteOffset, true);\n var LE_HEAP_STORE_F32 = (byteOffset, value) => HEAP_DATA_VIEW.setFloat32(byteOffset, value, true);\n var LE_HEAP_STORE_F64 = (byteOffset, value) => HEAP_DATA_VIEW.setFloat64(byteOffset, value, true);\n var LE_HEAP_STORE_I16 = (byteOffset, value) => HEAP_DATA_VIEW.setInt16(byteOffset, value, true);\n var LE_HEAP_STORE_I32 = (byteOffset, value) => HEAP_DATA_VIEW.setInt32(byteOffset, value, true);\n var LE_HEAP_STORE_U32 = (byteOffset, value) => HEAP_DATA_VIEW.setUint32(byteOffset, value, true);\n var callRuntimeCallbacks = callbacks => {\n while (callbacks.length > 0) {\n // Pass the module as the first argument.\n callbacks.shift()(Module);\n }\n };\n var UTF8Decoder = typeof TextDecoder != \"undefined\" ? new TextDecoder : undefined;\n /**\n * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given\n * array that contains uint8 values, returns a copy of that string as a\n * Javascript String object.\n * heapOrArray is either a regular array, or a JavaScript typed array view.\n * @param {number} idx\n * @param {number=} maxBytesToRead\n * @return {string}\n */ var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => {\n var endIdx = idx + maxBytesToRead;\n var endPtr = idx;\n // TextDecoder needs to know the byte length in advance, it doesn't stop on\n // null terminator by itself. Also, use the length info to avoid running tiny\n // strings through TextDecoder, since .subarray() allocates garbage.\n // (As a tiny code save trick, compare endPtr against endIdx using a negation,\n // so that undefined means Infinity)\n while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr;\n if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) {\n return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr));\n }\n var str = \"\";\n // If building with TextDecoder, we have already computed the string length\n // above, so test loop end condition against that\n while (idx < endPtr) {\n // For UTF8 byte structure, see:\n // http://en.wikipedia.org/wiki/UTF-8#Description\n // https://www.ietf.org/rfc/rfc2279.txt\n // https://tools.ietf.org/html/rfc3629\n var u0 = heapOrArray[idx++];\n if (!(u0 & 128)) {\n str += String.fromCharCode(u0);\n continue;\n }\n var u1 = heapOrArray[idx++] & 63;\n if ((u0 & 224) == 192) {\n str += String.fromCharCode(((u0 & 31) << 6) | u1);\n continue;\n }\n var u2 = heapOrArray[idx++] & 63;\n if ((u0 & 240) == 224) {\n u0 = ((u0 & 15) << 12) | (u1 << 6) | u2;\n } else {\n u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heapOrArray[idx++] & 63);\n }\n if (u0 < 65536) {\n str += String.fromCharCode(u0);\n } else {\n var ch = u0 - 65536;\n str += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023));\n }\n }\n return str;\n };\n var getDylinkMetadata = binary => {\n var offset = 0;\n var end = 0;\n function getU8() {\n return binary[offset++];\n }\n function getLEB() {\n var ret = 0;\n var mul = 1;\n while (1) {\n var byte = binary[offset++];\n ret += ((byte & 127) * mul);\n mul *= 128;\n if (!(byte & 128)) break;\n }\n return ret;\n }\n function getString() {\n var len = getLEB();\n offset += len;\n return UTF8ArrayToString(binary, offset - len, len);\n }\n /** @param {string=} message */ function failIf(condition, message) {\n if (condition) throw new Error(message);\n }\n var name = \"dylink.0\";\n if (binary instanceof WebAssembly.Module) {\n var dylinkSection = WebAssembly.Module.customSections(binary, name);\n if (dylinkSection.length === 0) {\n name = \"dylink\";\n dylinkSection = WebAssembly.Module.customSections(binary, name);\n }\n failIf(dylinkSection.length === 0, \"need dylink section\");\n binary = new Uint8Array(dylinkSection[0]);\n end = binary.length;\n } else {\n var int32View = new Uint32Array(new Uint8Array(binary.subarray(0, 24)).buffer);\n var magicNumberFound = int32View[0] == 1836278016 || int32View[0] == 6386541;\n failIf(!magicNumberFound, \"need to see wasm magic number\");\n // \\0asm\n // we should see the dylink custom section right after the magic number and wasm version\n failIf(binary[8] !== 0, \"need the dylink section to be first\");\n offset = 9;\n var section_size = getLEB();\n //section size\n end = offset + section_size;\n name = getString();\n }\n var customSection = {\n neededDynlibs: [],\n tlsExports: new Set,\n weakImports: new Set\n };\n if (name == \"dylink\") {\n customSection.memorySize = getLEB();\n customSection.memoryAlign = getLEB();\n customSection.tableSize = getLEB();\n customSection.tableAlign = getLEB();\n // shared libraries this module needs. We need to load them first, so that\n // current module could resolve its imports. (see tools/shared.py\n // WebAssembly.make_shared_library() for \"dylink\" section extension format)\n var neededDynlibsCount = getLEB();\n for (var i = 0; i < neededDynlibsCount; ++i) {\n var libname = getString();\n customSection.neededDynlibs.push(libname);\n }\n } else {\n failIf(name !== \"dylink.0\");\n var WASM_DYLINK_MEM_INFO = 1;\n var WASM_DYLINK_NEEDED = 2;\n var WASM_DYLINK_EXPORT_INFO = 3;\n var WASM_DYLINK_IMPORT_INFO = 4;\n var WASM_SYMBOL_TLS = 256;\n var WASM_SYMBOL_BINDING_MASK = 3;\n var WASM_SYMBOL_BINDING_WEAK = 1;\n while (offset < end) {\n var subsectionType = getU8();\n var subsectionSize = getLEB();\n if (subsectionType === WASM_DYLINK_MEM_INFO) {\n customSection.memorySize = getLEB();\n customSection.memoryAlign = getLEB();\n customSection.tableSize = getLEB();\n customSection.tableAlign = getLEB();\n } else if (subsectionType === WASM_DYLINK_NEEDED) {\n var neededDynlibsCount = getLEB();\n for (var i = 0; i < neededDynlibsCount; ++i) {\n libname = getString();\n customSection.neededDynlibs.push(libname);\n }\n } else if (subsectionType === WASM_DYLINK_EXPORT_INFO) {\n var count = getLEB();\n while (count--) {\n var symname = getString();\n var flags = getLEB();\n if (flags & WASM_SYMBOL_TLS) {\n customSection.tlsExports.add(symname);\n }\n }\n } else if (subsectionType === WASM_DYLINK_IMPORT_INFO) {\n var count = getLEB();\n while (count--) {\n var modname = getString();\n var symname = getString();\n var flags = getLEB();\n if ((flags & WASM_SYMBOL_BINDING_MASK) == WASM_SYMBOL_BINDING_WEAK) {\n customSection.weakImports.add(symname);\n }\n }\n } else {\n // unknown subsection\n offset += subsectionSize;\n }\n }\n }\n return customSection;\n };\n /**\n * @param {number} ptr\n * @param {string} type\n */ function getValue(ptr, type = \"i8\") {\n if (type.endsWith(\"*\")) type = \"*\";\n switch (type) {\n case \"i1\":\n return HEAP8[ptr];\n\n case \"i8\":\n return HEAP8[ptr];\n\n case \"i16\":\n return LE_HEAP_LOAD_I16(((ptr) >> 1) * 2);\n\n case \"i32\":\n return LE_HEAP_LOAD_I32(((ptr) >> 2) * 4);\n\n case \"i64\":\n abort(\"to do getValue(i64) use WASM_BIGINT\");\n\n case \"float\":\n return LE_HEAP_LOAD_F32(((ptr) >> 2) * 4);\n\n case \"double\":\n return LE_HEAP_LOAD_F64(((ptr) >> 3) * 8);\n\n case \"*\":\n return LE_HEAP_LOAD_U32(((ptr) >> 2) * 4);\n\n default:\n abort(`invalid type for getValue: ${type}`);\n }\n }\n var newDSO = (name, handle, syms) => {\n var dso = {\n refcount: Infinity,\n name: name,\n exports: syms,\n global: true\n };\n LDSO.loadedLibsByName[name] = dso;\n if (handle != undefined) {\n LDSO.loadedLibsByHandle[handle] = dso;\n }\n return dso;\n };\n var LDSO = {\n loadedLibsByName: {},\n loadedLibsByHandle: {},\n init() {\n newDSO(\"__main__\", 0, wasmImports);\n }\n };\n var ___heap_base = 78112;\n var zeroMemory = (address, size) => {\n HEAPU8.fill(0, address, address + size);\n return address;\n };\n var alignMemory = (size, alignment) => Math.ceil(size / alignment) * alignment;\n var getMemory = size => {\n // After the runtime is initialized, we must only use sbrk() normally.\n if (runtimeInitialized) {\n // Currently we don't support freeing of static data when modules are\n // unloaded via dlclose. This function is tagged as `noleakcheck` to\n // avoid having this reported as leak.\n return zeroMemory(_malloc(size), size);\n }\n var ret = ___heap_base;\n // Keep __heap_base stack aligned.\n var end = ret + alignMemory(size, 16);\n ___heap_base = end;\n GOT[\"__heap_base\"].value = end;\n return ret;\n };\n var isInternalSym = symName => [ \"__cpp_exception\", \"__c_longjmp\", \"__wasm_apply_data_relocs\", \"__dso_handle\", \"__tls_size\", \"__tls_align\", \"__set_stack_limits\", \"_emscripten_tls_init\", \"__wasm_init_tls\", \"__wasm_call_ctors\", \"__start_em_asm\", \"__stop_em_asm\", \"__start_em_js\", \"__stop_em_js\" ].includes(symName) || symName.startsWith(\"__em_js__\");\n var uleb128Encode = (n, target) => {\n if (n < 128) {\n target.push(n);\n } else {\n target.push((n % 128) | 128, n >> 7);\n }\n };\n var sigToWasmTypes = sig => {\n var typeNames = {\n \"i\": \"i32\",\n \"j\": \"i64\",\n \"f\": \"f32\",\n \"d\": \"f64\",\n \"e\": \"externref\",\n \"p\": \"i32\"\n };\n var type = {\n parameters: [],\n results: sig[0] == \"v\" ? [] : [ typeNames[sig[0]] ]\n };\n for (var i = 1; i < sig.length; ++i) {\n type.parameters.push(typeNames[sig[i]]);\n }\n return type;\n };\n var generateFuncType = (sig, target) => {\n var sigRet = sig.slice(0, 1);\n var sigParam = sig.slice(1);\n var typeCodes = {\n \"i\": 127,\n // i32\n \"p\": 127,\n // i32\n \"j\": 126,\n // i64\n \"f\": 125,\n // f32\n \"d\": 124,\n // f64\n \"e\": 111\n };\n // Parameters, length + signatures\n target.push(96);\n /* form: func */ uleb128Encode(sigParam.length, target);\n for (var i = 0; i < sigParam.length; ++i) {\n target.push(typeCodes[sigParam[i]]);\n }\n // Return values, length + signatures\n // With no multi-return in MVP, either 0 (void) or 1 (anything else)\n if (sigRet == \"v\") {\n target.push(0);\n } else {\n target.push(1, typeCodes[sigRet]);\n }\n };\n var convertJsFunctionToWasm = (func, sig) => {\n // If the type reflection proposal is available, use the new\n // \"WebAssembly.Function\" constructor.\n // Otherwise, construct a minimal wasm module importing the JS function and\n // re-exporting it.\n if (typeof WebAssembly.Function == \"function\") {\n return new WebAssembly.Function(sigToWasmTypes(sig), func);\n }\n // The module is static, with the exception of the type section, which is\n // generated based on the signature passed in.\n var typeSectionBody = [ 1 ];\n // count: 1\n generateFuncType(sig, typeSectionBody);\n // Rest of the module is static\n var bytes = [ 0, 97, 115, 109, // magic (\"\\0asm\")\n 1, 0, 0, 0, // version: 1\n 1 ];\n // Write the overall length of the type section followed by the body\n uleb128Encode(typeSectionBody.length, bytes);\n bytes.push(...typeSectionBody);\n // The rest of the module is static\n bytes.push(2, 7, // import section\n // (import \"e\" \"f\" (func 0 (type 0)))\n 1, 1, 101, 1, 102, 0, 0, 7, 5, // export section\n // (export \"f\" (func 0 (type 0)))\n 1, 1, 102, 0, 0);\n // We can compile this wasm module synchronously because it is very small.\n // This accepts an import (at \"e.f\"), that it reroutes to an export (at \"f\")\n var module = new WebAssembly.Module(new Uint8Array(bytes));\n var instance = new WebAssembly.Instance(module, {\n \"e\": {\n \"f\": func\n }\n });\n var wrappedFunc = instance.exports[\"f\"];\n return wrappedFunc;\n };\n var wasmTableMirror = [];\n /** @type {WebAssembly.Table} */ var wasmTable = new WebAssembly.Table({\n \"initial\": 28,\n \"element\": \"anyfunc\"\n });\n var getWasmTableEntry = funcPtr => {\n var func = wasmTableMirror[funcPtr];\n if (!func) {\n if (funcPtr >= wasmTableMirror.length) wasmTableMirror.length = funcPtr + 1;\n wasmTableMirror[funcPtr] = func = wasmTable.get(funcPtr);\n }\n return func;\n };\n var updateTableMap = (offset, count) => {\n if (functionsInTableMap) {\n for (var i = offset; i < offset + count; i++) {\n var item = getWasmTableEntry(i);\n // Ignore null values.\n if (item) {\n functionsInTableMap.set(item, i);\n }\n }\n }\n };\n var functionsInTableMap;\n var getFunctionAddress = func => {\n // First, create the map if this is the first use.\n if (!functionsInTableMap) {\n functionsInTableMap = new WeakMap;\n updateTableMap(0, wasmTable.length);\n }\n return functionsInTableMap.get(func) || 0;\n };\n var freeTableIndexes = [];\n var getEmptyTableSlot = () => {\n // Reuse a free index if there is one, otherwise grow.\n if (freeTableIndexes.length) {\n return freeTableIndexes.pop();\n }\n // Grow the table\n try {\n wasmTable.grow(1);\n } catch (err) {\n if (!(err instanceof RangeError)) {\n throw err;\n }\n throw \"Unable to grow wasm table. Set ALLOW_TABLE_GROWTH.\";\n }\n return wasmTable.length - 1;\n };\n var setWasmTableEntry = (idx, func) => {\n wasmTable.set(idx, func);\n // With ABORT_ON_WASM_EXCEPTIONS wasmTable.get is overridden to return wrapped\n // functions so we need to call it here to retrieve the potential wrapper correctly\n // instead of just storing 'func' directly into wasmTableMirror\n wasmTableMirror[idx] = wasmTable.get(idx);\n };\n /** @param {string=} sig */ var addFunction = (func, sig) => {\n // Check if the function is already in the table, to ensure each function\n // gets a unique index.\n var rtn = getFunctionAddress(func);\n if (rtn) {\n return rtn;\n }\n // It's not in the table, add it now.\n var ret = getEmptyTableSlot();\n // Set the new value.\n try {\n // Attempting to call this with JS function will cause of table.set() to fail\n setWasmTableEntry(ret, func);\n } catch (err) {\n if (!(err instanceof TypeError)) {\n throw err;\n }\n var wrapped = convertJsFunctionToWasm(func, sig);\n setWasmTableEntry(ret, wrapped);\n }\n functionsInTableMap.set(func, ret);\n return ret;\n };\n var updateGOT = (exports, replace) => {\n for (var symName in exports) {\n if (isInternalSym(symName)) {\n continue;\n }\n var value = exports[symName];\n if (symName.startsWith(\"orig$\")) {\n symName = symName.split(\"$\")[1];\n replace = true;\n }\n GOT[symName] ||= new WebAssembly.Global({\n \"value\": \"i32\",\n \"mutable\": true\n });\n if (replace || GOT[symName].value == 0) {\n if (typeof value == \"function\") {\n GOT[symName].value = addFunction(value);\n } else if (typeof value == \"number\") {\n GOT[symName].value = value;\n } else {\n err(`unhandled export type for '${symName}': ${typeof value}`);\n }\n }\n }\n };\n /** @param {boolean=} replace */ var relocateExports = (exports, memoryBase, replace) => {\n var relocated = {};\n for (var e in exports) {\n var value = exports[e];\n if (typeof value == \"object\") {\n // a breaking change in the wasm spec, globals are now objects\n // https://github.com/WebAssembly/mutable-global/issues/1\n value = value.value;\n }\n if (typeof value == \"number\") {\n value += memoryBase;\n }\n relocated[e] = value;\n }\n updateGOT(relocated, replace);\n return relocated;\n };\n var isSymbolDefined = symName => {\n // Ignore 'stub' symbols that are auto-generated as part of the original\n // `wasmImports` used to instantiate the main module.\n var existing = wasmImports[symName];\n if (!existing || existing.stub) {\n return false;\n }\n return true;\n };\n var dynCallLegacy = (sig, ptr, args) => {\n sig = sig.replace(/p/g, \"i\");\n var f = Module[\"dynCall_\" + sig];\n return f(ptr, ...args);\n };\n var dynCall = (sig, ptr, args = []) => {\n // Without WASM_BIGINT support we cannot directly call function with i64 as\n // part of their signature, so we rely on the dynCall functions generated by\n // wasm-emscripten-finalize\n if (sig.includes(\"j\")) {\n return dynCallLegacy(sig, ptr, args);\n }\n var rtn = getWasmTableEntry(ptr)(...args);\n return rtn;\n };\n var stackSave = () => _emscripten_stack_get_current();\n var stackRestore = val => __emscripten_stack_restore(val);\n var createInvokeFunction = sig => (ptr, ...args) => {\n var sp = stackSave();\n try {\n return dynCall(sig, ptr, args);\n } catch (e) {\n stackRestore(sp);\n // Create a try-catch guard that rethrows the Emscripten EH exception.\n // Exceptions thrown from C++ will be a pointer (number) and longjmp\n // will throw the number Infinity. Use the compact and fast \"e !== e+0\"\n // test to check if e was not a Number.\n if (e !== e + 0) throw e;\n _setThrew(1, 0);\n }\n };\n var resolveGlobalSymbol = (symName, direct = false) => {\n var sym;\n // First look for the orig$ symbol which is the symbol without i64\n // legalization performed.\n if (direct && (\"orig$\" + symName in wasmImports)) {\n symName = \"orig$\" + symName;\n }\n if (isSymbolDefined(symName)) {\n sym = wasmImports[symName];\n } else // Asm.js-style exception handling: invoke wrapper generation\n if (symName.startsWith(\"invoke_\")) {\n // Create (and cache) new invoke_ functions on demand.\n sym = wasmImports[symName] = createInvokeFunction(symName.split(\"_\")[1]);\n }\n return {\n sym: sym,\n name: symName\n };\n };\n /**\n * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the\n * emscripten HEAP, returns a copy of that string as a Javascript String object.\n *\n * @param {number} ptr\n * @param {number=} maxBytesToRead - An optional length that specifies the\n * maximum number of bytes to read. You can omit this parameter to scan the\n * string until the first 0 byte. If maxBytesToRead is passed, and the string\n * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the\n * string will cut short at that byte index (i.e. maxBytesToRead will not\n * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing\n * frequent uses of UTF8ToString() with and without maxBytesToRead may throw\n * JS JIT optimizations off, so it is worth to consider consistently using one\n * @return {string}\n */ var UTF8ToString = (ptr, maxBytesToRead) => ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : \"\";\n /**\n * @param {string=} libName\n * @param {Object=} localScope\n * @param {number=} handle\n */ var loadWebAssemblyModule = (binary, flags, libName, localScope, handle) => {\n var metadata = getDylinkMetadata(binary);\n currentModuleWeakSymbols = metadata.weakImports;\n // loadModule loads the wasm module after all its dependencies have been loaded.\n // can be called both sync/async.\n function loadModule() {\n // The first thread to load a given module needs to allocate the static\n // table and memory regions. Later threads re-use the same table region\n // and can ignore the memory region (since memory is shared between\n // threads already).\n // If `handle` is specified than it is assumed that the calling thread has\n // exclusive access to it for the duration of this function. See the\n // locking in `dynlink.c`.\n var firstLoad = !handle || !HEAP8[(handle) + (8)];\n if (firstLoad) {\n // alignments are powers of 2\n var memAlign = Math.pow(2, metadata.memoryAlign);\n // prepare memory\n var memoryBase = metadata.memorySize ? alignMemory(getMemory(metadata.memorySize + memAlign), memAlign) : 0;\n // TODO: add to cleanups\n var tableBase = metadata.tableSize ? wasmTable.length : 0;\n if (handle) {\n HEAP8[(handle) + (8)] = 1;\n LE_HEAP_STORE_U32((((handle) + (12)) >> 2) * 4, memoryBase);\n LE_HEAP_STORE_I32((((handle) + (16)) >> 2) * 4, metadata.memorySize);\n LE_HEAP_STORE_U32((((handle) + (20)) >> 2) * 4, tableBase);\n LE_HEAP_STORE_I32((((handle) + (24)) >> 2) * 4, metadata.tableSize);\n }\n } else {\n memoryBase = LE_HEAP_LOAD_U32((((handle) + (12)) >> 2) * 4);\n tableBase = LE_HEAP_LOAD_U32((((handle) + (20)) >> 2) * 4);\n }\n var tableGrowthNeeded = tableBase + metadata.tableSize - wasmTable.length;\n if (tableGrowthNeeded > 0) {\n wasmTable.grow(tableGrowthNeeded);\n }\n // This is the export map that we ultimately return. We declare it here\n // so it can be used within resolveSymbol. We resolve symbols against\n // this local symbol map in the case there they are not present on the\n // global Module object. We need this fallback because Modules sometime\n // need to import their own symbols\n var moduleExports;\n function resolveSymbol(sym) {\n var resolved = resolveGlobalSymbol(sym).sym;\n if (!resolved && localScope) {\n resolved = localScope[sym];\n }\n if (!resolved) {\n resolved = moduleExports[sym];\n }\n return resolved;\n }\n // TODO kill ↓↓↓ (except \"symbols local to this module\", it will likely be\n // not needed if we require that if A wants symbols from B it has to link\n // to B explicitly: similarly to -Wl,--no-undefined)\n // wasm dynamic libraries are pure wasm, so they cannot assist in\n // their own loading. When side module A wants to import something\n // provided by a side module B that is loaded later, we need to\n // add a layer of indirection, but worse, we can't even tell what\n // to add the indirection for, without inspecting what A's imports\n // are. To do that here, we use a JS proxy (another option would\n // be to inspect the binary directly).\n var proxyHandler = {\n get(stubs, prop) {\n // symbols that should be local to this module\n switch (prop) {\n case \"__memory_base\":\n return memoryBase;\n\n case \"__table_base\":\n return tableBase;\n }\n if (prop in wasmImports && !wasmImports[prop].stub) {\n // No stub needed, symbol already exists in symbol table\n return wasmImports[prop];\n }\n // Return a stub function that will resolve the symbol\n // when first called.\n if (!(prop in stubs)) {\n var resolved;\n stubs[prop] = (...args) => {\n resolved ||= resolveSymbol(prop);\n return resolved(...args);\n };\n }\n return stubs[prop];\n }\n };\n var proxy = new Proxy({}, proxyHandler);\n var info = {\n \"GOT.mem\": new Proxy({}, GOTHandler),\n \"GOT.func\": new Proxy({}, GOTHandler),\n \"env\": proxy,\n \"wasi_snapshot_preview1\": proxy\n };\n function postInstantiation(module, instance) {\n // add new entries to functionsInTableMap\n updateTableMap(tableBase, metadata.tableSize);\n moduleExports = relocateExports(instance.exports, memoryBase);\n if (!flags.allowUndefined) {\n reportUndefinedSymbols();\n }\n function addEmAsm(addr, body) {\n var args = [];\n var arity = 0;\n for (;arity < 16; arity++) {\n if (body.indexOf(\"$\" + arity) != -1) {\n args.push(\"$\" + arity);\n } else {\n break;\n }\n }\n args = args.join(\",\");\n var func = `(${args}) => { ${body} };`;\n ASM_CONSTS[start] = eval(func);\n }\n // Add any EM_ASM function that exist in the side module\n if (\"__start_em_asm\" in moduleExports) {\n var start = moduleExports[\"__start_em_asm\"];\n var stop = moduleExports[\"__stop_em_asm\"];\n while (start < stop) {\n var jsString = UTF8ToString(start);\n addEmAsm(start, jsString);\n start = HEAPU8.indexOf(0, start) + 1;\n }\n }\n function addEmJs(name, cSig, body) {\n // The signature here is a C signature (e.g. \"(int foo, char* bar)\").\n // See `create_em_js` in emcc.py` for the build-time version of this\n // code.\n var jsArgs = [];\n cSig = cSig.slice(1, -1);\n if (cSig != \"void\") {\n cSig = cSig.split(\",\");\n for (var i in cSig) {\n var jsArg = cSig[i].split(\" \").pop();\n jsArgs.push(jsArg.replace(\"*\", \"\"));\n }\n }\n var func = `(${jsArgs}) => ${body};`;\n moduleExports[name] = eval(func);\n }\n for (var name in moduleExports) {\n if (name.startsWith(\"__em_js__\")) {\n var start = moduleExports[name];\n var jsString = UTF8ToString(start);\n // EM_JS strings are stored in the data section in the form\n // SIG<::>BODY.\n var parts = jsString.split(\"<::>\");\n addEmJs(name.replace(\"__em_js__\", \"\"), parts[0], parts[1]);\n delete moduleExports[name];\n }\n }\n // initialize the module\n var applyRelocs = moduleExports[\"__wasm_apply_data_relocs\"];\n if (applyRelocs) {\n if (runtimeInitialized) {\n applyRelocs();\n } else {\n __RELOC_FUNCS__.push(applyRelocs);\n }\n }\n var init = moduleExports[\"__wasm_call_ctors\"];\n if (init) {\n if (runtimeInitialized) {\n init();\n } else {\n // we aren't ready to run compiled code yet\n __ATINIT__.push(init);\n }\n }\n return moduleExports;\n }\n if (flags.loadAsync) {\n if (binary instanceof WebAssembly.Module) {\n var instance = new WebAssembly.Instance(binary, info);\n return Promise.resolve(postInstantiation(binary, instance));\n }\n return WebAssembly.instantiate(binary, info).then(result => postInstantiation(result.module, result.instance));\n }\n var module = binary instanceof WebAssembly.Module ? binary : new WebAssembly.Module(binary);\n var instance = new WebAssembly.Instance(module, info);\n return postInstantiation(module, instance);\n }\n // now load needed libraries and the module itself.\n if (flags.loadAsync) {\n return metadata.neededDynlibs.reduce((chain, dynNeeded) => chain.then(() => loadDynamicLibrary(dynNeeded, flags, localScope)), Promise.resolve()).then(loadModule);\n }\n metadata.neededDynlibs.forEach(needed => loadDynamicLibrary(needed, flags, localScope));\n return loadModule();\n };\n var mergeLibSymbols = (exports, libName) => {\n // add symbols into global namespace TODO: weak linking etc.\n for (var [sym, exp] of Object.entries(exports)) {\n // When RTLD_GLOBAL is enabled, the symbols defined by this shared object\n // will be made available for symbol resolution of subsequently loaded\n // shared objects.\n // We should copy the symbols (which include methods and variables) from\n // SIDE_MODULE to MAIN_MODULE.\n const setImport = target => {\n if (!isSymbolDefined(target)) {\n wasmImports[target] = exp;\n }\n };\n setImport(sym);\n // Special case for handling of main symbol: If a side module exports\n // `main` that also acts a definition for `__main_argc_argv` and vice\n // versa.\n const main_alias = \"__main_argc_argv\";\n if (sym == \"main\") {\n setImport(main_alias);\n }\n if (sym == main_alias) {\n setImport(\"main\");\n }\n if (sym.startsWith(\"dynCall_\") && !Module.hasOwnProperty(sym)) {\n Module[sym] = exp;\n }\n }\n };\n /** @param {boolean=} noRunDep */ var asyncLoad = (url, onload, onerror, noRunDep) => {\n var dep = !noRunDep ? getUniqueRunDependency(`al ${url}`) : \"\";\n readAsync(url).then(arrayBuffer => {\n onload(new Uint8Array(arrayBuffer));\n if (dep) removeRunDependency(dep);\n }, err => {\n if (onerror) {\n onerror();\n } else {\n throw `Loading data file \"${url}\" failed.`;\n }\n });\n if (dep) addRunDependency(dep);\n };\n /**\n * @param {number=} handle\n * @param {Object=} localScope\n */ function loadDynamicLibrary(libName, flags = {\n global: true,\n nodelete: true\n }, localScope, handle) {\n // when loadDynamicLibrary did not have flags, libraries were loaded\n // globally & permanently\n var dso = LDSO.loadedLibsByName[libName];\n if (dso) {\n // the library is being loaded or has been loaded already.\n if (!flags.global) {\n if (localScope) {\n Object.assign(localScope, dso.exports);\n }\n } else if (!dso.global) {\n // The library was previously loaded only locally but not\n // we have a request with global=true.\n dso.global = true;\n mergeLibSymbols(dso.exports, libName);\n }\n // same for \"nodelete\"\n if (flags.nodelete && dso.refcount !== Infinity) {\n dso.refcount = Infinity;\n }\n dso.refcount++;\n if (handle) {\n LDSO.loadedLibsByHandle[handle] = dso;\n }\n return flags.loadAsync ? Promise.resolve(true) : true;\n }\n // allocate new DSO\n dso = newDSO(libName, handle, \"loading\");\n dso.refcount = flags.nodelete ? Infinity : 1;\n dso.global = flags.global;\n // libName -> libData\n function loadLibData() {\n // for wasm, we can use fetch for async, but for fs mode we can only imitate it\n if (handle) {\n var data = LE_HEAP_LOAD_U32((((handle) + (28)) >> 2) * 4);\n var dataSize = LE_HEAP_LOAD_U32((((handle) + (32)) >> 2) * 4);\n if (data && dataSize) {\n var libData = HEAP8.slice(data, data + dataSize);\n return flags.loadAsync ? Promise.resolve(libData) : libData;\n }\n }\n var libFile = locateFile(libName);\n if (flags.loadAsync) {\n return new Promise(function(resolve, reject) {\n asyncLoad(libFile, resolve, reject);\n });\n }\n // load the binary synchronously\n if (!readBinary) {\n throw new Error(`${libFile}: file not found, and synchronous loading of external files is not available`);\n }\n return readBinary(libFile);\n }\n // libName -> exports\n function getExports() {\n // module not preloaded - load lib data and create new module from it\n if (flags.loadAsync) {\n return loadLibData().then(libData => loadWebAssemblyModule(libData, flags, libName, localScope, handle));\n }\n return loadWebAssemblyModule(loadLibData(), flags, libName, localScope, handle);\n }\n // module for lib is loaded - update the dso & global namespace\n function moduleLoaded(exports) {\n if (dso.global) {\n mergeLibSymbols(exports, libName);\n } else if (localScope) {\n Object.assign(localScope, exports);\n }\n dso.exports = exports;\n }\n if (flags.loadAsync) {\n return getExports().then(exports => {\n moduleLoaded(exports);\n return true;\n });\n }\n moduleLoaded(getExports());\n return true;\n }\n var reportUndefinedSymbols = () => {\n for (var [symName, entry] of Object.entries(GOT)) {\n if (entry.value == 0) {\n var value = resolveGlobalSymbol(symName, true).sym;\n if (!value && !entry.required) {\n // Ignore undefined symbols that are imported as weak.\n continue;\n }\n if (typeof value == \"function\") {\n /** @suppress {checkTypes} */ entry.value = addFunction(value, value.sig);\n } else if (typeof value == \"number\") {\n entry.value = value;\n } else {\n throw new Error(`bad export type for '${symName}': ${typeof value}`);\n }\n }\n }\n };\n var loadDylibs = () => {\n if (!dynamicLibraries.length) {\n reportUndefinedSymbols();\n return;\n }\n // Load binaries asynchronously\n addRunDependency(\"loadDylibs\");\n dynamicLibraries.reduce((chain, lib) => chain.then(() => loadDynamicLibrary(lib, {\n loadAsync: true,\n global: true,\n nodelete: true,\n allowUndefined: true\n })), Promise.resolve()).then(() => {\n // we got them all, wonderful\n reportUndefinedSymbols();\n removeRunDependency(\"loadDylibs\");\n });\n };\n var noExitRuntime = Module[\"noExitRuntime\"] || true;\n /**\n * @param {number} ptr\n * @param {number} value\n * @param {string} type\n */ function setValue(ptr, value, type = \"i8\") {\n if (type.endsWith(\"*\")) type = \"*\";\n switch (type) {\n case \"i1\":\n HEAP8[ptr] = value;\n break;\n\n case \"i8\":\n HEAP8[ptr] = value;\n break;\n\n case \"i16\":\n LE_HEAP_STORE_I16(((ptr) >> 1) * 2, value);\n break;\n\n case \"i32\":\n LE_HEAP_STORE_I32(((ptr) >> 2) * 4, value);\n break;\n\n case \"i64\":\n abort(\"to do setValue(i64) use WASM_BIGINT\");\n\n case \"float\":\n LE_HEAP_STORE_F32(((ptr) >> 2) * 4, value);\n break;\n\n case \"double\":\n LE_HEAP_STORE_F64(((ptr) >> 3) * 8, value);\n break;\n\n case \"*\":\n LE_HEAP_STORE_U32(((ptr) >> 2) * 4, value);\n break;\n\n default:\n abort(`invalid type for setValue: ${type}`);\n }\n }\n var ___memory_base = new WebAssembly.Global({\n \"value\": \"i32\",\n \"mutable\": false\n }, 1024);\n var ___stack_pointer = new WebAssembly.Global({\n \"value\": \"i32\",\n \"mutable\": true\n }, 78112);\n var ___table_base = new WebAssembly.Global({\n \"value\": \"i32\",\n \"mutable\": false\n }, 1);\n var __abort_js = () => {\n abort(\"\");\n };\n __abort_js.sig = \"v\";\n var nowIsMonotonic = 1;\n var __emscripten_get_now_is_monotonic = () => nowIsMonotonic;\n __emscripten_get_now_is_monotonic.sig = \"i\";\n var __emscripten_memcpy_js = (dest, src, num) => HEAPU8.copyWithin(dest, src, src + num);\n __emscripten_memcpy_js.sig = \"vppp\";\n var _emscripten_date_now = () => Date.now();\n _emscripten_date_now.sig = \"d\";\n var _emscripten_get_now;\n // Modern environment where performance.now() is supported:\n // N.B. a shorter form \"_emscripten_get_now = performance.now;\" is\n // unfortunately not allowed even in current browsers (e.g. FF Nightly 75).\n _emscripten_get_now = () => performance.now();\n _emscripten_get_now.sig = \"d\";\n var getHeapMax = () => // Stay one Wasm page short of 4GB: while e.g. Chrome is able to allocate\n // full 4GB Wasm memories, the size will wrap back to 0 bytes in Wasm side\n // for any code that deals with heap sizes, which would require special\n // casing all heap size related code to treat 0 specially.\n 2147483648;\n var growMemory = size => {\n var b = wasmMemory.buffer;\n var pages = (size - b.byteLength + 65535) / 65536;\n try {\n // round size grow request up to wasm page size (fixed 64KB per spec)\n wasmMemory.grow(pages);\n // .grow() takes a delta compared to the previous size\n updateMemoryViews();\n return 1;\n } /*success*/ catch (e) {}\n };\n // implicit 0 return to save code size (caller will cast \"undefined\" into 0\n // anyhow)\n var _emscripten_resize_heap = requestedSize => {\n var oldSize = HEAPU8.length;\n // With CAN_ADDRESS_2GB or MEMORY64, pointers are already unsigned.\n requestedSize >>>= 0;\n // With multithreaded builds, races can happen (another thread might increase the size\n // in between), so return a failure, and let the caller retry.\n // Memory resize rules:\n // 1. Always increase heap size to at least the requested size, rounded up\n // to next page multiple.\n // 2a. If MEMORY_GROWTH_LINEAR_STEP == -1, excessively resize the heap\n // geometrically: increase the heap size according to\n // MEMORY_GROWTH_GEOMETRIC_STEP factor (default +20%), At most\n // overreserve by MEMORY_GROWTH_GEOMETRIC_CAP bytes (default 96MB).\n // 2b. If MEMORY_GROWTH_LINEAR_STEP != -1, excessively resize the heap\n // linearly: increase the heap size by at least\n // MEMORY_GROWTH_LINEAR_STEP bytes.\n // 3. Max size for the heap is capped at 2048MB-WASM_PAGE_SIZE, or by\n // MAXIMUM_MEMORY, or by ASAN limit, depending on which is smallest\n // 4. If we were unable to allocate as much memory, it may be due to\n // over-eager decision to excessively reserve due to (3) above.\n // Hence if an allocation fails, cut down on the amount of excess\n // growth, in an attempt to succeed to perform a smaller allocation.\n // A limit is set for how much we can grow. We should not exceed that\n // (the wasm binary specifies it, so if we tried, we'd fail anyhow).\n var maxHeapSize = getHeapMax();\n if (requestedSize > maxHeapSize) {\n return false;\n }\n var alignUp = (x, multiple) => x + (multiple - x % multiple) % multiple;\n // Loop through potential heap size increases. If we attempt a too eager\n // reservation that fails, cut down on the attempted size and reserve a\n // smaller bump instead. (max 3 times, chosen somewhat arbitrarily)\n for (var cutDown = 1; cutDown <= 4; cutDown *= 2) {\n var overGrownHeapSize = oldSize * (1 + .2 / cutDown);\n // ensure geometric growth\n // but limit overreserving (default to capping at +96MB overgrowth at most)\n overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296);\n var newSize = Math.min(maxHeapSize, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536));\n var replacement = growMemory(newSize);\n if (replacement) {\n return true;\n }\n }\n return false;\n };\n _emscripten_resize_heap.sig = \"ip\";\n var _fd_close = fd => 52;\n _fd_close.sig = \"ii\";\n var convertI32PairToI53Checked = (lo, hi) => ((hi + 2097152) >>> 0 < 4194305 - !!lo) ? (lo >>> 0) + hi * 4294967296 : NaN;\n function _fd_seek(fd, offset_low, offset_high, whence, newOffset) {\n var offset = convertI32PairToI53Checked(offset_low, offset_high);\n return 70;\n }\n _fd_seek.sig = \"iiiiip\";\n var printCharBuffers = [ null, [], [] ];\n var printChar = (stream, curr) => {\n var buffer = printCharBuffers[stream];\n if (curr === 0 || curr === 10) {\n (stream === 1 ? out : err)(UTF8ArrayToString(buffer, 0));\n buffer.length = 0;\n } else {\n buffer.push(curr);\n }\n };\n var _fd_write = (fd, iov, iovcnt, pnum) => {\n // hack to support printf in SYSCALLS_REQUIRE_FILESYSTEM=0\n var num = 0;\n for (var i = 0; i < iovcnt; i++) {\n var ptr = LE_HEAP_LOAD_U32(((iov) >> 2) * 4);\n var len = LE_HEAP_LOAD_U32((((iov) + (4)) >> 2) * 4);\n iov += 8;\n for (var j = 0; j < len; j++) {\n printChar(fd, HEAPU8[ptr + j]);\n }\n num += len;\n }\n LE_HEAP_STORE_U32(((pnum) >> 2) * 4, num);\n return 0;\n };\n _fd_write.sig = \"iippp\";\n function _tree_sitter_log_callback(isLexMessage, messageAddress) {\n if (currentLogCallback) {\n const message = UTF8ToString(messageAddress);\n currentLogCallback(message, isLexMessage !== 0);\n }\n }\n function _tree_sitter_parse_callback(inputBufferAddress, index, row, column, lengthAddress) {\n const INPUT_BUFFER_SIZE = 10 * 1024;\n const string = currentParseCallback(index, {\n row: row,\n column: column\n });\n if (typeof string === \"string\") {\n setValue(lengthAddress, string.length, \"i32\");\n stringToUTF16(string, inputBufferAddress, INPUT_BUFFER_SIZE);\n } else {\n setValue(lengthAddress, 0, \"i32\");\n }\n }\n var runtimeKeepaliveCounter = 0;\n var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0;\n var _proc_exit = code => {\n EXITSTATUS = code;\n if (!keepRuntimeAlive()) {\n Module[\"onExit\"]?.(code);\n ABORT = true;\n }\n quit_(code, new ExitStatus(code));\n };\n _proc_exit.sig = \"vi\";\n /** @param {boolean|number=} implicit */ var exitJS = (status, implicit) => {\n EXITSTATUS = status;\n _proc_exit(status);\n };\n var handleException = e => {\n // Certain exception types we do not treat as errors since they are used for\n // internal control flow.\n // 1. ExitStatus, which is thrown by exit()\n // 2. \"unwind\", which is thrown by emscripten_unwind_to_js_event_loop() and others\n // that wish to return to JS event loop.\n if (e instanceof ExitStatus || e == \"unwind\") {\n return EXITSTATUS;\n }\n quit_(1, e);\n };\n var lengthBytesUTF8 = str => {\n var len = 0;\n for (var i = 0; i < str.length; ++i) {\n // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code\n // unit, not a Unicode code point of the character! So decode\n // UTF16->UTF32->UTF8.\n // See http://unicode.org/faq/utf_bom.html#utf16-3\n var c = str.charCodeAt(i);\n // possibly a lead surrogate\n if (c <= 127) {\n len++;\n } else if (c <= 2047) {\n len += 2;\n } else if (c >= 55296 && c <= 57343) {\n len += 4;\n ++i;\n } else {\n len += 3;\n }\n }\n return len;\n };\n var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {\n // Parameter maxBytesToWrite is not optional. Negative values, 0, null,\n // undefined and false each don't write out any bytes.\n if (!(maxBytesToWrite > 0)) return 0;\n var startIdx = outIdx;\n var endIdx = outIdx + maxBytesToWrite - 1;\n // -1 for string null terminator.\n for (var i = 0; i < str.length; ++i) {\n // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code\n // unit, not a Unicode code point of the character! So decode\n // UTF16->UTF32->UTF8.\n // See http://unicode.org/faq/utf_bom.html#utf16-3\n // For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description\n // and https://www.ietf.org/rfc/rfc2279.txt\n // and https://tools.ietf.org/html/rfc3629\n var u = str.charCodeAt(i);\n // possibly a lead surrogate\n if (u >= 55296 && u <= 57343) {\n var u1 = str.charCodeAt(++i);\n u = 65536 + ((u & 1023) << 10) | (u1 & 1023);\n }\n if (u <= 127) {\n if (outIdx >= endIdx) break;\n heap[outIdx++] = u;\n } else if (u <= 2047) {\n if (outIdx + 1 >= endIdx) break;\n heap[outIdx++] = 192 | (u >> 6);\n heap[outIdx++] = 128 | (u & 63);\n } else if (u <= 65535) {\n if (outIdx + 2 >= endIdx) break;\n heap[outIdx++] = 224 | (u >> 12);\n heap[outIdx++] = 128 | ((u >> 6) & 63);\n heap[outIdx++] = 128 | (u & 63);\n } else {\n if (outIdx + 3 >= endIdx) break;\n heap[outIdx++] = 240 | (u >> 18);\n heap[outIdx++] = 128 | ((u >> 12) & 63);\n heap[outIdx++] = 128 | ((u >> 6) & 63);\n heap[outIdx++] = 128 | (u & 63);\n }\n }\n // Null-terminate the pointer to the buffer.\n heap[outIdx] = 0;\n return outIdx - startIdx;\n };\n var stringToUTF8 = (str, outPtr, maxBytesToWrite) => stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite);\n var stackAlloc = sz => __emscripten_stack_alloc(sz);\n var stringToUTF8OnStack = str => {\n var size = lengthBytesUTF8(str) + 1;\n var ret = stackAlloc(size);\n stringToUTF8(str, ret, size);\n return ret;\n };\n var stringToUTF16 = (str, outPtr, maxBytesToWrite) => {\n // Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed.\n maxBytesToWrite ??= 2147483647;\n if (maxBytesToWrite < 2) return 0;\n maxBytesToWrite -= 2;\n // Null terminator.\n var startPtr = outPtr;\n var numCharsToWrite = (maxBytesToWrite < str.length * 2) ? (maxBytesToWrite / 2) : str.length;\n for (var i = 0; i < numCharsToWrite; ++i) {\n // charCodeAt returns a UTF-16 encoded code unit, so it can be directly written to the HEAP.\n var codeUnit = str.charCodeAt(i);\n // possibly a lead surrogate\n LE_HEAP_STORE_I16(((outPtr) >> 1) * 2, codeUnit);\n outPtr += 2;\n }\n // Null-terminate the pointer to the HEAP.\n LE_HEAP_STORE_I16(((outPtr) >> 1) * 2, 0);\n return outPtr - startPtr;\n };\n var AsciiToString = ptr => {\n var str = \"\";\n while (1) {\n var ch = HEAPU8[ptr++];\n if (!ch) return str;\n str += String.fromCharCode(ch);\n }\n };\n var wasmImports = {\n /** @export */ __heap_base: ___heap_base,\n /** @export */ __indirect_function_table: wasmTable,\n /** @export */ __memory_base: ___memory_base,\n /** @export */ __stack_pointer: ___stack_pointer,\n /** @export */ __table_base: ___table_base,\n /** @export */ _abort_js: __abort_js,\n /** @export */ _emscripten_get_now_is_monotonic: __emscripten_get_now_is_monotonic,\n /** @export */ _emscripten_memcpy_js: __emscripten_memcpy_js,\n /** @export */ emscripten_get_now: _emscripten_get_now,\n /** @export */ emscripten_resize_heap: _emscripten_resize_heap,\n /** @export */ fd_close: _fd_close,\n /** @export */ fd_seek: _fd_seek,\n /** @export */ fd_write: _fd_write,\n /** @export */ memory: wasmMemory,\n /** @export */ tree_sitter_log_callback: _tree_sitter_log_callback,\n /** @export */ tree_sitter_parse_callback: _tree_sitter_parse_callback\n };\n var wasmExports = createWasm();\n var ___wasm_call_ctors = () => (___wasm_call_ctors = wasmExports[\"__wasm_call_ctors\"])();\n var ___wasm_apply_data_relocs = () => (___wasm_apply_data_relocs = wasmExports[\"__wasm_apply_data_relocs\"])();\n var _malloc = Module[\"_malloc\"] = a0 => (_malloc = Module[\"_malloc\"] = wasmExports[\"malloc\"])(a0);\n var _calloc = Module[\"_calloc\"] = (a0, a1) => (_calloc = Module[\"_calloc\"] = wasmExports[\"calloc\"])(a0, a1);\n var _realloc = Module[\"_realloc\"] = (a0, a1) => (_realloc = Module[\"_realloc\"] = wasmExports[\"realloc\"])(a0, a1);\n var _free = Module[\"_free\"] = a0 => (_free = Module[\"_free\"] = wasmExports[\"free\"])(a0);\n var _ts_language_symbol_count = Module[\"_ts_language_symbol_count\"] = a0 => (_ts_language_symbol_count = Module[\"_ts_language_symbol_count\"] = wasmExports[\"ts_language_symbol_count\"])(a0);\n var _ts_language_state_count = Module[\"_ts_language_state_count\"] = a0 => (_ts_language_state_count = Module[\"_ts_language_state_count\"] = wasmExports[\"ts_language_state_count\"])(a0);\n var _ts_language_version = Module[\"_ts_language_version\"] = a0 => (_ts_language_version = Module[\"_ts_language_version\"] = wasmExports[\"ts_language_version\"])(a0);\n var _ts_language_field_count = Module[\"_ts_language_field_count\"] = a0 => (_ts_language_field_count = Module[\"_ts_language_field_count\"] = wasmExports[\"ts_language_field_count\"])(a0);\n var _ts_language_next_state = Module[\"_ts_language_next_state\"] = (a0, a1, a2) => (_ts_language_next_state = Module[\"_ts_language_next_state\"] = wasmExports[\"ts_language_next_state\"])(a0, a1, a2);\n var _ts_language_symbol_name = Module[\"_ts_language_symbol_name\"] = (a0, a1) => (_ts_language_symbol_name = Module[\"_ts_language_symbol_name\"] = wasmExports[\"ts_language_symbol_name\"])(a0, a1);\n var _ts_language_symbol_for_name = Module[\"_ts_language_symbol_for_name\"] = (a0, a1, a2, a3) => (_ts_language_symbol_for_name = Module[\"_ts_language_symbol_for_name\"] = wasmExports[\"ts_language_symbol_for_name\"])(a0, a1, a2, a3);\n var _strncmp = Module[\"_strncmp\"] = (a0, a1, a2) => (_strncmp = Module[\"_strncmp\"] = wasmExports[\"strncmp\"])(a0, a1, a2);\n var _ts_language_symbol_type = Module[\"_ts_language_symbol_type\"] = (a0, a1) => (_ts_language_symbol_type = Module[\"_ts_language_symbol_type\"] = wasmExports[\"ts_language_symbol_type\"])(a0, a1);\n var _ts_language_field_name_for_id = Module[\"_ts_language_field_name_for_id\"] = (a0, a1) => (_ts_language_field_name_for_id = Module[\"_ts_language_field_name_for_id\"] = wasmExports[\"ts_language_field_name_for_id\"])(a0, a1);\n var _ts_lookahead_iterator_new = Module[\"_ts_lookahead_iterator_new\"] = (a0, a1) => (_ts_lookahead_iterator_new = Module[\"_ts_lookahead_iterator_new\"] = wasmExports[\"ts_lookahead_iterator_new\"])(a0, a1);\n var _ts_lookahead_iterator_delete = Module[\"_ts_lookahead_iterator_delete\"] = a0 => (_ts_lookahead_iterator_delete = Module[\"_ts_lookahead_iterator_delete\"] = wasmExports[\"ts_lookahead_iterator_delete\"])(a0);\n var _ts_lookahead_iterator_reset_state = Module[\"_ts_lookahead_iterator_reset_state\"] = (a0, a1) => (_ts_lookahead_iterator_reset_state = Module[\"_ts_lookahead_iterator_reset_state\"] = wasmExports[\"ts_lookahead_iterator_reset_state\"])(a0, a1);\n var _ts_lookahead_iterator_reset = Module[\"_ts_lookahead_iterator_reset\"] = (a0, a1, a2) => (_ts_lookahead_iterator_reset = Module[\"_ts_lookahead_iterator_reset\"] = wasmExports[\"ts_lookahead_iterator_reset\"])(a0, a1, a2);\n var _ts_lookahead_iterator_next = Module[\"_ts_lookahead_iterator_next\"] = a0 => (_ts_lookahead_iterator_next = Module[\"_ts_lookahead_iterator_next\"] = wasmExports[\"ts_lookahead_iterator_next\"])(a0);\n var _ts_lookahead_iterator_current_symbol = Module[\"_ts_lookahead_iterator_current_symbol\"] = a0 => (_ts_lookahead_iterator_current_symbol = Module[\"_ts_lookahead_iterator_current_symbol\"] = wasmExports[\"ts_lookahead_iterator_current_symbol\"])(a0);\n var _memset = Module[\"_memset\"] = (a0, a1, a2) => (_memset = Module[\"_memset\"] = wasmExports[\"memset\"])(a0, a1, a2);\n var _memcpy = Module[\"_memcpy\"] = (a0, a1, a2) => (_memcpy = Module[\"_memcpy\"] = wasmExports[\"memcpy\"])(a0, a1, a2);\n var _ts_parser_delete = Module[\"_ts_parser_delete\"] = a0 => (_ts_parser_delete = Module[\"_ts_parser_delete\"] = wasmExports[\"ts_parser_delete\"])(a0);\n var _ts_parser_reset = Module[\"_ts_parser_reset\"] = a0 => (_ts_parser_reset = Module[\"_ts_parser_reset\"] = wasmExports[\"ts_parser_reset\"])(a0);\n var _ts_parser_set_language = Module[\"_ts_parser_set_language\"] = (a0, a1) => (_ts_parser_set_language = Module[\"_ts_parser_set_language\"] = wasmExports[\"ts_parser_set_language\"])(a0, a1);\n var _ts_parser_timeout_micros = Module[\"_ts_parser_timeout_micros\"] = a0 => (_ts_parser_timeout_micros = Module[\"_ts_parser_timeout_micros\"] = wasmExports[\"ts_parser_timeout_micros\"])(a0);\n var _ts_parser_set_timeout_micros = Module[\"_ts_parser_set_timeout_micros\"] = (a0, a1, a2) => (_ts_parser_set_timeout_micros = Module[\"_ts_parser_set_timeout_micros\"] = wasmExports[\"ts_parser_set_timeout_micros\"])(a0, a1, a2);\n var _ts_parser_set_included_ranges = Module[\"_ts_parser_set_included_ranges\"] = (a0, a1, a2) => (_ts_parser_set_included_ranges = Module[\"_ts_parser_set_included_ranges\"] = wasmExports[\"ts_parser_set_included_ranges\"])(a0, a1, a2);\n var _memmove = Module[\"_memmove\"] = (a0, a1, a2) => (_memmove = Module[\"_memmove\"] = wasmExports[\"memmove\"])(a0, a1, a2);\n var _memcmp = Module[\"_memcmp\"] = (a0, a1, a2) => (_memcmp = Module[\"_memcmp\"] = wasmExports[\"memcmp\"])(a0, a1, a2);\n var _ts_query_new = Module[\"_ts_query_new\"] = (a0, a1, a2, a3, a4) => (_ts_query_new = Module[\"_ts_query_new\"] = wasmExports[\"ts_query_new\"])(a0, a1, a2, a3, a4);\n var _ts_query_delete = Module[\"_ts_query_delete\"] = a0 => (_ts_query_delete = Module[\"_ts_query_delete\"] = wasmExports[\"ts_query_delete\"])(a0);\n var _iswspace = Module[\"_iswspace\"] = a0 => (_iswspace = Module[\"_iswspace\"] = wasmExports[\"iswspace\"])(a0);\n var _iswalnum = Module[\"_iswalnum\"] = a0 => (_iswalnum = Module[\"_iswalnum\"] = wasmExports[\"iswalnum\"])(a0);\n var _ts_query_pattern_count = Module[\"_ts_query_pattern_count\"] = a0 => (_ts_query_pattern_count = Module[\"_ts_query_pattern_count\"] = wasmExports[\"ts_query_pattern_count\"])(a0);\n var _ts_query_capture_count = Module[\"_ts_query_capture_count\"] = a0 => (_ts_query_capture_count = Module[\"_ts_query_capture_count\"] = wasmExports[\"ts_query_capture_count\"])(a0);\n var _ts_query_string_count = Module[\"_ts_query_string_count\"] = a0 => (_ts_query_string_count = Module[\"_ts_query_string_count\"] = wasmExports[\"ts_query_string_count\"])(a0);\n var _ts_query_capture_name_for_id = Module[\"_ts_query_capture_name_for_id\"] = (a0, a1, a2) => (_ts_query_capture_name_for_id = Module[\"_ts_query_capture_name_for_id\"] = wasmExports[\"ts_query_capture_name_for_id\"])(a0, a1, a2);\n var _ts_query_string_value_for_id = Module[\"_ts_query_string_value_for_id\"] = (a0, a1, a2) => (_ts_query_string_value_for_id = Module[\"_ts_query_string_value_for_id\"] = wasmExports[\"ts_query_string_value_for_id\"])(a0, a1, a2);\n var _ts_query_predicates_for_pattern = Module[\"_ts_query_predicates_for_pattern\"] = (a0, a1, a2) => (_ts_query_predicates_for_pattern = Module[\"_ts_query_predicates_for_pattern\"] = wasmExports[\"ts_query_predicates_for_pattern\"])(a0, a1, a2);\n var _ts_query_disable_capture = Module[\"_ts_query_disable_capture\"] = (a0, a1, a2) => (_ts_query_disable_capture = Module[\"_ts_query_disable_capture\"] = wasmExports[\"ts_query_disable_capture\"])(a0, a1, a2);\n var _ts_tree_copy = Module[\"_ts_tree_copy\"] = a0 => (_ts_tree_copy = Module[\"_ts_tree_copy\"] = wasmExports[\"ts_tree_copy\"])(a0);\n var _ts_tree_delete = Module[\"_ts_tree_delete\"] = a0 => (_ts_tree_delete = Module[\"_ts_tree_delete\"] = wasmExports[\"ts_tree_delete\"])(a0);\n var _ts_init = Module[\"_ts_init\"] = () => (_ts_init = Module[\"_ts_init\"] = wasmExports[\"ts_init\"])();\n var _ts_parser_new_wasm = Module[\"_ts_parser_new_wasm\"] = () => (_ts_parser_new_wasm = Module[\"_ts_parser_new_wasm\"] = wasmExports[\"ts_parser_new_wasm\"])();\n var _ts_parser_enable_logger_wasm = Module[\"_ts_parser_enable_logger_wasm\"] = (a0, a1) => (_ts_parser_enable_logger_wasm = Module[\"_ts_parser_enable_logger_wasm\"] = wasmExports[\"ts_parser_enable_logger_wasm\"])(a0, a1);\n var _ts_parser_parse_wasm = Module[\"_ts_parser_parse_wasm\"] = (a0, a1, a2, a3, a4) => (_ts_parser_parse_wasm = Module[\"_ts_parser_parse_wasm\"] = wasmExports[\"ts_parser_parse_wasm\"])(a0, a1, a2, a3, a4);\n var _ts_parser_included_ranges_wasm = Module[\"_ts_parser_included_ranges_wasm\"] = a0 => (_ts_parser_included_ranges_wasm = Module[\"_ts_parser_included_ranges_wasm\"] = wasmExports[\"ts_parser_included_ranges_wasm\"])(a0);\n var _ts_language_type_is_named_wasm = Module[\"_ts_language_type_is_named_wasm\"] = (a0, a1) => (_ts_language_type_is_named_wasm = Module[\"_ts_language_type_is_named_wasm\"] = wasmExports[\"ts_language_type_is_named_wasm\"])(a0, a1);\n var _ts_language_type_is_visible_wasm = Module[\"_ts_language_type_is_visible_wasm\"] = (a0, a1) => (_ts_language_type_is_visible_wasm = Module[\"_ts_language_type_is_visible_wasm\"] = wasmExports[\"ts_language_type_is_visible_wasm\"])(a0, a1);\n var _ts_tree_root_node_wasm = Module[\"_ts_tree_root_node_wasm\"] = a0 => (_ts_tree_root_node_wasm = Module[\"_ts_tree_root_node_wasm\"] = wasmExports[\"ts_tree_root_node_wasm\"])(a0);\n var _ts_tree_root_node_with_offset_wasm = Module[\"_ts_tree_root_node_with_offset_wasm\"] = a0 => (_ts_tree_root_node_with_offset_wasm = Module[\"_ts_tree_root_node_with_offset_wasm\"] = wasmExports[\"ts_tree_root_node_with_offset_wasm\"])(a0);\n var _ts_tree_edit_wasm = Module[\"_ts_tree_edit_wasm\"] = a0 => (_ts_tree_edit_wasm = Module[\"_ts_tree_edit_wasm\"] = wasmExports[\"ts_tree_edit_wasm\"])(a0);\n var _ts_tree_included_ranges_wasm = Module[\"_ts_tree_included_ranges_wasm\"] = a0 => (_ts_tree_included_ranges_wasm = Module[\"_ts_tree_included_ranges_wasm\"] = wasmExports[\"ts_tree_included_ranges_wasm\"])(a0);\n var _ts_tree_get_changed_ranges_wasm = Module[\"_ts_tree_get_changed_ranges_wasm\"] = (a0, a1) => (_ts_tree_get_changed_ranges_wasm = Module[\"_ts_tree_get_changed_ranges_wasm\"] = wasmExports[\"ts_tree_get_changed_ranges_wasm\"])(a0, a1);\n var _ts_tree_cursor_new_wasm = Module[\"_ts_tree_cursor_new_wasm\"] = a0 => (_ts_tree_cursor_new_wasm = Module[\"_ts_tree_cursor_new_wasm\"] = wasmExports[\"ts_tree_cursor_new_wasm\"])(a0);\n var _ts_tree_cursor_delete_wasm = Module[\"_ts_tree_cursor_delete_wasm\"] = a0 => (_ts_tree_cursor_delete_wasm = Module[\"_ts_tree_cursor_delete_wasm\"] = wasmExports[\"ts_tree_cursor_delete_wasm\"])(a0);\n var _ts_tree_cursor_reset_wasm = Module[\"_ts_tree_cursor_reset_wasm\"] = a0 => (_ts_tree_cursor_reset_wasm = Module[\"_ts_tree_cursor_reset_wasm\"] = wasmExports[\"ts_tree_cursor_reset_wasm\"])(a0);\n var _ts_tree_cursor_reset_to_wasm = Module[\"_ts_tree_cursor_reset_to_wasm\"] = (a0, a1) => (_ts_tree_cursor_reset_to_wasm = Module[\"_ts_tree_cursor_reset_to_wasm\"] = wasmExports[\"ts_tree_cursor_reset_to_wasm\"])(a0, a1);\n var _ts_tree_cursor_goto_first_child_wasm = Module[\"_ts_tree_cursor_goto_first_child_wasm\"] = a0 => (_ts_tree_cursor_goto_first_child_wasm = Module[\"_ts_tree_cursor_goto_first_child_wasm\"] = wasmExports[\"ts_tree_cursor_goto_first_child_wasm\"])(a0);\n var _ts_tree_cursor_goto_last_child_wasm = Module[\"_ts_tree_cursor_goto_last_child_wasm\"] = a0 => (_ts_tree_cursor_goto_last_child_wasm = Module[\"_ts_tree_cursor_goto_last_child_wasm\"] = wasmExports[\"ts_tree_cursor_goto_last_child_wasm\"])(a0);\n var _ts_tree_cursor_goto_first_child_for_index_wasm = Module[\"_ts_tree_cursor_goto_first_child_for_index_wasm\"] = a0 => (_ts_tree_cursor_goto_first_child_for_index_wasm = Module[\"_ts_tree_cursor_goto_first_child_for_index_wasm\"] = wasmExports[\"ts_tree_cursor_goto_first_child_for_index_wasm\"])(a0);\n var _ts_tree_cursor_goto_first_child_for_position_wasm = Module[\"_ts_tree_cursor_goto_first_child_for_position_wasm\"] = a0 => (_ts_tree_cursor_goto_first_child_for_position_wasm = Module[\"_ts_tree_cursor_goto_first_child_for_position_wasm\"] = wasmExports[\"ts_tree_cursor_goto_first_child_for_position_wasm\"])(a0);\n var _ts_tree_cursor_goto_next_sibling_wasm = Module[\"_ts_tree_cursor_goto_next_sibling_wasm\"] = a0 => (_ts_tree_cursor_goto_next_sibling_wasm = Module[\"_ts_tree_cursor_goto_next_sibling_wasm\"] = wasmExports[\"ts_tree_cursor_goto_next_sibling_wasm\"])(a0);\n var _ts_tree_cursor_goto_previous_sibling_wasm = Module[\"_ts_tree_cursor_goto_previous_sibling_wasm\"] = a0 => (_ts_tree_cursor_goto_previous_sibling_wasm = Module[\"_ts_tree_cursor_goto_previous_sibling_wasm\"] = wasmExports[\"ts_tree_cursor_goto_previous_sibling_wasm\"])(a0);\n var _ts_tree_cursor_goto_descendant_wasm = Module[\"_ts_tree_cursor_goto_descendant_wasm\"] = (a0, a1) => (_ts_tree_cursor_goto_descendant_wasm = Module[\"_ts_tree_cursor_goto_descendant_wasm\"] = wasmExports[\"ts_tree_cursor_goto_descendant_wasm\"])(a0, a1);\n var _ts_tree_cursor_goto_parent_wasm = Module[\"_ts_tree_cursor_goto_parent_wasm\"] = a0 => (_ts_tree_cursor_goto_parent_wasm = Module[\"_ts_tree_cursor_goto_parent_wasm\"] = wasmExports[\"ts_tree_cursor_goto_parent_wasm\"])(a0);\n var _ts_tree_cursor_current_node_type_id_wasm = Module[\"_ts_tree_cursor_current_node_type_id_wasm\"] = a0 => (_ts_tree_cursor_current_node_type_id_wasm = Module[\"_ts_tree_cursor_current_node_type_id_wasm\"] = wasmExports[\"ts_tree_cursor_current_node_type_id_wasm\"])(a0);\n var _ts_tree_cursor_current_node_state_id_wasm = Module[\"_ts_tree_cursor_current_node_state_id_wasm\"] = a0 => (_ts_tree_cursor_current_node_state_id_wasm = Module[\"_ts_tree_cursor_current_node_state_id_wasm\"] = wasmExports[\"ts_tree_cursor_current_node_state_id_wasm\"])(a0);\n var _ts_tree_cursor_current_node_is_named_wasm = Module[\"_ts_tree_cursor_current_node_is_named_wasm\"] = a0 => (_ts_tree_cursor_current_node_is_named_wasm = Module[\"_ts_tree_cursor_current_node_is_named_wasm\"] = wasmExports[\"ts_tree_cursor_current_node_is_named_wasm\"])(a0);\n var _ts_tree_cursor_current_node_is_missing_wasm = Module[\"_ts_tree_cursor_current_node_is_missing_wasm\"] = a0 => (_ts_tree_cursor_current_node_is_missing_wasm = Module[\"_ts_tree_cursor_current_node_is_missing_wasm\"] = wasmExports[\"ts_tree_cursor_current_node_is_missing_wasm\"])(a0);\n var _ts_tree_cursor_current_node_id_wasm = Module[\"_ts_tree_cursor_current_node_id_wasm\"] = a0 => (_ts_tree_cursor_current_node_id_wasm = Module[\"_ts_tree_cursor_current_node_id_wasm\"] = wasmExports[\"ts_tree_cursor_current_node_id_wasm\"])(a0);\n var _ts_tree_cursor_start_position_wasm = Module[\"_ts_tree_cursor_start_position_wasm\"] = a0 => (_ts_tree_cursor_start_position_wasm = Module[\"_ts_tree_cursor_start_position_wasm\"] = wasmExports[\"ts_tree_cursor_start_position_wasm\"])(a0);\n var _ts_tree_cursor_end_position_wasm = Module[\"_ts_tree_cursor_end_position_wasm\"] = a0 => (_ts_tree_cursor_end_position_wasm = Module[\"_ts_tree_cursor_end_position_wasm\"] = wasmExports[\"ts_tree_cursor_end_position_wasm\"])(a0);\n var _ts_tree_cursor_start_index_wasm = Module[\"_ts_tree_cursor_start_index_wasm\"] = a0 => (_ts_tree_cursor_start_index_wasm = Module[\"_ts_tree_cursor_start_index_wasm\"] = wasmExports[\"ts_tree_cursor_start_index_wasm\"])(a0);\n var _ts_tree_cursor_end_index_wasm = Module[\"_ts_tree_cursor_end_index_wasm\"] = a0 => (_ts_tree_cursor_end_index_wasm = Module[\"_ts_tree_cursor_end_index_wasm\"] = wasmExports[\"ts_tree_cursor_end_index_wasm\"])(a0);\n var _ts_tree_cursor_current_field_id_wasm = Module[\"_ts_tree_cursor_current_field_id_wasm\"] = a0 => (_ts_tree_cursor_current_field_id_wasm = Module[\"_ts_tree_cursor_current_field_id_wasm\"] = wasmExports[\"ts_tree_cursor_current_field_id_wasm\"])(a0);\n var _ts_tree_cursor_current_depth_wasm = Module[\"_ts_tree_cursor_current_depth_wasm\"] = a0 => (_ts_tree_cursor_current_depth_wasm = Module[\"_ts_tree_cursor_current_depth_wasm\"] = wasmExports[\"ts_tree_cursor_current_depth_wasm\"])(a0);\n var _ts_tree_cursor_current_descendant_index_wasm = Module[\"_ts_tree_cursor_current_descendant_index_wasm\"] = a0 => (_ts_tree_cursor_current_descendant_index_wasm = Module[\"_ts_tree_cursor_current_descendant_index_wasm\"] = wasmExports[\"ts_tree_cursor_current_descendant_index_wasm\"])(a0);\n var _ts_tree_cursor_current_node_wasm = Module[\"_ts_tree_cursor_current_node_wasm\"] = a0 => (_ts_tree_cursor_current_node_wasm = Module[\"_ts_tree_cursor_current_node_wasm\"] = wasmExports[\"ts_tree_cursor_current_node_wasm\"])(a0);\n var _ts_node_symbol_wasm = Module[\"_ts_node_symbol_wasm\"] = a0 => (_ts_node_symbol_wasm = Module[\"_ts_node_symbol_wasm\"] = wasmExports[\"ts_node_symbol_wasm\"])(a0);\n var _ts_node_field_name_for_child_wasm = Module[\"_ts_node_field_name_for_child_wasm\"] = (a0, a1) => (_ts_node_field_name_for_child_wasm = Module[\"_ts_node_field_name_for_child_wasm\"] = wasmExports[\"ts_node_field_name_for_child_wasm\"])(a0, a1);\n var _ts_node_children_by_field_id_wasm = Module[\"_ts_node_children_by_field_id_wasm\"] = (a0, a1) => (_ts_node_children_by_field_id_wasm = Module[\"_ts_node_children_by_field_id_wasm\"] = wasmExports[\"ts_node_children_by_field_id_wasm\"])(a0, a1);\n var _ts_node_first_child_for_byte_wasm = Module[\"_ts_node_first_child_for_byte_wasm\"] = a0 => (_ts_node_first_child_for_byte_wasm = Module[\"_ts_node_first_child_for_byte_wasm\"] = wasmExports[\"ts_node_first_child_for_byte_wasm\"])(a0);\n var _ts_node_first_named_child_for_byte_wasm = Module[\"_ts_node_first_named_child_for_byte_wasm\"] = a0 => (_ts_node_first_named_child_for_byte_wasm = Module[\"_ts_node_first_named_child_for_byte_wasm\"] = wasmExports[\"ts_node_first_named_child_for_byte_wasm\"])(a0);\n var _ts_node_grammar_symbol_wasm = Module[\"_ts_node_grammar_symbol_wasm\"] = a0 => (_ts_node_grammar_symbol_wasm = Module[\"_ts_node_grammar_symbol_wasm\"] = wasmExports[\"ts_node_grammar_symbol_wasm\"])(a0);\n var _ts_node_child_count_wasm = Module[\"_ts_node_child_count_wasm\"] = a0 => (_ts_node_child_count_wasm = Module[\"_ts_node_child_count_wasm\"] = wasmExports[\"ts_node_child_count_wasm\"])(a0);\n var _ts_node_named_child_count_wasm = Module[\"_ts_node_named_child_count_wasm\"] = a0 => (_ts_node_named_child_count_wasm = Module[\"_ts_node_named_child_count_wasm\"] = wasmExports[\"ts_node_named_child_count_wasm\"])(a0);\n var _ts_node_child_wasm = Module[\"_ts_node_child_wasm\"] = (a0, a1) => (_ts_node_child_wasm = Module[\"_ts_node_child_wasm\"] = wasmExports[\"ts_node_child_wasm\"])(a0, a1);\n var _ts_node_named_child_wasm = Module[\"_ts_node_named_child_wasm\"] = (a0, a1) => (_ts_node_named_child_wasm = Module[\"_ts_node_named_child_wasm\"] = wasmExports[\"ts_node_named_child_wasm\"])(a0, a1);\n var _ts_node_child_by_field_id_wasm = Module[\"_ts_node_child_by_field_id_wasm\"] = (a0, a1) => (_ts_node_child_by_field_id_wasm = Module[\"_ts_node_child_by_field_id_wasm\"] = wasmExports[\"ts_node_child_by_field_id_wasm\"])(a0, a1);\n var _ts_node_next_sibling_wasm = Module[\"_ts_node_next_sibling_wasm\"] = a0 => (_ts_node_next_sibling_wasm = Module[\"_ts_node_next_sibling_wasm\"] = wasmExports[\"ts_node_next_sibling_wasm\"])(a0);\n var _ts_node_prev_sibling_wasm = Module[\"_ts_node_prev_sibling_wasm\"] = a0 => (_ts_node_prev_sibling_wasm = Module[\"_ts_node_prev_sibling_wasm\"] = wasmExports[\"ts_node_prev_sibling_wasm\"])(a0);\n var _ts_node_next_named_sibling_wasm = Module[\"_ts_node_next_named_sibling_wasm\"] = a0 => (_ts_node_next_named_sibling_wasm = Module[\"_ts_node_next_named_sibling_wasm\"] = wasmExports[\"ts_node_next_named_sibling_wasm\"])(a0);\n var _ts_node_prev_named_sibling_wasm = Module[\"_ts_node_prev_named_sibling_wasm\"] = a0 => (_ts_node_prev_named_sibling_wasm = Module[\"_ts_node_prev_named_sibling_wasm\"] = wasmExports[\"ts_node_prev_named_sibling_wasm\"])(a0);\n var _ts_node_descendant_count_wasm = Module[\"_ts_node_descendant_count_wasm\"] = a0 => (_ts_node_descendant_count_wasm = Module[\"_ts_node_descendant_count_wasm\"] = wasmExports[\"ts_node_descendant_count_wasm\"])(a0);\n var _ts_node_parent_wasm = Module[\"_ts_node_parent_wasm\"] = a0 => (_ts_node_parent_wasm = Module[\"_ts_node_parent_wasm\"] = wasmExports[\"ts_node_parent_wasm\"])(a0);\n var _ts_node_descendant_for_index_wasm = Module[\"_ts_node_descendant_for_index_wasm\"] = a0 => (_ts_node_descendant_for_index_wasm = Module[\"_ts_node_descendant_for_index_wasm\"] = wasmExports[\"ts_node_descendant_for_index_wasm\"])(a0);\n var _ts_node_named_descendant_for_index_wasm = Module[\"_ts_node_named_descendant_for_index_wasm\"] = a0 => (_ts_node_named_descendant_for_index_wasm = Module[\"_ts_node_named_descendant_for_index_wasm\"] = wasmExports[\"ts_node_named_descendant_for_index_wasm\"])(a0);\n var _ts_node_descendant_for_position_wasm = Module[\"_ts_node_descendant_for_position_wasm\"] = a0 => (_ts_node_descendant_for_position_wasm = Module[\"_ts_node_descendant_for_position_wasm\"] = wasmExports[\"ts_node_descendant_for_position_wasm\"])(a0);\n var _ts_node_named_descendant_for_position_wasm = Module[\"_ts_node_named_descendant_for_position_wasm\"] = a0 => (_ts_node_named_descendant_for_position_wasm = Module[\"_ts_node_named_descendant_for_position_wasm\"] = wasmExports[\"ts_node_named_descendant_for_position_wasm\"])(a0);\n var _ts_node_start_point_wasm = Module[\"_ts_node_start_point_wasm\"] = a0 => (_ts_node_start_point_wasm = Module[\"_ts_node_start_point_wasm\"] = wasmExports[\"ts_node_start_point_wasm\"])(a0);\n var _ts_node_end_point_wasm = Module[\"_ts_node_end_point_wasm\"] = a0 => (_ts_node_end_point_wasm = Module[\"_ts_node_end_point_wasm\"] = wasmExports[\"ts_node_end_point_wasm\"])(a0);\n var _ts_node_start_index_wasm = Module[\"_ts_node_start_index_wasm\"] = a0 => (_ts_node_start_index_wasm = Module[\"_ts_node_start_index_wasm\"] = wasmExports[\"ts_node_start_index_wasm\"])(a0);\n var _ts_node_end_index_wasm = Module[\"_ts_node_end_index_wasm\"] = a0 => (_ts_node_end_index_wasm = Module[\"_ts_node_end_index_wasm\"] = wasmExports[\"ts_node_end_index_wasm\"])(a0);\n var _ts_node_to_string_wasm = Module[\"_ts_node_to_string_wasm\"] = a0 => (_ts_node_to_string_wasm = Module[\"_ts_node_to_string_wasm\"] = wasmExports[\"ts_node_to_string_wasm\"])(a0);\n var _ts_node_children_wasm = Module[\"_ts_node_children_wasm\"] = a0 => (_ts_node_children_wasm = Module[\"_ts_node_children_wasm\"] = wasmExports[\"ts_node_children_wasm\"])(a0);\n var _ts_node_named_children_wasm = Module[\"_ts_node_named_children_wasm\"] = a0 => (_ts_node_named_children_wasm = Module[\"_ts_node_named_children_wasm\"] = wasmExports[\"ts_node_named_children_wasm\"])(a0);\n var _ts_node_descendants_of_type_wasm = Module[\"_ts_node_descendants_of_type_wasm\"] = (a0, a1, a2, a3, a4, a5, a6) => (_ts_node_descendants_of_type_wasm = Module[\"_ts_node_descendants_of_type_wasm\"] = wasmExports[\"ts_node_descendants_of_type_wasm\"])(a0, a1, a2, a3, a4, a5, a6);\n var _ts_node_is_named_wasm = Module[\"_ts_node_is_named_wasm\"] = a0 => (_ts_node_is_named_wasm = Module[\"_ts_node_is_named_wasm\"] = wasmExports[\"ts_node_is_named_wasm\"])(a0);\n var _ts_node_has_changes_wasm = Module[\"_ts_node_has_changes_wasm\"] = a0 => (_ts_node_has_changes_wasm = Module[\"_ts_node_has_changes_wasm\"] = wasmExports[\"ts_node_has_changes_wasm\"])(a0);\n var _ts_node_has_error_wasm = Module[\"_ts_node_has_error_wasm\"] = a0 => (_ts_node_has_error_wasm = Module[\"_ts_node_has_error_wasm\"] = wasmExports[\"ts_node_has_error_wasm\"])(a0);\n var _ts_node_is_error_wasm = Module[\"_ts_node_is_error_wasm\"] = a0 => (_ts_node_is_error_wasm = Module[\"_ts_node_is_error_wasm\"] = wasmExports[\"ts_node_is_error_wasm\"])(a0);\n var _ts_node_is_missing_wasm = Module[\"_ts_node_is_missing_wasm\"] = a0 => (_ts_node_is_missing_wasm = Module[\"_ts_node_is_missing_wasm\"] = wasmExports[\"ts_node_is_missing_wasm\"])(a0);\n var _ts_node_is_extra_wasm = Module[\"_ts_node_is_extra_wasm\"] = a0 => (_ts_node_is_extra_wasm = Module[\"_ts_node_is_extra_wasm\"] = wasmExports[\"ts_node_is_extra_wasm\"])(a0);\n var _ts_node_parse_state_wasm = Module[\"_ts_node_parse_state_wasm\"] = a0 => (_ts_node_parse_state_wasm = Module[\"_ts_node_parse_state_wasm\"] = wasmExports[\"ts_node_parse_state_wasm\"])(a0);\n var _ts_node_next_parse_state_wasm = Module[\"_ts_node_next_parse_state_wasm\"] = a0 => (_ts_node_next_parse_state_wasm = Module[\"_ts_node_next_parse_state_wasm\"] = wasmExports[\"ts_node_next_parse_state_wasm\"])(a0);\n var _ts_query_matches_wasm = Module[\"_ts_query_matches_wasm\"] = (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) => (_ts_query_matches_wasm = Module[\"_ts_query_matches_wasm\"] = wasmExports[\"ts_query_matches_wasm\"])(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);\n var _ts_query_captures_wasm = Module[\"_ts_query_captures_wasm\"] = (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) => (_ts_query_captures_wasm = Module[\"_ts_query_captures_wasm\"] = wasmExports[\"ts_query_captures_wasm\"])(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);\n var _iswalpha = Module[\"_iswalpha\"] = a0 => (_iswalpha = Module[\"_iswalpha\"] = wasmExports[\"iswalpha\"])(a0);\n var _iswblank = Module[\"_iswblank\"] = a0 => (_iswblank = Module[\"_iswblank\"] = wasmExports[\"iswblank\"])(a0);\n var _iswdigit = Module[\"_iswdigit\"] = a0 => (_iswdigit = Module[\"_iswdigit\"] = wasmExports[\"iswdigit\"])(a0);\n var _iswlower = Module[\"_iswlower\"] = a0 => (_iswlower = Module[\"_iswlower\"] = wasmExports[\"iswlower\"])(a0);\n var _iswupper = Module[\"_iswupper\"] = a0 => (_iswupper = Module[\"_iswupper\"] = wasmExports[\"iswupper\"])(a0);\n var _iswxdigit = Module[\"_iswxdigit\"] = a0 => (_iswxdigit = Module[\"_iswxdigit\"] = wasmExports[\"iswxdigit\"])(a0);\n var _memchr = Module[\"_memchr\"] = (a0, a1, a2) => (_memchr = Module[\"_memchr\"] = wasmExports[\"memchr\"])(a0, a1, a2);\n var _strlen = Module[\"_strlen\"] = a0 => (_strlen = Module[\"_strlen\"] = wasmExports[\"strlen\"])(a0);\n var _strcmp = Module[\"_strcmp\"] = (a0, a1) => (_strcmp = Module[\"_strcmp\"] = wasmExports[\"strcmp\"])(a0, a1);\n var _strncat = Module[\"_strncat\"] = (a0, a1, a2) => (_strncat = Module[\"_strncat\"] = wasmExports[\"strncat\"])(a0, a1, a2);\n var _strncpy = Module[\"_strncpy\"] = (a0, a1, a2) => (_strncpy = Module[\"_strncpy\"] = wasmExports[\"strncpy\"])(a0, a1, a2);\n var _towlower = Module[\"_towlower\"] = a0 => (_towlower = Module[\"_towlower\"] = wasmExports[\"towlower\"])(a0);\n var _towupper = Module[\"_towupper\"] = a0 => (_towupper = Module[\"_towupper\"] = wasmExports[\"towupper\"])(a0);\n var _setThrew = (a0, a1) => (_setThrew = wasmExports[\"setThrew\"])(a0, a1);\n var __emscripten_stack_restore = a0 => (__emscripten_stack_restore = wasmExports[\"_emscripten_stack_restore\"])(a0);\n var __emscripten_stack_alloc = a0 => (__emscripten_stack_alloc = wasmExports[\"_emscripten_stack_alloc\"])(a0);\n var _emscripten_stack_get_current = () => (_emscripten_stack_get_current = wasmExports[\"emscripten_stack_get_current\"])();\n var dynCall_jiji = Module[\"dynCall_jiji\"] = (a0, a1, a2, a3, a4) => (dynCall_jiji = Module[\"dynCall_jiji\"] = wasmExports[\"dynCall_jiji\"])(a0, a1, a2, a3, a4);\n var _orig$ts_parser_timeout_micros = Module[\"_orig$ts_parser_timeout_micros\"] = a0 => (_orig$ts_parser_timeout_micros = Module[\"_orig$ts_parser_timeout_micros\"] = wasmExports[\"orig$ts_parser_timeout_micros\"])(a0);\n var _orig$ts_parser_set_timeout_micros = Module[\"_orig$ts_parser_set_timeout_micros\"] = (a0, a1) => (_orig$ts_parser_set_timeout_micros = Module[\"_orig$ts_parser_set_timeout_micros\"] = wasmExports[\"orig$ts_parser_set_timeout_micros\"])(a0, a1);\n // include: postamble.js\n // === Auto-generated postamble setup entry stuff ===\n Module[\"AsciiToString\"] = AsciiToString;\n Module[\"stringToUTF16\"] = stringToUTF16;\n var calledRun;\n dependenciesFulfilled = function runCaller() {\n // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false)\n if (!calledRun) run();\n if (!calledRun) dependenciesFulfilled = runCaller;\n };\n // try this again later, after new deps are fulfilled\n function callMain(args = []) {\n var entryFunction = resolveGlobalSymbol(\"main\").sym;\n // Main modules can't tell if they have main() at compile time, since it may\n // arrive from a dynamic library.\n if (!entryFunction) return;\n args.unshift(thisProgram);\n var argc = args.length;\n var argv = stackAlloc((argc + 1) * 4);\n var argv_ptr = argv;\n args.forEach(arg => {\n LE_HEAP_STORE_U32(((argv_ptr) >> 2) * 4, stringToUTF8OnStack(arg));\n argv_ptr += 4;\n });\n LE_HEAP_STORE_U32(((argv_ptr) >> 2) * 4, 0);\n try {\n var ret = entryFunction(argc, argv);\n // if we're not running an evented main loop, it's time to exit\n exitJS(ret, /* implicit = */ true);\n return ret;\n } catch (e) {\n return handleException(e);\n }\n }\n function run(args = arguments_) {\n if (runDependencies > 0) {\n return;\n }\n preRun();\n // a preRun added a dependency, run will be called later\n if (runDependencies > 0) {\n return;\n }\n function doRun() {\n // run may have just been called through dependencies being fulfilled just in this very frame,\n // or while the async setStatus time below was happening\n if (calledRun) return;\n calledRun = true;\n Module[\"calledRun\"] = true;\n if (ABORT) return;\n initRuntime();\n preMain();\n Module[\"onRuntimeInitialized\"]?.();\n if (shouldRunNow) callMain(args);\n postRun();\n }\n if (Module[\"setStatus\"]) {\n Module[\"setStatus\"](\"Running...\");\n setTimeout(function() {\n setTimeout(function() {\n Module[\"setStatus\"](\"\");\n }, 1);\n doRun();\n }, 1);\n } else {\n doRun();\n }\n }\n if (Module[\"preInit\"]) {\n if (typeof Module[\"preInit\"] == \"function\") Module[\"preInit\"] = [ Module[\"preInit\"] ];\n while (Module[\"preInit\"].length > 0) {\n Module[\"preInit\"].pop()();\n }\n }\n // shouldRunNow refers to calling main(), not run().\n var shouldRunNow = true;\n if (Module[\"noInitialRun\"]) shouldRunNow = false;\n run();\n // end include: postamble.js\n // include: /src/lib/binding_web/binding.js\n /* eslint-disable-next-line spaced-comment */ /// <reference types=\"emscripten\" />\n /* eslint-disable-next-line spaced-comment */ /// <reference path=\"tree-sitter-web.d.ts\"/>\n const C = Module;\n const INTERNAL = {};\n const SIZE_OF_INT = 4;\n const SIZE_OF_CURSOR = 4 * SIZE_OF_INT;\n const SIZE_OF_NODE = 5 * SIZE_OF_INT;\n const SIZE_OF_POINT = 2 * SIZE_OF_INT;\n const SIZE_OF_RANGE = 2 * SIZE_OF_INT + 2 * SIZE_OF_POINT;\n const ZERO_POINT = {\n row: 0,\n column: 0\n };\n const QUERY_WORD_REGEX = /[\\w-.]*/g;\n const PREDICATE_STEP_TYPE_CAPTURE = 1;\n const PREDICATE_STEP_TYPE_STRING = 2;\n const LANGUAGE_FUNCTION_REGEX = /^_?tree_sitter_\\w+/;\n let VERSION;\n let MIN_COMPATIBLE_VERSION;\n let TRANSFER_BUFFER;\n let currentParseCallback;\n // eslint-disable-next-line no-unused-vars\n let currentLogCallback;\n // eslint-disable-next-line no-unused-vars\n class ParserImpl {\n static init() {\n TRANSFER_BUFFER = C._ts_init();\n VERSION = getValue(TRANSFER_BUFFER, \"i32\");\n MIN_COMPATIBLE_VERSION = getValue(TRANSFER_BUFFER + SIZE_OF_INT, \"i32\");\n }\n initialize() {\n C._ts_parser_new_wasm();\n this[0] = getValue(TRANSFER_BUFFER, \"i32\");\n this[1] = getValue(TRANSFER_BUFFER + SIZE_OF_INT, \"i32\");\n }\n delete() {\n C._ts_parser_delete(this[0]);\n C._free(this[1]);\n this[0] = 0;\n this[1] = 0;\n }\n setLanguage(language) {\n let address;\n if (!language) {\n address = 0;\n language = null;\n } else if (language.constructor === Language) {\n address = language[0];\n const version = C._ts_language_version(address);\n if (version < MIN_COMPATIBLE_VERSION || VERSION < version) {\n throw new Error(`Incompatible language version ${version}. ` + `Compatibility range ${MIN_COMPATIBLE_VERSION} through ${VERSION}.`);\n }\n } else {\n throw new Error(\"Argument must be a Language\");\n }\n this.language = language;\n C._ts_parser_set_language(this[0], address);\n return this;\n }\n getLanguage() {\n return this.language;\n }\n parse(callback, oldTree, options) {\n if (typeof callback === \"string\") {\n currentParseCallback = (index, _) => callback.slice(index);\n } else if (typeof callback === \"function\") {\n currentParseCallback = callback;\n } else {\n throw new Error(\"Argument must be a string or a function\");\n }\n if (this.logCallback) {\n currentLogCallback = this.logCallback;\n C._ts_parser_enable_logger_wasm(this[0], 1);\n } else {\n currentLogCallback = null;\n C._ts_parser_enable_logger_wasm(this[0], 0);\n }\n let rangeCount = 0;\n let rangeAddress = 0;\n if (options?.includedRanges) {\n rangeCount = options.includedRanges.length;\n rangeAddress = C._calloc(rangeCount, SIZE_OF_RANGE);\n let address = rangeAddress;\n for (let i = 0; i < rangeCount; i++) {\n marshalRange(address, options.includedRanges[i]);\n address += SIZE_OF_RANGE;\n }\n }\n const treeAddress = C._ts_parser_parse_wasm(this[0], this[1], oldTree ? oldTree[0] : 0, rangeAddress, rangeCount);\n if (!treeAddress) {\n currentParseCallback = null;\n currentLogCallback = null;\n throw new Error(\"Parsing failed\");\n }\n const result = new Tree(INTERNAL, treeAddress, this.language, currentParseCallback);\n currentParseCallback = null;\n currentLogCallback = null;\n return result;\n }\n reset() {\n C._ts_parser_reset(this[0]);\n }\n getIncludedRanges() {\n C._ts_parser_included_ranges_wasm(this[0]);\n const count = getValue(TRANSFER_BUFFER, \"i32\");\n const buffer = getValue(TRANSFER_BUFFER + SIZE_OF_INT, \"i32\");\n const result = new Array(count);\n if (count > 0) {\n let address = buffer;\n for (let i = 0; i < count; i++) {\n result[i] = unmarshalRange(address);\n address += SIZE_OF_RANGE;\n }\n C._free(buffer);\n }\n return result;\n }\n getTimeoutMicros() {\n return C._ts_parser_timeout_micros(this[0]);\n }\n setTimeoutMicros(timeout) {\n C._ts_parser_set_timeout_micros(this[0], timeout);\n }\n setLogger(callback) {\n if (!callback) {\n callback = null;\n } else if (typeof callback !== \"function\") {\n throw new Error(\"Logger callback must be a function\");\n }\n this.logCallback = callback;\n return this;\n }\n getLogger() {\n return this.logCallback;\n }\n }\n class Tree {\n constructor(internal, address, language, textCallback) {\n assertInternal(internal);\n this[0] = address;\n this.language = language;\n this.textCallback = textCallback;\n }\n copy() {\n const address = C._ts_tree_copy(this[0]);\n return new Tree(INTERNAL, address, this.language, this.textCallback);\n }\n delete() {\n C._ts_tree_delete(this[0]);\n this[0] = 0;\n }\n edit(edit) {\n marshalEdit(edit);\n C._ts_tree_edit_wasm(this[0]);\n }\n get rootNode() {\n C._ts_tree_root_node_wasm(this[0]);\n return unmarshalNode(this);\n }\n rootNodeWithOffset(offsetBytes, offsetExtent) {\n const address = TRANSFER_BUFFER + SIZE_OF_NODE;\n setValue(address, offsetBytes, \"i32\");\n marshalPoint(address + SIZE_OF_INT, offsetExtent);\n C._ts_tree_root_node_with_offset_wasm(this[0]);\n return unmarshalNode(this);\n }\n getLanguage() {\n return this.language;\n }\n walk() {\n return this.rootNode.walk();\n }\n getChangedRanges(other) {\n if (other.constructor !== Tree) {\n throw new TypeError(\"Argument must be a Tree\");\n }\n C._ts_tree_get_changed_ranges_wasm(this[0], other[0]);\n const count = getValue(TRANSFER_BUFFER, \"i32\");\n const buffer = getValue(TRANSFER_BUFFER + SIZE_OF_INT, \"i32\");\n const result = new Array(count);\n if (count > 0) {\n let address = buffer;\n for (let i = 0; i < count; i++) {\n result[i] = unmarshalRange(address);\n address += SIZE_OF_RANGE;\n }\n C._free(buffer);\n }\n return result;\n }\n getIncludedRanges() {\n C._ts_tree_included_ranges_wasm(this[0]);\n const count = getValue(TRANSFER_BUFFER, \"i32\");\n const buffer = getValue(TRANSFER_BUFFER + SIZE_OF_INT, \"i32\");\n const result = new Array(count);\n if (count > 0) {\n let address = buffer;\n for (let i = 0; i < count; i++) {\n result[i] = unmarshalRange(address);\n address += SIZE_OF_RANGE;\n }\n C._free(buffer);\n }\n return result;\n }\n }\n class Node {\n constructor(internal, tree) {\n assertInternal(internal);\n this.tree = tree;\n }\n get typeId() {\n marshalNode(this);\n return C._ts_node_symbol_wasm(this.tree[0]);\n }\n get grammarId() {\n marshalNode(this);\n return C._ts_node_grammar_symbol_wasm(this.tree[0]);\n }\n get type() {\n return this.tree.language.types[this.typeId] || \"ERROR\";\n }\n get grammarType() {\n return this.tree.language.types[this.grammarId] || \"ERROR\";\n }\n get endPosition() {\n marshalNode(this);\n C._ts_node_end_point_wasm(this.tree[0]);\n return unmarshalPoint(TRANSFER_BUFFER);\n }\n get endIndex() {\n marshalNode(this);\n return C._ts_node_end_index_wasm(this.tree[0]);\n }\n get text() {\n return getText(this.tree, this.startIndex, this.endIndex);\n }\n get parseState() {\n marshalNode(this);\n return C._ts_node_parse_state_wasm(this.tree[0]);\n }\n get nextParseState() {\n marshalNode(this);\n return C._ts_node_next_parse_state_wasm(this.tree[0]);\n }\n get isNamed() {\n marshalNode(this);\n return C._ts_node_is_named_wasm(this.tree[0]) === 1;\n }\n get hasError() {\n marshalNode(this);\n return C._ts_node_has_error_wasm(this.tree[0]) === 1;\n }\n get hasChanges() {\n marshalNode(this);\n return C._ts_node_has_changes_wasm(this.tree[0]) === 1;\n }\n get isError() {\n marshalNode(this);\n return C._ts_node_is_error_wasm(this.tree[0]) === 1;\n }\n get isMissing() {\n marshalNode(this);\n return C._ts_node_is_missing_wasm(this.tree[0]) === 1;\n }\n get isExtra() {\n marshalNode(this);\n return C._ts_node_is_extra_wasm(this.tree[0]) === 1;\n }\n equals(other) {\n return this.id === other.id;\n }\n child(index) {\n marshalNode(this);\n C._ts_node_child_wasm(this.tree[0], index);\n return unmarshalNode(this.tree);\n }\n namedChild(index) {\n marshalNode(this);\n C._ts_node_named_child_wasm(this.tree[0], index);\n return unmarshalNode(this.tree);\n }\n childForFieldId(fieldId) {\n marshalNode(this);\n C._ts_node_child_by_field_id_wasm(this.tree[0], fieldId);\n return unmarshalNode(this.tree);\n }\n childForFieldName(fieldName) {\n const fieldId = this.tree.language.fields.indexOf(fieldName);\n if (fieldId !== -1) return this.childForFieldId(fieldId);\n return null;\n }\n fieldNameForChild(index) {\n marshalNode(this);\n const address = C._ts_node_field_name_for_child_wasm(this.tree[0], index);\n if (!address) {\n return null;\n }\n const result = AsciiToString(address);\n // must not free, the string memory is owned by the language\n return result;\n }\n childrenForFieldName(fieldName) {\n const fieldId = this.tree.language.fields.indexOf(fieldName);\n if (fieldId !== -1 && fieldId !== 0) return this.childrenForFieldId(fieldId);\n return [];\n }\n childrenForFieldId(fieldId) {\n marshalNode(this);\n C._ts_node_children_by_field_id_wasm(this.tree[0], fieldId);\n const count = getValue(TRANSFER_BUFFER, \"i32\");\n const buffer = getValue(TRANSFER_BUFFER + SIZE_OF_INT, \"i32\");\n const result = new Array(count);\n if (count > 0) {\n let address = buffer;\n for (let i = 0; i < count; i++) {\n result[i] = unmarshalNode(this.tree, address);\n address += SIZE_OF_NODE;\n }\n C._free(buffer);\n }\n return result;\n }\n firstChildForIndex(index) {\n marshalNode(this);\n const address = TRANSFER_BUFFER + SIZE_OF_NODE;\n setValue(address, index, \"i32\");\n C._ts_node_first_child_for_byte_wasm(this.tree[0]);\n return unmarshalNode(this.tree);\n }\n firstNamedChildForIndex(index) {\n marshalNode(this);\n const address = TRANSFER_BUFFER + SIZE_OF_NODE;\n setValue(address, index, \"i32\");\n C._ts_node_first_named_child_for_byte_wasm(this.tree[0]);\n return unmarshalNode(this.tree);\n }\n get childCount() {\n marshalNode(this);\n return C._ts_node_child_count_wasm(this.tree[0]);\n }\n get namedChildCount() {\n marshalNode(this);\n return C._ts_node_named_child_count_wasm(this.tree[0]);\n }\n get firstChild() {\n return this.child(0);\n }\n get firstNamedChild() {\n return this.namedChild(0);\n }\n get lastChild() {\n return this.child(this.childCount - 1);\n }\n get lastNamedChild() {\n return this.namedChild(this.namedChildCount - 1);\n }\n get children() {\n if (!this._children) {\n marshalNode(this);\n C._ts_node_children_wasm(this.tree[0]);\n const count = getValue(TRANSFER_BUFFER, \"i32\");\n const buffer = getValue(TRANSFER_BUFFER + SIZE_OF_INT, \"i32\");\n this._children = new Array(count);\n if (count > 0) {\n let address = buffer;\n for (let i = 0; i < count; i++) {\n this._children[i] = unmarshalNode(this.tree, address);\n address += SIZE_OF_NODE;\n }\n C._free(buffer);\n }\n }\n return this._children;\n }\n get namedChildren() {\n if (!this._namedChildren) {\n marshalNode(this);\n C._ts_node_named_children_wasm(this.tree[0]);\n const count = getValue(TRANSFER_BUFFER, \"i32\");\n const buffer = getValue(TRANSFER_BUFFER + SIZE_OF_INT, \"i32\");\n this._namedChildren = new Array(count);\n if (count > 0) {\n let address = buffer;\n for (let i = 0; i < count; i++) {\n this._namedChildren[i] = unmarshalNode(this.tree, address);\n address += SIZE_OF_NODE;\n }\n C._free(buffer);\n }\n }\n return this._namedChildren;\n }\n descendantsOfType(types, startPosition, endPosition) {\n if (!Array.isArray(types)) types = [ types ];\n if (!startPosition) startPosition = ZERO_POINT;\n if (!endPosition) endPosition = ZERO_POINT;\n // Convert the type strings to numeric type symbols.\n const symbols = [];\n const typesBySymbol = this.tree.language.types;\n for (let i = 0, n = typesBySymbol.length; i < n; i++) {\n if (types.includes(typesBySymbol[i])) {\n symbols.push(i);\n }\n }\n // Copy the array of symbols to the WASM heap.\n const symbolsAddress = C._malloc(SIZE_OF_INT * symbols.length);\n for (let i = 0, n = symbols.length; i < n; i++) {\n setValue(symbolsAddress + i * SIZE_OF_INT, symbols[i], \"i32\");\n }\n // Call the C API to compute the descendants.\n marshalNode(this);\n C._ts_node_descendants_of_type_wasm(this.tree[0], symbolsAddress, symbols.length, startPosition.row, startPosition.column, endPosition.row, endPosition.column);\n // Instantiate the nodes based on the data returned.\n const descendantCount = getValue(TRANSFER_BUFFER, \"i32\");\n const descendantAddress = getValue(TRANSFER_BUFFER + SIZE_OF_INT, \"i32\");\n const result = new Array(descendantCount);\n if (descendantCount > 0) {\n let address = descendantAddress;\n for (let i = 0; i < descendantCount; i++) {\n result[i] = unmarshalNode(this.tree, address);\n address += SIZE_OF_NODE;\n }\n }\n // Free the intermediate buffers\n C._free(descendantAddress);\n C._free(symbolsAddress);\n return result;\n }\n get nextSibling() {\n marshalNode(this);\n C._ts_node_next_sibling_wasm(this.tree[0]);\n return unmarshalNode(this.tree);\n }\n get previousSibling() {\n marshalNode(this);\n C._ts_node_prev_sibling_wasm(this.tree[0]);\n return unmarshalNode(this.tree);\n }\n get nextNamedSibling() {\n marshalNode(this);\n C._ts_node_next_named_sibling_wasm(this.tree[0]);\n return unmarshalNode(this.tree);\n }\n get previousNamedSibling() {\n marshalNode(this);\n C._ts_node_prev_named_sibling_wasm(this.tree[0]);\n return unmarshalNode(this.tree);\n }\n get descendantCount() {\n marshalNode(this);\n return C._ts_node_descendant_count_wasm(this.tree[0]);\n }\n get parent() {\n marshalNode(this);\n C._ts_node_parent_wasm(this.tree[0]);\n return unmarshalNode(this.tree);\n }\n descendantForIndex(start, end = start) {\n if (typeof start !== \"number\" || typeof end !== \"number\") {\n throw new Error(\"Arguments must be numbers\");\n }\n marshalNode(this);\n const address = TRANSFER_BUFFER + SIZE_OF_NODE;\n setValue(address, start, \"i32\");\n setValue(address + SIZE_OF_INT, end, \"i32\");\n C._ts_node_descendant_for_index_wasm(this.tree[0]);\n return unmarshalNode(this.tree);\n }\n namedDescendantForIndex(start, end = start) {\n if (typeof start !== \"number\" || typeof end !== \"number\") {\n throw new Error(\"Arguments must be numbers\");\n }\n marshalNode(this);\n const address = TRANSFER_BUFFER + SIZE_OF_NODE;\n setValue(address, start, \"i32\");\n setValue(address + SIZE_OF_INT, end, \"i32\");\n C._ts_node_named_descendant_for_index_wasm(this.tree[0]);\n return unmarshalNode(this.tree);\n }\n descendantForPosition(start, end = start) {\n if (!isPoint(start) || !isPoint(end)) {\n throw new Error(\"Arguments must be {row, column} objects\");\n }\n marshalNode(this);\n const address = TRANSFER_BUFFER + SIZE_OF_NODE;\n marshalPoint(address, start);\n marshalPoint(address + SIZE_OF_POINT, end);\n C._ts_node_descendant_for_position_wasm(this.tree[0]);\n return unmarshalNode(this.tree);\n }\n namedDescendantForPosition(start, end = start) {\n if (!isPoint(start) || !isPoint(end)) {\n throw new Error(\"Arguments must be {row, column} objects\");\n }\n marshalNode(this);\n const address = TRANSFER_BUFFER + SIZE_OF_NODE;\n marshalPoint(address, start);\n marshalPoint(address + SIZE_OF_POINT, end);\n C._ts_node_named_descendant_for_position_wasm(this.tree[0]);\n return unmarshalNode(this.tree);\n }\n walk() {\n marshalNode(this);\n C._ts_tree_cursor_new_wasm(this.tree[0]);\n return new TreeCursor(INTERNAL, this.tree);\n }\n toString() {\n marshalNode(this);\n const address = C._ts_node_to_string_wasm(this.tree[0]);\n const result = AsciiToString(address);\n C._free(address);\n return result;\n }\n }\n class TreeCursor {\n constructor(internal, tree) {\n assertInternal(internal);\n this.tree = tree;\n unmarshalTreeCursor(this);\n }\n delete() {\n marshalTreeCursor(this);\n C._ts_tree_cursor_delete_wasm(this.tree[0]);\n this[0] = this[1] = this[2] = 0;\n }\n reset(node) {\n marshalNode(node);\n marshalTreeCursor(this, TRANSFER_BUFFER + SIZE_OF_NODE);\n C._ts_tree_cursor_reset_wasm(this.tree[0]);\n unmarshalTreeCursor(this);\n }\n resetTo(cursor) {\n marshalTreeCursor(this, TRANSFER_BUFFER);\n marshalTreeCursor(cursor, TRANSFER_BUFFER + SIZE_OF_CURSOR);\n C._ts_tree_cursor_reset_to_wasm(this.tree[0], cursor.tree[0]);\n unmarshalTreeCursor(this);\n }\n get nodeType() {\n return this.tree.language.types[this.nodeTypeId] || \"ERROR\";\n }\n get nodeTypeId() {\n marshalTreeCursor(this);\n return C._ts_tree_cursor_current_node_type_id_wasm(this.tree[0]);\n }\n get nodeStateId() {\n marshalTreeCursor(this);\n return C._ts_tree_cursor_current_node_state_id_wasm(this.tree[0]);\n }\n get nodeId() {\n marshalTreeCursor(this);\n return C._ts_tree_cursor_current_node_id_wasm(this.tree[0]);\n }\n get nodeIsNamed() {\n marshalTreeCursor(this);\n return C._ts_tree_cursor_current_node_is_named_wasm(this.tree[0]) === 1;\n }\n get nodeIsMissing() {\n marshalTreeCursor(this);\n return C._ts_tree_cursor_current_node_is_missing_wasm(this.tree[0]) === 1;\n }\n get nodeText() {\n marshalTreeCursor(this);\n const startIndex = C._ts_tree_cursor_start_index_wasm(this.tree[0]);\n const endIndex = C._ts_tree_cursor_end_index_wasm(this.tree[0]);\n return getText(this.tree, startIndex, endIndex);\n }\n get startPosition() {\n marshalTreeCursor(this);\n C._ts_tree_cursor_start_position_wasm(this.tree[0]);\n return unmarshalPoint(TRANSFER_BUFFER);\n }\n get endPosition() {\n marshalTreeCursor(this);\n C._ts_tree_cursor_end_position_wasm(this.tree[0]);\n return unmarshalPoint(TRANSFER_BUFFER);\n }\n get startIndex() {\n marshalTreeCursor(this);\n return C._ts_tree_cursor_start_index_wasm(this.tree[0]);\n }\n get endIndex() {\n marshalTreeCursor(this);\n return C._ts_tree_cursor_end_index_wasm(this.tree[0]);\n }\n get currentNode() {\n marshalTreeCursor(this);\n C._ts_tree_cursor_current_node_wasm(this.tree[0]);\n return unmarshalNode(this.tree);\n }\n get currentFieldId() {\n marshalTreeCursor(this);\n return C._ts_tree_cursor_current_field_id_wasm(this.tree[0]);\n }\n get currentFieldName() {\n return this.tree.language.fields[this.currentFieldId];\n }\n get currentDepth() {\n marshalTreeCursor(this);\n return C._ts_tree_cursor_current_depth_wasm(this.tree[0]);\n }\n get currentDescendantIndex() {\n marshalTreeCursor(this);\n return C._ts_tree_cursor_current_descendant_index_wasm(this.tree[0]);\n }\n gotoFirstChild() {\n marshalTreeCursor(this);\n const result = C._ts_tree_cursor_goto_first_child_wasm(this.tree[0]);\n unmarshalTreeCursor(this);\n return result === 1;\n }\n gotoLastChild() {\n marshalTreeCursor(this);\n const result = C._ts_tree_cursor_goto_last_child_wasm(this.tree[0]);\n unmarshalTreeCursor(this);\n return result === 1;\n }\n gotoFirstChildForIndex(goalIndex) {\n marshalTreeCursor(this);\n setValue(TRANSFER_BUFFER + SIZE_OF_CURSOR, goalIndex, \"i32\");\n const result = C._ts_tree_cursor_goto_first_child_for_index_wasm(this.tree[0]);\n unmarshalTreeCursor(this);\n return result === 1;\n }\n gotoFirstChildForPosition(goalPosition) {\n marshalTreeCursor(this);\n marshalPoint(TRANSFER_BUFFER + SIZE_OF_CURSOR, goalPosition);\n const result = C._ts_tree_cursor_goto_first_child_for_position_wasm(this.tree[0]);\n unmarshalTreeCursor(this);\n return result === 1;\n }\n gotoNextSibling() {\n marshalTreeCursor(this);\n const result = C._ts_tree_cursor_goto_next_sibling_wasm(this.tree[0]);\n unmarshalTreeCursor(this);\n return result === 1;\n }\n gotoPreviousSibling() {\n marshalTreeCursor(this);\n const result = C._ts_tree_cursor_goto_previous_sibling_wasm(this.tree[0]);\n unmarshalTreeCursor(this);\n return result === 1;\n }\n gotoDescendant(goalDescendantindex) {\n marshalTreeCursor(this);\n C._ts_tree_cursor_goto_descendant_wasm(this.tree[0], goalDescendantindex);\n unmarshalTreeCursor(this);\n }\n gotoParent() {\n marshalTreeCursor(this);\n const result = C._ts_tree_cursor_goto_parent_wasm(this.tree[0]);\n unmarshalTreeCursor(this);\n return result === 1;\n }\n }\n class Language {\n constructor(internal, address) {\n assertInternal(internal);\n this[0] = address;\n this.types = new Array(C._ts_language_symbol_count(this[0]));\n for (let i = 0, n = this.types.length; i < n; i++) {\n if (C._ts_language_symbol_type(this[0], i) < 2) {\n this.types[i] = UTF8ToString(C._ts_language_symbol_name(this[0], i));\n }\n }\n this.fields = new Array(C._ts_language_field_count(this[0]) + 1);\n for (let i = 0, n = this.fields.length; i < n; i++) {\n const fieldName = C._ts_language_field_name_for_id(this[0], i);\n if (fieldName !== 0) {\n this.fields[i] = UTF8ToString(fieldName);\n } else {\n this.fields[i] = null;\n }\n }\n }\n get version() {\n return C._ts_language_version(this[0]);\n }\n get fieldCount() {\n return this.fields.length - 1;\n }\n get stateCount() {\n return C._ts_language_state_count(this[0]);\n }\n fieldIdForName(fieldName) {\n const result = this.fields.indexOf(fieldName);\n if (result !== -1) {\n return result;\n } else {\n return null;\n }\n }\n fieldNameForId(fieldId) {\n return this.fields[fieldId] || null;\n }\n idForNodeType(type, named) {\n const typeLength = lengthBytesUTF8(type);\n const typeAddress = C._malloc(typeLength + 1);\n stringToUTF8(type, typeAddress, typeLength + 1);\n const result = C._ts_language_symbol_for_name(this[0], typeAddress, typeLength, named);\n C._free(typeAddress);\n return result || null;\n }\n get nodeTypeCount() {\n return C._ts_language_symbol_count(this[0]);\n }\n nodeTypeForId(typeId) {\n const name = C._ts_language_symbol_name(this[0], typeId);\n return name ? UTF8ToString(name) : null;\n }\n nodeTypeIsNamed(typeId) {\n return C._ts_language_type_is_named_wasm(this[0], typeId) ? true : false;\n }\n nodeTypeIsVisible(typeId) {\n return C._ts_language_type_is_visible_wasm(this[0], typeId) ? true : false;\n }\n nextState(stateId, typeId) {\n return C._ts_language_next_state(this[0], stateId, typeId);\n }\n lookaheadIterator(stateId) {\n const address = C._ts_lookahead_iterator_new(this[0], stateId);\n if (address) return new LookaheadIterable(INTERNAL, address, this);\n return null;\n }\n query(source) {\n const sourceLength = lengthBytesUTF8(source);\n const sourceAddress = C._malloc(sourceLength + 1);\n stringToUTF8(source, sourceAddress, sourceLength + 1);\n const address = C._ts_query_new(this[0], sourceAddress, sourceLength, TRANSFER_BUFFER, TRANSFER_BUFFER + SIZE_OF_INT);\n if (!address) {\n const errorId = getValue(TRANSFER_BUFFER + SIZE_OF_INT, \"i32\");\n const errorByte = getValue(TRANSFER_BUFFER, \"i32\");\n const errorIndex = UTF8ToString(sourceAddress, errorByte).length;\n const suffix = source.substr(errorIndex, 100).split(\"\\n\")[0];\n let word = suffix.match(QUERY_WORD_REGEX)[0];\n let error;\n switch (errorId) {\n case 2:\n error = new RangeError(`Bad node name '${word}'`);\n break;\n\n case 3:\n error = new RangeError(`Bad field name '${word}'`);\n break;\n\n case 4:\n error = new RangeError(`Bad capture name @${word}`);\n break;\n\n case 5:\n error = new TypeError(`Bad pattern structure at offset ${errorIndex}: '${suffix}'...`);\n word = \"\";\n break;\n\n default:\n error = new SyntaxError(`Bad syntax at offset ${errorIndex}: '${suffix}'...`);\n word = \"\";\n break;\n }\n error.index = errorIndex;\n error.length = word.length;\n C._free(sourceAddress);\n throw error;\n }\n const stringCount = C._ts_query_string_count(address);\n const captureCount = C._ts_query_capture_count(address);\n const patternCount = C._ts_query_pattern_count(address);\n const captureNames = new Array(captureCount);\n const stringValues = new Array(stringCount);\n for (let i = 0; i < captureCount; i++) {\n const nameAddress = C._ts_query_capture_name_for_id(address, i, TRANSFER_BUFFER);\n const nameLength = getValue(TRANSFER_BUFFER, \"i32\");\n captureNames[i] = UTF8ToString(nameAddress, nameLength);\n }\n for (let i = 0; i < stringCount; i++) {\n const valueAddress = C._ts_query_string_value_for_id(address, i, TRANSFER_BUFFER);\n const nameLength = getValue(TRANSFER_BUFFER, \"i32\");\n stringValues[i] = UTF8ToString(valueAddress, nameLength);\n }\n const setProperties = new Array(patternCount);\n const assertedProperties = new Array(patternCount);\n const refutedProperties = new Array(patternCount);\n const predicates = new Array(patternCount);\n const textPredicates = new Array(patternCount);\n for (let i = 0; i < patternCount; i++) {\n const predicatesAddress = C._ts_query_predicates_for_pattern(address, i, TRANSFER_BUFFER);\n const stepCount = getValue(TRANSFER_BUFFER, \"i32\");\n predicates[i] = [];\n textPredicates[i] = [];\n const steps = [];\n let stepAddress = predicatesAddress;\n for (let j = 0; j < stepCount; j++) {\n const stepType = getValue(stepAddress, \"i32\");\n stepAddress += SIZE_OF_INT;\n const stepValueId = getValue(stepAddress, \"i32\");\n stepAddress += SIZE_OF_INT;\n if (stepType === PREDICATE_STEP_TYPE_CAPTURE) {\n steps.push({\n type: \"capture\",\n name: captureNames[stepValueId]\n });\n } else if (stepType === PREDICATE_STEP_TYPE_STRING) {\n steps.push({\n type: \"string\",\n value: stringValues[stepValueId]\n });\n } else if (steps.length > 0) {\n if (steps[0].type !== \"string\") {\n throw new Error(\"Predicates must begin with a literal value\");\n }\n const operator = steps[0].value;\n let isPositive = true;\n let matchAll = true;\n let captureName;\n switch (operator) {\n case \"any-not-eq?\":\n case \"not-eq?\":\n isPositive = false;\n\n case \"any-eq?\":\n case \"eq?\":\n if (steps.length !== 3) {\n throw new Error(`Wrong number of arguments to \\`#${operator}\\` predicate. Expected 2, got ${steps.length - 1}`);\n }\n if (steps[1].type !== \"capture\") {\n throw new Error(`First argument of \\`#${operator}\\` predicate must be a capture. Got \"${steps[1].value}\"`);\n }\n matchAll = !operator.startsWith(\"any-\");\n if (steps[2].type === \"capture\") {\n const captureName1 = steps[1].name;\n const captureName2 = steps[2].name;\n textPredicates[i].push(captures => {\n const nodes1 = [];\n const nodes2 = [];\n for (const c of captures) {\n if (c.name === captureName1) nodes1.push(c.node);\n if (c.name === captureName2) nodes2.push(c.node);\n }\n const compare = (n1, n2, positive) => positive ? n1.text === n2.text : n1.text !== n2.text;\n return matchAll ? nodes1.every(n1 => nodes2.some(n2 => compare(n1, n2, isPositive))) : nodes1.some(n1 => nodes2.some(n2 => compare(n1, n2, isPositive)));\n });\n } else {\n captureName = steps[1].name;\n const stringValue = steps[2].value;\n const matches = n => n.text === stringValue;\n const doesNotMatch = n => n.text !== stringValue;\n textPredicates[i].push(captures => {\n const nodes = [];\n for (const c of captures) {\n if (c.name === captureName) nodes.push(c.node);\n }\n const test = isPositive ? matches : doesNotMatch;\n return matchAll ? nodes.every(test) : nodes.some(test);\n });\n }\n break;\n\n case \"any-not-match?\":\n case \"not-match?\":\n isPositive = false;\n\n case \"any-match?\":\n case \"match?\":\n if (steps.length !== 3) {\n throw new Error(`Wrong number of arguments to \\`#${operator}\\` predicate. Expected 2, got ${steps.length - 1}.`);\n }\n if (steps[1].type !== \"capture\") {\n throw new Error(`First argument of \\`#${operator}\\` predicate must be a capture. Got \"${steps[1].value}\".`);\n }\n if (steps[2].type !== \"string\") {\n throw new Error(`Second argument of \\`#${operator}\\` predicate must be a string. Got @${steps[2].value}.`);\n }\n captureName = steps[1].name;\n const regex = new RegExp(steps[2].value);\n matchAll = !operator.startsWith(\"any-\");\n textPredicates[i].push(captures => {\n const nodes = [];\n for (const c of captures) {\n if (c.name === captureName) nodes.push(c.node.text);\n }\n const test = (text, positive) => positive ? regex.test(text) : !regex.test(text);\n if (nodes.length === 0) return !isPositive;\n return matchAll ? nodes.every(text => test(text, isPositive)) : nodes.some(text => test(text, isPositive));\n });\n break;\n\n case \"set!\":\n if (steps.length < 2 || steps.length > 3) {\n throw new Error(`Wrong number of arguments to \\`#set!\\` predicate. Expected 1 or 2. Got ${steps.length - 1}.`);\n }\n if (steps.some(s => s.type !== \"string\")) {\n throw new Error(`Arguments to \\`#set!\\` predicate must be a strings.\".`);\n }\n if (!setProperties[i]) setProperties[i] = {};\n setProperties[i][steps[1].value] = steps[2] ? steps[2].value : null;\n break;\n\n case \"is?\":\n case \"is-not?\":\n if (steps.length < 2 || steps.length > 3) {\n throw new Error(`Wrong number of arguments to \\`#${operator}\\` predicate. Expected 1 or 2. Got ${steps.length - 1}.`);\n }\n if (steps.some(s => s.type !== \"string\")) {\n throw new Error(`Arguments to \\`#${operator}\\` predicate must be a strings.\".`);\n }\n const properties = operator === \"is?\" ? assertedProperties : refutedProperties;\n if (!properties[i]) properties[i] = {};\n properties[i][steps[1].value] = steps[2] ? steps[2].value : null;\n break;\n\n case \"not-any-of?\":\n isPositive = false;\n\n case \"any-of?\":\n if (steps.length < 2) {\n throw new Error(`Wrong number of arguments to \\`#${operator}\\` predicate. Expected at least 1. Got ${steps.length - 1}.`);\n }\n if (steps[1].type !== \"capture\") {\n throw new Error(`First argument of \\`#${operator}\\` predicate must be a capture. Got \"${steps[1].value}\".`);\n }\n for (let i = 2; i < steps.length; i++) {\n if (steps[i].type !== \"string\") {\n throw new Error(`Arguments to \\`#${operator}\\` predicate must be a strings.\".`);\n }\n }\n captureName = steps[1].name;\n const values = steps.slice(2).map(s => s.value);\n textPredicates[i].push(captures => {\n const nodes = [];\n for (const c of captures) {\n if (c.name === captureName) nodes.push(c.node.text);\n }\n if (nodes.length === 0) return !isPositive;\n return nodes.every(text => values.includes(text)) === isPositive;\n });\n break;\n\n default:\n predicates[i].push({\n operator: operator,\n operands: steps.slice(1)\n });\n }\n steps.length = 0;\n }\n }\n Object.freeze(setProperties[i]);\n Object.freeze(assertedProperties[i]);\n Object.freeze(refutedProperties[i]);\n }\n C._free(sourceAddress);\n return new Query(INTERNAL, address, captureNames, textPredicates, predicates, Object.freeze(setProperties), Object.freeze(assertedProperties), Object.freeze(refutedProperties));\n }\n static load(input) {\n let bytes;\n if (input instanceof Uint8Array) {\n bytes = Promise.resolve(input);\n } else {\n const url = input;\n if (typeof process !== \"undefined\" && process.versions && process.versions.node) {\n const fs = require(\"fs\");\n bytes = Promise.resolve(fs.readFileSync(url));\n } else {\n bytes = fetch(url).then(response => response.arrayBuffer().then(buffer => {\n if (response.ok) {\n return new Uint8Array(buffer);\n } else {\n const body = new TextDecoder(\"utf-8\").decode(buffer);\n throw new Error(`Language.load failed with status ${response.status}.\\n\\n${body}`);\n }\n }));\n }\n }\n return bytes.then(bytes => loadWebAssemblyModule(bytes, {\n loadAsync: true\n })).then(mod => {\n const symbolNames = Object.keys(mod);\n const functionName = symbolNames.find(key => LANGUAGE_FUNCTION_REGEX.test(key) && !key.includes(\"external_scanner_\"));\n if (!functionName) {\n console.log(`Couldn't find language function in WASM file. Symbols:\\n${JSON.stringify(symbolNames, null, 2)}`);\n }\n const languageAddress = mod[functionName]();\n return new Language(INTERNAL, languageAddress);\n });\n }\n }\n class LookaheadIterable {\n constructor(internal, address, language) {\n assertInternal(internal);\n this[0] = address;\n this.language = language;\n }\n get currentTypeId() {\n return C._ts_lookahead_iterator_current_symbol(this[0]);\n }\n get currentType() {\n return this.language.types[this.currentTypeId] || \"ERROR\";\n }\n delete() {\n C._ts_lookahead_iterator_delete(this[0]);\n this[0] = 0;\n }\n resetState(stateId) {\n return C._ts_lookahead_iterator_reset_state(this[0], stateId);\n }\n reset(language, stateId) {\n if (C._ts_lookahead_iterator_reset(this[0], language[0], stateId)) {\n this.language = language;\n return true;\n }\n return false;\n }\n [Symbol.iterator]() {\n const self = this;\n return {\n next() {\n if (C._ts_lookahead_iterator_next(self[0])) {\n return {\n done: false,\n value: self.currentType\n };\n }\n return {\n done: true,\n value: \"\"\n };\n }\n };\n }\n }\n class Query {\n constructor(internal, address, captureNames, textPredicates, predicates, setProperties, assertedProperties, refutedProperties) {\n assertInternal(internal);\n this[0] = address;\n this.captureNames = captureNames;\n this.textPredicates = textPredicates;\n this.predicates = predicates;\n this.setProperties = setProperties;\n this.assertedProperties = assertedProperties;\n this.refutedProperties = refutedProperties;\n this.exceededMatchLimit = false;\n }\n delete() {\n C._ts_query_delete(this[0]);\n this[0] = 0;\n }\n matches(node, {startPosition: startPosition = ZERO_POINT, endPosition: endPosition = ZERO_POINT, startIndex: startIndex = 0, endIndex: endIndex = 0, matchLimit: matchLimit = 4294967295, maxStartDepth: maxStartDepth = 4294967295, timeoutMicros: timeoutMicros = 0} = {}) {\n if (typeof matchLimit !== \"number\") {\n throw new Error(\"Arguments must be numbers\");\n }\n marshalNode(node);\n C._ts_query_matches_wasm(this[0], node.tree[0], startPosition.row, startPosition.column, endPosition.row, endPosition.column, startIndex, endIndex, matchLimit, maxStartDepth, timeoutMicros);\n const rawCount = getValue(TRANSFER_BUFFER, \"i32\");\n const startAddress = getValue(TRANSFER_BUFFER + SIZE_OF_INT, \"i32\");\n const didExceedMatchLimit = getValue(TRANSFER_BUFFER + 2 * SIZE_OF_INT, \"i32\");\n const result = new Array(rawCount);\n this.exceededMatchLimit = Boolean(didExceedMatchLimit);\n let filteredCount = 0;\n let address = startAddress;\n for (let i = 0; i < rawCount; i++) {\n const pattern = getValue(address, \"i32\");\n address += SIZE_OF_INT;\n const captureCount = getValue(address, \"i32\");\n address += SIZE_OF_INT;\n const captures = new Array(captureCount);\n address = unmarshalCaptures(this, node.tree, address, captures);\n if (this.textPredicates[pattern].every(p => p(captures))) {\n result[filteredCount] = {\n pattern: pattern,\n captures: captures\n };\n const setProperties = this.setProperties[pattern];\n if (setProperties) result[filteredCount].setProperties = setProperties;\n const assertedProperties = this.assertedProperties[pattern];\n if (assertedProperties) result[filteredCount].assertedProperties = assertedProperties;\n const refutedProperties = this.refutedProperties[pattern];\n if (refutedProperties) result[filteredCount].refutedProperties = refutedProperties;\n filteredCount++;\n }\n }\n result.length = filteredCount;\n C._free(startAddress);\n return result;\n }\n captures(node, {startPosition: startPosition = ZERO_POINT, endPosition: endPosition = ZERO_POINT, startIndex: startIndex = 0, endIndex: endIndex = 0, matchLimit: matchLimit = 4294967295, maxStartDepth: maxStartDepth = 4294967295, timeoutMicros: timeoutMicros = 0} = {}) {\n if (typeof matchLimit !== \"number\") {\n throw new Error(\"Arguments must be numbers\");\n }\n marshalNode(node);\n C._ts_query_captures_wasm(this[0], node.tree[0], startPosition.row, startPosition.column, endPosition.row, endPosition.column, startIndex, endIndex, matchLimit, maxStartDepth, timeoutMicros);\n const count = getValue(TRANSFER_BUFFER, \"i32\");\n const startAddress = getValue(TRANSFER_BUFFER + SIZE_OF_INT, \"i32\");\n const didExceedMatchLimit = getValue(TRANSFER_BUFFER + 2 * SIZE_OF_INT, \"i32\");\n const result = [];\n this.exceededMatchLimit = Boolean(didExceedMatchLimit);\n const captures = [];\n let address = startAddress;\n for (let i = 0; i < count; i++) {\n const pattern = getValue(address, \"i32\");\n address += SIZE_OF_INT;\n const captureCount = getValue(address, \"i32\");\n address += SIZE_OF_INT;\n const captureIndex = getValue(address, \"i32\");\n address += SIZE_OF_INT;\n captures.length = captureCount;\n address = unmarshalCaptures(this, node.tree, address, captures);\n if (this.textPredicates[pattern].every(p => p(captures))) {\n const capture = captures[captureIndex];\n const setProperties = this.setProperties[pattern];\n if (setProperties) capture.setProperties = setProperties;\n const assertedProperties = this.assertedProperties[pattern];\n if (assertedProperties) capture.assertedProperties = assertedProperties;\n const refutedProperties = this.refutedProperties[pattern];\n if (refutedProperties) capture.refutedProperties = refutedProperties;\n result.push(capture);\n }\n }\n C._free(startAddress);\n return result;\n }\n predicatesForPattern(patternIndex) {\n return this.predicates[patternIndex];\n }\n disableCapture(captureName) {\n const captureNameLength = lengthBytesUTF8(captureName);\n const captureNameAddress = C._malloc(captureNameLength + 1);\n stringToUTF8(captureName, captureNameAddress, captureNameLength + 1);\n C._ts_query_disable_capture(this[0], captureNameAddress, captureNameLength);\n C._free(captureNameAddress);\n }\n didExceedMatchLimit() {\n return this.exceededMatchLimit;\n }\n }\n function getText(tree, startIndex, endIndex) {\n const length = endIndex - startIndex;\n let result = tree.textCallback(startIndex, null, endIndex);\n startIndex += result.length;\n while (startIndex < endIndex) {\n const string = tree.textCallback(startIndex, null, endIndex);\n if (string && string.length > 0) {\n startIndex += string.length;\n result += string;\n } else {\n break;\n }\n }\n if (startIndex > endIndex) {\n result = result.slice(0, length);\n }\n return result;\n }\n function unmarshalCaptures(query, tree, address, result) {\n for (let i = 0, n = result.length; i < n; i++) {\n const captureIndex = getValue(address, \"i32\");\n address += SIZE_OF_INT;\n const node = unmarshalNode(tree, address);\n address += SIZE_OF_NODE;\n result[i] = {\n name: query.captureNames[captureIndex],\n node: node\n };\n }\n return address;\n }\n function assertInternal(x) {\n if (x !== INTERNAL) throw new Error(\"Illegal constructor\");\n }\n function isPoint(point) {\n return (point && typeof point.row === \"number\" && typeof point.column === \"number\");\n }\n function marshalNode(node) {\n let address = TRANSFER_BUFFER;\n setValue(address, node.id, \"i32\");\n address += SIZE_OF_INT;\n setValue(address, node.startIndex, \"i32\");\n address += SIZE_OF_INT;\n setValue(address, node.startPosition.row, \"i32\");\n address += SIZE_OF_INT;\n setValue(address, node.startPosition.column, \"i32\");\n address += SIZE_OF_INT;\n setValue(address, node[0], \"i32\");\n }\n function unmarshalNode(tree, address = TRANSFER_BUFFER) {\n const id = getValue(address, \"i32\");\n address += SIZE_OF_INT;\n if (id === 0) return null;\n const index = getValue(address, \"i32\");\n address += SIZE_OF_INT;\n const row = getValue(address, \"i32\");\n address += SIZE_OF_INT;\n const column = getValue(address, \"i32\");\n address += SIZE_OF_INT;\n const other = getValue(address, \"i32\");\n const result = new Node(INTERNAL, tree);\n result.id = id;\n result.startIndex = index;\n result.startPosition = {\n row: row,\n column: column\n };\n result[0] = other;\n return result;\n }\n function marshalTreeCursor(cursor, address = TRANSFER_BUFFER) {\n setValue(address + 0 * SIZE_OF_INT, cursor[0], \"i32\");\n setValue(address + 1 * SIZE_OF_INT, cursor[1], \"i32\");\n setValue(address + 2 * SIZE_OF_INT, cursor[2], \"i32\");\n setValue(address + 3 * SIZE_OF_INT, cursor[3], \"i32\");\n }\n function unmarshalTreeCursor(cursor) {\n cursor[0] = getValue(TRANSFER_BUFFER + 0 * SIZE_OF_INT, \"i32\");\n cursor[1] = getValue(TRANSFER_BUFFER + 1 * SIZE_OF_INT, \"i32\");\n cursor[2] = getValue(TRANSFER_BUFFER + 2 * SIZE_OF_INT, \"i32\");\n cursor[3] = getValue(TRANSFER_BUFFER + 3 * SIZE_OF_INT, \"i32\");\n }\n function marshalPoint(address, point) {\n setValue(address, point.row, \"i32\");\n setValue(address + SIZE_OF_INT, point.column, \"i32\");\n }\n function unmarshalPoint(address) {\n const result = {\n row: getValue(address, \"i32\") >>> 0,\n column: getValue(address + SIZE_OF_INT, \"i32\") >>> 0\n };\n return result;\n }\n function marshalRange(address, range) {\n marshalPoint(address, range.startPosition);\n address += SIZE_OF_POINT;\n marshalPoint(address, range.endPosition);\n address += SIZE_OF_POINT;\n setValue(address, range.startIndex, \"i32\");\n address += SIZE_OF_INT;\n setValue(address, range.endIndex, \"i32\");\n address += SIZE_OF_INT;\n }\n function unmarshalRange(address) {\n const result = {};\n result.startPosition = unmarshalPoint(address);\n address += SIZE_OF_POINT;\n result.endPosition = unmarshalPoint(address);\n address += SIZE_OF_POINT;\n result.startIndex = getValue(address, \"i32\") >>> 0;\n address += SIZE_OF_INT;\n result.endIndex = getValue(address, \"i32\") >>> 0;\n return result;\n }\n function marshalEdit(edit) {\n let address = TRANSFER_BUFFER;\n marshalPoint(address, edit.startPosition);\n address += SIZE_OF_POINT;\n marshalPoint(address, edit.oldEndPosition);\n address += SIZE_OF_POINT;\n marshalPoint(address, edit.newEndPosition);\n address += SIZE_OF_POINT;\n setValue(address, edit.startIndex, \"i32\");\n address += SIZE_OF_INT;\n setValue(address, edit.oldEndIndex, \"i32\");\n address += SIZE_OF_INT;\n setValue(address, edit.newEndIndex, \"i32\");\n address += SIZE_OF_INT;\n }\n // end include: /src/lib/binding_web/binding.js\n // include: /src/lib/binding_web/suffix.js\n for (const name of Object.getOwnPropertyNames(ParserImpl.prototype)) {\n Object.defineProperty(Parser.prototype, name, {\n value: ParserImpl.prototype[name],\n enumerable: false,\n writable: false\n });\n }\n Parser.Language = Language;\n Module.onRuntimeInitialized = () => {\n ParserImpl.init();\n resolveInitPromise();\n };\n });\n }\n }\n return Parser;\n}();\n\nif (typeof exports === \"object\") {\n module.exports = TreeSitter;\n}\n","import { AgentSideConnection, ndJsonStream } from \"@agentclientprotocol/sdk\";\nimport type { SessionLogWriter } from \"../session-log-writer\";\nimport type { PostHogAPIConfig, ProcessSpawnedCallback } from \"../types\";\nimport { Logger } from \"../utils/logger\";\nimport {\n createBidirectionalStreams,\n createTappedWritableStream,\n type StreamPair,\n} from \"../utils/streams\";\nimport { ClaudeAcpAgent } from \"./claude/claude-agent\";\nimport { CodexAcpAgent } from \"./codex/codex-agent\";\nimport type { CodexProcessOptions } from \"./codex/spawn\";\n\ntype AgentAdapter = \"claude\" | \"codex\";\n\nexport type AcpConnectionConfig = {\n adapter?: AgentAdapter;\n logWriter?: SessionLogWriter;\n taskRunId?: string;\n taskId?: string;\n /** Deployment environment - \"local\" for desktop, \"cloud\" for cloud sandbox */\n deviceType?: \"local\" | \"cloud\";\n logger?: Logger;\n processCallbacks?: ProcessSpawnedCallback;\n codexOptions?: CodexProcessOptions;\n allowedModelIds?: Set<string>;\n /** Callback invoked when the agent calls the create_output tool for structured output */\n onStructuredOutput?: (output: Record<string, unknown>) => Promise<void>;\n /** PostHog API config; when set, enables file-read enrichment unless disabled. */\n posthogApiConfig?: PostHogAPIConfig;\n /** Defaults to true when posthogApiConfig is set. Set to false to disable enrichment. */\n enricherEnabled?: boolean;\n};\n\nexport type AcpConnection = {\n agentConnection?: AgentSideConnection;\n clientStreams: StreamPair;\n cleanup: () => Promise<void>;\n};\n\nexport type InProcessAcpConnection = AcpConnection;\n\n/**\n * Creates an ACP connection with the specified agent framework.\n *\n * @param config - Configuration including framework selection\n * @returns Connection with agent and client streams\n */\nexport function createAcpConnection(\n config: AcpConnectionConfig = {},\n): AcpConnection {\n const adapterType = config.adapter ?? \"claude\";\n\n if (adapterType === \"codex\") {\n return createCodexConnection(config);\n }\n\n return createClaudeConnection(config);\n}\n\nfunction resolveEnricherApiConfig(\n config: AcpConnectionConfig,\n): PostHogAPIConfig | undefined {\n const enabled = !!config.posthogApiConfig && config.enricherEnabled !== false;\n return enabled ? config.posthogApiConfig : undefined;\n}\n\nfunction createClaudeConnection(config: AcpConnectionConfig): AcpConnection {\n const logger =\n config.logger?.child(\"AcpConnection\") ??\n new Logger({ debug: true, prefix: \"[AcpConnection]\" });\n const streams = createBidirectionalStreams();\n\n const { logWriter } = config;\n\n let agentWritable = streams.agent.writable;\n let clientWritable = streams.client.writable;\n\n if (config.taskRunId && logWriter) {\n if (!logWriter.isRegistered(config.taskRunId)) {\n logWriter.register(config.taskRunId, {\n taskId: config.taskId ?? config.taskRunId,\n runId: config.taskRunId,\n deviceType: config.deviceType,\n });\n }\n\n const taskRunId = config.taskRunId;\n agentWritable = createTappedWritableStream(streams.agent.writable, {\n onMessage: (line) => {\n logWriter.appendRawLine(taskRunId, line);\n },\n logger,\n });\n\n clientWritable = createTappedWritableStream(streams.client.writable, {\n onMessage: (line) => {\n logWriter.appendRawLine(taskRunId, line);\n },\n logger,\n });\n } else {\n logger.info(\"Tapped streams NOT enabled\", {\n hasTaskRunId: !!config.taskRunId,\n hasLogWriter: !!logWriter,\n });\n }\n\n const agentStream = ndJsonStream(agentWritable, streams.agent.readable);\n\n let agent: ClaudeAcpAgent | null = null;\n const agentConnection = new AgentSideConnection((client) => {\n agent = new ClaudeAcpAgent(client, {\n ...config.processCallbacks,\n onStructuredOutput: config.onStructuredOutput,\n posthogApiConfig: resolveEnricherApiConfig(config),\n });\n return agent;\n }, agentStream);\n\n return {\n agentConnection,\n clientStreams: {\n readable: streams.client.readable,\n writable: clientWritable,\n },\n cleanup: async () => {\n logger.info(\"Cleaning up ACP connection\");\n\n if (agent) {\n await agent.closeSession();\n }\n\n try {\n await streams.client.writable.close();\n } catch {\n // Stream may already be closed\n }\n try {\n await streams.agent.writable.close();\n } catch {\n // Stream may already be closed\n }\n },\n };\n}\n\n/**\n * Creates an ACP connection to codex-acp via an in-process proxy agent.\n *\n * The CodexAcpAgent implements the ACP Agent interface and delegates to\n * the codex-acp binary over a ClientSideConnection. This replaces the\n * previous raw stream transform approach and gives us proper interception\n * points for PostHog-specific features.\n */\nfunction createCodexConnection(config: AcpConnectionConfig): AcpConnection {\n const logger =\n config.logger?.child(\"CodexConnection\") ??\n new Logger({ debug: true, prefix: \"[CodexConnection]\" });\n\n const { logWriter } = config;\n\n // Create bidirectional streams for client ↔ agent communication\n const streams = createBidirectionalStreams();\n\n let agentWritable = streams.agent.writable;\n let clientWritable = streams.client.writable;\n\n // Tap streams for session log writing\n if (config.taskRunId && logWriter) {\n if (!logWriter.isRegistered(config.taskRunId)) {\n logWriter.register(config.taskRunId, {\n taskId: config.taskId ?? config.taskRunId,\n runId: config.taskRunId,\n deviceType: config.deviceType,\n });\n }\n\n const taskRunId = config.taskRunId;\n agentWritable = createTappedWritableStream(streams.agent.writable, {\n onMessage: (line) => {\n logWriter.appendRawLine(taskRunId, line);\n },\n logger,\n });\n\n clientWritable = createTappedWritableStream(streams.client.writable, {\n onMessage: (line) => {\n logWriter.appendRawLine(taskRunId, line);\n },\n logger,\n });\n } else {\n logger.info(\"Tapped streams NOT enabled for Codex\", {\n hasTaskRunId: !!config.taskRunId,\n hasLogWriter: !!logWriter,\n });\n }\n\n const agentStream = ndJsonStream(agentWritable, streams.agent.readable);\n\n let agent: CodexAcpAgent | null = null;\n const agentConnection = new AgentSideConnection((client) => {\n agent = new CodexAcpAgent(client, {\n codexProcessOptions: config.codexOptions ?? {},\n processCallbacks: config.processCallbacks,\n posthogApiConfig: resolveEnricherApiConfig(config),\n });\n return agent;\n }, agentStream);\n\n return {\n agentConnection,\n clientStreams: {\n readable: streams.client.readable,\n writable: clientWritable,\n },\n cleanup: async () => {\n logger.info(\"Cleaning up Codex connection\");\n\n if (agent) {\n await agent.closeSession();\n }\n\n try {\n await streams.client.writable.close();\n } catch {\n // Stream may already be closed\n }\n try {\n await streams.agent.writable.close();\n } catch {\n // Stream may already be closed\n }\n },\n };\n}\n","import type { LogLevel as LogLevelType, OnLogCallback } from \"../types\";\n\nexport interface LoggerConfig {\n debug?: boolean;\n prefix?: string;\n scope?: string;\n onLog?: OnLogCallback;\n}\n\nexport class Logger {\n private debugEnabled: boolean;\n private prefix: string;\n private scope: string;\n private onLog?: OnLogCallback;\n\n constructor(config: LoggerConfig = {}) {\n this.debugEnabled = config.debug ?? false;\n this.prefix = config.prefix ?? \"[PostHog Agent]\";\n this.scope = config.scope ?? \"agent\";\n this.onLog = config.onLog;\n }\n\n private formatMessage(\n level: string,\n message: string,\n data?: unknown,\n ): string {\n const timestamp = new Date().toISOString();\n const base = `${timestamp} ${this.prefix} [${level}] ${message}`;\n\n if (data !== undefined) {\n return `${base} ${JSON.stringify(data, null, 2)}`;\n }\n\n return base;\n }\n\n private emitLog(level: LogLevelType, message: string, data?: unknown) {\n if (this.onLog) {\n this.onLog(level, this.scope, message, data);\n return;\n }\n\n const shouldLog = this.debugEnabled || level === \"error\";\n\n if (shouldLog) {\n console[level](this.formatMessage(level.toLowerCase(), message, data));\n }\n }\n\n error(message: string, error?: Error | unknown) {\n const data =\n error instanceof Error\n ? { message: error.message, stack: error.stack }\n : error;\n\n this.emitLog(\"error\", message, data);\n }\n\n warn(message: string, data?: unknown) {\n this.emitLog(\"warn\", message, data);\n }\n\n info(message: string, data?: unknown) {\n this.emitLog(\"info\", message, data);\n }\n\n debug(message: string, data?: unknown) {\n this.emitLog(\"debug\", message, data);\n }\n\n child(childPrefix: string): Logger {\n return new Logger({\n debug: this.debugEnabled,\n prefix: `${this.prefix} [${childPrefix}]`,\n scope: `${this.scope}:${childPrefix}`,\n onLog: this.onLog,\n });\n }\n}\n","import type { Readable, Writable } from \"node:stream\";\nimport { ReadableStream, WritableStream } from \"node:stream/web\";\nimport type { Logger } from \"./logger\";\n\nexport class Pushable<T> implements AsyncIterable<T> {\n private queue: T[] = [];\n private resolvers: ((value: IteratorResult<T>) => void)[] = [];\n private done = false;\n\n push(item: T) {\n const resolve = this.resolvers.shift();\n if (resolve) {\n resolve({ value: item, done: false });\n } else {\n this.queue.push(item);\n }\n }\n\n end() {\n this.done = true;\n for (const resolve of this.resolvers) {\n resolve({ value: undefined as unknown as T, done: true });\n }\n this.resolvers = [];\n }\n\n [Symbol.asyncIterator](): AsyncIterator<T> {\n return {\n next: (): Promise<IteratorResult<T>> => {\n if (this.queue.length > 0) {\n const value = this.queue.shift() as T;\n return Promise.resolve({ value, done: false });\n }\n if (this.done) {\n return Promise.resolve({\n value: undefined as unknown as T,\n done: true,\n });\n }\n return new Promise<IteratorResult<T>>((resolve) => {\n this.resolvers.push(resolve);\n });\n },\n };\n }\n}\n\nexport type StreamPair = {\n readable: globalThis.ReadableStream<Uint8Array>;\n writable: globalThis.WritableStream<Uint8Array>;\n};\n\nexport type BidirectionalStreamPair = {\n client: StreamPair;\n agent: StreamPair;\n};\n\nfunction pushableToReadableStream(\n pushable: Pushable<Uint8Array>,\n): globalThis.ReadableStream<Uint8Array> {\n const iterator = pushable[Symbol.asyncIterator]();\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n const { value, done } = await iterator.next();\n if (done) {\n controller.close();\n } else {\n controller.enqueue(value);\n }\n },\n }) as unknown as globalThis.ReadableStream<Uint8Array>;\n}\n\nexport function createBidirectionalStreams(): BidirectionalStreamPair {\n const clientToAgentPushable = new Pushable<Uint8Array>();\n const agentToClientPushable = new Pushable<Uint8Array>();\n\n const clientToAgentReadable = pushableToReadableStream(clientToAgentPushable);\n const agentToClientReadable = pushableToReadableStream(agentToClientPushable);\n\n const clientToAgentWritable = new WritableStream<Uint8Array>({\n write(chunk) {\n clientToAgentPushable.push(chunk);\n },\n close() {\n clientToAgentPushable.end();\n },\n }) as globalThis.WritableStream<Uint8Array>;\n\n const agentToClientWritable = new WritableStream<Uint8Array>({\n write(chunk) {\n agentToClientPushable.push(chunk);\n },\n close() {\n agentToClientPushable.end();\n },\n }) as globalThis.WritableStream<Uint8Array>;\n\n return {\n client: {\n readable: agentToClientReadable,\n writable: clientToAgentWritable,\n },\n agent: {\n readable: clientToAgentReadable,\n writable: agentToClientWritable,\n },\n };\n}\n\ntype MessageCallback = (line: string) => void;\n\nexport interface TappedStreamOptions {\n onMessage: MessageCallback;\n logger?: Logger;\n}\n\nexport function createTappedWritableStream(\n underlying: WritableStream<Uint8Array>,\n options: TappedStreamOptions,\n): WritableStream<Uint8Array> {\n const { onMessage, logger } = options;\n const decoder = new TextDecoder();\n let buffer = \"\";\n let _messageCount = 0;\n\n return new WritableStream({\n async write(chunk: Uint8Array) {\n buffer += decoder.decode(chunk, { stream: true });\n\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (!line.trim()) continue;\n _messageCount++;\n\n onMessage(line);\n }\n\n try {\n const writer = underlying.getWriter();\n await writer.write(chunk);\n writer.releaseLock();\n } catch (err) {\n // Stream may be closed if subprocess crashed - log but don't throw\n logger?.error(\"ACP write error\", err);\n }\n },\n async close() {\n try {\n const writer = underlying.getWriter();\n await writer.close();\n writer.releaseLock();\n } catch {\n // Stream may already be closed\n }\n },\n async abort(reason: unknown) {\n logger?.warn(\"Tapped stream aborted\", { reason });\n try {\n const writer = underlying.getWriter();\n await writer.abort(reason);\n writer.releaseLock();\n } catch {\n // Stream may already be closed\n }\n },\n });\n}\n\nexport function nodeReadableToWebReadable(\n nodeStream: Readable,\n): globalThis.ReadableStream<Uint8Array> {\n return new ReadableStream<Uint8Array>({\n start(controller) {\n nodeStream.on(\"data\", (chunk: Buffer) => {\n controller.enqueue(new Uint8Array(chunk));\n });\n nodeStream.on(\"end\", () => {\n controller.close();\n });\n nodeStream.on(\"error\", (err) => {\n controller.error(err);\n });\n },\n cancel() {\n nodeStream.destroy();\n },\n }) as unknown as globalThis.ReadableStream<Uint8Array>;\n}\n\nexport function nodeWritableToWebWritable(\n nodeStream: Writable,\n): globalThis.WritableStream<Uint8Array> {\n return new WritableStream<Uint8Array>({\n write(chunk) {\n return new Promise((resolve, reject) => {\n const ok = nodeStream.write(Buffer.from(chunk), (err) => {\n if (err) reject(err);\n });\n if (ok) {\n resolve();\n } else {\n nodeStream.once(\"drain\", resolve);\n }\n });\n },\n close() {\n return new Promise((resolve) => {\n nodeStream.end(resolve);\n });\n },\n abort(reason) {\n nodeStream.destroy(\n reason instanceof Error ? reason : new Error(String(reason)),\n );\n },\n }) as globalThis.WritableStream<Uint8Array>;\n}\n","import { randomUUID } from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport {\n type ModelInfo as AcpModelInfo,\n type AgentSideConnection,\n type ClientCapabilities,\n type ForkSessionRequest,\n type ForkSessionResponse,\n type InitializeRequest,\n type InitializeResponse,\n type ListSessionsRequest,\n type ListSessionsResponse,\n type LoadSessionRequest,\n type LoadSessionResponse,\n type NewSessionRequest,\n type NewSessionResponse,\n type PromptRequest,\n type PromptResponse,\n RequestError,\n type ResumeSessionRequest,\n type ResumeSessionResponse,\n type SessionConfigOption,\n type SessionConfigOptionCategory,\n type SessionConfigSelectOption,\n type SessionModelState,\n type SessionModeState,\n type SetSessionConfigOptionRequest,\n type SetSessionConfigOptionResponse,\n type SetSessionModelRequest,\n type SetSessionModelResponse,\n type SetSessionModeRequest,\n type SetSessionModeResponse,\n type Usage,\n} from \"@agentclientprotocol/sdk\";\nimport {\n type CanUseTool,\n getSessionMessages,\n listSessions,\n type McpServerConfig,\n type Options,\n type Query,\n query,\n type SDKUserMessage,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport { v7 as uuidv7 } from \"uuid\";\nimport packageJson from \"../../../package.json\" with { type: \"json\" };\nimport {\n isMethod,\n POSTHOG_METHODS,\n POSTHOG_NOTIFICATIONS,\n} from \"../../acp-extensions\";\nimport {\n createEnrichment,\n type Enrichment,\n type FileEnrichmentDeps,\n} from \"../../enrichment/file-enricher\";\nimport type { PostHogAPIConfig } from \"../../types\";\nimport { unreachable, withTimeout } from \"../../utils/common\";\nimport { Logger } from \"../../utils/logger\";\nimport { Pushable } from \"../../utils/streams\";\nimport { BaseAcpAgent } from \"../base-acp-agent\";\nimport { promptToClaude } from \"./conversion/acp-to-sdk\";\nimport {\n handleResultMessage,\n handleStreamEvent,\n handleSystemMessage,\n handleUserAssistantMessage,\n} from \"./conversion/sdk-to-acp\";\nimport type { EnrichedReadCache } from \"./hooks\";\nimport {\n fetchMcpToolMetadata,\n getConnectedMcpServerNames,\n} from \"./mcp/tool-metadata\";\nimport { canUseTool } from \"./permissions/permission-handlers\";\nimport { getAvailableSlashCommands } from \"./session/commands\";\nimport { parseMcpServers } from \"./session/mcp-config\";\nimport {\n DEFAULT_MODEL,\n getEffortOptions,\n resolveModelPreference,\n supports1MContext,\n supportsMcpInjection,\n toSdkModelId,\n} from \"./session/models\";\nimport {\n buildSessionOptions,\n buildSystemPrompt,\n type ProcessSpawnedInfo,\n} from \"./session/options\";\nimport { SettingsManager } from \"./session/settings\";\nimport {\n CODE_EXECUTION_MODES,\n type CodeExecutionMode,\n getAvailableModes,\n} from \"./tools\";\nimport type {\n BackgroundTerminal,\n EffortLevel,\n NewSessionMeta,\n SDKMessageFilter,\n Session,\n ToolUseCache,\n} from \"./types\";\n\nconst SESSION_VALIDATION_TIMEOUT_MS = 30_000;\nconst MAX_TITLE_LENGTH = 256;\nconst LOCAL_ONLY_COMMANDS = new Set([\"/context\", \"/heapdump\", \"/extra-usage\"]);\n\nfunction sanitizeTitle(text: string): string {\n const sanitized = text\n .replace(/[\\r\\n]+/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n if (sanitized.length <= MAX_TITLE_LENGTH) {\n return sanitized;\n }\n return `${sanitized.slice(0, MAX_TITLE_LENGTH - 1)}…`;\n}\n\nfunction shouldEmitRawMessage(\n config: boolean | SDKMessageFilter[],\n message: { type: string; subtype?: string },\n): boolean {\n if (config === true) return true;\n if (config === false) return false;\n return config.some(\n (f) =>\n f.type === message.type &&\n (f.subtype === undefined || f.subtype === message.subtype),\n );\n}\n\nexport interface ClaudeAcpAgentOptions {\n onProcessSpawned?: (info: ProcessSpawnedInfo) => void;\n onProcessExited?: (pid: number) => void;\n onMcpServersReady?: (serverNames: string[]) => void;\n onStructuredOutput?: (output: Record<string, unknown>) => Promise<void>;\n posthogApiConfig?: PostHogAPIConfig;\n}\n\nexport class ClaudeAcpAgent extends BaseAcpAgent {\n readonly adapterName = \"claude\";\n declare session: Session;\n toolUseCache: ToolUseCache;\n backgroundTerminals: { [key: string]: BackgroundTerminal } = {};\n clientCapabilities?: ClientCapabilities;\n private options?: ClaudeAcpAgentOptions;\n private enrichment?: Enrichment;\n private enrichedReadCache: EnrichedReadCache = new Map();\n\n constructor(client: AgentSideConnection, options?: ClaudeAcpAgentOptions) {\n super(client);\n this.options = options;\n this.toolUseCache = {};\n this.logger = new Logger({ debug: true, prefix: \"[ClaudeAcpAgent]\" });\n this.enrichment = createEnrichment(options?.posthogApiConfig, this.logger);\n }\n\n protected getEnrichmentDeps(): FileEnrichmentDeps | undefined {\n return this.enrichment?.deps;\n }\n\n override async closeSession(): Promise<void> {\n try {\n await super.closeSession();\n } finally {\n this.enrichment?.dispose();\n this.enrichment = undefined;\n this.enrichedReadCache.clear();\n }\n }\n\n async initialize(request: InitializeRequest): Promise<InitializeResponse> {\n this.clientCapabilities = request.clientCapabilities;\n\n return {\n protocolVersion: 1,\n agentCapabilities: {\n promptCapabilities: {\n image: true,\n embeddedContext: true,\n },\n mcpCapabilities: {\n http: true,\n sse: true,\n },\n loadSession: true,\n sessionCapabilities: {\n list: {},\n fork: {},\n resume: {},\n },\n _meta: {\n posthog: {\n resumeSession: true,\n },\n claudeCode: {\n promptQueueing: true,\n },\n },\n },\n agentInfo: {\n name: packageJson.name,\n title: \"Claude Agent\",\n version: packageJson.version,\n },\n authMethods: [],\n };\n }\n\n async newSession(params: NewSessionRequest): Promise<NewSessionResponse> {\n // Upstream Claude Code renames .claude.json to .claude.json.backup on logout.\n // If the backup exists but the original doesn't, the user is logged out.\n if (\n fs.existsSync(path.resolve(os.homedir(), \".claude.json.backup\")) &&\n !fs.existsSync(path.resolve(os.homedir(), \".claude.json\"))\n ) {\n throw RequestError.authRequired();\n }\n\n const response = await this.createSession(params, {\n // Revisit these meta values once we support resume\n resume: (params._meta as NewSessionMeta | undefined)?.claudeCode?.options\n ?.resume as string | undefined,\n });\n\n return response;\n }\n\n async unstable_forkSession(\n params: ForkSessionRequest,\n ): Promise<ForkSessionResponse> {\n return this.createSession(\n {\n cwd: params.cwd,\n mcpServers: params.mcpServers ?? [],\n _meta: params._meta,\n },\n { resume: params.sessionId, forkSession: true },\n );\n }\n\n async unstable_resumeSession(\n params: ResumeSessionRequest,\n ): Promise<ResumeSessionResponse> {\n // Reuse existing session if it matches\n const existing = this.getExistingSessionState(params.sessionId);\n if (existing) return existing;\n\n const response = await this.createSession(\n {\n cwd: params.cwd,\n mcpServers: params.mcpServers ?? [],\n _meta: params._meta,\n },\n {\n resume: params.sessionId,\n },\n );\n\n return response;\n }\n\n async loadSession(params: LoadSessionRequest): Promise<LoadSessionResponse> {\n // Reuse existing session if it matches\n const existing = this.getExistingSessionState(params.sessionId);\n if (existing) return existing;\n\n const response = await this.createSession(\n {\n cwd: params.cwd,\n mcpServers: params.mcpServers ?? [],\n _meta: params._meta,\n },\n { resume: params.sessionId, skipBackgroundFetches: true },\n );\n\n await this.replaySessionHistory(params.sessionId);\n\n // Send available commands after replay so they don't interleave with history\n this.deferBackgroundFetches(this.session.query);\n\n return {\n modes: response.modes,\n models: response.models,\n configOptions: response.configOptions,\n };\n }\n\n async listSessions(\n params: ListSessionsRequest,\n ): Promise<ListSessionsResponse> {\n const sdkSessions = await listSessions({ dir: params.cwd ?? undefined });\n const sessions = [];\n\n for (const session of sdkSessions) {\n if (!session.cwd) continue;\n sessions.push({\n sessionId: session.sessionId,\n cwd: session.cwd,\n title: sanitizeTitle(session.customTitle || session.summary || \"\"),\n updatedAt: new Date(session.lastModified).toISOString(),\n });\n }\n return {\n sessions,\n };\n }\n\n async unstable_listSessions(\n params: ListSessionsRequest,\n ): Promise<ListSessionsResponse> {\n return this.listSessions(params);\n }\n\n async prompt(params: PromptRequest): Promise<PromptResponse> {\n this.session.cancelled = false;\n this.session.interruptReason = undefined;\n this.session.accumulatedUsage = {\n inputTokens: 0,\n outputTokens: 0,\n cachedReadTokens: 0,\n cachedWriteTokens: 0,\n };\n\n const userMessage = promptToClaude(params);\n const promptUuid = randomUUID();\n userMessage.uuid = promptUuid;\n let promptReplayed = false;\n let isLocalOnlyCommand = false;\n\n // Detect local-only slash commands that return results without model invocation\n const msgContent = userMessage.message.content;\n let firstTextPart = \"\";\n if (typeof msgContent === \"string\") {\n firstTextPart = msgContent;\n } else if (Array.isArray(msgContent)) {\n for (const block of msgContent) {\n if (\"type\" in block && block.type === \"text\" && \"text\" in block) {\n firstTextPart = block.text as string;\n break;\n }\n }\n }\n const commandMatch = firstTextPart.match(/^(\\/\\S+)/);\n if (commandMatch && LOCAL_ONLY_COMMANDS.has(commandMatch[1])) {\n isLocalOnlyCommand = true;\n promptReplayed = true;\n }\n\n if (this.session.promptRunning) {\n this.session.input.push(userMessage);\n const order = this.session.nextPendingOrder++;\n const cancelled = await new Promise<boolean>((resolve) => {\n this.session.pendingMessages.set(promptUuid, { resolve, order });\n });\n if (cancelled) {\n return { stopReason: \"cancelled\" };\n }\n promptReplayed = true;\n } else {\n this.session.input.push(userMessage);\n }\n\n // Broadcast user message to client\n await this.broadcastUserMessage(params);\n\n this.session.promptRunning = true;\n let handedOff = false;\n let lastAssistantTotalUsage: number | null = null;\n let lastStreamUsage = {\n input_tokens: 0,\n output_tokens: 0,\n cache_read_input_tokens: 0,\n cache_creation_input_tokens: 0,\n };\n if (this.session.lastContextWindowSize == null) {\n this.session.lastContextWindowSize = this.getContextWindowForModel(\n this.session.modelId ?? \"\",\n );\n this.logger.debug(\"Initial context window size from gateway\", {\n modelId: this.session.modelId,\n contextWindowSize: this.session.lastContextWindowSize,\n });\n }\n let lastContextWindowSize = this.session.lastContextWindowSize;\n\n const supportsTerminalOutput =\n (\n this.clientCapabilities?._meta as\n | ClientCapabilities[\"_meta\"]\n | undefined\n )?.terminal_output === true;\n\n const context = {\n session: this.session,\n sessionId: params.sessionId,\n client: this.client,\n toolUseCache: this.toolUseCache,\n fileContentCache: this.fileContentCache,\n enrichedReadCache: this.enrichedReadCache,\n logger: this.logger,\n supportsTerminalOutput,\n };\n\n try {\n while (true) {\n const { value: message, done } = await this.session.query.next();\n\n if (done || !message) {\n if (this.session.cancelled) {\n return {\n stopReason: \"cancelled\",\n _meta: this.session.interruptReason\n ? { interruptReason: this.session.interruptReason }\n : undefined,\n };\n }\n break;\n }\n\n if (\n this.session.emitRawSDKMessages &&\n shouldEmitRawMessage(this.session.emitRawSDKMessages, message)\n ) {\n await this.client.extNotification(\"_claude/sdkMessage\", {\n sessionId: params.sessionId,\n message: message as Record<string, unknown>,\n });\n }\n\n switch (message.type) {\n case \"system\":\n if (message.subtype === \"compact_boundary\") {\n // Send used:0 immediately so the client doesn't keep showing\n // the stale pre-compaction context size until the next turn.\n lastAssistantTotalUsage = 0;\n promptReplayed = true;\n await this.client.sessionUpdate({\n sessionId: params.sessionId,\n update: {\n sessionUpdate: \"usage_update\",\n used: 0,\n size: lastContextWindowSize,\n },\n });\n }\n if (message.subtype === \"local_command_output\") {\n promptReplayed = true;\n }\n if (\n message.subtype === \"session_state_changed\" &&\n (message as Record<string, unknown>).state === \"idle\"\n ) {\n if (!promptReplayed) {\n this.logger.debug(\"Skipping idle state before prompt replay\", {\n sessionId: params.sessionId,\n });\n break;\n }\n\n const acc = this.session.accumulatedUsage;\n const totalUsed =\n acc.inputTokens +\n acc.outputTokens +\n acc.cachedReadTokens +\n acc.cachedWriteTokens;\n\n await this.client.sessionUpdate({\n sessionId: params.sessionId,\n update: {\n sessionUpdate: \"usage_update\",\n used: totalUsed,\n size: lastContextWindowSize,\n },\n });\n\n return { stopReason: \"end_turn\" };\n }\n await handleSystemMessage(message, context);\n break;\n\n case \"result\": {\n // Skip results from background tasks that finished after our prompt started\n if (!promptReplayed) {\n this.logger.debug(\n \"Skipping background task result before prompt replay\",\n { sessionId: params.sessionId },\n );\n break;\n }\n\n if (this.session.cancelled) {\n return { stopReason: \"cancelled\" };\n }\n\n // Accumulate usage from this result (guard against null from SDK)\n this.session.accumulatedUsage.inputTokens +=\n message.usage.input_tokens ?? 0;\n this.session.accumulatedUsage.outputTokens +=\n message.usage.output_tokens ?? 0;\n this.session.accumulatedUsage.cachedReadTokens +=\n message.usage.cache_read_input_tokens ?? 0;\n this.session.accumulatedUsage.cachedWriteTokens +=\n message.usage.cache_creation_input_tokens ?? 0;\n\n // SDK can underreport context window (e.g. 200k for 1M models).\n // Use SDK value only if it's larger than what gateway reported.\n const contextWindows = Object.values(message.modelUsage).map(\n (m) => m.contextWindow,\n );\n if (contextWindows.length > 0) {\n const sdkContextWindow = Math.min(...contextWindows);\n if (sdkContextWindow > lastContextWindowSize) {\n lastContextWindowSize = sdkContextWindow;\n }\n }\n this.session.lastContextWindowSize = lastContextWindowSize;\n\n this.session.contextSize = lastContextWindowSize;\n if (lastAssistantTotalUsage !== null) {\n this.session.contextUsed = lastAssistantTotalUsage;\n }\n\n // Send usage_update notification\n if (lastAssistantTotalUsage !== null) {\n await this.client.sessionUpdate({\n sessionId: params.sessionId,\n update: {\n sessionUpdate: \"usage_update\",\n used: lastAssistantTotalUsage,\n size: lastContextWindowSize,\n cost: {\n amount: message.total_cost_usd,\n currency: \"USD\",\n },\n },\n });\n }\n\n await this.client.extNotification(\n POSTHOG_NOTIFICATIONS.USAGE_UPDATE,\n {\n sessionId: params.sessionId,\n used: {\n inputTokens: message.usage.input_tokens,\n outputTokens: message.usage.output_tokens,\n cachedReadTokens: message.usage.cache_read_input_tokens,\n cachedWriteTokens: message.usage.cache_creation_input_tokens,\n },\n cost: message.total_cost_usd,\n },\n );\n\n const usage: Usage = {\n inputTokens: this.session.accumulatedUsage.inputTokens,\n outputTokens: this.session.accumulatedUsage.outputTokens,\n cachedReadTokens: this.session.accumulatedUsage.cachedReadTokens,\n cachedWriteTokens:\n this.session.accumulatedUsage.cachedWriteTokens,\n totalTokens:\n this.session.accumulatedUsage.inputTokens +\n this.session.accumulatedUsage.outputTokens +\n this.session.accumulatedUsage.cachedReadTokens +\n this.session.accumulatedUsage.cachedWriteTokens,\n };\n\n const result = handleResultMessage(message);\n if (result.error) throw result.error;\n\n // Deliver structured output from SDK's native outputFormat\n if (\n message.subtype === \"success\" &&\n message.structured_output != null &&\n this.options?.onStructuredOutput\n ) {\n await this.options.onStructuredOutput(\n message.structured_output as Record<string, unknown>,\n );\n }\n\n // For local-only commands, forward the result text to the client\n if (\n isLocalOnlyCommand &&\n message.subtype === \"success\" &&\n message.result\n ) {\n await this.client.sessionUpdate({\n sessionId: params.sessionId,\n update: {\n sessionUpdate: \"agent_message_chunk\",\n content: { type: \"text\", text: message.result },\n },\n });\n }\n\n return { stopReason: result.stopReason ?? \"end_turn\", usage };\n }\n\n case \"stream_event\": {\n if (\n message.parent_tool_use_id === null &&\n (message.event.type === \"message_start\" ||\n message.event.type === \"message_delta\")\n ) {\n if (message.event.type === \"message_start\") {\n const u = message.event.message.usage;\n lastStreamUsage = {\n input_tokens: u.input_tokens ?? 0,\n output_tokens: u.output_tokens ?? 0,\n cache_read_input_tokens: u.cache_read_input_tokens ?? 0,\n cache_creation_input_tokens:\n u.cache_creation_input_tokens ?? 0,\n };\n } else {\n const u = message.event.usage;\n lastStreamUsage = {\n input_tokens: u.input_tokens ?? lastStreamUsage.input_tokens,\n output_tokens: u.output_tokens,\n cache_read_input_tokens:\n u.cache_read_input_tokens ??\n lastStreamUsage.cache_read_input_tokens,\n cache_creation_input_tokens:\n u.cache_creation_input_tokens ??\n lastStreamUsage.cache_creation_input_tokens,\n };\n }\n\n const nextTotal =\n lastStreamUsage.input_tokens +\n lastStreamUsage.output_tokens +\n lastStreamUsage.cache_read_input_tokens +\n lastStreamUsage.cache_creation_input_tokens;\n\n if (nextTotal !== lastAssistantTotalUsage) {\n lastAssistantTotalUsage = nextTotal;\n await this.client.sessionUpdate({\n sessionId: params.sessionId,\n update: {\n sessionUpdate: \"usage_update\",\n used: nextTotal,\n size: lastContextWindowSize,\n },\n });\n }\n }\n await handleStreamEvent(message, context);\n break;\n }\n\n case \"user\":\n case \"assistant\": {\n if (this.session.cancelled) {\n break;\n }\n\n // Check for prompt replay (our own message echoed back)\n if (message.type === \"user\" && \"uuid\" in message && message.uuid) {\n if (message.uuid === promptUuid) {\n promptReplayed = true;\n break;\n }\n\n const pending = this.session.pendingMessages.get(\n message.uuid as string,\n );\n if (pending) {\n pending.resolve(false);\n this.session.pendingMessages.delete(message.uuid as string);\n handedOff = true;\n // the current loop stops with end_turn,\n // the loop of the next prompt continues running\n return { stopReason: \"end_turn\" };\n }\n }\n\n // Skip replayed user messages that aren't pending prompts\n if (\n \"isReplay\" in message &&\n (message as Record<string, unknown>).isReplay\n ) {\n break;\n }\n\n // Store latest assistant usage (excluding subagents)\n // Sum all token types as a proxy for post-turn context occupancy:\n // current turn's output will become next turn's input.\n // Note: per the Anthropic API, input_tokens excludes cache tokens —\n // cache_read and cache_creation are reported separately, so summing\n // all four fields is not double-counting.\n if (\n \"usage\" in message.message &&\n message.parent_tool_use_id === null\n ) {\n const usage = (\n message.message as unknown as Record<string, unknown>\n ).usage as {\n input_tokens: number | null;\n output_tokens: number | null;\n cache_read_input_tokens: number | null;\n cache_creation_input_tokens: number | null;\n };\n lastAssistantTotalUsage =\n (usage.input_tokens ?? 0) +\n (usage.output_tokens ?? 0) +\n (usage.cache_read_input_tokens ?? 0) +\n (usage.cache_creation_input_tokens ?? 0);\n\n await this.client.sessionUpdate({\n sessionId: params.sessionId,\n update: {\n sessionUpdate: \"usage_update\",\n used: lastAssistantTotalUsage,\n size: lastContextWindowSize,\n cost: null,\n },\n });\n }\n\n const result = await handleUserAssistantMessage(message, context);\n if (result.error) throw result.error;\n if (result.shouldStop) {\n return { stopReason: \"end_turn\" };\n }\n break;\n }\n\n case \"tool_progress\":\n case \"auth_status\":\n case \"tool_use_summary\":\n case \"prompt_suggestion\":\n case \"rate_limit_event\":\n break;\n\n default:\n unreachable(message as never, this.logger);\n break;\n }\n }\n throw new Error(\"Session did not end in result\");\n } catch (error) {\n if (error instanceof RequestError || !(error instanceof Error)) {\n throw error;\n }\n const msg = error.message;\n if (\n msg.includes(\"ProcessTransport\") ||\n msg.includes(\"terminated process\") ||\n msg.includes(\"process exited with\") ||\n msg.includes(\"process terminated by signal\") ||\n msg.includes(\"Failed to write to process stdin\")\n ) {\n this.logger.error(`Process died: ${msg}`, {\n sessionId: this.sessionId,\n });\n this.session.settingsManager.dispose();\n this.session.input.end();\n throw RequestError.internalError(\n undefined,\n \"The Claude Agent process exited unexpectedly. Please start a new session.\",\n );\n }\n throw error;\n } finally {\n if (!handedOff) {\n this.session.promptRunning = false;\n // Resolve all remaining pending prompts so no callers get stuck.\n for (const [key, pending] of this.session.pendingMessages) {\n pending.resolve(true);\n this.session.pendingMessages.delete(key);\n }\n }\n }\n }\n\n // Called by BaseAcpAgent#cancel() to interrupt the session\n protected async interrupt(): Promise<void> {\n this.session.cancelled = true;\n for (const [, pending] of this.session.pendingMessages) {\n pending.resolve(true);\n }\n this.session.pendingMessages.clear();\n await this.session.query.interrupt();\n }\n\n /**\n * Refresh the session between turns. Currently the only refreshable field\n * is `mcpServers` — a resume-with-new-options reinit that bakes the servers\n * into query() options (preserving conversation history via resume).\n *\n * This is an `extMethod` (request/response), not `extNotification`, so the\n * caller can await completion before sending the next prompt. The sandbox\n * agent-server uses this on pre-prompt TTL checks.\n *\n * Why resume+rebuild instead of query.setMcpServers()?\n * setMcpServers() does NOT always overwrite servers installed by local/plugin\n * config — it can non-deterministically surface either the config-provided\n * server or the plugin-installed one. In the sandbox, repos may have Claude\n * plugins with their own MCPs, and we want the CLI-supplied set to fully win.\n * Passing mcpServers via query() options (as a \"managed\"/static set) has that\n * overwrite guarantee, so we tear down the current Query and construct a new\n * one with resume.\n *\n * Caller contract: only call REFRESH_SESSION between turns (no prompt in flight).\n */\n async extMethod(\n method: string,\n params: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n if (!isMethod(method, POSTHOG_METHODS.REFRESH_SESSION)) {\n throw RequestError.methodNotFound(method);\n }\n\n // Trust boundary: refresh is only safe when the caller is trusted infra\n // (e.g. the sandbox agent-server). Do not route this method from\n // untrusted clients — parseMcpServers does no URL/command validation.\n if (params.mcpServers === undefined) {\n throw new RequestError(\n -32602,\n \"refresh_session requires at least one refreshable field (e.g. mcpServers)\",\n );\n }\n if (!Array.isArray(params.mcpServers)) {\n throw new RequestError(\n -32602,\n \"refresh_session: mcpServers must be an array\",\n );\n }\n\n const mcpServers = parseMcpServers(\n params as Pick<NewSessionRequest, \"mcpServers\">,\n );\n await this.refreshSession(mcpServers);\n return { refreshed: true };\n }\n\n private async refreshSession(\n mcpServers: Record<string, McpServerConfig>,\n ): Promise<void> {\n const prev = this.session;\n if (prev.promptRunning) {\n throw new RequestError(\n -32002,\n \"Cannot refresh session while a prompt turn is in flight\",\n );\n }\n if (prev.modelId && !supportsMcpInjection(prev.modelId)) {\n throw new RequestError(\n -32002,\n `Model ${prev.modelId} does not support MCP injection; cannot refresh`,\n );\n }\n\n this.logger.info(\"Refreshing session with fresh MCP servers\", {\n serverCount: Object.keys(mcpServers).length,\n sessionId: this.sessionId,\n });\n\n // Abort FIRST so any stuck in-flight HTTP request unblocks — otherwise\n // interrupt() can deadlock waiting on an API call that never returns.\n // We allocate a fresh controller for the new Query below so aborting\n // the old one doesn't poison it.\n prev.abortController.abort();\n await prev.query.interrupt();\n prev.input.end();\n\n // Reuse every option from the running session; swap mcpServers, re-root\n // identity on `resume` instead of `sessionId`, and give the new Query a\n // fresh AbortController.\n const newAbortController = new AbortController();\n const { sessionId: _drop, ...rest } = prev.queryOptions;\n const newOptions: Options = {\n ...rest,\n mcpServers,\n resume: this.sessionId,\n forkSession: false,\n abortController: newAbortController,\n };\n\n const newInput = new Pushable<SDKUserMessage>();\n const newQuery = query({ prompt: newInput, options: newOptions });\n\n prev.query = newQuery;\n prev.input = newInput;\n prev.queryOptions = newOptions;\n prev.abortController = newAbortController;\n\n const result = await withTimeout(\n newQuery.initializationResult(),\n SESSION_VALIDATION_TIMEOUT_MS,\n );\n if (result.result === \"timeout\") {\n throw new Error(`Session refresh timed out for ${this.sessionId}`);\n }\n\n // Re-fetch MCP tool metadata + slash commands — the server list changed.\n this.deferBackgroundFetches(newQuery);\n }\n\n async unstable_setSessionModel(\n params: SetSessionModelRequest,\n ): Promise<SetSessionModelResponse | undefined> {\n await this.session.query.setModel(toSdkModelId(params.modelId));\n this.session.modelId = params.modelId;\n this.session.lastContextWindowSize = this.getContextWindowForModel(\n params.modelId,\n );\n this.rebuildEffortConfigOption(params.modelId);\n await this.updateConfigOption(\"model\", params.modelId);\n return {};\n }\n\n async setSessionMode(\n params: SetSessionModeRequest,\n ): Promise<SetSessionModeResponse> {\n await this.applySessionMode(params.modeId);\n await this.updateConfigOption(\"mode\", params.modeId);\n return {};\n }\n\n async setSessionConfigOption(\n params: SetSessionConfigOptionRequest,\n ): Promise<SetSessionConfigOptionResponse> {\n const option = this.session.configOptions.find(\n (o) => o.id === params.configId,\n );\n if (!option) {\n throw new Error(`Unknown config option: ${params.configId}`);\n }\n\n if (typeof params.value !== \"string\") {\n throw new Error(\n `Invalid value type for config option ${params.configId}`,\n );\n }\n\n const allValues: { value: string; name?: string; description?: string }[] =\n \"options\" in option && Array.isArray(option.options)\n ? (option.options as Array<Record<string, unknown>>).flatMap((o) =>\n \"options\" in o && Array.isArray(o.options)\n ? (o.options as {\n value: string;\n name?: string;\n description?: string;\n }[])\n : [o as { value: string; name?: string; description?: string }],\n )\n : [];\n let validValue = allValues.find((o) => o.value === params.value);\n\n // For model options, fall back to alias resolution when exact match fails.\n // This lets callers use human-friendly aliases like \"opus\" or \"sonnet\"\n // instead of full model IDs like \"claude-opus-4-6\".\n if (!validValue && params.configId === \"model\") {\n const resolved = resolveModelPreference(params.value, allValues);\n if (resolved) {\n validValue = allValues.find((o) => o.value === resolved);\n }\n }\n\n if (!validValue) {\n throw new Error(\n `Invalid value for config option ${params.configId}: ${params.value}`,\n );\n }\n\n // Use the canonical option value so downstream code always receives the\n // model ID rather than the caller-supplied alias.\n const resolvedValue = validValue.value;\n\n if (params.configId === \"mode\") {\n await this.applySessionMode(resolvedValue);\n await this.client.sessionUpdate({\n sessionId: this.sessionId,\n update: {\n sessionUpdate: \"current_mode_update\",\n currentModeId: resolvedValue,\n },\n });\n } else if (params.configId === \"model\") {\n const sdkModelId = toSdkModelId(resolvedValue);\n await this.session.query.setModel(sdkModelId);\n this.session.modelId = resolvedValue;\n this.session.lastContextWindowSize =\n this.getContextWindowForModel(resolvedValue);\n this.rebuildEffortConfigOption(resolvedValue);\n } else if (params.configId === \"effort\") {\n const newEffort = resolvedValue as EffortLevel;\n this.session.effort = newEffort;\n this.session.queryOptions.effort = newEffort;\n await this.session.query.applyFlagSettings({\n // @ts-expect-error SDK Settings.effortLevel omits \"max\" but runtime accepts it\n effortLevel: newEffort,\n });\n }\n\n this.session.configOptions = this.session.configOptions.map((o) =>\n o.id === params.configId && typeof o.currentValue === \"string\"\n ? { ...o, currentValue: resolvedValue }\n : o,\n );\n\n return { configOptions: this.session.configOptions };\n }\n\n private async updateConfigOption(\n configId: string,\n value: string,\n ): Promise<void> {\n this.session.configOptions = this.session.configOptions.map((o) =>\n o.id === configId && typeof o.currentValue === \"string\"\n ? { ...o, currentValue: value }\n : o,\n );\n\n await this.client.sessionUpdate({\n sessionId: this.sessionId,\n update: {\n sessionUpdate: \"config_option_update\",\n configOptions: this.session.configOptions,\n },\n });\n }\n\n private async applySessionMode(modeId: string): Promise<void> {\n if (!CODE_EXECUTION_MODES.includes(modeId as CodeExecutionMode)) {\n throw new Error(\"Invalid Mode\");\n }\n const previousMode = this.session.permissionMode;\n this.session.permissionMode = modeId as CodeExecutionMode;\n try {\n await this.session.query.setPermissionMode(modeId as CodeExecutionMode);\n } catch (error) {\n this.session.permissionMode = previousMode;\n if (error instanceof Error) {\n if (!error.message) {\n error.message = \"Invalid Mode\";\n }\n throw error;\n }\n throw new Error(\"Invalid Mode\");\n }\n }\n\n private async createSession(\n params: {\n cwd: string;\n mcpServers: NewSessionRequest[\"mcpServers\"];\n _meta?: unknown;\n },\n creationOpts: {\n resume?: string;\n forkSession?: boolean;\n skipBackgroundFetches?: boolean;\n } = {},\n ): Promise<NewSessionResponse> {\n const { cwd } = params;\n const { resume, forkSession } = creationOpts;\n\n const isResume = !!resume;\n\n const meta = params._meta as NewSessionMeta | undefined;\n const taskId = meta?.persistence?.taskId;\n const effort = meta?.claudeCode?.options?.effort as EffortLevel | undefined;\n\n // We want to create a new session id unless it is resume,\n // but not resume + forkSession.\n let sessionId: string;\n if (forkSession) {\n sessionId = uuidv7();\n } else if (isResume) {\n sessionId = resume;\n } else {\n sessionId = uuidv7();\n }\n\n const input = new Pushable<SDKUserMessage>();\n\n const settingsManager = new SettingsManager(cwd);\n await settingsManager.initialize();\n\n const earlyModelId =\n settingsManager.getSettings().model || meta?.model || \"\";\n const mcpServers = supportsMcpInjection(earlyModelId)\n ? parseMcpServers(params)\n : {};\n const systemPrompt = buildSystemPrompt(meta?.systemPrompt);\n\n // Configure structured output via SDK's native outputFormat\n const outputFormat =\n meta?.jsonSchema && this.options?.onStructuredOutput\n ? { type: \"json_schema\" as const, schema: meta.jsonSchema }\n : undefined;\n\n this.logger.debug(isResume ? \"Resuming session\" : \"Creating new session\", {\n sessionId,\n taskId,\n taskRunId: meta?.taskRunId,\n cwd,\n });\n\n const permissionMode: CodeExecutionMode =\n meta?.permissionMode &&\n CODE_EXECUTION_MODES.includes(meta.permissionMode as CodeExecutionMode)\n ? (meta.permissionMode as CodeExecutionMode)\n : \"default\";\n\n const options = buildSessionOptions({\n cwd,\n mcpServers,\n permissionMode,\n canUseTool: this.createCanUseTool(sessionId, meta?.allowedDomains),\n logger: this.logger,\n systemPrompt,\n userProvidedOptions: meta?.claudeCode?.options,\n sessionId,\n isResume,\n forkSession,\n additionalDirectories: [\n ...(meta?.claudeCode?.options?.additionalDirectories ?? []),\n ...(meta?.additionalRoots ?? []),\n ],\n disableBuiltInTools: meta?.disableBuiltInTools,\n outputFormat,\n settingsManager,\n onModeChange: this.createOnModeChange(),\n onProcessSpawned: this.options?.onProcessSpawned,\n onProcessExited: this.options?.onProcessExited,\n effort,\n enrichmentDeps: this.enrichment?.deps,\n enrichedReadCache: this.enrichedReadCache,\n });\n\n // Use the same abort controller that buildSessionOptions gave to the query\n const abortController = options.abortController as AbortController;\n\n const q = query({ prompt: input, options });\n\n const session: Session = {\n query: q,\n queryOptions: options,\n input,\n cancelled: false,\n settingsManager,\n permissionMode,\n abortController,\n accumulatedUsage: {\n inputTokens: 0,\n outputTokens: 0,\n cachedReadTokens: 0,\n cachedWriteTokens: 0,\n },\n effort,\n configOptions: [],\n promptRunning: false,\n pendingMessages: new Map(),\n nextPendingOrder: 0,\n emitRawSDKMessages: meta?.claudeCode?.emitRawSDKMessages ?? false,\n\n // Custom properties\n cwd,\n notificationHistory: [],\n taskRunId: meta?.taskRunId,\n };\n this.session = session;\n this.sessionId = sessionId;\n\n if (isResume) {\n // Resume must block on initialization to validate the session is still alive.\n // For stale sessions this throws (e.g. \"No conversation found\").\n try {\n const result = await withTimeout(\n q.initializationResult(),\n SESSION_VALIDATION_TIMEOUT_MS,\n );\n if (result.result === \"timeout\") {\n throw new Error(\n `Session ${forkSession ? \"fork\" : \"resumption\"} timed out for sessionId=${sessionId}`,\n );\n }\n } catch (err) {\n settingsManager.dispose();\n if (\n err instanceof Error &&\n err.message === \"Query closed before response received\"\n ) {\n throw RequestError.resourceNotFound(sessionId);\n }\n this.logger.error(\n forkSession ? \"Session fork failed\" : \"Session resumption failed\",\n {\n sessionId,\n taskId,\n taskRunId: meta?.taskRunId,\n error: err instanceof Error ? err.message : String(err),\n },\n );\n throw err;\n }\n }\n\n // Kick off SDK initialization for new sessions so it runs concurrently\n // with the model config fetch below (the gateway REST call is independent).\n const initPromise = !isResume\n ? withTimeout(q.initializationResult(), SESSION_VALIDATION_TIMEOUT_MS)\n : undefined;\n\n const [modelOptions] = await Promise.all([\n this.getModelConfigOptions(\n settingsManager.getSettings().model || meta?.model || undefined,\n ),\n ...(meta?.taskRunId\n ? [\n this.client.extNotification(POSTHOG_NOTIFICATIONS.SDK_SESSION, {\n taskRunId: meta.taskRunId,\n sessionId,\n adapter: \"claude\",\n }),\n ]\n : []),\n ]);\n\n if (initPromise) {\n try {\n const initResult = await initPromise;\n if (initResult.result === \"timeout\") {\n settingsManager.dispose();\n throw new Error(\n `Session initialization timed out for sessionId=${sessionId}`,\n );\n }\n } catch (err) {\n settingsManager.dispose();\n this.logger.error(\"Session initialization failed\", {\n sessionId,\n taskId,\n taskRunId: meta?.taskRunId,\n error: err instanceof Error ? err.message : String(err),\n });\n throw err;\n }\n }\n\n const settingsModel = settingsManager.getSettings().model;\n const metaModel = meta?.model;\n const resolvedModelId =\n settingsModel || metaModel || modelOptions.currentModelId;\n session.modelId = resolvedModelId;\n session.lastContextWindowSize =\n this.getContextWindowForModel(resolvedModelId);\n\n const resolvedSdkModel = toSdkModelId(resolvedModelId);\n\n if (!isResume && resolvedSdkModel !== DEFAULT_MODEL) {\n await this.session.query.setModel(resolvedSdkModel);\n }\n\n if (supports1MContext(resolvedModelId)) {\n options.betas = [\"context-1m-2025-08-07\"];\n }\n\n const availableModes = getAvailableModes();\n const modes: SessionModeState = {\n currentModeId: permissionMode,\n availableModes: availableModes.map((mode) => ({\n id: mode.id,\n name: mode.name,\n description: mode.description ?? undefined,\n })),\n };\n\n const models: SessionModelState = {\n currentModelId: resolvedModelId,\n availableModels: modelOptions.options.map(\n (opt): AcpModelInfo => ({\n modelId: opt.value,\n name: opt.name,\n description: opt.description,\n }),\n ),\n };\n\n const configOptions = this.buildConfigOptions(\n permissionMode,\n modelOptions,\n effort ?? \"high\",\n );\n session.configOptions = configOptions;\n\n if (!creationOpts.skipBackgroundFetches) {\n this.deferBackgroundFetches(q);\n }\n\n return { sessionId, modes, models, configOptions };\n }\n\n private createCanUseTool(\n sessionId: string,\n allowedDomains?: string[],\n ): CanUseTool {\n return async (toolName, toolInput, { suggestions, toolUseID, signal }) =>\n canUseTool({\n session: this.session,\n toolName,\n toolInput: toolInput as Record<string, unknown>,\n toolUseID,\n suggestions,\n signal,\n client: this.client,\n sessionId,\n fileContentCache: this.fileContentCache,\n logger: this.logger,\n updateConfigOption: (configId: string, value: string) =>\n this.updateConfigOption(configId, value),\n allowedDomains,\n });\n }\n\n private createOnModeChange() {\n return async (newMode: CodeExecutionMode) => {\n if (this.session) {\n this.session.permissionMode = newMode;\n }\n await this.updateConfigOption(\"mode\", newMode);\n };\n }\n\n private getExistingSessionState(\n sessionId: string,\n ): NewSessionResponse | null {\n if (this.sessionId !== sessionId || !this.session) return null;\n\n const availableModes = getAvailableModes();\n const modes: SessionModeState = {\n currentModeId: this.session.permissionMode,\n availableModes: availableModes.map((mode) => ({\n id: mode.id,\n name: mode.name,\n description: mode.description ?? undefined,\n })),\n };\n\n const modelOptions = this.session.configOptions.find(\n (o) => o.id === \"model\",\n );\n const models: SessionModelState = {\n currentModelId: this.session.modelId ?? DEFAULT_MODEL,\n availableModels:\n modelOptions && \"options\" in modelOptions\n ? (\n modelOptions.options as Array<{\n value: string;\n name: string;\n description?: string;\n }>\n ).map((opt) => ({\n modelId: opt.value,\n name: opt.name,\n description: opt.description,\n }))\n : [],\n };\n\n return {\n sessionId,\n modes,\n models,\n configOptions: this.session.configOptions,\n };\n }\n\n private buildConfigOptions(\n currentModeId: string,\n modelOptions: {\n currentModelId: string;\n options: SessionConfigSelectOption[];\n },\n currentEffort: EffortLevel = \"high\",\n ): SessionConfigOption[] {\n const modeOptions = getAvailableModes().map((mode) => ({\n value: mode.id,\n name: mode.name,\n description: mode.description ?? undefined,\n }));\n\n const configOptions: SessionConfigOption[] = [\n {\n id: \"mode\",\n name: \"Approval Preset\",\n type: \"select\",\n currentValue: currentModeId,\n options: modeOptions,\n category: \"mode\" as SessionConfigOptionCategory,\n description:\n \"Choose an approval and sandboxing preset for your session\",\n },\n {\n id: \"model\",\n name: \"Model\",\n type: \"select\",\n currentValue: modelOptions.currentModelId,\n options: modelOptions.options,\n category: \"model\" as SessionConfigOptionCategory,\n description: \"Choose which model Claude should use\",\n },\n ];\n\n const effortOptions = getEffortOptions(modelOptions.currentModelId);\n if (effortOptions) {\n configOptions.push({\n id: \"effort\",\n name: \"Effort\",\n type: \"select\",\n currentValue: currentEffort,\n options: effortOptions,\n category: \"thought_level\" as SessionConfigOptionCategory,\n description: \"Controls how much effort Claude puts into its response\",\n });\n }\n\n return configOptions;\n }\n\n private rebuildEffortConfigOption(modelId: string): void {\n const effortOptions = getEffortOptions(modelId);\n const existingEffort = this.session.configOptions.find(\n (o) => o.id === \"effort\",\n );\n\n if (!effortOptions) {\n this.session.configOptions = this.session.configOptions.filter(\n (o) => o.id !== \"effort\",\n );\n if (this.session.effort) {\n this.session.effort = undefined;\n this.session.queryOptions.effort = undefined;\n void this.session.query.applyFlagSettings({\n effortLevel: undefined,\n });\n }\n return;\n }\n\n const rawCurrentValue = existingEffort?.currentValue;\n const currentValue =\n typeof rawCurrentValue === \"string\" ? rawCurrentValue : \"high\";\n const isValidValue = effortOptions.some((o) => o.value === currentValue);\n const resolvedValue = isValidValue ? currentValue : \"high\";\n\n if (resolvedValue !== currentValue && this.session.effort) {\n this.session.effort = resolvedValue as EffortLevel;\n this.session.queryOptions.effort = resolvedValue as EffortLevel;\n void this.session.query.applyFlagSettings({\n // @ts-expect-error SDK Settings.effortLevel omits \"max\" but runtime accepts it\n effortLevel: resolvedValue,\n });\n }\n\n const effortConfig: SessionConfigOption = {\n id: \"effort\",\n name: \"Effort\",\n type: \"select\",\n currentValue: resolvedValue,\n options: effortOptions,\n category: \"thought_level\" as SessionConfigOptionCategory,\n description: \"Controls how much effort Claude puts into its response\",\n };\n\n if (existingEffort) {\n this.session.configOptions = this.session.configOptions.map((o) =>\n o.id === \"effort\" ? effortConfig : o,\n );\n } else {\n this.session.configOptions.push(effortConfig);\n }\n }\n\n private async sendAvailableCommandsUpdate(): Promise<void> {\n const commands = await this.session.query.supportedCommands();\n await this.client.sessionUpdate({\n sessionId: this.sessionId,\n update: {\n sessionUpdate: \"available_commands_update\",\n availableCommands: getAvailableSlashCommands(commands),\n },\n });\n }\n\n private async replaySessionHistory(sessionId: string): Promise<void> {\n try {\n const messages = await getSessionMessages(sessionId, {\n dir: this.session.cwd,\n });\n\n const replayContext = {\n session: this.session,\n sessionId,\n client: this.client,\n toolUseCache: this.toolUseCache,\n fileContentCache: this.fileContentCache,\n enrichedReadCache: this.enrichedReadCache,\n logger: this.logger,\n registerHooks: false,\n };\n\n for (const msg of messages) {\n const sdkMessage = {\n type: msg.type,\n message: msg.message as {\n content: string | Array<{ type: string; text?: string }>;\n role: typeof msg.type;\n },\n parent_tool_use_id: msg.parent_tool_use_id,\n };\n await handleUserAssistantMessage(\n sdkMessage as Parameters<typeof handleUserAssistantMessage>[0],\n replayContext,\n );\n }\n } catch (err) {\n this.logger.warn(\"Failed to replay session history\", {\n sessionId,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n // ================================\n // EXTENSION METHODS\n // ================================\n\n /**\n * Fire-and-forget: fetch slash commands and MCP tool metadata in parallel.\n * Both populate caches used later — neither is needed to return configOptions.\n */\n private deferBackgroundFetches(q: Query): void {\n Promise.all([\n new Promise<void>((resolve) => setTimeout(resolve, 10)).then(() =>\n this.sendAvailableCommandsUpdate(),\n ),\n fetchMcpToolMetadata(q, this.logger).then(() => {\n const serverNames = getConnectedMcpServerNames();\n if (serverNames.length > 0) {\n this.options?.onMcpServersReady?.(serverNames);\n }\n }),\n ]).catch((err) =>\n this.logger.error(\"Background fetch failed\", { error: err }),\n );\n }\n\n private async broadcastUserMessage(params: PromptRequest): Promise<void> {\n for (const chunk of params.prompt) {\n const notification = {\n sessionId: params.sessionId,\n update: {\n sessionUpdate: \"user_message_chunk\" as const,\n content: chunk,\n },\n };\n await this.client.sessionUpdate(notification);\n this.appendNotification(params.sessionId, notification);\n }\n }\n}\n","{\n \"name\": \"@posthog/agent\",\n \"version\": \"2.3.341\",\n \"repository\": \"https://github.com/PostHog/code\",\n \"description\": \"TypeScript agent framework wrapping Claude Agent SDK with Git-based task execution for PostHog\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\"\n },\n \"./agent\": {\n \"types\": \"./dist/agent.d.ts\",\n \"import\": \"./dist/agent.js\"\n },\n \"./gateway-models\": {\n \"types\": \"./dist/gateway-models.d.ts\",\n \"import\": \"./dist/gateway-models.js\"\n },\n \"./posthog-api\": {\n \"types\": \"./dist/posthog-api.d.ts\",\n \"import\": \"./dist/posthog-api.js\"\n },\n \"./types\": {\n \"types\": \"./dist/types.d.ts\",\n \"import\": \"./dist/types.js\"\n },\n \"./adapters/claude/questions/utils\": {\n \"types\": \"./dist/adapters/claude/questions/utils.d.ts\",\n \"import\": \"./dist/adapters/claude/questions/utils.js\"\n },\n \"./adapters/claude/permissions/permission-options\": {\n \"types\": \"./dist/adapters/claude/permissions/permission-options.d.ts\",\n \"import\": \"./dist/adapters/claude/permissions/permission-options.js\"\n },\n \"./adapters/claude/tools\": {\n \"types\": \"./dist/adapters/claude/tools.d.ts\",\n \"import\": \"./dist/adapters/claude/tools.js\"\n },\n \"./adapters/claude/conversion/tool-use-to-acp\": {\n \"types\": \"./dist/adapters/claude/conversion/tool-use-to-acp.d.ts\",\n \"import\": \"./dist/adapters/claude/conversion/tool-use-to-acp.js\"\n },\n \"./adapters/claude/session/jsonl-hydration\": {\n \"types\": \"./dist/adapters/claude/session/jsonl-hydration.d.ts\",\n \"import\": \"./dist/adapters/claude/session/jsonl-hydration.js\"\n },\n \"./adapters/claude/session/models\": {\n \"types\": \"./dist/adapters/claude/session/models.d.ts\",\n \"import\": \"./dist/adapters/claude/session/models.js\"\n },\n \"./adapters/reasoning-effort\": {\n \"types\": \"./dist/adapters/reasoning-effort.d.ts\",\n \"import\": \"./dist/adapters/reasoning-effort.js\"\n },\n \"./execution-mode\": {\n \"types\": \"./dist/execution-mode.d.ts\",\n \"import\": \"./dist/execution-mode.js\"\n },\n \"./server\": {\n \"types\": \"./dist/server/agent-server.d.ts\",\n \"import\": \"./dist/server/agent-server.js\"\n }\n },\n \"bin\": {\n \"agent-server\": \"./dist/server/bin.cjs\"\n },\n \"type\": \"module\",\n \"keywords\": [\n \"posthog\",\n \"claude\",\n \"agent\",\n \"ai\",\n \"git\",\n \"typescript\"\n ],\n \"author\": \"PostHog\",\n \"license\": \"SEE LICENSE IN LICENSE\",\n \"scripts\": {\n \"build\": \"node ../../scripts/rimraf.mjs dist && tsup\",\n \"dev\": \"tsup --watch\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"typecheck\": \"pnpm exec tsc --noEmit\",\n \"prepublishOnly\": \"pnpm run build\",\n \"clean\": \"node ../../scripts/rimraf.mjs dist .turbo\"\n },\n \"engines\": {\n \"node\": \">=20.0.0\"\n },\n \"devDependencies\": {\n \"@posthog/shared\": \"workspace:*\",\n \"@posthog/git\": \"workspace:*\",\n \"@types/bun\": \"latest\",\n \"@types/tar\": \"^6.1.13\",\n \"msw\": \"^2.12.7\",\n \"tsup\": \"^8.5.1\",\n \"tsx\": \"^4.20.6\",\n \"typescript\": \"^5.5.0\",\n \"vitest\": \"^2.1.8\"\n },\n \"dependencies\": {\n \"@agentclientprotocol/sdk\": \"0.19.0\",\n \"ajv\": \"^8.17.1\",\n \"@anthropic-ai/claude-agent-sdk\": \"0.2.112\",\n \"@anthropic-ai/sdk\": \"0.89.0\",\n \"@hono/node-server\": \"^1.19.9\",\n \"@opentelemetry/api-logs\": \"^0.208.0\",\n \"@opentelemetry/exporter-logs-otlp-http\": \"^0.208.0\",\n \"@opentelemetry/resources\": \"^2.0.0\",\n \"@opentelemetry/sdk-logs\": \"^0.208.0\",\n \"@opentelemetry/semantic-conventions\": \"^1.28.0\",\n \"@posthog/enricher\": \"workspace:*\",\n \"@types/jsonwebtoken\": \"^9.0.10\",\n \"commander\": \"^14.0.2\",\n \"hono\": \"^4.11.7\",\n \"jsonwebtoken\": \"^9.0.2\",\n \"minimatch\": \"^10.0.3\",\n \"tar\": \"^7.5.0\",\n \"uuid\": \"13.0.0\",\n \"yoga-wasm-web\": \"^0.3.3\",\n \"zod\": \"^4.2.0\"\n },\n \"files\": [\n \"dist/**/*\",\n \"src/**/*\",\n \"README.md\",\n \"CLAUDE.md\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n","/**\n * PostHog-specific ACP extensions.\n *\n * These follow the ACP extensibility model:\n * - Custom notification methods are prefixed with `_posthog/`\n * - Custom data can be attached via `_meta` fields\n *\n * See: https://agentclientprotocol.com/docs/extensibility\n */\n\n/**\n * Custom notification methods for PostHog-specific events.\n * Used with AgentSideConnection.extNotification() or Client.extNotification()\n */\nexport const POSTHOG_NOTIFICATIONS = {\n /** Git branch was created for a task */\n BRANCH_CREATED: \"_posthog/branch_created\",\n\n /** Task run has started execution */\n RUN_STARTED: \"_posthog/run_started\",\n\n /** Task has completed (success or failure) */\n TASK_COMPLETE: \"_posthog/task_complete\",\n\n /** Agent finished processing a turn (prompt returned, waiting for next input) */\n TURN_COMPLETE: \"_posthog/turn_complete\",\n\n /** Error occurred during task execution */\n ERROR: \"_posthog/error\",\n\n /** Console/log output from the agent */\n CONSOLE: \"_posthog/console\",\n\n /** Maps taskRunId to agent's sessionId and adapter type (for resumption) */\n SDK_SESSION: \"_posthog/sdk_session\",\n\n /** Tree state snapshot captured (git tree hash + file archive) */\n TREE_SNAPSHOT: \"_posthog/tree_snapshot\",\n\n /** Agent mode changed (interactive/background) */\n MODE_CHANGE: \"_posthog/mode_change\",\n\n /** Request to resume a session from previous state */\n SESSION_RESUME: \"_posthog/session/resume\",\n\n /** User message sent from client to agent */\n USER_MESSAGE: \"_posthog/user_message\",\n\n /** Request to cancel current operation */\n CANCEL: \"_posthog/cancel\",\n\n /** Request to close the session */\n CLOSE: \"_posthog/close\",\n\n /** Agent status update (thinking, working, etc.) */\n STATUS: \"_posthog/status\",\n\n /** Task-level notification (progress, milestones) */\n TASK_NOTIFICATION: \"_posthog/task_notification\",\n\n /** Marks a boundary for log compaction */\n COMPACT_BOUNDARY: \"_posthog/compact_boundary\",\n\n /** Token usage update for a session turn */\n USAGE_UPDATE: \"_posthog/usage_update\",\n\n /** Response to a relayed permission request (plan approval, question) */\n PERMISSION_RESPONSE: \"_posthog/permission_response\",\n} as const;\n\n/**\n * Custom request methods for PostHog-specific operations that need a response\n * (request/response, not fire-and-forget). Used with\n * ClientSideConnection.extMethod() on the sender and Agent.extMethod() on the\n * receiver.\n */\nexport const POSTHOG_METHODS = {\n /**\n * Client requests a session refresh between turns. Payload may include\n * `mcpServers` to trigger a resume-with-new-options reinit; future fields\n * can extend this without adding new methods. Returns once the refresh has\n * completed so the caller can safely send the next prompt.\n */\n REFRESH_SESSION: \"_posthog/refresh_session\",\n} as const;\n\ntype PosthogNotification =\n (typeof POSTHOG_NOTIFICATIONS)[keyof typeof POSTHOG_NOTIFICATIONS];\n\ntype PosthogMethod = (typeof POSTHOG_METHODS)[keyof typeof POSTHOG_METHODS];\n\n/**\n * Does `method` match `expected`? Shared by notification and method matchers.\n * Handles the `__posthog/` double-prefix that extNotification() can produce.\n */\nfunction matchesExt(method: string | undefined, expected: string): boolean {\n if (!method) return false;\n return method === expected || method === `_${expected}`;\n}\n\n/** Dispatcher check for incoming `extNotification` calls on the agent side. */\nexport function isNotification(\n method: string | undefined,\n expected: PosthogNotification,\n): boolean {\n return matchesExt(method, expected);\n}\n\n/** Dispatcher check for incoming `extMethod` calls on the agent side. */\nexport function isMethod(\n method: string | undefined,\n expected: PosthogMethod,\n): boolean {\n return matchesExt(method, expected);\n}\n","import * as path from \"node:path\";\nimport { EXT_TO_LANG_ID, PostHogEnricher } from \"@posthog/enricher\";\nimport type { PostHogAPIConfig } from \"../types\";\nimport type { Logger } from \"../utils/logger\";\n\nexport interface FileEnrichmentDeps {\n enricher: PostHogEnricher;\n apiConfig: PostHogAPIConfig;\n logger?: Logger;\n}\n\nexport interface Enrichment {\n deps: FileEnrichmentDeps;\n dispose(): void;\n}\n\nexport function createEnrichment(\n apiConfig: PostHogAPIConfig | undefined,\n logger?: Logger,\n): Enrichment | undefined {\n if (!apiConfig) return undefined;\n const enricher = new PostHogEnricher();\n return {\n deps: { enricher, apiConfig, logger },\n dispose: () => enricher.dispose(),\n };\n}\n\nconst MAX_ENRICHMENT_BYTES = 1_000_000;\n\nexport async function enrichFileForAgent(\n deps: FileEnrichmentDeps,\n filePath: string,\n content: string,\n): Promise<string | null> {\n if (!content || content.length > MAX_ENRICHMENT_BYTES) return null;\n\n // Skip the tree-sitter parse for files with no PostHog references.\n if (!/posthog/i.test(content)) return null;\n\n const ext = path.extname(filePath).toLowerCase();\n const langId = EXT_TO_LANG_ID[ext];\n if (!langId || !deps.enricher.isSupported(langId)) return null;\n\n try {\n const parsed = await deps.enricher.parse(content, langId);\n if (parsed.calls.length === 0 && parsed.initCalls.length === 0) {\n return null;\n }\n\n const apiKey = await deps.apiConfig.getApiKey();\n if (!apiKey) return null;\n\n const enriched = await parsed.enrichFromApi({\n apiKey,\n host: deps.apiConfig.apiUrl,\n projectId: deps.apiConfig.projectId,\n timeoutMs: 5_000,\n });\n\n const annotated = enriched.toInlineComments();\n if (annotated === content) {\n deps.logger?.debug(\"File enrichment produced no changes\", {\n filePath,\n calls: parsed.calls.length,\n });\n return null;\n }\n deps.logger?.debug(\"File enriched\", {\n filePath,\n calls: parsed.calls.length,\n });\n return annotated;\n } catch (err) {\n const detail =\n err instanceof Error\n ? { message: err.message, name: err.name, stack: err.stack }\n : { value: String(err) };\n deps.logger?.debug(\"File enrichment failed\", { filePath, ...detail });\n return null;\n }\n}\n","import type Parser from \"web-tree-sitter\";\n\nexport interface Capture {\n name: string;\n node: Parser.SyntaxNode;\n}\n\nexport function getCapture(\n captures: Capture[],\n name: string,\n): Parser.SyntaxNode | null {\n const found = captures.find((c) => c.name === name);\n return found ? found.node : null;\n}\n\nexport function extractClientName(\n node: Parser.SyntaxNode,\n detectNested: boolean,\n): string | null {\n if (node.type === \"identifier\") {\n return node.text;\n }\n if (detectNested) {\n if (node.type === \"member_expression\" || node.type === \"attribute\") {\n const prop =\n node.childForFieldName(\"property\") ||\n node.childForFieldName(\"attribute\");\n if (prop) {\n return prop.text;\n }\n }\n if (node.type === \"selector_expression\") {\n const field = node.childForFieldName(\"field\");\n if (field) {\n return field.text;\n }\n }\n if (node.type === \"optional_chain_expression\") {\n const inner = node.namedChildren[0];\n if (inner?.type === \"member_expression\") {\n const prop = inner.childForFieldName(\"property\");\n if (prop) {\n return prop.text;\n }\n }\n }\n }\n return null;\n}\n\nexport function extractIdentifier(node: Parser.SyntaxNode): string | null {\n if (node.type === \"identifier\") {\n return node.text;\n }\n if (\n node.type === \"parenthesized_expression\" &&\n node.namedChildren.length === 1\n ) {\n return extractIdentifier(node.namedChildren[0]);\n }\n return null;\n}\n\nexport function extractStringFromCaseValue(\n node: Parser.SyntaxNode,\n): string | null {\n if (node.type === \"expression_list\" && node.namedChildCount > 0) {\n return extractStringFromNode(node.namedChildren[0]);\n }\n return extractStringFromNode(node);\n}\n\nexport function extractStringFromNode(node: Parser.SyntaxNode): string | null {\n if (node.type === \"string\" || node.type === \"template_string\") {\n const content = node.namedChildren.find(\n (c) =>\n c.type === \"string_fragment\" ||\n c.type === \"string_content\" ||\n c.type === \"string_value\",\n );\n return content ? content.text : null;\n }\n if (\n node.type === \"interpreted_string_literal\" ||\n node.type === \"raw_string_literal\"\n ) {\n return node.text.slice(1, -1);\n }\n if (node.type === \"string_fragment\" || node.type === \"string_content\") {\n return node.text;\n }\n return null;\n}\n\nexport function cleanStringValue(text: string): string {\n if (\n (text.startsWith('\"') && text.endsWith('\"')) ||\n (text.startsWith(\"'\") && text.endsWith(\"'\")) ||\n (text.startsWith(\"`\") && text.endsWith(\"`\"))\n ) {\n return text.slice(1, -1);\n }\n return text;\n}\n\nconst PARAM_SKIP = new Set([\n \"e\",\n \"ev\",\n \"event\",\n \"evt\",\n \"ctx\",\n \"context\",\n \"req\",\n \"res\",\n \"next\",\n \"err\",\n \"error\",\n \"_\",\n \"__\",\n]);\n\nexport function extractParams(paramsText: string): string[] {\n let text = paramsText.trim();\n if (text.startsWith(\"(\")) {\n text = text.slice(1);\n }\n if (text.endsWith(\")\")) {\n text = text.slice(0, -1);\n }\n if (!text.trim()) {\n return [];\n }\n\n return text\n .split(\",\")\n .map((p) => {\n if (p.includes(\"{\") || p.includes(\"}\")) {\n return \"\";\n }\n const name = p.split(\":\")[0].split(\"=\")[0].replace(/[?.]/g, \"\").trim();\n return name;\n })\n .filter((p) => p && !PARAM_SKIP.has(p) && !p.startsWith(\"...\"));\n}\n\nexport function walkNodes(\n root: Parser.SyntaxNode,\n type: string,\n callback: (node: Parser.SyntaxNode) => void,\n): void {\n const visit = (node: Parser.SyntaxNode) => {\n if (node.type === type) {\n callback(node);\n }\n for (const child of node.namedChildren) {\n visit(child);\n }\n };\n visit(root);\n}\n","// ── Language-specific method sets and tree-sitter queries ──\n\nexport interface QueryStrings {\n postHogCalls: string;\n nodeCaptureCalls: string;\n pythonCaptureCalls?: string;\n goStructCalls?: string;\n rubyCaptureCalls?: string;\n identifierArgCalls: string;\n dynamicCalls: string;\n flagAssignments: string;\n functions: string;\n clientAliases: string;\n constructorAliases: string;\n destructuredMethods: string;\n bareFunctionCalls: string;\n}\n\nexport interface LangFamily {\n wasm: string;\n captureMethods: Set<string>;\n flagMethods: Set<string>;\n allMethods: Set<string>;\n queries: QueryStrings;\n}\n\n// ── Method sets per language ──\n\nconst JS_CAPTURE_METHODS = new Set([\"capture\"]);\nconst JS_FLAG_METHODS = new Set([\n \"getFeatureFlag\",\n \"isFeatureEnabled\",\n \"getFeatureFlagPayload\",\n \"getFeatureFlagResult\",\n \"isFeatureFlagEnabled\",\n \"getRemoteConfig\",\n]);\nconst JS_ALL_METHODS = new Set([...JS_CAPTURE_METHODS, ...JS_FLAG_METHODS]);\n\nconst PY_CAPTURE_METHODS = new Set([\"capture\"]);\nconst PY_FLAG_METHODS = new Set([\n \"feature_enabled\",\n \"is_feature_enabled\",\n \"get_feature_flag\",\n \"get_feature_flag_payload\",\n \"get_remote_config\",\n]);\nconst PY_ALL_METHODS = new Set([...PY_CAPTURE_METHODS, ...PY_FLAG_METHODS]);\n\nconst GO_CAPTURE_METHODS = new Set([\"Enqueue\"]);\nconst GO_FLAG_METHODS = new Set([\n \"GetFeatureFlag\",\n \"IsFeatureEnabled\",\n \"GetFeatureFlagPayload\",\n]);\nconst GO_ALL_METHODS = new Set([...GO_CAPTURE_METHODS, ...GO_FLAG_METHODS]);\n\nconst RB_CAPTURE_METHODS = new Set([\"capture\"]);\nconst RB_FLAG_METHODS = new Set([\n \"is_feature_enabled\",\n \"get_feature_flag\",\n \"get_feature_flag_payload\",\n \"get_remote_config_payload\",\n]);\nconst RB_ALL_METHODS = new Set([...RB_CAPTURE_METHODS, ...RB_FLAG_METHODS]);\n\n// ── Default client names ──\n\nexport const CLIENT_NAMES = new Set([\"posthog\", \"client\", \"ph\"]);\n\n// ── All flag methods across languages (for stale flag scanning) ──\n\nexport const ALL_FLAG_METHODS = new Set([\n ...JS_FLAG_METHODS,\n ...PY_FLAG_METHODS,\n ...GO_FLAG_METHODS,\n ...RB_FLAG_METHODS,\n]);\n\n// ── Tree-sitter queries ──\n\nconst JS_QUERIES: QueryStrings = {\n postHogCalls: `\n (call_expression\n function: (member_expression\n object: (_) @client\n property: (property_identifier) @method)\n arguments: (arguments . (string (string_fragment) @key))) @call\n\n (call_expression\n function: (member_expression\n object: (_) @client\n property: (property_identifier) @method)\n arguments: (arguments . (template_string (string_fragment) @key))) @call\n `,\n\n nodeCaptureCalls: `\n (call_expression\n function: (member_expression\n object: (_) @client\n property: (property_identifier) @method)\n arguments: (arguments .\n (object\n (pair\n key: (property_identifier) @prop_name\n value: (string (string_fragment) @key))))) @call\n `,\n\n flagAssignments: `\n (lexical_declaration\n (variable_declarator\n name: (identifier) @var_name\n value: (call_expression\n function: (member_expression\n object: (_) @client\n property: (property_identifier) @method)\n arguments: (arguments . (string (string_fragment) @flag_key))))) @assignment\n\n (variable_declaration\n (variable_declarator\n name: (identifier) @var_name\n value: (call_expression\n function: (member_expression\n object: (_) @client\n property: (property_identifier) @method)\n arguments: (arguments . (string (string_fragment) @flag_key))))) @assignment\n\n (lexical_declaration\n (variable_declarator\n name: (identifier) @var_name\n value: (await_expression\n (call_expression\n function: (member_expression\n object: (_) @client\n property: (property_identifier) @method)\n arguments: (arguments . (string (string_fragment) @flag_key)))))) @assignment\n\n (variable_declaration\n (variable_declarator\n name: (identifier) @var_name\n value: (await_expression\n (call_expression\n function: (member_expression\n object: (_) @client\n property: (property_identifier) @method)\n arguments: (arguments . (string (string_fragment) @flag_key)))))) @assignment\n `,\n\n functions: `\n (function_declaration\n name: (identifier) @func_name\n parameters: (formal_parameters) @func_params\n body: (statement_block) @func_body)\n\n (export_statement\n declaration: (function_declaration\n name: (identifier) @func_name\n parameters: (formal_parameters) @func_params\n body: (statement_block) @func_body))\n\n (lexical_declaration\n (variable_declarator\n name: (identifier) @func_name\n value: (arrow_function\n parameters: (formal_parameters) @func_params\n body: (statement_block) @func_body)))\n\n (lexical_declaration\n (variable_declarator\n name: (identifier) @func_name\n value: (arrow_function\n parameter: (identifier) @func_single_param\n body: (statement_block) @func_body)))\n\n (method_definition\n name: (property_identifier) @func_name\n parameters: (formal_parameters) @func_params\n body: (statement_block) @func_body)\n `,\n\n clientAliases: `\n (lexical_declaration\n (variable_declarator\n name: (identifier) @alias\n value: (identifier) @source))\n\n (variable_declaration\n (variable_declarator\n name: (identifier) @alias\n value: (identifier) @source))\n `,\n\n constructorAliases: `\n (lexical_declaration\n (variable_declarator\n name: (identifier) @alias\n value: (new_expression\n constructor: (identifier) @class_name)))\n\n (variable_declaration\n (variable_declarator\n name: (identifier) @alias\n value: (new_expression\n constructor: (identifier) @class_name)))\n `,\n\n destructuredMethods: `\n (lexical_declaration\n (variable_declarator\n name: (object_pattern\n (shorthand_property_identifier_pattern) @method_name)\n value: (identifier) @source))\n `,\n\n bareFunctionCalls: `\n (call_expression\n function: (identifier) @func_name\n arguments: (arguments . (string (string_fragment) @key))) @call\n `,\n\n identifierArgCalls: `\n (call_expression\n function: (member_expression\n object: (_) @client\n property: (property_identifier) @method)\n arguments: (arguments . (identifier) @arg_id)) @call\n `,\n\n dynamicCalls: `\n (call_expression\n function: (member_expression\n object: (_) @client\n property: (property_identifier) @method)\n arguments: (arguments . (_) @first_arg)) @call\n `,\n};\n\nconst PY_QUERIES: QueryStrings = {\n postHogCalls: `\n (call\n function: (attribute\n object: (_) @client\n attribute: (identifier) @method)\n arguments: (argument_list . (string (string_content) @key))) @call\n `,\n\n nodeCaptureCalls: \"\",\n\n pythonCaptureCalls: `\n (call\n function: (attribute\n object: (_) @client\n attribute: (identifier) @method)\n arguments: (argument_list (string) . (string (string_content) @key))) @call\n\n (call\n function: (attribute\n object: (_) @client\n attribute: (identifier) @method)\n arguments: (argument_list\n (keyword_argument\n name: (identifier) @kwarg_name\n value: (string (string_content) @key)))) @call\n `,\n\n flagAssignments: `\n (expression_statement\n (assignment\n left: (identifier) @var_name\n right: (call\n function: (attribute\n object: (_) @client\n attribute: (identifier) @method)\n arguments: (argument_list . (string (string_content) @flag_key))))) @assignment\n `,\n\n functions: `\n (function_definition\n name: (identifier) @func_name\n parameters: (parameters) @func_params\n body: (block) @func_body)\n `,\n\n clientAliases: `\n (expression_statement\n (assignment\n left: (identifier) @alias\n right: (identifier) @source))\n `,\n\n constructorAliases: `\n (expression_statement\n (assignment\n left: (identifier) @alias\n right: (call\n function: (identifier) @class_name\n arguments: (argument_list))))\n `,\n\n destructuredMethods: \"\",\n\n bareFunctionCalls: `\n (call\n function: (identifier) @func_name\n arguments: (argument_list . (string (string_content) @key))) @call\n `,\n\n identifierArgCalls: `\n (call\n function: (attribute\n object: (_) @client\n attribute: (identifier) @method)\n arguments: (argument_list . (identifier) @arg_id)) @call\n `,\n\n dynamicCalls: `\n (call\n function: (attribute\n object: (_) @client\n attribute: (identifier) @method)\n arguments: (argument_list . (_) @first_arg)) @call\n `,\n};\n\nconst GO_QUERIES: QueryStrings = {\n postHogCalls: `\n (call_expression\n function: (selector_expression\n operand: (_) @client\n field: (field_identifier) @method)\n arguments: (argument_list . (interpreted_string_literal) @key)) @call\n `,\n\n nodeCaptureCalls: \"\",\n\n goStructCalls: `\n (call_expression\n function: (selector_expression\n operand: (_) @client\n field: (field_identifier) @method)\n arguments: (argument_list\n (composite_literal\n body: (literal_value\n (keyed_element\n (literal_element (identifier) @field_name)\n (literal_element (interpreted_string_literal) @key)))))) @call\n `,\n\n flagAssignments: `\n (short_var_declaration\n left: (expression_list . (identifier) @var_name .)\n right: (expression_list\n (call_expression\n function: (selector_expression\n operand: (_) @client\n field: (field_identifier) @method)\n arguments: (argument_list . (interpreted_string_literal) @flag_key)))) @assignment\n\n (short_var_declaration\n left: (expression_list . (identifier) @var_name (_))\n right: (expression_list\n (call_expression\n function: (selector_expression\n operand: (_) @client\n field: (field_identifier) @method)\n arguments: (argument_list . (interpreted_string_literal) @flag_key)))) @assignment\n `,\n\n functions: `\n (function_declaration\n name: (identifier) @func_name\n parameters: (parameter_list) @func_params\n body: (block) @func_body)\n\n (method_declaration\n name: (field_identifier) @func_name\n parameters: (parameter_list) @func_params\n body: (block) @func_body)\n `,\n\n clientAliases: \"\",\n\n constructorAliases: `\n (short_var_declaration\n left: (expression_list (identifier) @alias)\n right: (expression_list\n (call_expression\n function: (selector_expression\n operand: (identifier) @pkg_name\n field: (field_identifier) @func_name))))\n\n (short_var_declaration\n left: (expression_list (identifier) @alias (_))\n right: (expression_list\n (call_expression\n function: (selector_expression\n operand: (identifier) @pkg_name\n field: (field_identifier) @func_name))))\n `,\n\n destructuredMethods: \"\",\n\n bareFunctionCalls: \"\",\n\n identifierArgCalls: `\n (call_expression\n function: (selector_expression\n operand: (_) @client\n field: (field_identifier) @method)\n arguments: (argument_list . (identifier) @arg_id)) @call\n `,\n\n dynamicCalls: `\n (call_expression\n function: (selector_expression\n operand: (_) @client\n field: (field_identifier) @method)\n arguments: (argument_list . (_) @first_arg)) @call\n `,\n};\n\nconst RB_QUERIES: QueryStrings = {\n postHogCalls: `\n (call\n receiver: (_) @client\n method: (identifier) @method\n arguments: (argument_list . (string (string_content) @key))) @call\n `,\n\n nodeCaptureCalls: \"\",\n\n rubyCaptureCalls: `\n (call\n receiver: (_) @client\n method: (identifier) @method\n arguments: (argument_list\n (pair\n (hash_key_symbol) @kwarg_name\n (string (string_content) @key)))) @call\n `,\n\n flagAssignments: `\n (assignment\n left: (identifier) @var_name\n right: (call\n receiver: (_) @client\n method: (identifier) @method\n arguments: (argument_list . (string (string_content) @flag_key)))) @assignment\n `,\n\n functions: `\n (method\n name: (identifier) @func_name\n parameters: (method_parameters) @func_params\n body: (_) @func_body)\n `,\n\n clientAliases: `\n (assignment\n left: (identifier) @alias\n right: (identifier) @source)\n `,\n\n constructorAliases: `\n (assignment\n left: (identifier) @alias\n right: (call\n receiver: (scope_resolution\n scope: (constant) @scope_name\n name: (constant) @class_name)\n method: (identifier) @method_name))\n `,\n\n destructuredMethods: \"\",\n\n bareFunctionCalls: `\n (call\n method: (identifier) @func_name\n arguments: (argument_list . (string (string_content) @key))) @call\n `,\n\n identifierArgCalls: `\n (call\n receiver: (_) @client\n method: (identifier) @method\n arguments: (argument_list . (identifier) @arg_id)) @call\n\n (call\n receiver: (_) @client\n method: (identifier) @method\n arguments: (argument_list . (constant) @arg_id)) @call\n `,\n\n dynamicCalls: `\n (call\n receiver: (_) @client\n method: (identifier) @method\n arguments: (argument_list . (_) @first_arg)) @call\n `,\n};\n\n// ── File extension → language ID mapping ──\n\nexport const EXT_TO_LANG_ID: Record<string, string> = {\n \".js\": \"javascript\",\n \".mjs\": \"javascript\",\n \".cjs\": \"javascript\",\n \".jsx\": \"javascriptreact\",\n \".ts\": \"typescript\",\n \".mts\": \"typescript\",\n \".cts\": \"typescript\",\n \".tsx\": \"typescriptreact\",\n \".py\": \"python\",\n \".pyw\": \"python\",\n \".go\": \"go\",\n \".rb\": \"ruby\",\n \".rake\": \"ruby\",\n \".gemspec\": \"ruby\",\n};\n\n// ── Language → family mapping ──\n\nexport const LANG_FAMILIES: Record<string, LangFamily> = {\n javascript: {\n wasm: \"tree-sitter-javascript.wasm\",\n captureMethods: JS_CAPTURE_METHODS,\n flagMethods: JS_FLAG_METHODS,\n allMethods: JS_ALL_METHODS,\n queries: JS_QUERIES,\n },\n javascriptreact: {\n wasm: \"tree-sitter-javascript.wasm\",\n captureMethods: JS_CAPTURE_METHODS,\n flagMethods: JS_FLAG_METHODS,\n allMethods: JS_ALL_METHODS,\n queries: JS_QUERIES,\n },\n typescript: {\n wasm: \"tree-sitter-typescript.wasm\",\n captureMethods: JS_CAPTURE_METHODS,\n flagMethods: JS_FLAG_METHODS,\n allMethods: JS_ALL_METHODS,\n queries: JS_QUERIES,\n },\n typescriptreact: {\n wasm: \"tree-sitter-tsx.wasm\",\n captureMethods: JS_CAPTURE_METHODS,\n flagMethods: JS_FLAG_METHODS,\n allMethods: JS_ALL_METHODS,\n queries: JS_QUERIES,\n },\n python: {\n wasm: \"tree-sitter-python.wasm\",\n captureMethods: PY_CAPTURE_METHODS,\n flagMethods: PY_FLAG_METHODS,\n allMethods: PY_ALL_METHODS,\n queries: PY_QUERIES,\n },\n go: {\n wasm: \"tree-sitter-go.wasm\",\n captureMethods: GO_CAPTURE_METHODS,\n flagMethods: GO_FLAG_METHODS,\n allMethods: GO_ALL_METHODS,\n queries: GO_QUERIES,\n },\n ruby: {\n wasm: \"tree-sitter-ruby.wasm\",\n captureMethods: RB_CAPTURE_METHODS,\n flagMethods: RB_FLAG_METHODS,\n allMethods: RB_ALL_METHODS,\n queries: RB_QUERIES,\n },\n};\n","import type Parser from \"web-tree-sitter\";\nimport { cleanStringValue, getCapture } from \"./ast-helpers.js\";\nimport type { LangFamily } from \"./languages.js\";\nimport { CLIENT_NAMES } from \"./languages.js\";\nimport type { ParserManager } from \"./parser-manager.js\";\nimport type { DetectionConfig } from \"./types.js\";\n\nconst POSTHOG_CLASS_NAMES = new Set([\"PostHog\", \"Posthog\"]);\nconst GO_CONSTRUCTOR_NAMES = new Set([\"New\", \"NewWithConfig\"]);\n\nexport function getEffectiveClients(config: DetectionConfig): Set<string> {\n const clients = new Set(CLIENT_NAMES);\n for (const name of config.additionalClientNames) {\n clients.add(name);\n }\n return clients;\n}\n\nexport function findAliases(\n pm: ParserManager,\n lang: Parser.Language,\n tree: Parser.Tree,\n family: LangFamily,\n): {\n clientAliases: Set<string>;\n destructuredCapture: Set<string>;\n destructuredFlag: Set<string>;\n} {\n const effectiveClients = getEffectiveClients(pm.config);\n const clientAliases = new Set<string>();\n const destructuredCapture = new Set<string>();\n const destructuredFlag = new Set<string>();\n\n // Client aliases: const tracker = posthog\n const aliasQuery = pm.getQuery(lang, family.queries.clientAliases);\n if (aliasQuery) {\n for (const match of aliasQuery.matches(tree.rootNode)) {\n const aliasNode = getCapture(match.captures, \"alias\");\n const sourceNode = getCapture(match.captures, \"source\");\n if (aliasNode && sourceNode && effectiveClients.has(sourceNode.text)) {\n clientAliases.add(aliasNode.text);\n }\n }\n }\n\n // Constructor aliases: new PostHog('phc_...') / posthog.New(\"token\") / PostHog::Client.new(...)\n const constructorQuery = pm.getQuery(lang, family.queries.constructorAliases);\n if (constructorQuery) {\n for (const match of constructorQuery.matches(tree.rootNode)) {\n const aliasNode = getCapture(match.captures, \"alias\");\n const classNode = getCapture(match.captures, \"class_name\");\n const pkgNode = getCapture(match.captures, \"pkg_name\");\n const funcNode = getCapture(match.captures, \"func_name\");\n\n if (aliasNode && classNode && POSTHOG_CLASS_NAMES.has(classNode.text)) {\n clientAliases.add(aliasNode.text);\n }\n if (\n aliasNode &&\n pkgNode &&\n funcNode &&\n pkgNode.text === \"posthog\" &&\n GO_CONSTRUCTOR_NAMES.has(funcNode.text)\n ) {\n clientAliases.add(aliasNode.text);\n }\n const scopeNode = getCapture(match.captures, \"scope_name\");\n const methodNameNode = getCapture(match.captures, \"method_name\");\n if (\n aliasNode &&\n scopeNode &&\n classNode &&\n methodNameNode &&\n POSTHOG_CLASS_NAMES.has(scopeNode.text) &&\n classNode.text === \"Client\" &&\n methodNameNode.text === \"new\"\n ) {\n clientAliases.add(aliasNode.text);\n }\n }\n }\n\n // Destructured methods: const { capture, getFeatureFlag } = posthog\n if (family.queries.destructuredMethods) {\n const destructQuery = pm.getQuery(lang, family.queries.destructuredMethods);\n if (destructQuery) {\n for (const match of destructQuery.matches(tree.rootNode)) {\n const methodNode = getCapture(match.captures, \"method_name\");\n const sourceNode = getCapture(match.captures, \"source\");\n if (methodNode && sourceNode && effectiveClients.has(sourceNode.text)) {\n const name = methodNode.text;\n if (family.captureMethods.has(name)) {\n destructuredCapture.add(name);\n }\n if (family.flagMethods.has(name)) {\n destructuredFlag.add(name);\n }\n }\n }\n }\n }\n\n return { clientAliases, destructuredCapture, destructuredFlag };\n}\n\nexport function buildConstantMap(\n pm: ParserManager,\n lang: Parser.Language,\n tree: Parser.Tree,\n): Map<string, string> {\n const constants = new Map<string, string>();\n\n // JS: const/let/var declarations\n const jsQuery = pm.getQuery(\n lang,\n `\n (lexical_declaration\n (variable_declarator\n name: (identifier) @name\n value: (string (string_fragment) @value)))\n\n (variable_declaration\n (variable_declarator\n name: (identifier) @name\n value: (string (string_fragment) @value)))\n `,\n );\n if (jsQuery) {\n for (const match of jsQuery.matches(tree.rootNode)) {\n const nameNode = getCapture(match.captures, \"name\");\n const valueNode = getCapture(match.captures, \"value\");\n if (nameNode && valueNode) {\n constants.set(nameNode.text, valueNode.text);\n }\n }\n }\n\n // Python: simple assignment — NAME = \"value\"\n const pyQuery = pm.getQuery(\n lang,\n `\n (expression_statement\n (assignment\n left: (identifier) @name\n right: (string (string_content) @value)))\n `,\n );\n if (pyQuery) {\n for (const match of pyQuery.matches(tree.rootNode)) {\n const nameNode = getCapture(match.captures, \"name\");\n const valueNode = getCapture(match.captures, \"value\");\n if (nameNode && valueNode) {\n constants.set(nameNode.text, valueNode.text);\n }\n }\n }\n\n // Go: short var declarations and const declarations\n const goVarQuery = pm.getQuery(\n lang,\n `\n (short_var_declaration\n left: (expression_list (identifier) @name)\n right: (expression_list (interpreted_string_literal) @value))\n `,\n );\n if (goVarQuery) {\n for (const match of goVarQuery.matches(tree.rootNode)) {\n const nameNode = getCapture(match.captures, \"name\");\n const valueNode = getCapture(match.captures, \"value\");\n if (nameNode && valueNode) {\n constants.set(nameNode.text, cleanStringValue(valueNode.text));\n }\n }\n }\n\n const goConstQuery = pm.getQuery(\n lang,\n `\n (const_declaration\n (const_spec\n name: (identifier) @name\n value: (expression_list (interpreted_string_literal) @value)))\n `,\n );\n if (goConstQuery) {\n for (const match of goConstQuery.matches(tree.rootNode)) {\n const nameNode = getCapture(match.captures, \"name\");\n const valueNode = getCapture(match.captures, \"value\");\n if (nameNode && valueNode) {\n constants.set(nameNode.text, cleanStringValue(valueNode.text));\n }\n }\n }\n\n // Ruby: assignment — local var or constant\n const rbQuery = pm.getQuery(\n lang,\n `\n (assignment\n left: (identifier) @name\n right: (string (string_content) @value))\n\n (assignment\n left: (constant) @name\n right: (string (string_content) @value))\n `,\n );\n if (rbQuery) {\n for (const match of rbQuery.matches(tree.rootNode)) {\n const nameNode = getCapture(match.captures, \"name\");\n const valueNode = getCapture(match.captures, \"value\");\n if (nameNode && valueNode) {\n constants.set(nameNode.text, valueNode.text);\n }\n }\n }\n\n return constants;\n}\n","import type Parser from \"web-tree-sitter\";\nimport {\n buildConstantMap,\n findAliases,\n getEffectiveClients,\n} from \"./alias-resolver.js\";\nimport {\n cleanStringValue,\n extractClientName,\n extractParams,\n getCapture,\n} from \"./ast-helpers.js\";\nimport type { ParserManager } from \"./parser-manager.js\";\nimport type {\n FlagAssignment,\n FunctionInfo,\n PostHogCall,\n PostHogInitCall,\n} from \"./types.js\";\n\nconst POSTHOG_CLASS_NAMES = new Set([\"PostHog\", \"Posthog\"]);\nconst GO_CONSTRUCTOR_NAMES = new Set([\"New\", \"NewWithConfig\"]);\n\nexport async function findPostHogCalls(\n pm: ParserManager,\n source: string,\n languageId: string,\n): Promise<PostHogCall[]> {\n const ready = await pm.ensureReady(languageId);\n if (!ready) {\n return [];\n }\n\n const { lang, family } = ready;\n const tree = pm.parse(source, lang);\n if (!tree) {\n return [];\n }\n\n const calls: PostHogCall[] = [];\n const seen = new Set<string>();\n const allClients = getEffectiveClients(pm.config);\n\n // Resolve aliases\n const { clientAliases, destructuredCapture, destructuredFlag } = findAliases(\n pm,\n lang,\n tree,\n family,\n );\n for (const a of clientAliases) {\n allClients.add(a);\n }\n\n // Direct method calls: posthog.capture(\"event\")\n const callQuery = pm.getQuery(lang, family.queries.postHogCalls);\n if (callQuery) {\n const matches = callQuery.matches(tree.rootNode);\n for (const match of matches) {\n const clientNode = getCapture(match.captures, \"client\");\n const methodNode = getCapture(match.captures, \"method\");\n const keyNode = getCapture(match.captures, \"key\");\n\n if (!clientNode || !methodNode || !keyNode) {\n continue;\n }\n\n const clientName = extractClientName(\n clientNode,\n pm.config.detectNestedClients,\n );\n const method = methodNode.text;\n\n if (!clientName || !allClients.has(clientName)) {\n continue;\n }\n if (!family.allMethods.has(method)) {\n continue;\n }\n\n // For Python, skip capture in the generic query — the first arg is distinct_id, not the event.\n // Python capture is handled separately by the pythonCaptureCalls query.\n if (\n family.queries.pythonCaptureCalls &&\n family.captureMethods.has(method)\n ) {\n continue;\n }\n\n // For Ruby, skip capture — event is in the `event:` keyword arg, not the first positional arg.\n // Ruby capture is handled separately by the rubyCaptureCalls query.\n if (\n family.queries.rubyCaptureCalls &&\n family.captureMethods.has(method)\n ) {\n continue;\n }\n\n calls.push({\n method,\n key: cleanStringValue(keyNode.text),\n line: keyNode.startPosition.row,\n keyStartCol: keyNode.startPosition.column,\n keyEndCol: keyNode.endPosition.column,\n });\n }\n }\n\n // Go struct-based calls: client.Enqueue(posthog.Capture{Event: \"purchase\"})\n // and client.GetFeatureFlag(posthog.FeatureFlagPayload{Key: \"my-flag\"})\n if (family.queries.goStructCalls) {\n const structQuery = pm.getQuery(lang, family.queries.goStructCalls);\n if (structQuery) {\n for (const match of structQuery.matches(tree.rootNode)) {\n const clientNode = getCapture(match.captures, \"client\");\n const methodNode = getCapture(match.captures, \"method\");\n const fieldNameNode = getCapture(match.captures, \"field_name\");\n const keyNode = getCapture(match.captures, \"key\");\n if (!clientNode || !methodNode || !fieldNameNode || !keyNode) {\n continue;\n }\n\n const clientName = extractClientName(\n clientNode,\n pm.config.detectNestedClients,\n );\n const method = methodNode.text;\n const fieldName = fieldNameNode.text;\n if (!clientName || !allClients.has(clientName)) {\n continue;\n }\n\n // For Enqueue(posthog.Capture{Event: \"...\"}), method is \"Enqueue\" and we want Event field\n // For GetFeatureFlag(posthog.FeatureFlagPayload{Key: \"...\"}), we want Key field\n const isCapture = method === \"Enqueue\" && fieldName === \"Event\";\n const isFlag = family.flagMethods.has(method) && fieldName === \"Key\";\n if (!isCapture && !isFlag) {\n continue;\n }\n\n const effectiveMethod = isCapture ? \"capture\" : method;\n const key = cleanStringValue(keyNode.text);\n const line = keyNode.startPosition.row;\n const dedupKey = `${line}:${key}`;\n if (seen.has(dedupKey)) {\n continue;\n }\n seen.add(dedupKey);\n\n calls.push({\n method: effectiveMethod,\n key,\n line,\n keyStartCol: keyNode.startPosition.column,\n keyEndCol: keyNode.endPosition.column,\n });\n }\n }\n }\n\n // Node SDK capture calls: client.capture({ event: 'purchase', ... })\n const nodeCaptureQuery = pm.getQuery(lang, family.queries.nodeCaptureCalls);\n if (nodeCaptureQuery) {\n const matches = nodeCaptureQuery.matches(tree.rootNode);\n for (const match of matches) {\n const clientNode = getCapture(match.captures, \"client\");\n const methodNode = getCapture(match.captures, \"method\");\n const propNameNode = getCapture(match.captures, \"prop_name\");\n const keyNode = getCapture(match.captures, \"key\");\n\n if (!clientNode || !methodNode || !propNameNode || !keyNode) {\n continue;\n }\n\n const clientName = extractClientName(\n clientNode,\n pm.config.detectNestedClients,\n );\n const method = methodNode.text;\n\n if (!clientName || !allClients.has(clientName)) {\n continue;\n }\n if (method !== \"capture\") {\n continue;\n }\n if (propNameNode.text !== \"event\") {\n continue;\n }\n\n calls.push({\n method,\n key: cleanStringValue(keyNode.text),\n line: keyNode.startPosition.row,\n keyStartCol: keyNode.startPosition.column,\n keyEndCol: keyNode.endPosition.column,\n });\n }\n }\n\n // Python capture: posthog.capture(distinct_id, 'event_name', ...)\n // Event is the 2nd positional arg, or the `event` keyword argument\n if (family.queries.pythonCaptureCalls) {\n const pyCaptureQuery = pm.getQuery(lang, family.queries.pythonCaptureCalls);\n if (pyCaptureQuery) {\n const matches = pyCaptureQuery.matches(tree.rootNode);\n for (const match of matches) {\n const clientNode = getCapture(match.captures, \"client\");\n const methodNode = getCapture(match.captures, \"method\");\n const keyNode = getCapture(match.captures, \"key\");\n const kwargNameNode = getCapture(match.captures, \"kwarg_name\");\n\n if (!clientNode || !methodNode || !keyNode) {\n continue;\n }\n\n const clientName = extractClientName(\n clientNode,\n pm.config.detectNestedClients,\n );\n const method = methodNode.text;\n\n if (!clientName || !allClients.has(clientName)) {\n continue;\n }\n if (method !== \"capture\") {\n continue;\n }\n\n // For keyword argument form, only match event=\n if (kwargNameNode && kwargNameNode.text !== \"event\") {\n continue;\n }\n\n const key = cleanStringValue(keyNode.text);\n const line = keyNode.startPosition.row;\n const dedupKey = `${line}:${key}`;\n if (seen.has(dedupKey)) {\n continue;\n }\n seen.add(dedupKey);\n\n calls.push({\n method,\n key,\n line,\n keyStartCol: keyNode.startPosition.column,\n keyEndCol: keyNode.endPosition.column,\n });\n }\n }\n }\n\n // Ruby capture: client.capture(distinct_id: 'user', event: 'purchase')\n // Event name is in the `event:` keyword argument (hash_key_symbol)\n if (family.queries.rubyCaptureCalls) {\n const rbCaptureQuery = pm.getQuery(lang, family.queries.rubyCaptureCalls);\n if (rbCaptureQuery) {\n const matches = rbCaptureQuery.matches(tree.rootNode);\n for (const match of matches) {\n const clientNode = getCapture(match.captures, \"client\");\n const methodNode = getCapture(match.captures, \"method\");\n const keyNode = getCapture(match.captures, \"key\");\n const kwargNameNode = getCapture(match.captures, \"kwarg_name\");\n\n if (!clientNode || !methodNode || !keyNode || !kwargNameNode) {\n continue;\n }\n\n const clientName = extractClientName(\n clientNode,\n pm.config.detectNestedClients,\n );\n const method = methodNode.text;\n\n if (!clientName || !allClients.has(clientName)) {\n continue;\n }\n if (method !== \"capture\") {\n continue;\n }\n if (kwargNameNode.text !== \"event\") {\n continue;\n }\n\n const key = cleanStringValue(keyNode.text);\n const line = keyNode.startPosition.row;\n const dedupKey = `${line}:${key}`;\n if (seen.has(dedupKey)) {\n continue;\n }\n seen.add(dedupKey);\n\n calls.push({\n method,\n key,\n line,\n keyStartCol: keyNode.startPosition.column,\n keyEndCol: keyNode.endPosition.column,\n });\n }\n }\n }\n\n // Bare function calls from destructured methods: capture(\"event\")\n if (destructuredCapture.size > 0 || destructuredFlag.size > 0) {\n const bareQuery = pm.getQuery(lang, family.queries.bareFunctionCalls);\n if (bareQuery) {\n const matches = bareQuery.matches(tree.rootNode);\n for (const match of matches) {\n const funcNode = getCapture(match.captures, \"func_name\");\n const keyNode = getCapture(match.captures, \"key\");\n if (!funcNode || !keyNode) {\n continue;\n }\n\n const name = funcNode.text;\n if (destructuredCapture.has(name) || destructuredFlag.has(name)) {\n calls.push({\n method: name,\n key: cleanStringValue(keyNode.text),\n line: keyNode.startPosition.row,\n keyStartCol: keyNode.startPosition.column,\n keyEndCol: keyNode.endPosition.column,\n });\n }\n }\n }\n }\n\n // Additional flag functions: useFeatureFlag(\"key\"), etc.\n if (\n pm.config.additionalFlagFunctions.length > 0 &&\n family.queries.bareFunctionCalls\n ) {\n const additionalFlagFuncs = new Set(pm.config.additionalFlagFunctions);\n const bareQuery = pm.getQuery(lang, family.queries.bareFunctionCalls);\n if (bareQuery) {\n const matches = bareQuery.matches(tree.rootNode);\n for (const match of matches) {\n const funcNode = getCapture(match.captures, \"func_name\");\n const keyNode = getCapture(match.captures, \"key\");\n if (!funcNode || !keyNode) {\n continue;\n }\n\n if (additionalFlagFuncs.has(funcNode.text)) {\n calls.push({\n method: funcNode.text,\n key: cleanStringValue(keyNode.text),\n line: keyNode.startPosition.row,\n keyStartCol: keyNode.startPosition.column,\n keyEndCol: keyNode.endPosition.column,\n });\n }\n }\n }\n }\n\n // Resolve calls with identifier first argument: posthog.capture(MY_CONST) / posthog.getFeatureFlag(FLAG_KEY)\n const constantMap = buildConstantMap(pm, lang, tree);\n if (constantMap.size > 0) {\n const identArgQuery = pm.getQuery(lang, family.queries.identifierArgCalls);\n if (identArgQuery) {\n const identMatches = identArgQuery.matches(tree.rootNode);\n for (const match of identMatches) {\n const clientNode = getCapture(match.captures, \"client\");\n const methodNode = getCapture(match.captures, \"method\");\n const argNode = getCapture(match.captures, \"arg_id\");\n if (!clientNode || !methodNode || !argNode) {\n continue;\n }\n\n const clientName = extractClientName(\n clientNode,\n pm.config.detectNestedClients,\n );\n const method = methodNode.text;\n if (!clientName || !allClients.has(clientName)) {\n continue;\n }\n if (!family.allMethods.has(method)) {\n continue;\n }\n\n const resolved = constantMap.get(argNode.text);\n if (!resolved) {\n continue;\n }\n\n const line = argNode.startPosition.row;\n const dedupKey = `${line}:${resolved}`;\n if (seen.has(dedupKey)) {\n continue;\n }\n seen.add(dedupKey);\n\n calls.push({\n method,\n key: resolved,\n line,\n keyStartCol: argNode.startPosition.column,\n keyEndCol: argNode.endPosition.column,\n });\n }\n }\n }\n\n // Detect dynamic capture calls (non-string first argument)\n const matchedLines = new Set(calls.map((c) => c.line));\n const dynamicQuery = pm.getQuery(lang, family.queries.dynamicCalls);\n if (dynamicQuery) {\n const matches = dynamicQuery.matches(tree.rootNode);\n for (const match of matches) {\n const clientNode = getCapture(match.captures, \"client\");\n const methodNode = getCapture(match.captures, \"method\");\n const firstArgNode = getCapture(match.captures, \"first_arg\");\n if (!clientNode || !methodNode || !firstArgNode) {\n continue;\n }\n\n const clientName = extractClientName(\n clientNode,\n pm.config.detectNestedClients,\n );\n const method = methodNode.text;\n if (!clientName || !allClients.has(clientName)) {\n continue;\n }\n if (!family.captureMethods.has(method)) {\n continue;\n }\n\n const line = firstArgNode.startPosition.row;\n if (matchedLines.has(line)) {\n continue;\n } // already matched with a string key\n\n calls.push({\n method,\n key: \"\",\n line,\n keyStartCol: firstArgNode.startPosition.column,\n keyEndCol: firstArgNode.endPosition.column,\n dynamic: true,\n });\n matchedLines.add(line);\n }\n }\n\n return calls;\n}\n\nexport async function findInitCalls(\n pm: ParserManager,\n source: string,\n languageId: string,\n): Promise<PostHogInitCall[]> {\n const ready = await pm.ensureReady(languageId);\n if (!ready) {\n return [];\n }\n\n const { lang } = ready;\n const tree = pm.parse(source, lang);\n if (!tree) {\n return [];\n }\n\n const allClients = getEffectiveClients(pm.config);\n const results: PostHogInitCall[] = [];\n const seenLines = new Set<number>();\n\n // Pattern 1: posthog.init('token', { ... })\n const initQueryStr = `\n (call_expression\n function: (member_expression\n object: (_) @client\n property: (property_identifier) @method)\n arguments: (arguments\n (string (string_fragment) @token)\n (object)? @config)) @call\n `;\n\n const initQuery = pm.getQuery(lang, initQueryStr);\n if (initQuery) {\n for (const match of initQuery.matches(tree.rootNode)) {\n const clientNode = getCapture(match.captures, \"client\");\n const methodNode = getCapture(match.captures, \"method\");\n const tokenNode = getCapture(match.captures, \"token\");\n const configNode = getCapture(match.captures, \"config\");\n\n if (!clientNode || !methodNode || !tokenNode) {\n continue;\n }\n if (methodNode.text !== \"init\") {\n continue;\n }\n\n const clientName = extractClientName(\n clientNode,\n pm.config.detectNestedClients,\n );\n if (!clientName || !allClients.has(clientName)) {\n continue;\n }\n\n results.push(buildInitCall(tokenNode, configNode ?? undefined));\n }\n }\n\n // Pattern 2: new PostHog('token', { ... }) — Node SDK\n const constructorQueryStr = `\n (new_expression\n constructor: (identifier) @class_name\n arguments: (arguments\n (string (string_fragment) @token)\n (object)? @config)) @call\n `;\n\n const ctorQuery = pm.getQuery(lang, constructorQueryStr);\n if (ctorQuery) {\n for (const match of ctorQuery.matches(tree.rootNode)) {\n const classNode = getCapture(match.captures, \"class_name\");\n const tokenNode = getCapture(match.captures, \"token\");\n const configNode = getCapture(match.captures, \"config\");\n\n if (!classNode || !tokenNode) {\n continue;\n }\n if (!POSTHOG_CLASS_NAMES.has(classNode.text)) {\n continue;\n }\n\n results.push(buildInitCall(tokenNode, configNode ?? undefined));\n }\n }\n\n // Pattern 3a: Posthog('phc_token', host='...') — positional token\n const pyCtorQueryStr = `\n (call\n function: (identifier) @class_name\n arguments: (argument_list\n (string (string_content) @token))) @call\n `;\n\n // Pattern 3b: Posthog(api_key='phc_token', host='...') — keyword token\n const pyCtorKwQueryStr = `\n (call\n function: (identifier) @class_name\n arguments: (argument_list\n (keyword_argument\n name: (identifier) @kw_name\n value: (string (string_content) @token)))) @call\n `;\n\n const pyCtorKwQuery = pm.getQuery(lang, pyCtorKwQueryStr);\n if (pyCtorKwQuery) {\n for (const match of pyCtorKwQuery.matches(tree.rootNode)) {\n const classNode = getCapture(match.captures, \"class_name\");\n const kwNameNode = getCapture(match.captures, \"kw_name\");\n const tokenNode = getCapture(match.captures, \"token\");\n\n if (!classNode || !kwNameNode || !tokenNode) {\n continue;\n }\n if (!POSTHOG_CLASS_NAMES.has(classNode.text)) {\n continue;\n }\n if (\n kwNameNode.text !== \"api_key\" &&\n kwNameNode.text !== \"project_api_key\"\n ) {\n continue;\n }\n\n // Check we didn't already match this call via positional pattern\n const line = tokenNode.startPosition.row;\n if (seenLines.has(line)) {\n continue;\n }\n seenLines.add(line);\n\n // Extract other keyword args for config\n const callNode = getCapture(match.captures, \"call\");\n const configProperties = new Map<string, string>();\n let apiHost: string | null = null;\n\n if (callNode) {\n const argsNode = callNode.childForFieldName(\"arguments\");\n if (argsNode) {\n for (const child of argsNode.namedChildren) {\n if (child.type === \"keyword_argument\") {\n const nameNode = child.childForFieldName(\"name\");\n const valueNode = child.childForFieldName(\"value\");\n if (\n nameNode &&\n valueNode &&\n nameNode.text !== \"api_key\" &&\n nameNode.text !== \"project_api_key\"\n ) {\n const key = nameNode.text;\n let value = valueNode.text;\n if (valueNode.type === \"string\") {\n const content = valueNode.namedChildren.find(\n (c) => c.type === \"string_content\",\n );\n if (content) {\n value = content.text;\n }\n }\n configProperties.set(key, value);\n if (key === \"host\" || key === \"api_host\") {\n apiHost = value;\n }\n }\n }\n }\n }\n }\n\n results.push({\n token: cleanStringValue(tokenNode.text),\n tokenLine: tokenNode.startPosition.row,\n tokenStartCol: tokenNode.startPosition.column,\n tokenEndCol: tokenNode.endPosition.column,\n apiHost,\n configProperties,\n });\n }\n }\n\n const pyCtorQuery = pm.getQuery(lang, pyCtorQueryStr);\n if (pyCtorQuery) {\n for (const match of pyCtorQuery.matches(tree.rootNode)) {\n const classNode = getCapture(match.captures, \"class_name\");\n const tokenNode = getCapture(match.captures, \"token\");\n\n if (!classNode || !tokenNode) {\n continue;\n }\n if (!POSTHOG_CLASS_NAMES.has(classNode.text)) {\n continue;\n }\n\n // Extract keyword arguments for config\n const callNode = getCapture(match.captures, \"call\");\n const configProperties = new Map<string, string>();\n let apiHost: string | null = null;\n\n if (callNode) {\n const argsNode = callNode.childForFieldName(\"arguments\");\n if (argsNode) {\n for (const child of argsNode.namedChildren) {\n if (child.type === \"keyword_argument\") {\n const nameNode = child.childForFieldName(\"name\");\n const valueNode = child.childForFieldName(\"value\");\n if (nameNode && valueNode) {\n const key = nameNode.text;\n let value = valueNode.text;\n if (valueNode.type === \"string\") {\n const content = valueNode.namedChildren.find(\n (c) => c.type === \"string_content\",\n );\n if (content) {\n value = content.text;\n }\n }\n configProperties.set(key, value);\n if (key === \"host\" || key === \"api_host\") {\n apiHost = value;\n }\n }\n }\n }\n }\n }\n\n results.push({\n token: cleanStringValue(tokenNode.text),\n tokenLine: tokenNode.startPosition.row,\n tokenStartCol: tokenNode.startPosition.column,\n tokenEndCol: tokenNode.endPosition.column,\n apiHost,\n configProperties,\n });\n }\n }\n\n // Pattern 4: Go — posthog.New(\"phc_token\") or posthog.NewWithConfig(\"phc_token\", posthog.Config{Endpoint: \"...\"})\n const goCtorQueryStr = `\n (call_expression\n function: (selector_expression\n operand: (identifier) @pkg_name\n field: (field_identifier) @func_name)\n arguments: (argument_list\n (interpreted_string_literal) @token)) @call\n `;\n\n const goCtorQuery = pm.getQuery(lang, goCtorQueryStr);\n if (goCtorQuery) {\n for (const match of goCtorQuery.matches(tree.rootNode)) {\n const pkgNode = getCapture(match.captures, \"pkg_name\");\n const funcNode = getCapture(match.captures, \"func_name\");\n const tokenNode = getCapture(match.captures, \"token\");\n\n if (!pkgNode || !funcNode || !tokenNode) {\n continue;\n }\n if (pkgNode.text !== \"posthog\") {\n continue;\n }\n if (!GO_CONSTRUCTOR_NAMES.has(funcNode.text)) {\n continue;\n }\n\n const token = cleanStringValue(tokenNode.text);\n const line = tokenNode.startPosition.row;\n if (seenLines.has(line)) {\n continue;\n }\n seenLines.add(line);\n\n // Try to extract Endpoint from Config struct literal\n const configProperties = new Map<string, string>();\n let apiHost: string | null = null;\n\n const callNode = getCapture(match.captures, \"call\");\n if (callNode) {\n const argsNode = callNode.childForFieldName(\"arguments\");\n if (argsNode) {\n for (const arg of argsNode.namedChildren) {\n if (arg.type === \"composite_literal\") {\n const body = arg.childForFieldName(\"body\");\n if (body) {\n for (const elem of body.namedChildren) {\n if (elem.type === \"keyed_element\") {\n const children = elem.namedChildren;\n if (children.length >= 2) {\n const keyElem = children[0];\n const valElem = children[1];\n const keyId =\n keyElem.type === \"literal_element\"\n ? keyElem.namedChildren[0]?.text || keyElem.text\n : keyElem.text;\n const valText = cleanStringValue(valElem.text);\n if (keyId) {\n configProperties.set(keyId, valText);\n if (keyId === \"Endpoint\" || keyId === \"Host\") {\n apiHost = valText;\n }\n }\n }\n }\n }\n }\n }\n }\n }\n }\n\n results.push({\n token,\n tokenLine: tokenNode.startPosition.row,\n tokenStartCol: tokenNode.startPosition.column,\n tokenEndCol: tokenNode.endPosition.column,\n apiHost,\n configProperties,\n });\n }\n }\n\n // Pattern 5: Ruby — PostHog::Client.new(api_key: 'phc_token', host: '...')\n const rbCtorQueryStr = `\n (call\n receiver: (scope_resolution\n scope: (constant) @scope_name\n name: (constant) @class_name)\n method: (identifier) @method_name\n arguments: (argument_list\n (pair\n (hash_key_symbol) @kw_name\n (string (string_content) @token)))) @call\n `;\n const rbCtorQuery = pm.getQuery(lang, rbCtorQueryStr);\n if (rbCtorQuery) {\n for (const match of rbCtorQuery.matches(tree.rootNode)) {\n const scopeNode = getCapture(match.captures, \"scope_name\");\n const classNode = getCapture(match.captures, \"class_name\");\n const methodNode = getCapture(match.captures, \"method_name\");\n const kwNameNode = getCapture(match.captures, \"kw_name\");\n const tokenNode = getCapture(match.captures, \"token\");\n\n if (\n !scopeNode ||\n !classNode ||\n !methodNode ||\n !kwNameNode ||\n !tokenNode\n ) {\n continue;\n }\n if (!POSTHOG_CLASS_NAMES.has(scopeNode.text)) {\n continue;\n }\n if (classNode.text !== \"Client\") {\n continue;\n }\n if (methodNode.text !== \"new\") {\n continue;\n }\n if (kwNameNode.text !== \"api_key\") {\n continue;\n }\n\n const line = tokenNode.startPosition.row;\n if (seenLines.has(line)) {\n continue;\n }\n seenLines.add(line);\n\n // Extract other keyword args for config\n const callNode = getCapture(match.captures, \"call\");\n const configProperties = new Map<string, string>();\n let apiHost: string | null = null;\n\n if (callNode) {\n const argsNode = callNode.childForFieldName(\"arguments\");\n if (argsNode) {\n for (const child of argsNode.namedChildren) {\n if (child.type === \"pair\") {\n const keyN = child.namedChildren[0];\n const valueN = child.namedChildren[1];\n if (\n keyN?.type === \"hash_key_symbol\" &&\n valueN &&\n keyN.text !== \"api_key\"\n ) {\n const key = keyN.text;\n let value = valueN.text;\n if (valueN.type === \"string\") {\n const content = valueN.namedChildren.find(\n (c) => c.type === \"string_content\",\n );\n if (content) {\n value = content.text;\n }\n }\n configProperties.set(key, value);\n if (key === \"host\" || key === \"api_host\") {\n apiHost = value;\n }\n }\n }\n }\n }\n }\n\n results.push({\n token: cleanStringValue(tokenNode.text),\n tokenLine: tokenNode.startPosition.row,\n tokenStartCol: tokenNode.startPosition.column,\n tokenEndCol: tokenNode.endPosition.column,\n apiHost,\n configProperties,\n });\n }\n }\n\n return results;\n}\n\nfunction buildInitCall(\n tokenNode: Parser.SyntaxNode,\n configNode: Parser.SyntaxNode | undefined,\n): PostHogInitCall {\n const token = cleanStringValue(tokenNode.text);\n const configProperties = new Map<string, string>();\n let apiHost: string | null = null;\n\n if (configNode) {\n for (const child of configNode.namedChildren) {\n if (child.type === \"pair\") {\n const keyN = child.childForFieldName(\"key\");\n const valueN = child.childForFieldName(\"value\");\n if (keyN && valueN) {\n const key = keyN.text.replace(/['\"]/g, \"\");\n let value = valueN.text;\n if (valueN.type === \"string\") {\n const frag = valueN.namedChildren.find(\n (c) => c.type === \"string_fragment\",\n );\n if (frag) {\n value = frag.text;\n }\n }\n configProperties.set(key, value);\n if (key === \"api_host\" || key === \"host\") {\n apiHost = value;\n }\n }\n }\n }\n }\n\n return {\n token,\n tokenLine: tokenNode.startPosition.row,\n tokenStartCol: tokenNode.startPosition.column,\n tokenEndCol: tokenNode.endPosition.column,\n apiHost,\n configProperties,\n };\n}\n\nexport async function findFunctions(\n pm: ParserManager,\n source: string,\n languageId: string,\n): Promise<FunctionInfo[]> {\n const ready = await pm.ensureReady(languageId);\n if (!ready) {\n return [];\n }\n\n const { lang, family } = ready;\n const text = source;\n const tree = pm.parse(text, lang);\n if (!tree) {\n return [];\n }\n\n const query = pm.getQuery(lang, family.queries.functions);\n if (!query) {\n return [];\n }\n\n const functions: FunctionInfo[] = [];\n const matches = query.matches(tree.rootNode);\n\n for (const match of matches) {\n const nameNode = getCapture(match.captures, \"func_name\");\n const paramsNode = getCapture(match.captures, \"func_params\");\n const singleParamNode = getCapture(match.captures, \"func_single_param\");\n const bodyNode = getCapture(match.captures, \"func_body\");\n\n if (!nameNode || !bodyNode) {\n continue;\n }\n\n const name = nameNode.text;\n // Skip control flow keywords that might match method patterns\n if ([\"if\", \"for\", \"while\", \"switch\", \"catch\", \"else\"].includes(name)) {\n continue;\n }\n\n const params = singleParamNode\n ? [singleParamNode.text]\n : paramsNode\n ? extractParams(paramsNode.text)\n : [];\n\n const bodyLine = bodyNode.startPosition.row;\n const nextLineIdx = bodyLine + 1;\n const lines = text.split(\"\\n\");\n const nextLine = nextLineIdx < lines.length ? lines[nextLineIdx] : \"\";\n const bodyIndent = nextLine.match(/^(\\s*)/)?.[1] || \" \";\n\n functions.push({\n name,\n params,\n isComponent: /^[A-Z]/.test(name),\n bodyLine,\n bodyIndent,\n });\n }\n\n return functions;\n}\n\nexport async function findFlagAssignments(\n pm: ParserManager,\n source: string,\n languageId: string,\n): Promise<FlagAssignment[]> {\n const ready = await pm.ensureReady(languageId);\n if (!ready) {\n return [];\n }\n\n const { lang, family } = ready;\n const tree = pm.parse(source, lang);\n if (!tree) {\n return [];\n }\n\n const allClients = getEffectiveClients(pm.config);\n const { clientAliases } = findAliases(pm, lang, tree, family);\n for (const a of clientAliases) {\n allClients.add(a);\n }\n\n const assignments: FlagAssignment[] = [];\n\n const assignQuery = pm.getQuery(lang, family.queries.flagAssignments);\n if (assignQuery) {\n const matches = assignQuery.matches(tree.rootNode);\n for (const match of matches) {\n const varNode = getCapture(match.captures, \"var_name\");\n const clientNode = getCapture(match.captures, \"client\");\n const methodNode = getCapture(match.captures, \"method\");\n const keyNode = getCapture(match.captures, \"flag_key\");\n\n if (!varNode || !clientNode || !methodNode || !keyNode) {\n continue;\n }\n const varClientName = extractClientName(\n clientNode,\n pm.config.detectNestedClients,\n );\n if (!varClientName || !allClients.has(varClientName)) {\n continue;\n }\n\n const method = methodNode.text;\n if (!family.flagMethods.has(method)) {\n continue;\n }\n\n // Check if there's already a type annotation by looking at the parent\n // In TS: `const flag: boolean = ...` — the variable_declarator has a type_annotation child\n const declarator = varNode.parent;\n const hasTypeAnnotation = declarator\n ? declarator.namedChildren.some((c) => c.type === \"type_annotation\")\n : false;\n\n assignments.push({\n varName: varNode.text,\n method,\n flagKey: cleanStringValue(keyNode.text),\n line: varNode.startPosition.row,\n varNameEndCol: varNode.endPosition.column,\n hasTypeAnnotation,\n });\n }\n }\n\n return assignments;\n}\n","import { existsSync } from \"node:fs\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport Parser from \"web-tree-sitter\";\nimport type { LangFamily } from \"./languages.js\";\nimport { LANG_FAMILIES } from \"./languages.js\";\nimport { warn } from \"./log.js\";\nimport type { DetectionConfig } from \"./types.js\";\nimport { DEFAULT_CONFIG } from \"./types.js\";\n\nfunction resolveGrammarsDir(): string {\n const thisFile = fileURLToPath(import.meta.url);\n const dir = path.dirname(thisFile);\n const candidates = [\n path.join(dir, \"..\", \"grammars\"),\n path.join(dir, \"grammars\"),\n path.join(dir, \"..\", \"..\", \"grammars\"),\n ];\n return candidates.find((p) => existsSync(p)) ?? candidates[0];\n}\n\nexport class ParserManager {\n private parser: Parser | null = null;\n private languages = new Map<string, Parser.Language>();\n private queryCache = new Map<string, Parser.Query>();\n private maxCacheSize = 256;\n private initPromise: Promise<void> | null = null;\n private wasmDir = resolveGrammarsDir();\n config: DetectionConfig = DEFAULT_CONFIG;\n\n updateConfig(config: DetectionConfig): void {\n this.config = config;\n this.queryCache.clear();\n }\n\n private async ensureInitialized(): Promise<void> {\n if (!this.initPromise) {\n this.initPromise = this.doInit();\n }\n return this.initPromise;\n }\n\n private async doInit(): Promise<void> {\n try {\n await Parser.init({\n locateFile: (scriptName: string) => path.join(this.wasmDir, scriptName),\n });\n this.parser = new Parser();\n } catch (err) {\n this.initPromise = null;\n warn(\"Failed to initialize tree-sitter parser\", err);\n throw err;\n }\n }\n\n isSupported(langId: string): boolean {\n return langId in LANG_FAMILIES;\n }\n\n get supportedLanguages(): string[] {\n return Object.keys(LANG_FAMILIES);\n }\n\n async ensureReady(\n langId: string,\n ): Promise<{ lang: Parser.Language; family: LangFamily } | null> {\n await this.ensureInitialized();\n if (!this.parser) {\n return null;\n }\n\n const family = LANG_FAMILIES[langId];\n if (!family) {\n return null;\n }\n\n let lang = this.languages.get(family.wasm);\n if (!lang) {\n try {\n const wasmPath = path.join(this.wasmDir, family.wasm);\n lang = await Parser.Language.load(wasmPath);\n this.languages.set(family.wasm, lang);\n } catch (err) {\n warn(`Failed to load grammar ${family.wasm}`, err);\n return null;\n }\n }\n\n return { lang, family };\n }\n\n parse(text: string, lang: Parser.Language): Parser.Tree | null {\n if (!this.parser) {\n return null;\n }\n this.parser.setLanguage(lang);\n return this.parser.parse(text);\n }\n\n getQuery(lang: Parser.Language, queryStr: string): Parser.Query | null {\n if (!queryStr.trim()) {\n return null;\n }\n\n const cacheKey = `${lang.toString()}:${queryStr}`;\n let query = this.queryCache.get(cacheKey);\n if (query) {\n // LRU: move to end by deleting and re-inserting\n this.queryCache.delete(cacheKey);\n this.queryCache.set(cacheKey, query);\n return query;\n }\n\n try {\n query = lang.query(queryStr);\n // Evict oldest entry if at capacity\n if (this.queryCache.size >= this.maxCacheSize) {\n const oldest = this.queryCache.keys().next().value;\n if (oldest !== undefined) {\n this.queryCache.delete(oldest);\n }\n }\n this.queryCache.set(cacheKey, query);\n return query;\n } catch (err) {\n warn(\"Query compilation failed\", err);\n return null;\n }\n }\n\n dispose(): void {\n this.parser?.delete();\n this.parser = null;\n this.initPromise = null;\n this.languages.clear();\n this.queryCache.clear();\n }\n}\n","export interface DetectorLogger {\n warn(message: string, ...args: unknown[]): void;\n}\n\nconst noop: DetectorLogger = {\n warn() {},\n};\n\nlet current: DetectorLogger = noop;\n\nexport function setLogger(logger: DetectorLogger): void {\n current = logger;\n}\n\nexport function warn(message: string, ...args: unknown[]): void {\n current.warn(message, ...args);\n}\n","// ── Detection result types ──\n\nexport interface PostHogCall {\n method: string;\n key: string;\n line: number;\n keyStartCol: number;\n keyEndCol: number;\n /** True when the first argument is a non-literal expression (ternary, variable, etc.) */\n dynamic?: boolean;\n}\n\nexport interface FunctionInfo {\n name: string;\n params: string[];\n isComponent: boolean;\n bodyLine: number;\n bodyIndent: string;\n}\n\nexport interface VariantBranch {\n flagKey: string;\n variantKey: string;\n conditionLine: number;\n startLine: number;\n endLine: number;\n}\n\nexport interface FlagAssignment {\n varName: string;\n method: string;\n flagKey: string;\n line: number;\n varNameEndCol: number;\n hasTypeAnnotation: boolean;\n}\n\nexport interface PostHogInitCall {\n token: string;\n tokenLine: number;\n tokenStartCol: number;\n tokenEndCol: number;\n apiHost: string | null;\n configProperties: Map<string, string>;\n}\n\n// ── Detection configuration ──\n\nexport interface DetectionConfig {\n additionalClientNames: string[];\n additionalFlagFunctions: string[];\n detectNestedClients: boolean;\n onError?: (message: string, error?: unknown) => void;\n}\n\nexport const DEFAULT_CONFIG: DetectionConfig = {\n additionalClientNames: [],\n additionalFlagFunctions: [],\n detectNestedClients: true,\n};\n\n// ── Supported languages ──\n\nexport type SupportedLanguage =\n | \"javascript\"\n | \"javascriptreact\"\n | \"typescript\"\n | \"typescriptreact\"\n | \"python\"\n | \"go\"\n | \"ruby\";\n\n// ── PostHog entity types (for flag classification / stale detection) ──\n\nexport interface FeatureFlag {\n id: number;\n key: string;\n name: string;\n active: boolean;\n filters: Record<string, unknown>;\n created_at: string;\n created_by: { email: string; first_name: string } | null;\n deleted: boolean;\n}\n\nexport interface Experiment {\n id: number;\n name: string;\n description: string | null;\n start_date: string | null;\n end_date: string | null;\n feature_flag_key: string;\n created_at: string;\n created_by: { email: string; first_name: string } | null;\n metrics?: ExperimentMetric[];\n metrics_secondary?: ExperimentMetric[];\n parameters?: {\n feature_flag_variants?: { key: string; rollout_percentage: number }[];\n recommended_sample_size?: number;\n };\n conclusion?:\n | \"won\"\n | \"lost\"\n | \"inconclusive\"\n | \"stopped_early\"\n | \"invalid\"\n | null;\n conclusion_comment?: string | null;\n}\n\nexport interface ExperimentMetric {\n name: string;\n metric_type: \"funnel\" | \"mean\" | \"ratio\" | \"retention\";\n goal: \"increase\" | \"decrease\";\n uuid: string;\n}\n\nexport interface EventDefinition {\n id: string;\n name: string;\n description?: string | null;\n tags: string[];\n last_seen_at: string | null;\n verified?: boolean;\n hidden?: boolean;\n}\n\n// ── Stale flag types ──\n\nexport type StalenessReason =\n | \"fully_rolled_out\"\n | \"inactive\"\n | \"not_in_posthog\"\n | \"experiment_complete\";\n\nexport type FlagType = \"boolean\" | \"multivariate\" | \"remote_config\";\n\n// ── Enricher types ──\n\nexport interface CapturedEvent {\n name: string;\n line: number;\n dynamic: boolean;\n}\n\nexport interface FlagCheck {\n method: string;\n flagKey: string;\n line: number;\n}\n\nexport interface ListItem {\n type: \"event\" | \"flag\" | \"init\";\n line: number;\n name: string;\n method: string;\n detail?: string;\n}\n\nexport interface EnrichedListItem extends ListItem {\n flagType?: FlagType;\n staleness?: StalenessReason | null;\n rollout?: number | null;\n experimentName?: string | null;\n experimentStatus?: \"running\" | \"complete\" | null;\n verified?: boolean;\n description?: string | null;\n volume?: number;\n uniqueUsers?: number;\n lastSeenAt?: string | null;\n tags?: string[];\n}\n\nexport interface EventStats {\n volume?: number;\n uniqueUsers?: number;\n lastSeenAt?: string | null;\n}\n\nexport interface EnrichmentContext {\n flags?: Map<string, FeatureFlag>;\n experiments?: Experiment[];\n eventDefinitions?: Map<string, EventDefinition>;\n eventStats?: Map<string, EventStats>;\n stalenessOptions?: StalenessCheckOptions;\n}\n\nexport interface StalenessCheckOptions {\n staleFlagAgeDays?: number;\n}\n\nexport interface EnrichedFlag {\n flagKey: string;\n occurrences: FlagCheck[];\n flag: FeatureFlag | undefined;\n flagType: FlagType;\n staleness: StalenessReason | null;\n rollout: number | null;\n variants: { key: string; rollout_percentage: number }[];\n experiment: Experiment | undefined;\n}\n\nexport interface EnrichedEvent {\n eventName: string;\n occurrences: CapturedEvent[];\n definition: EventDefinition | undefined;\n verified: boolean;\n lastSeenAt: string | null;\n tags: string[];\n stats: EventStats | undefined;\n}\n\n// ── API configuration ──\n\nexport interface EnricherApiConfig {\n apiKey: string;\n host: string;\n projectId: number;\n /** Timeout in ms for each API request (default: 10 000). */\n timeoutMs?: number;\n}\n","import type Parser from \"web-tree-sitter\";\nimport {\n buildConstantMap,\n findAliases,\n getEffectiveClients,\n} from \"./alias-resolver.js\";\nimport {\n cleanStringValue,\n extractClientName,\n extractIdentifier,\n extractStringFromCaseValue,\n extractStringFromNode,\n getCapture,\n walkNodes,\n} from \"./ast-helpers.js\";\nimport type { LangFamily } from \"./languages.js\";\nimport type { ParserManager } from \"./parser-manager.js\";\nimport type { VariantBranch } from \"./types.js\";\n\nexport async function findVariantBranches(\n pm: ParserManager,\n source: string,\n languageId: string,\n): Promise<VariantBranch[]> {\n const ready = await pm.ensureReady(languageId);\n if (!ready) {\n return [];\n }\n\n const { lang, family } = ready;\n const tree = pm.parse(source, lang);\n if (!tree) {\n return [];\n }\n\n const allClients = getEffectiveClients(pm.config);\n const { clientAliases } = findAliases(pm, lang, tree, family);\n for (const a of clientAliases) {\n allClients.add(a);\n }\n\n const branches: VariantBranch[] = [];\n\n // 1. Find flag variable assignments: const variant = posthog.getFeatureFlag(\"key\")\n const assignQuery = pm.getQuery(lang, family.queries.flagAssignments);\n if (assignQuery) {\n const matches = assignQuery.matches(tree.rootNode);\n for (const match of matches) {\n const varNode = getCapture(match.captures, \"var_name\");\n const clientNode = getCapture(match.captures, \"client\");\n const methodNode = getCapture(match.captures, \"method\");\n const keyNode = getCapture(match.captures, \"flag_key\");\n const assignNode = getCapture(match.captures, \"assignment\");\n\n if (!varNode || !clientNode || !methodNode || !keyNode) {\n continue;\n }\n const varClientName = extractClientName(\n clientNode,\n pm.config.detectNestedClients,\n );\n if (!varClientName || !allClients.has(varClientName)) {\n continue;\n }\n\n const method = methodNode.text;\n if (!family.flagMethods.has(method)) {\n continue;\n }\n\n const varName = varNode.text;\n const flagKey = cleanStringValue(keyNode.text);\n const afterNode = assignNode ?? varNode;\n\n // Find if-chains and switches using this variable\n findIfChainsForVar(tree.rootNode, varName, flagKey, afterNode, branches);\n findSwitchForVar(tree.rootNode, varName, flagKey, afterNode, branches);\n }\n }\n\n // 1a. Resolve flag assignments with identifier arguments: const v = posthog.getFeatureFlag(MY_FLAG)\n const constantMap = buildConstantMap(pm, lang, tree);\n if (constantMap.size > 0) {\n let identAssignQueryStr: string;\n if (family.queries.rubyCaptureCalls !== undefined) {\n // Ruby: assignment with identifier or constant argument\n identAssignQueryStr = `\n (assignment\n left: (identifier) @var_name\n right: (call\n receiver: (_) @client\n method: (identifier) @method\n arguments: (argument_list . (identifier) @flag_id))) @assignment\n\n (assignment\n left: (identifier) @var_name\n right: (call\n receiver: (_) @client\n method: (identifier) @method\n arguments: (argument_list . (constant) @flag_id))) @assignment`;\n } else if (family.queries.pythonCaptureCalls !== undefined) {\n // Python: assignment with identifier argument\n identAssignQueryStr = `(expression_statement\n (assignment\n left: (identifier) @var_name\n right: (call\n function: (attribute\n object: (_) @client\n attribute: (identifier) @method)\n arguments: (argument_list . (identifier) @flag_id)))) @assignment`;\n } else {\n // JS: const/let/var with identifier argument\n identAssignQueryStr = `(lexical_declaration\n (variable_declarator\n name: (identifier) @var_name\n value: (call_expression\n function: (member_expression\n object: (_) @client\n property: (property_identifier) @method)\n arguments: (arguments . (identifier) @flag_id)))) @assignment\n\n (lexical_declaration\n (variable_declarator\n name: (identifier) @var_name\n value: (await_expression\n (call_expression\n function: (member_expression\n object: (_) @client\n property: (property_identifier) @method)\n arguments: (arguments . (identifier) @flag_id))))) @assignment\n\n (variable_declaration\n (variable_declarator\n name: (identifier) @var_name\n value: (call_expression\n function: (member_expression\n object: (_) @client\n property: (property_identifier) @method)\n arguments: (arguments . (identifier) @flag_id)))) @assignment\n\n (variable_declaration\n (variable_declarator\n name: (identifier) @var_name\n value: (await_expression\n (call_expression\n function: (member_expression\n object: (_) @client\n property: (property_identifier) @method)\n arguments: (arguments . (identifier) @flag_id))))) @assignment`;\n }\n const identAssignQuery = pm.getQuery(lang, identAssignQueryStr);\n if (identAssignQuery) {\n const matches = identAssignQuery.matches(tree.rootNode);\n for (const match of matches) {\n const varNode = getCapture(match.captures, \"var_name\");\n const clientNode = getCapture(match.captures, \"client\");\n const methodNode = getCapture(match.captures, \"method\");\n const argNode = getCapture(match.captures, \"flag_id\");\n const assignNode = getCapture(match.captures, \"assignment\");\n\n if (!varNode || !clientNode || !methodNode || !argNode) {\n continue;\n }\n const varClientName = extractClientName(\n clientNode,\n pm.config.detectNestedClients,\n );\n if (!varClientName || !allClients.has(varClientName)) {\n continue;\n }\n if (!family.flagMethods.has(methodNode.text)) {\n continue;\n }\n\n const resolved = constantMap.get(argNode.text);\n if (!resolved) {\n continue;\n }\n\n const varName = varNode.text;\n const afterNode = assignNode ?? varNode;\n findIfChainsForVar(\n tree.rootNode,\n varName,\n resolved,\n afterNode,\n branches,\n );\n findSwitchForVar(tree.rootNode, varName, resolved, afterNode, branches);\n }\n }\n }\n\n // 1b. Find bare function call assignments: const x = useFeatureFlag(\"key\")\n const bareFlagFunctions = new Set([\n ...pm.config.additionalFlagFunctions,\n \"useFeatureFlag\",\n \"useFeatureFlagPayload\",\n \"useFeatureFlagVariantKey\",\n ]);\n if (bareFlagFunctions.size > 0 && family.queries.bareFunctionCalls) {\n const bareAssignQueryStr =\n family.queries.pythonCaptureCalls !== undefined\n ? // Python: bare function assignment\n `(expression_statement\n (assignment\n left: (identifier) @var_name\n right: (call\n function: (identifier) @func_name\n arguments: (argument_list . (string (string_content) @flag_key))))) @assignment`\n : // JS: const/let/var bare function assignment\n `(lexical_declaration\n (variable_declarator\n name: (identifier) @var_name\n value: (call_expression\n function: (identifier) @func_name\n arguments: (arguments . (string (string_fragment) @flag_key))))) @assignment\n\n (variable_declaration\n (variable_declarator\n name: (identifier) @var_name\n value: (call_expression\n function: (identifier) @func_name\n arguments: (arguments . (string (string_fragment) @flag_key))))) @assignment`;\n const bareAssignQuery = pm.getQuery(lang, bareAssignQueryStr);\n if (bareAssignQuery) {\n const matches = bareAssignQuery.matches(tree.rootNode);\n for (const match of matches) {\n const varNode = getCapture(match.captures, \"var_name\");\n const funcNode = getCapture(match.captures, \"func_name\");\n const keyNode = getCapture(match.captures, \"flag_key\");\n const assignNode = getCapture(match.captures, \"assignment\");\n\n if (!varNode || !funcNode || !keyNode) {\n continue;\n }\n if (!bareFlagFunctions.has(funcNode.text)) {\n continue;\n }\n\n const varName = varNode.text;\n const flagKey = cleanStringValue(keyNode.text);\n const afterNode = assignNode ?? varNode;\n\n findIfChainsForVar(\n tree.rootNode,\n varName,\n flagKey,\n afterNode,\n branches,\n );\n findSwitchForVar(tree.rootNode, varName, flagKey, afterNode, branches);\n }\n }\n }\n\n // 2. Find inline flag checks: if (posthog.getFeatureFlag(\"key\") === \"variant\")\n const detectNested = pm.config.detectNestedClients;\n findInlineFlagIfs(tree.rootNode, allClients, family, branches, detectNested);\n\n // 3. Find isFeatureEnabled checks: if (posthog.isFeatureEnabled(\"key\"))\n findEnabledIfs(tree.rootNode, allClients, family, branches, detectNested);\n\n return branches;\n}\n\n// ── Variant detection helpers ──\n\nfunction findIfChainsForVar(\n _root: Parser.SyntaxNode,\n varName: string,\n flagKey: string,\n afterNode: Parser.SyntaxNode,\n branches: VariantBranch[],\n): void {\n // Find the containing scope\n const scope = afterNode.parent;\n if (!scope) {\n return;\n }\n\n let foundAssignment = false;\n for (const child of scope.namedChildren) {\n if (\n child.startIndex >= afterNode.startIndex &&\n child.endIndex >= afterNode.endIndex\n ) {\n foundAssignment = true;\n }\n if (!foundAssignment) {\n continue;\n }\n if (child === afterNode) {\n continue;\n }\n\n // JS/Go: if_statement, Ruby: if\n if (child.type === \"if_statement\" || child.type === \"if\") {\n extractIfChainBranches(child, varName, flagKey, branches);\n }\n }\n}\n\nfunction extractIfChainBranches(\n ifNode: Parser.SyntaxNode,\n varName: string,\n flagKey: string,\n branches: VariantBranch[],\n): void {\n const condition = ifNode.childForFieldName(\"condition\");\n const consequence = ifNode.childForFieldName(\"consequence\");\n const alternative = ifNode.childForFieldName(\"alternative\");\n\n if (!condition || !consequence) {\n return;\n }\n\n // Only process if the condition actually references the tracked variable\n if (\n !new RegExp(`\\\\b${varName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}\\\\b`).test(\n condition.text,\n )\n ) {\n return;\n }\n\n let variant = extractComparison(condition, varName);\n\n // Truthiness check: if (varName) or if (!varName)\n if (variant === null) {\n const isTruthinessCheck = isTruthinessCheckForVar(condition, varName);\n if (isTruthinessCheck) {\n const negated = isNegated(condition);\n variant = negated ? \"false\" : \"true\";\n }\n }\n\n if (variant === null) {\n return;\n }\n\n branches.push({\n flagKey,\n variantKey: variant,\n conditionLine: ifNode.startPosition.row,\n startLine: ifNode.startPosition.row,\n endLine: consequence.endPosition.row,\n });\n\n if (alternative) {\n // Python: elif_clause, Ruby: elsif — has condition, consequence, alternative\n if (alternative.type === \"elif_clause\" || alternative.type === \"elsif\") {\n extractIfChainBranches(alternative, varName, flagKey, branches);\n } else if (alternative.type === \"else_clause\") {\n // JS else_clause may wrap an if_statement (else if). Recurse if so.\n // Otherwise treat as terminal else (Python: body field; JS: statement_block).\n const innerIf = alternative.namedChildren.find(\n (c) => c.type === \"if_statement\",\n );\n if (innerIf) {\n extractIfChainBranches(innerIf, varName, flagKey, branches);\n } else {\n const body =\n alternative.childForFieldName(\"body\") || alternative.namedChildren[0];\n if (body) {\n const elseVariant =\n variant === \"true\"\n ? \"false\"\n : variant === \"false\"\n ? \"true\"\n : \"else\";\n branches.push({\n flagKey,\n variantKey: elseVariant,\n conditionLine: alternative.startPosition.row,\n startLine: alternative.startPosition.row,\n endLine: body.endPosition.row,\n });\n }\n }\n } else if (alternative.type === \"if_statement\") {\n // Go: else if — alternative is directly an if_statement\n extractIfChainBranches(alternative, varName, flagKey, branches);\n } else if (alternative.type === \"block\") {\n // Go: else { ... } — alternative is directly a block\n const elseVariant =\n variant === \"true\" ? \"false\" : variant === \"false\" ? \"true\" : \"else\";\n branches.push({\n flagKey,\n variantKey: elseVariant,\n conditionLine: alternative.startPosition.row,\n startLine: alternative.startPosition.row,\n endLine: alternative.endPosition.row,\n });\n } else if (alternative.type === \"else\") {\n // Ruby: else — children are direct statements (no body field)\n const lastChild =\n alternative.namedChildren[alternative.namedChildren.length - 1] ||\n alternative;\n const elseVariant =\n variant === \"true\" ? \"false\" : variant === \"false\" ? \"true\" : \"else\";\n branches.push({\n flagKey,\n variantKey: elseVariant,\n conditionLine: alternative.startPosition.row,\n startLine: alternative.startPosition.row,\n endLine: lastChild.endPosition.row,\n });\n }\n }\n}\n\nfunction findSwitchForVar(\n _root: Parser.SyntaxNode,\n varName: string,\n flagKey: string,\n afterNode: Parser.SyntaxNode,\n branches: VariantBranch[],\n): void {\n const scope = afterNode.parent;\n if (!scope) {\n return;\n }\n\n let foundAssignment = false;\n for (const child of scope.namedChildren) {\n if (child.startIndex >= afterNode.startIndex) {\n foundAssignment = true;\n }\n if (!foundAssignment || child === afterNode) {\n continue;\n }\n\n // JS/TS: switch_statement, Go: expression_switch_statement\n if (\n child.type === \"switch_statement\" ||\n child.type === \"expression_switch_statement\"\n ) {\n const value = child.childForFieldName(\"value\");\n if (!value) {\n continue;\n }\n\n // Check if switch is on our variable\n const switchedVar = extractIdentifier(value);\n if (switchedVar !== varName) {\n continue;\n }\n\n // JS/TS: cases are inside a 'body' (switch_body) node\n // Go: cases are direct children of the switch node\n const caseContainer = child.childForFieldName(\"body\") || child;\n\n for (const caseNode of caseContainer.namedChildren) {\n // JS/TS: switch_case, Go: expression_case\n if (\n caseNode.type === \"switch_case\" ||\n caseNode.type === \"expression_case\"\n ) {\n const caseValue = caseNode.childForFieldName(\"value\");\n const variantKey = caseValue\n ? extractStringFromCaseValue(caseValue)\n : null;\n\n // Get the body range: from case line to before next case or end of switch\n const nextSibling = caseNode.nextNamedSibling;\n const endLine = nextSibling\n ? nextSibling.startPosition.row - 1\n : caseContainer.endPosition.row - 1;\n\n branches.push({\n flagKey,\n variantKey: variantKey || \"default\",\n conditionLine: caseNode.startPosition.row,\n startLine: caseNode.startPosition.row,\n endLine,\n });\n // JS/TS: switch_default, Go: default_case\n } else if (\n caseNode.type === \"switch_default\" ||\n caseNode.type === \"default_case\"\n ) {\n const nextSibling = caseNode.nextNamedSibling;\n const endLine = nextSibling\n ? nextSibling.startPosition.row - 1\n : caseContainer.endPosition.row - 1;\n\n branches.push({\n flagKey,\n variantKey: \"default\",\n conditionLine: caseNode.startPosition.row,\n startLine: caseNode.startPosition.row,\n endLine,\n });\n }\n }\n }\n\n // Ruby: case/when/else\n if (child.type === \"case\") {\n const value = child.namedChildren[0]; // First named child is the matched expression\n if (!value || value.type === \"when\") {\n continue;\n } // case without value\n\n const switchedVar = extractIdentifier(value);\n if (switchedVar !== varName) {\n continue;\n }\n\n for (const caseChild of child.namedChildren) {\n if (caseChild.type === \"when\") {\n // when has pattern children and a body (then)\n const patterns = caseChild.namedChildren.filter(\n (c) => c.type === \"pattern\",\n );\n const body = caseChild.childForFieldName(\"body\");\n const firstPattern = patterns[0];\n const patternStr = firstPattern?.namedChildren[0];\n const variantKey = patternStr\n ? extractStringFromNode(patternStr)\n : null;\n\n const endLine = body\n ? body.endPosition.row\n : caseChild.endPosition.row;\n\n branches.push({\n flagKey,\n variantKey: variantKey || \"default\",\n conditionLine: caseChild.startPosition.row,\n startLine: caseChild.startPosition.row,\n endLine,\n });\n } else if (caseChild.type === \"else\") {\n const lastChild =\n caseChild.namedChildren[caseChild.namedChildren.length - 1] ||\n caseChild;\n branches.push({\n flagKey,\n variantKey: \"default\",\n conditionLine: caseChild.startPosition.row,\n startLine: caseChild.startPosition.row,\n endLine: lastChild.endPosition.row,\n });\n }\n }\n }\n }\n}\n\nfunction findInlineFlagIfs(\n root: Parser.SyntaxNode,\n clients: Set<string>,\n family: LangFamily,\n branches: VariantBranch[],\n detectNested: boolean,\n): void {\n // Walk all if_statements (JS/Go) and if nodes (Ruby) for inline flag comparisons\n const ifTypes = [\"if_statement\", \"if\"];\n for (const ifType of ifTypes) {\n walkNodes(root, ifType, (ifNode) => {\n const condition = ifNode.childForFieldName(\"condition\");\n const consequence = ifNode.childForFieldName(\"consequence\");\n if (!condition || !consequence) {\n return;\n }\n\n // Look for: getFeatureFlag(\"key\") === \"variant\"\n const callInfo = extractFlagCallComparison(\n condition,\n clients,\n family,\n detectNested,\n );\n if (!callInfo) {\n return;\n }\n\n branches.push({\n flagKey: callInfo.flagKey,\n variantKey: callInfo.variant,\n conditionLine: ifNode.startPosition.row,\n startLine: ifNode.startPosition.row,\n endLine: consequence.endPosition.row,\n });\n\n // Process else chain\n const alternative = ifNode.childForFieldName(\"alternative\");\n if (alternative) {\n // Python: elif_clause, Ruby: elsif\n if (\n alternative.type === \"elif_clause\" ||\n alternative.type === \"elsif\"\n ) {\n // walkNodes will find it via recursive walking\n } else if (alternative.type === \"else_clause\") {\n // JS else_clause may wrap another if_statement (else if).\n // Skip the else label in that case — walkNodes will visit the inner if.\n const innerIf = alternative.namedChildren.find(\n (c) => c.type === \"if_statement\",\n );\n if (!innerIf) {\n const body =\n alternative.childForFieldName(\"body\") ||\n alternative.namedChildren[0];\n if (body) {\n branches.push({\n flagKey: callInfo.flagKey,\n variantKey: \"else\",\n conditionLine: alternative.startPosition.row,\n startLine: alternative.startPosition.row,\n endLine: body.endPosition.row,\n });\n }\n }\n } else if (alternative.type === \"if_statement\") {\n // Go: else if — alternative is directly an if_statement (handled by walkNodes)\n } else if (alternative.type === \"block\") {\n // Go: else { ... } — alternative is directly a block\n branches.push({\n flagKey: callInfo.flagKey,\n variantKey: \"else\",\n conditionLine: alternative.startPosition.row,\n startLine: alternative.startPosition.row,\n endLine: alternative.endPosition.row,\n });\n } else if (alternative.type === \"else\") {\n // Ruby: else — children are direct statements\n const lastChild =\n alternative.namedChildren[alternative.namedChildren.length - 1] ||\n alternative;\n branches.push({\n flagKey: callInfo.flagKey,\n variantKey: \"else\",\n conditionLine: alternative.startPosition.row,\n startLine: alternative.startPosition.row,\n endLine: lastChild.endPosition.row,\n });\n }\n }\n });\n }\n\n // Python: also walk elif_clause nodes for inline flag comparisons\n walkNodes(root, \"elif_clause\", (elifNode) => {\n const condition = elifNode.childForFieldName(\"condition\");\n const consequence = elifNode.childForFieldName(\"consequence\");\n if (!condition || !consequence) {\n return;\n }\n\n const callInfo = extractFlagCallComparison(\n condition,\n clients,\n family,\n detectNested,\n );\n if (!callInfo) {\n return;\n }\n\n branches.push({\n flagKey: callInfo.flagKey,\n variantKey: callInfo.variant,\n conditionLine: elifNode.startPosition.row,\n startLine: elifNode.startPosition.row,\n endLine: consequence.endPosition.row,\n });\n\n const alternative = elifNode.childForFieldName(\"alternative\");\n if (alternative) {\n if (alternative.type === \"else_clause\") {\n const body =\n alternative.childForFieldName(\"body\") || alternative.namedChildren[0];\n if (body) {\n branches.push({\n flagKey: callInfo.flagKey,\n variantKey: \"else\",\n conditionLine: alternative.startPosition.row,\n startLine: alternative.startPosition.row,\n endLine: body.endPosition.row,\n });\n }\n }\n // elif_clause chaining: will be handled by walking all elif_clause nodes\n }\n });\n}\n\nfunction findEnabledIfs(\n root: Parser.SyntaxNode,\n clients: Set<string>,\n family: LangFamily,\n branches: VariantBranch[],\n detectNested: boolean,\n): void {\n const enabledIfTypes = [\"if_statement\", \"if\"];\n for (const ifType of enabledIfTypes) {\n walkNodes(root, ifType, (ifNode) => {\n const condition = ifNode.childForFieldName(\"condition\");\n const consequence = ifNode.childForFieldName(\"consequence\");\n if (!condition || !consequence) {\n return;\n }\n\n const flagKey = extractEnabledCall(\n condition,\n clients,\n family,\n detectNested,\n );\n if (!flagKey) {\n return;\n }\n\n // Check for negation\n const negated = isNegated(condition);\n\n branches.push({\n flagKey,\n variantKey: negated ? \"false\" : \"true\",\n conditionLine: ifNode.startPosition.row,\n startLine: ifNode.startPosition.row,\n endLine: consequence.endPosition.row,\n });\n\n const alternative = ifNode.childForFieldName(\"alternative\");\n if (alternative) {\n // Python: elif_clause, Ruby: elsif\n if (\n alternative.type === \"elif_clause\" ||\n alternative.type === \"elsif\"\n ) {\n // Handled by walk below\n } else if (alternative.type === \"else_clause\") {\n // JS else_clause may wrap another if_statement (else if).\n // Skip the else label in that case — walkNodes will visit the inner if.\n const innerIf = alternative.namedChildren.find(\n (c) => c.type === \"if_statement\",\n );\n if (!innerIf) {\n const body =\n alternative.childForFieldName(\"body\") ||\n alternative.namedChildren[0];\n if (body) {\n branches.push({\n flagKey,\n variantKey: negated ? \"true\" : \"false\",\n conditionLine: alternative.startPosition.row,\n startLine: alternative.startPosition.row,\n endLine: body.endPosition.row,\n });\n }\n }\n } else if (alternative.type === \"block\") {\n // Go: else { ... } — alternative is directly a block\n branches.push({\n flagKey,\n variantKey: negated ? \"true\" : \"false\",\n conditionLine: alternative.startPosition.row,\n startLine: alternative.startPosition.row,\n endLine: alternative.endPosition.row,\n });\n } else if (alternative.type === \"else\") {\n // Ruby: else — children are direct statements\n const lastChild =\n alternative.namedChildren[alternative.namedChildren.length - 1] ||\n alternative;\n branches.push({\n flagKey,\n variantKey: negated ? \"true\" : \"false\",\n conditionLine: alternative.startPosition.row,\n startLine: alternative.startPosition.row,\n endLine: lastChild.endPosition.row,\n });\n }\n }\n });\n }\n\n // Python/Ruby: also walk elif_clause/elsif nodes for enabled checks\n const elifTypes = [\"elif_clause\", \"elsif\"];\n for (const elifType of elifTypes) {\n walkNodes(root, elifType, (elifNode) => {\n const condition = elifNode.childForFieldName(\"condition\");\n const consequence = elifNode.childForFieldName(\"consequence\");\n if (!condition || !consequence) {\n return;\n }\n\n const flagKey = extractEnabledCall(\n condition,\n clients,\n family,\n detectNested,\n );\n if (!flagKey) {\n return;\n }\n\n const negated = isNegated(condition);\n\n branches.push({\n flagKey,\n variantKey: negated ? \"false\" : \"true\",\n conditionLine: elifNode.startPosition.row,\n startLine: elifNode.startPosition.row,\n endLine: consequence.endPosition.row,\n });\n\n const alternative = elifNode.childForFieldName(\"alternative\");\n if (alternative) {\n if (alternative.type === \"else_clause\") {\n const body =\n alternative.childForFieldName(\"body\") ||\n alternative.namedChildren[0];\n if (body) {\n branches.push({\n flagKey,\n variantKey: negated ? \"true\" : \"false\",\n conditionLine: alternative.startPosition.row,\n startLine: alternative.startPosition.row,\n endLine: body.endPosition.row,\n });\n }\n } else if (alternative.type === \"else\") {\n // Ruby: else\n const lastChild =\n alternative.namedChildren[alternative.namedChildren.length - 1] ||\n alternative;\n branches.push({\n flagKey,\n variantKey: negated ? \"true\" : \"false\",\n conditionLine: alternative.startPosition.row,\n startLine: alternative.startPosition.row,\n endLine: lastChild.endPosition.row,\n });\n }\n }\n });\n }\n}\n\n// ── Node extraction helpers ──\n\nfunction extractComparison(\n conditionNode: Parser.SyntaxNode,\n varName: string,\n): string | null {\n // Unwrap parenthesized_expression\n let node = conditionNode;\n while (\n node.type === \"parenthesized_expression\" &&\n node.namedChildren.length === 1\n ) {\n node = node.namedChildren[0];\n }\n\n // JS/Go: binary_expression, Ruby: binary\n if (node.type === \"binary_expression\" || node.type === \"binary\") {\n const left = node.childForFieldName(\"left\");\n const right = node.childForFieldName(\"right\");\n const op = node.childForFieldName(\"operator\");\n\n if (!left || !right) {\n return null;\n }\n\n const opText = op?.text || \"\";\n if (\n opText !== \"===\" &&\n opText !== \"==\" &&\n opText !== \"!==\" &&\n opText !== \"!=\"\n ) {\n return null;\n }\n\n if (left.text === varName) {\n return extractStringFromNode(right);\n }\n if (right.text === varName) {\n return extractStringFromNode(left);\n }\n }\n\n // Python: comparison_operator (e.g. `flag == \"variant\"`)\n if (node.type === \"comparison_operator\") {\n const children = node.namedChildren;\n // comparison_operator has: left_operand, operator(s), right_operand(s)\n // For simple `a == b`, children are [a, b] with operator tokens between\n if (children.length >= 2) {\n const left = children[0];\n const right = children[children.length - 1];\n // Check the operator text between operands\n const fullText = node.text;\n if (fullText.includes(\"==\") || fullText.includes(\"!=\")) {\n if (left.text === varName) {\n return extractStringFromNode(right);\n }\n if (right.text === varName) {\n return extractStringFromNode(left);\n }\n }\n }\n }\n\n return null;\n}\n\nfunction extractFlagCallComparison(\n conditionNode: Parser.SyntaxNode,\n clients: Set<string>,\n family: LangFamily,\n detectNested: boolean,\n): { flagKey: string; variant: string } | null {\n let node = conditionNode;\n while (\n node.type === \"parenthesized_expression\" &&\n node.namedChildren.length === 1\n ) {\n node = node.namedChildren[0];\n }\n\n let left: Parser.SyntaxNode | null = null;\n let right: Parser.SyntaxNode | null = null;\n\n // JS/Go: binary_expression, Ruby: binary, Python: comparison_operator\n if (node.type === \"binary_expression\" || node.type === \"binary\") {\n left = node.childForFieldName(\"left\");\n right = node.childForFieldName(\"right\");\n } else if (node.type === \"comparison_operator\") {\n // Python: comparison_operator children are [left_operand, right_operand]\n const children = node.namedChildren;\n if (children.length >= 2) {\n left = children[0];\n right = children[children.length - 1];\n }\n }\n\n if (!left || !right) {\n return null;\n }\n\n // Check if left is a posthog.getFeatureFlag(\"key\") call\n const callTypes = new Set([\"call_expression\", \"call\"]);\n const callNode = callTypes.has(left.type)\n ? left\n : callTypes.has(right.type)\n ? right\n : null;\n const valueNode = callNode === left ? right : left;\n if (!callNode || !valueNode) {\n return null;\n }\n\n let obj: Parser.SyntaxNode | null = null;\n let prop: Parser.SyntaxNode | null = null;\n\n const func = callNode.childForFieldName(\"function\");\n if (\n func &&\n (func.type === \"member_expression\" ||\n func.type === \"attribute\" ||\n func.type === \"selector_expression\")\n ) {\n obj = func.childForFieldName(\"object\") || func.childForFieldName(\"operand\");\n prop =\n func.childForFieldName(\"property\") ||\n func.childForFieldName(\"attribute\") ||\n func.childForFieldName(\"field\");\n } else {\n // Ruby: call has receiver + method as separate fields\n obj = callNode.childForFieldName(\"receiver\");\n prop = callNode.childForFieldName(\"method\");\n }\n if (!obj || !prop) {\n return null;\n }\n const extractedClient = extractClientName(obj, detectNested);\n if (!extractedClient || !clients.has(extractedClient)) {\n return null;\n }\n\n const method = prop.text;\n // Only match getFeatureFlag-like methods (not isFeatureEnabled which returns bool)\n const flagGetters = new Set(\n [...family.flagMethods].filter(\n (m) =>\n m.toLowerCase().includes(\"get\") || m.toLowerCase().includes(\"flag\"),\n ),\n );\n if (!flagGetters.has(method)) {\n return null;\n }\n\n const args = callNode.childForFieldName(\"arguments\");\n if (!args) {\n return null;\n }\n const firstArg = args.namedChildren[0];\n if (!firstArg) {\n return null;\n }\n\n const flagKey = extractStringFromNode(firstArg);\n const variant = extractStringFromNode(valueNode);\n if (!flagKey || !variant) {\n return null;\n }\n\n return { flagKey, variant };\n}\n\nfunction extractEnabledCall(\n conditionNode: Parser.SyntaxNode,\n clients: Set<string>,\n family: LangFamily,\n detectNested: boolean,\n): string | null {\n let node = conditionNode;\n // Unwrap parenthesized_expression and unary ! (negation)\n while (\n node.type === \"parenthesized_expression\" &&\n node.namedChildren.length === 1\n ) {\n node = node.namedChildren[0];\n }\n // JS: unary_expression, Python: not_operator, Ruby: unary\n if (\n node.type === \"unary_expression\" ||\n node.type === \"not_operator\" ||\n node.type === \"unary\"\n ) {\n const operand =\n node.childForFieldName(\"operand\") ||\n node.namedChildren[node.namedChildren.length - 1];\n if (operand) {\n node = operand;\n }\n }\n while (\n node.type === \"parenthesized_expression\" &&\n node.namedChildren.length === 1\n ) {\n node = node.namedChildren[0];\n }\n\n if (node.type !== \"call_expression\" && node.type !== \"call\") {\n return null;\n }\n\n let clientName: string | undefined;\n let methodName: string | undefined;\n\n const func = node.childForFieldName(\"function\");\n if (func) {\n if (\n func.type === \"member_expression\" ||\n func.type === \"attribute\" ||\n func.type === \"selector_expression\"\n ) {\n const obj =\n func.childForFieldName(\"object\") || func.childForFieldName(\"operand\");\n const prop =\n func.childForFieldName(\"property\") ||\n func.childForFieldName(\"attribute\") ||\n func.childForFieldName(\"field\");\n clientName = obj\n ? (extractClientName(obj, detectNested) ?? undefined)\n : undefined;\n methodName = prop?.text;\n }\n } else {\n // Ruby: call has receiver + method as separate fields\n const receiver = node.childForFieldName(\"receiver\");\n const method = node.childForFieldName(\"method\");\n if (receiver && method) {\n clientName = extractClientName(receiver, detectNested) ?? undefined;\n methodName = method.text;\n }\n }\n\n if (!clientName || !methodName || !clients.has(clientName)) {\n return null;\n }\n\n // Match isFeatureEnabled-like methods\n const enabledMethods = new Set(\n [...family.flagMethods].filter(\n (m) =>\n m.toLowerCase().includes(\"enabled\") ||\n m.toLowerCase().includes(\"is_feature\"),\n ),\n );\n if (!enabledMethods.has(methodName)) {\n return null;\n }\n\n const args = node.childForFieldName(\"arguments\");\n if (!args) {\n return null;\n }\n const firstArg = args.namedChildren[0];\n return firstArg ? extractStringFromNode(firstArg) : null;\n}\n\nfunction isNegated(conditionNode: Parser.SyntaxNode): boolean {\n let node = conditionNode;\n while (\n node.type === \"parenthesized_expression\" &&\n node.namedChildren.length === 1\n ) {\n node = node.namedChildren[0];\n }\n // JS: unary_expression, Python: not_operator, Ruby: unary\n return (\n (node.type === \"unary_expression\" && node.text.startsWith(\"!\")) ||\n node.type === \"not_operator\" ||\n (node.type === \"unary\" && node.text.startsWith(\"!\"))\n );\n}\n\n/** Check if a condition is a simple truthiness check on a variable: `if (varName)` or `if (!varName)` */\nfunction isTruthinessCheckForVar(\n conditionNode: Parser.SyntaxNode,\n varName: string,\n): boolean {\n let node = conditionNode;\n while (\n node.type === \"parenthesized_expression\" &&\n node.namedChildren.length === 1\n ) {\n node = node.namedChildren[0];\n }\n // if (varName)\n if (node.type === \"identifier\" && node.text === varName) {\n return true;\n }\n // if (!varName) — JS: unary_expression, Python: not_operator, Ruby: unary\n if (\n (node.type === \"unary_expression\" ||\n node.type === \"not_operator\" ||\n node.type === \"unary\") &&\n node.namedChildren.length > 0\n ) {\n let inner = node.namedChildren[node.namedChildren.length - 1];\n while (\n inner.type === \"parenthesized_expression\" &&\n inner.namedChildren.length === 1\n ) {\n inner = inner.namedChildren[0];\n }\n if (inner.type === \"identifier\" && inner.text === varName) {\n return true;\n }\n }\n return false;\n}\n\n/** Build a map of const/let/var identifier → string value from the file */\n","import {\n findFlagAssignments as _findFlagAssignments,\n findFunctions as _findFunctions,\n findInitCalls as _findInitCalls,\n findPostHogCalls as _findPostHogCalls,\n} from \"./call-detector.js\";\nimport { ParserManager } from \"./parser-manager.js\";\nimport type {\n DetectionConfig,\n FlagAssignment,\n FunctionInfo,\n PostHogCall,\n PostHogInitCall,\n VariantBranch,\n} from \"./types.js\";\nimport { findVariantBranches as _findVariantBranches } from \"./variant-detector.js\";\n\nexport class PostHogDetector {\n private pm = new ParserManager();\n\n updateConfig(config: DetectionConfig): void {\n this.pm.updateConfig(config);\n }\n\n isSupported(langId: string): boolean {\n return this.pm.isSupported(langId);\n }\n\n get supportedLanguages(): string[] {\n return this.pm.supportedLanguages;\n }\n\n async findPostHogCalls(\n source: string,\n languageId: string,\n ): Promise<PostHogCall[]> {\n return _findPostHogCalls(this.pm, source, languageId);\n }\n\n async findInitCalls(\n source: string,\n languageId: string,\n ): Promise<PostHogInitCall[]> {\n return _findInitCalls(this.pm, source, languageId);\n }\n\n async findFunctions(\n source: string,\n languageId: string,\n ): Promise<FunctionInfo[]> {\n return _findFunctions(this.pm, source, languageId);\n }\n\n async findVariantBranches(\n source: string,\n languageId: string,\n ): Promise<VariantBranch[]> {\n return _findVariantBranches(this.pm, source, languageId);\n }\n\n async findFlagAssignments(\n source: string,\n languageId: string,\n ): Promise<FlagAssignment[]> {\n return _findFlagAssignments(this.pm, source, languageId);\n }\n\n dispose(): void {\n this.pm.dispose();\n }\n}\n","import type { FeatureFlag, FlagType } from \"./types.js\";\n\n/** Classify a flag as boolean release, multivariate, or remote config */\nexport function classifyFlagType(flag: FeatureFlag | undefined): FlagType {\n if (!flag) {\n return \"boolean\";\n }\n const filters = flag.filters as Record<string, unknown> | undefined;\n if (filters?.multivariate && typeof filters.multivariate === \"object\") {\n const mv = filters.multivariate as { variants?: unknown[] };\n if (mv.variants && mv.variants.length > 0) {\n return \"multivariate\";\n }\n }\n if (filters?.payloads && typeof filters.payloads === \"object\") {\n const payloads = filters.payloads as Record<string, unknown>;\n if (Object.values(payloads).some((v) => v !== null && v !== undefined)) {\n return \"remote_config\";\n }\n }\n return \"boolean\";\n}\n\n/** Check if a flag is fully rolled out (100%, no conditions, no multivariate) */\nexport function isFullyRolledOut(flag: FeatureFlag): boolean {\n const filters = flag.filters as Record<string, unknown> | undefined;\n if (!filters) {\n return false;\n }\n\n if (filters.multivariate && typeof filters.multivariate === \"object\") {\n const mv = filters.multivariate as { variants?: unknown[] };\n if (mv.variants && mv.variants.length > 0) {\n return false;\n }\n }\n\n if (filters.groups && Array.isArray(filters.groups)) {\n const groups = filters.groups as Array<Record<string, unknown>>;\n if (groups.length === 0) {\n return false;\n }\n return groups.every((g) => {\n const rollout = g.rollout_percentage;\n const props = g.properties;\n const hasConditions = Array.isArray(props) && props.length > 0;\n return rollout === 100 && !hasConditions;\n });\n }\n\n return false;\n}\n\n/** Extract rollout percentage from a flag's filters */\nexport function extractRollout(flag: FeatureFlag): number | null {\n const filters = flag.filters as Record<string, unknown> | undefined;\n if (filters?.groups && Array.isArray(filters.groups)) {\n for (const group of filters.groups) {\n if (typeof group === \"object\" && group !== null) {\n const rp = (group as Record<string, unknown>).rollout_percentage;\n if (typeof rp === \"number\") {\n return rp;\n }\n }\n }\n }\n return null;\n}\n\n/** Extract multivariate variants from a flag */\nexport function extractVariants(\n flag: FeatureFlag,\n): { key: string; rollout_percentage: number }[] {\n const filters = flag.filters as Record<string, unknown> | undefined;\n if (filters?.multivariate && typeof filters.multivariate === \"object\") {\n const mv = filters.multivariate as {\n variants?: { key: string; rollout_percentage: number }[];\n };\n if (mv.variants && mv.variants.length > 0) {\n return mv.variants;\n }\n }\n return [];\n}\n\n/** Count release conditions (groups with property filters) */\nexport function extractConditionCount(flag: FeatureFlag): number {\n const filters = flag.filters as Record<string, unknown> | undefined;\n if (!filters?.groups || !Array.isArray(filters.groups)) {\n return 0;\n }\n return (filters.groups as Array<Record<string, unknown>>).filter(\n (g) =>\n g.properties &&\n Array.isArray(g.properties) &&\n (g.properties as unknown[]).length > 0,\n ).length;\n}\n","import { isFullyRolledOut } from \"./flag-classification.js\";\nimport type {\n Experiment,\n FeatureFlag,\n StalenessCheckOptions,\n StalenessReason,\n} from \"./types.js\";\n\n/** Classify why a flag key is stale, or return null if it's not stale. */\nexport function classifyStaleness(\n flagKey: string,\n flag: FeatureFlag | undefined,\n experiments: Experiment[],\n options: StalenessCheckOptions = {},\n): StalenessReason | null {\n if (!flag) {\n return \"not_in_posthog\";\n }\n\n if (!flag.active) {\n return \"inactive\";\n }\n\n const experiment = experiments.find((e) => e.feature_flag_key === flagKey);\n if (experiment?.end_date) {\n return \"experiment_complete\";\n }\n\n if (isFullyRolledOut(flag)) {\n const ageDays = options.staleFlagAgeDays ?? 30;\n if (ageDays > 0 && flag.created_at) {\n const createdAt = new Date(flag.created_at);\n const ageMs = Date.now() - createdAt.getTime();\n if (ageMs < ageDays * 86_400_000) {\n return null;\n }\n }\n return \"fully_rolled_out\";\n }\n\n return null;\n}\n\n/** Sort order for staleness reasons (most severe first) */\nexport const STALENESS_ORDER: Record<StalenessReason, number> = {\n not_in_posthog: 0,\n inactive: 1,\n experiment_complete: 2,\n fully_rolled_out: 3,\n};\n","import type { EnrichedEvent, EnrichedFlag, EnrichedListItem } from \"./types.js\";\n\nfunction commentPrefix(languageId: string): string {\n if (languageId === \"python\" || languageId === \"ruby\") {\n return \"#\";\n }\n return \"//\";\n}\n\nfunction formatFlagComment(flag: EnrichedFlag): string {\n const parts: string[] = [`Flag: \"${flag.flagKey}\"`];\n\n if (flag.flag) {\n parts.push(flag.flagType);\n if (flag.rollout !== null) {\n parts.push(`${flag.rollout}% rolled out`);\n }\n if (flag.experiment) {\n const status = flag.experiment.end_date ? \"complete\" : \"running\";\n parts.push(`Experiment: \"${flag.experiment.name}\" (${status})`);\n }\n if (flag.staleness) {\n parts.push(`STALE (${flag.staleness})`);\n }\n }\n\n return parts.join(\" \\u2014 \");\n}\n\nfunction formatEventComment(event: EnrichedEvent): string {\n const parts: string[] = [`Event: \"${event.eventName}\"`];\n if (event.verified) {\n parts.push(\"(verified)\");\n }\n if (event.stats?.volume !== undefined) {\n parts.push(`${event.stats.volume.toLocaleString()} events`);\n }\n if (event.stats?.uniqueUsers !== undefined) {\n parts.push(`${event.stats.uniqueUsers.toLocaleString()} users`);\n }\n if (event.definition?.description) {\n parts.push(event.definition.description);\n }\n return parts.join(\" \\u2014 \");\n}\n\nfunction buildCommentBody(\n item: EnrichedListItem,\n enrichedFlags: Map<string, EnrichedFlag>,\n enrichedEvents: Map<string, EnrichedEvent>,\n): string | null {\n if (item.type === \"flag\") {\n const flag = enrichedFlags.get(item.name);\n if (flag) return formatFlagComment(flag);\n return null;\n }\n if (item.type === \"event\") {\n const event = enrichedEvents.get(item.name);\n if (event) return formatEventComment(event);\n if (item.detail) return `Event: ${item.detail}`;\n return null;\n }\n if (item.type === \"init\") {\n return `Init: token \"${item.name}\"`;\n }\n return null;\n}\n\nexport function formatComments(\n source: string,\n languageId: string,\n items: EnrichedListItem[],\n enrichedFlags: Map<string, EnrichedFlag>,\n enrichedEvents: Map<string, EnrichedEvent>,\n): string {\n const prefix = commentPrefix(languageId);\n const lines = source.split(\"\\n\");\n const sorted = [...items].sort((a, b) => a.line - b.line);\n\n let offset = 0;\n\n for (const item of sorted) {\n const targetLine = item.line + offset;\n const body = buildCommentBody(item, enrichedFlags, enrichedEvents);\n if (!body) continue;\n\n const comment = `${prefix} [PostHog] ${body}`;\n const indent = lines[targetLine]?.match(/^(\\s*)/)?.[1] ?? \"\";\n lines.splice(targetLine, 0, `${indent}${comment}`);\n offset++;\n }\n\n return lines.join(\"\\n\");\n}\n\nexport function formatInlineComments(\n source: string,\n languageId: string,\n items: EnrichedListItem[],\n enrichedFlags: Map<string, EnrichedFlag>,\n enrichedEvents: Map<string, EnrichedEvent>,\n): string {\n const prefix = commentPrefix(languageId);\n const lines = source.split(\"\\n\");\n const byLine = new Map<number, string[]>();\n\n for (const item of items) {\n const body = buildCommentBody(item, enrichedFlags, enrichedEvents);\n if (!body) continue;\n const arr = byLine.get(item.line) ?? [];\n arr.push(body);\n byLine.set(item.line, arr);\n }\n\n for (const [lineIdx, bodies] of byLine) {\n if (lineIdx < 0 || lineIdx >= lines.length) continue;\n const suffix = ` ${prefix} [PostHog] ${bodies.join(\" | \")}`;\n lines[lineIdx] = `${lines[lineIdx]}${suffix}`;\n }\n\n return lines.join(\"\\n\");\n}\n","import { formatComments, formatInlineComments } from \"./comment-formatter.js\";\nimport {\n classifyFlagType,\n extractRollout,\n extractVariants,\n} from \"./flag-classification.js\";\nimport type { ParseResult } from \"./parse-result.js\";\nimport { classifyStaleness } from \"./stale-flags.js\";\nimport type {\n EnrichedEvent,\n EnrichedFlag,\n EnrichedListItem,\n EnrichmentContext,\n} from \"./types.js\";\n\nexport class EnrichedResult {\n private readonly parsed: ParseResult;\n private readonly context: EnrichmentContext;\n private cachedFlags: EnrichedFlag[] | null = null;\n private cachedEvents: EnrichedEvent[] | null = null;\n\n constructor(parsed: ParseResult, context: EnrichmentContext) {\n this.parsed = parsed;\n this.context = context;\n }\n\n get flags(): EnrichedFlag[] {\n if (this.cachedFlags) {\n return this.cachedFlags;\n }\n\n const flagMap = new Map<string, EnrichedFlag>();\n const checks = this.parsed.flagChecks;\n const experiments = this.context.experiments ?? [];\n\n for (const check of checks) {\n let entry = flagMap.get(check.flagKey);\n if (!entry) {\n const flag = this.context.flags?.get(check.flagKey);\n entry = {\n flagKey: check.flagKey,\n occurrences: [],\n flag,\n flagType: classifyFlagType(flag),\n staleness: classifyStaleness(\n check.flagKey,\n flag,\n experiments,\n this.context.stalenessOptions,\n ),\n rollout: flag ? extractRollout(flag) : null,\n variants: flag ? extractVariants(flag) : [],\n experiment: experiments.find(\n (e) => e.feature_flag_key === check.flagKey,\n ),\n };\n flagMap.set(check.flagKey, entry);\n }\n entry.occurrences.push(check);\n }\n\n this.cachedFlags = [...flagMap.values()];\n return this.cachedFlags;\n }\n\n get events(): EnrichedEvent[] {\n if (this.cachedEvents) {\n return this.cachedEvents;\n }\n\n const eventMap = new Map<string, EnrichedEvent>();\n const events = this.parsed.events;\n\n for (const event of events) {\n if (event.dynamic) {\n continue;\n }\n let entry = eventMap.get(event.name);\n if (!entry) {\n const definition = this.context.eventDefinitions?.get(event.name);\n const stats = this.context.eventStats?.get(event.name);\n entry = {\n eventName: event.name,\n occurrences: [],\n definition,\n verified: definition?.verified ?? false,\n lastSeenAt: stats?.lastSeenAt ?? definition?.last_seen_at ?? null,\n tags: definition?.tags ?? [],\n stats,\n };\n eventMap.set(event.name, entry);\n }\n entry.occurrences.push(event);\n }\n\n this.cachedEvents = [...eventMap.values()];\n return this.cachedEvents;\n }\n\n toList(): EnrichedListItem[] {\n const baseList = this.parsed.toList();\n const _experiments = this.context.experiments ?? [];\n\n const flagLookup = new Map<string, EnrichedFlag>();\n for (const f of this.flags) {\n flagLookup.set(f.flagKey, f);\n }\n\n const eventLookup = new Map<string, EnrichedEvent>();\n for (const e of this.events) {\n eventLookup.set(e.eventName, e);\n }\n\n return baseList.map((item) => {\n const enriched: EnrichedListItem = { ...item };\n\n if (item.type === \"flag\") {\n const flag = flagLookup.get(item.name);\n if (flag) {\n enriched.flagType = flag.flagType;\n enriched.staleness = flag.staleness;\n enriched.rollout = flag.rollout;\n if (flag.experiment) {\n enriched.experimentName = flag.experiment.name;\n enriched.experimentStatus = flag.experiment.end_date\n ? \"complete\"\n : \"running\";\n }\n }\n } else if (item.type === \"event\") {\n const event = eventLookup.get(item.name);\n if (event) {\n enriched.verified = event.verified;\n enriched.description = event.definition?.description ?? null;\n enriched.lastSeenAt = event.lastSeenAt;\n enriched.tags = event.tags;\n enriched.volume = event.stats?.volume;\n enriched.uniqueUsers = event.stats?.uniqueUsers;\n }\n }\n\n return enriched;\n });\n }\n\n toComments(): string {\n const flagLookup = new Map<string, EnrichedFlag>();\n for (const f of this.flags) {\n flagLookup.set(f.flagKey, f);\n }\n\n const eventLookup = new Map<string, EnrichedEvent>();\n for (const e of this.events) {\n eventLookup.set(e.eventName, e);\n }\n\n return formatComments(\n this.parsed.source,\n this.parsed.languageId,\n this.toList(),\n flagLookup,\n eventLookup,\n );\n }\n\n toInlineComments(): string {\n const flagLookup = new Map<string, EnrichedFlag>();\n for (const f of this.flags) {\n flagLookup.set(f.flagKey, f);\n }\n\n const eventLookup = new Map<string, EnrichedEvent>();\n for (const e of this.events) {\n eventLookup.set(e.eventName, e);\n }\n\n return formatInlineComments(\n this.parsed.source,\n this.parsed.languageId,\n this.toList(),\n flagLookup,\n eventLookup,\n );\n }\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { PostHogDetector } from \"./detector.js\";\nimport { EXT_TO_LANG_ID } from \"./languages.js\";\nimport { warn } from \"./log.js\";\nimport { ParseResult } from \"./parse-result.js\";\nimport type { DetectionConfig } from \"./types.js\";\n\nexport class PostHogEnricher {\n private detector = new PostHogDetector();\n\n updateConfig(config: DetectionConfig): void {\n this.detector.updateConfig(config);\n }\n\n isSupported(langId: string): boolean {\n return this.detector.isSupported(langId);\n }\n\n get supportedLanguages(): string[] {\n return this.detector.supportedLanguages;\n }\n\n async parse(source: string, languageId: string): Promise<ParseResult> {\n const results = await Promise.allSettled([\n this.detector.findPostHogCalls(source, languageId),\n this.detector.findInitCalls(source, languageId),\n this.detector.findFlagAssignments(source, languageId),\n this.detector.findVariantBranches(source, languageId),\n this.detector.findFunctions(source, languageId),\n ]);\n\n const settled = results.map((r, i) => {\n if (r.status === \"fulfilled\") {\n return r.value;\n }\n const labels = [\n \"calls\",\n \"initCalls\",\n \"flagAssignments\",\n \"variantBranches\",\n \"functions\",\n ];\n warn(`enricher: ${labels[i]} detection failed`, r.reason);\n return [];\n });\n\n return new ParseResult(\n source,\n languageId,\n settled[0] as Awaited<ReturnType<PostHogDetector[\"findPostHogCalls\"]>>,\n settled[1] as Awaited<ReturnType<PostHogDetector[\"findInitCalls\"]>>,\n settled[2] as Awaited<ReturnType<PostHogDetector[\"findFlagAssignments\"]>>,\n settled[3] as Awaited<ReturnType<PostHogDetector[\"findVariantBranches\"]>>,\n settled[4] as Awaited<ReturnType<PostHogDetector[\"findFunctions\"]>>,\n );\n }\n\n async parseFile(filePath: string): Promise<ParseResult> {\n const ext = path.extname(filePath).toLowerCase();\n const languageId = EXT_TO_LANG_ID[ext];\n if (!languageId) {\n throw new Error(`Unsupported file extension: ${ext}`);\n }\n const source = await fs.readFile(filePath, \"utf-8\");\n return this.parse(source, languageId);\n }\n\n dispose(): void {\n this.detector.dispose();\n }\n}\n","import type {\n EnricherApiConfig,\n EventDefinition,\n EventStats,\n Experiment,\n FeatureFlag,\n} from \"./types.js\";\n\nexport class PostHogApi {\n private config: EnricherApiConfig;\n\n constructor(config: EnricherApiConfig) {\n this.config = config;\n }\n\n private get baseUrl(): string {\n const host = this.config.host.replace(/\\/$/, \"\");\n return `${host}/api/projects/${this.config.projectId}`;\n }\n\n private get signal(): AbortSignal {\n return AbortSignal.timeout(this.config.timeoutMs ?? 10_000);\n }\n\n private async get<T>(path: string): Promise<T> {\n const res = await fetch(`${this.baseUrl}${path}`, {\n headers: {\n Authorization: `Bearer ${this.config.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n signal: this.signal,\n });\n if (!res.ok) {\n throw new Error(\n `PostHog API error: ${res.status} ${res.statusText} on GET ${path}`,\n );\n }\n return res.json() as Promise<T>;\n }\n\n private async post<T>(path: string, body: unknown): Promise<T> {\n const res = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.config.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n signal: this.signal,\n });\n if (!res.ok) {\n throw new Error(\n `PostHog API error: ${res.status} ${res.statusText} on POST ${path}`,\n );\n }\n return res.json() as Promise<T>;\n }\n\n async getFeatureFlags(): Promise<FeatureFlag[]> {\n const data = await this.get<{ results: FeatureFlag[] }>(\n \"/feature_flags/?limit=500\",\n );\n return data.results.filter((f) => !f.deleted);\n }\n\n async getExperiments(): Promise<Experiment[]> {\n const data = await this.get<{ results: Experiment[] }>(\n \"/experiments/?limit=500\",\n );\n return data.results;\n }\n\n async getEventDefinitions(names?: string[]): Promise<EventDefinition[]> {\n let path = \"/event_definitions/?limit=500\";\n if (names && names.length > 0) {\n path += `&search=${encodeURIComponent(names.join(\",\"))}`;\n }\n const data = await this.get<{ results: EventDefinition[] }>(path);\n return data.results;\n }\n\n async getEventStats(\n eventNames: string[],\n daysBack = 30,\n ): Promise<Map<string, EventStats>> {\n if (eventNames.length === 0) {\n return new Map();\n }\n\n // HogQL over `/query/` rejects typed placeholders (`{name:Type}`) and\n // placeholder values in INTERVAL, so `days` is inlined (clamped).\n const days = Math.max(1, Math.min(365, Math.floor(daysBack)));\n const query = `\n SELECT\n event,\n count() AS volume,\n count(DISTINCT person_id) AS unique_users,\n max(timestamp) AS last_seen\n FROM events\n WHERE event IN {eventNames}\n AND timestamp >= now() - INTERVAL ${days} DAY\n GROUP BY event\n `;\n\n const data = await this.post<{\n results: [string, number, number, string][];\n }>(\"/query/\", {\n query: {\n kind: \"HogQLQuery\",\n query,\n values: { eventNames },\n },\n });\n\n const stats = new Map<string, EventStats>();\n for (const [event, volume, uniqueUsers, lastSeen] of data.results) {\n stats.set(event, {\n volume,\n uniqueUsers,\n lastSeenAt: lastSeen || null,\n });\n }\n return stats;\n }\n}\n","import { EnrichedResult } from \"./enriched-result.js\";\nimport { warn } from \"./log.js\";\nimport { PostHogApi } from \"./posthog-api.js\";\nimport type {\n CapturedEvent,\n EnricherApiConfig,\n EventStats,\n FlagAssignment,\n FlagCheck,\n FunctionInfo,\n ListItem,\n PostHogCall,\n PostHogInitCall,\n VariantBranch,\n} from \"./types.js\";\n\nconst CAPTURE_METHODS = new Set([\"capture\", \"Enqueue\"]);\n\nexport class ParseResult {\n readonly source: string;\n readonly languageId: string;\n readonly calls: readonly PostHogCall[];\n readonly initCalls: readonly PostHogInitCall[];\n readonly flagAssignments: readonly FlagAssignment[];\n readonly variantBranches: readonly VariantBranch[];\n readonly functions: readonly FunctionInfo[];\n\n constructor(\n source: string,\n languageId: string,\n calls: PostHogCall[],\n initCalls: PostHogInitCall[],\n flagAssignments: FlagAssignment[],\n variantBranches: VariantBranch[],\n functions: FunctionInfo[],\n ) {\n this.source = source;\n this.languageId = languageId;\n this.calls = calls;\n this.initCalls = initCalls;\n this.flagAssignments = flagAssignments;\n this.variantBranches = variantBranches;\n this.functions = functions;\n }\n\n get events(): CapturedEvent[] {\n return this.calls\n .filter((c) => CAPTURE_METHODS.has(c.method))\n .map((c) => ({\n name: c.key,\n line: c.line,\n dynamic: c.dynamic ?? false,\n }));\n }\n\n get flagChecks(): FlagCheck[] {\n return this.calls\n .filter((c) => !CAPTURE_METHODS.has(c.method))\n .map((c) => ({\n method: c.method,\n flagKey: c.key,\n line: c.line,\n }));\n }\n\n get flagKeys(): string[] {\n return [...new Set(this.flagChecks.map((c) => c.flagKey))];\n }\n\n get eventNames(): string[] {\n return [\n ...new Set(this.events.filter((e) => !e.dynamic).map((e) => e.name)),\n ];\n }\n\n toList(): ListItem[] {\n const items: ListItem[] = [];\n\n for (const init of this.initCalls) {\n items.push({\n type: \"init\",\n line: init.tokenLine,\n name: init.token,\n method: \"init\",\n });\n }\n\n for (const call of this.calls) {\n const isEvent = CAPTURE_METHODS.has(call.method);\n items.push({\n type: isEvent ? \"event\" : \"flag\",\n line: call.line,\n name: call.key,\n method: call.method,\n detail: call.dynamic ? \"dynamic event name\" : undefined,\n });\n }\n\n return items.sort((a, b) => a.line - b.line);\n }\n\n async enrichFromApi(config: EnricherApiConfig): Promise<EnrichedResult> {\n const api = new PostHogApi(config);\n const flagKeys = this.flagKeys;\n const eventNames = this.eventNames;\n\n const settled = await Promise.allSettled([\n flagKeys.length > 0 ? api.getFeatureFlags() : Promise.resolve([]),\n flagKeys.length > 0 ? api.getExperiments() : Promise.resolve([]),\n eventNames.length > 0\n ? api.getEventDefinitions(eventNames)\n : Promise.resolve([]),\n eventNames.length > 0\n ? api.getEventStats(eventNames)\n : Promise.resolve(new Map()),\n ]);\n\n const [flagsResult, experimentsResult, eventDefsResult, eventStatsResult] =\n settled;\n\n const labels = [\n \"getFeatureFlags\",\n \"getExperiments\",\n \"getEventDefinitions\",\n \"getEventStats\",\n ];\n settled.forEach((r, i) => {\n if (r.status === \"rejected\") {\n warn(`enricher: ${labels[i]} failed`, r.reason);\n }\n });\n\n const allFlags =\n flagsResult.status === \"fulfilled\" ? flagsResult.value : [];\n const allExperiments =\n experimentsResult.status === \"fulfilled\" ? experimentsResult.value : [];\n const allEventDefs =\n eventDefsResult.status === \"fulfilled\" ? eventDefsResult.value : [];\n const eventStats =\n eventStatsResult.status === \"fulfilled\"\n ? eventStatsResult.value\n : new Map<string, EventStats>();\n\n const flagKeySet = new Set(flagKeys);\n const flags = new Map(\n allFlags.filter((f) => flagKeySet.has(f.key)).map((f) => [f.key, f]),\n );\n\n const experiments = allExperiments.filter((e) =>\n flagKeySet.has(e.feature_flag_key),\n );\n\n const eventDefinitions = new Map(\n allEventDefs\n .filter((d) => eventNames.includes(d.name))\n .map((d) => [d.name, d]),\n );\n\n return new EnrichedResult(this, {\n flags,\n experiments,\n eventDefinitions,\n eventStats,\n });\n }\n}\n","import type { Logger } from \"./logger\";\n\n/**\n * Races an operation against a timeout.\n * Returns success with the value if the operation completes in time,\n * or timeout if the operation takes longer than the specified duration.\n */\nexport async function withTimeout<T>(\n operation: Promise<T>,\n timeoutMs: number,\n): Promise<{ result: \"success\"; value: T } | { result: \"timeout\" }> {\n const timeoutPromise = new Promise<{ result: \"timeout\" }>((resolve) =>\n setTimeout(() => resolve({ result: \"timeout\" }), timeoutMs),\n );\n const operationPromise = operation.then((value) => ({\n result: \"success\" as const,\n value,\n }));\n return Promise.race([operationPromise, timeoutPromise]);\n}\n\nexport const IS_ROOT =\n typeof process !== \"undefined\" &&\n (process.geteuid?.() ?? process.getuid?.()) === 0;\n\nexport function unreachable(value: never, logger: Logger): void {\n let valueAsString: string;\n try {\n valueAsString = JSON.stringify(value);\n } catch {\n valueAsString = String(value);\n }\n logger.error(`Unexpected case: ${valueAsString}`);\n}\n","export interface GatewayModel {\n id: string;\n owned_by: string;\n context_window: number;\n supports_streaming: boolean;\n supports_vision: boolean;\n}\n\ninterface GatewayModelsResponse {\n object: \"list\";\n data: GatewayModel[];\n}\n\nexport interface FetchGatewayModelsOptions {\n gatewayUrl: string;\n}\n\nexport const DEFAULT_GATEWAY_MODEL = \"claude-opus-4-7\";\n\nexport const DEFAULT_CODEX_MODEL = \"gpt-5.4\";\n\nexport const BLOCKED_MODELS = new Set([\"gpt-5-mini\", \"openai/gpt-5-mini\"]);\n\ntype ModelsListResponse =\n | {\n data?: Array<{ id?: string; owned_by?: string }>;\n models?: Array<{ id?: string; owned_by?: string }>;\n }\n | Array<{ id?: string; owned_by?: string }>;\n\nconst CACHE_TTL = 10 * 60 * 1000; // 10 minutes\n\nlet gatewayModelsCache: {\n models: GatewayModel[];\n expiry: number;\n url: string;\n} | null = null;\n\nexport async function fetchGatewayModels(\n options?: FetchGatewayModelsOptions,\n): Promise<GatewayModel[]> {\n const gatewayUrl = options?.gatewayUrl ?? process.env.ANTHROPIC_BASE_URL;\n if (!gatewayUrl) {\n return [];\n }\n\n if (\n gatewayModelsCache &&\n gatewayModelsCache.url === gatewayUrl &&\n Date.now() < gatewayModelsCache.expiry\n ) {\n return gatewayModelsCache.models;\n }\n\n const modelsUrl = `${gatewayUrl}/v1/models`;\n\n try {\n const response = await fetch(modelsUrl);\n\n if (!response.ok) {\n return [];\n }\n\n const data = (await response.json()) as GatewayModelsResponse;\n const models = (data.data ?? []).filter((m) => !BLOCKED_MODELS.has(m.id));\n gatewayModelsCache = {\n models,\n expiry: Date.now() + CACHE_TTL,\n url: gatewayUrl,\n };\n return models;\n } catch {\n return [];\n }\n}\n\nexport function isAnthropicModel(model: GatewayModel): boolean {\n if (model.owned_by) {\n return model.owned_by === \"anthropic\";\n }\n return model.id.startsWith(\"claude-\") || model.id.startsWith(\"anthropic/\");\n}\n\nexport function isOpenAIModel(model: GatewayModel): boolean {\n if (model.owned_by) {\n return model.owned_by === \"openai\";\n }\n return model.id.startsWith(\"gpt-\") || model.id.startsWith(\"openai/\");\n}\n\nexport interface ModelInfo {\n id: string;\n owned_by?: string;\n}\n\nlet modelsListCache: {\n models: ModelInfo[];\n expiry: number;\n url: string;\n} | null = null;\n\nexport async function fetchModelsList(\n options?: FetchGatewayModelsOptions,\n): Promise<ModelInfo[]> {\n const gatewayUrl = options?.gatewayUrl ?? process.env.ANTHROPIC_BASE_URL;\n if (!gatewayUrl) {\n return [];\n }\n\n if (\n modelsListCache &&\n modelsListCache.url === gatewayUrl &&\n Date.now() < modelsListCache.expiry\n ) {\n return modelsListCache.models;\n }\n\n try {\n const modelsUrl = `${gatewayUrl}/v1/models`;\n const response = await fetch(modelsUrl);\n if (!response.ok) {\n return [];\n }\n const data = (await response.json()) as ModelsListResponse;\n const models = Array.isArray(data)\n ? data\n : (data.data ?? data.models ?? []);\n const results: ModelInfo[] = [];\n for (const model of models) {\n const id = model?.id ? String(model.id) : \"\";\n if (!id) continue;\n results.push({ id, owned_by: model?.owned_by });\n }\n modelsListCache = {\n models: results,\n expiry: Date.now() + CACHE_TTL,\n url: gatewayUrl,\n };\n return results;\n } catch {\n return [];\n }\n}\n\nconst PROVIDER_NAMES: Record<string, string> = {\n anthropic: \"Anthropic\",\n openai: \"OpenAI\",\n \"google-vertex\": \"Gemini\",\n};\n\nexport function getProviderName(ownedBy: string): string {\n return PROVIDER_NAMES[ownedBy] ?? ownedBy;\n}\n\nconst PROVIDER_PREFIXES = [\"anthropic/\", \"openai/\", \"google-vertex/\"];\n\nexport function formatGatewayModelName(model: GatewayModel): string {\n return formatModelId(model.id);\n}\n\nexport function formatModelId(modelId: string): string {\n let cleanId = modelId;\n for (const prefix of PROVIDER_PREFIXES) {\n if (cleanId.startsWith(prefix)) {\n cleanId = cleanId.slice(prefix.length);\n break;\n }\n }\n\n cleanId = cleanId.replace(/(\\d)-(\\d)/g, \"$1.$2\");\n\n const words = cleanId.split(/[-_]/).map((word) => {\n if (word.match(/^[0-9.]+$/)) return word;\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n });\n\n return words.join(\" \");\n}\n","import type {\n Agent,\n AgentSideConnection,\n AuthenticateRequest,\n CancelNotification,\n InitializeRequest,\n InitializeResponse,\n NewSessionRequest,\n NewSessionResponse,\n PromptRequest,\n PromptResponse,\n ReadTextFileRequest,\n ReadTextFileResponse,\n SessionConfigSelectOption,\n SessionNotification,\n WriteTextFileRequest,\n WriteTextFileResponse,\n} from \"@agentclientprotocol/sdk\";\nimport {\n DEFAULT_GATEWAY_MODEL,\n fetchGatewayModels,\n formatGatewayModelName,\n type GatewayModel,\n isAnthropicModel,\n} from \"../gateway-models\";\nimport { Logger } from \"../utils/logger\";\n/**\n * Shared settings manager interface that both Claude's SettingsManager\n * and Codex's CodexSettingsManager implement. BaseAcpAgent only calls\n * dispose() on this; each adapter's Session type narrows it to the\n * concrete implementation.\n */\nexport interface BaseSettingsManager {\n dispose(): void;\n getCwd(): string;\n setCwd(cwd: string): Promise<void>;\n initialize(): Promise<void>;\n}\n\nexport interface BaseSession {\n notificationHistory: SessionNotification[];\n cancelled: boolean;\n interruptReason?: string;\n abortController: AbortController;\n settingsManager: BaseSettingsManager;\n}\n\nconst DEFAULT_CONTEXT_WINDOW = 200_000;\n\nexport abstract class BaseAcpAgent implements Agent {\n abstract readonly adapterName: string;\n protected session!: BaseSession;\n protected sessionId!: string;\n client: AgentSideConnection;\n logger: Logger;\n fileContentCache: { [key: string]: string } = {};\n protected gatewayModels: GatewayModel[] = [];\n\n constructor(client: AgentSideConnection) {\n this.client = client;\n this.logger = new Logger({ debug: true, prefix: \"[BaseAcpAgent]\" });\n }\n\n abstract initialize(request: InitializeRequest): Promise<InitializeResponse>;\n abstract newSession(params: NewSessionRequest): Promise<NewSessionResponse>;\n abstract prompt(params: PromptRequest): Promise<PromptResponse>;\n protected abstract interrupt(): Promise<void>;\n\n async cancel(params: CancelNotification): Promise<void> {\n if (this.sessionId !== params.sessionId) {\n throw new Error(\"Session ID mismatch\");\n }\n this.session.cancelled = true;\n const meta = params._meta as { interruptReason?: string } | undefined;\n if (meta?.interruptReason) {\n this.session.interruptReason = meta.interruptReason;\n }\n await this.interrupt();\n }\n\n async closeSession(): Promise<void> {\n try {\n // Abort first so in-flight HTTP requests are cancelled,\n // otherwise interrupt() deadlocks waiting for the query to stop\n // while the query waits on an API call that will never abort.\n this.session.abortController.abort();\n await this.cancel({ sessionId: this.sessionId });\n this.session.settingsManager.dispose();\n this.logger.info(\"Closed session\", { sessionId: this.sessionId });\n } catch (err) {\n this.logger.warn(\"Failed to close session\", {\n sessionId: this.sessionId,\n error: err,\n });\n }\n }\n\n hasSession(sessionId: string): boolean {\n return this.sessionId === sessionId;\n }\n\n appendNotification(\n sessionId: string,\n notification: SessionNotification,\n ): void {\n if (this.sessionId === sessionId) {\n this.session.notificationHistory.push(notification);\n }\n }\n\n async readTextFile(\n params: ReadTextFileRequest,\n ): Promise<ReadTextFileResponse> {\n const response = await this.client.readTextFile(params);\n if (!params.limit && !params.line) {\n this.fileContentCache[params.path] = response.content;\n }\n return response;\n }\n\n async writeTextFile(\n params: WriteTextFileRequest,\n ): Promise<WriteTextFileResponse> {\n const response = await this.client.writeTextFile(params);\n this.fileContentCache[params.path] = params.content;\n return response;\n }\n\n async authenticate(_params: AuthenticateRequest): Promise<void> {\n throw new Error(\"Method not implemented.\");\n }\n\n async getModelConfigOptions(currentModelOverride?: string): Promise<{\n currentModelId: string;\n options: SessionConfigSelectOption[];\n }> {\n this.gatewayModels = await fetchGatewayModels();\n\n const options = this.gatewayModels\n .filter((model) => isAnthropicModel(model))\n .map((model) => ({\n value: model.id,\n name: formatGatewayModelName(model),\n description: `Context: ${model.context_window.toLocaleString()} tokens`,\n }));\n\n const isAnthropicModelId = (modelId: string): boolean =>\n modelId.startsWith(\"claude-\") || modelId.startsWith(\"anthropic/\");\n\n let currentModelId = currentModelOverride ?? DEFAULT_GATEWAY_MODEL;\n\n if (!options.some((opt) => opt.value === currentModelId)) {\n if (!isAnthropicModelId(currentModelId)) {\n currentModelId = DEFAULT_GATEWAY_MODEL;\n }\n }\n\n if (!options.some((opt) => opt.value === currentModelId)) {\n options.unshift({\n value: currentModelId,\n name: currentModelId,\n description: \"Custom model\",\n });\n }\n\n return { currentModelId, options };\n }\n\n getContextWindowForModel(modelId: string): number {\n const match = this.gatewayModels.find((m) => m.id === modelId);\n return match?.context_window ?? DEFAULT_CONTEXT_WINDOW;\n }\n}\n","import * as path from \"node:path\";\nimport type { PromptRequest } from \"@agentclientprotocol/sdk\";\nimport type { SDKUserMessage } from \"@anthropic-ai/claude-agent-sdk\";\nimport type { ContentBlockParam } from \"@anthropic-ai/sdk/resources\";\n\ntype ImageMimeType = \"image/jpeg\" | \"image/png\" | \"image/gif\" | \"image/webp\";\n\nfunction sdkText(value: string): ContentBlockParam {\n return { type: \"text\", text: value };\n}\n\nfunction formatUriAsLink(uri: string): string {\n try {\n if (uri.startsWith(\"file://\")) {\n const filePath = uri.slice(7);\n const name = path.basename(filePath) || filePath;\n return `[@${name}](${uri})`;\n }\n if (uri.startsWith(\"zed://\")) {\n const name = path.basename(uri) || uri;\n return `[@${name}](${uri})`;\n }\n return uri;\n } catch {\n return uri;\n }\n}\n\nfunction transformMcpCommand(text: string): string {\n const mcpMatch = text.match(/^\\/mcp:([^:\\s]+):(\\S+)(\\s+.*)?$/);\n if (mcpMatch) {\n const [, server, command, args] = mcpMatch;\n return `/${server}:${command} (MCP)${args || \"\"}`;\n }\n return text;\n}\n\nfunction processPromptChunk(\n chunk: PromptRequest[\"prompt\"][number],\n content: ContentBlockParam[],\n context: ContentBlockParam[],\n): void {\n switch (chunk.type) {\n case \"text\":\n content.push(sdkText(transformMcpCommand(chunk.text)));\n break;\n\n case \"resource_link\":\n content.push(sdkText(formatUriAsLink(chunk.uri)));\n break;\n\n case \"resource\":\n if (\"text\" in chunk.resource) {\n content.push(sdkText(formatUriAsLink(chunk.resource.uri)));\n context.push(\n sdkText(\n `\\n<context ref=\"${chunk.resource.uri}\">\\n${chunk.resource.text}\\n</context>`,\n ),\n );\n }\n break;\n\n case \"image\":\n if (chunk.data) {\n content.push({\n type: \"image\",\n source: {\n type: \"base64\",\n data: chunk.data,\n media_type: chunk.mimeType as ImageMimeType,\n },\n });\n } else if (chunk.uri?.startsWith(\"http\")) {\n content.push({\n type: \"image\",\n source: { type: \"url\", url: chunk.uri },\n });\n }\n break;\n\n default:\n break;\n }\n}\n\nexport function promptToClaude(prompt: PromptRequest): SDKUserMessage {\n const content: ContentBlockParam[] = [];\n const context: ContentBlockParam[] = [];\n\n const prContext = (prompt._meta as Record<string, unknown> | undefined)\n ?.prContext;\n if (typeof prContext === \"string\") {\n content.push(sdkText(prContext));\n }\n\n for (const chunk of prompt.prompt) {\n processPromptChunk(chunk, content, context);\n }\n\n content.push(...context);\n\n return {\n type: \"user\",\n message: { role: \"user\", content },\n session_id: prompt.sessionId,\n parent_tool_use_id: null,\n };\n}\n","import type {\n AgentSideConnection,\n Role,\n SessionNotification,\n SessionUpdate,\n} from \"@agentclientprotocol/sdk\";\nimport { RequestError, type StopReason } from \"@agentclientprotocol/sdk\";\nimport type {\n SDKAssistantMessage,\n SDKMessage,\n SDKPartialAssistantMessage,\n SDKResultMessage,\n SDKUserMessage,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport type { ContentBlockParam } from \"@anthropic-ai/sdk/resources\";\nimport type {\n BetaContentBlock,\n BetaRawContentBlockDelta,\n} from \"@anthropic-ai/sdk/resources/beta.mjs\";\nimport { POSTHOG_NOTIFICATIONS } from \"@/acp-extensions\";\nimport { image, text } from \"../../../utils/acp-content\";\nimport { unreachable } from \"../../../utils/common\";\nimport type { Logger } from \"../../../utils/logger\";\nimport { type EnrichedReadCache, registerHookCallback } from \"../hooks\";\nimport type { Session, ToolUpdateMeta, ToolUseCache } from \"../types\";\nimport {\n type ClaudePlanEntry,\n planEntries,\n toolInfoFromToolUse,\n toolUpdateFromEditToolResponse,\n toolUpdateFromToolResult,\n} from \"./tool-use-to-acp\";\n\ntype AnthropicContentChunk =\n | ContentBlockParam\n | BetaContentBlock\n | BetaRawContentBlockDelta;\n\ntype AnthropicMessageContent = string | Array<{ type: string; text?: string }>;\n\ninterface AnthropicMessageWithContent {\n type: Role;\n message: {\n content: AnthropicMessageContent;\n role?: Role;\n model?: string;\n };\n}\n\ntype ChunkHandlerContext = {\n sessionId: string;\n toolUseCache: ToolUseCache;\n fileContentCache: { [key: string]: string };\n enrichedReadCache?: EnrichedReadCache;\n client: AgentSideConnection;\n logger: Logger;\n parentToolCallId?: string;\n registerHooks?: boolean;\n supportsTerminalOutput?: boolean;\n cwd?: string;\n /** Raw MCP tool result from SDKUserMessage.tool_use_result (contains content, structuredContent, _meta) */\n mcpToolUseResult?: Record<string, unknown>;\n};\n\nexport interface MessageHandlerContext {\n session: Session;\n sessionId: string;\n client: AgentSideConnection;\n toolUseCache: ToolUseCache;\n fileContentCache: { [key: string]: string };\n enrichedReadCache?: EnrichedReadCache;\n logger: Logger;\n registerHooks?: boolean;\n supportsTerminalOutput?: boolean;\n}\n\nfunction messageUpdateType(role: Role) {\n return role === \"assistant\" ? \"agent_message_chunk\" : \"user_message_chunk\";\n}\n\nfunction toolMeta(\n toolName: string,\n toolResponse?: unknown,\n parentToolCallId?: string,\n): ToolUpdateMeta {\n const meta: ToolUpdateMeta[\"claudeCode\"] = { toolName };\n if (toolResponse !== undefined) meta.toolResponse = toolResponse;\n if (parentToolCallId) meta.parentToolCallId = parentToolCallId;\n return { claudeCode: meta };\n}\n\nfunction handleTextChunk(\n chunk: { text: string },\n role: Role,\n parentToolCallId?: string,\n): SessionUpdate {\n const update: SessionUpdate = {\n sessionUpdate: messageUpdateType(role),\n content: text(chunk.text),\n };\n if (parentToolCallId) {\n (update as Record<string, unknown>)._meta = toolMeta(\n \"__text__\",\n undefined,\n parentToolCallId,\n );\n }\n return update;\n}\n\nfunction handleImageChunk(\n chunk: {\n source: { type: string; data?: string; media_type?: string; url?: string };\n },\n role: Role,\n): SessionUpdate {\n return {\n sessionUpdate: messageUpdateType(role),\n content: image(\n chunk.source.type === \"base64\" ? (chunk.source.data ?? \"\") : \"\",\n chunk.source.type === \"base64\" ? (chunk.source.media_type ?? \"\") : \"\",\n chunk.source.type === \"url\" ? chunk.source.url : undefined,\n ),\n };\n}\n\nfunction handleThinkingChunk(\n chunk: { thinking: string },\n parentToolCallId?: string,\n): SessionUpdate {\n const update: SessionUpdate = {\n sessionUpdate: \"agent_thought_chunk\",\n content: text(chunk.thinking),\n };\n if (parentToolCallId) {\n (update as Record<string, unknown>)._meta = toolMeta(\n \"__thinking__\",\n undefined,\n parentToolCallId,\n );\n }\n return update;\n}\n\nfunction handleToolUseChunk(\n chunk: ToolUseCache[string],\n ctx: ChunkHandlerContext,\n): SessionUpdate | null {\n const alreadyCached = chunk.id in ctx.toolUseCache;\n ctx.toolUseCache[chunk.id] = chunk;\n\n if (chunk.name === \"TodoWrite\") {\n const input = chunk.input as { todos?: unknown[] };\n if (Array.isArray(input.todos)) {\n return {\n sessionUpdate: \"plan\",\n entries: planEntries(chunk.input as { todos: ClaudePlanEntry[] }),\n };\n }\n return null;\n }\n\n if (!alreadyCached && ctx.registerHooks !== false) {\n registerHookCallback(chunk.id, {\n onPostToolUseHook: async (toolUseId, _toolInput, toolResponse) => {\n const toolUse = ctx.toolUseCache[toolUseId];\n if (toolUse) {\n const editUpdate =\n toolUse.name === \"Edit\"\n ? toolUpdateFromEditToolResponse(toolResponse)\n : null;\n\n await ctx.client.sessionUpdate({\n sessionId: ctx.sessionId,\n update: {\n _meta: toolMeta(toolUse.name, toolResponse, ctx.parentToolCallId),\n toolCallId: toolUseId,\n sessionUpdate: \"tool_call_update\",\n ...(editUpdate ? editUpdate : {}),\n },\n });\n } else {\n ctx.logger.error(\n `Got a tool response for tool use that wasn't tracked: ${toolUseId}`,\n );\n }\n },\n });\n }\n\n let rawInput: Record<string, unknown> | undefined;\n try {\n rawInput = JSON.parse(JSON.stringify(chunk.input));\n } catch {\n // ignore\n }\n\n const toolInfo = toolInfoFromToolUse(chunk, {\n supportsTerminalOutput: ctx.supportsTerminalOutput,\n toolUseId: chunk.id,\n cachedFileContent: ctx.fileContentCache,\n cwd: ctx.cwd,\n });\n\n const meta: Record<string, unknown> = {\n ...toolMeta(chunk.name, undefined, ctx.parentToolCallId),\n };\n if (chunk.name === \"Bash\" && ctx.supportsTerminalOutput && !alreadyCached) {\n meta.terminal_info = { terminal_id: chunk.id };\n }\n\n if (alreadyCached) {\n return {\n _meta: meta,\n toolCallId: chunk.id,\n sessionUpdate: \"tool_call_update\" as const,\n rawInput,\n ...toolInfo,\n };\n }\n\n return {\n _meta: meta,\n toolCallId: chunk.id,\n sessionUpdate: \"tool_call\" as const,\n rawInput,\n status: \"pending\",\n ...toolInfo,\n };\n}\n\nfunction extractTextFromContent(content: unknown): string | null {\n if (Array.isArray(content)) {\n const parts: string[] = [];\n for (const item of content) {\n if (\n typeof item === \"object\" &&\n item !== null &&\n \"text\" in item &&\n typeof (item as Record<string, unknown>).text === \"string\"\n ) {\n parts.push((item as { text: string }).text);\n }\n }\n return parts.length > 0 ? parts.join(\"\") : null;\n }\n if (typeof content === \"string\") {\n return content;\n }\n return null;\n}\n\nexport function stripCatLineNumbers(text: string): string {\n return text.replace(/^ *\\d+[\\t→]/gm, \"\");\n}\n\nfunction updateFileContentCache(\n toolUse: { name: string; input: unknown },\n chunk: { content?: unknown },\n ctx: ChunkHandlerContext,\n): void {\n const input = toolUse.input as Record<string, unknown> | undefined;\n const filePath = input?.file_path ? String(input.file_path) : undefined;\n if (!filePath) return;\n\n if (toolUse.name === \"Read\" && !input?.limit && !input?.offset) {\n const fileText = extractTextFromContent(chunk.content);\n if (fileText !== null) {\n ctx.fileContentCache[filePath] = stripCatLineNumbers(fileText);\n }\n } else if (toolUse.name === \"Write\") {\n const content = input?.content;\n if (typeof content === \"string\") {\n ctx.fileContentCache[filePath] = content;\n }\n } else if (toolUse.name === \"Edit\") {\n const oldString = input?.old_string;\n const newString = input?.new_string;\n if (\n typeof oldString === \"string\" &&\n typeof newString === \"string\" &&\n filePath in ctx.fileContentCache\n ) {\n const current = ctx.fileContentCache[filePath];\n ctx.fileContentCache[filePath] = input?.replace_all\n ? current.replaceAll(oldString, newString)\n : current.replace(oldString, newString);\n }\n }\n}\n\nfunction handleToolResultChunk(\n chunk: AnthropicContentChunk & {\n tool_use_id: string;\n is_error?: boolean;\n content?: unknown;\n },\n ctx: ChunkHandlerContext,\n): SessionUpdate[] {\n const toolUse = ctx.toolUseCache[chunk.tool_use_id];\n if (!toolUse) {\n ctx.logger.error(\n `Got a tool result for tool use that wasn't tracked: ${chunk.tool_use_id}`,\n );\n return [];\n }\n\n if (toolUse.name === \"TodoWrite\") {\n return [];\n }\n\n if (!chunk.is_error) {\n updateFileContentCache(toolUse, chunk, ctx);\n }\n\n const { _meta: resultMeta, ...toolUpdate } = toolUpdateFromToolResult(\n chunk as Parameters<typeof toolUpdateFromToolResult>[0],\n toolUse,\n {\n supportsTerminalOutput: ctx.supportsTerminalOutput,\n toolUseId: chunk.tool_use_id,\n cachedFileContent: ctx.fileContentCache,\n enrichedReadCache: ctx.enrichedReadCache,\n },\n );\n\n const updates: SessionUpdate[] = [];\n\n if (resultMeta?.terminal_output) {\n const terminalOutputMeta: Record<string, unknown> = {\n terminal_output: resultMeta.terminal_output,\n };\n if (ctx.parentToolCallId) {\n terminalOutputMeta.claudeCode = {\n parentToolCallId: ctx.parentToolCallId,\n };\n }\n updates.push({\n _meta: terminalOutputMeta,\n toolCallId: chunk.tool_use_id,\n sessionUpdate: \"tool_call_update\" as const,\n });\n }\n\n const meta: Record<string, unknown> = {\n ...toolMeta(toolUse.name, undefined, ctx.parentToolCallId),\n ...(resultMeta?.terminal_exit\n ? { terminal_exit: resultMeta.terminal_exit }\n : {}),\n };\n\n updates.push({\n _meta: meta,\n toolCallId: chunk.tool_use_id,\n sessionUpdate: \"tool_call_update\",\n status: chunk.is_error ? \"failed\" : \"completed\",\n rawOutput: ctx.mcpToolUseResult\n ? { ...ctx.mcpToolUseResult, isError: chunk.is_error ?? false }\n : {\n content: Array.isArray(chunk.content)\n ? chunk.content\n : typeof chunk.content === \"string\"\n ? [{ type: \"text\" as const, text: chunk.content }]\n : [],\n isError: chunk.is_error ?? false,\n },\n ...toolUpdate,\n });\n\n return updates;\n}\n\nfunction processContentChunk(\n chunk: AnthropicContentChunk,\n role: Role,\n ctx: ChunkHandlerContext,\n): SessionUpdate[] {\n switch (chunk.type) {\n case \"text\":\n case \"text_delta\": {\n const update = handleTextChunk(chunk, role, ctx.parentToolCallId);\n return update ? [update] : [];\n }\n\n case \"image\": {\n const update = handleImageChunk(chunk, role);\n return update ? [update] : [];\n }\n\n case \"thinking\":\n case \"thinking_delta\": {\n const update = handleThinkingChunk(chunk, ctx.parentToolCallId);\n return update ? [update] : [];\n }\n\n case \"tool_use\":\n case \"server_tool_use\":\n case \"mcp_tool_use\": {\n const update = handleToolUseChunk(chunk as ToolUseCache[string], ctx);\n return update ? [update] : [];\n }\n\n case \"tool_result\":\n case \"tool_search_tool_result\":\n case \"web_fetch_tool_result\":\n case \"web_search_tool_result\":\n case \"code_execution_tool_result\":\n case \"bash_code_execution_tool_result\":\n case \"text_editor_code_execution_tool_result\":\n case \"mcp_tool_result\":\n return handleToolResultChunk(\n chunk as AnthropicContentChunk & {\n tool_use_id: string;\n is_error?: boolean;\n content?: unknown;\n },\n ctx,\n );\n\n case \"document\":\n case \"search_result\":\n case \"redacted_thinking\":\n case \"input_json_delta\":\n case \"citations_delta\":\n case \"signature_delta\":\n case \"container_upload\":\n case \"compaction\":\n case \"compaction_delta\":\n return [];\n\n default:\n unreachable(chunk as never, ctx.logger);\n return [];\n }\n}\n\nfunction toAcpNotifications(\n content:\n | string\n | ContentBlockParam[]\n | BetaContentBlock[]\n | BetaRawContentBlockDelta[],\n role: Role,\n sessionId: string,\n toolUseCache: ToolUseCache,\n fileContentCache: { [key: string]: string },\n client: AgentSideConnection,\n logger: Logger,\n parentToolCallId?: string,\n registerHooks?: boolean,\n supportsTerminalOutput?: boolean,\n cwd?: string,\n mcpToolUseResult?: Record<string, unknown>,\n enrichedReadCache?: EnrichedReadCache,\n): SessionNotification[] {\n if (typeof content === \"string\") {\n const update: SessionUpdate = {\n sessionUpdate: messageUpdateType(role),\n content: text(content),\n };\n if (parentToolCallId) {\n (update as Record<string, unknown>)._meta = toolMeta(\n \"__text__\",\n undefined,\n parentToolCallId,\n );\n }\n return [{ sessionId, update }];\n }\n\n const ctx: ChunkHandlerContext = {\n sessionId,\n toolUseCache,\n fileContentCache,\n enrichedReadCache,\n client,\n logger,\n parentToolCallId,\n registerHooks,\n supportsTerminalOutput,\n cwd,\n mcpToolUseResult,\n };\n const output: SessionNotification[] = [];\n\n for (const chunk of content) {\n for (const update of processContentChunk(chunk, role, ctx)) {\n output.push({ sessionId, update });\n }\n }\n\n return output;\n}\n\nfunction streamEventToAcpNotifications(\n message: SDKPartialAssistantMessage,\n sessionId: string,\n toolUseCache: ToolUseCache,\n fileContentCache: { [key: string]: string },\n client: AgentSideConnection,\n logger: Logger,\n parentToolCallId?: string,\n registerHooks?: boolean,\n supportsTerminalOutput?: boolean,\n cwd?: string,\n enrichedReadCache?: EnrichedReadCache,\n): SessionNotification[] {\n const event = message.event;\n switch (event.type) {\n case \"content_block_start\":\n return toAcpNotifications(\n [event.content_block],\n \"assistant\",\n sessionId,\n toolUseCache,\n fileContentCache,\n client,\n logger,\n parentToolCallId,\n registerHooks,\n supportsTerminalOutput,\n cwd,\n undefined,\n enrichedReadCache,\n );\n case \"content_block_delta\":\n return toAcpNotifications(\n [event.delta],\n \"assistant\",\n sessionId,\n toolUseCache,\n fileContentCache,\n client,\n logger,\n parentToolCallId,\n registerHooks,\n supportsTerminalOutput,\n cwd,\n undefined,\n enrichedReadCache,\n );\n case \"message_start\":\n case \"message_delta\":\n case \"message_stop\":\n case \"content_block_stop\":\n return [];\n\n default:\n unreachable(event as never, logger);\n return [];\n }\n}\n\nexport async function handleSystemMessage(\n message: Extract<SDKMessage, { type: \"system\" }>,\n context: MessageHandlerContext,\n): Promise<void> {\n const { session, sessionId, client, logger } = context;\n\n switch (message.subtype) {\n case \"init\":\n break;\n case \"compact_boundary\":\n await client.extNotification(POSTHOG_NOTIFICATIONS.COMPACT_BOUNDARY, {\n sessionId,\n trigger: message.compact_metadata.trigger,\n preTokens: message.compact_metadata.pre_tokens,\n contextSize: session.contextSize,\n });\n break;\n case \"hook_response\":\n logger.info(\"Hook response received\", {\n hookName: message.hook_name,\n hookEvent: message.hook_event,\n });\n break;\n case \"status\":\n if (message.status === \"compacting\") {\n logger.info(\"Session compacting started\", { sessionId });\n await client.extNotification(POSTHOG_NOTIFICATIONS.STATUS, {\n sessionId,\n status: \"compacting\",\n });\n }\n break;\n case \"task_notification\": {\n logger.info(\"Task notification received\", {\n sessionId,\n taskId: message.task_id,\n status: message.status,\n summary: message.summary,\n });\n await client.extNotification(POSTHOG_NOTIFICATIONS.TASK_NOTIFICATION, {\n sessionId,\n taskId: message.task_id,\n status: message.status,\n summary: message.summary,\n outputFile: message.output_file,\n });\n break;\n }\n default:\n break;\n }\n}\n\nexport type ResultMessageHandlerResult = {\n shouldStop: boolean;\n stopReason?: StopReason;\n error?: Error;\n usage?: {\n inputTokens: number;\n outputTokens: number;\n cachedReadTokens: number;\n cachedWriteTokens: number;\n costUsd?: number;\n contextWindowSize?: number;\n };\n};\n\nexport function handleResultMessage(\n message: SDKResultMessage,\n): ResultMessageHandlerResult {\n const usage = extractUsageFromResult(message);\n\n switch (message.subtype) {\n case \"success\": {\n if (message.result.includes(\"Please run /login\")) {\n return {\n shouldStop: true,\n error: RequestError.authRequired(),\n usage,\n };\n }\n if ((message as Record<string, unknown>).stop_reason === \"max_tokens\") {\n return { shouldStop: true, stopReason: \"max_tokens\", usage };\n }\n if (message.is_error) {\n return {\n shouldStop: true,\n error: RequestError.internalError(undefined, message.result),\n usage,\n };\n }\n return { shouldStop: true, stopReason: \"end_turn\", usage };\n }\n case \"error_during_execution\":\n if ((message as Record<string, unknown>).stop_reason === \"max_tokens\") {\n return { shouldStop: true, stopReason: \"max_tokens\", usage };\n }\n if (message.is_error) {\n return {\n shouldStop: true,\n error: RequestError.internalError(\n undefined,\n message.errors.join(\", \") || message.subtype,\n ),\n usage,\n };\n }\n return { shouldStop: true, stopReason: \"end_turn\", usage };\n case \"error_max_budget_usd\":\n case \"error_max_turns\":\n case \"error_max_structured_output_retries\":\n if (message.is_error) {\n return {\n shouldStop: true,\n error: RequestError.internalError(\n undefined,\n message.errors.join(\", \") || message.subtype,\n ),\n usage,\n };\n }\n return { shouldStop: true, stopReason: \"max_turn_requests\", usage };\n default:\n return { shouldStop: false, usage };\n }\n}\n\nfunction extractUsageFromResult(\n message: SDKResultMessage,\n): ResultMessageHandlerResult[\"usage\"] {\n const msg = message as Record<string, unknown>;\n const msgUsage = msg.usage as Record<string, number> | undefined;\n if (!msgUsage) return undefined;\n\n const modelUsage = msg.modelUsage as\n | Record<string, { contextWindow: number }>\n | undefined;\n let contextWindowSize: number | undefined;\n if (modelUsage) {\n const contextWindows = Object.values(modelUsage).map(\n (m) => m.contextWindow,\n );\n if (contextWindows.length > 0) {\n contextWindowSize = Math.min(...contextWindows);\n }\n }\n\n return {\n inputTokens: msgUsage.input_tokens ?? 0,\n outputTokens: msgUsage.output_tokens ?? 0,\n cachedReadTokens: msgUsage.cache_read_input_tokens ?? 0,\n cachedWriteTokens: msgUsage.cache_creation_input_tokens ?? 0,\n costUsd:\n typeof msg.total_cost_usd === \"number\" ? msg.total_cost_usd : undefined,\n contextWindowSize,\n };\n}\n\nexport async function handleStreamEvent(\n message: SDKPartialAssistantMessage,\n context: MessageHandlerContext,\n): Promise<void> {\n const { sessionId, client, toolUseCache, fileContentCache, logger } = context;\n const parentToolCallId = message.parent_tool_use_id ?? undefined;\n\n for (const notification of streamEventToAcpNotifications(\n message,\n sessionId,\n toolUseCache,\n fileContentCache,\n client,\n logger,\n parentToolCallId,\n context.registerHooks,\n context.supportsTerminalOutput,\n context.session.cwd,\n context.enrichedReadCache,\n )) {\n await client.sessionUpdate(notification);\n context.session.notificationHistory.push(notification);\n }\n}\n\nfunction hasLocalCommandStdout(content: AnthropicMessageContent): boolean {\n return (\n typeof content === \"string\" && content.includes(\"<local-command-stdout>\")\n );\n}\n\nfunction hasLocalCommandStderr(content: AnthropicMessageContent): boolean {\n return (\n typeof content === \"string\" && content.includes(\"<local-command-stderr>\")\n );\n}\n\nfunction isLoginRequiredMessage(message: AnthropicMessageWithContent): boolean {\n return (\n message.type === \"assistant\" &&\n message.message.model === \"<synthetic>\" &&\n Array.isArray(message.message.content) &&\n message.message.content.length === 1 &&\n message.message.content[0].type === \"text\" &&\n message.message.content[0].text?.includes(\"Please run /login\") === true\n );\n}\n\nfunction isPlainTextUserMessage(message: AnthropicMessageWithContent): boolean {\n const content = message.message.content;\n return (\n message.type === \"user\" &&\n (typeof content === \"string\" ||\n (Array.isArray(content) &&\n content.length === 1 &&\n content[0].type === \"text\"))\n );\n}\n\nfunction shouldSkipUserAssistantMessage(\n message: AnthropicMessageWithContent,\n): boolean {\n return (\n hasLocalCommandStdout(message.message.content) ||\n hasLocalCommandStderr(message.message.content) ||\n isLoginRequiredMessage(message)\n );\n}\n\nfunction logSpecialMessages(\n message: AnthropicMessageWithContent,\n logger: Logger,\n): void {\n const content = message.message.content;\n if (hasLocalCommandStdout(content) && typeof content === \"string\") {\n logger.info(content);\n }\n if (hasLocalCommandStderr(content) && typeof content === \"string\") {\n logger.error(content);\n }\n}\n\nfunction filterMessageContent(\n content: AnthropicMessageContent,\n): AnthropicMessageContent {\n if (!Array.isArray(content)) {\n return content;\n }\n return content.filter(\n (block) => block.type !== \"text\" && block.type !== \"thinking\",\n );\n}\n\nexport async function handleUserAssistantMessage(\n message: SDKUserMessage | SDKAssistantMessage,\n context: MessageHandlerContext,\n): Promise<{ shouldStop?: boolean; error?: Error }> {\n const { session, sessionId, client, toolUseCache, fileContentCache, logger } =\n context;\n\n if (shouldSkipUserAssistantMessage(message)) {\n logSpecialMessages(message, logger);\n\n if (isLoginRequiredMessage(message)) {\n return { shouldStop: true, error: RequestError.authRequired() };\n }\n return {};\n }\n\n // Skip plain text user messages (already displayed by the ACP client)\n if (isPlainTextUserMessage(message)) {\n return {};\n }\n\n const content = message.message.content;\n const contentToProcess =\n message.type === \"assistant\" ? filterMessageContent(content) : content;\n const parentToolCallId =\n \"parent_tool_use_id\" in message\n ? (message.parent_tool_use_id ?? undefined)\n : undefined;\n\n // Pass the raw MCP tool result (contains content, structuredContent, _meta)\n // so it can be forwarded as-is to the renderer for MCP Apps\n const mcpToolUseResult =\n message.type === \"user\" && message.tool_use_result != null\n ? (message.tool_use_result as Record<string, unknown>)\n : undefined;\n\n for (const notification of toAcpNotifications(\n contentToProcess as typeof content,\n message.message.role,\n sessionId,\n toolUseCache,\n fileContentCache,\n client,\n logger,\n parentToolCallId,\n context.registerHooks,\n context.supportsTerminalOutput,\n session.cwd,\n mcpToolUseResult,\n context.enrichedReadCache,\n )) {\n await client.sessionUpdate(notification);\n session.notificationHistory.push(notification);\n }\n\n return {};\n}\n","import type { ContentBlock, ToolCallContent } from \"@agentclientprotocol/sdk\";\n\nexport function text(value: string): ContentBlock {\n return { type: \"text\", text: value };\n}\n\nexport function image(\n data: string,\n mimeType: string,\n uri?: string,\n): ContentBlock {\n return { type: \"image\", data, mimeType, uri };\n}\n\nexport function resourceLink(\n uri: string,\n name: string,\n options?: {\n mimeType?: string;\n title?: string;\n description?: string;\n size?: number | null;\n },\n): ContentBlock {\n return {\n type: \"resource_link\",\n uri,\n name,\n ...options,\n };\n}\n\nclass ToolContentBuilder {\n private items: ToolCallContent[] = [];\n\n text(value: string): this {\n this.items.push({ type: \"content\", content: text(value) });\n return this;\n }\n\n image(data: string, mimeType: string, uri?: string): this {\n this.items.push({ type: \"content\", content: image(data, mimeType, uri) });\n return this;\n }\n\n diff(path: string, oldText: string | null, newText: string): this {\n this.items.push({ type: \"diff\", path, oldText, newText });\n return this;\n }\n\n build(): ToolCallContent[] {\n return this.items;\n }\n}\n\nexport function toolContent(): ToolContentBuilder {\n return new ToolContentBuilder();\n}\n","import type { HookCallback, HookInput } from \"@anthropic-ai/claude-agent-sdk\";\nimport {\n enrichFileForAgent,\n type FileEnrichmentDeps,\n} from \"../../enrichment/file-enricher\";\nimport type { Logger } from \"../../utils/logger\";\nimport { stripCatLineNumbers } from \"./conversion/sdk-to-acp\";\nimport type { SettingsManager } from \"./session/settings\";\nimport type { CodeExecutionMode } from \"./tools\";\n\nfunction extractTextFromToolResponse(response: unknown): string | null {\n if (typeof response === \"string\") return response;\n if (!response) return null;\n if (Array.isArray(response)) {\n const parts: string[] = [];\n for (const part of response) {\n if (typeof part === \"string\") {\n parts.push(part);\n } else if (\n part &&\n typeof part === \"object\" &&\n \"text\" in part &&\n typeof (part as { text?: unknown }).text === \"string\"\n ) {\n parts.push((part as { text: string }).text);\n }\n }\n return parts.length > 0 ? parts.join(\"\") : null;\n }\n if (typeof response === \"object\" && response !== null) {\n const maybe = response as {\n content?: unknown;\n text?: unknown;\n file?: { content?: unknown };\n };\n if (\n maybe.file &&\n typeof maybe.file === \"object\" &&\n typeof maybe.file.content === \"string\"\n ) {\n return maybe.file.content;\n }\n if (typeof maybe.text === \"string\") return maybe.text;\n if (maybe.content) return extractTextFromToolResponse(maybe.content);\n }\n return null;\n}\n\n/**\n * Per-toolUseId handoff from the PostToolUse hook to `toolUpdateFromToolResult`.\n * Can't emit a standalone `tool_call_update` because the SDK emits its own\n * when it processes the tool_result, and the renderer applies it via\n * `Object.assign` — our earlier update would be overwritten.\n */\nexport type EnrichedReadCache = Map<string, string>;\n\nexport const createReadEnrichmentHook =\n (deps: FileEnrichmentDeps, cache: EnrichedReadCache): HookCallback =>\n async (input: HookInput) => {\n if (input.hook_event_name !== \"PostToolUse\") return { continue: true };\n if (input.tool_name !== \"Read\") return { continue: true };\n\n const toolInput = input.tool_input as { file_path?: string } | undefined;\n const filePath = toolInput?.file_path;\n if (!filePath) return { continue: true };\n\n const raw = extractTextFromToolResponse(input.tool_response);\n if (!raw) return { continue: true };\n\n const enriched = await enrichFileForAgent(\n deps,\n filePath,\n stripCatLineNumbers(raw),\n );\n if (!enriched) return { continue: true };\n\n if (input.tool_use_id) {\n cache.set(input.tool_use_id, enriched);\n }\n\n return {\n continue: true,\n hookSpecificOutput: {\n hookEventName: \"PostToolUse\" as const,\n additionalContext: [\n `## PostHog metadata for ${filePath}`,\n \"\",\n \"The file below is annotated with live data from the user's PostHog project:\",\n \"flag type / rollout / staleness / linked experiment, and for events the verification status,\",\n \"30-day volume, and unique-user count. Treat these as authoritative product context —\",\n \"they describe what is actually running in production.\",\n \"\",\n enriched,\n ].join(\"\\n\"),\n },\n };\n };\n\nconst toolUseCallbacks: {\n [toolUseId: string]: {\n onPostToolUseHook?: (\n toolUseID: string,\n toolInput: unknown,\n toolResponse: unknown,\n ) => Promise<void>;\n };\n} = {};\n\nexport const registerHookCallback = (\n toolUseID: string,\n {\n onPostToolUseHook,\n }: {\n onPostToolUseHook?: (\n toolUseID: string,\n toolInput: unknown,\n toolResponse: unknown,\n ) => Promise<void>;\n },\n) => {\n toolUseCallbacks[toolUseID] = {\n onPostToolUseHook,\n };\n};\n\nexport type OnModeChange = (mode: CodeExecutionMode) => Promise<void>;\n\ninterface CreatePostToolUseHookParams {\n onModeChange?: OnModeChange;\n logger?: Logger;\n}\n\nexport const createPostToolUseHook =\n ({ onModeChange, logger }: CreatePostToolUseHookParams): HookCallback =>\n async (\n input: HookInput,\n toolUseID: string | undefined,\n ): Promise<{ continue: boolean }> => {\n if (input.hook_event_name === \"PostToolUse\") {\n const toolName = input.tool_name;\n\n if (onModeChange && toolName === \"EnterPlanMode\") {\n await onModeChange(\"plan\");\n }\n\n if (toolUseID) {\n const onPostToolUseHook =\n toolUseCallbacks[toolUseID]?.onPostToolUseHook;\n if (onPostToolUseHook) {\n await onPostToolUseHook(\n toolUseID,\n input.tool_input,\n input.tool_response,\n );\n delete toolUseCallbacks[toolUseID];\n } else {\n delete toolUseCallbacks[toolUseID];\n }\n }\n }\n return { continue: true };\n };\n\n/**\n * Rewrites Agent tool calls targeting built-in subagent types to use our custom\n * definitions instead. This works around a Claude Agent SDK bug where\n * `options.agents` cannot override built-in agent definitions because the\n * built-ins appear first in the agents array and `Array.find()` returns the\n * first match.\n *\n * By giving our custom agent a different name (e.g. \"ph-explore\") and rewriting\n * the subagent_type in the tool input, we sidestep the collision entirely.\n *\n * https://github.com/anthropics/claude-agent-sdk-typescript/issues/267\n */\nconst SUBAGENT_REWRITES: Record<string, string> = {\n Explore: \"ph-explore\",\n};\n\nexport const createSubagentRewriteHook =\n (logger: Logger): HookCallback =>\n async (input: HookInput, _toolUseID: string | undefined) => {\n if (input.hook_event_name !== \"PreToolUse\") {\n return { continue: true };\n }\n\n if (input.tool_name !== \"Agent\") {\n return { continue: true };\n }\n\n const toolInput = input.tool_input as Record<string, unknown> | undefined;\n const subagentType = toolInput?.subagent_type;\n if (typeof subagentType !== \"string\" || !SUBAGENT_REWRITES[subagentType]) {\n return { continue: true };\n }\n\n const target = SUBAGENT_REWRITES[subagentType];\n logger.info(\n `[SubagentRewriteHook] Rewriting subagent_type: ${subagentType} → ${target}`,\n );\n\n return {\n continue: true,\n hookSpecificOutput: {\n hookEventName: \"PreToolUse\" as const,\n updatedInput: {\n ...toolInput,\n subagent_type: target,\n },\n },\n };\n };\n\nexport const createPreToolUseHook =\n (settingsManager: SettingsManager, logger: Logger): HookCallback =>\n async (input: HookInput, _toolUseID: string | undefined) => {\n if (input.hook_event_name !== \"PreToolUse\") {\n return { continue: true };\n }\n\n const toolName = input.tool_name;\n const toolInput = input.tool_input;\n const permissionCheck = settingsManager.checkPermission(\n toolName,\n toolInput,\n );\n\n if (permissionCheck.decision !== \"ask\") {\n logger.info(\n `[PreToolUseHook] Tool: ${toolName}, Decision: ${permissionCheck.decision}, Rule: ${permissionCheck.rule}`,\n );\n }\n\n switch (permissionCheck.decision) {\n case \"allow\":\n return {\n continue: true,\n hookSpecificOutput: {\n hookEventName: \"PreToolUse\" as const,\n permissionDecision: \"allow\" as const,\n permissionDecisionReason: `Allowed by settings rule: ${permissionCheck.rule}`,\n },\n };\n case \"deny\":\n return {\n continue: true,\n hookSpecificOutput: {\n hookEventName: \"PreToolUse\" as const,\n permissionDecision: \"deny\" as const,\n permissionDecisionReason: `Denied by settings rule: ${permissionCheck.rule}`,\n },\n };\n default:\n return { continue: true };\n }\n };\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type {\n PlanEntry,\n ToolCall,\n ToolCallContent,\n ToolCallLocation,\n ToolCallUpdate,\n ToolKind,\n} from \"@agentclientprotocol/sdk\";\nimport type {\n ToolResultBlockParam,\n ToolUseBlock,\n WebSearchToolResultBlockParam,\n} from \"@anthropic-ai/sdk/resources\";\nimport type {\n BetaBashCodeExecutionToolResultBlockParam,\n BetaCodeExecutionToolResultBlockParam,\n BetaRequestMCPToolResultBlockParam,\n BetaTextEditorCodeExecutionToolResultBlockParam,\n BetaToolSearchToolResultBlockParam,\n BetaWebFetchToolResultBlockParam,\n BetaWebSearchToolResultBlockParam,\n} from \"@anthropic-ai/sdk/resources/beta.mjs\";\n\nconst SYSTEM_REMINDER_REGEX =\n /\\s*<system-reminder>[\\s\\S]*?<\\/system-reminder>/g;\n\nfunction stripSystemReminders(value: string): string {\n return value.replace(SYSTEM_REMINDER_REGEX, \"\");\n}\n\nimport { resourceLink, text, toolContent } from \"../../../utils/acp-content\";\nimport type { EnrichedReadCache } from \"../hooks\";\nimport { getMcpToolMetadata } from \"../mcp/tool-metadata\";\n\ntype ToolInfo = Pick<ToolCall, \"title\" | \"kind\" | \"content\" | \"locations\">;\n\n/**\n * Convert an absolute file path to a project-relative path for display.\n * Returns the original path if it's outside the project directory or if no cwd is provided.\n */\nexport function toDisplayPath(filePath: string, cwd?: string): string {\n if (!cwd) return filePath;\n const resolvedCwd = path.resolve(cwd);\n const resolvedFile = path.resolve(filePath);\n if (\n resolvedFile.startsWith(resolvedCwd + path.sep) ||\n resolvedFile === resolvedCwd\n ) {\n return path.relative(resolvedCwd, resolvedFile);\n }\n return filePath;\n}\n\nexport function toolInfoFromToolUse(\n toolUse: Pick<ToolUseBlock, \"name\" | \"input\">,\n options?: {\n supportsTerminalOutput?: boolean;\n toolUseId?: string;\n cachedFileContent?: Record<string, string>;\n cwd?: string;\n },\n): ToolInfo {\n const name = toolUse.name;\n const input = toolUse.input as Record<string, unknown> | undefined;\n\n switch (name) {\n case \"Task\":\n case \"Agent\":\n return {\n title: input?.description ? String(input.description) : name,\n kind: \"think\",\n content: input?.prompt\n ? toolContent().text(String(input.prompt)).build()\n : [],\n };\n\n case \"NotebookRead\":\n return {\n title: input?.notebook_path\n ? `Read Notebook ${String(input.notebook_path)}`\n : \"Read Notebook\",\n kind: \"read\",\n content: [],\n locations: input?.notebook_path\n ? [{ path: String(input.notebook_path) }]\n : [],\n };\n\n case \"NotebookEdit\":\n return {\n title: input?.notebook_path\n ? `Edit Notebook ${String(input.notebook_path)}`\n : \"Edit Notebook\",\n kind: \"edit\",\n content: input?.new_source\n ? toolContent().text(String(input.new_source)).build()\n : [],\n locations: input?.notebook_path\n ? [{ path: String(input.notebook_path) }]\n : [],\n };\n\n case \"Bash\":\n if (options?.supportsTerminalOutput && options?.toolUseId) {\n return {\n title: input?.description\n ? String(input.description)\n : \"Execute command\",\n kind: \"execute\",\n content: [{ type: \"terminal\", terminalId: options.toolUseId }],\n };\n }\n return {\n title: input?.description\n ? String(input.description)\n : \"Execute command\",\n kind: \"execute\",\n content: input?.command\n ? toolContent().text(String(input.command)).build()\n : [],\n };\n\n case \"BashOutput\":\n return {\n title: \"Tail Logs\",\n kind: \"execute\",\n content: [],\n };\n\n case \"KillShell\":\n return {\n title: \"Kill Process\",\n kind: \"execute\",\n content: [],\n };\n\n case \"Read\": {\n let limit = \"\";\n const inputLimit = input?.limit as number | undefined;\n const inputOffset = (input?.offset as number | undefined) ?? 1;\n if (inputLimit) {\n limit = ` (${inputOffset} - ${inputOffset + inputLimit - 1})`;\n } else if (inputOffset > 1) {\n limit = ` (from line ${inputOffset})`;\n }\n const displayPath = input?.file_path\n ? toDisplayPath(String(input.file_path), options?.cwd)\n : \"File\";\n return {\n title: `Read ${displayPath}${limit}`,\n kind: \"read\",\n locations: input?.file_path\n ? [\n {\n path: String(input.file_path),\n line: inputOffset,\n },\n ]\n : [],\n content: [],\n };\n }\n\n case \"LS\":\n return {\n title: `List the ${input?.path ? `\\`${String(input.path)}\\`` : \"current\"} directory's contents`,\n kind: \"search\",\n content: [],\n locations: [],\n };\n\n case \"Edit\": {\n const filePath = input?.file_path ? String(input.file_path) : undefined;\n const displayPath = filePath\n ? toDisplayPath(filePath, options?.cwd)\n : undefined;\n let oldText: string | null = input?.old_string\n ? String(input.old_string)\n : null;\n let newText: string = input?.new_string ? String(input.new_string) : \"\";\n\n // try to display a rich diff by first checking if file content is cached\n // and valid (old_text exists in the content), then fall back to reading\n // file from disk, then fall back to fragemented snippet diff\n if (filePath && oldText !== null) {\n const fileContent = resolveFileContent(\n filePath,\n oldText,\n options?.cachedFileContent,\n );\n if (fileContent) {\n const newContent = input?.replace_all\n ? fileContent.replaceAll(oldText, newText)\n : fileContent.replace(oldText, newText);\n oldText = fileContent;\n newText = newContent;\n }\n }\n\n return {\n title: displayPath ? `Edit \\`${displayPath}\\`` : \"Edit\",\n kind: \"edit\",\n content:\n input && filePath\n ? [\n {\n type: \"diff\",\n path: filePath,\n oldText,\n newText,\n },\n ]\n : [],\n locations: filePath ? [{ path: filePath }] : [],\n };\n }\n\n case \"Write\": {\n let contentResult: ToolCallContent[] = [];\n const writeFilePath = input?.file_path\n ? String(input.file_path)\n : undefined;\n const writeDisplayPath = writeFilePath\n ? toDisplayPath(writeFilePath, options?.cwd)\n : undefined;\n const contentStr = input?.content ? String(input.content) : undefined;\n if (writeFilePath) {\n let oldContent: string | null = null;\n if (\n options?.cachedFileContent &&\n writeFilePath in options.cachedFileContent\n ) {\n oldContent = options.cachedFileContent[writeFilePath];\n } else {\n try {\n oldContent = fs.readFileSync(writeFilePath, \"utf-8\");\n } catch {\n // File doesn't exist — genuinely a new file\n }\n }\n contentResult = toolContent()\n .diff(writeFilePath, oldContent, contentStr ?? \"\")\n .build();\n } else if (contentStr) {\n contentResult = toolContent().text(contentStr).build();\n }\n return {\n title: writeDisplayPath ? `Write ${writeDisplayPath}` : \"Write\",\n kind: \"edit\",\n content: contentResult,\n locations: writeFilePath ? [{ path: writeFilePath }] : [],\n };\n }\n\n case \"Glob\": {\n let label = \"Find\";\n const pathStr = input?.path ? String(input.path) : undefined;\n if (pathStr) {\n label += ` \"${pathStr}\"`;\n }\n if (input?.pattern) {\n label += ` \"${String(input.pattern)}\"`;\n }\n return {\n title: label,\n kind: \"search\",\n content: [],\n locations: pathStr ? [{ path: pathStr }] : [],\n };\n }\n\n case \"Grep\": {\n let label = \"grep\";\n\n if (input?.[\"-i\"]) {\n label += \" -i\";\n }\n if (input?.[\"-n\"]) {\n label += \" -n\";\n }\n\n if (input?.[\"-A\"] !== undefined) {\n label += ` -A ${input[\"-A\"]}`;\n }\n if (input?.[\"-B\"] !== undefined) {\n label += ` -B ${input[\"-B\"]}`;\n }\n if (input?.[\"-C\"] !== undefined) {\n label += ` -C ${input[\"-C\"]}`;\n }\n\n if (input?.output_mode) {\n switch (input.output_mode) {\n case \"files_with_matches\":\n label += \" -l\";\n break;\n case \"count\":\n label += \" -c\";\n break;\n default:\n break;\n }\n }\n\n if (input?.head_limit !== undefined) {\n label += ` | head -${input.head_limit}`;\n }\n\n if (input?.glob) {\n label += ` --include=\"${String(input.glob)}\"`;\n }\n\n if (input?.type) {\n label += ` --type=${String(input.type)}`;\n }\n\n if (input?.multiline) {\n label += \" -P\";\n }\n\n if (input?.pattern) {\n label += ` \"${String(input.pattern)}\"`;\n }\n\n if (input?.path) {\n label += ` ${String(input.path)}`;\n }\n\n return {\n title: label,\n kind: \"search\",\n content: [],\n };\n }\n\n case \"WebFetch\":\n return {\n title: \"Fetch\",\n kind: \"fetch\",\n content: input?.url\n ? [\n {\n type: \"content\",\n content: resourceLink(String(input.url), String(input.url), {\n description: input?.prompt ? String(input.prompt) : undefined,\n }),\n },\n ]\n : [],\n };\n\n case \"WebSearch\": {\n let label = `\"${input?.query ? String(input.query) : \"\"}\"`;\n const allowedDomains = input?.allowed_domains as string[] | undefined;\n const blockedDomains = input?.blocked_domains as string[] | undefined;\n\n if (allowedDomains && allowedDomains.length > 0) {\n label += ` (allowed: ${allowedDomains.join(\", \")})`;\n }\n\n if (blockedDomains && blockedDomains.length > 0) {\n label += ` (blocked: ${blockedDomains.join(\", \")})`;\n }\n\n return {\n title: label,\n kind: \"fetch\",\n content: [],\n };\n }\n\n case \"TodoWrite\":\n return {\n title: Array.isArray(input?.todos)\n ? `Update TODOs: ${input.todos.map((todo: { content?: string }) => todo.content).join(\", \")}`\n : \"Update TODOs\",\n kind: \"think\",\n content: [],\n };\n\n case \"ExitPlanMode\":\n return {\n title: \"Ready to code?\",\n kind: \"switch_mode\",\n content: input?.plan\n ? toolContent().text(String(input.plan)).build()\n : [],\n };\n\n case \"AskUserQuestion\": {\n const questions = input?.questions as\n | Array<{ question?: string }>\n | undefined;\n return {\n title: questions?.[0]?.question || \"Question\",\n kind: \"other\" as ToolKind,\n content: questions\n ? toolContent()\n .text(JSON.stringify(questions, null, 2))\n .build()\n : [],\n };\n }\n\n case \"Other\": {\n let output: string;\n try {\n output = JSON.stringify(input, null, 2);\n } catch {\n output = typeof input === \"string\" ? input : \"{}\";\n }\n return {\n title: name || \"Unknown Tool\",\n kind: \"other\",\n content: toolContent().text(`\\`\\`\\`json\\n${output}\\`\\`\\``).build(),\n };\n }\n\n default: {\n if (name?.startsWith(\"mcp__\")) {\n return mcpToolInfo(name, input);\n }\n return {\n title: name || \"Unknown Tool\",\n kind: \"other\",\n content: [],\n };\n }\n }\n}\n\nfunction mcpToolInfo(\n name: string,\n _input: Record<string, unknown> | undefined,\n): ToolInfo {\n const metadata = getMcpToolMetadata(name);\n // Fallback: parse tool name from mcp__<server>__<tool> prefix\n const title =\n metadata?.name ?? (name.split(\"__\").slice(2).join(\"__\") || name);\n\n return {\n title,\n kind: \"other\",\n content: [],\n };\n}\n\ninterface StructuredPatchHunk {\n oldStart: number;\n oldLines: number;\n newStart: number;\n newLines: number;\n lines: string[];\n}\n\ninterface StructuredPatch {\n oldFileName: string;\n newFileName: string;\n hunks: StructuredPatchHunk[];\n}\n\nexport function toolUpdateFromEditToolResponse(\n toolResponse: unknown,\n): { content: ToolCallContent[]; locations: ToolCallLocation[] } | null {\n if (!toolResponse || typeof toolResponse !== \"object\") return null;\n const response = toolResponse as Record<string, unknown>;\n\n const patches = response.structuredPatch as StructuredPatch[] | undefined;\n if (!Array.isArray(patches) || patches.length === 0) return null;\n\n const content: ToolCallContent[] = [];\n const locations: ToolCallLocation[] = [];\n\n for (const patch of patches) {\n if (!patch.hunks || patch.hunks.length === 0) continue;\n\n const filePath = patch.newFileName || patch.oldFileName;\n\n const oldLines: string[] = [];\n const newLines: string[] = [];\n for (const hunk of patch.hunks) {\n for (const line of hunk.lines) {\n if (line.startsWith(\"-\")) {\n oldLines.push(line.slice(1));\n } else if (line.startsWith(\"+\")) {\n newLines.push(line.slice(1));\n } else if (line.startsWith(\" \")) {\n oldLines.push(line.slice(1));\n newLines.push(line.slice(1));\n }\n }\n }\n\n content.push({\n type: \"diff\",\n path: filePath,\n oldText: oldLines.join(\"\\n\"),\n newText: newLines.join(\"\\n\"),\n });\n\n const firstHunk = patch.hunks[0];\n locations.push({\n path: filePath,\n line: firstHunk.newStart,\n });\n }\n\n if (content.length === 0) return null;\n return { content, locations };\n}\n\nexport function toolUpdateFromToolResult(\n toolResult:\n | ToolResultBlockParam\n | BetaWebSearchToolResultBlockParam\n | BetaWebFetchToolResultBlockParam\n | WebSearchToolResultBlockParam\n | BetaCodeExecutionToolResultBlockParam\n | BetaBashCodeExecutionToolResultBlockParam\n | BetaTextEditorCodeExecutionToolResultBlockParam\n | BetaRequestMCPToolResultBlockParam\n | BetaToolSearchToolResultBlockParam,\n toolUse: Pick<ToolUseBlock, \"name\" | \"input\"> | undefined,\n options?: {\n supportsTerminalOutput?: boolean;\n toolUseId?: string;\n cachedFileContent?: Record<string, string>;\n enrichedReadCache?: EnrichedReadCache;\n },\n): Pick<ToolCallUpdate, \"title\" | \"content\" | \"locations\" | \"_meta\"> {\n if (\n \"is_error\" in toolResult &&\n toolResult.is_error &&\n toolResult.content &&\n (toolResult.content as unknown[]).length > 0\n ) {\n return toAcpContentUpdate(toolResult.content, true);\n }\n\n switch (toolUse?.name) {\n case \"Read\": {\n const cache = options?.enrichedReadCache;\n const enriched =\n cache && options?.toolUseId ? cache.get(options.toolUseId) : undefined;\n if (enriched !== undefined && cache && options?.toolUseId) {\n cache.delete(options.toolUseId);\n return {\n content: [\n {\n type: \"content\" as const,\n content: text(markdownEscape(enriched)),\n },\n ],\n };\n }\n if (Array.isArray(toolResult.content) && toolResult.content.length > 0) {\n return {\n content: toolResult.content.map((item) => {\n const itemObj = item as {\n type?: string;\n text?: string;\n source?: { data?: string; media_type?: string };\n };\n if (itemObj.type === \"text\") {\n return {\n type: \"content\" as const,\n content: text(\n markdownEscape(stripSystemReminders(itemObj.text ?? \"\")),\n ),\n };\n }\n if (itemObj.type === \"image\" && itemObj.source) {\n return {\n type: \"content\" as const,\n content: {\n type: \"image\" as const,\n data: itemObj.source.data ?? \"\",\n mimeType: itemObj.source.media_type ?? \"image/png\",\n },\n };\n }\n return {\n type: \"content\" as const,\n content: item as { type: \"text\"; text: string },\n };\n }),\n };\n } else if (\n typeof toolResult.content === \"string\" &&\n toolResult.content.length > 0\n ) {\n return {\n content: toolContent()\n .text(markdownEscape(stripSystemReminders(toolResult.content)))\n .build(),\n };\n }\n return {};\n }\n\n case \"Bash\": {\n const result = toolResult.content;\n const terminalId =\n \"tool_use_id\" in toolResult ? String(toolResult.tool_use_id) : \"\";\n const isError = \"is_error\" in toolResult && toolResult.is_error;\n\n let output = \"\";\n let exitCode = isError ? 1 : 0;\n\n if (\n result &&\n typeof result === \"object\" &&\n \"type\" in result &&\n (result as { type: string }).type === \"bash_code_execution_result\"\n ) {\n const bashResult = result as {\n stdout?: string;\n stderr?: string;\n return_code: number;\n };\n output = [bashResult.stdout, bashResult.stderr]\n .filter(Boolean)\n .join(\"\\n\");\n exitCode = bashResult.return_code;\n } else if (typeof result === \"string\") {\n output = result;\n } else if (\n Array.isArray(result) &&\n result.length > 0 &&\n \"text\" in result[0] &&\n typeof result[0].text === \"string\"\n ) {\n output = result.map((c: { text?: string }) => c.text ?? \"\").join(\"\\n\");\n }\n\n if (options?.supportsTerminalOutput) {\n return {\n content: [{ type: \"terminal\" as const, terminalId }],\n _meta: {\n terminal_info: {\n terminal_id: terminalId,\n },\n terminal_output: {\n terminal_id: terminalId,\n data: output,\n },\n terminal_exit: {\n terminal_id: terminalId,\n exit_code: exitCode,\n signal: null,\n },\n },\n };\n }\n if (output.trim()) {\n return {\n content: toolContent()\n .text(`\\`\\`\\`console\\n${output.trimEnd()}\\n\\`\\`\\``)\n .build(),\n };\n }\n return {};\n }\n case \"Edit\":\n case \"Write\":\n return {};\n\n case \"ExitPlanMode\": {\n return { title: \"Exited Plan Mode\" };\n }\n case \"AskUserQuestion\": {\n const content = toolResult.content;\n if (Array.isArray(content) && content.length > 0) {\n const firstItem = content[0];\n if (\n typeof firstItem === \"object\" &&\n firstItem !== null &&\n \"text\" in firstItem\n ) {\n return {\n title: \"Answer received\",\n content: toolContent().text(String(firstItem.text)).build(),\n };\n }\n }\n return { title: \"Question answered\" };\n }\n case \"WebFetch\": {\n const input = toolUse?.input as Record<string, unknown> | undefined;\n const url = input?.url ? String(input.url) : \"\";\n const prompt = input?.prompt ? String(input.prompt) : undefined;\n\n const resultContent = toAcpContentUpdate(\n toolResult.content,\n \"is_error\" in toolResult ? toolResult.is_error : false,\n );\n\n const content: ToolCallContent[] = [];\n if (url) {\n content.push({\n type: \"content\",\n content: resourceLink(url, url, {\n description: prompt,\n }),\n });\n }\n if (resultContent.content) {\n content.push(...resultContent.content);\n }\n\n return { content };\n }\n default: {\n return toAcpContentUpdate(\n toolResult.content,\n \"is_error\" in toolResult ? toolResult.is_error : false,\n );\n }\n }\n}\n\nfunction itemToText(item: unknown): string | null {\n if (!item || typeof item !== \"object\") return null;\n const obj = item as Record<string, unknown>;\n // Standard text block\n if (obj.type === \"text\" && typeof obj.text === \"string\") {\n return stripSystemReminders(obj.text);\n }\n // Any other structured object — serialize it\n try {\n return JSON.stringify(obj, null, 2);\n } catch {\n return null;\n }\n}\n\nfunction toAcpContentUpdate(\n content: unknown,\n isError: boolean = false,\n): Pick<ToolCallUpdate, \"content\"> {\n if (Array.isArray(content) && content.length > 0) {\n const texts: string[] = [];\n for (const item of content) {\n const t = itemToText(item);\n if (t) texts.push(t);\n }\n if (texts.length > 0) {\n const combined = texts.join(\"\\n\");\n return {\n content: toolContent()\n .text(isError ? `\\`\\`\\`\\n${combined}\\n\\`\\`\\`` : combined)\n .build(),\n };\n }\n } else if (typeof content === \"string\" && content.length > 0) {\n return {\n content: toolContent()\n .text(isError ? `\\`\\`\\`\\n${content}\\n\\`\\`\\`` : content)\n .build(),\n };\n } else if (content && typeof content === \"object\") {\n try {\n const json = JSON.stringify(content, null, 2);\n if (json && json !== \"{}\") {\n return {\n content: toolContent().text(json).build(),\n };\n }\n } catch {\n // ignore serialization errors\n }\n }\n return {};\n}\n\nexport type ClaudePlanEntry = {\n content: string;\n status: \"pending\" | \"in_progress\" | \"completed\";\n activeForm: string;\n};\n\nexport function planEntries(input: { todos: ClaudePlanEntry[] }): PlanEntry[] {\n return input.todos.map((input) => ({\n content: input.content,\n status: input.status,\n priority: \"medium\",\n }));\n}\n\n/**\n * attempt to resolve full file contents for diff generation\n *\n * 1) check file content cache exists, and is valid (old_text in content)\n * 2) if missing or invalid, read file from disk\n * 3) if both fail, return null, we'll fall back to fragmented snippet diff\n */\nfunction resolveFileContent(\n filePath: string,\n oldText: string,\n cachedFileContent?: Record<string, string>,\n): string | null {\n if (cachedFileContent && filePath in cachedFileContent) {\n const cached = cachedFileContent[filePath];\n if (cached.includes(oldText)) {\n return cached;\n }\n }\n\n try {\n const content = fs.readFileSync(filePath, \"utf-8\");\n if (content.includes(oldText)) {\n return content;\n }\n } catch {\n return null;\n }\n\n return null;\n}\n\nfunction markdownEscape(text: string): string {\n let escapedText = \"```\";\n for (const [m] of text.matchAll(/^```+/gm)) {\n while (m.length >= escapedText.length) {\n escapedText += \"`\";\n }\n }\n return `${escapedText}\\n${text}${text.endsWith(\"\\n\") ? \"\" : \"\\n\"}${escapedText}`;\n}\n","import type { McpServerStatus, Query } from \"@anthropic-ai/claude-agent-sdk\";\nimport { Logger } from \"../../../utils/logger\";\n\nexport interface McpToolMetadata {\n readOnly: boolean;\n name: string;\n description?: string;\n}\n\nconst mcpToolMetadataCache: Map<string, McpToolMetadata> = new Map();\n\nconst PENDING_RETRY_INTERVAL_MS = 1_000;\nconst PENDING_MAX_RETRIES = 10;\n\nfunction buildToolKey(serverName: string, toolName: string): string {\n return `mcp__${serverName}__${toolName}`;\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function fetchMcpToolMetadata(\n q: Query,\n logger: Logger = new Logger({ debug: false, prefix: \"[McpToolMetadata]\" }),\n): Promise<void> {\n let retries = 0;\n\n while (retries <= PENDING_MAX_RETRIES) {\n let statuses: McpServerStatus[];\n try {\n statuses = await q.mcpServerStatus();\n } catch (error) {\n logger.error(\"Failed to fetch MCP server status\", {\n error: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n\n const pendingServers = statuses.filter((s) => s.status === \"pending\");\n\n for (const server of statuses) {\n if (server.status !== \"connected\" || !server.tools) {\n continue;\n }\n\n let readOnlyCount = 0;\n for (const tool of server.tools) {\n const toolKey = buildToolKey(server.name, tool.name);\n const readOnly = tool.annotations?.readOnly === true;\n\n mcpToolMetadataCache.set(toolKey, {\n readOnly,\n name: tool.name,\n description: tool.description,\n });\n if (readOnly) readOnlyCount++;\n }\n\n logger.info(\"Fetched MCP tool metadata\", {\n serverName: server.name,\n toolCount: server.tools.length,\n readOnlyCount,\n });\n }\n\n if (pendingServers.length === 0) {\n return;\n }\n\n retries++;\n if (retries > PENDING_MAX_RETRIES) {\n logger.warn(\"Gave up waiting for pending MCP servers\", {\n pendingServers: pendingServers.map((s) => s.name),\n });\n return;\n }\n\n logger.info(\"Waiting for pending MCP servers\", {\n pendingServers: pendingServers.map((s) => s.name),\n retry: retries,\n });\n await delay(PENDING_RETRY_INTERVAL_MS);\n }\n}\n\nexport function getMcpToolMetadata(\n toolName: string,\n): McpToolMetadata | undefined {\n return mcpToolMetadataCache.get(toolName);\n}\n\nexport function isMcpToolReadOnly(toolName: string): boolean {\n const metadata = mcpToolMetadataCache.get(toolName);\n return metadata?.readOnly === true;\n}\n\nexport function getConnectedMcpServerNames(): string[] {\n const names = new Set<string>();\n for (const key of mcpToolMetadataCache.keys()) {\n const parts = key.split(\"__\");\n if (parts.length >= 3) names.add(parts[1]);\n }\n return [...names];\n}\n\nexport function clearMcpToolMetadataCache(): void {\n mcpToolMetadataCache.clear();\n}\n","import * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { SessionNotification } from \"@agentclientprotocol/sdk\";\n\nfunction getClaudeConfigDir(): string {\n return process.env.CLAUDE_CONFIG_DIR || path.join(os.homedir(), \".claude\");\n}\n\nexport function getClaudePlansDir(): string {\n return path.join(getClaudeConfigDir(), \"plans\");\n}\n\nexport function isClaudePlanFilePath(filePath: string | undefined): boolean {\n if (!filePath) return false;\n const resolved = path.resolve(filePath);\n const plansDir = path.resolve(getClaudePlansDir());\n return resolved === plansDir || resolved.startsWith(plansDir + path.sep);\n}\n\nexport function isPlanReady(plan: string | undefined): boolean {\n if (!plan) return false;\n const trimmed = plan.trim();\n if (trimmed.length < 40) return false;\n return /(^|\\n)#{1,6}\\s+\\S/.test(trimmed);\n}\n\nexport function getLatestAssistantText(\n notifications: SessionNotification[],\n): string | null {\n const chunks: string[] = [];\n let started = false;\n\n for (let i = notifications.length - 1; i >= 0; i -= 1) {\n const update = notifications[i]?.update;\n if (!update) continue;\n\n if (update.sessionUpdate === \"agent_message_chunk\") {\n started = true;\n const content = update.content as {\n type?: string;\n text?: string;\n } | null;\n if (content?.type === \"text\" && content.text) {\n chunks.push(content.text);\n }\n continue;\n }\n\n if (started) {\n break;\n }\n }\n\n if (chunks.length === 0) return null;\n return chunks.reverse().join(\"\");\n}\n","import type { ToolCallContent, ToolKind } from \"@agentclientprotocol/sdk\";\nimport { z } from \"zod\";\nimport type { PermissionOption } from \"../permissions/permission-options\";\n\nexport const OPTION_PREFIX = \"option_\";\n\nexport const QuestionOptionSchema = z.object({\n label: z.string(),\n description: z.string().optional(),\n});\n\nexport const QuestionItemSchema = z.object({\n question: z.string(),\n header: z.string().optional(),\n options: z.array(QuestionOptionSchema),\n multiSelect: z.boolean().optional(),\n completed: z.boolean().optional(),\n});\n\nexport const QuestionMetaSchema = z.object({\n questions: z.array(QuestionItemSchema),\n});\n\nexport type QuestionOption = z.infer<typeof QuestionOptionSchema>;\nexport type QuestionItem = z.infer<typeof QuestionItemSchema>;\nexport type QuestionMeta = z.infer<typeof QuestionMetaSchema>;\n\nexport interface AskUserQuestionInput {\n questions?: QuestionItem[];\n question?: string;\n header?: string;\n options?: QuestionOption[];\n multiSelect?: boolean;\n}\n\nexport function normalizeAskUserQuestionInput(\n input: AskUserQuestionInput,\n): QuestionItem[] | null {\n if (input.questions && input.questions.length > 0) {\n return input.questions;\n }\n\n if (input.question) {\n return [\n {\n question: input.question,\n header: input.header,\n options: input.options || [],\n multiSelect: input.multiSelect,\n },\n ];\n }\n\n return null;\n}\n\ninterface QuestionToolCallData {\n toolCallId: string;\n title: string;\n kind: ToolKind;\n content: ToolCallContent[];\n _meta: {\n codeToolKind: \"question\";\n questions: QuestionItem[];\n };\n}\n\nexport function buildQuestionToolCallData(\n questions: QuestionItem[],\n): QuestionToolCallData {\n return {\n toolCallId: `question-${Date.now()}`,\n title: questions[0]?.question ?? \"Question\",\n kind: \"other\",\n content: [],\n _meta: {\n codeToolKind: \"question\",\n questions,\n },\n };\n}\n\nexport function buildQuestionOptions(\n question: QuestionItem,\n): PermissionOption[] {\n return question.options.map((opt, idx) => ({\n kind: \"allow_once\" as const,\n name: opt.label,\n optionId: `${OPTION_PREFIX}${idx}`,\n _meta: opt.description ? { description: opt.description } : undefined,\n }));\n}\n","import { IS_ROOT } from \"./utils/common\";\n\nexport interface ModeInfo {\n id: string;\n name: string;\n description: string;\n}\n\n// Helper constant that can easily be toggled for env/feature flag/etc\nconst ALLOW_BYPASS = !IS_ROOT;\n\nconst availableModes: ModeInfo[] = [\n {\n id: \"default\",\n name: \"Default\",\n description: \"Standard behavior, prompts for dangerous operations\",\n },\n {\n id: \"acceptEdits\",\n name: \"Accept Edits\",\n description: \"Auto-accept file edit operations\",\n },\n {\n id: \"plan\",\n name: \"Plan Mode\",\n description: \"Planning mode, no actual tool execution\",\n },\n];\n\nif (ALLOW_BYPASS) {\n availableModes.push(\n {\n id: \"bypassPermissions\",\n name: \"Bypass Permissions\",\n description: \"Auto-accept all permission requests\",\n },\n {\n id: \"auto\",\n name: \"Auto Mode\",\n description: \"Use a model classifier to approve/deny permission prompts\",\n },\n );\n}\n\n// Expose execution mode IDs in type-safe order for type checks\nexport const CODE_EXECUTION_MODES = [\n \"default\",\n \"acceptEdits\",\n \"plan\",\n \"bypassPermissions\",\n \"auto\",\n] as const;\n\nexport type CodeExecutionMode = (typeof CODE_EXECUTION_MODES)[number];\n\nexport function isCodeExecutionMode(mode: string): mode is CodeExecutionMode {\n return (CODE_EXECUTION_MODES as readonly string[]).includes(mode);\n}\n\nexport function getAvailableModes(): ModeInfo[] {\n return IS_ROOT\n ? availableModes.filter((m) => m.id !== \"bypassPermissions\")\n : availableModes;\n}\n\n// --- Codex-native modes ---\n\nexport const CODEX_NATIVE_MODES = [\"auto\", \"read-only\", \"full-access\"] as const;\n\nexport type CodexNativeMode = (typeof CODEX_NATIVE_MODES)[number];\n\n/** Union of all permission mode IDs across adapters */\nexport type PermissionMode = CodeExecutionMode | CodexNativeMode;\n\nexport function isCodexNativeMode(mode: string): mode is CodexNativeMode {\n return (CODEX_NATIVE_MODES as readonly string[]).includes(mode);\n}\n\nconst codexModes: ModeInfo[] = [\n {\n id: \"read-only\",\n name: \"Read Only\",\n description: \"Read-only access, no file modifications\",\n },\n {\n id: \"auto\",\n name: \"Auto\",\n description: \"Standard behavior, prompts for dangerous operations\",\n },\n];\n\nif (ALLOW_BYPASS) {\n codexModes.push({\n id: \"full-access\",\n name: \"Full Access\",\n description: \"Auto-accept all permission requests\",\n });\n}\n\nexport function getAvailableCodexModes(): ModeInfo[] {\n return IS_ROOT\n ? codexModes.filter((m) => m.id !== \"full-access\")\n : codexModes;\n}\n","export {\n CODE_EXECUTION_MODES,\n type CodeExecutionMode,\n getAvailableModes,\n type ModeInfo,\n} from \"../../execution-mode\";\n\nimport type { CodeExecutionMode } from \"../../execution-mode\";\nimport { isMcpToolReadOnly } from \"./mcp/tool-metadata\";\n\nexport const READ_TOOLS: Set<string> = new Set([\"Read\", \"NotebookRead\"]);\n\nexport const WRITE_TOOLS: Set<string> = new Set([\n \"Edit\",\n \"Write\",\n \"NotebookEdit\",\n]);\n\nexport const BASH_TOOLS: Set<string> = new Set([\n \"Bash\",\n \"BashOutput\",\n \"KillShell\",\n]);\n\nexport const SEARCH_TOOLS: Set<string> = new Set([\"Glob\", \"Grep\", \"LS\"]);\n\nexport const WEB_TOOLS: Set<string> = new Set([\"WebSearch\", \"WebFetch\"]);\n\nexport const AGENT_TOOLS: Set<string> = new Set([\n \"Task\",\n \"Agent\",\n \"TodoWrite\",\n \"Skill\",\n]);\n\nconst BASE_ALLOWED_TOOLS = [\n ...READ_TOOLS,\n ...SEARCH_TOOLS,\n ...WEB_TOOLS,\n ...AGENT_TOOLS,\n];\n\nconst AUTO_ALLOWED_TOOLS: Record<string, Set<string>> = {\n auto: new Set(BASE_ALLOWED_TOOLS),\n default: new Set(BASE_ALLOWED_TOOLS),\n acceptEdits: new Set([...BASE_ALLOWED_TOOLS, ...WRITE_TOOLS]),\n plan: new Set(BASE_ALLOWED_TOOLS),\n};\n\nexport function isToolAllowedForMode(\n toolName: string,\n mode: CodeExecutionMode,\n): boolean {\n if (mode === \"bypassPermissions\") {\n return true;\n }\n if (AUTO_ALLOWED_TOOLS[mode]?.has(toolName) === true) {\n return true;\n }\n if (isMcpToolReadOnly(toolName)) {\n return true;\n }\n return false;\n}\n","import type { PermissionUpdate } from \"@anthropic-ai/claude-agent-sdk\";\nimport { IS_ROOT } from \"../../../utils/common\";\nimport { BASH_TOOLS, READ_TOOLS, SEARCH_TOOLS, WRITE_TOOLS } from \"../tools\";\n\nexport interface PermissionOption {\n kind: \"allow_once\" | \"allow_always\" | \"reject_once\" | \"reject_always\";\n name: string;\n optionId: string;\n _meta?: { description?: string; customInput?: boolean };\n}\n\nfunction permissionOptions(allowAlwaysLabel: string): PermissionOption[] {\n return [\n { kind: \"allow_once\", name: \"Yes\", optionId: \"allow\" },\n { kind: \"allow_always\", name: allowAlwaysLabel, optionId: \"allow_always\" },\n {\n kind: \"reject_once\",\n name: \"No, and tell the agent what to do differently\",\n optionId: \"reject\",\n _meta: { customInput: true },\n },\n ];\n}\n\nexport function buildPermissionOptions(\n toolName: string,\n toolInput: Record<string, unknown>,\n cwd?: string,\n suggestions?: PermissionUpdate[],\n): PermissionOption[] {\n if (BASH_TOOLS.has(toolName)) {\n const rawRuleContent = suggestions\n ?.flatMap((s) => (\"rules\" in s ? s.rules : []))\n .find((r) => r.toolName === \"Bash\" && r.ruleContent)?.ruleContent;\n const ruleContent = rawRuleContent?.replace(/:?\\*$/, \"\");\n\n const command = toolInput?.command as string | undefined;\n const cmdName = command?.split(/\\s+/)[0] ?? \"this command\";\n const cwdLabel = cwd ? ` in ${cwd}` : \"\";\n const label = ruleContent ?? `\\`${cmdName}\\` commands`;\n\n return permissionOptions(\n `Yes, and don't ask again for ${label}${cwdLabel}`,\n );\n }\n\n if (toolName === \"BashOutput\") {\n return permissionOptions(\"Yes, allow all background process reads\");\n }\n\n if (toolName === \"KillShell\") {\n return permissionOptions(\"Yes, allow killing processes\");\n }\n\n if (WRITE_TOOLS.has(toolName)) {\n return permissionOptions(\"Yes, allow all edits during this session\");\n }\n\n if (READ_TOOLS.has(toolName)) {\n return permissionOptions(\"Yes, allow all reads during this session\");\n }\n\n if (SEARCH_TOOLS.has(toolName)) {\n return permissionOptions(\"Yes, allow all searches during this session\");\n }\n\n if (toolName === \"WebFetch\") {\n const url = toolInput?.url as string | undefined;\n let domain = \"\";\n try {\n domain = url ? new URL(url).hostname : \"\";\n } catch {}\n return permissionOptions(\n domain\n ? `Yes, allow all fetches from ${domain}`\n : \"Yes, allow all fetches\",\n );\n }\n\n if (toolName === \"WebSearch\") {\n return permissionOptions(\"Yes, allow all web searches\");\n }\n\n if (toolName === \"Task\") {\n return permissionOptions(\"Yes, allow all sub-tasks\");\n }\n\n if (toolName === \"TodoWrite\") {\n return permissionOptions(\"Yes, allow all todo updates\");\n }\n\n return permissionOptions(\"Yes, always allow\");\n}\n\nconst ALLOW_BYPASS = !IS_ROOT || !!process.env.IS_SANDBOX;\n\nexport function buildExitPlanModePermissionOptions(): PermissionOption[] {\n const options: PermissionOption[] = [];\n\n if (ALLOW_BYPASS) {\n options.push({\n kind: \"allow_always\",\n name: \"Yes, bypass all permissions\",\n optionId: \"bypassPermissions\",\n });\n }\n\n options.push(\n {\n kind: \"allow_always\",\n name: 'Yes, and use \"auto\" mode',\n optionId: \"auto\",\n },\n {\n kind: \"allow_always\",\n name: \"Yes, and auto-accept edits\",\n optionId: \"acceptEdits\",\n },\n {\n kind: \"allow_once\",\n name: \"Yes, and manually approve edits\",\n optionId: \"default\",\n },\n {\n kind: \"reject_once\",\n name: \"No, and tell the agent what to do differently\",\n optionId: \"reject_with_feedback\",\n _meta: { customInput: true },\n },\n );\n\n return options;\n}\n","import type {\n AgentSideConnection,\n RequestPermissionResponse,\n} from \"@agentclientprotocol/sdk\";\nimport type { PermissionUpdate } from \"@anthropic-ai/claude-agent-sdk\";\nimport { text } from \"../../../utils/acp-content\";\nimport type { Logger } from \"../../../utils/logger\";\nimport { toolInfoFromToolUse } from \"../conversion/tool-use-to-acp\";\nimport {\n getClaudePlansDir,\n getLatestAssistantText,\n isClaudePlanFilePath,\n isPlanReady,\n} from \"../plan/utils\";\nimport {\n type AskUserQuestionInput,\n normalizeAskUserQuestionInput,\n OPTION_PREFIX,\n type QuestionItem,\n} from \"../questions/utils\";\nimport { isToolAllowedForMode, WRITE_TOOLS } from \"../tools\";\nimport type { Session } from \"../types\";\nimport {\n buildExitPlanModePermissionOptions,\n buildPermissionOptions,\n} from \"./permission-options\";\n\nexport type ToolPermissionResult =\n | {\n behavior: \"allow\";\n updatedInput: Record<string, unknown>;\n updatedPermissions?: PermissionUpdate[];\n }\n | {\n behavior: \"deny\";\n message: string;\n interrupt?: boolean;\n };\n\ninterface ToolHandlerContext {\n session: Session;\n toolName: string;\n toolInput: Record<string, unknown>;\n toolUseID: string;\n suggestions?: PermissionUpdate[];\n signal?: AbortSignal;\n client: AgentSideConnection;\n sessionId: string;\n fileContentCache: { [key: string]: string };\n logger: Logger;\n updateConfigOption: (configId: string, value: string) => Promise<void>;\n allowedDomains?: string[];\n}\n\nasync function emitToolDenial(\n context: ToolHandlerContext,\n message: string,\n): Promise<void> {\n context.logger.info(`[canUseTool] Tool denied: ${context.toolName}`, {\n message,\n });\n await context.client.sessionUpdate({\n sessionId: context.sessionId,\n update: {\n sessionUpdate: \"tool_call_update\",\n toolCallId: context.toolUseID,\n status: \"failed\",\n content: [{ type: \"content\", content: text(message) }],\n },\n });\n}\n\nfunction getPlanFromFile(\n session: Session,\n fileContentCache: { [key: string]: string },\n): string | undefined {\n return (\n session.lastPlanContent ||\n (session.lastPlanFilePath\n ? fileContentCache[session.lastPlanFilePath]\n : undefined)\n );\n}\n\nfunction ensurePlanInInput(\n toolInput: Record<string, unknown>,\n fallbackPlan: string | undefined,\n): Record<string, unknown> {\n const hasPlan = typeof (toolInput as { plan?: unknown })?.plan === \"string\";\n if (hasPlan || !fallbackPlan) {\n return toolInput;\n }\n return { ...toolInput, plan: fallbackPlan };\n}\n\nfunction extractPlanText(input: Record<string, unknown>): string | undefined {\n const plan = (input as { plan?: unknown })?.plan;\n return typeof plan === \"string\" ? plan : undefined;\n}\n\nasync function createPlanValidationError(\n message: string,\n context: ToolHandlerContext,\n): Promise<ToolPermissionResult> {\n await emitToolDenial(context, message);\n return { behavior: \"deny\", message, interrupt: false };\n}\n\nasync function validatePlanContent(\n planText: string | undefined,\n context: ToolHandlerContext,\n): Promise<{ valid: true } | { valid: false; error: ToolPermissionResult }> {\n if (!planText) {\n const message = `Plan not ready. Provide the full markdown plan in ExitPlanMode or write it to ${getClaudePlansDir()} before requesting approval.`;\n return {\n valid: false,\n error: await createPlanValidationError(message, context),\n };\n }\n\n if (!isPlanReady(planText)) {\n const message =\n \"Plan not ready. Provide the full markdown plan in ExitPlanMode before requesting approval.\";\n return {\n valid: false,\n error: await createPlanValidationError(message, context),\n };\n }\n\n return { valid: true };\n}\n\nasync function requestPlanApproval(\n context: ToolHandlerContext,\n updatedInput: Record<string, unknown>,\n): Promise<RequestPermissionResponse> {\n const { client, sessionId, toolUseID } = context;\n\n const toolInfo = toolInfoFromToolUse({\n name: context.toolName,\n input: updatedInput,\n });\n\n return await client.requestPermission({\n options: buildExitPlanModePermissionOptions(),\n sessionId,\n toolCall: {\n toolCallId: toolUseID,\n title: toolInfo.title,\n kind: toolInfo.kind,\n content: toolInfo.content,\n locations: toolInfo.locations,\n rawInput: { ...updatedInput, toolName: context.toolName },\n },\n });\n}\n\nasync function applyPlanApproval(\n response: RequestPermissionResponse,\n context: ToolHandlerContext,\n updatedInput: Record<string, unknown>,\n): Promise<ToolPermissionResult> {\n const { session } = context;\n\n if (\n response.outcome?.outcome === \"selected\" &&\n (response.outcome.optionId === \"auto\" ||\n response.outcome.optionId === \"default\" ||\n response.outcome.optionId === \"acceptEdits\" ||\n response.outcome.optionId === \"bypassPermissions\")\n ) {\n session.permissionMode = response.outcome\n .optionId as typeof session.permissionMode;\n await session.query.setPermissionMode(response.outcome.optionId);\n await context.client.sessionUpdate({\n sessionId: context.sessionId,\n update: {\n sessionUpdate: \"current_mode_update\",\n currentModeId: response.outcome.optionId,\n },\n });\n await context.updateConfigOption(\"mode\", response.outcome.optionId);\n\n return {\n behavior: \"allow\",\n updatedInput,\n updatedPermissions: context.suggestions ?? [\n {\n type: \"setMode\",\n mode: response.outcome.optionId,\n destination: \"localSettings\",\n },\n ],\n };\n }\n\n const customInput = (response._meta as Record<string, unknown> | undefined)\n ?.customInput as string | undefined;\n const feedback = customInput?.trim();\n\n const message = feedback\n ? `User rejected the plan with feedback: ${feedback}`\n : \"User rejected the plan. Wait for the user to provide direction.\";\n await emitToolDenial(context, message);\n return { behavior: \"deny\", message, interrupt: !feedback };\n}\n\nasync function handleEnterPlanModeTool(\n context: ToolHandlerContext,\n): Promise<ToolPermissionResult> {\n const { session, toolInput } = context;\n\n session.permissionMode = \"plan\";\n await session.query.setPermissionMode(\"plan\");\n await context.updateConfigOption(\"mode\", \"plan\");\n\n return {\n behavior: \"allow\",\n updatedInput: toolInput as Record<string, unknown>,\n };\n}\n\nasync function handleExitPlanModeTool(\n context: ToolHandlerContext,\n): Promise<ToolPermissionResult> {\n const { session, toolInput, fileContentCache } = context;\n\n const planFromFile = getPlanFromFile(session, fileContentCache);\n const latestText = getLatestAssistantText(session.notificationHistory);\n const fallbackPlan = planFromFile || (latestText ?? undefined);\n const updatedInput = ensurePlanInInput(toolInput, fallbackPlan);\n const planText = extractPlanText(updatedInput);\n\n const validationResult = await validatePlanContent(planText, context);\n if (!validationResult.valid) {\n return validationResult.error;\n }\n\n const response = await requestPlanApproval(context, updatedInput);\n if (context.signal?.aborted || response.outcome?.outcome === \"cancelled\") {\n throw new Error(\"Tool use aborted\");\n }\n return await applyPlanApproval(response, context, updatedInput);\n}\n\nfunction buildQuestionOptions(question: QuestionItem) {\n return (question.options || []).map((opt, idx) => ({\n kind: \"allow_once\" as const,\n name: opt.label,\n optionId: `${OPTION_PREFIX}${idx}`,\n _meta: opt.description ? { description: opt.description } : undefined,\n }));\n}\n\nasync function handleAskUserQuestionTool(\n context: ToolHandlerContext,\n): Promise<ToolPermissionResult> {\n const input = context.toolInput as AskUserQuestionInput;\n context.logger.info(\"[AskUserQuestion] Received input\", { input });\n const questions = normalizeAskUserQuestionInput(input);\n context.logger.info(\"[AskUserQuestion] Normalized questions\", { questions });\n\n if (!questions || questions.length === 0) {\n context.logger.warn(\"[AskUserQuestion] No questions found in input\");\n return {\n behavior: \"deny\",\n message: \"No questions provided\",\n };\n }\n\n const { client, sessionId, toolUseID, toolInput } = context;\n const firstQuestion = questions[0];\n const options = buildQuestionOptions(firstQuestion);\n\n const toolInfo = toolInfoFromToolUse({\n name: context.toolName,\n input: toolInput,\n });\n\n const response = await client.requestPermission({\n options,\n sessionId,\n toolCall: {\n toolCallId: toolUseID,\n title: firstQuestion.question,\n kind: \"other\",\n content: toolInfo.content,\n _meta: {\n codeToolKind: \"question\",\n questions,\n },\n },\n });\n\n if (context.signal?.aborted || response.outcome?.outcome === \"cancelled\") {\n throw new Error(\"Tool use aborted\");\n }\n\n if (response.outcome?.outcome !== \"selected\") {\n const customMessage = (\n response._meta as Record<string, unknown> | undefined\n )?.message;\n return {\n behavior: \"deny\",\n message:\n typeof customMessage === \"string\"\n ? customMessage\n : \"User cancelled the questions\",\n };\n }\n\n const answers = response._meta?.answers as Record<string, string> | undefined;\n if (!answers || Object.keys(answers).length === 0) {\n return {\n behavior: \"deny\",\n message: \"User did not provide answers\",\n };\n }\n\n return {\n behavior: \"allow\",\n updatedInput: {\n ...(context.toolInput as Record<string, unknown>),\n answers,\n },\n };\n}\n\nasync function handleDefaultPermissionFlow(\n context: ToolHandlerContext,\n): Promise<ToolPermissionResult> {\n const {\n session,\n toolName,\n toolInput,\n toolUseID,\n client,\n sessionId,\n suggestions,\n } = context;\n\n const toolInfo = toolInfoFromToolUse(\n { name: toolName, input: toolInput },\n { cachedFileContent: context.fileContentCache, cwd: session?.cwd },\n );\n\n const options = buildPermissionOptions(\n toolName,\n toolInput as Record<string, unknown>,\n session?.cwd,\n suggestions,\n );\n\n const response = await client.requestPermission({\n options,\n sessionId,\n toolCall: {\n toolCallId: toolUseID,\n title: toolInfo.title,\n kind: toolInfo.kind,\n content: toolInfo.content,\n locations: toolInfo.locations,\n rawInput: { ...(toolInput as Record<string, unknown>), toolName },\n },\n });\n\n if (context.signal?.aborted || response.outcome?.outcome === \"cancelled\") {\n throw new Error(\"Tool use aborted\");\n }\n\n if (\n response.outcome?.outcome === \"selected\" &&\n (response.outcome.optionId === \"allow\" ||\n response.outcome.optionId === \"allow_always\")\n ) {\n if (response.outcome.optionId === \"allow_always\") {\n return {\n behavior: \"allow\",\n updatedInput: toolInput as Record<string, unknown>,\n updatedPermissions: suggestions ?? [\n {\n type: \"addRules\",\n rules: [{ toolName }],\n behavior: \"allow\",\n destination: \"localSettings\",\n },\n ],\n };\n }\n return {\n behavior: \"allow\",\n updatedInput: toolInput as Record<string, unknown>,\n };\n } else {\n const feedback = (\n response._meta?.customInput as string | undefined\n )?.trim();\n const message = feedback\n ? `User refused permission to run tool with feedback: ${feedback}`\n : \"User refused permission to run tool\";\n await emitToolDenial(context, message);\n return { behavior: \"deny\", message, interrupt: !feedback };\n }\n}\n\nfunction handlePlanFileException(\n context: ToolHandlerContext,\n): ToolPermissionResult | null {\n const { session, toolName, toolInput } = context;\n\n if (session.permissionMode !== \"plan\" || !WRITE_TOOLS.has(toolName)) {\n return null;\n }\n\n const filePath = (toolInput as { file_path?: string })?.file_path;\n if (!isClaudePlanFilePath(filePath)) {\n return null;\n }\n\n session.lastPlanFilePath = filePath;\n const content = (toolInput as { content?: string })?.content;\n if (typeof content === \"string\") {\n session.lastPlanContent = content;\n }\n\n return {\n behavior: \"allow\",\n updatedInput: toolInput as Record<string, unknown>,\n };\n}\n\nfunction extractDomainFromUrl(url: string): string | null {\n try {\n return new URL(url).hostname;\n } catch {\n return null;\n }\n}\n\nfunction isDomainAllowed(hostname: string, allowedDomains: string[]): boolean {\n return allowedDomains.some((pattern) => {\n if (pattern.startsWith(\"*.\")) {\n const suffix = pattern.slice(1); // \".example.com\"\n return hostname === pattern.slice(2) || hostname.endsWith(suffix);\n }\n return hostname === pattern;\n });\n}\n\nexport async function canUseTool(\n context: ToolHandlerContext,\n): Promise<ToolPermissionResult> {\n const { toolName, toolInput, session, allowedDomains } = context;\n\n // Enforce domain allowlist for web tools\n if (allowedDomains && allowedDomains.length > 0) {\n if (toolName === \"WebFetch\" || toolName === \"WebSearch\") {\n const url = toolInput.url as string | undefined;\n if (url) {\n const hostname = extractDomainFromUrl(url);\n if (hostname && !isDomainAllowed(hostname, allowedDomains)) {\n const message = `Domain \"${hostname}\" is not in the allowed list: ${allowedDomains.join(\", \")}`;\n await emitToolDenial(context, message);\n return { behavior: \"deny\", message, interrupt: false };\n }\n }\n }\n }\n\n if (isToolAllowedForMode(toolName, session.permissionMode)) {\n return {\n behavior: \"allow\",\n updatedInput: toolInput as Record<string, unknown>,\n };\n }\n\n if (toolName === \"EnterPlanMode\") {\n return handleEnterPlanModeTool(context);\n }\n\n if (toolName === \"ExitPlanMode\") {\n return handleExitPlanModeTool(context);\n }\n\n if (toolName === \"AskUserQuestion\") {\n return handleAskUserQuestionTool(context);\n }\n\n const planFileResult = handlePlanFileException(context);\n if (planFileResult) {\n return planFileResult;\n }\n\n // In plan mode, deny tools that aren't in the allowed set. The agent must\n // write its plan to ~/.claude/plans/ and call ExitPlanMode before it can\n // use write or bash tools. Without this guard, cloud runs auto-approve\n // restricted tools and the agent skips planning entirely.\n if (session.permissionMode === \"plan\") {\n const message =\n \"This tool is not available in plan mode. Write your plan \" +\n `to a file in ${getClaudePlansDir()} and call ExitPlanMode when ready.`;\n await emitToolDenial(context, message);\n return { behavior: \"deny\", message, interrupt: false };\n }\n\n return handleDefaultPermissionFlow(context);\n}\n","import type { AvailableCommand } from \"@agentclientprotocol/sdk\";\nimport type { SlashCommand } from \"@anthropic-ai/claude-agent-sdk\";\n\nconst UNSUPPORTED_COMMANDS = [\n \"context\",\n \"cost\",\n \"keybindings-help\",\n \"login\",\n \"logout\",\n \"output-style:new\",\n \"release-notes\",\n \"todos\",\n];\n\nexport function getAvailableSlashCommands(\n commands: SlashCommand[],\n): AvailableCommand[] {\n return commands\n .map((command) => {\n const input =\n command.argumentHint != null\n ? {\n hint: Array.isArray(command.argumentHint)\n ? command.argumentHint.join(\" \")\n : command.argumentHint,\n }\n : null;\n let name = command.name;\n if (command.name.endsWith(\" (MCP)\")) {\n name = `mcp:${name.replace(\" (MCP)\", \"\")}`;\n }\n return {\n name,\n description: command.description || \"\",\n input,\n };\n })\n .filter(\n (command: AvailableCommand) =>\n !UNSUPPORTED_COMMANDS.includes(command.name),\n );\n}\n","import type { NewSessionRequest } from \"@agentclientprotocol/sdk\";\nimport type { McpServerConfig } from \"@anthropic-ai/claude-agent-sdk\";\n\nexport function parseMcpServers(\n params: Pick<NewSessionRequest, \"mcpServers\">,\n): Record<string, McpServerConfig> {\n const mcpServers: Record<string, McpServerConfig> = {};\n if (!Array.isArray(params.mcpServers)) {\n return mcpServers;\n }\n\n for (const server of params.mcpServers) {\n if (\"type\" in server) {\n mcpServers[server.name] = {\n type: server.type,\n url: server.url,\n headers: server.headers\n ? Object.fromEntries(server.headers.map((e) => [e.name, e.value]))\n : undefined,\n };\n } else {\n mcpServers[server.name] = {\n type: \"stdio\",\n command: server.command,\n args: server.args,\n env: server.env\n ? Object.fromEntries(server.env.map((e) => [e.name, e.value]))\n : undefined,\n };\n }\n }\n\n return mcpServers;\n}\n","export const DEFAULT_MODEL = \"opus\";\n\nconst GATEWAY_TO_SDK_MODEL: Record<string, string> = {\n \"claude-opus-4-5\": \"opus\",\n \"claude-opus-4-6\": \"opus\",\n \"claude-opus-4-7\": \"opus\",\n \"claude-sonnet-4-5\": \"sonnet\",\n \"claude-sonnet-4-6\": \"sonnet\",\n \"claude-haiku-4-5\": \"haiku\",\n};\n\nexport function toSdkModelId(modelId: string): string {\n return GATEWAY_TO_SDK_MODEL[modelId] ?? modelId;\n}\n\nconst MODELS_WITH_1M_CONTEXT = new Set([\n \"claude-opus-4-6\",\n \"claude-opus-4-7\",\n \"claude-sonnet-4-6\",\n]);\n\nexport function supports1MContext(modelId: string): boolean {\n return MODELS_WITH_1M_CONTEXT.has(modelId);\n}\n\nconst MODELS_WITH_EFFORT = new Set([\n \"claude-opus-4-5\",\n \"claude-opus-4-6\",\n \"claude-opus-4-7\",\n \"claude-sonnet-4-6\",\n]);\n\nconst MODELS_WITH_XHIGH_EFFORT = new Set([\n \"claude-opus-4-6\",\n \"claude-opus-4-7\",\n]);\n\nexport function supportsEffort(modelId: string): boolean {\n return MODELS_WITH_EFFORT.has(modelId);\n}\n\nexport function supportsXhighEffort(modelId: string): boolean {\n return MODELS_WITH_XHIGH_EFFORT.has(modelId);\n}\n\nconst MODELS_TO_EXCLUDE_MCP_TOOLS = new Set([\"claude-haiku-4-5\"]);\n\nexport function supportsMcpInjection(modelId: string): boolean {\n return !MODELS_TO_EXCLUDE_MCP_TOOLS.has(modelId);\n}\n\ninterface EffortOption {\n value: string;\n name: string;\n}\n\nexport function getEffortOptions(modelId: string): EffortOption[] | null {\n if (!supportsEffort(modelId)) return null;\n\n const options: EffortOption[] = [\n { value: \"low\", name: \"Low\" },\n { value: \"medium\", name: \"Medium\" },\n { value: \"high\", name: \"High\" },\n ];\n\n if (supportsXhighEffort(modelId)) {\n options.push(\n { value: \"xhigh\", name: \"Extra High\" },\n { value: \"max\", name: \"Max\" },\n );\n }\n\n return options;\n}\n\n// Model alias resolution — lets callers use human-friendly aliases like\n// \"opus\" or \"sonnet\" instead of full model IDs like \"claude-opus-4-6\".\n\nconst MODEL_CONTEXT_HINT_PATTERN = /\\[(\\d+m)\\]$/i;\n\nfunction tokenizeModelPreference(model: string): {\n tokens: string[];\n contextHint?: string;\n} {\n const lower = model.trim().toLowerCase();\n const contextHint = lower\n .match(MODEL_CONTEXT_HINT_PATTERN)?.[1]\n ?.toLowerCase();\n\n const normalized = lower.replace(MODEL_CONTEXT_HINT_PATTERN, \" $1 \");\n const rawTokens = normalized.split(/[^a-z0-9]+/).filter(Boolean);\n const tokens = rawTokens\n .map((token) => {\n if (token === \"opusplan\") return \"opus\";\n if (token === \"best\" || token === \"default\") return \"\";\n return token;\n })\n .filter((token) => token && token !== \"claude\")\n .filter((token) => /[a-z]/.test(token) || token.endsWith(\"m\"));\n\n return { tokens, contextHint };\n}\n\ninterface ModelOption {\n value: string;\n name?: string;\n description?: string;\n}\n\nfunction scoreModelMatch(\n model: ModelOption,\n tokens: string[],\n contextHint?: string,\n): number {\n const haystack = `${model.value} ${model.name ?? \"\"}`.toLowerCase();\n let score = 0;\n for (const token of tokens) {\n if (haystack.includes(token)) {\n score += token === contextHint ? 3 : 1;\n }\n }\n return score;\n}\n\nexport function resolveModelPreference(\n preference: string,\n options: ModelOption[],\n): string | null {\n const trimmed = preference.trim();\n if (!trimmed) return null;\n\n const lower = trimmed.toLowerCase();\n\n // Exact match on value or display name\n const directMatch = options.find(\n (o) =>\n o.value === trimmed ||\n o.value.toLowerCase() === lower ||\n (o.name && o.name.toLowerCase() === lower),\n );\n if (directMatch) return directMatch.value;\n\n // Substring match\n const includesMatch = options.find((o) => {\n const value = o.value.toLowerCase();\n const display = (o.name ?? \"\").toLowerCase();\n return (\n value.includes(lower) || display.includes(lower) || lower.includes(value)\n );\n });\n if (includesMatch) return includesMatch.value;\n\n // Tokenized matching for aliases like \"opus[1m]\"\n const { tokens, contextHint } = tokenizeModelPreference(trimmed);\n if (tokens.length === 0) return null;\n\n let bestMatch: ModelOption | null = null;\n let bestScore = 0;\n for (const model of options) {\n const score = scoreModelMatch(model, tokens, contextHint);\n if (0 < score && (!bestMatch || bestScore < score)) {\n bestMatch = model;\n bestScore = score;\n }\n }\n\n return bestMatch?.value ?? null;\n}\n","import { spawn } from \"node:child_process\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type {\n CanUseTool,\n McpServerConfig,\n Options,\n OutputFormat,\n SpawnedProcess,\n SpawnOptions,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport type { FileEnrichmentDeps } from \"../../../enrichment/file-enricher\";\nimport { IS_ROOT } from \"../../../utils/common\";\nimport type { Logger } from \"../../../utils/logger\";\nimport {\n createPostToolUseHook,\n createPreToolUseHook,\n createReadEnrichmentHook,\n createSubagentRewriteHook,\n type EnrichedReadCache,\n type OnModeChange,\n} from \"../hooks\";\nimport type { CodeExecutionMode } from \"../tools\";\nimport type { EffortLevel } from \"../types\";\nimport { APPENDED_INSTRUCTIONS } from \"./instructions\";\nimport { DEFAULT_MODEL } from \"./models\";\nimport type { SettingsManager } from \"./settings\";\n\nexport interface ProcessSpawnedInfo {\n pid: number;\n command: string;\n sessionId: string;\n}\n\nexport interface BuildOptionsParams {\n cwd: string;\n mcpServers: Record<string, McpServerConfig>;\n permissionMode: CodeExecutionMode;\n canUseTool: CanUseTool;\n logger: Logger;\n systemPrompt?: Options[\"systemPrompt\"];\n userProvidedOptions?: Options;\n sessionId: string;\n isResume: boolean;\n forkSession?: boolean;\n additionalDirectories?: string[];\n disableBuiltInTools?: boolean;\n outputFormat?: OutputFormat;\n settingsManager: SettingsManager;\n onModeChange?: OnModeChange;\n onProcessSpawned?: (info: ProcessSpawnedInfo) => void;\n onProcessExited?: (pid: number) => void;\n effort?: EffortLevel;\n enrichmentDeps?: FileEnrichmentDeps;\n enrichedReadCache?: EnrichedReadCache;\n}\n\nexport function buildSystemPrompt(\n customPrompt?: unknown,\n): Options[\"systemPrompt\"] {\n const defaultPrompt: Options[\"systemPrompt\"] = {\n type: \"preset\",\n preset: \"claude_code\",\n append: APPENDED_INSTRUCTIONS,\n };\n\n if (!customPrompt) {\n return defaultPrompt;\n }\n\n if (typeof customPrompt === \"string\") {\n return customPrompt + APPENDED_INSTRUCTIONS;\n }\n\n if (\n typeof customPrompt === \"object\" &&\n customPrompt !== null &&\n \"append\" in customPrompt &&\n typeof customPrompt.append === \"string\"\n ) {\n return {\n ...defaultPrompt,\n append: customPrompt.append + APPENDED_INSTRUCTIONS,\n };\n }\n\n return defaultPrompt;\n}\n\nfunction buildMcpServers(\n userServers: Record<string, McpServerConfig> | undefined,\n acpServers: Record<string, McpServerConfig>,\n): Record<string, McpServerConfig> {\n return {\n ...(userServers || {}),\n ...acpServers,\n };\n}\n\nfunction buildEnvironment(): Record<string, string> {\n return {\n ...process.env,\n ELECTRON_RUN_AS_NODE: \"1\",\n CLAUDE_CODE_ENABLE_ASK_USER_QUESTION_TOOL: \"true\",\n // Offload all MCP tools by default\n ENABLE_TOOL_SEARCH: \"auto:0\",\n // Enable idle state as end-of-turn signal (required for SDK 0.2.114+)\n CLAUDE_CODE_EMIT_SESSION_STATE_EVENTS: \"1\",\n };\n}\n\nfunction buildHooks(\n userHooks: Options[\"hooks\"],\n onModeChange: OnModeChange | undefined,\n settingsManager: SettingsManager,\n logger: Logger,\n enrichmentDeps: FileEnrichmentDeps | undefined,\n enrichedReadCache: EnrichedReadCache | undefined,\n): Options[\"hooks\"] {\n const postToolUseHooks = [createPostToolUseHook({ onModeChange, logger })];\n if (enrichmentDeps && enrichedReadCache) {\n postToolUseHooks.push(\n createReadEnrichmentHook(enrichmentDeps, enrichedReadCache),\n );\n }\n\n return {\n ...userHooks,\n PostToolUse: [\n ...(userHooks?.PostToolUse || []),\n { hooks: postToolUseHooks },\n ],\n PreToolUse: [\n ...(userHooks?.PreToolUse || []),\n {\n hooks: [\n createPreToolUseHook(settingsManager, logger),\n createSubagentRewriteHook(logger),\n ],\n },\n ],\n };\n}\n\nfunction getAbortController(\n userProvidedController: AbortController | undefined,\n): AbortController {\n const controller = userProvidedController ?? new AbortController();\n if (controller.signal.aborted) {\n throw new Error(\"Cancelled\");\n }\n return controller;\n}\n\nfunction buildSpawnWrapper(\n sessionId: string,\n onProcessSpawned: (info: ProcessSpawnedInfo) => void,\n onProcessExited?: (pid: number) => void,\n logger?: Logger,\n): (options: SpawnOptions) => SpawnedProcess {\n return (spawnOpts: SpawnOptions): SpawnedProcess => {\n const child = spawn(spawnOpts.command, spawnOpts.args, {\n cwd: spawnOpts.cwd,\n env: spawnOpts.env as NodeJS.ProcessEnv,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n if (child.pid) {\n onProcessSpawned({\n pid: child.pid,\n command: `${spawnOpts.command} ${spawnOpts.args.join(\" \")}`,\n sessionId,\n });\n }\n\n child.stderr?.on(\"data\", (data: Buffer) => {\n const msg = data.toString().trim();\n if (msg && logger) {\n logger.debug(`[claude-code:${child.pid}] stderr: ${msg}`);\n }\n });\n\n if (onProcessExited) {\n child.on(\"exit\", () => {\n if (child.pid) {\n onProcessExited(child.pid);\n }\n });\n }\n\n // Listen for abort signal\n if (spawnOpts.signal) {\n spawnOpts.signal.addEventListener(\"abort\", () => {\n child.kill(\"SIGTERM\");\n });\n }\n\n if (!child.stdin || !child.stdout) {\n throw new Error(\n `Failed to get stdio streams for spawned process (pid=${child.pid})`,\n );\n }\n\n return {\n stdin: child.stdin,\n stdout: child.stdout,\n get killed() {\n return child.killed;\n },\n get exitCode() {\n return child.exitCode;\n },\n kill(signal: NodeJS.Signals) {\n return child.kill(signal);\n },\n // biome-ignore lint/suspicious/noExplicitAny: ChildProcess event listener types require any[]\n on(event: \"exit\" | \"error\", listener: (...args: any[]) => void) {\n child.on(event, listener);\n },\n // biome-ignore lint/suspicious/noExplicitAny: ChildProcess event listener types require any[]\n once(event: \"exit\" | \"error\", listener: (...args: any[]) => void) {\n child.once(event, listener);\n },\n // biome-ignore lint/suspicious/noExplicitAny: ChildProcess event listener types require any[]\n off(event: \"exit\" | \"error\", listener: (...args: any[]) => void) {\n child.off(event, listener);\n },\n };\n };\n}\n\nfunction ensureLocalSettings(cwd: string): void {\n const claudeDir = path.join(cwd, \".claude\");\n const localSettingsPath = path.join(claudeDir, \"settings.local.json\");\n try {\n if (!fs.existsSync(localSettingsPath)) {\n fs.mkdirSync(claudeDir, { recursive: true });\n fs.writeFileSync(localSettingsPath, \"{}\\n\", { flag: \"wx\" });\n }\n } catch {\n // Best-effort — don't fail session creation if we can't write\n }\n}\n\nexport function buildSessionOptions(params: BuildOptionsParams): Options {\n ensureLocalSettings(params.cwd);\n\n // Resolve which built-in tools to expose.\n // Explicit tools array from userProvidedOptions takes precedence.\n // disableBuiltInTools is a legacy shorthand for tools: [] — kept for\n // backward compatibility but callers should prefer the tools array.\n const tools: Options[\"tools\"] =\n params.userProvidedOptions?.tools ??\n (params.disableBuiltInTools\n ? []\n : { type: \"preset\", preset: \"claude_code\" });\n\n const options: Options = {\n ...params.userProvidedOptions,\n betas: [\"context-1m-2025-08-07\"],\n systemPrompt: params.systemPrompt ?? buildSystemPrompt(),\n settingSources: [\"user\", \"project\", \"local\"],\n stderr: (err) => params.logger.error(err),\n cwd: params.cwd,\n includePartialMessages: true,\n allowDangerouslySkipPermissions: !IS_ROOT,\n permissionMode: params.permissionMode,\n canUseTool: params.canUseTool,\n executable: \"node\",\n tools,\n extraArgs: {\n ...params.userProvidedOptions?.extraArgs,\n \"replay-user-messages\": \"\",\n },\n mcpServers: buildMcpServers(\n params.userProvidedOptions?.mcpServers,\n params.mcpServers,\n ),\n env: buildEnvironment(),\n hooks: buildHooks(\n params.userProvidedOptions?.hooks,\n params.onModeChange,\n params.settingsManager,\n params.logger,\n params.enrichmentDeps,\n params.enrichedReadCache,\n ),\n outputFormat: params.outputFormat,\n abortController: getAbortController(\n params.userProvidedOptions?.abortController,\n ),\n ...(params.onProcessSpawned && {\n spawnClaudeCodeProcess: buildSpawnWrapper(\n params.sessionId,\n params.onProcessSpawned,\n params.onProcessExited,\n params.logger,\n ),\n }),\n };\n\n if (process.env.CLAUDE_CODE_EXECUTABLE) {\n options.pathToClaudeCodeExecutable = process.env.CLAUDE_CODE_EXECUTABLE;\n }\n\n if (params.isResume) {\n options.resume = params.sessionId;\n options.forkSession = params.forkSession ?? false;\n } else {\n options.sessionId = params.sessionId;\n options.model = DEFAULT_MODEL;\n }\n\n if (params.additionalDirectories) {\n options.additionalDirectories = params.additionalDirectories;\n }\n\n if (params.effort) {\n options.effort = params.effort;\n }\n\n clearStatsigCache();\n return options;\n}\n\nfunction clearStatsigCache(): void {\n const statsigPath = path.join(\n process.env.CLAUDE_CONFIG_DIR || path.join(os.homedir(), \".claude\"),\n \"statsig\",\n );\n fs.rm(statsigPath, { recursive: true, force: true }, () => {\n // Best-effort, ignore errors\n });\n}\n","const BRANCH_NAMING = `\n# Branch Naming\n\nWhen working in a detached HEAD state, create a descriptive branch name based on the work being done before committing. Do this automatically without asking the user.\n`;\n\nconst PLAN_MODE = `\n# Plan Mode\n\nOnly enter plan mode (EnterPlanMode) when the user is requesting a significant change in approach or direction mid-task. Do NOT enter plan mode for:\n- Confirmations or approvals (\"yes\", \"looks good\", \"continue\", \"go ahead\")\n- Minor clarifications or small adjustments\n- Answers to questions you asked (unless you are still in the initial planning phase and have not yet started executing)\n- Feedback that does not require replanning\n\nWhen in doubt, continue executing and incorporate the feedback inline.\n`;\n\nexport const APPENDED_INSTRUCTIONS = BRANCH_NAMING + PLAN_MODE;\n","import * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { minimatch } from \"minimatch\";\n\nconst ACP_TOOL_NAME_PREFIX = \"mcp__acp__\";\n\nconst acpToolNames = {\n read: `${ACP_TOOL_NAME_PREFIX}Read`,\n edit: `${ACP_TOOL_NAME_PREFIX}Edit`,\n write: `${ACP_TOOL_NAME_PREFIX}Write`,\n bash: `${ACP_TOOL_NAME_PREFIX}Bash`,\n};\n\nconst SHELL_OPERATORS = [\"&&\", \"||\", \";\", \"|\", \"$(\", \"`\", \"\\n\"];\n\nfunction containsShellOperator(str: string): boolean {\n return SHELL_OPERATORS.some((op) => str.includes(op));\n}\n\nconst FILE_EDITING_TOOLS = [acpToolNames.edit, acpToolNames.write];\n\nconst FILE_READING_TOOLS = [acpToolNames.read];\n\nconst TOOL_ARG_ACCESSORS: Record<\n string,\n (input: Record<string, unknown>) => string | undefined\n> = {\n [acpToolNames.read]: (input) => input?.file_path as string | undefined,\n [acpToolNames.edit]: (input) => input?.file_path as string | undefined,\n [acpToolNames.write]: (input) => input?.file_path as string | undefined,\n [acpToolNames.bash]: (input) => input?.command as string | undefined,\n};\n\ninterface ParsedRule {\n toolName: string;\n argument?: string;\n isWildcard?: boolean;\n}\n\nfunction parseRule(rule: string): ParsedRule {\n const match = rule.match(/^(\\w+)(?:\\((.+)\\))?$/);\n if (!match) {\n return { toolName: rule };\n }\n const toolName = match[1] ?? rule;\n const argument = match[2];\n if (argument?.endsWith(\":*\")) {\n return {\n toolName,\n argument: argument.slice(0, -2),\n isWildcard: true,\n };\n }\n return { toolName, argument };\n}\n\nfunction normalizePath(filePath: string, cwd: string): string {\n let resolved = filePath;\n if (resolved.startsWith(\"~/\")) {\n resolved = path.join(os.homedir(), resolved.slice(2));\n } else if (resolved.startsWith(\"./\")) {\n resolved = path.join(cwd, resolved.slice(2));\n } else if (!path.isAbsolute(resolved)) {\n resolved = path.join(cwd, resolved);\n }\n return path.normalize(resolved).replace(/\\\\/g, \"/\");\n}\n\nfunction matchesGlob(pattern: string, filePath: string, cwd: string): boolean {\n const normalizedPattern = normalizePath(pattern, cwd);\n const normalizedPath = normalizePath(filePath, cwd);\n return minimatch(normalizedPath, normalizedPattern, {\n dot: true,\n matchBase: false,\n nocase: process.platform === \"win32\",\n });\n}\n\nfunction matchesRule(\n rule: ParsedRule,\n toolName: string,\n toolInput: unknown,\n cwd: string,\n): boolean {\n const ruleAppliesToTool =\n (rule.toolName === \"Bash\" && toolName === acpToolNames.bash) ||\n (rule.toolName === \"Edit\" && FILE_EDITING_TOOLS.includes(toolName)) ||\n (rule.toolName === \"Read\" && FILE_READING_TOOLS.includes(toolName));\n\n if (!ruleAppliesToTool) {\n return false;\n }\n\n if (!rule.argument) {\n return true;\n }\n\n const argAccessor = TOOL_ARG_ACCESSORS[toolName];\n if (!argAccessor) {\n return true;\n }\n\n const actualArg = argAccessor(toolInput as Record<string, unknown>);\n if (!actualArg) {\n return false;\n }\n\n if (toolName === acpToolNames.bash) {\n if (rule.isWildcard) {\n if (!actualArg.startsWith(rule.argument)) {\n return false;\n }\n const remainder = actualArg.slice(rule.argument.length);\n if (containsShellOperator(remainder)) {\n return false;\n }\n return true;\n }\n return actualArg === rule.argument;\n }\n\n return matchesGlob(rule.argument, actualArg, cwd);\n}\n\nasync function loadSettingsFile(\n filePath: string | undefined,\n): Promise<ClaudeCodeSettings> {\n if (!filePath) {\n return {};\n }\n try {\n const content = await fs.promises.readFile(filePath, \"utf-8\");\n return JSON.parse(content) as ClaudeCodeSettings;\n } catch (error) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n return {};\n }\n process.stderr.write(\n `[SettingsManager] Failed to load settings from ${filePath}: ${error}\\n`,\n );\n return {};\n }\n}\n\nexport interface PermissionSettings {\n allow?: string[];\n deny?: string[];\n ask?: string[];\n additionalDirectories?: string[];\n defaultMode?: string;\n}\n\nexport interface ClaudeCodeSettings {\n permissions?: PermissionSettings;\n env?: Record<string, string>;\n model?: string;\n}\n\nexport type PermissionDecision = \"allow\" | \"deny\" | \"ask\";\n\nexport interface PermissionCheckResult {\n decision: PermissionDecision;\n rule?: string;\n source?: \"allow\" | \"deny\" | \"ask\";\n}\n\nexport function getManagedSettingsPath(): string {\n switch (process.platform) {\n case \"darwin\":\n return \"/Library/Application Support/ClaudeCode/managed-settings.json\";\n case \"linux\":\n return \"/etc/claude-code/managed-settings.json\";\n case \"win32\":\n return \"C:\\\\Program Files\\\\ClaudeCode\\\\managed-settings.json\";\n default:\n return \"/etc/claude-code/managed-settings.json\";\n }\n}\nexport class SettingsManager {\n private cwd: string;\n private userSettings: ClaudeCodeSettings = {};\n private projectSettings: ClaudeCodeSettings = {};\n private localSettings: ClaudeCodeSettings = {};\n private enterpriseSettings: ClaudeCodeSettings = {};\n private mergedSettings: ClaudeCodeSettings = {};\n private initialized = false;\n private initPromise: Promise<void> | null = null;\n\n constructor(cwd: string) {\n this.cwd = cwd;\n }\n\n async initialize(): Promise<void> {\n if (this.initialized) return;\n if (this.initPromise) return this.initPromise;\n this.initPromise = this.loadAllSettings().then(() => {\n this.initialized = true;\n this.initPromise = null;\n });\n return this.initPromise;\n }\n\n private getUserSettingsPath(): string {\n const configDir =\n process.env.CLAUDE_CONFIG_DIR || path.join(os.homedir(), \".claude\");\n return path.join(configDir, \"settings.json\");\n }\n\n private getProjectSettingsPath(): string {\n return path.join(this.cwd, \".claude\", \"settings.json\");\n }\n\n private getLocalSettingsPath(): string {\n return path.join(this.cwd, \".claude\", \"settings.local.json\");\n }\n\n private async loadAllSettings(): Promise<void> {\n const [userSettings, projectSettings, localSettings, enterpriseSettings] =\n await Promise.all([\n loadSettingsFile(this.getUserSettingsPath()),\n loadSettingsFile(this.getProjectSettingsPath()),\n loadSettingsFile(this.getLocalSettingsPath()),\n loadSettingsFile(getManagedSettingsPath()),\n ]);\n this.userSettings = userSettings;\n this.projectSettings = projectSettings;\n this.localSettings = localSettings;\n this.enterpriseSettings = enterpriseSettings;\n this.mergeAllSettings();\n }\n\n private mergeAllSettings(): void {\n const allSettings = [\n this.userSettings,\n this.projectSettings,\n this.localSettings,\n this.enterpriseSettings,\n ];\n\n const permissions: PermissionSettings = {\n allow: [],\n deny: [],\n ask: [],\n };\n const merged: ClaudeCodeSettings = { permissions };\n\n for (const settings of allSettings) {\n if (settings.permissions) {\n if (settings.permissions.allow) {\n permissions.allow?.push(...settings.permissions.allow);\n }\n if (settings.permissions.deny) {\n permissions.deny?.push(...settings.permissions.deny);\n }\n if (settings.permissions.ask) {\n permissions.ask?.push(...settings.permissions.ask);\n }\n if (settings.permissions.additionalDirectories) {\n permissions.additionalDirectories = [\n ...(permissions.additionalDirectories || []),\n ...settings.permissions.additionalDirectories,\n ];\n }\n if (settings.permissions.defaultMode) {\n permissions.defaultMode = settings.permissions.defaultMode;\n }\n }\n if (settings.env) {\n merged.env = { ...merged.env, ...settings.env };\n }\n if (settings.model) {\n merged.model = settings.model;\n }\n }\n\n this.mergedSettings = merged;\n }\n\n checkPermission(toolName: string, toolInput: unknown): PermissionCheckResult {\n if (!toolName.startsWith(ACP_TOOL_NAME_PREFIX)) {\n return { decision: \"ask\" };\n }\n\n const permissions = this.mergedSettings.permissions;\n if (!permissions) {\n return { decision: \"ask\" };\n }\n\n for (const rule of permissions.deny || []) {\n const parsed = parseRule(rule);\n if (matchesRule(parsed, toolName, toolInput, this.cwd)) {\n return { decision: \"deny\", rule, source: \"deny\" };\n }\n }\n\n for (const rule of permissions.allow || []) {\n const parsed = parseRule(rule);\n if (matchesRule(parsed, toolName, toolInput, this.cwd)) {\n return { decision: \"allow\", rule, source: \"allow\" };\n }\n }\n\n for (const rule of permissions.ask || []) {\n const parsed = parseRule(rule);\n if (matchesRule(parsed, toolName, toolInput, this.cwd)) {\n return { decision: \"ask\", rule, source: \"ask\" };\n }\n }\n\n return { decision: \"ask\" };\n }\n\n getSettings(): ClaudeCodeSettings {\n return this.mergedSettings;\n }\n\n getCwd(): string {\n return this.cwd;\n }\n\n async setCwd(cwd: string): Promise<void> {\n if (this.cwd === cwd) return;\n if (this.initPromise) await this.initPromise;\n this.dispose();\n this.cwd = cwd;\n this.initialized = false;\n await this.initialize();\n }\n\n dispose(): void {\n this.initialized = false;\n }\n}\n","/**\n * In-process ACP proxy agent for Codex.\n *\n * Implements the ACP Agent interface and delegates to the codex-acp binary\n * via a ClientSideConnection. This gives us interception points for:\n * - PostHog-specific notifications (sdk_session, usage_update, turn_complete)\n * - Session resume/fork (not natively supported by codex-acp)\n * - Usage accumulation\n * - System prompt injection\n */\n\nimport {\n type AgentSideConnection,\n type AuthenticateRequest,\n ClientSideConnection,\n type ForkSessionRequest,\n type ForkSessionResponse,\n type InitializeRequest,\n type InitializeResponse,\n type ListSessionsRequest,\n type ListSessionsResponse,\n type LoadSessionRequest,\n type LoadSessionResponse,\n type McpServer,\n type NewSessionRequest,\n type NewSessionResponse,\n ndJsonStream,\n type PromptRequest,\n type PromptResponse,\n RequestError,\n type ResumeSessionRequest,\n type ResumeSessionResponse,\n type SetSessionConfigOptionRequest,\n type SetSessionConfigOptionResponse,\n type SetSessionModeRequest,\n type SetSessionModeResponse,\n} from \"@agentclientprotocol/sdk\";\nimport packageJson from \"../../../package.json\" with { type: \"json\" };\nimport {\n isMethod,\n POSTHOG_METHODS,\n POSTHOG_NOTIFICATIONS,\n} from \"../../acp-extensions\";\nimport {\n createEnrichment,\n type Enrichment,\n} from \"../../enrichment/file-enricher\";\nimport {\n type CodeExecutionMode,\n type CodexNativeMode,\n isCodeExecutionMode,\n isCodexNativeMode,\n type PermissionMode,\n} from \"../../execution-mode\";\nimport type { PostHogAPIConfig, ProcessSpawnedCallback } from \"../../types\";\nimport { Logger } from \"../../utils/logger\";\nimport {\n nodeReadableToWebReadable,\n nodeWritableToWebWritable,\n} from \"../../utils/streams\";\nimport { BaseAcpAgent, type BaseSession } from \"../base-acp-agent\";\nimport { createCodexClient } from \"./codex-client\";\nimport {\n type CodexSessionState,\n createSessionState,\n resetUsage,\n} from \"./session-state\";\nimport { CodexSettingsManager } from \"./settings\";\nimport {\n type CodexProcess,\n type CodexProcessOptions,\n spawnCodexProcess,\n} from \"./spawn\";\n\ninterface NewSessionMeta {\n taskRunId?: string;\n taskId?: string;\n systemPrompt?: string;\n permissionMode?: string;\n model?: string;\n persistence?: { taskId?: string; runId?: string; logUrl?: string };\n claudeCode?: {\n options?: Record<string, unknown>;\n };\n additionalRoots?: string[];\n disableBuiltInTools?: boolean;\n allowedDomains?: string[];\n}\n\nexport interface CodexAcpAgentOptions {\n codexProcessOptions: CodexProcessOptions;\n processCallbacks?: ProcessSpawnedCallback;\n posthogApiConfig?: PostHogAPIConfig;\n}\n\ntype CodexSession = BaseSession & {\n settingsManager: CodexSettingsManager;\n promptRunning: boolean;\n};\n\nfunction toCodexPermissionMode(mode?: string): PermissionMode {\n if (mode && (isCodexNativeMode(mode) || isCodeExecutionMode(mode))) {\n return mode;\n }\n return \"auto\";\n}\n\n/**\n * Prepend `_meta.prContext` (set by the agent-server on Slack-originated\n * follow-up runs) to the prompt as a text block, mirroring Claude's\n * `promptToClaude` behavior. Without this, codex cloud runs lose the\n * PR-review context that follow-up flows rely on.\n */\nfunction prependPrContext(params: PromptRequest): PromptRequest {\n const prContext = (params._meta as Record<string, unknown> | undefined)\n ?.prContext;\n if (typeof prContext !== \"string\" || prContext.length === 0) {\n return params;\n }\n return {\n ...params,\n prompt: [{ type: \"text\", text: prContext }, ...params.prompt],\n };\n}\n\nconst CODEX_NATIVE_MODE: Record<CodeExecutionMode, CodexNativeMode> = {\n auto: \"auto\",\n default: \"auto\",\n acceptEdits: \"auto\",\n plan: \"read-only\",\n bypassPermissions: \"full-access\",\n};\n\nfunction toCodexNativeMode(mode?: string): CodexNativeMode {\n if (mode && isCodexNativeMode(mode)) {\n return mode;\n }\n if (mode && isCodeExecutionMode(mode)) {\n return CODEX_NATIVE_MODE[mode];\n }\n return \"auto\";\n}\n\nfunction getCurrentPermissionMode(\n currentModeId?: string,\n fallbackMode?: string,\n): PermissionMode {\n if (currentModeId && isCodexNativeMode(currentModeId)) {\n return currentModeId;\n }\n\n return toCodexPermissionMode(fallbackMode);\n}\n\nexport class CodexAcpAgent extends BaseAcpAgent {\n readonly adapterName = \"codex\";\n declare session: CodexSession;\n private codexProcess: CodexProcess;\n private codexConnection: ClientSideConnection;\n private sessionState: CodexSessionState;\n /**\n * FIFO serializer for prompt() calls. codex-acp and codex-rs themselves\n * serialize submissions at the conversation level, but our adapter\n * accumulates per-turn usage into sessionState.accumulatedUsage via the\n * codex-client sessionUpdate handler. If two prompts ran concurrently on\n * the JS side, the second's resetUsage() would wipe out the first's\n * in-flight counters and both TURN_COMPLETE notifications would report\n * garbled totals. Serializing on the JS side keeps the accumulator\n * single-owner.\n */\n private promptMutex: Promise<unknown> = Promise.resolve();\n private readonly codexProcessOptions: CodexProcessOptions;\n private readonly processCallbacks?: ProcessSpawnedCallback;\n // Snapshot of the initialize() request so refreshSession can replay the\n // same handshake against a respawned codex-acp subprocess.\n private lastInitRequest?: InitializeRequest;\n private enrichment?: Enrichment;\n\n constructor(client: AgentSideConnection, options: CodexAcpAgentOptions) {\n super(client);\n this.logger = new Logger({ debug: true, prefix: \"[CodexAcpAgent]\" });\n\n // Load user codex settings before spawning so spawnCodexProcess can\n // filter out any [mcp_servers.*] entries from ~/.codex/config.toml.\n const cwd = options.codexProcessOptions.cwd ?? process.cwd();\n const settingsManager = new CodexSettingsManager(cwd);\n\n this.codexProcessOptions = options.codexProcessOptions;\n this.processCallbacks = options.processCallbacks;\n\n // Spawn the codex-acp subprocess\n this.codexProcess = spawnCodexProcess({\n ...options.codexProcessOptions,\n settings: settingsManager.getSettings(),\n logger: this.logger,\n processCallbacks: options.processCallbacks,\n });\n\n // Create ACP connection to codex-acp over stdin/stdout\n const codexReadable = nodeReadableToWebReadable(this.codexProcess.stdout);\n const codexWritable = nodeWritableToWebWritable(this.codexProcess.stdin);\n const codexStream = ndJsonStream(codexWritable, codexReadable);\n\n const abortController = new AbortController();\n this.session = {\n abortController,\n settingsManager,\n notificationHistory: [],\n cancelled: false,\n promptRunning: false,\n };\n\n this.sessionState = createSessionState(\"\", cwd);\n\n this.enrichment = createEnrichment(options.posthogApiConfig, this.logger);\n\n // Create the ClientSideConnection to codex-acp.\n // The Client handler delegates all requests from codex-acp to the upstream\n // PostHog Code client via our AgentSideConnection.\n this.codexConnection = new ClientSideConnection(\n (_agent) =>\n createCodexClient(this.client, this.logger, this.sessionState, {\n enrichmentDeps: this.enrichment?.deps,\n }),\n codexStream,\n );\n }\n\n async initialize(request: InitializeRequest): Promise<InitializeResponse> {\n // Initialize settings\n await this.session.settingsManager.initialize();\n\n // Snapshot the handshake so refreshSession can replay it after respawn.\n this.lastInitRequest = request;\n\n // Forward to codex-acp\n const response = await this.codexConnection.initialize(request);\n\n // Merge our enhanced capabilities\n return {\n ...response,\n agentCapabilities: {\n ...response.agentCapabilities,\n sessionCapabilities: {\n ...response.agentCapabilities?.sessionCapabilities,\n resume: {},\n fork: {},\n },\n _meta: {\n posthog: {\n resumeSession: true,\n },\n },\n },\n agentInfo: {\n name: packageJson.name,\n title: \"Codex Agent\",\n version: packageJson.version,\n },\n };\n }\n\n async newSession(params: NewSessionRequest): Promise<NewSessionResponse> {\n const meta = params._meta as NewSessionMeta | undefined;\n const requestedPermissionMode = toCodexPermissionMode(meta?.permissionMode);\n\n const response = await this.codexConnection.newSession(params);\n\n // Initialize session state\n this.sessionState = createSessionState(response.sessionId, params.cwd, {\n taskRunId: meta?.taskRunId,\n taskId: meta?.taskId ?? meta?.persistence?.taskId,\n modeId: response.modes?.currentModeId ?? \"auto\",\n modelId: response.models?.currentModelId,\n permissionMode: requestedPermissionMode,\n });\n this.sessionId = response.sessionId;\n this.sessionState.configOptions = response.configOptions ?? [];\n\n await this.applyInitialPermissionMode(\n response.sessionId,\n meta?.permissionMode,\n response.modes?.currentModeId,\n );\n\n // Emit _posthog/sdk_session so the app can track the session\n if (meta?.taskRunId) {\n await this.client.extNotification(POSTHOG_NOTIFICATIONS.SDK_SESSION, {\n taskRunId: meta.taskRunId,\n sessionId: response.sessionId,\n adapter: \"codex\",\n });\n }\n\n this.logger.info(\"Codex session created\", {\n sessionId: response.sessionId,\n taskRunId: meta?.taskRunId,\n });\n\n return response;\n }\n\n async loadSession(params: LoadSessionRequest): Promise<LoadSessionResponse> {\n const response = await this.codexConnection.loadSession(params);\n const meta = params._meta as NewSessionMeta | undefined;\n const currentPermissionMode = getCurrentPermissionMode(\n response.modes?.currentModeId,\n meta?.permissionMode,\n );\n\n // Carry taskRunId/taskId across load so prompt() still emits cloud\n // notifications (TURN_COMPLETE, USAGE_UPDATE) after a reload. newSession\n // and unstable_resumeSession both do this; loadSession historically did\n // not, which silently broke task-completion tracking on re-attach.\n this.sessionState = createSessionState(params.sessionId, params.cwd, {\n taskRunId: meta?.taskRunId,\n taskId: meta?.taskId ?? meta?.persistence?.taskId,\n modeId: response.modes?.currentModeId ?? \"auto\",\n permissionMode: currentPermissionMode,\n });\n this.sessionId = params.sessionId;\n this.sessionState.configOptions = response.configOptions ?? [];\n\n if (meta?.taskRunId) {\n await this.client.extNotification(POSTHOG_NOTIFICATIONS.SDK_SESSION, {\n taskRunId: meta.taskRunId,\n sessionId: params.sessionId,\n adapter: \"codex\",\n });\n }\n\n return response;\n }\n\n async unstable_resumeSession(\n params: ResumeSessionRequest,\n ): Promise<ResumeSessionResponse> {\n // codex-acp doesn't support resume natively, use loadSession instead\n const loadResponse = await this.codexConnection.loadSession({\n sessionId: params.sessionId,\n cwd: params.cwd,\n mcpServers: params.mcpServers ?? [],\n });\n\n const meta = params._meta as NewSessionMeta | undefined;\n const currentPermissionMode = getCurrentPermissionMode(\n loadResponse.modes?.currentModeId,\n meta?.permissionMode,\n );\n this.sessionState = createSessionState(params.sessionId, params.cwd, {\n taskRunId: meta?.taskRunId,\n taskId: meta?.taskId ?? meta?.persistence?.taskId,\n modeId: loadResponse.modes?.currentModeId ?? \"auto\",\n permissionMode: currentPermissionMode,\n });\n this.sessionId = params.sessionId;\n this.sessionState.configOptions = loadResponse.configOptions ?? [];\n\n if (meta?.taskRunId) {\n await this.client.extNotification(POSTHOG_NOTIFICATIONS.SDK_SESSION, {\n taskRunId: meta.taskRunId,\n sessionId: params.sessionId,\n adapter: \"codex\",\n });\n }\n\n return {\n modes: loadResponse.modes,\n models: loadResponse.models,\n configOptions: loadResponse.configOptions,\n };\n }\n\n async unstable_forkSession(\n params: ForkSessionRequest,\n ): Promise<ForkSessionResponse> {\n // Create a new session via codex-acp (fork isn't natively supported)\n const newResponse = await this.codexConnection.newSession({\n cwd: params.cwd,\n mcpServers: params.mcpServers ?? [],\n _meta: params._meta,\n });\n\n const meta = params._meta as NewSessionMeta | undefined;\n const requestedPermissionMode = toCodexPermissionMode(meta?.permissionMode);\n this.sessionState = createSessionState(newResponse.sessionId, params.cwd, {\n taskRunId: meta?.taskRunId,\n taskId: meta?.taskId ?? meta?.persistence?.taskId,\n modeId: newResponse.modes?.currentModeId ?? \"auto\",\n permissionMode: requestedPermissionMode,\n });\n this.sessionId = newResponse.sessionId;\n this.sessionState.configOptions = newResponse.configOptions ?? [];\n\n await this.applyInitialPermissionMode(\n newResponse.sessionId,\n meta?.permissionMode,\n newResponse.modes?.currentModeId,\n );\n\n return newResponse;\n }\n\n private async applyInitialPermissionMode(\n sessionId: string,\n permissionMode?: string,\n currentModeId?: string,\n ): Promise<void> {\n if (!permissionMode) {\n return;\n }\n\n const nativeMode = toCodexNativeMode(permissionMode);\n if (nativeMode === currentModeId) {\n this.sessionState.modeId = nativeMode;\n this.sessionState.permissionMode = toCodexPermissionMode(permissionMode);\n return;\n }\n\n await this.codexConnection.setSessionMode({\n sessionId,\n modeId: nativeMode,\n });\n this.sessionState.modeId = nativeMode;\n this.sessionState.permissionMode = toCodexPermissionMode(permissionMode);\n }\n\n async listSessions(\n params: ListSessionsRequest,\n ): Promise<ListSessionsResponse> {\n return this.codexConnection.listSessions(params);\n }\n\n async unstable_listSessions(\n params: ListSessionsRequest,\n ): Promise<ListSessionsResponse> {\n return this.listSessions(params);\n }\n\n async prompt(params: PromptRequest): Promise<PromptResponse> {\n const previous = this.promptMutex;\n const next = previous.catch(() => {}).then(() => this.runPrompt(params));\n this.promptMutex = next;\n return next;\n }\n\n private async runPrompt(params: PromptRequest): Promise<PromptResponse> {\n this.session.cancelled = false;\n this.session.interruptReason = undefined;\n resetUsage(this.sessionState);\n\n // codex-acp does not echo the user prompt back on the agent→client\n // channel, so without this broadcast the tapped stream (persisted to S3\n // and rendered by the PostHog web UI) never sees a user turn and only\n // the assistant reply shows up. Mirrors ClaudeAcpAgent.broadcastUserMessage.\n // The original params (no _meta.prContext prefix) is broadcast so the\n // injected PR context is not rendered as a user message.\n await this.broadcastUserMessage(params);\n\n this.session.promptRunning = true;\n let response: PromptResponse;\n try {\n response = await this.codexConnection.prompt(prependPrContext(params));\n } finally {\n this.session.promptRunning = false;\n }\n\n // Usage is already accumulated via sessionUpdate notifications in\n // codex-client.ts. Do NOT also add response.usage here or tokens\n // get double-counted.\n\n if (this.sessionState.taskRunId) {\n const { accumulatedUsage } = this.sessionState;\n\n await this.client.extNotification(POSTHOG_NOTIFICATIONS.TURN_COMPLETE, {\n sessionId: params.sessionId,\n stopReason: response.stopReason ?? \"end_turn\",\n usage: {\n inputTokens: accumulatedUsage.inputTokens,\n outputTokens: accumulatedUsage.outputTokens,\n cachedReadTokens: accumulatedUsage.cachedReadTokens,\n cachedWriteTokens: accumulatedUsage.cachedWriteTokens,\n totalTokens:\n accumulatedUsage.inputTokens +\n accumulatedUsage.outputTokens +\n accumulatedUsage.cachedReadTokens +\n accumulatedUsage.cachedWriteTokens,\n },\n });\n\n if (response.usage) {\n await this.client.extNotification(POSTHOG_NOTIFICATIONS.USAGE_UPDATE, {\n sessionId: params.sessionId,\n used: {\n inputTokens: response.usage.inputTokens ?? 0,\n outputTokens: response.usage.outputTokens ?? 0,\n cachedReadTokens: response.usage.cachedReadTokens ?? 0,\n cachedWriteTokens: response.usage.cachedWriteTokens ?? 0,\n },\n cost: null,\n });\n }\n }\n\n return response;\n }\n\n protected async interrupt(): Promise<void> {\n await this.codexConnection.cancel({\n sessionId: this.sessionId,\n });\n }\n\n private async broadcastUserMessage(params: PromptRequest): Promise<void> {\n for (const chunk of params.prompt) {\n const notification = {\n sessionId: params.sessionId,\n update: {\n sessionUpdate: \"user_message_chunk\" as const,\n content: chunk,\n },\n };\n await this.client.sessionUpdate(notification);\n this.appendNotification(params.sessionId, notification);\n }\n }\n\n /**\n * Refresh the session between turns. Currently the only refreshable field\n * is `mcpServers`. Unlike Claude (where we rebuild an in-process Query with\n * `resume`), Codex runs as a `codex-acp` subprocess whose MCP set is bound\n * at `newSession`/`loadSession` time and whose user-local MCPs are disabled\n * via spawn-time `-c mcp_servers.<name>.enabled=false` CLI args. To\n * guarantee the caller-supplied set fully wins, we respawn the subprocess\n * and rehydrate the session via `loadSession` — codex-acp persists sessions\n * to disk, so conversation history is preserved.\n *\n * This is an `extMethod` (request/response), not `extNotification`, so the\n * caller can await completion before sending the next prompt.\n *\n * Caller contract: only call REFRESH_SESSION between turns (no prompt in flight).\n */\n async extMethod(\n method: string,\n params: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n if (!isMethod(method, POSTHOG_METHODS.REFRESH_SESSION)) {\n throw RequestError.methodNotFound(method);\n }\n\n // Trust boundary: refresh is only safe when the caller is trusted infra\n // (e.g. the sandbox agent-server). Do not route this method from\n // untrusted clients — mcpServers contents are forwarded verbatim to\n // codex-acp with no URL/command validation.\n if (params.mcpServers === undefined) {\n throw new RequestError(\n -32602,\n \"refresh_session requires at least one refreshable field (e.g. mcpServers)\",\n );\n }\n if (!Array.isArray(params.mcpServers)) {\n throw new RequestError(\n -32602,\n \"refresh_session: mcpServers must be an array\",\n );\n }\n\n await this.refreshSession(params.mcpServers as McpServer[]);\n return { refreshed: true };\n }\n\n private async refreshSession(mcpServers: McpServer[]): Promise<void> {\n const prev = this.session;\n if (prev.promptRunning) {\n throw new RequestError(\n -32002,\n \"Cannot refresh session while a prompt turn is in flight\",\n );\n }\n\n this.logger.info(\"Refreshing Codex session with fresh MCP servers\", {\n serverCount: mcpServers.length,\n sessionId: this.sessionId,\n });\n\n // Abort FIRST so any stuck in-flight ACP request unblocks — otherwise\n // cancel() can deadlock waiting on a codex-acp call that never returns.\n prev.abortController.abort();\n try {\n await this.codexConnection.cancel({ sessionId: this.sessionId });\n } catch (err) {\n this.logger.warn(\"cancel() during refresh failed (non-fatal)\", {\n error: err,\n });\n }\n this.codexProcess.kill();\n\n // Respawn with the same options and a fresh settings manager rooted at\n // the current cwd (so the `mcp_servers.<name>.enabled=false` args are\n // regenerated from the latest ~/.codex/config.toml).\n const cwd = prev.settingsManager.getCwd();\n const newSettingsManager = new CodexSettingsManager(cwd);\n await newSettingsManager.initialize();\n\n const newProcess = spawnCodexProcess({\n ...this.codexProcessOptions,\n cwd,\n settings: newSettingsManager.getSettings(),\n logger: this.logger,\n processCallbacks: this.processCallbacks,\n });\n\n const codexReadable = nodeReadableToWebReadable(newProcess.stdout);\n const codexWritable = nodeWritableToWebWritable(newProcess.stdin);\n const codexStream = ndJsonStream(codexWritable, codexReadable);\n\n const newAbortController = new AbortController();\n const newConnection = new ClientSideConnection(\n (_agent) =>\n createCodexClient(this.client, this.logger, this.sessionState),\n codexStream,\n );\n\n // Re-run ACP init on the new subprocess, then rehydrate the session with\n // the new MCP set. loadSession is codex-acp's equivalent of Claude's\n // `resume` — conversation history is restored from disk.\n const initRequest: InitializeRequest = this.lastInitRequest ?? {\n protocolVersion: 1,\n };\n await newConnection.initialize(initRequest);\n await newConnection.loadSession({\n sessionId: this.sessionId,\n cwd: this.sessionState.cwd,\n mcpServers,\n });\n\n // Swap everything at once so closeSession/prompt/cancel target the new\n // subprocess going forward. Preserve sessionState (accumulatedUsage,\n // taskRunId, configOptions) untouched.\n this.codexProcess = newProcess;\n this.codexConnection = newConnection;\n prev.settingsManager.dispose();\n prev.settingsManager = newSettingsManager;\n prev.abortController = newAbortController;\n }\n\n async setSessionMode(\n params: SetSessionModeRequest,\n ): Promise<SetSessionModeResponse> {\n const requestedMode = toCodexPermissionMode(params.modeId);\n const nativeMode = toCodexNativeMode(params.modeId);\n\n const response = await this.codexConnection.setSessionMode({\n ...params,\n modeId: nativeMode,\n });\n\n this.sessionState.modeId = nativeMode;\n this.sessionState.permissionMode = requestedMode;\n return response ?? {};\n }\n\n async setSessionConfigOption(\n params: SetSessionConfigOptionRequest,\n ): Promise<SetSessionConfigOptionResponse> {\n const response = await this.codexConnection.setSessionConfigOption(params);\n if (response.configOptions) {\n this.sessionState.configOptions = response.configOptions;\n }\n return response;\n }\n\n async authenticate(_params: AuthenticateRequest): Promise<void> {\n // Auth handled externally\n }\n\n async closeSession(): Promise<void> {\n this.logger.info(\"Closing Codex session\", { sessionId: this.sessionId });\n this.session.abortController.abort();\n this.session.settingsManager.dispose();\n try {\n this.codexProcess.kill();\n } catch (err) {\n this.logger.warn(\"Failed to kill codex-acp process\", { error: err });\n }\n this.enrichment?.dispose();\n this.enrichment = undefined;\n }\n}\n","/**\n * ACP Client implementation for communicating with codex-acp subprocess.\n *\n * This acts as the \"client\" from codex-acp's perspective: it receives\n * permission requests, session updates, file I/O, and terminal operations\n * from codex-acp and delegates them to the upstream PostHog Code client.\n */\n\nimport type {\n AgentSideConnection,\n Client,\n CreateTerminalRequest,\n CreateTerminalResponse,\n KillTerminalRequest,\n KillTerminalResponse,\n ReadTextFileRequest,\n ReadTextFileResponse,\n ReleaseTerminalRequest,\n ReleaseTerminalResponse,\n RequestPermissionRequest,\n RequestPermissionResponse,\n SessionNotification,\n TerminalHandle,\n TerminalOutputRequest,\n TerminalOutputResponse,\n ToolKind,\n WaitForTerminalExitRequest,\n WaitForTerminalExitResponse,\n WriteTextFileRequest,\n WriteTextFileResponse,\n} from \"@agentclientprotocol/sdk\";\nimport {\n enrichFileForAgent,\n type FileEnrichmentDeps,\n} from \"../../enrichment/file-enricher\";\nimport type { PermissionMode } from \"../../execution-mode\";\nimport type { Logger } from \"../../utils/logger\";\nimport type { CodexSessionState } from \"./session-state\";\n\nexport interface CodexClientCallbacks {\n /** Called when a usage_update session notification is received */\n onUsageUpdate?: (update: Record<string, unknown>) => void;\n /** When set, Read responses are annotated with PostHog enrichment before reaching codex-acp. */\n enrichmentDeps?: FileEnrichmentDeps;\n}\n\nconst AUTO_APPROVED_KINDS: Record<PermissionMode, Set<ToolKind>> = {\n default: new Set([\"read\", \"search\", \"fetch\", \"think\"]),\n acceptEdits: new Set([\"read\", \"edit\", \"search\", \"fetch\", \"think\"]),\n plan: new Set([\"read\", \"search\", \"fetch\", \"think\"]),\n bypassPermissions: new Set([\n \"read\",\n \"edit\",\n \"delete\",\n \"move\",\n \"search\",\n \"execute\",\n \"think\",\n \"fetch\",\n \"switch_mode\",\n \"other\",\n ]),\n auto: new Set([\"read\", \"search\", \"fetch\", \"think\"]),\n \"read-only\": new Set([\"read\", \"search\", \"fetch\", \"think\"]),\n \"full-access\": new Set([\n \"read\",\n \"edit\",\n \"delete\",\n \"move\",\n \"search\",\n \"execute\",\n \"think\",\n \"fetch\",\n \"switch_mode\",\n \"other\",\n ]),\n};\n\nfunction shouldAutoApprove(\n mode: PermissionMode,\n kind: ToolKind | null | undefined,\n): boolean {\n if (mode === \"bypassPermissions\" || mode === \"full-access\") return true;\n if (!kind) return false;\n return AUTO_APPROVED_KINDS[mode]?.has(kind) ?? false;\n}\n\n/**\n * Creates an ACP Client that delegates all requests from codex-acp\n * to the upstream PostHog Code client (via AgentSideConnection).\n */\nexport function createCodexClient(\n upstreamClient: AgentSideConnection,\n logger: Logger,\n sessionState: CodexSessionState,\n callbacks?: CodexClientCallbacks,\n): Client {\n const terminalHandles = new Map<string, TerminalHandle>();\n\n return {\n async requestPermission(\n params: RequestPermissionRequest,\n ): Promise<RequestPermissionResponse> {\n const kind = params.toolCall?.kind as ToolKind | null | undefined;\n\n if (shouldAutoApprove(sessionState.permissionMode, kind)) {\n logger.debug(\"Auto-approving permission\", {\n mode: sessionState.permissionMode,\n kind,\n toolCallId: params.toolCall?.toolCallId,\n });\n const allowOption = params.options?.find(\n (o) => o.kind === \"allow_once\" || o.kind === \"allow_always\",\n );\n return {\n outcome: {\n outcome: \"selected\",\n optionId: allowOption?.optionId ?? \"allow\",\n },\n };\n }\n\n return upstreamClient.requestPermission(params);\n },\n\n async sessionUpdate(params: SessionNotification): Promise<void> {\n const update = params.update as Record<string, unknown> | undefined;\n if (update?.sessionUpdate === \"usage_update\") {\n const used = update.used as number | undefined;\n const size = update.size as number | undefined;\n if (used !== undefined) sessionState.contextUsed = used;\n if (size !== undefined) sessionState.contextSize = size;\n\n // Accumulate per-message token usage when available\n const inputTokens = update.inputTokens as number | undefined;\n const outputTokens = update.outputTokens as number | undefined;\n if (inputTokens !== undefined) {\n sessionState.accumulatedUsage.inputTokens += inputTokens;\n }\n if (outputTokens !== undefined) {\n sessionState.accumulatedUsage.outputTokens += outputTokens;\n }\n const cachedRead = update.cachedReadTokens as number | undefined;\n const cachedWrite = update.cachedWriteTokens as number | undefined;\n if (cachedRead !== undefined) {\n sessionState.accumulatedUsage.cachedReadTokens += cachedRead;\n }\n if (cachedWrite !== undefined) {\n sessionState.accumulatedUsage.cachedWriteTokens += cachedWrite;\n }\n\n callbacks?.onUsageUpdate?.(update);\n }\n\n await upstreamClient.sessionUpdate(params);\n },\n\n async readTextFile(\n params: ReadTextFileRequest,\n ): Promise<ReadTextFileResponse> {\n const response = await upstreamClient.readTextFile(params);\n if (!callbacks?.enrichmentDeps) return response;\n const enriched = await enrichFileForAgent(\n callbacks.enrichmentDeps,\n params.path,\n response.content,\n );\n return enriched ? { ...response, content: enriched } : response;\n },\n\n async writeTextFile(\n params: WriteTextFileRequest,\n ): Promise<WriteTextFileResponse> {\n return upstreamClient.writeTextFile(params);\n },\n\n async createTerminal(\n params: CreateTerminalRequest,\n ): Promise<CreateTerminalResponse> {\n const handle = await upstreamClient.createTerminal(params);\n terminalHandles.set(handle.id, handle);\n return { terminalId: handle.id };\n },\n\n async terminalOutput(\n params: TerminalOutputRequest,\n ): Promise<TerminalOutputResponse> {\n const handle = terminalHandles.get(params.terminalId);\n if (!handle) {\n return { output: \"\", truncated: false };\n }\n return handle.currentOutput();\n },\n\n async releaseTerminal(\n params: ReleaseTerminalRequest,\n ): Promise<ReleaseTerminalResponse | undefined> {\n const handle = terminalHandles.get(params.terminalId);\n if (handle) {\n terminalHandles.delete(params.terminalId);\n const result = await handle.release();\n return result ?? undefined;\n }\n },\n\n async waitForTerminalExit(\n params: WaitForTerminalExitRequest,\n ): Promise<WaitForTerminalExitResponse> {\n const handle = terminalHandles.get(params.terminalId);\n if (!handle) {\n return { exitCode: 1 };\n }\n return handle.waitForExit();\n },\n\n async killTerminal(\n params: KillTerminalRequest,\n ): Promise<KillTerminalResponse | undefined> {\n const handle = terminalHandles.get(params.terminalId);\n if (handle) {\n return handle.kill();\n }\n },\n\n async extMethod(\n method: string,\n params: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n return upstreamClient.extMethod(method, params);\n },\n\n async extNotification(\n method: string,\n params: Record<string, unknown>,\n ): Promise<void> {\n return upstreamClient.extNotification(method, params);\n },\n };\n}\n","/**\n * Session state tracking for Codex proxy agent.\n * Tracks usage accumulation, model/mode state, and config options.\n */\n\nimport type { SessionConfigOption } from \"@agentclientprotocol/sdk\";\nimport type { PermissionMode } from \"../../execution-mode\";\n\nexport interface CodexUsage {\n inputTokens: number;\n outputTokens: number;\n cachedReadTokens: number;\n cachedWriteTokens: number;\n}\n\nexport interface CodexSessionState {\n sessionId: string;\n cwd: string;\n modelId?: string;\n modeId: string;\n configOptions: SessionConfigOption[];\n accumulatedUsage: CodexUsage;\n contextSize?: number;\n contextUsed?: number;\n permissionMode: PermissionMode;\n taskRunId?: string;\n taskId?: string;\n}\n\nexport function createSessionState(\n sessionId: string,\n cwd: string,\n opts?: {\n taskRunId?: string;\n taskId?: string;\n modeId?: string;\n modelId?: string;\n permissionMode?: PermissionMode;\n },\n): CodexSessionState {\n return {\n sessionId,\n cwd,\n modeId: opts?.modeId ?? \"auto\",\n modelId: opts?.modelId,\n configOptions: [],\n accumulatedUsage: {\n inputTokens: 0,\n outputTokens: 0,\n cachedReadTokens: 0,\n cachedWriteTokens: 0,\n },\n permissionMode: opts?.permissionMode ?? \"auto\",\n taskRunId: opts?.taskRunId,\n taskId: opts?.taskId,\n };\n}\n\nexport function resetUsage(state: CodexSessionState): void {\n state.accumulatedUsage = {\n inputTokens: 0,\n outputTokens: 0,\n cachedReadTokens: 0,\n cachedWriteTokens: 0,\n };\n}\n","import * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\n\n/**\n * Codex settings parsed from ~/.codex/config.toml and project-level config.\n *\n * Mirrors the shape of ClaudeCodeSettings so both adapters have a\n * consistent settings interface.\n */\nexport interface CodexSettings {\n model?: string;\n personality?: string;\n modelReasoningEffort?: string;\n trustLevel?: string;\n // Names of every `[mcp_servers.<name>]` section declared in the user's config.toml\n mcpServerNames: string[];\n}\n\n/**\n * SettingsManager for Codex sessions.\n *\n * Reads from ~/.codex/config.toml (user-level) and respects\n * per-project trust configuration. Has the same public interface\n * as Claude's SettingsManager so both can satisfy BaseSession.\n */\nexport class CodexSettingsManager {\n private cwd: string;\n private settings: CodexSettings = { mcpServerNames: [] };\n\n constructor(cwd: string) {\n this.cwd = cwd;\n this.loadSettings();\n }\n\n async initialize(): Promise<void> {\n // No-op: settings are loaded in the constructor. Kept async to\n // satisfy the BaseSettingsManager interface.\n }\n\n private getConfigPath(): string {\n return path.join(os.homedir(), \".codex\", \"config.toml\");\n }\n\n private loadSettings(): void {\n const configPath = this.getConfigPath();\n try {\n const content = fs.readFileSync(configPath, \"utf-8\");\n this.settings = parseCodexToml(content, this.cwd);\n } catch {\n this.settings = { mcpServerNames: [] };\n }\n }\n\n getSettings(): CodexSettings {\n return this.settings;\n }\n\n getCwd(): string {\n return this.cwd;\n }\n\n async setCwd(cwd: string): Promise<void> {\n if (this.cwd === cwd) return;\n this.cwd = cwd;\n this.loadSettings();\n }\n\n dispose(): void {\n // No-op: no resources to release. Kept to satisfy the BaseSettingsManager interface.\n }\n}\n\n/**\n * Minimal TOML parser for codex config.toml.\n * Handles flat key=value pairs and [projects.\"path\"] sections.\n * Does NOT handle full TOML spec — only what codex config uses.\n */\nfunction parseCodexToml(content: string, cwd: string): CodexSettings {\n const settings: CodexSettings = { mcpServerNames: [] };\n const mcpServerNames = new Set<string>();\n let currentSection = \"\";\n\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n\n // Section header: [projects.\"/some/path\"] or [section]\n const sectionMatch = trimmed.match(/^\\[(.+)\\]$/);\n if (sectionMatch) {\n currentSection = sectionMatch[1] ?? \"\";\n if (currentSection.startsWith(\"mcp_servers.\")) {\n mcpServerNames.add(currentSection.slice(\"mcp_servers.\".length));\n }\n continue;\n }\n\n // Key = value\n const kvMatch = trimmed.match(/^(\\w+)\\s*=\\s*(.+)$/);\n if (!kvMatch) continue;\n\n const key = kvMatch[1];\n let value = kvMatch[2]?.trim() ?? \"\";\n\n // Strip quotes\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n\n if (!currentSection) {\n // Top-level keys\n if (key === \"model\") settings.model = value;\n if (key === \"personality\") settings.personality = value;\n if (key === \"model_reasoning_effort\")\n settings.modelReasoningEffort = value;\n } else if (currentSection === `projects.\"${cwd}\"`) {\n // Project-specific keys\n if (key === \"trust_level\") settings.trustLevel = value;\n }\n }\n\n settings.mcpServerNames = Array.from(mcpServerNames);\n return settings;\n}\n","import { type ChildProcess, spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { delimiter, dirname } from \"node:path\";\nimport type { Readable, Writable } from \"node:stream\";\nimport type { ProcessSpawnedCallback } from \"../../types\";\nimport { Logger } from \"../../utils/logger\";\nimport type { CodexSettings } from \"./settings\";\n\nexport interface CodexProcessOptions {\n cwd?: string;\n apiBaseUrl?: string;\n apiKey?: string;\n model?: string;\n reasoningEffort?: string;\n instructions?: string;\n binaryPath?: string;\n logger?: Logger;\n processCallbacks?: ProcessSpawnedCallback;\n settings?: CodexSettings;\n}\n\nexport interface CodexProcess {\n process: ChildProcess;\n stdin: Writable;\n stdout: Readable;\n kill: () => void;\n}\n\nfunction buildConfigArgs(options: CodexProcessOptions): string[] {\n const args: string[] = [];\n\n args.push(\"-c\", `features.remote_models=false`);\n\n // Disable the user's local MCPs one-by-one so Codex only uses the MCPs we\n // provide via ACP. We can't use `-c mcp_servers={}` because that makes Codex\n // ignore MCPs entirely, including the ones we inject later.\n for (const name of options.settings?.mcpServerNames ?? []) {\n args.push(\"-c\", `mcp_servers.${name}.enabled=false`);\n }\n\n if (options.apiBaseUrl) {\n args.push(\"-c\", `model_provider=\"posthog\"`);\n args.push(\"-c\", `model_providers.posthog.name=\"PostHog Gateway\"`);\n args.push(\"-c\", `model_providers.posthog.base_url=\"${options.apiBaseUrl}\"`);\n args.push(\"-c\", `model_providers.posthog.wire_api=\"responses\"`);\n args.push(\n \"-c\",\n `model_providers.posthog.env_key=\"POSTHOG_GATEWAY_API_KEY\"`,\n );\n }\n\n if (options.model) {\n args.push(\"-c\", `model=\"${options.model}\"`);\n }\n\n if (options.reasoningEffort) {\n args.push(\"-c\", `model_reasoning_effort=\"${options.reasoningEffort}\"`);\n }\n\n if (options.instructions) {\n const escaped = options.instructions\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\\n/g, \"\\\\n\")\n .replace(/\\r/g, \"\\\\r\")\n .replace(/\"/g, '\\\\\"');\n args.push(\"-c\", `instructions=\"${escaped}\"`);\n }\n\n return args;\n}\n\nfunction findCodexBinary(options: CodexProcessOptions): {\n command: string;\n args: string[];\n} {\n const configArgs = buildConfigArgs(options);\n\n if (options.binaryPath && existsSync(options.binaryPath)) {\n return { command: options.binaryPath, args: configArgs };\n }\n\n if (options.binaryPath) {\n throw new Error(\n `codex-acp binary not found at ${options.binaryPath}. Run \"node apps/code/scripts/download-binaries.mjs\" to download it.`,\n );\n }\n\n return { command: \"npx\", args: [\"@zed-industries/codex-acp\", ...configArgs] };\n}\n\nexport function spawnCodexProcess(options: CodexProcessOptions): CodexProcess {\n const logger =\n options.logger ?? new Logger({ debug: true, prefix: \"[CodexSpawn]\" });\n\n const env: NodeJS.ProcessEnv = { ...process.env };\n\n delete env.ELECTRON_RUN_AS_NODE;\n delete env.ELECTRON_NO_ASAR;\n\n if (options.apiKey) {\n env.POSTHOG_GATEWAY_API_KEY = options.apiKey;\n }\n\n const { command, args } = findCodexBinary(options);\n\n if (options.binaryPath && existsSync(options.binaryPath)) {\n const binDir = dirname(options.binaryPath);\n env.PATH = `${binDir}${delimiter}${env.PATH ?? \"\"}`;\n }\n\n logger.info(\"Spawning codex-acp process\", {\n command,\n args,\n cwd: options.cwd,\n hasApiBaseUrl: !!options.apiBaseUrl,\n hasApiKey: !!options.apiKey,\n binaryPath: options.binaryPath,\n });\n\n const child = spawn(command, args, {\n cwd: options.cwd,\n env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n detached: process.platform !== \"win32\",\n });\n\n child.stderr?.on(\"data\", (data: Buffer) => {\n logger.warn(\"codex-acp stderr:\", data.toString());\n });\n\n child.on(\"error\", (err) => {\n logger.error(\"codex-acp process error:\", err);\n });\n\n child.on(\"exit\", (code, signal) => {\n logger.info(\"codex-acp process exited\", { code, signal });\n if (child.pid && options.processCallbacks?.onProcessExited) {\n options.processCallbacks.onProcessExited(child.pid);\n }\n });\n\n if (!child.stdin || !child.stdout) {\n throw new Error(\"Failed to get stdio streams from codex-acp process\");\n }\n\n if (child.pid && options.processCallbacks?.onProcessSpawned) {\n options.processCallbacks.onProcessSpawned({\n pid: child.pid,\n command,\n });\n }\n\n return {\n process: child,\n stdin: child.stdin,\n stdout: child.stdout,\n kill: () => {\n logger.info(\"Killing codex-acp process\", { pid: child.pid });\n child.stdin?.destroy();\n child.stdout?.destroy();\n child.stderr?.destroy();\n child.kill(\"SIGTERM\");\n },\n };\n}\n","export type GatewayProduct = \"posthog_code\" | \"background_agents\";\n\nfunction getGatewayBaseUrl(posthogHost: string): string {\n const url = new URL(posthogHost);\n const hostname = url.hostname;\n\n if (hostname === \"localhost\" || hostname === \"127.0.0.1\") {\n return `${url.protocol}//localhost:3308`;\n }\n\n if (hostname === \"host.docker.internal\") {\n return `${url.protocol}//host.docker.internal:3308`;\n }\n\n const region = hostname.match(/^(us|eu)\\.posthog\\.com$/)?.[1] ?? \"us\";\n return `https://gateway.${region}.posthog.com`;\n}\n\nexport function getLlmGatewayUrl(\n posthogHost: string,\n product: GatewayProduct = \"posthog_code\",\n): string {\n return `${getGatewayBaseUrl(posthogHost)}/${product}`;\n}\n\nexport function getGatewayUsageUrl(\n posthogHost: string,\n product: GatewayProduct = \"posthog_code\",\n): string {\n return `${getGatewayBaseUrl(posthogHost)}/v1/usage/${product}`;\n}\n","import packageJson from \"../package.json\" with { type: \"json\" };\nimport type {\n ArtifactType,\n PostHogAPIConfig,\n StoredEntry,\n Task,\n TaskRun,\n TaskRunArtifact,\n} from \"./types\";\nimport { getGatewayUsageUrl, getLlmGatewayUrl } from \"./utils/gateway\";\n\nexport { getGatewayUsageUrl, getLlmGatewayUrl };\n\nconst DEFAULT_USER_AGENT = `posthog/agent.hog.dev; version: ${packageJson.version}`;\n\nexport interface TaskArtifactUploadPayload {\n name: string;\n type: ArtifactType;\n content: string;\n content_type?: string;\n}\n\nexport type TaskRunUpdate = Partial<\n Pick<\n TaskRun,\n | \"status\"\n | \"branch\"\n | \"stage\"\n | \"error_message\"\n | \"output\"\n | \"state\"\n | \"environment\"\n >\n>;\n\nexport class PostHogAPIClient {\n private config: PostHogAPIConfig;\n\n constructor(config: PostHogAPIConfig) {\n this.config = config;\n }\n\n private get baseUrl(): string {\n const host = this.config.apiUrl.endsWith(\"/\")\n ? this.config.apiUrl.slice(0, -1)\n : this.config.apiUrl;\n return host;\n }\n\n private isAuthFailure(status: number): boolean {\n return status === 401 || status === 403;\n }\n\n private async resolveApiKey(forceRefresh = false): Promise<string> {\n if (forceRefresh && this.config.refreshApiKey) {\n return this.config.refreshApiKey();\n }\n\n return this.config.getApiKey();\n }\n\n private async buildHeaders(\n options: RequestInit,\n forceRefresh = false,\n ): Promise<Headers> {\n const headers = new Headers(options.headers);\n headers.set(\n \"Authorization\",\n `Bearer ${await this.resolveApiKey(forceRefresh)}`,\n );\n headers.set(\"Content-Type\", \"application/json\");\n headers.set(\"User-Agent\", this.config.userAgent ?? DEFAULT_USER_AGENT);\n return headers;\n }\n\n private async performRequest(\n endpoint: string,\n options: RequestInit,\n forceRefresh = false,\n ): Promise<Response> {\n const url = `${this.baseUrl}${endpoint}`;\n\n return fetch(url, {\n ...options,\n headers: await this.buildHeaders(options, forceRefresh),\n });\n }\n\n private async performRequestWithRetry(\n endpoint: string,\n options: RequestInit = {},\n ): Promise<Response> {\n let response = await this.performRequest(endpoint, options);\n\n if (!response.ok && this.isAuthFailure(response.status)) {\n response = await this.performRequest(endpoint, options, true);\n }\n\n return response;\n }\n\n private async apiRequest<T>(\n endpoint: string,\n options: RequestInit = {},\n ): Promise<T> {\n const response = await this.performRequestWithRetry(endpoint, options);\n\n if (!response.ok) {\n let errorMessage: string;\n try {\n const errorResponse = await response.json();\n errorMessage = `Failed request: [${response.status}] ${JSON.stringify(errorResponse)}`;\n } catch {\n errorMessage = `Failed request: [${response.status}] ${response.statusText}`;\n }\n throw new Error(errorMessage);\n }\n\n return response.json();\n }\n\n private getTeamId(): number {\n return this.config.projectId;\n }\n\n async getApiKey(forceRefresh = false): Promise<string> {\n return this.resolveApiKey(forceRefresh);\n }\n\n getLlmGatewayUrl(): string {\n return getLlmGatewayUrl(this.baseUrl);\n }\n\n async getTask(taskId: string): Promise<Task> {\n const teamId = this.getTeamId();\n return this.apiRequest<Task>(`/api/projects/${teamId}/tasks/${taskId}/`);\n }\n\n async getTaskRun(taskId: string, runId: string): Promise<TaskRun> {\n const teamId = this.getTeamId();\n return this.apiRequest<TaskRun>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/`,\n );\n }\n\n async updateTaskRun(\n taskId: string,\n runId: string,\n payload: TaskRunUpdate,\n ): Promise<TaskRun> {\n const teamId = this.getTeamId();\n return this.apiRequest<TaskRun>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/`,\n {\n method: \"PATCH\",\n body: JSON.stringify(payload),\n },\n );\n }\n\n async setTaskRunOutput(\n taskId: string,\n runId: string,\n output: Record<string, unknown>,\n ): Promise<TaskRun> {\n return this.apiRequest(\n `/api/projects/${this.getTeamId()}/tasks/${taskId}/runs/${runId}/set_output/`,\n {\n method: \"PATCH\",\n body: JSON.stringify(output),\n },\n );\n }\n\n async appendTaskRunLog(\n taskId: string,\n runId: string,\n entries: StoredEntry[],\n ): Promise<TaskRun> {\n const teamId = this.getTeamId();\n return this.apiRequest<TaskRun>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/append_log/`,\n {\n method: \"POST\",\n body: JSON.stringify({ entries }),\n },\n );\n }\n\n async relayMessage(\n taskId: string,\n runId: string,\n text: string,\n ): Promise<void> {\n const teamId = this.getTeamId();\n await this.apiRequest<{ status: string }>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/relay_message/`,\n {\n method: \"POST\",\n body: JSON.stringify({ text }),\n },\n );\n }\n\n async uploadTaskArtifacts(\n taskId: string,\n runId: string,\n artifacts: TaskArtifactUploadPayload[],\n ): Promise<TaskRunArtifact[]> {\n if (!artifacts.length) {\n return [];\n }\n\n const teamId = this.getTeamId();\n const response = await this.apiRequest<{ artifacts: TaskRunArtifact[] }>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/artifacts/`,\n {\n method: \"POST\",\n body: JSON.stringify({ artifacts }),\n },\n );\n\n return response.artifacts ?? [];\n }\n\n async getArtifactPresignedUrl(\n taskId: string,\n runId: string,\n storagePath: string,\n ): Promise<string | null> {\n const teamId = this.getTeamId();\n try {\n const response = await this.apiRequest<{\n url: string;\n expires_in: number;\n }>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/artifacts/presign/`,\n {\n method: \"POST\",\n body: JSON.stringify({ storage_path: storagePath }),\n },\n );\n return response.url;\n } catch {\n return null;\n }\n }\n\n /**\n * Download artifact content by storage path\n * Gets a presigned URL and fetches the content\n */\n async downloadArtifact(\n taskId: string,\n runId: string,\n storagePath: string,\n ): Promise<ArrayBuffer | null> {\n const url = await this.getArtifactPresignedUrl(taskId, runId, storagePath);\n if (!url) {\n return null;\n }\n\n try {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to download artifact: ${response.status}`);\n }\n return response.arrayBuffer();\n } catch {\n return null;\n }\n }\n\n /**\n * Fetch logs for a task run via the logs API endpoint\n * @param taskRun - The task run to fetch logs for\n * @returns Array of stored entries, or empty array if no logs available\n */\n async fetchTaskRunLogs(taskRun: TaskRun): Promise<StoredEntry[]> {\n const teamId = this.getTeamId();\n const endpoint = `/api/projects/${teamId}/tasks/${taskRun.task}/runs/${taskRun.id}/logs`;\n\n try {\n const response = await this.performRequestWithRetry(endpoint);\n\n if (!response.ok) {\n if (response.status === 404) {\n return [];\n }\n throw new Error(\n `Failed to fetch logs: ${response.status} ${response.statusText}`,\n );\n }\n\n const content = await response.text();\n\n if (!content.trim()) {\n return [];\n }\n\n // Parse newline-delimited JSON\n return content\n .trim()\n .split(\"\\n\")\n .map((line) => JSON.parse(line) as StoredEntry);\n } catch (error) {\n throw new Error(\n `Failed to fetch task run logs: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n}\n","import fs from \"node:fs\";\nimport fsp from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { SessionContext } from \"./otel-log-writer\";\nimport type { PostHogAPIClient } from \"./posthog-api\";\nimport type { StoredNotification } from \"./types\";\nimport { Logger } from \"./utils/logger\";\n\nexport interface SessionLogWriterOptions {\n /** PostHog API client for log persistence */\n posthogAPI?: PostHogAPIClient;\n /** Logger instance */\n logger?: Logger;\n /** Local cache path for instant log loading (e.g., ~/.posthog-code) */\n localCachePath?: string;\n}\n\ninterface ChunkBuffer {\n text: string;\n firstTimestamp: string;\n}\n\ninterface SessionState {\n context: SessionContext;\n chunkBuffer?: ChunkBuffer;\n lastAgentMessage?: string;\n currentTurnMessages: string[];\n}\n\nexport class SessionLogWriter {\n private static readonly FLUSH_DEBOUNCE_MS = 500;\n private static readonly FLUSH_MAX_INTERVAL_MS = 5000;\n private static readonly MAX_FLUSH_RETRIES = 10;\n private static readonly MAX_RETRY_DELAY_MS = 30_000;\n private static readonly SESSIONS_MAX_AGE_MS = 30 * 24 * 60 * 60 * 1000;\n\n private posthogAPI?: PostHogAPIClient;\n private pendingEntries: Map<string, StoredNotification[]> = new Map();\n private flushTimeouts: Map<string, NodeJS.Timeout> = new Map();\n private lastFlushAttemptTime: Map<string, number> = new Map();\n private retryCounts: Map<string, number> = new Map();\n private sessions: Map<string, SessionState> = new Map();\n private flushQueues: Map<string, Promise<void>> = new Map();\n\n private logger: Logger;\n private localCachePath?: string;\n\n constructor(options: SessionLogWriterOptions = {}) {\n this.posthogAPI = options.posthogAPI;\n this.localCachePath = options.localCachePath;\n this.logger =\n options.logger ??\n new Logger({ debug: false, prefix: \"[SessionLogWriter]\" });\n }\n\n async flushAll(): Promise<void> {\n // Coalesce any in-progress chunk buffers before the final flush\n // During normal operation, chunks are coalesced when the next non-chunk\n // event arrives, but on shutdown there may be no subsequent event\n const flushPromises: Promise<void>[] = [];\n for (const [sessionId, session] of this.sessions) {\n this.emitCoalescedMessage(sessionId, session);\n flushPromises.push(this.flush(sessionId));\n }\n await Promise.all(flushPromises);\n }\n\n register(sessionId: string, context: SessionContext): void {\n if (this.sessions.has(sessionId)) {\n return;\n }\n\n this.sessions.set(sessionId, { context, currentTurnMessages: [] });\n\n this.lastFlushAttemptTime.set(sessionId, Date.now());\n\n if (this.localCachePath) {\n const sessionDir = path.join(\n this.localCachePath,\n \"sessions\",\n context.runId,\n );\n try {\n fs.mkdirSync(sessionDir, { recursive: true });\n } catch (error) {\n this.logger.warn(\"Failed to create local cache directory\", {\n sessionDir,\n error,\n });\n }\n }\n }\n\n isRegistered(sessionId: string): boolean {\n return this.sessions.has(sessionId);\n }\n\n appendRawLine(sessionId: string, line: string): void {\n const session = this.sessions.get(sessionId);\n if (!session) {\n this.logger.warn(\"appendRawLine called for unregistered session\", {\n sessionId,\n });\n return;\n }\n\n try {\n const message = JSON.parse(line);\n const timestamp = new Date().toISOString();\n\n // Check if this is an agent_message_chunk event\n if (this.isAgentMessageChunk(message)) {\n const text = this.extractChunkText(message);\n if (text) {\n if (!session.chunkBuffer) {\n session.chunkBuffer = { text, firstTimestamp: timestamp };\n } else {\n session.chunkBuffer.text += text;\n }\n }\n // Don't emit chunk events\n return;\n }\n\n // Non-chunk event: flush any buffered chunks first.\n // If this is a direct agent_message AND there are buffered chunks,\n // the direct message supersedes the partial chunks\n if (this.isDirectAgentMessage(message) && session.chunkBuffer) {\n session.chunkBuffer = undefined;\n } else {\n this.emitCoalescedMessage(sessionId, session);\n }\n\n const nonChunkAgentText = this.extractAgentMessageText(message);\n if (nonChunkAgentText) {\n session.lastAgentMessage = nonChunkAgentText;\n session.currentTurnMessages.push(nonChunkAgentText);\n }\n\n const entry: StoredNotification = {\n type: \"notification\",\n timestamp,\n notification: message,\n };\n\n this.writeToLocalCache(sessionId, entry);\n\n if (this.posthogAPI) {\n const pending = this.pendingEntries.get(sessionId) ?? [];\n pending.push(entry);\n this.pendingEntries.set(sessionId, pending);\n this.scheduleFlush(sessionId);\n }\n } catch {\n this.logger.warn(\"Failed to parse raw line for persistence\", {\n taskId: session.context.taskId,\n runId: session.context.runId,\n lineLength: line.length,\n });\n }\n }\n\n async flush(\n sessionId: string,\n { coalesce = false }: { coalesce?: boolean } = {},\n ): Promise<void> {\n if (coalesce) {\n const session = this.sessions.get(sessionId);\n if (session) {\n this.emitCoalescedMessage(sessionId, session);\n }\n }\n\n // Serialize flushes per session\n const prev = this.flushQueues.get(sessionId) ?? Promise.resolve();\n const next = prev.catch(() => {}).then(() => this._doFlush(sessionId));\n this.flushQueues.set(sessionId, next);\n next.finally(() => {\n if (this.flushQueues.get(sessionId) === next) {\n this.flushQueues.delete(sessionId);\n }\n });\n return next;\n }\n\n private async _doFlush(sessionId: string): Promise<void> {\n const session = this.sessions.get(sessionId);\n if (!session) {\n this.logger.warn(\"flush: no session found\", { sessionId });\n return;\n }\n\n const pending = this.pendingEntries.get(sessionId);\n if (!this.posthogAPI || !pending?.length) {\n return;\n }\n\n this.pendingEntries.delete(sessionId);\n const timeout = this.flushTimeouts.get(sessionId);\n if (timeout) {\n clearTimeout(timeout);\n this.flushTimeouts.delete(sessionId);\n }\n\n this.lastFlushAttemptTime.set(sessionId, Date.now());\n\n try {\n await this.posthogAPI.appendTaskRunLog(\n session.context.taskId,\n session.context.runId,\n pending,\n );\n this.retryCounts.set(sessionId, 0);\n } catch (error) {\n const retryCount = (this.retryCounts.get(sessionId) ?? 0) + 1;\n this.retryCounts.set(sessionId, retryCount);\n\n if (retryCount >= SessionLogWriter.MAX_FLUSH_RETRIES) {\n this.logger.error(\n `Dropping ${pending.length} session log entries after ${retryCount} failed flush attempts`,\n {\n taskId: session.context.taskId,\n runId: session.context.runId,\n error,\n },\n );\n this.retryCounts.set(sessionId, 0);\n } else {\n if (retryCount === 1) {\n this.logger.warn(\n `Failed to persist session logs, will retry (up to ${SessionLogWriter.MAX_FLUSH_RETRIES} attempts)`,\n {\n taskId: session.context.taskId,\n runId: session.context.runId,\n error: error instanceof Error ? error.message : String(error),\n },\n );\n }\n const currentPending = this.pendingEntries.get(sessionId) ?? [];\n this.pendingEntries.set(sessionId, [...pending, ...currentPending]);\n this.scheduleFlush(sessionId);\n }\n }\n }\n\n private getSessionUpdateType(\n message: Record<string, unknown>,\n ): string | undefined {\n if (message.method !== \"session/update\") return undefined;\n const params = message.params as Record<string, unknown> | undefined;\n const update = params?.update as Record<string, unknown> | undefined;\n return update?.sessionUpdate as string | undefined;\n }\n\n private isDirectAgentMessage(message: Record<string, unknown>): boolean {\n return this.getSessionUpdateType(message) === \"agent_message\";\n }\n\n private isAgentMessageChunk(message: Record<string, unknown>): boolean {\n return this.getSessionUpdateType(message) === \"agent_message_chunk\";\n }\n\n private extractChunkText(message: Record<string, unknown>): string {\n const params = message.params as Record<string, unknown> | undefined;\n const update = params?.update as Record<string, unknown> | undefined;\n const content = update?.content as\n | { type: string; text?: string }\n | undefined;\n if (content?.type === \"text\" && content.text) {\n return content.text;\n }\n return \"\";\n }\n\n private emitCoalescedMessage(sessionId: string, session: SessionState): void {\n if (!session.chunkBuffer) return;\n\n const { text, firstTimestamp } = session.chunkBuffer;\n session.chunkBuffer = undefined;\n session.lastAgentMessage = text;\n session.currentTurnMessages.push(text);\n\n const entry: StoredNotification = {\n type: \"notification\",\n timestamp: firstTimestamp,\n notification: {\n jsonrpc: \"2.0\",\n method: \"session/update\",\n params: {\n update: {\n sessionUpdate: \"agent_message\",\n content: { type: \"text\", text },\n },\n },\n },\n };\n\n this.writeToLocalCache(sessionId, entry);\n\n if (this.posthogAPI) {\n const pending = this.pendingEntries.get(sessionId) ?? [];\n pending.push(entry);\n this.pendingEntries.set(sessionId, pending);\n this.scheduleFlush(sessionId);\n }\n }\n\n getLastAgentMessage(sessionId: string): string | undefined {\n return this.sessions.get(sessionId)?.lastAgentMessage;\n }\n\n getFullAgentResponse(sessionId: string): string | undefined {\n const session = this.sessions.get(sessionId);\n if (!session || session.currentTurnMessages.length === 0) return undefined;\n\n if (session.chunkBuffer) {\n this.logger.warn(\n \"getFullAgentResponse called with non-empty chunk buffer\",\n {\n sessionId,\n bufferedLength: session.chunkBuffer.text.length,\n },\n );\n }\n\n return session.currentTurnMessages.join(\"\\n\\n\");\n }\n\n resetTurnMessages(sessionId: string): void {\n const session = this.sessions.get(sessionId);\n if (session) {\n session.currentTurnMessages = [];\n }\n }\n\n private extractAgentMessageText(\n message: Record<string, unknown>,\n ): string | null {\n if (message.method !== \"session/update\") {\n return null;\n }\n\n const params = message.params as Record<string, unknown> | undefined;\n const update = params?.update as Record<string, unknown> | undefined;\n if (update?.sessionUpdate !== \"agent_message\") {\n return null;\n }\n\n const content = update.content as\n | { type?: string; text?: string }\n | undefined;\n if (content?.type === \"text\" && typeof content.text === \"string\") {\n const trimmed = content.text.trim();\n return trimmed.length > 0 ? trimmed : null;\n }\n\n if (typeof update.message === \"string\") {\n const trimmed = update.message.trim();\n return trimmed.length > 0 ? trimmed : null;\n }\n\n return null;\n }\n\n private scheduleFlush(sessionId: string): void {\n const existing = this.flushTimeouts.get(sessionId);\n if (existing) clearTimeout(existing);\n\n const retryCount = this.retryCounts.get(sessionId) ?? 0;\n const lastAttempt = this.lastFlushAttemptTime.get(sessionId) ?? 0;\n const elapsed = Date.now() - lastAttempt;\n\n let delay: number;\n if (retryCount > 0) {\n // Exponential backoff on retries: FLUSH_DEBOUNCE_MS * 2^retryCount, capped\n delay = Math.min(\n SessionLogWriter.FLUSH_DEBOUNCE_MS * 2 ** retryCount,\n SessionLogWriter.MAX_RETRY_DELAY_MS,\n );\n } else if (elapsed >= SessionLogWriter.FLUSH_MAX_INTERVAL_MS) {\n // If we've been accumulating for longer than the max interval, flush immediately\n delay = 0;\n } else {\n delay = SessionLogWriter.FLUSH_DEBOUNCE_MS;\n }\n\n const timeout = setTimeout(() => this.flush(sessionId), delay);\n this.flushTimeouts.set(sessionId, timeout);\n }\n\n private writeToLocalCache(\n sessionId: string,\n entry: StoredNotification,\n ): void {\n if (!this.localCachePath) return;\n\n const session = this.sessions.get(sessionId);\n if (!session) return;\n\n const logPath = path.join(\n this.localCachePath,\n \"sessions\",\n session.context.runId,\n \"logs.ndjson\",\n );\n\n try {\n fs.appendFileSync(logPath, `${JSON.stringify(entry)}\\n`);\n } catch (error) {\n this.logger.warn(\"Failed to write to local cache\", {\n taskId: session.context.taskId,\n runId: session.context.runId,\n logPath,\n error,\n });\n }\n }\n\n static async cleanupOldSessions(localCachePath: string): Promise<number> {\n const sessionsDir = path.join(localCachePath, \"sessions\");\n let deleted = 0;\n try {\n const entries = await fsp.readdir(sessionsDir);\n const now = Date.now();\n for (const entry of entries) {\n const entryPath = path.join(sessionsDir, entry);\n try {\n const stats = await fsp.stat(entryPath);\n if (\n stats.isDirectory() &&\n now - stats.birthtimeMs > SessionLogWriter.SESSIONS_MAX_AGE_MS\n ) {\n await fsp.rm(entryPath, { recursive: true, force: true });\n deleted++;\n }\n } catch {\n // Skip entries we can't stat\n }\n }\n } catch {\n // Sessions dir may not exist yet\n }\n return deleted;\n }\n}\n","import {\n createAcpConnection,\n type InProcessAcpConnection,\n} from \"./adapters/acp-connection\";\nimport {\n BLOCKED_MODELS,\n DEFAULT_CODEX_MODEL,\n DEFAULT_GATEWAY_MODEL,\n fetchModelsList,\n} from \"./gateway-models\";\nimport { PostHogAPIClient, type TaskRunUpdate } from \"./posthog-api\";\nimport { SessionLogWriter } from \"./session-log-writer\";\nimport type { AgentConfig, TaskExecutionOptions } from \"./types\";\nimport { Logger } from \"./utils/logger\";\n\nexport class Agent {\n private posthogAPI?: PostHogAPIClient;\n private logger: Logger;\n private acpConnection?: InProcessAcpConnection;\n private taskRunId?: string;\n private sessionLogWriter?: SessionLogWriter;\n private posthogApiConfig?: AgentConfig[\"posthog\"];\n private enricherEnabled: boolean;\n\n constructor(config: AgentConfig) {\n this.logger = new Logger({\n debug: config.debug || false,\n prefix: \"[PostHog Agent]\",\n onLog: config.onLog,\n });\n\n if (config.posthog) {\n this.posthogAPI = new PostHogAPIClient(config.posthog);\n this.posthogApiConfig = config.posthog;\n }\n this.enricherEnabled = config.enricher?.enabled !== false;\n\n if (config.posthog && !config.skipLogPersistence) {\n this.sessionLogWriter = new SessionLogWriter({\n posthogAPI: this.posthogAPI,\n logger: this.logger.child(\"SessionLogWriter\"),\n localCachePath: config.localCachePath,\n });\n\n if (config.localCachePath) {\n SessionLogWriter.cleanupOldSessions(config.localCachePath).catch(\n () => {},\n );\n }\n }\n }\n\n private async _configureLlmGateway(overrideUrl?: string): Promise<{\n gatewayUrl: string;\n apiKey: string;\n } | null> {\n if (!this.posthogAPI) {\n return null;\n }\n\n try {\n const gatewayUrl = overrideUrl ?? this.posthogAPI.getLlmGatewayUrl();\n const apiKey = await this.posthogAPI.getApiKey();\n\n process.env.OPENAI_BASE_URL = `${gatewayUrl}/v1`;\n process.env.OPENAI_API_KEY = apiKey;\n process.env.ANTHROPIC_BASE_URL = gatewayUrl;\n process.env.ANTHROPIC_AUTH_TOKEN = apiKey;\n\n return { gatewayUrl, apiKey };\n } catch (error) {\n this.logger.error(\"Failed to configure LLM gateway\", error);\n throw error;\n }\n }\n\n async run(\n taskId: string,\n taskRunId: string,\n options: TaskExecutionOptions = {},\n ): Promise<InProcessAcpConnection> {\n const gatewayConfig = await this._configureLlmGateway(options.gatewayUrl);\n this.taskRunId = taskRunId;\n\n let allowedModelIds: Set<string> | undefined;\n let sanitizedModel =\n options.model && !BLOCKED_MODELS.has(options.model)\n ? options.model\n : undefined;\n if (options.adapter === \"codex\" && gatewayConfig) {\n const models = await fetchModelsList({\n gatewayUrl: gatewayConfig.gatewayUrl,\n });\n const codexModelIds = models\n .filter((model) => {\n if (BLOCKED_MODELS.has(model.id)) return false;\n if (model.owned_by) {\n return model.owned_by === \"openai\";\n }\n return model.id.startsWith(\"gpt-\") || model.id.startsWith(\"openai/\");\n })\n .map((model) => model.id);\n\n if (codexModelIds.length > 0) {\n allowedModelIds = new Set(codexModelIds);\n }\n\n if (!sanitizedModel || !allowedModelIds?.has(sanitizedModel)) {\n sanitizedModel = codexModelIds.includes(DEFAULT_CODEX_MODEL)\n ? DEFAULT_CODEX_MODEL\n : codexModelIds[0];\n }\n }\n if (!sanitizedModel && options.adapter !== \"codex\") {\n sanitizedModel = DEFAULT_GATEWAY_MODEL;\n }\n\n this.acpConnection = createAcpConnection({\n adapter: options.adapter,\n logWriter: this.sessionLogWriter,\n taskRunId,\n taskId,\n deviceType: \"local\",\n logger: this.logger,\n processCallbacks: options.processCallbacks,\n onStructuredOutput: options.onStructuredOutput,\n allowedModelIds,\n posthogApiConfig: this.posthogApiConfig,\n enricherEnabled: this.enricherEnabled,\n codexOptions:\n options.adapter === \"codex\" && gatewayConfig\n ? {\n cwd: options.repositoryPath,\n apiBaseUrl: `${gatewayConfig.gatewayUrl}/v1`,\n apiKey: gatewayConfig.apiKey,\n binaryPath: options.codexBinaryPath,\n model: sanitizedModel,\n instructions: options.instructions,\n }\n : undefined,\n });\n\n return this.acpConnection;\n }\n\n async attachPullRequestToTask(\n taskId: string,\n prUrl: string,\n branchName?: string,\n ): Promise<void> {\n this.logger.info(\"Attaching PR to task run\", { taskId, prUrl, branchName });\n\n if (!this.posthogAPI || !this.taskRunId) {\n const error = new Error(\n \"PostHog API not configured or no active run. Cannot attach PR to task.\",\n );\n this.logger.error(\"PostHog API not configured\", error);\n throw error;\n }\n\n const updates: TaskRunUpdate = {\n output: { pr_url: prUrl },\n };\n if (branchName) {\n updates.branch = branchName;\n }\n\n await this.posthogAPI.updateTaskRun(taskId, this.taskRunId, updates);\n this.logger.debug(\"PR attached to task run\", {\n taskId,\n taskRunId: this.taskRunId,\n prUrl,\n });\n }\n\n getPosthogAPI(): PostHogAPIClient | undefined {\n return this.posthogAPI;\n }\n\n async flushAllLogs(): Promise<void> {\n await this.sessionLogWriter?.flushAll();\n }\n\n async cleanup(): Promise<void> {\n if (this.sessionLogWriter && this.taskRunId) {\n await this.sessionLogWriter.flush(this.taskRunId, { coalesce: true });\n }\n await this.acpConnection?.cleanup();\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAcA,QAAI,SAAS,OAAO,UAAU,cAAc,SAAS,CAAC;AAKtD,QAAI,qBAAqB,OAAO,UAAU;AAE1C,QAAI,wBAAwB,OAAO,iBAAiB;AAIpD,QAAI,sBAAsB,OAAO,WAAW,YAAY,OAAO,QAAQ,YAAY,YAAY,OAAO,QAAQ,SAAS,QAAQ;AAE/H,QAAI,qBAAqB;AAAA,IAAC;AAK1B,QAAI,cAAa,WAAW;AAC1B,UAAI;AACJ,UAAI,WAAW,OAAO,UAAU,WAAW;AAAA,QACzC,eAAe,OAAO,SAAS;AAAA,MACjC,IAAI;AAAA,MACJ,MAAM,OAAO;AAAA,QACX,cAAc;AACZ,eAAK,WAAW;AAAA,QAClB;AAAA,QACA,aAAa;AACX,gBAAM,IAAI,MAAM,mDAAmD;AAAA,QACrE;AAAA,QACA,OAAO,KAAK,eAAe;AACzB,cAAI,YAAa,QAAO;AACxB,mBAAS,OAAO,OAAO,CAAC,GAAG,QAAQ,aAAa;AAChD,iBAAO,cAAc,IAAI,QAAQ,wBAAsB;AAOrD,gBAAI,kBAAkB,OAAO,OAAO,CAAC,GAAG,MAAM;AAC9C,gBAAI,aAAa,CAAC;AAClB,gBAAI,cAAc;AAClB,gBAAI,QAAQ,CAAC,QAAQ,YAAY;AAC/B,oBAAM;AAAA,YACR;AAEA,gBAAI,kBAAkB;AACtB,qBAAS,WAAWA,QAAM;AACxB,kBAAI,OAAO,YAAY,GAAG;AACxB,uBAAO,OAAO,YAAY,EAAEA,QAAM,eAAe;AAAA,cACnD;AACA,qBAAO,kBAAkBA;AAAA,YAC3B;AAEA,gBAAI,WAAW;AACf,gBAAI,qBAAqB;AAGvB,kBAAI,KAAK,UAAQ,IAAI;AACrB,kBAAI,WAAW,UAAQ,MAAM;AAC7B,gCAAkB,YAAY;AAE9B,2BAAa,cAAY;AAGvB,2BAAW,UAAU,QAAQ,IAAI,IAAI,IAAI,QAAQ,IAAI,SAAS,UAAU,QAAQ;AAChF,oBAAI,MAAM,GAAG,aAAa,QAAQ;AAClC,uBAAO;AAAA,cACT;AACA,0BAAY,CAAC,UAAUC,UAAS,SAAS;AAEvC,2BAAW,UAAU,QAAQ,IAAI,IAAI,IAAI,QAAQ,IAAI,SAAS,UAAU,QAAQ;AAChF,uBAAO,IAAI,QAAQ,CAACC,UAAS,WAAW;AACtC,qBAAG,SAAS,UAAUD,UAAS,SAAY,QAAQ,CAACE,MAAK,SAAS;AAChE,wBAAIA,KAAK,QAAOA,IAAG;AAAA,wBAAQ,CAAAD,SAAQD,UAAS,KAAK,SAAS,IAAI;AAAA,kBAChE,CAAC;AAAA,gBACH,CAAC;AAAA,cACH;AAEA,kBAAI,CAAC,OAAO,aAAa,KAAK,QAAQ,KAAK,SAAS,GAAG;AACrD,8BAAc,QAAQ,KAAK,CAAC,EAAE,QAAQ,OAAO,GAAG;AAAA,cAClD;AACA,2BAAa,QAAQ,KAAK,MAAM,CAAC;AACjC,kBAAI,OAAO,UAAU,aAAa;AAChC,uBAAO,SAAS,IAAI;AAAA,cACtB;AACA,sBAAQ,CAAC,QAAQ,YAAY;AAC3B,wBAAQ,WAAW;AACnB,sBAAM;AAAA,cACR;AAAA,YACF,WAGI,sBAAsB,uBAAuB;AAC/C,kBAAI,uBAAuB;AAEzB,kCAAkB,KAAK,SAAS;AAAA,cAClC,WAAW,OAAO,YAAY,eAAe,SAAS,eAAe;AAEnE,kCAAkB,SAAS,cAAc;AAAA,cAC3C;AAOA,kBAAI,gBAAgB,WAAW,OAAO,GAAG;AACvC,kCAAkB;AAAA,cACpB,OAAO;AACL,kCAAkB,gBAAgB,OAAO,GAAG,gBAAgB,QAAQ,UAAU,EAAE,EAAE,YAAY,GAAG,IAAI,CAAC;AAAA,cACxG;AACA;AAEE,oBAAI,uBAAuB;AACzB,+BAAa,SAAO;AAClB,wBAAI,MAAM,IAAI;AACd,wBAAI,KAAK,OAAO,KAAK,KAAK;AAC1B,wBAAI,eAAe;AACnB,wBAAI,KAAK,IAAI;AACb,2BAAO,IAAI;AAAA;AAAA,sBAAuC,IAAI;AAAA,oBAAS;AAAA,kBACjE;AAAA,gBACF;AACA,4BAAY,SAAO;AAKjB,sBAAI,UAAU,GAAG,GAAG;AAClB,2BAAO,IAAI,QAAQ,CAAC,QAAQC,aAAY;AACtC,0BAAI,MAAM,IAAI;AACd,0BAAI,KAAK,OAAO,KAAK,IAAI;AACzB,0BAAI,eAAe;AACnB,0BAAI,SAAS,MAAM;AACjB,4BAAI,IAAI,UAAU,OAAQ,IAAI,UAAU,KAAK,IAAI,UAAW;AAE1D,0BAAAA,SAAQ,IAAI,QAAQ;AAAA,wBACtB;AACA,+BAAO,IAAI,MAAM;AAAA,sBACnB;AACA,0BAAI,UAAU;AACd,0BAAI,KAAK,IAAI;AAAA,oBACf,CAAC;AAAA,kBACH;AACA,yBAAO,MAAM,KAAK;AAAA,oBAChB,aAAa;AAAA,kBACf,CAAC,EAAE,KAAK,cAAY;AAClB,wBAAI,SAAS,IAAI;AACf,6BAAO,SAAS,YAAY;AAAA,oBAC9B;AACA,2BAAO,QAAQ,OAAO,IAAI,MAAM,SAAS,SAAS,QAAQ,SAAS,GAAG,CAAC;AAAA,kBACzE,CAAC;AAAA,gBACH;AAAA,cACF;AAAA,YACF,OACA;AAAA,YAAC;AACD,gBAAI,MAAM,OAAO,OAAO,KAAK,QAAQ,IAAI,KAAK,OAAO;AACrD,gBAAI,MAAM,OAAO,UAAU,KAAK,QAAQ,MAAM,KAAK,OAAO;AAE1D,mBAAO,OAAO,QAAQ,eAAe;AAGrC,8BAAkB;AAKlB,gBAAI,OAAO,WAAW,EAAG,cAAa,OAAO,WAAW;AACxD,gBAAI,OAAO,aAAa,EAAG,eAAc,OAAO,aAAa;AAC7D,gBAAI,OAAO,MAAM,EAAG,SAAQ,OAAO,MAAM;AAYzC,gBAAI,mBAAmB,OAAO,kBAAkB,KAAK,CAAC;AACtD,gBAAI;AACJ,gBAAI,OAAO,YAAY,EAAG,cAAa,OAAO,YAAY;AAE1D,gBAAI;AAMJ,gBAAI,QAAQ;AAIZ,gBAAI;AAEJ,gBAA8B,OAAkC,QAAmC,QAAoC,SAAoC,QAAoC,SAAsC,SAAsC;AAC3R,gBAAI;AAEJ,qBAAS,oBAAoB;AAC3B,kBAAI,IAAI,WAAW;AACnB,qBAAO,gBAAgB,IAAI,iBAAiB,IAAI,SAAS,CAAC;AAC1D,qBAAO,OAAO,IAAI,QAAQ,IAAI,UAAU,CAAC;AACzC,qBAAO,QAAQ,IAAI,SAAS,IAAI,WAAW,CAAC;AAC5C,qBAAO,QAAQ,IAAI,SAAS,IAAI,WAAW,CAAC;AAC5C,qBAAO,SAAS,IAAI,UAAU,IAAI,YAAY,CAAC;AAC/C,qBAAO,QAAQ,IAAI,SAAS,IAAI,WAAW,CAAC;AAC5C,qBAAO,SAAS,IAAI,UAAU,IAAI,YAAY,CAAC;AAC/C,qBAAO,SAAS,IAAI,UAAU,IAAI,aAAa,CAAC;AAChD,qBAAO,SAAS,IAAI,UAAU,IAAI,aAAa,CAAC;AAAA,YAClD;AAMA,gBAAI,OAAO,YAAY,GAAG;AACxB,2BAAa,OAAO,YAAY;AAAA,YAClC,OAAO;AACL,kBAAI,iBAAiB,OAAO,gBAAgB,KAAK;AACjD,2BAAa,IAAI,YAAY,OAAO;AAAA,gBAClC,WAAW,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAM5B,WAAW,aAAa;AAAA,cAC1B,CAAC;AAAA,YACH;AACA,8BAAkB;AAMlB,gBAAI,eAAe,CAAC;AAEpB,gBAAI,aAAa,CAAC;AAElB,gBAAI,aAAa,CAAC;AAElB,gBAAI,gBAAgB,CAAC;AAErB,gBAAI,kBAAkB,CAAC;AACvB,gBAAI,qBAAqB;AACzB,qBAAS,SAAS;AAChB,kBAAI,OAAO,QAAQ,GAAG;AACpB,oBAAI,OAAO,OAAO,QAAQ,KAAK,WAAY,QAAO,QAAQ,IAAI,CAAE,OAAO,QAAQ,CAAE;AACjF,uBAAO,OAAO,QAAQ,EAAE,QAAQ;AAC9B,8BAAY,OAAO,QAAQ,EAAE,MAAM,CAAC;AAAA,gBACtC;AAAA,cACF;AACA,mCAAqB,YAAY;AAAA,YACnC;AACA,qBAAS,cAAc;AACrB,mCAAqB;AACrB,mCAAqB,eAAe;AACpC,mCAAqB,UAAU;AAAA,YACjC;AACA,qBAAS,UAAU;AACjB,mCAAqB,UAAU;AAAA,YACjC;AACA,qBAAS,UAAU;AACjB,kBAAI,OAAO,SAAS,GAAG;AACrB,oBAAI,OAAO,OAAO,SAAS,KAAK,WAAY,QAAO,SAAS,IAAI,CAAE,OAAO,SAAS,CAAE;AACpF,uBAAO,OAAO,SAAS,EAAE,QAAQ;AAC/B,+BAAa,OAAO,SAAS,EAAE,MAAM,CAAC;AAAA,gBACxC;AAAA,cACF;AACA,mCAAqB,aAAa;AAAA,YACpC;AACA,qBAAS,YAAY,IAAI;AACvB,2BAAa,QAAQ,EAAE;AAAA,YACzB;AACA,qBAAS,UAAU,IAAI;AACrB,yBAAW,QAAQ,EAAE;AAAA,YACvB;AACA,qBAAS,aAAa,IAAI;AACxB,4BAAc,QAAQ,EAAE;AAAA,YAC1B;AAcA,gBAAI,kBAAkB;AACtB,gBAAI,uBAAuB;AAC3B,gBAAI,wBAAwB;AAE5B,qBAAS,uBAAuB,IAAI;AAClC,qBAAO;AAAA,YACT;AACA,qBAAS,iBAAiB,IAAI;AAC5B;AACA,qBAAO,wBAAwB,IAAI,eAAe;AAAA,YACpD;AACA,qBAAS,oBAAoB,IAAI;AAC/B;AACA,qBAAO,wBAAwB,IAAI,eAAe;AAClD,kBAAI,mBAAmB,GAAG;AACxB,oBAAI,yBAAyB,MAAM;AACjC,gCAAc,oBAAoB;AAClC,yCAAuB;AAAA,gBACzB;AACA,oBAAI,uBAAuB;AACzB,sBAAI,WAAW;AACf,0CAAwB;AACxB,2BAAS;AAAA,gBACX;AAAA,cACF;AAAA,YACF;AACoC,qBAAS,MAAM,MAAM;AACvD,qBAAO,SAAS,IAAI,IAAI;AACxB,qBAAO,aAAa,OAAO;AAG3B,kBAAI,IAAI;AACR,sBAAQ;AACR,2BAAa;AACb,sBAAQ;AAasB,kBAAI,IAAI,IAAI,YAAY,aAAa,IAAI;AAIvE,oBAAM;AAAA,YACR;AAKA,gBAAI,gBAAgB;AAIxB,gBAAI,YAAY,cAAY,SAAS,WAAW,aAAa;AAI7D,gBAAI,YAAY,cAAY,SAAS,WAAW,SAAS;AAIrD,qBAAS,iBAAiB;AACxB,kBAAI,IAAI;AACR,kBAAI,CAAC,UAAU,CAAC,GAAG;AACjB,uBAAO,WAAW,CAAC;AAAA,cACrB;AACA,qBAAO;AAAA,YACT;AACA,gBAAI;AACJ,qBAAS,cAAc,MAAM;AAC3B,kBAAI,QAAQ,kBAAkB,YAAY;AACxC,uBAAO,IAAI,WAAW,UAAU;AAAA,cAClC;AACA,kBAAI,YAAY;AACd,uBAAO,WAAW,IAAI;AAAA,cACxB;AACA,oBAAM;AAAA,YACR;AACA,qBAAS,iBAAiB,YAAY;AAEpC,kBAAI,CAAC,YAAY;AAEf,uBAAO,UAAU,UAAU,EAAE;AAAA,kBAAK,cAAY,IAAI;AAAA;AAAA,oBAAuC;AAAA,kBAAS;AAAA;AAAA,kBAClG,MAAM,cAAc,UAAU;AAAA,gBAAC;AAAA,cACjC;AAEA,qBAAO,QAAQ,QAAQ,EAAE,KAAK,MAAM,cAAc,UAAU,CAAC;AAAA,YAC/D;AACA,qBAAS,uBAAuB,YAAY,SAAS,UAAU;AAC7D,qBAAO,iBAAiB,UAAU,EAAE,KAAK,CAAAD,YAAU,YAAY,YAAYA,SAAQ,OAAO,CAAC,EAAE,KAAK,UAAU,YAAU;AACpH,oBAAI,0CAA0C,MAAM,EAAE;AACtD,sBAAM,MAAM;AAAA,cACd,CAAC;AAAA,YACH;AACA,qBAAS,iBAAiBA,SAAQ,YAAY,SAAS,UAAU;AAC/D,kBAAI,CAACA,WAAU,OAAO,YAAY,wBAAwB,cAAc,CAAC,UAAU,UAAU;AAAA,cAC7F,CAAC,UAAU,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA,cAKrB,CAAC,uBAAuB,OAAO,SAAS,YAAY;AAClD,uBAAO,MAAM,YAAY;AAAA,kBACvB,aAAa;AAAA,gBACf,CAAC,EAAE,KAAK,cAAY;AAKY,sBAAI,SAAS,YAAY,qBAAqB,UAAU,OAAO;AAC7F,yBAAO,OAAO,KAAK,UAAU,SAAS,QAAQ;AAG5C,wBAAI,kCAAkC,MAAM,EAAE;AAC9C,wBAAI,2CAA2C;AAC/C,2BAAO,uBAAuB,YAAY,SAAS,QAAQ;AAAA,kBAC7D,CAAC;AAAA,gBACH,CAAC;AAAA,cACH;AACA,qBAAO,uBAAuB,YAAY,SAAS,QAAQ;AAAA,YAC7D;AACA,qBAAS,iBAAiB;AAExB,qBAAO;AAAA,gBACL,OAAO;AAAA,gBACP,0BAA0B;AAAA,gBAC1B,WAAW,IAAI,MAAM,aAAa,UAAU;AAAA,gBAC5C,YAAY,IAAI,MAAM,aAAa,UAAU;AAAA,cAC/C;AAAA,YACF;AAGA,qBAAS,aAAa;AACpB,kBAAIG,QAAO,eAAe;AAIgB,uBAAS,gBAAgBC,WAAUC,SAAQ;AACnF,8BAAcD,UAAS;AACvB,8BAAc,gBAAgB,aAAa,IAAI;AAC/C,oBAAIE,YAAW,kBAAkBD,OAAM;AACvC,oBAAIC,UAAS,eAAe;AAC1B,qCAAmBA,UAAS,cAAc,OAAO,gBAAgB;AAAA,gBACnE;AACA,gCAAgB,aAAa,MAAM;AACnC,qBAAK,KAAK;AACV,2BAAW;AACX,0BAAU,YAAY,mBAAmB,CAAC;AAC1C,gCAAgB,KAAK,YAAY,0BAA0B,CAAC;AAC5D,oCAAoB,kBAAkB;AACtC,uBAAO;AAAA,cACT;AAEA,+BAAiB,kBAAkB;AAEnC,uBAAS,2BAA2B,QAAQ;AAG1C,gCAAgB,OAAO,UAAU,GAAG,OAAO,QAAQ,CAAC;AAAA,cACtD;AAOA,kBAAI,OAAO,iBAAiB,GAAG;AAC7B,oBAAI;AACF,yBAAO,OAAO,iBAAiB,EAAEH,OAAM,eAAe;AAAA,gBACxD,SAAS,GAAG;AACV,sBAAI,sDAAsD,CAAC,EAAE;AAC7D,yBAAO;AAAA,gBACT;AAAA,cACF;AACA,kBAAI,CAAC,eAAgB,kBAAiB,eAAe;AACrD,+BAAiB,YAAY,gBAAgBA,OAAM,0BAA0B;AAC7E,qBAAO,CAAC;AAAA,YACV;AAIA,gBAAI,aAAa,CAAC;AAEE,qBAAS,WAAW,QAAQ;AAC9C,mBAAK,OAAO;AACZ,mBAAK,UAAU,gCAAgC,MAAM;AACrD,mBAAK,SAAS;AAAA,YAChB;AACA,gBAAI,MAAM,CAAC;AACX,gBAAI,2BAA2B,oBAAI,IAAI,CAAC,CAAC;AACzC,gBAAI,aAAa;AAAA,cACf,IAAI,KAAK,SAAS;AAChB,oBAAI,MAAM,IAAI,OAAO;AACrB,oBAAI,CAAC,KAAK;AACR,wBAAM,IAAI,OAAO,IAAI,IAAI,YAAY,OAAO;AAAA,oBAC1C,SAAS;AAAA,oBACT,WAAW;AAAA,kBACb,CAAC;AAAA,gBACH;AACA,oBAAI,CAAC,yBAAyB,IAAI,OAAO,GAAG;AAI1C,sBAAI,WAAW;AAAA,gBACjB;AACA,uBAAO;AAAA,cACT;AAAA,YACF;AACA,gBAAI,mBAAmB,gBAAc,eAAe,WAAW,YAAY,IAAI;AAC/E,gBAAI,mBAAmB,gBAAc,eAAe,WAAW,YAAY,IAAI;AAC/E,gBAAI,mBAAmB,gBAAc,eAAe,SAAS,YAAY,IAAI;AAC7E,gBAAI,mBAAmB,gBAAc,eAAe,SAAS,YAAY,IAAI;AAC7E,gBAAI,mBAAmB,gBAAc,eAAe,UAAU,YAAY,IAAI;AAC9E,gBAAI,oBAAoB,CAAC,YAAY,UAAU,eAAe,WAAW,YAAY,OAAO,IAAI;AAChG,gBAAI,oBAAoB,CAAC,YAAY,UAAU,eAAe,WAAW,YAAY,OAAO,IAAI;AAChG,gBAAI,oBAAoB,CAAC,YAAY,UAAU,eAAe,SAAS,YAAY,OAAO,IAAI;AAC9F,gBAAI,oBAAoB,CAAC,YAAY,UAAU,eAAe,SAAS,YAAY,OAAO,IAAI;AAC9F,gBAAI,oBAAoB,CAAC,YAAY,UAAU,eAAe,UAAU,YAAY,OAAO,IAAI;AAC/F,gBAAI,uBAAuB,eAAa;AACtC,qBAAO,UAAU,SAAS,GAAG;AAE3B,0BAAU,MAAM,EAAE,MAAM;AAAA,cAC1B;AAAA,YACF;AACA,gBAAI,cAAc,OAAO,eAAe,cAAc,IAAI,gBAAc;AASxE,gBAAI,oBAAoB,CAAC,aAAa,KAAK,mBAAmB;AAC5D,kBAAI,SAAS,MAAM;AACnB,kBAAI,SAAS;AAMb,qBAAO,YAAY,MAAM,KAAK,EAAE,UAAU,QAAS,GAAE;AACrD,kBAAI,SAAS,MAAM,MAAM,YAAY,UAAU,aAAa;AAC1D,uBAAO,YAAY,OAAO,YAAY,SAAS,KAAK,MAAM,CAAC;AAAA,cAC7D;AACA,kBAAI,MAAM;AAGV,qBAAO,MAAM,QAAQ;AAKnB,oBAAI,KAAK,YAAY,KAAK;AAC1B,oBAAI,EAAE,KAAK,MAAM;AACf,yBAAO,OAAO,aAAa,EAAE;AAC7B;AAAA,gBACF;AACA,oBAAI,KAAK,YAAY,KAAK,IAAI;AAC9B,qBAAK,KAAK,QAAQ,KAAK;AACrB,yBAAO,OAAO,cAAe,KAAK,OAAO,IAAK,EAAE;AAChD;AAAA,gBACF;AACA,oBAAI,KAAK,YAAY,KAAK,IAAI;AAC9B,qBAAK,KAAK,QAAQ,KAAK;AACrB,wBAAO,KAAK,OAAO,KAAO,MAAM,IAAK;AAAA,gBACvC,OAAO;AACL,wBAAO,KAAK,MAAM,KAAO,MAAM,KAAO,MAAM,IAAM,YAAY,KAAK,IAAI;AAAA,gBACzE;AACA,oBAAI,KAAK,OAAO;AACd,yBAAO,OAAO,aAAa,EAAE;AAAA,gBAC/B,OAAO;AACL,sBAAI,KAAK,KAAK;AACd,yBAAO,OAAO,aAAa,QAAS,MAAM,IAAK,QAAS,KAAK,IAAK;AAAA,gBACpE;AAAA,cACF;AACA,qBAAO;AAAA,YACT;AACA,gBAAI,oBAAoB,CAAAH,YAAU;AAChC,kBAAI,SAAS;AACb,kBAAI,MAAM;AACV,uBAAS,QAAQ;AACf,uBAAOA,QAAO,QAAQ;AAAA,cACxB;AACA,uBAAS,SAAS;AAChB,oBAAI,MAAM;AACV,oBAAI,MAAM;AACV,uBAAO,GAAG;AACR,sBAAI,OAAOA,QAAO,QAAQ;AAC1B,0BAAS,OAAO,OAAO;AACvB,yBAAO;AACP,sBAAI,EAAE,OAAO,KAAM;AAAA,gBACrB;AACA,uBAAO;AAAA,cACT;AACA,uBAAS,YAAY;AACnB,oBAAI,MAAM,OAAO;AACjB,0BAAU;AACV,uBAAO,kBAAkBA,SAAQ,SAAS,KAAK,GAAG;AAAA,cACpD;AACgC,uBAAS,OAAO,WAAW,SAAS;AAClE,oBAAI,UAAW,OAAM,IAAI,MAAM,OAAO;AAAA,cACxC;AACA,kBAAIO,QAAO;AACX,kBAAIP,mBAAkB,YAAY,QAAQ;AACxC,oBAAI,gBAAgB,YAAY,OAAO,eAAeA,SAAQO,KAAI;AAClE,oBAAI,cAAc,WAAW,GAAG;AAC9B,kBAAAA,QAAO;AACP,kCAAgB,YAAY,OAAO,eAAeP,SAAQO,KAAI;AAAA,gBAChE;AACA,uBAAO,cAAc,WAAW,GAAG,qBAAqB;AACxD,gBAAAP,UAAS,IAAI,WAAW,cAAc,CAAC,CAAC;AACxC,sBAAMA,QAAO;AAAA,cACf,OAAO;AACL,oBAAI,YAAY,IAAI,YAAY,IAAI,WAAWA,QAAO,SAAS,GAAG,EAAE,CAAC,EAAE,MAAM;AAC7E,oBAAI,mBAAmB,UAAU,CAAC,KAAK,cAAc,UAAU,CAAC,KAAK;AACrE,uBAAO,CAAC,kBAAkB,+BAA+B;AAGzD,uBAAOA,QAAO,CAAC,MAAM,GAAG,qCAAqC;AAC7D,yBAAS;AACT,oBAAI,eAAe,OAAO;AAE1B,sBAAM,SAAS;AACf,gBAAAO,QAAO,UAAU;AAAA,cACnB;AACA,kBAAI,gBAAgB;AAAA,gBAClB,eAAe,CAAC;AAAA,gBAChB,YAAY,oBAAI;AAAA,gBAChB,aAAa,oBAAI;AAAA,cACnB;AACA,kBAAIA,SAAQ,UAAU;AACpB,8BAAc,aAAa,OAAO;AAClC,8BAAc,cAAc,OAAO;AACnC,8BAAc,YAAY,OAAO;AACjC,8BAAc,aAAa,OAAO;AAIlC,oBAAI,qBAAqB,OAAO;AAChC,yBAASC,KAAI,GAAGA,KAAI,oBAAoB,EAAEA,IAAG;AAC3C,sBAAI,UAAU,UAAU;AACxB,gCAAc,cAAc,KAAK,OAAO;AAAA,gBAC1C;AAAA,cACF,OAAO;AACL,uBAAOD,UAAS,UAAU;AAC1B,oBAAI,uBAAuB;AAC3B,oBAAI,qBAAqB;AACzB,oBAAI,0BAA0B;AAC9B,oBAAI,0BAA0B;AAC9B,oBAAI,kBAAkB;AACtB,oBAAI,2BAA2B;AAC/B,oBAAI,2BAA2B;AAC/B,uBAAO,SAAS,KAAK;AACnB,sBAAI,iBAAiB,MAAM;AAC3B,sBAAI,iBAAiB,OAAO;AAC5B,sBAAI,mBAAmB,sBAAsB;AAC3C,kCAAc,aAAa,OAAO;AAClC,kCAAc,cAAc,OAAO;AACnC,kCAAc,YAAY,OAAO;AACjC,kCAAc,aAAa,OAAO;AAAA,kBACpC,WAAW,mBAAmB,oBAAoB;AAChD,wBAAI,qBAAqB,OAAO;AAChC,6BAASC,KAAI,GAAGA,KAAI,oBAAoB,EAAEA,IAAG;AAC3C,gCAAU,UAAU;AACpB,oCAAc,cAAc,KAAK,OAAO;AAAA,oBAC1C;AAAA,kBACF,WAAW,mBAAmB,yBAAyB;AACrD,wBAAI,QAAQ,OAAO;AACnB,2BAAO,SAAS;AACd,0BAAI,UAAU,UAAU;AACxB,0BAAIC,SAAQ,OAAO;AACnB,0BAAIA,SAAQ,iBAAiB;AAC3B,sCAAc,WAAW,IAAI,OAAO;AAAA,sBACtC;AAAA,oBACF;AAAA,kBACF,WAAW,mBAAmB,yBAAyB;AACrD,wBAAI,QAAQ,OAAO;AACnB,2BAAO,SAAS;AACd,0BAAI,UAAU,UAAU;AACxB,0BAAI,UAAU,UAAU;AACxB,0BAAIA,SAAQ,OAAO;AACnB,2BAAKA,SAAQ,6BAA6B,0BAA0B;AAClE,sCAAc,YAAY,IAAI,OAAO;AAAA,sBACvC;AAAA,oBACF;AAAA,kBACF,OAAO;AAEL,8BAAU;AAAA,kBACZ;AAAA,gBACF;AAAA,cACF;AACA,qBAAO;AAAA,YACT;AAIA,qBAAS,SAAS,KAAK,OAAO,MAAM;AAClC,kBAAI,KAAK,SAAS,GAAG,EAAG,QAAO;AAC/B,sBAAQ,MAAM;AAAA,gBACb,KAAK;AACJ,yBAAO,MAAM,GAAG;AAAA,gBAEjB,KAAK;AACJ,yBAAO,MAAM,GAAG;AAAA,gBAEjB,KAAK;AACJ,yBAAO,kBAAmB,OAAQ,KAAK,CAAC;AAAA,gBAEzC,KAAK;AACJ,yBAAO,kBAAmB,OAAQ,KAAK,CAAC;AAAA,gBAEzC,KAAK;AACJ,wBAAM,qCAAqC;AAAA,gBAE5C,KAAK;AACJ,yBAAO,kBAAmB,OAAQ,KAAK,CAAC;AAAA,gBAEzC,KAAK;AACJ,yBAAO,kBAAmB,OAAQ,KAAK,CAAC;AAAA,gBAEzC,KAAK;AACJ,yBAAO,kBAAmB,OAAQ,KAAK,CAAC;AAAA,gBAEzC;AACC,wBAAM,8BAA8B,IAAI,EAAE;AAAA,cAC5C;AAAA,YACF;AACA,gBAAI,SAAS,CAACF,OAAMG,SAAQ,SAAS;AACnC,kBAAI,MAAM;AAAA,gBACR,UAAU;AAAA,gBACV,MAAMH;AAAA,gBACN,SAAS;AAAA,gBACT,QAAQ;AAAA,cACV;AACA,mBAAK,iBAAiBA,KAAI,IAAI;AAC9B,kBAAIG,WAAU,QAAW;AACvB,qBAAK,mBAAmBA,OAAM,IAAI;AAAA,cACpC;AACA,qBAAO;AAAA,YACT;AACA,gBAAI,OAAO;AAAA,cACT,kBAAkB,CAAC;AAAA,cACnB,oBAAoB,CAAC;AAAA,cACrB,OAAO;AACL,uBAAO,YAAY,GAAG,WAAW;AAAA,cACnC;AAAA,YACF;AACA,gBAAI,eAAe;AACnB,gBAAI,aAAa,CAAC,SAAS,SAAS;AAClC,qBAAO,KAAK,GAAG,SAAS,UAAU,IAAI;AACtC,qBAAO;AAAA,YACT;AACA,gBAAI,cAAc,CAAC,MAAM,cAAc,KAAK,KAAK,OAAO,SAAS,IAAI;AACrE,gBAAI,YAAY,UAAQ;AAEtB,kBAAI,oBAAoB;AAItB,uBAAO,WAAW,QAAQ,IAAI,GAAG,IAAI;AAAA,cACvC;AACA,kBAAI,MAAM;AAEV,kBAAI,MAAM,MAAM,YAAY,MAAM,EAAE;AACpC,6BAAe;AACf,kBAAI,aAAa,EAAE,QAAQ;AAC3B,qBAAO;AAAA,YACT;AACA,gBAAI,gBAAgB,aAAW,CAAE,mBAAmB,eAAe,4BAA4B,gBAAgB,cAAc,eAAe,sBAAsB,wBAAwB,mBAAmB,qBAAqB,kBAAkB,iBAAiB,iBAAiB,cAAe,EAAE,SAAS,OAAO,KAAK,QAAQ,WAAW,WAAW;AAC1V,gBAAI,gBAAgB,CAAC,GAAG,WAAW;AACjC,kBAAI,IAAI,KAAK;AACX,uBAAO,KAAK,CAAC;AAAA,cACf,OAAO;AACL,uBAAO,KAAM,IAAI,MAAO,KAAK,KAAK,CAAC;AAAA,cACrC;AAAA,YACF;AACA,gBAAI,iBAAiB,SAAO;AAC1B,kBAAI,YAAY;AAAA,gBACd,KAAK;AAAA,gBACL,KAAK;AAAA,gBACL,KAAK;AAAA,gBACL,KAAK;AAAA,gBACL,KAAK;AAAA,gBACL,KAAK;AAAA,cACP;AACA,kBAAI,OAAO;AAAA,gBACT,YAAY,CAAC;AAAA,gBACb,SAAS,IAAI,CAAC,KAAK,MAAM,CAAC,IAAI,CAAE,UAAU,IAAI,CAAC,CAAC,CAAE;AAAA,cACpD;AACA,uBAASF,KAAI,GAAGA,KAAI,IAAI,QAAQ,EAAEA,IAAG;AACnC,qBAAK,WAAW,KAAK,UAAU,IAAIA,EAAC,CAAC,CAAC;AAAA,cACxC;AACA,qBAAO;AAAA,YACT;AACA,gBAAI,mBAAmB,CAAC,KAAK,WAAW;AACtC,kBAAI,SAAS,IAAI,MAAM,GAAG,CAAC;AAC3B,kBAAI,WAAW,IAAI,MAAM,CAAC;AAC1B,kBAAI,YAAY;AAAA,gBACd,KAAK;AAAA;AAAA,gBAEL,KAAK;AAAA;AAAA,gBAEL,KAAK;AAAA;AAAA,gBAEL,KAAK;AAAA;AAAA,gBAEL,KAAK;AAAA;AAAA,gBAEL,KAAK;AAAA,cACP;AAEA,qBAAO,KAAK,EAAE;AACG,4BAAc,SAAS,QAAQ,MAAM;AACtD,uBAASA,KAAI,GAAGA,KAAI,SAAS,QAAQ,EAAEA,IAAG;AACxC,uBAAO,KAAK,UAAU,SAASA,EAAC,CAAC,CAAC;AAAA,cACpC;AAGA,kBAAI,UAAU,KAAK;AACjB,uBAAO,KAAK,CAAC;AAAA,cACf,OAAO;AACL,uBAAO,KAAK,GAAG,UAAU,MAAM,CAAC;AAAA,cAClC;AAAA,YACF;AACA,gBAAI,0BAA0B,CAACG,OAAM,QAAQ;AAK3C,kBAAI,OAAO,YAAY,YAAY,YAAY;AAC7C,uBAAO,IAAI,YAAY,SAAS,eAAe,GAAG,GAAGA,KAAI;AAAA,cAC3D;AAGA,kBAAI,kBAAkB,CAAE,CAAE;AAE1B,+BAAiB,KAAK,eAAe;AAErC,kBAAI,QAAQ;AAAA,gBAAE;AAAA,gBAAG;AAAA,gBAAI;AAAA,gBAAK;AAAA;AAAA,gBAC1B;AAAA,gBAAG;AAAA,gBAAG;AAAA,gBAAG;AAAA;AAAA,gBACT;AAAA,cAAE;AAEF,4BAAc,gBAAgB,QAAQ,KAAK;AAC3C,oBAAM,KAAK,GAAG,eAAe;AAE7B,oBAAM;AAAA,gBAAK;AAAA,gBAAG;AAAA;AAAA;AAAA,gBAEd;AAAA,gBAAG;AAAA,gBAAG;AAAA,gBAAK;AAAA,gBAAG;AAAA,gBAAK;AAAA,gBAAG;AAAA,gBAAG;AAAA,gBAAG;AAAA;AAAA;AAAA,gBAE5B;AAAA,gBAAG;AAAA,gBAAG;AAAA,gBAAK;AAAA,gBAAG;AAAA,cAAC;AAGf,kBAAIN,UAAS,IAAI,YAAY,OAAO,IAAI,WAAW,KAAK,CAAC;AACzD,kBAAID,YAAW,IAAI,YAAY,SAASC,SAAQ;AAAA,gBAC9C,KAAK;AAAA,kBACH,KAAKM;AAAA,gBACP;AAAA,cACF,CAAC;AACD,kBAAI,cAAcP,UAAS,QAAQ,GAAG;AACtC,qBAAO;AAAA,YACT;AACA,gBAAI,kBAAkB,CAAC;AACU,gBAAI,YAAY,IAAI,YAAY,MAAM;AAAA,cACrE,WAAW;AAAA,cACX,WAAW;AAAA,YACb,CAAC;AACD,gBAAI,oBAAoB,aAAW;AACjC,kBAAIO,QAAO,gBAAgB,OAAO;AAClC,kBAAI,CAACA,OAAM;AACT,oBAAI,WAAW,gBAAgB,OAAQ,iBAAgB,SAAS,UAAU;AAC1E,gCAAgB,OAAO,IAAIA,QAAO,UAAU,IAAI,OAAO;AAAA,cACzD;AACA,qBAAOA;AAAA,YACT;AACA,gBAAI,iBAAiB,CAAC,QAAQ,UAAU;AACtC,kBAAI,qBAAqB;AACvB,yBAASH,KAAI,QAAQA,KAAI,SAAS,OAAOA,MAAK;AAC5C,sBAAI,OAAO,kBAAkBA,EAAC;AAE9B,sBAAI,MAAM;AACR,wCAAoB,IAAI,MAAMA,EAAC;AAAA,kBACjC;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AACA,gBAAI;AACJ,gBAAI,qBAAqB,CAAAG,UAAQ;AAE/B,kBAAI,CAAC,qBAAqB;AACxB,sCAAsB,oBAAI;AAC1B,+BAAe,GAAG,UAAU,MAAM;AAAA,cACpC;AACA,qBAAO,oBAAoB,IAAIA,KAAI,KAAK;AAAA,YAC1C;AACA,gBAAI,mBAAmB,CAAC;AACxB,gBAAI,oBAAoB,MAAM;AAE5B,kBAAI,iBAAiB,QAAQ;AAC3B,uBAAO,iBAAiB,IAAI;AAAA,cAC9B;AAEA,kBAAI;AACF,0BAAU,KAAK,CAAC;AAAA,cAClB,SAAST,MAAK;AACZ,oBAAI,EAAEA,gBAAe,aAAa;AAChC,wBAAMA;AAAA,gBACR;AACA,sBAAM;AAAA,cACR;AACA,qBAAO,UAAU,SAAS;AAAA,YAC5B;AACA,gBAAI,oBAAoB,CAAC,KAAKS,UAAS;AACrC,wBAAU,IAAI,KAAKA,KAAI;AAIvB,8BAAgB,GAAG,IAAI,UAAU,IAAI,GAAG;AAAA,YAC1C;AAC4B,gBAAI,cAAc,CAACA,OAAM,QAAQ;AAG3D,kBAAI,MAAM,mBAAmBA,KAAI;AACjC,kBAAI,KAAK;AACP,uBAAO;AAAA,cACT;AAEA,kBAAI,MAAM,kBAAkB;AAE5B,kBAAI;AAEF,kCAAkB,KAAKA,KAAI;AAAA,cAC7B,SAAST,MAAK;AACZ,oBAAI,EAAEA,gBAAe,YAAY;AAC/B,wBAAMA;AAAA,gBACR;AACA,oBAAI,UAAU,wBAAwBS,OAAM,GAAG;AAC/C,kCAAkB,KAAK,OAAO;AAAA,cAChC;AACA,kCAAoB,IAAIA,OAAM,GAAG;AACjC,qBAAO;AAAA,YACT;AACA,gBAAI,YAAY,CAACC,UAAS,YAAY;AACpC,uBAAS,WAAWA,UAAS;AAC3B,oBAAI,cAAc,OAAO,GAAG;AAC1B;AAAA,gBACF;AACA,oBAAI,QAAQA,SAAQ,OAAO;AAC3B,oBAAI,QAAQ,WAAW,OAAO,GAAG;AAC/B,4BAAU,QAAQ,MAAM,GAAG,EAAE,CAAC;AAC9B,4BAAU;AAAA,gBACZ;AACA,oBAAI,OAAO,MAAM,IAAI,YAAY,OAAO;AAAA,kBACtC,SAAS;AAAA,kBACT,WAAW;AAAA,gBACb,CAAC;AACD,oBAAI,WAAW,IAAI,OAAO,EAAE,SAAS,GAAG;AACtC,sBAAI,OAAO,SAAS,YAAY;AAC9B,wBAAI,OAAO,EAAE,QAAQ,YAAY,KAAK;AAAA,kBACxC,WAAW,OAAO,SAAS,UAAU;AACnC,wBAAI,OAAO,EAAE,QAAQ;AAAA,kBACvB,OAAO;AACL,wBAAI,8BAA8B,OAAO,MAAM,OAAO,KAAK,EAAE;AAAA,kBAC/D;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AACiC,gBAAI,kBAAkB,CAACA,UAASC,aAAY,YAAY;AACvF,kBAAI,YAAY,CAAC;AACjB,uBAAS,KAAKD,UAAS;AACrB,oBAAI,QAAQA,SAAQ,CAAC;AACrB,oBAAI,OAAO,SAAS,UAAU;AAG5B,0BAAQ,MAAM;AAAA,gBAChB;AACA,oBAAI,OAAO,SAAS,UAAU;AAC5B,2BAASC;AAAA,gBACX;AACA,0BAAU,CAAC,IAAI;AAAA,cACjB;AACA,wBAAU,WAAW,OAAO;AAC5B,qBAAO;AAAA,YACT;AACA,gBAAI,kBAAkB,aAAW;AAG/B,kBAAI,WAAW,YAAY,OAAO;AAClC,kBAAI,CAAC,YAAY,SAAS,MAAM;AAC9B,uBAAO;AAAA,cACT;AACA,qBAAO;AAAA,YACT;AACA,gBAAI,gBAAgB,CAAC,KAAK,KAAKC,UAAS;AACtC,oBAAM,IAAI,QAAQ,MAAM,GAAG;AAC3B,kBAAI,IAAI,OAAO,aAAa,GAAG;AAC/B,qBAAO,EAAE,KAAK,GAAGA,KAAI;AAAA,YACvB;AACA,gBAAI,UAAU,CAAC,KAAK,KAAKA,QAAO,CAAC,MAAM;AAIrC,kBAAI,IAAI,SAAS,GAAG,GAAG;AACrB,uBAAO,cAAc,KAAK,KAAKA,KAAI;AAAA,cACrC;AACA,kBAAI,MAAM,kBAAkB,GAAG,EAAE,GAAGA,KAAI;AACxC,qBAAO;AAAA,YACT;AACA,gBAAI,YAAY,MAAM,8BAA8B;AACpD,gBAAI,eAAe,SAAO,2BAA2B,GAAG;AACxD,gBAAI,uBAAuB,SAAO,CAAC,QAAQA,UAAS;AAClD,kBAAI,KAAK,UAAU;AACnB,kBAAI;AACF,uBAAO,QAAQ,KAAK,KAAKA,KAAI;AAAA,cAC/B,SAAS,GAAG;AACV,6BAAa,EAAE;AAKf,oBAAI,MAAM,IAAI,EAAG,OAAM;AACvB,0BAAU,GAAG,CAAC;AAAA,cAChB;AAAA,YACF;AACA,gBAAI,sBAAsB,CAAC,SAAS,SAAS,UAAU;AACrD,kBAAI;AAGJ,kBAAI,UAAW,UAAU,WAAW,aAAc;AAChD,0BAAU,UAAU;AAAA,cACtB;AACA,kBAAI,gBAAgB,OAAO,GAAG;AAC5B,sBAAM,YAAY,OAAO;AAAA,cAC3B,WACI,QAAQ,WAAW,SAAS,GAAG;AAEjC,sBAAM,YAAY,OAAO,IAAI,qBAAqB,QAAQ,MAAM,GAAG,EAAE,CAAC,CAAC;AAAA,cACzE;AACA,qBAAO;AAAA,gBACL;AAAA,gBACA,MAAM;AAAA,cACR;AAAA,YACF;AAeA,gBAAI,eAAe,CAAC,KAAK,mBAAmB,MAAM,kBAAkB,QAAQ,KAAK,cAAc,IAAI;AAKlG,gBAAI,wBAAwB,CAAC,QAAQ,OAAO,SAAS,YAAY,WAAW;AAC3E,kBAAI,WAAW,kBAAkB,MAAM;AACvC,yCAA2B,SAAS;AAGpC,uBAAS,aAAa;AAQpB,oBAAI,YAAY,CAAC,UAAU,CAAC,MAAO,SAAW,CAAE;AAChD,oBAAI,WAAW;AAEb,sBAAI,WAAW,KAAK,IAAI,GAAG,SAAS,WAAW;AAE/C,sBAAI,aAAa,SAAS,aAAa,YAAY,UAAU,SAAS,aAAa,QAAQ,GAAG,QAAQ,IAAI;AAE1G,sBAAI,YAAY,SAAS,YAAY,UAAU,SAAS;AACxD,sBAAI,QAAQ;AACV,0BAAO,SAAW,CAAE,IAAI;AACxB,uCAAqB,SAAW,MAAQ,KAAK,GAAG,UAAU;AAC1D,uCAAqB,SAAW,MAAQ,KAAK,GAAG,SAAS,UAAU;AACnE,uCAAqB,SAAW,MAAQ,KAAK,GAAG,SAAS;AACzD,uCAAqB,SAAW,MAAQ,KAAK,GAAG,SAAS,SAAS;AAAA,kBACpE;AAAA,gBACF,OAAO;AACL,+BAAa,kBAAoB,SAAW,MAAQ,KAAK,CAAC;AAC1D,8BAAY,kBAAoB,SAAW,MAAQ,KAAK,CAAC;AAAA,gBAC3D;AACA,oBAAI,oBAAoB,YAAY,SAAS,YAAY,UAAU;AACnE,oBAAI,oBAAoB,GAAG;AACzB,4BAAU,KAAK,iBAAiB;AAAA,gBAClC;AAMA,oBAAI;AACJ,yBAAS,cAAc,KAAK;AAC1B,sBAAI,WAAW,oBAAoB,GAAG,EAAE;AACxC,sBAAI,CAAC,YAAY,YAAY;AAC3B,+BAAW,WAAW,GAAG;AAAA,kBAC3B;AACA,sBAAI,CAAC,UAAU;AACb,+BAAW,cAAc,GAAG;AAAA,kBAC9B;AACA,yBAAO;AAAA,gBACT;AAWA,oBAAI,eAAe;AAAA,kBACjB,IAAI,OAAO,MAAM;AAEf,4BAAQ,MAAM;AAAA,sBACb,KAAK;AACJ,+BAAO;AAAA,sBAER,KAAK;AACJ,+BAAO;AAAA,oBACT;AACA,wBAAI,QAAQ,eAAe,CAAC,YAAY,IAAI,EAAE,MAAM;AAElD,6BAAO,YAAY,IAAI;AAAA,oBACzB;AAGA,wBAAI,EAAE,QAAQ,QAAQ;AACpB,0BAAI;AACJ,4BAAM,IAAI,IAAI,IAAIA,UAAS;AACzB,qCAAa,cAAc,IAAI;AAC/B,+BAAO,SAAS,GAAGA,KAAI;AAAA,sBACzB;AAAA,oBACF;AACA,2BAAO,MAAM,IAAI;AAAA,kBACnB;AAAA,gBACF;AACA,oBAAI,QAAQ,IAAI,MAAM,CAAC,GAAG,YAAY;AACtC,oBAAI,OAAO;AAAA,kBACT,WAAW,IAAI,MAAM,CAAC,GAAG,UAAU;AAAA,kBACnC,YAAY,IAAI,MAAM,CAAC,GAAG,UAAU;AAAA,kBACpC,OAAO;AAAA,kBACP,0BAA0B;AAAA,gBAC5B;AACA,yBAAS,kBAAkB,QAAQ,UAAU;AAE3C,iCAAe,WAAW,SAAS,SAAS;AAC5C,kCAAgB,gBAAgB,SAAS,SAAS,UAAU;AAC5D,sBAAI,CAAC,MAAM,gBAAgB;AACzB,2CAAuB;AAAA,kBACzB;AACA,2BAAS,SAAS,MAAM,MAAM;AAC5B,wBAAI,OAAO,CAAC;AACZ,wBAAI,QAAQ;AACZ,2BAAM,QAAQ,IAAI,SAAS;AACzB,0BAAI,KAAK,QAAQ,MAAM,KAAK,KAAK,IAAI;AACnC,6BAAK,KAAK,MAAM,KAAK;AAAA,sBACvB,OAAO;AACL;AAAA,sBACF;AAAA,oBACF;AACA,2BAAO,KAAK,KAAK,GAAG;AACpB,wBAAI,OAAO,IAAI,IAAI,UAAU,IAAI;AACjC,+BAAW,KAAK,IAAI,KAAK,IAAI;AAAA,kBAC/B;AAEA,sBAAI,oBAAoB,eAAe;AACrC,wBAAI,QAAQ,cAAc,gBAAgB;AAC1C,wBAAI,OAAO,cAAc,eAAe;AACxC,2BAAO,QAAQ,MAAM;AACnB,0BAAI,WAAW,aAAa,KAAK;AACjC,+BAAS,OAAO,QAAQ;AACxB,8BAAQ,OAAO,QAAQ,GAAG,KAAK,IAAI;AAAA,oBACrC;AAAA,kBACF;AACA,2BAAS,QAAQ,MAAM,MAAM,MAAM;AAIjC,wBAAI,SAAS,CAAC;AACd,2BAAO,KAAK,MAAM,GAAG,EAAE;AACvB,wBAAI,QAAQ,QAAQ;AAClB,6BAAO,KAAK,MAAM,GAAG;AACrB,+BAAS,KAAK,MAAM;AAClB,4BAAI,QAAQ,KAAK,CAAC,EAAE,MAAM,GAAG,EAAE,IAAI;AACnC,+BAAO,KAAK,MAAM,QAAQ,KAAK,EAAE,CAAC;AAAA,sBACpC;AAAA,oBACF;AACA,wBAAI,OAAO,IAAI,MAAM,QAAQ,IAAI;AACjC,kCAAc,IAAI,IAAI,KAAK,IAAI;AAAA,kBACjC;AACA,2BAAS,QAAQ,eAAe;AAC9B,wBAAI,KAAK,WAAW,WAAW,GAAG;AAChC,0BAAI,QAAQ,cAAc,IAAI;AAC9B,0BAAI,WAAW,aAAa,KAAK;AAGjC,0BAAI,QAAQ,SAAS,MAAM,MAAM;AACjC,8BAAQ,KAAK,QAAQ,aAAa,EAAE,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;AACzD,6BAAO,cAAc,IAAI;AAAA,oBAC3B;AAAA,kBACF;AAEA,sBAAI,cAAc,cAAc,0BAA0B;AAC1D,sBAAI,aAAa;AACf,wBAAI,oBAAoB;AACtB,kCAAY;AAAA,oBACd,OAAO;AACL,sCAAgB,KAAK,WAAW;AAAA,oBAClC;AAAA,kBACF;AACA,sBAAI,OAAO,cAAc,mBAAmB;AAC5C,sBAAI,MAAM;AACR,wBAAI,oBAAoB;AACtB,2BAAK;AAAA,oBACP,OAAO;AAEL,iCAAW,KAAK,IAAI;AAAA,oBACtB;AAAA,kBACF;AACA,yBAAO;AAAA,gBACT;AACA,oBAAI,MAAM,WAAW;AACnB,sBAAI,kBAAkB,YAAY,QAAQ;AACxC,wBAAI,WAAW,IAAI,YAAY,SAAS,QAAQ,IAAI;AACpD,2BAAO,QAAQ,QAAQ,kBAAkB,QAAQ,QAAQ,CAAC;AAAA,kBAC5D;AACA,yBAAO,YAAY,YAAY,QAAQ,IAAI,EAAE,KAAK,YAAU,kBAAkB,OAAO,QAAQ,OAAO,QAAQ,CAAC;AAAA,gBAC/G;AACA,oBAAI,SAAS,kBAAkB,YAAY,SAAS,SAAS,IAAI,YAAY,OAAO,MAAM;AAC1F,oBAAI,WAAW,IAAI,YAAY,SAAS,QAAQ,IAAI;AACpD,uBAAO,kBAAkB,QAAQ,QAAQ;AAAA,cAC3C;AAEA,kBAAI,MAAM,WAAW;AACnB,uBAAO,SAAS,cAAc,OAAO,CAAC,OAAO,cAAc,MAAM,KAAK,MAAM,mBAAmB,WAAW,OAAO,UAAU,CAAC,GAAG,QAAQ,QAAQ,CAAC,EAAE,KAAK,UAAU;AAAA,cACnK;AACA,uBAAS,cAAc,QAAQ,YAAU,mBAAmB,QAAQ,OAAO,UAAU,CAAC;AACtF,qBAAO,WAAW;AAAA,YACpB;AACA,gBAAI,kBAAkB,CAACF,UAASG,aAAY;AAE1C,uBAAS,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQH,QAAO,GAAG;AAM9C,sBAAM,YAAY,YAAU;AAC1B,sBAAI,CAAC,gBAAgB,MAAM,GAAG;AAC5B,gCAAY,MAAM,IAAI;AAAA,kBACxB;AAAA,gBACF;AACA,0BAAU,GAAG;AAIb,sBAAM,aAAa;AACnB,oBAAI,OAAO,QAAQ;AACjB,4BAAU,UAAU;AAAA,gBACtB;AACA,oBAAI,OAAO,YAAY;AACrB,4BAAU,MAAM;AAAA,gBAClB;AACA,oBAAI,IAAI,WAAW,UAAU,KAAK,CAAC,OAAO,eAAe,GAAG,GAAG;AAC7D,yBAAO,GAAG,IAAI;AAAA,gBAChB;AAAA,cACF;AAAA,YACF;AACkC,gBAAI,YAAY,CAAC,KAAK,QAAQ,SAAS,aAAa;AACpF,kBAAI,MAAM,CAAC,WAAW,uBAAuB,MAAM,GAAG,EAAE,IAAI;AAC5D,wBAAU,GAAG,EAAE,KAAK,iBAAe;AACjC,uBAAO,IAAI,WAAW,WAAW,CAAC;AAClC,oBAAI,IAAK,qBAAoB,GAAG;AAAA,cAClC,GAAG,CAAAV,SAAO;AACR,oBAAI,SAAS;AACX,0BAAQ;AAAA,gBACV,OAAO;AACL,wBAAM,sBAAsB,GAAG;AAAA,gBACjC;AAAA,cACF,CAAC;AACD,kBAAI,IAAK,kBAAiB,GAAG;AAAA,YAC/B;AAIE,qBAAS,mBAAmBa,UAASN,SAAQ;AAAA,cAC7C,QAAQ;AAAA,cACR,UAAU;AAAA,YACZ,GAAGO,aAAYN,SAAQ;AAGrB,kBAAI,MAAM,KAAK,iBAAiBK,QAAO;AACvC,kBAAI,KAAK;AAEP,oBAAI,CAACN,OAAM,QAAQ;AACjB,sBAAIO,aAAY;AACd,2BAAO,OAAOA,aAAY,IAAI,OAAO;AAAA,kBACvC;AAAA,gBACF,WAAW,CAAC,IAAI,QAAQ;AAGtB,sBAAI,SAAS;AACb,kCAAgB,IAAI,SAASD,QAAO;AAAA,gBACtC;AAEA,oBAAIN,OAAM,YAAY,IAAI,aAAa,UAAU;AAC/C,sBAAI,WAAW;AAAA,gBACjB;AACA,oBAAI;AACJ,oBAAIC,SAAQ;AACV,uBAAK,mBAAmBA,OAAM,IAAI;AAAA,gBACpC;AACA,uBAAOD,OAAM,YAAY,QAAQ,QAAQ,IAAI,IAAI;AAAA,cACnD;AAEA,oBAAM,OAAOM,UAASL,SAAQ,SAAS;AACvC,kBAAI,WAAWD,OAAM,WAAW,WAAW;AAC3C,kBAAI,SAASA,OAAM;AAEnB,uBAAS,cAAc;AAErB,oBAAIC,SAAQ;AACV,sBAAI,OAAO,kBAAoBA,UAAW,MAAQ,KAAK,CAAC;AACxD,sBAAI,WAAW,kBAAoBA,UAAW,MAAQ,KAAK,CAAC;AAC5D,sBAAI,QAAQ,UAAU;AACpB,wBAAI,UAAU,MAAM,MAAM,MAAM,OAAO,QAAQ;AAC/C,2BAAOD,OAAM,YAAY,QAAQ,QAAQ,OAAO,IAAI;AAAA,kBACtD;AAAA,gBACF;AACA,oBAAI,UAAU,WAAWM,QAAO;AAChC,oBAAIN,OAAM,WAAW;AACnB,yBAAO,IAAI,QAAQ,SAASR,UAAS,QAAQ;AAC3C,8BAAU,SAASA,UAAS,MAAM;AAAA,kBACpC,CAAC;AAAA,gBACH;AAEA,oBAAI,CAAC,YAAY;AACf,wBAAM,IAAI,MAAM,GAAG,OAAO,8EAA8E;AAAA,gBAC1G;AACA,uBAAO,WAAW,OAAO;AAAA,cAC3B;AAEA,uBAAS,aAAa;AAEpB,oBAAIQ,OAAM,WAAW;AACnB,yBAAO,YAAY,EAAE,KAAK,aAAW,sBAAsB,SAASA,QAAOM,UAASC,aAAYN,OAAM,CAAC;AAAA,gBACzG;AACA,uBAAO,sBAAsB,YAAY,GAAGD,QAAOM,UAASC,aAAYN,OAAM;AAAA,cAChF;AAEA,uBAAS,aAAaE,UAAS;AAC7B,oBAAI,IAAI,QAAQ;AACd,kCAAgBA,UAASG,QAAO;AAAA,gBAClC,WAAWC,aAAY;AACrB,yBAAO,OAAOA,aAAYJ,QAAO;AAAA,gBACnC;AACA,oBAAI,UAAUA;AAAA,cAChB;AACA,kBAAIH,OAAM,WAAW;AACnB,uBAAO,WAAW,EAAE,KAAK,CAAAG,aAAW;AAClC,+BAAaA,QAAO;AACpB,yBAAO;AAAA,gBACT,CAAC;AAAA,cACH;AACA,2BAAa,WAAW,CAAC;AACzB,qBAAO;AAAA,YACT;AACA,gBAAI,yBAAyB,MAAM;AACjC,uBAAS,CAAC,SAAS,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAChD,oBAAI,MAAM,SAAS,GAAG;AACpB,sBAAI,QAAQ,oBAAoB,SAAS,IAAI,EAAE;AAC/C,sBAAI,CAAC,SAAS,CAAC,MAAM,UAAU;AAE7B;AAAA,kBACF;AACA,sBAAI,OAAO,SAAS,YAAY;AACA,0BAAM,QAAQ,YAAY,OAAO,MAAM,GAAG;AAAA,kBAC1E,WAAW,OAAO,SAAS,UAAU;AACnC,0BAAM,QAAQ;AAAA,kBAChB,OAAO;AACL,0BAAM,IAAI,MAAM,wBAAwB,OAAO,MAAM,OAAO,KAAK,EAAE;AAAA,kBACrE;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AACA,gBAAI,aAAa,MAAM;AACrB,kBAAI,CAAC,iBAAiB,QAAQ;AAC5B,uCAAuB;AACvB;AAAA,cACF;AAEA,+BAAiB,YAAY;AAC7B,+BAAiB,OAAO,CAAC,OAAO,QAAQ,MAAM,KAAK,MAAM,mBAAmB,KAAK;AAAA,gBAC/E,WAAW;AAAA,gBACX,QAAQ;AAAA,gBACR,UAAU;AAAA,gBACV,gBAAgB;AAAA,cAClB,CAAC,CAAC,GAAG,QAAQ,QAAQ,CAAC,EAAE,KAAK,MAAM;AAEjC,uCAAuB;AACvB,oCAAoB,YAAY;AAAA,cAClC,CAAC;AAAA,YACH;AACA,gBAAI,gBAAgB,OAAO,eAAe,KAAK;AAK/C,qBAAS,SAAS,KAAK,OAAO,OAAO,MAAM;AACzC,kBAAI,KAAK,SAAS,GAAG,EAAG,QAAO;AAC/B,sBAAQ,MAAM;AAAA,gBACb,KAAK;AACJ,wBAAM,GAAG,IAAI;AACb;AAAA,gBAED,KAAK;AACJ,wBAAM,GAAG,IAAI;AACb;AAAA,gBAED,KAAK;AACJ,qCAAoB,OAAQ,KAAK,GAAG,KAAK;AACzC;AAAA,gBAED,KAAK;AACJ,qCAAoB,OAAQ,KAAK,GAAG,KAAK;AACzC;AAAA,gBAED,KAAK;AACJ,wBAAM,qCAAqC;AAAA,gBAE5C,KAAK;AACJ,qCAAoB,OAAQ,KAAK,GAAG,KAAK;AACzC;AAAA,gBAED,KAAK;AACJ,qCAAoB,OAAQ,KAAK,GAAG,KAAK;AACzC;AAAA,gBAED,KAAK;AACJ,qCAAoB,OAAQ,KAAK,GAAG,KAAK;AACzC;AAAA,gBAED;AACC,wBAAM,8BAA8B,IAAI,EAAE;AAAA,cAC5C;AAAA,YACF;AACA,gBAAI,iBAAiB,IAAI,YAAY,OAAO;AAAA,cAC1C,SAAS;AAAA,cACT,WAAW;AAAA,YACb,GAAG,IAAI;AACP,gBAAI,mBAAmB,IAAI,YAAY,OAAO;AAAA,cAC5C,SAAS;AAAA,cACT,WAAW;AAAA,YACb,GAAG,KAAK;AACR,gBAAI,gBAAgB,IAAI,YAAY,OAAO;AAAA,cACzC,SAAS;AAAA,cACT,WAAW;AAAA,YACb,GAAG,CAAC;AACJ,gBAAI,aAAa,MAAM;AACrB,oBAAM,EAAE;AAAA,YACV;AACA,uBAAW,MAAM;AACjB,gBAAI,iBAAiB;AACrB,gBAAI,oCAAoC,MAAM;AAC9C,8CAAkC,MAAM;AACxC,gBAAI,yBAAyB,CAAC,MAAM,KAAK,QAAQ,OAAO,WAAW,MAAM,KAAK,MAAM,GAAG;AACvF,mCAAuB,MAAM;AAC7B,gBAAI,uBAAuB,MAAM,KAAK,IAAI;AAC1C,iCAAqB,MAAM;AAC3B,gBAAI;AAIJ,kCAAsB,MAAM,YAAY,IAAI;AAC5C,gCAAoB,MAAM;AAC1B,gBAAI,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,cAIjB;AAAA;AACA,gBAAI,aAAa,UAAQ;AACvB,kBAAI,IAAI,WAAW;AACnB,kBAAI,SAAS,OAAO,EAAE,aAAa,SAAS;AAC5C,kBAAI;AAEF,2BAAW,KAAK,KAAK;AAErB,kCAAkB;AAClB,uBAAO;AAAA,cACT,SAAqB,GAAG;AAAA,cAAC;AAAA,YAC3B;AAGA,gBAAI,0BAA0B,mBAAiB;AAC7C,kBAAI,UAAU,OAAO;AAErB,iCAAmB;AAqBnB,kBAAI,cAAc,WAAW;AAC7B,kBAAI,gBAAgB,aAAa;AAC/B,uBAAO;AAAA,cACT;AACA,kBAAI,UAAU,CAAC,GAAG,aAAa,KAAK,WAAW,IAAI,YAAY;AAI/D,uBAAS,UAAU,GAAG,WAAW,GAAG,WAAW,GAAG;AAChD,oBAAI,oBAAoB,WAAW,IAAI,MAAK;AAG5C,oCAAoB,KAAK,IAAI,mBAAmB,gBAAgB,SAAS;AACzE,oBAAI,UAAU,KAAK,IAAI,aAAa,QAAQ,KAAK,IAAI,eAAe,iBAAiB,GAAG,KAAK,CAAC;AAC9F,oBAAI,cAAc,WAAW,OAAO;AACpC,oBAAI,aAAa;AACf,yBAAO;AAAA,gBACT;AAAA,cACF;AACA,qBAAO;AAAA,YACT;AACA,oCAAwB,MAAM;AAC9B,gBAAI,YAAY,QAAM;AACtB,sBAAU,MAAM;AAChB,gBAAI,6BAA6B,CAAC,IAAI,OAAS,KAAK,YAAa,IAAI,UAAU,CAAC,CAAC,MAAO,OAAO,KAAK,KAAK,aAAa;AACtH,qBAAS,SAAS,IAAI,YAAY,aAAa,QAAQ,WAAW;AAChE,kBAAI,SAAS,2BAA2B,YAAY,WAAW;AAC/D,qBAAO;AAAA,YACT;AACA,qBAAS,MAAM;AACf,gBAAI,mBAAmB,CAAE,MAAM,CAAC,GAAG,CAAC,CAAE;AACtC,gBAAI,YAAY,CAAC,QAAQ,SAAS;AAChC,kBAAI,SAAS,iBAAiB,MAAM;AACpC,kBAAI,SAAS,KAAK,SAAS,IAAI;AAC7B,iBAAC,WAAW,IAAI,MAAM,KAAK,kBAAkB,QAAQ,CAAC,CAAC;AACvD,uBAAO,SAAS;AAAA,cAClB,OAAO;AACL,uBAAO,KAAK,IAAI;AAAA,cAClB;AAAA,YACF;AACA,gBAAI,YAAY,CAAC,IAAI,KAAK,QAAQ,SAAS;AAEzC,kBAAI,MAAM;AACV,uBAASJ,KAAI,GAAGA,KAAI,QAAQA,MAAK;AAC/B,oBAAI,MAAM,kBAAmB,OAAQ,KAAK,CAAC;AAC3C,oBAAI,MAAM,kBAAoB,MAAQ,KAAO,KAAK,CAAC;AACnD,uBAAO;AACP,yBAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,4BAAU,IAAI,OAAO,MAAM,CAAC,CAAC;AAAA,gBAC/B;AACA,uBAAO;AAAA,cACT;AACA,iCAAoB,QAAS,KAAK,GAAG,GAAG;AACxC,qBAAO;AAAA,YACT;AACA,sBAAU,MAAM;AAChB,qBAAS,0BAA0B,cAAc,gBAAgB;AAC/D,kBAAI,oBAAoB;AACtB,sBAAM,UAAU,aAAa,cAAc;AAC3C,mCAAmB,SAAS,iBAAiB,CAAC;AAAA,cAChD;AAAA,YACF;AACA,qBAAS,4BAA4B,oBAAoB,OAAO,KAAK,QAAQ,eAAe;AAC1F,oBAAM,oBAAoB,KAAK;AAC/B,oBAAM,SAAS,qBAAqB,OAAO;AAAA,gBACzC;AAAA,gBACA;AAAA,cACF,CAAC;AACD,kBAAI,OAAO,WAAW,UAAU;AAC9B,yBAAS,eAAe,OAAO,QAAQ,KAAK;AAC5C,8BAAc,QAAQ,oBAAoB,iBAAiB;AAAA,cAC7D,OAAO;AACL,yBAAS,eAAe,GAAG,KAAK;AAAA,cAClC;AAAA,YACF;AACA,gBAAI,0BAA0B;AAC9B,gBAAI,mBAAmB,MAAM,iBAAiB,0BAA0B;AACxE,gBAAI,aAAa,UAAQ;AACvB,2BAAa;AACb,kBAAI,CAAC,iBAAiB,GAAG;AACvB,uBAAO,QAAQ,IAAI,IAAI;AACvB,wBAAQ;AAAA,cACV;AACA,oBAAM,MAAM,IAAI,WAAW,IAAI,CAAC;AAAA,YAClC;AACA,uBAAW,MAAM;AACwB,gBAAI,SAAS,CAAC,QAAQ,aAAa;AAC1E,2BAAa;AACb,yBAAW,MAAM;AAAA,YACnB;AACA,gBAAI,kBAAkB,OAAK;AAMzB,kBAAI,aAAa,cAAc,KAAK,UAAU;AAC5C,uBAAO;AAAA,cACT;AACA,oBAAM,GAAG,CAAC;AAAA,YACZ;AACA,gBAAI,kBAAkB,SAAO;AAC3B,kBAAI,MAAM;AACV,uBAASA,KAAI,GAAGA,KAAI,IAAI,QAAQ,EAAEA,IAAG;AAKnC,oBAAI,IAAI,IAAI,WAAWA,EAAC;AAExB,oBAAI,KAAK,KAAK;AACZ;AAAA,gBACF,WAAW,KAAK,MAAM;AACpB,yBAAO;AAAA,gBACT,WAAW,KAAK,SAAS,KAAK,OAAO;AACnC,yBAAO;AACP,oBAAEA;AAAA,gBACJ,OAAO;AACL,yBAAO;AAAA,gBACT;AAAA,cACF;AACA,qBAAO;AAAA,YACT;AACA,gBAAI,oBAAoB,CAAC,KAAK,MAAM,QAAQ,oBAAoB;AAG9D,kBAAI,EAAE,kBAAkB,GAAI,QAAO;AACnC,kBAAI,WAAW;AACf,kBAAI,SAAS,SAAS,kBAAkB;AAExC,uBAASA,KAAI,GAAGA,KAAI,IAAI,QAAQ,EAAEA,IAAG;AAQnC,oBAAI,IAAI,IAAI,WAAWA,EAAC;AAExB,oBAAI,KAAK,SAAS,KAAK,OAAO;AAC5B,sBAAI,KAAK,IAAI,WAAW,EAAEA,EAAC;AAC3B,sBAAI,UAAU,IAAI,SAAS,MAAO,KAAK;AAAA,gBACzC;AACA,oBAAI,KAAK,KAAK;AACZ,sBAAI,UAAU,OAAQ;AACtB,uBAAK,QAAQ,IAAI;AAAA,gBACnB,WAAW,KAAK,MAAM;AACpB,sBAAI,SAAS,KAAK,OAAQ;AAC1B,uBAAK,QAAQ,IAAI,MAAO,KAAK;AAC7B,uBAAK,QAAQ,IAAI,MAAO,IAAI;AAAA,gBAC9B,WAAW,KAAK,OAAO;AACrB,sBAAI,SAAS,KAAK,OAAQ;AAC1B,uBAAK,QAAQ,IAAI,MAAO,KAAK;AAC7B,uBAAK,QAAQ,IAAI,MAAQ,KAAK,IAAK;AACnC,uBAAK,QAAQ,IAAI,MAAO,IAAI;AAAA,gBAC9B,OAAO;AACL,sBAAI,SAAS,KAAK,OAAQ;AAC1B,uBAAK,QAAQ,IAAI,MAAO,KAAK;AAC7B,uBAAK,QAAQ,IAAI,MAAQ,KAAK,KAAM;AACpC,uBAAK,QAAQ,IAAI,MAAQ,KAAK,IAAK;AACnC,uBAAK,QAAQ,IAAI,MAAO,IAAI;AAAA,gBAC9B;AAAA,cACF;AAEA,mBAAK,MAAM,IAAI;AACf,qBAAO,SAAS;AAAA,YAClB;AACA,gBAAI,eAAe,CAAC,KAAK,QAAQ,oBAAoB,kBAAkB,KAAK,QAAQ,QAAQ,eAAe;AAC3G,gBAAI,aAAa,QAAM,yBAAyB,EAAE;AAClD,gBAAI,sBAAsB,SAAO;AAC/B,kBAAI,OAAO,gBAAgB,GAAG,IAAI;AAClC,kBAAI,MAAM,WAAW,IAAI;AACzB,2BAAa,KAAK,KAAK,IAAI;AAC3B,qBAAO;AAAA,YACT;AACA,gBAAI,gBAAgB,CAAC,KAAK,QAAQ,oBAAoB;AAEpD,kCAAoB;AACpB,kBAAI,kBAAkB,EAAG,QAAO;AAChC,iCAAmB;AAEnB,kBAAI,WAAW;AACf,kBAAI,kBAAmB,kBAAkB,IAAI,SAAS,IAAM,kBAAkB,IAAK,IAAI;AACvF,uBAASA,KAAI,GAAGA,KAAI,iBAAiB,EAAEA,IAAG;AAExC,oBAAI,WAAW,IAAI,WAAWA,EAAC;AAE/B,mCAAoB,UAAW,KAAK,GAAG,QAAQ;AAC/C,0BAAU;AAAA,cACZ;AAEA,iCAAoB,UAAW,KAAK,GAAG,CAAC;AACxC,qBAAO,SAAS;AAAA,YAClB;AACA,gBAAI,gBAAgB,SAAO;AACzB,kBAAI,MAAM;AACV,qBAAO,GAAG;AACR,oBAAI,KAAK,OAAO,KAAK;AACrB,oBAAI,CAAC,GAAI,QAAO;AAChB,uBAAO,OAAO,aAAa,EAAE;AAAA,cAC/B;AAAA,YACF;AACA,gBAAI,cAAc;AAAA;AAAA,cACD,aAAa;AAAA;AAAA,cACb,2BAA2B;AAAA;AAAA,cAC3B,eAAe;AAAA;AAAA,cACf,iBAAiB;AAAA;AAAA,cACjB,cAAc;AAAA;AAAA,cACd,WAAW;AAAA;AAAA,cACX,kCAAkC;AAAA;AAAA,cAClC,uBAAuB;AAAA;AAAA,cACvB,oBAAoB;AAAA;AAAA,cACpB,wBAAwB;AAAA;AAAA,cACxB,UAAU;AAAA;AAAA,cACV,SAAS;AAAA;AAAA,cACT,UAAU;AAAA;AAAA,cACV,QAAQ;AAAA;AAAA,cACR,0BAA0B;AAAA;AAAA,cAC1B,4BAA4B;AAAA,YAC7C;AACA,gBAAI,cAAc,WAAW;AAC7B,gBAAI,qBAAqB,OAAO,qBAAqB,YAAY,mBAAmB,GAAG;AACvF,gBAAI,4BAA4B,OAAO,4BAA4B,YAAY,0BAA0B,GAAG;AAC5G,gBAAI,UAAU,OAAO,SAAS,IAAI,SAAO,UAAU,OAAO,SAAS,IAAI,YAAY,QAAQ,GAAG,EAAE;AAChG,gBAAI,UAAU,OAAO,SAAS,IAAI,CAAC,IAAI,QAAQ,UAAU,OAAO,SAAS,IAAI,YAAY,QAAQ,GAAG,IAAI,EAAE;AAC1G,gBAAI,WAAW,OAAO,UAAU,IAAI,CAAC,IAAI,QAAQ,WAAW,OAAO,UAAU,IAAI,YAAY,SAAS,GAAG,IAAI,EAAE;AAC/G,gBAAI,QAAQ,OAAO,OAAO,IAAI,SAAO,QAAQ,OAAO,OAAO,IAAI,YAAY,MAAM,GAAG,EAAE;AACtF,gBAAI,4BAA4B,OAAO,2BAA2B,IAAI,SAAO,4BAA4B,OAAO,2BAA2B,IAAI,YAAY,0BAA0B,GAAG,EAAE;AAC1L,gBAAI,2BAA2B,OAAO,0BAA0B,IAAI,SAAO,2BAA2B,OAAO,0BAA0B,IAAI,YAAY,yBAAyB,GAAG,EAAE;AACrL,gBAAI,uBAAuB,OAAO,sBAAsB,IAAI,SAAO,uBAAuB,OAAO,sBAAsB,IAAI,YAAY,qBAAqB,GAAG,EAAE;AACjK,gBAAI,2BAA2B,OAAO,0BAA0B,IAAI,SAAO,2BAA2B,OAAO,0BAA0B,IAAI,YAAY,yBAAyB,GAAG,EAAE;AACrL,gBAAI,0BAA0B,OAAO,yBAAyB,IAAI,CAAC,IAAI,IAAI,QAAQ,0BAA0B,OAAO,yBAAyB,IAAI,YAAY,wBAAwB,GAAG,IAAI,IAAI,EAAE;AAClM,gBAAI,2BAA2B,OAAO,0BAA0B,IAAI,CAAC,IAAI,QAAQ,2BAA2B,OAAO,0BAA0B,IAAI,YAAY,yBAAyB,GAAG,IAAI,EAAE;AAC/L,gBAAI,+BAA+B,OAAO,8BAA8B,IAAI,CAAC,IAAI,IAAI,IAAI,QAAQ,+BAA+B,OAAO,8BAA8B,IAAI,YAAY,6BAA6B,GAAG,IAAI,IAAI,IAAI,EAAE;AACnO,gBAAI,WAAW,OAAO,UAAU,IAAI,CAAC,IAAI,IAAI,QAAQ,WAAW,OAAO,UAAU,IAAI,YAAY,SAAS,GAAG,IAAI,IAAI,EAAE;AACvH,gBAAI,2BAA2B,OAAO,0BAA0B,IAAI,CAAC,IAAI,QAAQ,2BAA2B,OAAO,0BAA0B,IAAI,YAAY,yBAAyB,GAAG,IAAI,EAAE;AAC/L,gBAAI,iCAAiC,OAAO,gCAAgC,IAAI,CAAC,IAAI,QAAQ,iCAAiC,OAAO,gCAAgC,IAAI,YAAY,+BAA+B,GAAG,IAAI,EAAE;AAC7N,gBAAI,6BAA6B,OAAO,4BAA4B,IAAI,CAAC,IAAI,QAAQ,6BAA6B,OAAO,4BAA4B,IAAI,YAAY,2BAA2B,GAAG,IAAI,EAAE;AACzM,gBAAI,gCAAgC,OAAO,+BAA+B,IAAI,SAAO,gCAAgC,OAAO,+BAA+B,IAAI,YAAY,8BAA8B,GAAG,EAAE;AAC9M,gBAAI,qCAAqC,OAAO,oCAAoC,IAAI,CAAC,IAAI,QAAQ,qCAAqC,OAAO,oCAAoC,IAAI,YAAY,mCAAmC,GAAG,IAAI,EAAE;AACjP,gBAAI,+BAA+B,OAAO,8BAA8B,IAAI,CAAC,IAAI,IAAI,QAAQ,+BAA+B,OAAO,8BAA8B,IAAI,YAAY,6BAA6B,GAAG,IAAI,IAAI,EAAE;AAC3N,gBAAI,8BAA8B,OAAO,6BAA6B,IAAI,SAAO,8BAA8B,OAAO,6BAA6B,IAAI,YAAY,4BAA4B,GAAG,EAAE;AACpM,gBAAI,wCAAwC,OAAO,uCAAuC,IAAI,SAAO,wCAAwC,OAAO,uCAAuC,IAAI,YAAY,sCAAsC,GAAG,EAAE;AACtP,gBAAI,UAAU,OAAO,SAAS,IAAI,CAAC,IAAI,IAAI,QAAQ,UAAU,OAAO,SAAS,IAAI,YAAY,QAAQ,GAAG,IAAI,IAAI,EAAE;AAClH,gBAAI,UAAU,OAAO,SAAS,IAAI,CAAC,IAAI,IAAI,QAAQ,UAAU,OAAO,SAAS,IAAI,YAAY,QAAQ,GAAG,IAAI,IAAI,EAAE;AAClH,gBAAI,oBAAoB,OAAO,mBAAmB,IAAI,SAAO,oBAAoB,OAAO,mBAAmB,IAAI,YAAY,kBAAkB,GAAG,EAAE;AAClJ,gBAAI,mBAAmB,OAAO,kBAAkB,IAAI,SAAO,mBAAmB,OAAO,kBAAkB,IAAI,YAAY,iBAAiB,GAAG,EAAE;AAC7I,gBAAI,0BAA0B,OAAO,yBAAyB,IAAI,CAAC,IAAI,QAAQ,0BAA0B,OAAO,yBAAyB,IAAI,YAAY,wBAAwB,GAAG,IAAI,EAAE;AAC1L,gBAAI,4BAA4B,OAAO,2BAA2B,IAAI,SAAO,4BAA4B,OAAO,2BAA2B,IAAI,YAAY,0BAA0B,GAAG,EAAE;AAC1L,gBAAI,gCAAgC,OAAO,+BAA+B,IAAI,CAAC,IAAI,IAAI,QAAQ,gCAAgC,OAAO,+BAA+B,IAAI,YAAY,8BAA8B,GAAG,IAAI,IAAI,EAAE;AAChO,gBAAI,iCAAiC,OAAO,gCAAgC,IAAI,CAAC,IAAI,IAAI,QAAQ,iCAAiC,OAAO,gCAAgC,IAAI,YAAY,+BAA+B,GAAG,IAAI,IAAI,EAAE;AACrO,gBAAI,WAAW,OAAO,UAAU,IAAI,CAAC,IAAI,IAAI,QAAQ,WAAW,OAAO,UAAU,IAAI,YAAY,SAAS,GAAG,IAAI,IAAI,EAAE;AACvH,gBAAI,UAAU,OAAO,SAAS,IAAI,CAAC,IAAI,IAAI,QAAQ,UAAU,OAAO,SAAS,IAAI,YAAY,QAAQ,GAAG,IAAI,IAAI,EAAE;AAClH,gBAAI,gBAAgB,OAAO,eAAe,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,QAAQ,gBAAgB,OAAO,eAAe,IAAI,YAAY,cAAc,GAAG,IAAI,IAAI,IAAI,IAAI,EAAE;AAChK,gBAAI,mBAAmB,OAAO,kBAAkB,IAAI,SAAO,mBAAmB,OAAO,kBAAkB,IAAI,YAAY,iBAAiB,GAAG,EAAE;AAC7I,gBAAI,YAAY,OAAO,WAAW,IAAI,SAAO,YAAY,OAAO,WAAW,IAAI,YAAY,UAAU,GAAG,EAAE;AAC1G,gBAAI,YAAY,OAAO,WAAW,IAAI,SAAO,YAAY,OAAO,WAAW,IAAI,YAAY,UAAU,GAAG,EAAE;AAC1G,gBAAI,0BAA0B,OAAO,yBAAyB,IAAI,SAAO,0BAA0B,OAAO,yBAAyB,IAAI,YAAY,wBAAwB,GAAG,EAAE;AAChL,gBAAI,0BAA0B,OAAO,yBAAyB,IAAI,SAAO,0BAA0B,OAAO,yBAAyB,IAAI,YAAY,wBAAwB,GAAG,EAAE;AAChL,gBAAI,yBAAyB,OAAO,wBAAwB,IAAI,SAAO,yBAAyB,OAAO,wBAAwB,IAAI,YAAY,uBAAuB,GAAG,EAAE;AAC3K,gBAAI,gCAAgC,OAAO,+BAA+B,IAAI,CAAC,IAAI,IAAI,QAAQ,gCAAgC,OAAO,+BAA+B,IAAI,YAAY,8BAA8B,GAAG,IAAI,IAAI,EAAE;AAChO,gBAAI,gCAAgC,OAAO,+BAA+B,IAAI,CAAC,IAAI,IAAI,QAAQ,gCAAgC,OAAO,+BAA+B,IAAI,YAAY,8BAA8B,GAAG,IAAI,IAAI,EAAE;AAChO,gBAAI,mCAAmC,OAAO,kCAAkC,IAAI,CAAC,IAAI,IAAI,QAAQ,mCAAmC,OAAO,kCAAkC,IAAI,YAAY,iCAAiC,GAAG,IAAI,IAAI,EAAE;AAC/O,gBAAI,4BAA4B,OAAO,2BAA2B,IAAI,CAAC,IAAI,IAAI,QAAQ,4BAA4B,OAAO,2BAA2B,IAAI,YAAY,0BAA0B,GAAG,IAAI,IAAI,EAAE;AAC5M,gBAAI,gBAAgB,OAAO,eAAe,IAAI,SAAO,gBAAgB,OAAO,eAAe,IAAI,YAAY,cAAc,GAAG,EAAE;AAC9H,gBAAI,kBAAkB,OAAO,iBAAiB,IAAI,SAAO,kBAAkB,OAAO,iBAAiB,IAAI,YAAY,gBAAgB,GAAG,EAAE;AACxI,gBAAI,WAAW,OAAO,UAAU,IAAI,OAAO,WAAW,OAAO,UAAU,IAAI,YAAY,SAAS,GAAG;AACnG,gBAAI,sBAAsB,OAAO,qBAAqB,IAAI,OAAO,sBAAsB,OAAO,qBAAqB,IAAI,YAAY,oBAAoB,GAAG;AAC1J,gBAAI,gCAAgC,OAAO,+BAA+B,IAAI,CAAC,IAAI,QAAQ,gCAAgC,OAAO,+BAA+B,IAAI,YAAY,8BAA8B,GAAG,IAAI,EAAE;AACxN,gBAAI,wBAAwB,OAAO,uBAAuB,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,QAAQ,wBAAwB,OAAO,uBAAuB,IAAI,YAAY,sBAAsB,GAAG,IAAI,IAAI,IAAI,IAAI,EAAE;AACxM,gBAAI,kCAAkC,OAAO,iCAAiC,IAAI,SAAO,kCAAkC,OAAO,iCAAiC,IAAI,YAAY,gCAAgC,GAAG,EAAE;AACxN,gBAAI,kCAAkC,OAAO,iCAAiC,IAAI,CAAC,IAAI,QAAQ,kCAAkC,OAAO,iCAAiC,IAAI,YAAY,gCAAgC,GAAG,IAAI,EAAE;AAClO,gBAAI,oCAAoC,OAAO,mCAAmC,IAAI,CAAC,IAAI,QAAQ,oCAAoC,OAAO,mCAAmC,IAAI,YAAY,kCAAkC,GAAG,IAAI,EAAE;AAC5O,gBAAI,0BAA0B,OAAO,yBAAyB,IAAI,SAAO,0BAA0B,OAAO,yBAAyB,IAAI,YAAY,wBAAwB,GAAG,EAAE;AAChL,gBAAI,sCAAsC,OAAO,qCAAqC,IAAI,SAAO,sCAAsC,OAAO,qCAAqC,IAAI,YAAY,oCAAoC,GAAG,EAAE;AAC5O,gBAAI,qBAAqB,OAAO,oBAAoB,IAAI,SAAO,qBAAqB,OAAO,oBAAoB,IAAI,YAAY,mBAAmB,GAAG,EAAE;AACvJ,gBAAI,gCAAgC,OAAO,+BAA+B,IAAI,SAAO,gCAAgC,OAAO,+BAA+B,IAAI,YAAY,8BAA8B,GAAG,EAAE;AAC9M,gBAAI,mCAAmC,OAAO,kCAAkC,IAAI,CAAC,IAAI,QAAQ,mCAAmC,OAAO,kCAAkC,IAAI,YAAY,iCAAiC,GAAG,IAAI,EAAE;AACvO,gBAAI,2BAA2B,OAAO,0BAA0B,IAAI,SAAO,2BAA2B,OAAO,0BAA0B,IAAI,YAAY,yBAAyB,GAAG,EAAE;AACrL,gBAAI,8BAA8B,OAAO,6BAA6B,IAAI,SAAO,8BAA8B,OAAO,6BAA6B,IAAI,YAAY,4BAA4B,GAAG,EAAE;AACpM,gBAAI,6BAA6B,OAAO,4BAA4B,IAAI,SAAO,6BAA6B,OAAO,4BAA4B,IAAI,YAAY,2BAA2B,GAAG,EAAE;AAC/L,gBAAI,gCAAgC,OAAO,+BAA+B,IAAI,CAAC,IAAI,QAAQ,gCAAgC,OAAO,+BAA+B,IAAI,YAAY,8BAA8B,GAAG,IAAI,EAAE;AACxN,gBAAI,wCAAwC,OAAO,uCAAuC,IAAI,SAAO,wCAAwC,OAAO,uCAAuC,IAAI,YAAY,sCAAsC,GAAG,EAAE;AACtP,gBAAI,uCAAuC,OAAO,sCAAsC,IAAI,SAAO,uCAAuC,OAAO,sCAAsC,IAAI,YAAY,qCAAqC,GAAG,EAAE;AACjP,gBAAI,kDAAkD,OAAO,iDAAiD,IAAI,SAAO,kDAAkD,OAAO,iDAAiD,IAAI,YAAY,gDAAgD,GAAG,EAAE;AACxS,gBAAI,qDAAqD,OAAO,oDAAoD,IAAI,SAAO,qDAAqD,OAAO,oDAAoD,IAAI,YAAY,mDAAmD,GAAG,EAAE;AACvT,gBAAI,yCAAyC,OAAO,wCAAwC,IAAI,SAAO,yCAAyC,OAAO,wCAAwC,IAAI,YAAY,uCAAuC,GAAG,EAAE;AAC3P,gBAAI,6CAA6C,OAAO,4CAA4C,IAAI,SAAO,6CAA6C,OAAO,4CAA4C,IAAI,YAAY,2CAA2C,GAAG,EAAE;AAC/Q,gBAAI,uCAAuC,OAAO,sCAAsC,IAAI,CAAC,IAAI,QAAQ,uCAAuC,OAAO,sCAAsC,IAAI,YAAY,qCAAqC,GAAG,IAAI,EAAE;AAC3P,gBAAI,mCAAmC,OAAO,kCAAkC,IAAI,SAAO,mCAAmC,OAAO,kCAAkC,IAAI,YAAY,iCAAiC,GAAG,EAAE;AAC7N,gBAAI,4CAA4C,OAAO,2CAA2C,IAAI,SAAO,4CAA4C,OAAO,2CAA2C,IAAI,YAAY,0CAA0C,GAAG,EAAE;AAC1Q,gBAAI,6CAA6C,OAAO,4CAA4C,IAAI,SAAO,6CAA6C,OAAO,4CAA4C,IAAI,YAAY,2CAA2C,GAAG,EAAE;AAC/Q,gBAAI,6CAA6C,OAAO,4CAA4C,IAAI,SAAO,6CAA6C,OAAO,4CAA4C,IAAI,YAAY,2CAA2C,GAAG,EAAE;AAC/Q,gBAAI,+CAA+C,OAAO,8CAA8C,IAAI,SAAO,+CAA+C,OAAO,8CAA8C,IAAI,YAAY,6CAA6C,GAAG,EAAE;AACzR,gBAAI,uCAAuC,OAAO,sCAAsC,IAAI,SAAO,uCAAuC,OAAO,sCAAsC,IAAI,YAAY,qCAAqC,GAAG,EAAE;AACjP,gBAAI,sCAAsC,OAAO,qCAAqC,IAAI,SAAO,sCAAsC,OAAO,qCAAqC,IAAI,YAAY,oCAAoC,GAAG,EAAE;AAC5O,gBAAI,oCAAoC,OAAO,mCAAmC,IAAI,SAAO,oCAAoC,OAAO,mCAAmC,IAAI,YAAY,kCAAkC,GAAG,EAAE;AAClO,gBAAI,mCAAmC,OAAO,kCAAkC,IAAI,SAAO,mCAAmC,OAAO,kCAAkC,IAAI,YAAY,iCAAiC,GAAG,EAAE;AAC7N,gBAAI,iCAAiC,OAAO,gCAAgC,IAAI,SAAO,iCAAiC,OAAO,gCAAgC,IAAI,YAAY,+BAA+B,GAAG,EAAE;AACnN,gBAAI,wCAAwC,OAAO,uCAAuC,IAAI,SAAO,wCAAwC,OAAO,uCAAuC,IAAI,YAAY,sCAAsC,GAAG,EAAE;AACtP,gBAAI,qCAAqC,OAAO,oCAAoC,IAAI,SAAO,qCAAqC,OAAO,oCAAoC,IAAI,YAAY,mCAAmC,GAAG,EAAE;AACvO,gBAAI,gDAAgD,OAAO,+CAA+C,IAAI,SAAO,gDAAgD,OAAO,+CAA+C,IAAI,YAAY,8CAA8C,GAAG,EAAE;AAC9R,gBAAI,oCAAoC,OAAO,mCAAmC,IAAI,SAAO,oCAAoC,OAAO,mCAAmC,IAAI,YAAY,kCAAkC,GAAG,EAAE;AAClO,gBAAI,uBAAuB,OAAO,sBAAsB,IAAI,SAAO,uBAAuB,OAAO,sBAAsB,IAAI,YAAY,qBAAqB,GAAG,EAAE;AACjK,gBAAI,qCAAqC,OAAO,oCAAoC,IAAI,CAAC,IAAI,QAAQ,qCAAqC,OAAO,oCAAoC,IAAI,YAAY,mCAAmC,GAAG,IAAI,EAAE;AACjP,gBAAI,qCAAqC,OAAO,oCAAoC,IAAI,CAAC,IAAI,QAAQ,qCAAqC,OAAO,oCAAoC,IAAI,YAAY,mCAAmC,GAAG,IAAI,EAAE;AACjP,gBAAI,qCAAqC,OAAO,oCAAoC,IAAI,SAAO,qCAAqC,OAAO,oCAAoC,IAAI,YAAY,mCAAmC,GAAG,EAAE;AACvO,gBAAI,2CAA2C,OAAO,0CAA0C,IAAI,SAAO,2CAA2C,OAAO,0CAA0C,IAAI,YAAY,yCAAyC,GAAG,EAAE;AACrQ,gBAAI,+BAA+B,OAAO,8BAA8B,IAAI,SAAO,+BAA+B,OAAO,8BAA8B,IAAI,YAAY,6BAA6B,GAAG,EAAE;AACzM,gBAAI,4BAA4B,OAAO,2BAA2B,IAAI,SAAO,4BAA4B,OAAO,2BAA2B,IAAI,YAAY,0BAA0B,GAAG,EAAE;AAC1L,gBAAI,kCAAkC,OAAO,iCAAiC,IAAI,SAAO,kCAAkC,OAAO,iCAAiC,IAAI,YAAY,gCAAgC,GAAG,EAAE;AACxN,gBAAI,sBAAsB,OAAO,qBAAqB,IAAI,CAAC,IAAI,QAAQ,sBAAsB,OAAO,qBAAqB,IAAI,YAAY,oBAAoB,GAAG,IAAI,EAAE;AACtK,gBAAI,4BAA4B,OAAO,2BAA2B,IAAI,CAAC,IAAI,QAAQ,4BAA4B,OAAO,2BAA2B,IAAI,YAAY,0BAA0B,GAAG,IAAI,EAAE;AACpM,gBAAI,kCAAkC,OAAO,iCAAiC,IAAI,CAAC,IAAI,QAAQ,kCAAkC,OAAO,iCAAiC,IAAI,YAAY,gCAAgC,GAAG,IAAI,EAAE;AAClO,gBAAI,6BAA6B,OAAO,4BAA4B,IAAI,SAAO,6BAA6B,OAAO,4BAA4B,IAAI,YAAY,2BAA2B,GAAG,EAAE;AAC/L,gBAAI,6BAA6B,OAAO,4BAA4B,IAAI,SAAO,6BAA6B,OAAO,4BAA4B,IAAI,YAAY,2BAA2B,GAAG,EAAE;AAC/L,gBAAI,mCAAmC,OAAO,kCAAkC,IAAI,SAAO,mCAAmC,OAAO,kCAAkC,IAAI,YAAY,iCAAiC,GAAG,EAAE;AAC7N,gBAAI,mCAAmC,OAAO,kCAAkC,IAAI,SAAO,mCAAmC,OAAO,kCAAkC,IAAI,YAAY,iCAAiC,GAAG,EAAE;AAC7N,gBAAI,iCAAiC,OAAO,gCAAgC,IAAI,SAAO,iCAAiC,OAAO,gCAAgC,IAAI,YAAY,+BAA+B,GAAG,EAAE;AACnN,gBAAI,uBAAuB,OAAO,sBAAsB,IAAI,SAAO,uBAAuB,OAAO,sBAAsB,IAAI,YAAY,qBAAqB,GAAG,EAAE;AACjK,gBAAI,qCAAqC,OAAO,oCAAoC,IAAI,SAAO,qCAAqC,OAAO,oCAAoC,IAAI,YAAY,mCAAmC,GAAG,EAAE;AACvO,gBAAI,2CAA2C,OAAO,0CAA0C,IAAI,SAAO,2CAA2C,OAAO,0CAA0C,IAAI,YAAY,yCAAyC,GAAG,EAAE;AACrQ,gBAAI,wCAAwC,OAAO,uCAAuC,IAAI,SAAO,wCAAwC,OAAO,uCAAuC,IAAI,YAAY,sCAAsC,GAAG,EAAE;AACtP,gBAAI,8CAA8C,OAAO,6CAA6C,IAAI,SAAO,8CAA8C,OAAO,6CAA6C,IAAI,YAAY,4CAA4C,GAAG,EAAE;AACpR,gBAAI,4BAA4B,OAAO,2BAA2B,IAAI,SAAO,4BAA4B,OAAO,2BAA2B,IAAI,YAAY,0BAA0B,GAAG,EAAE;AAC1L,gBAAI,0BAA0B,OAAO,yBAAyB,IAAI,SAAO,0BAA0B,OAAO,yBAAyB,IAAI,YAAY,wBAAwB,GAAG,EAAE;AAChL,gBAAI,4BAA4B,OAAO,2BAA2B,IAAI,SAAO,4BAA4B,OAAO,2BAA2B,IAAI,YAAY,0BAA0B,GAAG,EAAE;AAC1L,gBAAI,0BAA0B,OAAO,yBAAyB,IAAI,SAAO,0BAA0B,OAAO,yBAAyB,IAAI,YAAY,wBAAwB,GAAG,EAAE;AAChL,gBAAI,0BAA0B,OAAO,yBAAyB,IAAI,SAAO,0BAA0B,OAAO,yBAAyB,IAAI,YAAY,wBAAwB,GAAG,EAAE;AAChL,gBAAI,yBAAyB,OAAO,wBAAwB,IAAI,SAAO,yBAAyB,OAAO,wBAAwB,IAAI,YAAY,uBAAuB,GAAG,EAAE;AAC3K,gBAAI,+BAA+B,OAAO,8BAA8B,IAAI,SAAO,+BAA+B,OAAO,8BAA8B,IAAI,YAAY,6BAA6B,GAAG,EAAE;AACzM,gBAAI,oCAAoC,OAAO,mCAAmC,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,QAAQ,oCAAoC,OAAO,mCAAmC,IAAI,YAAY,kCAAkC,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AACpR,gBAAI,yBAAyB,OAAO,wBAAwB,IAAI,SAAO,yBAAyB,OAAO,wBAAwB,IAAI,YAAY,uBAAuB,GAAG,EAAE;AAC3K,gBAAI,4BAA4B,OAAO,2BAA2B,IAAI,SAAO,4BAA4B,OAAO,2BAA2B,IAAI,YAAY,0BAA0B,GAAG,EAAE;AAC1L,gBAAI,0BAA0B,OAAO,yBAAyB,IAAI,SAAO,0BAA0B,OAAO,yBAAyB,IAAI,YAAY,wBAAwB,GAAG,EAAE;AAChL,gBAAI,yBAAyB,OAAO,wBAAwB,IAAI,SAAO,yBAAyB,OAAO,wBAAwB,IAAI,YAAY,uBAAuB,GAAG,EAAE;AAC3K,gBAAI,2BAA2B,OAAO,0BAA0B,IAAI,SAAO,2BAA2B,OAAO,0BAA0B,IAAI,YAAY,yBAAyB,GAAG,EAAE;AACrL,gBAAI,yBAAyB,OAAO,wBAAwB,IAAI,SAAO,yBAAyB,OAAO,wBAAwB,IAAI,YAAY,uBAAuB,GAAG,EAAE;AAC3K,gBAAI,4BAA4B,OAAO,2BAA2B,IAAI,SAAO,4BAA4B,OAAO,2BAA2B,IAAI,YAAY,0BAA0B,GAAG,EAAE;AAC1L,gBAAI,iCAAiC,OAAO,gCAAgC,IAAI,SAAO,iCAAiC,OAAO,gCAAgC,IAAI,YAAY,+BAA+B,GAAG,EAAE;AACnN,gBAAI,yBAAyB,OAAO,wBAAwB,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,SAAS,yBAAyB,OAAO,wBAAwB,IAAI,YAAY,uBAAuB,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG;AAC/P,gBAAI,0BAA0B,OAAO,yBAAyB,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,SAAS,0BAA0B,OAAO,yBAAyB,IAAI,YAAY,wBAAwB,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG;AACpQ,gBAAI,YAAY,OAAO,WAAW,IAAI,SAAO,YAAY,OAAO,WAAW,IAAI,YAAY,UAAU,GAAG,EAAE;AAC1G,gBAAI,YAAY,OAAO,WAAW,IAAI,SAAO,YAAY,OAAO,WAAW,IAAI,YAAY,UAAU,GAAG,EAAE;AAC1G,gBAAI,YAAY,OAAO,WAAW,IAAI,SAAO,YAAY,OAAO,WAAW,IAAI,YAAY,UAAU,GAAG,EAAE;AAC1G,gBAAI,YAAY,OAAO,WAAW,IAAI,SAAO,YAAY,OAAO,WAAW,IAAI,YAAY,UAAU,GAAG,EAAE;AAC1G,gBAAI,YAAY,OAAO,WAAW,IAAI,SAAO,YAAY,OAAO,WAAW,IAAI,YAAY,UAAU,GAAG,EAAE;AAC1G,gBAAI,aAAa,OAAO,YAAY,IAAI,SAAO,aAAa,OAAO,YAAY,IAAI,YAAY,WAAW,GAAG,EAAE;AAC/G,gBAAI,UAAU,OAAO,SAAS,IAAI,CAAC,IAAI,IAAI,QAAQ,UAAU,OAAO,SAAS,IAAI,YAAY,QAAQ,GAAG,IAAI,IAAI,EAAE;AAClH,gBAAI,UAAU,OAAO,SAAS,IAAI,SAAO,UAAU,OAAO,SAAS,IAAI,YAAY,QAAQ,GAAG,EAAE;AAChG,gBAAI,UAAU,OAAO,SAAS,IAAI,CAAC,IAAI,QAAQ,UAAU,OAAO,SAAS,IAAI,YAAY,QAAQ,GAAG,IAAI,EAAE;AAC1G,gBAAI,WAAW,OAAO,UAAU,IAAI,CAAC,IAAI,IAAI,QAAQ,WAAW,OAAO,UAAU,IAAI,YAAY,SAAS,GAAG,IAAI,IAAI,EAAE;AACvH,gBAAI,WAAW,OAAO,UAAU,IAAI,CAAC,IAAI,IAAI,QAAQ,WAAW,OAAO,UAAU,IAAI,YAAY,SAAS,GAAG,IAAI,IAAI,EAAE;AACvH,gBAAI,YAAY,OAAO,WAAW,IAAI,SAAO,YAAY,OAAO,WAAW,IAAI,YAAY,UAAU,GAAG,EAAE;AAC1G,gBAAI,YAAY,OAAO,WAAW,IAAI,SAAO,YAAY,OAAO,WAAW,IAAI,YAAY,UAAU,GAAG,EAAE;AAC1G,gBAAI,YAAY,CAAC,IAAI,QAAQ,YAAY,YAAY,UAAU,GAAG,IAAI,EAAE;AACxE,gBAAI,6BAA6B,SAAO,6BAA6B,YAAY,2BAA2B,GAAG,EAAE;AACjH,gBAAI,2BAA2B,SAAO,2BAA2B,YAAY,yBAAyB,GAAG,EAAE;AAC3G,gBAAI,gCAAgC,OAAO,gCAAgC,YAAY,8BAA8B,GAAG;AACxH,gBAAI,eAAe,OAAO,cAAc,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,QAAQ,eAAe,OAAO,cAAc,IAAI,YAAY,cAAc,GAAG,IAAI,IAAI,IAAI,IAAI,EAAE;AAC5J,gBAAI,iCAAiC,OAAO,gCAAgC,IAAI,SAAO,iCAAiC,OAAO,gCAAgC,IAAI,YAAY,+BAA+B,GAAG,EAAE;AACnN,gBAAI,qCAAqC,OAAO,oCAAoC,IAAI,CAAC,IAAI,QAAQ,qCAAqC,OAAO,oCAAoC,IAAI,YAAY,mCAAmC,GAAG,IAAI,EAAE;AAGjP,mBAAO,eAAe,IAAI;AAC1B,mBAAO,eAAe,IAAI;AAC1B,gBAAI;AACJ,oCAAwB,SAAS,YAAY;AAE3C,kBAAI,CAAC,UAAW,KAAI;AACpB,kBAAI,CAAC,UAAW,yBAAwB;AAAA,YAC1C;AAEA,qBAAS,SAASM,QAAO,CAAC,GAAG;AAC3B,kBAAI,gBAAgB,oBAAoB,MAAM,EAAE;AAGhD,kBAAI,CAAC,cAAe;AACpB,cAAAA,MAAK,QAAQ,WAAW;AACxB,kBAAI,OAAOA,MAAK;AAChB,kBAAI,OAAO,YAAY,OAAO,KAAK,CAAC;AACpC,kBAAI,WAAW;AACf,cAAAA,MAAK,QAAQ,SAAO;AAClB,mCAAoB,YAAa,KAAK,GAAG,oBAAoB,GAAG,CAAC;AACjE,4BAAY;AAAA,cACd,CAAC;AACD,iCAAoB,YAAa,KAAK,GAAG,CAAC;AAC1C,kBAAI;AACF,oBAAI,MAAM,cAAc,MAAM,IAAI;AAElC;AAAA,kBAAO;AAAA;AAAA,kBAAsB;AAAA,gBAAI;AACjC,uBAAO;AAAA,cACT,SAAS,GAAG;AACV,uBAAO,gBAAgB,CAAC;AAAA,cAC1B;AAAA,YACF;AACA,qBAAS,IAAIA,QAAO,YAAY;AAC9B,kBAAI,kBAAkB,GAAG;AACvB;AAAA,cACF;AACA,qBAAO;AAEP,kBAAI,kBAAkB,GAAG;AACvB;AAAA,cACF;AACA,uBAAS,QAAQ;AAGf,oBAAI,UAAW;AACf,4BAAY;AACZ,uBAAO,WAAW,IAAI;AACtB,oBAAI,MAAO;AACX,4BAAY;AACZ,wBAAQ;AACR,uBAAO,sBAAsB,IAAI;AACjC,oBAAI,aAAc,UAASA,KAAI;AAC/B,wBAAQ;AAAA,cACV;AACA,kBAAI,OAAO,WAAW,GAAG;AACvB,uBAAO,WAAW,EAAE,YAAY;AAChC,2BAAW,WAAW;AACpB,6BAAW,WAAW;AACpB,2BAAO,WAAW,EAAE,EAAE;AAAA,kBACxB,GAAG,CAAC;AACJ,wBAAM;AAAA,gBACR,GAAG,CAAC;AAAA,cACN,OAAO;AACL,sBAAM;AAAA,cACR;AAAA,YACF;AACA,gBAAI,OAAO,SAAS,GAAG;AACrB,kBAAI,OAAO,OAAO,SAAS,KAAK,WAAY,QAAO,SAAS,IAAI,CAAE,OAAO,SAAS,CAAE;AACpF,qBAAO,OAAO,SAAS,EAAE,SAAS,GAAG;AACnC,uBAAO,SAAS,EAAE,IAAI,EAAE;AAAA,cAC1B;AAAA,YACF;AAEA,gBAAI,eAAe;AACnB,gBAAI,OAAO,cAAc,EAAG,gBAAe;AAC3C,gBAAI;AAKJ,kBAAM,IAAI;AACV,kBAAM,WAAW,CAAC;AAClB,kBAAM,cAAc;AACpB,kBAAM,iBAAiB,IAAI;AAC3B,kBAAM,eAAe,IAAI;AACzB,kBAAM,gBAAgB,IAAI;AAC1B,kBAAM,gBAAgB,IAAI,cAAc,IAAI;AAC5C,kBAAM,aAAa;AAAA,cACjB,KAAK;AAAA,cACL,QAAQ;AAAA,YACV;AACA,kBAAM,mBAAmB;AACzB,kBAAM,8BAA8B;AACpC,kBAAM,6BAA6B;AACnC,kBAAM,0BAA0B;AAChC,gBAAI;AACJ,gBAAI;AACJ,gBAAI;AACJ,gBAAI;AAEJ,gBAAI;AAAA,YAEJ,MAAM,WAAW;AAAA,cACf,OAAO,OAAO;AACZ,kCAAkB,EAAE,SAAS;AAC7B,0BAAU,SAAS,iBAAiB,KAAK;AACzC,yCAAyB,SAAS,kBAAkB,aAAa,KAAK;AAAA,cACxE;AAAA,cACA,aAAa;AACX,kBAAE,oBAAoB;AACtB,qBAAK,CAAC,IAAI,SAAS,iBAAiB,KAAK;AACzC,qBAAK,CAAC,IAAI,SAAS,kBAAkB,aAAa,KAAK;AAAA,cACzD;AAAA,cACA,SAAS;AACP,kBAAE,kBAAkB,KAAK,CAAC,CAAC;AAC3B,kBAAE,MAAM,KAAK,CAAC,CAAC;AACf,qBAAK,CAAC,IAAI;AACV,qBAAK,CAAC,IAAI;AAAA,cACZ;AAAA,cACA,YAAY,UAAU;AACpB,oBAAI;AACJ,oBAAI,CAAC,UAAU;AACb,4BAAU;AACV,6BAAW;AAAA,gBACb,WAAW,SAAS,gBAAgB,UAAU;AAC5C,4BAAU,SAAS,CAAC;AACpB,wBAAM,UAAU,EAAE,qBAAqB,OAAO;AAC9C,sBAAI,UAAU,0BAA0B,UAAU,SAAS;AACzD,0BAAM,IAAI,MAAM,iCAAiC,OAAO,yBAA8B,sBAAsB,YAAY,OAAO,GAAG;AAAA,kBACpI;AAAA,gBACF,OAAO;AACL,wBAAM,IAAI,MAAM,6BAA6B;AAAA,gBAC/C;AACA,qBAAK,WAAW;AAChB,kBAAE,wBAAwB,KAAK,CAAC,GAAG,OAAO;AAC1C,uBAAO;AAAA,cACT;AAAA,cACA,cAAc;AACZ,uBAAO,KAAK;AAAA,cACd;AAAA,cACA,MAAM,UAAU,SAAS,SAAS;AAChC,oBAAI,OAAO,aAAa,UAAU;AAChC,yCAAuB,CAAC,OAAO,MAAM,SAAS,MAAM,KAAK;AAAA,gBAC3D,WAAW,OAAO,aAAa,YAAY;AACzC,yCAAuB;AAAA,gBACzB,OAAO;AACL,wBAAM,IAAI,MAAM,yCAAyC;AAAA,gBAC3D;AACA,oBAAI,KAAK,aAAa;AACpB,uCAAqB,KAAK;AAC1B,oBAAE,8BAA8B,KAAK,CAAC,GAAG,CAAC;AAAA,gBAC5C,OAAO;AACL,uCAAqB;AACrB,oBAAE,8BAA8B,KAAK,CAAC,GAAG,CAAC;AAAA,gBAC5C;AACA,oBAAI,aAAa;AACjB,oBAAI,eAAe;AACnB,oBAAI,SAAS,gBAAgB;AAC3B,+BAAa,QAAQ,eAAe;AACpC,iCAAe,EAAE,QAAQ,YAAY,aAAa;AAClD,sBAAI,UAAU;AACd,2BAASN,KAAI,GAAGA,KAAI,YAAYA,MAAK;AACnC,iCAAa,SAAS,QAAQ,eAAeA,EAAC,CAAC;AAC/C,+BAAW;AAAA,kBACb;AAAA,gBACF;AACA,sBAAM,cAAc,EAAE,sBAAsB,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,UAAU,QAAQ,CAAC,IAAI,GAAG,cAAc,UAAU;AAChH,oBAAI,CAAC,aAAa;AAChB,yCAAuB;AACvB,uCAAqB;AACrB,wBAAM,IAAI,MAAM,gBAAgB;AAAA,gBAClC;AACA,sBAAM,SAAS,IAAI,KAAK,UAAU,aAAa,KAAK,UAAU,oBAAoB;AAClF,uCAAuB;AACvB,qCAAqB;AACrB,uBAAO;AAAA,cACT;AAAA,cACA,QAAQ;AACN,kBAAE,iBAAiB,KAAK,CAAC,CAAC;AAAA,cAC5B;AAAA,cACA,oBAAoB;AAClB,kBAAE,gCAAgC,KAAK,CAAC,CAAC;AACzC,sBAAM,QAAQ,SAAS,iBAAiB,KAAK;AAC7C,sBAAM,SAAS,SAAS,kBAAkB,aAAa,KAAK;AAC5D,sBAAM,SAAS,IAAI,MAAM,KAAK;AAC9B,oBAAI,QAAQ,GAAG;AACb,sBAAI,UAAU;AACd,2BAASA,KAAI,GAAGA,KAAI,OAAOA,MAAK;AAC9B,2BAAOA,EAAC,IAAI,eAAe,OAAO;AAClC,+BAAW;AAAA,kBACb;AACA,oBAAE,MAAM,MAAM;AAAA,gBAChB;AACA,uBAAO;AAAA,cACT;AAAA,cACA,mBAAmB;AACjB,uBAAO,EAAE,0BAA0B,KAAK,CAAC,CAAC;AAAA,cAC5C;AAAA,cACA,iBAAiB,SAAS;AACxB,kBAAE,8BAA8B,KAAK,CAAC,GAAG,OAAO;AAAA,cAClD;AAAA,cACA,UAAU,UAAU;AAClB,oBAAI,CAAC,UAAU;AACb,6BAAW;AAAA,gBACb,WAAW,OAAO,aAAa,YAAY;AACzC,wBAAM,IAAI,MAAM,oCAAoC;AAAA,gBACtD;AACA,qBAAK,cAAc;AACnB,uBAAO;AAAA,cACT;AAAA,cACA,YAAY;AACV,uBAAO,KAAK;AAAA,cACd;AAAA,YACF;AAAA,YACA,MAAM,KAAK;AAAA,cACT,YAAY,UAAU,SAAS,UAAU,cAAc;AACrD,+BAAe,QAAQ;AACvB,qBAAK,CAAC,IAAI;AACV,qBAAK,WAAW;AAChB,qBAAK,eAAe;AAAA,cACtB;AAAA,cACA,OAAO;AACL,sBAAM,UAAU,EAAE,cAAc,KAAK,CAAC,CAAC;AACvC,uBAAO,IAAI,KAAK,UAAU,SAAS,KAAK,UAAU,KAAK,YAAY;AAAA,cACrE;AAAA,cACA,SAAS;AACP,kBAAE,gBAAgB,KAAK,CAAC,CAAC;AACzB,qBAAK,CAAC,IAAI;AAAA,cACZ;AAAA,cACA,KAAK,MAAM;AACT,4BAAY,IAAI;AAChB,kBAAE,mBAAmB,KAAK,CAAC,CAAC;AAAA,cAC9B;AAAA,cACA,IAAI,WAAW;AACb,kBAAE,wBAAwB,KAAK,CAAC,CAAC;AACjC,uBAAO,cAAc,IAAI;AAAA,cAC3B;AAAA,cACA,mBAAmB,aAAa,cAAc;AAC5C,sBAAM,UAAU,kBAAkB;AAClC,yBAAS,SAAS,aAAa,KAAK;AACpC,6BAAa,UAAU,aAAa,YAAY;AAChD,kBAAE,oCAAoC,KAAK,CAAC,CAAC;AAC7C,uBAAO,cAAc,IAAI;AAAA,cAC3B;AAAA,cACA,cAAc;AACZ,uBAAO,KAAK;AAAA,cACd;AAAA,cACA,OAAO;AACL,uBAAO,KAAK,SAAS,KAAK;AAAA,cAC5B;AAAA,cACA,iBAAiB,OAAO;AACtB,oBAAI,MAAM,gBAAgB,MAAM;AAC9B,wBAAM,IAAI,UAAU,yBAAyB;AAAA,gBAC/C;AACA,kBAAE,iCAAiC,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC;AACpD,sBAAM,QAAQ,SAAS,iBAAiB,KAAK;AAC7C,sBAAM,SAAS,SAAS,kBAAkB,aAAa,KAAK;AAC5D,sBAAM,SAAS,IAAI,MAAM,KAAK;AAC9B,oBAAI,QAAQ,GAAG;AACb,sBAAI,UAAU;AACd,2BAASA,KAAI,GAAGA,KAAI,OAAOA,MAAK;AAC9B,2BAAOA,EAAC,IAAI,eAAe,OAAO;AAClC,+BAAW;AAAA,kBACb;AACA,oBAAE,MAAM,MAAM;AAAA,gBAChB;AACA,uBAAO;AAAA,cACT;AAAA,cACA,oBAAoB;AAClB,kBAAE,8BAA8B,KAAK,CAAC,CAAC;AACvC,sBAAM,QAAQ,SAAS,iBAAiB,KAAK;AAC7C,sBAAM,SAAS,SAAS,kBAAkB,aAAa,KAAK;AAC5D,sBAAM,SAAS,IAAI,MAAM,KAAK;AAC9B,oBAAI,QAAQ,GAAG;AACb,sBAAI,UAAU;AACd,2BAASA,KAAI,GAAGA,KAAI,OAAOA,MAAK;AAC9B,2BAAOA,EAAC,IAAI,eAAe,OAAO;AAClC,+BAAW;AAAA,kBACb;AACA,oBAAE,MAAM,MAAM;AAAA,gBAChB;AACA,uBAAO;AAAA,cACT;AAAA,YACF;AAAA,YACA,MAAM,KAAK;AAAA,cACT,YAAY,UAAU,MAAM;AAC1B,+BAAe,QAAQ;AACvB,qBAAK,OAAO;AAAA,cACd;AAAA,cACA,IAAI,SAAS;AACX,4BAAY,IAAI;AAChB,uBAAO,EAAE,qBAAqB,KAAK,KAAK,CAAC,CAAC;AAAA,cAC5C;AAAA,cACA,IAAI,YAAY;AACd,4BAAY,IAAI;AAChB,uBAAO,EAAE,6BAA6B,KAAK,KAAK,CAAC,CAAC;AAAA,cACpD;AAAA,cACA,IAAI,OAAO;AACT,uBAAO,KAAK,KAAK,SAAS,MAAM,KAAK,MAAM,KAAK;AAAA,cAClD;AAAA,cACA,IAAI,cAAc;AAChB,uBAAO,KAAK,KAAK,SAAS,MAAM,KAAK,SAAS,KAAK;AAAA,cACrD;AAAA,cACA,IAAI,cAAc;AAChB,4BAAY,IAAI;AAChB,kBAAE,wBAAwB,KAAK,KAAK,CAAC,CAAC;AACtC,uBAAO,eAAe,eAAe;AAAA,cACvC;AAAA,cACA,IAAI,WAAW;AACb,4BAAY,IAAI;AAChB,uBAAO,EAAE,wBAAwB,KAAK,KAAK,CAAC,CAAC;AAAA,cAC/C;AAAA,cACA,IAAI,OAAO;AACT,uBAAO,QAAQ,KAAK,MAAM,KAAK,YAAY,KAAK,QAAQ;AAAA,cAC1D;AAAA,cACA,IAAI,aAAa;AACf,4BAAY,IAAI;AAChB,uBAAO,EAAE,0BAA0B,KAAK,KAAK,CAAC,CAAC;AAAA,cACjD;AAAA,cACA,IAAI,iBAAiB;AACnB,4BAAY,IAAI;AAChB,uBAAO,EAAE,+BAA+B,KAAK,KAAK,CAAC,CAAC;AAAA,cACtD;AAAA,cACA,IAAI,UAAU;AACZ,4BAAY,IAAI;AAChB,uBAAO,EAAE,uBAAuB,KAAK,KAAK,CAAC,CAAC,MAAM;AAAA,cACpD;AAAA,cACA,IAAI,WAAW;AACb,4BAAY,IAAI;AAChB,uBAAO,EAAE,wBAAwB,KAAK,KAAK,CAAC,CAAC,MAAM;AAAA,cACrD;AAAA,cACA,IAAI,aAAa;AACf,4BAAY,IAAI;AAChB,uBAAO,EAAE,0BAA0B,KAAK,KAAK,CAAC,CAAC,MAAM;AAAA,cACvD;AAAA,cACA,IAAI,UAAU;AACZ,4BAAY,IAAI;AAChB,uBAAO,EAAE,uBAAuB,KAAK,KAAK,CAAC,CAAC,MAAM;AAAA,cACpD;AAAA,cACA,IAAI,YAAY;AACd,4BAAY,IAAI;AAChB,uBAAO,EAAE,yBAAyB,KAAK,KAAK,CAAC,CAAC,MAAM;AAAA,cACtD;AAAA,cACA,IAAI,UAAU;AACZ,4BAAY,IAAI;AAChB,uBAAO,EAAE,uBAAuB,KAAK,KAAK,CAAC,CAAC,MAAM;AAAA,cACpD;AAAA,cACA,OAAO,OAAO;AACZ,uBAAO,KAAK,OAAO,MAAM;AAAA,cAC3B;AAAA,cACA,MAAM,OAAO;AACX,4BAAY,IAAI;AAChB,kBAAE,oBAAoB,KAAK,KAAK,CAAC,GAAG,KAAK;AACzC,uBAAO,cAAc,KAAK,IAAI;AAAA,cAChC;AAAA,cACA,WAAW,OAAO;AAChB,4BAAY,IAAI;AAChB,kBAAE,0BAA0B,KAAK,KAAK,CAAC,GAAG,KAAK;AAC/C,uBAAO,cAAc,KAAK,IAAI;AAAA,cAChC;AAAA,cACA,gBAAgB,SAAS;AACvB,4BAAY,IAAI;AAChB,kBAAE,gCAAgC,KAAK,KAAK,CAAC,GAAG,OAAO;AACvD,uBAAO,cAAc,KAAK,IAAI;AAAA,cAChC;AAAA,cACA,kBAAkB,WAAW;AAC3B,sBAAM,UAAU,KAAK,KAAK,SAAS,OAAO,QAAQ,SAAS;AAC3D,oBAAI,YAAY,GAAI,QAAO,KAAK,gBAAgB,OAAO;AACvD,uBAAO;AAAA,cACT;AAAA,cACA,kBAAkB,OAAO;AACvB,4BAAY,IAAI;AAChB,sBAAM,UAAU,EAAE,mCAAmC,KAAK,KAAK,CAAC,GAAG,KAAK;AACxE,oBAAI,CAAC,SAAS;AACZ,yBAAO;AAAA,gBACT;AACA,sBAAM,SAAS,cAAc,OAAO;AAEpC,uBAAO;AAAA,cACT;AAAA,cACA,qBAAqB,WAAW;AAC9B,sBAAM,UAAU,KAAK,KAAK,SAAS,OAAO,QAAQ,SAAS;AAC3D,oBAAI,YAAY,MAAM,YAAY,EAAG,QAAO,KAAK,mBAAmB,OAAO;AAC3E,uBAAO,CAAC;AAAA,cACV;AAAA,cACA,mBAAmB,SAAS;AAC1B,4BAAY,IAAI;AAChB,kBAAE,mCAAmC,KAAK,KAAK,CAAC,GAAG,OAAO;AAC1D,sBAAM,QAAQ,SAAS,iBAAiB,KAAK;AAC7C,sBAAM,SAAS,SAAS,kBAAkB,aAAa,KAAK;AAC5D,sBAAM,SAAS,IAAI,MAAM,KAAK;AAC9B,oBAAI,QAAQ,GAAG;AACb,sBAAI,UAAU;AACd,2BAASA,KAAI,GAAGA,KAAI,OAAOA,MAAK;AAC9B,2BAAOA,EAAC,IAAI,cAAc,KAAK,MAAM,OAAO;AAC5C,+BAAW;AAAA,kBACb;AACA,oBAAE,MAAM,MAAM;AAAA,gBAChB;AACA,uBAAO;AAAA,cACT;AAAA,cACA,mBAAmB,OAAO;AACxB,4BAAY,IAAI;AAChB,sBAAM,UAAU,kBAAkB;AAClC,yBAAS,SAAS,OAAO,KAAK;AAC9B,kBAAE,mCAAmC,KAAK,KAAK,CAAC,CAAC;AACjD,uBAAO,cAAc,KAAK,IAAI;AAAA,cAChC;AAAA,cACA,wBAAwB,OAAO;AAC7B,4BAAY,IAAI;AAChB,sBAAM,UAAU,kBAAkB;AAClC,yBAAS,SAAS,OAAO,KAAK;AAC9B,kBAAE,yCAAyC,KAAK,KAAK,CAAC,CAAC;AACvD,uBAAO,cAAc,KAAK,IAAI;AAAA,cAChC;AAAA,cACA,IAAI,aAAa;AACf,4BAAY,IAAI;AAChB,uBAAO,EAAE,0BAA0B,KAAK,KAAK,CAAC,CAAC;AAAA,cACjD;AAAA,cACA,IAAI,kBAAkB;AACpB,4BAAY,IAAI;AAChB,uBAAO,EAAE,gCAAgC,KAAK,KAAK,CAAC,CAAC;AAAA,cACvD;AAAA,cACA,IAAI,aAAa;AACf,uBAAO,KAAK,MAAM,CAAC;AAAA,cACrB;AAAA,cACA,IAAI,kBAAkB;AACpB,uBAAO,KAAK,WAAW,CAAC;AAAA,cAC1B;AAAA,cACA,IAAI,YAAY;AACd,uBAAO,KAAK,MAAM,KAAK,aAAa,CAAC;AAAA,cACvC;AAAA,cACA,IAAI,iBAAiB;AACnB,uBAAO,KAAK,WAAW,KAAK,kBAAkB,CAAC;AAAA,cACjD;AAAA,cACA,IAAI,WAAW;AACb,oBAAI,CAAC,KAAK,WAAW;AACnB,8BAAY,IAAI;AAChB,oBAAE,uBAAuB,KAAK,KAAK,CAAC,CAAC;AACrC,wBAAM,QAAQ,SAAS,iBAAiB,KAAK;AAC7C,wBAAM,SAAS,SAAS,kBAAkB,aAAa,KAAK;AAC5D,uBAAK,YAAY,IAAI,MAAM,KAAK;AAChC,sBAAI,QAAQ,GAAG;AACb,wBAAI,UAAU;AACd,6BAASA,KAAI,GAAGA,KAAI,OAAOA,MAAK;AAC9B,2BAAK,UAAUA,EAAC,IAAI,cAAc,KAAK,MAAM,OAAO;AACpD,iCAAW;AAAA,oBACb;AACA,sBAAE,MAAM,MAAM;AAAA,kBAChB;AAAA,gBACF;AACA,uBAAO,KAAK;AAAA,cACd;AAAA,cACA,IAAI,gBAAgB;AAClB,oBAAI,CAAC,KAAK,gBAAgB;AACxB,8BAAY,IAAI;AAChB,oBAAE,6BAA6B,KAAK,KAAK,CAAC,CAAC;AAC3C,wBAAM,QAAQ,SAAS,iBAAiB,KAAK;AAC7C,wBAAM,SAAS,SAAS,kBAAkB,aAAa,KAAK;AAC5D,uBAAK,iBAAiB,IAAI,MAAM,KAAK;AACrC,sBAAI,QAAQ,GAAG;AACb,wBAAI,UAAU;AACd,6BAASA,KAAI,GAAGA,KAAI,OAAOA,MAAK;AAC9B,2BAAK,eAAeA,EAAC,IAAI,cAAc,KAAK,MAAM,OAAO;AACzD,iCAAW;AAAA,oBACb;AACA,sBAAE,MAAM,MAAM;AAAA,kBAChB;AAAA,gBACF;AACA,uBAAO,KAAK;AAAA,cACd;AAAA,cACA,kBAAkB,OAAO,eAAe,aAAa;AACnD,oBAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,SAAQ,CAAE,KAAM;AAC3C,oBAAI,CAAC,cAAe,iBAAgB;AACpC,oBAAI,CAAC,YAAa,eAAc;AAEhC,sBAAM,UAAU,CAAC;AACjB,sBAAM,gBAAgB,KAAK,KAAK,SAAS;AACzC,yBAASA,KAAI,GAAG,IAAI,cAAc,QAAQA,KAAI,GAAGA,MAAK;AACpD,sBAAI,MAAM,SAAS,cAAcA,EAAC,CAAC,GAAG;AACpC,4BAAQ,KAAKA,EAAC;AAAA,kBAChB;AAAA,gBACF;AAEA,sBAAM,iBAAiB,EAAE,QAAQ,cAAc,QAAQ,MAAM;AAC7D,yBAASA,KAAI,GAAG,IAAI,QAAQ,QAAQA,KAAI,GAAGA,MAAK;AAC9C,2BAAS,iBAAiBA,KAAI,aAAa,QAAQA,EAAC,GAAG,KAAK;AAAA,gBAC9D;AAEA,4BAAY,IAAI;AAChB,kBAAE,kCAAkC,KAAK,KAAK,CAAC,GAAG,gBAAgB,QAAQ,QAAQ,cAAc,KAAK,cAAc,QAAQ,YAAY,KAAK,YAAY,MAAM;AAE9J,sBAAM,kBAAkB,SAAS,iBAAiB,KAAK;AACvD,sBAAM,oBAAoB,SAAS,kBAAkB,aAAa,KAAK;AACvE,sBAAM,SAAS,IAAI,MAAM,eAAe;AACxC,oBAAI,kBAAkB,GAAG;AACvB,sBAAI,UAAU;AACd,2BAASA,KAAI,GAAGA,KAAI,iBAAiBA,MAAK;AACxC,2BAAOA,EAAC,IAAI,cAAc,KAAK,MAAM,OAAO;AAC5C,+BAAW;AAAA,kBACb;AAAA,gBACF;AAEA,kBAAE,MAAM,iBAAiB;AACzB,kBAAE,MAAM,cAAc;AACtB,uBAAO;AAAA,cACT;AAAA,cACA,IAAI,cAAc;AAChB,4BAAY,IAAI;AAChB,kBAAE,2BAA2B,KAAK,KAAK,CAAC,CAAC;AACzC,uBAAO,cAAc,KAAK,IAAI;AAAA,cAChC;AAAA,cACA,IAAI,kBAAkB;AACpB,4BAAY,IAAI;AAChB,kBAAE,2BAA2B,KAAK,KAAK,CAAC,CAAC;AACzC,uBAAO,cAAc,KAAK,IAAI;AAAA,cAChC;AAAA,cACA,IAAI,mBAAmB;AACrB,4BAAY,IAAI;AAChB,kBAAE,iCAAiC,KAAK,KAAK,CAAC,CAAC;AAC/C,uBAAO,cAAc,KAAK,IAAI;AAAA,cAChC;AAAA,cACA,IAAI,uBAAuB;AACzB,4BAAY,IAAI;AAChB,kBAAE,iCAAiC,KAAK,KAAK,CAAC,CAAC;AAC/C,uBAAO,cAAc,KAAK,IAAI;AAAA,cAChC;AAAA,cACA,IAAI,kBAAkB;AACpB,4BAAY,IAAI;AAChB,uBAAO,EAAE,+BAA+B,KAAK,KAAK,CAAC,CAAC;AAAA,cACtD;AAAA,cACA,IAAI,SAAS;AACX,4BAAY,IAAI;AAChB,kBAAE,qBAAqB,KAAK,KAAK,CAAC,CAAC;AACnC,uBAAO,cAAc,KAAK,IAAI;AAAA,cAChC;AAAA,cACA,mBAAmBS,QAAO,MAAMA,QAAO;AACrC,oBAAI,OAAOA,WAAU,YAAY,OAAO,QAAQ,UAAU;AACxD,wBAAM,IAAI,MAAM,2BAA2B;AAAA,gBAC7C;AACA,4BAAY,IAAI;AAChB,sBAAM,UAAU,kBAAkB;AAClC,yBAAS,SAASA,QAAO,KAAK;AAC9B,yBAAS,UAAU,aAAa,KAAK,KAAK;AAC1C,kBAAE,mCAAmC,KAAK,KAAK,CAAC,CAAC;AACjD,uBAAO,cAAc,KAAK,IAAI;AAAA,cAChC;AAAA,cACA,wBAAwBA,QAAO,MAAMA,QAAO;AAC1C,oBAAI,OAAOA,WAAU,YAAY,OAAO,QAAQ,UAAU;AACxD,wBAAM,IAAI,MAAM,2BAA2B;AAAA,gBAC7C;AACA,4BAAY,IAAI;AAChB,sBAAM,UAAU,kBAAkB;AAClC,yBAAS,SAASA,QAAO,KAAK;AAC9B,yBAAS,UAAU,aAAa,KAAK,KAAK;AAC1C,kBAAE,yCAAyC,KAAK,KAAK,CAAC,CAAC;AACvD,uBAAO,cAAc,KAAK,IAAI;AAAA,cAChC;AAAA,cACA,sBAAsBA,QAAO,MAAMA,QAAO;AACxC,oBAAI,CAAC,QAAQA,MAAK,KAAK,CAAC,QAAQ,GAAG,GAAG;AACpC,wBAAM,IAAI,MAAM,yCAAyC;AAAA,gBAC3D;AACA,4BAAY,IAAI;AAChB,sBAAM,UAAU,kBAAkB;AAClC,6BAAa,SAASA,MAAK;AAC3B,6BAAa,UAAU,eAAe,GAAG;AACzC,kBAAE,sCAAsC,KAAK,KAAK,CAAC,CAAC;AACpD,uBAAO,cAAc,KAAK,IAAI;AAAA,cAChC;AAAA,cACA,2BAA2BA,QAAO,MAAMA,QAAO;AAC7C,oBAAI,CAAC,QAAQA,MAAK,KAAK,CAAC,QAAQ,GAAG,GAAG;AACpC,wBAAM,IAAI,MAAM,yCAAyC;AAAA,gBAC3D;AACA,4BAAY,IAAI;AAChB,sBAAM,UAAU,kBAAkB;AAClC,6BAAa,SAASA,MAAK;AAC3B,6BAAa,UAAU,eAAe,GAAG;AACzC,kBAAE,4CAA4C,KAAK,KAAK,CAAC,CAAC;AAC1D,uBAAO,cAAc,KAAK,IAAI;AAAA,cAChC;AAAA,cACA,OAAO;AACL,4BAAY,IAAI;AAChB,kBAAE,yBAAyB,KAAK,KAAK,CAAC,CAAC;AACvC,uBAAO,IAAI,WAAW,UAAU,KAAK,IAAI;AAAA,cAC3C;AAAA,cACA,WAAW;AACT,4BAAY,IAAI;AAChB,sBAAM,UAAU,EAAE,wBAAwB,KAAK,KAAK,CAAC,CAAC;AACtD,sBAAM,SAAS,cAAc,OAAO;AACpC,kBAAE,MAAM,OAAO;AACf,uBAAO;AAAA,cACT;AAAA,YACF;AAAA,YACA,MAAM,WAAW;AAAA,cACf,YAAY,UAAU,MAAM;AAC1B,+BAAe,QAAQ;AACvB,qBAAK,OAAO;AACZ,oCAAoB,IAAI;AAAA,cAC1B;AAAA,cACA,SAAS;AACP,kCAAkB,IAAI;AACtB,kBAAE,4BAA4B,KAAK,KAAK,CAAC,CAAC;AAC1C,qBAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI;AAAA,cAChC;AAAA,cACA,MAAM,MAAM;AACV,4BAAY,IAAI;AAChB,kCAAkB,MAAM,kBAAkB,YAAY;AACtD,kBAAE,2BAA2B,KAAK,KAAK,CAAC,CAAC;AACzC,oCAAoB,IAAI;AAAA,cAC1B;AAAA,cACA,QAAQ,QAAQ;AACd,kCAAkB,MAAM,eAAe;AACvC,kCAAkB,QAAQ,kBAAkB,cAAc;AAC1D,kBAAE,8BAA8B,KAAK,KAAK,CAAC,GAAG,OAAO,KAAK,CAAC,CAAC;AAC5D,oCAAoB,IAAI;AAAA,cAC1B;AAAA,cACA,IAAI,WAAW;AACb,uBAAO,KAAK,KAAK,SAAS,MAAM,KAAK,UAAU,KAAK;AAAA,cACtD;AAAA,cACA,IAAI,aAAa;AACf,kCAAkB,IAAI;AACtB,uBAAO,EAAE,0CAA0C,KAAK,KAAK,CAAC,CAAC;AAAA,cACjE;AAAA,cACA,IAAI,cAAc;AAChB,kCAAkB,IAAI;AACtB,uBAAO,EAAE,2CAA2C,KAAK,KAAK,CAAC,CAAC;AAAA,cAClE;AAAA,cACA,IAAI,SAAS;AACX,kCAAkB,IAAI;AACtB,uBAAO,EAAE,qCAAqC,KAAK,KAAK,CAAC,CAAC;AAAA,cAC5D;AAAA,cACA,IAAI,cAAc;AAChB,kCAAkB,IAAI;AACtB,uBAAO,EAAE,2CAA2C,KAAK,KAAK,CAAC,CAAC,MAAM;AAAA,cACxE;AAAA,cACA,IAAI,gBAAgB;AAClB,kCAAkB,IAAI;AACtB,uBAAO,EAAE,6CAA6C,KAAK,KAAK,CAAC,CAAC,MAAM;AAAA,cAC1E;AAAA,cACA,IAAI,WAAW;AACb,kCAAkB,IAAI;AACtB,sBAAM,aAAa,EAAE,iCAAiC,KAAK,KAAK,CAAC,CAAC;AAClE,sBAAM,WAAW,EAAE,+BAA+B,KAAK,KAAK,CAAC,CAAC;AAC9D,uBAAO,QAAQ,KAAK,MAAM,YAAY,QAAQ;AAAA,cAChD;AAAA,cACA,IAAI,gBAAgB;AAClB,kCAAkB,IAAI;AACtB,kBAAE,oCAAoC,KAAK,KAAK,CAAC,CAAC;AAClD,uBAAO,eAAe,eAAe;AAAA,cACvC;AAAA,cACA,IAAI,cAAc;AAChB,kCAAkB,IAAI;AACtB,kBAAE,kCAAkC,KAAK,KAAK,CAAC,CAAC;AAChD,uBAAO,eAAe,eAAe;AAAA,cACvC;AAAA,cACA,IAAI,aAAa;AACf,kCAAkB,IAAI;AACtB,uBAAO,EAAE,iCAAiC,KAAK,KAAK,CAAC,CAAC;AAAA,cACxD;AAAA,cACA,IAAI,WAAW;AACb,kCAAkB,IAAI;AACtB,uBAAO,EAAE,+BAA+B,KAAK,KAAK,CAAC,CAAC;AAAA,cACtD;AAAA,cACA,IAAI,cAAc;AAChB,kCAAkB,IAAI;AACtB,kBAAE,kCAAkC,KAAK,KAAK,CAAC,CAAC;AAChD,uBAAO,cAAc,KAAK,IAAI;AAAA,cAChC;AAAA,cACA,IAAI,iBAAiB;AACnB,kCAAkB,IAAI;AACtB,uBAAO,EAAE,sCAAsC,KAAK,KAAK,CAAC,CAAC;AAAA,cAC7D;AAAA,cACA,IAAI,mBAAmB;AACrB,uBAAO,KAAK,KAAK,SAAS,OAAO,KAAK,cAAc;AAAA,cACtD;AAAA,cACA,IAAI,eAAe;AACjB,kCAAkB,IAAI;AACtB,uBAAO,EAAE,mCAAmC,KAAK,KAAK,CAAC,CAAC;AAAA,cAC1D;AAAA,cACA,IAAI,yBAAyB;AAC3B,kCAAkB,IAAI;AACtB,uBAAO,EAAE,8CAA8C,KAAK,KAAK,CAAC,CAAC;AAAA,cACrE;AAAA,cACA,iBAAiB;AACf,kCAAkB,IAAI;AACtB,sBAAM,SAAS,EAAE,sCAAsC,KAAK,KAAK,CAAC,CAAC;AACnE,oCAAoB,IAAI;AACxB,uBAAO,WAAW;AAAA,cACpB;AAAA,cACA,gBAAgB;AACd,kCAAkB,IAAI;AACtB,sBAAM,SAAS,EAAE,qCAAqC,KAAK,KAAK,CAAC,CAAC;AAClE,oCAAoB,IAAI;AACxB,uBAAO,WAAW;AAAA,cACpB;AAAA,cACA,uBAAuB,WAAW;AAChC,kCAAkB,IAAI;AACtB,yBAAS,kBAAkB,gBAAgB,WAAW,KAAK;AAC3D,sBAAM,SAAS,EAAE,gDAAgD,KAAK,KAAK,CAAC,CAAC;AAC7E,oCAAoB,IAAI;AACxB,uBAAO,WAAW;AAAA,cACpB;AAAA,cACA,0BAA0B,cAAc;AACtC,kCAAkB,IAAI;AACtB,6BAAa,kBAAkB,gBAAgB,YAAY;AAC3D,sBAAM,SAAS,EAAE,mDAAmD,KAAK,KAAK,CAAC,CAAC;AAChF,oCAAoB,IAAI;AACxB,uBAAO,WAAW;AAAA,cACpB;AAAA,cACA,kBAAkB;AAChB,kCAAkB,IAAI;AACtB,sBAAM,SAAS,EAAE,uCAAuC,KAAK,KAAK,CAAC,CAAC;AACpE,oCAAoB,IAAI;AACxB,uBAAO,WAAW;AAAA,cACpB;AAAA,cACA,sBAAsB;AACpB,kCAAkB,IAAI;AACtB,sBAAM,SAAS,EAAE,2CAA2C,KAAK,KAAK,CAAC,CAAC;AACxE,oCAAoB,IAAI;AACxB,uBAAO,WAAW;AAAA,cACpB;AAAA,cACA,eAAe,qBAAqB;AAClC,kCAAkB,IAAI;AACtB,kBAAE,qCAAqC,KAAK,KAAK,CAAC,GAAG,mBAAmB;AACxE,oCAAoB,IAAI;AAAA,cAC1B;AAAA,cACA,aAAa;AACX,kCAAkB,IAAI;AACtB,sBAAM,SAAS,EAAE,iCAAiC,KAAK,KAAK,CAAC,CAAC;AAC9D,oCAAoB,IAAI;AACxB,uBAAO,WAAW;AAAA,cACpB;AAAA,YACF;AAAA,YACA,MAAM,SAAS;AAAA,cACb,YAAY,UAAU,SAAS;AAC7B,+BAAe,QAAQ;AACvB,qBAAK,CAAC,IAAI;AACV,qBAAK,QAAQ,IAAI,MAAM,EAAE,0BAA0B,KAAK,CAAC,CAAC,CAAC;AAC3D,yBAAST,KAAI,GAAG,IAAI,KAAK,MAAM,QAAQA,KAAI,GAAGA,MAAK;AACjD,sBAAI,EAAE,yBAAyB,KAAK,CAAC,GAAGA,EAAC,IAAI,GAAG;AAC9C,yBAAK,MAAMA,EAAC,IAAI,aAAa,EAAE,yBAAyB,KAAK,CAAC,GAAGA,EAAC,CAAC;AAAA,kBACrE;AAAA,gBACF;AACA,qBAAK,SAAS,IAAI,MAAM,EAAE,yBAAyB,KAAK,CAAC,CAAC,IAAI,CAAC;AAC/D,yBAASA,KAAI,GAAG,IAAI,KAAK,OAAO,QAAQA,KAAI,GAAGA,MAAK;AAClD,wBAAM,YAAY,EAAE,+BAA+B,KAAK,CAAC,GAAGA,EAAC;AAC7D,sBAAI,cAAc,GAAG;AACnB,yBAAK,OAAOA,EAAC,IAAI,aAAa,SAAS;AAAA,kBACzC,OAAO;AACL,yBAAK,OAAOA,EAAC,IAAI;AAAA,kBACnB;AAAA,gBACF;AAAA,cACF;AAAA,cACA,IAAI,UAAU;AACZ,uBAAO,EAAE,qBAAqB,KAAK,CAAC,CAAC;AAAA,cACvC;AAAA,cACA,IAAI,aAAa;AACf,uBAAO,KAAK,OAAO,SAAS;AAAA,cAC9B;AAAA,cACA,IAAI,aAAa;AACf,uBAAO,EAAE,yBAAyB,KAAK,CAAC,CAAC;AAAA,cAC3C;AAAA,cACA,eAAe,WAAW;AACxB,sBAAM,SAAS,KAAK,OAAO,QAAQ,SAAS;AAC5C,oBAAI,WAAW,IAAI;AACjB,yBAAO;AAAA,gBACT,OAAO;AACL,yBAAO;AAAA,gBACT;AAAA,cACF;AAAA,cACA,eAAe,SAAS;AACtB,uBAAO,KAAK,OAAO,OAAO,KAAK;AAAA,cACjC;AAAA,cACA,cAAc,MAAM,OAAO;AACzB,sBAAM,aAAa,gBAAgB,IAAI;AACvC,sBAAM,cAAc,EAAE,QAAQ,aAAa,CAAC;AAC5C,6BAAa,MAAM,aAAa,aAAa,CAAC;AAC9C,sBAAM,SAAS,EAAE,6BAA6B,KAAK,CAAC,GAAG,aAAa,YAAY,KAAK;AACrF,kBAAE,MAAM,WAAW;AACnB,uBAAO,UAAU;AAAA,cACnB;AAAA,cACA,IAAI,gBAAgB;AAClB,uBAAO,EAAE,0BAA0B,KAAK,CAAC,CAAC;AAAA,cAC5C;AAAA,cACA,cAAc,QAAQ;AACpB,sBAAMD,QAAO,EAAE,yBAAyB,KAAK,CAAC,GAAG,MAAM;AACvD,uBAAOA,QAAO,aAAaA,KAAI,IAAI;AAAA,cACrC;AAAA,cACA,gBAAgB,QAAQ;AACtB,uBAAO,EAAE,gCAAgC,KAAK,CAAC,GAAG,MAAM,IAAI,OAAO;AAAA,cACrE;AAAA,cACA,kBAAkB,QAAQ;AACxB,uBAAO,EAAE,kCAAkC,KAAK,CAAC,GAAG,MAAM,IAAI,OAAO;AAAA,cACvE;AAAA,cACA,UAAU,SAAS,QAAQ;AACzB,uBAAO,EAAE,wBAAwB,KAAK,CAAC,GAAG,SAAS,MAAM;AAAA,cAC3D;AAAA,cACA,kBAAkB,SAAS;AACzB,sBAAM,UAAU,EAAE,2BAA2B,KAAK,CAAC,GAAG,OAAO;AAC7D,oBAAI,QAAS,QAAO,IAAI,kBAAkB,UAAU,SAAS,IAAI;AACjE,uBAAO;AAAA,cACT;AAAA,cACA,MAAM,QAAQ;AACZ,sBAAM,eAAe,gBAAgB,MAAM;AAC3C,sBAAM,gBAAgB,EAAE,QAAQ,eAAe,CAAC;AAChD,6BAAa,QAAQ,eAAe,eAAe,CAAC;AACpD,sBAAM,UAAU,EAAE,cAAc,KAAK,CAAC,GAAG,eAAe,cAAc,iBAAiB,kBAAkB,WAAW;AACpH,oBAAI,CAAC,SAAS;AACZ,wBAAM,UAAU,SAAS,kBAAkB,aAAa,KAAK;AAC7D,wBAAM,YAAY,SAAS,iBAAiB,KAAK;AACjD,wBAAM,aAAa,aAAa,eAAe,SAAS,EAAE;AAC1D,wBAAM,SAAS,OAAO,OAAO,YAAY,GAAG,EAAE,MAAM,IAAI,EAAE,CAAC;AAC3D,sBAAI,OAAO,OAAO,MAAM,gBAAgB,EAAE,CAAC;AAC3C,sBAAI;AACJ,0BAAQ,SAAS;AAAA,oBAChB,KAAK;AACJ,8BAAQ,IAAI,WAAW,kBAAkB,IAAI,GAAG;AAChD;AAAA,oBAED,KAAK;AACJ,8BAAQ,IAAI,WAAW,mBAAmB,IAAI,GAAG;AACjD;AAAA,oBAED,KAAK;AACJ,8BAAQ,IAAI,WAAW,qBAAqB,IAAI,EAAE;AAClD;AAAA,oBAED,KAAK;AACJ,8BAAQ,IAAI,UAAU,mCAAmC,UAAU,MAAM,MAAM,MAAM;AACrF,6BAAO;AACP;AAAA,oBAED;AACC,8BAAQ,IAAI,YAAY,wBAAwB,UAAU,MAAM,MAAM,MAAM;AAC5E,6BAAO;AACP;AAAA,kBACF;AACA,wBAAM,QAAQ;AACd,wBAAM,SAAS,KAAK;AACpB,oBAAE,MAAM,aAAa;AACrB,wBAAM;AAAA,gBACR;AACA,sBAAM,cAAc,EAAE,uBAAuB,OAAO;AACpD,sBAAM,eAAe,EAAE,wBAAwB,OAAO;AACtD,sBAAM,eAAe,EAAE,wBAAwB,OAAO;AACtD,sBAAM,eAAe,IAAI,MAAM,YAAY;AAC3C,sBAAM,eAAe,IAAI,MAAM,WAAW;AAC1C,yBAASC,KAAI,GAAGA,KAAI,cAAcA,MAAK;AACrC,wBAAM,cAAc,EAAE,8BAA8B,SAASA,IAAG,eAAe;AAC/E,wBAAM,aAAa,SAAS,iBAAiB,KAAK;AAClD,+BAAaA,EAAC,IAAI,aAAa,aAAa,UAAU;AAAA,gBACxD;AACA,yBAASA,KAAI,GAAGA,KAAI,aAAaA,MAAK;AACpC,wBAAM,eAAe,EAAE,8BAA8B,SAASA,IAAG,eAAe;AAChF,wBAAM,aAAa,SAAS,iBAAiB,KAAK;AAClD,+BAAaA,EAAC,IAAI,aAAa,cAAc,UAAU;AAAA,gBACzD;AACA,sBAAM,gBAAgB,IAAI,MAAM,YAAY;AAC5C,sBAAM,qBAAqB,IAAI,MAAM,YAAY;AACjD,sBAAM,oBAAoB,IAAI,MAAM,YAAY;AAChD,sBAAM,aAAa,IAAI,MAAM,YAAY;AACzC,sBAAM,iBAAiB,IAAI,MAAM,YAAY;AAC7C,yBAASA,KAAI,GAAGA,KAAI,cAAcA,MAAK;AACrC,wBAAM,oBAAoB,EAAE,iCAAiC,SAASA,IAAG,eAAe;AACxF,wBAAM,YAAY,SAAS,iBAAiB,KAAK;AACjD,6BAAWA,EAAC,IAAI,CAAC;AACjB,iCAAeA,EAAC,IAAI,CAAC;AACrB,wBAAM,QAAQ,CAAC;AACf,sBAAI,cAAc;AAClB,2BAAS,IAAI,GAAG,IAAI,WAAW,KAAK;AAClC,0BAAM,WAAW,SAAS,aAAa,KAAK;AAC5C,mCAAe;AACf,0BAAM,cAAc,SAAS,aAAa,KAAK;AAC/C,mCAAe;AACf,wBAAI,aAAa,6BAA6B;AAC5C,4BAAM,KAAK;AAAA,wBACT,MAAM;AAAA,wBACN,MAAM,aAAa,WAAW;AAAA,sBAChC,CAAC;AAAA,oBACH,WAAW,aAAa,4BAA4B;AAClD,4BAAM,KAAK;AAAA,wBACT,MAAM;AAAA,wBACN,OAAO,aAAa,WAAW;AAAA,sBACjC,CAAC;AAAA,oBACH,WAAW,MAAM,SAAS,GAAG;AAC3B,0BAAI,MAAM,CAAC,EAAE,SAAS,UAAU;AAC9B,8BAAM,IAAI,MAAM,4CAA4C;AAAA,sBAC9D;AACA,4BAAM,WAAW,MAAM,CAAC,EAAE;AAC1B,0BAAI,aAAa;AACjB,0BAAI,WAAW;AACf,0BAAI;AACJ,8BAAQ,UAAU;AAAA,wBACjB,KAAK;AAAA,wBACL,KAAK;AACJ,uCAAa;AAAA,wBAEd,KAAK;AAAA,wBACL,KAAK;AACJ,8BAAI,MAAM,WAAW,GAAG;AACtB,kCAAM,IAAI,MAAM,mCAAmC,QAAQ,iCAAiC,MAAM,SAAS,CAAC,EAAE;AAAA,0BAChH;AACA,8BAAI,MAAM,CAAC,EAAE,SAAS,WAAW;AAC/B,kCAAM,IAAI,MAAM,wBAAwB,QAAQ,wCAAwC,MAAM,CAAC,EAAE,KAAK,GAAG;AAAA,0BAC3G;AACA,qCAAW,CAAC,SAAS,WAAW,MAAM;AACtC,8BAAI,MAAM,CAAC,EAAE,SAAS,WAAW;AAC/B,kCAAM,eAAe,MAAM,CAAC,EAAE;AAC9B,kCAAM,eAAe,MAAM,CAAC,EAAE;AAC9B,2CAAeA,EAAC,EAAE,KAAK,cAAY;AACjC,oCAAM,SAAS,CAAC;AAChB,oCAAM,SAAS,CAAC;AAChB,yCAAW,KAAK,UAAU;AACxB,oCAAI,EAAE,SAAS,aAAc,QAAO,KAAK,EAAE,IAAI;AAC/C,oCAAI,EAAE,SAAS,aAAc,QAAO,KAAK,EAAE,IAAI;AAAA,8BACjD;AACA,oCAAM,UAAU,CAAC,IAAI,IAAI,aAAa,WAAW,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG;AACtF,qCAAO,WAAW,OAAO,MAAM,QAAM,OAAO,KAAK,QAAM,QAAQ,IAAI,IAAI,UAAU,CAAC,CAAC,IAAI,OAAO,KAAK,QAAM,OAAO,KAAK,QAAM,QAAQ,IAAI,IAAI,UAAU,CAAC,CAAC;AAAA,4BACzJ,CAAC;AAAA,0BACH,OAAO;AACL,0CAAc,MAAM,CAAC,EAAE;AACvB,kCAAM,cAAc,MAAM,CAAC,EAAE;AAC7B,kCAAM,UAAU,OAAK,EAAE,SAAS;AAChC,kCAAM,eAAe,OAAK,EAAE,SAAS;AACrC,2CAAeA,EAAC,EAAE,KAAK,cAAY;AACjC,oCAAM,QAAQ,CAAC;AACf,yCAAW,KAAK,UAAU;AACxB,oCAAI,EAAE,SAAS,YAAa,OAAM,KAAK,EAAE,IAAI;AAAA,8BAC/C;AACA,oCAAM,OAAO,aAAa,UAAU;AACpC,qCAAO,WAAW,MAAM,MAAM,IAAI,IAAI,MAAM,KAAK,IAAI;AAAA,4BACvD,CAAC;AAAA,0BACH;AACA;AAAA,wBAED,KAAK;AAAA,wBACL,KAAK;AACJ,uCAAa;AAAA,wBAEd,KAAK;AAAA,wBACL,KAAK;AACJ,8BAAI,MAAM,WAAW,GAAG;AACtB,kCAAM,IAAI,MAAM,mCAAmC,QAAQ,iCAAiC,MAAM,SAAS,CAAC,GAAG;AAAA,0BACjH;AACA,8BAAI,MAAM,CAAC,EAAE,SAAS,WAAW;AAC/B,kCAAM,IAAI,MAAM,wBAAwB,QAAQ,wCAAwC,MAAM,CAAC,EAAE,KAAK,IAAI;AAAA,0BAC5G;AACA,8BAAI,MAAM,CAAC,EAAE,SAAS,UAAU;AAC9B,kCAAM,IAAI,MAAM,yBAAyB,QAAQ,uCAAuC,MAAM,CAAC,EAAE,KAAK,GAAG;AAAA,0BAC3G;AACA,wCAAc,MAAM,CAAC,EAAE;AACvB,gCAAM,QAAQ,IAAI,OAAO,MAAM,CAAC,EAAE,KAAK;AACvC,qCAAW,CAAC,SAAS,WAAW,MAAM;AACtC,yCAAeA,EAAC,EAAE,KAAK,cAAY;AACjC,kCAAM,QAAQ,CAAC;AACf,uCAAW,KAAK,UAAU;AACxB,kCAAI,EAAE,SAAS,YAAa,OAAM,KAAK,EAAE,KAAK,IAAI;AAAA,4BACpD;AACA,kCAAM,OAAO,CAACU,OAAM,aAAa,WAAW,MAAM,KAAKA,KAAI,IAAI,CAAC,MAAM,KAAKA,KAAI;AAC/E,gCAAI,MAAM,WAAW,EAAG,QAAO,CAAC;AAChC,mCAAO,WAAW,MAAM,MAAM,CAAAA,UAAQ,KAAKA,OAAM,UAAU,CAAC,IAAI,MAAM,KAAK,CAAAA,UAAQ,KAAKA,OAAM,UAAU,CAAC;AAAA,0BAC3G,CAAC;AACD;AAAA,wBAED,KAAK;AACJ,8BAAI,MAAM,SAAS,KAAK,MAAM,SAAS,GAAG;AACxC,kCAAM,IAAI,MAAM,0EAA0E,MAAM,SAAS,CAAC,GAAG;AAAA,0BAC/G;AACA,8BAAI,MAAM,KAAK,OAAK,EAAE,SAAS,QAAQ,GAAG;AACxC,kCAAM,IAAI,MAAM,uDAAuD;AAAA,0BACzE;AACA,8BAAI,CAAC,cAAcV,EAAC,EAAG,eAAcA,EAAC,IAAI,CAAC;AAC3C,wCAAcA,EAAC,EAAE,MAAM,CAAC,EAAE,KAAK,IAAI,MAAM,CAAC,IAAI,MAAM,CAAC,EAAE,QAAQ;AAC/D;AAAA,wBAED,KAAK;AAAA,wBACL,KAAK;AACJ,8BAAI,MAAM,SAAS,KAAK,MAAM,SAAS,GAAG;AACxC,kCAAM,IAAI,MAAM,mCAAmC,QAAQ,sCAAsC,MAAM,SAAS,CAAC,GAAG;AAAA,0BACtH;AACA,8BAAI,MAAM,KAAK,OAAK,EAAE,SAAS,QAAQ,GAAG;AACxC,kCAAM,IAAI,MAAM,mBAAmB,QAAQ,mCAAmC;AAAA,0BAChF;AACA,gCAAM,aAAa,aAAa,QAAQ,qBAAqB;AAC7D,8BAAI,CAAC,WAAWA,EAAC,EAAG,YAAWA,EAAC,IAAI,CAAC;AACrC,qCAAWA,EAAC,EAAE,MAAM,CAAC,EAAE,KAAK,IAAI,MAAM,CAAC,IAAI,MAAM,CAAC,EAAE,QAAQ;AAC5D;AAAA,wBAED,KAAK;AACJ,uCAAa;AAAA,wBAEd,KAAK;AACJ,8BAAI,MAAM,SAAS,GAAG;AACpB,kCAAM,IAAI,MAAM,mCAAmC,QAAQ,0CAA0C,MAAM,SAAS,CAAC,GAAG;AAAA,0BAC1H;AACA,8BAAI,MAAM,CAAC,EAAE,SAAS,WAAW;AAC/B,kCAAM,IAAI,MAAM,wBAAwB,QAAQ,wCAAwC,MAAM,CAAC,EAAE,KAAK,IAAI;AAAA,0BAC5G;AACA,mCAASA,KAAI,GAAGA,KAAI,MAAM,QAAQA,MAAK;AACrC,gCAAI,MAAMA,EAAC,EAAE,SAAS,UAAU;AAC9B,oCAAM,IAAI,MAAM,mBAAmB,QAAQ,mCAAmC;AAAA,4BAChF;AAAA,0BACF;AACA,wCAAc,MAAM,CAAC,EAAE;AACvB,gCAAM,SAAS,MAAM,MAAM,CAAC,EAAE,IAAI,OAAK,EAAE,KAAK;AAC9C,yCAAeA,EAAC,EAAE,KAAK,cAAY;AACjC,kCAAM,QAAQ,CAAC;AACf,uCAAW,KAAK,UAAU;AACxB,kCAAI,EAAE,SAAS,YAAa,OAAM,KAAK,EAAE,KAAK,IAAI;AAAA,4BACpD;AACA,gCAAI,MAAM,WAAW,EAAG,QAAO,CAAC;AAChC,mCAAO,MAAM,MAAM,CAAAU,UAAQ,OAAO,SAASA,KAAI,CAAC,MAAM;AAAA,0BACxD,CAAC;AACD;AAAA,wBAED;AACC,qCAAWV,EAAC,EAAE,KAAK;AAAA,4BACjB;AAAA,4BACA,UAAU,MAAM,MAAM,CAAC;AAAA,0BACzB,CAAC;AAAA,sBACH;AACA,4BAAM,SAAS;AAAA,oBACjB;AAAA,kBACF;AACA,yBAAO,OAAO,cAAcA,EAAC,CAAC;AAC9B,yBAAO,OAAO,mBAAmBA,EAAC,CAAC;AACnC,yBAAO,OAAO,kBAAkBA,EAAC,CAAC;AAAA,gBACpC;AACA,kBAAE,MAAM,aAAa;AACrB,uBAAO,IAAI,MAAM,UAAU,SAAS,cAAc,gBAAgB,YAAY,OAAO,OAAO,aAAa,GAAG,OAAO,OAAO,kBAAkB,GAAG,OAAO,OAAO,iBAAiB,CAAC;AAAA,cACjL;AAAA,cACA,OAAO,KAAK,OAAO;AACjB,oBAAI;AACJ,oBAAI,iBAAiB,YAAY;AAC/B,0BAAQ,QAAQ,QAAQ,KAAK;AAAA,gBAC/B,OAAO;AACL,wBAAM,MAAM;AACZ,sBAAI,OAAO,YAAY,eAAe,QAAQ,YAAY,QAAQ,SAAS,MAAM;AAC/E,0BAAMW,MAAK,UAAQ,IAAI;AACvB,4BAAQ,QAAQ,QAAQA,IAAG,aAAa,GAAG,CAAC;AAAA,kBAC9C,OAAO;AACL,4BAAQ,MAAM,GAAG,EAAE,KAAK,cAAY,SAAS,YAAY,EAAE,KAAK,YAAU;AACxE,0BAAI,SAAS,IAAI;AACf,+BAAO,IAAI,WAAW,MAAM;AAAA,sBAC9B,OAAO;AACL,8BAAMC,QAAO,IAAI,YAAY,OAAO,EAAE,OAAO,MAAM;AACnD,8BAAM,IAAI,MAAM,oCAAoC,SAAS,MAAM;AAAA;AAAA,EAAQA,KAAI,EAAE;AAAA,sBACnF;AAAA,oBACF,CAAC,CAAC;AAAA,kBACJ;AAAA,gBACF;AACA,uBAAO,MAAM,KAAK,CAAAC,WAAS,sBAAsBA,QAAO;AAAA,kBACtD,WAAW;AAAA,gBACb,CAAC,CAAC,EAAE,KAAK,SAAO;AACd,wBAAM,cAAc,OAAO,KAAK,GAAG;AACnC,wBAAM,eAAe,YAAY,KAAK,SAAO,wBAAwB,KAAK,GAAG,KAAK,CAAC,IAAI,SAAS,mBAAmB,CAAC;AACpH,sBAAI,CAAC,cAAc;AACjB,4BAAQ,IAAI;AAAA,EAA2D,KAAK,UAAU,aAAa,MAAM,CAAC,CAAC,EAAE;AAAA,kBAC/G;AACA,wBAAM,kBAAkB,IAAI,YAAY,EAAE;AAC1C,yBAAO,IAAI,SAAS,UAAU,eAAe;AAAA,gBAC/C,CAAC;AAAA,cACH;AAAA,YACF;AAAA,YACA,MAAM,kBAAkB;AAAA,cACtB,YAAY,UAAU,SAAS,UAAU;AACvC,+BAAe,QAAQ;AACvB,qBAAK,CAAC,IAAI;AACV,qBAAK,WAAW;AAAA,cAClB;AAAA,cACA,IAAI,gBAAgB;AAClB,uBAAO,EAAE,sCAAsC,KAAK,CAAC,CAAC;AAAA,cACxD;AAAA,cACA,IAAI,cAAc;AAChB,uBAAO,KAAK,SAAS,MAAM,KAAK,aAAa,KAAK;AAAA,cACpD;AAAA,cACA,SAAS;AACP,kBAAE,8BAA8B,KAAK,CAAC,CAAC;AACvC,qBAAK,CAAC,IAAI;AAAA,cACZ;AAAA,cACA,WAAW,SAAS;AAClB,uBAAO,EAAE,mCAAmC,KAAK,CAAC,GAAG,OAAO;AAAA,cAC9D;AAAA,cACA,MAAM,UAAU,SAAS;AACvB,oBAAI,EAAE,6BAA6B,KAAK,CAAC,GAAG,SAAS,CAAC,GAAG,OAAO,GAAG;AACjE,uBAAK,WAAW;AAChB,yBAAO;AAAA,gBACT;AACA,uBAAO;AAAA,cACT;AAAA,cACA,CAAC,OAAO,QAAQ,IAAI;AAClB,sBAAMC,QAAO;AACb,uBAAO;AAAA,kBACL,OAAO;AACL,wBAAI,EAAE,4BAA4BA,MAAK,CAAC,CAAC,GAAG;AAC1C,6BAAO;AAAA,wBACL,MAAM;AAAA,wBACN,OAAOA,MAAK;AAAA,sBACd;AAAA,oBACF;AACA,2BAAO;AAAA,sBACL,MAAM;AAAA,sBACN,OAAO;AAAA,oBACT;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,YACA,MAAM,MAAM;AAAA,cACV,YAAY,UAAU,SAAS,cAAc,gBAAgB,YAAY,eAAe,oBAAoB,mBAAmB;AAC7H,+BAAe,QAAQ;AACvB,qBAAK,CAAC,IAAI;AACV,qBAAK,eAAe;AACpB,qBAAK,iBAAiB;AACtB,qBAAK,aAAa;AAClB,qBAAK,gBAAgB;AACrB,qBAAK,qBAAqB;AAC1B,qBAAK,oBAAoB;AACzB,qBAAK,qBAAqB;AAAA,cAC5B;AAAA,cACA,SAAS;AACP,kBAAE,iBAAiB,KAAK,CAAC,CAAC;AAC1B,qBAAK,CAAC,IAAI;AAAA,cACZ;AAAA,cACA,QAAQ,MAAM,EAAC,gBAA+B,YAAY,cAA2B,YAAY,aAAyB,GAAG,WAAqB,GAAG,aAAyB,YAAY,gBAA+B,YAAY,gBAA+B,EAAC,IAAI,CAAC,GAAG;AAC3Q,oBAAI,OAAO,eAAe,UAAU;AAClC,wBAAM,IAAI,MAAM,2BAA2B;AAAA,gBAC7C;AACA,4BAAY,IAAI;AAChB,kBAAE,uBAAuB,KAAK,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,cAAc,KAAK,cAAc,QAAQ,YAAY,KAAK,YAAY,QAAQ,YAAY,UAAU,YAAY,eAAe,aAAa;AAC5L,sBAAM,WAAW,SAAS,iBAAiB,KAAK;AAChD,sBAAM,eAAe,SAAS,kBAAkB,aAAa,KAAK;AAClE,sBAAM,sBAAsB,SAAS,kBAAkB,IAAI,aAAa,KAAK;AAC7E,sBAAM,SAAS,IAAI,MAAM,QAAQ;AACjC,qBAAK,qBAAqB,QAAQ,mBAAmB;AACrD,oBAAI,gBAAgB;AACpB,oBAAI,UAAU;AACd,yBAASd,KAAI,GAAGA,KAAI,UAAUA,MAAK;AACjC,wBAAM,UAAU,SAAS,SAAS,KAAK;AACvC,6BAAW;AACX,wBAAM,eAAe,SAAS,SAAS,KAAK;AAC5C,6BAAW;AACX,wBAAM,WAAW,IAAI,MAAM,YAAY;AACvC,4BAAU,kBAAkB,MAAM,KAAK,MAAM,SAAS,QAAQ;AAC9D,sBAAI,KAAK,eAAe,OAAO,EAAE,MAAM,OAAK,EAAE,QAAQ,CAAC,GAAG;AACxD,2BAAO,aAAa,IAAI;AAAA,sBACtB;AAAA,sBACA;AAAA,oBACF;AACA,0BAAM,gBAAgB,KAAK,cAAc,OAAO;AAChD,wBAAI,cAAe,QAAO,aAAa,EAAE,gBAAgB;AACzD,0BAAM,qBAAqB,KAAK,mBAAmB,OAAO;AAC1D,wBAAI,mBAAoB,QAAO,aAAa,EAAE,qBAAqB;AACnE,0BAAM,oBAAoB,KAAK,kBAAkB,OAAO;AACxD,wBAAI,kBAAmB,QAAO,aAAa,EAAE,oBAAoB;AACjE;AAAA,kBACF;AAAA,gBACF;AACA,uBAAO,SAAS;AAChB,kBAAE,MAAM,YAAY;AACpB,uBAAO;AAAA,cACT;AAAA,cACA,SAAS,MAAM,EAAC,gBAA+B,YAAY,cAA2B,YAAY,aAAyB,GAAG,WAAqB,GAAG,aAAyB,YAAY,gBAA+B,YAAY,gBAA+B,EAAC,IAAI,CAAC,GAAG;AAC5Q,oBAAI,OAAO,eAAe,UAAU;AAClC,wBAAM,IAAI,MAAM,2BAA2B;AAAA,gBAC7C;AACA,4BAAY,IAAI;AAChB,kBAAE,wBAAwB,KAAK,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,cAAc,KAAK,cAAc,QAAQ,YAAY,KAAK,YAAY,QAAQ,YAAY,UAAU,YAAY,eAAe,aAAa;AAC7L,sBAAM,QAAQ,SAAS,iBAAiB,KAAK;AAC7C,sBAAM,eAAe,SAAS,kBAAkB,aAAa,KAAK;AAClE,sBAAM,sBAAsB,SAAS,kBAAkB,IAAI,aAAa,KAAK;AAC7E,sBAAM,SAAS,CAAC;AAChB,qBAAK,qBAAqB,QAAQ,mBAAmB;AACrD,sBAAM,WAAW,CAAC;AAClB,oBAAI,UAAU;AACd,yBAASA,KAAI,GAAGA,KAAI,OAAOA,MAAK;AAC9B,wBAAM,UAAU,SAAS,SAAS,KAAK;AACvC,6BAAW;AACX,wBAAM,eAAe,SAAS,SAAS,KAAK;AAC5C,6BAAW;AACX,wBAAM,eAAe,SAAS,SAAS,KAAK;AAC5C,6BAAW;AACX,2BAAS,SAAS;AAClB,4BAAU,kBAAkB,MAAM,KAAK,MAAM,SAAS,QAAQ;AAC9D,sBAAI,KAAK,eAAe,OAAO,EAAE,MAAM,OAAK,EAAE,QAAQ,CAAC,GAAG;AACxD,0BAAM,UAAU,SAAS,YAAY;AACrC,0BAAM,gBAAgB,KAAK,cAAc,OAAO;AAChD,wBAAI,cAAe,SAAQ,gBAAgB;AAC3C,0BAAM,qBAAqB,KAAK,mBAAmB,OAAO;AAC1D,wBAAI,mBAAoB,SAAQ,qBAAqB;AACrD,0BAAM,oBAAoB,KAAK,kBAAkB,OAAO;AACxD,wBAAI,kBAAmB,SAAQ,oBAAoB;AACnD,2BAAO,KAAK,OAAO;AAAA,kBACrB;AAAA,gBACF;AACA,kBAAE,MAAM,YAAY;AACpB,uBAAO;AAAA,cACT;AAAA,cACA,qBAAqB,cAAc;AACjC,uBAAO,KAAK,WAAW,YAAY;AAAA,cACrC;AAAA,cACA,eAAe,aAAa;AAC1B,sBAAM,oBAAoB,gBAAgB,WAAW;AACrD,sBAAM,qBAAqB,EAAE,QAAQ,oBAAoB,CAAC;AAC1D,6BAAa,aAAa,oBAAoB,oBAAoB,CAAC;AACnE,kBAAE,0BAA0B,KAAK,CAAC,GAAG,oBAAoB,iBAAiB;AAC1E,kBAAE,MAAM,kBAAkB;AAAA,cAC5B;AAAA,cACA,sBAAsB;AACpB,uBAAO,KAAK;AAAA,cACd;AAAA,YACF;AACA,qBAAS,QAAQ,MAAM,YAAY,UAAU;AAC3C,oBAAM,SAAS,WAAW;AAC1B,kBAAI,SAAS,KAAK,aAAa,YAAY,MAAM,QAAQ;AACzD,4BAAc,OAAO;AACrB,qBAAO,aAAa,UAAU;AAC5B,sBAAM,SAAS,KAAK,aAAa,YAAY,MAAM,QAAQ;AAC3D,oBAAI,UAAU,OAAO,SAAS,GAAG;AAC/B,gCAAc,OAAO;AACrB,4BAAU;AAAA,gBACZ,OAAO;AACL;AAAA,gBACF;AAAA,cACF;AACA,kBAAI,aAAa,UAAU;AACzB,yBAAS,OAAO,MAAM,GAAG,MAAM;AAAA,cACjC;AACA,qBAAO;AAAA,YACT;AACA,qBAAS,kBAAkBe,QAAO,MAAM,SAAS,QAAQ;AACvD,uBAASf,KAAI,GAAG,IAAI,OAAO,QAAQA,KAAI,GAAGA,MAAK;AAC7C,sBAAM,eAAe,SAAS,SAAS,KAAK;AAC5C,2BAAW;AACX,sBAAM,OAAO,cAAc,MAAM,OAAO;AACxC,2BAAW;AACX,uBAAOA,EAAC,IAAI;AAAA,kBACV,MAAMe,OAAM,aAAa,YAAY;AAAA,kBACrC;AAAA,gBACF;AAAA,cACF;AACA,qBAAO;AAAA,YACT;AACA,qBAAS,eAAe,GAAG;AACzB,kBAAI,MAAM,SAAU,OAAM,IAAI,MAAM,qBAAqB;AAAA,YAC3D;AACA,qBAAS,QAAQ,OAAO;AACtB,qBAAQ,SAAS,OAAO,MAAM,QAAQ,YAAY,OAAO,MAAM,WAAW;AAAA,YAC5E;AACA,qBAAS,YAAY,MAAM;AACzB,kBAAI,UAAU;AACd,uBAAS,SAAS,KAAK,IAAI,KAAK;AAChC,yBAAW;AACX,uBAAS,SAAS,KAAK,YAAY,KAAK;AACxC,yBAAW;AACX,uBAAS,SAAS,KAAK,cAAc,KAAK,KAAK;AAC/C,yBAAW;AACX,uBAAS,SAAS,KAAK,cAAc,QAAQ,KAAK;AAClD,yBAAW;AACX,uBAAS,SAAS,KAAK,CAAC,GAAG,KAAK;AAAA,YAClC;AACA,qBAAS,cAAc,MAAM,UAAU,iBAAiB;AACtD,oBAAM,KAAK,SAAS,SAAS,KAAK;AAClC,yBAAW;AACX,kBAAI,OAAO,EAAG,QAAO;AACrB,oBAAM,QAAQ,SAAS,SAAS,KAAK;AACrC,yBAAW;AACX,oBAAM,MAAM,SAAS,SAAS,KAAK;AACnC,yBAAW;AACX,oBAAM,SAAS,SAAS,SAAS,KAAK;AACtC,yBAAW;AACX,oBAAM,QAAQ,SAAS,SAAS,KAAK;AACrC,oBAAM,SAAS,IAAI,KAAK,UAAU,IAAI;AACtC,qBAAO,KAAK;AACZ,qBAAO,aAAa;AACpB,qBAAO,gBAAgB;AAAA,gBACrB;AAAA,gBACA;AAAA,cACF;AACA,qBAAO,CAAC,IAAI;AACZ,qBAAO;AAAA,YACT;AACA,qBAAS,kBAAkB,QAAQ,UAAU,iBAAiB;AAC5D,uBAAS,UAAU,IAAI,aAAa,OAAO,CAAC,GAAG,KAAK;AACpD,uBAAS,UAAU,IAAI,aAAa,OAAO,CAAC,GAAG,KAAK;AACpD,uBAAS,UAAU,IAAI,aAAa,OAAO,CAAC,GAAG,KAAK;AACpD,uBAAS,UAAU,IAAI,aAAa,OAAO,CAAC,GAAG,KAAK;AAAA,YACtD;AACA,qBAAS,oBAAoB,QAAQ;AACnC,qBAAO,CAAC,IAAI,SAAS,kBAAkB,IAAI,aAAa,KAAK;AAC7D,qBAAO,CAAC,IAAI,SAAS,kBAAkB,IAAI,aAAa,KAAK;AAC7D,qBAAO,CAAC,IAAI,SAAS,kBAAkB,IAAI,aAAa,KAAK;AAC7D,qBAAO,CAAC,IAAI,SAAS,kBAAkB,IAAI,aAAa,KAAK;AAAA,YAC/D;AACA,qBAAS,aAAa,SAAS,OAAO;AACpC,uBAAS,SAAS,MAAM,KAAK,KAAK;AAClC,uBAAS,UAAU,aAAa,MAAM,QAAQ,KAAK;AAAA,YACrD;AACA,qBAAS,eAAe,SAAS;AAC/B,oBAAM,SAAS;AAAA,gBACb,KAAK,SAAS,SAAS,KAAK,MAAM;AAAA,gBAClC,QAAQ,SAAS,UAAU,aAAa,KAAK,MAAM;AAAA,cACrD;AACA,qBAAO;AAAA,YACT;AACA,qBAAS,aAAa,SAAS,OAAO;AACpC,2BAAa,SAAS,MAAM,aAAa;AACzC,yBAAW;AACX,2BAAa,SAAS,MAAM,WAAW;AACvC,yBAAW;AACX,uBAAS,SAAS,MAAM,YAAY,KAAK;AACzC,yBAAW;AACX,uBAAS,SAAS,MAAM,UAAU,KAAK;AACvC,yBAAW;AAAA,YACb;AACA,qBAAS,eAAe,SAAS;AAC/B,oBAAM,SAAS,CAAC;AAChB,qBAAO,gBAAgB,eAAe,OAAO;AAC7C,yBAAW;AACX,qBAAO,cAAc,eAAe,OAAO;AAC3C,yBAAW;AACX,qBAAO,aAAa,SAAS,SAAS,KAAK,MAAM;AACjD,yBAAW;AACX,qBAAO,WAAW,SAAS,SAAS,KAAK,MAAM;AAC/C,qBAAO;AAAA,YACT;AACA,qBAAS,YAAY,MAAM;AACzB,kBAAI,UAAU;AACd,2BAAa,SAAS,KAAK,aAAa;AACxC,yBAAW;AACX,2BAAa,SAAS,KAAK,cAAc;AACzC,yBAAW;AACX,2BAAa,SAAS,KAAK,cAAc;AACzC,yBAAW;AACX,uBAAS,SAAS,KAAK,YAAY,KAAK;AACxC,yBAAW;AACX,uBAAS,SAAS,KAAK,aAAa,KAAK;AACzC,yBAAW;AACX,uBAAS,SAAS,KAAK,aAAa,KAAK;AACzC,yBAAW;AAAA,YACb;AAGA,uBAAWhB,SAAQ,OAAO,oBAAoB,WAAW,SAAS,GAAG;AACnE,qBAAO,eAAe,OAAO,WAAWA,OAAM;AAAA,gBAC5C,OAAO,WAAW,UAAUA,KAAI;AAAA,gBAChC,YAAY;AAAA,gBACZ,UAAU;AAAA,cACZ,CAAC;AAAA,YACH;AACA,mBAAO,WAAW;AAClB,mBAAO,uBAAuB,MAAM;AAClC,yBAAW,KAAK;AAChB,iCAAmB;AAAA,YACrB;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AACA,aAAO;AAAA,IACT,GAAE;AAEF,QAAI,OAAO,YAAY,UAAU;AAC/B,aAAO,UAAU;AAAA,IACnB;AAAA;AAAA;;;AC7sGA,SAAS,qBAAqB,gBAAAiB,qBAAoB;;;ACS3C,IAAM,SAAN,MAAM,QAAO;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,SAAuB,CAAC,GAAG;AACrC,SAAK,eAAe,OAAO,SAAS;AACpC,SAAK,SAAS,OAAO,UAAU;AAC/B,SAAK,QAAQ,OAAO,SAAS;AAC7B,SAAK,QAAQ,OAAO;AAAA,EACtB;AAAA,EAEQ,cACN,OACA,SACA,MACQ;AACR,UAAM,aAAY,oBAAI,KAAK,GAAE,YAAY;AACzC,UAAM,OAAO,GAAG,SAAS,IAAI,KAAK,MAAM,KAAK,KAAK,KAAK,OAAO;AAE9D,QAAI,SAAS,QAAW;AACtB,aAAO,GAAG,IAAI,IAAI,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA,IACjD;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,QAAQ,OAAqB,SAAiB,MAAgB;AACpE,QAAI,KAAK,OAAO;AACd,WAAK,MAAM,OAAO,KAAK,OAAO,SAAS,IAAI;AAC3C;AAAA,IACF;AAEA,UAAM,YAAY,KAAK,gBAAgB,UAAU;AAEjD,QAAI,WAAW;AACb,cAAQ,KAAK,EAAE,KAAK,cAAc,MAAM,YAAY,GAAG,SAAS,IAAI,CAAC;AAAA,IACvE;AAAA,EACF;AAAA,EAEA,MAAM,SAAiB,OAAyB;AAC9C,UAAM,OACJ,iBAAiB,QACb,EAAE,SAAS,MAAM,SAAS,OAAO,MAAM,MAAM,IAC7C;AAEN,SAAK,QAAQ,SAAS,SAAS,IAAI;AAAA,EACrC;AAAA,EAEA,KAAK,SAAiB,MAAgB;AACpC,SAAK,QAAQ,QAAQ,SAAS,IAAI;AAAA,EACpC;AAAA,EAEA,KAAK,SAAiB,MAAgB;AACpC,SAAK,QAAQ,QAAQ,SAAS,IAAI;AAAA,EACpC;AAAA,EAEA,MAAM,SAAiB,MAAgB;AACrC,SAAK,QAAQ,SAAS,SAAS,IAAI;AAAA,EACrC;AAAA,EAEA,MAAM,aAA6B;AACjC,WAAO,IAAI,QAAO;AAAA,MAChB,OAAO,KAAK;AAAA,MACZ,QAAQ,GAAG,KAAK,MAAM,KAAK,WAAW;AAAA,MACtC,OAAO,GAAG,KAAK,KAAK,IAAI,WAAW;AAAA,MACnC,OAAO,KAAK;AAAA,IACd,CAAC;AAAA,EACH;AACF;;;AC9EA,SAAS,gBAAgB,sBAAsB;AAGxC,IAAM,WAAN,MAA8C;AAAA,EAC3C,QAAa,CAAC;AAAA,EACd,YAAoD,CAAC;AAAA,EACrD,OAAO;AAAA,EAEf,KAAK,MAAS;AACZ,UAAMC,WAAU,KAAK,UAAU,MAAM;AACrC,QAAIA,UAAS;AACX,MAAAA,SAAQ,EAAE,OAAO,MAAM,MAAM,MAAM,CAAC;AAAA,IACtC,OAAO;AACL,WAAK,MAAM,KAAK,IAAI;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,MAAM;AACJ,SAAK,OAAO;AACZ,eAAWA,YAAW,KAAK,WAAW;AACpC,MAAAA,SAAQ,EAAE,OAAO,QAA2B,MAAM,KAAK,CAAC;AAAA,IAC1D;AACA,SAAK,YAAY,CAAC;AAAA,EACpB;AAAA,EAEA,CAAC,OAAO,aAAa,IAAsB;AACzC,WAAO;AAAA,MACL,MAAM,MAAkC;AACtC,YAAI,KAAK,MAAM,SAAS,GAAG;AACzB,gBAAM,QAAQ,KAAK,MAAM,MAAM;AAC/B,iBAAO,QAAQ,QAAQ,EAAE,OAAO,MAAM,MAAM,CAAC;AAAA,QAC/C;AACA,YAAI,KAAK,MAAM;AACb,iBAAO,QAAQ,QAAQ;AAAA,YACrB,OAAO;AAAA,YACP,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AACA,eAAO,IAAI,QAA2B,CAACA,aAAY;AACjD,eAAK,UAAU,KAAKA,QAAO;AAAA,QAC7B,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;AAYA,SAAS,yBACP,UACuC;AACvC,QAAM,WAAW,SAAS,OAAO,aAAa,EAAE;AAChD,SAAO,IAAI,eAA2B;AAAA,IACpC,MAAM,KAAK,YAAY;AACrB,YAAM,EAAE,OAAO,KAAK,IAAI,MAAM,SAAS,KAAK;AAC5C,UAAI,MAAM;AACR,mBAAW,MAAM;AAAA,MACnB,OAAO;AACL,mBAAW,QAAQ,KAAK;AAAA,MAC1B;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEO,SAAS,6BAAsD;AACpE,QAAM,wBAAwB,IAAI,SAAqB;AACvD,QAAM,wBAAwB,IAAI,SAAqB;AAEvD,QAAM,wBAAwB,yBAAyB,qBAAqB;AAC5E,QAAM,wBAAwB,yBAAyB,qBAAqB;AAE5E,QAAM,wBAAwB,IAAI,eAA2B;AAAA,IAC3D,MAAM,OAAO;AACX,4BAAsB,KAAK,KAAK;AAAA,IAClC;AAAA,IACA,QAAQ;AACN,4BAAsB,IAAI;AAAA,IAC5B;AAAA,EACF,CAAC;AAED,QAAM,wBAAwB,IAAI,eAA2B;AAAA,IAC3D,MAAM,OAAO;AACX,4BAAsB,KAAK,KAAK;AAAA,IAClC;AAAA,IACA,QAAQ;AACN,4BAAsB,IAAI;AAAA,IAC5B;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,QAAQ;AAAA,MACN,UAAU;AAAA,MACV,UAAU;AAAA,IACZ;AAAA,IACA,OAAO;AAAA,MACL,UAAU;AAAA,MACV,UAAU;AAAA,IACZ;AAAA,EACF;AACF;AASO,SAAS,2BACd,YACA,SAC4B;AAC5B,QAAM,EAAE,WAAW,OAAO,IAAI;AAC9B,QAAM,UAAU,IAAI,YAAY;AAChC,MAAI,SAAS;AACb,MAAI,gBAAgB;AAEpB,SAAO,IAAI,eAAe;AAAA,IACxB,MAAM,MAAM,OAAmB;AAC7B,gBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAEhD,YAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,eAAS,MAAM,IAAI,KAAK;AAExB,iBAAW,QAAQ,OAAO;AACxB,YAAI,CAAC,KAAK,KAAK,EAAG;AAClB;AAEA,kBAAU,IAAI;AAAA,MAChB;AAEA,UAAI;AACF,cAAM,SAAS,WAAW,UAAU;AACpC,cAAM,OAAO,MAAM,KAAK;AACxB,eAAO,YAAY;AAAA,MACrB,SAASC,MAAK;AAEZ,gBAAQ,MAAM,mBAAmBA,IAAG;AAAA,MACtC;AAAA,IACF;AAAA,IACA,MAAM,QAAQ;AACZ,UAAI;AACF,cAAM,SAAS,WAAW,UAAU;AACpC,cAAM,OAAO,MAAM;AACnB,eAAO,YAAY;AAAA,MACrB,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,IACA,MAAM,MAAM,QAAiB;AAC3B,cAAQ,KAAK,yBAAyB,EAAE,OAAO,CAAC;AAChD,UAAI;AACF,cAAM,SAAS,WAAW,UAAU;AACpC,cAAM,OAAO,MAAM,MAAM;AACzB,eAAO,YAAY;AAAA,MACrB,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEO,SAAS,0BACd,YACuC;AACvC,SAAO,IAAI,eAA2B;AAAA,IACpC,MAAM,YAAY;AAChB,iBAAW,GAAG,QAAQ,CAAC,UAAkB;AACvC,mBAAW,QAAQ,IAAI,WAAW,KAAK,CAAC;AAAA,MAC1C,CAAC;AACD,iBAAW,GAAG,OAAO,MAAM;AACzB,mBAAW,MAAM;AAAA,MACnB,CAAC;AACD,iBAAW,GAAG,SAAS,CAACA,SAAQ;AAC9B,mBAAW,MAAMA,IAAG;AAAA,MACtB,CAAC;AAAA,IACH;AAAA,IACA,SAAS;AACP,iBAAW,QAAQ;AAAA,IACrB;AAAA,EACF,CAAC;AACH;AAEO,SAAS,0BACd,YACuC;AACvC,SAAO,IAAI,eAA2B;AAAA,IACpC,MAAM,OAAO;AACX,aAAO,IAAI,QAAQ,CAACD,UAAS,WAAW;AACtC,cAAM,KAAK,WAAW,MAAM,OAAO,KAAK,KAAK,GAAG,CAACC,SAAQ;AACvD,cAAIA,KAAK,QAAOA,IAAG;AAAA,QACrB,CAAC;AACD,YAAI,IAAI;AACN,UAAAD,SAAQ;AAAA,QACV,OAAO;AACL,qBAAW,KAAK,SAASA,QAAO;AAAA,QAClC;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,QAAQ;AACN,aAAO,IAAI,QAAQ,CAACA,aAAY;AAC9B,mBAAW,IAAIA,QAAO;AAAA,MACxB,CAAC;AAAA,IACH;AAAA,IACA,MAAM,QAAQ;AACZ,iBAAW;AAAA,QACT,kBAAkB,QAAQ,SAAS,IAAI,MAAM,OAAO,MAAM,CAAC;AAAA,MAC7D;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;AC3NA,SAAS,kBAAkB;AAC3B,YAAYE,SAAQ;AACpB,YAAYC,SAAQ;AACpB,YAAYC,WAAU;AACtB;AAAA,EAgBE,gBAAAC;AAAA,OAeK;AACP;AAAA,EAEE;AAAA,EACA;AAAA,EAIA;AAAA,OAEK;AACP,SAAS,MAAM,cAAc;;;AC9C7B;AAAA,EACE,MAAQ;AAAA,EACR,SAAW;AAAA,EACX,YAAc;AAAA,EACd,aAAe;AAAA,EACf,SAAW;AAAA,IACT,KAAK;AAAA,MACH,OAAS;AAAA,MACT,QAAU;AAAA,IACZ;AAAA,IACA,WAAW;AAAA,MACT,OAAS;AAAA,MACT,QAAU;AAAA,IACZ;AAAA,IACA,oBAAoB;AAAA,MAClB,OAAS;AAAA,MACT,QAAU;AAAA,IACZ;AAAA,IACA,iBAAiB;AAAA,MACf,OAAS;AAAA,MACT,QAAU;AAAA,IACZ;AAAA,IACA,WAAW;AAAA,MACT,OAAS;AAAA,MACT,QAAU;AAAA,IACZ;AAAA,IACA,qCAAqC;AAAA,MACnC,OAAS;AAAA,MACT,QAAU;AAAA,IACZ;AAAA,IACA,oDAAoD;AAAA,MAClD,OAAS;AAAA,MACT,QAAU;AAAA,IACZ;AAAA,IACA,2BAA2B;AAAA,MACzB,OAAS;AAAA,MACT,QAAU;AAAA,IACZ;AAAA,IACA,gDAAgD;AAAA,MAC9C,OAAS;AAAA,MACT,QAAU;AAAA,IACZ;AAAA,IACA,6CAA6C;AAAA,MAC3C,OAAS;AAAA,MACT,QAAU;AAAA,IACZ;AAAA,IACA,oCAAoC;AAAA,MAClC,OAAS;AAAA,MACT,QAAU;AAAA,IACZ;AAAA,IACA,+BAA+B;AAAA,MAC7B,OAAS;AAAA,MACT,QAAU;AAAA,IACZ;AAAA,IACA,oBAAoB;AAAA,MAClB,OAAS;AAAA,MACT,QAAU;AAAA,IACZ;AAAA,IACA,YAAY;AAAA,MACV,OAAS;AAAA,MACT,QAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,KAAO;AAAA,IACL,gBAAgB;AAAA,EAClB;AAAA,EACA,MAAQ;AAAA,EACR,UAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,QAAU;AAAA,EACV,SAAW;AAAA,EACX,SAAW;AAAA,IACT,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,cAAc;AAAA,IACd,WAAa;AAAA,IACb,gBAAkB;AAAA,IAClB,OAAS;AAAA,EACX;AAAA,EACA,SAAW;AAAA,IACT,MAAQ;AAAA,EACV;AAAA,EACA,iBAAmB;AAAA,IACjB,mBAAmB;AAAA,IACnB,gBAAgB;AAAA,IAChB,cAAc;AAAA,IACd,cAAc;AAAA,IACd,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,YAAc;AAAA,IACd,QAAU;AAAA,EACZ;AAAA,EACA,cAAgB;AAAA,IACd,4BAA4B;AAAA,IAC5B,KAAO;AAAA,IACP,kCAAkC;AAAA,IAClC,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,IACrB,2BAA2B;AAAA,IAC3B,0CAA0C;AAAA,IAC1C,4BAA4B;AAAA,IAC5B,2BAA2B;AAAA,IAC3B,uCAAuC;AAAA,IACvC,qBAAqB;AAAA,IACrB,uBAAuB;AAAA,IACvB,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,cAAgB;AAAA,IAChB,WAAa;AAAA,IACb,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,iBAAiB;AAAA,IACjB,KAAO;AAAA,EACT;AAAA,EACA,OAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,eAAiB;AAAA,IACf,QAAU;AAAA,EACZ;AACF;;;ACrHO,IAAM,wBAAwB;AAAA;AAAA,EAEnC,gBAAgB;AAAA;AAAA,EAGhB,aAAa;AAAA;AAAA,EAGb,eAAe;AAAA;AAAA,EAGf,eAAe;AAAA;AAAA,EAGf,OAAO;AAAA;AAAA,EAGP,SAAS;AAAA;AAAA,EAGT,aAAa;AAAA;AAAA,EAGb,eAAe;AAAA;AAAA,EAGf,aAAa;AAAA;AAAA,EAGb,gBAAgB;AAAA;AAAA,EAGhB,cAAc;AAAA;AAAA,EAGd,QAAQ;AAAA;AAAA,EAGR,OAAO;AAAA;AAAA,EAGP,QAAQ;AAAA;AAAA,EAGR,mBAAmB;AAAA;AAAA,EAGnB,kBAAkB;AAAA;AAAA,EAGlB,cAAc;AAAA;AAAA,EAGd,qBAAqB;AACvB;AAQO,IAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO7B,iBAAiB;AACnB;AAWA,SAAS,WAAW,QAA4B,UAA2B;AACzE,MAAI,CAAC,OAAQ,QAAO;AACpB,SAAO,WAAW,YAAY,WAAW,IAAI,QAAQ;AACvD;AAWO,SAAS,SACd,QACA,UACS;AACT,SAAO,WAAW,QAAQ,QAAQ;AACpC;;;AClHA,YAAYC,WAAU;;;AKGtB,6BAAmB;AAHnB,SAAS,kBAAkB;AAC3B,YAAY,UAAU;AACtB,SAAS,qBAAqB;ASF9B,YAAYC,SAAQ;AACpB,YAAYC,WAAU;AbMf,SAAS,WACd,UACAC,OAC0B;AAC1B,QAAM,QAAQ,SAAS,KAAK,CAAC,MAAM,EAAE,SAASA,KAAI;AAClD,SAAO,QAAQ,MAAM,OAAO;AAC9B;AAEO,SAAS,kBACd,MACA,cACe;AACf,MAAI,KAAK,SAAS,cAAc;AAC9B,WAAO,KAAK;EACd;AACA,MAAI,cAAc;AAChB,QAAI,KAAK,SAAS,uBAAuB,KAAK,SAAS,aAAa;AAClE,YAAM,OACJ,KAAK,kBAAkB,UAAU,KACjC,KAAK,kBAAkB,WAAW;AACpC,UAAI,MAAM;AACR,eAAO,KAAK;MACd;IACF;AACA,QAAI,KAAK,SAAS,uBAAuB;AACvC,YAAM,QAAQ,KAAK,kBAAkB,OAAO;AAC5C,UAAI,OAAO;AACT,eAAO,MAAM;MACf;IACF;AACA,QAAI,KAAK,SAAS,6BAA6B;AAC7C,YAAM,QAAQ,KAAK,cAAc,CAAC;AAClC,UAAI,OAAO,SAAS,qBAAqB;AACvC,cAAM,OAAO,MAAM,kBAAkB,UAAU;AAC/C,YAAI,MAAM;AACR,iBAAO,KAAK;QACd;MACF;IACF;EACF;AACA,SAAO;AACT;AAEO,SAAS,kBAAkB,MAAwC;AACxE,MAAI,KAAK,SAAS,cAAc;AAC9B,WAAO,KAAK;EACd;AACA,MACE,KAAK,SAAS,8BACd,KAAK,cAAc,WAAW,GAC9B;AACA,WAAO,kBAAkB,KAAK,cAAc,CAAC,CAAC;EAChD;AACA,SAAO;AACT;AAEO,SAAS,2BACd,MACe;AACf,MAAI,KAAK,SAAS,qBAAqB,KAAK,kBAAkB,GAAG;AAC/D,WAAO,sBAAsB,KAAK,cAAc,CAAC,CAAC;EACpD;AACA,SAAO,sBAAsB,IAAI;AACnC;AAEO,SAAS,sBAAsB,MAAwC;AAC5E,MAAI,KAAK,SAAS,YAAY,KAAK,SAAS,mBAAmB;AAC7D,UAAM,UAAU,KAAK,cAAc;MACjC,CAAC,MACC,EAAE,SAAS,qBACX,EAAE,SAAS,oBACX,EAAE,SAAS;IACf;AACA,WAAO,UAAU,QAAQ,OAAO;EAClC;AACA,MACE,KAAK,SAAS,gCACd,KAAK,SAAS,sBACd;AACA,WAAO,KAAK,KAAK,MAAM,GAAG,EAAE;EAC9B;AACA,MAAI,KAAK,SAAS,qBAAqB,KAAK,SAAS,kBAAkB;AACrE,WAAO,KAAK;EACd;AACA,SAAO;AACT;AAEO,SAAS,iBAAiBC,OAAsB;AACrD,MACGA,MAAK,WAAW,GAAG,KAAKA,MAAK,SAAS,GAAG,KACzCA,MAAK,WAAW,GAAG,KAAKA,MAAK,SAAS,GAAG,KACzCA,MAAK,WAAW,GAAG,KAAKA,MAAK,SAAS,GAAG,GAC1C;AACA,WAAOA,MAAK,MAAM,GAAG,EAAE;EACzB;AACA,SAAOA;AACT;AAEA,IAAM,aAAa,oBAAI,IAAI;EACzB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACF,CAAC;AAEM,SAAS,cAAc,YAA8B;AAC1D,MAAIA,QAAO,WAAW,KAAK;AAC3B,MAAIA,MAAK,WAAW,GAAG,GAAG;AACxB,IAAAA,QAAOA,MAAK,MAAM,CAAC;EACrB;AACA,MAAIA,MAAK,SAAS,GAAG,GAAG;AACtB,IAAAA,QAAOA,MAAK,MAAM,GAAG,EAAE;EACzB;AACA,MAAI,CAACA,MAAK,KAAK,GAAG;AAChB,WAAO,CAAC;EACV;AAEA,SAAOA,MACJ,MAAM,GAAG,EACT,IAAI,CAAC,MAAM;AACV,QAAI,EAAE,SAAS,GAAG,KAAK,EAAE,SAAS,GAAG,GAAG;AACtC,aAAO;IACT;AACA,UAAMD,QAAO,EAAE,MAAM,GAAG,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,EAAE,QAAQ,SAAS,EAAE,EAAE,KAAK;AACrE,WAAOA;EACT,CAAC,EACA,OAAO,CAAC,MAAM,KAAK,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,EAAE,WAAW,KAAK,CAAC;AAClE;AAEO,SAAS,UACd,MACA,MACA,UACM;AACN,QAAM,QAAQ,CAAC,SAA4B;AACzC,QAAI,KAAK,SAAS,MAAM;AACtB,eAAS,IAAI;IACf;AACA,eAAW,SAAS,KAAK,eAAe;AACtC,YAAM,KAAK;IACb;EACF;AACA,QAAM,IAAI;AACZ;ACnIA,IAAM,qBAAqB,oBAAI,IAAI,CAAC,SAAS,CAAC;AAC9C,IAAM,kBAAkB,oBAAI,IAAI;EAC9B;EACA;EACA;EACA;EACA;EACA;AACF,CAAC;AACD,IAAM,iBAAiB,oBAAI,IAAI,CAAC,GAAG,oBAAoB,GAAG,eAAe,CAAC;AAE1E,IAAM,qBAAqB,oBAAI,IAAI,CAAC,SAAS,CAAC;AAC9C,IAAM,kBAAkB,oBAAI,IAAI;EAC9B;EACA;EACA;EACA;EACA;AACF,CAAC;AACD,IAAM,iBAAiB,oBAAI,IAAI,CAAC,GAAG,oBAAoB,GAAG,eAAe,CAAC;AAE1E,IAAM,qBAAqB,oBAAI,IAAI,CAAC,SAAS,CAAC;AAC9C,IAAM,kBAAkB,oBAAI,IAAI;EAC9B;EACA;EACA;AACF,CAAC;AACD,IAAM,iBAAiB,oBAAI,IAAI,CAAC,GAAG,oBAAoB,GAAG,eAAe,CAAC;AAE1E,IAAM,qBAAqB,oBAAI,IAAI,CAAC,SAAS,CAAC;AAC9C,IAAM,kBAAkB,oBAAI,IAAI;EAC9B;EACA;EACA;EACA;AACF,CAAC;AACD,IAAM,iBAAiB,oBAAI,IAAI,CAAC,GAAG,oBAAoB,GAAG,eAAe,CAAC;AAInE,IAAM,eAAe,oBAAI,IAAI,CAAC,WAAW,UAAU,IAAI,CAAC;AAIxD,IAAM,mBAAmB,oBAAI,IAAI;EACtC,GAAG;EACH,GAAG;EACH,GAAG;EACH,GAAG;AACL,CAAC;AAID,IAAM,aAA2B;EAC/B,cAAc;;;;;;;;;;;;;EAcd,kBAAkB;;;;;;;;;;;EAYlB,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwCjB,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgCX,eAAe;;;;;;;;;;;EAYf,oBAAoB;;;;;;;;;;;;;EAcpB,qBAAqB;;;;;;;EAQrB,mBAAmB;;;;;EAMnB,oBAAoB;;;;;;;EAQpB,cAAc;;;;;;;AAOhB;AAEA,IAAM,aAA2B;EAC/B,cAAc;;;;;;;EAQd,kBAAkB;EAElB,oBAAoB;;;;;;;;;;;;;;;;EAiBpB,iBAAiB;;;;;;;;;;EAWjB,WAAW;;;;;;EAOX,eAAe;;;;;;EAOf,oBAAoB;;;;;;;;EASpB,qBAAqB;EAErB,mBAAmB;;;;;EAMnB,oBAAoB;;;;;;;EAQpB,cAAc;;;;;;;AAOhB;AAEA,IAAM,aAA2B;EAC/B,cAAc;;;;;;;EAQd,kBAAkB;EAElB,eAAe;;;;;;;;;;;;EAaf,iBAAiB;;;;;;;;;;;;;;;;;;;EAoBjB,WAAW;;;;;;;;;;;EAYX,eAAe;EAEf,oBAAoB;;;;;;;;;;;;;;;;;EAkBpB,qBAAqB;EAErB,mBAAmB;EAEnB,oBAAoB;;;;;;;EAQpB,cAAc;;;;;;;AAOhB;AAEA,IAAM,aAA2B;EAC/B,cAAc;;;;;;EAOd,kBAAkB;EAElB,kBAAkB;;;;;;;;;EAUlB,iBAAiB;;;;;;;;EASjB,WAAW;;;;;;EAOX,eAAe;;;;;EAMf,oBAAoB;;;;;;;;;EAUpB,qBAAqB;EAErB,mBAAmB;;;;;EAMnB,oBAAoB;;;;;;;;;;;EAYpB,cAAc;;;;;;AAMhB;AAIO,IAAM,iBAAyC;EACpD,OAAO;EACP,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,OAAO;EACP,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,OAAO;EACP,QAAQ;EACR,OAAO;EACP,OAAO;EACP,SAAS;EACT,YAAY;AACd;AAIO,IAAM,gBAA4C;EACvD,YAAY;IACV,MAAM;IACN,gBAAgB;IAChB,aAAa;IACb,YAAY;IACZ,SAAS;EACX;EACA,iBAAiB;IACf,MAAM;IACN,gBAAgB;IAChB,aAAa;IACb,YAAY;IACZ,SAAS;EACX;EACA,YAAY;IACV,MAAM;IACN,gBAAgB;IAChB,aAAa;IACb,YAAY;IACZ,SAAS;EACX;EACA,iBAAiB;IACf,MAAM;IACN,gBAAgB;IAChB,aAAa;IACb,YAAY;IACZ,SAAS;EACX;EACA,QAAQ;IACN,MAAM;IACN,gBAAgB;IAChB,aAAa;IACb,YAAY;IACZ,SAAS;EACX;EACA,IAAI;IACF,MAAM;IACN,gBAAgB;IAChB,aAAa;IACb,YAAY;IACZ,SAAS;EACX;EACA,MAAM;IACJ,MAAM;IACN,gBAAgB;IAChB,aAAa;IACb,YAAY;IACZ,SAAS;EACX;AACF;ACrjBA,IAAM,sBAAsB,oBAAI,IAAI,CAAC,WAAW,SAAS,CAAC;AAC1D,IAAM,uBAAuB,oBAAI,IAAI,CAAC,OAAO,eAAe,CAAC;AAEtD,SAAS,oBAAoB,QAAsC;AACxE,QAAM,UAAU,IAAI,IAAI,YAAY;AACpC,aAAWA,SAAQ,OAAO,uBAAuB;AAC/C,YAAQ,IAAIA,KAAI;EAClB;AACA,SAAO;AACT;AAEO,SAAS,YACd,IACA,MACA,MACA,QAKA;AACA,QAAM,mBAAmB,oBAAoB,GAAG,MAAM;AACtD,QAAM,gBAAgB,oBAAI,IAAY;AACtC,QAAM,sBAAsB,oBAAI,IAAY;AAC5C,QAAM,mBAAmB,oBAAI,IAAY;AAGzC,QAAM,aAAa,GAAG,SAAS,MAAM,OAAO,QAAQ,aAAa;AACjE,MAAI,YAAY;AACd,eAAW,SAAS,WAAW,QAAQ,KAAK,QAAQ,GAAG;AACrD,YAAM,YAAY,WAAW,MAAM,UAAU,OAAO;AACpD,YAAM,aAAa,WAAW,MAAM,UAAU,QAAQ;AACtD,UAAI,aAAa,cAAc,iBAAiB,IAAI,WAAW,IAAI,GAAG;AACpE,sBAAc,IAAI,UAAU,IAAI;MAClC;IACF;EACF;AAGA,QAAM,mBAAmB,GAAG,SAAS,MAAM,OAAO,QAAQ,kBAAkB;AAC5E,MAAI,kBAAkB;AACpB,eAAW,SAAS,iBAAiB,QAAQ,KAAK,QAAQ,GAAG;AAC3D,YAAM,YAAY,WAAW,MAAM,UAAU,OAAO;AACpD,YAAM,YAAY,WAAW,MAAM,UAAU,YAAY;AACzD,YAAM,UAAU,WAAW,MAAM,UAAU,UAAU;AACrD,YAAM,WAAW,WAAW,MAAM,UAAU,WAAW;AAEvD,UAAI,aAAa,aAAa,oBAAoB,IAAI,UAAU,IAAI,GAAG;AACrE,sBAAc,IAAI,UAAU,IAAI;MAClC;AACA,UACE,aACA,WACA,YACA,QAAQ,SAAS,aACjB,qBAAqB,IAAI,SAAS,IAAI,GACtC;AACA,sBAAc,IAAI,UAAU,IAAI;MAClC;AACA,YAAM,YAAY,WAAW,MAAM,UAAU,YAAY;AACzD,YAAM,iBAAiB,WAAW,MAAM,UAAU,aAAa;AAC/D,UACE,aACA,aACA,aACA,kBACA,oBAAoB,IAAI,UAAU,IAAI,KACtC,UAAU,SAAS,YACnB,eAAe,SAAS,OACxB;AACA,sBAAc,IAAI,UAAU,IAAI;MAClC;IACF;EACF;AAGA,MAAI,OAAO,QAAQ,qBAAqB;AACtC,UAAM,gBAAgB,GAAG,SAAS,MAAM,OAAO,QAAQ,mBAAmB;AAC1E,QAAI,eAAe;AACjB,iBAAW,SAAS,cAAc,QAAQ,KAAK,QAAQ,GAAG;AACxD,cAAM,aAAa,WAAW,MAAM,UAAU,aAAa;AAC3D,cAAM,aAAa,WAAW,MAAM,UAAU,QAAQ;AACtD,YAAI,cAAc,cAAc,iBAAiB,IAAI,WAAW,IAAI,GAAG;AACrE,gBAAMA,QAAO,WAAW;AACxB,cAAI,OAAO,eAAe,IAAIA,KAAI,GAAG;AACnC,gCAAoB,IAAIA,KAAI;UAC9B;AACA,cAAI,OAAO,YAAY,IAAIA,KAAI,GAAG;AAChC,6BAAiB,IAAIA,KAAI;UAC3B;QACF;MACF;IACF;EACF;AAEA,SAAO,EAAE,eAAe,qBAAqB,iBAAiB;AAChE;AAEO,SAAS,iBACd,IACA,MACA,MACqB;AACrB,QAAM,YAAY,oBAAI,IAAoB;AAG1C,QAAM,UAAU,GAAG;IACjB;IACA;;;;;;;;;;;EAWF;AACA,MAAI,SAAS;AACX,eAAW,SAAS,QAAQ,QAAQ,KAAK,QAAQ,GAAG;AAClD,YAAM,WAAW,WAAW,MAAM,UAAU,MAAM;AAClD,YAAM,YAAY,WAAW,MAAM,UAAU,OAAO;AACpD,UAAI,YAAY,WAAW;AACzB,kBAAU,IAAI,SAAS,MAAM,UAAU,IAAI;MAC7C;IACF;EACF;AAGA,QAAM,UAAU,GAAG;IACjB;IACA;;;;;;EAMF;AACA,MAAI,SAAS;AACX,eAAW,SAAS,QAAQ,QAAQ,KAAK,QAAQ,GAAG;AAClD,YAAM,WAAW,WAAW,MAAM,UAAU,MAAM;AAClD,YAAM,YAAY,WAAW,MAAM,UAAU,OAAO;AACpD,UAAI,YAAY,WAAW;AACzB,kBAAU,IAAI,SAAS,MAAM,UAAU,IAAI;MAC7C;IACF;EACF;AAGA,QAAM,aAAa,GAAG;IACpB;IACA;;;;;EAKF;AACA,MAAI,YAAY;AACd,eAAW,SAAS,WAAW,QAAQ,KAAK,QAAQ,GAAG;AACrD,YAAM,WAAW,WAAW,MAAM,UAAU,MAAM;AAClD,YAAM,YAAY,WAAW,MAAM,UAAU,OAAO;AACpD,UAAI,YAAY,WAAW;AACzB,kBAAU,IAAI,SAAS,MAAM,iBAAiB,UAAU,IAAI,CAAC;MAC/D;IACF;EACF;AAEA,QAAM,eAAe,GAAG;IACtB;IACA;;;;;;EAMF;AACA,MAAI,cAAc;AAChB,eAAW,SAAS,aAAa,QAAQ,KAAK,QAAQ,GAAG;AACvD,YAAM,WAAW,WAAW,MAAM,UAAU,MAAM;AAClD,YAAM,YAAY,WAAW,MAAM,UAAU,OAAO;AACpD,UAAI,YAAY,WAAW;AACzB,kBAAU,IAAI,SAAS,MAAM,iBAAiB,UAAU,IAAI,CAAC;MAC/D;IACF;EACF;AAGA,QAAM,UAAU,GAAG;IACjB;IACA;;;;;;;;;EASF;AACA,MAAI,SAAS;AACX,eAAW,SAAS,QAAQ,QAAQ,KAAK,QAAQ,GAAG;AAClD,YAAM,WAAW,WAAW,MAAM,UAAU,MAAM;AAClD,YAAM,YAAY,WAAW,MAAM,UAAU,OAAO;AACpD,UAAI,YAAY,WAAW;AACzB,kBAAU,IAAI,SAAS,MAAM,UAAU,IAAI;MAC7C;IACF;EACF;AAEA,SAAO;AACT;ACvMA,IAAME,uBAAsB,oBAAI,IAAI,CAAC,WAAW,SAAS,CAAC;AAC1D,IAAMC,wBAAuB,oBAAI,IAAI,CAAC,OAAO,eAAe,CAAC;AAE7D,eAAsB,iBACpB,IACA,QACA,YACwB;AACxB,QAAM,QAAQ,MAAM,GAAG,YAAY,UAAU;AAC7C,MAAI,CAAC,OAAO;AACV,WAAO,CAAC;EACV;AAEA,QAAM,EAAE,MAAM,OAAO,IAAI;AACzB,QAAM,OAAO,GAAG,MAAM,QAAQ,IAAI;AAClC,MAAI,CAAC,MAAM;AACT,WAAO,CAAC;EACV;AAEA,QAAM,QAAuB,CAAC;AAC9B,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,aAAa,oBAAoB,GAAG,MAAM;AAGhD,QAAM,EAAE,eAAe,qBAAqB,iBAAiB,IAAI;IAC/D;IACA;IACA;IACA;EACF;AACA,aAAW,KAAK,eAAe;AAC7B,eAAW,IAAI,CAAC;EAClB;AAGA,QAAM,YAAY,GAAG,SAAS,MAAM,OAAO,QAAQ,YAAY;AAC/D,MAAI,WAAW;AACb,UAAM,UAAU,UAAU,QAAQ,KAAK,QAAQ;AAC/C,eAAW,SAAS,SAAS;AAC3B,YAAM,aAAa,WAAW,MAAM,UAAU,QAAQ;AACtD,YAAM,aAAa,WAAW,MAAM,UAAU,QAAQ;AACtD,YAAM,UAAU,WAAW,MAAM,UAAU,KAAK;AAEhD,UAAI,CAAC,cAAc,CAAC,cAAc,CAAC,SAAS;AAC1C;MACF;AAEA,YAAM,aAAa;QACjB;QACA,GAAG,OAAO;MACZ;AACA,YAAM,SAAS,WAAW;AAE1B,UAAI,CAAC,cAAc,CAAC,WAAW,IAAI,UAAU,GAAG;AAC9C;MACF;AACA,UAAI,CAAC,OAAO,WAAW,IAAI,MAAM,GAAG;AAClC;MACF;AAIA,UACE,OAAO,QAAQ,sBACf,OAAO,eAAe,IAAI,MAAM,GAChC;AACA;MACF;AAIA,UACE,OAAO,QAAQ,oBACf,OAAO,eAAe,IAAI,MAAM,GAChC;AACA;MACF;AAEA,YAAM,KAAK;QACT;QACA,KAAK,iBAAiB,QAAQ,IAAI;QAClC,MAAM,QAAQ,cAAc;QAC5B,aAAa,QAAQ,cAAc;QACnC,WAAW,QAAQ,YAAY;MACjC,CAAC;IACH;EACF;AAIA,MAAI,OAAO,QAAQ,eAAe;AAChC,UAAM,cAAc,GAAG,SAAS,MAAM,OAAO,QAAQ,aAAa;AAClE,QAAI,aAAa;AACf,iBAAW,SAAS,YAAY,QAAQ,KAAK,QAAQ,GAAG;AACtD,cAAM,aAAa,WAAW,MAAM,UAAU,QAAQ;AACtD,cAAM,aAAa,WAAW,MAAM,UAAU,QAAQ;AACtD,cAAM,gBAAgB,WAAW,MAAM,UAAU,YAAY;AAC7D,cAAM,UAAU,WAAW,MAAM,UAAU,KAAK;AAChD,YAAI,CAAC,cAAc,CAAC,cAAc,CAAC,iBAAiB,CAAC,SAAS;AAC5D;QACF;AAEA,cAAM,aAAa;UACjB;UACA,GAAG,OAAO;QACZ;AACA,cAAM,SAAS,WAAW;AAC1B,cAAM,YAAY,cAAc;AAChC,YAAI,CAAC,cAAc,CAAC,WAAW,IAAI,UAAU,GAAG;AAC9C;QACF;AAIA,cAAM,YAAY,WAAW,aAAa,cAAc;AACxD,cAAM,SAAS,OAAO,YAAY,IAAI,MAAM,KAAK,cAAc;AAC/D,YAAI,CAAC,aAAa,CAAC,QAAQ;AACzB;QACF;AAEA,cAAM,kBAAkB,YAAY,YAAY;AAChD,cAAM,MAAM,iBAAiB,QAAQ,IAAI;AACzC,cAAM,OAAO,QAAQ,cAAc;AACnC,cAAM,WAAW,GAAG,IAAI,IAAI,GAAG;AAC/B,YAAI,KAAK,IAAI,QAAQ,GAAG;AACtB;QACF;AACA,aAAK,IAAI,QAAQ;AAEjB,cAAM,KAAK;UACT,QAAQ;UACR;UACA;UACA,aAAa,QAAQ,cAAc;UACnC,WAAW,QAAQ,YAAY;QACjC,CAAC;MACH;IACF;EACF;AAGA,QAAM,mBAAmB,GAAG,SAAS,MAAM,OAAO,QAAQ,gBAAgB;AAC1E,MAAI,kBAAkB;AACpB,UAAM,UAAU,iBAAiB,QAAQ,KAAK,QAAQ;AACtD,eAAW,SAAS,SAAS;AAC3B,YAAM,aAAa,WAAW,MAAM,UAAU,QAAQ;AACtD,YAAM,aAAa,WAAW,MAAM,UAAU,QAAQ;AACtD,YAAM,eAAe,WAAW,MAAM,UAAU,WAAW;AAC3D,YAAM,UAAU,WAAW,MAAM,UAAU,KAAK;AAEhD,UAAI,CAAC,cAAc,CAAC,cAAc,CAAC,gBAAgB,CAAC,SAAS;AAC3D;MACF;AAEA,YAAM,aAAa;QACjB;QACA,GAAG,OAAO;MACZ;AACA,YAAM,SAAS,WAAW;AAE1B,UAAI,CAAC,cAAc,CAAC,WAAW,IAAI,UAAU,GAAG;AAC9C;MACF;AACA,UAAI,WAAW,WAAW;AACxB;MACF;AACA,UAAI,aAAa,SAAS,SAAS;AACjC;MACF;AAEA,YAAM,KAAK;QACT;QACA,KAAK,iBAAiB,QAAQ,IAAI;QAClC,MAAM,QAAQ,cAAc;QAC5B,aAAa,QAAQ,cAAc;QACnC,WAAW,QAAQ,YAAY;MACjC,CAAC;IACH;EACF;AAIA,MAAI,OAAO,QAAQ,oBAAoB;AACrC,UAAM,iBAAiB,GAAG,SAAS,MAAM,OAAO,QAAQ,kBAAkB;AAC1E,QAAI,gBAAgB;AAClB,YAAM,UAAU,eAAe,QAAQ,KAAK,QAAQ;AACpD,iBAAW,SAAS,SAAS;AAC3B,cAAM,aAAa,WAAW,MAAM,UAAU,QAAQ;AACtD,cAAM,aAAa,WAAW,MAAM,UAAU,QAAQ;AACtD,cAAM,UAAU,WAAW,MAAM,UAAU,KAAK;AAChD,cAAM,gBAAgB,WAAW,MAAM,UAAU,YAAY;AAE7D,YAAI,CAAC,cAAc,CAAC,cAAc,CAAC,SAAS;AAC1C;QACF;AAEA,cAAM,aAAa;UACjB;UACA,GAAG,OAAO;QACZ;AACA,cAAM,SAAS,WAAW;AAE1B,YAAI,CAAC,cAAc,CAAC,WAAW,IAAI,UAAU,GAAG;AAC9C;QACF;AACA,YAAI,WAAW,WAAW;AACxB;QACF;AAGA,YAAI,iBAAiB,cAAc,SAAS,SAAS;AACnD;QACF;AAEA,cAAM,MAAM,iBAAiB,QAAQ,IAAI;AACzC,cAAM,OAAO,QAAQ,cAAc;AACnC,cAAM,WAAW,GAAG,IAAI,IAAI,GAAG;AAC/B,YAAI,KAAK,IAAI,QAAQ,GAAG;AACtB;QACF;AACA,aAAK,IAAI,QAAQ;AAEjB,cAAM,KAAK;UACT;UACA;UACA;UACA,aAAa,QAAQ,cAAc;UACnC,WAAW,QAAQ,YAAY;QACjC,CAAC;MACH;IACF;EACF;AAIA,MAAI,OAAO,QAAQ,kBAAkB;AACnC,UAAM,iBAAiB,GAAG,SAAS,MAAM,OAAO,QAAQ,gBAAgB;AACxE,QAAI,gBAAgB;AAClB,YAAM,UAAU,eAAe,QAAQ,KAAK,QAAQ;AACpD,iBAAW,SAAS,SAAS;AAC3B,cAAM,aAAa,WAAW,MAAM,UAAU,QAAQ;AACtD,cAAM,aAAa,WAAW,MAAM,UAAU,QAAQ;AACtD,cAAM,UAAU,WAAW,MAAM,UAAU,KAAK;AAChD,cAAM,gBAAgB,WAAW,MAAM,UAAU,YAAY;AAE7D,YAAI,CAAC,cAAc,CAAC,cAAc,CAAC,WAAW,CAAC,eAAe;AAC5D;QACF;AAEA,cAAM,aAAa;UACjB;UACA,GAAG,OAAO;QACZ;AACA,cAAM,SAAS,WAAW;AAE1B,YAAI,CAAC,cAAc,CAAC,WAAW,IAAI,UAAU,GAAG;AAC9C;QACF;AACA,YAAI,WAAW,WAAW;AACxB;QACF;AACA,YAAI,cAAc,SAAS,SAAS;AAClC;QACF;AAEA,cAAM,MAAM,iBAAiB,QAAQ,IAAI;AACzC,cAAM,OAAO,QAAQ,cAAc;AACnC,cAAM,WAAW,GAAG,IAAI,IAAI,GAAG;AAC/B,YAAI,KAAK,IAAI,QAAQ,GAAG;AACtB;QACF;AACA,aAAK,IAAI,QAAQ;AAEjB,cAAM,KAAK;UACT;UACA;UACA;UACA,aAAa,QAAQ,cAAc;UACnC,WAAW,QAAQ,YAAY;QACjC,CAAC;MACH;IACF;EACF;AAGA,MAAI,oBAAoB,OAAO,KAAK,iBAAiB,OAAO,GAAG;AAC7D,UAAM,YAAY,GAAG,SAAS,MAAM,OAAO,QAAQ,iBAAiB;AACpE,QAAI,WAAW;AACb,YAAM,UAAU,UAAU,QAAQ,KAAK,QAAQ;AAC/C,iBAAW,SAAS,SAAS;AAC3B,cAAM,WAAW,WAAW,MAAM,UAAU,WAAW;AACvD,cAAM,UAAU,WAAW,MAAM,UAAU,KAAK;AAChD,YAAI,CAAC,YAAY,CAAC,SAAS;AACzB;QACF;AAEA,cAAMH,QAAO,SAAS;AACtB,YAAI,oBAAoB,IAAIA,KAAI,KAAK,iBAAiB,IAAIA,KAAI,GAAG;AAC/D,gBAAM,KAAK;YACT,QAAQA;YACR,KAAK,iBAAiB,QAAQ,IAAI;YAClC,MAAM,QAAQ,cAAc;YAC5B,aAAa,QAAQ,cAAc;YACnC,WAAW,QAAQ,YAAY;UACjC,CAAC;QACH;MACF;IACF;EACF;AAGA,MACE,GAAG,OAAO,wBAAwB,SAAS,KAC3C,OAAO,QAAQ,mBACf;AACA,UAAM,sBAAsB,IAAI,IAAI,GAAG,OAAO,uBAAuB;AACrE,UAAM,YAAY,GAAG,SAAS,MAAM,OAAO,QAAQ,iBAAiB;AACpE,QAAI,WAAW;AACb,YAAM,UAAU,UAAU,QAAQ,KAAK,QAAQ;AAC/C,iBAAW,SAAS,SAAS;AAC3B,cAAM,WAAW,WAAW,MAAM,UAAU,WAAW;AACvD,cAAM,UAAU,WAAW,MAAM,UAAU,KAAK;AAChD,YAAI,CAAC,YAAY,CAAC,SAAS;AACzB;QACF;AAEA,YAAI,oBAAoB,IAAI,SAAS,IAAI,GAAG;AAC1C,gBAAM,KAAK;YACT,QAAQ,SAAS;YACjB,KAAK,iBAAiB,QAAQ,IAAI;YAClC,MAAM,QAAQ,cAAc;YAC5B,aAAa,QAAQ,cAAc;YACnC,WAAW,QAAQ,YAAY;UACjC,CAAC;QACH;MACF;IACF;EACF;AAGA,QAAM,cAAc,iBAAiB,IAAI,MAAM,IAAI;AACnD,MAAI,YAAY,OAAO,GAAG;AACxB,UAAM,gBAAgB,GAAG,SAAS,MAAM,OAAO,QAAQ,kBAAkB;AACzE,QAAI,eAAe;AACjB,YAAM,eAAe,cAAc,QAAQ,KAAK,QAAQ;AACxD,iBAAW,SAAS,cAAc;AAChC,cAAM,aAAa,WAAW,MAAM,UAAU,QAAQ;AACtD,cAAM,aAAa,WAAW,MAAM,UAAU,QAAQ;AACtD,cAAM,UAAU,WAAW,MAAM,UAAU,QAAQ;AACnD,YAAI,CAAC,cAAc,CAAC,cAAc,CAAC,SAAS;AAC1C;QACF;AAEA,cAAM,aAAa;UACjB;UACA,GAAG,OAAO;QACZ;AACA,cAAM,SAAS,WAAW;AAC1B,YAAI,CAAC,cAAc,CAAC,WAAW,IAAI,UAAU,GAAG;AAC9C;QACF;AACA,YAAI,CAAC,OAAO,WAAW,IAAI,MAAM,GAAG;AAClC;QACF;AAEA,cAAM,WAAW,YAAY,IAAI,QAAQ,IAAI;AAC7C,YAAI,CAAC,UAAU;AACb;QACF;AAEA,cAAM,OAAO,QAAQ,cAAc;AACnC,cAAM,WAAW,GAAG,IAAI,IAAI,QAAQ;AACpC,YAAI,KAAK,IAAI,QAAQ,GAAG;AACtB;QACF;AACA,aAAK,IAAI,QAAQ;AAEjB,cAAM,KAAK;UACT;UACA,KAAK;UACL;UACA,aAAa,QAAQ,cAAc;UACnC,WAAW,QAAQ,YAAY;QACjC,CAAC;MACH;IACF;EACF;AAGA,QAAM,eAAe,IAAI,IAAI,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AACrD,QAAM,eAAe,GAAG,SAAS,MAAM,OAAO,QAAQ,YAAY;AAClE,MAAI,cAAc;AAChB,UAAM,UAAU,aAAa,QAAQ,KAAK,QAAQ;AAClD,eAAW,SAAS,SAAS;AAC3B,YAAM,aAAa,WAAW,MAAM,UAAU,QAAQ;AACtD,YAAM,aAAa,WAAW,MAAM,UAAU,QAAQ;AACtD,YAAM,eAAe,WAAW,MAAM,UAAU,WAAW;AAC3D,UAAI,CAAC,cAAc,CAAC,cAAc,CAAC,cAAc;AAC/C;MACF;AAEA,YAAM,aAAa;QACjB;QACA,GAAG,OAAO;MACZ;AACA,YAAM,SAAS,WAAW;AAC1B,UAAI,CAAC,cAAc,CAAC,WAAW,IAAI,UAAU,GAAG;AAC9C;MACF;AACA,UAAI,CAAC,OAAO,eAAe,IAAI,MAAM,GAAG;AACtC;MACF;AAEA,YAAM,OAAO,aAAa,cAAc;AACxC,UAAI,aAAa,IAAI,IAAI,GAAG;AAC1B;MACF;AAEA,YAAM,KAAK;QACT;QACA,KAAK;QACL;QACA,aAAa,aAAa,cAAc;QACxC,WAAW,aAAa,YAAY;QACpC,SAAS;MACX,CAAC;AACD,mBAAa,IAAI,IAAI;IACvB;EACF;AAEA,SAAO;AACT;AAEA,eAAsB,cACpB,IACA,QACA,YAC4B;AAC5B,QAAM,QAAQ,MAAM,GAAG,YAAY,UAAU;AAC7C,MAAI,CAAC,OAAO;AACV,WAAO,CAAC;EACV;AAEA,QAAM,EAAE,KAAK,IAAI;AACjB,QAAM,OAAO,GAAG,MAAM,QAAQ,IAAI;AAClC,MAAI,CAAC,MAAM;AACT,WAAO,CAAC;EACV;AAEA,QAAM,aAAa,oBAAoB,GAAG,MAAM;AAChD,QAAM,UAA6B,CAAC;AACpC,QAAM,YAAY,oBAAI,IAAY;AAGlC,QAAM,eAAe;;;;;;;;;AAUrB,QAAM,YAAY,GAAG,SAAS,MAAM,YAAY;AAChD,MAAI,WAAW;AACb,eAAW,SAAS,UAAU,QAAQ,KAAK,QAAQ,GAAG;AACpD,YAAM,aAAa,WAAW,MAAM,UAAU,QAAQ;AACtD,YAAM,aAAa,WAAW,MAAM,UAAU,QAAQ;AACtD,YAAM,YAAY,WAAW,MAAM,UAAU,OAAO;AACpD,YAAM,aAAa,WAAW,MAAM,UAAU,QAAQ;AAEtD,UAAI,CAAC,cAAc,CAAC,cAAc,CAAC,WAAW;AAC5C;MACF;AACA,UAAI,WAAW,SAAS,QAAQ;AAC9B;MACF;AAEA,YAAM,aAAa;QACjB;QACA,GAAG,OAAO;MACZ;AACA,UAAI,CAAC,cAAc,CAAC,WAAW,IAAI,UAAU,GAAG;AAC9C;MACF;AAEA,cAAQ,KAAK,cAAc,WAAW,cAAc,MAAS,CAAC;IAChE;EACF;AAGA,QAAM,sBAAsB;;;;;;;AAQ5B,QAAM,YAAY,GAAG,SAAS,MAAM,mBAAmB;AACvD,MAAI,WAAW;AACb,eAAW,SAAS,UAAU,QAAQ,KAAK,QAAQ,GAAG;AACpD,YAAM,YAAY,WAAW,MAAM,UAAU,YAAY;AACzD,YAAM,YAAY,WAAW,MAAM,UAAU,OAAO;AACpD,YAAM,aAAa,WAAW,MAAM,UAAU,QAAQ;AAEtD,UAAI,CAAC,aAAa,CAAC,WAAW;AAC5B;MACF;AACA,UAAI,CAACE,qBAAoB,IAAI,UAAU,IAAI,GAAG;AAC5C;MACF;AAEA,cAAQ,KAAK,cAAc,WAAW,cAAc,MAAS,CAAC;IAChE;EACF;AAGA,QAAM,iBAAiB;;;;;;AAQvB,QAAM,mBAAmB;;;;;;;;AASzB,QAAM,gBAAgB,GAAG,SAAS,MAAM,gBAAgB;AACxD,MAAI,eAAe;AACjB,eAAW,SAAS,cAAc,QAAQ,KAAK,QAAQ,GAAG;AACxD,YAAM,YAAY,WAAW,MAAM,UAAU,YAAY;AACzD,YAAM,aAAa,WAAW,MAAM,UAAU,SAAS;AACvD,YAAM,YAAY,WAAW,MAAM,UAAU,OAAO;AAEpD,UAAI,CAAC,aAAa,CAAC,cAAc,CAAC,WAAW;AAC3C;MACF;AACA,UAAI,CAACA,qBAAoB,IAAI,UAAU,IAAI,GAAG;AAC5C;MACF;AACA,UACE,WAAW,SAAS,aACpB,WAAW,SAAS,mBACpB;AACA;MACF;AAGA,YAAM,OAAO,UAAU,cAAc;AACrC,UAAI,UAAU,IAAI,IAAI,GAAG;AACvB;MACF;AACA,gBAAU,IAAI,IAAI;AAGlB,YAAM,WAAW,WAAW,MAAM,UAAU,MAAM;AAClD,YAAM,mBAAmB,oBAAI,IAAoB;AACjD,UAAI,UAAyB;AAE7B,UAAI,UAAU;AACZ,cAAM,WAAW,SAAS,kBAAkB,WAAW;AACvD,YAAI,UAAU;AACZ,qBAAW,SAAS,SAAS,eAAe;AAC1C,gBAAI,MAAM,SAAS,oBAAoB;AACrC,oBAAM,WAAW,MAAM,kBAAkB,MAAM;AAC/C,oBAAM,YAAY,MAAM,kBAAkB,OAAO;AACjD,kBACE,YACA,aACA,SAAS,SAAS,aAClB,SAAS,SAAS,mBAClB;AACA,sBAAM,MAAM,SAAS;AACrB,oBAAI,QAAQ,UAAU;AACtB,oBAAI,UAAU,SAAS,UAAU;AAC/B,wBAAM,UAAU,UAAU,cAAc;oBACtC,CAAC,MAAM,EAAE,SAAS;kBACpB;AACA,sBAAI,SAAS;AACX,4BAAQ,QAAQ;kBAClB;gBACF;AACA,iCAAiB,IAAI,KAAK,KAAK;AAC/B,oBAAI,QAAQ,UAAU,QAAQ,YAAY;AACxC,4BAAU;gBACZ;cACF;YACF;UACF;QACF;MACF;AAEA,cAAQ,KAAK;QACX,OAAO,iBAAiB,UAAU,IAAI;QACtC,WAAW,UAAU,cAAc;QACnC,eAAe,UAAU,cAAc;QACvC,aAAa,UAAU,YAAY;QACnC;QACA;MACF,CAAC;IACH;EACF;AAEA,QAAM,cAAc,GAAG,SAAS,MAAM,cAAc;AACpD,MAAI,aAAa;AACf,eAAW,SAAS,YAAY,QAAQ,KAAK,QAAQ,GAAG;AACtD,YAAM,YAAY,WAAW,MAAM,UAAU,YAAY;AACzD,YAAM,YAAY,WAAW,MAAM,UAAU,OAAO;AAEpD,UAAI,CAAC,aAAa,CAAC,WAAW;AAC5B;MACF;AACA,UAAI,CAACA,qBAAoB,IAAI,UAAU,IAAI,GAAG;AAC5C;MACF;AAGA,YAAM,WAAW,WAAW,MAAM,UAAU,MAAM;AAClD,YAAM,mBAAmB,oBAAI,IAAoB;AACjD,UAAI,UAAyB;AAE7B,UAAI,UAAU;AACZ,cAAM,WAAW,SAAS,kBAAkB,WAAW;AACvD,YAAI,UAAU;AACZ,qBAAW,SAAS,SAAS,eAAe;AAC1C,gBAAI,MAAM,SAAS,oBAAoB;AACrC,oBAAM,WAAW,MAAM,kBAAkB,MAAM;AAC/C,oBAAM,YAAY,MAAM,kBAAkB,OAAO;AACjD,kBAAI,YAAY,WAAW;AACzB,sBAAM,MAAM,SAAS;AACrB,oBAAI,QAAQ,UAAU;AACtB,oBAAI,UAAU,SAAS,UAAU;AAC/B,wBAAM,UAAU,UAAU,cAAc;oBACtC,CAAC,MAAM,EAAE,SAAS;kBACpB;AACA,sBAAI,SAAS;AACX,4BAAQ,QAAQ;kBAClB;gBACF;AACA,iCAAiB,IAAI,KAAK,KAAK;AAC/B,oBAAI,QAAQ,UAAU,QAAQ,YAAY;AACxC,4BAAU;gBACZ;cACF;YACF;UACF;QACF;MACF;AAEA,cAAQ,KAAK;QACX,OAAO,iBAAiB,UAAU,IAAI;QACtC,WAAW,UAAU,cAAc;QACnC,eAAe,UAAU,cAAc;QACvC,aAAa,UAAU,YAAY;QACnC;QACA;MACF,CAAC;IACH;EACF;AAGA,QAAM,iBAAiB;;;;;;;;AASvB,QAAM,cAAc,GAAG,SAAS,MAAM,cAAc;AACpD,MAAI,aAAa;AACf,eAAW,SAAS,YAAY,QAAQ,KAAK,QAAQ,GAAG;AACtD,YAAM,UAAU,WAAW,MAAM,UAAU,UAAU;AACrD,YAAM,WAAW,WAAW,MAAM,UAAU,WAAW;AACvD,YAAM,YAAY,WAAW,MAAM,UAAU,OAAO;AAEpD,UAAI,CAAC,WAAW,CAAC,YAAY,CAAC,WAAW;AACvC;MACF;AACA,UAAI,QAAQ,SAAS,WAAW;AAC9B;MACF;AACA,UAAI,CAACC,sBAAqB,IAAI,SAAS,IAAI,GAAG;AAC5C;MACF;AAEA,YAAM,QAAQ,iBAAiB,UAAU,IAAI;AAC7C,YAAM,OAAO,UAAU,cAAc;AACrC,UAAI,UAAU,IAAI,IAAI,GAAG;AACvB;MACF;AACA,gBAAU,IAAI,IAAI;AAGlB,YAAM,mBAAmB,oBAAI,IAAoB;AACjD,UAAI,UAAyB;AAE7B,YAAM,WAAW,WAAW,MAAM,UAAU,MAAM;AAClD,UAAI,UAAU;AACZ,cAAM,WAAW,SAAS,kBAAkB,WAAW;AACvD,YAAI,UAAU;AACZ,qBAAW,OAAO,SAAS,eAAe;AACxC,gBAAI,IAAI,SAAS,qBAAqB;AACpC,oBAAMC,QAAO,IAAI,kBAAkB,MAAM;AACzC,kBAAIA,OAAM;AACR,2BAAW,QAAQA,MAAK,eAAe;AACrC,sBAAI,KAAK,SAAS,iBAAiB;AACjC,0BAAM,WAAW,KAAK;AACtB,wBAAI,SAAS,UAAU,GAAG;AACxB,4BAAM,UAAU,SAAS,CAAC;AAC1B,4BAAM,UAAU,SAAS,CAAC;AAC1B,4BAAM,QACJ,QAAQ,SAAS,oBACb,QAAQ,cAAc,CAAC,GAAG,QAAQ,QAAQ,OAC1C,QAAQ;AACd,4BAAM,UAAU,iBAAiB,QAAQ,IAAI;AAC7C,0BAAI,OAAO;AACT,yCAAiB,IAAI,OAAO,OAAO;AACnC,4BAAI,UAAU,cAAc,UAAU,QAAQ;AAC5C,oCAAU;wBACZ;sBACF;oBACF;kBACF;gBACF;cACF;YACF;UACF;QACF;MACF;AAEA,cAAQ,KAAK;QACX;QACA,WAAW,UAAU,cAAc;QACnC,eAAe,UAAU,cAAc;QACvC,aAAa,UAAU,YAAY;QACnC;QACA;MACF,CAAC;IACH;EACF;AAGA,QAAM,iBAAiB;;;;;;;;;;;AAWvB,QAAM,cAAc,GAAG,SAAS,MAAM,cAAc;AACpD,MAAI,aAAa;AACf,eAAW,SAAS,YAAY,QAAQ,KAAK,QAAQ,GAAG;AACtD,YAAM,YAAY,WAAW,MAAM,UAAU,YAAY;AACzD,YAAM,YAAY,WAAW,MAAM,UAAU,YAAY;AACzD,YAAM,aAAa,WAAW,MAAM,UAAU,aAAa;AAC3D,YAAM,aAAa,WAAW,MAAM,UAAU,SAAS;AACvD,YAAM,YAAY,WAAW,MAAM,UAAU,OAAO;AAEpD,UACE,CAAC,aACD,CAAC,aACD,CAAC,cACD,CAAC,cACD,CAAC,WACD;AACA;MACF;AACA,UAAI,CAACF,qBAAoB,IAAI,UAAU,IAAI,GAAG;AAC5C;MACF;AACA,UAAI,UAAU,SAAS,UAAU;AAC/B;MACF;AACA,UAAI,WAAW,SAAS,OAAO;AAC7B;MACF;AACA,UAAI,WAAW,SAAS,WAAW;AACjC;MACF;AAEA,YAAM,OAAO,UAAU,cAAc;AACrC,UAAI,UAAU,IAAI,IAAI,GAAG;AACvB;MACF;AACA,gBAAU,IAAI,IAAI;AAGlB,YAAM,WAAW,WAAW,MAAM,UAAU,MAAM;AAClD,YAAM,mBAAmB,oBAAI,IAAoB;AACjD,UAAI,UAAyB;AAE7B,UAAI,UAAU;AACZ,cAAM,WAAW,SAAS,kBAAkB,WAAW;AACvD,YAAI,UAAU;AACZ,qBAAW,SAAS,SAAS,eAAe;AAC1C,gBAAI,MAAM,SAAS,QAAQ;AACzB,oBAAM,OAAO,MAAM,cAAc,CAAC;AAClC,oBAAM,SAAS,MAAM,cAAc,CAAC;AACpC,kBACE,MAAM,SAAS,qBACf,UACA,KAAK,SAAS,WACd;AACA,sBAAM,MAAM,KAAK;AACjB,oBAAI,QAAQ,OAAO;AACnB,oBAAI,OAAO,SAAS,UAAU;AAC5B,wBAAM,UAAU,OAAO,cAAc;oBACnC,CAAC,MAAM,EAAE,SAAS;kBACpB;AACA,sBAAI,SAAS;AACX,4BAAQ,QAAQ;kBAClB;gBACF;AACA,iCAAiB,IAAI,KAAK,KAAK;AAC/B,oBAAI,QAAQ,UAAU,QAAQ,YAAY;AACxC,4BAAU;gBACZ;cACF;YACF;UACF;QACF;MACF;AAEA,cAAQ,KAAK;QACX,OAAO,iBAAiB,UAAU,IAAI;QACtC,WAAW,UAAU,cAAc;QACnC,eAAe,UAAU,cAAc;QACvC,aAAa,UAAU,YAAY;QACnC;QACA;MACF,CAAC;IACH;EACF;AAEA,SAAO;AACT;AAEA,SAAS,cACP,WACA,YACiB;AACjB,QAAM,QAAQ,iBAAiB,UAAU,IAAI;AAC7C,QAAM,mBAAmB,oBAAI,IAAoB;AACjD,MAAI,UAAyB;AAE7B,MAAI,YAAY;AACd,eAAW,SAAS,WAAW,eAAe;AAC5C,UAAI,MAAM,SAAS,QAAQ;AACzB,cAAM,OAAO,MAAM,kBAAkB,KAAK;AAC1C,cAAM,SAAS,MAAM,kBAAkB,OAAO;AAC9C,YAAI,QAAQ,QAAQ;AAClB,gBAAM,MAAM,KAAK,KAAK,QAAQ,SAAS,EAAE;AACzC,cAAI,QAAQ,OAAO;AACnB,cAAI,OAAO,SAAS,UAAU;AAC5B,kBAAM,OAAO,OAAO,cAAc;cAChC,CAAC,MAAM,EAAE,SAAS;YACpB;AACA,gBAAI,MAAM;AACR,sBAAQ,KAAK;YACf;UACF;AACA,2BAAiB,IAAI,KAAK,KAAK;AAC/B,cAAI,QAAQ,cAAc,QAAQ,QAAQ;AACxC,sBAAU;UACZ;QACF;MACF;IACF;EACF;AAEA,SAAO;IACL;IACA,WAAW,UAAU,cAAc;IACnC,eAAe,UAAU,cAAc;IACvC,aAAa,UAAU,YAAY;IACnC;IACA;EACF;AACF;AAEA,eAAsB,cACpB,IACA,QACA,YACyB;AACzB,QAAM,QAAQ,MAAM,GAAG,YAAY,UAAU;AAC7C,MAAI,CAAC,OAAO;AACV,WAAO,CAAC;EACV;AAEA,QAAM,EAAE,MAAM,OAAO,IAAI;AACzB,QAAMD,QAAO;AACb,QAAM,OAAO,GAAG,MAAMA,OAAM,IAAI;AAChC,MAAI,CAAC,MAAM;AACT,WAAO,CAAC;EACV;AAEA,QAAMI,SAAQ,GAAG,SAAS,MAAM,OAAO,QAAQ,SAAS;AACxD,MAAI,CAACA,QAAO;AACV,WAAO,CAAC;EACV;AAEA,QAAM,YAA4B,CAAC;AACnC,QAAM,UAAUA,OAAM,QAAQ,KAAK,QAAQ;AAE3C,aAAW,SAAS,SAAS;AAC3B,UAAM,WAAW,WAAW,MAAM,UAAU,WAAW;AACvD,UAAM,aAAa,WAAW,MAAM,UAAU,aAAa;AAC3D,UAAM,kBAAkB,WAAW,MAAM,UAAU,mBAAmB;AACtE,UAAM,WAAW,WAAW,MAAM,UAAU,WAAW;AAEvD,QAAI,CAAC,YAAY,CAAC,UAAU;AAC1B;IACF;AAEA,UAAML,QAAO,SAAS;AAEtB,QAAI,CAAC,MAAM,OAAO,SAAS,UAAU,SAAS,MAAM,EAAE,SAASA,KAAI,GAAG;AACpE;IACF;AAEA,UAAM,SAAS,kBACX,CAAC,gBAAgB,IAAI,IACrB,aACE,cAAc,WAAW,IAAI,IAC7B,CAAC;AAEP,UAAM,WAAW,SAAS,cAAc;AACxC,UAAM,cAAc,WAAW;AAC/B,UAAM,QAAQC,MAAK,MAAM,IAAI;AAC7B,UAAM,WAAW,cAAc,MAAM,SAAS,MAAM,WAAW,IAAI;AACnE,UAAM,aAAa,SAAS,MAAM,QAAQ,IAAI,CAAC,KAAK;AAEpD,cAAU,KAAK;MACb,MAAAD;MACA;MACA,aAAa,SAAS,KAAKA,KAAI;MAC/B;MACA;IACF,CAAC;EACH;AAEA,SAAO;AACT;AAEA,eAAsB,oBACpB,IACA,QACA,YAC2B;AAC3B,QAAM,QAAQ,MAAM,GAAG,YAAY,UAAU;AAC7C,MAAI,CAAC,OAAO;AACV,WAAO,CAAC;EACV;AAEA,QAAM,EAAE,MAAM,OAAO,IAAI;AACzB,QAAM,OAAO,GAAG,MAAM,QAAQ,IAAI;AAClC,MAAI,CAAC,MAAM;AACT,WAAO,CAAC;EACV;AAEA,QAAM,aAAa,oBAAoB,GAAG,MAAM;AAChD,QAAM,EAAE,cAAc,IAAI,YAAY,IAAI,MAAM,MAAM,MAAM;AAC5D,aAAW,KAAK,eAAe;AAC7B,eAAW,IAAI,CAAC;EAClB;AAEA,QAAM,cAAgC,CAAC;AAEvC,QAAM,cAAc,GAAG,SAAS,MAAM,OAAO,QAAQ,eAAe;AACpE,MAAI,aAAa;AACf,UAAM,UAAU,YAAY,QAAQ,KAAK,QAAQ;AACjD,eAAW,SAAS,SAAS;AAC3B,YAAM,UAAU,WAAW,MAAM,UAAU,UAAU;AACrD,YAAM,aAAa,WAAW,MAAM,UAAU,QAAQ;AACtD,YAAM,aAAa,WAAW,MAAM,UAAU,QAAQ;AACtD,YAAM,UAAU,WAAW,MAAM,UAAU,UAAU;AAErD,UAAI,CAAC,WAAW,CAAC,cAAc,CAAC,cAAc,CAAC,SAAS;AACtD;MACF;AACA,YAAM,gBAAgB;QACpB;QACA,GAAG,OAAO;MACZ;AACA,UAAI,CAAC,iBAAiB,CAAC,WAAW,IAAI,aAAa,GAAG;AACpD;MACF;AAEA,YAAM,SAAS,WAAW;AAC1B,UAAI,CAAC,OAAO,YAAY,IAAI,MAAM,GAAG;AACnC;MACF;AAIA,YAAM,aAAa,QAAQ;AAC3B,YAAM,oBAAoB,aACtB,WAAW,cAAc,KAAK,CAAC,MAAM,EAAE,SAAS,iBAAiB,IACjE;AAEJ,kBAAY,KAAK;QACf,SAAS,QAAQ;QACjB;QACA,SAAS,iBAAiB,QAAQ,IAAI;QACtC,MAAM,QAAQ,cAAc;QAC5B,eAAe,QAAQ,YAAY;QACnC;MACF,CAAC;IACH;EACF;AAEA,SAAO;AACT;AEphCA,IAAM,OAAuB;EAC3B,OAAO;EAAC;AACV;AAEA,IAAI,UAA0B;AAMvB,SAAS,KAAK,YAAoBM,OAAuB;AAC9D,UAAQ,KAAK,SAAS,GAAGA,KAAI;AAC/B;ACuCO,IAAM,iBAAkC;EAC7C,uBAAuB,CAAC;EACxB,yBAAyB,CAAC;EAC1B,qBAAqB;AACvB;AFjDA,SAAS,qBAA6B;AACpC,QAAM,WAAW,cAAc,YAAY,GAAG;AAC9C,QAAM,MAAW,aAAQ,QAAQ;AACjC,QAAM,aAAa;IACZ,UAAK,KAAK,MAAM,UAAU;IAC1B,UAAK,KAAK,UAAU;IACpB,UAAK,KAAK,MAAM,MAAM,UAAU;EACvC;AACA,SAAO,WAAW,KAAK,CAAC,MAAM,WAAW,CAAC,CAAC,KAAK,WAAW,CAAC;AAC9D;AAEO,IAAM,gBAAN,MAAoB;EACjB,SAAwB;EACxB,YAAY,oBAAI,IAA6B;EAC7C,aAAa,oBAAI,IAA0B;EAC3C,eAAe;EACf,cAAoC;EACpC,UAAU,mBAAmB;EACrC,SAA0B;EAE1B,aAAa,QAA+B;AAC1C,SAAK,SAAS;AACd,SAAK,WAAW,MAAM;EACxB;EAEA,MAAc,oBAAmC;AAC/C,QAAI,CAAC,KAAK,aAAa;AACrB,WAAK,cAAc,KAAK,OAAO;IACjC;AACA,WAAO,KAAK;EACd;EAEA,MAAc,SAAwB;AACpC,QAAI;AACF,YAAM,uBAAAC,QAAO,KAAK;QAChB,YAAY,CAAC,eAA4B,UAAK,KAAK,SAAS,UAAU;MACxE,CAAC;AACD,WAAK,SAAS,IAAI,uBAAAA,QAAO;IAC3B,SAASC,MAAK;AACZ,WAAK,cAAc;AACnB,WAAK,2CAA2CA,IAAG;AACnD,YAAMA;IACR;EACF;EAEA,YAAY,QAAyB;AACnC,WAAO,UAAU;EACnB;EAEA,IAAI,qBAA+B;AACjC,WAAO,OAAO,KAAK,aAAa;EAClC;EAEA,MAAM,YACJ,QAC+D;AAC/D,UAAM,KAAK,kBAAkB;AAC7B,QAAI,CAAC,KAAK,QAAQ;AAChB,aAAO;IACT;AAEA,UAAM,SAAS,cAAc,MAAM;AACnC,QAAI,CAAC,QAAQ;AACX,aAAO;IACT;AAEA,QAAI,OAAO,KAAK,UAAU,IAAI,OAAO,IAAI;AACzC,QAAI,CAAC,MAAM;AACT,UAAI;AACF,cAAM,WAAgB,UAAK,KAAK,SAAS,OAAO,IAAI;AACpD,eAAO,MAAM,uBAAAD,QAAO,SAAS,KAAK,QAAQ;AAC1C,aAAK,UAAU,IAAI,OAAO,MAAM,IAAI;MACtC,SAASC,MAAK;AACZ,aAAK,0BAA0B,OAAO,IAAI,IAAIA,IAAG;AACjD,eAAO;MACT;IACF;AAEA,WAAO,EAAE,MAAM,OAAO;EACxB;EAEA,MAAMC,OAAc,MAA2C;AAC7D,QAAI,CAAC,KAAK,QAAQ;AAChB,aAAO;IACT;AACA,SAAK,OAAO,YAAY,IAAI;AAC5B,WAAO,KAAK,OAAO,MAAMA,KAAI;EAC/B;EAEA,SAAS,MAAuB,UAAuC;AACrE,QAAI,CAAC,SAAS,KAAK,GAAG;AACpB,aAAO;IACT;AAEA,UAAM,WAAW,GAAG,KAAK,SAAS,CAAC,IAAI,QAAQ;AAC/C,QAAIC,SAAQ,KAAK,WAAW,IAAI,QAAQ;AACxC,QAAIA,QAAO;AAET,WAAK,WAAW,OAAO,QAAQ;AAC/B,WAAK,WAAW,IAAI,UAAUA,MAAK;AACnC,aAAOA;IACT;AAEA,QAAI;AACF,MAAAA,SAAQ,KAAK,MAAM,QAAQ;AAE3B,UAAI,KAAK,WAAW,QAAQ,KAAK,cAAc;AAC7C,cAAM,SAAS,KAAK,WAAW,KAAK,EAAE,KAAK,EAAE;AAC7C,YAAI,WAAW,QAAW;AACxB,eAAK,WAAW,OAAO,MAAM;QAC/B;MACF;AACA,WAAK,WAAW,IAAI,UAAUA,MAAK;AACnC,aAAOA;IACT,SAASF,MAAK;AACZ,WAAK,4BAA4BA,IAAG;AACpC,aAAO;IACT;EACF;EAEA,UAAgB;AACd,SAAK,QAAQ,OAAO;AACpB,SAAK,SAAS;AACd,SAAK,cAAc;AACnB,SAAK,UAAU,MAAM;AACrB,SAAK,WAAW,MAAM;EACxB;AACF;AGtHA,eAAsB,oBACpB,IACA,QACA,YAC0B;AAC1B,QAAM,QAAQ,MAAM,GAAG,YAAY,UAAU;AAC7C,MAAI,CAAC,OAAO;AACV,WAAO,CAAC;EACV;AAEA,QAAM,EAAE,MAAM,OAAO,IAAI;AACzB,QAAM,OAAO,GAAG,MAAM,QAAQ,IAAI;AAClC,MAAI,CAAC,MAAM;AACT,WAAO,CAAC;EACV;AAEA,QAAM,aAAa,oBAAoB,GAAG,MAAM;AAChD,QAAM,EAAE,cAAc,IAAI,YAAY,IAAI,MAAM,MAAM,MAAM;AAC5D,aAAW,KAAK,eAAe;AAC7B,eAAW,IAAI,CAAC;EAClB;AAEA,QAAM,WAA4B,CAAC;AAGnC,QAAM,cAAc,GAAG,SAAS,MAAM,OAAO,QAAQ,eAAe;AACpE,MAAI,aAAa;AACf,UAAM,UAAU,YAAY,QAAQ,KAAK,QAAQ;AACjD,eAAW,SAAS,SAAS;AAC3B,YAAM,UAAU,WAAW,MAAM,UAAU,UAAU;AACrD,YAAM,aAAa,WAAW,MAAM,UAAU,QAAQ;AACtD,YAAM,aAAa,WAAW,MAAM,UAAU,QAAQ;AACtD,YAAM,UAAU,WAAW,MAAM,UAAU,UAAU;AACrD,YAAM,aAAa,WAAW,MAAM,UAAU,YAAY;AAE1D,UAAI,CAAC,WAAW,CAAC,cAAc,CAAC,cAAc,CAAC,SAAS;AACtD;MACF;AACA,YAAM,gBAAgB;QACpB;QACA,GAAG,OAAO;MACZ;AACA,UAAI,CAAC,iBAAiB,CAAC,WAAW,IAAI,aAAa,GAAG;AACpD;MACF;AAEA,YAAM,SAAS,WAAW;AAC1B,UAAI,CAAC,OAAO,YAAY,IAAI,MAAM,GAAG;AACnC;MACF;AAEA,YAAM,UAAU,QAAQ;AACxB,YAAM,UAAU,iBAAiB,QAAQ,IAAI;AAC7C,YAAM,YAAY,cAAc;AAGhC,yBAAmB,KAAK,UAAU,SAAS,SAAS,WAAW,QAAQ;AACvE,uBAAiB,KAAK,UAAU,SAAS,SAAS,WAAW,QAAQ;IACvE;EACF;AAGA,QAAM,cAAc,iBAAiB,IAAI,MAAM,IAAI;AACnD,MAAI,YAAY,OAAO,GAAG;AACxB,QAAI;AACJ,QAAI,OAAO,QAAQ,qBAAqB,QAAW;AAEjD,4BAAsB;;;;;;;;;;;;;;IAcxB,WAAW,OAAO,QAAQ,uBAAuB,QAAW;AAE1D,4BAAsB;;;;;;;;IAQxB,OAAO;AAEL,4BAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAqCxB;AACA,UAAM,mBAAmB,GAAG,SAAS,MAAM,mBAAmB;AAC9D,QAAI,kBAAkB;AACpB,YAAM,UAAU,iBAAiB,QAAQ,KAAK,QAAQ;AACtD,iBAAW,SAAS,SAAS;AAC3B,cAAM,UAAU,WAAW,MAAM,UAAU,UAAU;AACrD,cAAM,aAAa,WAAW,MAAM,UAAU,QAAQ;AACtD,cAAM,aAAa,WAAW,MAAM,UAAU,QAAQ;AACtD,cAAM,UAAU,WAAW,MAAM,UAAU,SAAS;AACpD,cAAM,aAAa,WAAW,MAAM,UAAU,YAAY;AAE1D,YAAI,CAAC,WAAW,CAAC,cAAc,CAAC,cAAc,CAAC,SAAS;AACtD;QACF;AACA,cAAM,gBAAgB;UACpB;UACA,GAAG,OAAO;QACZ;AACA,YAAI,CAAC,iBAAiB,CAAC,WAAW,IAAI,aAAa,GAAG;AACpD;QACF;AACA,YAAI,CAAC,OAAO,YAAY,IAAI,WAAW,IAAI,GAAG;AAC5C;QACF;AAEA,cAAM,WAAW,YAAY,IAAI,QAAQ,IAAI;AAC7C,YAAI,CAAC,UAAU;AACb;QACF;AAEA,cAAM,UAAU,QAAQ;AACxB,cAAM,YAAY,cAAc;AAChC;UACE,KAAK;UACL;UACA;UACA;UACA;QACF;AACA,yBAAiB,KAAK,UAAU,SAAS,UAAU,WAAW,QAAQ;MACxE;IACF;EACF;AAGA,QAAM,oBAAoB,oBAAI,IAAI;IAChC,GAAG,GAAG,OAAO;IACb;IACA;IACA;EACF,CAAC;AACD,MAAI,kBAAkB,OAAO,KAAK,OAAO,QAAQ,mBAAmB;AAClE,UAAM,qBACJ,OAAO,QAAQ,uBAAuB;;MAElC;;;;;;;;MAOA;;;;;;;;;;;;;;AAaN,UAAM,kBAAkB,GAAG,SAAS,MAAM,kBAAkB;AAC5D,QAAI,iBAAiB;AACnB,YAAM,UAAU,gBAAgB,QAAQ,KAAK,QAAQ;AACrD,iBAAW,SAAS,SAAS;AAC3B,cAAM,UAAU,WAAW,MAAM,UAAU,UAAU;AACrD,cAAM,WAAW,WAAW,MAAM,UAAU,WAAW;AACvD,cAAM,UAAU,WAAW,MAAM,UAAU,UAAU;AACrD,cAAM,aAAa,WAAW,MAAM,UAAU,YAAY;AAE1D,YAAI,CAAC,WAAW,CAAC,YAAY,CAAC,SAAS;AACrC;QACF;AACA,YAAI,CAAC,kBAAkB,IAAI,SAAS,IAAI,GAAG;AACzC;QACF;AAEA,cAAM,UAAU,QAAQ;AACxB,cAAM,UAAU,iBAAiB,QAAQ,IAAI;AAC7C,cAAM,YAAY,cAAc;AAEhC;UACE,KAAK;UACL;UACA;UACA;UACA;QACF;AACA,yBAAiB,KAAK,UAAU,SAAS,SAAS,WAAW,QAAQ;MACvE;IACF;EACF;AAGA,QAAM,eAAe,GAAG,OAAO;AAC/B,oBAAkB,KAAK,UAAU,YAAY,QAAQ,UAAU,YAAY;AAG3E,iBAAe,KAAK,UAAU,YAAY,QAAQ,UAAU,YAAY;AAExE,SAAO;AACT;AAIA,SAAS,mBACP,OACA,SACA,SACA,WACA,UACM;AAEN,QAAM,QAAQ,UAAU;AACxB,MAAI,CAAC,OAAO;AACV;EACF;AAEA,MAAI,kBAAkB;AACtB,aAAW,SAAS,MAAM,eAAe;AACvC,QACE,MAAM,cAAc,UAAU,cAC9B,MAAM,YAAY,UAAU,UAC5B;AACA,wBAAkB;IACpB;AACA,QAAI,CAAC,iBAAiB;AACpB;IACF;AACA,QAAI,UAAU,WAAW;AACvB;IACF;AAGA,QAAI,MAAM,SAAS,kBAAkB,MAAM,SAAS,MAAM;AACxD,6BAAuB,OAAO,SAAS,SAAS,QAAQ;IAC1D;EACF;AACF;AAEA,SAAS,uBACP,QACA,SACA,SACA,UACM;AACN,QAAM,YAAY,OAAO,kBAAkB,WAAW;AACtD,QAAM,cAAc,OAAO,kBAAkB,aAAa;AAC1D,QAAM,cAAc,OAAO,kBAAkB,aAAa;AAE1D,MAAI,CAAC,aAAa,CAAC,aAAa;AAC9B;EACF;AAGA,MACE,CAAC,IAAI,OAAO,MAAM,QAAQ,QAAQ,uBAAuB,MAAM,CAAC,KAAK,EAAE;IACrE,UAAU;EACZ,GACA;AACA;EACF;AAEA,MAAI,UAAU,kBAAkB,WAAW,OAAO;AAGlD,MAAI,YAAY,MAAM;AACpB,UAAM,oBAAoB,wBAAwB,WAAW,OAAO;AACpE,QAAI,mBAAmB;AACrB,YAAM,UAAU,UAAU,SAAS;AACnC,gBAAU,UAAU,UAAU;IAChC;EACF;AAEA,MAAI,YAAY,MAAM;AACpB;EACF;AAEA,WAAS,KAAK;IACZ;IACA,YAAY;IACZ,eAAe,OAAO,cAAc;IACpC,WAAW,OAAO,cAAc;IAChC,SAAS,YAAY,YAAY;EACnC,CAAC;AAED,MAAI,aAAa;AAEf,QAAI,YAAY,SAAS,iBAAiB,YAAY,SAAS,SAAS;AACtE,6BAAuB,aAAa,SAAS,SAAS,QAAQ;IAChE,WAAW,YAAY,SAAS,eAAe;AAG7C,YAAM,UAAU,YAAY,cAAc;QACxC,CAAC,MAAM,EAAE,SAAS;MACpB;AACA,UAAI,SAAS;AACX,+BAAuB,SAAS,SAAS,SAAS,QAAQ;MAC5D,OAAO;AACL,cAAMG,QACJ,YAAY,kBAAkB,MAAM,KAAK,YAAY,cAAc,CAAC;AACtE,YAAIA,OAAM;AACR,gBAAM,cACJ,YAAY,SACR,UACA,YAAY,UACV,SACA;AACR,mBAAS,KAAK;YACZ;YACA,YAAY;YACZ,eAAe,YAAY,cAAc;YACzC,WAAW,YAAY,cAAc;YACrC,SAASA,MAAK,YAAY;UAC5B,CAAC;QACH;MACF;IACF,WAAW,YAAY,SAAS,gBAAgB;AAE9C,6BAAuB,aAAa,SAAS,SAAS,QAAQ;IAChE,WAAW,YAAY,SAAS,SAAS;AAEvC,YAAM,cACJ,YAAY,SAAS,UAAU,YAAY,UAAU,SAAS;AAChE,eAAS,KAAK;QACZ;QACA,YAAY;QACZ,eAAe,YAAY,cAAc;QACzC,WAAW,YAAY,cAAc;QACrC,SAAS,YAAY,YAAY;MACnC,CAAC;IACH,WAAW,YAAY,SAAS,QAAQ;AAEtC,YAAM,YACJ,YAAY,cAAc,YAAY,cAAc,SAAS,CAAC,KAC9D;AACF,YAAM,cACJ,YAAY,SAAS,UAAU,YAAY,UAAU,SAAS;AAChE,eAAS,KAAK;QACZ;QACA,YAAY;QACZ,eAAe,YAAY,cAAc;QACzC,WAAW,YAAY,cAAc;QACrC,SAAS,UAAU,YAAY;MACjC,CAAC;IACH;EACF;AACF;AAEA,SAAS,iBACP,OACA,SACA,SACA,WACA,UACM;AACN,QAAM,QAAQ,UAAU;AACxB,MAAI,CAAC,OAAO;AACV;EACF;AAEA,MAAI,kBAAkB;AACtB,aAAW,SAAS,MAAM,eAAe;AACvC,QAAI,MAAM,cAAc,UAAU,YAAY;AAC5C,wBAAkB;IACpB;AACA,QAAI,CAAC,mBAAmB,UAAU,WAAW;AAC3C;IACF;AAGA,QACE,MAAM,SAAS,sBACf,MAAM,SAAS,+BACf;AACA,YAAM,QAAQ,MAAM,kBAAkB,OAAO;AAC7C,UAAI,CAAC,OAAO;AACV;MACF;AAGA,YAAM,cAAc,kBAAkB,KAAK;AAC3C,UAAI,gBAAgB,SAAS;AAC3B;MACF;AAIA,YAAM,gBAAgB,MAAM,kBAAkB,MAAM,KAAK;AAEzD,iBAAW,YAAY,cAAc,eAAe;AAElD,YACE,SAAS,SAAS,iBAClB,SAAS,SAAS,mBAClB;AACA,gBAAM,YAAY,SAAS,kBAAkB,OAAO;AACpD,gBAAM,aAAa,YACf,2BAA2B,SAAS,IACpC;AAGJ,gBAAM,cAAc,SAAS;AAC7B,gBAAM,UAAU,cACZ,YAAY,cAAc,MAAM,IAChC,cAAc,YAAY,MAAM;AAEpC,mBAAS,KAAK;YACZ;YACA,YAAY,cAAc;YAC1B,eAAe,SAAS,cAAc;YACtC,WAAW,SAAS,cAAc;YAClC;UACF,CAAC;QAEH,WACE,SAAS,SAAS,oBAClB,SAAS,SAAS,gBAClB;AACA,gBAAM,cAAc,SAAS;AAC7B,gBAAM,UAAU,cACZ,YAAY,cAAc,MAAM,IAChC,cAAc,YAAY,MAAM;AAEpC,mBAAS,KAAK;YACZ;YACA,YAAY;YACZ,eAAe,SAAS,cAAc;YACtC,WAAW,SAAS,cAAc;YAClC;UACF,CAAC;QACH;MACF;IACF;AAGA,QAAI,MAAM,SAAS,QAAQ;AACzB,YAAM,QAAQ,MAAM,cAAc,CAAC;AACnC,UAAI,CAAC,SAAS,MAAM,SAAS,QAAQ;AACnC;MACF;AAEA,YAAM,cAAc,kBAAkB,KAAK;AAC3C,UAAI,gBAAgB,SAAS;AAC3B;MACF;AAEA,iBAAW,aAAa,MAAM,eAAe;AAC3C,YAAI,UAAU,SAAS,QAAQ;AAE7B,gBAAM,WAAW,UAAU,cAAc;YACvC,CAAC,MAAM,EAAE,SAAS;UACpB;AACA,gBAAMA,QAAO,UAAU,kBAAkB,MAAM;AAC/C,gBAAM,eAAe,SAAS,CAAC;AAC/B,gBAAM,aAAa,cAAc,cAAc,CAAC;AAChD,gBAAM,aAAa,aACf,sBAAsB,UAAU,IAChC;AAEJ,gBAAM,UAAUA,QACZA,MAAK,YAAY,MACjB,UAAU,YAAY;AAE1B,mBAAS,KAAK;YACZ;YACA,YAAY,cAAc;YAC1B,eAAe,UAAU,cAAc;YACvC,WAAW,UAAU,cAAc;YACnC;UACF,CAAC;QACH,WAAW,UAAU,SAAS,QAAQ;AACpC,gBAAM,YACJ,UAAU,cAAc,UAAU,cAAc,SAAS,CAAC,KAC1D;AACF,mBAAS,KAAK;YACZ;YACA,YAAY;YACZ,eAAe,UAAU,cAAc;YACvC,WAAW,UAAU,cAAc;YACnC,SAAS,UAAU,YAAY;UACjC,CAAC;QACH;MACF;IACF;EACF;AACF;AAEA,SAAS,kBACP,MACA,SACA,QACA,UACA,cACM;AAEN,QAAM,UAAU,CAAC,gBAAgB,IAAI;AACrC,aAAW,UAAU,SAAS;AAC5B,cAAU,MAAM,QAAQ,CAAC,WAAW;AAClC,YAAM,YAAY,OAAO,kBAAkB,WAAW;AACtD,YAAM,cAAc,OAAO,kBAAkB,aAAa;AAC1D,UAAI,CAAC,aAAa,CAAC,aAAa;AAC9B;MACF;AAGA,YAAM,WAAW;QACf;QACA;QACA;QACA;MACF;AACA,UAAI,CAAC,UAAU;AACb;MACF;AAEA,eAAS,KAAK;QACZ,SAAS,SAAS;QAClB,YAAY,SAAS;QACrB,eAAe,OAAO,cAAc;QACpC,WAAW,OAAO,cAAc;QAChC,SAAS,YAAY,YAAY;MACnC,CAAC;AAGD,YAAM,cAAc,OAAO,kBAAkB,aAAa;AAC1D,UAAI,aAAa;AAEf,YACE,YAAY,SAAS,iBACrB,YAAY,SAAS,SACrB;QAEF,WAAW,YAAY,SAAS,eAAe;AAG7C,gBAAM,UAAU,YAAY,cAAc;YACxC,CAAC,MAAM,EAAE,SAAS;UACpB;AACA,cAAI,CAAC,SAAS;AACZ,kBAAMA,QACJ,YAAY,kBAAkB,MAAM,KACpC,YAAY,cAAc,CAAC;AAC7B,gBAAIA,OAAM;AACR,uBAAS,KAAK;gBACZ,SAAS,SAAS;gBAClB,YAAY;gBACZ,eAAe,YAAY,cAAc;gBACzC,WAAW,YAAY,cAAc;gBACrC,SAASA,MAAK,YAAY;cAC5B,CAAC;YACH;UACF;QACF,WAAW,YAAY,SAAS,gBAAgB;QAEhD,WAAW,YAAY,SAAS,SAAS;AAEvC,mBAAS,KAAK;YACZ,SAAS,SAAS;YAClB,YAAY;YACZ,eAAe,YAAY,cAAc;YACzC,WAAW,YAAY,cAAc;YACrC,SAAS,YAAY,YAAY;UACnC,CAAC;QACH,WAAW,YAAY,SAAS,QAAQ;AAEtC,gBAAM,YACJ,YAAY,cAAc,YAAY,cAAc,SAAS,CAAC,KAC9D;AACF,mBAAS,KAAK;YACZ,SAAS,SAAS;YAClB,YAAY;YACZ,eAAe,YAAY,cAAc;YACzC,WAAW,YAAY,cAAc;YACrC,SAAS,UAAU,YAAY;UACjC,CAAC;QACH;MACF;IACF,CAAC;EACH;AAGA,YAAU,MAAM,eAAe,CAAC,aAAa;AAC3C,UAAM,YAAY,SAAS,kBAAkB,WAAW;AACxD,UAAM,cAAc,SAAS,kBAAkB,aAAa;AAC5D,QAAI,CAAC,aAAa,CAAC,aAAa;AAC9B;IACF;AAEA,UAAM,WAAW;MACf;MACA;MACA;MACA;IACF;AACA,QAAI,CAAC,UAAU;AACb;IACF;AAEA,aAAS,KAAK;MACZ,SAAS,SAAS;MAClB,YAAY,SAAS;MACrB,eAAe,SAAS,cAAc;MACtC,WAAW,SAAS,cAAc;MAClC,SAAS,YAAY,YAAY;IACnC,CAAC;AAED,UAAM,cAAc,SAAS,kBAAkB,aAAa;AAC5D,QAAI,aAAa;AACf,UAAI,YAAY,SAAS,eAAe;AACtC,cAAMA,QACJ,YAAY,kBAAkB,MAAM,KAAK,YAAY,cAAc,CAAC;AACtE,YAAIA,OAAM;AACR,mBAAS,KAAK;YACZ,SAAS,SAAS;YAClB,YAAY;YACZ,eAAe,YAAY,cAAc;YACzC,WAAW,YAAY,cAAc;YACrC,SAASA,MAAK,YAAY;UAC5B,CAAC;QACH;MACF;IAEF;EACF,CAAC;AACH;AAEA,SAAS,eACP,MACA,SACA,QACA,UACA,cACM;AACN,QAAM,iBAAiB,CAAC,gBAAgB,IAAI;AAC5C,aAAW,UAAU,gBAAgB;AACnC,cAAU,MAAM,QAAQ,CAAC,WAAW;AAClC,YAAM,YAAY,OAAO,kBAAkB,WAAW;AACtD,YAAM,cAAc,OAAO,kBAAkB,aAAa;AAC1D,UAAI,CAAC,aAAa,CAAC,aAAa;AAC9B;MACF;AAEA,YAAM,UAAU;QACd;QACA;QACA;QACA;MACF;AACA,UAAI,CAAC,SAAS;AACZ;MACF;AAGA,YAAM,UAAU,UAAU,SAAS;AAEnC,eAAS,KAAK;QACZ;QACA,YAAY,UAAU,UAAU;QAChC,eAAe,OAAO,cAAc;QACpC,WAAW,OAAO,cAAc;QAChC,SAAS,YAAY,YAAY;MACnC,CAAC;AAED,YAAM,cAAc,OAAO,kBAAkB,aAAa;AAC1D,UAAI,aAAa;AAEf,YACE,YAAY,SAAS,iBACrB,YAAY,SAAS,SACrB;QAEF,WAAW,YAAY,SAAS,eAAe;AAG7C,gBAAM,UAAU,YAAY,cAAc;YACxC,CAAC,MAAM,EAAE,SAAS;UACpB;AACA,cAAI,CAAC,SAAS;AACZ,kBAAMA,QACJ,YAAY,kBAAkB,MAAM,KACpC,YAAY,cAAc,CAAC;AAC7B,gBAAIA,OAAM;AACR,uBAAS,KAAK;gBACZ;gBACA,YAAY,UAAU,SAAS;gBAC/B,eAAe,YAAY,cAAc;gBACzC,WAAW,YAAY,cAAc;gBACrC,SAASA,MAAK,YAAY;cAC5B,CAAC;YACH;UACF;QACF,WAAW,YAAY,SAAS,SAAS;AAEvC,mBAAS,KAAK;YACZ;YACA,YAAY,UAAU,SAAS;YAC/B,eAAe,YAAY,cAAc;YACzC,WAAW,YAAY,cAAc;YACrC,SAAS,YAAY,YAAY;UACnC,CAAC;QACH,WAAW,YAAY,SAAS,QAAQ;AAEtC,gBAAM,YACJ,YAAY,cAAc,YAAY,cAAc,SAAS,CAAC,KAC9D;AACF,mBAAS,KAAK;YACZ;YACA,YAAY,UAAU,SAAS;YAC/B,eAAe,YAAY,cAAc;YACzC,WAAW,YAAY,cAAc;YACrC,SAAS,UAAU,YAAY;UACjC,CAAC;QACH;MACF;IACF,CAAC;EACH;AAGA,QAAM,YAAY,CAAC,eAAe,OAAO;AACzC,aAAW,YAAY,WAAW;AAChC,cAAU,MAAM,UAAU,CAAC,aAAa;AACtC,YAAM,YAAY,SAAS,kBAAkB,WAAW;AACxD,YAAM,cAAc,SAAS,kBAAkB,aAAa;AAC5D,UAAI,CAAC,aAAa,CAAC,aAAa;AAC9B;MACF;AAEA,YAAM,UAAU;QACd;QACA;QACA;QACA;MACF;AACA,UAAI,CAAC,SAAS;AACZ;MACF;AAEA,YAAM,UAAU,UAAU,SAAS;AAEnC,eAAS,KAAK;QACZ;QACA,YAAY,UAAU,UAAU;QAChC,eAAe,SAAS,cAAc;QACtC,WAAW,SAAS,cAAc;QAClC,SAAS,YAAY,YAAY;MACnC,CAAC;AAED,YAAM,cAAc,SAAS,kBAAkB,aAAa;AAC5D,UAAI,aAAa;AACf,YAAI,YAAY,SAAS,eAAe;AACtC,gBAAMA,QACJ,YAAY,kBAAkB,MAAM,KACpC,YAAY,cAAc,CAAC;AAC7B,cAAIA,OAAM;AACR,qBAAS,KAAK;cACZ;cACA,YAAY,UAAU,SAAS;cAC/B,eAAe,YAAY,cAAc;cACzC,WAAW,YAAY,cAAc;cACrC,SAASA,MAAK,YAAY;YAC5B,CAAC;UACH;QACF,WAAW,YAAY,SAAS,QAAQ;AAEtC,gBAAM,YACJ,YAAY,cAAc,YAAY,cAAc,SAAS,CAAC,KAC9D;AACF,mBAAS,KAAK;YACZ;YACA,YAAY,UAAU,SAAS;YAC/B,eAAe,YAAY,cAAc;YACzC,WAAW,YAAY,cAAc;YACrC,SAAS,UAAU,YAAY;UACjC,CAAC;QACH;MACF;IACF,CAAC;EACH;AACF;AAIA,SAAS,kBACP,eACA,SACe;AAEf,MAAI,OAAO;AACX,SACE,KAAK,SAAS,8BACd,KAAK,cAAc,WAAW,GAC9B;AACA,WAAO,KAAK,cAAc,CAAC;EAC7B;AAGA,MAAI,KAAK,SAAS,uBAAuB,KAAK,SAAS,UAAU;AAC/D,UAAM,OAAO,KAAK,kBAAkB,MAAM;AAC1C,UAAM,QAAQ,KAAK,kBAAkB,OAAO;AAC5C,UAAM,KAAK,KAAK,kBAAkB,UAAU;AAE5C,QAAI,CAAC,QAAQ,CAAC,OAAO;AACnB,aAAO;IACT;AAEA,UAAM,SAAS,IAAI,QAAQ;AAC3B,QACE,WAAW,SACX,WAAW,QACX,WAAW,SACX,WAAW,MACX;AACA,aAAO;IACT;AAEA,QAAI,KAAK,SAAS,SAAS;AACzB,aAAO,sBAAsB,KAAK;IACpC;AACA,QAAI,MAAM,SAAS,SAAS;AAC1B,aAAO,sBAAsB,IAAI;IACnC;EACF;AAGA,MAAI,KAAK,SAAS,uBAAuB;AACvC,UAAM,WAAW,KAAK;AAGtB,QAAI,SAAS,UAAU,GAAG;AACxB,YAAM,OAAO,SAAS,CAAC;AACvB,YAAM,QAAQ,SAAS,SAAS,SAAS,CAAC;AAE1C,YAAM,WAAW,KAAK;AACtB,UAAI,SAAS,SAAS,IAAI,KAAK,SAAS,SAAS,IAAI,GAAG;AACtD,YAAI,KAAK,SAAS,SAAS;AACzB,iBAAO,sBAAsB,KAAK;QACpC;AACA,YAAI,MAAM,SAAS,SAAS;AAC1B,iBAAO,sBAAsB,IAAI;QACnC;MACF;IACF;EACF;AAEA,SAAO;AACT;AAEA,SAAS,0BACP,eACA,SACA,QACA,cAC6C;AAC7C,MAAI,OAAO;AACX,SACE,KAAK,SAAS,8BACd,KAAK,cAAc,WAAW,GAC9B;AACA,WAAO,KAAK,cAAc,CAAC;EAC7B;AAEA,MAAI,OAAiC;AACrC,MAAI,QAAkC;AAGtC,MAAI,KAAK,SAAS,uBAAuB,KAAK,SAAS,UAAU;AAC/D,WAAO,KAAK,kBAAkB,MAAM;AACpC,YAAQ,KAAK,kBAAkB,OAAO;EACxC,WAAW,KAAK,SAAS,uBAAuB;AAE9C,UAAM,WAAW,KAAK;AACtB,QAAI,SAAS,UAAU,GAAG;AACxB,aAAO,SAAS,CAAC;AACjB,cAAQ,SAAS,SAAS,SAAS,CAAC;IACtC;EACF;AAEA,MAAI,CAAC,QAAQ,CAAC,OAAO;AACnB,WAAO;EACT;AAGA,QAAM,YAAY,oBAAI,IAAI,CAAC,mBAAmB,MAAM,CAAC;AACrD,QAAM,WAAW,UAAU,IAAI,KAAK,IAAI,IACpC,OACA,UAAU,IAAI,MAAM,IAAI,IACtB,QACA;AACN,QAAM,YAAY,aAAa,OAAO,QAAQ;AAC9C,MAAI,CAAC,YAAY,CAAC,WAAW;AAC3B,WAAO;EACT;AAEA,MAAI,MAAgC;AACpC,MAAI,OAAiC;AAErC,QAAMC,QAAO,SAAS,kBAAkB,UAAU;AAClD,MACEA,UACCA,MAAK,SAAS,uBACbA,MAAK,SAAS,eACdA,MAAK,SAAS,wBAChB;AACA,UAAMA,MAAK,kBAAkB,QAAQ,KAAKA,MAAK,kBAAkB,SAAS;AAC1E,WACEA,MAAK,kBAAkB,UAAU,KACjCA,MAAK,kBAAkB,WAAW,KAClCA,MAAK,kBAAkB,OAAO;EAClC,OAAO;AAEL,UAAM,SAAS,kBAAkB,UAAU;AAC3C,WAAO,SAAS,kBAAkB,QAAQ;EAC5C;AACA,MAAI,CAAC,OAAO,CAAC,MAAM;AACjB,WAAO;EACT;AACA,QAAM,kBAAkB,kBAAkB,KAAK,YAAY;AAC3D,MAAI,CAAC,mBAAmB,CAAC,QAAQ,IAAI,eAAe,GAAG;AACrD,WAAO;EACT;AAEA,QAAM,SAAS,KAAK;AAEpB,QAAM,cAAc,IAAI;IACtB,CAAC,GAAG,OAAO,WAAW,EAAE;MACtB,CAAC,MACC,EAAE,YAAY,EAAE,SAAS,KAAK,KAAK,EAAE,YAAY,EAAE,SAAS,MAAM;IACtE;EACF;AACA,MAAI,CAAC,YAAY,IAAI,MAAM,GAAG;AAC5B,WAAO;EACT;AAEA,QAAMN,QAAO,SAAS,kBAAkB,WAAW;AACnD,MAAI,CAACA,OAAM;AACT,WAAO;EACT;AACA,QAAM,WAAWA,MAAK,cAAc,CAAC;AACrC,MAAI,CAAC,UAAU;AACb,WAAO;EACT;AAEA,QAAM,UAAU,sBAAsB,QAAQ;AAC9C,QAAM,UAAU,sBAAsB,SAAS;AAC/C,MAAI,CAAC,WAAW,CAAC,SAAS;AACxB,WAAO;EACT;AAEA,SAAO,EAAE,SAAS,QAAQ;AAC5B;AAEA,SAAS,mBACP,eACA,SACA,QACA,cACe;AACf,MAAI,OAAO;AAEX,SACE,KAAK,SAAS,8BACd,KAAK,cAAc,WAAW,GAC9B;AACA,WAAO,KAAK,cAAc,CAAC;EAC7B;AAEA,MACE,KAAK,SAAS,sBACd,KAAK,SAAS,kBACd,KAAK,SAAS,SACd;AACA,UAAM,UACJ,KAAK,kBAAkB,SAAS,KAChC,KAAK,cAAc,KAAK,cAAc,SAAS,CAAC;AAClD,QAAI,SAAS;AACX,aAAO;IACT;EACF;AACA,SACE,KAAK,SAAS,8BACd,KAAK,cAAc,WAAW,GAC9B;AACA,WAAO,KAAK,cAAc,CAAC;EAC7B;AAEA,MAAI,KAAK,SAAS,qBAAqB,KAAK,SAAS,QAAQ;AAC3D,WAAO;EACT;AAEA,MAAI;AACJ,MAAI;AAEJ,QAAMM,QAAO,KAAK,kBAAkB,UAAU;AAC9C,MAAIA,OAAM;AACR,QACEA,MAAK,SAAS,uBACdA,MAAK,SAAS,eACdA,MAAK,SAAS,uBACd;AACA,YAAM,MACJA,MAAK,kBAAkB,QAAQ,KAAKA,MAAK,kBAAkB,SAAS;AACtE,YAAM,OACJA,MAAK,kBAAkB,UAAU,KACjCA,MAAK,kBAAkB,WAAW,KAClCA,MAAK,kBAAkB,OAAO;AAChC,mBAAa,MACR,kBAAkB,KAAK,YAAY,KAAK,SACzC;AACJ,mBAAa,MAAM;IACrB;EACF,OAAO;AAEL,UAAM,WAAW,KAAK,kBAAkB,UAAU;AAClD,UAAM,SAAS,KAAK,kBAAkB,QAAQ;AAC9C,QAAI,YAAY,QAAQ;AACtB,mBAAa,kBAAkB,UAAU,YAAY,KAAK;AAC1D,mBAAa,OAAO;IACtB;EACF;AAEA,MAAI,CAAC,cAAc,CAAC,cAAc,CAAC,QAAQ,IAAI,UAAU,GAAG;AAC1D,WAAO;EACT;AAGA,QAAM,iBAAiB,IAAI;IACzB,CAAC,GAAG,OAAO,WAAW,EAAE;MACtB,CAAC,MACC,EAAE,YAAY,EAAE,SAAS,SAAS,KAClC,EAAE,YAAY,EAAE,SAAS,YAAY;IACzC;EACF;AACA,MAAI,CAAC,eAAe,IAAI,UAAU,GAAG;AACnC,WAAO;EACT;AAEA,QAAMN,QAAO,KAAK,kBAAkB,WAAW;AAC/C,MAAI,CAACA,OAAM;AACT,WAAO;EACT;AACA,QAAM,WAAWA,MAAK,cAAc,CAAC;AACrC,SAAO,WAAW,sBAAsB,QAAQ,IAAI;AACtD;AAEA,SAAS,UAAU,eAA2C;AAC5D,MAAI,OAAO;AACX,SACE,KAAK,SAAS,8BACd,KAAK,cAAc,WAAW,GAC9B;AACA,WAAO,KAAK,cAAc,CAAC;EAC7B;AAEA,SACG,KAAK,SAAS,sBAAsB,KAAK,KAAK,WAAW,GAAG,KAC7D,KAAK,SAAS,kBACb,KAAK,SAAS,WAAW,KAAK,KAAK,WAAW,GAAG;AAEtD;AAGA,SAAS,wBACP,eACA,SACS;AACT,MAAI,OAAO;AACX,SACE,KAAK,SAAS,8BACd,KAAK,cAAc,WAAW,GAC9B;AACA,WAAO,KAAK,cAAc,CAAC;EAC7B;AAEA,MAAI,KAAK,SAAS,gBAAgB,KAAK,SAAS,SAAS;AACvD,WAAO;EACT;AAEA,OACG,KAAK,SAAS,sBACb,KAAK,SAAS,kBACd,KAAK,SAAS,YAChB,KAAK,cAAc,SAAS,GAC5B;AACA,QAAI,QAAQ,KAAK,cAAc,KAAK,cAAc,SAAS,CAAC;AAC5D,WACE,MAAM,SAAS,8BACf,MAAM,cAAc,WAAW,GAC/B;AACA,cAAQ,MAAM,cAAc,CAAC;IAC/B;AACA,QAAI,MAAM,SAAS,gBAAgB,MAAM,SAAS,SAAS;AACzD,aAAO;IACT;EACF;AACA,SAAO;AACT;ACtnCO,IAAM,kBAAN,MAAsB;EACnB,KAAK,IAAI,cAAc;EAE/B,aAAa,QAA+B;AAC1C,SAAK,GAAG,aAAa,MAAM;EAC7B;EAEA,YAAY,QAAyB;AACnC,WAAO,KAAK,GAAG,YAAY,MAAM;EACnC;EAEA,IAAI,qBAA+B;AACjC,WAAO,KAAK,GAAG;EACjB;EAEA,MAAM,iBACJ,QACA,YACwB;AACxB,WAAO,iBAAkB,KAAK,IAAI,QAAQ,UAAU;EACtD;EAEA,MAAM,cACJ,QACA,YAC4B;AAC5B,WAAO,cAAe,KAAK,IAAI,QAAQ,UAAU;EACnD;EAEA,MAAM,cACJ,QACA,YACyB;AACzB,WAAO,cAAe,KAAK,IAAI,QAAQ,UAAU;EACnD;EAEA,MAAM,oBACJ,QACA,YAC0B;AAC1B,WAAO,oBAAqB,KAAK,IAAI,QAAQ,UAAU;EACzD;EAEA,MAAM,oBACJ,QACA,YAC2B;AAC3B,WAAO,oBAAqB,KAAK,IAAI,QAAQ,UAAU;EACzD;EAEA,UAAgB;AACd,SAAK,GAAG,QAAQ;EAClB;AACF;ACnEO,SAAS,iBAAiB,MAAyC;AACxE,MAAI,CAAC,MAAM;AACT,WAAO;EACT;AACA,QAAM,UAAU,KAAK;AACrB,MAAI,SAAS,gBAAgB,OAAO,QAAQ,iBAAiB,UAAU;AACrE,UAAM,KAAK,QAAQ;AACnB,QAAI,GAAG,YAAY,GAAG,SAAS,SAAS,GAAG;AACzC,aAAO;IACT;EACF;AACA,MAAI,SAAS,YAAY,OAAO,QAAQ,aAAa,UAAU;AAC7D,UAAM,WAAW,QAAQ;AACzB,QAAI,OAAO,OAAO,QAAQ,EAAE,KAAK,CAAC,MAAM,MAAM,QAAQ,MAAM,MAAS,GAAG;AACtE,aAAO;IACT;EACF;AACA,SAAO;AACT;AAGO,SAAS,iBAAiB,MAA4B;AAC3D,QAAM,UAAU,KAAK;AACrB,MAAI,CAAC,SAAS;AACZ,WAAO;EACT;AAEA,MAAI,QAAQ,gBAAgB,OAAO,QAAQ,iBAAiB,UAAU;AACpE,UAAM,KAAK,QAAQ;AACnB,QAAI,GAAG,YAAY,GAAG,SAAS,SAAS,GAAG;AACzC,aAAO;IACT;EACF;AAEA,MAAI,QAAQ,UAAU,MAAM,QAAQ,QAAQ,MAAM,GAAG;AACnD,UAAM,SAAS,QAAQ;AACvB,QAAI,OAAO,WAAW,GAAG;AACvB,aAAO;IACT;AACA,WAAO,OAAO,MAAM,CAAC,MAAM;AACzB,YAAM,UAAU,EAAE;AAClB,YAAM,QAAQ,EAAE;AAChB,YAAM,gBAAgB,MAAM,QAAQ,KAAK,KAAK,MAAM,SAAS;AAC7D,aAAO,YAAY,OAAO,CAAC;IAC7B,CAAC;EACH;AAEA,SAAO;AACT;AAGO,SAAS,eAAe,MAAkC;AAC/D,QAAM,UAAU,KAAK;AACrB,MAAI,SAAS,UAAU,MAAM,QAAQ,QAAQ,MAAM,GAAG;AACpD,eAAW,SAAS,QAAQ,QAAQ;AAClC,UAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,cAAM,KAAM,MAAkC;AAC9C,YAAI,OAAO,OAAO,UAAU;AAC1B,iBAAO;QACT;MACF;IACF;EACF;AACA,SAAO;AACT;AAGO,SAAS,gBACd,MAC+C;AAC/C,QAAM,UAAU,KAAK;AACrB,MAAI,SAAS,gBAAgB,OAAO,QAAQ,iBAAiB,UAAU;AACrE,UAAM,KAAK,QAAQ;AAGnB,QAAI,GAAG,YAAY,GAAG,SAAS,SAAS,GAAG;AACzC,aAAO,GAAG;IACZ;EACF;AACA,SAAO,CAAC;AACV;AC1EO,SAAS,kBACd,SACA,MACA,aACA,UAAiC,CAAC,GACV;AACxB,MAAI,CAAC,MAAM;AACT,WAAO;EACT;AAEA,MAAI,CAAC,KAAK,QAAQ;AAChB,WAAO;EACT;AAEA,QAAM,aAAa,YAAY,KAAK,CAAC,MAAM,EAAE,qBAAqB,OAAO;AACzE,MAAI,YAAY,UAAU;AACxB,WAAO;EACT;AAEA,MAAI,iBAAiB,IAAI,GAAG;AAC1B,UAAM,UAAU,QAAQ,oBAAoB;AAC5C,QAAI,UAAU,KAAK,KAAK,YAAY;AAClC,YAAM,YAAY,IAAI,KAAK,KAAK,UAAU;AAC1C,YAAM,QAAQ,KAAK,IAAI,IAAI,UAAU,QAAQ;AAC7C,UAAI,QAAQ,UAAU,OAAY;AAChC,eAAO;MACT;IACF;AACA,WAAO;EACT;AAEA,SAAO;AACT;ACvCA,SAAS,cAAc,YAA4B;AACjD,MAAI,eAAe,YAAY,eAAe,QAAQ;AACpD,WAAO;EACT;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,MAA4B;AACrD,QAAMO,SAAkB,CAAC,UAAU,KAAK,OAAO,GAAG;AAElD,MAAI,KAAK,MAAM;AACb,IAAAA,OAAM,KAAK,KAAK,QAAQ;AACxB,QAAI,KAAK,YAAY,MAAM;AACzB,MAAAA,OAAM,KAAK,GAAG,KAAK,OAAO,cAAc;IAC1C;AACA,QAAI,KAAK,YAAY;AACnB,YAAM,SAAS,KAAK,WAAW,WAAW,aAAa;AACvD,MAAAA,OAAM,KAAK,gBAAgB,KAAK,WAAW,IAAI,MAAM,MAAM,GAAG;IAChE;AACA,QAAI,KAAK,WAAW;AAClB,MAAAA,OAAM,KAAK,UAAU,KAAK,SAAS,GAAG;IACxC;EACF;AAEA,SAAOA,OAAM,KAAK,UAAU;AAC9B;AAEA,SAAS,mBAAmB,OAA8B;AACxD,QAAMA,SAAkB,CAAC,WAAW,MAAM,SAAS,GAAG;AACtD,MAAI,MAAM,UAAU;AAClB,IAAAA,OAAM,KAAK,YAAY;EACzB;AACA,MAAI,MAAM,OAAO,WAAW,QAAW;AACrC,IAAAA,OAAM,KAAK,GAAG,MAAM,MAAM,OAAO,eAAe,CAAC,SAAS;EAC5D;AACA,MAAI,MAAM,OAAO,gBAAgB,QAAW;AAC1C,IAAAA,OAAM,KAAK,GAAG,MAAM,MAAM,YAAY,eAAe,CAAC,QAAQ;EAChE;AACA,MAAI,MAAM,YAAY,aAAa;AACjC,IAAAA,OAAM,KAAK,MAAM,WAAW,WAAW;EACzC;AACA,SAAOA,OAAM,KAAK,UAAU;AAC9B;AAEA,SAAS,iBACP,MACA,eACA,gBACe;AACf,MAAI,KAAK,SAAS,QAAQ;AACxB,UAAM,OAAO,cAAc,IAAI,KAAK,IAAI;AACxC,QAAI,KAAM,QAAO,kBAAkB,IAAI;AACvC,WAAO;EACT;AACA,MAAI,KAAK,SAAS,SAAS;AACzB,UAAM,QAAQ,eAAe,IAAI,KAAK,IAAI;AAC1C,QAAI,MAAO,QAAO,mBAAmB,KAAK;AAC1C,QAAI,KAAK,OAAQ,QAAO,UAAU,KAAK,MAAM;AAC7C,WAAO;EACT;AACA,MAAI,KAAK,SAAS,QAAQ;AACxB,WAAO,gBAAgB,KAAK,IAAI;EAClC;AACA,SAAO;AACT;AAEO,SAAS,eACd,QACA,YACA,OACA,eACA,gBACQ;AACR,QAAM,SAAS,cAAc,UAAU;AACvC,QAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,QAAM,SAAS,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI;AAExD,MAAI,SAAS;AAEb,aAAW,QAAQ,QAAQ;AACzB,UAAM,aAAa,KAAK,OAAO;AAC/B,UAAMC,QAAO,iBAAiB,MAAM,eAAe,cAAc;AACjE,QAAI,CAACA,MAAM;AAEX,UAAM,UAAU,GAAG,MAAM,cAAcA,KAAI;AAC3C,UAAM,SAAS,MAAM,UAAU,GAAG,MAAM,QAAQ,IAAI,CAAC,KAAK;AAC1D,UAAM,OAAO,YAAY,GAAG,GAAG,MAAM,GAAG,OAAO,EAAE;AACjD;EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEO,SAAS,qBACd,QACA,YACA,OACA,eACA,gBACQ;AACR,QAAM,SAAS,cAAc,UAAU;AACvC,QAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,QAAM,SAAS,oBAAI,IAAsB;AAEzC,aAAW,QAAQ,OAAO;AACxB,UAAMA,QAAO,iBAAiB,MAAM,eAAe,cAAc;AACjE,QAAI,CAACA,MAAM;AACX,UAAM,MAAM,OAAO,IAAI,KAAK,IAAI,KAAK,CAAC;AACtC,QAAI,KAAKA,KAAI;AACb,WAAO,IAAI,KAAK,MAAM,GAAG;EAC3B;AAEA,aAAW,CAAC,SAAS,MAAM,KAAK,QAAQ;AACtC,QAAI,UAAU,KAAK,WAAW,MAAM,OAAQ;AAC5C,UAAM,SAAS,IAAI,MAAM,cAAc,OAAO,KAAK,KAAK,CAAC;AACzD,UAAM,OAAO,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,MAAM;EAC7C;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AC1GO,IAAM,iBAAN,MAAqB;EACT;EACA;EACT,cAAqC;EACrC,eAAuC;EAE/C,YAAY,QAAqB,SAA4B;AAC3D,SAAK,SAAS;AACd,SAAK,UAAU;EACjB;EAEA,IAAI,QAAwB;AAC1B,QAAI,KAAK,aAAa;AACpB,aAAO,KAAK;IACd;AAEA,UAAM,UAAU,oBAAI,IAA0B;AAC9C,UAAM,SAAS,KAAK,OAAO;AAC3B,UAAM,cAAc,KAAK,QAAQ,eAAe,CAAC;AAEjD,eAAW,SAAS,QAAQ;AAC1B,UAAI,QAAQ,QAAQ,IAAI,MAAM,OAAO;AACrC,UAAI,CAAC,OAAO;AACV,cAAM,OAAO,KAAK,QAAQ,OAAO,IAAI,MAAM,OAAO;AAClD,gBAAQ;UACN,SAAS,MAAM;UACf,aAAa,CAAC;UACd;UACA,UAAU,iBAAiB,IAAI;UAC/B,WAAW;YACT,MAAM;YACN;YACA;YACA,KAAK,QAAQ;UACf;UACA,SAAS,OAAO,eAAe,IAAI,IAAI;UACvC,UAAU,OAAO,gBAAgB,IAAI,IAAI,CAAC;UAC1C,YAAY,YAAY;YACtB,CAAC,MAAM,EAAE,qBAAqB,MAAM;UACtC;QACF;AACA,gBAAQ,IAAI,MAAM,SAAS,KAAK;MAClC;AACA,YAAM,YAAY,KAAK,KAAK;IAC9B;AAEA,SAAK,cAAc,CAAC,GAAG,QAAQ,OAAO,CAAC;AACvC,WAAO,KAAK;EACd;EAEA,IAAI,SAA0B;AAC5B,QAAI,KAAK,cAAc;AACrB,aAAO,KAAK;IACd;AAEA,UAAM,WAAW,oBAAI,IAA2B;AAChD,UAAM,SAAS,KAAK,OAAO;AAE3B,eAAW,SAAS,QAAQ;AAC1B,UAAI,MAAM,SAAS;AACjB;MACF;AACA,UAAI,QAAQ,SAAS,IAAI,MAAM,IAAI;AACnC,UAAI,CAAC,OAAO;AACV,cAAM,aAAa,KAAK,QAAQ,kBAAkB,IAAI,MAAM,IAAI;AAChE,cAAM,QAAQ,KAAK,QAAQ,YAAY,IAAI,MAAM,IAAI;AACrD,gBAAQ;UACN,WAAW,MAAM;UACjB,aAAa,CAAC;UACd;UACA,UAAU,YAAY,YAAY;UAClC,YAAY,OAAO,cAAc,YAAY,gBAAgB;UAC7D,MAAM,YAAY,QAAQ,CAAC;UAC3B;QACF;AACA,iBAAS,IAAI,MAAM,MAAM,KAAK;MAChC;AACA,YAAM,YAAY,KAAK,KAAK;IAC9B;AAEA,SAAK,eAAe,CAAC,GAAG,SAAS,OAAO,CAAC;AACzC,WAAO,KAAK;EACd;EAEA,SAA6B;AAC3B,UAAM,WAAW,KAAK,OAAO,OAAO;AACpC,UAAM,eAAe,KAAK,QAAQ,eAAe,CAAC;AAElD,UAAM,aAAa,oBAAI,IAA0B;AACjD,eAAW,KAAK,KAAK,OAAO;AAC1B,iBAAW,IAAI,EAAE,SAAS,CAAC;IAC7B;AAEA,UAAM,cAAc,oBAAI,IAA2B;AACnD,eAAW,KAAK,KAAK,QAAQ;AAC3B,kBAAY,IAAI,EAAE,WAAW,CAAC;IAChC;AAEA,WAAO,SAAS,IAAI,CAAC,SAAS;AAC5B,YAAM,WAA6B,EAAE,GAAG,KAAK;AAE7C,UAAI,KAAK,SAAS,QAAQ;AACxB,cAAM,OAAO,WAAW,IAAI,KAAK,IAAI;AACrC,YAAI,MAAM;AACR,mBAAS,WAAW,KAAK;AACzB,mBAAS,YAAY,KAAK;AAC1B,mBAAS,UAAU,KAAK;AACxB,cAAI,KAAK,YAAY;AACnB,qBAAS,iBAAiB,KAAK,WAAW;AAC1C,qBAAS,mBAAmB,KAAK,WAAW,WACxC,aACA;UACN;QACF;MACF,WAAW,KAAK,SAAS,SAAS;AAChC,cAAM,QAAQ,YAAY,IAAI,KAAK,IAAI;AACvC,YAAI,OAAO;AACT,mBAAS,WAAW,MAAM;AAC1B,mBAAS,cAAc,MAAM,YAAY,eAAe;AACxD,mBAAS,aAAa,MAAM;AAC5B,mBAAS,OAAO,MAAM;AACtB,mBAAS,SAAS,MAAM,OAAO;AAC/B,mBAAS,cAAc,MAAM,OAAO;QACtC;MACF;AAEA,aAAO;IACT,CAAC;EACH;EAEA,aAAqB;AACnB,UAAM,aAAa,oBAAI,IAA0B;AACjD,eAAW,KAAK,KAAK,OAAO;AAC1B,iBAAW,IAAI,EAAE,SAAS,CAAC;IAC7B;AAEA,UAAM,cAAc,oBAAI,IAA2B;AACnD,eAAW,KAAK,KAAK,QAAQ;AAC3B,kBAAY,IAAI,EAAE,WAAW,CAAC;IAChC;AAEA,WAAO;MACL,KAAK,OAAO;MACZ,KAAK,OAAO;MACZ,KAAK,OAAO;MACZ;MACA;IACF;EACF;EAEA,mBAA2B;AACzB,UAAM,aAAa,oBAAI,IAA0B;AACjD,eAAW,KAAK,KAAK,OAAO;AAC1B,iBAAW,IAAI,EAAE,SAAS,CAAC;IAC7B;AAEA,UAAM,cAAc,oBAAI,IAA2B;AACnD,eAAW,KAAK,KAAK,QAAQ;AAC3B,kBAAY,IAAI,EAAE,WAAW,CAAC;IAChC;AAEA,WAAO;MACL,KAAK,OAAO;MACZ,KAAK,OAAO;MACZ,KAAK,OAAO;MACZ;MACA;IACF;EACF;AACF;AEhLO,IAAM,aAAN,MAAiB;EACd;EAER,YAAY,QAA2B;AACrC,SAAK,SAAS;EAChB;EAEA,IAAY,UAAkB;AAC5B,UAAM,OAAO,KAAK,OAAO,KAAK,QAAQ,OAAO,EAAE;AAC/C,WAAO,GAAG,IAAI,iBAAiB,KAAK,OAAO,SAAS;EACtD;EAEA,IAAY,SAAsB;AAChC,WAAO,YAAY,QAAQ,KAAK,OAAO,aAAa,GAAM;EAC5D;EAEA,MAAc,IAAOC,QAA0B;AAC7C,UAAM,MAAM,MAAM,MAAM,GAAG,KAAK,OAAO,GAAGA,MAAI,IAAI;MAChD,SAAS;QACP,eAAe,UAAU,KAAK,OAAO,MAAM;QAC3C,gBAAgB;MAClB;MACA,QAAQ,KAAK;IACf,CAAC;AACD,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,IAAI;QACR,sBAAsB,IAAI,MAAM,IAAI,IAAI,UAAU,WAAWA,MAAI;MACnE;IACF;AACA,WAAO,IAAI,KAAK;EAClB;EAEA,MAAc,KAAQA,QAAcD,OAA2B;AAC7D,UAAM,MAAM,MAAM,MAAM,GAAG,KAAK,OAAO,GAAGC,MAAI,IAAI;MAChD,QAAQ;MACR,SAAS;QACP,eAAe,UAAU,KAAK,OAAO,MAAM;QAC3C,gBAAgB;MAClB;MACA,MAAM,KAAK,UAAUD,KAAI;MACzB,QAAQ,KAAK;IACf,CAAC;AACD,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,IAAI;QACR,sBAAsB,IAAI,MAAM,IAAI,IAAI,UAAU,YAAYC,MAAI;MACpE;IACF;AACA,WAAO,IAAI,KAAK;EAClB;EAEA,MAAM,kBAA0C;AAC9C,UAAM,OAAO,MAAM,KAAK;MACtB;IACF;AACA,WAAO,KAAK,QAAQ,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO;EAC9C;EAEA,MAAM,iBAAwC;AAC5C,UAAM,OAAO,MAAM,KAAK;MACtB;IACF;AACA,WAAO,KAAK;EACd;EAEA,MAAM,oBAAoB,OAA8C;AACtE,QAAIA,SAAO;AACX,QAAI,SAAS,MAAM,SAAS,GAAG;AAC7BA,MAAAA,UAAQ,WAAW,mBAAmB,MAAM,KAAK,GAAG,CAAC,CAAC;IACxD;AACA,UAAM,OAAO,MAAM,KAAK,IAAoCA,MAAI;AAChE,WAAO,KAAK;EACd;EAEA,MAAM,cACJ,YACA,WAAW,IACuB;AAClC,QAAI,WAAW,WAAW,GAAG;AAC3B,aAAO,oBAAI,IAAI;IACjB;AAIA,UAAM,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,MAAM,QAAQ,CAAC,CAAC;AAC5D,UAAMC,SAAQ;;;;;;;;4CAQ0B,IAAI;;;AAI5C,UAAM,OAAO,MAAM,KAAK,KAErB,WAAW;MACZ,OAAO;QACL,MAAM;QACN,OAAAA;QACA,QAAQ,EAAE,WAAW;MACvB;IACF,CAAC;AAED,UAAM,QAAQ,oBAAI,IAAwB;AAC1C,eAAW,CAAC,OAAO,QAAQ,aAAa,QAAQ,KAAK,KAAK,SAAS;AACjE,YAAM,IAAI,OAAO;QACf;QACA;QACA,YAAY,YAAY;MAC1B,CAAC;IACH;AACA,WAAO;EACT;AACF;AC5GA,IAAM,kBAAkB,oBAAI,IAAI,CAAC,WAAW,SAAS,CAAC;AAE/C,IAAM,cAAN,MAAkB;EACd;EACA;EACA;EACA;EACA;EACA;EACA;EAET,YACE,QACA,YACA,OACA,WACA,iBACA,iBACA,WACA;AACA,SAAK,SAAS;AACd,SAAK,aAAa;AAClB,SAAK,QAAQ;AACb,SAAK,YAAY;AACjB,SAAK,kBAAkB;AACvB,SAAK,kBAAkB;AACvB,SAAK,YAAY;EACnB;EAEA,IAAI,SAA0B;AAC5B,WAAO,KAAK,MACT,OAAO,CAAC,MAAM,gBAAgB,IAAI,EAAE,MAAM,CAAC,EAC3C,IAAI,CAAC,OAAO;MACX,MAAM,EAAE;MACR,MAAM,EAAE;MACR,SAAS,EAAE,WAAW;IACxB,EAAE;EACN;EAEA,IAAI,aAA0B;AAC5B,WAAO,KAAK,MACT,OAAO,CAAC,MAAM,CAAC,gBAAgB,IAAI,EAAE,MAAM,CAAC,EAC5C,IAAI,CAAC,OAAO;MACX,QAAQ,EAAE;MACV,SAAS,EAAE;MACX,MAAM,EAAE;IACV,EAAE;EACN;EAEA,IAAI,WAAqB;AACvB,WAAO,CAAC,GAAG,IAAI,IAAI,KAAK,WAAW,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;EAC3D;EAEA,IAAI,aAAuB;AACzB,WAAO;MACL,GAAG,IAAI,IAAI,KAAK,OAAO,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;IACrE;EACF;EAEA,SAAqB;AACnB,UAAM,QAAoB,CAAC;AAE3B,eAAWC,SAAQ,KAAK,WAAW;AACjC,YAAM,KAAK;QACT,MAAM;QACN,MAAMA,MAAK;QACX,MAAMA,MAAK;QACX,QAAQ;MACV,CAAC;IACH;AAEA,eAAW,QAAQ,KAAK,OAAO;AAC7B,YAAM,UAAU,gBAAgB,IAAI,KAAK,MAAM;AAC/C,YAAM,KAAK;QACT,MAAM,UAAU,UAAU;QAC1B,MAAM,KAAK;QACX,MAAM,KAAK;QACX,QAAQ,KAAK;QACb,QAAQ,KAAK,UAAU,uBAAuB;MAChD,CAAC;IACH;AAEA,WAAO,MAAM,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI;EAC7C;EAEA,MAAM,cAAc,QAAoD;AACtE,UAAM,MAAM,IAAI,WAAW,MAAM;AACjC,UAAM,WAAW,KAAK;AACtB,UAAM,aAAa,KAAK;AAExB,UAAM,UAAU,MAAM,QAAQ,WAAW;MACvC,SAAS,SAAS,IAAI,IAAI,gBAAgB,IAAI,QAAQ,QAAQ,CAAC,CAAC;MAChE,SAAS,SAAS,IAAI,IAAI,eAAe,IAAI,QAAQ,QAAQ,CAAC,CAAC;MAC/D,WAAW,SAAS,IAChB,IAAI,oBAAoB,UAAU,IAClC,QAAQ,QAAQ,CAAC,CAAC;MACtB,WAAW,SAAS,IAChB,IAAI,cAAc,UAAU,IAC5B,QAAQ,QAAQ,oBAAI,IAAI,CAAC;IAC/B,CAAC;AAED,UAAM,CAAC,aAAa,mBAAmB,iBAAiB,gBAAgB,IACtE;AAEF,UAAM,SAAS;MACb;MACA;MACA;MACA;IACF;AACA,YAAQ,QAAQ,CAAC,GAAGC,OAAM;AACxB,UAAI,EAAE,WAAW,YAAY;AAC3B,aAAK,aAAa,OAAOA,EAAC,CAAC,WAAW,EAAE,MAAM;MAChD;IACF,CAAC;AAED,UAAM,WACJ,YAAY,WAAW,cAAc,YAAY,QAAQ,CAAC;AAC5D,UAAM,iBACJ,kBAAkB,WAAW,cAAc,kBAAkB,QAAQ,CAAC;AACxE,UAAM,eACJ,gBAAgB,WAAW,cAAc,gBAAgB,QAAQ,CAAC;AACpE,UAAM,aACJ,iBAAiB,WAAW,cACxB,iBAAiB,QACjB,oBAAI,IAAwB;AAElC,UAAM,aAAa,IAAI,IAAI,QAAQ;AACnC,UAAMC,SAAQ,IAAI;MAChB,SAAS,OAAO,CAAC,MAAM,WAAW,IAAI,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC;IACrE;AAEA,UAAM,cAAc,eAAe;MAAO,CAAC,MACzC,WAAW,IAAI,EAAE,gBAAgB;IACnC;AAEA,UAAM,mBAAmB,IAAI;MAC3B,aACG,OAAO,CAAC,MAAM,WAAW,SAAS,EAAE,IAAI,CAAC,EACzC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;IAC3B;AAEA,WAAO,IAAI,eAAe,MAAM;MAC9B,OAAAA;MACA;MACA;MACA;IACF,CAAC;EACH;AACF;AF7JO,IAAM,kBAAN,MAAsB;EACnB,WAAW,IAAI,gBAAgB;EAEvC,aAAa,QAA+B;AAC1C,SAAK,SAAS,aAAa,MAAM;EACnC;EAEA,YAAY,QAAyB;AACnC,WAAO,KAAK,SAAS,YAAY,MAAM;EACzC;EAEA,IAAI,qBAA+B;AACjC,WAAO,KAAK,SAAS;EACvB;EAEA,MAAM,MAAM,QAAgB,YAA0C;AACpE,UAAM,UAAU,MAAM,QAAQ,WAAW;MACvC,KAAK,SAAS,iBAAiB,QAAQ,UAAU;MACjD,KAAK,SAAS,cAAc,QAAQ,UAAU;MAC9C,KAAK,SAAS,oBAAoB,QAAQ,UAAU;MACpD,KAAK,SAAS,oBAAoB,QAAQ,UAAU;MACpD,KAAK,SAAS,cAAc,QAAQ,UAAU;IAChD,CAAC;AAED,UAAM,UAAU,QAAQ,IAAI,CAAC,GAAGD,OAAM;AACpC,UAAI,EAAE,WAAW,aAAa;AAC5B,eAAO,EAAE;MACX;AACA,YAAM,SAAS;QACb;QACA;QACA;QACA;QACA;MACF;AACA,WAAK,aAAa,OAAOA,EAAC,CAAC,qBAAqB,EAAE,MAAM;AACxD,aAAO,CAAC;IACV,CAAC;AAED,WAAO,IAAI;MACT;MACA;MACA,QAAQ,CAAC;MACT,QAAQ,CAAC;MACT,QAAQ,CAAC;MACT,QAAQ,CAAC;MACT,QAAQ,CAAC;IACX;EACF;EAEA,MAAM,UAAU,UAAwC;AACtD,UAAM,MAAW,cAAQ,QAAQ,EAAE,YAAY;AAC/C,UAAM,aAAa,eAAe,GAAG;AACrC,QAAI,CAAC,YAAY;AACf,YAAM,IAAI,MAAM,+BAA+B,GAAG,EAAE;IACtD;AACA,UAAM,SAAS,MAAS,aAAS,UAAU,OAAO;AAClD,WAAO,KAAK,MAAM,QAAQ,UAAU;EACtC;EAEA,UAAgB;AACd,SAAK,SAAS,QAAQ;EACxB;AACF;;;AdvDO,SAAS,iBACd,WACA,QACwB;AACxB,MAAI,CAAC,UAAW,QAAO;AACvB,QAAM,WAAW,IAAI,gBAAgB;AACrC,SAAO;AAAA,IACL,MAAM,EAAE,UAAU,WAAW,OAAO;AAAA,IACpC,SAAS,MAAM,SAAS,QAAQ;AAAA,EAClC;AACF;AAEA,IAAM,uBAAuB;AAE7B,eAAsB,mBACpB,MACA,UACA,SACwB;AACxB,MAAI,CAAC,WAAW,QAAQ,SAAS,qBAAsB,QAAO;AAG9D,MAAI,CAAC,WAAW,KAAK,OAAO,EAAG,QAAO;AAEtC,QAAM,MAAW,cAAQ,QAAQ,EAAE,YAAY;AAC/C,QAAM,SAAS,eAAe,GAAG;AACjC,MAAI,CAAC,UAAU,CAAC,KAAK,SAAS,YAAY,MAAM,EAAG,QAAO;AAE1D,MAAI;AACF,UAAM,SAAS,MAAM,KAAK,SAAS,MAAM,SAAS,MAAM;AACxD,QAAI,OAAO,MAAM,WAAW,KAAK,OAAO,UAAU,WAAW,GAAG;AAC9D,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,MAAM,KAAK,UAAU,UAAU;AAC9C,QAAI,CAAC,OAAQ,QAAO;AAEpB,UAAM,WAAW,MAAM,OAAO,cAAc;AAAA,MAC1C;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,MACrB,WAAW,KAAK,UAAU;AAAA,MAC1B,WAAW;AAAA,IACb,CAAC;AAED,UAAM,YAAY,SAAS,iBAAiB;AAC5C,QAAI,cAAc,SAAS;AACzB,WAAK,QAAQ,MAAM,uCAAuC;AAAA,QACxD;AAAA,QACA,OAAO,OAAO,MAAM;AAAA,MACtB,CAAC;AACD,aAAO;AAAA,IACT;AACA,SAAK,QAAQ,MAAM,iBAAiB;AAAA,MAClC;AAAA,MACA,OAAO,OAAO,MAAM;AAAA,IACtB,CAAC;AACD,WAAO;AAAA,EACT,SAASE,MAAK;AACZ,UAAM,SACJA,gBAAe,QACX,EAAE,SAASA,KAAI,SAAS,MAAMA,KAAI,MAAM,OAAOA,KAAI,MAAM,IACzD,EAAE,OAAO,OAAOA,IAAG,EAAE;AAC3B,SAAK,QAAQ,MAAM,0BAA0B,EAAE,UAAU,GAAG,OAAO,CAAC;AACpE,WAAO;AAAA,EACT;AACF;;;AiB1EA,eAAsB,YACpB,WACA,WACkE;AAClE,QAAM,iBAAiB,IAAI;AAAA,IAA+B,CAACC,aACzD,WAAW,MAAMA,SAAQ,EAAE,QAAQ,UAAU,CAAC,GAAG,SAAS;AAAA,EAC5D;AACA,QAAM,mBAAmB,UAAU,KAAK,CAAC,WAAW;AAAA,IAClD,QAAQ;AAAA,IACR;AAAA,EACF,EAAE;AACF,SAAO,QAAQ,KAAK,CAAC,kBAAkB,cAAc,CAAC;AACxD;AAEO,IAAM,UACX,OAAO,YAAY,gBAClB,QAAQ,UAAU,KAAK,QAAQ,SAAS,OAAO;AAE3C,SAAS,YAAY,OAAc,QAAsB;AAC9D,MAAI;AACJ,MAAI;AACF,oBAAgB,KAAK,UAAU,KAAK;AAAA,EACtC,QAAQ;AACN,oBAAgB,OAAO,KAAK;AAAA,EAC9B;AACA,SAAO,MAAM,oBAAoB,aAAa,EAAE;AAClD;;;AChBO,IAAM,wBAAwB;AAE9B,IAAM,sBAAsB;AAE5B,IAAM,iBAAiB,oBAAI,IAAI,CAAC,cAAc,mBAAmB,CAAC;AASzE,IAAM,YAAY,KAAK,KAAK;AAE5B,IAAI,qBAIO;AAEX,eAAsB,mBACpB,SACyB;AACzB,QAAM,aAAa,SAAS,cAAc,QAAQ,IAAI;AACtD,MAAI,CAAC,YAAY;AACf,WAAO,CAAC;AAAA,EACV;AAEA,MACE,sBACA,mBAAmB,QAAQ,cAC3B,KAAK,IAAI,IAAI,mBAAmB,QAChC;AACA,WAAO,mBAAmB;AAAA,EAC5B;AAEA,QAAM,YAAY,GAAG,UAAU;AAE/B,MAAI;AACF,UAAM,WAAW,MAAM,MAAM,SAAS;AAEtC,QAAI,CAAC,SAAS,IAAI;AAChB,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,UAAM,UAAU,KAAK,QAAQ,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,eAAe,IAAI,EAAE,EAAE,CAAC;AACxE,yBAAqB;AAAA,MACnB;AAAA,MACA,QAAQ,KAAK,IAAI,IAAI;AAAA,MACrB,KAAK;AAAA,IACP;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEO,SAAS,iBAAiB,OAA8B;AAC7D,MAAI,MAAM,UAAU;AAClB,WAAO,MAAM,aAAa;AAAA,EAC5B;AACA,SAAO,MAAM,GAAG,WAAW,SAAS,KAAK,MAAM,GAAG,WAAW,YAAY;AAC3E;AAcA,IAAI,kBAIO;AAEX,eAAsB,gBACpB,SACsB;AACtB,QAAM,aAAa,SAAS,cAAc,QAAQ,IAAI;AACtD,MAAI,CAAC,YAAY;AACf,WAAO,CAAC;AAAA,EACV;AAEA,MACE,mBACA,gBAAgB,QAAQ,cACxB,KAAK,IAAI,IAAI,gBAAgB,QAC7B;AACA,WAAO,gBAAgB;AAAA,EACzB;AAEA,MAAI;AACF,UAAM,YAAY,GAAG,UAAU;AAC/B,UAAM,WAAW,MAAM,MAAM,SAAS;AACtC,QAAI,CAAC,SAAS,IAAI;AAChB,aAAO,CAAC;AAAA,IACV;AACA,UAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,UAAM,SAAS,MAAM,QAAQ,IAAI,IAC7B,OACC,KAAK,QAAQ,KAAK,UAAU,CAAC;AAClC,UAAM,UAAuB,CAAC;AAC9B,eAAW,SAAS,QAAQ;AAC1B,YAAM,KAAK,OAAO,KAAK,OAAO,MAAM,EAAE,IAAI;AAC1C,UAAI,CAAC,GAAI;AACT,cAAQ,KAAK,EAAE,IAAI,UAAU,OAAO,SAAS,CAAC;AAAA,IAChD;AACA,sBAAkB;AAAA,MAChB,QAAQ;AAAA,MACR,QAAQ,KAAK,IAAI,IAAI;AAAA,MACrB,KAAK;AAAA,IACP;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAYA,IAAM,oBAAoB,CAAC,cAAc,WAAW,gBAAgB;AAE7D,SAAS,uBAAuB,OAA6B;AAClE,SAAO,cAAc,MAAM,EAAE;AAC/B;AAEO,SAAS,cAAc,SAAyB;AACrD,MAAI,UAAU;AACd,aAAW,UAAU,mBAAmB;AACtC,QAAI,QAAQ,WAAW,MAAM,GAAG;AAC9B,gBAAU,QAAQ,MAAM,OAAO,MAAM;AACrC;AAAA,IACF;AAAA,EACF;AAEA,YAAU,QAAQ,QAAQ,cAAc,OAAO;AAE/C,QAAM,QAAQ,QAAQ,MAAM,MAAM,EAAE,IAAI,CAAC,SAAS;AAChD,QAAI,KAAK,MAAM,WAAW,EAAG,QAAO;AACpC,WAAO,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,EAAE,YAAY;AAAA,EAClE,CAAC;AAED,SAAO,MAAM,KAAK,GAAG;AACvB;;;AClIA,IAAM,yBAAyB;AAExB,IAAe,eAAf,MAA6C;AAAA,EAExC;AAAA,EACA;AAAA,EACV;AAAA,EACA;AAAA,EACA,mBAA8C,CAAC;AAAA,EACrC,gBAAgC,CAAC;AAAA,EAE3C,YAAY,QAA6B;AACvC,SAAK,SAAS;AACd,SAAK,SAAS,IAAI,OAAO,EAAE,OAAO,MAAM,QAAQ,iBAAiB,CAAC;AAAA,EACpE;AAAA,EAOA,MAAM,OAAO,QAA2C;AACtD,QAAI,KAAK,cAAc,OAAO,WAAW;AACvC,YAAM,IAAI,MAAM,qBAAqB;AAAA,IACvC;AACA,SAAK,QAAQ,YAAY;AACzB,UAAM,OAAO,OAAO;AACpB,QAAI,MAAM,iBAAiB;AACzB,WAAK,QAAQ,kBAAkB,KAAK;AAAA,IACtC;AACA,UAAM,KAAK,UAAU;AAAA,EACvB;AAAA,EAEA,MAAM,eAA8B;AAClC,QAAI;AAIF,WAAK,QAAQ,gBAAgB,MAAM;AACnC,YAAM,KAAK,OAAO,EAAE,WAAW,KAAK,UAAU,CAAC;AAC/C,WAAK,QAAQ,gBAAgB,QAAQ;AACrC,WAAK,OAAO,KAAK,kBAAkB,EAAE,WAAW,KAAK,UAAU,CAAC;AAAA,IAClE,SAASC,MAAK;AACZ,WAAK,OAAO,KAAK,2BAA2B;AAAA,QAC1C,WAAW,KAAK;AAAA,QAChB,OAAOA;AAAA,MACT,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,WAAW,WAA4B;AACrC,WAAO,KAAK,cAAc;AAAA,EAC5B;AAAA,EAEA,mBACE,WACA,cACM;AACN,QAAI,KAAK,cAAc,WAAW;AAChC,WAAK,QAAQ,oBAAoB,KAAK,YAAY;AAAA,IACpD;AAAA,EACF;AAAA,EAEA,MAAM,aACJ,QAC+B;AAC/B,UAAM,WAAW,MAAM,KAAK,OAAO,aAAa,MAAM;AACtD,QAAI,CAAC,OAAO,SAAS,CAAC,OAAO,MAAM;AACjC,WAAK,iBAAiB,OAAO,IAAI,IAAI,SAAS;AAAA,IAChD;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,cACJ,QACgC;AAChC,UAAM,WAAW,MAAM,KAAK,OAAO,cAAc,MAAM;AACvD,SAAK,iBAAiB,OAAO,IAAI,IAAI,OAAO;AAC5C,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,aAAa,SAA6C;AAC9D,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AAAA,EAEA,MAAM,sBAAsB,sBAGzB;AACD,SAAK,gBAAgB,MAAM,mBAAmB;AAE9C,UAAM,UAAU,KAAK,cAClB,OAAO,CAAC,UAAU,iBAAiB,KAAK,CAAC,EACzC,IAAI,CAAC,WAAW;AAAA,MACf,OAAO,MAAM;AAAA,MACb,MAAM,uBAAuB,KAAK;AAAA,MAClC,aAAa,YAAY,MAAM,eAAe,eAAe,CAAC;AAAA,IAChE,EAAE;AAEJ,UAAM,qBAAqB,CAAC,YAC1B,QAAQ,WAAW,SAAS,KAAK,QAAQ,WAAW,YAAY;AAElE,QAAI,iBAAiB,wBAAwB;AAE7C,QAAI,CAAC,QAAQ,KAAK,CAAC,QAAQ,IAAI,UAAU,cAAc,GAAG;AACxD,UAAI,CAAC,mBAAmB,cAAc,GAAG;AACvC,yBAAiB;AAAA,MACnB;AAAA,IACF;AAEA,QAAI,CAAC,QAAQ,KAAK,CAAC,QAAQ,IAAI,UAAU,cAAc,GAAG;AACxD,cAAQ,QAAQ;AAAA,QACd,OAAO;AAAA,QACP,MAAM;AAAA,QACN,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AAEA,WAAO,EAAE,gBAAgB,QAAQ;AAAA,EACnC;AAAA,EAEA,yBAAyB,SAAyB;AAChD,UAAM,QAAQ,KAAK,cAAc,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO;AAC7D,WAAO,OAAO,kBAAkB;AAAA,EAClC;AACF;;;AC5KA,YAAYC,WAAU;AAOtB,SAAS,QAAQ,OAAkC;AACjD,SAAO,EAAE,MAAM,QAAQ,MAAM,MAAM;AACrC;AAEA,SAAS,gBAAgB,KAAqB;AAC5C,MAAI;AACF,QAAI,IAAI,WAAW,SAAS,GAAG;AAC7B,YAAM,WAAW,IAAI,MAAM,CAAC;AAC5B,YAAMC,QAAY,eAAS,QAAQ,KAAK;AACxC,aAAO,KAAKA,KAAI,KAAK,GAAG;AAAA,IAC1B;AACA,QAAI,IAAI,WAAW,QAAQ,GAAG;AAC5B,YAAMA,QAAY,eAAS,GAAG,KAAK;AACnC,aAAO,KAAKA,KAAI,KAAK,GAAG;AAAA,IAC1B;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,oBAAoBC,OAAsB;AACjD,QAAM,WAAWA,MAAK,MAAM,iCAAiC;AAC7D,MAAI,UAAU;AACZ,UAAM,CAAC,EAAE,QAAQ,SAASC,KAAI,IAAI;AAClC,WAAO,IAAI,MAAM,IAAI,OAAO,SAASA,SAAQ,EAAE;AAAA,EACjD;AACA,SAAOD;AACT;AAEA,SAAS,mBACP,OACA,SACA,SACM;AACN,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,cAAQ,KAAK,QAAQ,oBAAoB,MAAM,IAAI,CAAC,CAAC;AACrD;AAAA,IAEF,KAAK;AACH,cAAQ,KAAK,QAAQ,gBAAgB,MAAM,GAAG,CAAC,CAAC;AAChD;AAAA,IAEF,KAAK;AACH,UAAI,UAAU,MAAM,UAAU;AAC5B,gBAAQ,KAAK,QAAQ,gBAAgB,MAAM,SAAS,GAAG,CAAC,CAAC;AACzD,gBAAQ;AAAA,UACN;AAAA,YACE;AAAA,gBAAmB,MAAM,SAAS,GAAG;AAAA,EAAO,MAAM,SAAS,IAAI;AAAA;AAAA,UACjE;AAAA,QACF;AAAA,MACF;AACA;AAAA,IAEF,KAAK;AACH,UAAI,MAAM,MAAM;AACd,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,QAAQ;AAAA,YACN,MAAM;AAAA,YACN,MAAM,MAAM;AAAA,YACZ,YAAY,MAAM;AAAA,UACpB;AAAA,QACF,CAAC;AAAA,MACH,WAAW,MAAM,KAAK,WAAW,MAAM,GAAG;AACxC,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,QAAQ,EAAE,MAAM,OAAO,KAAK,MAAM,IAAI;AAAA,QACxC,CAAC;AAAA,MACH;AACA;AAAA,IAEF;AACE;AAAA,EACJ;AACF;AAEO,SAAS,eAAe,QAAuC;AACpE,QAAM,UAA+B,CAAC;AACtC,QAAM,UAA+B,CAAC;AAEtC,QAAM,YAAa,OAAO,OACtB;AACJ,MAAI,OAAO,cAAc,UAAU;AACjC,YAAQ,KAAK,QAAQ,SAAS,CAAC;AAAA,EACjC;AAEA,aAAW,SAAS,OAAO,QAAQ;AACjC,uBAAmB,OAAO,SAAS,OAAO;AAAA,EAC5C;AAEA,UAAQ,KAAK,GAAG,OAAO;AAEvB,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,EAAE,MAAM,QAAQ,QAAQ;AAAA,IACjC,YAAY,OAAO;AAAA,IACnB,oBAAoB;AAAA,EACtB;AACF;;;ACrGA,SAAS,oBAAqC;;;ACJvC,SAAS,KAAK,OAA6B;AAChD,SAAO,EAAE,MAAM,QAAQ,MAAM,MAAM;AACrC;AAEO,SAAS,MACd,MACA,UACA,KACc;AACd,SAAO,EAAE,MAAM,SAAS,MAAM,UAAU,IAAI;AAC9C;AAEO,SAAS,aACd,KACAE,OACA,SAMc;AACd,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,MAAAA;AAAA,IACA,GAAG;AAAA,EACL;AACF;AAEA,IAAM,qBAAN,MAAyB;AAAA,EACf,QAA2B,CAAC;AAAA,EAEpC,KAAK,OAAqB;AACxB,SAAK,MAAM,KAAK,EAAE,MAAM,WAAW,SAAS,KAAK,KAAK,EAAE,CAAC;AACzD,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,MAAc,UAAkB,KAAoB;AACxD,SAAK,MAAM,KAAK,EAAE,MAAM,WAAW,SAAS,MAAM,MAAM,UAAU,GAAG,EAAE,CAAC;AACxE,WAAO;AAAA,EACT;AAAA,EAEA,KAAKC,QAAc,SAAwB,SAAuB;AAChE,SAAK,MAAM,KAAK,EAAE,MAAM,QAAQ,MAAAA,QAAM,SAAS,QAAQ,CAAC;AACxD,WAAO;AAAA,EACT;AAAA,EAEA,QAA2B;AACzB,WAAO,KAAK;AAAA,EACd;AACF;AAEO,SAAS,cAAkC;AAChD,SAAO,IAAI,mBAAmB;AAChC;;;AC/CA,SAAS,4BAA4B,UAAkC;AACrE,MAAI,OAAO,aAAa,SAAU,QAAO;AACzC,MAAI,CAAC,SAAU,QAAO;AACtB,MAAI,MAAM,QAAQ,QAAQ,GAAG;AAC3B,UAAMC,SAAkB,CAAC;AACzB,eAAW,QAAQ,UAAU;AAC3B,UAAI,OAAO,SAAS,UAAU;AAC5B,QAAAA,OAAM,KAAK,IAAI;AAAA,MACjB,WACE,QACA,OAAO,SAAS,YAChB,UAAU,QACV,OAAQ,KAA4B,SAAS,UAC7C;AACA,QAAAA,OAAM,KAAM,KAA0B,IAAI;AAAA,MAC5C;AAAA,IACF;AACA,WAAOA,OAAM,SAAS,IAAIA,OAAM,KAAK,EAAE,IAAI;AAAA,EAC7C;AACA,MAAI,OAAO,aAAa,YAAY,aAAa,MAAM;AACrD,UAAM,QAAQ;AAKd,QACE,MAAM,QACN,OAAO,MAAM,SAAS,YACtB,OAAO,MAAM,KAAK,YAAY,UAC9B;AACA,aAAO,MAAM,KAAK;AAAA,IACpB;AACA,QAAI,OAAO,MAAM,SAAS,SAAU,QAAO,MAAM;AACjD,QAAI,MAAM,QAAS,QAAO,4BAA4B,MAAM,OAAO;AAAA,EACrE;AACA,SAAO;AACT;AAUO,IAAM,2BACX,CAAC,MAA0B,UAC3B,OAAO,UAAqB;AAC1B,MAAI,MAAM,oBAAoB,cAAe,QAAO,EAAE,UAAU,KAAK;AACrE,MAAI,MAAM,cAAc,OAAQ,QAAO,EAAE,UAAU,KAAK;AAExD,QAAM,YAAY,MAAM;AACxB,QAAM,WAAW,WAAW;AAC5B,MAAI,CAAC,SAAU,QAAO,EAAE,UAAU,KAAK;AAEvC,QAAM,MAAM,4BAA4B,MAAM,aAAa;AAC3D,MAAI,CAAC,IAAK,QAAO,EAAE,UAAU,KAAK;AAElC,QAAM,WAAW,MAAM;AAAA,IACrB;AAAA,IACA;AAAA,IACA,oBAAoB,GAAG;AAAA,EACzB;AACA,MAAI,CAAC,SAAU,QAAO,EAAE,UAAU,KAAK;AAEvC,MAAI,MAAM,aAAa;AACrB,UAAM,IAAI,MAAM,aAAa,QAAQ;AAAA,EACvC;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,IACV,oBAAoB;AAAA,MAClB,eAAe;AAAA,MACf,mBAAmB;AAAA,QACjB,2BAA2B,QAAQ;AAAA,QACnC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,IACb;AAAA,EACF;AACF;AAEF,IAAM,mBAQF,CAAC;AAEE,IAAM,uBAAuB,CAClC,WACA;AAAA,EACE;AACF,MAOG;AACH,mBAAiB,SAAS,IAAI;AAAA,IAC5B;AAAA,EACF;AACF;AASO,IAAM,wBACX,CAAC,EAAE,cAAc,OAAO,MACxB,OACE,OACA,cACmC;AACnC,MAAI,MAAM,oBAAoB,eAAe;AAC3C,UAAM,WAAW,MAAM;AAEvB,QAAI,gBAAgB,aAAa,iBAAiB;AAChD,YAAM,aAAa,MAAM;AAAA,IAC3B;AAEA,QAAI,WAAW;AACb,YAAM,oBACJ,iBAAiB,SAAS,GAAG;AAC/B,UAAI,mBAAmB;AACrB,cAAM;AAAA,UACJ;AAAA,UACA,MAAM;AAAA,UACN,MAAM;AAAA,QACR;AACA,eAAO,iBAAiB,SAAS;AAAA,MACnC,OAAO;AACL,eAAO,iBAAiB,SAAS;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,UAAU,KAAK;AAC1B;AAcF,IAAM,oBAA4C;AAAA,EAChD,SAAS;AACX;AAEO,IAAM,4BACX,CAAC,WACD,OAAO,OAAkB,eAAmC;AAC1D,MAAI,MAAM,oBAAoB,cAAc;AAC1C,WAAO,EAAE,UAAU,KAAK;AAAA,EAC1B;AAEA,MAAI,MAAM,cAAc,SAAS;AAC/B,WAAO,EAAE,UAAU,KAAK;AAAA,EAC1B;AAEA,QAAM,YAAY,MAAM;AACxB,QAAM,eAAe,WAAW;AAChC,MAAI,OAAO,iBAAiB,YAAY,CAAC,kBAAkB,YAAY,GAAG;AACxE,WAAO,EAAE,UAAU,KAAK;AAAA,EAC1B;AAEA,QAAM,SAAS,kBAAkB,YAAY;AAC7C,SAAO;AAAA,IACL,kDAAkD,YAAY,WAAM,MAAM;AAAA,EAC5E;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,IACV,oBAAoB;AAAA,MAClB,eAAe;AAAA,MACf,cAAc;AAAA,QACZ,GAAG;AAAA,QACH,eAAe;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AACF;AAEK,IAAM,uBACX,CAAC,iBAAkC,WACnC,OAAO,OAAkB,eAAmC;AAC1D,MAAI,MAAM,oBAAoB,cAAc;AAC1C,WAAO,EAAE,UAAU,KAAK;AAAA,EAC1B;AAEA,QAAM,WAAW,MAAM;AACvB,QAAM,YAAY,MAAM;AACxB,QAAM,kBAAkB,gBAAgB;AAAA,IACtC;AAAA,IACA;AAAA,EACF;AAEA,MAAI,gBAAgB,aAAa,OAAO;AACtC,WAAO;AAAA,MACL,0BAA0B,QAAQ,eAAe,gBAAgB,QAAQ,WAAW,gBAAgB,IAAI;AAAA,IAC1G;AAAA,EACF;AAEA,UAAQ,gBAAgB,UAAU;AAAA,IAChC,KAAK;AACH,aAAO;AAAA,QACL,UAAU;AAAA,QACV,oBAAoB;AAAA,UAClB,eAAe;AAAA,UACf,oBAAoB;AAAA,UACpB,0BAA0B,6BAA6B,gBAAgB,IAAI;AAAA,QAC7E;AAAA,MACF;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,UAAU;AAAA,QACV,oBAAoB;AAAA,UAClB,eAAe;AAAA,UACf,oBAAoB;AAAA,UACpB,0BAA0B,4BAA4B,gBAAgB,IAAI;AAAA,QAC5E;AAAA,MACF;AAAA,IACF;AACE,aAAO,EAAE,UAAU,KAAK;AAAA,EAC5B;AACF;;;AC/PF,OAAOC,SAAQ;AACf,OAAOC,WAAU;;;ACQjB,IAAM,uBAAqD,oBAAI,IAAI;AAEnE,IAAM,4BAA4B;AAClC,IAAM,sBAAsB;AAE5B,SAAS,aAAa,YAAoB,UAA0B;AAClE,SAAO,QAAQ,UAAU,KAAK,QAAQ;AACxC;AAEA,SAAS,MAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,CAACC,aAAY,WAAWA,UAAS,EAAE,CAAC;AACzD;AAEA,eAAsB,qBACpB,GACA,SAAiB,IAAI,OAAO,EAAE,OAAO,OAAO,QAAQ,oBAAoB,CAAC,GAC1D;AACf,MAAI,UAAU;AAEd,SAAO,WAAW,qBAAqB;AACrC,QAAI;AACJ,QAAI;AACF,iBAAW,MAAM,EAAE,gBAAgB;AAAA,IACrC,SAAS,OAAO;AACd,aAAO,MAAM,qCAAqC;AAAA,QAChD,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D,CAAC;AACD;AAAA,IACF;AAEA,UAAM,iBAAiB,SAAS,OAAO,CAAC,MAAM,EAAE,WAAW,SAAS;AAEpE,eAAW,UAAU,UAAU;AAC7B,UAAI,OAAO,WAAW,eAAe,CAAC,OAAO,OAAO;AAClD;AAAA,MACF;AAEA,UAAI,gBAAgB;AACpB,iBAAW,QAAQ,OAAO,OAAO;AAC/B,cAAM,UAAU,aAAa,OAAO,MAAM,KAAK,IAAI;AACnD,cAAM,WAAW,KAAK,aAAa,aAAa;AAEhD,6BAAqB,IAAI,SAAS;AAAA,UAChC;AAAA,UACA,MAAM,KAAK;AAAA,UACX,aAAa,KAAK;AAAA,QACpB,CAAC;AACD,YAAI,SAAU;AAAA,MAChB;AAEA,aAAO,KAAK,6BAA6B;AAAA,QACvC,YAAY,OAAO;AAAA,QACnB,WAAW,OAAO,MAAM;AAAA,QACxB;AAAA,MACF,CAAC;AAAA,IACH;AAEA,QAAI,eAAe,WAAW,GAAG;AAC/B;AAAA,IACF;AAEA;AACA,QAAI,UAAU,qBAAqB;AACjC,aAAO,KAAK,2CAA2C;AAAA,QACrD,gBAAgB,eAAe,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,MAClD,CAAC;AACD;AAAA,IACF;AAEA,WAAO,KAAK,mCAAmC;AAAA,MAC7C,gBAAgB,eAAe,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,MAChD,OAAO;AAAA,IACT,CAAC;AACD,UAAM,MAAM,yBAAyB;AAAA,EACvC;AACF;AAEO,SAAS,mBACd,UAC6B;AAC7B,SAAO,qBAAqB,IAAI,QAAQ;AAC1C;AAEO,SAAS,kBAAkB,UAA2B;AAC3D,QAAMC,YAAW,qBAAqB,IAAI,QAAQ;AAClD,SAAOA,WAAU,aAAa;AAChC;AAEO,SAAS,6BAAuC;AACrD,QAAM,QAAQ,oBAAI,IAAY;AAC9B,aAAW,OAAO,qBAAqB,KAAK,GAAG;AAC7C,UAAMC,SAAQ,IAAI,MAAM,IAAI;AAC5B,QAAIA,OAAM,UAAU,EAAG,OAAM,IAAIA,OAAM,CAAC,CAAC;AAAA,EAC3C;AACA,SAAO,CAAC,GAAG,KAAK;AAClB;;;AD/EA,IAAM,wBACJ;AAEF,SAAS,qBAAqB,OAAuB;AACnD,SAAO,MAAM,QAAQ,uBAAuB,EAAE;AAChD;AAYO,SAAS,cAAc,UAAkB,KAAsB;AACpE,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,cAAcC,MAAK,QAAQ,GAAG;AACpC,QAAM,eAAeA,MAAK,QAAQ,QAAQ;AAC1C,MACE,aAAa,WAAW,cAAcA,MAAK,GAAG,KAC9C,iBAAiB,aACjB;AACA,WAAOA,MAAK,SAAS,aAAa,YAAY;AAAA,EAChD;AACA,SAAO;AACT;AAEO,SAAS,oBACd,SACA,SAMU;AACV,QAAMC,QAAO,QAAQ;AACrB,QAAM,QAAQ,QAAQ;AAEtB,UAAQA,OAAM;AAAA,IACZ,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,QACL,OAAO,OAAO,cAAc,OAAO,MAAM,WAAW,IAAIA;AAAA,QACxD,MAAM;AAAA,QACN,SAAS,OAAO,SACZ,YAAY,EAAE,KAAK,OAAO,MAAM,MAAM,CAAC,EAAE,MAAM,IAC/C,CAAC;AAAA,MACP;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,OAAO,OAAO,gBACV,iBAAiB,OAAO,MAAM,aAAa,CAAC,KAC5C;AAAA,QACJ,MAAM;AAAA,QACN,SAAS,CAAC;AAAA,QACV,WAAW,OAAO,gBACd,CAAC,EAAE,MAAM,OAAO,MAAM,aAAa,EAAE,CAAC,IACtC,CAAC;AAAA,MACP;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,OAAO,OAAO,gBACV,iBAAiB,OAAO,MAAM,aAAa,CAAC,KAC5C;AAAA,QACJ,MAAM;AAAA,QACN,SAAS,OAAO,aACZ,YAAY,EAAE,KAAK,OAAO,MAAM,UAAU,CAAC,EAAE,MAAM,IACnD,CAAC;AAAA,QACL,WAAW,OAAO,gBACd,CAAC,EAAE,MAAM,OAAO,MAAM,aAAa,EAAE,CAAC,IACtC,CAAC;AAAA,MACP;AAAA,IAEF,KAAK;AACH,UAAI,SAAS,0BAA0B,SAAS,WAAW;AACzD,eAAO;AAAA,UACL,OAAO,OAAO,cACV,OAAO,MAAM,WAAW,IACxB;AAAA,UACJ,MAAM;AAAA,UACN,SAAS,CAAC,EAAE,MAAM,YAAY,YAAY,QAAQ,UAAU,CAAC;AAAA,QAC/D;AAAA,MACF;AACA,aAAO;AAAA,QACL,OAAO,OAAO,cACV,OAAO,MAAM,WAAW,IACxB;AAAA,QACJ,MAAM;AAAA,QACN,SAAS,OAAO,UACZ,YAAY,EAAE,KAAK,OAAO,MAAM,OAAO,CAAC,EAAE,MAAM,IAChD,CAAC;AAAA,MACP;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,OAAO;AAAA,QACP,MAAM;AAAA,QACN,SAAS,CAAC;AAAA,MACZ;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,OAAO;AAAA,QACP,MAAM;AAAA,QACN,SAAS,CAAC;AAAA,MACZ;AAAA,IAEF,KAAK,QAAQ;AACX,UAAI,QAAQ;AACZ,YAAM,aAAa,OAAO;AAC1B,YAAM,cAAe,OAAO,UAAiC;AAC7D,UAAI,YAAY;AACd,gBAAQ,KAAK,WAAW,MAAM,cAAc,aAAa,CAAC;AAAA,MAC5D,WAAW,cAAc,GAAG;AAC1B,gBAAQ,eAAe,WAAW;AAAA,MACpC;AACA,YAAM,cAAc,OAAO,YACvB,cAAc,OAAO,MAAM,SAAS,GAAG,SAAS,GAAG,IACnD;AACJ,aAAO;AAAA,QACL,OAAO,QAAQ,WAAW,GAAG,KAAK;AAAA,QAClC,MAAM;AAAA,QACN,WAAW,OAAO,YACd;AAAA,UACE;AAAA,YACE,MAAM,OAAO,MAAM,SAAS;AAAA,YAC5B,MAAM;AAAA,UACR;AAAA,QACF,IACA,CAAC;AAAA,QACL,SAAS,CAAC;AAAA,MACZ;AAAA,IACF;AAAA,IAEA,KAAK;AACH,aAAO;AAAA,QACL,OAAO,YAAY,OAAO,OAAO,KAAK,OAAO,MAAM,IAAI,CAAC,OAAO,SAAS;AAAA,QACxE,MAAM;AAAA,QACN,SAAS,CAAC;AAAA,QACV,WAAW,CAAC;AAAA,MACd;AAAA,IAEF,KAAK,QAAQ;AACX,YAAM,WAAW,OAAO,YAAY,OAAO,MAAM,SAAS,IAAI;AAC9D,YAAM,cAAc,WAChB,cAAc,UAAU,SAAS,GAAG,IACpC;AACJ,UAAI,UAAyB,OAAO,aAChC,OAAO,MAAM,UAAU,IACvB;AACJ,UAAI,UAAkB,OAAO,aAAa,OAAO,MAAM,UAAU,IAAI;AAKrE,UAAI,YAAY,YAAY,MAAM;AAChC,cAAM,cAAc;AAAA,UAClB;AAAA,UACA;AAAA,UACA,SAAS;AAAA,QACX;AACA,YAAI,aAAa;AACf,gBAAM,aAAa,OAAO,cACtB,YAAY,WAAW,SAAS,OAAO,IACvC,YAAY,QAAQ,SAAS,OAAO;AACxC,oBAAU;AACV,oBAAU;AAAA,QACZ;AAAA,MACF;AAEA,aAAO;AAAA,QACL,OAAO,cAAc,UAAU,WAAW,OAAO;AAAA,QACjD,MAAM;AAAA,QACN,SACE,SAAS,WACL;AAAA,UACE;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN;AAAA,YACA;AAAA,UACF;AAAA,QACF,IACA,CAAC;AAAA,QACP,WAAW,WAAW,CAAC,EAAE,MAAM,SAAS,CAAC,IAAI,CAAC;AAAA,MAChD;AAAA,IACF;AAAA,IAEA,KAAK,SAAS;AACZ,UAAI,gBAAmC,CAAC;AACxC,YAAM,gBAAgB,OAAO,YACzB,OAAO,MAAM,SAAS,IACtB;AACJ,YAAM,mBAAmB,gBACrB,cAAc,eAAe,SAAS,GAAG,IACzC;AACJ,YAAM,aAAa,OAAO,UAAU,OAAO,MAAM,OAAO,IAAI;AAC5D,UAAI,eAAe;AACjB,YAAI,aAA4B;AAChC,YACE,SAAS,qBACT,iBAAiB,QAAQ,mBACzB;AACA,uBAAa,QAAQ,kBAAkB,aAAa;AAAA,QACtD,OAAO;AACL,cAAI;AACF,yBAAaC,IAAG,aAAa,eAAe,OAAO;AAAA,UACrD,QAAQ;AAAA,UAER;AAAA,QACF;AACA,wBAAgB,YAAY,EACzB,KAAK,eAAe,YAAY,cAAc,EAAE,EAChD,MAAM;AAAA,MACX,WAAW,YAAY;AACrB,wBAAgB,YAAY,EAAE,KAAK,UAAU,EAAE,MAAM;AAAA,MACvD;AACA,aAAO;AAAA,QACL,OAAO,mBAAmB,SAAS,gBAAgB,KAAK;AAAA,QACxD,MAAM;AAAA,QACN,SAAS;AAAA,QACT,WAAW,gBAAgB,CAAC,EAAE,MAAM,cAAc,CAAC,IAAI,CAAC;AAAA,MAC1D;AAAA,IACF;AAAA,IAEA,KAAK,QAAQ;AACX,UAAI,QAAQ;AACZ,YAAM,UAAU,OAAO,OAAO,OAAO,MAAM,IAAI,IAAI;AACnD,UAAI,SAAS;AACX,iBAAS,KAAK,OAAO;AAAA,MACvB;AACA,UAAI,OAAO,SAAS;AAClB,iBAAS,KAAK,OAAO,MAAM,OAAO,CAAC;AAAA,MACrC;AACA,aAAO;AAAA,QACL,OAAO;AAAA,QACP,MAAM;AAAA,QACN,SAAS,CAAC;AAAA,QACV,WAAW,UAAU,CAAC,EAAE,MAAM,QAAQ,CAAC,IAAI,CAAC;AAAA,MAC9C;AAAA,IACF;AAAA,IAEA,KAAK,QAAQ;AACX,UAAI,QAAQ;AAEZ,UAAI,QAAQ,IAAI,GAAG;AACjB,iBAAS;AAAA,MACX;AACA,UAAI,QAAQ,IAAI,GAAG;AACjB,iBAAS;AAAA,MACX;AAEA,UAAI,QAAQ,IAAI,MAAM,QAAW;AAC/B,iBAAS,OAAO,MAAM,IAAI,CAAC;AAAA,MAC7B;AACA,UAAI,QAAQ,IAAI,MAAM,QAAW;AAC/B,iBAAS,OAAO,MAAM,IAAI,CAAC;AAAA,MAC7B;AACA,UAAI,QAAQ,IAAI,MAAM,QAAW;AAC/B,iBAAS,OAAO,MAAM,IAAI,CAAC;AAAA,MAC7B;AAEA,UAAI,OAAO,aAAa;AACtB,gBAAQ,MAAM,aAAa;AAAA,UACzB,KAAK;AACH,qBAAS;AACT;AAAA,UACF,KAAK;AACH,qBAAS;AACT;AAAA,UACF;AACE;AAAA,QACJ;AAAA,MACF;AAEA,UAAI,OAAO,eAAe,QAAW;AACnC,iBAAS,YAAY,MAAM,UAAU;AAAA,MACvC;AAEA,UAAI,OAAO,MAAM;AACf,iBAAS,eAAe,OAAO,MAAM,IAAI,CAAC;AAAA,MAC5C;AAEA,UAAI,OAAO,MAAM;AACf,iBAAS,WAAW,OAAO,MAAM,IAAI,CAAC;AAAA,MACxC;AAEA,UAAI,OAAO,WAAW;AACpB,iBAAS;AAAA,MACX;AAEA,UAAI,OAAO,SAAS;AAClB,iBAAS,KAAK,OAAO,MAAM,OAAO,CAAC;AAAA,MACrC;AAEA,UAAI,OAAO,MAAM;AACf,iBAAS,IAAI,OAAO,MAAM,IAAI,CAAC;AAAA,MACjC;AAEA,aAAO;AAAA,QACL,OAAO;AAAA,QACP,MAAM;AAAA,QACN,SAAS,CAAC;AAAA,MACZ;AAAA,IACF;AAAA,IAEA,KAAK;AACH,aAAO;AAAA,QACL,OAAO;AAAA,QACP,MAAM;AAAA,QACN,SAAS,OAAO,MACZ;AAAA,UACE;AAAA,YACE,MAAM;AAAA,YACN,SAAS,aAAa,OAAO,MAAM,GAAG,GAAG,OAAO,MAAM,GAAG,GAAG;AAAA,cAC1D,aAAa,OAAO,SAAS,OAAO,MAAM,MAAM,IAAI;AAAA,YACtD,CAAC;AAAA,UACH;AAAA,QACF,IACA,CAAC;AAAA,MACP;AAAA,IAEF,KAAK,aAAa;AAChB,UAAI,QAAQ,IAAI,OAAO,QAAQ,OAAO,MAAM,KAAK,IAAI,EAAE;AACvD,YAAM,iBAAiB,OAAO;AAC9B,YAAM,iBAAiB,OAAO;AAE9B,UAAI,kBAAkB,eAAe,SAAS,GAAG;AAC/C,iBAAS,cAAc,eAAe,KAAK,IAAI,CAAC;AAAA,MAClD;AAEA,UAAI,kBAAkB,eAAe,SAAS,GAAG;AAC/C,iBAAS,cAAc,eAAe,KAAK,IAAI,CAAC;AAAA,MAClD;AAEA,aAAO;AAAA,QACL,OAAO;AAAA,QACP,MAAM;AAAA,QACN,SAAS,CAAC;AAAA,MACZ;AAAA,IACF;AAAA,IAEA,KAAK;AACH,aAAO;AAAA,QACL,OAAO,MAAM,QAAQ,OAAO,KAAK,IAC7B,iBAAiB,MAAM,MAAM,IAAI,CAAC,SAA+B,KAAK,OAAO,EAAE,KAAK,IAAI,CAAC,KACzF;AAAA,QACJ,MAAM;AAAA,QACN,SAAS,CAAC;AAAA,MACZ;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,OAAO;AAAA,QACP,MAAM;AAAA,QACN,SAAS,OAAO,OACZ,YAAY,EAAE,KAAK,OAAO,MAAM,IAAI,CAAC,EAAE,MAAM,IAC7C,CAAC;AAAA,MACP;AAAA,IAEF,KAAK,mBAAmB;AACtB,YAAM,YAAY,OAAO;AAGzB,aAAO;AAAA,QACL,OAAO,YAAY,CAAC,GAAG,YAAY;AAAA,QACnC,MAAM;AAAA,QACN,SAAS,YACL,YAAY,EACT,KAAK,KAAK,UAAU,WAAW,MAAM,CAAC,CAAC,EACvC,MAAM,IACT,CAAC;AAAA,MACP;AAAA,IACF;AAAA,IAEA,KAAK,SAAS;AACZ,UAAI;AACJ,UAAI;AACF,iBAAS,KAAK,UAAU,OAAO,MAAM,CAAC;AAAA,MACxC,QAAQ;AACN,iBAAS,OAAO,UAAU,WAAW,QAAQ;AAAA,MAC/C;AACA,aAAO;AAAA,QACL,OAAOD,SAAQ;AAAA,QACf,MAAM;AAAA,QACN,SAAS,YAAY,EAAE,KAAK;AAAA,EAAe,MAAM,QAAQ,EAAE,MAAM;AAAA,MACnE;AAAA,IACF;AAAA,IAEA,SAAS;AACP,UAAIA,OAAM,WAAW,OAAO,GAAG;AAC7B,eAAO,YAAYA,OAAM,KAAK;AAAA,MAChC;AACA,aAAO;AAAA,QACL,OAAOA,SAAQ;AAAA,QACf,MAAM;AAAA,QACN,SAAS,CAAC;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,YACPA,OACA,QACU;AACV,QAAME,YAAW,mBAAmBF,KAAI;AAExC,QAAM,QACJE,WAAU,SAASF,MAAK,MAAM,IAAI,EAAE,MAAM,CAAC,EAAE,KAAK,IAAI,KAAKA;AAE7D,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,SAAS,CAAC;AAAA,EACZ;AACF;AAgBO,SAAS,+BACd,cACsE;AACtE,MAAI,CAAC,gBAAgB,OAAO,iBAAiB,SAAU,QAAO;AAC9D,QAAM,WAAW;AAEjB,QAAM,UAAU,SAAS;AACzB,MAAI,CAAC,MAAM,QAAQ,OAAO,KAAK,QAAQ,WAAW,EAAG,QAAO;AAE5D,QAAM,UAA6B,CAAC;AACpC,QAAM,YAAgC,CAAC;AAEvC,aAAW,SAAS,SAAS;AAC3B,QAAI,CAAC,MAAM,SAAS,MAAM,MAAM,WAAW,EAAG;AAE9C,UAAM,WAAW,MAAM,eAAe,MAAM;AAE5C,UAAM,WAAqB,CAAC;AAC5B,UAAM,WAAqB,CAAC;AAC5B,eAAW,QAAQ,MAAM,OAAO;AAC9B,iBAAW,QAAQ,KAAK,OAAO;AAC7B,YAAI,KAAK,WAAW,GAAG,GAAG;AACxB,mBAAS,KAAK,KAAK,MAAM,CAAC,CAAC;AAAA,QAC7B,WAAW,KAAK,WAAW,GAAG,GAAG;AAC/B,mBAAS,KAAK,KAAK,MAAM,CAAC,CAAC;AAAA,QAC7B,WAAW,KAAK,WAAW,GAAG,GAAG;AAC/B,mBAAS,KAAK,KAAK,MAAM,CAAC,CAAC;AAC3B,mBAAS,KAAK,KAAK,MAAM,CAAC,CAAC;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAEA,YAAQ,KAAK;AAAA,MACX,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,SAAS,KAAK,IAAI;AAAA,MAC3B,SAAS,SAAS,KAAK,IAAI;AAAA,IAC7B,CAAC;AAED,UAAM,YAAY,MAAM,MAAM,CAAC;AAC/B,cAAU,KAAK;AAAA,MACb,MAAM;AAAA,MACN,MAAM,UAAU;AAAA,IAClB,CAAC;AAAA,EACH;AAEA,MAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,SAAO,EAAE,SAAS,UAAU;AAC9B;AAEO,SAAS,yBACd,YAUA,SACA,SAMmE;AACnE,MACE,cAAc,cACd,WAAW,YACX,WAAW,WACV,WAAW,QAAsB,SAAS,GAC3C;AACA,WAAO,mBAAmB,WAAW,SAAS,IAAI;AAAA,EACpD;AAEA,UAAQ,SAAS,MAAM;AAAA,IACrB,KAAK,QAAQ;AACX,YAAM,QAAQ,SAAS;AACvB,YAAM,WACJ,SAAS,SAAS,YAAY,MAAM,IAAI,QAAQ,SAAS,IAAI;AAC/D,UAAI,aAAa,UAAa,SAAS,SAAS,WAAW;AACzD,cAAM,OAAO,QAAQ,SAAS;AAC9B,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,SAAS,KAAK,eAAe,QAAQ,CAAC;AAAA,YACxC;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,UAAI,MAAM,QAAQ,WAAW,OAAO,KAAK,WAAW,QAAQ,SAAS,GAAG;AACtE,eAAO;AAAA,UACL,SAAS,WAAW,QAAQ,IAAI,CAAC,SAAS;AACxC,kBAAM,UAAU;AAKhB,gBAAI,QAAQ,SAAS,QAAQ;AAC3B,qBAAO;AAAA,gBACL,MAAM;AAAA,gBACN,SAAS;AAAA,kBACP,eAAe,qBAAqB,QAAQ,QAAQ,EAAE,CAAC;AAAA,gBACzD;AAAA,cACF;AAAA,YACF;AACA,gBAAI,QAAQ,SAAS,WAAW,QAAQ,QAAQ;AAC9C,qBAAO;AAAA,gBACL,MAAM;AAAA,gBACN,SAAS;AAAA,kBACP,MAAM;AAAA,kBACN,MAAM,QAAQ,OAAO,QAAQ;AAAA,kBAC7B,UAAU,QAAQ,OAAO,cAAc;AAAA,gBACzC;AAAA,cACF;AAAA,YACF;AACA,mBAAO;AAAA,cACL,MAAM;AAAA,cACN,SAAS;AAAA,YACX;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF,WACE,OAAO,WAAW,YAAY,YAC9B,WAAW,QAAQ,SAAS,GAC5B;AACA,eAAO;AAAA,UACL,SAAS,YAAY,EAClB,KAAK,eAAe,qBAAqB,WAAW,OAAO,CAAC,CAAC,EAC7D,MAAM;AAAA,QACX;AAAA,MACF;AACA,aAAO,CAAC;AAAA,IACV;AAAA,IAEA,KAAK,QAAQ;AACX,YAAM,SAAS,WAAW;AAC1B,YAAM,aACJ,iBAAiB,aAAa,OAAO,WAAW,WAAW,IAAI;AACjE,YAAM,UAAU,cAAc,cAAc,WAAW;AAEvD,UAAI,SAAS;AACb,UAAI,WAAW,UAAU,IAAI;AAE7B,UACE,UACA,OAAO,WAAW,YAClB,UAAU,UACT,OAA4B,SAAS,8BACtC;AACA,cAAM,aAAa;AAKnB,iBAAS,CAAC,WAAW,QAAQ,WAAW,MAAM,EAC3C,OAAO,OAAO,EACd,KAAK,IAAI;AACZ,mBAAW,WAAW;AAAA,MACxB,WAAW,OAAO,WAAW,UAAU;AACrC,iBAAS;AAAA,MACX,WACE,MAAM,QAAQ,MAAM,KACpB,OAAO,SAAS,KAChB,UAAU,OAAO,CAAC,KAClB,OAAO,OAAO,CAAC,EAAE,SAAS,UAC1B;AACA,iBAAS,OAAO,IAAI,CAAC,MAAyB,EAAE,QAAQ,EAAE,EAAE,KAAK,IAAI;AAAA,MACvE;AAEA,UAAI,SAAS,wBAAwB;AACnC,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,YAAqB,WAAW,CAAC;AAAA,UACnD,OAAO;AAAA,YACL,eAAe;AAAA,cACb,aAAa;AAAA,YACf;AAAA,YACA,iBAAiB;AAAA,cACf,aAAa;AAAA,cACb,MAAM;AAAA,YACR;AAAA,YACA,eAAe;AAAA,cACb,aAAa;AAAA,cACb,WAAW;AAAA,cACX,QAAQ;AAAA,YACV;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,UAAI,OAAO,KAAK,GAAG;AACjB,eAAO;AAAA,UACL,SAAS,YAAY,EAClB,KAAK;AAAA,EAAkB,OAAO,QAAQ,CAAC;AAAA,OAAU,EACjD,MAAM;AAAA,QACX;AAAA,MACF;AACA,aAAO,CAAC;AAAA,IACV;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AACH,aAAO,CAAC;AAAA,IAEV,KAAK,gBAAgB;AACnB,aAAO,EAAE,OAAO,mBAAmB;AAAA,IACrC;AAAA,IACA,KAAK,mBAAmB;AACtB,YAAM,UAAU,WAAW;AAC3B,UAAI,MAAM,QAAQ,OAAO,KAAK,QAAQ,SAAS,GAAG;AAChD,cAAM,YAAY,QAAQ,CAAC;AAC3B,YACE,OAAO,cAAc,YACrB,cAAc,QACd,UAAU,WACV;AACA,iBAAO;AAAA,YACL,OAAO;AAAA,YACP,SAAS,YAAY,EAAE,KAAK,OAAO,UAAU,IAAI,CAAC,EAAE,MAAM;AAAA,UAC5D;AAAA,QACF;AAAA,MACF;AACA,aAAO,EAAE,OAAO,oBAAoB;AAAA,IACtC;AAAA,IACA,KAAK,YAAY;AACf,YAAM,QAAQ,SAAS;AACvB,YAAM,MAAM,OAAO,MAAM,OAAO,MAAM,GAAG,IAAI;AAC7C,YAAM,SAAS,OAAO,SAAS,OAAO,MAAM,MAAM,IAAI;AAEtD,YAAM,gBAAgB;AAAA,QACpB,WAAW;AAAA,QACX,cAAc,aAAa,WAAW,WAAW;AAAA,MACnD;AAEA,YAAM,UAA6B,CAAC;AACpC,UAAI,KAAK;AACP,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,SAAS,aAAa,KAAK,KAAK;AAAA,YAC9B,aAAa;AAAA,UACf,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AACA,UAAI,cAAc,SAAS;AACzB,gBAAQ,KAAK,GAAG,cAAc,OAAO;AAAA,MACvC;AAEA,aAAO,EAAE,QAAQ;AAAA,IACnB;AAAA,IACA,SAAS;AACP,aAAO;AAAA,QACL,WAAW;AAAA,QACX,cAAc,aAAa,WAAW,WAAW;AAAA,MACnD;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,WAAW,MAA8B;AAChD,MAAI,CAAC,QAAQ,OAAO,SAAS,SAAU,QAAO;AAC9C,QAAM,MAAM;AAEZ,MAAI,IAAI,SAAS,UAAU,OAAO,IAAI,SAAS,UAAU;AACvD,WAAO,qBAAqB,IAAI,IAAI;AAAA,EACtC;AAEA,MAAI;AACF,WAAO,KAAK,UAAU,KAAK,MAAM,CAAC;AAAA,EACpC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,mBACP,SACA,UAAmB,OACc;AACjC,MAAI,MAAM,QAAQ,OAAO,KAAK,QAAQ,SAAS,GAAG;AAChD,UAAM,QAAkB,CAAC;AACzB,eAAW,QAAQ,SAAS;AAC1B,YAAM,IAAI,WAAW,IAAI;AACzB,UAAI,EAAG,OAAM,KAAK,CAAC;AAAA,IACrB;AACA,QAAI,MAAM,SAAS,GAAG;AACpB,YAAM,WAAW,MAAM,KAAK,IAAI;AAChC,aAAO;AAAA,QACL,SAAS,YAAY,EAClB,KAAK,UAAU;AAAA,EAAW,QAAQ;AAAA,UAAa,QAAQ,EACvD,MAAM;AAAA,MACX;AAAA,IACF;AAAA,EACF,WAAW,OAAO,YAAY,YAAY,QAAQ,SAAS,GAAG;AAC5D,WAAO;AAAA,MACL,SAAS,YAAY,EAClB,KAAK,UAAU;AAAA,EAAW,OAAO;AAAA,UAAa,OAAO,EACrD,MAAM;AAAA,IACX;AAAA,EACF,WAAW,WAAW,OAAO,YAAY,UAAU;AACjD,QAAI;AACF,YAAM,OAAO,KAAK,UAAU,SAAS,MAAM,CAAC;AAC5C,UAAI,QAAQ,SAAS,MAAM;AACzB,eAAO;AAAA,UACL,SAAS,YAAY,EAAE,KAAK,IAAI,EAAE,MAAM;AAAA,QAC1C;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO,CAAC;AACV;AAQO,SAAS,YAAY,OAAkD;AAC5E,SAAO,MAAM,MAAM,IAAI,CAACG,YAAW;AAAA,IACjC,SAASA,OAAM;AAAA,IACf,QAAQA,OAAM;AAAA,IACd,UAAU;AAAA,EACZ,EAAE;AACJ;AASA,SAAS,mBACP,UACA,SACA,mBACe;AACf,MAAI,qBAAqB,YAAY,mBAAmB;AACtD,UAAM,SAAS,kBAAkB,QAAQ;AACzC,QAAI,OAAO,SAAS,OAAO,GAAG;AAC5B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI;AACF,UAAM,UAAUF,IAAG,aAAa,UAAU,OAAO;AACjD,QAAI,QAAQ,SAAS,OAAO,GAAG;AAC7B,aAAO;AAAA,IACT;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,eAAeG,OAAsB;AAC5C,MAAI,cAAc;AAClB,aAAW,CAAC,CAAC,KAAKA,MAAK,SAAS,SAAS,GAAG;AAC1C,WAAO,EAAE,UAAU,YAAY,QAAQ;AACrC,qBAAe;AAAA,IACjB;AAAA,EACF;AACA,SAAO,GAAG,WAAW;AAAA,EAAKA,KAAI,GAAGA,MAAK,SAAS,IAAI,IAAI,KAAK,IAAI,GAAG,WAAW;AAChF;;;AHlvBA,SAAS,kBAAkB,MAAY;AACrC,SAAO,SAAS,cAAc,wBAAwB;AACxD;AAEA,SAAS,SACP,UACA,cACA,kBACgB;AAChB,QAAM,OAAqC,EAAE,SAAS;AACtD,MAAI,iBAAiB,OAAW,MAAK,eAAe;AACpD,MAAI,iBAAkB,MAAK,mBAAmB;AAC9C,SAAO,EAAE,YAAY,KAAK;AAC5B;AAEA,SAAS,gBACP,OACA,MACA,kBACe;AACf,QAAM,SAAwB;AAAA,IAC5B,eAAe,kBAAkB,IAAI;AAAA,IACrC,SAAS,KAAK,MAAM,IAAI;AAAA,EAC1B;AACA,MAAI,kBAAkB;AACpB,IAAC,OAAmC,QAAQ;AAAA,MAC1C;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,iBACP,OAGA,MACe;AACf,SAAO;AAAA,IACL,eAAe,kBAAkB,IAAI;AAAA,IACrC,SAAS;AAAA,MACP,MAAM,OAAO,SAAS,WAAY,MAAM,OAAO,QAAQ,KAAM;AAAA,MAC7D,MAAM,OAAO,SAAS,WAAY,MAAM,OAAO,cAAc,KAAM;AAAA,MACnE,MAAM,OAAO,SAAS,QAAQ,MAAM,OAAO,MAAM;AAAA,IACnD;AAAA,EACF;AACF;AAEA,SAAS,oBACP,OACA,kBACe;AACf,QAAM,SAAwB;AAAA,IAC5B,eAAe;AAAA,IACf,SAAS,KAAK,MAAM,QAAQ;AAAA,EAC9B;AACA,MAAI,kBAAkB;AACpB,IAAC,OAAmC,QAAQ;AAAA,MAC1C;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,mBACP,OACA,KACsB;AACtB,QAAM,gBAAgB,MAAM,MAAM,IAAI;AACtC,MAAI,aAAa,MAAM,EAAE,IAAI;AAE7B,MAAI,MAAM,SAAS,aAAa;AAC9B,UAAM,QAAQ,MAAM;AACpB,QAAI,MAAM,QAAQ,MAAM,KAAK,GAAG;AAC9B,aAAO;AAAA,QACL,eAAe;AAAA,QACf,SAAS,YAAY,MAAM,KAAqC;AAAA,MAClE;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,iBAAiB,IAAI,kBAAkB,OAAO;AACjD,yBAAqB,MAAM,IAAI;AAAA,MAC7B,mBAAmB,OAAO,WAAW,YAAY,iBAAiB;AAChE,cAAM,UAAU,IAAI,aAAa,SAAS;AAC1C,YAAI,SAAS;AACX,gBAAM,aACJ,QAAQ,SAAS,SACb,+BAA+B,YAAY,IAC3C;AAEN,gBAAM,IAAI,OAAO,cAAc;AAAA,YAC7B,WAAW,IAAI;AAAA,YACf,QAAQ;AAAA,cACN,OAAO,SAAS,QAAQ,MAAM,cAAc,IAAI,gBAAgB;AAAA,cAChE,YAAY;AAAA,cACZ,eAAe;AAAA,cACf,GAAI,aAAa,aAAa,CAAC;AAAA,YACjC;AAAA,UACF,CAAC;AAAA,QACH,OAAO;AACL,cAAI,OAAO;AAAA,YACT,yDAAyD,SAAS;AAAA,UACpE;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI;AACJ,MAAI;AACF,eAAW,KAAK,MAAM,KAAK,UAAU,MAAM,KAAK,CAAC;AAAA,EACnD,QAAQ;AAAA,EAER;AAEA,QAAM,WAAW,oBAAoB,OAAO;AAAA,IAC1C,wBAAwB,IAAI;AAAA,IAC5B,WAAW,MAAM;AAAA,IACjB,mBAAmB,IAAI;AAAA,IACvB,KAAK,IAAI;AAAA,EACX,CAAC;AAED,QAAM,OAAgC;AAAA,IACpC,GAAG,SAAS,MAAM,MAAM,QAAW,IAAI,gBAAgB;AAAA,EACzD;AACA,MAAI,MAAM,SAAS,UAAU,IAAI,0BAA0B,CAAC,eAAe;AACzE,SAAK,gBAAgB,EAAE,aAAa,MAAM,GAAG;AAAA,EAC/C;AAEA,MAAI,eAAe;AACjB,WAAO;AAAA,MACL,OAAO;AAAA,MACP,YAAY,MAAM;AAAA,MAClB,eAAe;AAAA,MACf;AAAA,MACA,GAAG;AAAA,IACL;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO;AAAA,IACP,YAAY,MAAM;AAAA,IAClB,eAAe;AAAA,IACf;AAAA,IACA,QAAQ;AAAA,IACR,GAAG;AAAA,EACL;AACF;AAEA,SAAS,uBAAuB,SAAiC;AAC/D,MAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,UAAMC,SAAkB,CAAC;AACzB,eAAW,QAAQ,SAAS;AAC1B,UACE,OAAO,SAAS,YAChB,SAAS,QACT,UAAU,QACV,OAAQ,KAAiC,SAAS,UAClD;AACA,QAAAA,OAAM,KAAM,KAA0B,IAAI;AAAA,MAC5C;AAAA,IACF;AACA,WAAOA,OAAM,SAAS,IAAIA,OAAM,KAAK,EAAE,IAAI;AAAA,EAC7C;AACA,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,oBAAoBC,OAAsB;AACxD,SAAOA,MAAK,QAAQ,iBAAiB,EAAE;AACzC;AAEA,SAAS,uBACP,SACA,OACA,KACM;AACN,QAAM,QAAQ,QAAQ;AACtB,QAAM,WAAW,OAAO,YAAY,OAAO,MAAM,SAAS,IAAI;AAC9D,MAAI,CAAC,SAAU;AAEf,MAAI,QAAQ,SAAS,UAAU,CAAC,OAAO,SAAS,CAAC,OAAO,QAAQ;AAC9D,UAAM,WAAW,uBAAuB,MAAM,OAAO;AACrD,QAAI,aAAa,MAAM;AACrB,UAAI,iBAAiB,QAAQ,IAAI,oBAAoB,QAAQ;AAAA,IAC/D;AAAA,EACF,WAAW,QAAQ,SAAS,SAAS;AACnC,UAAM,UAAU,OAAO;AACvB,QAAI,OAAO,YAAY,UAAU;AAC/B,UAAI,iBAAiB,QAAQ,IAAI;AAAA,IACnC;AAAA,EACF,WAAW,QAAQ,SAAS,QAAQ;AAClC,UAAM,YAAY,OAAO;AACzB,UAAM,YAAY,OAAO;AACzB,QACE,OAAO,cAAc,YACrB,OAAO,cAAc,YACrB,YAAY,IAAI,kBAChB;AACA,YAAMC,WAAU,IAAI,iBAAiB,QAAQ;AAC7C,UAAI,iBAAiB,QAAQ,IAAI,OAAO,cACpCA,SAAQ,WAAW,WAAW,SAAS,IACvCA,SAAQ,QAAQ,WAAW,SAAS;AAAA,IAC1C;AAAA,EACF;AACF;AAEA,SAAS,sBACP,OAKA,KACiB;AACjB,QAAM,UAAU,IAAI,aAAa,MAAM,WAAW;AAClD,MAAI,CAAC,SAAS;AACZ,QAAI,OAAO;AAAA,MACT,uDAAuD,MAAM,WAAW;AAAA,IAC1E;AACA,WAAO,CAAC;AAAA,EACV;AAEA,MAAI,QAAQ,SAAS,aAAa;AAChC,WAAO,CAAC;AAAA,EACV;AAEA,MAAI,CAAC,MAAM,UAAU;AACnB,2BAAuB,SAAS,OAAO,GAAG;AAAA,EAC5C;AAEA,QAAM,EAAE,OAAO,YAAY,GAAG,WAAW,IAAI;AAAA,IAC3C;AAAA,IACA;AAAA,IACA;AAAA,MACE,wBAAwB,IAAI;AAAA,MAC5B,WAAW,MAAM;AAAA,MACjB,mBAAmB,IAAI;AAAA,MACvB,mBAAmB,IAAI;AAAA,IACzB;AAAA,EACF;AAEA,QAAM,UAA2B,CAAC;AAElC,MAAI,YAAY,iBAAiB;AAC/B,UAAM,qBAA8C;AAAA,MAClD,iBAAiB,WAAW;AAAA,IAC9B;AACA,QAAI,IAAI,kBAAkB;AACxB,yBAAmB,aAAa;AAAA,QAC9B,kBAAkB,IAAI;AAAA,MACxB;AAAA,IACF;AACA,YAAQ,KAAK;AAAA,MACX,OAAO;AAAA,MACP,YAAY,MAAM;AAAA,MAClB,eAAe;AAAA,IACjB,CAAC;AAAA,EACH;AAEA,QAAM,OAAgC;AAAA,IACpC,GAAG,SAAS,QAAQ,MAAM,QAAW,IAAI,gBAAgB;AAAA,IACzD,GAAI,YAAY,gBACZ,EAAE,eAAe,WAAW,cAAc,IAC1C,CAAC;AAAA,EACP;AAEA,UAAQ,KAAK;AAAA,IACX,OAAO;AAAA,IACP,YAAY,MAAM;AAAA,IAClB,eAAe;AAAA,IACf,QAAQ,MAAM,WAAW,WAAW;AAAA,IACpC,WAAW,IAAI,mBACX,EAAE,GAAG,IAAI,kBAAkB,SAAS,MAAM,YAAY,MAAM,IAC5D;AAAA,MACE,SAAS,MAAM,QAAQ,MAAM,OAAO,IAChC,MAAM,UACN,OAAO,MAAM,YAAY,WACvB,CAAC,EAAE,MAAM,QAAiB,MAAM,MAAM,QAAQ,CAAC,IAC/C,CAAC;AAAA,MACP,SAAS,MAAM,YAAY;AAAA,IAC7B;AAAA,IACJ,GAAG;AAAA,EACL,CAAC;AAED,SAAO;AACT;AAEA,SAAS,oBACP,OACA,MACA,KACiB;AACjB,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AAAA,IACL,KAAK,cAAc;AACjB,YAAM,SAAS,gBAAgB,OAAO,MAAM,IAAI,gBAAgB;AAChE,aAAO,SAAS,CAAC,MAAM,IAAI,CAAC;AAAA,IAC9B;AAAA,IAEA,KAAK,SAAS;AACZ,YAAM,SAAS,iBAAiB,OAAO,IAAI;AAC3C,aAAO,SAAS,CAAC,MAAM,IAAI,CAAC;AAAA,IAC9B;AAAA,IAEA,KAAK;AAAA,IACL,KAAK,kBAAkB;AACrB,YAAM,SAAS,oBAAoB,OAAO,IAAI,gBAAgB;AAC9D,aAAO,SAAS,CAAC,MAAM,IAAI,CAAC;AAAA,IAC9B;AAAA,IAEA,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK,gBAAgB;AACnB,YAAM,SAAS,mBAAmB,OAA+B,GAAG;AACpE,aAAO,SAAS,CAAC,MAAM,IAAI,CAAC;AAAA,IAC9B;AAAA,IAEA,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QAKA;AAAA,MACF;AAAA,IAEF,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,CAAC;AAAA,IAEV;AACE,kBAAY,OAAgB,IAAI,MAAM;AACtC,aAAO,CAAC;AAAA,EACZ;AACF;AAEA,SAAS,mBACP,SAKA,MACA,WACA,cACA,kBACA,QACA,QACA,kBACA,eACA,wBACA,KACA,kBACA,mBACuB;AACvB,MAAI,OAAO,YAAY,UAAU;AAC/B,UAAM,SAAwB;AAAA,MAC5B,eAAe,kBAAkB,IAAI;AAAA,MACrC,SAAS,KAAK,OAAO;AAAA,IACvB;AACA,QAAI,kBAAkB;AACpB,MAAC,OAAmC,QAAQ;AAAA,QAC1C;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,WAAO,CAAC,EAAE,WAAW,OAAO,CAAC;AAAA,EAC/B;AAEA,QAAM,MAA2B;AAAA,IAC/B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,SAAgC,CAAC;AAEvC,aAAW,SAAS,SAAS;AAC3B,eAAW,UAAU,oBAAoB,OAAO,MAAM,GAAG,GAAG;AAC1D,aAAO,KAAK,EAAE,WAAW,OAAO,CAAC;AAAA,IACnC;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,8BACP,SACA,WACA,cACA,kBACA,QACA,QACA,kBACA,eACA,wBACA,KACA,mBACuB;AACvB,QAAM,QAAQ,QAAQ;AACtB,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,aAAO;AAAA,QACL,CAAC,MAAM,aAAa;AAAA,QACpB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,CAAC,MAAM,KAAK;AAAA,QACZ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,CAAC;AAAA,IAEV;AACE,kBAAY,OAAgB,MAAM;AAClC,aAAO,CAAC;AAAA,EACZ;AACF;AAEA,eAAsB,oBACpB,SACA,SACe;AACf,QAAM,EAAE,SAAS,WAAW,QAAQ,OAAO,IAAI;AAE/C,UAAQ,QAAQ,SAAS;AAAA,IACvB,KAAK;AACH;AAAA,IACF,KAAK;AACH,YAAM,OAAO,gBAAgB,sBAAsB,kBAAkB;AAAA,QACnE;AAAA,QACA,SAAS,QAAQ,iBAAiB;AAAA,QAClC,WAAW,QAAQ,iBAAiB;AAAA,QACpC,aAAa,QAAQ;AAAA,MACvB,CAAC;AACD;AAAA,IACF,KAAK;AACH,aAAO,KAAK,0BAA0B;AAAA,QACpC,UAAU,QAAQ;AAAA,QAClB,WAAW,QAAQ;AAAA,MACrB,CAAC;AACD;AAAA,IACF,KAAK;AACH,UAAI,QAAQ,WAAW,cAAc;AACnC,eAAO,KAAK,8BAA8B,EAAE,UAAU,CAAC;AACvD,cAAM,OAAO,gBAAgB,sBAAsB,QAAQ;AAAA,UACzD;AAAA,UACA,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AACA;AAAA,IACF,KAAK,qBAAqB;AACxB,aAAO,KAAK,8BAA8B;AAAA,QACxC;AAAA,QACA,QAAQ,QAAQ;AAAA,QAChB,QAAQ,QAAQ;AAAA,QAChB,SAAS,QAAQ;AAAA,MACnB,CAAC;AACD,YAAM,OAAO,gBAAgB,sBAAsB,mBAAmB;AAAA,QACpE;AAAA,QACA,QAAQ,QAAQ;AAAA,QAChB,QAAQ,QAAQ;AAAA,QAChB,SAAS,QAAQ;AAAA,QACjB,YAAY,QAAQ;AAAA,MACtB,CAAC;AACD;AAAA,IACF;AAAA,IACA;AACE;AAAA,EACJ;AACF;AAgBO,SAAS,oBACd,SAC4B;AAC5B,QAAM,QAAQ,uBAAuB,OAAO;AAE5C,UAAQ,QAAQ,SAAS;AAAA,IACvB,KAAK,WAAW;AACd,UAAI,QAAQ,OAAO,SAAS,mBAAmB,GAAG;AAChD,eAAO;AAAA,UACL,YAAY;AAAA,UACZ,OAAO,aAAa,aAAa;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AACA,UAAK,QAAoC,gBAAgB,cAAc;AACrE,eAAO,EAAE,YAAY,MAAM,YAAY,cAAc,MAAM;AAAA,MAC7D;AACA,UAAI,QAAQ,UAAU;AACpB,eAAO;AAAA,UACL,YAAY;AAAA,UACZ,OAAO,aAAa,cAAc,QAAW,QAAQ,MAAM;AAAA,UAC3D;AAAA,QACF;AAAA,MACF;AACA,aAAO,EAAE,YAAY,MAAM,YAAY,YAAY,MAAM;AAAA,IAC3D;AAAA,IACA,KAAK;AACH,UAAK,QAAoC,gBAAgB,cAAc;AACrE,eAAO,EAAE,YAAY,MAAM,YAAY,cAAc,MAAM;AAAA,MAC7D;AACA,UAAI,QAAQ,UAAU;AACpB,eAAO;AAAA,UACL,YAAY;AAAA,UACZ,OAAO,aAAa;AAAA,YAClB;AAAA,YACA,QAAQ,OAAO,KAAK,IAAI,KAAK,QAAQ;AAAA,UACvC;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,aAAO,EAAE,YAAY,MAAM,YAAY,YAAY,MAAM;AAAA,IAC3D,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,UAAI,QAAQ,UAAU;AACpB,eAAO;AAAA,UACL,YAAY;AAAA,UACZ,OAAO,aAAa;AAAA,YAClB;AAAA,YACA,QAAQ,OAAO,KAAK,IAAI,KAAK,QAAQ;AAAA,UACvC;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,aAAO,EAAE,YAAY,MAAM,YAAY,qBAAqB,MAAM;AAAA,IACpE;AACE,aAAO,EAAE,YAAY,OAAO,MAAM;AAAA,EACtC;AACF;AAEA,SAAS,uBACP,SACqC;AACrC,QAAM,MAAM;AACZ,QAAM,WAAW,IAAI;AACrB,MAAI,CAAC,SAAU,QAAO;AAEtB,QAAM,aAAa,IAAI;AAGvB,MAAI;AACJ,MAAI,YAAY;AACd,UAAM,iBAAiB,OAAO,OAAO,UAAU,EAAE;AAAA,MAC/C,CAAC,MAAM,EAAE;AAAA,IACX;AACA,QAAI,eAAe,SAAS,GAAG;AAC7B,0BAAoB,KAAK,IAAI,GAAG,cAAc;AAAA,IAChD;AAAA,EACF;AAEA,SAAO;AAAA,IACL,aAAa,SAAS,gBAAgB;AAAA,IACtC,cAAc,SAAS,iBAAiB;AAAA,IACxC,kBAAkB,SAAS,2BAA2B;AAAA,IACtD,mBAAmB,SAAS,+BAA+B;AAAA,IAC3D,SACE,OAAO,IAAI,mBAAmB,WAAW,IAAI,iBAAiB;AAAA,IAChE;AAAA,EACF;AACF;AAEA,eAAsB,kBACpB,SACA,SACe;AACf,QAAM,EAAE,WAAW,QAAQ,cAAc,kBAAkB,OAAO,IAAI;AACtE,QAAM,mBAAmB,QAAQ,sBAAsB;AAEvD,aAAW,gBAAgB;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ,QAAQ;AAAA,IAChB,QAAQ;AAAA,EACV,GAAG;AACD,UAAM,OAAO,cAAc,YAAY;AACvC,YAAQ,QAAQ,oBAAoB,KAAK,YAAY;AAAA,EACvD;AACF;AAEA,SAAS,sBAAsB,SAA2C;AACxE,SACE,OAAO,YAAY,YAAY,QAAQ,SAAS,wBAAwB;AAE5E;AAEA,SAAS,sBAAsB,SAA2C;AACxE,SACE,OAAO,YAAY,YAAY,QAAQ,SAAS,wBAAwB;AAE5E;AAEA,SAAS,uBAAuB,SAA+C;AAC7E,SACE,QAAQ,SAAS,eACjB,QAAQ,QAAQ,UAAU,iBAC1B,MAAM,QAAQ,QAAQ,QAAQ,OAAO,KACrC,QAAQ,QAAQ,QAAQ,WAAW,KACnC,QAAQ,QAAQ,QAAQ,CAAC,EAAE,SAAS,UACpC,QAAQ,QAAQ,QAAQ,CAAC,EAAE,MAAM,SAAS,mBAAmB,MAAM;AAEvE;AAEA,SAAS,uBAAuB,SAA+C;AAC7E,QAAM,UAAU,QAAQ,QAAQ;AAChC,SACE,QAAQ,SAAS,WAChB,OAAO,YAAY,YACjB,MAAM,QAAQ,OAAO,KACpB,QAAQ,WAAW,KACnB,QAAQ,CAAC,EAAE,SAAS;AAE5B;AAEA,SAAS,+BACP,SACS;AACT,SACE,sBAAsB,QAAQ,QAAQ,OAAO,KAC7C,sBAAsB,QAAQ,QAAQ,OAAO,KAC7C,uBAAuB,OAAO;AAElC;AAEA,SAAS,mBACP,SACA,QACM;AACN,QAAM,UAAU,QAAQ,QAAQ;AAChC,MAAI,sBAAsB,OAAO,KAAK,OAAO,YAAY,UAAU;AACjE,WAAO,KAAK,OAAO;AAAA,EACrB;AACA,MAAI,sBAAsB,OAAO,KAAK,OAAO,YAAY,UAAU;AACjE,WAAO,MAAM,OAAO;AAAA,EACtB;AACF;AAEA,SAAS,qBACP,SACyB;AACzB,MAAI,CAAC,MAAM,QAAQ,OAAO,GAAG;AAC3B,WAAO;AAAA,EACT;AACA,SAAO,QAAQ;AAAA,IACb,CAAC,UAAU,MAAM,SAAS,UAAU,MAAM,SAAS;AAAA,EACrD;AACF;AAEA,eAAsB,2BACpB,SACA,SACkD;AAClD,QAAM,EAAE,SAAS,WAAW,QAAQ,cAAc,kBAAkB,OAAO,IACzE;AAEF,MAAI,+BAA+B,OAAO,GAAG;AAC3C,uBAAmB,SAAS,MAAM;AAElC,QAAI,uBAAuB,OAAO,GAAG;AACnC,aAAO,EAAE,YAAY,MAAM,OAAO,aAAa,aAAa,EAAE;AAAA,IAChE;AACA,WAAO,CAAC;AAAA,EACV;AAGA,MAAI,uBAAuB,OAAO,GAAG;AACnC,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,UAAU,QAAQ,QAAQ;AAChC,QAAM,mBACJ,QAAQ,SAAS,cAAc,qBAAqB,OAAO,IAAI;AACjE,QAAM,mBACJ,wBAAwB,UACnB,QAAQ,sBAAsB,SAC/B;AAIN,QAAM,mBACJ,QAAQ,SAAS,UAAU,QAAQ,mBAAmB,OACjD,QAAQ,kBACT;AAEN,aAAW,gBAAgB;AAAA,IACzB;AAAA,IACA,QAAQ,QAAQ;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR;AAAA,IACA,QAAQ;AAAA,EACV,GAAG;AACD,UAAM,OAAO,cAAc,YAAY;AACvC,YAAQ,oBAAoB,KAAK,YAAY;AAAA,EAC/C;AAEA,SAAO,CAAC;AACV;;;AK51BA,YAAY,QAAQ;AACpB,YAAYC,WAAU;AAGtB,SAAS,qBAA6B;AACpC,SAAO,QAAQ,IAAI,qBAA0B,WAAQ,WAAQ,GAAG,SAAS;AAC3E;AAEO,SAAS,oBAA4B;AAC1C,SAAY,WAAK,mBAAmB,GAAG,OAAO;AAChD;AAEO,SAAS,qBAAqB,UAAuC;AAC1E,MAAI,CAAC,SAAU,QAAO;AACtB,QAAM,WAAgB,cAAQ,QAAQ;AACtC,QAAM,WAAgB,cAAQ,kBAAkB,CAAC;AACjD,SAAO,aAAa,YAAY,SAAS,WAAW,WAAgB,SAAG;AACzE;AAEO,SAAS,YAAY,MAAmC;AAC7D,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,UAAU,KAAK,KAAK;AAC1B,MAAI,QAAQ,SAAS,GAAI,QAAO;AAChC,SAAO,oBAAoB,KAAK,OAAO;AACzC;AAEO,SAAS,uBACd,eACe;AACf,QAAM,SAAmB,CAAC;AAC1B,MAAI,UAAU;AAEd,WAASC,KAAI,cAAc,SAAS,GAAGA,MAAK,GAAGA,MAAK,GAAG;AACrD,UAAM,SAAS,cAAcA,EAAC,GAAG;AACjC,QAAI,CAAC,OAAQ;AAEb,QAAI,OAAO,kBAAkB,uBAAuB;AAClD,gBAAU;AACV,YAAM,UAAU,OAAO;AAIvB,UAAI,SAAS,SAAS,UAAU,QAAQ,MAAM;AAC5C,eAAO,KAAK,QAAQ,IAAI;AAAA,MAC1B;AACA;AAAA,IACF;AAEA,QAAI,SAAS;AACX;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,SAAO,OAAO,QAAQ,EAAE,KAAK,EAAE;AACjC;;;ACtDA,SAAS,SAAS;AAGX,IAAM,gBAAgB;AAEtB,IAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,OAAO,EAAE,OAAO;AAAA,EAChB,aAAa,EAAE,OAAO,EAAE,SAAS;AACnC,CAAC;AAEM,IAAM,qBAAqB,EAAE,OAAO;AAAA,EACzC,UAAU,EAAE,OAAO;AAAA,EACnB,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,SAAS,EAAE,MAAM,oBAAoB;AAAA,EACrC,aAAa,EAAE,QAAQ,EAAE,SAAS;AAAA,EAClC,WAAW,EAAE,QAAQ,EAAE,SAAS;AAClC,CAAC;AAEM,IAAM,qBAAqB,EAAE,OAAO;AAAA,EACzC,WAAW,EAAE,MAAM,kBAAkB;AACvC,CAAC;AAcM,SAAS,8BACd,OACuB;AACvB,MAAI,MAAM,aAAa,MAAM,UAAU,SAAS,GAAG;AACjD,WAAO,MAAM;AAAA,EACf;AAEA,MAAI,MAAM,UAAU;AAClB,WAAO;AAAA,MACL;AAAA,QACE,UAAU,MAAM;AAAA,QAChB,QAAQ,MAAM;AAAA,QACd,SAAS,MAAM,WAAW,CAAC;AAAA,QAC3B,aAAa,MAAM;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;AC7CA,IAAM,eAAe,CAAC;AAEtB,IAAM,iBAA6B;AAAA,EACjC;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AACF;AAEA,IAAI,cAAc;AAChB,iBAAe;AAAA,IACb;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,EACF;AACF;AAGO,IAAM,uBAAuB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAIO,SAAS,oBAAoB,MAAyC;AAC3E,SAAQ,qBAA2C,SAAS,IAAI;AAClE;AAEO,SAAS,oBAAgC;AAC9C,SAAO,UACH,eAAe,OAAO,CAAC,MAAM,EAAE,OAAO,mBAAmB,IACzD;AACN;AAIO,IAAM,qBAAqB,CAAC,QAAQ,aAAa,aAAa;AAO9D,SAAS,kBAAkB,MAAuC;AACvE,SAAQ,mBAAyC,SAAS,IAAI;AAChE;AAEA,IAAM,aAAyB;AAAA,EAC7B;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AACF;AAEA,IAAI,cAAc;AAChB,aAAW,KAAK;AAAA,IACd,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf,CAAC;AACH;;;ACvFO,IAAM,aAA0B,oBAAI,IAAI,CAAC,QAAQ,cAAc,CAAC;AAEhE,IAAM,cAA2B,oBAAI,IAAI;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,IAAM,aAA0B,oBAAI,IAAI;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,IAAM,eAA4B,oBAAI,IAAI,CAAC,QAAQ,QAAQ,IAAI,CAAC;AAEhE,IAAM,YAAyB,oBAAI,IAAI,CAAC,aAAa,UAAU,CAAC;AAEhE,IAAM,cAA2B,oBAAI,IAAI;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,qBAAqB;AAAA,EACzB,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;AAEA,IAAM,qBAAkD;AAAA,EACtD,MAAM,IAAI,IAAI,kBAAkB;AAAA,EAChC,SAAS,IAAI,IAAI,kBAAkB;AAAA,EACnC,aAAa,oBAAI,IAAI,CAAC,GAAG,oBAAoB,GAAG,WAAW,CAAC;AAAA,EAC5D,MAAM,IAAI,IAAI,kBAAkB;AAClC;AAEO,SAAS,qBACd,UACA,MACS;AACT,MAAI,SAAS,qBAAqB;AAChC,WAAO;AAAA,EACT;AACA,MAAI,mBAAmB,IAAI,GAAG,IAAI,QAAQ,MAAM,MAAM;AACpD,WAAO;AAAA,EACT;AACA,MAAI,kBAAkB,QAAQ,GAAG;AAC/B,WAAO;AAAA,EACT;AACA,SAAO;AACT;;;ACpDA,SAAS,kBAAkB,kBAA8C;AACvE,SAAO;AAAA,IACL,EAAE,MAAM,cAAc,MAAM,OAAO,UAAU,QAAQ;AAAA,IACrD,EAAE,MAAM,gBAAgB,MAAM,kBAAkB,UAAU,eAAe;AAAA,IACzE;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,OAAO,EAAE,aAAa,KAAK;AAAA,IAC7B;AAAA,EACF;AACF;AAEO,SAAS,uBACd,UACA,WACA,KACA,aACoB;AACpB,MAAI,WAAW,IAAI,QAAQ,GAAG;AAC5B,UAAM,iBAAiB,aACnB,QAAQ,CAAC,MAAO,WAAW,IAAI,EAAE,QAAQ,CAAC,CAAE,EAC7C,KAAK,CAAC,MAAM,EAAE,aAAa,UAAU,EAAE,WAAW,GAAG;AACxD,UAAM,cAAc,gBAAgB,QAAQ,SAAS,EAAE;AAEvD,UAAM,UAAU,WAAW;AAC3B,UAAM,UAAU,SAAS,MAAM,KAAK,EAAE,CAAC,KAAK;AAC5C,UAAM,WAAW,MAAM,OAAO,GAAG,KAAK;AACtC,UAAM,QAAQ,eAAe,KAAK,OAAO;AAEzC,WAAO;AAAA,MACL,gCAAgC,KAAK,GAAG,QAAQ;AAAA,IAClD;AAAA,EACF;AAEA,MAAI,aAAa,cAAc;AAC7B,WAAO,kBAAkB,yCAAyC;AAAA,EACpE;AAEA,MAAI,aAAa,aAAa;AAC5B,WAAO,kBAAkB,8BAA8B;AAAA,EACzD;AAEA,MAAI,YAAY,IAAI,QAAQ,GAAG;AAC7B,WAAO,kBAAkB,0CAA0C;AAAA,EACrE;AAEA,MAAI,WAAW,IAAI,QAAQ,GAAG;AAC5B,WAAO,kBAAkB,0CAA0C;AAAA,EACrE;AAEA,MAAI,aAAa,IAAI,QAAQ,GAAG;AAC9B,WAAO,kBAAkB,6CAA6C;AAAA,EACxE;AAEA,MAAI,aAAa,YAAY;AAC3B,UAAM,MAAM,WAAW;AACvB,QAAI,SAAS;AACb,QAAI;AACF,eAAS,MAAM,IAAI,IAAI,GAAG,EAAE,WAAW;AAAA,IACzC,QAAQ;AAAA,IAAC;AACT,WAAO;AAAA,MACL,SACI,+BAA+B,MAAM,KACrC;AAAA,IACN;AAAA,EACF;AAEA,MAAI,aAAa,aAAa;AAC5B,WAAO,kBAAkB,6BAA6B;AAAA,EACxD;AAEA,MAAI,aAAa,QAAQ;AACvB,WAAO,kBAAkB,0BAA0B;AAAA,EACrD;AAEA,MAAI,aAAa,aAAa;AAC5B,WAAO,kBAAkB,6BAA6B;AAAA,EACxD;AAEA,SAAO,kBAAkB,mBAAmB;AAC9C;AAEA,IAAMC,gBAAe,CAAC,WAAW,CAAC,CAAC,QAAQ,IAAI;AAExC,SAAS,qCAAyD;AACvE,QAAM,UAA8B,CAAC;AAErC,MAAIA,eAAc;AAChB,YAAQ,KAAK;AAAA,MACX,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAEA,UAAQ;AAAA,IACN;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,OAAO,EAAE,aAAa,KAAK;AAAA,IAC7B;AAAA,EACF;AAEA,SAAO;AACT;;;AC9EA,eAAe,eACb,SACA,SACe;AACf,UAAQ,OAAO,KAAK,6BAA6B,QAAQ,QAAQ,IAAI;AAAA,IACnE;AAAA,EACF,CAAC;AACD,QAAM,QAAQ,OAAO,cAAc;AAAA,IACjC,WAAW,QAAQ;AAAA,IACnB,QAAQ;AAAA,MACN,eAAe;AAAA,MACf,YAAY,QAAQ;AAAA,MACpB,QAAQ;AAAA,MACR,SAAS,CAAC,EAAE,MAAM,WAAW,SAAS,KAAK,OAAO,EAAE,CAAC;AAAA,IACvD;AAAA,EACF,CAAC;AACH;AAEA,SAAS,gBACP,SACA,kBACoB;AACpB,SACE,QAAQ,oBACP,QAAQ,mBACL,iBAAiB,QAAQ,gBAAgB,IACzC;AAER;AAEA,SAAS,kBACP,WACA,cACyB;AACzB,QAAM,UAAU,OAAQ,WAAkC,SAAS;AACnE,MAAI,WAAW,CAAC,cAAc;AAC5B,WAAO;AAAA,EACT;AACA,SAAO,EAAE,GAAG,WAAW,MAAM,aAAa;AAC5C;AAEA,SAAS,gBAAgB,OAAoD;AAC3E,QAAM,OAAQ,OAA8B;AAC5C,SAAO,OAAO,SAAS,WAAW,OAAO;AAC3C;AAEA,eAAe,0BACb,SACA,SAC+B;AAC/B,QAAM,eAAe,SAAS,OAAO;AACrC,SAAO,EAAE,UAAU,QAAQ,SAAS,WAAW,MAAM;AACvD;AAEA,eAAe,oBACb,UACA,SAC0E;AAC1E,MAAI,CAAC,UAAU;AACb,UAAM,UAAU,iFAAiF,kBAAkB,CAAC;AACpH,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO,MAAM,0BAA0B,SAAS,OAAO;AAAA,IACzD;AAAA,EACF;AAEA,MAAI,CAAC,YAAY,QAAQ,GAAG;AAC1B,UAAM,UACJ;AACF,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO,MAAM,0BAA0B,SAAS,OAAO;AAAA,IACzD;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,KAAK;AACvB;AAEA,eAAe,oBACb,SACA,cACoC;AACpC,QAAM,EAAE,QAAQ,WAAW,UAAU,IAAI;AAEzC,QAAM,WAAW,oBAAoB;AAAA,IACnC,MAAM,QAAQ;AAAA,IACd,OAAO;AAAA,EACT,CAAC;AAED,SAAO,MAAM,OAAO,kBAAkB;AAAA,IACpC,SAAS,mCAAmC;AAAA,IAC5C;AAAA,IACA,UAAU;AAAA,MACR,YAAY;AAAA,MACZ,OAAO,SAAS;AAAA,MAChB,MAAM,SAAS;AAAA,MACf,SAAS,SAAS;AAAA,MAClB,WAAW,SAAS;AAAA,MACpB,UAAU,EAAE,GAAG,cAAc,UAAU,QAAQ,SAAS;AAAA,IAC1D;AAAA,EACF,CAAC;AACH;AAEA,eAAe,kBACb,UACA,SACA,cAC+B;AAC/B,QAAM,EAAE,QAAQ,IAAI;AAEpB,MACE,SAAS,SAAS,YAAY,eAC7B,SAAS,QAAQ,aAAa,UAC7B,SAAS,QAAQ,aAAa,aAC9B,SAAS,QAAQ,aAAa,iBAC9B,SAAS,QAAQ,aAAa,sBAChC;AACA,YAAQ,iBAAiB,SAAS,QAC/B;AACH,UAAM,QAAQ,MAAM,kBAAkB,SAAS,QAAQ,QAAQ;AAC/D,UAAM,QAAQ,OAAO,cAAc;AAAA,MACjC,WAAW,QAAQ;AAAA,MACnB,QAAQ;AAAA,QACN,eAAe;AAAA,QACf,eAAe,SAAS,QAAQ;AAAA,MAClC;AAAA,IACF,CAAC;AACD,UAAM,QAAQ,mBAAmB,QAAQ,SAAS,QAAQ,QAAQ;AAElE,WAAO;AAAA,MACL,UAAU;AAAA,MACV;AAAA,MACA,oBAAoB,QAAQ,eAAe;AAAA,QACzC;AAAA,UACE,MAAM;AAAA,UACN,MAAM,SAAS,QAAQ;AAAA,UACvB,aAAa;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAe,SAAS,OAC1B;AACJ,QAAM,WAAW,aAAa,KAAK;AAEnC,QAAM,UAAU,WACZ,yCAAyC,QAAQ,KACjD;AACJ,QAAM,eAAe,SAAS,OAAO;AACrC,SAAO,EAAE,UAAU,QAAQ,SAAS,WAAW,CAAC,SAAS;AAC3D;AAEA,eAAe,wBACb,SAC+B;AAC/B,QAAM,EAAE,SAAS,UAAU,IAAI;AAE/B,UAAQ,iBAAiB;AACzB,QAAM,QAAQ,MAAM,kBAAkB,MAAM;AAC5C,QAAM,QAAQ,mBAAmB,QAAQ,MAAM;AAE/C,SAAO;AAAA,IACL,UAAU;AAAA,IACV,cAAc;AAAA,EAChB;AACF;AAEA,eAAe,uBACb,SAC+B;AAC/B,QAAM,EAAE,SAAS,WAAW,iBAAiB,IAAI;AAEjD,QAAM,eAAe,gBAAgB,SAAS,gBAAgB;AAC9D,QAAM,aAAa,uBAAuB,QAAQ,mBAAmB;AACrE,QAAM,eAAe,iBAAiB,cAAc;AACpD,QAAM,eAAe,kBAAkB,WAAW,YAAY;AAC9D,QAAM,WAAW,gBAAgB,YAAY;AAE7C,QAAM,mBAAmB,MAAM,oBAAoB,UAAU,OAAO;AACpE,MAAI,CAAC,iBAAiB,OAAO;AAC3B,WAAO,iBAAiB;AAAA,EAC1B;AAEA,QAAM,WAAW,MAAM,oBAAoB,SAAS,YAAY;AAChE,MAAI,QAAQ,QAAQ,WAAW,SAAS,SAAS,YAAY,aAAa;AACxE,UAAM,IAAI,MAAM,kBAAkB;AAAA,EACpC;AACA,SAAO,MAAM,kBAAkB,UAAU,SAAS,YAAY;AAChE;AAEA,SAAS,qBAAqB,UAAwB;AACpD,UAAQ,SAAS,WAAW,CAAC,GAAG,IAAI,CAAC,KAAK,SAAS;AAAA,IACjD,MAAM;AAAA,IACN,MAAM,IAAI;AAAA,IACV,UAAU,GAAG,aAAa,GAAG,GAAG;AAAA,IAChC,OAAO,IAAI,cAAc,EAAE,aAAa,IAAI,YAAY,IAAI;AAAA,EAC9D,EAAE;AACJ;AAEA,eAAe,0BACb,SAC+B;AAC/B,QAAM,QAAQ,QAAQ;AACtB,UAAQ,OAAO,KAAK,oCAAoC,EAAE,MAAM,CAAC;AACjE,QAAM,YAAY,8BAA8B,KAAK;AACrD,UAAQ,OAAO,KAAK,0CAA0C,EAAE,UAAU,CAAC;AAE3E,MAAI,CAAC,aAAa,UAAU,WAAW,GAAG;AACxC,YAAQ,OAAO,KAAK,+CAA+C;AACnE,WAAO;AAAA,MACL,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,EAAE,QAAQ,WAAW,WAAW,UAAU,IAAI;AACpD,QAAM,gBAAgB,UAAU,CAAC;AACjC,QAAM,UAAU,qBAAqB,aAAa;AAElD,QAAM,WAAW,oBAAoB;AAAA,IACnC,MAAM,QAAQ;AAAA,IACd,OAAO;AAAA,EACT,CAAC;AAED,QAAM,WAAW,MAAM,OAAO,kBAAkB;AAAA,IAC9C;AAAA,IACA;AAAA,IACA,UAAU;AAAA,MACR,YAAY;AAAA,MACZ,OAAO,cAAc;AAAA,MACrB,MAAM;AAAA,MACN,SAAS,SAAS;AAAA,MAClB,OAAO;AAAA,QACL,cAAc;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,MAAI,QAAQ,QAAQ,WAAW,SAAS,SAAS,YAAY,aAAa;AACxE,UAAM,IAAI,MAAM,kBAAkB;AAAA,EACpC;AAEA,MAAI,SAAS,SAAS,YAAY,YAAY;AAC5C,UAAM,gBACJ,SAAS,OACR;AACH,WAAO;AAAA,MACL,UAAU;AAAA,MACV,SACE,OAAO,kBAAkB,WACrB,gBACA;AAAA,IACR;AAAA,EACF;AAEA,QAAM,UAAU,SAAS,OAAO;AAChC,MAAI,CAAC,WAAW,OAAO,KAAK,OAAO,EAAE,WAAW,GAAG;AACjD,WAAO;AAAA,MACL,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,EACF;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,IACV,cAAc;AAAA,MACZ,GAAI,QAAQ;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,4BACb,SAC+B;AAC/B,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,WAAW;AAAA,IACf,EAAE,MAAM,UAAU,OAAO,UAAU;AAAA,IACnC,EAAE,mBAAmB,QAAQ,kBAAkB,KAAK,SAAS,IAAI;AAAA,EACnE;AAEA,QAAM,UAAU;AAAA,IACd;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT;AAAA,EACF;AAEA,QAAM,WAAW,MAAM,OAAO,kBAAkB;AAAA,IAC9C;AAAA,IACA;AAAA,IACA,UAAU;AAAA,MACR,YAAY;AAAA,MACZ,OAAO,SAAS;AAAA,MAChB,MAAM,SAAS;AAAA,MACf,SAAS,SAAS;AAAA,MAClB,WAAW,SAAS;AAAA,MACpB,UAAU,EAAE,GAAI,WAAuC,SAAS;AAAA,IAClE;AAAA,EACF,CAAC;AAED,MAAI,QAAQ,QAAQ,WAAW,SAAS,SAAS,YAAY,aAAa;AACxE,UAAM,IAAI,MAAM,kBAAkB;AAAA,EACpC;AAEA,MACE,SAAS,SAAS,YAAY,eAC7B,SAAS,QAAQ,aAAa,WAC7B,SAAS,QAAQ,aAAa,iBAChC;AACA,QAAI,SAAS,QAAQ,aAAa,gBAAgB;AAChD,aAAO;AAAA,QACL,UAAU;AAAA,QACV,cAAc;AAAA,QACd,oBAAoB,eAAe;AAAA,UACjC;AAAA,YACE,MAAM;AAAA,YACN,OAAO,CAAC,EAAE,SAAS,CAAC;AAAA,YACpB,UAAU;AAAA,YACV,aAAa;AAAA,UACf;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,MACL,UAAU;AAAA,MACV,cAAc;AAAA,IAChB;AAAA,EACF,OAAO;AACL,UAAM,WACJ,SAAS,OAAO,aACf,KAAK;AACR,UAAM,UAAU,WACZ,sDAAsD,QAAQ,KAC9D;AACJ,UAAM,eAAe,SAAS,OAAO;AACrC,WAAO,EAAE,UAAU,QAAQ,SAAS,WAAW,CAAC,SAAS;AAAA,EAC3D;AACF;AAEA,SAAS,wBACP,SAC6B;AAC7B,QAAM,EAAE,SAAS,UAAU,UAAU,IAAI;AAEzC,MAAI,QAAQ,mBAAmB,UAAU,CAAC,YAAY,IAAI,QAAQ,GAAG;AACnE,WAAO;AAAA,EACT;AAEA,QAAM,WAAY,WAAsC;AACxD,MAAI,CAAC,qBAAqB,QAAQ,GAAG;AACnC,WAAO;AAAA,EACT;AAEA,UAAQ,mBAAmB;AAC3B,QAAM,UAAW,WAAoC;AACrD,MAAI,OAAO,YAAY,UAAU;AAC/B,YAAQ,kBAAkB;AAAA,EAC5B;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,IACV,cAAc;AAAA,EAChB;AACF;AAEA,SAAS,qBAAqB,KAA4B;AACxD,MAAI;AACF,WAAO,IAAI,IAAI,GAAG,EAAE;AAAA,EACtB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,gBAAgB,UAAkB,gBAAmC;AAC5E,SAAO,eAAe,KAAK,CAAC,YAAY;AACtC,QAAI,QAAQ,WAAW,IAAI,GAAG;AAC5B,YAAM,SAAS,QAAQ,MAAM,CAAC;AAC9B,aAAO,aAAa,QAAQ,MAAM,CAAC,KAAK,SAAS,SAAS,MAAM;AAAA,IAClE;AACA,WAAO,aAAa;AAAA,EACtB,CAAC;AACH;AAEA,eAAsB,WACpB,SAC+B;AAC/B,QAAM,EAAE,UAAU,WAAW,SAAS,eAAe,IAAI;AAGzD,MAAI,kBAAkB,eAAe,SAAS,GAAG;AAC/C,QAAI,aAAa,cAAc,aAAa,aAAa;AACvD,YAAM,MAAM,UAAU;AACtB,UAAI,KAAK;AACP,cAAM,WAAW,qBAAqB,GAAG;AACzC,YAAI,YAAY,CAAC,gBAAgB,UAAU,cAAc,GAAG;AAC1D,gBAAM,UAAU,WAAW,QAAQ,iCAAiC,eAAe,KAAK,IAAI,CAAC;AAC7F,gBAAM,eAAe,SAAS,OAAO;AACrC,iBAAO,EAAE,UAAU,QAAQ,SAAS,WAAW,MAAM;AAAA,QACvD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,qBAAqB,UAAU,QAAQ,cAAc,GAAG;AAC1D,WAAO;AAAA,MACL,UAAU;AAAA,MACV,cAAc;AAAA,IAChB;AAAA,EACF;AAEA,MAAI,aAAa,iBAAiB;AAChC,WAAO,wBAAwB,OAAO;AAAA,EACxC;AAEA,MAAI,aAAa,gBAAgB;AAC/B,WAAO,uBAAuB,OAAO;AAAA,EACvC;AAEA,MAAI,aAAa,mBAAmB;AAClC,WAAO,0BAA0B,OAAO;AAAA,EAC1C;AAEA,QAAM,iBAAiB,wBAAwB,OAAO;AACtD,MAAI,gBAAgB;AAClB,WAAO;AAAA,EACT;AAMA,MAAI,QAAQ,mBAAmB,QAAQ;AACrC,UAAM,UACJ,yEACgB,kBAAkB,CAAC;AACrC,UAAM,eAAe,SAAS,OAAO;AACrC,WAAO,EAAE,UAAU,QAAQ,SAAS,WAAW,MAAM;AAAA,EACvD;AAEA,SAAO,4BAA4B,OAAO;AAC5C;;;ACvfA,IAAM,uBAAuB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,0BACd,UACoB;AACpB,SAAO,SACJ,IAAI,CAAC,YAAY;AAChB,UAAM,QACJ,QAAQ,gBAAgB,OACpB;AAAA,MACE,MAAM,MAAM,QAAQ,QAAQ,YAAY,IACpC,QAAQ,aAAa,KAAK,GAAG,IAC7B,QAAQ;AAAA,IACd,IACA;AACN,QAAIC,QAAO,QAAQ;AACnB,QAAI,QAAQ,KAAK,SAAS,QAAQ,GAAG;AACnC,MAAAA,QAAO,OAAOA,MAAK,QAAQ,UAAU,EAAE,CAAC;AAAA,IAC1C;AACA,WAAO;AAAA,MACL,MAAAA;AAAA,MACA,aAAa,QAAQ,eAAe;AAAA,MACpC;AAAA,IACF;AAAA,EACF,CAAC,EACA;AAAA,IACC,CAAC,YACC,CAAC,qBAAqB,SAAS,QAAQ,IAAI;AAAA,EAC/C;AACJ;;;ACtCO,SAAS,gBACd,QACiC;AACjC,QAAM,aAA8C,CAAC;AACrD,MAAI,CAAC,MAAM,QAAQ,OAAO,UAAU,GAAG;AACrC,WAAO;AAAA,EACT;AAEA,aAAW,UAAU,OAAO,YAAY;AACtC,QAAI,UAAU,QAAQ;AACpB,iBAAW,OAAO,IAAI,IAAI;AAAA,QACxB,MAAM,OAAO;AAAA,QACb,KAAK,OAAO;AAAA,QACZ,SAAS,OAAO,UACZ,OAAO,YAAY,OAAO,QAAQ,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,IAC/D;AAAA,MACN;AAAA,IACF,OAAO;AACL,iBAAW,OAAO,IAAI,IAAI;AAAA,QACxB,MAAM;AAAA,QACN,SAAS,OAAO;AAAA,QAChB,MAAM,OAAO;AAAA,QACb,KAAK,OAAO,MACR,OAAO,YAAY,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,IAC3D;AAAA,MACN;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;ACjCO,IAAM,gBAAgB;AAE7B,IAAM,uBAA+C;AAAA,EACnD,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,oBAAoB;AACtB;AAEO,SAAS,aAAa,SAAyB;AACpD,SAAO,qBAAqB,OAAO,KAAK;AAC1C;AAEA,IAAM,yBAAyB,oBAAI,IAAI;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,SAAS,kBAAkB,SAA0B;AAC1D,SAAO,uBAAuB,IAAI,OAAO;AAC3C;AAEA,IAAM,qBAAqB,oBAAI,IAAI;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,2BAA2B,oBAAI,IAAI;AAAA,EACvC;AAAA,EACA;AACF,CAAC;AAEM,SAAS,eAAe,SAA0B;AACvD,SAAO,mBAAmB,IAAI,OAAO;AACvC;AAEO,SAAS,oBAAoB,SAA0B;AAC5D,SAAO,yBAAyB,IAAI,OAAO;AAC7C;AAEA,IAAM,8BAA8B,oBAAI,IAAI,CAAC,kBAAkB,CAAC;AAEzD,SAAS,qBAAqB,SAA0B;AAC7D,SAAO,CAAC,4BAA4B,IAAI,OAAO;AACjD;AAOO,SAAS,iBAAiB,SAAwC;AACvE,MAAI,CAAC,eAAe,OAAO,EAAG,QAAO;AAErC,QAAM,UAA0B;AAAA,IAC9B,EAAE,OAAO,OAAO,MAAM,MAAM;AAAA,IAC5B,EAAE,OAAO,UAAU,MAAM,SAAS;AAAA,IAClC,EAAE,OAAO,QAAQ,MAAM,OAAO;AAAA,EAChC;AAEA,MAAI,oBAAoB,OAAO,GAAG;AAChC,YAAQ;AAAA,MACN,EAAE,OAAO,SAAS,MAAM,aAAa;AAAA,MACrC,EAAE,OAAO,OAAO,MAAM,MAAM;AAAA,IAC9B;AAAA,EACF;AAEA,SAAO;AACT;AAKA,IAAM,6BAA6B;AAEnC,SAAS,wBAAwB,OAG/B;AACA,QAAM,QAAQ,MAAM,KAAK,EAAE,YAAY;AACvC,QAAM,cAAc,MACjB,MAAM,0BAA0B,IAAI,CAAC,GACpC,YAAY;AAEhB,QAAM,aAAa,MAAM,QAAQ,4BAA4B,MAAM;AACnE,QAAM,YAAY,WAAW,MAAM,YAAY,EAAE,OAAO,OAAO;AAC/D,QAAM,SAAS,UACZ,IAAI,CAAC,UAAU;AACd,QAAI,UAAU,WAAY,QAAO;AACjC,QAAI,UAAU,UAAU,UAAU,UAAW,QAAO;AACpD,WAAO;AAAA,EACT,CAAC,EACA,OAAO,CAAC,UAAU,SAAS,UAAU,QAAQ,EAC7C,OAAO,CAAC,UAAU,QAAQ,KAAK,KAAK,KAAK,MAAM,SAAS,GAAG,CAAC;AAE/D,SAAO,EAAE,QAAQ,YAAY;AAC/B;AAQA,SAAS,gBACP,OACA,QACA,aACQ;AACR,QAAM,WAAW,GAAG,MAAM,KAAK,IAAI,MAAM,QAAQ,EAAE,GAAG,YAAY;AAClE,MAAI,QAAQ;AACZ,aAAW,SAAS,QAAQ;AAC1B,QAAI,SAAS,SAAS,KAAK,GAAG;AAC5B,eAAS,UAAU,cAAc,IAAI;AAAA,IACvC;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,uBACd,YACA,SACe;AACf,QAAM,UAAU,WAAW,KAAK;AAChC,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,QAAQ,QAAQ,YAAY;AAGlC,QAAM,cAAc,QAAQ;AAAA,IAC1B,CAAC,MACC,EAAE,UAAU,WACZ,EAAE,MAAM,YAAY,MAAM,SACzB,EAAE,QAAQ,EAAE,KAAK,YAAY,MAAM;AAAA,EACxC;AACA,MAAI,YAAa,QAAO,YAAY;AAGpC,QAAM,gBAAgB,QAAQ,KAAK,CAAC,MAAM;AACxC,UAAM,QAAQ,EAAE,MAAM,YAAY;AAClC,UAAM,WAAW,EAAE,QAAQ,IAAI,YAAY;AAC3C,WACE,MAAM,SAAS,KAAK,KAAK,QAAQ,SAAS,KAAK,KAAK,MAAM,SAAS,KAAK;AAAA,EAE5E,CAAC;AACD,MAAI,cAAe,QAAO,cAAc;AAGxC,QAAM,EAAE,QAAQ,YAAY,IAAI,wBAAwB,OAAO;AAC/D,MAAI,OAAO,WAAW,EAAG,QAAO;AAEhC,MAAI,YAAgC;AACpC,MAAI,YAAY;AAChB,aAAW,SAAS,SAAS;AAC3B,UAAM,QAAQ,gBAAgB,OAAO,QAAQ,WAAW;AACxD,QAAI,IAAI,UAAU,CAAC,aAAa,YAAY,QAAQ;AAClD,kBAAY;AACZ,kBAAY;AAAA,IACd;AAAA,EACF;AAEA,SAAO,WAAW,SAAS;AAC7B;;;ACvKA,SAAS,aAAa;AACtB,YAAYC,SAAQ;AACpB,YAAYC,SAAQ;AACpB,YAAYC,WAAU;;;ACHtB,IAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAMtB,IAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYX,IAAM,wBAAwB,gBAAgB;;;ADwC9C,SAAS,kBACd,cACyB;AACzB,QAAM,gBAAyC;AAAA,IAC7C,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAEA,MAAI,CAAC,cAAc;AACjB,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,iBAAiB,UAAU;AACpC,WAAO,eAAe;AAAA,EACxB;AAEA,MACE,OAAO,iBAAiB,YACxB,iBAAiB,QACjB,YAAY,gBACZ,OAAO,aAAa,WAAW,UAC/B;AACA,WAAO;AAAA,MACL,GAAG;AAAA,MACH,QAAQ,aAAa,SAAS;AAAA,IAChC;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,gBACP,aACA,YACiC;AACjC,SAAO;AAAA,IACL,GAAI,eAAe,CAAC;AAAA,IACpB,GAAG;AAAA,EACL;AACF;AAEA,SAAS,mBAA2C;AAClD,SAAO;AAAA,IACL,GAAG,QAAQ;AAAA,IACX,sBAAsB;AAAA,IACtB,2CAA2C;AAAA;AAAA,IAE3C,oBAAoB;AAAA;AAAA,IAEpB,uCAAuC;AAAA,EACzC;AACF;AAEA,SAAS,WACP,WACA,cACA,iBACA,QACA,gBACA,mBACkB;AAClB,QAAM,mBAAmB,CAAC,sBAAsB,EAAE,cAAc,OAAO,CAAC,CAAC;AACzE,MAAI,kBAAkB,mBAAmB;AACvC,qBAAiB;AAAA,MACf,yBAAyB,gBAAgB,iBAAiB;AAAA,IAC5D;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,aAAa;AAAA,MACX,GAAI,WAAW,eAAe,CAAC;AAAA,MAC/B,EAAE,OAAO,iBAAiB;AAAA,IAC5B;AAAA,IACA,YAAY;AAAA,MACV,GAAI,WAAW,cAAc,CAAC;AAAA,MAC9B;AAAA,QACE,OAAO;AAAA,UACL,qBAAqB,iBAAiB,MAAM;AAAA,UAC5C,0BAA0B,MAAM;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,mBACP,wBACiB;AACjB,QAAM,aAAa,0BAA0B,IAAI,gBAAgB;AACjE,MAAI,WAAW,OAAO,SAAS;AAC7B,UAAM,IAAI,MAAM,WAAW;AAAA,EAC7B;AACA,SAAO;AACT;AAEA,SAAS,kBACP,WACA,kBACA,iBACA,QAC2C;AAC3C,SAAO,CAAC,cAA4C;AAClD,UAAM,QAAQ,MAAM,UAAU,SAAS,UAAU,MAAM;AAAA,MACrD,KAAK,UAAU;AAAA,MACf,KAAK,UAAU;AAAA,MACf,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,IAChC,CAAC;AAED,QAAI,MAAM,KAAK;AACb,uBAAiB;AAAA,QACf,KAAK,MAAM;AAAA,QACX,SAAS,GAAG,UAAU,OAAO,IAAI,UAAU,KAAK,KAAK,GAAG,CAAC;AAAA,QACzD;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,QAAQ,GAAG,QAAQ,CAAC,SAAiB;AACzC,YAAM,MAAM,KAAK,SAAS,EAAE,KAAK;AACjC,UAAI,OAAO,QAAQ;AACjB,eAAO,MAAM,gBAAgB,MAAM,GAAG,aAAa,GAAG,EAAE;AAAA,MAC1D;AAAA,IACF,CAAC;AAED,QAAI,iBAAiB;AACnB,YAAM,GAAG,QAAQ,MAAM;AACrB,YAAI,MAAM,KAAK;AACb,0BAAgB,MAAM,GAAG;AAAA,QAC3B;AAAA,MACF,CAAC;AAAA,IACH;AAGA,QAAI,UAAU,QAAQ;AACpB,gBAAU,OAAO,iBAAiB,SAAS,MAAM;AAC/C,cAAM,KAAK,SAAS;AAAA,MACtB,CAAC;AAAA,IACH;AAEA,QAAI,CAAC,MAAM,SAAS,CAAC,MAAM,QAAQ;AACjC,YAAM,IAAI;AAAA,QACR,wDAAwD,MAAM,GAAG;AAAA,MACnE;AAAA,IACF;AAEA,WAAO;AAAA,MACL,OAAO,MAAM;AAAA,MACb,QAAQ,MAAM;AAAA,MACd,IAAI,SAAS;AACX,eAAO,MAAM;AAAA,MACf;AAAA,MACA,IAAI,WAAW;AACb,eAAO,MAAM;AAAA,MACf;AAAA,MACA,KAAK,QAAwB;AAC3B,eAAO,MAAM,KAAK,MAAM;AAAA,MAC1B;AAAA;AAAA,MAEA,GAAG,OAAyB,UAAoC;AAC9D,cAAM,GAAG,OAAO,QAAQ;AAAA,MAC1B;AAAA;AAAA,MAEA,KAAK,OAAyB,UAAoC;AAChE,cAAM,KAAK,OAAO,QAAQ;AAAA,MAC5B;AAAA;AAAA,MAEA,IAAI,OAAyB,UAAoC;AAC/D,cAAM,IAAI,OAAO,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,KAAmB;AAC9C,QAAM,YAAiB,WAAK,KAAK,SAAS;AAC1C,QAAM,oBAAyB,WAAK,WAAW,qBAAqB;AACpE,MAAI;AACF,QAAI,CAAI,eAAW,iBAAiB,GAAG;AACrC,MAAG,cAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAC3C,MAAG,kBAAc,mBAAmB,QAAQ,EAAE,MAAM,KAAK,CAAC;AAAA,IAC5D;AAAA,EACF,QAAQ;AAAA,EAER;AACF;AAEO,SAAS,oBAAoB,QAAqC;AACvE,sBAAoB,OAAO,GAAG;AAM9B,QAAM,QACJ,OAAO,qBAAqB,UAC3B,OAAO,sBACJ,CAAC,IACD,EAAE,MAAM,UAAU,QAAQ,cAAc;AAE9C,QAAM,UAAmB;AAAA,IACvB,GAAG,OAAO;AAAA,IACV,OAAO,CAAC,uBAAuB;AAAA,IAC/B,cAAc,OAAO,gBAAgB,kBAAkB;AAAA,IACvD,gBAAgB,CAAC,QAAQ,WAAW,OAAO;AAAA,IAC3C,QAAQ,CAACC,SAAQ,OAAO,OAAO,MAAMA,IAAG;AAAA,IACxC,KAAK,OAAO;AAAA,IACZ,wBAAwB;AAAA,IACxB,iCAAiC,CAAC;AAAA,IAClC,gBAAgB,OAAO;AAAA,IACvB,YAAY,OAAO;AAAA,IACnB,YAAY;AAAA,IACZ;AAAA,IACA,WAAW;AAAA,MACT,GAAG,OAAO,qBAAqB;AAAA,MAC/B,wBAAwB;AAAA,IAC1B;AAAA,IACA,YAAY;AAAA,MACV,OAAO,qBAAqB;AAAA,MAC5B,OAAO;AAAA,IACT;AAAA,IACA,KAAK,iBAAiB;AAAA,IACtB,OAAO;AAAA,MACL,OAAO,qBAAqB;AAAA,MAC5B,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,IACA,cAAc,OAAO;AAAA,IACrB,iBAAiB;AAAA,MACf,OAAO,qBAAqB;AAAA,IAC9B;AAAA,IACA,GAAI,OAAO,oBAAoB;AAAA,MAC7B,wBAAwB;AAAA,QACtB,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ,IAAI,wBAAwB;AACtC,YAAQ,6BAA6B,QAAQ,IAAI;AAAA,EACnD;AAEA,MAAI,OAAO,UAAU;AACnB,YAAQ,SAAS,OAAO;AACxB,YAAQ,cAAc,OAAO,eAAe;AAAA,EAC9C,OAAO;AACL,YAAQ,YAAY,OAAO;AAC3B,YAAQ,QAAQ;AAAA,EAClB;AAEA,MAAI,OAAO,uBAAuB;AAChC,YAAQ,wBAAwB,OAAO;AAAA,EACzC;AAEA,MAAI,OAAO,QAAQ;AACjB,YAAQ,SAAS,OAAO;AAAA,EAC1B;AAEA,oBAAkB;AAClB,SAAO;AACT;AAEA,SAAS,oBAA0B;AACjC,QAAM,cAAmB;AAAA,IACvB,QAAQ,IAAI,qBAA0B,WAAQ,YAAQ,GAAG,SAAS;AAAA,IAClE;AAAA,EACF;AACA,EAAG,OAAG,aAAa,EAAE,WAAW,MAAM,OAAO,KAAK,GAAG,MAAM;AAAA,EAE3D,CAAC;AACH;;;AE9UA,YAAYC,SAAQ;AACpB,YAAYC,SAAQ;AACpB,YAAYC,WAAU;AACtB,SAAS,iBAAiB;AAE1B,IAAM,uBAAuB;AAE7B,IAAM,eAAe;AAAA,EACnB,MAAM,GAAG,oBAAoB;AAAA,EAC7B,MAAM,GAAG,oBAAoB;AAAA,EAC7B,OAAO,GAAG,oBAAoB;AAAA,EAC9B,MAAM,GAAG,oBAAoB;AAC/B;AAEA,IAAM,kBAAkB,CAAC,MAAM,MAAM,KAAK,KAAK,MAAM,KAAK,IAAI;AAE9D,SAAS,sBAAsB,KAAsB;AACnD,SAAO,gBAAgB,KAAK,CAAC,OAAO,IAAI,SAAS,EAAE,CAAC;AACtD;AAEA,IAAM,qBAAqB,CAAC,aAAa,MAAM,aAAa,KAAK;AAEjE,IAAM,qBAAqB,CAAC,aAAa,IAAI;AAE7C,IAAM,qBAGF;AAAA,EACF,CAAC,aAAa,IAAI,GAAG,CAAC,UAAU,OAAO;AAAA,EACvC,CAAC,aAAa,IAAI,GAAG,CAAC,UAAU,OAAO;AAAA,EACvC,CAAC,aAAa,KAAK,GAAG,CAAC,UAAU,OAAO;AAAA,EACxC,CAAC,aAAa,IAAI,GAAG,CAAC,UAAU,OAAO;AACzC;AAQA,SAAS,UAAU,MAA0B;AAC3C,QAAM,QAAQ,KAAK,MAAM,sBAAsB;AAC/C,MAAI,CAAC,OAAO;AACV,WAAO,EAAE,UAAU,KAAK;AAAA,EAC1B;AACA,QAAM,WAAW,MAAM,CAAC,KAAK;AAC7B,QAAM,WAAW,MAAM,CAAC;AACxB,MAAI,UAAU,SAAS,IAAI,GAAG;AAC5B,WAAO;AAAA,MACL;AAAA,MACA,UAAU,SAAS,MAAM,GAAG,EAAE;AAAA,MAC9B,YAAY;AAAA,IACd;AAAA,EACF;AACA,SAAO,EAAE,UAAU,SAAS;AAC9B;AAEA,SAAS,cAAc,UAAkB,KAAqB;AAC5D,MAAI,WAAW;AACf,MAAI,SAAS,WAAW,IAAI,GAAG;AAC7B,eAAgB,WAAQ,YAAQ,GAAG,SAAS,MAAM,CAAC,CAAC;AAAA,EACtD,WAAW,SAAS,WAAW,IAAI,GAAG;AACpC,eAAgB,WAAK,KAAK,SAAS,MAAM,CAAC,CAAC;AAAA,EAC7C,WAAW,CAAM,iBAAW,QAAQ,GAAG;AACrC,eAAgB,WAAK,KAAK,QAAQ;AAAA,EACpC;AACA,SAAY,gBAAU,QAAQ,EAAE,QAAQ,OAAO,GAAG;AACpD;AAEA,SAAS,YAAY,SAAiB,UAAkB,KAAsB;AAC5E,QAAM,oBAAoB,cAAc,SAAS,GAAG;AACpD,QAAM,iBAAiB,cAAc,UAAU,GAAG;AAClD,SAAO,UAAU,gBAAgB,mBAAmB;AAAA,IAClD,KAAK;AAAA,IACL,WAAW;AAAA,IACX,QAAQ,QAAQ,aAAa;AAAA,EAC/B,CAAC;AACH;AAEA,SAAS,YACP,MACA,UACA,WACA,KACS;AACT,QAAM,oBACH,KAAK,aAAa,UAAU,aAAa,aAAa,QACtD,KAAK,aAAa,UAAU,mBAAmB,SAAS,QAAQ,KAChE,KAAK,aAAa,UAAU,mBAAmB,SAAS,QAAQ;AAEnE,MAAI,CAAC,mBAAmB;AACtB,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,KAAK,UAAU;AAClB,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,mBAAmB,QAAQ;AAC/C,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,YAAY,SAAoC;AAClE,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,MAAI,aAAa,aAAa,MAAM;AAClC,QAAI,KAAK,YAAY;AACnB,UAAI,CAAC,UAAU,WAAW,KAAK,QAAQ,GAAG;AACxC,eAAO;AAAA,MACT;AACA,YAAM,YAAY,UAAU,MAAM,KAAK,SAAS,MAAM;AACtD,UAAI,sBAAsB,SAAS,GAAG;AACpC,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AACA,WAAO,cAAc,KAAK;AAAA,EAC5B;AAEA,SAAO,YAAY,KAAK,UAAU,WAAW,GAAG;AAClD;AAEA,eAAe,iBACb,UAC6B;AAC7B,MAAI,CAAC,UAAU;AACb,WAAO,CAAC;AAAA,EACV;AACA,MAAI;AACF,UAAM,UAAU,MAAS,aAAS,SAAS,UAAU,OAAO;AAC5D,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,SAAS,OAAO;AACd,QAAI,iBAAiB,SAAS,UAAU,SAAS,MAAM,SAAS,UAAU;AACxE,aAAO,CAAC;AAAA,IACV;AACA,YAAQ,OAAO;AAAA,MACb,kDAAkD,QAAQ,KAAK,KAAK;AAAA;AAAA,IACtE;AACA,WAAO,CAAC;AAAA,EACV;AACF;AAwBO,SAAS,yBAAiC;AAC/C,UAAQ,QAAQ,UAAU;AAAA,IACxB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AACO,IAAM,kBAAN,MAAsB;AAAA,EACnB;AAAA,EACA,eAAmC,CAAC;AAAA,EACpC,kBAAsC,CAAC;AAAA,EACvC,gBAAoC,CAAC;AAAA,EACrC,qBAAyC,CAAC;AAAA,EAC1C,iBAAqC,CAAC;AAAA,EACtC,cAAc;AAAA,EACd,cAAoC;AAAA,EAE5C,YAAY,KAAa;AACvB,SAAK,MAAM;AAAA,EACb;AAAA,EAEA,MAAM,aAA4B;AAChC,QAAI,KAAK,YAAa;AACtB,QAAI,KAAK,YAAa,QAAO,KAAK;AAClC,SAAK,cAAc,KAAK,gBAAgB,EAAE,KAAK,MAAM;AACnD,WAAK,cAAc;AACnB,WAAK,cAAc;AAAA,IACrB,CAAC;AACD,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,sBAA8B;AACpC,UAAM,YACJ,QAAQ,IAAI,qBAA0B,WAAQ,YAAQ,GAAG,SAAS;AACpE,WAAY,WAAK,WAAW,eAAe;AAAA,EAC7C;AAAA,EAEQ,yBAAiC;AACvC,WAAY,WAAK,KAAK,KAAK,WAAW,eAAe;AAAA,EACvD;AAAA,EAEQ,uBAA+B;AACrC,WAAY,WAAK,KAAK,KAAK,WAAW,qBAAqB;AAAA,EAC7D;AAAA,EAEA,MAAc,kBAAiC;AAC7C,UAAM,CAAC,cAAc,iBAAiB,eAAe,kBAAkB,IACrE,MAAM,QAAQ,IAAI;AAAA,MAChB,iBAAiB,KAAK,oBAAoB,CAAC;AAAA,MAC3C,iBAAiB,KAAK,uBAAuB,CAAC;AAAA,MAC9C,iBAAiB,KAAK,qBAAqB,CAAC;AAAA,MAC5C,iBAAiB,uBAAuB,CAAC;AAAA,IAC3C,CAAC;AACH,SAAK,eAAe;AACpB,SAAK,kBAAkB;AACvB,SAAK,gBAAgB;AACrB,SAAK,qBAAqB;AAC1B,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEQ,mBAAyB;AAC/B,UAAM,cAAc;AAAA,MAClB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAEA,UAAM,cAAkC;AAAA,MACtC,OAAO,CAAC;AAAA,MACR,MAAM,CAAC;AAAA,MACP,KAAK,CAAC;AAAA,IACR;AACA,UAAM,SAA6B,EAAE,YAAY;AAEjD,eAAW,YAAY,aAAa;AAClC,UAAI,SAAS,aAAa;AACxB,YAAI,SAAS,YAAY,OAAO;AAC9B,sBAAY,OAAO,KAAK,GAAG,SAAS,YAAY,KAAK;AAAA,QACvD;AACA,YAAI,SAAS,YAAY,MAAM;AAC7B,sBAAY,MAAM,KAAK,GAAG,SAAS,YAAY,IAAI;AAAA,QACrD;AACA,YAAI,SAAS,YAAY,KAAK;AAC5B,sBAAY,KAAK,KAAK,GAAG,SAAS,YAAY,GAAG;AAAA,QACnD;AACA,YAAI,SAAS,YAAY,uBAAuB;AAC9C,sBAAY,wBAAwB;AAAA,YAClC,GAAI,YAAY,yBAAyB,CAAC;AAAA,YAC1C,GAAG,SAAS,YAAY;AAAA,UAC1B;AAAA,QACF;AACA,YAAI,SAAS,YAAY,aAAa;AACpC,sBAAY,cAAc,SAAS,YAAY;AAAA,QACjD;AAAA,MACF;AACA,UAAI,SAAS,KAAK;AAChB,eAAO,MAAM,EAAE,GAAG,OAAO,KAAK,GAAG,SAAS,IAAI;AAAA,MAChD;AACA,UAAI,SAAS,OAAO;AAClB,eAAO,QAAQ,SAAS;AAAA,MAC1B;AAAA,IACF;AAEA,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEA,gBAAgB,UAAkB,WAA2C;AAC3E,QAAI,CAAC,SAAS,WAAW,oBAAoB,GAAG;AAC9C,aAAO,EAAE,UAAU,MAAM;AAAA,IAC3B;AAEA,UAAM,cAAc,KAAK,eAAe;AACxC,QAAI,CAAC,aAAa;AAChB,aAAO,EAAE,UAAU,MAAM;AAAA,IAC3B;AAEA,eAAW,QAAQ,YAAY,QAAQ,CAAC,GAAG;AACzC,YAAM,SAAS,UAAU,IAAI;AAC7B,UAAI,YAAY,QAAQ,UAAU,WAAW,KAAK,GAAG,GAAG;AACtD,eAAO,EAAE,UAAU,QAAQ,MAAM,QAAQ,OAAO;AAAA,MAClD;AAAA,IACF;AAEA,eAAW,QAAQ,YAAY,SAAS,CAAC,GAAG;AAC1C,YAAM,SAAS,UAAU,IAAI;AAC7B,UAAI,YAAY,QAAQ,UAAU,WAAW,KAAK,GAAG,GAAG;AACtD,eAAO,EAAE,UAAU,SAAS,MAAM,QAAQ,QAAQ;AAAA,MACpD;AAAA,IACF;AAEA,eAAW,QAAQ,YAAY,OAAO,CAAC,GAAG;AACxC,YAAM,SAAS,UAAU,IAAI;AAC7B,UAAI,YAAY,QAAQ,UAAU,WAAW,KAAK,GAAG,GAAG;AACtD,eAAO,EAAE,UAAU,OAAO,MAAM,QAAQ,MAAM;AAAA,MAChD;AAAA,IACF;AAEA,WAAO,EAAE,UAAU,MAAM;AAAA,EAC3B;AAAA,EAEA,cAAkC;AAChC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,SAAiB;AACf,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,OAAO,KAA4B;AACvC,QAAI,KAAK,QAAQ,IAAK;AACtB,QAAI,KAAK,YAAa,OAAM,KAAK;AACjC,SAAK,QAAQ;AACb,SAAK,MAAM;AACX,SAAK,cAAc;AACnB,UAAM,KAAK,WAAW;AAAA,EACxB;AAAA,EAEA,UAAgB;AACd,SAAK,cAAc;AAAA,EACrB;AACF;;;AxCnOA,IAAM,gCAAgC;AACtC,IAAM,mBAAmB;AACzB,IAAM,sBAAsB,oBAAI,IAAI,CAAC,YAAY,aAAa,cAAc,CAAC;AAE7E,SAAS,cAAcC,OAAsB;AAC3C,QAAM,YAAYA,MACf,QAAQ,YAAY,GAAG,EACvB,QAAQ,QAAQ,GAAG,EACnB,KAAK;AACR,MAAI,UAAU,UAAU,kBAAkB;AACxC,WAAO;AAAA,EACT;AACA,SAAO,GAAG,UAAU,MAAM,GAAG,mBAAmB,CAAC,CAAC;AACpD;AAEA,SAAS,qBACP,QACA,SACS;AACT,MAAI,WAAW,KAAM,QAAO;AAC5B,MAAI,WAAW,MAAO,QAAO;AAC7B,SAAO,OAAO;AAAA,IACZ,CAAC,MACC,EAAE,SAAS,QAAQ,SAClB,EAAE,YAAY,UAAa,EAAE,YAAY,QAAQ;AAAA,EACtD;AACF;AAUO,IAAM,iBAAN,cAA6B,aAAa;AAAA,EACtC,cAAc;AAAA,EAEvB;AAAA,EACA,sBAA6D,CAAC;AAAA,EAC9D;AAAA,EACQ;AAAA,EACA;AAAA,EACA,oBAAuC,oBAAI,IAAI;AAAA,EAEvD,YAAY,QAA6B,SAAiC;AACxE,UAAM,MAAM;AACZ,SAAK,UAAU;AACf,SAAK,eAAe,CAAC;AACrB,SAAK,SAAS,IAAI,OAAO,EAAE,OAAO,MAAM,QAAQ,mBAAmB,CAAC;AACpE,SAAK,aAAa,iBAAiB,SAAS,kBAAkB,KAAK,MAAM;AAAA,EAC3E;AAAA,EAEU,oBAAoD;AAC5D,WAAO,KAAK,YAAY;AAAA,EAC1B;AAAA,EAEA,MAAe,eAA8B;AAC3C,QAAI;AACF,YAAM,MAAM,aAAa;AAAA,IAC3B,UAAE;AACA,WAAK,YAAY,QAAQ;AACzB,WAAK,aAAa;AAClB,WAAK,kBAAkB,MAAM;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,SAAyD;AACxE,SAAK,qBAAqB,QAAQ;AAElC,WAAO;AAAA,MACL,iBAAiB;AAAA,MACjB,mBAAmB;AAAA,QACjB,oBAAoB;AAAA,UAClB,OAAO;AAAA,UACP,iBAAiB;AAAA,QACnB;AAAA,QACA,iBAAiB;AAAA,UACf,MAAM;AAAA,UACN,KAAK;AAAA,QACP;AAAA,QACA,aAAa;AAAA,QACb,qBAAqB;AAAA,UACnB,MAAM,CAAC;AAAA,UACP,MAAM,CAAC;AAAA,UACP,QAAQ,CAAC;AAAA,QACX;AAAA,QACA,OAAO;AAAA,UACL,SAAS;AAAA,YACP,eAAe;AAAA,UACjB;AAAA,UACA,YAAY;AAAA,YACV,gBAAgB;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AAAA,MACA,WAAW;AAAA,QACT,MAAM,gBAAY;AAAA,QAClB,OAAO;AAAA,QACP,SAAS,gBAAY;AAAA,MACvB;AAAA,MACA,aAAa,CAAC;AAAA,IAChB;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,QAAwD;AAGvE,QACK,eAAgB,cAAW,YAAQ,GAAG,qBAAqB,CAAC,KAC/D,CAAI,eAAgB,cAAW,YAAQ,GAAG,cAAc,CAAC,GACzD;AACA,YAAMC,cAAa,aAAa;AAAA,IAClC;AAEA,UAAM,WAAW,MAAM,KAAK,cAAc,QAAQ;AAAA;AAAA,MAEhD,QAAS,OAAO,OAAsC,YAAY,SAC9D;AAAA,IACN,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,qBACJ,QAC8B;AAC9B,WAAO,KAAK;AAAA,MACV;AAAA,QACE,KAAK,OAAO;AAAA,QACZ,YAAY,OAAO,cAAc,CAAC;AAAA,QAClC,OAAO,OAAO;AAAA,MAChB;AAAA,MACA,EAAE,QAAQ,OAAO,WAAW,aAAa,KAAK;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,MAAM,uBACJ,QACgC;AAEhC,UAAM,WAAW,KAAK,wBAAwB,OAAO,SAAS;AAC9D,QAAI,SAAU,QAAO;AAErB,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B;AAAA,QACE,KAAK,OAAO;AAAA,QACZ,YAAY,OAAO,cAAc,CAAC;AAAA,QAClC,OAAO,OAAO;AAAA,MAChB;AAAA,MACA;AAAA,QACE,QAAQ,OAAO;AAAA,MACjB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,YAAY,QAA0D;AAE1E,UAAM,WAAW,KAAK,wBAAwB,OAAO,SAAS;AAC9D,QAAI,SAAU,QAAO;AAErB,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B;AAAA,QACE,KAAK,OAAO;AAAA,QACZ,YAAY,OAAO,cAAc,CAAC;AAAA,QAClC,OAAO,OAAO;AAAA,MAChB;AAAA,MACA,EAAE,QAAQ,OAAO,WAAW,uBAAuB,KAAK;AAAA,IAC1D;AAEA,UAAM,KAAK,qBAAqB,OAAO,SAAS;AAGhD,SAAK,uBAAuB,KAAK,QAAQ,KAAK;AAE9C,WAAO;AAAA,MACL,OAAO,SAAS;AAAA,MAChB,QAAQ,SAAS;AAAA,MACjB,eAAe,SAAS;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,MAAM,aACJ,QAC+B;AAC/B,UAAM,cAAc,MAAM,aAAa,EAAE,KAAK,OAAO,OAAO,OAAU,CAAC;AACvE,UAAM,WAAW,CAAC;AAElB,eAAW,WAAW,aAAa;AACjC,UAAI,CAAC,QAAQ,IAAK;AAClB,eAAS,KAAK;AAAA,QACZ,WAAW,QAAQ;AAAA,QACnB,KAAK,QAAQ;AAAA,QACb,OAAO,cAAc,QAAQ,eAAe,QAAQ,WAAW,EAAE;AAAA,QACjE,WAAW,IAAI,KAAK,QAAQ,YAAY,EAAE,YAAY;AAAA,MACxD,CAAC;AAAA,IACH;AACA,WAAO;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,sBACJ,QAC+B;AAC/B,WAAO,KAAK,aAAa,MAAM;AAAA,EACjC;AAAA,EAEA,MAAM,OAAO,QAAgD;AAC3D,SAAK,QAAQ,YAAY;AACzB,SAAK,QAAQ,kBAAkB;AAC/B,SAAK,QAAQ,mBAAmB;AAAA,MAC9B,aAAa;AAAA,MACb,cAAc;AAAA,MACd,kBAAkB;AAAA,MAClB,mBAAmB;AAAA,IACrB;AAEA,UAAM,cAAc,eAAe,MAAM;AACzC,UAAM,aAAa,WAAW;AAC9B,gBAAY,OAAO;AACnB,QAAI,iBAAiB;AACrB,QAAI,qBAAqB;AAGzB,UAAM,aAAa,YAAY,QAAQ;AACvC,QAAI,gBAAgB;AACpB,QAAI,OAAO,eAAe,UAAU;AAClC,sBAAgB;AAAA,IAClB,WAAW,MAAM,QAAQ,UAAU,GAAG;AACpC,iBAAW,SAAS,YAAY;AAC9B,YAAI,UAAU,SAAS,MAAM,SAAS,UAAU,UAAU,OAAO;AAC/D,0BAAgB,MAAM;AACtB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,UAAM,eAAe,cAAc,MAAM,UAAU;AACnD,QAAI,gBAAgB,oBAAoB,IAAI,aAAa,CAAC,CAAC,GAAG;AAC5D,2BAAqB;AACrB,uBAAiB;AAAA,IACnB;AAEA,QAAI,KAAK,QAAQ,eAAe;AAC9B,WAAK,QAAQ,MAAM,KAAK,WAAW;AACnC,YAAM,QAAQ,KAAK,QAAQ;AAC3B,YAAM,YAAY,MAAM,IAAI,QAAiB,CAACC,aAAY;AACxD,aAAK,QAAQ,gBAAgB,IAAI,YAAY,EAAE,SAAAA,UAAS,MAAM,CAAC;AAAA,MACjE,CAAC;AACD,UAAI,WAAW;AACb,eAAO,EAAE,YAAY,YAAY;AAAA,MACnC;AACA,uBAAiB;AAAA,IACnB,OAAO;AACL,WAAK,QAAQ,MAAM,KAAK,WAAW;AAAA,IACrC;AAGA,UAAM,KAAK,qBAAqB,MAAM;AAEtC,SAAK,QAAQ,gBAAgB;AAC7B,QAAI,YAAY;AAChB,QAAI,0BAAyC;AAC7C,QAAI,kBAAkB;AAAA,MACpB,cAAc;AAAA,MACd,eAAe;AAAA,MACf,yBAAyB;AAAA,MACzB,6BAA6B;AAAA,IAC/B;AACA,QAAI,KAAK,QAAQ,yBAAyB,MAAM;AAC9C,WAAK,QAAQ,wBAAwB,KAAK;AAAA,QACxC,KAAK,QAAQ,WAAW;AAAA,MAC1B;AACA,WAAK,OAAO,MAAM,4CAA4C;AAAA,QAC5D,SAAS,KAAK,QAAQ;AAAA,QACtB,mBAAmB,KAAK,QAAQ;AAAA,MAClC,CAAC;AAAA,IACH;AACA,QAAI,wBAAwB,KAAK,QAAQ;AAEzC,UAAM,yBAEF,KAAK,oBAAoB,OAGxB,oBAAoB;AAEzB,UAAM,UAAU;AAAA,MACd,SAAS,KAAK;AAAA,MACd,WAAW,OAAO;AAAA,MAClB,QAAQ,KAAK;AAAA,MACb,cAAc,KAAK;AAAA,MACnB,kBAAkB,KAAK;AAAA,MACvB,mBAAmB,KAAK;AAAA,MACxB,QAAQ,KAAK;AAAA,MACb;AAAA,IACF;AAEA,QAAI;AACF,aAAO,MAAM;AACX,cAAM,EAAE,OAAO,SAAS,KAAK,IAAI,MAAM,KAAK,QAAQ,MAAM,KAAK;AAE/D,YAAI,QAAQ,CAAC,SAAS;AACpB,cAAI,KAAK,QAAQ,WAAW;AAC1B,mBAAO;AAAA,cACL,YAAY;AAAA,cACZ,OAAO,KAAK,QAAQ,kBAChB,EAAE,iBAAiB,KAAK,QAAQ,gBAAgB,IAChD;AAAA,YACN;AAAA,UACF;AACA;AAAA,QACF;AAEA,YACE,KAAK,QAAQ,sBACb,qBAAqB,KAAK,QAAQ,oBAAoB,OAAO,GAC7D;AACA,gBAAM,KAAK,OAAO,gBAAgB,sBAAsB;AAAA,YACtD,WAAW,OAAO;AAAA,YAClB;AAAA,UACF,CAAC;AAAA,QACH;AAEA,gBAAQ,QAAQ,MAAM;AAAA,UACpB,KAAK;AACH,gBAAI,QAAQ,YAAY,oBAAoB;AAG1C,wCAA0B;AAC1B,+BAAiB;AACjB,oBAAM,KAAK,OAAO,cAAc;AAAA,gBAC9B,WAAW,OAAO;AAAA,gBAClB,QAAQ;AAAA,kBACN,eAAe;AAAA,kBACf,MAAM;AAAA,kBACN,MAAM;AAAA,gBACR;AAAA,cACF,CAAC;AAAA,YACH;AACA,gBAAI,QAAQ,YAAY,wBAAwB;AAC9C,+BAAiB;AAAA,YACnB;AACA,gBACE,QAAQ,YAAY,2BACnB,QAAoC,UAAU,QAC/C;AACA,kBAAI,CAAC,gBAAgB;AACnB,qBAAK,OAAO,MAAM,4CAA4C;AAAA,kBAC5D,WAAW,OAAO;AAAA,gBACpB,CAAC;AACD;AAAA,cACF;AAEA,oBAAM,MAAM,KAAK,QAAQ;AACzB,oBAAM,YACJ,IAAI,cACJ,IAAI,eACJ,IAAI,mBACJ,IAAI;AAEN,oBAAM,KAAK,OAAO,cAAc;AAAA,gBAC9B,WAAW,OAAO;AAAA,gBAClB,QAAQ;AAAA,kBACN,eAAe;AAAA,kBACf,MAAM;AAAA,kBACN,MAAM;AAAA,gBACR;AAAA,cACF,CAAC;AAED,qBAAO,EAAE,YAAY,WAAW;AAAA,YAClC;AACA,kBAAM,oBAAoB,SAAS,OAAO;AAC1C;AAAA,UAEF,KAAK,UAAU;AAEb,gBAAI,CAAC,gBAAgB;AACnB,mBAAK,OAAO;AAAA,gBACV;AAAA,gBACA,EAAE,WAAW,OAAO,UAAU;AAAA,cAChC;AACA;AAAA,YACF;AAEA,gBAAI,KAAK,QAAQ,WAAW;AAC1B,qBAAO,EAAE,YAAY,YAAY;AAAA,YACnC;AAGA,iBAAK,QAAQ,iBAAiB,eAC5B,QAAQ,MAAM,gBAAgB;AAChC,iBAAK,QAAQ,iBAAiB,gBAC5B,QAAQ,MAAM,iBAAiB;AACjC,iBAAK,QAAQ,iBAAiB,oBAC5B,QAAQ,MAAM,2BAA2B;AAC3C,iBAAK,QAAQ,iBAAiB,qBAC5B,QAAQ,MAAM,+BAA+B;AAI/C,kBAAM,iBAAiB,OAAO,OAAO,QAAQ,UAAU,EAAE;AAAA,cACvD,CAAC,MAAM,EAAE;AAAA,YACX;AACA,gBAAI,eAAe,SAAS,GAAG;AAC7B,oBAAM,mBAAmB,KAAK,IAAI,GAAG,cAAc;AACnD,kBAAI,mBAAmB,uBAAuB;AAC5C,wCAAwB;AAAA,cAC1B;AAAA,YACF;AACA,iBAAK,QAAQ,wBAAwB;AAErC,iBAAK,QAAQ,cAAc;AAC3B,gBAAI,4BAA4B,MAAM;AACpC,mBAAK,QAAQ,cAAc;AAAA,YAC7B;AAGA,gBAAI,4BAA4B,MAAM;AACpC,oBAAM,KAAK,OAAO,cAAc;AAAA,gBAC9B,WAAW,OAAO;AAAA,gBAClB,QAAQ;AAAA,kBACN,eAAe;AAAA,kBACf,MAAM;AAAA,kBACN,MAAM;AAAA,kBACN,MAAM;AAAA,oBACJ,QAAQ,QAAQ;AAAA,oBAChB,UAAU;AAAA,kBACZ;AAAA,gBACF;AAAA,cACF,CAAC;AAAA,YACH;AAEA,kBAAM,KAAK,OAAO;AAAA,cAChB,sBAAsB;AAAA,cACtB;AAAA,gBACE,WAAW,OAAO;AAAA,gBAClB,MAAM;AAAA,kBACJ,aAAa,QAAQ,MAAM;AAAA,kBAC3B,cAAc,QAAQ,MAAM;AAAA,kBAC5B,kBAAkB,QAAQ,MAAM;AAAA,kBAChC,mBAAmB,QAAQ,MAAM;AAAA,gBACnC;AAAA,gBACA,MAAM,QAAQ;AAAA,cAChB;AAAA,YACF;AAEA,kBAAM,QAAe;AAAA,cACnB,aAAa,KAAK,QAAQ,iBAAiB;AAAA,cAC3C,cAAc,KAAK,QAAQ,iBAAiB;AAAA,cAC5C,kBAAkB,KAAK,QAAQ,iBAAiB;AAAA,cAChD,mBACE,KAAK,QAAQ,iBAAiB;AAAA,cAChC,aACE,KAAK,QAAQ,iBAAiB,cAC9B,KAAK,QAAQ,iBAAiB,eAC9B,KAAK,QAAQ,iBAAiB,mBAC9B,KAAK,QAAQ,iBAAiB;AAAA,YAClC;AAEA,kBAAM,SAAS,oBAAoB,OAAO;AAC1C,gBAAI,OAAO,MAAO,OAAM,OAAO;AAG/B,gBACE,QAAQ,YAAY,aACpB,QAAQ,qBAAqB,QAC7B,KAAK,SAAS,oBACd;AACA,oBAAM,KAAK,QAAQ;AAAA,gBACjB,QAAQ;AAAA,cACV;AAAA,YACF;AAGA,gBACE,sBACA,QAAQ,YAAY,aACpB,QAAQ,QACR;AACA,oBAAM,KAAK,OAAO,cAAc;AAAA,gBAC9B,WAAW,OAAO;AAAA,gBAClB,QAAQ;AAAA,kBACN,eAAe;AAAA,kBACf,SAAS,EAAE,MAAM,QAAQ,MAAM,QAAQ,OAAO;AAAA,gBAChD;AAAA,cACF,CAAC;AAAA,YACH;AAEA,mBAAO,EAAE,YAAY,OAAO,cAAc,YAAY,MAAM;AAAA,UAC9D;AAAA,UAEA,KAAK,gBAAgB;AACnB,gBACE,QAAQ,uBAAuB,SAC9B,QAAQ,MAAM,SAAS,mBACtB,QAAQ,MAAM,SAAS,kBACzB;AACA,kBAAI,QAAQ,MAAM,SAAS,iBAAiB;AAC1C,sBAAM,IAAI,QAAQ,MAAM,QAAQ;AAChC,kCAAkB;AAAA,kBAChB,cAAc,EAAE,gBAAgB;AAAA,kBAChC,eAAe,EAAE,iBAAiB;AAAA,kBAClC,yBAAyB,EAAE,2BAA2B;AAAA,kBACtD,6BACE,EAAE,+BAA+B;AAAA,gBACrC;AAAA,cACF,OAAO;AACL,sBAAM,IAAI,QAAQ,MAAM;AACxB,kCAAkB;AAAA,kBAChB,cAAc,EAAE,gBAAgB,gBAAgB;AAAA,kBAChD,eAAe,EAAE;AAAA,kBACjB,yBACE,EAAE,2BACF,gBAAgB;AAAA,kBAClB,6BACE,EAAE,+BACF,gBAAgB;AAAA,gBACpB;AAAA,cACF;AAEA,oBAAM,YACJ,gBAAgB,eAChB,gBAAgB,gBAChB,gBAAgB,0BAChB,gBAAgB;AAElB,kBAAI,cAAc,yBAAyB;AACzC,0CAA0B;AAC1B,sBAAM,KAAK,OAAO,cAAc;AAAA,kBAC9B,WAAW,OAAO;AAAA,kBAClB,QAAQ;AAAA,oBACN,eAAe;AAAA,oBACf,MAAM;AAAA,oBACN,MAAM;AAAA,kBACR;AAAA,gBACF,CAAC;AAAA,cACH;AAAA,YACF;AACA,kBAAM,kBAAkB,SAAS,OAAO;AACxC;AAAA,UACF;AAAA,UAEA,KAAK;AAAA,UACL,KAAK,aAAa;AAChB,gBAAI,KAAK,QAAQ,WAAW;AAC1B;AAAA,YACF;AAGA,gBAAI,QAAQ,SAAS,UAAU,UAAU,WAAW,QAAQ,MAAM;AAChE,kBAAI,QAAQ,SAAS,YAAY;AAC/B,iCAAiB;AACjB;AAAA,cACF;AAEA,oBAAM,UAAU,KAAK,QAAQ,gBAAgB;AAAA,gBAC3C,QAAQ;AAAA,cACV;AACA,kBAAI,SAAS;AACX,wBAAQ,QAAQ,KAAK;AACrB,qBAAK,QAAQ,gBAAgB,OAAO,QAAQ,IAAc;AAC1D,4BAAY;AAGZ,uBAAO,EAAE,YAAY,WAAW;AAAA,cAClC;AAAA,YACF;AAGA,gBACE,cAAc,WACb,QAAoC,UACrC;AACA;AAAA,YACF;AAQA,gBACE,WAAW,QAAQ,WACnB,QAAQ,uBAAuB,MAC/B;AACA,oBAAM,QACJ,QAAQ,QACR;AAMF,yCACG,MAAM,gBAAgB,MACtB,MAAM,iBAAiB,MACvB,MAAM,2BAA2B,MACjC,MAAM,+BAA+B;AAExC,oBAAM,KAAK,OAAO,cAAc;AAAA,gBAC9B,WAAW,OAAO;AAAA,gBAClB,QAAQ;AAAA,kBACN,eAAe;AAAA,kBACf,MAAM;AAAA,kBACN,MAAM;AAAA,kBACN,MAAM;AAAA,gBACR;AAAA,cACF,CAAC;AAAA,YACH;AAEA,kBAAM,SAAS,MAAM,2BAA2B,SAAS,OAAO;AAChE,gBAAI,OAAO,MAAO,OAAM,OAAO;AAC/B,gBAAI,OAAO,YAAY;AACrB,qBAAO,EAAE,YAAY,WAAW;AAAA,YAClC;AACA;AAAA,UACF;AAAA,UAEA,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AACH;AAAA,UAEF;AACE,wBAAY,SAAkB,KAAK,MAAM;AACzC;AAAA,QACJ;AAAA,MACF;AACA,YAAM,IAAI,MAAM,+BAA+B;AAAA,IACjD,SAAS,OAAO;AACd,UAAI,iBAAiBD,iBAAgB,EAAE,iBAAiB,QAAQ;AAC9D,cAAM;AAAA,MACR;AACA,YAAM,MAAM,MAAM;AAClB,UACE,IAAI,SAAS,kBAAkB,KAC/B,IAAI,SAAS,oBAAoB,KACjC,IAAI,SAAS,qBAAqB,KAClC,IAAI,SAAS,8BAA8B,KAC3C,IAAI,SAAS,kCAAkC,GAC/C;AACA,aAAK,OAAO,MAAM,iBAAiB,GAAG,IAAI;AAAA,UACxC,WAAW,KAAK;AAAA,QAClB,CAAC;AACD,aAAK,QAAQ,gBAAgB,QAAQ;AACrC,aAAK,QAAQ,MAAM,IAAI;AACvB,cAAMA,cAAa;AAAA,UACjB;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,YAAM;AAAA,IACR,UAAE;AACA,UAAI,CAAC,WAAW;AACd,aAAK,QAAQ,gBAAgB;AAE7B,mBAAW,CAAC,KAAK,OAAO,KAAK,KAAK,QAAQ,iBAAiB;AACzD,kBAAQ,QAAQ,IAAI;AACpB,eAAK,QAAQ,gBAAgB,OAAO,GAAG;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,MAAgB,YAA2B;AACzC,SAAK,QAAQ,YAAY;AACzB,eAAW,CAAC,EAAE,OAAO,KAAK,KAAK,QAAQ,iBAAiB;AACtD,cAAQ,QAAQ,IAAI;AAAA,IACtB;AACA,SAAK,QAAQ,gBAAgB,MAAM;AACnC,UAAM,KAAK,QAAQ,MAAM,UAAU;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,MAAM,UACJ,QACA,QACkC;AAClC,QAAI,CAAC,SAAS,QAAQ,gBAAgB,eAAe,GAAG;AACtD,YAAMA,cAAa,eAAe,MAAM;AAAA,IAC1C;AAKA,QAAI,OAAO,eAAe,QAAW;AACnC,YAAM,IAAIA;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,QAAI,CAAC,MAAM,QAAQ,OAAO,UAAU,GAAG;AACrC,YAAM,IAAIA;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,aAAa;AAAA,MACjB;AAAA,IACF;AACA,UAAM,KAAK,eAAe,UAAU;AACpC,WAAO,EAAE,WAAW,KAAK;AAAA,EAC3B;AAAA,EAEA,MAAc,eACZ,YACe;AACf,UAAM,OAAO,KAAK;AAClB,QAAI,KAAK,eAAe;AACtB,YAAM,IAAIA;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,QAAI,KAAK,WAAW,CAAC,qBAAqB,KAAK,OAAO,GAAG;AACvD,YAAM,IAAIA;AAAA,QACR;AAAA,QACA,SAAS,KAAK,OAAO;AAAA,MACvB;AAAA,IACF;AAEA,SAAK,OAAO,KAAK,6CAA6C;AAAA,MAC5D,aAAa,OAAO,KAAK,UAAU,EAAE;AAAA,MACrC,WAAW,KAAK;AAAA,IAClB,CAAC;AAMD,SAAK,gBAAgB,MAAM;AAC3B,UAAM,KAAK,MAAM,UAAU;AAC3B,SAAK,MAAM,IAAI;AAKf,UAAM,qBAAqB,IAAI,gBAAgB;AAC/C,UAAM,EAAE,WAAW,OAAO,GAAG,KAAK,IAAI,KAAK;AAC3C,UAAM,aAAsB;AAAA,MAC1B,GAAG;AAAA,MACH;AAAA,MACA,QAAQ,KAAK;AAAA,MACb,aAAa;AAAA,MACb,iBAAiB;AAAA,IACnB;AAEA,UAAM,WAAW,IAAI,SAAyB;AAC9C,UAAM,WAAW,MAAM,EAAE,QAAQ,UAAU,SAAS,WAAW,CAAC;AAEhE,SAAK,QAAQ;AACb,SAAK,QAAQ;AACb,SAAK,eAAe;AACpB,SAAK,kBAAkB;AAEvB,UAAM,SAAS,MAAM;AAAA,MACnB,SAAS,qBAAqB;AAAA,MAC9B;AAAA,IACF;AACA,QAAI,OAAO,WAAW,WAAW;AAC/B,YAAM,IAAI,MAAM,iCAAiC,KAAK,SAAS,EAAE;AAAA,IACnE;AAGA,SAAK,uBAAuB,QAAQ;AAAA,EACtC;AAAA,EAEA,MAAM,yBACJ,QAC8C;AAC9C,UAAM,KAAK,QAAQ,MAAM,SAAS,aAAa,OAAO,OAAO,CAAC;AAC9D,SAAK,QAAQ,UAAU,OAAO;AAC9B,SAAK,QAAQ,wBAAwB,KAAK;AAAA,MACxC,OAAO;AAAA,IACT;AACA,SAAK,0BAA0B,OAAO,OAAO;AAC7C,UAAM,KAAK,mBAAmB,SAAS,OAAO,OAAO;AACrD,WAAO,CAAC;AAAA,EACV;AAAA,EAEA,MAAM,eACJ,QACiC;AACjC,UAAM,KAAK,iBAAiB,OAAO,MAAM;AACzC,UAAM,KAAK,mBAAmB,QAAQ,OAAO,MAAM;AACnD,WAAO,CAAC;AAAA,EACV;AAAA,EAEA,MAAM,uBACJ,QACyC;AACzC,UAAM,SAAS,KAAK,QAAQ,cAAc;AAAA,MACxC,CAAC,MAAM,EAAE,OAAO,OAAO;AAAA,IACzB;AACA,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,0BAA0B,OAAO,QAAQ,EAAE;AAAA,IAC7D;AAEA,QAAI,OAAO,OAAO,UAAU,UAAU;AACpC,YAAM,IAAI;AAAA,QACR,wCAAwC,OAAO,QAAQ;AAAA,MACzD;AAAA,IACF;AAEA,UAAM,YACJ,aAAa,UAAU,MAAM,QAAQ,OAAO,OAAO,IAC9C,OAAO,QAA2C;AAAA,MAAQ,CAAC,MAC1D,aAAa,KAAK,MAAM,QAAQ,EAAE,OAAO,IACpC,EAAE,UAKH,CAAC,CAA2D;AAAA,IAClE,IACA,CAAC;AACP,QAAI,aAAa,UAAU,KAAK,CAAC,MAAM,EAAE,UAAU,OAAO,KAAK;AAK/D,QAAI,CAAC,cAAc,OAAO,aAAa,SAAS;AAC9C,YAAM,WAAW,uBAAuB,OAAO,OAAO,SAAS;AAC/D,UAAI,UAAU;AACZ,qBAAa,UAAU,KAAK,CAAC,MAAM,EAAE,UAAU,QAAQ;AAAA,MACzD;AAAA,IACF;AAEA,QAAI,CAAC,YAAY;AACf,YAAM,IAAI;AAAA,QACR,mCAAmC,OAAO,QAAQ,KAAK,OAAO,KAAK;AAAA,MACrE;AAAA,IACF;AAIA,UAAM,gBAAgB,WAAW;AAEjC,QAAI,OAAO,aAAa,QAAQ;AAC9B,YAAM,KAAK,iBAAiB,aAAa;AACzC,YAAM,KAAK,OAAO,cAAc;AAAA,QAC9B,WAAW,KAAK;AAAA,QAChB,QAAQ;AAAA,UACN,eAAe;AAAA,UACf,eAAe;AAAA,QACjB;AAAA,MACF,CAAC;AAAA,IACH,WAAW,OAAO,aAAa,SAAS;AACtC,YAAM,aAAa,aAAa,aAAa;AAC7C,YAAM,KAAK,QAAQ,MAAM,SAAS,UAAU;AAC5C,WAAK,QAAQ,UAAU;AACvB,WAAK,QAAQ,wBACX,KAAK,yBAAyB,aAAa;AAC7C,WAAK,0BAA0B,aAAa;AAAA,IAC9C,WAAW,OAAO,aAAa,UAAU;AACvC,YAAM,YAAY;AAClB,WAAK,QAAQ,SAAS;AACtB,WAAK,QAAQ,aAAa,SAAS;AACnC,YAAM,KAAK,QAAQ,MAAM,kBAAkB;AAAA;AAAA,QAEzC,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AAEA,SAAK,QAAQ,gBAAgB,KAAK,QAAQ,cAAc;AAAA,MAAI,CAAC,MAC3D,EAAE,OAAO,OAAO,YAAY,OAAO,EAAE,iBAAiB,WAClD,EAAE,GAAG,GAAG,cAAc,cAAc,IACpC;AAAA,IACN;AAEA,WAAO,EAAE,eAAe,KAAK,QAAQ,cAAc;AAAA,EACrD;AAAA,EAEA,MAAc,mBACZ,UACA,OACe;AACf,SAAK,QAAQ,gBAAgB,KAAK,QAAQ,cAAc;AAAA,MAAI,CAAC,MAC3D,EAAE,OAAO,YAAY,OAAO,EAAE,iBAAiB,WAC3C,EAAE,GAAG,GAAG,cAAc,MAAM,IAC5B;AAAA,IACN;AAEA,UAAM,KAAK,OAAO,cAAc;AAAA,MAC9B,WAAW,KAAK;AAAA,MAChB,QAAQ;AAAA,QACN,eAAe;AAAA,QACf,eAAe,KAAK,QAAQ;AAAA,MAC9B;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,iBAAiB,QAA+B;AAC5D,QAAI,CAAC,qBAAqB,SAAS,MAA2B,GAAG;AAC/D,YAAM,IAAI,MAAM,cAAc;AAAA,IAChC;AACA,UAAM,eAAe,KAAK,QAAQ;AAClC,SAAK,QAAQ,iBAAiB;AAC9B,QAAI;AACF,YAAM,KAAK,QAAQ,MAAM,kBAAkB,MAA2B;AAAA,IACxE,SAAS,OAAO;AACd,WAAK,QAAQ,iBAAiB;AAC9B,UAAI,iBAAiB,OAAO;AAC1B,YAAI,CAAC,MAAM,SAAS;AAClB,gBAAM,UAAU;AAAA,QAClB;AACA,cAAM;AAAA,MACR;AACA,YAAM,IAAI,MAAM,cAAc;AAAA,IAChC;AAAA,EACF;AAAA,EAEA,MAAc,cACZ,QAKA,eAII,CAAC,GACwB;AAC7B,UAAM,EAAE,IAAI,IAAI;AAChB,UAAM,EAAE,QAAQ,YAAY,IAAI;AAEhC,UAAM,WAAW,CAAC,CAAC;AAEnB,UAAM,OAAO,OAAO;AACpB,UAAM,SAAS,MAAM,aAAa;AAClC,UAAM,SAAS,MAAM,YAAY,SAAS;AAI1C,QAAI;AACJ,QAAI,aAAa;AACf,kBAAY,OAAO;AAAA,IACrB,WAAW,UAAU;AACnB,kBAAY;AAAA,IACd,OAAO;AACL,kBAAY,OAAO;AAAA,IACrB;AAEA,UAAM,QAAQ,IAAI,SAAyB;AAE3C,UAAM,kBAAkB,IAAI,gBAAgB,GAAG;AAC/C,UAAM,gBAAgB,WAAW;AAEjC,UAAM,eACJ,gBAAgB,YAAY,EAAE,SAAS,MAAM,SAAS;AACxD,UAAM,aAAa,qBAAqB,YAAY,IAChD,gBAAgB,MAAM,IACtB,CAAC;AACL,UAAM,eAAe,kBAAkB,MAAM,YAAY;AAGzD,UAAM,eACJ,MAAM,cAAc,KAAK,SAAS,qBAC9B,EAAE,MAAM,eAAwB,QAAQ,KAAK,WAAW,IACxD;AAEN,SAAK,OAAO,MAAM,WAAW,qBAAqB,wBAAwB;AAAA,MACxE;AAAA,MACA;AAAA,MACA,WAAW,MAAM;AAAA,MACjB;AAAA,IACF,CAAC;AAED,UAAM,iBACJ,MAAM,kBACN,qBAAqB,SAAS,KAAK,cAAmC,IACjE,KAAK,iBACN;AAEN,UAAM,UAAU,oBAAoB;AAAA,MAClC;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY,KAAK,iBAAiB,WAAW,MAAM,cAAc;AAAA,MACjE,QAAQ,KAAK;AAAA,MACb;AAAA,MACA,qBAAqB,MAAM,YAAY;AAAA,MACvC;AAAA,MACA;AAAA,MACA;AAAA,MACA,uBAAuB;AAAA,QACrB,GAAI,MAAM,YAAY,SAAS,yBAAyB,CAAC;AAAA,QACzD,GAAI,MAAM,mBAAmB,CAAC;AAAA,MAChC;AAAA,MACA,qBAAqB,MAAM;AAAA,MAC3B;AAAA,MACA;AAAA,MACA,cAAc,KAAK,mBAAmB;AAAA,MACtC,kBAAkB,KAAK,SAAS;AAAA,MAChC,iBAAiB,KAAK,SAAS;AAAA,MAC/B;AAAA,MACA,gBAAgB,KAAK,YAAY;AAAA,MACjC,mBAAmB,KAAK;AAAA,IAC1B,CAAC;AAGD,UAAM,kBAAkB,QAAQ;AAEhC,UAAM,IAAI,MAAM,EAAE,QAAQ,OAAO,QAAQ,CAAC;AAE1C,UAAM,UAAmB;AAAA,MACvB,OAAO;AAAA,MACP,cAAc;AAAA,MACd;AAAA,MACA,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA,kBAAkB;AAAA,QAChB,aAAa;AAAA,QACb,cAAc;AAAA,QACd,kBAAkB;AAAA,QAClB,mBAAmB;AAAA,MACrB;AAAA,MACA;AAAA,MACA,eAAe,CAAC;AAAA,MAChB,eAAe;AAAA,MACf,iBAAiB,oBAAI,IAAI;AAAA,MACzB,kBAAkB;AAAA,MAClB,oBAAoB,MAAM,YAAY,sBAAsB;AAAA;AAAA,MAG5D;AAAA,MACA,qBAAqB,CAAC;AAAA,MACtB,WAAW,MAAM;AAAA,IACnB;AACA,SAAK,UAAU;AACf,SAAK,YAAY;AAEjB,QAAI,UAAU;AAGZ,UAAI;AACF,cAAM,SAAS,MAAM;AAAA,UACnB,EAAE,qBAAqB;AAAA,UACvB;AAAA,QACF;AACA,YAAI,OAAO,WAAW,WAAW;AAC/B,gBAAM,IAAI;AAAA,YACR,WAAW,cAAc,SAAS,YAAY,4BAA4B,SAAS;AAAA,UACrF;AAAA,QACF;AAAA,MACF,SAASE,MAAK;AACZ,wBAAgB,QAAQ;AACxB,YACEA,gBAAe,SACfA,KAAI,YAAY,yCAChB;AACA,gBAAMF,cAAa,iBAAiB,SAAS;AAAA,QAC/C;AACA,aAAK,OAAO;AAAA,UACV,cAAc,wBAAwB;AAAA,UACtC;AAAA,YACE;AAAA,YACA;AAAA,YACA,WAAW,MAAM;AAAA,YACjB,OAAOE,gBAAe,QAAQA,KAAI,UAAU,OAAOA,IAAG;AAAA,UACxD;AAAA,QACF;AACA,cAAMA;AAAA,MACR;AAAA,IACF;AAIA,UAAMC,eAAc,CAAC,WACjB,YAAY,EAAE,qBAAqB,GAAG,6BAA6B,IACnE;AAEJ,UAAM,CAAC,YAAY,IAAI,MAAM,QAAQ,IAAI;AAAA,MACvC,KAAK;AAAA,QACH,gBAAgB,YAAY,EAAE,SAAS,MAAM,SAAS;AAAA,MACxD;AAAA,MACA,GAAI,MAAM,YACN;AAAA,QACE,KAAK,OAAO,gBAAgB,sBAAsB,aAAa;AAAA,UAC7D,WAAW,KAAK;AAAA,UAChB;AAAA,UACA,SAAS;AAAA,QACX,CAAC;AAAA,MACH,IACA,CAAC;AAAA,IACP,CAAC;AAED,QAAIA,cAAa;AACf,UAAI;AACF,cAAM,aAAa,MAAMA;AACzB,YAAI,WAAW,WAAW,WAAW;AACnC,0BAAgB,QAAQ;AACxB,gBAAM,IAAI;AAAA,YACR,kDAAkD,SAAS;AAAA,UAC7D;AAAA,QACF;AAAA,MACF,SAASD,MAAK;AACZ,wBAAgB,QAAQ;AACxB,aAAK,OAAO,MAAM,iCAAiC;AAAA,UACjD;AAAA,UACA;AAAA,UACA,WAAW,MAAM;AAAA,UACjB,OAAOA,gBAAe,QAAQA,KAAI,UAAU,OAAOA,IAAG;AAAA,QACxD,CAAC;AACD,cAAMA;AAAA,MACR;AAAA,IACF;AAEA,UAAM,gBAAgB,gBAAgB,YAAY,EAAE;AACpD,UAAM,YAAY,MAAM;AACxB,UAAM,kBACJ,iBAAiB,aAAa,aAAa;AAC7C,YAAQ,UAAU;AAClB,YAAQ,wBACN,KAAK,yBAAyB,eAAe;AAE/C,UAAM,mBAAmB,aAAa,eAAe;AAErD,QAAI,CAAC,YAAY,qBAAqB,eAAe;AACnD,YAAM,KAAK,QAAQ,MAAM,SAAS,gBAAgB;AAAA,IACpD;AAEA,QAAI,kBAAkB,eAAe,GAAG;AACtC,cAAQ,QAAQ,CAAC,uBAAuB;AAAA,IAC1C;AAEA,UAAME,kBAAiB,kBAAkB;AACzC,UAAM,QAA0B;AAAA,MAC9B,eAAe;AAAA,MACf,gBAAgBA,gBAAe,IAAI,CAAC,UAAU;AAAA,QAC5C,IAAI,KAAK;AAAA,QACT,MAAM,KAAK;AAAA,QACX,aAAa,KAAK,eAAe;AAAA,MACnC,EAAE;AAAA,IACJ;AAEA,UAAM,SAA4B;AAAA,MAChC,gBAAgB;AAAA,MAChB,iBAAiB,aAAa,QAAQ;AAAA,QACpC,CAAC,SAAuB;AAAA,UACtB,SAAS,IAAI;AAAA,UACb,MAAM,IAAI;AAAA,UACV,aAAa,IAAI;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,gBAAgB,KAAK;AAAA,MACzB;AAAA,MACA;AAAA,MACA,UAAU;AAAA,IACZ;AACA,YAAQ,gBAAgB;AAExB,QAAI,CAAC,aAAa,uBAAuB;AACvC,WAAK,uBAAuB,CAAC;AAAA,IAC/B;AAEA,WAAO,EAAE,WAAW,OAAO,QAAQ,cAAc;AAAA,EACnD;AAAA,EAEQ,iBACN,WACA,gBACY;AACZ,WAAO,OAAO,UAAU,WAAW,EAAE,aAAa,WAAW,OAAO,MAClE,WAAW;AAAA,MACT,SAAS,KAAK;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,KAAK;AAAA,MACb;AAAA,MACA,kBAAkB,KAAK;AAAA,MACvB,QAAQ,KAAK;AAAA,MACb,oBAAoB,CAAC,UAAkB,UACrC,KAAK,mBAAmB,UAAU,KAAK;AAAA,MACzC;AAAA,IACF,CAAC;AAAA,EACL;AAAA,EAEQ,qBAAqB;AAC3B,WAAO,OAAO,YAA+B;AAC3C,UAAI,KAAK,SAAS;AAChB,aAAK,QAAQ,iBAAiB;AAAA,MAChC;AACA,YAAM,KAAK,mBAAmB,QAAQ,OAAO;AAAA,IAC/C;AAAA,EACF;AAAA,EAEQ,wBACN,WAC2B;AAC3B,QAAI,KAAK,cAAc,aAAa,CAAC,KAAK,QAAS,QAAO;AAE1D,UAAMA,kBAAiB,kBAAkB;AACzC,UAAM,QAA0B;AAAA,MAC9B,eAAe,KAAK,QAAQ;AAAA,MAC5B,gBAAgBA,gBAAe,IAAI,CAAC,UAAU;AAAA,QAC5C,IAAI,KAAK;AAAA,QACT,MAAM,KAAK;AAAA,QACX,aAAa,KAAK,eAAe;AAAA,MACnC,EAAE;AAAA,IACJ;AAEA,UAAM,eAAe,KAAK,QAAQ,cAAc;AAAA,MAC9C,CAAC,MAAM,EAAE,OAAO;AAAA,IAClB;AACA,UAAM,SAA4B;AAAA,MAChC,gBAAgB,KAAK,QAAQ,WAAW;AAAA,MACxC,iBACE,gBAAgB,aAAa,eAEvB,aAAa,QAKb,IAAI,CAAC,SAAS;AAAA,QACd,SAAS,IAAI;AAAA,QACb,MAAM,IAAI;AAAA,QACV,aAAa,IAAI;AAAA,MACnB,EAAE,IACF,CAAC;AAAA,IACT;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA,eAAe,KAAK,QAAQ;AAAA,IAC9B;AAAA,EACF;AAAA,EAEQ,mBACN,eACA,cAIA,gBAA6B,QACN;AACvB,UAAM,cAAc,kBAAkB,EAAE,IAAI,CAAC,UAAU;AAAA,MACrD,OAAO,KAAK;AAAA,MACZ,MAAM,KAAK;AAAA,MACX,aAAa,KAAK,eAAe;AAAA,IACnC,EAAE;AAEF,UAAM,gBAAuC;AAAA,MAC3C;AAAA,QACE,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,cAAc;AAAA,QACd,SAAS;AAAA,QACT,UAAU;AAAA,QACV,aACE;AAAA,MACJ;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,cAAc,aAAa;AAAA,QAC3B,SAAS,aAAa;AAAA,QACtB,UAAU;AAAA,QACV,aAAa;AAAA,MACf;AAAA,IACF;AAEA,UAAM,gBAAgB,iBAAiB,aAAa,cAAc;AAClE,QAAI,eAAe;AACjB,oBAAc,KAAK;AAAA,QACjB,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,cAAc;AAAA,QACd,SAAS;AAAA,QACT,UAAU;AAAA,QACV,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,0BAA0B,SAAuB;AACvD,UAAM,gBAAgB,iBAAiB,OAAO;AAC9C,UAAM,iBAAiB,KAAK,QAAQ,cAAc;AAAA,MAChD,CAAC,MAAM,EAAE,OAAO;AAAA,IAClB;AAEA,QAAI,CAAC,eAAe;AAClB,WAAK,QAAQ,gBAAgB,KAAK,QAAQ,cAAc;AAAA,QACtD,CAAC,MAAM,EAAE,OAAO;AAAA,MAClB;AACA,UAAI,KAAK,QAAQ,QAAQ;AACvB,aAAK,QAAQ,SAAS;AACtB,aAAK,QAAQ,aAAa,SAAS;AACnC,aAAK,KAAK,QAAQ,MAAM,kBAAkB;AAAA,UACxC,aAAa;AAAA,QACf,CAAC;AAAA,MACH;AACA;AAAA,IACF;AAEA,UAAM,kBAAkB,gBAAgB;AACxC,UAAM,eACJ,OAAO,oBAAoB,WAAW,kBAAkB;AAC1D,UAAM,eAAe,cAAc,KAAK,CAAC,MAAM,EAAE,UAAU,YAAY;AACvE,UAAM,gBAAgB,eAAe,eAAe;AAEpD,QAAI,kBAAkB,gBAAgB,KAAK,QAAQ,QAAQ;AACzD,WAAK,QAAQ,SAAS;AACtB,WAAK,QAAQ,aAAa,SAAS;AACnC,WAAK,KAAK,QAAQ,MAAM,kBAAkB;AAAA;AAAA,QAExC,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AAEA,UAAM,eAAoC;AAAA,MACxC,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,cAAc;AAAA,MACd,SAAS;AAAA,MACT,UAAU;AAAA,MACV,aAAa;AAAA,IACf;AAEA,QAAI,gBAAgB;AAClB,WAAK,QAAQ,gBAAgB,KAAK,QAAQ,cAAc;AAAA,QAAI,CAAC,MAC3D,EAAE,OAAO,WAAW,eAAe;AAAA,MACrC;AAAA,IACF,OAAO;AACL,WAAK,QAAQ,cAAc,KAAK,YAAY;AAAA,IAC9C;AAAA,EACF;AAAA,EAEA,MAAc,8BAA6C;AACzD,UAAM,WAAW,MAAM,KAAK,QAAQ,MAAM,kBAAkB;AAC5D,UAAM,KAAK,OAAO,cAAc;AAAA,MAC9B,WAAW,KAAK;AAAA,MAChB,QAAQ;AAAA,QACN,eAAe;AAAA,QACf,mBAAmB,0BAA0B,QAAQ;AAAA,MACvD;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,qBAAqB,WAAkC;AACnE,QAAI;AACF,YAAM,WAAW,MAAM,mBAAmB,WAAW;AAAA,QACnD,KAAK,KAAK,QAAQ;AAAA,MACpB,CAAC;AAED,YAAM,gBAAgB;AAAA,QACpB,SAAS,KAAK;AAAA,QACd;AAAA,QACA,QAAQ,KAAK;AAAA,QACb,cAAc,KAAK;AAAA,QACnB,kBAAkB,KAAK;AAAA,QACvB,mBAAmB,KAAK;AAAA,QACxB,QAAQ,KAAK;AAAA,QACb,eAAe;AAAA,MACjB;AAEA,iBAAW,OAAO,UAAU;AAC1B,cAAM,aAAa;AAAA,UACjB,MAAM,IAAI;AAAA,UACV,SAAS,IAAI;AAAA,UAIb,oBAAoB,IAAI;AAAA,QAC1B;AACA,cAAM;AAAA,UACJ;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAASF,MAAK;AACZ,WAAK,OAAO,KAAK,oCAAoC;AAAA,QACnD;AAAA,QACA,OAAOA,gBAAe,QAAQA,KAAI,UAAU,OAAOA,IAAG;AAAA,MACxD,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,uBAAuB,GAAgB;AAC7C,YAAQ,IAAI;AAAA,MACV,IAAI,QAAc,CAACD,aAAY,WAAWA,UAAS,EAAE,CAAC,EAAE;AAAA,QAAK,MAC3D,KAAK,4BAA4B;AAAA,MACnC;AAAA,MACA,qBAAqB,GAAG,KAAK,MAAM,EAAE,KAAK,MAAM;AAC9C,cAAM,cAAc,2BAA2B;AAC/C,YAAI,YAAY,SAAS,GAAG;AAC1B,eAAK,SAAS,oBAAoB,WAAW;AAAA,QAC/C;AAAA,MACF,CAAC;AAAA,IACH,CAAC,EAAE;AAAA,MAAM,CAACC,SACR,KAAK,OAAO,MAAM,2BAA2B,EAAE,OAAOA,KAAI,CAAC;AAAA,IAC7D;AAAA,EACF;AAAA,EAEA,MAAc,qBAAqB,QAAsC;AACvE,eAAW,SAAS,OAAO,QAAQ;AACjC,YAAM,eAAe;AAAA,QACnB,WAAW,OAAO;AAAA,QAClB,QAAQ;AAAA,UACN,eAAe;AAAA,UACf,SAAS;AAAA,QACX;AAAA,MACF;AACA,YAAM,KAAK,OAAO,cAAc,YAAY;AAC5C,WAAK,mBAAmB,OAAO,WAAW,YAAY;AAAA,IACxD;AAAA,EACF;AACF;;;AyCnhDA;AAAA,EAGE;AAAA,EAYA;AAAA,EAGA,gBAAAG;AAAA,OAOK;;;ACUP,IAAM,sBAA6D;AAAA,EACjE,SAAS,oBAAI,IAAI,CAAC,QAAQ,UAAU,SAAS,OAAO,CAAC;AAAA,EACrD,aAAa,oBAAI,IAAI,CAAC,QAAQ,QAAQ,UAAU,SAAS,OAAO,CAAC;AAAA,EACjE,MAAM,oBAAI,IAAI,CAAC,QAAQ,UAAU,SAAS,OAAO,CAAC;AAAA,EAClD,mBAAmB,oBAAI,IAAI;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAAA,EACD,MAAM,oBAAI,IAAI,CAAC,QAAQ,UAAU,SAAS,OAAO,CAAC;AAAA,EAClD,aAAa,oBAAI,IAAI,CAAC,QAAQ,UAAU,SAAS,OAAO,CAAC;AAAA,EACzD,eAAe,oBAAI,IAAI;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEA,SAAS,kBACP,MACA,MACS;AACT,MAAI,SAAS,uBAAuB,SAAS,cAAe,QAAO;AACnE,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,oBAAoB,IAAI,GAAG,IAAI,IAAI,KAAK;AACjD;AAMO,SAAS,kBACd,gBACA,QACA,cACA,WACQ;AACR,QAAM,kBAAkB,oBAAI,IAA4B;AAExD,SAAO;AAAA,IACL,MAAM,kBACJ,QACoC;AACpC,YAAM,OAAO,OAAO,UAAU;AAE9B,UAAI,kBAAkB,aAAa,gBAAgB,IAAI,GAAG;AACxD,eAAO,MAAM,6BAA6B;AAAA,UACxC,MAAM,aAAa;AAAA,UACnB;AAAA,UACA,YAAY,OAAO,UAAU;AAAA,QAC/B,CAAC;AACD,cAAM,cAAc,OAAO,SAAS;AAAA,UAClC,CAAC,MAAM,EAAE,SAAS,gBAAgB,EAAE,SAAS;AAAA,QAC/C;AACA,eAAO;AAAA,UACL,SAAS;AAAA,YACP,SAAS;AAAA,YACT,UAAU,aAAa,YAAY;AAAA,UACrC;AAAA,QACF;AAAA,MACF;AAEA,aAAO,eAAe,kBAAkB,MAAM;AAAA,IAChD;AAAA,IAEA,MAAM,cAAc,QAA4C;AAC9D,YAAM,SAAS,OAAO;AACtB,UAAI,QAAQ,kBAAkB,gBAAgB;AAC5C,cAAM,OAAO,OAAO;AACpB,cAAM,OAAO,OAAO;AACpB,YAAI,SAAS,OAAW,cAAa,cAAc;AACnD,YAAI,SAAS,OAAW,cAAa,cAAc;AAGnD,cAAM,cAAc,OAAO;AAC3B,cAAM,eAAe,OAAO;AAC5B,YAAI,gBAAgB,QAAW;AAC7B,uBAAa,iBAAiB,eAAe;AAAA,QAC/C;AACA,YAAI,iBAAiB,QAAW;AAC9B,uBAAa,iBAAiB,gBAAgB;AAAA,QAChD;AACA,cAAM,aAAa,OAAO;AAC1B,cAAM,cAAc,OAAO;AAC3B,YAAI,eAAe,QAAW;AAC5B,uBAAa,iBAAiB,oBAAoB;AAAA,QACpD;AACA,YAAI,gBAAgB,QAAW;AAC7B,uBAAa,iBAAiB,qBAAqB;AAAA,QACrD;AAEA,mBAAW,gBAAgB,MAAM;AAAA,MACnC;AAEA,YAAM,eAAe,cAAc,MAAM;AAAA,IAC3C;AAAA,IAEA,MAAM,aACJ,QAC+B;AAC/B,YAAM,WAAW,MAAM,eAAe,aAAa,MAAM;AACzD,UAAI,CAAC,WAAW,eAAgB,QAAO;AACvC,YAAM,WAAW,MAAM;AAAA,QACrB,UAAU;AAAA,QACV,OAAO;AAAA,QACP,SAAS;AAAA,MACX;AACA,aAAO,WAAW,EAAE,GAAG,UAAU,SAAS,SAAS,IAAI;AAAA,IACzD;AAAA,IAEA,MAAM,cACJ,QACgC;AAChC,aAAO,eAAe,cAAc,MAAM;AAAA,IAC5C;AAAA,IAEA,MAAM,eACJ,QACiC;AACjC,YAAMC,UAAS,MAAM,eAAe,eAAe,MAAM;AACzD,sBAAgB,IAAIA,QAAO,IAAIA,OAAM;AACrC,aAAO,EAAE,YAAYA,QAAO,GAAG;AAAA,IACjC;AAAA,IAEA,MAAM,eACJ,QACiC;AACjC,YAAMA,UAAS,gBAAgB,IAAI,OAAO,UAAU;AACpD,UAAI,CAACA,SAAQ;AACX,eAAO,EAAE,QAAQ,IAAI,WAAW,MAAM;AAAA,MACxC;AACA,aAAOA,QAAO,cAAc;AAAA,IAC9B;AAAA,IAEA,MAAM,gBACJ,QAC8C;AAC9C,YAAMA,UAAS,gBAAgB,IAAI,OAAO,UAAU;AACpD,UAAIA,SAAQ;AACV,wBAAgB,OAAO,OAAO,UAAU;AACxC,cAAM,SAAS,MAAMA,QAAO,QAAQ;AACpC,eAAO,UAAU;AAAA,MACnB;AAAA,IACF;AAAA,IAEA,MAAM,oBACJ,QACsC;AACtC,YAAMA,UAAS,gBAAgB,IAAI,OAAO,UAAU;AACpD,UAAI,CAACA,SAAQ;AACX,eAAO,EAAE,UAAU,EAAE;AAAA,MACvB;AACA,aAAOA,QAAO,YAAY;AAAA,IAC5B;AAAA,IAEA,MAAM,aACJ,QAC2C;AAC3C,YAAMA,UAAS,gBAAgB,IAAI,OAAO,UAAU;AACpD,UAAIA,SAAQ;AACV,eAAOA,QAAO,KAAK;AAAA,MACrB;AAAA,IACF;AAAA,IAEA,MAAM,UACJ,QACA,QACkC;AAClC,aAAO,eAAe,UAAU,QAAQ,MAAM;AAAA,IAChD;AAAA,IAEA,MAAM,gBACJ,QACA,QACe;AACf,aAAO,eAAe,gBAAgB,QAAQ,MAAM;AAAA,IACtD;AAAA,EACF;AACF;;;ACjNO,SAAS,mBACd,WACA,KACA,MAOmB;AACnB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,QAAQ,MAAM,UAAU;AAAA,IACxB,SAAS,MAAM;AAAA,IACf,eAAe,CAAC;AAAA,IAChB,kBAAkB;AAAA,MAChB,aAAa;AAAA,MACb,cAAc;AAAA,MACd,kBAAkB;AAAA,MAClB,mBAAmB;AAAA,IACrB;AAAA,IACA,gBAAgB,MAAM,kBAAkB;AAAA,IACxC,WAAW,MAAM;AAAA,IACjB,QAAQ,MAAM;AAAA,EAChB;AACF;AAEO,SAAS,WAAW,OAAgC;AACzD,QAAM,mBAAmB;AAAA,IACvB,aAAa;AAAA,IACb,cAAc;AAAA,IACd,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,EACrB;AACF;;;ACjEA,YAAYC,SAAQ;AACpB,YAAYC,SAAQ;AACpB,YAAYC,YAAU;AAwBf,IAAM,uBAAN,MAA2B;AAAA,EACxB;AAAA,EACA,WAA0B,EAAE,gBAAgB,CAAC,EAAE;AAAA,EAEvD,YAAY,KAAa;AACvB,SAAK,MAAM;AACX,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,MAAM,aAA4B;AAAA,EAGlC;AAAA,EAEQ,gBAAwB;AAC9B,WAAY,YAAQ,YAAQ,GAAG,UAAU,aAAa;AAAA,EACxD;AAAA,EAEQ,eAAqB;AAC3B,UAAM,aAAa,KAAK,cAAc;AACtC,QAAI;AACF,YAAM,UAAa,iBAAa,YAAY,OAAO;AACnD,WAAK,WAAW,eAAe,SAAS,KAAK,GAAG;AAAA,IAClD,QAAQ;AACN,WAAK,WAAW,EAAE,gBAAgB,CAAC,EAAE;AAAA,IACvC;AAAA,EACF;AAAA,EAEA,cAA6B;AAC3B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,SAAiB;AACf,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,OAAO,KAA4B;AACvC,QAAI,KAAK,QAAQ,IAAK;AACtB,SAAK,MAAM;AACX,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,UAAgB;AAAA,EAEhB;AACF;AAOA,SAAS,eAAe,SAAiB,KAA4B;AACnE,QAAM,WAA0B,EAAE,gBAAgB,CAAC,EAAE;AACrD,QAAM,iBAAiB,oBAAI,IAAY;AACvC,MAAI,iBAAiB;AAErB,aAAW,QAAQ,QAAQ,MAAM,IAAI,GAAG;AACtC,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,CAAC,WAAW,QAAQ,WAAW,GAAG,EAAG;AAGzC,UAAM,eAAe,QAAQ,MAAM,YAAY;AAC/C,QAAI,cAAc;AAChB,uBAAiB,aAAa,CAAC,KAAK;AACpC,UAAI,eAAe,WAAW,cAAc,GAAG;AAC7C,uBAAe,IAAI,eAAe,MAAM,eAAe,MAAM,CAAC;AAAA,MAChE;AACA;AAAA,IACF;AAGA,UAAM,UAAU,QAAQ,MAAM,oBAAoB;AAClD,QAAI,CAAC,QAAS;AAEd,UAAM,MAAM,QAAQ,CAAC;AACrB,QAAI,QAAQ,QAAQ,CAAC,GAAG,KAAK,KAAK;AAGlC,QACG,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,KAC3C,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,GAC5C;AACA,cAAQ,MAAM,MAAM,GAAG,EAAE;AAAA,IAC3B;AAEA,QAAI,CAAC,gBAAgB;AAEnB,UAAI,QAAQ,QAAS,UAAS,QAAQ;AACtC,UAAI,QAAQ,cAAe,UAAS,cAAc;AAClD,UAAI,QAAQ;AACV,iBAAS,uBAAuB;AAAA,IACpC,WAAW,mBAAmB,aAAa,GAAG,KAAK;AAEjD,UAAI,QAAQ,cAAe,UAAS,aAAa;AAAA,IACnD;AAAA,EACF;AAEA,WAAS,iBAAiB,MAAM,KAAK,cAAc;AACnD,SAAO;AACT;;;AC9HA,SAA4B,SAAAC,cAAa;AACzC,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,WAAW,WAAAC,gBAAe;AA0BnC,SAAS,gBAAgB,SAAwC;AAC/D,QAAMC,QAAiB,CAAC;AAExB,EAAAA,MAAK,KAAK,MAAM,8BAA8B;AAK9C,aAAWC,SAAQ,QAAQ,UAAU,kBAAkB,CAAC,GAAG;AACzD,IAAAD,MAAK,KAAK,MAAM,eAAeC,KAAI,gBAAgB;AAAA,EACrD;AAEA,MAAI,QAAQ,YAAY;AACtB,IAAAD,MAAK,KAAK,MAAM,0BAA0B;AAC1C,IAAAA,MAAK,KAAK,MAAM,gDAAgD;AAChE,IAAAA,MAAK,KAAK,MAAM,qCAAqC,QAAQ,UAAU,GAAG;AAC1E,IAAAA,MAAK,KAAK,MAAM,8CAA8C;AAC9D,IAAAA,MAAK;AAAA,MACH;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ,OAAO;AACjB,IAAAA,MAAK,KAAK,MAAM,UAAU,QAAQ,KAAK,GAAG;AAAA,EAC5C;AAEA,MAAI,QAAQ,iBAAiB;AAC3B,IAAAA,MAAK,KAAK,MAAM,2BAA2B,QAAQ,eAAe,GAAG;AAAA,EACvE;AAEA,MAAI,QAAQ,cAAc;AACxB,UAAM,UAAU,QAAQ,aACrB,QAAQ,OAAO,MAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,MAAM,KAAK;AACtB,IAAAA,MAAK,KAAK,MAAM,iBAAiB,OAAO,GAAG;AAAA,EAC7C;AAEA,SAAOA;AACT;AAEA,SAAS,gBAAgB,SAGvB;AACA,QAAM,aAAa,gBAAgB,OAAO;AAE1C,MAAI,QAAQ,cAAcE,YAAW,QAAQ,UAAU,GAAG;AACxD,WAAO,EAAE,SAAS,QAAQ,YAAY,MAAM,WAAW;AAAA,EACzD;AAEA,MAAI,QAAQ,YAAY;AACtB,UAAM,IAAI;AAAA,MACR,iCAAiC,QAAQ,UAAU;AAAA,IACrD;AAAA,EACF;AAEA,SAAO,EAAE,SAAS,OAAO,MAAM,CAAC,6BAA6B,GAAG,UAAU,EAAE;AAC9E;AAEO,SAAS,kBAAkB,SAA4C;AAC5E,QAAM,SACJ,QAAQ,UAAU,IAAI,OAAO,EAAE,OAAO,MAAM,QAAQ,eAAe,CAAC;AAEtE,QAAM,MAAyB,EAAE,GAAG,QAAQ,IAAI;AAEhD,SAAO,IAAI;AACX,SAAO,IAAI;AAEX,MAAI,QAAQ,QAAQ;AAClB,QAAI,0BAA0B,QAAQ;AAAA,EACxC;AAEA,QAAM,EAAE,SAAS,MAAAF,MAAK,IAAI,gBAAgB,OAAO;AAEjD,MAAI,QAAQ,cAAcE,YAAW,QAAQ,UAAU,GAAG;AACxD,UAAM,SAASC,SAAQ,QAAQ,UAAU;AACzC,QAAI,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI,QAAQ,EAAE;AAAA,EACnD;AAEA,SAAO,KAAK,8BAA8B;AAAA,IACxC;AAAA,IACA,MAAAH;AAAA,IACA,KAAK,QAAQ;AAAA,IACb,eAAe,CAAC,CAAC,QAAQ;AAAA,IACzB,WAAW,CAAC,CAAC,QAAQ;AAAA,IACrB,YAAY,QAAQ;AAAA,EACtB,CAAC;AAED,QAAM,QAAQI,OAAM,SAASJ,OAAM;AAAA,IACjC,KAAK,QAAQ;AAAA,IACb;AAAA,IACA,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,IAC9B,UAAU,QAAQ,aAAa;AAAA,EACjC,CAAC;AAED,QAAM,QAAQ,GAAG,QAAQ,CAAC,SAAiB;AACzC,WAAO,KAAK,qBAAqB,KAAK,SAAS,CAAC;AAAA,EAClD,CAAC;AAED,QAAM,GAAG,SAAS,CAACK,SAAQ;AACzB,WAAO,MAAM,4BAA4BA,IAAG;AAAA,EAC9C,CAAC;AAED,QAAM,GAAG,QAAQ,CAAC,MAAM,WAAW;AACjC,WAAO,KAAK,4BAA4B,EAAE,MAAM,OAAO,CAAC;AACxD,QAAI,MAAM,OAAO,QAAQ,kBAAkB,iBAAiB;AAC1D,cAAQ,iBAAiB,gBAAgB,MAAM,GAAG;AAAA,IACpD;AAAA,EACF,CAAC;AAED,MAAI,CAAC,MAAM,SAAS,CAAC,MAAM,QAAQ;AACjC,UAAM,IAAI,MAAM,oDAAoD;AAAA,EACtE;AAEA,MAAI,MAAM,OAAO,QAAQ,kBAAkB,kBAAkB;AAC3D,YAAQ,iBAAiB,iBAAiB;AAAA,MACxC,KAAK,MAAM;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,OAAO,MAAM;AAAA,IACb,QAAQ,MAAM;AAAA,IACd,MAAM,MAAM;AACV,aAAO,KAAK,6BAA6B,EAAE,KAAK,MAAM,IAAI,CAAC;AAC3D,YAAM,OAAO,QAAQ;AACrB,YAAM,QAAQ,QAAQ;AACtB,YAAM,QAAQ,QAAQ;AACtB,YAAM,KAAK,SAAS;AAAA,IACtB;AAAA,EACF;AACF;;;AJhEA,SAAS,sBAAsB,MAA+B;AAC5D,MAAI,SAAS,kBAAkB,IAAI,KAAK,oBAAoB,IAAI,IAAI;AAClE,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAQA,SAAS,iBAAiB,QAAsC;AAC9D,QAAM,YAAa,OAAO,OACtB;AACJ,MAAI,OAAO,cAAc,YAAY,UAAU,WAAW,GAAG;AAC3D,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QAAQ,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAU,GAAG,GAAG,OAAO,MAAM;AAAA,EAC9D;AACF;AAEA,IAAM,oBAAgE;AAAA,EACpE,MAAM;AAAA,EACN,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,EACN,mBAAmB;AACrB;AAEA,SAAS,kBAAkB,MAAgC;AACzD,MAAI,QAAQ,kBAAkB,IAAI,GAAG;AACnC,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,oBAAoB,IAAI,GAAG;AACrC,WAAO,kBAAkB,IAAI;AAAA,EAC/B;AACA,SAAO;AACT;AAEA,SAAS,yBACP,eACA,cACgB;AAChB,MAAI,iBAAiB,kBAAkB,aAAa,GAAG;AACrD,WAAO;AAAA,EACT;AAEA,SAAO,sBAAsB,YAAY;AAC3C;AAEO,IAAM,gBAAN,cAA4B,aAAa;AAAA,EACrC,cAAc;AAAA,EAEf;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,cAAgC,QAAQ,QAAQ;AAAA,EACvC;AAAA,EACA;AAAA;AAAA;AAAA,EAGT;AAAA,EACA;AAAA,EAER,YAAY,QAA6B,SAA+B;AACtE,UAAM,MAAM;AACZ,SAAK,SAAS,IAAI,OAAO,EAAE,OAAO,MAAM,QAAQ,kBAAkB,CAAC;AAInE,UAAM,MAAM,QAAQ,oBAAoB,OAAO,QAAQ,IAAI;AAC3D,UAAM,kBAAkB,IAAI,qBAAqB,GAAG;AAEpD,SAAK,sBAAsB,QAAQ;AACnC,SAAK,mBAAmB,QAAQ;AAGhC,SAAK,eAAe,kBAAkB;AAAA,MACpC,GAAG,QAAQ;AAAA,MACX,UAAU,gBAAgB,YAAY;AAAA,MACtC,QAAQ,KAAK;AAAA,MACb,kBAAkB,QAAQ;AAAA,IAC5B,CAAC;AAGD,UAAM,gBAAgB,0BAA0B,KAAK,aAAa,MAAM;AACxE,UAAM,gBAAgB,0BAA0B,KAAK,aAAa,KAAK;AACvE,UAAM,cAAc,aAAa,eAAe,aAAa;AAE7D,UAAM,kBAAkB,IAAI,gBAAgB;AAC5C,SAAK,UAAU;AAAA,MACb;AAAA,MACA;AAAA,MACA,qBAAqB,CAAC;AAAA,MACtB,WAAW;AAAA,MACX,eAAe;AAAA,IACjB;AAEA,SAAK,eAAe,mBAAmB,IAAI,GAAG;AAE9C,SAAK,aAAa,iBAAiB,QAAQ,kBAAkB,KAAK,MAAM;AAKxE,SAAK,kBAAkB,IAAI;AAAA,MACzB,CAAC,WACC,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,cAAc;AAAA,QAC7D,gBAAgB,KAAK,YAAY;AAAA,MACnC,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,SAAyD;AAExE,UAAM,KAAK,QAAQ,gBAAgB,WAAW;AAG9C,SAAK,kBAAkB;AAGvB,UAAM,WAAW,MAAM,KAAK,gBAAgB,WAAW,OAAO;AAG9D,WAAO;AAAA,MACL,GAAG;AAAA,MACH,mBAAmB;AAAA,QACjB,GAAG,SAAS;AAAA,QACZ,qBAAqB;AAAA,UACnB,GAAG,SAAS,mBAAmB;AAAA,UAC/B,QAAQ,CAAC;AAAA,UACT,MAAM,CAAC;AAAA,QACT;AAAA,QACA,OAAO;AAAA,UACL,SAAS;AAAA,YACP,eAAe;AAAA,UACjB;AAAA,QACF;AAAA,MACF;AAAA,MACA,WAAW;AAAA,QACT,MAAM,gBAAY;AAAA,QAClB,OAAO;AAAA,QACP,SAAS,gBAAY;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,QAAwD;AACvE,UAAM,OAAO,OAAO;AACpB,UAAM,0BAA0B,sBAAsB,MAAM,cAAc;AAE1E,UAAM,WAAW,MAAM,KAAK,gBAAgB,WAAW,MAAM;AAG7D,SAAK,eAAe,mBAAmB,SAAS,WAAW,OAAO,KAAK;AAAA,MACrE,WAAW,MAAM;AAAA,MACjB,QAAQ,MAAM,UAAU,MAAM,aAAa;AAAA,MAC3C,QAAQ,SAAS,OAAO,iBAAiB;AAAA,MACzC,SAAS,SAAS,QAAQ;AAAA,MAC1B,gBAAgB;AAAA,IAClB,CAAC;AACD,SAAK,YAAY,SAAS;AAC1B,SAAK,aAAa,gBAAgB,SAAS,iBAAiB,CAAC;AAE7D,UAAM,KAAK;AAAA,MACT,SAAS;AAAA,MACT,MAAM;AAAA,MACN,SAAS,OAAO;AAAA,IAClB;AAGA,QAAI,MAAM,WAAW;AACnB,YAAM,KAAK,OAAO,gBAAgB,sBAAsB,aAAa;AAAA,QACnE,WAAW,KAAK;AAAA,QAChB,WAAW,SAAS;AAAA,QACpB,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,SAAK,OAAO,KAAK,yBAAyB;AAAA,MACxC,WAAW,SAAS;AAAA,MACpB,WAAW,MAAM;AAAA,IACnB,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,YAAY,QAA0D;AAC1E,UAAM,WAAW,MAAM,KAAK,gBAAgB,YAAY,MAAM;AAC9D,UAAM,OAAO,OAAO;AACpB,UAAM,wBAAwB;AAAA,MAC5B,SAAS,OAAO;AAAA,MAChB,MAAM;AAAA,IACR;AAMA,SAAK,eAAe,mBAAmB,OAAO,WAAW,OAAO,KAAK;AAAA,MACnE,WAAW,MAAM;AAAA,MACjB,QAAQ,MAAM,UAAU,MAAM,aAAa;AAAA,MAC3C,QAAQ,SAAS,OAAO,iBAAiB;AAAA,MACzC,gBAAgB;AAAA,IAClB,CAAC;AACD,SAAK,YAAY,OAAO;AACxB,SAAK,aAAa,gBAAgB,SAAS,iBAAiB,CAAC;AAE7D,QAAI,MAAM,WAAW;AACnB,YAAM,KAAK,OAAO,gBAAgB,sBAAsB,aAAa;AAAA,QACnE,WAAW,KAAK;AAAA,QAChB,WAAW,OAAO;AAAA,QAClB,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,uBACJ,QACgC;AAEhC,UAAM,eAAe,MAAM,KAAK,gBAAgB,YAAY;AAAA,MAC1D,WAAW,OAAO;AAAA,MAClB,KAAK,OAAO;AAAA,MACZ,YAAY,OAAO,cAAc,CAAC;AAAA,IACpC,CAAC;AAED,UAAM,OAAO,OAAO;AACpB,UAAM,wBAAwB;AAAA,MAC5B,aAAa,OAAO;AAAA,MACpB,MAAM;AAAA,IACR;AACA,SAAK,eAAe,mBAAmB,OAAO,WAAW,OAAO,KAAK;AAAA,MACnE,WAAW,MAAM;AAAA,MACjB,QAAQ,MAAM,UAAU,MAAM,aAAa;AAAA,MAC3C,QAAQ,aAAa,OAAO,iBAAiB;AAAA,MAC7C,gBAAgB;AAAA,IAClB,CAAC;AACD,SAAK,YAAY,OAAO;AACxB,SAAK,aAAa,gBAAgB,aAAa,iBAAiB,CAAC;AAEjE,QAAI,MAAM,WAAW;AACnB,YAAM,KAAK,OAAO,gBAAgB,sBAAsB,aAAa;AAAA,QACnE,WAAW,KAAK;AAAA,QAChB,WAAW,OAAO;AAAA,QAClB,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,MACL,OAAO,aAAa;AAAA,MACpB,QAAQ,aAAa;AAAA,MACrB,eAAe,aAAa;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,MAAM,qBACJ,QAC8B;AAE9B,UAAM,cAAc,MAAM,KAAK,gBAAgB,WAAW;AAAA,MACxD,KAAK,OAAO;AAAA,MACZ,YAAY,OAAO,cAAc,CAAC;AAAA,MAClC,OAAO,OAAO;AAAA,IAChB,CAAC;AAED,UAAM,OAAO,OAAO;AACpB,UAAM,0BAA0B,sBAAsB,MAAM,cAAc;AAC1E,SAAK,eAAe,mBAAmB,YAAY,WAAW,OAAO,KAAK;AAAA,MACxE,WAAW,MAAM;AAAA,MACjB,QAAQ,MAAM,UAAU,MAAM,aAAa;AAAA,MAC3C,QAAQ,YAAY,OAAO,iBAAiB;AAAA,MAC5C,gBAAgB;AAAA,IAClB,CAAC;AACD,SAAK,YAAY,YAAY;AAC7B,SAAK,aAAa,gBAAgB,YAAY,iBAAiB,CAAC;AAEhE,UAAM,KAAK;AAAA,MACT,YAAY;AAAA,MACZ,MAAM;AAAA,MACN,YAAY,OAAO;AAAA,IACrB;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,2BACZ,WACA,gBACA,eACe;AACf,QAAI,CAAC,gBAAgB;AACnB;AAAA,IACF;AAEA,UAAM,aAAa,kBAAkB,cAAc;AACnD,QAAI,eAAe,eAAe;AAChC,WAAK,aAAa,SAAS;AAC3B,WAAK,aAAa,iBAAiB,sBAAsB,cAAc;AACvE;AAAA,IACF;AAEA,UAAM,KAAK,gBAAgB,eAAe;AAAA,MACxC;AAAA,MACA,QAAQ;AAAA,IACV,CAAC;AACD,SAAK,aAAa,SAAS;AAC3B,SAAK,aAAa,iBAAiB,sBAAsB,cAAc;AAAA,EACzE;AAAA,EAEA,MAAM,aACJ,QAC+B;AAC/B,WAAO,KAAK,gBAAgB,aAAa,MAAM;AAAA,EACjD;AAAA,EAEA,MAAM,sBACJ,QAC+B;AAC/B,WAAO,KAAK,aAAa,MAAM;AAAA,EACjC;AAAA,EAEA,MAAM,OAAO,QAAgD;AAC3D,UAAM,WAAW,KAAK;AACtB,UAAM,OAAO,SAAS,MAAM,MAAM;AAAA,IAAC,CAAC,EAAE,KAAK,MAAM,KAAK,UAAU,MAAM,CAAC;AACvE,SAAK,cAAc;AACnB,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,UAAU,QAAgD;AACtE,SAAK,QAAQ,YAAY;AACzB,SAAK,QAAQ,kBAAkB;AAC/B,eAAW,KAAK,YAAY;AAQ5B,UAAM,KAAK,qBAAqB,MAAM;AAEtC,SAAK,QAAQ,gBAAgB;AAC7B,QAAI;AACJ,QAAI;AACF,iBAAW,MAAM,KAAK,gBAAgB,OAAO,iBAAiB,MAAM,CAAC;AAAA,IACvE,UAAE;AACA,WAAK,QAAQ,gBAAgB;AAAA,IAC/B;AAMA,QAAI,KAAK,aAAa,WAAW;AAC/B,YAAM,EAAE,iBAAiB,IAAI,KAAK;AAElC,YAAM,KAAK,OAAO,gBAAgB,sBAAsB,eAAe;AAAA,QACrE,WAAW,OAAO;AAAA,QAClB,YAAY,SAAS,cAAc;AAAA,QACnC,OAAO;AAAA,UACL,aAAa,iBAAiB;AAAA,UAC9B,cAAc,iBAAiB;AAAA,UAC/B,kBAAkB,iBAAiB;AAAA,UACnC,mBAAmB,iBAAiB;AAAA,UACpC,aACE,iBAAiB,cACjB,iBAAiB,eACjB,iBAAiB,mBACjB,iBAAiB;AAAA,QACrB;AAAA,MACF,CAAC;AAED,UAAI,SAAS,OAAO;AAClB,cAAM,KAAK,OAAO,gBAAgB,sBAAsB,cAAc;AAAA,UACpE,WAAW,OAAO;AAAA,UAClB,MAAM;AAAA,YACJ,aAAa,SAAS,MAAM,eAAe;AAAA,YAC3C,cAAc,SAAS,MAAM,gBAAgB;AAAA,YAC7C,kBAAkB,SAAS,MAAM,oBAAoB;AAAA,YACrD,mBAAmB,SAAS,MAAM,qBAAqB;AAAA,UACzD;AAAA,UACA,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAgB,YAA2B;AACzC,UAAM,KAAK,gBAAgB,OAAO;AAAA,MAChC,WAAW,KAAK;AAAA,IAClB,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,qBAAqB,QAAsC;AACvE,eAAW,SAAS,OAAO,QAAQ;AACjC,YAAM,eAAe;AAAA,QACnB,WAAW,OAAO;AAAA,QAClB,QAAQ;AAAA,UACN,eAAe;AAAA,UACf,SAAS;AAAA,QACX;AAAA,MACF;AACA,YAAM,KAAK,OAAO,cAAc,YAAY;AAC5C,WAAK,mBAAmB,OAAO,WAAW,YAAY;AAAA,IACxD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM,UACJ,QACA,QACkC;AAClC,QAAI,CAAC,SAAS,QAAQ,gBAAgB,eAAe,GAAG;AACtD,YAAMC,cAAa,eAAe,MAAM;AAAA,IAC1C;AAMA,QAAI,OAAO,eAAe,QAAW;AACnC,YAAM,IAAIA;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,QAAI,CAAC,MAAM,QAAQ,OAAO,UAAU,GAAG;AACrC,YAAM,IAAIA;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,KAAK,eAAe,OAAO,UAAyB;AAC1D,WAAO,EAAE,WAAW,KAAK;AAAA,EAC3B;AAAA,EAEA,MAAc,eAAe,YAAwC;AACnE,UAAM,OAAO,KAAK;AAClB,QAAI,KAAK,eAAe;AACtB,YAAM,IAAIA;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,SAAK,OAAO,KAAK,mDAAmD;AAAA,MAClE,aAAa,WAAW;AAAA,MACxB,WAAW,KAAK;AAAA,IAClB,CAAC;AAID,SAAK,gBAAgB,MAAM;AAC3B,QAAI;AACF,YAAM,KAAK,gBAAgB,OAAO,EAAE,WAAW,KAAK,UAAU,CAAC;AAAA,IACjE,SAASC,MAAK;AACZ,WAAK,OAAO,KAAK,8CAA8C;AAAA,QAC7D,OAAOA;AAAA,MACT,CAAC;AAAA,IACH;AACA,SAAK,aAAa,KAAK;AAKvB,UAAM,MAAM,KAAK,gBAAgB,OAAO;AACxC,UAAM,qBAAqB,IAAI,qBAAqB,GAAG;AACvD,UAAM,mBAAmB,WAAW;AAEpC,UAAM,aAAa,kBAAkB;AAAA,MACnC,GAAG,KAAK;AAAA,MACR;AAAA,MACA,UAAU,mBAAmB,YAAY;AAAA,MACzC,QAAQ,KAAK;AAAA,MACb,kBAAkB,KAAK;AAAA,IACzB,CAAC;AAED,UAAM,gBAAgB,0BAA0B,WAAW,MAAM;AACjE,UAAM,gBAAgB,0BAA0B,WAAW,KAAK;AAChE,UAAM,cAAc,aAAa,eAAe,aAAa;AAE7D,UAAM,qBAAqB,IAAI,gBAAgB;AAC/C,UAAM,gBAAgB,IAAI;AAAA,MACxB,CAAC,WACC,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,YAAY;AAAA,MAC/D;AAAA,IACF;AAKA,UAAM,cAAiC,KAAK,mBAAmB;AAAA,MAC7D,iBAAiB;AAAA,IACnB;AACA,UAAM,cAAc,WAAW,WAAW;AAC1C,UAAM,cAAc,YAAY;AAAA,MAC9B,WAAW,KAAK;AAAA,MAChB,KAAK,KAAK,aAAa;AAAA,MACvB;AAAA,IACF,CAAC;AAKD,SAAK,eAAe;AACpB,SAAK,kBAAkB;AACvB,SAAK,gBAAgB,QAAQ;AAC7B,SAAK,kBAAkB;AACvB,SAAK,kBAAkB;AAAA,EACzB;AAAA,EAEA,MAAM,eACJ,QACiC;AACjC,UAAM,gBAAgB,sBAAsB,OAAO,MAAM;AACzD,UAAM,aAAa,kBAAkB,OAAO,MAAM;AAElD,UAAM,WAAW,MAAM,KAAK,gBAAgB,eAAe;AAAA,MACzD,GAAG;AAAA,MACH,QAAQ;AAAA,IACV,CAAC;AAED,SAAK,aAAa,SAAS;AAC3B,SAAK,aAAa,iBAAiB;AACnC,WAAO,YAAY,CAAC;AAAA,EACtB;AAAA,EAEA,MAAM,uBACJ,QACyC;AACzC,UAAM,WAAW,MAAM,KAAK,gBAAgB,uBAAuB,MAAM;AACzE,QAAI,SAAS,eAAe;AAC1B,WAAK,aAAa,gBAAgB,SAAS;AAAA,IAC7C;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,aAAa,SAA6C;AAAA,EAEhE;AAAA,EAEA,MAAM,eAA8B;AAClC,SAAK,OAAO,KAAK,yBAAyB,EAAE,WAAW,KAAK,UAAU,CAAC;AACvE,SAAK,QAAQ,gBAAgB,MAAM;AACnC,SAAK,QAAQ,gBAAgB,QAAQ;AACrC,QAAI;AACF,WAAK,aAAa,KAAK;AAAA,IACzB,SAASA,MAAK;AACZ,WAAK,OAAO,KAAK,oCAAoC,EAAE,OAAOA,KAAI,CAAC;AAAA,IACrE;AACA,SAAK,YAAY,QAAQ;AACzB,SAAK,aAAa;AAAA,EACpB;AACF;;;A5ChoBO,SAAS,oBACd,SAA8B,CAAC,GAChB;AACf,QAAM,cAAc,OAAO,WAAW;AAEtC,MAAI,gBAAgB,SAAS;AAC3B,WAAO,sBAAsB,MAAM;AAAA,EACrC;AAEA,SAAO,uBAAuB,MAAM;AACtC;AAEA,SAAS,yBACP,QAC8B;AAC9B,QAAM,UAAU,CAAC,CAAC,OAAO,oBAAoB,OAAO,oBAAoB;AACxE,SAAO,UAAU,OAAO,mBAAmB;AAC7C;AAEA,SAAS,uBAAuB,QAA4C;AAC1E,QAAM,SACJ,OAAO,QAAQ,MAAM,eAAe,KACpC,IAAI,OAAO,EAAE,OAAO,MAAM,QAAQ,kBAAkB,CAAC;AACvD,QAAM,UAAU,2BAA2B;AAE3C,QAAM,EAAE,UAAU,IAAI;AAEtB,MAAI,gBAAgB,QAAQ,MAAM;AAClC,MAAI,iBAAiB,QAAQ,OAAO;AAEpC,MAAI,OAAO,aAAa,WAAW;AACjC,QAAI,CAAC,UAAU,aAAa,OAAO,SAAS,GAAG;AAC7C,gBAAU,SAAS,OAAO,WAAW;AAAA,QACnC,QAAQ,OAAO,UAAU,OAAO;AAAA,QAChC,OAAO,OAAO;AAAA,QACd,YAAY,OAAO;AAAA,MACrB,CAAC;AAAA,IACH;AAEA,UAAM,YAAY,OAAO;AACzB,oBAAgB,2BAA2B,QAAQ,MAAM,UAAU;AAAA,MACjE,WAAW,CAAC,SAAS;AACnB,kBAAU,cAAc,WAAW,IAAI;AAAA,MACzC;AAAA,MACA;AAAA,IACF,CAAC;AAED,qBAAiB,2BAA2B,QAAQ,OAAO,UAAU;AAAA,MACnE,WAAW,CAAC,SAAS;AACnB,kBAAU,cAAc,WAAW,IAAI;AAAA,MACzC;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,OAAO;AACL,WAAO,KAAK,8BAA8B;AAAA,MACxC,cAAc,CAAC,CAAC,OAAO;AAAA,MACvB,cAAc,CAAC,CAAC;AAAA,IAClB,CAAC;AAAA,EACH;AAEA,QAAM,cAAcC,cAAa,eAAe,QAAQ,MAAM,QAAQ;AAEtE,MAAI,QAA+B;AACnC,QAAM,kBAAkB,IAAI,oBAAoB,CAAC,WAAW;AAC1D,YAAQ,IAAI,eAAe,QAAQ;AAAA,MACjC,GAAG,OAAO;AAAA,MACV,oBAAoB,OAAO;AAAA,MAC3B,kBAAkB,yBAAyB,MAAM;AAAA,IACnD,CAAC;AACD,WAAO;AAAA,EACT,GAAG,WAAW;AAEd,SAAO;AAAA,IACL;AAAA,IACA,eAAe;AAAA,MACb,UAAU,QAAQ,OAAO;AAAA,MACzB,UAAU;AAAA,IACZ;AAAA,IACA,SAAS,YAAY;AACnB,aAAO,KAAK,4BAA4B;AAExC,UAAI,OAAO;AACT,cAAM,MAAM,aAAa;AAAA,MAC3B;AAEA,UAAI;AACF,cAAM,QAAQ,OAAO,SAAS,MAAM;AAAA,MACtC,QAAQ;AAAA,MAER;AACA,UAAI;AACF,cAAM,QAAQ,MAAM,SAAS,MAAM;AAAA,MACrC,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACF;AAUA,SAAS,sBAAsB,QAA4C;AACzE,QAAM,SACJ,OAAO,QAAQ,MAAM,iBAAiB,KACtC,IAAI,OAAO,EAAE,OAAO,MAAM,QAAQ,oBAAoB,CAAC;AAEzD,QAAM,EAAE,UAAU,IAAI;AAGtB,QAAM,UAAU,2BAA2B;AAE3C,MAAI,gBAAgB,QAAQ,MAAM;AAClC,MAAI,iBAAiB,QAAQ,OAAO;AAGpC,MAAI,OAAO,aAAa,WAAW;AACjC,QAAI,CAAC,UAAU,aAAa,OAAO,SAAS,GAAG;AAC7C,gBAAU,SAAS,OAAO,WAAW;AAAA,QACnC,QAAQ,OAAO,UAAU,OAAO;AAAA,QAChC,OAAO,OAAO;AAAA,QACd,YAAY,OAAO;AAAA,MACrB,CAAC;AAAA,IACH;AAEA,UAAM,YAAY,OAAO;AACzB,oBAAgB,2BAA2B,QAAQ,MAAM,UAAU;AAAA,MACjE,WAAW,CAAC,SAAS;AACnB,kBAAU,cAAc,WAAW,IAAI;AAAA,MACzC;AAAA,MACA;AAAA,IACF,CAAC;AAED,qBAAiB,2BAA2B,QAAQ,OAAO,UAAU;AAAA,MACnE,WAAW,CAAC,SAAS;AACnB,kBAAU,cAAc,WAAW,IAAI;AAAA,MACzC;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,OAAO;AACL,WAAO,KAAK,wCAAwC;AAAA,MAClD,cAAc,CAAC,CAAC,OAAO;AAAA,MACvB,cAAc,CAAC,CAAC;AAAA,IAClB,CAAC;AAAA,EACH;AAEA,QAAM,cAAcA,cAAa,eAAe,QAAQ,MAAM,QAAQ;AAEtE,MAAI,QAA8B;AAClC,QAAM,kBAAkB,IAAI,oBAAoB,CAAC,WAAW;AAC1D,YAAQ,IAAI,cAAc,QAAQ;AAAA,MAChC,qBAAqB,OAAO,gBAAgB,CAAC;AAAA,MAC7C,kBAAkB,OAAO;AAAA,MACzB,kBAAkB,yBAAyB,MAAM;AAAA,IACnD,CAAC;AACD,WAAO;AAAA,EACT,GAAG,WAAW;AAEd,SAAO;AAAA,IACL;AAAA,IACA,eAAe;AAAA,MACb,UAAU,QAAQ,OAAO;AAAA,MACzB,UAAU;AAAA,IACZ;AAAA,IACA,SAAS,YAAY;AACnB,aAAO,KAAK,8BAA8B;AAE1C,UAAI,OAAO;AACT,cAAM,MAAM,aAAa;AAAA,MAC3B;AAEA,UAAI;AACF,cAAM,QAAQ,OAAO,SAAS,MAAM;AAAA,MACtC,QAAQ;AAAA,MAER;AACA,UAAI;AACF,cAAM,QAAQ,MAAM,SAAS,MAAM;AAAA,MACrC,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACF;;;AiD1OA,SAAS,kBAAkB,aAA6B;AACtD,QAAM,MAAM,IAAI,IAAI,WAAW;AAC/B,QAAM,WAAW,IAAI;AAErB,MAAI,aAAa,eAAe,aAAa,aAAa;AACxD,WAAO,GAAG,IAAI,QAAQ;AAAA,EACxB;AAEA,MAAI,aAAa,wBAAwB;AACvC,WAAO,GAAG,IAAI,QAAQ;AAAA,EACxB;AAEA,QAAM,SAAS,SAAS,MAAM,yBAAyB,IAAI,CAAC,KAAK;AACjE,SAAO,mBAAmB,MAAM;AAClC;AAEO,SAAS,iBACd,aACA,UAA0B,gBAClB;AACR,SAAO,GAAG,kBAAkB,WAAW,CAAC,IAAI,OAAO;AACrD;;;ACVA,IAAM,qBAAqB,mCAAmC,gBAAY,OAAO;AAsB1E,IAAM,mBAAN,MAAuB;AAAA,EACpB;AAAA,EAER,YAAY,QAA0B;AACpC,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,IAAY,UAAkB;AAC5B,UAAM,OAAO,KAAK,OAAO,OAAO,SAAS,GAAG,IACxC,KAAK,OAAO,OAAO,MAAM,GAAG,EAAE,IAC9B,KAAK,OAAO;AAChB,WAAO;AAAA,EACT;AAAA,EAEQ,cAAc,QAAyB;AAC7C,WAAO,WAAW,OAAO,WAAW;AAAA,EACtC;AAAA,EAEA,MAAc,cAAc,eAAe,OAAwB;AACjE,QAAI,gBAAgB,KAAK,OAAO,eAAe;AAC7C,aAAO,KAAK,OAAO,cAAc;AAAA,IACnC;AAEA,WAAO,KAAK,OAAO,UAAU;AAAA,EAC/B;AAAA,EAEA,MAAc,aACZ,SACA,eAAe,OACG;AAClB,UAAM,UAAU,IAAI,QAAQ,QAAQ,OAAO;AAC3C,YAAQ;AAAA,MACN;AAAA,MACA,UAAU,MAAM,KAAK,cAAc,YAAY,CAAC;AAAA,IAClD;AACA,YAAQ,IAAI,gBAAgB,kBAAkB;AAC9C,YAAQ,IAAI,cAAc,KAAK,OAAO,aAAa,kBAAkB;AACrE,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,eACZ,UACA,SACA,eAAe,OACI;AACnB,UAAM,MAAM,GAAG,KAAK,OAAO,GAAG,QAAQ;AAEtC,WAAO,MAAM,KAAK;AAAA,MAChB,GAAG;AAAA,MACH,SAAS,MAAM,KAAK,aAAa,SAAS,YAAY;AAAA,IACxD,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,wBACZ,UACA,UAAuB,CAAC,GACL;AACnB,QAAI,WAAW,MAAM,KAAK,eAAe,UAAU,OAAO;AAE1D,QAAI,CAAC,SAAS,MAAM,KAAK,cAAc,SAAS,MAAM,GAAG;AACvD,iBAAW,MAAM,KAAK,eAAe,UAAU,SAAS,IAAI;AAAA,IAC9D;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,WACZ,UACA,UAAuB,CAAC,GACZ;AACZ,UAAM,WAAW,MAAM,KAAK,wBAAwB,UAAU,OAAO;AAErE,QAAI,CAAC,SAAS,IAAI;AAChB,UAAI;AACJ,UAAI;AACF,cAAM,gBAAgB,MAAM,SAAS,KAAK;AAC1C,uBAAe,oBAAoB,SAAS,MAAM,KAAK,KAAK,UAAU,aAAa,CAAC;AAAA,MACtF,QAAQ;AACN,uBAAe,oBAAoB,SAAS,MAAM,KAAK,SAAS,UAAU;AAAA,MAC5E;AACA,YAAM,IAAI,MAAM,YAAY;AAAA,IAC9B;AAEA,WAAO,SAAS,KAAK;AAAA,EACvB;AAAA,EAEQ,YAAoB;AAC1B,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,MAAM,UAAU,eAAe,OAAwB;AACrD,WAAO,KAAK,cAAc,YAAY;AAAA,EACxC;AAAA,EAEA,mBAA2B;AACzB,WAAO,iBAAiB,KAAK,OAAO;AAAA,EACtC;AAAA,EAEA,MAAM,QAAQ,QAA+B;AAC3C,UAAM,SAAS,KAAK,UAAU;AAC9B,WAAO,KAAK,WAAiB,iBAAiB,MAAM,UAAU,MAAM,GAAG;AAAA,EACzE;AAAA,EAEA,MAAM,WAAW,QAAgB,OAAiC;AAChE,UAAM,SAAS,KAAK,UAAU;AAC9B,WAAO,KAAK;AAAA,MACV,iBAAiB,MAAM,UAAU,MAAM,SAAS,KAAK;AAAA,IACvD;AAAA,EACF;AAAA,EAEA,MAAM,cACJ,QACA,OACA,SACkB;AAClB,UAAM,SAAS,KAAK,UAAU;AAC9B,WAAO,KAAK;AAAA,MACV,iBAAiB,MAAM,UAAU,MAAM,SAAS,KAAK;AAAA,MACrD;AAAA,QACE,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,OAAO;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,iBACJ,QACA,OACA,QACkB;AAClB,WAAO,KAAK;AAAA,MACV,iBAAiB,KAAK,UAAU,CAAC,UAAU,MAAM,SAAS,KAAK;AAAA,MAC/D;AAAA,QACE,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,MAAM;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,iBACJ,QACA,OACA,SACkB;AAClB,UAAM,SAAS,KAAK,UAAU;AAC9B,WAAO,KAAK;AAAA,MACV,iBAAiB,MAAM,UAAU,MAAM,SAAS,KAAK;AAAA,MACrD;AAAA,QACE,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,EAAE,QAAQ,CAAC;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,aACJ,QACA,OACAC,OACe;AACf,UAAM,SAAS,KAAK,UAAU;AAC9B,UAAM,KAAK;AAAA,MACT,iBAAiB,MAAM,UAAU,MAAM,SAAS,KAAK;AAAA,MACrD;AAAA,QACE,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,EAAE,MAAAA,MAAK,CAAC;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,oBACJ,QACA,OACA,WAC4B;AAC5B,QAAI,CAAC,UAAU,QAAQ;AACrB,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,SAAS,KAAK,UAAU;AAC9B,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B,iBAAiB,MAAM,UAAU,MAAM,SAAS,KAAK;AAAA,MACrD;AAAA,QACE,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,EAAE,UAAU,CAAC;AAAA,MACpC;AAAA,IACF;AAEA,WAAO,SAAS,aAAa,CAAC;AAAA,EAChC;AAAA,EAEA,MAAM,wBACJ,QACA,OACA,aACwB;AACxB,UAAM,SAAS,KAAK,UAAU;AAC9B,QAAI;AACF,YAAM,WAAW,MAAM,KAAK;AAAA,QAI1B,iBAAiB,MAAM,UAAU,MAAM,SAAS,KAAK;AAAA,QACrD;AAAA,UACE,QAAQ;AAAA,UACR,MAAM,KAAK,UAAU,EAAE,cAAc,YAAY,CAAC;AAAA,QACpD;AAAA,MACF;AACA,aAAO,SAAS;AAAA,IAClB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,iBACJ,QACA,OACA,aAC6B;AAC7B,UAAM,MAAM,MAAM,KAAK,wBAAwB,QAAQ,OAAO,WAAW;AACzE,QAAI,CAAC,KAAK;AACR,aAAO;AAAA,IACT;AAEA,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,GAAG;AAChC,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,IAAI,MAAM,gCAAgC,SAAS,MAAM,EAAE;AAAA,MACnE;AACA,aAAO,SAAS,YAAY;AAAA,IAC9B,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,iBAAiB,SAA0C;AAC/D,UAAM,SAAS,KAAK,UAAU;AAC9B,UAAM,WAAW,iBAAiB,MAAM,UAAU,QAAQ,IAAI,SAAS,QAAQ,EAAE;AAEjF,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,wBAAwB,QAAQ;AAE5D,UAAI,CAAC,SAAS,IAAI;AAChB,YAAI,SAAS,WAAW,KAAK;AAC3B,iBAAO,CAAC;AAAA,QACV;AACA,cAAM,IAAI;AAAA,UACR,yBAAyB,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,QACjE;AAAA,MACF;AAEA,YAAM,UAAU,MAAM,SAAS,KAAK;AAEpC,UAAI,CAAC,QAAQ,KAAK,GAAG;AACnB,eAAO,CAAC;AAAA,MACV;AAGA,aAAO,QACJ,KAAK,EACL,MAAM,IAAI,EACV,IAAI,CAAC,SAAS,KAAK,MAAM,IAAI,CAAgB;AAAA,IAClD,SAAS,OAAO;AACd,YAAM,IAAI;AAAA,QACR,kCAAkC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MAC1F;AAAA,IACF;AAAA,EACF;AACF;;;ACvTA,OAAOC,SAAQ;AACf,OAAO,SAAS;AAChB,OAAOC,YAAU;AA2BV,IAAM,mBAAN,MAAM,kBAAiB;AAAA,EAC5B,OAAwB,oBAAoB;AAAA,EAC5C,OAAwB,wBAAwB;AAAA,EAChD,OAAwB,oBAAoB;AAAA,EAC5C,OAAwB,qBAAqB;AAAA,EAC7C,OAAwB,sBAAsB,KAAK,KAAK,KAAK,KAAK;AAAA,EAE1D;AAAA,EACA,iBAAoD,oBAAI,IAAI;AAAA,EAC5D,gBAA6C,oBAAI,IAAI;AAAA,EACrD,uBAA4C,oBAAI,IAAI;AAAA,EACpD,cAAmC,oBAAI,IAAI;AAAA,EAC3C,WAAsC,oBAAI,IAAI;AAAA,EAC9C,cAA0C,oBAAI,IAAI;AAAA,EAElD;AAAA,EACA;AAAA,EAER,YAAY,UAAmC,CAAC,GAAG;AACjD,SAAK,aAAa,QAAQ;AAC1B,SAAK,iBAAiB,QAAQ;AAC9B,SAAK,SACH,QAAQ,UACR,IAAI,OAAO,EAAE,OAAO,OAAO,QAAQ,qBAAqB,CAAC;AAAA,EAC7D;AAAA,EAEA,MAAM,WAA0B;AAI9B,UAAM,gBAAiC,CAAC;AACxC,eAAW,CAAC,WAAW,OAAO,KAAK,KAAK,UAAU;AAChD,WAAK,qBAAqB,WAAW,OAAO;AAC5C,oBAAc,KAAK,KAAK,MAAM,SAAS,CAAC;AAAA,IAC1C;AACA,UAAM,QAAQ,IAAI,aAAa;AAAA,EACjC;AAAA,EAEA,SAAS,WAAmB,SAA+B;AACzD,QAAI,KAAK,SAAS,IAAI,SAAS,GAAG;AAChC;AAAA,IACF;AAEA,SAAK,SAAS,IAAI,WAAW,EAAE,SAAS,qBAAqB,CAAC,EAAE,CAAC;AAEjE,SAAK,qBAAqB,IAAI,WAAW,KAAK,IAAI,CAAC;AAEnD,QAAI,KAAK,gBAAgB;AACvB,YAAM,aAAaC,OAAK;AAAA,QACtB,KAAK;AAAA,QACL;AAAA,QACA,QAAQ;AAAA,MACV;AACA,UAAI;AACF,QAAAC,IAAG,UAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,MAC9C,SAAS,OAAO;AACd,aAAK,OAAO,KAAK,0CAA0C;AAAA,UACzD;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEA,aAAa,WAA4B;AACvC,WAAO,KAAK,SAAS,IAAI,SAAS;AAAA,EACpC;AAAA,EAEA,cAAc,WAAmB,MAAoB;AACnD,UAAM,UAAU,KAAK,SAAS,IAAI,SAAS;AAC3C,QAAI,CAAC,SAAS;AACZ,WAAK,OAAO,KAAK,iDAAiD;AAAA,QAChE;AAAA,MACF,CAAC;AACD;AAAA,IACF;AAEA,QAAI;AACF,YAAM,UAAU,KAAK,MAAM,IAAI;AAC/B,YAAM,aAAY,oBAAI,KAAK,GAAE,YAAY;AAGzC,UAAI,KAAK,oBAAoB,OAAO,GAAG;AACrC,cAAMC,QAAO,KAAK,iBAAiB,OAAO;AAC1C,YAAIA,OAAM;AACR,cAAI,CAAC,QAAQ,aAAa;AACxB,oBAAQ,cAAc,EAAE,MAAAA,OAAM,gBAAgB,UAAU;AAAA,UAC1D,OAAO;AACL,oBAAQ,YAAY,QAAQA;AAAA,UAC9B;AAAA,QACF;AAEA;AAAA,MACF;AAKA,UAAI,KAAK,qBAAqB,OAAO,KAAK,QAAQ,aAAa;AAC7D,gBAAQ,cAAc;AAAA,MACxB,OAAO;AACL,aAAK,qBAAqB,WAAW,OAAO;AAAA,MAC9C;AAEA,YAAM,oBAAoB,KAAK,wBAAwB,OAAO;AAC9D,UAAI,mBAAmB;AACrB,gBAAQ,mBAAmB;AAC3B,gBAAQ,oBAAoB,KAAK,iBAAiB;AAAA,MACpD;AAEA,YAAM,QAA4B;AAAA,QAChC,MAAM;AAAA,QACN;AAAA,QACA,cAAc;AAAA,MAChB;AAEA,WAAK,kBAAkB,WAAW,KAAK;AAEvC,UAAI,KAAK,YAAY;AACnB,cAAM,UAAU,KAAK,eAAe,IAAI,SAAS,KAAK,CAAC;AACvD,gBAAQ,KAAK,KAAK;AAClB,aAAK,eAAe,IAAI,WAAW,OAAO;AAC1C,aAAK,cAAc,SAAS;AAAA,MAC9B;AAAA,IACF,QAAQ;AACN,WAAK,OAAO,KAAK,4CAA4C;AAAA,QAC3D,QAAQ,QAAQ,QAAQ;AAAA,QACxB,OAAO,QAAQ,QAAQ;AAAA,QACvB,YAAY,KAAK;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,MACJ,WACA,EAAE,WAAW,MAAM,IAA4B,CAAC,GACjC;AACf,QAAI,UAAU;AACZ,YAAM,UAAU,KAAK,SAAS,IAAI,SAAS;AAC3C,UAAI,SAAS;AACX,aAAK,qBAAqB,WAAW,OAAO;AAAA,MAC9C;AAAA,IACF;AAGA,UAAM,OAAO,KAAK,YAAY,IAAI,SAAS,KAAK,QAAQ,QAAQ;AAChE,UAAM,OAAO,KAAK,MAAM,MAAM;AAAA,IAAC,CAAC,EAAE,KAAK,MAAM,KAAK,SAAS,SAAS,CAAC;AACrE,SAAK,YAAY,IAAI,WAAW,IAAI;AACpC,SAAK,QAAQ,MAAM;AACjB,UAAI,KAAK,YAAY,IAAI,SAAS,MAAM,MAAM;AAC5C,aAAK,YAAY,OAAO,SAAS;AAAA,MACnC;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,SAAS,WAAkC;AACvD,UAAM,UAAU,KAAK,SAAS,IAAI,SAAS;AAC3C,QAAI,CAAC,SAAS;AACZ,WAAK,OAAO,KAAK,2BAA2B,EAAE,UAAU,CAAC;AACzD;AAAA,IACF;AAEA,UAAM,UAAU,KAAK,eAAe,IAAI,SAAS;AACjD,QAAI,CAAC,KAAK,cAAc,CAAC,SAAS,QAAQ;AACxC;AAAA,IACF;AAEA,SAAK,eAAe,OAAO,SAAS;AACpC,UAAM,UAAU,KAAK,cAAc,IAAI,SAAS;AAChD,QAAI,SAAS;AACX,mBAAa,OAAO;AACpB,WAAK,cAAc,OAAO,SAAS;AAAA,IACrC;AAEA,SAAK,qBAAqB,IAAI,WAAW,KAAK,IAAI,CAAC;AAEnD,QAAI;AACF,YAAM,KAAK,WAAW;AAAA,QACpB,QAAQ,QAAQ;AAAA,QAChB,QAAQ,QAAQ;AAAA,QAChB;AAAA,MACF;AACA,WAAK,YAAY,IAAI,WAAW,CAAC;AAAA,IACnC,SAAS,OAAO;AACd,YAAM,cAAc,KAAK,YAAY,IAAI,SAAS,KAAK,KAAK;AAC5D,WAAK,YAAY,IAAI,WAAW,UAAU;AAE1C,UAAI,cAAc,kBAAiB,mBAAmB;AACpD,aAAK,OAAO;AAAA,UACV,YAAY,QAAQ,MAAM,8BAA8B,UAAU;AAAA,UAClE;AAAA,YACE,QAAQ,QAAQ,QAAQ;AAAA,YACxB,OAAO,QAAQ,QAAQ;AAAA,YACvB;AAAA,UACF;AAAA,QACF;AACA,aAAK,YAAY,IAAI,WAAW,CAAC;AAAA,MACnC,OAAO;AACL,YAAI,eAAe,GAAG;AACpB,eAAK,OAAO;AAAA,YACV,qDAAqD,kBAAiB,iBAAiB;AAAA,YACvF;AAAA,cACE,QAAQ,QAAQ,QAAQ;AAAA,cACxB,OAAO,QAAQ,QAAQ;AAAA,cACvB,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,YAC9D;AAAA,UACF;AAAA,QACF;AACA,cAAM,iBAAiB,KAAK,eAAe,IAAI,SAAS,KAAK,CAAC;AAC9D,aAAK,eAAe,IAAI,WAAW,CAAC,GAAG,SAAS,GAAG,cAAc,CAAC;AAClE,aAAK,cAAc,SAAS;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,qBACN,SACoB;AACpB,QAAI,QAAQ,WAAW,iBAAkB,QAAO;AAChD,UAAM,SAAS,QAAQ;AACvB,UAAM,SAAS,QAAQ;AACvB,WAAO,QAAQ;AAAA,EACjB;AAAA,EAEQ,qBAAqB,SAA2C;AACtE,WAAO,KAAK,qBAAqB,OAAO,MAAM;AAAA,EAChD;AAAA,EAEQ,oBAAoB,SAA2C;AACrE,WAAO,KAAK,qBAAqB,OAAO,MAAM;AAAA,EAChD;AAAA,EAEQ,iBAAiB,SAA0C;AACjE,UAAM,SAAS,QAAQ;AACvB,UAAM,SAAS,QAAQ;AACvB,UAAM,UAAU,QAAQ;AAGxB,QAAI,SAAS,SAAS,UAAU,QAAQ,MAAM;AAC5C,aAAO,QAAQ;AAAA,IACjB;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,qBAAqB,WAAmB,SAA6B;AAC3E,QAAI,CAAC,QAAQ,YAAa;AAE1B,UAAM,EAAE,MAAAA,OAAM,eAAe,IAAI,QAAQ;AACzC,YAAQ,cAAc;AACtB,YAAQ,mBAAmBA;AAC3B,YAAQ,oBAAoB,KAAKA,KAAI;AAErC,UAAM,QAA4B;AAAA,MAChC,MAAM;AAAA,MACN,WAAW;AAAA,MACX,cAAc;AAAA,QACZ,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,QAAQ;AAAA,UACN,QAAQ;AAAA,YACN,eAAe;AAAA,YACf,SAAS,EAAE,MAAM,QAAQ,MAAAA,MAAK;AAAA,UAChC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,SAAK,kBAAkB,WAAW,KAAK;AAEvC,QAAI,KAAK,YAAY;AACnB,YAAM,UAAU,KAAK,eAAe,IAAI,SAAS,KAAK,CAAC;AACvD,cAAQ,KAAK,KAAK;AAClB,WAAK,eAAe,IAAI,WAAW,OAAO;AAC1C,WAAK,cAAc,SAAS;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,oBAAoB,WAAuC;AACzD,WAAO,KAAK,SAAS,IAAI,SAAS,GAAG;AAAA,EACvC;AAAA,EAEA,qBAAqB,WAAuC;AAC1D,UAAM,UAAU,KAAK,SAAS,IAAI,SAAS;AAC3C,QAAI,CAAC,WAAW,QAAQ,oBAAoB,WAAW,EAAG,QAAO;AAEjE,QAAI,QAAQ,aAAa;AACvB,WAAK,OAAO;AAAA,QACV;AAAA,QACA;AAAA,UACE;AAAA,UACA,gBAAgB,QAAQ,YAAY,KAAK;AAAA,QAC3C;AAAA,MACF;AAAA,IACF;AAEA,WAAO,QAAQ,oBAAoB,KAAK,MAAM;AAAA,EAChD;AAAA,EAEA,kBAAkB,WAAyB;AACzC,UAAM,UAAU,KAAK,SAAS,IAAI,SAAS;AAC3C,QAAI,SAAS;AACX,cAAQ,sBAAsB,CAAC;AAAA,IACjC;AAAA,EACF;AAAA,EAEQ,wBACN,SACe;AACf,QAAI,QAAQ,WAAW,kBAAkB;AACvC,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,QAAQ;AACvB,UAAM,SAAS,QAAQ;AACvB,QAAI,QAAQ,kBAAkB,iBAAiB;AAC7C,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,OAAO;AAGvB,QAAI,SAAS,SAAS,UAAU,OAAO,QAAQ,SAAS,UAAU;AAChE,YAAM,UAAU,QAAQ,KAAK,KAAK;AAClC,aAAO,QAAQ,SAAS,IAAI,UAAU;AAAA,IACxC;AAEA,QAAI,OAAO,OAAO,YAAY,UAAU;AACtC,YAAM,UAAU,OAAO,QAAQ,KAAK;AACpC,aAAO,QAAQ,SAAS,IAAI,UAAU;AAAA,IACxC;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,cAAc,WAAyB;AAC7C,UAAM,WAAW,KAAK,cAAc,IAAI,SAAS;AACjD,QAAI,SAAU,cAAa,QAAQ;AAEnC,UAAM,aAAa,KAAK,YAAY,IAAI,SAAS,KAAK;AACtD,UAAM,cAAc,KAAK,qBAAqB,IAAI,SAAS,KAAK;AAChE,UAAM,UAAU,KAAK,IAAI,IAAI;AAE7B,QAAIC;AACJ,QAAI,aAAa,GAAG;AAElB,MAAAA,SAAQ,KAAK;AAAA,QACX,kBAAiB,oBAAoB,KAAK;AAAA,QAC1C,kBAAiB;AAAA,MACnB;AAAA,IACF,WAAW,WAAW,kBAAiB,uBAAuB;AAE5D,MAAAA,SAAQ;AAAA,IACV,OAAO;AACL,MAAAA,SAAQ,kBAAiB;AAAA,IAC3B;AAEA,UAAM,UAAU,WAAW,MAAM,KAAK,MAAM,SAAS,GAAGA,MAAK;AAC7D,SAAK,cAAc,IAAI,WAAW,OAAO;AAAA,EAC3C;AAAA,EAEQ,kBACN,WACA,OACM;AACN,QAAI,CAAC,KAAK,eAAgB;AAE1B,UAAM,UAAU,KAAK,SAAS,IAAI,SAAS;AAC3C,QAAI,CAAC,QAAS;AAEd,UAAM,UAAUH,OAAK;AAAA,MACnB,KAAK;AAAA,MACL;AAAA,MACA,QAAQ,QAAQ;AAAA,MAChB;AAAA,IACF;AAEA,QAAI;AACF,MAAAC,IAAG,eAAe,SAAS,GAAG,KAAK,UAAU,KAAK,CAAC;AAAA,CAAI;AAAA,IACzD,SAAS,OAAO;AACd,WAAK,OAAO,KAAK,kCAAkC;AAAA,QACjD,QAAQ,QAAQ,QAAQ;AAAA,QACxB,OAAO,QAAQ,QAAQ;AAAA,QACvB;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,aAAa,mBAAmB,gBAAyC;AACvE,UAAM,cAAcD,OAAK,KAAK,gBAAgB,UAAU;AACxD,QAAI,UAAU;AACd,QAAI;AACF,YAAM,UAAU,MAAM,IAAI,QAAQ,WAAW;AAC7C,YAAM,MAAM,KAAK,IAAI;AACrB,iBAAW,SAAS,SAAS;AAC3B,cAAM,YAAYA,OAAK,KAAK,aAAa,KAAK;AAC9C,YAAI;AACF,gBAAM,QAAQ,MAAM,IAAI,KAAK,SAAS;AACtC,cACE,MAAM,YAAY,KAClB,MAAM,MAAM,cAAc,kBAAiB,qBAC3C;AACA,kBAAM,IAAI,GAAG,WAAW,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AACxD;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AACA,WAAO;AAAA,EACT;AACF;;;AC7aO,IAAM,QAAN,MAAY;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,QAAqB;AAC/B,SAAK,SAAS,IAAI,OAAO;AAAA,MACvB,OAAO,OAAO,SAAS;AAAA,MACvB,QAAQ;AAAA,MACR,OAAO,OAAO;AAAA,IAChB,CAAC;AAED,QAAI,OAAO,SAAS;AAClB,WAAK,aAAa,IAAI,iBAAiB,OAAO,OAAO;AACrD,WAAK,mBAAmB,OAAO;AAAA,IACjC;AACA,SAAK,kBAAkB,OAAO,UAAU,YAAY;AAEpD,QAAI,OAAO,WAAW,CAAC,OAAO,oBAAoB;AAChD,WAAK,mBAAmB,IAAI,iBAAiB;AAAA,QAC3C,YAAY,KAAK;AAAA,QACjB,QAAQ,KAAK,OAAO,MAAM,kBAAkB;AAAA,QAC5C,gBAAgB,OAAO;AAAA,MACzB,CAAC;AAED,UAAI,OAAO,gBAAgB;AACzB,yBAAiB,mBAAmB,OAAO,cAAc,EAAE;AAAA,UACzD,MAAM;AAAA,UAAC;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,qBAAqB,aAGzB;AACR,QAAI,CAAC,KAAK,YAAY;AACpB,aAAO;AAAA,IACT;AAEA,QAAI;AACF,YAAM,aAAa,eAAe,KAAK,WAAW,iBAAiB;AACnE,YAAM,SAAS,MAAM,KAAK,WAAW,UAAU;AAE/C,cAAQ,IAAI,kBAAkB,GAAG,UAAU;AAC3C,cAAQ,IAAI,iBAAiB;AAC7B,cAAQ,IAAI,qBAAqB;AACjC,cAAQ,IAAI,uBAAuB;AAEnC,aAAO,EAAE,YAAY,OAAO;AAAA,IAC9B,SAAS,OAAO;AACd,WAAK,OAAO,MAAM,mCAAmC,KAAK;AAC1D,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,IACJ,QACA,WACA,UAAgC,CAAC,GACA;AACjC,UAAM,gBAAgB,MAAM,KAAK,qBAAqB,QAAQ,UAAU;AACxE,SAAK,YAAY;AAEjB,QAAI;AACJ,QAAI,iBACF,QAAQ,SAAS,CAAC,eAAe,IAAI,QAAQ,KAAK,IAC9C,QAAQ,QACR;AACN,QAAI,QAAQ,YAAY,WAAW,eAAe;AAChD,YAAM,SAAS,MAAM,gBAAgB;AAAA,QACnC,YAAY,cAAc;AAAA,MAC5B,CAAC;AACD,YAAM,gBAAgB,OACnB,OAAO,CAAC,UAAU;AACjB,YAAI,eAAe,IAAI,MAAM,EAAE,EAAG,QAAO;AACzC,YAAI,MAAM,UAAU;AAClB,iBAAO,MAAM,aAAa;AAAA,QAC5B;AACA,eAAO,MAAM,GAAG,WAAW,MAAM,KAAK,MAAM,GAAG,WAAW,SAAS;AAAA,MACrE,CAAC,EACA,IAAI,CAAC,UAAU,MAAM,EAAE;AAE1B,UAAI,cAAc,SAAS,GAAG;AAC5B,0BAAkB,IAAI,IAAI,aAAa;AAAA,MACzC;AAEA,UAAI,CAAC,kBAAkB,CAAC,iBAAiB,IAAI,cAAc,GAAG;AAC5D,yBAAiB,cAAc,SAAS,mBAAmB,IACvD,sBACA,cAAc,CAAC;AAAA,MACrB;AAAA,IACF;AACA,QAAI,CAAC,kBAAkB,QAAQ,YAAY,SAAS;AAClD,uBAAiB;AAAA,IACnB;AAEA,SAAK,gBAAgB,oBAAoB;AAAA,MACvC,SAAS,QAAQ;AAAA,MACjB,WAAW,KAAK;AAAA,MAChB;AAAA,MACA;AAAA,MACA,YAAY;AAAA,MACZ,QAAQ,KAAK;AAAA,MACb,kBAAkB,QAAQ;AAAA,MAC1B,oBAAoB,QAAQ;AAAA,MAC5B;AAAA,MACA,kBAAkB,KAAK;AAAA,MACvB,iBAAiB,KAAK;AAAA,MACtB,cACE,QAAQ,YAAY,WAAW,gBAC3B;AAAA,QACE,KAAK,QAAQ;AAAA,QACb,YAAY,GAAG,cAAc,UAAU;AAAA,QACvC,QAAQ,cAAc;AAAA,QACtB,YAAY,QAAQ;AAAA,QACpB,OAAO;AAAA,QACP,cAAc,QAAQ;AAAA,MACxB,IACA;AAAA,IACR,CAAC;AAED,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,wBACJ,QACA,OACA,YACe;AACf,SAAK,OAAO,KAAK,4BAA4B,EAAE,QAAQ,OAAO,WAAW,CAAC;AAE1E,QAAI,CAAC,KAAK,cAAc,CAAC,KAAK,WAAW;AACvC,YAAM,QAAQ,IAAI;AAAA,QAChB;AAAA,MACF;AACA,WAAK,OAAO,MAAM,8BAA8B,KAAK;AACrD,YAAM;AAAA,IACR;AAEA,UAAM,UAAyB;AAAA,MAC7B,QAAQ,EAAE,QAAQ,MAAM;AAAA,IAC1B;AACA,QAAI,YAAY;AACd,cAAQ,SAAS;AAAA,IACnB;AAEA,UAAM,KAAK,WAAW,cAAc,QAAQ,KAAK,WAAW,OAAO;AACnE,SAAK,OAAO,MAAM,2BAA2B;AAAA,MAC3C;AAAA,MACA,WAAW,KAAK;AAAA,MAChB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,gBAA8C;AAC5C,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,eAA8B;AAClC,UAAM,KAAK,kBAAkB,SAAS;AAAA,EACxC;AAAA,EAEA,MAAM,UAAyB;AAC7B,QAAI,KAAK,oBAAoB,KAAK,WAAW;AAC3C,YAAM,KAAK,iBAAiB,MAAM,KAAK,WAAW,EAAE,UAAU,KAAK,CAAC;AAAA,IACtE;AACA,UAAM,KAAK,eAAe,QAAQ;AAAA,EACpC;AACF;","names":["path","binary","resolve","err","info","instance","module","metadata","name","i","flags","handle","func","exports","memoryBase","args","libName","localScope","start","text","fs","body","bytes","self","query","ndJsonStream","resolve","err","fs","os","path","RequestError","path","fs","path","name","text","POSTHOG_CLASS_NAMES","GO_CONSTRUCTOR_NAMES","body","query","args","Parser","err","text","query","body","func","parts","body","path","query","init","i","flags","err","resolve","err","path","name","text","args","name","path","parts","fs","path","resolve","metadata","parts","path","name","fs","metadata","input","text","parts","text","current","path","i","ALLOW_BYPASS","name","fs","os","path","err","fs","os","path","text","RequestError","resolve","err","initPromise","availableModes","RequestError","handle","fs","os","path","spawn","existsSync","dirname","args","name","existsSync","dirname","spawn","err","RequestError","err","ndJsonStream","text","fs","path","path","fs","text","delay"]}
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/web-tree-sitter/tree-sitter.js","../src/adapters/acp-connection.ts","../src/utils/logger.ts","../src/utils/streams.ts","../src/adapters/claude/claude-agent.ts","../package.json","../src/acp-extensions.ts","../src/enrichment/file-enricher.ts","../../enricher/src/ast-helpers.ts","../../enricher/src/languages.ts","../../enricher/src/alias-resolver.ts","../../enricher/src/call-detector.ts","../../enricher/src/parser-manager.ts","../../enricher/src/log.ts","../../enricher/src/types.ts","../../enricher/src/variant-detector.ts","../../enricher/src/detector.ts","../../enricher/src/flag-classification.ts","../../enricher/src/stale-flags.ts","../../enricher/src/comment-formatter.ts","../../enricher/src/enriched-result.ts","../../enricher/src/enricher.ts","../../enricher/src/posthog-api.ts","../../enricher/src/parse-result.ts","../src/utils/common.ts","../src/gateway-models.ts","../src/adapters/base-acp-agent.ts","../src/adapters/claude/conversion/acp-to-sdk.ts","../src/adapters/claude/conversion/sdk-to-acp.ts","../src/utils/acp-content.ts","../src/adapters/claude/hooks.ts","../src/adapters/claude/conversion/tool-use-to-acp.ts","../src/adapters/claude/mcp/tool-metadata.ts","../src/adapters/claude/plan/utils.ts","../src/adapters/claude/questions/utils.ts","../src/execution-mode.ts","../src/adapters/claude/tools.ts","../src/adapters/claude/permissions/permission-options.ts","../src/adapters/claude/permissions/permission-handlers.ts","../src/adapters/claude/session/commands.ts","../src/adapters/claude/session/mcp-config.ts","../src/adapters/claude/session/models.ts","../src/adapters/claude/session/options.ts","../src/adapters/claude/session/instructions.ts","../src/adapters/claude/session/settings.ts","../src/adapters/codex/codex-agent.ts","../src/adapters/codex/codex-client.ts","../src/adapters/codex/session-state.ts","../src/adapters/codex/settings.ts","../src/adapters/codex/spawn.ts","../src/utils/gateway.ts","../src/posthog-api.ts","../src/session-log-writer.ts","../src/agent.ts"],"sourcesContent":["// include: shell.js\n// The Module object: Our interface to the outside world. We import\n// and export values on it. There are various ways Module can be used:\n// 1. Not defined. We create it here\n// 2. A function parameter, function(moduleArg) => Promise<Module>\n// 3. pre-run appended it, var Module = {}; ..generated code..\n// 4. External script tag defines var Module.\n// We need to check if Module already exists (e.g. case 3 above).\n// Substitution will be replaced with actual code on later stage of the build,\n// this way Closure Compiler will not mangle it (e.g. case 4. above).\n// Note that if you want to run closure, and also to use Module\n// after the generated code, you will need to define var Module = {};\n// before the code. Then that object will be used in the code, and you\n// can continue to use Module afterwards as well.\nvar Module = typeof Module != \"undefined\" ? Module : {};\n\n// Determine the runtime environment we are in. You can customize this by\n// setting the ENVIRONMENT setting at compile time (see settings.js).\n// Attempt to auto-detect the environment\nvar ENVIRONMENT_IS_WEB = typeof window == \"object\";\n\nvar ENVIRONMENT_IS_WORKER = typeof importScripts == \"function\";\n\n// N.b. Electron.js environment is simultaneously a NODE-environment, but\n// also a web environment.\nvar ENVIRONMENT_IS_NODE = typeof process == \"object\" && typeof process.versions == \"object\" && typeof process.versions.node == \"string\";\n\nif (ENVIRONMENT_IS_NODE) {}\n\n// --pre-jses are emitted after the Module integration code, so that they can\n// refer to Module (if they choose; they can also define Module)\n// include: /src/lib/binding_web/prefix.js\nvar TreeSitter = function() {\n var initPromise;\n var document = typeof window == \"object\" ? {\n currentScript: window.document.currentScript\n } : null;\n class Parser {\n constructor() {\n this.initialize();\n }\n initialize() {\n throw new Error(\"cannot construct a Parser before calling `init()`\");\n }\n static init(moduleOptions) {\n if (initPromise) return initPromise;\n Module = Object.assign({}, Module, moduleOptions);\n return initPromise = new Promise(resolveInitPromise => {\n // end include: /src/lib/binding_web/prefix.js\n // Sometimes an existing Module object exists with properties\n // meant to overwrite the default module functionality. Here\n // we collect those properties and reapply _after_ we configure\n // the current environment's defaults to avoid having to be so\n // defensive during initialization.\n var moduleOverrides = Object.assign({}, Module);\n var arguments_ = [];\n var thisProgram = \"./this.program\";\n var quit_ = (status, toThrow) => {\n throw toThrow;\n };\n // `/` should be present at the end if `scriptDirectory` is not empty\n var scriptDirectory = \"\";\n function locateFile(path) {\n if (Module[\"locateFile\"]) {\n return Module[\"locateFile\"](path, scriptDirectory);\n }\n return scriptDirectory + path;\n }\n // Hooks that are implemented differently in different runtime environments.\n var readAsync, readBinary;\n if (ENVIRONMENT_IS_NODE) {\n // These modules will usually be used on Node.js. Load them eagerly to avoid\n // the complexity of lazy-loading.\n var fs = require(\"fs\");\n var nodePath = require(\"path\");\n scriptDirectory = __dirname + \"/\";\n // include: node_shell_read.js\n readBinary = filename => {\n // We need to re-wrap `file://` strings to URLs. Normalizing isn't\n // necessary in that case, the path should already be absolute.\n filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename);\n var ret = fs.readFileSync(filename);\n return ret;\n };\n readAsync = (filename, binary = true) => {\n // See the comment in the `readBinary` function.\n filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename);\n return new Promise((resolve, reject) => {\n fs.readFile(filename, binary ? undefined : \"utf8\", (err, data) => {\n if (err) reject(err); else resolve(binary ? data.buffer : data);\n });\n });\n };\n // end include: node_shell_read.js\n if (!Module[\"thisProgram\"] && process.argv.length > 1) {\n thisProgram = process.argv[1].replace(/\\\\/g, \"/\");\n }\n arguments_ = process.argv.slice(2);\n if (typeof module != \"undefined\") {\n module[\"exports\"] = Module;\n }\n quit_ = (status, toThrow) => {\n process.exitCode = status;\n throw toThrow;\n };\n } else // Note that this includes Node.js workers when relevant (pthreads is enabled).\n // Node.js workers are detected as a combination of ENVIRONMENT_IS_WORKER and\n // ENVIRONMENT_IS_NODE.\n if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {\n if (ENVIRONMENT_IS_WORKER) {\n // Check worker, not web, since window could be polyfilled\n scriptDirectory = self.location.href;\n } else if (typeof document != \"undefined\" && document.currentScript) {\n // web\n scriptDirectory = document.currentScript.src;\n }\n // blob urls look like blob:http://site.com/etc/etc and we cannot infer anything from them.\n // otherwise, slice off the final part of the url to find the script directory.\n // if scriptDirectory does not contain a slash, lastIndexOf will return -1,\n // and scriptDirectory will correctly be replaced with an empty string.\n // If scriptDirectory contains a query (starting with ?) or a fragment (starting with #),\n // they are removed because they could contain a slash.\n if (scriptDirectory.startsWith(\"blob:\")) {\n scriptDirectory = \"\";\n } else {\n scriptDirectory = scriptDirectory.substr(0, scriptDirectory.replace(/[?#].*/, \"\").lastIndexOf(\"/\") + 1);\n }\n {\n // include: web_or_worker_shell_read.js\n if (ENVIRONMENT_IS_WORKER) {\n readBinary = url => {\n var xhr = new XMLHttpRequest;\n xhr.open(\"GET\", url, false);\n xhr.responseType = \"arraybuffer\";\n xhr.send(null);\n return new Uint8Array(/** @type{!ArrayBuffer} */ (xhr.response));\n };\n }\n readAsync = url => {\n // Fetch has some additional restrictions over XHR, like it can't be used on a file:// url.\n // See https://github.com/github/fetch/pull/92#issuecomment-140665932\n // Cordova or Electron apps are typically loaded from a file:// url.\n // So use XHR on webview if URL is a file URL.\n if (isFileURI(url)) {\n return new Promise((reject, resolve) => {\n var xhr = new XMLHttpRequest;\n xhr.open(\"GET\", url, true);\n xhr.responseType = \"arraybuffer\";\n xhr.onload = () => {\n if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) {\n // file URLs can return 0\n resolve(xhr.response);\n }\n reject(xhr.status);\n };\n xhr.onerror = reject;\n xhr.send(null);\n });\n }\n return fetch(url, {\n credentials: \"same-origin\"\n }).then(response => {\n if (response.ok) {\n return response.arrayBuffer();\n }\n return Promise.reject(new Error(response.status + \" : \" + response.url));\n });\n };\n }\n } else // end include: web_or_worker_shell_read.js\n {}\n var out = Module[\"print\"] || console.log.bind(console);\n var err = Module[\"printErr\"] || console.error.bind(console);\n // Merge back in the overrides\n Object.assign(Module, moduleOverrides);\n // Free the object hierarchy contained in the overrides, this lets the GC\n // reclaim data used.\n moduleOverrides = null;\n // Emit code to handle expected values on the Module object. This applies Module.x\n // to the proper local x. This has two benefits: first, we only emit it if it is\n // expected to arrive, and second, by using a local everywhere else that can be\n // minified.\n if (Module[\"arguments\"]) arguments_ = Module[\"arguments\"];\n if (Module[\"thisProgram\"]) thisProgram = Module[\"thisProgram\"];\n if (Module[\"quit\"]) quit_ = Module[\"quit\"];\n // perform assertions in shell.js after we set up out() and err(), as otherwise if an assertion fails it cannot print the message\n // end include: shell.js\n // include: preamble.js\n // === Preamble library stuff ===\n // Documentation for the public APIs defined in this file must be updated in:\n // site/source/docs/api_reference/preamble.js.rst\n // A prebuilt local version of the documentation is available at:\n // site/build/text/docs/api_reference/preamble.js.txt\n // You can also build docs locally as HTML or other formats in site/\n // An online HTML version (which may be of a different version of Emscripten)\n // is up at http://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html\n var dynamicLibraries = Module[\"dynamicLibraries\"] || [];\n var wasmBinary;\n if (Module[\"wasmBinary\"]) wasmBinary = Module[\"wasmBinary\"];\n // Wasm globals\n var wasmMemory;\n //========================================\n // Runtime essentials\n //========================================\n // whether we are quitting the application. no code should run after this.\n // set in exit() and abort()\n var ABORT = false;\n // set by exit() and abort(). Passed to 'onExit' handler.\n // NOTE: This is also used as the process return code code in shell environments\n // but only when noExitRuntime is false.\n var EXITSTATUS;\n // Memory management\n var /** @type {!Int8Array} */ HEAP8, /** @type {!Uint8Array} */ HEAPU8, /** @type {!Int16Array} */ HEAP16, /** @type {!Uint16Array} */ HEAPU16, /** @type {!Int32Array} */ HEAP32, /** @type {!Uint32Array} */ HEAPU32, /** @type {!Float32Array} */ HEAPF32, /** @type {!Float64Array} */ HEAPF64;\n var HEAP_DATA_VIEW;\n // include: runtime_shared.js\n function updateMemoryViews() {\n var b = wasmMemory.buffer;\n Module[\"HEAP_DATA_VIEW\"] = HEAP_DATA_VIEW = new DataView(b);\n Module[\"HEAP8\"] = HEAP8 = new Int8Array(b);\n Module[\"HEAP16\"] = HEAP16 = new Int16Array(b);\n Module[\"HEAPU8\"] = HEAPU8 = new Uint8Array(b);\n Module[\"HEAPU16\"] = HEAPU16 = new Uint16Array(b);\n Module[\"HEAP32\"] = HEAP32 = new Int32Array(b);\n Module[\"HEAPU32\"] = HEAPU32 = new Uint32Array(b);\n Module[\"HEAPF32\"] = HEAPF32 = new Float32Array(b);\n Module[\"HEAPF64\"] = HEAPF64 = new Float64Array(b);\n }\n // end include: runtime_shared.js\n // In non-standalone/normal mode, we create the memory here.\n // include: runtime_init_memory.js\n // Create the wasm memory. (Note: this only applies if IMPORTED_MEMORY is defined)\n // check for full engine support (use string 'subarray' to avoid closure compiler confusion)\n if (Module[\"wasmMemory\"]) {\n wasmMemory = Module[\"wasmMemory\"];\n } else {\n var INITIAL_MEMORY = Module[\"INITIAL_MEMORY\"] || 33554432;\n wasmMemory = new WebAssembly.Memory({\n \"initial\": INITIAL_MEMORY / 65536,\n // In theory we should not need to emit the maximum if we want \"unlimited\"\n // or 4GB of memory, but VMs error on that atm, see\n // https://github.com/emscripten-core/emscripten/issues/14130\n // And in the pthreads case we definitely need to emit a maximum. So\n // always emit one.\n \"maximum\": 2147483648 / 65536\n });\n }\n updateMemoryViews();\n // end include: runtime_init_memory.js\n // include: runtime_stack_check.js\n // end include: runtime_stack_check.js\n // include: runtime_assertions.js\n // end include: runtime_assertions.js\n var __ATPRERUN__ = [];\n // functions called before the runtime is initialized\n var __ATINIT__ = [];\n // functions called during startup\n var __ATMAIN__ = [];\n // functions called during shutdown\n var __ATPOSTRUN__ = [];\n // functions called after the main() is called\n var __RELOC_FUNCS__ = [];\n var runtimeInitialized = false;\n function preRun() {\n if (Module[\"preRun\"]) {\n if (typeof Module[\"preRun\"] == \"function\") Module[\"preRun\"] = [ Module[\"preRun\"] ];\n while (Module[\"preRun\"].length) {\n addOnPreRun(Module[\"preRun\"].shift());\n }\n }\n callRuntimeCallbacks(__ATPRERUN__);\n }\n function initRuntime() {\n runtimeInitialized = true;\n callRuntimeCallbacks(__RELOC_FUNCS__);\n callRuntimeCallbacks(__ATINIT__);\n }\n function preMain() {\n callRuntimeCallbacks(__ATMAIN__);\n }\n function postRun() {\n if (Module[\"postRun\"]) {\n if (typeof Module[\"postRun\"] == \"function\") Module[\"postRun\"] = [ Module[\"postRun\"] ];\n while (Module[\"postRun\"].length) {\n addOnPostRun(Module[\"postRun\"].shift());\n }\n }\n callRuntimeCallbacks(__ATPOSTRUN__);\n }\n function addOnPreRun(cb) {\n __ATPRERUN__.unshift(cb);\n }\n function addOnInit(cb) {\n __ATINIT__.unshift(cb);\n }\n function addOnPostRun(cb) {\n __ATPOSTRUN__.unshift(cb);\n }\n // include: runtime_math.js\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/imul\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/fround\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc\n // end include: runtime_math.js\n // A counter of dependencies for calling run(). If we need to\n // do asynchronous work before running, increment this and\n // decrement it. Incrementing must happen in a place like\n // Module.preRun (used by emcc to add file preloading).\n // Note that you can add dependencies in preRun, even though\n // it happens right before run - run will be postponed until\n // the dependencies are met.\n var runDependencies = 0;\n var runDependencyWatcher = null;\n var dependenciesFulfilled = null;\n // overridden to take different actions when all run dependencies are fulfilled\n function getUniqueRunDependency(id) {\n return id;\n }\n function addRunDependency(id) {\n runDependencies++;\n Module[\"monitorRunDependencies\"]?.(runDependencies);\n }\n function removeRunDependency(id) {\n runDependencies--;\n Module[\"monitorRunDependencies\"]?.(runDependencies);\n if (runDependencies == 0) {\n if (runDependencyWatcher !== null) {\n clearInterval(runDependencyWatcher);\n runDependencyWatcher = null;\n }\n if (dependenciesFulfilled) {\n var callback = dependenciesFulfilled;\n dependenciesFulfilled = null;\n callback();\n }\n }\n }\n /** @param {string|number=} what */ function abort(what) {\n Module[\"onAbort\"]?.(what);\n what = \"Aborted(\" + what + \")\";\n // TODO(sbc): Should we remove printing and leave it up to whoever\n // catches the exception?\n err(what);\n ABORT = true;\n EXITSTATUS = 1;\n what += \". Build with -sASSERTIONS for more info.\";\n // Use a wasm runtime error, because a JS error might be seen as a foreign\n // exception, which means we'd run destructors on it. We need the error to\n // simply make the program stop.\n // FIXME This approach does not work in Wasm EH because it currently does not assume\n // all RuntimeErrors are from traps; it decides whether a RuntimeError is from\n // a trap or not based on a hidden field within the object. So at the moment\n // we don't have a way of throwing a wasm trap from JS. TODO Make a JS API that\n // allows this in the wasm spec.\n // Suppress closure compiler warning here. Closure compiler's builtin extern\n // definition for WebAssembly.RuntimeError claims it takes no arguments even\n // though it can.\n // TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure gets fixed.\n /** @suppress {checkTypes} */ var e = new WebAssembly.RuntimeError(what);\n // Throw the error whether or not MODULARIZE is set because abort is used\n // in code paths apart from instantiation where an exception is expected\n // to be thrown when abort is called.\n throw e;\n }\n // include: memoryprofiler.js\n // end include: memoryprofiler.js\n // include: URIUtils.js\n // Prefix of data URIs emitted by SINGLE_FILE and related options.\n var dataURIPrefix = \"data:application/octet-stream;base64,\";\n /**\n * Indicates whether filename is a base64 data URI.\n * @noinline\n */ var isDataURI = filename => filename.startsWith(dataURIPrefix);\n /**\n * Indicates whether filename is delivered via file protocol (as opposed to http/https)\n * @noinline\n */ var isFileURI = filename => filename.startsWith(\"file://\");\n // end include: URIUtils.js\n // include: runtime_exceptions.js\n // end include: runtime_exceptions.js\n function findWasmBinary() {\n var f = \"tree-sitter.wasm\";\n if (!isDataURI(f)) {\n return locateFile(f);\n }\n return f;\n }\n var wasmBinaryFile;\n function getBinarySync(file) {\n if (file == wasmBinaryFile && wasmBinary) {\n return new Uint8Array(wasmBinary);\n }\n if (readBinary) {\n return readBinary(file);\n }\n throw \"both async and sync fetching of the wasm failed\";\n }\n function getBinaryPromise(binaryFile) {\n // If we don't have the binary yet, load it asynchronously using readAsync.\n if (!wasmBinary) {\n // Fetch the binary using readAsync\n return readAsync(binaryFile).then(response => new Uint8Array(/** @type{!ArrayBuffer} */ (response)), // Fall back to getBinarySync if readAsync fails\n () => getBinarySync(binaryFile));\n }\n // Otherwise, getBinarySync should be able to get it synchronously\n return Promise.resolve().then(() => getBinarySync(binaryFile));\n }\n function instantiateArrayBuffer(binaryFile, imports, receiver) {\n return getBinaryPromise(binaryFile).then(binary => WebAssembly.instantiate(binary, imports)).then(receiver, reason => {\n err(`failed to asynchronously prepare wasm: ${reason}`);\n abort(reason);\n });\n }\n function instantiateAsync(binary, binaryFile, imports, callback) {\n if (!binary && typeof WebAssembly.instantiateStreaming == \"function\" && !isDataURI(binaryFile) && // Don't use streaming for file:// delivered objects in a webview, fetch them synchronously.\n !isFileURI(binaryFile) && // Avoid instantiateStreaming() on Node.js environment for now, as while\n // Node.js v18.1.0 implements it, it does not have a full fetch()\n // implementation yet.\n // Reference:\n // https://github.com/emscripten-core/emscripten/pull/16917\n !ENVIRONMENT_IS_NODE && typeof fetch == \"function\") {\n return fetch(binaryFile, {\n credentials: \"same-origin\"\n }).then(response => {\n // Suppress closure warning here since the upstream definition for\n // instantiateStreaming only allows Promise<Repsponse> rather than\n // an actual Response.\n // TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure is fixed.\n /** @suppress {checkTypes} */ var result = WebAssembly.instantiateStreaming(response, imports);\n return result.then(callback, function(reason) {\n // We expect the most common failure cause to be a bad MIME type for the binary,\n // in which case falling back to ArrayBuffer instantiation should work.\n err(`wasm streaming compile failed: ${reason}`);\n err(\"falling back to ArrayBuffer instantiation\");\n return instantiateArrayBuffer(binaryFile, imports, callback);\n });\n });\n }\n return instantiateArrayBuffer(binaryFile, imports, callback);\n }\n function getWasmImports() {\n // prepare imports\n return {\n \"env\": wasmImports,\n \"wasi_snapshot_preview1\": wasmImports,\n \"GOT.mem\": new Proxy(wasmImports, GOTHandler),\n \"GOT.func\": new Proxy(wasmImports, GOTHandler)\n };\n }\n // Create the wasm instance.\n // Receives the wasm imports, returns the exports.\n function createWasm() {\n var info = getWasmImports();\n // Load the wasm module and create an instance of using native support in the JS engine.\n // handle a generated wasm instance, receiving its exports and\n // performing other necessary setup\n /** @param {WebAssembly.Module=} module*/ function receiveInstance(instance, module) {\n wasmExports = instance.exports;\n wasmExports = relocateExports(wasmExports, 1024);\n var metadata = getDylinkMetadata(module);\n if (metadata.neededDynlibs) {\n dynamicLibraries = metadata.neededDynlibs.concat(dynamicLibraries);\n }\n mergeLibSymbols(wasmExports, \"main\");\n LDSO.init();\n loadDylibs();\n addOnInit(wasmExports[\"__wasm_call_ctors\"]);\n __RELOC_FUNCS__.push(wasmExports[\"__wasm_apply_data_relocs\"]);\n removeRunDependency(\"wasm-instantiate\");\n return wasmExports;\n }\n // wait for the pthread pool (if any)\n addRunDependency(\"wasm-instantiate\");\n // Prefer streaming instantiation if available.\n function receiveInstantiationResult(result) {\n // 'result' is a ResultObject object which has both the module and instance.\n // receiveInstance() will swap in the exports (to Module.asm) so they can be called\n receiveInstance(result[\"instance\"], result[\"module\"]);\n }\n // User shell pages can write their own Module.instantiateWasm = function(imports, successCallback) callback\n // to manually instantiate the Wasm module themselves. This allows pages to\n // run the instantiation parallel to any other async startup actions they are\n // performing.\n // Also pthreads and wasm workers initialize the wasm instance through this\n // path.\n if (Module[\"instantiateWasm\"]) {\n try {\n return Module[\"instantiateWasm\"](info, receiveInstance);\n } catch (e) {\n err(`Module.instantiateWasm callback failed with error: ${e}`);\n return false;\n }\n }\n if (!wasmBinaryFile) wasmBinaryFile = findWasmBinary();\n instantiateAsync(wasmBinary, wasmBinaryFile, info, receiveInstantiationResult);\n return {};\n }\n // include: runtime_debug.js\n // end include: runtime_debug.js\n // === Body ===\n var ASM_CONSTS = {};\n // end include: preamble.js\n /** @constructor */ function ExitStatus(status) {\n this.name = \"ExitStatus\";\n this.message = `Program terminated with exit(${status})`;\n this.status = status;\n }\n var GOT = {};\n var currentModuleWeakSymbols = new Set([]);\n var GOTHandler = {\n get(obj, symName) {\n var rtn = GOT[symName];\n if (!rtn) {\n rtn = GOT[symName] = new WebAssembly.Global({\n \"value\": \"i32\",\n \"mutable\": true\n });\n }\n if (!currentModuleWeakSymbols.has(symName)) {\n // Any non-weak reference to a symbol marks it as `required`, which\n // enabled `reportUndefinedSymbols` to report undefeind symbol errors\n // correctly.\n rtn.required = true;\n }\n return rtn;\n }\n };\n var LE_HEAP_LOAD_F32 = byteOffset => HEAP_DATA_VIEW.getFloat32(byteOffset, true);\n var LE_HEAP_LOAD_F64 = byteOffset => HEAP_DATA_VIEW.getFloat64(byteOffset, true);\n var LE_HEAP_LOAD_I16 = byteOffset => HEAP_DATA_VIEW.getInt16(byteOffset, true);\n var LE_HEAP_LOAD_I32 = byteOffset => HEAP_DATA_VIEW.getInt32(byteOffset, true);\n var LE_HEAP_LOAD_U32 = byteOffset => HEAP_DATA_VIEW.getUint32(byteOffset, true);\n var LE_HEAP_STORE_F32 = (byteOffset, value) => HEAP_DATA_VIEW.setFloat32(byteOffset, value, true);\n var LE_HEAP_STORE_F64 = (byteOffset, value) => HEAP_DATA_VIEW.setFloat64(byteOffset, value, true);\n var LE_HEAP_STORE_I16 = (byteOffset, value) => HEAP_DATA_VIEW.setInt16(byteOffset, value, true);\n var LE_HEAP_STORE_I32 = (byteOffset, value) => HEAP_DATA_VIEW.setInt32(byteOffset, value, true);\n var LE_HEAP_STORE_U32 = (byteOffset, value) => HEAP_DATA_VIEW.setUint32(byteOffset, value, true);\n var callRuntimeCallbacks = callbacks => {\n while (callbacks.length > 0) {\n // Pass the module as the first argument.\n callbacks.shift()(Module);\n }\n };\n var UTF8Decoder = typeof TextDecoder != \"undefined\" ? new TextDecoder : undefined;\n /**\n * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given\n * array that contains uint8 values, returns a copy of that string as a\n * Javascript String object.\n * heapOrArray is either a regular array, or a JavaScript typed array view.\n * @param {number} idx\n * @param {number=} maxBytesToRead\n * @return {string}\n */ var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => {\n var endIdx = idx + maxBytesToRead;\n var endPtr = idx;\n // TextDecoder needs to know the byte length in advance, it doesn't stop on\n // null terminator by itself. Also, use the length info to avoid running tiny\n // strings through TextDecoder, since .subarray() allocates garbage.\n // (As a tiny code save trick, compare endPtr against endIdx using a negation,\n // so that undefined means Infinity)\n while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr;\n if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) {\n return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr));\n }\n var str = \"\";\n // If building with TextDecoder, we have already computed the string length\n // above, so test loop end condition against that\n while (idx < endPtr) {\n // For UTF8 byte structure, see:\n // http://en.wikipedia.org/wiki/UTF-8#Description\n // https://www.ietf.org/rfc/rfc2279.txt\n // https://tools.ietf.org/html/rfc3629\n var u0 = heapOrArray[idx++];\n if (!(u0 & 128)) {\n str += String.fromCharCode(u0);\n continue;\n }\n var u1 = heapOrArray[idx++] & 63;\n if ((u0 & 224) == 192) {\n str += String.fromCharCode(((u0 & 31) << 6) | u1);\n continue;\n }\n var u2 = heapOrArray[idx++] & 63;\n if ((u0 & 240) == 224) {\n u0 = ((u0 & 15) << 12) | (u1 << 6) | u2;\n } else {\n u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heapOrArray[idx++] & 63);\n }\n if (u0 < 65536) {\n str += String.fromCharCode(u0);\n } else {\n var ch = u0 - 65536;\n str += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023));\n }\n }\n return str;\n };\n var getDylinkMetadata = binary => {\n var offset = 0;\n var end = 0;\n function getU8() {\n return binary[offset++];\n }\n function getLEB() {\n var ret = 0;\n var mul = 1;\n while (1) {\n var byte = binary[offset++];\n ret += ((byte & 127) * mul);\n mul *= 128;\n if (!(byte & 128)) break;\n }\n return ret;\n }\n function getString() {\n var len = getLEB();\n offset += len;\n return UTF8ArrayToString(binary, offset - len, len);\n }\n /** @param {string=} message */ function failIf(condition, message) {\n if (condition) throw new Error(message);\n }\n var name = \"dylink.0\";\n if (binary instanceof WebAssembly.Module) {\n var dylinkSection = WebAssembly.Module.customSections(binary, name);\n if (dylinkSection.length === 0) {\n name = \"dylink\";\n dylinkSection = WebAssembly.Module.customSections(binary, name);\n }\n failIf(dylinkSection.length === 0, \"need dylink section\");\n binary = new Uint8Array(dylinkSection[0]);\n end = binary.length;\n } else {\n var int32View = new Uint32Array(new Uint8Array(binary.subarray(0, 24)).buffer);\n var magicNumberFound = int32View[0] == 1836278016 || int32View[0] == 6386541;\n failIf(!magicNumberFound, \"need to see wasm magic number\");\n // \\0asm\n // we should see the dylink custom section right after the magic number and wasm version\n failIf(binary[8] !== 0, \"need the dylink section to be first\");\n offset = 9;\n var section_size = getLEB();\n //section size\n end = offset + section_size;\n name = getString();\n }\n var customSection = {\n neededDynlibs: [],\n tlsExports: new Set,\n weakImports: new Set\n };\n if (name == \"dylink\") {\n customSection.memorySize = getLEB();\n customSection.memoryAlign = getLEB();\n customSection.tableSize = getLEB();\n customSection.tableAlign = getLEB();\n // shared libraries this module needs. We need to load them first, so that\n // current module could resolve its imports. (see tools/shared.py\n // WebAssembly.make_shared_library() for \"dylink\" section extension format)\n var neededDynlibsCount = getLEB();\n for (var i = 0; i < neededDynlibsCount; ++i) {\n var libname = getString();\n customSection.neededDynlibs.push(libname);\n }\n } else {\n failIf(name !== \"dylink.0\");\n var WASM_DYLINK_MEM_INFO = 1;\n var WASM_DYLINK_NEEDED = 2;\n var WASM_DYLINK_EXPORT_INFO = 3;\n var WASM_DYLINK_IMPORT_INFO = 4;\n var WASM_SYMBOL_TLS = 256;\n var WASM_SYMBOL_BINDING_MASK = 3;\n var WASM_SYMBOL_BINDING_WEAK = 1;\n while (offset < end) {\n var subsectionType = getU8();\n var subsectionSize = getLEB();\n if (subsectionType === WASM_DYLINK_MEM_INFO) {\n customSection.memorySize = getLEB();\n customSection.memoryAlign = getLEB();\n customSection.tableSize = getLEB();\n customSection.tableAlign = getLEB();\n } else if (subsectionType === WASM_DYLINK_NEEDED) {\n var neededDynlibsCount = getLEB();\n for (var i = 0; i < neededDynlibsCount; ++i) {\n libname = getString();\n customSection.neededDynlibs.push(libname);\n }\n } else if (subsectionType === WASM_DYLINK_EXPORT_INFO) {\n var count = getLEB();\n while (count--) {\n var symname = getString();\n var flags = getLEB();\n if (flags & WASM_SYMBOL_TLS) {\n customSection.tlsExports.add(symname);\n }\n }\n } else if (subsectionType === WASM_DYLINK_IMPORT_INFO) {\n var count = getLEB();\n while (count--) {\n var modname = getString();\n var symname = getString();\n var flags = getLEB();\n if ((flags & WASM_SYMBOL_BINDING_MASK) == WASM_SYMBOL_BINDING_WEAK) {\n customSection.weakImports.add(symname);\n }\n }\n } else {\n // unknown subsection\n offset += subsectionSize;\n }\n }\n }\n return customSection;\n };\n /**\n * @param {number} ptr\n * @param {string} type\n */ function getValue(ptr, type = \"i8\") {\n if (type.endsWith(\"*\")) type = \"*\";\n switch (type) {\n case \"i1\":\n return HEAP8[ptr];\n\n case \"i8\":\n return HEAP8[ptr];\n\n case \"i16\":\n return LE_HEAP_LOAD_I16(((ptr) >> 1) * 2);\n\n case \"i32\":\n return LE_HEAP_LOAD_I32(((ptr) >> 2) * 4);\n\n case \"i64\":\n abort(\"to do getValue(i64) use WASM_BIGINT\");\n\n case \"float\":\n return LE_HEAP_LOAD_F32(((ptr) >> 2) * 4);\n\n case \"double\":\n return LE_HEAP_LOAD_F64(((ptr) >> 3) * 8);\n\n case \"*\":\n return LE_HEAP_LOAD_U32(((ptr) >> 2) * 4);\n\n default:\n abort(`invalid type for getValue: ${type}`);\n }\n }\n var newDSO = (name, handle, syms) => {\n var dso = {\n refcount: Infinity,\n name: name,\n exports: syms,\n global: true\n };\n LDSO.loadedLibsByName[name] = dso;\n if (handle != undefined) {\n LDSO.loadedLibsByHandle[handle] = dso;\n }\n return dso;\n };\n var LDSO = {\n loadedLibsByName: {},\n loadedLibsByHandle: {},\n init() {\n newDSO(\"__main__\", 0, wasmImports);\n }\n };\n var ___heap_base = 78112;\n var zeroMemory = (address, size) => {\n HEAPU8.fill(0, address, address + size);\n return address;\n };\n var alignMemory = (size, alignment) => Math.ceil(size / alignment) * alignment;\n var getMemory = size => {\n // After the runtime is initialized, we must only use sbrk() normally.\n if (runtimeInitialized) {\n // Currently we don't support freeing of static data when modules are\n // unloaded via dlclose. This function is tagged as `noleakcheck` to\n // avoid having this reported as leak.\n return zeroMemory(_malloc(size), size);\n }\n var ret = ___heap_base;\n // Keep __heap_base stack aligned.\n var end = ret + alignMemory(size, 16);\n ___heap_base = end;\n GOT[\"__heap_base\"].value = end;\n return ret;\n };\n var isInternalSym = symName => [ \"__cpp_exception\", \"__c_longjmp\", \"__wasm_apply_data_relocs\", \"__dso_handle\", \"__tls_size\", \"__tls_align\", \"__set_stack_limits\", \"_emscripten_tls_init\", \"__wasm_init_tls\", \"__wasm_call_ctors\", \"__start_em_asm\", \"__stop_em_asm\", \"__start_em_js\", \"__stop_em_js\" ].includes(symName) || symName.startsWith(\"__em_js__\");\n var uleb128Encode = (n, target) => {\n if (n < 128) {\n target.push(n);\n } else {\n target.push((n % 128) | 128, n >> 7);\n }\n };\n var sigToWasmTypes = sig => {\n var typeNames = {\n \"i\": \"i32\",\n \"j\": \"i64\",\n \"f\": \"f32\",\n \"d\": \"f64\",\n \"e\": \"externref\",\n \"p\": \"i32\"\n };\n var type = {\n parameters: [],\n results: sig[0] == \"v\" ? [] : [ typeNames[sig[0]] ]\n };\n for (var i = 1; i < sig.length; ++i) {\n type.parameters.push(typeNames[sig[i]]);\n }\n return type;\n };\n var generateFuncType = (sig, target) => {\n var sigRet = sig.slice(0, 1);\n var sigParam = sig.slice(1);\n var typeCodes = {\n \"i\": 127,\n // i32\n \"p\": 127,\n // i32\n \"j\": 126,\n // i64\n \"f\": 125,\n // f32\n \"d\": 124,\n // f64\n \"e\": 111\n };\n // Parameters, length + signatures\n target.push(96);\n /* form: func */ uleb128Encode(sigParam.length, target);\n for (var i = 0; i < sigParam.length; ++i) {\n target.push(typeCodes[sigParam[i]]);\n }\n // Return values, length + signatures\n // With no multi-return in MVP, either 0 (void) or 1 (anything else)\n if (sigRet == \"v\") {\n target.push(0);\n } else {\n target.push(1, typeCodes[sigRet]);\n }\n };\n var convertJsFunctionToWasm = (func, sig) => {\n // If the type reflection proposal is available, use the new\n // \"WebAssembly.Function\" constructor.\n // Otherwise, construct a minimal wasm module importing the JS function and\n // re-exporting it.\n if (typeof WebAssembly.Function == \"function\") {\n return new WebAssembly.Function(sigToWasmTypes(sig), func);\n }\n // The module is static, with the exception of the type section, which is\n // generated based on the signature passed in.\n var typeSectionBody = [ 1 ];\n // count: 1\n generateFuncType(sig, typeSectionBody);\n // Rest of the module is static\n var bytes = [ 0, 97, 115, 109, // magic (\"\\0asm\")\n 1, 0, 0, 0, // version: 1\n 1 ];\n // Write the overall length of the type section followed by the body\n uleb128Encode(typeSectionBody.length, bytes);\n bytes.push(...typeSectionBody);\n // The rest of the module is static\n bytes.push(2, 7, // import section\n // (import \"e\" \"f\" (func 0 (type 0)))\n 1, 1, 101, 1, 102, 0, 0, 7, 5, // export section\n // (export \"f\" (func 0 (type 0)))\n 1, 1, 102, 0, 0);\n // We can compile this wasm module synchronously because it is very small.\n // This accepts an import (at \"e.f\"), that it reroutes to an export (at \"f\")\n var module = new WebAssembly.Module(new Uint8Array(bytes));\n var instance = new WebAssembly.Instance(module, {\n \"e\": {\n \"f\": func\n }\n });\n var wrappedFunc = instance.exports[\"f\"];\n return wrappedFunc;\n };\n var wasmTableMirror = [];\n /** @type {WebAssembly.Table} */ var wasmTable = new WebAssembly.Table({\n \"initial\": 28,\n \"element\": \"anyfunc\"\n });\n var getWasmTableEntry = funcPtr => {\n var func = wasmTableMirror[funcPtr];\n if (!func) {\n if (funcPtr >= wasmTableMirror.length) wasmTableMirror.length = funcPtr + 1;\n wasmTableMirror[funcPtr] = func = wasmTable.get(funcPtr);\n }\n return func;\n };\n var updateTableMap = (offset, count) => {\n if (functionsInTableMap) {\n for (var i = offset; i < offset + count; i++) {\n var item = getWasmTableEntry(i);\n // Ignore null values.\n if (item) {\n functionsInTableMap.set(item, i);\n }\n }\n }\n };\n var functionsInTableMap;\n var getFunctionAddress = func => {\n // First, create the map if this is the first use.\n if (!functionsInTableMap) {\n functionsInTableMap = new WeakMap;\n updateTableMap(0, wasmTable.length);\n }\n return functionsInTableMap.get(func) || 0;\n };\n var freeTableIndexes = [];\n var getEmptyTableSlot = () => {\n // Reuse a free index if there is one, otherwise grow.\n if (freeTableIndexes.length) {\n return freeTableIndexes.pop();\n }\n // Grow the table\n try {\n wasmTable.grow(1);\n } catch (err) {\n if (!(err instanceof RangeError)) {\n throw err;\n }\n throw \"Unable to grow wasm table. Set ALLOW_TABLE_GROWTH.\";\n }\n return wasmTable.length - 1;\n };\n var setWasmTableEntry = (idx, func) => {\n wasmTable.set(idx, func);\n // With ABORT_ON_WASM_EXCEPTIONS wasmTable.get is overridden to return wrapped\n // functions so we need to call it here to retrieve the potential wrapper correctly\n // instead of just storing 'func' directly into wasmTableMirror\n wasmTableMirror[idx] = wasmTable.get(idx);\n };\n /** @param {string=} sig */ var addFunction = (func, sig) => {\n // Check if the function is already in the table, to ensure each function\n // gets a unique index.\n var rtn = getFunctionAddress(func);\n if (rtn) {\n return rtn;\n }\n // It's not in the table, add it now.\n var ret = getEmptyTableSlot();\n // Set the new value.\n try {\n // Attempting to call this with JS function will cause of table.set() to fail\n setWasmTableEntry(ret, func);\n } catch (err) {\n if (!(err instanceof TypeError)) {\n throw err;\n }\n var wrapped = convertJsFunctionToWasm(func, sig);\n setWasmTableEntry(ret, wrapped);\n }\n functionsInTableMap.set(func, ret);\n return ret;\n };\n var updateGOT = (exports, replace) => {\n for (var symName in exports) {\n if (isInternalSym(symName)) {\n continue;\n }\n var value = exports[symName];\n if (symName.startsWith(\"orig$\")) {\n symName = symName.split(\"$\")[1];\n replace = true;\n }\n GOT[symName] ||= new WebAssembly.Global({\n \"value\": \"i32\",\n \"mutable\": true\n });\n if (replace || GOT[symName].value == 0) {\n if (typeof value == \"function\") {\n GOT[symName].value = addFunction(value);\n } else if (typeof value == \"number\") {\n GOT[symName].value = value;\n } else {\n err(`unhandled export type for '${symName}': ${typeof value}`);\n }\n }\n }\n };\n /** @param {boolean=} replace */ var relocateExports = (exports, memoryBase, replace) => {\n var relocated = {};\n for (var e in exports) {\n var value = exports[e];\n if (typeof value == \"object\") {\n // a breaking change in the wasm spec, globals are now objects\n // https://github.com/WebAssembly/mutable-global/issues/1\n value = value.value;\n }\n if (typeof value == \"number\") {\n value += memoryBase;\n }\n relocated[e] = value;\n }\n updateGOT(relocated, replace);\n return relocated;\n };\n var isSymbolDefined = symName => {\n // Ignore 'stub' symbols that are auto-generated as part of the original\n // `wasmImports` used to instantiate the main module.\n var existing = wasmImports[symName];\n if (!existing || existing.stub) {\n return false;\n }\n return true;\n };\n var dynCallLegacy = (sig, ptr, args) => {\n sig = sig.replace(/p/g, \"i\");\n var f = Module[\"dynCall_\" + sig];\n return f(ptr, ...args);\n };\n var dynCall = (sig, ptr, args = []) => {\n // Without WASM_BIGINT support we cannot directly call function with i64 as\n // part of their signature, so we rely on the dynCall functions generated by\n // wasm-emscripten-finalize\n if (sig.includes(\"j\")) {\n return dynCallLegacy(sig, ptr, args);\n }\n var rtn = getWasmTableEntry(ptr)(...args);\n return rtn;\n };\n var stackSave = () => _emscripten_stack_get_current();\n var stackRestore = val => __emscripten_stack_restore(val);\n var createInvokeFunction = sig => (ptr, ...args) => {\n var sp = stackSave();\n try {\n return dynCall(sig, ptr, args);\n } catch (e) {\n stackRestore(sp);\n // Create a try-catch guard that rethrows the Emscripten EH exception.\n // Exceptions thrown from C++ will be a pointer (number) and longjmp\n // will throw the number Infinity. Use the compact and fast \"e !== e+0\"\n // test to check if e was not a Number.\n if (e !== e + 0) throw e;\n _setThrew(1, 0);\n }\n };\n var resolveGlobalSymbol = (symName, direct = false) => {\n var sym;\n // First look for the orig$ symbol which is the symbol without i64\n // legalization performed.\n if (direct && (\"orig$\" + symName in wasmImports)) {\n symName = \"orig$\" + symName;\n }\n if (isSymbolDefined(symName)) {\n sym = wasmImports[symName];\n } else // Asm.js-style exception handling: invoke wrapper generation\n if (symName.startsWith(\"invoke_\")) {\n // Create (and cache) new invoke_ functions on demand.\n sym = wasmImports[symName] = createInvokeFunction(symName.split(\"_\")[1]);\n }\n return {\n sym: sym,\n name: symName\n };\n };\n /**\n * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the\n * emscripten HEAP, returns a copy of that string as a Javascript String object.\n *\n * @param {number} ptr\n * @param {number=} maxBytesToRead - An optional length that specifies the\n * maximum number of bytes to read. You can omit this parameter to scan the\n * string until the first 0 byte. If maxBytesToRead is passed, and the string\n * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the\n * string will cut short at that byte index (i.e. maxBytesToRead will not\n * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing\n * frequent uses of UTF8ToString() with and without maxBytesToRead may throw\n * JS JIT optimizations off, so it is worth to consider consistently using one\n * @return {string}\n */ var UTF8ToString = (ptr, maxBytesToRead) => ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : \"\";\n /**\n * @param {string=} libName\n * @param {Object=} localScope\n * @param {number=} handle\n */ var loadWebAssemblyModule = (binary, flags, libName, localScope, handle) => {\n var metadata = getDylinkMetadata(binary);\n currentModuleWeakSymbols = metadata.weakImports;\n // loadModule loads the wasm module after all its dependencies have been loaded.\n // can be called both sync/async.\n function loadModule() {\n // The first thread to load a given module needs to allocate the static\n // table and memory regions. Later threads re-use the same table region\n // and can ignore the memory region (since memory is shared between\n // threads already).\n // If `handle` is specified than it is assumed that the calling thread has\n // exclusive access to it for the duration of this function. See the\n // locking in `dynlink.c`.\n var firstLoad = !handle || !HEAP8[(handle) + (8)];\n if (firstLoad) {\n // alignments are powers of 2\n var memAlign = Math.pow(2, metadata.memoryAlign);\n // prepare memory\n var memoryBase = metadata.memorySize ? alignMemory(getMemory(metadata.memorySize + memAlign), memAlign) : 0;\n // TODO: add to cleanups\n var tableBase = metadata.tableSize ? wasmTable.length : 0;\n if (handle) {\n HEAP8[(handle) + (8)] = 1;\n LE_HEAP_STORE_U32((((handle) + (12)) >> 2) * 4, memoryBase);\n LE_HEAP_STORE_I32((((handle) + (16)) >> 2) * 4, metadata.memorySize);\n LE_HEAP_STORE_U32((((handle) + (20)) >> 2) * 4, tableBase);\n LE_HEAP_STORE_I32((((handle) + (24)) >> 2) * 4, metadata.tableSize);\n }\n } else {\n memoryBase = LE_HEAP_LOAD_U32((((handle) + (12)) >> 2) * 4);\n tableBase = LE_HEAP_LOAD_U32((((handle) + (20)) >> 2) * 4);\n }\n var tableGrowthNeeded = tableBase + metadata.tableSize - wasmTable.length;\n if (tableGrowthNeeded > 0) {\n wasmTable.grow(tableGrowthNeeded);\n }\n // This is the export map that we ultimately return. We declare it here\n // so it can be used within resolveSymbol. We resolve symbols against\n // this local symbol map in the case there they are not present on the\n // global Module object. We need this fallback because Modules sometime\n // need to import their own symbols\n var moduleExports;\n function resolveSymbol(sym) {\n var resolved = resolveGlobalSymbol(sym).sym;\n if (!resolved && localScope) {\n resolved = localScope[sym];\n }\n if (!resolved) {\n resolved = moduleExports[sym];\n }\n return resolved;\n }\n // TODO kill ↓↓↓ (except \"symbols local to this module\", it will likely be\n // not needed if we require that if A wants symbols from B it has to link\n // to B explicitly: similarly to -Wl,--no-undefined)\n // wasm dynamic libraries are pure wasm, so they cannot assist in\n // their own loading. When side module A wants to import something\n // provided by a side module B that is loaded later, we need to\n // add a layer of indirection, but worse, we can't even tell what\n // to add the indirection for, without inspecting what A's imports\n // are. To do that here, we use a JS proxy (another option would\n // be to inspect the binary directly).\n var proxyHandler = {\n get(stubs, prop) {\n // symbols that should be local to this module\n switch (prop) {\n case \"__memory_base\":\n return memoryBase;\n\n case \"__table_base\":\n return tableBase;\n }\n if (prop in wasmImports && !wasmImports[prop].stub) {\n // No stub needed, symbol already exists in symbol table\n return wasmImports[prop];\n }\n // Return a stub function that will resolve the symbol\n // when first called.\n if (!(prop in stubs)) {\n var resolved;\n stubs[prop] = (...args) => {\n resolved ||= resolveSymbol(prop);\n return resolved(...args);\n };\n }\n return stubs[prop];\n }\n };\n var proxy = new Proxy({}, proxyHandler);\n var info = {\n \"GOT.mem\": new Proxy({}, GOTHandler),\n \"GOT.func\": new Proxy({}, GOTHandler),\n \"env\": proxy,\n \"wasi_snapshot_preview1\": proxy\n };\n function postInstantiation(module, instance) {\n // add new entries to functionsInTableMap\n updateTableMap(tableBase, metadata.tableSize);\n moduleExports = relocateExports(instance.exports, memoryBase);\n if (!flags.allowUndefined) {\n reportUndefinedSymbols();\n }\n function addEmAsm(addr, body) {\n var args = [];\n var arity = 0;\n for (;arity < 16; arity++) {\n if (body.indexOf(\"$\" + arity) != -1) {\n args.push(\"$\" + arity);\n } else {\n break;\n }\n }\n args = args.join(\",\");\n var func = `(${args}) => { ${body} };`;\n ASM_CONSTS[start] = eval(func);\n }\n // Add any EM_ASM function that exist in the side module\n if (\"__start_em_asm\" in moduleExports) {\n var start = moduleExports[\"__start_em_asm\"];\n var stop = moduleExports[\"__stop_em_asm\"];\n while (start < stop) {\n var jsString = UTF8ToString(start);\n addEmAsm(start, jsString);\n start = HEAPU8.indexOf(0, start) + 1;\n }\n }\n function addEmJs(name, cSig, body) {\n // The signature here is a C signature (e.g. \"(int foo, char* bar)\").\n // See `create_em_js` in emcc.py` for the build-time version of this\n // code.\n var jsArgs = [];\n cSig = cSig.slice(1, -1);\n if (cSig != \"void\") {\n cSig = cSig.split(\",\");\n for (var i in cSig) {\n var jsArg = cSig[i].split(\" \").pop();\n jsArgs.push(jsArg.replace(\"*\", \"\"));\n }\n }\n var func = `(${jsArgs}) => ${body};`;\n moduleExports[name] = eval(func);\n }\n for (var name in moduleExports) {\n if (name.startsWith(\"__em_js__\")) {\n var start = moduleExports[name];\n var jsString = UTF8ToString(start);\n // EM_JS strings are stored in the data section in the form\n // SIG<::>BODY.\n var parts = jsString.split(\"<::>\");\n addEmJs(name.replace(\"__em_js__\", \"\"), parts[0], parts[1]);\n delete moduleExports[name];\n }\n }\n // initialize the module\n var applyRelocs = moduleExports[\"__wasm_apply_data_relocs\"];\n if (applyRelocs) {\n if (runtimeInitialized) {\n applyRelocs();\n } else {\n __RELOC_FUNCS__.push(applyRelocs);\n }\n }\n var init = moduleExports[\"__wasm_call_ctors\"];\n if (init) {\n if (runtimeInitialized) {\n init();\n } else {\n // we aren't ready to run compiled code yet\n __ATINIT__.push(init);\n }\n }\n return moduleExports;\n }\n if (flags.loadAsync) {\n if (binary instanceof WebAssembly.Module) {\n var instance = new WebAssembly.Instance(binary, info);\n return Promise.resolve(postInstantiation(binary, instance));\n }\n return WebAssembly.instantiate(binary, info).then(result => postInstantiation(result.module, result.instance));\n }\n var module = binary instanceof WebAssembly.Module ? binary : new WebAssembly.Module(binary);\n var instance = new WebAssembly.Instance(module, info);\n return postInstantiation(module, instance);\n }\n // now load needed libraries and the module itself.\n if (flags.loadAsync) {\n return metadata.neededDynlibs.reduce((chain, dynNeeded) => chain.then(() => loadDynamicLibrary(dynNeeded, flags, localScope)), Promise.resolve()).then(loadModule);\n }\n metadata.neededDynlibs.forEach(needed => loadDynamicLibrary(needed, flags, localScope));\n return loadModule();\n };\n var mergeLibSymbols = (exports, libName) => {\n // add symbols into global namespace TODO: weak linking etc.\n for (var [sym, exp] of Object.entries(exports)) {\n // When RTLD_GLOBAL is enabled, the symbols defined by this shared object\n // will be made available for symbol resolution of subsequently loaded\n // shared objects.\n // We should copy the symbols (which include methods and variables) from\n // SIDE_MODULE to MAIN_MODULE.\n const setImport = target => {\n if (!isSymbolDefined(target)) {\n wasmImports[target] = exp;\n }\n };\n setImport(sym);\n // Special case for handling of main symbol: If a side module exports\n // `main` that also acts a definition for `__main_argc_argv` and vice\n // versa.\n const main_alias = \"__main_argc_argv\";\n if (sym == \"main\") {\n setImport(main_alias);\n }\n if (sym == main_alias) {\n setImport(\"main\");\n }\n if (sym.startsWith(\"dynCall_\") && !Module.hasOwnProperty(sym)) {\n Module[sym] = exp;\n }\n }\n };\n /** @param {boolean=} noRunDep */ var asyncLoad = (url, onload, onerror, noRunDep) => {\n var dep = !noRunDep ? getUniqueRunDependency(`al ${url}`) : \"\";\n readAsync(url).then(arrayBuffer => {\n onload(new Uint8Array(arrayBuffer));\n if (dep) removeRunDependency(dep);\n }, err => {\n if (onerror) {\n onerror();\n } else {\n throw `Loading data file \"${url}\" failed.`;\n }\n });\n if (dep) addRunDependency(dep);\n };\n /**\n * @param {number=} handle\n * @param {Object=} localScope\n */ function loadDynamicLibrary(libName, flags = {\n global: true,\n nodelete: true\n }, localScope, handle) {\n // when loadDynamicLibrary did not have flags, libraries were loaded\n // globally & permanently\n var dso = LDSO.loadedLibsByName[libName];\n if (dso) {\n // the library is being loaded or has been loaded already.\n if (!flags.global) {\n if (localScope) {\n Object.assign(localScope, dso.exports);\n }\n } else if (!dso.global) {\n // The library was previously loaded only locally but not\n // we have a request with global=true.\n dso.global = true;\n mergeLibSymbols(dso.exports, libName);\n }\n // same for \"nodelete\"\n if (flags.nodelete && dso.refcount !== Infinity) {\n dso.refcount = Infinity;\n }\n dso.refcount++;\n if (handle) {\n LDSO.loadedLibsByHandle[handle] = dso;\n }\n return flags.loadAsync ? Promise.resolve(true) : true;\n }\n // allocate new DSO\n dso = newDSO(libName, handle, \"loading\");\n dso.refcount = flags.nodelete ? Infinity : 1;\n dso.global = flags.global;\n // libName -> libData\n function loadLibData() {\n // for wasm, we can use fetch for async, but for fs mode we can only imitate it\n if (handle) {\n var data = LE_HEAP_LOAD_U32((((handle) + (28)) >> 2) * 4);\n var dataSize = LE_HEAP_LOAD_U32((((handle) + (32)) >> 2) * 4);\n if (data && dataSize) {\n var libData = HEAP8.slice(data, data + dataSize);\n return flags.loadAsync ? Promise.resolve(libData) : libData;\n }\n }\n var libFile = locateFile(libName);\n if (flags.loadAsync) {\n return new Promise(function(resolve, reject) {\n asyncLoad(libFile, resolve, reject);\n });\n }\n // load the binary synchronously\n if (!readBinary) {\n throw new Error(`${libFile}: file not found, and synchronous loading of external files is not available`);\n }\n return readBinary(libFile);\n }\n // libName -> exports\n function getExports() {\n // module not preloaded - load lib data and create new module from it\n if (flags.loadAsync) {\n return loadLibData().then(libData => loadWebAssemblyModule(libData, flags, libName, localScope, handle));\n }\n return loadWebAssemblyModule(loadLibData(), flags, libName, localScope, handle);\n }\n // module for lib is loaded - update the dso & global namespace\n function moduleLoaded(exports) {\n if (dso.global) {\n mergeLibSymbols(exports, libName);\n } else if (localScope) {\n Object.assign(localScope, exports);\n }\n dso.exports = exports;\n }\n if (flags.loadAsync) {\n return getExports().then(exports => {\n moduleLoaded(exports);\n return true;\n });\n }\n moduleLoaded(getExports());\n return true;\n }\n var reportUndefinedSymbols = () => {\n for (var [symName, entry] of Object.entries(GOT)) {\n if (entry.value == 0) {\n var value = resolveGlobalSymbol(symName, true).sym;\n if (!value && !entry.required) {\n // Ignore undefined symbols that are imported as weak.\n continue;\n }\n if (typeof value == \"function\") {\n /** @suppress {checkTypes} */ entry.value = addFunction(value, value.sig);\n } else if (typeof value == \"number\") {\n entry.value = value;\n } else {\n throw new Error(`bad export type for '${symName}': ${typeof value}`);\n }\n }\n }\n };\n var loadDylibs = () => {\n if (!dynamicLibraries.length) {\n reportUndefinedSymbols();\n return;\n }\n // Load binaries asynchronously\n addRunDependency(\"loadDylibs\");\n dynamicLibraries.reduce((chain, lib) => chain.then(() => loadDynamicLibrary(lib, {\n loadAsync: true,\n global: true,\n nodelete: true,\n allowUndefined: true\n })), Promise.resolve()).then(() => {\n // we got them all, wonderful\n reportUndefinedSymbols();\n removeRunDependency(\"loadDylibs\");\n });\n };\n var noExitRuntime = Module[\"noExitRuntime\"] || true;\n /**\n * @param {number} ptr\n * @param {number} value\n * @param {string} type\n */ function setValue(ptr, value, type = \"i8\") {\n if (type.endsWith(\"*\")) type = \"*\";\n switch (type) {\n case \"i1\":\n HEAP8[ptr] = value;\n break;\n\n case \"i8\":\n HEAP8[ptr] = value;\n break;\n\n case \"i16\":\n LE_HEAP_STORE_I16(((ptr) >> 1) * 2, value);\n break;\n\n case \"i32\":\n LE_HEAP_STORE_I32(((ptr) >> 2) * 4, value);\n break;\n\n case \"i64\":\n abort(\"to do setValue(i64) use WASM_BIGINT\");\n\n case \"float\":\n LE_HEAP_STORE_F32(((ptr) >> 2) * 4, value);\n break;\n\n case \"double\":\n LE_HEAP_STORE_F64(((ptr) >> 3) * 8, value);\n break;\n\n case \"*\":\n LE_HEAP_STORE_U32(((ptr) >> 2) * 4, value);\n break;\n\n default:\n abort(`invalid type for setValue: ${type}`);\n }\n }\n var ___memory_base = new WebAssembly.Global({\n \"value\": \"i32\",\n \"mutable\": false\n }, 1024);\n var ___stack_pointer = new WebAssembly.Global({\n \"value\": \"i32\",\n \"mutable\": true\n }, 78112);\n var ___table_base = new WebAssembly.Global({\n \"value\": \"i32\",\n \"mutable\": false\n }, 1);\n var __abort_js = () => {\n abort(\"\");\n };\n __abort_js.sig = \"v\";\n var nowIsMonotonic = 1;\n var __emscripten_get_now_is_monotonic = () => nowIsMonotonic;\n __emscripten_get_now_is_monotonic.sig = \"i\";\n var __emscripten_memcpy_js = (dest, src, num) => HEAPU8.copyWithin(dest, src, src + num);\n __emscripten_memcpy_js.sig = \"vppp\";\n var _emscripten_date_now = () => Date.now();\n _emscripten_date_now.sig = \"d\";\n var _emscripten_get_now;\n // Modern environment where performance.now() is supported:\n // N.B. a shorter form \"_emscripten_get_now = performance.now;\" is\n // unfortunately not allowed even in current browsers (e.g. FF Nightly 75).\n _emscripten_get_now = () => performance.now();\n _emscripten_get_now.sig = \"d\";\n var getHeapMax = () => // Stay one Wasm page short of 4GB: while e.g. Chrome is able to allocate\n // full 4GB Wasm memories, the size will wrap back to 0 bytes in Wasm side\n // for any code that deals with heap sizes, which would require special\n // casing all heap size related code to treat 0 specially.\n 2147483648;\n var growMemory = size => {\n var b = wasmMemory.buffer;\n var pages = (size - b.byteLength + 65535) / 65536;\n try {\n // round size grow request up to wasm page size (fixed 64KB per spec)\n wasmMemory.grow(pages);\n // .grow() takes a delta compared to the previous size\n updateMemoryViews();\n return 1;\n } /*success*/ catch (e) {}\n };\n // implicit 0 return to save code size (caller will cast \"undefined\" into 0\n // anyhow)\n var _emscripten_resize_heap = requestedSize => {\n var oldSize = HEAPU8.length;\n // With CAN_ADDRESS_2GB or MEMORY64, pointers are already unsigned.\n requestedSize >>>= 0;\n // With multithreaded builds, races can happen (another thread might increase the size\n // in between), so return a failure, and let the caller retry.\n // Memory resize rules:\n // 1. Always increase heap size to at least the requested size, rounded up\n // to next page multiple.\n // 2a. If MEMORY_GROWTH_LINEAR_STEP == -1, excessively resize the heap\n // geometrically: increase the heap size according to\n // MEMORY_GROWTH_GEOMETRIC_STEP factor (default +20%), At most\n // overreserve by MEMORY_GROWTH_GEOMETRIC_CAP bytes (default 96MB).\n // 2b. If MEMORY_GROWTH_LINEAR_STEP != -1, excessively resize the heap\n // linearly: increase the heap size by at least\n // MEMORY_GROWTH_LINEAR_STEP bytes.\n // 3. Max size for the heap is capped at 2048MB-WASM_PAGE_SIZE, or by\n // MAXIMUM_MEMORY, or by ASAN limit, depending on which is smallest\n // 4. If we were unable to allocate as much memory, it may be due to\n // over-eager decision to excessively reserve due to (3) above.\n // Hence if an allocation fails, cut down on the amount of excess\n // growth, in an attempt to succeed to perform a smaller allocation.\n // A limit is set for how much we can grow. We should not exceed that\n // (the wasm binary specifies it, so if we tried, we'd fail anyhow).\n var maxHeapSize = getHeapMax();\n if (requestedSize > maxHeapSize) {\n return false;\n }\n var alignUp = (x, multiple) => x + (multiple - x % multiple) % multiple;\n // Loop through potential heap size increases. If we attempt a too eager\n // reservation that fails, cut down on the attempted size and reserve a\n // smaller bump instead. (max 3 times, chosen somewhat arbitrarily)\n for (var cutDown = 1; cutDown <= 4; cutDown *= 2) {\n var overGrownHeapSize = oldSize * (1 + .2 / cutDown);\n // ensure geometric growth\n // but limit overreserving (default to capping at +96MB overgrowth at most)\n overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296);\n var newSize = Math.min(maxHeapSize, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536));\n var replacement = growMemory(newSize);\n if (replacement) {\n return true;\n }\n }\n return false;\n };\n _emscripten_resize_heap.sig = \"ip\";\n var _fd_close = fd => 52;\n _fd_close.sig = \"ii\";\n var convertI32PairToI53Checked = (lo, hi) => ((hi + 2097152) >>> 0 < 4194305 - !!lo) ? (lo >>> 0) + hi * 4294967296 : NaN;\n function _fd_seek(fd, offset_low, offset_high, whence, newOffset) {\n var offset = convertI32PairToI53Checked(offset_low, offset_high);\n return 70;\n }\n _fd_seek.sig = \"iiiiip\";\n var printCharBuffers = [ null, [], [] ];\n var printChar = (stream, curr) => {\n var buffer = printCharBuffers[stream];\n if (curr === 0 || curr === 10) {\n (stream === 1 ? out : err)(UTF8ArrayToString(buffer, 0));\n buffer.length = 0;\n } else {\n buffer.push(curr);\n }\n };\n var _fd_write = (fd, iov, iovcnt, pnum) => {\n // hack to support printf in SYSCALLS_REQUIRE_FILESYSTEM=0\n var num = 0;\n for (var i = 0; i < iovcnt; i++) {\n var ptr = LE_HEAP_LOAD_U32(((iov) >> 2) * 4);\n var len = LE_HEAP_LOAD_U32((((iov) + (4)) >> 2) * 4);\n iov += 8;\n for (var j = 0; j < len; j++) {\n printChar(fd, HEAPU8[ptr + j]);\n }\n num += len;\n }\n LE_HEAP_STORE_U32(((pnum) >> 2) * 4, num);\n return 0;\n };\n _fd_write.sig = \"iippp\";\n function _tree_sitter_log_callback(isLexMessage, messageAddress) {\n if (currentLogCallback) {\n const message = UTF8ToString(messageAddress);\n currentLogCallback(message, isLexMessage !== 0);\n }\n }\n function _tree_sitter_parse_callback(inputBufferAddress, index, row, column, lengthAddress) {\n const INPUT_BUFFER_SIZE = 10 * 1024;\n const string = currentParseCallback(index, {\n row: row,\n column: column\n });\n if (typeof string === \"string\") {\n setValue(lengthAddress, string.length, \"i32\");\n stringToUTF16(string, inputBufferAddress, INPUT_BUFFER_SIZE);\n } else {\n setValue(lengthAddress, 0, \"i32\");\n }\n }\n var runtimeKeepaliveCounter = 0;\n var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0;\n var _proc_exit = code => {\n EXITSTATUS = code;\n if (!keepRuntimeAlive()) {\n Module[\"onExit\"]?.(code);\n ABORT = true;\n }\n quit_(code, new ExitStatus(code));\n };\n _proc_exit.sig = \"vi\";\n /** @param {boolean|number=} implicit */ var exitJS = (status, implicit) => {\n EXITSTATUS = status;\n _proc_exit(status);\n };\n var handleException = e => {\n // Certain exception types we do not treat as errors since they are used for\n // internal control flow.\n // 1. ExitStatus, which is thrown by exit()\n // 2. \"unwind\", which is thrown by emscripten_unwind_to_js_event_loop() and others\n // that wish to return to JS event loop.\n if (e instanceof ExitStatus || e == \"unwind\") {\n return EXITSTATUS;\n }\n quit_(1, e);\n };\n var lengthBytesUTF8 = str => {\n var len = 0;\n for (var i = 0; i < str.length; ++i) {\n // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code\n // unit, not a Unicode code point of the character! So decode\n // UTF16->UTF32->UTF8.\n // See http://unicode.org/faq/utf_bom.html#utf16-3\n var c = str.charCodeAt(i);\n // possibly a lead surrogate\n if (c <= 127) {\n len++;\n } else if (c <= 2047) {\n len += 2;\n } else if (c >= 55296 && c <= 57343) {\n len += 4;\n ++i;\n } else {\n len += 3;\n }\n }\n return len;\n };\n var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {\n // Parameter maxBytesToWrite is not optional. Negative values, 0, null,\n // undefined and false each don't write out any bytes.\n if (!(maxBytesToWrite > 0)) return 0;\n var startIdx = outIdx;\n var endIdx = outIdx + maxBytesToWrite - 1;\n // -1 for string null terminator.\n for (var i = 0; i < str.length; ++i) {\n // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code\n // unit, not a Unicode code point of the character! So decode\n // UTF16->UTF32->UTF8.\n // See http://unicode.org/faq/utf_bom.html#utf16-3\n // For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description\n // and https://www.ietf.org/rfc/rfc2279.txt\n // and https://tools.ietf.org/html/rfc3629\n var u = str.charCodeAt(i);\n // possibly a lead surrogate\n if (u >= 55296 && u <= 57343) {\n var u1 = str.charCodeAt(++i);\n u = 65536 + ((u & 1023) << 10) | (u1 & 1023);\n }\n if (u <= 127) {\n if (outIdx >= endIdx) break;\n heap[outIdx++] = u;\n } else if (u <= 2047) {\n if (outIdx + 1 >= endIdx) break;\n heap[outIdx++] = 192 | (u >> 6);\n heap[outIdx++] = 128 | (u & 63);\n } else if (u <= 65535) {\n if (outIdx + 2 >= endIdx) break;\n heap[outIdx++] = 224 | (u >> 12);\n heap[outIdx++] = 128 | ((u >> 6) & 63);\n heap[outIdx++] = 128 | (u & 63);\n } else {\n if (outIdx + 3 >= endIdx) break;\n heap[outIdx++] = 240 | (u >> 18);\n heap[outIdx++] = 128 | ((u >> 12) & 63);\n heap[outIdx++] = 128 | ((u >> 6) & 63);\n heap[outIdx++] = 128 | (u & 63);\n }\n }\n // Null-terminate the pointer to the buffer.\n heap[outIdx] = 0;\n return outIdx - startIdx;\n };\n var stringToUTF8 = (str, outPtr, maxBytesToWrite) => stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite);\n var stackAlloc = sz => __emscripten_stack_alloc(sz);\n var stringToUTF8OnStack = str => {\n var size = lengthBytesUTF8(str) + 1;\n var ret = stackAlloc(size);\n stringToUTF8(str, ret, size);\n return ret;\n };\n var stringToUTF16 = (str, outPtr, maxBytesToWrite) => {\n // Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed.\n maxBytesToWrite ??= 2147483647;\n if (maxBytesToWrite < 2) return 0;\n maxBytesToWrite -= 2;\n // Null terminator.\n var startPtr = outPtr;\n var numCharsToWrite = (maxBytesToWrite < str.length * 2) ? (maxBytesToWrite / 2) : str.length;\n for (var i = 0; i < numCharsToWrite; ++i) {\n // charCodeAt returns a UTF-16 encoded code unit, so it can be directly written to the HEAP.\n var codeUnit = str.charCodeAt(i);\n // possibly a lead surrogate\n LE_HEAP_STORE_I16(((outPtr) >> 1) * 2, codeUnit);\n outPtr += 2;\n }\n // Null-terminate the pointer to the HEAP.\n LE_HEAP_STORE_I16(((outPtr) >> 1) * 2, 0);\n return outPtr - startPtr;\n };\n var AsciiToString = ptr => {\n var str = \"\";\n while (1) {\n var ch = HEAPU8[ptr++];\n if (!ch) return str;\n str += String.fromCharCode(ch);\n }\n };\n var wasmImports = {\n /** @export */ __heap_base: ___heap_base,\n /** @export */ __indirect_function_table: wasmTable,\n /** @export */ __memory_base: ___memory_base,\n /** @export */ __stack_pointer: ___stack_pointer,\n /** @export */ __table_base: ___table_base,\n /** @export */ _abort_js: __abort_js,\n /** @export */ _emscripten_get_now_is_monotonic: __emscripten_get_now_is_monotonic,\n /** @export */ _emscripten_memcpy_js: __emscripten_memcpy_js,\n /** @export */ emscripten_get_now: _emscripten_get_now,\n /** @export */ emscripten_resize_heap: _emscripten_resize_heap,\n /** @export */ fd_close: _fd_close,\n /** @export */ fd_seek: _fd_seek,\n /** @export */ fd_write: _fd_write,\n /** @export */ memory: wasmMemory,\n /** @export */ tree_sitter_log_callback: _tree_sitter_log_callback,\n /** @export */ tree_sitter_parse_callback: _tree_sitter_parse_callback\n };\n var wasmExports = createWasm();\n var ___wasm_call_ctors = () => (___wasm_call_ctors = wasmExports[\"__wasm_call_ctors\"])();\n var ___wasm_apply_data_relocs = () => (___wasm_apply_data_relocs = wasmExports[\"__wasm_apply_data_relocs\"])();\n var _malloc = Module[\"_malloc\"] = a0 => (_malloc = Module[\"_malloc\"] = wasmExports[\"malloc\"])(a0);\n var _calloc = Module[\"_calloc\"] = (a0, a1) => (_calloc = Module[\"_calloc\"] = wasmExports[\"calloc\"])(a0, a1);\n var _realloc = Module[\"_realloc\"] = (a0, a1) => (_realloc = Module[\"_realloc\"] = wasmExports[\"realloc\"])(a0, a1);\n var _free = Module[\"_free\"] = a0 => (_free = Module[\"_free\"] = wasmExports[\"free\"])(a0);\n var _ts_language_symbol_count = Module[\"_ts_language_symbol_count\"] = a0 => (_ts_language_symbol_count = Module[\"_ts_language_symbol_count\"] = wasmExports[\"ts_language_symbol_count\"])(a0);\n var _ts_language_state_count = Module[\"_ts_language_state_count\"] = a0 => (_ts_language_state_count = Module[\"_ts_language_state_count\"] = wasmExports[\"ts_language_state_count\"])(a0);\n var _ts_language_version = Module[\"_ts_language_version\"] = a0 => (_ts_language_version = Module[\"_ts_language_version\"] = wasmExports[\"ts_language_version\"])(a0);\n var _ts_language_field_count = Module[\"_ts_language_field_count\"] = a0 => (_ts_language_field_count = Module[\"_ts_language_field_count\"] = wasmExports[\"ts_language_field_count\"])(a0);\n var _ts_language_next_state = Module[\"_ts_language_next_state\"] = (a0, a1, a2) => (_ts_language_next_state = Module[\"_ts_language_next_state\"] = wasmExports[\"ts_language_next_state\"])(a0, a1, a2);\n var _ts_language_symbol_name = Module[\"_ts_language_symbol_name\"] = (a0, a1) => (_ts_language_symbol_name = Module[\"_ts_language_symbol_name\"] = wasmExports[\"ts_language_symbol_name\"])(a0, a1);\n var _ts_language_symbol_for_name = Module[\"_ts_language_symbol_for_name\"] = (a0, a1, a2, a3) => (_ts_language_symbol_for_name = Module[\"_ts_language_symbol_for_name\"] = wasmExports[\"ts_language_symbol_for_name\"])(a0, a1, a2, a3);\n var _strncmp = Module[\"_strncmp\"] = (a0, a1, a2) => (_strncmp = Module[\"_strncmp\"] = wasmExports[\"strncmp\"])(a0, a1, a2);\n var _ts_language_symbol_type = Module[\"_ts_language_symbol_type\"] = (a0, a1) => (_ts_language_symbol_type = Module[\"_ts_language_symbol_type\"] = wasmExports[\"ts_language_symbol_type\"])(a0, a1);\n var _ts_language_field_name_for_id = Module[\"_ts_language_field_name_for_id\"] = (a0, a1) => (_ts_language_field_name_for_id = Module[\"_ts_language_field_name_for_id\"] = wasmExports[\"ts_language_field_name_for_id\"])(a0, a1);\n var _ts_lookahead_iterator_new = Module[\"_ts_lookahead_iterator_new\"] = (a0, a1) => (_ts_lookahead_iterator_new = Module[\"_ts_lookahead_iterator_new\"] = wasmExports[\"ts_lookahead_iterator_new\"])(a0, a1);\n var _ts_lookahead_iterator_delete = Module[\"_ts_lookahead_iterator_delete\"] = a0 => (_ts_lookahead_iterator_delete = Module[\"_ts_lookahead_iterator_delete\"] = wasmExports[\"ts_lookahead_iterator_delete\"])(a0);\n var _ts_lookahead_iterator_reset_state = Module[\"_ts_lookahead_iterator_reset_state\"] = (a0, a1) => (_ts_lookahead_iterator_reset_state = Module[\"_ts_lookahead_iterator_reset_state\"] = wasmExports[\"ts_lookahead_iterator_reset_state\"])(a0, a1);\n var _ts_lookahead_iterator_reset = Module[\"_ts_lookahead_iterator_reset\"] = (a0, a1, a2) => (_ts_lookahead_iterator_reset = Module[\"_ts_lookahead_iterator_reset\"] = wasmExports[\"ts_lookahead_iterator_reset\"])(a0, a1, a2);\n var _ts_lookahead_iterator_next = Module[\"_ts_lookahead_iterator_next\"] = a0 => (_ts_lookahead_iterator_next = Module[\"_ts_lookahead_iterator_next\"] = wasmExports[\"ts_lookahead_iterator_next\"])(a0);\n var _ts_lookahead_iterator_current_symbol = Module[\"_ts_lookahead_iterator_current_symbol\"] = a0 => (_ts_lookahead_iterator_current_symbol = Module[\"_ts_lookahead_iterator_current_symbol\"] = wasmExports[\"ts_lookahead_iterator_current_symbol\"])(a0);\n var _memset = Module[\"_memset\"] = (a0, a1, a2) => (_memset = Module[\"_memset\"] = wasmExports[\"memset\"])(a0, a1, a2);\n var _memcpy = Module[\"_memcpy\"] = (a0, a1, a2) => (_memcpy = Module[\"_memcpy\"] = wasmExports[\"memcpy\"])(a0, a1, a2);\n var _ts_parser_delete = Module[\"_ts_parser_delete\"] = a0 => (_ts_parser_delete = Module[\"_ts_parser_delete\"] = wasmExports[\"ts_parser_delete\"])(a0);\n var _ts_parser_reset = Module[\"_ts_parser_reset\"] = a0 => (_ts_parser_reset = Module[\"_ts_parser_reset\"] = wasmExports[\"ts_parser_reset\"])(a0);\n var _ts_parser_set_language = Module[\"_ts_parser_set_language\"] = (a0, a1) => (_ts_parser_set_language = Module[\"_ts_parser_set_language\"] = wasmExports[\"ts_parser_set_language\"])(a0, a1);\n var _ts_parser_timeout_micros = Module[\"_ts_parser_timeout_micros\"] = a0 => (_ts_parser_timeout_micros = Module[\"_ts_parser_timeout_micros\"] = wasmExports[\"ts_parser_timeout_micros\"])(a0);\n var _ts_parser_set_timeout_micros = Module[\"_ts_parser_set_timeout_micros\"] = (a0, a1, a2) => (_ts_parser_set_timeout_micros = Module[\"_ts_parser_set_timeout_micros\"] = wasmExports[\"ts_parser_set_timeout_micros\"])(a0, a1, a2);\n var _ts_parser_set_included_ranges = Module[\"_ts_parser_set_included_ranges\"] = (a0, a1, a2) => (_ts_parser_set_included_ranges = Module[\"_ts_parser_set_included_ranges\"] = wasmExports[\"ts_parser_set_included_ranges\"])(a0, a1, a2);\n var _memmove = Module[\"_memmove\"] = (a0, a1, a2) => (_memmove = Module[\"_memmove\"] = wasmExports[\"memmove\"])(a0, a1, a2);\n var _memcmp = Module[\"_memcmp\"] = (a0, a1, a2) => (_memcmp = Module[\"_memcmp\"] = wasmExports[\"memcmp\"])(a0, a1, a2);\n var _ts_query_new = Module[\"_ts_query_new\"] = (a0, a1, a2, a3, a4) => (_ts_query_new = Module[\"_ts_query_new\"] = wasmExports[\"ts_query_new\"])(a0, a1, a2, a3, a4);\n var _ts_query_delete = Module[\"_ts_query_delete\"] = a0 => (_ts_query_delete = Module[\"_ts_query_delete\"] = wasmExports[\"ts_query_delete\"])(a0);\n var _iswspace = Module[\"_iswspace\"] = a0 => (_iswspace = Module[\"_iswspace\"] = wasmExports[\"iswspace\"])(a0);\n var _iswalnum = Module[\"_iswalnum\"] = a0 => (_iswalnum = Module[\"_iswalnum\"] = wasmExports[\"iswalnum\"])(a0);\n var _ts_query_pattern_count = Module[\"_ts_query_pattern_count\"] = a0 => (_ts_query_pattern_count = Module[\"_ts_query_pattern_count\"] = wasmExports[\"ts_query_pattern_count\"])(a0);\n var _ts_query_capture_count = Module[\"_ts_query_capture_count\"] = a0 => (_ts_query_capture_count = Module[\"_ts_query_capture_count\"] = wasmExports[\"ts_query_capture_count\"])(a0);\n var _ts_query_string_count = Module[\"_ts_query_string_count\"] = a0 => (_ts_query_string_count = Module[\"_ts_query_string_count\"] = wasmExports[\"ts_query_string_count\"])(a0);\n var _ts_query_capture_name_for_id = Module[\"_ts_query_capture_name_for_id\"] = (a0, a1, a2) => (_ts_query_capture_name_for_id = Module[\"_ts_query_capture_name_for_id\"] = wasmExports[\"ts_query_capture_name_for_id\"])(a0, a1, a2);\n var _ts_query_string_value_for_id = Module[\"_ts_query_string_value_for_id\"] = (a0, a1, a2) => (_ts_query_string_value_for_id = Module[\"_ts_query_string_value_for_id\"] = wasmExports[\"ts_query_string_value_for_id\"])(a0, a1, a2);\n var _ts_query_predicates_for_pattern = Module[\"_ts_query_predicates_for_pattern\"] = (a0, a1, a2) => (_ts_query_predicates_for_pattern = Module[\"_ts_query_predicates_for_pattern\"] = wasmExports[\"ts_query_predicates_for_pattern\"])(a0, a1, a2);\n var _ts_query_disable_capture = Module[\"_ts_query_disable_capture\"] = (a0, a1, a2) => (_ts_query_disable_capture = Module[\"_ts_query_disable_capture\"] = wasmExports[\"ts_query_disable_capture\"])(a0, a1, a2);\n var _ts_tree_copy = Module[\"_ts_tree_copy\"] = a0 => (_ts_tree_copy = Module[\"_ts_tree_copy\"] = wasmExports[\"ts_tree_copy\"])(a0);\n var _ts_tree_delete = Module[\"_ts_tree_delete\"] = a0 => (_ts_tree_delete = Module[\"_ts_tree_delete\"] = wasmExports[\"ts_tree_delete\"])(a0);\n var _ts_init = Module[\"_ts_init\"] = () => (_ts_init = Module[\"_ts_init\"] = wasmExports[\"ts_init\"])();\n var _ts_parser_new_wasm = Module[\"_ts_parser_new_wasm\"] = () => (_ts_parser_new_wasm = Module[\"_ts_parser_new_wasm\"] = wasmExports[\"ts_parser_new_wasm\"])();\n var _ts_parser_enable_logger_wasm = Module[\"_ts_parser_enable_logger_wasm\"] = (a0, a1) => (_ts_parser_enable_logger_wasm = Module[\"_ts_parser_enable_logger_wasm\"] = wasmExports[\"ts_parser_enable_logger_wasm\"])(a0, a1);\n var _ts_parser_parse_wasm = Module[\"_ts_parser_parse_wasm\"] = (a0, a1, a2, a3, a4) => (_ts_parser_parse_wasm = Module[\"_ts_parser_parse_wasm\"] = wasmExports[\"ts_parser_parse_wasm\"])(a0, a1, a2, a3, a4);\n var _ts_parser_included_ranges_wasm = Module[\"_ts_parser_included_ranges_wasm\"] = a0 => (_ts_parser_included_ranges_wasm = Module[\"_ts_parser_included_ranges_wasm\"] = wasmExports[\"ts_parser_included_ranges_wasm\"])(a0);\n var _ts_language_type_is_named_wasm = Module[\"_ts_language_type_is_named_wasm\"] = (a0, a1) => (_ts_language_type_is_named_wasm = Module[\"_ts_language_type_is_named_wasm\"] = wasmExports[\"ts_language_type_is_named_wasm\"])(a0, a1);\n var _ts_language_type_is_visible_wasm = Module[\"_ts_language_type_is_visible_wasm\"] = (a0, a1) => (_ts_language_type_is_visible_wasm = Module[\"_ts_language_type_is_visible_wasm\"] = wasmExports[\"ts_language_type_is_visible_wasm\"])(a0, a1);\n var _ts_tree_root_node_wasm = Module[\"_ts_tree_root_node_wasm\"] = a0 => (_ts_tree_root_node_wasm = Module[\"_ts_tree_root_node_wasm\"] = wasmExports[\"ts_tree_root_node_wasm\"])(a0);\n var _ts_tree_root_node_with_offset_wasm = Module[\"_ts_tree_root_node_with_offset_wasm\"] = a0 => (_ts_tree_root_node_with_offset_wasm = Module[\"_ts_tree_root_node_with_offset_wasm\"] = wasmExports[\"ts_tree_root_node_with_offset_wasm\"])(a0);\n var _ts_tree_edit_wasm = Module[\"_ts_tree_edit_wasm\"] = a0 => (_ts_tree_edit_wasm = Module[\"_ts_tree_edit_wasm\"] = wasmExports[\"ts_tree_edit_wasm\"])(a0);\n var _ts_tree_included_ranges_wasm = Module[\"_ts_tree_included_ranges_wasm\"] = a0 => (_ts_tree_included_ranges_wasm = Module[\"_ts_tree_included_ranges_wasm\"] = wasmExports[\"ts_tree_included_ranges_wasm\"])(a0);\n var _ts_tree_get_changed_ranges_wasm = Module[\"_ts_tree_get_changed_ranges_wasm\"] = (a0, a1) => (_ts_tree_get_changed_ranges_wasm = Module[\"_ts_tree_get_changed_ranges_wasm\"] = wasmExports[\"ts_tree_get_changed_ranges_wasm\"])(a0, a1);\n var _ts_tree_cursor_new_wasm = Module[\"_ts_tree_cursor_new_wasm\"] = a0 => (_ts_tree_cursor_new_wasm = Module[\"_ts_tree_cursor_new_wasm\"] = wasmExports[\"ts_tree_cursor_new_wasm\"])(a0);\n var _ts_tree_cursor_delete_wasm = Module[\"_ts_tree_cursor_delete_wasm\"] = a0 => (_ts_tree_cursor_delete_wasm = Module[\"_ts_tree_cursor_delete_wasm\"] = wasmExports[\"ts_tree_cursor_delete_wasm\"])(a0);\n var _ts_tree_cursor_reset_wasm = Module[\"_ts_tree_cursor_reset_wasm\"] = a0 => (_ts_tree_cursor_reset_wasm = Module[\"_ts_tree_cursor_reset_wasm\"] = wasmExports[\"ts_tree_cursor_reset_wasm\"])(a0);\n var _ts_tree_cursor_reset_to_wasm = Module[\"_ts_tree_cursor_reset_to_wasm\"] = (a0, a1) => (_ts_tree_cursor_reset_to_wasm = Module[\"_ts_tree_cursor_reset_to_wasm\"] = wasmExports[\"ts_tree_cursor_reset_to_wasm\"])(a0, a1);\n var _ts_tree_cursor_goto_first_child_wasm = Module[\"_ts_tree_cursor_goto_first_child_wasm\"] = a0 => (_ts_tree_cursor_goto_first_child_wasm = Module[\"_ts_tree_cursor_goto_first_child_wasm\"] = wasmExports[\"ts_tree_cursor_goto_first_child_wasm\"])(a0);\n var _ts_tree_cursor_goto_last_child_wasm = Module[\"_ts_tree_cursor_goto_last_child_wasm\"] = a0 => (_ts_tree_cursor_goto_last_child_wasm = Module[\"_ts_tree_cursor_goto_last_child_wasm\"] = wasmExports[\"ts_tree_cursor_goto_last_child_wasm\"])(a0);\n var _ts_tree_cursor_goto_first_child_for_index_wasm = Module[\"_ts_tree_cursor_goto_first_child_for_index_wasm\"] = a0 => (_ts_tree_cursor_goto_first_child_for_index_wasm = Module[\"_ts_tree_cursor_goto_first_child_for_index_wasm\"] = wasmExports[\"ts_tree_cursor_goto_first_child_for_index_wasm\"])(a0);\n var _ts_tree_cursor_goto_first_child_for_position_wasm = Module[\"_ts_tree_cursor_goto_first_child_for_position_wasm\"] = a0 => (_ts_tree_cursor_goto_first_child_for_position_wasm = Module[\"_ts_tree_cursor_goto_first_child_for_position_wasm\"] = wasmExports[\"ts_tree_cursor_goto_first_child_for_position_wasm\"])(a0);\n var _ts_tree_cursor_goto_next_sibling_wasm = Module[\"_ts_tree_cursor_goto_next_sibling_wasm\"] = a0 => (_ts_tree_cursor_goto_next_sibling_wasm = Module[\"_ts_tree_cursor_goto_next_sibling_wasm\"] = wasmExports[\"ts_tree_cursor_goto_next_sibling_wasm\"])(a0);\n var _ts_tree_cursor_goto_previous_sibling_wasm = Module[\"_ts_tree_cursor_goto_previous_sibling_wasm\"] = a0 => (_ts_tree_cursor_goto_previous_sibling_wasm = Module[\"_ts_tree_cursor_goto_previous_sibling_wasm\"] = wasmExports[\"ts_tree_cursor_goto_previous_sibling_wasm\"])(a0);\n var _ts_tree_cursor_goto_descendant_wasm = Module[\"_ts_tree_cursor_goto_descendant_wasm\"] = (a0, a1) => (_ts_tree_cursor_goto_descendant_wasm = Module[\"_ts_tree_cursor_goto_descendant_wasm\"] = wasmExports[\"ts_tree_cursor_goto_descendant_wasm\"])(a0, a1);\n var _ts_tree_cursor_goto_parent_wasm = Module[\"_ts_tree_cursor_goto_parent_wasm\"] = a0 => (_ts_tree_cursor_goto_parent_wasm = Module[\"_ts_tree_cursor_goto_parent_wasm\"] = wasmExports[\"ts_tree_cursor_goto_parent_wasm\"])(a0);\n var _ts_tree_cursor_current_node_type_id_wasm = Module[\"_ts_tree_cursor_current_node_type_id_wasm\"] = a0 => (_ts_tree_cursor_current_node_type_id_wasm = Module[\"_ts_tree_cursor_current_node_type_id_wasm\"] = wasmExports[\"ts_tree_cursor_current_node_type_id_wasm\"])(a0);\n var _ts_tree_cursor_current_node_state_id_wasm = Module[\"_ts_tree_cursor_current_node_state_id_wasm\"] = a0 => (_ts_tree_cursor_current_node_state_id_wasm = Module[\"_ts_tree_cursor_current_node_state_id_wasm\"] = wasmExports[\"ts_tree_cursor_current_node_state_id_wasm\"])(a0);\n var _ts_tree_cursor_current_node_is_named_wasm = Module[\"_ts_tree_cursor_current_node_is_named_wasm\"] = a0 => (_ts_tree_cursor_current_node_is_named_wasm = Module[\"_ts_tree_cursor_current_node_is_named_wasm\"] = wasmExports[\"ts_tree_cursor_current_node_is_named_wasm\"])(a0);\n var _ts_tree_cursor_current_node_is_missing_wasm = Module[\"_ts_tree_cursor_current_node_is_missing_wasm\"] = a0 => (_ts_tree_cursor_current_node_is_missing_wasm = Module[\"_ts_tree_cursor_current_node_is_missing_wasm\"] = wasmExports[\"ts_tree_cursor_current_node_is_missing_wasm\"])(a0);\n var _ts_tree_cursor_current_node_id_wasm = Module[\"_ts_tree_cursor_current_node_id_wasm\"] = a0 => (_ts_tree_cursor_current_node_id_wasm = Module[\"_ts_tree_cursor_current_node_id_wasm\"] = wasmExports[\"ts_tree_cursor_current_node_id_wasm\"])(a0);\n var _ts_tree_cursor_start_position_wasm = Module[\"_ts_tree_cursor_start_position_wasm\"] = a0 => (_ts_tree_cursor_start_position_wasm = Module[\"_ts_tree_cursor_start_position_wasm\"] = wasmExports[\"ts_tree_cursor_start_position_wasm\"])(a0);\n var _ts_tree_cursor_end_position_wasm = Module[\"_ts_tree_cursor_end_position_wasm\"] = a0 => (_ts_tree_cursor_end_position_wasm = Module[\"_ts_tree_cursor_end_position_wasm\"] = wasmExports[\"ts_tree_cursor_end_position_wasm\"])(a0);\n var _ts_tree_cursor_start_index_wasm = Module[\"_ts_tree_cursor_start_index_wasm\"] = a0 => (_ts_tree_cursor_start_index_wasm = Module[\"_ts_tree_cursor_start_index_wasm\"] = wasmExports[\"ts_tree_cursor_start_index_wasm\"])(a0);\n var _ts_tree_cursor_end_index_wasm = Module[\"_ts_tree_cursor_end_index_wasm\"] = a0 => (_ts_tree_cursor_end_index_wasm = Module[\"_ts_tree_cursor_end_index_wasm\"] = wasmExports[\"ts_tree_cursor_end_index_wasm\"])(a0);\n var _ts_tree_cursor_current_field_id_wasm = Module[\"_ts_tree_cursor_current_field_id_wasm\"] = a0 => (_ts_tree_cursor_current_field_id_wasm = Module[\"_ts_tree_cursor_current_field_id_wasm\"] = wasmExports[\"ts_tree_cursor_current_field_id_wasm\"])(a0);\n var _ts_tree_cursor_current_depth_wasm = Module[\"_ts_tree_cursor_current_depth_wasm\"] = a0 => (_ts_tree_cursor_current_depth_wasm = Module[\"_ts_tree_cursor_current_depth_wasm\"] = wasmExports[\"ts_tree_cursor_current_depth_wasm\"])(a0);\n var _ts_tree_cursor_current_descendant_index_wasm = Module[\"_ts_tree_cursor_current_descendant_index_wasm\"] = a0 => (_ts_tree_cursor_current_descendant_index_wasm = Module[\"_ts_tree_cursor_current_descendant_index_wasm\"] = wasmExports[\"ts_tree_cursor_current_descendant_index_wasm\"])(a0);\n var _ts_tree_cursor_current_node_wasm = Module[\"_ts_tree_cursor_current_node_wasm\"] = a0 => (_ts_tree_cursor_current_node_wasm = Module[\"_ts_tree_cursor_current_node_wasm\"] = wasmExports[\"ts_tree_cursor_current_node_wasm\"])(a0);\n var _ts_node_symbol_wasm = Module[\"_ts_node_symbol_wasm\"] = a0 => (_ts_node_symbol_wasm = Module[\"_ts_node_symbol_wasm\"] = wasmExports[\"ts_node_symbol_wasm\"])(a0);\n var _ts_node_field_name_for_child_wasm = Module[\"_ts_node_field_name_for_child_wasm\"] = (a0, a1) => (_ts_node_field_name_for_child_wasm = Module[\"_ts_node_field_name_for_child_wasm\"] = wasmExports[\"ts_node_field_name_for_child_wasm\"])(a0, a1);\n var _ts_node_children_by_field_id_wasm = Module[\"_ts_node_children_by_field_id_wasm\"] = (a0, a1) => (_ts_node_children_by_field_id_wasm = Module[\"_ts_node_children_by_field_id_wasm\"] = wasmExports[\"ts_node_children_by_field_id_wasm\"])(a0, a1);\n var _ts_node_first_child_for_byte_wasm = Module[\"_ts_node_first_child_for_byte_wasm\"] = a0 => (_ts_node_first_child_for_byte_wasm = Module[\"_ts_node_first_child_for_byte_wasm\"] = wasmExports[\"ts_node_first_child_for_byte_wasm\"])(a0);\n var _ts_node_first_named_child_for_byte_wasm = Module[\"_ts_node_first_named_child_for_byte_wasm\"] = a0 => (_ts_node_first_named_child_for_byte_wasm = Module[\"_ts_node_first_named_child_for_byte_wasm\"] = wasmExports[\"ts_node_first_named_child_for_byte_wasm\"])(a0);\n var _ts_node_grammar_symbol_wasm = Module[\"_ts_node_grammar_symbol_wasm\"] = a0 => (_ts_node_grammar_symbol_wasm = Module[\"_ts_node_grammar_symbol_wasm\"] = wasmExports[\"ts_node_grammar_symbol_wasm\"])(a0);\n var _ts_node_child_count_wasm = Module[\"_ts_node_child_count_wasm\"] = a0 => (_ts_node_child_count_wasm = Module[\"_ts_node_child_count_wasm\"] = wasmExports[\"ts_node_child_count_wasm\"])(a0);\n var _ts_node_named_child_count_wasm = Module[\"_ts_node_named_child_count_wasm\"] = a0 => (_ts_node_named_child_count_wasm = Module[\"_ts_node_named_child_count_wasm\"] = wasmExports[\"ts_node_named_child_count_wasm\"])(a0);\n var _ts_node_child_wasm = Module[\"_ts_node_child_wasm\"] = (a0, a1) => (_ts_node_child_wasm = Module[\"_ts_node_child_wasm\"] = wasmExports[\"ts_node_child_wasm\"])(a0, a1);\n var _ts_node_named_child_wasm = Module[\"_ts_node_named_child_wasm\"] = (a0, a1) => (_ts_node_named_child_wasm = Module[\"_ts_node_named_child_wasm\"] = wasmExports[\"ts_node_named_child_wasm\"])(a0, a1);\n var _ts_node_child_by_field_id_wasm = Module[\"_ts_node_child_by_field_id_wasm\"] = (a0, a1) => (_ts_node_child_by_field_id_wasm = Module[\"_ts_node_child_by_field_id_wasm\"] = wasmExports[\"ts_node_child_by_field_id_wasm\"])(a0, a1);\n var _ts_node_next_sibling_wasm = Module[\"_ts_node_next_sibling_wasm\"] = a0 => (_ts_node_next_sibling_wasm = Module[\"_ts_node_next_sibling_wasm\"] = wasmExports[\"ts_node_next_sibling_wasm\"])(a0);\n var _ts_node_prev_sibling_wasm = Module[\"_ts_node_prev_sibling_wasm\"] = a0 => (_ts_node_prev_sibling_wasm = Module[\"_ts_node_prev_sibling_wasm\"] = wasmExports[\"ts_node_prev_sibling_wasm\"])(a0);\n var _ts_node_next_named_sibling_wasm = Module[\"_ts_node_next_named_sibling_wasm\"] = a0 => (_ts_node_next_named_sibling_wasm = Module[\"_ts_node_next_named_sibling_wasm\"] = wasmExports[\"ts_node_next_named_sibling_wasm\"])(a0);\n var _ts_node_prev_named_sibling_wasm = Module[\"_ts_node_prev_named_sibling_wasm\"] = a0 => (_ts_node_prev_named_sibling_wasm = Module[\"_ts_node_prev_named_sibling_wasm\"] = wasmExports[\"ts_node_prev_named_sibling_wasm\"])(a0);\n var _ts_node_descendant_count_wasm = Module[\"_ts_node_descendant_count_wasm\"] = a0 => (_ts_node_descendant_count_wasm = Module[\"_ts_node_descendant_count_wasm\"] = wasmExports[\"ts_node_descendant_count_wasm\"])(a0);\n var _ts_node_parent_wasm = Module[\"_ts_node_parent_wasm\"] = a0 => (_ts_node_parent_wasm = Module[\"_ts_node_parent_wasm\"] = wasmExports[\"ts_node_parent_wasm\"])(a0);\n var _ts_node_descendant_for_index_wasm = Module[\"_ts_node_descendant_for_index_wasm\"] = a0 => (_ts_node_descendant_for_index_wasm = Module[\"_ts_node_descendant_for_index_wasm\"] = wasmExports[\"ts_node_descendant_for_index_wasm\"])(a0);\n var _ts_node_named_descendant_for_index_wasm = Module[\"_ts_node_named_descendant_for_index_wasm\"] = a0 => (_ts_node_named_descendant_for_index_wasm = Module[\"_ts_node_named_descendant_for_index_wasm\"] = wasmExports[\"ts_node_named_descendant_for_index_wasm\"])(a0);\n var _ts_node_descendant_for_position_wasm = Module[\"_ts_node_descendant_for_position_wasm\"] = a0 => (_ts_node_descendant_for_position_wasm = Module[\"_ts_node_descendant_for_position_wasm\"] = wasmExports[\"ts_node_descendant_for_position_wasm\"])(a0);\n var _ts_node_named_descendant_for_position_wasm = Module[\"_ts_node_named_descendant_for_position_wasm\"] = a0 => (_ts_node_named_descendant_for_position_wasm = Module[\"_ts_node_named_descendant_for_position_wasm\"] = wasmExports[\"ts_node_named_descendant_for_position_wasm\"])(a0);\n var _ts_node_start_point_wasm = Module[\"_ts_node_start_point_wasm\"] = a0 => (_ts_node_start_point_wasm = Module[\"_ts_node_start_point_wasm\"] = wasmExports[\"ts_node_start_point_wasm\"])(a0);\n var _ts_node_end_point_wasm = Module[\"_ts_node_end_point_wasm\"] = a0 => (_ts_node_end_point_wasm = Module[\"_ts_node_end_point_wasm\"] = wasmExports[\"ts_node_end_point_wasm\"])(a0);\n var _ts_node_start_index_wasm = Module[\"_ts_node_start_index_wasm\"] = a0 => (_ts_node_start_index_wasm = Module[\"_ts_node_start_index_wasm\"] = wasmExports[\"ts_node_start_index_wasm\"])(a0);\n var _ts_node_end_index_wasm = Module[\"_ts_node_end_index_wasm\"] = a0 => (_ts_node_end_index_wasm = Module[\"_ts_node_end_index_wasm\"] = wasmExports[\"ts_node_end_index_wasm\"])(a0);\n var _ts_node_to_string_wasm = Module[\"_ts_node_to_string_wasm\"] = a0 => (_ts_node_to_string_wasm = Module[\"_ts_node_to_string_wasm\"] = wasmExports[\"ts_node_to_string_wasm\"])(a0);\n var _ts_node_children_wasm = Module[\"_ts_node_children_wasm\"] = a0 => (_ts_node_children_wasm = Module[\"_ts_node_children_wasm\"] = wasmExports[\"ts_node_children_wasm\"])(a0);\n var _ts_node_named_children_wasm = Module[\"_ts_node_named_children_wasm\"] = a0 => (_ts_node_named_children_wasm = Module[\"_ts_node_named_children_wasm\"] = wasmExports[\"ts_node_named_children_wasm\"])(a0);\n var _ts_node_descendants_of_type_wasm = Module[\"_ts_node_descendants_of_type_wasm\"] = (a0, a1, a2, a3, a4, a5, a6) => (_ts_node_descendants_of_type_wasm = Module[\"_ts_node_descendants_of_type_wasm\"] = wasmExports[\"ts_node_descendants_of_type_wasm\"])(a0, a1, a2, a3, a4, a5, a6);\n var _ts_node_is_named_wasm = Module[\"_ts_node_is_named_wasm\"] = a0 => (_ts_node_is_named_wasm = Module[\"_ts_node_is_named_wasm\"] = wasmExports[\"ts_node_is_named_wasm\"])(a0);\n var _ts_node_has_changes_wasm = Module[\"_ts_node_has_changes_wasm\"] = a0 => (_ts_node_has_changes_wasm = Module[\"_ts_node_has_changes_wasm\"] = wasmExports[\"ts_node_has_changes_wasm\"])(a0);\n var _ts_node_has_error_wasm = Module[\"_ts_node_has_error_wasm\"] = a0 => (_ts_node_has_error_wasm = Module[\"_ts_node_has_error_wasm\"] = wasmExports[\"ts_node_has_error_wasm\"])(a0);\n var _ts_node_is_error_wasm = Module[\"_ts_node_is_error_wasm\"] = a0 => (_ts_node_is_error_wasm = Module[\"_ts_node_is_error_wasm\"] = wasmExports[\"ts_node_is_error_wasm\"])(a0);\n var _ts_node_is_missing_wasm = Module[\"_ts_node_is_missing_wasm\"] = a0 => (_ts_node_is_missing_wasm = Module[\"_ts_node_is_missing_wasm\"] = wasmExports[\"ts_node_is_missing_wasm\"])(a0);\n var _ts_node_is_extra_wasm = Module[\"_ts_node_is_extra_wasm\"] = a0 => (_ts_node_is_extra_wasm = Module[\"_ts_node_is_extra_wasm\"] = wasmExports[\"ts_node_is_extra_wasm\"])(a0);\n var _ts_node_parse_state_wasm = Module[\"_ts_node_parse_state_wasm\"] = a0 => (_ts_node_parse_state_wasm = Module[\"_ts_node_parse_state_wasm\"] = wasmExports[\"ts_node_parse_state_wasm\"])(a0);\n var _ts_node_next_parse_state_wasm = Module[\"_ts_node_next_parse_state_wasm\"] = a0 => (_ts_node_next_parse_state_wasm = Module[\"_ts_node_next_parse_state_wasm\"] = wasmExports[\"ts_node_next_parse_state_wasm\"])(a0);\n var _ts_query_matches_wasm = Module[\"_ts_query_matches_wasm\"] = (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) => (_ts_query_matches_wasm = Module[\"_ts_query_matches_wasm\"] = wasmExports[\"ts_query_matches_wasm\"])(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);\n var _ts_query_captures_wasm = Module[\"_ts_query_captures_wasm\"] = (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) => (_ts_query_captures_wasm = Module[\"_ts_query_captures_wasm\"] = wasmExports[\"ts_query_captures_wasm\"])(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);\n var _iswalpha = Module[\"_iswalpha\"] = a0 => (_iswalpha = Module[\"_iswalpha\"] = wasmExports[\"iswalpha\"])(a0);\n var _iswblank = Module[\"_iswblank\"] = a0 => (_iswblank = Module[\"_iswblank\"] = wasmExports[\"iswblank\"])(a0);\n var _iswdigit = Module[\"_iswdigit\"] = a0 => (_iswdigit = Module[\"_iswdigit\"] = wasmExports[\"iswdigit\"])(a0);\n var _iswlower = Module[\"_iswlower\"] = a0 => (_iswlower = Module[\"_iswlower\"] = wasmExports[\"iswlower\"])(a0);\n var _iswupper = Module[\"_iswupper\"] = a0 => (_iswupper = Module[\"_iswupper\"] = wasmExports[\"iswupper\"])(a0);\n var _iswxdigit = Module[\"_iswxdigit\"] = a0 => (_iswxdigit = Module[\"_iswxdigit\"] = wasmExports[\"iswxdigit\"])(a0);\n var _memchr = Module[\"_memchr\"] = (a0, a1, a2) => (_memchr = Module[\"_memchr\"] = wasmExports[\"memchr\"])(a0, a1, a2);\n var _strlen = Module[\"_strlen\"] = a0 => (_strlen = Module[\"_strlen\"] = wasmExports[\"strlen\"])(a0);\n var _strcmp = Module[\"_strcmp\"] = (a0, a1) => (_strcmp = Module[\"_strcmp\"] = wasmExports[\"strcmp\"])(a0, a1);\n var _strncat = Module[\"_strncat\"] = (a0, a1, a2) => (_strncat = Module[\"_strncat\"] = wasmExports[\"strncat\"])(a0, a1, a2);\n var _strncpy = Module[\"_strncpy\"] = (a0, a1, a2) => (_strncpy = Module[\"_strncpy\"] = wasmExports[\"strncpy\"])(a0, a1, a2);\n var _towlower = Module[\"_towlower\"] = a0 => (_towlower = Module[\"_towlower\"] = wasmExports[\"towlower\"])(a0);\n var _towupper = Module[\"_towupper\"] = a0 => (_towupper = Module[\"_towupper\"] = wasmExports[\"towupper\"])(a0);\n var _setThrew = (a0, a1) => (_setThrew = wasmExports[\"setThrew\"])(a0, a1);\n var __emscripten_stack_restore = a0 => (__emscripten_stack_restore = wasmExports[\"_emscripten_stack_restore\"])(a0);\n var __emscripten_stack_alloc = a0 => (__emscripten_stack_alloc = wasmExports[\"_emscripten_stack_alloc\"])(a0);\n var _emscripten_stack_get_current = () => (_emscripten_stack_get_current = wasmExports[\"emscripten_stack_get_current\"])();\n var dynCall_jiji = Module[\"dynCall_jiji\"] = (a0, a1, a2, a3, a4) => (dynCall_jiji = Module[\"dynCall_jiji\"] = wasmExports[\"dynCall_jiji\"])(a0, a1, a2, a3, a4);\n var _orig$ts_parser_timeout_micros = Module[\"_orig$ts_parser_timeout_micros\"] = a0 => (_orig$ts_parser_timeout_micros = Module[\"_orig$ts_parser_timeout_micros\"] = wasmExports[\"orig$ts_parser_timeout_micros\"])(a0);\n var _orig$ts_parser_set_timeout_micros = Module[\"_orig$ts_parser_set_timeout_micros\"] = (a0, a1) => (_orig$ts_parser_set_timeout_micros = Module[\"_orig$ts_parser_set_timeout_micros\"] = wasmExports[\"orig$ts_parser_set_timeout_micros\"])(a0, a1);\n // include: postamble.js\n // === Auto-generated postamble setup entry stuff ===\n Module[\"AsciiToString\"] = AsciiToString;\n Module[\"stringToUTF16\"] = stringToUTF16;\n var calledRun;\n dependenciesFulfilled = function runCaller() {\n // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false)\n if (!calledRun) run();\n if (!calledRun) dependenciesFulfilled = runCaller;\n };\n // try this again later, after new deps are fulfilled\n function callMain(args = []) {\n var entryFunction = resolveGlobalSymbol(\"main\").sym;\n // Main modules can't tell if they have main() at compile time, since it may\n // arrive from a dynamic library.\n if (!entryFunction) return;\n args.unshift(thisProgram);\n var argc = args.length;\n var argv = stackAlloc((argc + 1) * 4);\n var argv_ptr = argv;\n args.forEach(arg => {\n LE_HEAP_STORE_U32(((argv_ptr) >> 2) * 4, stringToUTF8OnStack(arg));\n argv_ptr += 4;\n });\n LE_HEAP_STORE_U32(((argv_ptr) >> 2) * 4, 0);\n try {\n var ret = entryFunction(argc, argv);\n // if we're not running an evented main loop, it's time to exit\n exitJS(ret, /* implicit = */ true);\n return ret;\n } catch (e) {\n return handleException(e);\n }\n }\n function run(args = arguments_) {\n if (runDependencies > 0) {\n return;\n }\n preRun();\n // a preRun added a dependency, run will be called later\n if (runDependencies > 0) {\n return;\n }\n function doRun() {\n // run may have just been called through dependencies being fulfilled just in this very frame,\n // or while the async setStatus time below was happening\n if (calledRun) return;\n calledRun = true;\n Module[\"calledRun\"] = true;\n if (ABORT) return;\n initRuntime();\n preMain();\n Module[\"onRuntimeInitialized\"]?.();\n if (shouldRunNow) callMain(args);\n postRun();\n }\n if (Module[\"setStatus\"]) {\n Module[\"setStatus\"](\"Running...\");\n setTimeout(function() {\n setTimeout(function() {\n Module[\"setStatus\"](\"\");\n }, 1);\n doRun();\n }, 1);\n } else {\n doRun();\n }\n }\n if (Module[\"preInit\"]) {\n if (typeof Module[\"preInit\"] == \"function\") Module[\"preInit\"] = [ Module[\"preInit\"] ];\n while (Module[\"preInit\"].length > 0) {\n Module[\"preInit\"].pop()();\n }\n }\n // shouldRunNow refers to calling main(), not run().\n var shouldRunNow = true;\n if (Module[\"noInitialRun\"]) shouldRunNow = false;\n run();\n // end include: postamble.js\n // include: /src/lib/binding_web/binding.js\n /* eslint-disable-next-line spaced-comment */ /// <reference types=\"emscripten\" />\n /* eslint-disable-next-line spaced-comment */ /// <reference path=\"tree-sitter-web.d.ts\"/>\n const C = Module;\n const INTERNAL = {};\n const SIZE_OF_INT = 4;\n const SIZE_OF_CURSOR = 4 * SIZE_OF_INT;\n const SIZE_OF_NODE = 5 * SIZE_OF_INT;\n const SIZE_OF_POINT = 2 * SIZE_OF_INT;\n const SIZE_OF_RANGE = 2 * SIZE_OF_INT + 2 * SIZE_OF_POINT;\n const ZERO_POINT = {\n row: 0,\n column: 0\n };\n const QUERY_WORD_REGEX = /[\\w-.]*/g;\n const PREDICATE_STEP_TYPE_CAPTURE = 1;\n const PREDICATE_STEP_TYPE_STRING = 2;\n const LANGUAGE_FUNCTION_REGEX = /^_?tree_sitter_\\w+/;\n let VERSION;\n let MIN_COMPATIBLE_VERSION;\n let TRANSFER_BUFFER;\n let currentParseCallback;\n // eslint-disable-next-line no-unused-vars\n let currentLogCallback;\n // eslint-disable-next-line no-unused-vars\n class ParserImpl {\n static init() {\n TRANSFER_BUFFER = C._ts_init();\n VERSION = getValue(TRANSFER_BUFFER, \"i32\");\n MIN_COMPATIBLE_VERSION = getValue(TRANSFER_BUFFER + SIZE_OF_INT, \"i32\");\n }\n initialize() {\n C._ts_parser_new_wasm();\n this[0] = getValue(TRANSFER_BUFFER, \"i32\");\n this[1] = getValue(TRANSFER_BUFFER + SIZE_OF_INT, \"i32\");\n }\n delete() {\n C._ts_parser_delete(this[0]);\n C._free(this[1]);\n this[0] = 0;\n this[1] = 0;\n }\n setLanguage(language) {\n let address;\n if (!language) {\n address = 0;\n language = null;\n } else if (language.constructor === Language) {\n address = language[0];\n const version = C._ts_language_version(address);\n if (version < MIN_COMPATIBLE_VERSION || VERSION < version) {\n throw new Error(`Incompatible language version ${version}. ` + `Compatibility range ${MIN_COMPATIBLE_VERSION} through ${VERSION}.`);\n }\n } else {\n throw new Error(\"Argument must be a Language\");\n }\n this.language = language;\n C._ts_parser_set_language(this[0], address);\n return this;\n }\n getLanguage() {\n return this.language;\n }\n parse(callback, oldTree, options) {\n if (typeof callback === \"string\") {\n currentParseCallback = (index, _) => callback.slice(index);\n } else if (typeof callback === \"function\") {\n currentParseCallback = callback;\n } else {\n throw new Error(\"Argument must be a string or a function\");\n }\n if (this.logCallback) {\n currentLogCallback = this.logCallback;\n C._ts_parser_enable_logger_wasm(this[0], 1);\n } else {\n currentLogCallback = null;\n C._ts_parser_enable_logger_wasm(this[0], 0);\n }\n let rangeCount = 0;\n let rangeAddress = 0;\n if (options?.includedRanges) {\n rangeCount = options.includedRanges.length;\n rangeAddress = C._calloc(rangeCount, SIZE_OF_RANGE);\n let address = rangeAddress;\n for (let i = 0; i < rangeCount; i++) {\n marshalRange(address, options.includedRanges[i]);\n address += SIZE_OF_RANGE;\n }\n }\n const treeAddress = C._ts_parser_parse_wasm(this[0], this[1], oldTree ? oldTree[0] : 0, rangeAddress, rangeCount);\n if (!treeAddress) {\n currentParseCallback = null;\n currentLogCallback = null;\n throw new Error(\"Parsing failed\");\n }\n const result = new Tree(INTERNAL, treeAddress, this.language, currentParseCallback);\n currentParseCallback = null;\n currentLogCallback = null;\n return result;\n }\n reset() {\n C._ts_parser_reset(this[0]);\n }\n getIncludedRanges() {\n C._ts_parser_included_ranges_wasm(this[0]);\n const count = getValue(TRANSFER_BUFFER, \"i32\");\n const buffer = getValue(TRANSFER_BUFFER + SIZE_OF_INT, \"i32\");\n const result = new Array(count);\n if (count > 0) {\n let address = buffer;\n for (let i = 0; i < count; i++) {\n result[i] = unmarshalRange(address);\n address += SIZE_OF_RANGE;\n }\n C._free(buffer);\n }\n return result;\n }\n getTimeoutMicros() {\n return C._ts_parser_timeout_micros(this[0]);\n }\n setTimeoutMicros(timeout) {\n C._ts_parser_set_timeout_micros(this[0], timeout);\n }\n setLogger(callback) {\n if (!callback) {\n callback = null;\n } else if (typeof callback !== \"function\") {\n throw new Error(\"Logger callback must be a function\");\n }\n this.logCallback = callback;\n return this;\n }\n getLogger() {\n return this.logCallback;\n }\n }\n class Tree {\n constructor(internal, address, language, textCallback) {\n assertInternal(internal);\n this[0] = address;\n this.language = language;\n this.textCallback = textCallback;\n }\n copy() {\n const address = C._ts_tree_copy(this[0]);\n return new Tree(INTERNAL, address, this.language, this.textCallback);\n }\n delete() {\n C._ts_tree_delete(this[0]);\n this[0] = 0;\n }\n edit(edit) {\n marshalEdit(edit);\n C._ts_tree_edit_wasm(this[0]);\n }\n get rootNode() {\n C._ts_tree_root_node_wasm(this[0]);\n return unmarshalNode(this);\n }\n rootNodeWithOffset(offsetBytes, offsetExtent) {\n const address = TRANSFER_BUFFER + SIZE_OF_NODE;\n setValue(address, offsetBytes, \"i32\");\n marshalPoint(address + SIZE_OF_INT, offsetExtent);\n C._ts_tree_root_node_with_offset_wasm(this[0]);\n return unmarshalNode(this);\n }\n getLanguage() {\n return this.language;\n }\n walk() {\n return this.rootNode.walk();\n }\n getChangedRanges(other) {\n if (other.constructor !== Tree) {\n throw new TypeError(\"Argument must be a Tree\");\n }\n C._ts_tree_get_changed_ranges_wasm(this[0], other[0]);\n const count = getValue(TRANSFER_BUFFER, \"i32\");\n const buffer = getValue(TRANSFER_BUFFER + SIZE_OF_INT, \"i32\");\n const result = new Array(count);\n if (count > 0) {\n let address = buffer;\n for (let i = 0; i < count; i++) {\n result[i] = unmarshalRange(address);\n address += SIZE_OF_RANGE;\n }\n C._free(buffer);\n }\n return result;\n }\n getIncludedRanges() {\n C._ts_tree_included_ranges_wasm(this[0]);\n const count = getValue(TRANSFER_BUFFER, \"i32\");\n const buffer = getValue(TRANSFER_BUFFER + SIZE_OF_INT, \"i32\");\n const result = new Array(count);\n if (count > 0) {\n let address = buffer;\n for (let i = 0; i < count; i++) {\n result[i] = unmarshalRange(address);\n address += SIZE_OF_RANGE;\n }\n C._free(buffer);\n }\n return result;\n }\n }\n class Node {\n constructor(internal, tree) {\n assertInternal(internal);\n this.tree = tree;\n }\n get typeId() {\n marshalNode(this);\n return C._ts_node_symbol_wasm(this.tree[0]);\n }\n get grammarId() {\n marshalNode(this);\n return C._ts_node_grammar_symbol_wasm(this.tree[0]);\n }\n get type() {\n return this.tree.language.types[this.typeId] || \"ERROR\";\n }\n get grammarType() {\n return this.tree.language.types[this.grammarId] || \"ERROR\";\n }\n get endPosition() {\n marshalNode(this);\n C._ts_node_end_point_wasm(this.tree[0]);\n return unmarshalPoint(TRANSFER_BUFFER);\n }\n get endIndex() {\n marshalNode(this);\n return C._ts_node_end_index_wasm(this.tree[0]);\n }\n get text() {\n return getText(this.tree, this.startIndex, this.endIndex);\n }\n get parseState() {\n marshalNode(this);\n return C._ts_node_parse_state_wasm(this.tree[0]);\n }\n get nextParseState() {\n marshalNode(this);\n return C._ts_node_next_parse_state_wasm(this.tree[0]);\n }\n get isNamed() {\n marshalNode(this);\n return C._ts_node_is_named_wasm(this.tree[0]) === 1;\n }\n get hasError() {\n marshalNode(this);\n return C._ts_node_has_error_wasm(this.tree[0]) === 1;\n }\n get hasChanges() {\n marshalNode(this);\n return C._ts_node_has_changes_wasm(this.tree[0]) === 1;\n }\n get isError() {\n marshalNode(this);\n return C._ts_node_is_error_wasm(this.tree[0]) === 1;\n }\n get isMissing() {\n marshalNode(this);\n return C._ts_node_is_missing_wasm(this.tree[0]) === 1;\n }\n get isExtra() {\n marshalNode(this);\n return C._ts_node_is_extra_wasm(this.tree[0]) === 1;\n }\n equals(other) {\n return this.id === other.id;\n }\n child(index) {\n marshalNode(this);\n C._ts_node_child_wasm(this.tree[0], index);\n return unmarshalNode(this.tree);\n }\n namedChild(index) {\n marshalNode(this);\n C._ts_node_named_child_wasm(this.tree[0], index);\n return unmarshalNode(this.tree);\n }\n childForFieldId(fieldId) {\n marshalNode(this);\n C._ts_node_child_by_field_id_wasm(this.tree[0], fieldId);\n return unmarshalNode(this.tree);\n }\n childForFieldName(fieldName) {\n const fieldId = this.tree.language.fields.indexOf(fieldName);\n if (fieldId !== -1) return this.childForFieldId(fieldId);\n return null;\n }\n fieldNameForChild(index) {\n marshalNode(this);\n const address = C._ts_node_field_name_for_child_wasm(this.tree[0], index);\n if (!address) {\n return null;\n }\n const result = AsciiToString(address);\n // must not free, the string memory is owned by the language\n return result;\n }\n childrenForFieldName(fieldName) {\n const fieldId = this.tree.language.fields.indexOf(fieldName);\n if (fieldId !== -1 && fieldId !== 0) return this.childrenForFieldId(fieldId);\n return [];\n }\n childrenForFieldId(fieldId) {\n marshalNode(this);\n C._ts_node_children_by_field_id_wasm(this.tree[0], fieldId);\n const count = getValue(TRANSFER_BUFFER, \"i32\");\n const buffer = getValue(TRANSFER_BUFFER + SIZE_OF_INT, \"i32\");\n const result = new Array(count);\n if (count > 0) {\n let address = buffer;\n for (let i = 0; i < count; i++) {\n result[i] = unmarshalNode(this.tree, address);\n address += SIZE_OF_NODE;\n }\n C._free(buffer);\n }\n return result;\n }\n firstChildForIndex(index) {\n marshalNode(this);\n const address = TRANSFER_BUFFER + SIZE_OF_NODE;\n setValue(address, index, \"i32\");\n C._ts_node_first_child_for_byte_wasm(this.tree[0]);\n return unmarshalNode(this.tree);\n }\n firstNamedChildForIndex(index) {\n marshalNode(this);\n const address = TRANSFER_BUFFER + SIZE_OF_NODE;\n setValue(address, index, \"i32\");\n C._ts_node_first_named_child_for_byte_wasm(this.tree[0]);\n return unmarshalNode(this.tree);\n }\n get childCount() {\n marshalNode(this);\n return C._ts_node_child_count_wasm(this.tree[0]);\n }\n get namedChildCount() {\n marshalNode(this);\n return C._ts_node_named_child_count_wasm(this.tree[0]);\n }\n get firstChild() {\n return this.child(0);\n }\n get firstNamedChild() {\n return this.namedChild(0);\n }\n get lastChild() {\n return this.child(this.childCount - 1);\n }\n get lastNamedChild() {\n return this.namedChild(this.namedChildCount - 1);\n }\n get children() {\n if (!this._children) {\n marshalNode(this);\n C._ts_node_children_wasm(this.tree[0]);\n const count = getValue(TRANSFER_BUFFER, \"i32\");\n const buffer = getValue(TRANSFER_BUFFER + SIZE_OF_INT, \"i32\");\n this._children = new Array(count);\n if (count > 0) {\n let address = buffer;\n for (let i = 0; i < count; i++) {\n this._children[i] = unmarshalNode(this.tree, address);\n address += SIZE_OF_NODE;\n }\n C._free(buffer);\n }\n }\n return this._children;\n }\n get namedChildren() {\n if (!this._namedChildren) {\n marshalNode(this);\n C._ts_node_named_children_wasm(this.tree[0]);\n const count = getValue(TRANSFER_BUFFER, \"i32\");\n const buffer = getValue(TRANSFER_BUFFER + SIZE_OF_INT, \"i32\");\n this._namedChildren = new Array(count);\n if (count > 0) {\n let address = buffer;\n for (let i = 0; i < count; i++) {\n this._namedChildren[i] = unmarshalNode(this.tree, address);\n address += SIZE_OF_NODE;\n }\n C._free(buffer);\n }\n }\n return this._namedChildren;\n }\n descendantsOfType(types, startPosition, endPosition) {\n if (!Array.isArray(types)) types = [ types ];\n if (!startPosition) startPosition = ZERO_POINT;\n if (!endPosition) endPosition = ZERO_POINT;\n // Convert the type strings to numeric type symbols.\n const symbols = [];\n const typesBySymbol = this.tree.language.types;\n for (let i = 0, n = typesBySymbol.length; i < n; i++) {\n if (types.includes(typesBySymbol[i])) {\n symbols.push(i);\n }\n }\n // Copy the array of symbols to the WASM heap.\n const symbolsAddress = C._malloc(SIZE_OF_INT * symbols.length);\n for (let i = 0, n = symbols.length; i < n; i++) {\n setValue(symbolsAddress + i * SIZE_OF_INT, symbols[i], \"i32\");\n }\n // Call the C API to compute the descendants.\n marshalNode(this);\n C._ts_node_descendants_of_type_wasm(this.tree[0], symbolsAddress, symbols.length, startPosition.row, startPosition.column, endPosition.row, endPosition.column);\n // Instantiate the nodes based on the data returned.\n const descendantCount = getValue(TRANSFER_BUFFER, \"i32\");\n const descendantAddress = getValue(TRANSFER_BUFFER + SIZE_OF_INT, \"i32\");\n const result = new Array(descendantCount);\n if (descendantCount > 0) {\n let address = descendantAddress;\n for (let i = 0; i < descendantCount; i++) {\n result[i] = unmarshalNode(this.tree, address);\n address += SIZE_OF_NODE;\n }\n }\n // Free the intermediate buffers\n C._free(descendantAddress);\n C._free(symbolsAddress);\n return result;\n }\n get nextSibling() {\n marshalNode(this);\n C._ts_node_next_sibling_wasm(this.tree[0]);\n return unmarshalNode(this.tree);\n }\n get previousSibling() {\n marshalNode(this);\n C._ts_node_prev_sibling_wasm(this.tree[0]);\n return unmarshalNode(this.tree);\n }\n get nextNamedSibling() {\n marshalNode(this);\n C._ts_node_next_named_sibling_wasm(this.tree[0]);\n return unmarshalNode(this.tree);\n }\n get previousNamedSibling() {\n marshalNode(this);\n C._ts_node_prev_named_sibling_wasm(this.tree[0]);\n return unmarshalNode(this.tree);\n }\n get descendantCount() {\n marshalNode(this);\n return C._ts_node_descendant_count_wasm(this.tree[0]);\n }\n get parent() {\n marshalNode(this);\n C._ts_node_parent_wasm(this.tree[0]);\n return unmarshalNode(this.tree);\n }\n descendantForIndex(start, end = start) {\n if (typeof start !== \"number\" || typeof end !== \"number\") {\n throw new Error(\"Arguments must be numbers\");\n }\n marshalNode(this);\n const address = TRANSFER_BUFFER + SIZE_OF_NODE;\n setValue(address, start, \"i32\");\n setValue(address + SIZE_OF_INT, end, \"i32\");\n C._ts_node_descendant_for_index_wasm(this.tree[0]);\n return unmarshalNode(this.tree);\n }\n namedDescendantForIndex(start, end = start) {\n if (typeof start !== \"number\" || typeof end !== \"number\") {\n throw new Error(\"Arguments must be numbers\");\n }\n marshalNode(this);\n const address = TRANSFER_BUFFER + SIZE_OF_NODE;\n setValue(address, start, \"i32\");\n setValue(address + SIZE_OF_INT, end, \"i32\");\n C._ts_node_named_descendant_for_index_wasm(this.tree[0]);\n return unmarshalNode(this.tree);\n }\n descendantForPosition(start, end = start) {\n if (!isPoint(start) || !isPoint(end)) {\n throw new Error(\"Arguments must be {row, column} objects\");\n }\n marshalNode(this);\n const address = TRANSFER_BUFFER + SIZE_OF_NODE;\n marshalPoint(address, start);\n marshalPoint(address + SIZE_OF_POINT, end);\n C._ts_node_descendant_for_position_wasm(this.tree[0]);\n return unmarshalNode(this.tree);\n }\n namedDescendantForPosition(start, end = start) {\n if (!isPoint(start) || !isPoint(end)) {\n throw new Error(\"Arguments must be {row, column} objects\");\n }\n marshalNode(this);\n const address = TRANSFER_BUFFER + SIZE_OF_NODE;\n marshalPoint(address, start);\n marshalPoint(address + SIZE_OF_POINT, end);\n C._ts_node_named_descendant_for_position_wasm(this.tree[0]);\n return unmarshalNode(this.tree);\n }\n walk() {\n marshalNode(this);\n C._ts_tree_cursor_new_wasm(this.tree[0]);\n return new TreeCursor(INTERNAL, this.tree);\n }\n toString() {\n marshalNode(this);\n const address = C._ts_node_to_string_wasm(this.tree[0]);\n const result = AsciiToString(address);\n C._free(address);\n return result;\n }\n }\n class TreeCursor {\n constructor(internal, tree) {\n assertInternal(internal);\n this.tree = tree;\n unmarshalTreeCursor(this);\n }\n delete() {\n marshalTreeCursor(this);\n C._ts_tree_cursor_delete_wasm(this.tree[0]);\n this[0] = this[1] = this[2] = 0;\n }\n reset(node) {\n marshalNode(node);\n marshalTreeCursor(this, TRANSFER_BUFFER + SIZE_OF_NODE);\n C._ts_tree_cursor_reset_wasm(this.tree[0]);\n unmarshalTreeCursor(this);\n }\n resetTo(cursor) {\n marshalTreeCursor(this, TRANSFER_BUFFER);\n marshalTreeCursor(cursor, TRANSFER_BUFFER + SIZE_OF_CURSOR);\n C._ts_tree_cursor_reset_to_wasm(this.tree[0], cursor.tree[0]);\n unmarshalTreeCursor(this);\n }\n get nodeType() {\n return this.tree.language.types[this.nodeTypeId] || \"ERROR\";\n }\n get nodeTypeId() {\n marshalTreeCursor(this);\n return C._ts_tree_cursor_current_node_type_id_wasm(this.tree[0]);\n }\n get nodeStateId() {\n marshalTreeCursor(this);\n return C._ts_tree_cursor_current_node_state_id_wasm(this.tree[0]);\n }\n get nodeId() {\n marshalTreeCursor(this);\n return C._ts_tree_cursor_current_node_id_wasm(this.tree[0]);\n }\n get nodeIsNamed() {\n marshalTreeCursor(this);\n return C._ts_tree_cursor_current_node_is_named_wasm(this.tree[0]) === 1;\n }\n get nodeIsMissing() {\n marshalTreeCursor(this);\n return C._ts_tree_cursor_current_node_is_missing_wasm(this.tree[0]) === 1;\n }\n get nodeText() {\n marshalTreeCursor(this);\n const startIndex = C._ts_tree_cursor_start_index_wasm(this.tree[0]);\n const endIndex = C._ts_tree_cursor_end_index_wasm(this.tree[0]);\n return getText(this.tree, startIndex, endIndex);\n }\n get startPosition() {\n marshalTreeCursor(this);\n C._ts_tree_cursor_start_position_wasm(this.tree[0]);\n return unmarshalPoint(TRANSFER_BUFFER);\n }\n get endPosition() {\n marshalTreeCursor(this);\n C._ts_tree_cursor_end_position_wasm(this.tree[0]);\n return unmarshalPoint(TRANSFER_BUFFER);\n }\n get startIndex() {\n marshalTreeCursor(this);\n return C._ts_tree_cursor_start_index_wasm(this.tree[0]);\n }\n get endIndex() {\n marshalTreeCursor(this);\n return C._ts_tree_cursor_end_index_wasm(this.tree[0]);\n }\n get currentNode() {\n marshalTreeCursor(this);\n C._ts_tree_cursor_current_node_wasm(this.tree[0]);\n return unmarshalNode(this.tree);\n }\n get currentFieldId() {\n marshalTreeCursor(this);\n return C._ts_tree_cursor_current_field_id_wasm(this.tree[0]);\n }\n get currentFieldName() {\n return this.tree.language.fields[this.currentFieldId];\n }\n get currentDepth() {\n marshalTreeCursor(this);\n return C._ts_tree_cursor_current_depth_wasm(this.tree[0]);\n }\n get currentDescendantIndex() {\n marshalTreeCursor(this);\n return C._ts_tree_cursor_current_descendant_index_wasm(this.tree[0]);\n }\n gotoFirstChild() {\n marshalTreeCursor(this);\n const result = C._ts_tree_cursor_goto_first_child_wasm(this.tree[0]);\n unmarshalTreeCursor(this);\n return result === 1;\n }\n gotoLastChild() {\n marshalTreeCursor(this);\n const result = C._ts_tree_cursor_goto_last_child_wasm(this.tree[0]);\n unmarshalTreeCursor(this);\n return result === 1;\n }\n gotoFirstChildForIndex(goalIndex) {\n marshalTreeCursor(this);\n setValue(TRANSFER_BUFFER + SIZE_OF_CURSOR, goalIndex, \"i32\");\n const result = C._ts_tree_cursor_goto_first_child_for_index_wasm(this.tree[0]);\n unmarshalTreeCursor(this);\n return result === 1;\n }\n gotoFirstChildForPosition(goalPosition) {\n marshalTreeCursor(this);\n marshalPoint(TRANSFER_BUFFER + SIZE_OF_CURSOR, goalPosition);\n const result = C._ts_tree_cursor_goto_first_child_for_position_wasm(this.tree[0]);\n unmarshalTreeCursor(this);\n return result === 1;\n }\n gotoNextSibling() {\n marshalTreeCursor(this);\n const result = C._ts_tree_cursor_goto_next_sibling_wasm(this.tree[0]);\n unmarshalTreeCursor(this);\n return result === 1;\n }\n gotoPreviousSibling() {\n marshalTreeCursor(this);\n const result = C._ts_tree_cursor_goto_previous_sibling_wasm(this.tree[0]);\n unmarshalTreeCursor(this);\n return result === 1;\n }\n gotoDescendant(goalDescendantindex) {\n marshalTreeCursor(this);\n C._ts_tree_cursor_goto_descendant_wasm(this.tree[0], goalDescendantindex);\n unmarshalTreeCursor(this);\n }\n gotoParent() {\n marshalTreeCursor(this);\n const result = C._ts_tree_cursor_goto_parent_wasm(this.tree[0]);\n unmarshalTreeCursor(this);\n return result === 1;\n }\n }\n class Language {\n constructor(internal, address) {\n assertInternal(internal);\n this[0] = address;\n this.types = new Array(C._ts_language_symbol_count(this[0]));\n for (let i = 0, n = this.types.length; i < n; i++) {\n if (C._ts_language_symbol_type(this[0], i) < 2) {\n this.types[i] = UTF8ToString(C._ts_language_symbol_name(this[0], i));\n }\n }\n this.fields = new Array(C._ts_language_field_count(this[0]) + 1);\n for (let i = 0, n = this.fields.length; i < n; i++) {\n const fieldName = C._ts_language_field_name_for_id(this[0], i);\n if (fieldName !== 0) {\n this.fields[i] = UTF8ToString(fieldName);\n } else {\n this.fields[i] = null;\n }\n }\n }\n get version() {\n return C._ts_language_version(this[0]);\n }\n get fieldCount() {\n return this.fields.length - 1;\n }\n get stateCount() {\n return C._ts_language_state_count(this[0]);\n }\n fieldIdForName(fieldName) {\n const result = this.fields.indexOf(fieldName);\n if (result !== -1) {\n return result;\n } else {\n return null;\n }\n }\n fieldNameForId(fieldId) {\n return this.fields[fieldId] || null;\n }\n idForNodeType(type, named) {\n const typeLength = lengthBytesUTF8(type);\n const typeAddress = C._malloc(typeLength + 1);\n stringToUTF8(type, typeAddress, typeLength + 1);\n const result = C._ts_language_symbol_for_name(this[0], typeAddress, typeLength, named);\n C._free(typeAddress);\n return result || null;\n }\n get nodeTypeCount() {\n return C._ts_language_symbol_count(this[0]);\n }\n nodeTypeForId(typeId) {\n const name = C._ts_language_symbol_name(this[0], typeId);\n return name ? UTF8ToString(name) : null;\n }\n nodeTypeIsNamed(typeId) {\n return C._ts_language_type_is_named_wasm(this[0], typeId) ? true : false;\n }\n nodeTypeIsVisible(typeId) {\n return C._ts_language_type_is_visible_wasm(this[0], typeId) ? true : false;\n }\n nextState(stateId, typeId) {\n return C._ts_language_next_state(this[0], stateId, typeId);\n }\n lookaheadIterator(stateId) {\n const address = C._ts_lookahead_iterator_new(this[0], stateId);\n if (address) return new LookaheadIterable(INTERNAL, address, this);\n return null;\n }\n query(source) {\n const sourceLength = lengthBytesUTF8(source);\n const sourceAddress = C._malloc(sourceLength + 1);\n stringToUTF8(source, sourceAddress, sourceLength + 1);\n const address = C._ts_query_new(this[0], sourceAddress, sourceLength, TRANSFER_BUFFER, TRANSFER_BUFFER + SIZE_OF_INT);\n if (!address) {\n const errorId = getValue(TRANSFER_BUFFER + SIZE_OF_INT, \"i32\");\n const errorByte = getValue(TRANSFER_BUFFER, \"i32\");\n const errorIndex = UTF8ToString(sourceAddress, errorByte).length;\n const suffix = source.substr(errorIndex, 100).split(\"\\n\")[0];\n let word = suffix.match(QUERY_WORD_REGEX)[0];\n let error;\n switch (errorId) {\n case 2:\n error = new RangeError(`Bad node name '${word}'`);\n break;\n\n case 3:\n error = new RangeError(`Bad field name '${word}'`);\n break;\n\n case 4:\n error = new RangeError(`Bad capture name @${word}`);\n break;\n\n case 5:\n error = new TypeError(`Bad pattern structure at offset ${errorIndex}: '${suffix}'...`);\n word = \"\";\n break;\n\n default:\n error = new SyntaxError(`Bad syntax at offset ${errorIndex}: '${suffix}'...`);\n word = \"\";\n break;\n }\n error.index = errorIndex;\n error.length = word.length;\n C._free(sourceAddress);\n throw error;\n }\n const stringCount = C._ts_query_string_count(address);\n const captureCount = C._ts_query_capture_count(address);\n const patternCount = C._ts_query_pattern_count(address);\n const captureNames = new Array(captureCount);\n const stringValues = new Array(stringCount);\n for (let i = 0; i < captureCount; i++) {\n const nameAddress = C._ts_query_capture_name_for_id(address, i, TRANSFER_BUFFER);\n const nameLength = getValue(TRANSFER_BUFFER, \"i32\");\n captureNames[i] = UTF8ToString(nameAddress, nameLength);\n }\n for (let i = 0; i < stringCount; i++) {\n const valueAddress = C._ts_query_string_value_for_id(address, i, TRANSFER_BUFFER);\n const nameLength = getValue(TRANSFER_BUFFER, \"i32\");\n stringValues[i] = UTF8ToString(valueAddress, nameLength);\n }\n const setProperties = new Array(patternCount);\n const assertedProperties = new Array(patternCount);\n const refutedProperties = new Array(patternCount);\n const predicates = new Array(patternCount);\n const textPredicates = new Array(patternCount);\n for (let i = 0; i < patternCount; i++) {\n const predicatesAddress = C._ts_query_predicates_for_pattern(address, i, TRANSFER_BUFFER);\n const stepCount = getValue(TRANSFER_BUFFER, \"i32\");\n predicates[i] = [];\n textPredicates[i] = [];\n const steps = [];\n let stepAddress = predicatesAddress;\n for (let j = 0; j < stepCount; j++) {\n const stepType = getValue(stepAddress, \"i32\");\n stepAddress += SIZE_OF_INT;\n const stepValueId = getValue(stepAddress, \"i32\");\n stepAddress += SIZE_OF_INT;\n if (stepType === PREDICATE_STEP_TYPE_CAPTURE) {\n steps.push({\n type: \"capture\",\n name: captureNames[stepValueId]\n });\n } else if (stepType === PREDICATE_STEP_TYPE_STRING) {\n steps.push({\n type: \"string\",\n value: stringValues[stepValueId]\n });\n } else if (steps.length > 0) {\n if (steps[0].type !== \"string\") {\n throw new Error(\"Predicates must begin with a literal value\");\n }\n const operator = steps[0].value;\n let isPositive = true;\n let matchAll = true;\n let captureName;\n switch (operator) {\n case \"any-not-eq?\":\n case \"not-eq?\":\n isPositive = false;\n\n case \"any-eq?\":\n case \"eq?\":\n if (steps.length !== 3) {\n throw new Error(`Wrong number of arguments to \\`#${operator}\\` predicate. Expected 2, got ${steps.length - 1}`);\n }\n if (steps[1].type !== \"capture\") {\n throw new Error(`First argument of \\`#${operator}\\` predicate must be a capture. Got \"${steps[1].value}\"`);\n }\n matchAll = !operator.startsWith(\"any-\");\n if (steps[2].type === \"capture\") {\n const captureName1 = steps[1].name;\n const captureName2 = steps[2].name;\n textPredicates[i].push(captures => {\n const nodes1 = [];\n const nodes2 = [];\n for (const c of captures) {\n if (c.name === captureName1) nodes1.push(c.node);\n if (c.name === captureName2) nodes2.push(c.node);\n }\n const compare = (n1, n2, positive) => positive ? n1.text === n2.text : n1.text !== n2.text;\n return matchAll ? nodes1.every(n1 => nodes2.some(n2 => compare(n1, n2, isPositive))) : nodes1.some(n1 => nodes2.some(n2 => compare(n1, n2, isPositive)));\n });\n } else {\n captureName = steps[1].name;\n const stringValue = steps[2].value;\n const matches = n => n.text === stringValue;\n const doesNotMatch = n => n.text !== stringValue;\n textPredicates[i].push(captures => {\n const nodes = [];\n for (const c of captures) {\n if (c.name === captureName) nodes.push(c.node);\n }\n const test = isPositive ? matches : doesNotMatch;\n return matchAll ? nodes.every(test) : nodes.some(test);\n });\n }\n break;\n\n case \"any-not-match?\":\n case \"not-match?\":\n isPositive = false;\n\n case \"any-match?\":\n case \"match?\":\n if (steps.length !== 3) {\n throw new Error(`Wrong number of arguments to \\`#${operator}\\` predicate. Expected 2, got ${steps.length - 1}.`);\n }\n if (steps[1].type !== \"capture\") {\n throw new Error(`First argument of \\`#${operator}\\` predicate must be a capture. Got \"${steps[1].value}\".`);\n }\n if (steps[2].type !== \"string\") {\n throw new Error(`Second argument of \\`#${operator}\\` predicate must be a string. Got @${steps[2].value}.`);\n }\n captureName = steps[1].name;\n const regex = new RegExp(steps[2].value);\n matchAll = !operator.startsWith(\"any-\");\n textPredicates[i].push(captures => {\n const nodes = [];\n for (const c of captures) {\n if (c.name === captureName) nodes.push(c.node.text);\n }\n const test = (text, positive) => positive ? regex.test(text) : !regex.test(text);\n if (nodes.length === 0) return !isPositive;\n return matchAll ? nodes.every(text => test(text, isPositive)) : nodes.some(text => test(text, isPositive));\n });\n break;\n\n case \"set!\":\n if (steps.length < 2 || steps.length > 3) {\n throw new Error(`Wrong number of arguments to \\`#set!\\` predicate. Expected 1 or 2. Got ${steps.length - 1}.`);\n }\n if (steps.some(s => s.type !== \"string\")) {\n throw new Error(`Arguments to \\`#set!\\` predicate must be a strings.\".`);\n }\n if (!setProperties[i]) setProperties[i] = {};\n setProperties[i][steps[1].value] = steps[2] ? steps[2].value : null;\n break;\n\n case \"is?\":\n case \"is-not?\":\n if (steps.length < 2 || steps.length > 3) {\n throw new Error(`Wrong number of arguments to \\`#${operator}\\` predicate. Expected 1 or 2. Got ${steps.length - 1}.`);\n }\n if (steps.some(s => s.type !== \"string\")) {\n throw new Error(`Arguments to \\`#${operator}\\` predicate must be a strings.\".`);\n }\n const properties = operator === \"is?\" ? assertedProperties : refutedProperties;\n if (!properties[i]) properties[i] = {};\n properties[i][steps[1].value] = steps[2] ? steps[2].value : null;\n break;\n\n case \"not-any-of?\":\n isPositive = false;\n\n case \"any-of?\":\n if (steps.length < 2) {\n throw new Error(`Wrong number of arguments to \\`#${operator}\\` predicate. Expected at least 1. Got ${steps.length - 1}.`);\n }\n if (steps[1].type !== \"capture\") {\n throw new Error(`First argument of \\`#${operator}\\` predicate must be a capture. Got \"${steps[1].value}\".`);\n }\n for (let i = 2; i < steps.length; i++) {\n if (steps[i].type !== \"string\") {\n throw new Error(`Arguments to \\`#${operator}\\` predicate must be a strings.\".`);\n }\n }\n captureName = steps[1].name;\n const values = steps.slice(2).map(s => s.value);\n textPredicates[i].push(captures => {\n const nodes = [];\n for (const c of captures) {\n if (c.name === captureName) nodes.push(c.node.text);\n }\n if (nodes.length === 0) return !isPositive;\n return nodes.every(text => values.includes(text)) === isPositive;\n });\n break;\n\n default:\n predicates[i].push({\n operator: operator,\n operands: steps.slice(1)\n });\n }\n steps.length = 0;\n }\n }\n Object.freeze(setProperties[i]);\n Object.freeze(assertedProperties[i]);\n Object.freeze(refutedProperties[i]);\n }\n C._free(sourceAddress);\n return new Query(INTERNAL, address, captureNames, textPredicates, predicates, Object.freeze(setProperties), Object.freeze(assertedProperties), Object.freeze(refutedProperties));\n }\n static load(input) {\n let bytes;\n if (input instanceof Uint8Array) {\n bytes = Promise.resolve(input);\n } else {\n const url = input;\n if (typeof process !== \"undefined\" && process.versions && process.versions.node) {\n const fs = require(\"fs\");\n bytes = Promise.resolve(fs.readFileSync(url));\n } else {\n bytes = fetch(url).then(response => response.arrayBuffer().then(buffer => {\n if (response.ok) {\n return new Uint8Array(buffer);\n } else {\n const body = new TextDecoder(\"utf-8\").decode(buffer);\n throw new Error(`Language.load failed with status ${response.status}.\\n\\n${body}`);\n }\n }));\n }\n }\n return bytes.then(bytes => loadWebAssemblyModule(bytes, {\n loadAsync: true\n })).then(mod => {\n const symbolNames = Object.keys(mod);\n const functionName = symbolNames.find(key => LANGUAGE_FUNCTION_REGEX.test(key) && !key.includes(\"external_scanner_\"));\n if (!functionName) {\n console.log(`Couldn't find language function in WASM file. Symbols:\\n${JSON.stringify(symbolNames, null, 2)}`);\n }\n const languageAddress = mod[functionName]();\n return new Language(INTERNAL, languageAddress);\n });\n }\n }\n class LookaheadIterable {\n constructor(internal, address, language) {\n assertInternal(internal);\n this[0] = address;\n this.language = language;\n }\n get currentTypeId() {\n return C._ts_lookahead_iterator_current_symbol(this[0]);\n }\n get currentType() {\n return this.language.types[this.currentTypeId] || \"ERROR\";\n }\n delete() {\n C._ts_lookahead_iterator_delete(this[0]);\n this[0] = 0;\n }\n resetState(stateId) {\n return C._ts_lookahead_iterator_reset_state(this[0], stateId);\n }\n reset(language, stateId) {\n if (C._ts_lookahead_iterator_reset(this[0], language[0], stateId)) {\n this.language = language;\n return true;\n }\n return false;\n }\n [Symbol.iterator]() {\n const self = this;\n return {\n next() {\n if (C._ts_lookahead_iterator_next(self[0])) {\n return {\n done: false,\n value: self.currentType\n };\n }\n return {\n done: true,\n value: \"\"\n };\n }\n };\n }\n }\n class Query {\n constructor(internal, address, captureNames, textPredicates, predicates, setProperties, assertedProperties, refutedProperties) {\n assertInternal(internal);\n this[0] = address;\n this.captureNames = captureNames;\n this.textPredicates = textPredicates;\n this.predicates = predicates;\n this.setProperties = setProperties;\n this.assertedProperties = assertedProperties;\n this.refutedProperties = refutedProperties;\n this.exceededMatchLimit = false;\n }\n delete() {\n C._ts_query_delete(this[0]);\n this[0] = 0;\n }\n matches(node, {startPosition: startPosition = ZERO_POINT, endPosition: endPosition = ZERO_POINT, startIndex: startIndex = 0, endIndex: endIndex = 0, matchLimit: matchLimit = 4294967295, maxStartDepth: maxStartDepth = 4294967295, timeoutMicros: timeoutMicros = 0} = {}) {\n if (typeof matchLimit !== \"number\") {\n throw new Error(\"Arguments must be numbers\");\n }\n marshalNode(node);\n C._ts_query_matches_wasm(this[0], node.tree[0], startPosition.row, startPosition.column, endPosition.row, endPosition.column, startIndex, endIndex, matchLimit, maxStartDepth, timeoutMicros);\n const rawCount = getValue(TRANSFER_BUFFER, \"i32\");\n const startAddress = getValue(TRANSFER_BUFFER + SIZE_OF_INT, \"i32\");\n const didExceedMatchLimit = getValue(TRANSFER_BUFFER + 2 * SIZE_OF_INT, \"i32\");\n const result = new Array(rawCount);\n this.exceededMatchLimit = Boolean(didExceedMatchLimit);\n let filteredCount = 0;\n let address = startAddress;\n for (let i = 0; i < rawCount; i++) {\n const pattern = getValue(address, \"i32\");\n address += SIZE_OF_INT;\n const captureCount = getValue(address, \"i32\");\n address += SIZE_OF_INT;\n const captures = new Array(captureCount);\n address = unmarshalCaptures(this, node.tree, address, captures);\n if (this.textPredicates[pattern].every(p => p(captures))) {\n result[filteredCount] = {\n pattern: pattern,\n captures: captures\n };\n const setProperties = this.setProperties[pattern];\n if (setProperties) result[filteredCount].setProperties = setProperties;\n const assertedProperties = this.assertedProperties[pattern];\n if (assertedProperties) result[filteredCount].assertedProperties = assertedProperties;\n const refutedProperties = this.refutedProperties[pattern];\n if (refutedProperties) result[filteredCount].refutedProperties = refutedProperties;\n filteredCount++;\n }\n }\n result.length = filteredCount;\n C._free(startAddress);\n return result;\n }\n captures(node, {startPosition: startPosition = ZERO_POINT, endPosition: endPosition = ZERO_POINT, startIndex: startIndex = 0, endIndex: endIndex = 0, matchLimit: matchLimit = 4294967295, maxStartDepth: maxStartDepth = 4294967295, timeoutMicros: timeoutMicros = 0} = {}) {\n if (typeof matchLimit !== \"number\") {\n throw new Error(\"Arguments must be numbers\");\n }\n marshalNode(node);\n C._ts_query_captures_wasm(this[0], node.tree[0], startPosition.row, startPosition.column, endPosition.row, endPosition.column, startIndex, endIndex, matchLimit, maxStartDepth, timeoutMicros);\n const count = getValue(TRANSFER_BUFFER, \"i32\");\n const startAddress = getValue(TRANSFER_BUFFER + SIZE_OF_INT, \"i32\");\n const didExceedMatchLimit = getValue(TRANSFER_BUFFER + 2 * SIZE_OF_INT, \"i32\");\n const result = [];\n this.exceededMatchLimit = Boolean(didExceedMatchLimit);\n const captures = [];\n let address = startAddress;\n for (let i = 0; i < count; i++) {\n const pattern = getValue(address, \"i32\");\n address += SIZE_OF_INT;\n const captureCount = getValue(address, \"i32\");\n address += SIZE_OF_INT;\n const captureIndex = getValue(address, \"i32\");\n address += SIZE_OF_INT;\n captures.length = captureCount;\n address = unmarshalCaptures(this, node.tree, address, captures);\n if (this.textPredicates[pattern].every(p => p(captures))) {\n const capture = captures[captureIndex];\n const setProperties = this.setProperties[pattern];\n if (setProperties) capture.setProperties = setProperties;\n const assertedProperties = this.assertedProperties[pattern];\n if (assertedProperties) capture.assertedProperties = assertedProperties;\n const refutedProperties = this.refutedProperties[pattern];\n if (refutedProperties) capture.refutedProperties = refutedProperties;\n result.push(capture);\n }\n }\n C._free(startAddress);\n return result;\n }\n predicatesForPattern(patternIndex) {\n return this.predicates[patternIndex];\n }\n disableCapture(captureName) {\n const captureNameLength = lengthBytesUTF8(captureName);\n const captureNameAddress = C._malloc(captureNameLength + 1);\n stringToUTF8(captureName, captureNameAddress, captureNameLength + 1);\n C._ts_query_disable_capture(this[0], captureNameAddress, captureNameLength);\n C._free(captureNameAddress);\n }\n didExceedMatchLimit() {\n return this.exceededMatchLimit;\n }\n }\n function getText(tree, startIndex, endIndex) {\n const length = endIndex - startIndex;\n let result = tree.textCallback(startIndex, null, endIndex);\n startIndex += result.length;\n while (startIndex < endIndex) {\n const string = tree.textCallback(startIndex, null, endIndex);\n if (string && string.length > 0) {\n startIndex += string.length;\n result += string;\n } else {\n break;\n }\n }\n if (startIndex > endIndex) {\n result = result.slice(0, length);\n }\n return result;\n }\n function unmarshalCaptures(query, tree, address, result) {\n for (let i = 0, n = result.length; i < n; i++) {\n const captureIndex = getValue(address, \"i32\");\n address += SIZE_OF_INT;\n const node = unmarshalNode(tree, address);\n address += SIZE_OF_NODE;\n result[i] = {\n name: query.captureNames[captureIndex],\n node: node\n };\n }\n return address;\n }\n function assertInternal(x) {\n if (x !== INTERNAL) throw new Error(\"Illegal constructor\");\n }\n function isPoint(point) {\n return (point && typeof point.row === \"number\" && typeof point.column === \"number\");\n }\n function marshalNode(node) {\n let address = TRANSFER_BUFFER;\n setValue(address, node.id, \"i32\");\n address += SIZE_OF_INT;\n setValue(address, node.startIndex, \"i32\");\n address += SIZE_OF_INT;\n setValue(address, node.startPosition.row, \"i32\");\n address += SIZE_OF_INT;\n setValue(address, node.startPosition.column, \"i32\");\n address += SIZE_OF_INT;\n setValue(address, node[0], \"i32\");\n }\n function unmarshalNode(tree, address = TRANSFER_BUFFER) {\n const id = getValue(address, \"i32\");\n address += SIZE_OF_INT;\n if (id === 0) return null;\n const index = getValue(address, \"i32\");\n address += SIZE_OF_INT;\n const row = getValue(address, \"i32\");\n address += SIZE_OF_INT;\n const column = getValue(address, \"i32\");\n address += SIZE_OF_INT;\n const other = getValue(address, \"i32\");\n const result = new Node(INTERNAL, tree);\n result.id = id;\n result.startIndex = index;\n result.startPosition = {\n row: row,\n column: column\n };\n result[0] = other;\n return result;\n }\n function marshalTreeCursor(cursor, address = TRANSFER_BUFFER) {\n setValue(address + 0 * SIZE_OF_INT, cursor[0], \"i32\");\n setValue(address + 1 * SIZE_OF_INT, cursor[1], \"i32\");\n setValue(address + 2 * SIZE_OF_INT, cursor[2], \"i32\");\n setValue(address + 3 * SIZE_OF_INT, cursor[3], \"i32\");\n }\n function unmarshalTreeCursor(cursor) {\n cursor[0] = getValue(TRANSFER_BUFFER + 0 * SIZE_OF_INT, \"i32\");\n cursor[1] = getValue(TRANSFER_BUFFER + 1 * SIZE_OF_INT, \"i32\");\n cursor[2] = getValue(TRANSFER_BUFFER + 2 * SIZE_OF_INT, \"i32\");\n cursor[3] = getValue(TRANSFER_BUFFER + 3 * SIZE_OF_INT, \"i32\");\n }\n function marshalPoint(address, point) {\n setValue(address, point.row, \"i32\");\n setValue(address + SIZE_OF_INT, point.column, \"i32\");\n }\n function unmarshalPoint(address) {\n const result = {\n row: getValue(address, \"i32\") >>> 0,\n column: getValue(address + SIZE_OF_INT, \"i32\") >>> 0\n };\n return result;\n }\n function marshalRange(address, range) {\n marshalPoint(address, range.startPosition);\n address += SIZE_OF_POINT;\n marshalPoint(address, range.endPosition);\n address += SIZE_OF_POINT;\n setValue(address, range.startIndex, \"i32\");\n address += SIZE_OF_INT;\n setValue(address, range.endIndex, \"i32\");\n address += SIZE_OF_INT;\n }\n function unmarshalRange(address) {\n const result = {};\n result.startPosition = unmarshalPoint(address);\n address += SIZE_OF_POINT;\n result.endPosition = unmarshalPoint(address);\n address += SIZE_OF_POINT;\n result.startIndex = getValue(address, \"i32\") >>> 0;\n address += SIZE_OF_INT;\n result.endIndex = getValue(address, \"i32\") >>> 0;\n return result;\n }\n function marshalEdit(edit) {\n let address = TRANSFER_BUFFER;\n marshalPoint(address, edit.startPosition);\n address += SIZE_OF_POINT;\n marshalPoint(address, edit.oldEndPosition);\n address += SIZE_OF_POINT;\n marshalPoint(address, edit.newEndPosition);\n address += SIZE_OF_POINT;\n setValue(address, edit.startIndex, \"i32\");\n address += SIZE_OF_INT;\n setValue(address, edit.oldEndIndex, \"i32\");\n address += SIZE_OF_INT;\n setValue(address, edit.newEndIndex, \"i32\");\n address += SIZE_OF_INT;\n }\n // end include: /src/lib/binding_web/binding.js\n // include: /src/lib/binding_web/suffix.js\n for (const name of Object.getOwnPropertyNames(ParserImpl.prototype)) {\n Object.defineProperty(Parser.prototype, name, {\n value: ParserImpl.prototype[name],\n enumerable: false,\n writable: false\n });\n }\n Parser.Language = Language;\n Module.onRuntimeInitialized = () => {\n ParserImpl.init();\n resolveInitPromise();\n };\n });\n }\n }\n return Parser;\n}();\n\nif (typeof exports === \"object\") {\n module.exports = TreeSitter;\n}\n","import { AgentSideConnection, ndJsonStream } from \"@agentclientprotocol/sdk\";\nimport type { SessionLogWriter } from \"../session-log-writer\";\nimport type { PostHogAPIConfig, ProcessSpawnedCallback } from \"../types\";\nimport { Logger } from \"../utils/logger\";\nimport {\n createBidirectionalStreams,\n createTappedWritableStream,\n type StreamPair,\n} from \"../utils/streams\";\nimport { ClaudeAcpAgent } from \"./claude/claude-agent\";\nimport { CodexAcpAgent } from \"./codex/codex-agent\";\nimport type { CodexProcessOptions } from \"./codex/spawn\";\n\ntype AgentAdapter = \"claude\" | \"codex\";\n\nexport type AcpConnectionConfig = {\n adapter?: AgentAdapter;\n logWriter?: SessionLogWriter;\n taskRunId?: string;\n taskId?: string;\n /** Deployment environment - \"local\" for desktop, \"cloud\" for cloud sandbox */\n deviceType?: \"local\" | \"cloud\";\n logger?: Logger;\n processCallbacks?: ProcessSpawnedCallback;\n codexOptions?: CodexProcessOptions;\n allowedModelIds?: Set<string>;\n /** Callback invoked when the agent calls the create_output tool for structured output */\n onStructuredOutput?: (output: Record<string, unknown>) => Promise<void>;\n /** PostHog API config; when set, enables file-read enrichment unless disabled. */\n posthogApiConfig?: PostHogAPIConfig;\n /** Defaults to true when posthogApiConfig is set. Set to false to disable enrichment. */\n enricherEnabled?: boolean;\n};\n\nexport type AcpConnection = {\n agentConnection?: AgentSideConnection;\n clientStreams: StreamPair;\n cleanup: () => Promise<void>;\n};\n\nexport type InProcessAcpConnection = AcpConnection;\n\n/**\n * Creates an ACP connection with the specified agent framework.\n *\n * @param config - Configuration including framework selection\n * @returns Connection with agent and client streams\n */\nexport function createAcpConnection(\n config: AcpConnectionConfig = {},\n): AcpConnection {\n const adapterType = config.adapter ?? \"claude\";\n\n if (adapterType === \"codex\") {\n return createCodexConnection(config);\n }\n\n return createClaudeConnection(config);\n}\n\nfunction resolveEnricherApiConfig(\n config: AcpConnectionConfig,\n): PostHogAPIConfig | undefined {\n const enabled = !!config.posthogApiConfig && config.enricherEnabled !== false;\n return enabled ? config.posthogApiConfig : undefined;\n}\n\nfunction createClaudeConnection(config: AcpConnectionConfig): AcpConnection {\n const logger =\n config.logger?.child(\"AcpConnection\") ??\n new Logger({ debug: true, prefix: \"[AcpConnection]\" });\n const streams = createBidirectionalStreams();\n\n const { logWriter } = config;\n\n let agentWritable = streams.agent.writable;\n let clientWritable = streams.client.writable;\n\n if (config.taskRunId && logWriter) {\n if (!logWriter.isRegistered(config.taskRunId)) {\n logWriter.register(config.taskRunId, {\n taskId: config.taskId ?? config.taskRunId,\n runId: config.taskRunId,\n deviceType: config.deviceType,\n });\n }\n\n const taskRunId = config.taskRunId;\n agentWritable = createTappedWritableStream(streams.agent.writable, {\n onMessage: (line) => {\n logWriter.appendRawLine(taskRunId, line);\n },\n logger,\n });\n\n clientWritable = createTappedWritableStream(streams.client.writable, {\n onMessage: (line) => {\n logWriter.appendRawLine(taskRunId, line);\n },\n logger,\n });\n } else {\n logger.info(\"Tapped streams NOT enabled\", {\n hasTaskRunId: !!config.taskRunId,\n hasLogWriter: !!logWriter,\n });\n }\n\n const agentStream = ndJsonStream(agentWritable, streams.agent.readable);\n\n let agent: ClaudeAcpAgent | null = null;\n const agentConnection = new AgentSideConnection((client) => {\n agent = new ClaudeAcpAgent(client, {\n ...config.processCallbacks,\n onStructuredOutput: config.onStructuredOutput,\n posthogApiConfig: resolveEnricherApiConfig(config),\n });\n return agent;\n }, agentStream);\n\n return {\n agentConnection,\n clientStreams: {\n readable: streams.client.readable,\n writable: clientWritable,\n },\n cleanup: async () => {\n logger.info(\"Cleaning up ACP connection\");\n\n if (agent) {\n await agent.closeSession();\n }\n\n try {\n await streams.client.writable.close();\n } catch {\n // Stream may already be closed\n }\n try {\n await streams.agent.writable.close();\n } catch {\n // Stream may already be closed\n }\n },\n };\n}\n\n/**\n * Creates an ACP connection to codex-acp via an in-process proxy agent.\n *\n * The CodexAcpAgent implements the ACP Agent interface and delegates to\n * the codex-acp binary over a ClientSideConnection. This replaces the\n * previous raw stream transform approach and gives us proper interception\n * points for PostHog-specific features.\n */\nfunction createCodexConnection(config: AcpConnectionConfig): AcpConnection {\n const logger =\n config.logger?.child(\"CodexConnection\") ??\n new Logger({ debug: true, prefix: \"[CodexConnection]\" });\n\n const { logWriter } = config;\n\n // Create bidirectional streams for client ↔ agent communication\n const streams = createBidirectionalStreams();\n\n let agentWritable = streams.agent.writable;\n let clientWritable = streams.client.writable;\n\n // Tap streams for session log writing\n if (config.taskRunId && logWriter) {\n if (!logWriter.isRegistered(config.taskRunId)) {\n logWriter.register(config.taskRunId, {\n taskId: config.taskId ?? config.taskRunId,\n runId: config.taskRunId,\n deviceType: config.deviceType,\n });\n }\n\n const taskRunId = config.taskRunId;\n agentWritable = createTappedWritableStream(streams.agent.writable, {\n onMessage: (line) => {\n logWriter.appendRawLine(taskRunId, line);\n },\n logger,\n });\n\n clientWritable = createTappedWritableStream(streams.client.writable, {\n onMessage: (line) => {\n logWriter.appendRawLine(taskRunId, line);\n },\n logger,\n });\n } else {\n logger.info(\"Tapped streams NOT enabled for Codex\", {\n hasTaskRunId: !!config.taskRunId,\n hasLogWriter: !!logWriter,\n });\n }\n\n const agentStream = ndJsonStream(agentWritable, streams.agent.readable);\n\n let agent: CodexAcpAgent | null = null;\n const agentConnection = new AgentSideConnection((client) => {\n agent = new CodexAcpAgent(client, {\n codexProcessOptions: config.codexOptions ?? {},\n processCallbacks: config.processCallbacks,\n posthogApiConfig: resolveEnricherApiConfig(config),\n });\n return agent;\n }, agentStream);\n\n return {\n agentConnection,\n clientStreams: {\n readable: streams.client.readable,\n writable: clientWritable,\n },\n cleanup: async () => {\n logger.info(\"Cleaning up Codex connection\");\n\n if (agent) {\n await agent.closeSession();\n }\n\n try {\n await streams.client.writable.close();\n } catch {\n // Stream may already be closed\n }\n try {\n await streams.agent.writable.close();\n } catch {\n // Stream may already be closed\n }\n },\n };\n}\n","import type { LogLevel as LogLevelType, OnLogCallback } from \"../types\";\n\nexport interface LoggerConfig {\n debug?: boolean;\n prefix?: string;\n scope?: string;\n onLog?: OnLogCallback;\n}\n\nexport class Logger {\n private debugEnabled: boolean;\n private prefix: string;\n private scope: string;\n private onLog?: OnLogCallback;\n\n constructor(config: LoggerConfig = {}) {\n this.debugEnabled = config.debug ?? false;\n this.prefix = config.prefix ?? \"[PostHog Agent]\";\n this.scope = config.scope ?? \"agent\";\n this.onLog = config.onLog;\n }\n\n private formatMessage(\n level: string,\n message: string,\n data?: unknown,\n ): string {\n const timestamp = new Date().toISOString();\n const base = `${timestamp} ${this.prefix} [${level}] ${message}`;\n\n if (data !== undefined) {\n return `${base} ${JSON.stringify(data, null, 2)}`;\n }\n\n return base;\n }\n\n private emitLog(level: LogLevelType, message: string, data?: unknown) {\n if (this.onLog) {\n this.onLog(level, this.scope, message, data);\n return;\n }\n\n const shouldLog = this.debugEnabled || level === \"error\";\n\n if (shouldLog) {\n console[level](this.formatMessage(level.toLowerCase(), message, data));\n }\n }\n\n error(message: string, error?: Error | unknown) {\n const data =\n error instanceof Error\n ? { message: error.message, stack: error.stack }\n : error;\n\n this.emitLog(\"error\", message, data);\n }\n\n warn(message: string, data?: unknown) {\n this.emitLog(\"warn\", message, data);\n }\n\n info(message: string, data?: unknown) {\n this.emitLog(\"info\", message, data);\n }\n\n debug(message: string, data?: unknown) {\n this.emitLog(\"debug\", message, data);\n }\n\n child(childPrefix: string): Logger {\n return new Logger({\n debug: this.debugEnabled,\n prefix: `${this.prefix} [${childPrefix}]`,\n scope: `${this.scope}:${childPrefix}`,\n onLog: this.onLog,\n });\n }\n}\n","import type { Readable, Writable } from \"node:stream\";\nimport { ReadableStream, WritableStream } from \"node:stream/web\";\nimport type { Logger } from \"./logger\";\n\nexport class Pushable<T> implements AsyncIterable<T> {\n private queue: T[] = [];\n private resolvers: ((value: IteratorResult<T>) => void)[] = [];\n private done = false;\n\n push(item: T) {\n const resolve = this.resolvers.shift();\n if (resolve) {\n resolve({ value: item, done: false });\n } else {\n this.queue.push(item);\n }\n }\n\n end() {\n this.done = true;\n for (const resolve of this.resolvers) {\n resolve({ value: undefined as unknown as T, done: true });\n }\n this.resolvers = [];\n }\n\n [Symbol.asyncIterator](): AsyncIterator<T> {\n return {\n next: (): Promise<IteratorResult<T>> => {\n if (this.queue.length > 0) {\n const value = this.queue.shift() as T;\n return Promise.resolve({ value, done: false });\n }\n if (this.done) {\n return Promise.resolve({\n value: undefined as unknown as T,\n done: true,\n });\n }\n return new Promise<IteratorResult<T>>((resolve) => {\n this.resolvers.push(resolve);\n });\n },\n };\n }\n}\n\nexport type StreamPair = {\n readable: globalThis.ReadableStream<Uint8Array>;\n writable: globalThis.WritableStream<Uint8Array>;\n};\n\nexport type BidirectionalStreamPair = {\n client: StreamPair;\n agent: StreamPair;\n};\n\nfunction pushableToReadableStream(\n pushable: Pushable<Uint8Array>,\n): globalThis.ReadableStream<Uint8Array> {\n const iterator = pushable[Symbol.asyncIterator]();\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n const { value, done } = await iterator.next();\n if (done) {\n controller.close();\n } else {\n controller.enqueue(value);\n }\n },\n }) as unknown as globalThis.ReadableStream<Uint8Array>;\n}\n\nexport function createBidirectionalStreams(): BidirectionalStreamPair {\n const clientToAgentPushable = new Pushable<Uint8Array>();\n const agentToClientPushable = new Pushable<Uint8Array>();\n\n const clientToAgentReadable = pushableToReadableStream(clientToAgentPushable);\n const agentToClientReadable = pushableToReadableStream(agentToClientPushable);\n\n const clientToAgentWritable = new WritableStream<Uint8Array>({\n write(chunk) {\n clientToAgentPushable.push(chunk);\n },\n close() {\n clientToAgentPushable.end();\n },\n }) as globalThis.WritableStream<Uint8Array>;\n\n const agentToClientWritable = new WritableStream<Uint8Array>({\n write(chunk) {\n agentToClientPushable.push(chunk);\n },\n close() {\n agentToClientPushable.end();\n },\n }) as globalThis.WritableStream<Uint8Array>;\n\n return {\n client: {\n readable: agentToClientReadable,\n writable: clientToAgentWritable,\n },\n agent: {\n readable: clientToAgentReadable,\n writable: agentToClientWritable,\n },\n };\n}\n\ntype MessageCallback = (line: string) => void;\n\nexport interface TappedStreamOptions {\n onMessage: MessageCallback;\n logger?: Logger;\n}\n\nexport function createTappedWritableStream(\n underlying: WritableStream<Uint8Array>,\n options: TappedStreamOptions,\n): WritableStream<Uint8Array> {\n const { onMessage, logger } = options;\n const decoder = new TextDecoder();\n let buffer = \"\";\n let _messageCount = 0;\n\n return new WritableStream({\n async write(chunk: Uint8Array) {\n buffer += decoder.decode(chunk, { stream: true });\n\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (!line.trim()) continue;\n _messageCount++;\n\n onMessage(line);\n }\n\n try {\n const writer = underlying.getWriter();\n await writer.write(chunk);\n writer.releaseLock();\n } catch (err) {\n // Stream may be closed if subprocess crashed - log but don't throw\n logger?.error(\"ACP write error\", err);\n }\n },\n async close() {\n try {\n const writer = underlying.getWriter();\n await writer.close();\n writer.releaseLock();\n } catch {\n // Stream may already be closed\n }\n },\n async abort(reason: unknown) {\n logger?.warn(\"Tapped stream aborted\", { reason });\n try {\n const writer = underlying.getWriter();\n await writer.abort(reason);\n writer.releaseLock();\n } catch {\n // Stream may already be closed\n }\n },\n });\n}\n\nexport function nodeReadableToWebReadable(\n nodeStream: Readable,\n): globalThis.ReadableStream<Uint8Array> {\n return new ReadableStream<Uint8Array>({\n start(controller) {\n nodeStream.on(\"data\", (chunk: Buffer) => {\n controller.enqueue(new Uint8Array(chunk));\n });\n nodeStream.on(\"end\", () => {\n controller.close();\n });\n nodeStream.on(\"error\", (err) => {\n controller.error(err);\n });\n },\n cancel() {\n nodeStream.destroy();\n },\n }) as unknown as globalThis.ReadableStream<Uint8Array>;\n}\n\nexport function nodeWritableToWebWritable(\n nodeStream: Writable,\n): globalThis.WritableStream<Uint8Array> {\n return new WritableStream<Uint8Array>({\n write(chunk) {\n return new Promise((resolve, reject) => {\n const ok = nodeStream.write(Buffer.from(chunk), (err) => {\n if (err) reject(err);\n });\n if (ok) {\n resolve();\n } else {\n nodeStream.once(\"drain\", resolve);\n }\n });\n },\n close() {\n return new Promise((resolve) => {\n nodeStream.end(resolve);\n });\n },\n abort(reason) {\n nodeStream.destroy(\n reason instanceof Error ? reason : new Error(String(reason)),\n );\n },\n }) as globalThis.WritableStream<Uint8Array>;\n}\n","import { randomUUID } from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport {\n type ModelInfo as AcpModelInfo,\n type AgentSideConnection,\n type ClientCapabilities,\n type ForkSessionRequest,\n type ForkSessionResponse,\n type InitializeRequest,\n type InitializeResponse,\n type ListSessionsRequest,\n type ListSessionsResponse,\n type LoadSessionRequest,\n type LoadSessionResponse,\n type NewSessionRequest,\n type NewSessionResponse,\n type PromptRequest,\n type PromptResponse,\n RequestError,\n type ResumeSessionRequest,\n type ResumeSessionResponse,\n type SessionConfigOption,\n type SessionConfigOptionCategory,\n type SessionConfigSelectOption,\n type SessionModelState,\n type SessionModeState,\n type SetSessionConfigOptionRequest,\n type SetSessionConfigOptionResponse,\n type SetSessionModelRequest,\n type SetSessionModelResponse,\n type SetSessionModeRequest,\n type SetSessionModeResponse,\n type Usage,\n} from \"@agentclientprotocol/sdk\";\nimport {\n type CanUseTool,\n getSessionMessages,\n listSessions,\n type McpServerConfig,\n type Options,\n type Query,\n query,\n type SDKUserMessage,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport { v7 as uuidv7 } from \"uuid\";\nimport packageJson from \"../../../package.json\" with { type: \"json\" };\nimport {\n isMethod,\n POSTHOG_METHODS,\n POSTHOG_NOTIFICATIONS,\n} from \"../../acp-extensions\";\nimport {\n createEnrichment,\n type Enrichment,\n type FileEnrichmentDeps,\n} from \"../../enrichment/file-enricher\";\nimport type { PostHogAPIConfig } from \"../../types\";\nimport { unreachable, withTimeout } from \"../../utils/common\";\nimport { Logger } from \"../../utils/logger\";\nimport { Pushable } from \"../../utils/streams\";\nimport { BaseAcpAgent } from \"../base-acp-agent\";\nimport { promptToClaude } from \"./conversion/acp-to-sdk\";\nimport {\n handleResultMessage,\n handleStreamEvent,\n handleSystemMessage,\n handleUserAssistantMessage,\n} from \"./conversion/sdk-to-acp\";\nimport type { EnrichedReadCache } from \"./hooks\";\nimport {\n fetchMcpToolMetadata,\n getConnectedMcpServerNames,\n} from \"./mcp/tool-metadata\";\nimport { canUseTool } from \"./permissions/permission-handlers\";\nimport { getAvailableSlashCommands } from \"./session/commands\";\nimport { parseMcpServers } from \"./session/mcp-config\";\nimport {\n DEFAULT_MODEL,\n getEffortOptions,\n resolveModelPreference,\n supports1MContext,\n supportsMcpInjection,\n toSdkModelId,\n} from \"./session/models\";\nimport {\n buildSessionOptions,\n buildSystemPrompt,\n type ProcessSpawnedInfo,\n} from \"./session/options\";\nimport { SettingsManager } from \"./session/settings\";\nimport {\n CODE_EXECUTION_MODES,\n type CodeExecutionMode,\n getAvailableModes,\n} from \"./tools\";\nimport type {\n BackgroundTerminal,\n EffortLevel,\n NewSessionMeta,\n SDKMessageFilter,\n Session,\n ToolUseCache,\n} from \"./types\";\n\nconst SESSION_VALIDATION_TIMEOUT_MS = 30_000;\nconst MAX_TITLE_LENGTH = 256;\nconst LOCAL_ONLY_COMMANDS = new Set([\"/context\", \"/heapdump\", \"/extra-usage\"]);\n\nfunction sanitizeTitle(text: string): string {\n const sanitized = text\n .replace(/[\\r\\n]+/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n if (sanitized.length <= MAX_TITLE_LENGTH) {\n return sanitized;\n }\n return `${sanitized.slice(0, MAX_TITLE_LENGTH - 1)}…`;\n}\n\nfunction shouldEmitRawMessage(\n config: boolean | SDKMessageFilter[],\n message: { type: string; subtype?: string },\n): boolean {\n if (config === true) return true;\n if (config === false) return false;\n return config.some(\n (f) =>\n f.type === message.type &&\n (f.subtype === undefined || f.subtype === message.subtype),\n );\n}\n\nexport interface ClaudeAcpAgentOptions {\n onProcessSpawned?: (info: ProcessSpawnedInfo) => void;\n onProcessExited?: (pid: number) => void;\n onMcpServersReady?: (serverNames: string[]) => void;\n onStructuredOutput?: (output: Record<string, unknown>) => Promise<void>;\n posthogApiConfig?: PostHogAPIConfig;\n}\n\nexport class ClaudeAcpAgent extends BaseAcpAgent {\n readonly adapterName = \"claude\";\n declare session: Session;\n toolUseCache: ToolUseCache;\n backgroundTerminals: { [key: string]: BackgroundTerminal } = {};\n clientCapabilities?: ClientCapabilities;\n private options?: ClaudeAcpAgentOptions;\n private enrichment?: Enrichment;\n private enrichedReadCache: EnrichedReadCache = new Map();\n\n constructor(client: AgentSideConnection, options?: ClaudeAcpAgentOptions) {\n super(client);\n this.options = options;\n this.toolUseCache = {};\n this.logger = new Logger({ debug: true, prefix: \"[ClaudeAcpAgent]\" });\n this.enrichment = createEnrichment(options?.posthogApiConfig, this.logger);\n }\n\n protected getEnrichmentDeps(): FileEnrichmentDeps | undefined {\n return this.enrichment?.deps;\n }\n\n override async closeSession(): Promise<void> {\n try {\n await super.closeSession();\n } finally {\n this.enrichment?.dispose();\n this.enrichment = undefined;\n this.enrichedReadCache.clear();\n }\n }\n\n async initialize(request: InitializeRequest): Promise<InitializeResponse> {\n this.clientCapabilities = request.clientCapabilities;\n\n return {\n protocolVersion: 1,\n agentCapabilities: {\n promptCapabilities: {\n image: true,\n embeddedContext: true,\n },\n mcpCapabilities: {\n http: true,\n sse: true,\n },\n loadSession: true,\n sessionCapabilities: {\n list: {},\n fork: {},\n resume: {},\n },\n _meta: {\n posthog: {\n resumeSession: true,\n },\n claudeCode: {\n promptQueueing: true,\n },\n },\n },\n agentInfo: {\n name: packageJson.name,\n title: \"Claude Agent\",\n version: packageJson.version,\n },\n authMethods: [],\n };\n }\n\n async newSession(params: NewSessionRequest): Promise<NewSessionResponse> {\n // Upstream Claude Code renames .claude.json to .claude.json.backup on logout.\n // If the backup exists but the original doesn't, the user is logged out.\n if (\n fs.existsSync(path.resolve(os.homedir(), \".claude.json.backup\")) &&\n !fs.existsSync(path.resolve(os.homedir(), \".claude.json\"))\n ) {\n throw RequestError.authRequired();\n }\n\n const response = await this.createSession(params, {\n // Revisit these meta values once we support resume\n resume: (params._meta as NewSessionMeta | undefined)?.claudeCode?.options\n ?.resume as string | undefined,\n });\n\n return response;\n }\n\n async unstable_forkSession(\n params: ForkSessionRequest,\n ): Promise<ForkSessionResponse> {\n return this.createSession(\n {\n cwd: params.cwd,\n mcpServers: params.mcpServers ?? [],\n _meta: params._meta,\n },\n { resume: params.sessionId, forkSession: true },\n );\n }\n\n async unstable_resumeSession(\n params: ResumeSessionRequest,\n ): Promise<ResumeSessionResponse> {\n // Reuse existing session if it matches\n const existing = this.getExistingSessionState(params.sessionId);\n if (existing) return existing;\n\n const response = await this.createSession(\n {\n cwd: params.cwd,\n mcpServers: params.mcpServers ?? [],\n _meta: params._meta,\n },\n {\n resume: params.sessionId,\n },\n );\n\n return response;\n }\n\n async loadSession(params: LoadSessionRequest): Promise<LoadSessionResponse> {\n // Reuse existing session if it matches\n const existing = this.getExistingSessionState(params.sessionId);\n if (existing) return existing;\n\n const response = await this.createSession(\n {\n cwd: params.cwd,\n mcpServers: params.mcpServers ?? [],\n _meta: params._meta,\n },\n { resume: params.sessionId, skipBackgroundFetches: true },\n );\n\n await this.replaySessionHistory(params.sessionId);\n\n // Send available commands after replay so they don't interleave with history\n this.deferBackgroundFetches(this.session.query);\n\n return {\n modes: response.modes,\n models: response.models,\n configOptions: response.configOptions,\n };\n }\n\n async listSessions(\n params: ListSessionsRequest,\n ): Promise<ListSessionsResponse> {\n const sdkSessions = await listSessions({ dir: params.cwd ?? undefined });\n const sessions = [];\n\n for (const session of sdkSessions) {\n if (!session.cwd) continue;\n sessions.push({\n sessionId: session.sessionId,\n cwd: session.cwd,\n title: sanitizeTitle(session.customTitle || session.summary || \"\"),\n updatedAt: new Date(session.lastModified).toISOString(),\n });\n }\n return {\n sessions,\n };\n }\n\n async unstable_listSessions(\n params: ListSessionsRequest,\n ): Promise<ListSessionsResponse> {\n return this.listSessions(params);\n }\n\n async prompt(params: PromptRequest): Promise<PromptResponse> {\n this.session.cancelled = false;\n this.session.interruptReason = undefined;\n this.session.accumulatedUsage = {\n inputTokens: 0,\n outputTokens: 0,\n cachedReadTokens: 0,\n cachedWriteTokens: 0,\n };\n\n const userMessage = promptToClaude(params);\n const promptUuid = randomUUID();\n userMessage.uuid = promptUuid;\n let promptReplayed = false;\n let isLocalOnlyCommand = false;\n\n // Detect local-only slash commands that return results without model invocation\n const msgContent = userMessage.message.content;\n let firstTextPart = \"\";\n if (typeof msgContent === \"string\") {\n firstTextPart = msgContent;\n } else if (Array.isArray(msgContent)) {\n for (const block of msgContent) {\n if (\"type\" in block && block.type === \"text\" && \"text\" in block) {\n firstTextPart = block.text as string;\n break;\n }\n }\n }\n const commandMatch = firstTextPart.match(/^(\\/\\S+)/);\n if (commandMatch && LOCAL_ONLY_COMMANDS.has(commandMatch[1])) {\n isLocalOnlyCommand = true;\n promptReplayed = true;\n }\n\n if (this.session.promptRunning) {\n this.session.input.push(userMessage);\n const order = this.session.nextPendingOrder++;\n const cancelled = await new Promise<boolean>((resolve) => {\n this.session.pendingMessages.set(promptUuid, { resolve, order });\n });\n if (cancelled) {\n return { stopReason: \"cancelled\" };\n }\n promptReplayed = true;\n } else {\n this.session.input.push(userMessage);\n }\n\n // Broadcast user message to client\n await this.broadcastUserMessage(params);\n\n this.session.promptRunning = true;\n let handedOff = false;\n let lastAssistantTotalUsage: number | null = null;\n let lastStreamUsage = {\n input_tokens: 0,\n output_tokens: 0,\n cache_read_input_tokens: 0,\n cache_creation_input_tokens: 0,\n };\n if (this.session.lastContextWindowSize == null) {\n this.session.lastContextWindowSize = this.getContextWindowForModel(\n this.session.modelId ?? \"\",\n );\n this.logger.debug(\"Initial context window size from gateway\", {\n modelId: this.session.modelId,\n contextWindowSize: this.session.lastContextWindowSize,\n });\n }\n let lastContextWindowSize = this.session.lastContextWindowSize;\n\n const supportsTerminalOutput =\n (\n this.clientCapabilities?._meta as\n | ClientCapabilities[\"_meta\"]\n | undefined\n )?.terminal_output === true;\n\n const context = {\n session: this.session,\n sessionId: params.sessionId,\n client: this.client,\n toolUseCache: this.toolUseCache,\n fileContentCache: this.fileContentCache,\n enrichedReadCache: this.enrichedReadCache,\n logger: this.logger,\n supportsTerminalOutput,\n };\n\n try {\n while (true) {\n const { value: message, done } = await this.session.query.next();\n\n if (done || !message) {\n if (this.session.cancelled) {\n return {\n stopReason: \"cancelled\",\n _meta: this.session.interruptReason\n ? { interruptReason: this.session.interruptReason }\n : undefined,\n };\n }\n break;\n }\n\n if (\n this.session.emitRawSDKMessages &&\n shouldEmitRawMessage(this.session.emitRawSDKMessages, message)\n ) {\n await this.client.extNotification(\"_claude/sdkMessage\", {\n sessionId: params.sessionId,\n message: message as Record<string, unknown>,\n });\n }\n\n switch (message.type) {\n case \"system\":\n if (message.subtype === \"compact_boundary\") {\n // Send used:0 immediately so the client doesn't keep showing\n // the stale pre-compaction context size until the next turn.\n lastAssistantTotalUsage = 0;\n promptReplayed = true;\n await this.client.sessionUpdate({\n sessionId: params.sessionId,\n update: {\n sessionUpdate: \"usage_update\",\n used: 0,\n size: lastContextWindowSize,\n },\n });\n }\n if (message.subtype === \"local_command_output\") {\n promptReplayed = true;\n }\n if (\n message.subtype === \"session_state_changed\" &&\n (message as Record<string, unknown>).state === \"idle\"\n ) {\n if (!promptReplayed) {\n this.logger.debug(\"Skipping idle state before prompt replay\", {\n sessionId: params.sessionId,\n });\n break;\n }\n\n const acc = this.session.accumulatedUsage;\n const totalUsed =\n acc.inputTokens +\n acc.outputTokens +\n acc.cachedReadTokens +\n acc.cachedWriteTokens;\n\n await this.client.sessionUpdate({\n sessionId: params.sessionId,\n update: {\n sessionUpdate: \"usage_update\",\n used: totalUsed,\n size: lastContextWindowSize,\n },\n });\n\n return { stopReason: \"end_turn\" };\n }\n await handleSystemMessage(message, context);\n break;\n\n case \"result\": {\n // Skip results from background tasks that finished after our prompt started\n if (!promptReplayed) {\n this.logger.debug(\n \"Skipping background task result before prompt replay\",\n { sessionId: params.sessionId },\n );\n break;\n }\n\n if (this.session.cancelled) {\n return { stopReason: \"cancelled\" };\n }\n\n // Accumulate usage from this result (guard against null from SDK)\n this.session.accumulatedUsage.inputTokens +=\n message.usage.input_tokens ?? 0;\n this.session.accumulatedUsage.outputTokens +=\n message.usage.output_tokens ?? 0;\n this.session.accumulatedUsage.cachedReadTokens +=\n message.usage.cache_read_input_tokens ?? 0;\n this.session.accumulatedUsage.cachedWriteTokens +=\n message.usage.cache_creation_input_tokens ?? 0;\n\n // SDK can underreport context window (e.g. 200k for 1M models).\n // Use SDK value only if it's larger than what gateway reported.\n const contextWindows = Object.values(message.modelUsage).map(\n (m) => m.contextWindow,\n );\n if (contextWindows.length > 0) {\n const sdkContextWindow = Math.min(...contextWindows);\n if (sdkContextWindow > lastContextWindowSize) {\n lastContextWindowSize = sdkContextWindow;\n }\n }\n this.session.lastContextWindowSize = lastContextWindowSize;\n\n this.session.contextSize = lastContextWindowSize;\n if (lastAssistantTotalUsage !== null) {\n this.session.contextUsed = lastAssistantTotalUsage;\n }\n\n // Send usage_update notification\n if (lastAssistantTotalUsage !== null) {\n await this.client.sessionUpdate({\n sessionId: params.sessionId,\n update: {\n sessionUpdate: \"usage_update\",\n used: lastAssistantTotalUsage,\n size: lastContextWindowSize,\n cost: {\n amount: message.total_cost_usd,\n currency: \"USD\",\n },\n },\n });\n }\n\n await this.client.extNotification(\n POSTHOG_NOTIFICATIONS.USAGE_UPDATE,\n {\n sessionId: params.sessionId,\n used: {\n inputTokens: message.usage.input_tokens,\n outputTokens: message.usage.output_tokens,\n cachedReadTokens: message.usage.cache_read_input_tokens,\n cachedWriteTokens: message.usage.cache_creation_input_tokens,\n },\n cost: message.total_cost_usd,\n },\n );\n\n const usage: Usage = {\n inputTokens: this.session.accumulatedUsage.inputTokens,\n outputTokens: this.session.accumulatedUsage.outputTokens,\n cachedReadTokens: this.session.accumulatedUsage.cachedReadTokens,\n cachedWriteTokens:\n this.session.accumulatedUsage.cachedWriteTokens,\n totalTokens:\n this.session.accumulatedUsage.inputTokens +\n this.session.accumulatedUsage.outputTokens +\n this.session.accumulatedUsage.cachedReadTokens +\n this.session.accumulatedUsage.cachedWriteTokens,\n };\n\n const result = handleResultMessage(message);\n if (result.error) throw result.error;\n\n // Deliver structured output from SDK's native outputFormat\n if (\n message.subtype === \"success\" &&\n message.structured_output != null &&\n this.options?.onStructuredOutput\n ) {\n await this.options.onStructuredOutput(\n message.structured_output as Record<string, unknown>,\n );\n }\n\n // For local-only commands, forward the result text to the client\n if (\n isLocalOnlyCommand &&\n message.subtype === \"success\" &&\n message.result\n ) {\n await this.client.sessionUpdate({\n sessionId: params.sessionId,\n update: {\n sessionUpdate: \"agent_message_chunk\",\n content: { type: \"text\", text: message.result },\n },\n });\n }\n\n return { stopReason: result.stopReason ?? \"end_turn\", usage };\n }\n\n case \"stream_event\": {\n if (\n message.parent_tool_use_id === null &&\n (message.event.type === \"message_start\" ||\n message.event.type === \"message_delta\")\n ) {\n if (message.event.type === \"message_start\") {\n const u = message.event.message.usage;\n lastStreamUsage = {\n input_tokens: u.input_tokens ?? 0,\n output_tokens: u.output_tokens ?? 0,\n cache_read_input_tokens: u.cache_read_input_tokens ?? 0,\n cache_creation_input_tokens:\n u.cache_creation_input_tokens ?? 0,\n };\n } else {\n const u = message.event.usage;\n lastStreamUsage = {\n input_tokens: u.input_tokens ?? lastStreamUsage.input_tokens,\n output_tokens: u.output_tokens,\n cache_read_input_tokens:\n u.cache_read_input_tokens ??\n lastStreamUsage.cache_read_input_tokens,\n cache_creation_input_tokens:\n u.cache_creation_input_tokens ??\n lastStreamUsage.cache_creation_input_tokens,\n };\n }\n\n const nextTotal =\n lastStreamUsage.input_tokens +\n lastStreamUsage.output_tokens +\n lastStreamUsage.cache_read_input_tokens +\n lastStreamUsage.cache_creation_input_tokens;\n\n if (nextTotal !== lastAssistantTotalUsage) {\n lastAssistantTotalUsage = nextTotal;\n await this.client.sessionUpdate({\n sessionId: params.sessionId,\n update: {\n sessionUpdate: \"usage_update\",\n used: nextTotal,\n size: lastContextWindowSize,\n },\n });\n }\n }\n await handleStreamEvent(message, context);\n break;\n }\n\n case \"user\":\n case \"assistant\": {\n if (this.session.cancelled) {\n break;\n }\n\n // Check for prompt replay (our own message echoed back)\n if (message.type === \"user\" && \"uuid\" in message && message.uuid) {\n if (message.uuid === promptUuid) {\n promptReplayed = true;\n break;\n }\n\n const pending = this.session.pendingMessages.get(\n message.uuid as string,\n );\n if (pending) {\n pending.resolve(false);\n this.session.pendingMessages.delete(message.uuid as string);\n handedOff = true;\n // the current loop stops with end_turn,\n // the loop of the next prompt continues running\n return { stopReason: \"end_turn\" };\n }\n }\n\n // Skip replayed user messages that aren't pending prompts\n if (\n \"isReplay\" in message &&\n (message as Record<string, unknown>).isReplay\n ) {\n break;\n }\n\n // Store latest assistant usage (excluding subagents)\n // Sum all token types as a proxy for post-turn context occupancy:\n // current turn's output will become next turn's input.\n // Note: per the Anthropic API, input_tokens excludes cache tokens —\n // cache_read and cache_creation are reported separately, so summing\n // all four fields is not double-counting.\n if (\n \"usage\" in message.message &&\n message.parent_tool_use_id === null\n ) {\n const usage = (\n message.message as unknown as Record<string, unknown>\n ).usage as {\n input_tokens: number | null;\n output_tokens: number | null;\n cache_read_input_tokens: number | null;\n cache_creation_input_tokens: number | null;\n };\n lastAssistantTotalUsage =\n (usage.input_tokens ?? 0) +\n (usage.output_tokens ?? 0) +\n (usage.cache_read_input_tokens ?? 0) +\n (usage.cache_creation_input_tokens ?? 0);\n\n await this.client.sessionUpdate({\n sessionId: params.sessionId,\n update: {\n sessionUpdate: \"usage_update\",\n used: lastAssistantTotalUsage,\n size: lastContextWindowSize,\n cost: null,\n },\n });\n }\n\n const result = await handleUserAssistantMessage(message, context);\n if (result.error) throw result.error;\n if (result.shouldStop) {\n return { stopReason: \"end_turn\" };\n }\n break;\n }\n\n case \"tool_progress\":\n case \"auth_status\":\n case \"tool_use_summary\":\n case \"prompt_suggestion\":\n case \"rate_limit_event\":\n break;\n\n default:\n unreachable(message as never, this.logger);\n break;\n }\n }\n throw new Error(\"Session did not end in result\");\n } catch (error) {\n if (error instanceof RequestError || !(error instanceof Error)) {\n throw error;\n }\n const msg = error.message;\n if (\n msg.includes(\"ProcessTransport\") ||\n msg.includes(\"terminated process\") ||\n msg.includes(\"process exited with\") ||\n msg.includes(\"process terminated by signal\") ||\n msg.includes(\"Failed to write to process stdin\")\n ) {\n this.logger.error(`Process died: ${msg}`, {\n sessionId: this.sessionId,\n });\n this.session.settingsManager.dispose();\n this.session.input.end();\n throw RequestError.internalError(\n undefined,\n \"The Claude Agent process exited unexpectedly. Please start a new session.\",\n );\n }\n throw error;\n } finally {\n if (!handedOff) {\n this.session.promptRunning = false;\n // Resolve all remaining pending prompts so no callers get stuck.\n for (const [key, pending] of this.session.pendingMessages) {\n pending.resolve(true);\n this.session.pendingMessages.delete(key);\n }\n }\n }\n }\n\n // Called by BaseAcpAgent#cancel() to interrupt the session\n protected async interrupt(): Promise<void> {\n this.session.cancelled = true;\n for (const [, pending] of this.session.pendingMessages) {\n pending.resolve(true);\n }\n this.session.pendingMessages.clear();\n await this.session.query.interrupt();\n }\n\n /**\n * Refresh the session between turns. Currently the only refreshable field\n * is `mcpServers` — a resume-with-new-options reinit that bakes the servers\n * into query() options (preserving conversation history via resume).\n *\n * This is an `extMethod` (request/response), not `extNotification`, so the\n * caller can await completion before sending the next prompt. The sandbox\n * agent-server uses this on pre-prompt TTL checks.\n *\n * Why resume+rebuild instead of query.setMcpServers()?\n * setMcpServers() does NOT always overwrite servers installed by local/plugin\n * config — it can non-deterministically surface either the config-provided\n * server or the plugin-installed one. In the sandbox, repos may have Claude\n * plugins with their own MCPs, and we want the CLI-supplied set to fully win.\n * Passing mcpServers via query() options (as a \"managed\"/static set) has that\n * overwrite guarantee, so we tear down the current Query and construct a new\n * one with resume.\n *\n * Caller contract: only call REFRESH_SESSION between turns (no prompt in flight).\n */\n async extMethod(\n method: string,\n params: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n if (!isMethod(method, POSTHOG_METHODS.REFRESH_SESSION)) {\n throw RequestError.methodNotFound(method);\n }\n\n // Trust boundary: refresh is only safe when the caller is trusted infra\n // (e.g. the sandbox agent-server). Do not route this method from\n // untrusted clients — parseMcpServers does no URL/command validation.\n if (params.mcpServers === undefined) {\n throw new RequestError(\n -32602,\n \"refresh_session requires at least one refreshable field (e.g. mcpServers)\",\n );\n }\n if (!Array.isArray(params.mcpServers)) {\n throw new RequestError(\n -32602,\n \"refresh_session: mcpServers must be an array\",\n );\n }\n\n const mcpServers = parseMcpServers(\n params as Pick<NewSessionRequest, \"mcpServers\">,\n );\n await this.refreshSession(mcpServers);\n return { refreshed: true };\n }\n\n private async refreshSession(\n mcpServers: Record<string, McpServerConfig>,\n ): Promise<void> {\n const prev = this.session;\n if (prev.promptRunning) {\n throw new RequestError(\n -32002,\n \"Cannot refresh session while a prompt turn is in flight\",\n );\n }\n if (prev.modelId && !supportsMcpInjection(prev.modelId)) {\n throw new RequestError(\n -32002,\n `Model ${prev.modelId} does not support MCP injection; cannot refresh`,\n );\n }\n\n this.logger.info(\"Refreshing session with fresh MCP servers\", {\n serverCount: Object.keys(mcpServers).length,\n sessionId: this.sessionId,\n });\n\n // Abort FIRST so any stuck in-flight HTTP request unblocks — otherwise\n // interrupt() can deadlock waiting on an API call that never returns.\n // We allocate a fresh controller for the new Query below so aborting\n // the old one doesn't poison it.\n prev.abortController.abort();\n await prev.query.interrupt();\n prev.input.end();\n\n // Reuse every option from the running session; swap mcpServers, re-root\n // identity on `resume` instead of `sessionId`, and give the new Query a\n // fresh AbortController.\n const newAbortController = new AbortController();\n const { sessionId: _drop, ...rest } = prev.queryOptions;\n const newOptions: Options = {\n ...rest,\n mcpServers,\n resume: this.sessionId,\n forkSession: false,\n abortController: newAbortController,\n };\n\n const newInput = new Pushable<SDKUserMessage>();\n const newQuery = query({ prompt: newInput, options: newOptions });\n\n prev.query = newQuery;\n prev.input = newInput;\n prev.queryOptions = newOptions;\n prev.abortController = newAbortController;\n\n const result = await withTimeout(\n newQuery.initializationResult(),\n SESSION_VALIDATION_TIMEOUT_MS,\n );\n if (result.result === \"timeout\") {\n throw new Error(`Session refresh timed out for ${this.sessionId}`);\n }\n\n // Re-fetch MCP tool metadata + slash commands — the server list changed.\n this.deferBackgroundFetches(newQuery);\n }\n\n async unstable_setSessionModel(\n params: SetSessionModelRequest,\n ): Promise<SetSessionModelResponse | undefined> {\n await this.session.query.setModel(toSdkModelId(params.modelId));\n this.session.modelId = params.modelId;\n this.session.lastContextWindowSize = this.getContextWindowForModel(\n params.modelId,\n );\n this.rebuildEffortConfigOption(params.modelId);\n await this.updateConfigOption(\"model\", params.modelId);\n return {};\n }\n\n async setSessionMode(\n params: SetSessionModeRequest,\n ): Promise<SetSessionModeResponse> {\n await this.applySessionMode(params.modeId);\n await this.updateConfigOption(\"mode\", params.modeId);\n return {};\n }\n\n async setSessionConfigOption(\n params: SetSessionConfigOptionRequest,\n ): Promise<SetSessionConfigOptionResponse> {\n const option = this.session.configOptions.find(\n (o) => o.id === params.configId,\n );\n if (!option) {\n throw new Error(`Unknown config option: ${params.configId}`);\n }\n\n if (typeof params.value !== \"string\") {\n throw new Error(\n `Invalid value type for config option ${params.configId}`,\n );\n }\n\n const allValues: { value: string; name?: string; description?: string }[] =\n \"options\" in option && Array.isArray(option.options)\n ? (option.options as Array<Record<string, unknown>>).flatMap((o) =>\n \"options\" in o && Array.isArray(o.options)\n ? (o.options as {\n value: string;\n name?: string;\n description?: string;\n }[])\n : [o as { value: string; name?: string; description?: string }],\n )\n : [];\n let validValue = allValues.find((o) => o.value === params.value);\n\n // For model options, fall back to alias resolution when exact match fails.\n // This lets callers use human-friendly aliases like \"opus\" or \"sonnet\"\n // instead of full model IDs like \"claude-opus-4-6\".\n if (!validValue && params.configId === \"model\") {\n const resolved = resolveModelPreference(params.value, allValues);\n if (resolved) {\n validValue = allValues.find((o) => o.value === resolved);\n }\n }\n\n if (!validValue) {\n throw new Error(\n `Invalid value for config option ${params.configId}: ${params.value}`,\n );\n }\n\n // Use the canonical option value so downstream code always receives the\n // model ID rather than the caller-supplied alias.\n const resolvedValue = validValue.value;\n\n if (params.configId === \"mode\") {\n await this.applySessionMode(resolvedValue);\n await this.client.sessionUpdate({\n sessionId: this.sessionId,\n update: {\n sessionUpdate: \"current_mode_update\",\n currentModeId: resolvedValue,\n },\n });\n } else if (params.configId === \"model\") {\n const sdkModelId = toSdkModelId(resolvedValue);\n await this.session.query.setModel(sdkModelId);\n this.session.modelId = resolvedValue;\n this.session.lastContextWindowSize =\n this.getContextWindowForModel(resolvedValue);\n this.rebuildEffortConfigOption(resolvedValue);\n } else if (params.configId === \"effort\") {\n const newEffort = resolvedValue as EffortLevel;\n this.session.effort = newEffort;\n this.session.queryOptions.effort = newEffort;\n await this.session.query.applyFlagSettings({\n // @ts-expect-error SDK Settings.effortLevel omits \"max\" but runtime accepts it\n effortLevel: newEffort,\n });\n }\n\n this.session.configOptions = this.session.configOptions.map((o) =>\n o.id === params.configId && typeof o.currentValue === \"string\"\n ? { ...o, currentValue: resolvedValue }\n : o,\n );\n\n return { configOptions: this.session.configOptions };\n }\n\n private async updateConfigOption(\n configId: string,\n value: string,\n ): Promise<void> {\n this.session.configOptions = this.session.configOptions.map((o) =>\n o.id === configId && typeof o.currentValue === \"string\"\n ? { ...o, currentValue: value }\n : o,\n );\n\n await this.client.sessionUpdate({\n sessionId: this.sessionId,\n update: {\n sessionUpdate: \"config_option_update\",\n configOptions: this.session.configOptions,\n },\n });\n }\n\n private async applySessionMode(modeId: string): Promise<void> {\n if (!CODE_EXECUTION_MODES.includes(modeId as CodeExecutionMode)) {\n throw new Error(\"Invalid Mode\");\n }\n const previousMode = this.session.permissionMode;\n this.session.permissionMode = modeId as CodeExecutionMode;\n try {\n await this.session.query.setPermissionMode(modeId as CodeExecutionMode);\n } catch (error) {\n this.session.permissionMode = previousMode;\n if (error instanceof Error) {\n if (!error.message) {\n error.message = \"Invalid Mode\";\n }\n throw error;\n }\n throw new Error(\"Invalid Mode\");\n }\n }\n\n private async createSession(\n params: {\n cwd: string;\n mcpServers: NewSessionRequest[\"mcpServers\"];\n _meta?: unknown;\n },\n creationOpts: {\n resume?: string;\n forkSession?: boolean;\n skipBackgroundFetches?: boolean;\n } = {},\n ): Promise<NewSessionResponse> {\n const { cwd } = params;\n const { resume, forkSession } = creationOpts;\n\n const isResume = !!resume;\n\n const meta = params._meta as NewSessionMeta | undefined;\n const taskId = meta?.persistence?.taskId;\n const effort = meta?.claudeCode?.options?.effort as EffortLevel | undefined;\n\n // We want to create a new session id unless it is resume,\n // but not resume + forkSession.\n let sessionId: string;\n if (forkSession) {\n sessionId = uuidv7();\n } else if (isResume) {\n sessionId = resume;\n } else {\n sessionId = uuidv7();\n }\n\n const input = new Pushable<SDKUserMessage>();\n\n const settingsManager = new SettingsManager(cwd);\n await settingsManager.initialize();\n\n const earlyModelId =\n settingsManager.getSettings().model || meta?.model || \"\";\n const mcpServers = supportsMcpInjection(earlyModelId)\n ? parseMcpServers(params)\n : {};\n const systemPrompt = buildSystemPrompt(meta?.systemPrompt);\n\n // Configure structured output via SDK's native outputFormat\n const outputFormat =\n meta?.jsonSchema && this.options?.onStructuredOutput\n ? { type: \"json_schema\" as const, schema: meta.jsonSchema }\n : undefined;\n\n this.logger.debug(isResume ? \"Resuming session\" : \"Creating new session\", {\n sessionId,\n taskId,\n taskRunId: meta?.taskRunId,\n cwd,\n });\n\n const permissionMode: CodeExecutionMode =\n meta?.permissionMode &&\n CODE_EXECUTION_MODES.includes(meta.permissionMode as CodeExecutionMode)\n ? (meta.permissionMode as CodeExecutionMode)\n : \"default\";\n\n const options = buildSessionOptions({\n cwd,\n mcpServers,\n permissionMode,\n canUseTool: this.createCanUseTool(sessionId, meta?.allowedDomains),\n logger: this.logger,\n systemPrompt,\n userProvidedOptions: meta?.claudeCode?.options,\n sessionId,\n isResume,\n forkSession,\n additionalDirectories: [\n ...(meta?.claudeCode?.options?.additionalDirectories ?? []),\n ...(meta?.additionalRoots ?? []),\n ],\n disableBuiltInTools: meta?.disableBuiltInTools,\n outputFormat,\n settingsManager,\n onModeChange: this.createOnModeChange(),\n onProcessSpawned: this.options?.onProcessSpawned,\n onProcessExited: this.options?.onProcessExited,\n effort,\n enrichmentDeps: this.enrichment?.deps,\n enrichedReadCache: this.enrichedReadCache,\n });\n\n // Use the same abort controller that buildSessionOptions gave to the query\n const abortController = options.abortController as AbortController;\n\n const q = query({ prompt: input, options });\n\n const session: Session = {\n query: q,\n queryOptions: options,\n input,\n cancelled: false,\n settingsManager,\n permissionMode,\n abortController,\n accumulatedUsage: {\n inputTokens: 0,\n outputTokens: 0,\n cachedReadTokens: 0,\n cachedWriteTokens: 0,\n },\n effort,\n configOptions: [],\n promptRunning: false,\n pendingMessages: new Map(),\n nextPendingOrder: 0,\n emitRawSDKMessages: meta?.claudeCode?.emitRawSDKMessages ?? false,\n\n // Custom properties\n cwd,\n notificationHistory: [],\n taskRunId: meta?.taskRunId,\n };\n this.session = session;\n this.sessionId = sessionId;\n\n if (isResume) {\n // Resume must block on initialization to validate the session is still alive.\n // For stale sessions this throws (e.g. \"No conversation found\").\n try {\n const result = await withTimeout(\n q.initializationResult(),\n SESSION_VALIDATION_TIMEOUT_MS,\n );\n if (result.result === \"timeout\") {\n throw new Error(\n `Session ${forkSession ? \"fork\" : \"resumption\"} timed out for sessionId=${sessionId}`,\n );\n }\n } catch (err) {\n settingsManager.dispose();\n if (\n err instanceof Error &&\n err.message === \"Query closed before response received\"\n ) {\n throw RequestError.resourceNotFound(sessionId);\n }\n this.logger.error(\n forkSession ? \"Session fork failed\" : \"Session resumption failed\",\n {\n sessionId,\n taskId,\n taskRunId: meta?.taskRunId,\n error: err instanceof Error ? err.message : String(err),\n },\n );\n throw err;\n }\n }\n\n // Kick off SDK initialization for new sessions so it runs concurrently\n // with the model config fetch below (the gateway REST call is independent).\n const initPromise = !isResume\n ? withTimeout(q.initializationResult(), SESSION_VALIDATION_TIMEOUT_MS)\n : undefined;\n\n const [modelOptions] = await Promise.all([\n this.getModelConfigOptions(\n settingsManager.getSettings().model || meta?.model || undefined,\n ),\n ...(meta?.taskRunId\n ? [\n this.client.extNotification(POSTHOG_NOTIFICATIONS.SDK_SESSION, {\n taskRunId: meta.taskRunId,\n sessionId,\n adapter: \"claude\",\n }),\n ]\n : []),\n ]);\n\n if (initPromise) {\n try {\n const initResult = await initPromise;\n if (initResult.result === \"timeout\") {\n settingsManager.dispose();\n throw new Error(\n `Session initialization timed out for sessionId=${sessionId}`,\n );\n }\n } catch (err) {\n settingsManager.dispose();\n this.logger.error(\"Session initialization failed\", {\n sessionId,\n taskId,\n taskRunId: meta?.taskRunId,\n error: err instanceof Error ? err.message : String(err),\n });\n throw err;\n }\n }\n\n const settingsModel = settingsManager.getSettings().model;\n const metaModel = meta?.model;\n const resolvedModelId =\n settingsModel || metaModel || modelOptions.currentModelId;\n session.modelId = resolvedModelId;\n session.lastContextWindowSize =\n this.getContextWindowForModel(resolvedModelId);\n\n const resolvedSdkModel = toSdkModelId(resolvedModelId);\n\n if (!isResume && resolvedSdkModel !== DEFAULT_MODEL) {\n await this.session.query.setModel(resolvedSdkModel);\n }\n\n if (supports1MContext(resolvedModelId)) {\n options.betas = [\"context-1m-2025-08-07\"];\n }\n\n const availableModes = getAvailableModes();\n const modes: SessionModeState = {\n currentModeId: permissionMode,\n availableModes: availableModes.map((mode) => ({\n id: mode.id,\n name: mode.name,\n description: mode.description ?? undefined,\n })),\n };\n\n const models: SessionModelState = {\n currentModelId: resolvedModelId,\n availableModels: modelOptions.options.map(\n (opt): AcpModelInfo => ({\n modelId: opt.value,\n name: opt.name,\n description: opt.description,\n }),\n ),\n };\n\n const configOptions = this.buildConfigOptions(\n permissionMode,\n modelOptions,\n effort ?? \"high\",\n );\n session.configOptions = configOptions;\n\n if (!creationOpts.skipBackgroundFetches) {\n this.deferBackgroundFetches(q);\n }\n\n return { sessionId, modes, models, configOptions };\n }\n\n private createCanUseTool(\n sessionId: string,\n allowedDomains?: string[],\n ): CanUseTool {\n return async (toolName, toolInput, { suggestions, toolUseID, signal }) =>\n canUseTool({\n session: this.session,\n toolName,\n toolInput: toolInput as Record<string, unknown>,\n toolUseID,\n suggestions,\n signal,\n client: this.client,\n sessionId,\n fileContentCache: this.fileContentCache,\n logger: this.logger,\n updateConfigOption: (configId: string, value: string) =>\n this.updateConfigOption(configId, value),\n allowedDomains,\n });\n }\n\n private createOnModeChange() {\n return async (newMode: CodeExecutionMode) => {\n if (this.session) {\n this.session.permissionMode = newMode;\n }\n await this.updateConfigOption(\"mode\", newMode);\n };\n }\n\n private getExistingSessionState(\n sessionId: string,\n ): NewSessionResponse | null {\n if (this.sessionId !== sessionId || !this.session) return null;\n\n const availableModes = getAvailableModes();\n const modes: SessionModeState = {\n currentModeId: this.session.permissionMode,\n availableModes: availableModes.map((mode) => ({\n id: mode.id,\n name: mode.name,\n description: mode.description ?? undefined,\n })),\n };\n\n const modelOptions = this.session.configOptions.find(\n (o) => o.id === \"model\",\n );\n const models: SessionModelState = {\n currentModelId: this.session.modelId ?? DEFAULT_MODEL,\n availableModels:\n modelOptions && \"options\" in modelOptions\n ? (\n modelOptions.options as Array<{\n value: string;\n name: string;\n description?: string;\n }>\n ).map((opt) => ({\n modelId: opt.value,\n name: opt.name,\n description: opt.description,\n }))\n : [],\n };\n\n return {\n sessionId,\n modes,\n models,\n configOptions: this.session.configOptions,\n };\n }\n\n private buildConfigOptions(\n currentModeId: string,\n modelOptions: {\n currentModelId: string;\n options: SessionConfigSelectOption[];\n },\n currentEffort: EffortLevel = \"high\",\n ): SessionConfigOption[] {\n const modeOptions = getAvailableModes().map((mode) => ({\n value: mode.id,\n name: mode.name,\n description: mode.description ?? undefined,\n }));\n\n const configOptions: SessionConfigOption[] = [\n {\n id: \"mode\",\n name: \"Approval Preset\",\n type: \"select\",\n currentValue: currentModeId,\n options: modeOptions,\n category: \"mode\" as SessionConfigOptionCategory,\n description:\n \"Choose an approval and sandboxing preset for your session\",\n },\n {\n id: \"model\",\n name: \"Model\",\n type: \"select\",\n currentValue: modelOptions.currentModelId,\n options: modelOptions.options,\n category: \"model\" as SessionConfigOptionCategory,\n description: \"Choose which model Claude should use\",\n },\n ];\n\n const effortOptions = getEffortOptions(modelOptions.currentModelId);\n if (effortOptions) {\n configOptions.push({\n id: \"effort\",\n name: \"Effort\",\n type: \"select\",\n currentValue: currentEffort,\n options: effortOptions,\n category: \"thought_level\" as SessionConfigOptionCategory,\n description: \"Controls how much effort Claude puts into its response\",\n });\n }\n\n return configOptions;\n }\n\n private rebuildEffortConfigOption(modelId: string): void {\n const effortOptions = getEffortOptions(modelId);\n const existingEffort = this.session.configOptions.find(\n (o) => o.id === \"effort\",\n );\n\n if (!effortOptions) {\n this.session.configOptions = this.session.configOptions.filter(\n (o) => o.id !== \"effort\",\n );\n if (this.session.effort) {\n this.session.effort = undefined;\n this.session.queryOptions.effort = undefined;\n void this.session.query.applyFlagSettings({\n effortLevel: undefined,\n });\n }\n return;\n }\n\n const rawCurrentValue = existingEffort?.currentValue;\n const currentValue =\n typeof rawCurrentValue === \"string\" ? rawCurrentValue : \"high\";\n const isValidValue = effortOptions.some((o) => o.value === currentValue);\n const resolvedValue = isValidValue ? currentValue : \"high\";\n\n if (resolvedValue !== currentValue && this.session.effort) {\n this.session.effort = resolvedValue as EffortLevel;\n this.session.queryOptions.effort = resolvedValue as EffortLevel;\n void this.session.query.applyFlagSettings({\n // @ts-expect-error SDK Settings.effortLevel omits \"max\" but runtime accepts it\n effortLevel: resolvedValue,\n });\n }\n\n const effortConfig: SessionConfigOption = {\n id: \"effort\",\n name: \"Effort\",\n type: \"select\",\n currentValue: resolvedValue,\n options: effortOptions,\n category: \"thought_level\" as SessionConfigOptionCategory,\n description: \"Controls how much effort Claude puts into its response\",\n };\n\n if (existingEffort) {\n this.session.configOptions = this.session.configOptions.map((o) =>\n o.id === \"effort\" ? effortConfig : o,\n );\n } else {\n this.session.configOptions.push(effortConfig);\n }\n }\n\n private async sendAvailableCommandsUpdate(): Promise<void> {\n const commands = await this.session.query.supportedCommands();\n await this.client.sessionUpdate({\n sessionId: this.sessionId,\n update: {\n sessionUpdate: \"available_commands_update\",\n availableCommands: getAvailableSlashCommands(commands),\n },\n });\n }\n\n private async replaySessionHistory(sessionId: string): Promise<void> {\n try {\n const messages = await getSessionMessages(sessionId, {\n dir: this.session.cwd,\n });\n\n const replayContext = {\n session: this.session,\n sessionId,\n client: this.client,\n toolUseCache: this.toolUseCache,\n fileContentCache: this.fileContentCache,\n enrichedReadCache: this.enrichedReadCache,\n logger: this.logger,\n registerHooks: false,\n };\n\n for (const msg of messages) {\n const sdkMessage = {\n type: msg.type,\n message: msg.message as {\n content: string | Array<{ type: string; text?: string }>;\n role: typeof msg.type;\n },\n parent_tool_use_id: msg.parent_tool_use_id,\n };\n await handleUserAssistantMessage(\n sdkMessage as Parameters<typeof handleUserAssistantMessage>[0],\n replayContext,\n );\n }\n } catch (err) {\n this.logger.warn(\"Failed to replay session history\", {\n sessionId,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n // ================================\n // EXTENSION METHODS\n // ================================\n\n /**\n * Fire-and-forget: fetch slash commands and MCP tool metadata in parallel.\n * Both populate caches used later — neither is needed to return configOptions.\n */\n private deferBackgroundFetches(q: Query): void {\n Promise.all([\n new Promise<void>((resolve) => setTimeout(resolve, 10)).then(() =>\n this.sendAvailableCommandsUpdate(),\n ),\n fetchMcpToolMetadata(q, this.logger).then(() => {\n const serverNames = getConnectedMcpServerNames();\n if (serverNames.length > 0) {\n this.options?.onMcpServersReady?.(serverNames);\n }\n }),\n ]).catch((err) =>\n this.logger.error(\"Background fetch failed\", { error: err }),\n );\n }\n\n private async broadcastUserMessage(params: PromptRequest): Promise<void> {\n for (const chunk of params.prompt) {\n const notification = {\n sessionId: params.sessionId,\n update: {\n sessionUpdate: \"user_message_chunk\" as const,\n content: chunk,\n },\n };\n await this.client.sessionUpdate(notification);\n this.appendNotification(params.sessionId, notification);\n }\n }\n}\n","{\n \"name\": \"@posthog/agent\",\n \"version\": \"2.3.346\",\n \"repository\": \"https://github.com/PostHog/code\",\n \"description\": \"TypeScript agent framework wrapping Claude Agent SDK with Git-based task execution for PostHog\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\"\n },\n \"./agent\": {\n \"types\": \"./dist/agent.d.ts\",\n \"import\": \"./dist/agent.js\"\n },\n \"./gateway-models\": {\n \"types\": \"./dist/gateway-models.d.ts\",\n \"import\": \"./dist/gateway-models.js\"\n },\n \"./posthog-api\": {\n \"types\": \"./dist/posthog-api.d.ts\",\n \"import\": \"./dist/posthog-api.js\"\n },\n \"./types\": {\n \"types\": \"./dist/types.d.ts\",\n \"import\": \"./dist/types.js\"\n },\n \"./adapters/claude/questions/utils\": {\n \"types\": \"./dist/adapters/claude/questions/utils.d.ts\",\n \"import\": \"./dist/adapters/claude/questions/utils.js\"\n },\n \"./adapters/claude/permissions/permission-options\": {\n \"types\": \"./dist/adapters/claude/permissions/permission-options.d.ts\",\n \"import\": \"./dist/adapters/claude/permissions/permission-options.js\"\n },\n \"./adapters/claude/tools\": {\n \"types\": \"./dist/adapters/claude/tools.d.ts\",\n \"import\": \"./dist/adapters/claude/tools.js\"\n },\n \"./adapters/claude/conversion/tool-use-to-acp\": {\n \"types\": \"./dist/adapters/claude/conversion/tool-use-to-acp.d.ts\",\n \"import\": \"./dist/adapters/claude/conversion/tool-use-to-acp.js\"\n },\n \"./adapters/claude/session/jsonl-hydration\": {\n \"types\": \"./dist/adapters/claude/session/jsonl-hydration.d.ts\",\n \"import\": \"./dist/adapters/claude/session/jsonl-hydration.js\"\n },\n \"./adapters/claude/session/models\": {\n \"types\": \"./dist/adapters/claude/session/models.d.ts\",\n \"import\": \"./dist/adapters/claude/session/models.js\"\n },\n \"./adapters/reasoning-effort\": {\n \"types\": \"./dist/adapters/reasoning-effort.d.ts\",\n \"import\": \"./dist/adapters/reasoning-effort.js\"\n },\n \"./execution-mode\": {\n \"types\": \"./dist/execution-mode.d.ts\",\n \"import\": \"./dist/execution-mode.js\"\n },\n \"./server\": {\n \"types\": \"./dist/server/agent-server.d.ts\",\n \"import\": \"./dist/server/agent-server.js\"\n }\n },\n \"bin\": {\n \"agent-server\": \"./dist/server/bin.cjs\"\n },\n \"type\": \"module\",\n \"keywords\": [\n \"posthog\",\n \"claude\",\n \"agent\",\n \"ai\",\n \"git\",\n \"typescript\"\n ],\n \"author\": \"PostHog\",\n \"license\": \"SEE LICENSE IN LICENSE\",\n \"scripts\": {\n \"build\": \"node ../../scripts/rimraf.mjs dist && tsup\",\n \"dev\": \"tsup --watch\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"typecheck\": \"pnpm exec tsc --noEmit\",\n \"prepublishOnly\": \"pnpm run build\",\n \"clean\": \"node ../../scripts/rimraf.mjs dist .turbo\"\n },\n \"engines\": {\n \"node\": \">=20.0.0\"\n },\n \"devDependencies\": {\n \"@posthog/shared\": \"workspace:*\",\n \"@posthog/git\": \"workspace:*\",\n \"@types/bun\": \"latest\",\n \"@types/tar\": \"^6.1.13\",\n \"msw\": \"^2.12.7\",\n \"tsup\": \"^8.5.1\",\n \"tsx\": \"^4.20.6\",\n \"typescript\": \"^5.5.0\",\n \"vitest\": \"^2.1.8\"\n },\n \"dependencies\": {\n \"@agentclientprotocol/sdk\": \"0.19.0\",\n \"ajv\": \"^8.17.1\",\n \"@anthropic-ai/claude-agent-sdk\": \"0.2.112\",\n \"@anthropic-ai/sdk\": \"0.89.0\",\n \"@hono/node-server\": \"^1.19.9\",\n \"@opentelemetry/api-logs\": \"^0.208.0\",\n \"@opentelemetry/exporter-logs-otlp-http\": \"^0.208.0\",\n \"@opentelemetry/resources\": \"^2.0.0\",\n \"@opentelemetry/sdk-logs\": \"^0.208.0\",\n \"@opentelemetry/semantic-conventions\": \"^1.28.0\",\n \"@posthog/enricher\": \"workspace:*\",\n \"@types/jsonwebtoken\": \"^9.0.10\",\n \"commander\": \"^14.0.2\",\n \"hono\": \"^4.11.7\",\n \"jsonwebtoken\": \"^9.0.2\",\n \"minimatch\": \"^10.0.3\",\n \"tar\": \"^7.5.0\",\n \"uuid\": \"13.0.0\",\n \"yoga-wasm-web\": \"^0.3.3\",\n \"zod\": \"^4.2.0\"\n },\n \"files\": [\n \"dist/**/*\",\n \"src/**/*\",\n \"README.md\",\n \"CLAUDE.md\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n","/**\n * PostHog-specific ACP extensions.\n *\n * These follow the ACP extensibility model:\n * - Custom notification methods are prefixed with `_posthog/`\n * - Custom data can be attached via `_meta` fields\n *\n * See: https://agentclientprotocol.com/docs/extensibility\n */\n\n/**\n * Custom notification methods for PostHog-specific events.\n * Used with AgentSideConnection.extNotification() or Client.extNotification()\n */\nexport const POSTHOG_NOTIFICATIONS = {\n /** Git branch was created for a task */\n BRANCH_CREATED: \"_posthog/branch_created\",\n\n /** Task run has started execution */\n RUN_STARTED: \"_posthog/run_started\",\n\n /** Task has completed (success or failure) */\n TASK_COMPLETE: \"_posthog/task_complete\",\n\n /** Agent finished processing a turn (prompt returned, waiting for next input) */\n TURN_COMPLETE: \"_posthog/turn_complete\",\n\n /** Error occurred during task execution */\n ERROR: \"_posthog/error\",\n\n /** Console/log output from the agent */\n CONSOLE: \"_posthog/console\",\n\n /** Maps taskRunId to agent's sessionId and adapter type (for resumption) */\n SDK_SESSION: \"_posthog/sdk_session\",\n\n /** Tree state snapshot captured (git tree hash + file archive) */\n TREE_SNAPSHOT: \"_posthog/tree_snapshot\",\n\n /** Agent mode changed (interactive/background) */\n MODE_CHANGE: \"_posthog/mode_change\",\n\n /** Request to resume a session from previous state */\n SESSION_RESUME: \"_posthog/session/resume\",\n\n /** User message sent from client to agent */\n USER_MESSAGE: \"_posthog/user_message\",\n\n /** Request to cancel current operation */\n CANCEL: \"_posthog/cancel\",\n\n /** Request to close the session */\n CLOSE: \"_posthog/close\",\n\n /** Agent status update (thinking, working, etc.) */\n STATUS: \"_posthog/status\",\n\n /** Task-level notification (progress, milestones) */\n TASK_NOTIFICATION: \"_posthog/task_notification\",\n\n /** Marks a boundary for log compaction */\n COMPACT_BOUNDARY: \"_posthog/compact_boundary\",\n\n /** Token usage update for a session turn */\n USAGE_UPDATE: \"_posthog/usage_update\",\n\n /** Response to a relayed permission request (plan approval, question) */\n PERMISSION_RESPONSE: \"_posthog/permission_response\",\n} as const;\n\n/**\n * Custom request methods for PostHog-specific operations that need a response\n * (request/response, not fire-and-forget). Used with\n * ClientSideConnection.extMethod() on the sender and Agent.extMethod() on the\n * receiver.\n */\nexport const POSTHOG_METHODS = {\n /**\n * Client requests a session refresh between turns. Payload may include\n * `mcpServers` to trigger a resume-with-new-options reinit; future fields\n * can extend this without adding new methods. Returns once the refresh has\n * completed so the caller can safely send the next prompt.\n */\n REFRESH_SESSION: \"_posthog/refresh_session\",\n} as const;\n\ntype PosthogNotification =\n (typeof POSTHOG_NOTIFICATIONS)[keyof typeof POSTHOG_NOTIFICATIONS];\n\ntype PosthogMethod = (typeof POSTHOG_METHODS)[keyof typeof POSTHOG_METHODS];\n\n/**\n * Does `method` match `expected`? Shared by notification and method matchers.\n * Handles the `__posthog/` double-prefix that extNotification() can produce.\n */\nfunction matchesExt(method: string | undefined, expected: string): boolean {\n if (!method) return false;\n return method === expected || method === `_${expected}`;\n}\n\n/** Dispatcher check for incoming `extNotification` calls on the agent side. */\nexport function isNotification(\n method: string | undefined,\n expected: PosthogNotification,\n): boolean {\n return matchesExt(method, expected);\n}\n\n/** Dispatcher check for incoming `extMethod` calls on the agent side. */\nexport function isMethod(\n method: string | undefined,\n expected: PosthogMethod,\n): boolean {\n return matchesExt(method, expected);\n}\n","import * as path from \"node:path\";\nimport { EXT_TO_LANG_ID, PostHogEnricher } from \"@posthog/enricher\";\nimport type { PostHogAPIConfig } from \"../types\";\nimport type { Logger } from \"../utils/logger\";\n\nexport interface FileEnrichmentDeps {\n enricher: PostHogEnricher;\n apiConfig: PostHogAPIConfig;\n logger?: Logger;\n}\n\nexport interface Enrichment {\n deps: FileEnrichmentDeps;\n dispose(): void;\n}\n\nexport function createEnrichment(\n apiConfig: PostHogAPIConfig | undefined,\n logger?: Logger,\n): Enrichment | undefined {\n if (!apiConfig) return undefined;\n const enricher = new PostHogEnricher();\n return {\n deps: { enricher, apiConfig, logger },\n dispose: () => enricher.dispose(),\n };\n}\n\nconst MAX_ENRICHMENT_BYTES = 1_000_000;\n\nexport async function enrichFileForAgent(\n deps: FileEnrichmentDeps,\n filePath: string,\n content: string,\n): Promise<string | null> {\n if (!content || content.length > MAX_ENRICHMENT_BYTES) return null;\n\n // Skip the tree-sitter parse for files with no PostHog references.\n if (!/posthog/i.test(content)) return null;\n\n const ext = path.extname(filePath).toLowerCase();\n const langId = EXT_TO_LANG_ID[ext];\n if (!langId || !deps.enricher.isSupported(langId)) return null;\n\n try {\n const parsed = await deps.enricher.parse(content, langId);\n if (parsed.calls.length === 0 && parsed.initCalls.length === 0) {\n return null;\n }\n\n const apiKey = await deps.apiConfig.getApiKey();\n if (!apiKey) return null;\n\n const enriched = await parsed.enrichFromApi({\n apiKey,\n host: deps.apiConfig.apiUrl,\n projectId: deps.apiConfig.projectId,\n timeoutMs: 5_000,\n });\n\n const annotated = enriched.toInlineComments();\n if (annotated === content) {\n deps.logger?.debug(\"File enrichment produced no changes\", {\n filePath,\n calls: parsed.calls.length,\n });\n return null;\n }\n deps.logger?.debug(\"File enriched\", {\n filePath,\n calls: parsed.calls.length,\n });\n return annotated;\n } catch (err) {\n const detail =\n err instanceof Error\n ? { message: err.message, name: err.name, stack: err.stack }\n : { value: String(err) };\n deps.logger?.debug(\"File enrichment failed\", { filePath, ...detail });\n return null;\n }\n}\n","import type Parser from \"web-tree-sitter\";\n\nexport interface Capture {\n name: string;\n node: Parser.SyntaxNode;\n}\n\nexport function getCapture(\n captures: Capture[],\n name: string,\n): Parser.SyntaxNode | null {\n const found = captures.find((c) => c.name === name);\n return found ? found.node : null;\n}\n\nexport function extractClientName(\n node: Parser.SyntaxNode,\n detectNested: boolean,\n): string | null {\n if (node.type === \"identifier\") {\n return node.text;\n }\n if (detectNested) {\n if (node.type === \"member_expression\" || node.type === \"attribute\") {\n const prop =\n node.childForFieldName(\"property\") ||\n node.childForFieldName(\"attribute\");\n if (prop) {\n return prop.text;\n }\n }\n if (node.type === \"selector_expression\") {\n const field = node.childForFieldName(\"field\");\n if (field) {\n return field.text;\n }\n }\n if (node.type === \"optional_chain_expression\") {\n const inner = node.namedChildren[0];\n if (inner?.type === \"member_expression\") {\n const prop = inner.childForFieldName(\"property\");\n if (prop) {\n return prop.text;\n }\n }\n }\n }\n return null;\n}\n\nexport function extractIdentifier(node: Parser.SyntaxNode): string | null {\n if (node.type === \"identifier\") {\n return node.text;\n }\n if (\n node.type === \"parenthesized_expression\" &&\n node.namedChildren.length === 1\n ) {\n return extractIdentifier(node.namedChildren[0]);\n }\n return null;\n}\n\nexport function extractStringFromCaseValue(\n node: Parser.SyntaxNode,\n): string | null {\n if (node.type === \"expression_list\" && node.namedChildCount > 0) {\n return extractStringFromNode(node.namedChildren[0]);\n }\n return extractStringFromNode(node);\n}\n\nexport function extractStringFromNode(node: Parser.SyntaxNode): string | null {\n if (node.type === \"string\" || node.type === \"template_string\") {\n const content = node.namedChildren.find(\n (c) =>\n c.type === \"string_fragment\" ||\n c.type === \"string_content\" ||\n c.type === \"string_value\",\n );\n return content ? content.text : null;\n }\n if (\n node.type === \"interpreted_string_literal\" ||\n node.type === \"raw_string_literal\"\n ) {\n return node.text.slice(1, -1);\n }\n if (node.type === \"string_fragment\" || node.type === \"string_content\") {\n return node.text;\n }\n return null;\n}\n\nexport function cleanStringValue(text: string): string {\n if (\n (text.startsWith('\"') && text.endsWith('\"')) ||\n (text.startsWith(\"'\") && text.endsWith(\"'\")) ||\n (text.startsWith(\"`\") && text.endsWith(\"`\"))\n ) {\n return text.slice(1, -1);\n }\n return text;\n}\n\nconst PARAM_SKIP = new Set([\n \"e\",\n \"ev\",\n \"event\",\n \"evt\",\n \"ctx\",\n \"context\",\n \"req\",\n \"res\",\n \"next\",\n \"err\",\n \"error\",\n \"_\",\n \"__\",\n]);\n\nexport function extractParams(paramsText: string): string[] {\n let text = paramsText.trim();\n if (text.startsWith(\"(\")) {\n text = text.slice(1);\n }\n if (text.endsWith(\")\")) {\n text = text.slice(0, -1);\n }\n if (!text.trim()) {\n return [];\n }\n\n return text\n .split(\",\")\n .map((p) => {\n if (p.includes(\"{\") || p.includes(\"}\")) {\n return \"\";\n }\n const name = p.split(\":\")[0].split(\"=\")[0].replace(/[?.]/g, \"\").trim();\n return name;\n })\n .filter((p) => p && !PARAM_SKIP.has(p) && !p.startsWith(\"...\"));\n}\n\nexport function walkNodes(\n root: Parser.SyntaxNode,\n type: string,\n callback: (node: Parser.SyntaxNode) => void,\n): void {\n const visit = (node: Parser.SyntaxNode) => {\n if (node.type === type) {\n callback(node);\n }\n for (const child of node.namedChildren) {\n visit(child);\n }\n };\n visit(root);\n}\n","// ── Language-specific method sets and tree-sitter queries ──\n\nexport interface QueryStrings {\n postHogCalls: string;\n nodeCaptureCalls: string;\n pythonCaptureCalls?: string;\n goStructCalls?: string;\n rubyCaptureCalls?: string;\n identifierArgCalls: string;\n dynamicCalls: string;\n flagAssignments: string;\n functions: string;\n clientAliases: string;\n constructorAliases: string;\n destructuredMethods: string;\n bareFunctionCalls: string;\n}\n\nexport interface LangFamily {\n wasm: string;\n captureMethods: Set<string>;\n flagMethods: Set<string>;\n allMethods: Set<string>;\n queries: QueryStrings;\n}\n\n// ── Method sets per language ──\n\nconst JS_CAPTURE_METHODS = new Set([\"capture\"]);\nconst JS_FLAG_METHODS = new Set([\n \"getFeatureFlag\",\n \"isFeatureEnabled\",\n \"getFeatureFlagPayload\",\n \"getFeatureFlagResult\",\n \"isFeatureFlagEnabled\",\n \"getRemoteConfig\",\n]);\nconst JS_ALL_METHODS = new Set([...JS_CAPTURE_METHODS, ...JS_FLAG_METHODS]);\n\nconst PY_CAPTURE_METHODS = new Set([\"capture\"]);\nconst PY_FLAG_METHODS = new Set([\n \"feature_enabled\",\n \"is_feature_enabled\",\n \"get_feature_flag\",\n \"get_feature_flag_payload\",\n \"get_remote_config\",\n]);\nconst PY_ALL_METHODS = new Set([...PY_CAPTURE_METHODS, ...PY_FLAG_METHODS]);\n\nconst GO_CAPTURE_METHODS = new Set([\"Enqueue\"]);\nconst GO_FLAG_METHODS = new Set([\n \"GetFeatureFlag\",\n \"IsFeatureEnabled\",\n \"GetFeatureFlagPayload\",\n]);\nconst GO_ALL_METHODS = new Set([...GO_CAPTURE_METHODS, ...GO_FLAG_METHODS]);\n\nconst RB_CAPTURE_METHODS = new Set([\"capture\"]);\nconst RB_FLAG_METHODS = new Set([\n \"is_feature_enabled\",\n \"get_feature_flag\",\n \"get_feature_flag_payload\",\n \"get_remote_config_payload\",\n]);\nconst RB_ALL_METHODS = new Set([...RB_CAPTURE_METHODS, ...RB_FLAG_METHODS]);\n\n// ── Default client names ──\n\nexport const CLIENT_NAMES = new Set([\"posthog\", \"client\", \"ph\"]);\n\n// ── All flag methods across languages (for stale flag scanning) ──\n\nexport const ALL_FLAG_METHODS = new Set([\n ...JS_FLAG_METHODS,\n ...PY_FLAG_METHODS,\n ...GO_FLAG_METHODS,\n ...RB_FLAG_METHODS,\n]);\n\n// ── Tree-sitter queries ──\n\nconst JS_QUERIES: QueryStrings = {\n postHogCalls: `\n (call_expression\n function: (member_expression\n object: (_) @client\n property: (property_identifier) @method)\n arguments: (arguments . (string (string_fragment) @key))) @call\n\n (call_expression\n function: (member_expression\n object: (_) @client\n property: (property_identifier) @method)\n arguments: (arguments . (template_string (string_fragment) @key))) @call\n `,\n\n nodeCaptureCalls: `\n (call_expression\n function: (member_expression\n object: (_) @client\n property: (property_identifier) @method)\n arguments: (arguments .\n (object\n (pair\n key: (property_identifier) @prop_name\n value: (string (string_fragment) @key))))) @call\n `,\n\n flagAssignments: `\n (lexical_declaration\n (variable_declarator\n name: (identifier) @var_name\n value: (call_expression\n function: (member_expression\n object: (_) @client\n property: (property_identifier) @method)\n arguments: (arguments . (string (string_fragment) @flag_key))))) @assignment\n\n (variable_declaration\n (variable_declarator\n name: (identifier) @var_name\n value: (call_expression\n function: (member_expression\n object: (_) @client\n property: (property_identifier) @method)\n arguments: (arguments . (string (string_fragment) @flag_key))))) @assignment\n\n (lexical_declaration\n (variable_declarator\n name: (identifier) @var_name\n value: (await_expression\n (call_expression\n function: (member_expression\n object: (_) @client\n property: (property_identifier) @method)\n arguments: (arguments . (string (string_fragment) @flag_key)))))) @assignment\n\n (variable_declaration\n (variable_declarator\n name: (identifier) @var_name\n value: (await_expression\n (call_expression\n function: (member_expression\n object: (_) @client\n property: (property_identifier) @method)\n arguments: (arguments . (string (string_fragment) @flag_key)))))) @assignment\n `,\n\n functions: `\n (function_declaration\n name: (identifier) @func_name\n parameters: (formal_parameters) @func_params\n body: (statement_block) @func_body)\n\n (export_statement\n declaration: (function_declaration\n name: (identifier) @func_name\n parameters: (formal_parameters) @func_params\n body: (statement_block) @func_body))\n\n (lexical_declaration\n (variable_declarator\n name: (identifier) @func_name\n value: (arrow_function\n parameters: (formal_parameters) @func_params\n body: (statement_block) @func_body)))\n\n (lexical_declaration\n (variable_declarator\n name: (identifier) @func_name\n value: (arrow_function\n parameter: (identifier) @func_single_param\n body: (statement_block) @func_body)))\n\n (method_definition\n name: (property_identifier) @func_name\n parameters: (formal_parameters) @func_params\n body: (statement_block) @func_body)\n `,\n\n clientAliases: `\n (lexical_declaration\n (variable_declarator\n name: (identifier) @alias\n value: (identifier) @source))\n\n (variable_declaration\n (variable_declarator\n name: (identifier) @alias\n value: (identifier) @source))\n `,\n\n constructorAliases: `\n (lexical_declaration\n (variable_declarator\n name: (identifier) @alias\n value: (new_expression\n constructor: (identifier) @class_name)))\n\n (variable_declaration\n (variable_declarator\n name: (identifier) @alias\n value: (new_expression\n constructor: (identifier) @class_name)))\n `,\n\n destructuredMethods: `\n (lexical_declaration\n (variable_declarator\n name: (object_pattern\n (shorthand_property_identifier_pattern) @method_name)\n value: (identifier) @source))\n `,\n\n bareFunctionCalls: `\n (call_expression\n function: (identifier) @func_name\n arguments: (arguments . (string (string_fragment) @key))) @call\n `,\n\n identifierArgCalls: `\n (call_expression\n function: (member_expression\n object: (_) @client\n property: (property_identifier) @method)\n arguments: (arguments . (identifier) @arg_id)) @call\n `,\n\n dynamicCalls: `\n (call_expression\n function: (member_expression\n object: (_) @client\n property: (property_identifier) @method)\n arguments: (arguments . (_) @first_arg)) @call\n `,\n};\n\nconst PY_QUERIES: QueryStrings = {\n postHogCalls: `\n (call\n function: (attribute\n object: (_) @client\n attribute: (identifier) @method)\n arguments: (argument_list . (string (string_content) @key))) @call\n `,\n\n nodeCaptureCalls: \"\",\n\n pythonCaptureCalls: `\n (call\n function: (attribute\n object: (_) @client\n attribute: (identifier) @method)\n arguments: (argument_list (string) . (string (string_content) @key))) @call\n\n (call\n function: (attribute\n object: (_) @client\n attribute: (identifier) @method)\n arguments: (argument_list\n (keyword_argument\n name: (identifier) @kwarg_name\n value: (string (string_content) @key)))) @call\n `,\n\n flagAssignments: `\n (expression_statement\n (assignment\n left: (identifier) @var_name\n right: (call\n function: (attribute\n object: (_) @client\n attribute: (identifier) @method)\n arguments: (argument_list . (string (string_content) @flag_key))))) @assignment\n `,\n\n functions: `\n (function_definition\n name: (identifier) @func_name\n parameters: (parameters) @func_params\n body: (block) @func_body)\n `,\n\n clientAliases: `\n (expression_statement\n (assignment\n left: (identifier) @alias\n right: (identifier) @source))\n `,\n\n constructorAliases: `\n (expression_statement\n (assignment\n left: (identifier) @alias\n right: (call\n function: (identifier) @class_name\n arguments: (argument_list))))\n `,\n\n destructuredMethods: \"\",\n\n bareFunctionCalls: `\n (call\n function: (identifier) @func_name\n arguments: (argument_list . (string (string_content) @key))) @call\n `,\n\n identifierArgCalls: `\n (call\n function: (attribute\n object: (_) @client\n attribute: (identifier) @method)\n arguments: (argument_list . (identifier) @arg_id)) @call\n `,\n\n dynamicCalls: `\n (call\n function: (attribute\n object: (_) @client\n attribute: (identifier) @method)\n arguments: (argument_list . (_) @first_arg)) @call\n `,\n};\n\nconst GO_QUERIES: QueryStrings = {\n postHogCalls: `\n (call_expression\n function: (selector_expression\n operand: (_) @client\n field: (field_identifier) @method)\n arguments: (argument_list . (interpreted_string_literal) @key)) @call\n `,\n\n nodeCaptureCalls: \"\",\n\n goStructCalls: `\n (call_expression\n function: (selector_expression\n operand: (_) @client\n field: (field_identifier) @method)\n arguments: (argument_list\n (composite_literal\n body: (literal_value\n (keyed_element\n (literal_element (identifier) @field_name)\n (literal_element (interpreted_string_literal) @key)))))) @call\n `,\n\n flagAssignments: `\n (short_var_declaration\n left: (expression_list . (identifier) @var_name .)\n right: (expression_list\n (call_expression\n function: (selector_expression\n operand: (_) @client\n field: (field_identifier) @method)\n arguments: (argument_list . (interpreted_string_literal) @flag_key)))) @assignment\n\n (short_var_declaration\n left: (expression_list . (identifier) @var_name (_))\n right: (expression_list\n (call_expression\n function: (selector_expression\n operand: (_) @client\n field: (field_identifier) @method)\n arguments: (argument_list . (interpreted_string_literal) @flag_key)))) @assignment\n `,\n\n functions: `\n (function_declaration\n name: (identifier) @func_name\n parameters: (parameter_list) @func_params\n body: (block) @func_body)\n\n (method_declaration\n name: (field_identifier) @func_name\n parameters: (parameter_list) @func_params\n body: (block) @func_body)\n `,\n\n clientAliases: \"\",\n\n constructorAliases: `\n (short_var_declaration\n left: (expression_list (identifier) @alias)\n right: (expression_list\n (call_expression\n function: (selector_expression\n operand: (identifier) @pkg_name\n field: (field_identifier) @func_name))))\n\n (short_var_declaration\n left: (expression_list (identifier) @alias (_))\n right: (expression_list\n (call_expression\n function: (selector_expression\n operand: (identifier) @pkg_name\n field: (field_identifier) @func_name))))\n `,\n\n destructuredMethods: \"\",\n\n bareFunctionCalls: \"\",\n\n identifierArgCalls: `\n (call_expression\n function: (selector_expression\n operand: (_) @client\n field: (field_identifier) @method)\n arguments: (argument_list . (identifier) @arg_id)) @call\n `,\n\n dynamicCalls: `\n (call_expression\n function: (selector_expression\n operand: (_) @client\n field: (field_identifier) @method)\n arguments: (argument_list . (_) @first_arg)) @call\n `,\n};\n\nconst RB_QUERIES: QueryStrings = {\n postHogCalls: `\n (call\n receiver: (_) @client\n method: (identifier) @method\n arguments: (argument_list . (string (string_content) @key))) @call\n `,\n\n nodeCaptureCalls: \"\",\n\n rubyCaptureCalls: `\n (call\n receiver: (_) @client\n method: (identifier) @method\n arguments: (argument_list\n (pair\n (hash_key_symbol) @kwarg_name\n (string (string_content) @key)))) @call\n `,\n\n flagAssignments: `\n (assignment\n left: (identifier) @var_name\n right: (call\n receiver: (_) @client\n method: (identifier) @method\n arguments: (argument_list . (string (string_content) @flag_key)))) @assignment\n `,\n\n functions: `\n (method\n name: (identifier) @func_name\n parameters: (method_parameters) @func_params\n body: (_) @func_body)\n `,\n\n clientAliases: `\n (assignment\n left: (identifier) @alias\n right: (identifier) @source)\n `,\n\n constructorAliases: `\n (assignment\n left: (identifier) @alias\n right: (call\n receiver: (scope_resolution\n scope: (constant) @scope_name\n name: (constant) @class_name)\n method: (identifier) @method_name))\n `,\n\n destructuredMethods: \"\",\n\n bareFunctionCalls: `\n (call\n method: (identifier) @func_name\n arguments: (argument_list . (string (string_content) @key))) @call\n `,\n\n identifierArgCalls: `\n (call\n receiver: (_) @client\n method: (identifier) @method\n arguments: (argument_list . (identifier) @arg_id)) @call\n\n (call\n receiver: (_) @client\n method: (identifier) @method\n arguments: (argument_list . (constant) @arg_id)) @call\n `,\n\n dynamicCalls: `\n (call\n receiver: (_) @client\n method: (identifier) @method\n arguments: (argument_list . (_) @first_arg)) @call\n `,\n};\n\n// ── File extension → language ID mapping ──\n\nexport const EXT_TO_LANG_ID: Record<string, string> = {\n \".js\": \"javascript\",\n \".mjs\": \"javascript\",\n \".cjs\": \"javascript\",\n \".jsx\": \"javascriptreact\",\n \".ts\": \"typescript\",\n \".mts\": \"typescript\",\n \".cts\": \"typescript\",\n \".tsx\": \"typescriptreact\",\n \".py\": \"python\",\n \".pyw\": \"python\",\n \".go\": \"go\",\n \".rb\": \"ruby\",\n \".rake\": \"ruby\",\n \".gemspec\": \"ruby\",\n};\n\n// ── Language → family mapping ──\n\nexport const LANG_FAMILIES: Record<string, LangFamily> = {\n javascript: {\n wasm: \"tree-sitter-javascript.wasm\",\n captureMethods: JS_CAPTURE_METHODS,\n flagMethods: JS_FLAG_METHODS,\n allMethods: JS_ALL_METHODS,\n queries: JS_QUERIES,\n },\n javascriptreact: {\n wasm: \"tree-sitter-javascript.wasm\",\n captureMethods: JS_CAPTURE_METHODS,\n flagMethods: JS_FLAG_METHODS,\n allMethods: JS_ALL_METHODS,\n queries: JS_QUERIES,\n },\n typescript: {\n wasm: \"tree-sitter-typescript.wasm\",\n captureMethods: JS_CAPTURE_METHODS,\n flagMethods: JS_FLAG_METHODS,\n allMethods: JS_ALL_METHODS,\n queries: JS_QUERIES,\n },\n typescriptreact: {\n wasm: \"tree-sitter-tsx.wasm\",\n captureMethods: JS_CAPTURE_METHODS,\n flagMethods: JS_FLAG_METHODS,\n allMethods: JS_ALL_METHODS,\n queries: JS_QUERIES,\n },\n python: {\n wasm: \"tree-sitter-python.wasm\",\n captureMethods: PY_CAPTURE_METHODS,\n flagMethods: PY_FLAG_METHODS,\n allMethods: PY_ALL_METHODS,\n queries: PY_QUERIES,\n },\n go: {\n wasm: \"tree-sitter-go.wasm\",\n captureMethods: GO_CAPTURE_METHODS,\n flagMethods: GO_FLAG_METHODS,\n allMethods: GO_ALL_METHODS,\n queries: GO_QUERIES,\n },\n ruby: {\n wasm: \"tree-sitter-ruby.wasm\",\n captureMethods: RB_CAPTURE_METHODS,\n flagMethods: RB_FLAG_METHODS,\n allMethods: RB_ALL_METHODS,\n queries: RB_QUERIES,\n },\n};\n","import type Parser from \"web-tree-sitter\";\nimport { cleanStringValue, getCapture } from \"./ast-helpers.js\";\nimport type { LangFamily } from \"./languages.js\";\nimport { CLIENT_NAMES } from \"./languages.js\";\nimport type { ParserManager } from \"./parser-manager.js\";\nimport type { DetectionConfig } from \"./types.js\";\n\nconst POSTHOG_CLASS_NAMES = new Set([\"PostHog\", \"Posthog\"]);\nconst GO_CONSTRUCTOR_NAMES = new Set([\"New\", \"NewWithConfig\"]);\n\nexport function getEffectiveClients(config: DetectionConfig): Set<string> {\n const clients = new Set(CLIENT_NAMES);\n for (const name of config.additionalClientNames) {\n clients.add(name);\n }\n return clients;\n}\n\nexport function findAliases(\n pm: ParserManager,\n lang: Parser.Language,\n tree: Parser.Tree,\n family: LangFamily,\n): {\n clientAliases: Set<string>;\n destructuredCapture: Set<string>;\n destructuredFlag: Set<string>;\n} {\n const effectiveClients = getEffectiveClients(pm.config);\n const clientAliases = new Set<string>();\n const destructuredCapture = new Set<string>();\n const destructuredFlag = new Set<string>();\n\n // Client aliases: const tracker = posthog\n const aliasQuery = pm.getQuery(lang, family.queries.clientAliases);\n if (aliasQuery) {\n for (const match of aliasQuery.matches(tree.rootNode)) {\n const aliasNode = getCapture(match.captures, \"alias\");\n const sourceNode = getCapture(match.captures, \"source\");\n if (aliasNode && sourceNode && effectiveClients.has(sourceNode.text)) {\n clientAliases.add(aliasNode.text);\n }\n }\n }\n\n // Constructor aliases: new PostHog('phc_...') / posthog.New(\"token\") / PostHog::Client.new(...)\n const constructorQuery = pm.getQuery(lang, family.queries.constructorAliases);\n if (constructorQuery) {\n for (const match of constructorQuery.matches(tree.rootNode)) {\n const aliasNode = getCapture(match.captures, \"alias\");\n const classNode = getCapture(match.captures, \"class_name\");\n const pkgNode = getCapture(match.captures, \"pkg_name\");\n const funcNode = getCapture(match.captures, \"func_name\");\n\n if (aliasNode && classNode && POSTHOG_CLASS_NAMES.has(classNode.text)) {\n clientAliases.add(aliasNode.text);\n }\n if (\n aliasNode &&\n pkgNode &&\n funcNode &&\n pkgNode.text === \"posthog\" &&\n GO_CONSTRUCTOR_NAMES.has(funcNode.text)\n ) {\n clientAliases.add(aliasNode.text);\n }\n const scopeNode = getCapture(match.captures, \"scope_name\");\n const methodNameNode = getCapture(match.captures, \"method_name\");\n if (\n aliasNode &&\n scopeNode &&\n classNode &&\n methodNameNode &&\n POSTHOG_CLASS_NAMES.has(scopeNode.text) &&\n classNode.text === \"Client\" &&\n methodNameNode.text === \"new\"\n ) {\n clientAliases.add(aliasNode.text);\n }\n }\n }\n\n // Destructured methods: const { capture, getFeatureFlag } = posthog\n if (family.queries.destructuredMethods) {\n const destructQuery = pm.getQuery(lang, family.queries.destructuredMethods);\n if (destructQuery) {\n for (const match of destructQuery.matches(tree.rootNode)) {\n const methodNode = getCapture(match.captures, \"method_name\");\n const sourceNode = getCapture(match.captures, \"source\");\n if (methodNode && sourceNode && effectiveClients.has(sourceNode.text)) {\n const name = methodNode.text;\n if (family.captureMethods.has(name)) {\n destructuredCapture.add(name);\n }\n if (family.flagMethods.has(name)) {\n destructuredFlag.add(name);\n }\n }\n }\n }\n }\n\n return { clientAliases, destructuredCapture, destructuredFlag };\n}\n\nexport function buildConstantMap(\n pm: ParserManager,\n lang: Parser.Language,\n tree: Parser.Tree,\n): Map<string, string> {\n const constants = new Map<string, string>();\n\n // JS: const/let/var declarations\n const jsQuery = pm.getQuery(\n lang,\n `\n (lexical_declaration\n (variable_declarator\n name: (identifier) @name\n value: (string (string_fragment) @value)))\n\n (variable_declaration\n (variable_declarator\n name: (identifier) @name\n value: (string (string_fragment) @value)))\n `,\n );\n if (jsQuery) {\n for (const match of jsQuery.matches(tree.rootNode)) {\n const nameNode = getCapture(match.captures, \"name\");\n const valueNode = getCapture(match.captures, \"value\");\n if (nameNode && valueNode) {\n constants.set(nameNode.text, valueNode.text);\n }\n }\n }\n\n // Python: simple assignment — NAME = \"value\"\n const pyQuery = pm.getQuery(\n lang,\n `\n (expression_statement\n (assignment\n left: (identifier) @name\n right: (string (string_content) @value)))\n `,\n );\n if (pyQuery) {\n for (const match of pyQuery.matches(tree.rootNode)) {\n const nameNode = getCapture(match.captures, \"name\");\n const valueNode = getCapture(match.captures, \"value\");\n if (nameNode && valueNode) {\n constants.set(nameNode.text, valueNode.text);\n }\n }\n }\n\n // Go: short var declarations and const declarations\n const goVarQuery = pm.getQuery(\n lang,\n `\n (short_var_declaration\n left: (expression_list (identifier) @name)\n right: (expression_list (interpreted_string_literal) @value))\n `,\n );\n if (goVarQuery) {\n for (const match of goVarQuery.matches(tree.rootNode)) {\n const nameNode = getCapture(match.captures, \"name\");\n const valueNode = getCapture(match.captures, \"value\");\n if (nameNode && valueNode) {\n constants.set(nameNode.text, cleanStringValue(valueNode.text));\n }\n }\n }\n\n const goConstQuery = pm.getQuery(\n lang,\n `\n (const_declaration\n (const_spec\n name: (identifier) @name\n value: (expression_list (interpreted_string_literal) @value)))\n `,\n );\n if (goConstQuery) {\n for (const match of goConstQuery.matches(tree.rootNode)) {\n const nameNode = getCapture(match.captures, \"name\");\n const valueNode = getCapture(match.captures, \"value\");\n if (nameNode && valueNode) {\n constants.set(nameNode.text, cleanStringValue(valueNode.text));\n }\n }\n }\n\n // Ruby: assignment — local var or constant\n const rbQuery = pm.getQuery(\n lang,\n `\n (assignment\n left: (identifier) @name\n right: (string (string_content) @value))\n\n (assignment\n left: (constant) @name\n right: (string (string_content) @value))\n `,\n );\n if (rbQuery) {\n for (const match of rbQuery.matches(tree.rootNode)) {\n const nameNode = getCapture(match.captures, \"name\");\n const valueNode = getCapture(match.captures, \"value\");\n if (nameNode && valueNode) {\n constants.set(nameNode.text, valueNode.text);\n }\n }\n }\n\n return constants;\n}\n","import type Parser from \"web-tree-sitter\";\nimport {\n buildConstantMap,\n findAliases,\n getEffectiveClients,\n} from \"./alias-resolver.js\";\nimport {\n cleanStringValue,\n extractClientName,\n extractParams,\n getCapture,\n} from \"./ast-helpers.js\";\nimport type { ParserManager } from \"./parser-manager.js\";\nimport type {\n FlagAssignment,\n FunctionInfo,\n PostHogCall,\n PostHogInitCall,\n} from \"./types.js\";\n\nconst POSTHOG_CLASS_NAMES = new Set([\"PostHog\", \"Posthog\"]);\nconst GO_CONSTRUCTOR_NAMES = new Set([\"New\", \"NewWithConfig\"]);\n\nexport async function findPostHogCalls(\n pm: ParserManager,\n source: string,\n languageId: string,\n): Promise<PostHogCall[]> {\n const ready = await pm.ensureReady(languageId);\n if (!ready) {\n return [];\n }\n\n const { lang, family } = ready;\n const tree = pm.parse(source, lang);\n if (!tree) {\n return [];\n }\n\n const calls: PostHogCall[] = [];\n const seen = new Set<string>();\n const allClients = getEffectiveClients(pm.config);\n\n // Resolve aliases\n const { clientAliases, destructuredCapture, destructuredFlag } = findAliases(\n pm,\n lang,\n tree,\n family,\n );\n for (const a of clientAliases) {\n allClients.add(a);\n }\n\n // Direct method calls: posthog.capture(\"event\")\n const callQuery = pm.getQuery(lang, family.queries.postHogCalls);\n if (callQuery) {\n const matches = callQuery.matches(tree.rootNode);\n for (const match of matches) {\n const clientNode = getCapture(match.captures, \"client\");\n const methodNode = getCapture(match.captures, \"method\");\n const keyNode = getCapture(match.captures, \"key\");\n\n if (!clientNode || !methodNode || !keyNode) {\n continue;\n }\n\n const clientName = extractClientName(\n clientNode,\n pm.config.detectNestedClients,\n );\n const method = methodNode.text;\n\n if (!clientName || !allClients.has(clientName)) {\n continue;\n }\n if (!family.allMethods.has(method)) {\n continue;\n }\n\n // For Python, skip capture in the generic query — the first arg is distinct_id, not the event.\n // Python capture is handled separately by the pythonCaptureCalls query.\n if (\n family.queries.pythonCaptureCalls &&\n family.captureMethods.has(method)\n ) {\n continue;\n }\n\n // For Ruby, skip capture — event is in the `event:` keyword arg, not the first positional arg.\n // Ruby capture is handled separately by the rubyCaptureCalls query.\n if (\n family.queries.rubyCaptureCalls &&\n family.captureMethods.has(method)\n ) {\n continue;\n }\n\n calls.push({\n method,\n key: cleanStringValue(keyNode.text),\n line: keyNode.startPosition.row,\n keyStartCol: keyNode.startPosition.column,\n keyEndCol: keyNode.endPosition.column,\n });\n }\n }\n\n // Go struct-based calls: client.Enqueue(posthog.Capture{Event: \"purchase\"})\n // and client.GetFeatureFlag(posthog.FeatureFlagPayload{Key: \"my-flag\"})\n if (family.queries.goStructCalls) {\n const structQuery = pm.getQuery(lang, family.queries.goStructCalls);\n if (structQuery) {\n for (const match of structQuery.matches(tree.rootNode)) {\n const clientNode = getCapture(match.captures, \"client\");\n const methodNode = getCapture(match.captures, \"method\");\n const fieldNameNode = getCapture(match.captures, \"field_name\");\n const keyNode = getCapture(match.captures, \"key\");\n if (!clientNode || !methodNode || !fieldNameNode || !keyNode) {\n continue;\n }\n\n const clientName = extractClientName(\n clientNode,\n pm.config.detectNestedClients,\n );\n const method = methodNode.text;\n const fieldName = fieldNameNode.text;\n if (!clientName || !allClients.has(clientName)) {\n continue;\n }\n\n // For Enqueue(posthog.Capture{Event: \"...\"}), method is \"Enqueue\" and we want Event field\n // For GetFeatureFlag(posthog.FeatureFlagPayload{Key: \"...\"}), we want Key field\n const isCapture = method === \"Enqueue\" && fieldName === \"Event\";\n const isFlag = family.flagMethods.has(method) && fieldName === \"Key\";\n if (!isCapture && !isFlag) {\n continue;\n }\n\n const effectiveMethod = isCapture ? \"capture\" : method;\n const key = cleanStringValue(keyNode.text);\n const line = keyNode.startPosition.row;\n const dedupKey = `${line}:${key}`;\n if (seen.has(dedupKey)) {\n continue;\n }\n seen.add(dedupKey);\n\n calls.push({\n method: effectiveMethod,\n key,\n line,\n keyStartCol: keyNode.startPosition.column,\n keyEndCol: keyNode.endPosition.column,\n });\n }\n }\n }\n\n // Node SDK capture calls: client.capture({ event: 'purchase', ... })\n const nodeCaptureQuery = pm.getQuery(lang, family.queries.nodeCaptureCalls);\n if (nodeCaptureQuery) {\n const matches = nodeCaptureQuery.matches(tree.rootNode);\n for (const match of matches) {\n const clientNode = getCapture(match.captures, \"client\");\n const methodNode = getCapture(match.captures, \"method\");\n const propNameNode = getCapture(match.captures, \"prop_name\");\n const keyNode = getCapture(match.captures, \"key\");\n\n if (!clientNode || !methodNode || !propNameNode || !keyNode) {\n continue;\n }\n\n const clientName = extractClientName(\n clientNode,\n pm.config.detectNestedClients,\n );\n const method = methodNode.text;\n\n if (!clientName || !allClients.has(clientName)) {\n continue;\n }\n if (method !== \"capture\") {\n continue;\n }\n if (propNameNode.text !== \"event\") {\n continue;\n }\n\n calls.push({\n method,\n key: cleanStringValue(keyNode.text),\n line: keyNode.startPosition.row,\n keyStartCol: keyNode.startPosition.column,\n keyEndCol: keyNode.endPosition.column,\n });\n }\n }\n\n // Python capture: posthog.capture(distinct_id, 'event_name', ...)\n // Event is the 2nd positional arg, or the `event` keyword argument\n if (family.queries.pythonCaptureCalls) {\n const pyCaptureQuery = pm.getQuery(lang, family.queries.pythonCaptureCalls);\n if (pyCaptureQuery) {\n const matches = pyCaptureQuery.matches(tree.rootNode);\n for (const match of matches) {\n const clientNode = getCapture(match.captures, \"client\");\n const methodNode = getCapture(match.captures, \"method\");\n const keyNode = getCapture(match.captures, \"key\");\n const kwargNameNode = getCapture(match.captures, \"kwarg_name\");\n\n if (!clientNode || !methodNode || !keyNode) {\n continue;\n }\n\n const clientName = extractClientName(\n clientNode,\n pm.config.detectNestedClients,\n );\n const method = methodNode.text;\n\n if (!clientName || !allClients.has(clientName)) {\n continue;\n }\n if (method !== \"capture\") {\n continue;\n }\n\n // For keyword argument form, only match event=\n if (kwargNameNode && kwargNameNode.text !== \"event\") {\n continue;\n }\n\n const key = cleanStringValue(keyNode.text);\n const line = keyNode.startPosition.row;\n const dedupKey = `${line}:${key}`;\n if (seen.has(dedupKey)) {\n continue;\n }\n seen.add(dedupKey);\n\n calls.push({\n method,\n key,\n line,\n keyStartCol: keyNode.startPosition.column,\n keyEndCol: keyNode.endPosition.column,\n });\n }\n }\n }\n\n // Ruby capture: client.capture(distinct_id: 'user', event: 'purchase')\n // Event name is in the `event:` keyword argument (hash_key_symbol)\n if (family.queries.rubyCaptureCalls) {\n const rbCaptureQuery = pm.getQuery(lang, family.queries.rubyCaptureCalls);\n if (rbCaptureQuery) {\n const matches = rbCaptureQuery.matches(tree.rootNode);\n for (const match of matches) {\n const clientNode = getCapture(match.captures, \"client\");\n const methodNode = getCapture(match.captures, \"method\");\n const keyNode = getCapture(match.captures, \"key\");\n const kwargNameNode = getCapture(match.captures, \"kwarg_name\");\n\n if (!clientNode || !methodNode || !keyNode || !kwargNameNode) {\n continue;\n }\n\n const clientName = extractClientName(\n clientNode,\n pm.config.detectNestedClients,\n );\n const method = methodNode.text;\n\n if (!clientName || !allClients.has(clientName)) {\n continue;\n }\n if (method !== \"capture\") {\n continue;\n }\n if (kwargNameNode.text !== \"event\") {\n continue;\n }\n\n const key = cleanStringValue(keyNode.text);\n const line = keyNode.startPosition.row;\n const dedupKey = `${line}:${key}`;\n if (seen.has(dedupKey)) {\n continue;\n }\n seen.add(dedupKey);\n\n calls.push({\n method,\n key,\n line,\n keyStartCol: keyNode.startPosition.column,\n keyEndCol: keyNode.endPosition.column,\n });\n }\n }\n }\n\n // Bare function calls from destructured methods: capture(\"event\")\n if (destructuredCapture.size > 0 || destructuredFlag.size > 0) {\n const bareQuery = pm.getQuery(lang, family.queries.bareFunctionCalls);\n if (bareQuery) {\n const matches = bareQuery.matches(tree.rootNode);\n for (const match of matches) {\n const funcNode = getCapture(match.captures, \"func_name\");\n const keyNode = getCapture(match.captures, \"key\");\n if (!funcNode || !keyNode) {\n continue;\n }\n\n const name = funcNode.text;\n if (destructuredCapture.has(name) || destructuredFlag.has(name)) {\n calls.push({\n method: name,\n key: cleanStringValue(keyNode.text),\n line: keyNode.startPosition.row,\n keyStartCol: keyNode.startPosition.column,\n keyEndCol: keyNode.endPosition.column,\n });\n }\n }\n }\n }\n\n // Additional flag functions: useFeatureFlag(\"key\"), etc.\n if (\n pm.config.additionalFlagFunctions.length > 0 &&\n family.queries.bareFunctionCalls\n ) {\n const additionalFlagFuncs = new Set(pm.config.additionalFlagFunctions);\n const bareQuery = pm.getQuery(lang, family.queries.bareFunctionCalls);\n if (bareQuery) {\n const matches = bareQuery.matches(tree.rootNode);\n for (const match of matches) {\n const funcNode = getCapture(match.captures, \"func_name\");\n const keyNode = getCapture(match.captures, \"key\");\n if (!funcNode || !keyNode) {\n continue;\n }\n\n if (additionalFlagFuncs.has(funcNode.text)) {\n calls.push({\n method: funcNode.text,\n key: cleanStringValue(keyNode.text),\n line: keyNode.startPosition.row,\n keyStartCol: keyNode.startPosition.column,\n keyEndCol: keyNode.endPosition.column,\n });\n }\n }\n }\n }\n\n // Resolve calls with identifier first argument: posthog.capture(MY_CONST) / posthog.getFeatureFlag(FLAG_KEY)\n const constantMap = buildConstantMap(pm, lang, tree);\n if (constantMap.size > 0) {\n const identArgQuery = pm.getQuery(lang, family.queries.identifierArgCalls);\n if (identArgQuery) {\n const identMatches = identArgQuery.matches(tree.rootNode);\n for (const match of identMatches) {\n const clientNode = getCapture(match.captures, \"client\");\n const methodNode = getCapture(match.captures, \"method\");\n const argNode = getCapture(match.captures, \"arg_id\");\n if (!clientNode || !methodNode || !argNode) {\n continue;\n }\n\n const clientName = extractClientName(\n clientNode,\n pm.config.detectNestedClients,\n );\n const method = methodNode.text;\n if (!clientName || !allClients.has(clientName)) {\n continue;\n }\n if (!family.allMethods.has(method)) {\n continue;\n }\n\n const resolved = constantMap.get(argNode.text);\n if (!resolved) {\n continue;\n }\n\n const line = argNode.startPosition.row;\n const dedupKey = `${line}:${resolved}`;\n if (seen.has(dedupKey)) {\n continue;\n }\n seen.add(dedupKey);\n\n calls.push({\n method,\n key: resolved,\n line,\n keyStartCol: argNode.startPosition.column,\n keyEndCol: argNode.endPosition.column,\n });\n }\n }\n }\n\n // Detect dynamic capture calls (non-string first argument)\n const matchedLines = new Set(calls.map((c) => c.line));\n const dynamicQuery = pm.getQuery(lang, family.queries.dynamicCalls);\n if (dynamicQuery) {\n const matches = dynamicQuery.matches(tree.rootNode);\n for (const match of matches) {\n const clientNode = getCapture(match.captures, \"client\");\n const methodNode = getCapture(match.captures, \"method\");\n const firstArgNode = getCapture(match.captures, \"first_arg\");\n if (!clientNode || !methodNode || !firstArgNode) {\n continue;\n }\n\n const clientName = extractClientName(\n clientNode,\n pm.config.detectNestedClients,\n );\n const method = methodNode.text;\n if (!clientName || !allClients.has(clientName)) {\n continue;\n }\n if (!family.captureMethods.has(method)) {\n continue;\n }\n\n const line = firstArgNode.startPosition.row;\n if (matchedLines.has(line)) {\n continue;\n } // already matched with a string key\n\n calls.push({\n method,\n key: \"\",\n line,\n keyStartCol: firstArgNode.startPosition.column,\n keyEndCol: firstArgNode.endPosition.column,\n dynamic: true,\n });\n matchedLines.add(line);\n }\n }\n\n return calls;\n}\n\nexport async function findInitCalls(\n pm: ParserManager,\n source: string,\n languageId: string,\n): Promise<PostHogInitCall[]> {\n const ready = await pm.ensureReady(languageId);\n if (!ready) {\n return [];\n }\n\n const { lang } = ready;\n const tree = pm.parse(source, lang);\n if (!tree) {\n return [];\n }\n\n const allClients = getEffectiveClients(pm.config);\n const results: PostHogInitCall[] = [];\n const seenLines = new Set<number>();\n\n // Pattern 1: posthog.init('token', { ... })\n const initQueryStr = `\n (call_expression\n function: (member_expression\n object: (_) @client\n property: (property_identifier) @method)\n arguments: (arguments\n (string (string_fragment) @token)\n (object)? @config)) @call\n `;\n\n const initQuery = pm.getQuery(lang, initQueryStr);\n if (initQuery) {\n for (const match of initQuery.matches(tree.rootNode)) {\n const clientNode = getCapture(match.captures, \"client\");\n const methodNode = getCapture(match.captures, \"method\");\n const tokenNode = getCapture(match.captures, \"token\");\n const configNode = getCapture(match.captures, \"config\");\n\n if (!clientNode || !methodNode || !tokenNode) {\n continue;\n }\n if (methodNode.text !== \"init\") {\n continue;\n }\n\n const clientName = extractClientName(\n clientNode,\n pm.config.detectNestedClients,\n );\n if (!clientName || !allClients.has(clientName)) {\n continue;\n }\n\n results.push(buildInitCall(tokenNode, configNode ?? undefined));\n }\n }\n\n // Pattern 2: new PostHog('token', { ... }) — Node SDK\n const constructorQueryStr = `\n (new_expression\n constructor: (identifier) @class_name\n arguments: (arguments\n (string (string_fragment) @token)\n (object)? @config)) @call\n `;\n\n const ctorQuery = pm.getQuery(lang, constructorQueryStr);\n if (ctorQuery) {\n for (const match of ctorQuery.matches(tree.rootNode)) {\n const classNode = getCapture(match.captures, \"class_name\");\n const tokenNode = getCapture(match.captures, \"token\");\n const configNode = getCapture(match.captures, \"config\");\n\n if (!classNode || !tokenNode) {\n continue;\n }\n if (!POSTHOG_CLASS_NAMES.has(classNode.text)) {\n continue;\n }\n\n results.push(buildInitCall(tokenNode, configNode ?? undefined));\n }\n }\n\n // Pattern 3a: Posthog('phc_token', host='...') — positional token\n const pyCtorQueryStr = `\n (call\n function: (identifier) @class_name\n arguments: (argument_list\n (string (string_content) @token))) @call\n `;\n\n // Pattern 3b: Posthog(api_key='phc_token', host='...') — keyword token\n const pyCtorKwQueryStr = `\n (call\n function: (identifier) @class_name\n arguments: (argument_list\n (keyword_argument\n name: (identifier) @kw_name\n value: (string (string_content) @token)))) @call\n `;\n\n const pyCtorKwQuery = pm.getQuery(lang, pyCtorKwQueryStr);\n if (pyCtorKwQuery) {\n for (const match of pyCtorKwQuery.matches(tree.rootNode)) {\n const classNode = getCapture(match.captures, \"class_name\");\n const kwNameNode = getCapture(match.captures, \"kw_name\");\n const tokenNode = getCapture(match.captures, \"token\");\n\n if (!classNode || !kwNameNode || !tokenNode) {\n continue;\n }\n if (!POSTHOG_CLASS_NAMES.has(classNode.text)) {\n continue;\n }\n if (\n kwNameNode.text !== \"api_key\" &&\n kwNameNode.text !== \"project_api_key\"\n ) {\n continue;\n }\n\n // Check we didn't already match this call via positional pattern\n const line = tokenNode.startPosition.row;\n if (seenLines.has(line)) {\n continue;\n }\n seenLines.add(line);\n\n // Extract other keyword args for config\n const callNode = getCapture(match.captures, \"call\");\n const configProperties = new Map<string, string>();\n let apiHost: string | null = null;\n\n if (callNode) {\n const argsNode = callNode.childForFieldName(\"arguments\");\n if (argsNode) {\n for (const child of argsNode.namedChildren) {\n if (child.type === \"keyword_argument\") {\n const nameNode = child.childForFieldName(\"name\");\n const valueNode = child.childForFieldName(\"value\");\n if (\n nameNode &&\n valueNode &&\n nameNode.text !== \"api_key\" &&\n nameNode.text !== \"project_api_key\"\n ) {\n const key = nameNode.text;\n let value = valueNode.text;\n if (valueNode.type === \"string\") {\n const content = valueNode.namedChildren.find(\n (c) => c.type === \"string_content\",\n );\n if (content) {\n value = content.text;\n }\n }\n configProperties.set(key, value);\n if (key === \"host\" || key === \"api_host\") {\n apiHost = value;\n }\n }\n }\n }\n }\n }\n\n results.push({\n token: cleanStringValue(tokenNode.text),\n tokenLine: tokenNode.startPosition.row,\n tokenStartCol: tokenNode.startPosition.column,\n tokenEndCol: tokenNode.endPosition.column,\n apiHost,\n configProperties,\n });\n }\n }\n\n const pyCtorQuery = pm.getQuery(lang, pyCtorQueryStr);\n if (pyCtorQuery) {\n for (const match of pyCtorQuery.matches(tree.rootNode)) {\n const classNode = getCapture(match.captures, \"class_name\");\n const tokenNode = getCapture(match.captures, \"token\");\n\n if (!classNode || !tokenNode) {\n continue;\n }\n if (!POSTHOG_CLASS_NAMES.has(classNode.text)) {\n continue;\n }\n\n // Extract keyword arguments for config\n const callNode = getCapture(match.captures, \"call\");\n const configProperties = new Map<string, string>();\n let apiHost: string | null = null;\n\n if (callNode) {\n const argsNode = callNode.childForFieldName(\"arguments\");\n if (argsNode) {\n for (const child of argsNode.namedChildren) {\n if (child.type === \"keyword_argument\") {\n const nameNode = child.childForFieldName(\"name\");\n const valueNode = child.childForFieldName(\"value\");\n if (nameNode && valueNode) {\n const key = nameNode.text;\n let value = valueNode.text;\n if (valueNode.type === \"string\") {\n const content = valueNode.namedChildren.find(\n (c) => c.type === \"string_content\",\n );\n if (content) {\n value = content.text;\n }\n }\n configProperties.set(key, value);\n if (key === \"host\" || key === \"api_host\") {\n apiHost = value;\n }\n }\n }\n }\n }\n }\n\n results.push({\n token: cleanStringValue(tokenNode.text),\n tokenLine: tokenNode.startPosition.row,\n tokenStartCol: tokenNode.startPosition.column,\n tokenEndCol: tokenNode.endPosition.column,\n apiHost,\n configProperties,\n });\n }\n }\n\n // Pattern 4: Go — posthog.New(\"phc_token\") or posthog.NewWithConfig(\"phc_token\", posthog.Config{Endpoint: \"...\"})\n const goCtorQueryStr = `\n (call_expression\n function: (selector_expression\n operand: (identifier) @pkg_name\n field: (field_identifier) @func_name)\n arguments: (argument_list\n (interpreted_string_literal) @token)) @call\n `;\n\n const goCtorQuery = pm.getQuery(lang, goCtorQueryStr);\n if (goCtorQuery) {\n for (const match of goCtorQuery.matches(tree.rootNode)) {\n const pkgNode = getCapture(match.captures, \"pkg_name\");\n const funcNode = getCapture(match.captures, \"func_name\");\n const tokenNode = getCapture(match.captures, \"token\");\n\n if (!pkgNode || !funcNode || !tokenNode) {\n continue;\n }\n if (pkgNode.text !== \"posthog\") {\n continue;\n }\n if (!GO_CONSTRUCTOR_NAMES.has(funcNode.text)) {\n continue;\n }\n\n const token = cleanStringValue(tokenNode.text);\n const line = tokenNode.startPosition.row;\n if (seenLines.has(line)) {\n continue;\n }\n seenLines.add(line);\n\n // Try to extract Endpoint from Config struct literal\n const configProperties = new Map<string, string>();\n let apiHost: string | null = null;\n\n const callNode = getCapture(match.captures, \"call\");\n if (callNode) {\n const argsNode = callNode.childForFieldName(\"arguments\");\n if (argsNode) {\n for (const arg of argsNode.namedChildren) {\n if (arg.type === \"composite_literal\") {\n const body = arg.childForFieldName(\"body\");\n if (body) {\n for (const elem of body.namedChildren) {\n if (elem.type === \"keyed_element\") {\n const children = elem.namedChildren;\n if (children.length >= 2) {\n const keyElem = children[0];\n const valElem = children[1];\n const keyId =\n keyElem.type === \"literal_element\"\n ? keyElem.namedChildren[0]?.text || keyElem.text\n : keyElem.text;\n const valText = cleanStringValue(valElem.text);\n if (keyId) {\n configProperties.set(keyId, valText);\n if (keyId === \"Endpoint\" || keyId === \"Host\") {\n apiHost = valText;\n }\n }\n }\n }\n }\n }\n }\n }\n }\n }\n\n results.push({\n token,\n tokenLine: tokenNode.startPosition.row,\n tokenStartCol: tokenNode.startPosition.column,\n tokenEndCol: tokenNode.endPosition.column,\n apiHost,\n configProperties,\n });\n }\n }\n\n // Pattern 5: Ruby — PostHog::Client.new(api_key: 'phc_token', host: '...')\n const rbCtorQueryStr = `\n (call\n receiver: (scope_resolution\n scope: (constant) @scope_name\n name: (constant) @class_name)\n method: (identifier) @method_name\n arguments: (argument_list\n (pair\n (hash_key_symbol) @kw_name\n (string (string_content) @token)))) @call\n `;\n const rbCtorQuery = pm.getQuery(lang, rbCtorQueryStr);\n if (rbCtorQuery) {\n for (const match of rbCtorQuery.matches(tree.rootNode)) {\n const scopeNode = getCapture(match.captures, \"scope_name\");\n const classNode = getCapture(match.captures, \"class_name\");\n const methodNode = getCapture(match.captures, \"method_name\");\n const kwNameNode = getCapture(match.captures, \"kw_name\");\n const tokenNode = getCapture(match.captures, \"token\");\n\n if (\n !scopeNode ||\n !classNode ||\n !methodNode ||\n !kwNameNode ||\n !tokenNode\n ) {\n continue;\n }\n if (!POSTHOG_CLASS_NAMES.has(scopeNode.text)) {\n continue;\n }\n if (classNode.text !== \"Client\") {\n continue;\n }\n if (methodNode.text !== \"new\") {\n continue;\n }\n if (kwNameNode.text !== \"api_key\") {\n continue;\n }\n\n const line = tokenNode.startPosition.row;\n if (seenLines.has(line)) {\n continue;\n }\n seenLines.add(line);\n\n // Extract other keyword args for config\n const callNode = getCapture(match.captures, \"call\");\n const configProperties = new Map<string, string>();\n let apiHost: string | null = null;\n\n if (callNode) {\n const argsNode = callNode.childForFieldName(\"arguments\");\n if (argsNode) {\n for (const child of argsNode.namedChildren) {\n if (child.type === \"pair\") {\n const keyN = child.namedChildren[0];\n const valueN = child.namedChildren[1];\n if (\n keyN?.type === \"hash_key_symbol\" &&\n valueN &&\n keyN.text !== \"api_key\"\n ) {\n const key = keyN.text;\n let value = valueN.text;\n if (valueN.type === \"string\") {\n const content = valueN.namedChildren.find(\n (c) => c.type === \"string_content\",\n );\n if (content) {\n value = content.text;\n }\n }\n configProperties.set(key, value);\n if (key === \"host\" || key === \"api_host\") {\n apiHost = value;\n }\n }\n }\n }\n }\n }\n\n results.push({\n token: cleanStringValue(tokenNode.text),\n tokenLine: tokenNode.startPosition.row,\n tokenStartCol: tokenNode.startPosition.column,\n tokenEndCol: tokenNode.endPosition.column,\n apiHost,\n configProperties,\n });\n }\n }\n\n return results;\n}\n\nfunction buildInitCall(\n tokenNode: Parser.SyntaxNode,\n configNode: Parser.SyntaxNode | undefined,\n): PostHogInitCall {\n const token = cleanStringValue(tokenNode.text);\n const configProperties = new Map<string, string>();\n let apiHost: string | null = null;\n\n if (configNode) {\n for (const child of configNode.namedChildren) {\n if (child.type === \"pair\") {\n const keyN = child.childForFieldName(\"key\");\n const valueN = child.childForFieldName(\"value\");\n if (keyN && valueN) {\n const key = keyN.text.replace(/['\"]/g, \"\");\n let value = valueN.text;\n if (valueN.type === \"string\") {\n const frag = valueN.namedChildren.find(\n (c) => c.type === \"string_fragment\",\n );\n if (frag) {\n value = frag.text;\n }\n }\n configProperties.set(key, value);\n if (key === \"api_host\" || key === \"host\") {\n apiHost = value;\n }\n }\n }\n }\n }\n\n return {\n token,\n tokenLine: tokenNode.startPosition.row,\n tokenStartCol: tokenNode.startPosition.column,\n tokenEndCol: tokenNode.endPosition.column,\n apiHost,\n configProperties,\n };\n}\n\nexport async function findFunctions(\n pm: ParserManager,\n source: string,\n languageId: string,\n): Promise<FunctionInfo[]> {\n const ready = await pm.ensureReady(languageId);\n if (!ready) {\n return [];\n }\n\n const { lang, family } = ready;\n const text = source;\n const tree = pm.parse(text, lang);\n if (!tree) {\n return [];\n }\n\n const query = pm.getQuery(lang, family.queries.functions);\n if (!query) {\n return [];\n }\n\n const functions: FunctionInfo[] = [];\n const matches = query.matches(tree.rootNode);\n\n for (const match of matches) {\n const nameNode = getCapture(match.captures, \"func_name\");\n const paramsNode = getCapture(match.captures, \"func_params\");\n const singleParamNode = getCapture(match.captures, \"func_single_param\");\n const bodyNode = getCapture(match.captures, \"func_body\");\n\n if (!nameNode || !bodyNode) {\n continue;\n }\n\n const name = nameNode.text;\n // Skip control flow keywords that might match method patterns\n if ([\"if\", \"for\", \"while\", \"switch\", \"catch\", \"else\"].includes(name)) {\n continue;\n }\n\n const params = singleParamNode\n ? [singleParamNode.text]\n : paramsNode\n ? extractParams(paramsNode.text)\n : [];\n\n const bodyLine = bodyNode.startPosition.row;\n const nextLineIdx = bodyLine + 1;\n const lines = text.split(\"\\n\");\n const nextLine = nextLineIdx < lines.length ? lines[nextLineIdx] : \"\";\n const bodyIndent = nextLine.match(/^(\\s*)/)?.[1] || \" \";\n\n functions.push({\n name,\n params,\n isComponent: /^[A-Z]/.test(name),\n bodyLine,\n bodyIndent,\n });\n }\n\n return functions;\n}\n\nexport async function findFlagAssignments(\n pm: ParserManager,\n source: string,\n languageId: string,\n): Promise<FlagAssignment[]> {\n const ready = await pm.ensureReady(languageId);\n if (!ready) {\n return [];\n }\n\n const { lang, family } = ready;\n const tree = pm.parse(source, lang);\n if (!tree) {\n return [];\n }\n\n const allClients = getEffectiveClients(pm.config);\n const { clientAliases } = findAliases(pm, lang, tree, family);\n for (const a of clientAliases) {\n allClients.add(a);\n }\n\n const assignments: FlagAssignment[] = [];\n\n const assignQuery = pm.getQuery(lang, family.queries.flagAssignments);\n if (assignQuery) {\n const matches = assignQuery.matches(tree.rootNode);\n for (const match of matches) {\n const varNode = getCapture(match.captures, \"var_name\");\n const clientNode = getCapture(match.captures, \"client\");\n const methodNode = getCapture(match.captures, \"method\");\n const keyNode = getCapture(match.captures, \"flag_key\");\n\n if (!varNode || !clientNode || !methodNode || !keyNode) {\n continue;\n }\n const varClientName = extractClientName(\n clientNode,\n pm.config.detectNestedClients,\n );\n if (!varClientName || !allClients.has(varClientName)) {\n continue;\n }\n\n const method = methodNode.text;\n if (!family.flagMethods.has(method)) {\n continue;\n }\n\n // Check if there's already a type annotation by looking at the parent\n // In TS: `const flag: boolean = ...` — the variable_declarator has a type_annotation child\n const declarator = varNode.parent;\n const hasTypeAnnotation = declarator\n ? declarator.namedChildren.some((c) => c.type === \"type_annotation\")\n : false;\n\n assignments.push({\n varName: varNode.text,\n method,\n flagKey: cleanStringValue(keyNode.text),\n line: varNode.startPosition.row,\n varNameEndCol: varNode.endPosition.column,\n hasTypeAnnotation,\n });\n }\n }\n\n return assignments;\n}\n","import { existsSync } from \"node:fs\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport Parser from \"web-tree-sitter\";\nimport type { LangFamily } from \"./languages.js\";\nimport { LANG_FAMILIES } from \"./languages.js\";\nimport { warn } from \"./log.js\";\nimport type { DetectionConfig } from \"./types.js\";\nimport { DEFAULT_CONFIG } from \"./types.js\";\n\nfunction resolveGrammarsDir(): string {\n const thisFile = fileURLToPath(import.meta.url);\n const dir = path.dirname(thisFile);\n const candidates = [\n path.join(dir, \"..\", \"grammars\"),\n path.join(dir, \"grammars\"),\n path.join(dir, \"..\", \"..\", \"grammars\"),\n ];\n return candidates.find((p) => existsSync(p)) ?? candidates[0];\n}\n\nexport class ParserManager {\n private parser: Parser | null = null;\n private languages = new Map<string, Parser.Language>();\n private queryCache = new Map<string, Parser.Query>();\n private maxCacheSize = 256;\n private initPromise: Promise<void> | null = null;\n private wasmDir = resolveGrammarsDir();\n config: DetectionConfig = DEFAULT_CONFIG;\n\n updateConfig(config: DetectionConfig): void {\n this.config = config;\n this.queryCache.clear();\n }\n\n private async ensureInitialized(): Promise<void> {\n if (!this.initPromise) {\n this.initPromise = this.doInit();\n }\n return this.initPromise;\n }\n\n private async doInit(): Promise<void> {\n try {\n await Parser.init({\n locateFile: (scriptName: string) => path.join(this.wasmDir, scriptName),\n });\n this.parser = new Parser();\n } catch (err) {\n this.initPromise = null;\n warn(\"Failed to initialize tree-sitter parser\", err);\n throw err;\n }\n }\n\n isSupported(langId: string): boolean {\n return langId in LANG_FAMILIES;\n }\n\n get supportedLanguages(): string[] {\n return Object.keys(LANG_FAMILIES);\n }\n\n async ensureReady(\n langId: string,\n ): Promise<{ lang: Parser.Language; family: LangFamily } | null> {\n await this.ensureInitialized();\n if (!this.parser) {\n return null;\n }\n\n const family = LANG_FAMILIES[langId];\n if (!family) {\n return null;\n }\n\n let lang = this.languages.get(family.wasm);\n if (!lang) {\n try {\n const wasmPath = path.join(this.wasmDir, family.wasm);\n lang = await Parser.Language.load(wasmPath);\n this.languages.set(family.wasm, lang);\n } catch (err) {\n warn(`Failed to load grammar ${family.wasm}`, err);\n return null;\n }\n }\n\n return { lang, family };\n }\n\n parse(text: string, lang: Parser.Language): Parser.Tree | null {\n if (!this.parser) {\n return null;\n }\n this.parser.setLanguage(lang);\n return this.parser.parse(text);\n }\n\n getQuery(lang: Parser.Language, queryStr: string): Parser.Query | null {\n if (!queryStr.trim()) {\n return null;\n }\n\n const cacheKey = `${lang.toString()}:${queryStr}`;\n let query = this.queryCache.get(cacheKey);\n if (query) {\n // LRU: move to end by deleting and re-inserting\n this.queryCache.delete(cacheKey);\n this.queryCache.set(cacheKey, query);\n return query;\n }\n\n try {\n query = lang.query(queryStr);\n // Evict oldest entry if at capacity\n if (this.queryCache.size >= this.maxCacheSize) {\n const oldest = this.queryCache.keys().next().value;\n if (oldest !== undefined) {\n this.queryCache.delete(oldest);\n }\n }\n this.queryCache.set(cacheKey, query);\n return query;\n } catch (err) {\n warn(\"Query compilation failed\", err);\n return null;\n }\n }\n\n dispose(): void {\n this.parser?.delete();\n this.parser = null;\n this.initPromise = null;\n this.languages.clear();\n this.queryCache.clear();\n }\n}\n","export interface DetectorLogger {\n warn(message: string, ...args: unknown[]): void;\n}\n\nconst noop: DetectorLogger = {\n warn() {},\n};\n\nlet current: DetectorLogger = noop;\n\nexport function setLogger(logger: DetectorLogger): void {\n current = logger;\n}\n\nexport function warn(message: string, ...args: unknown[]): void {\n current.warn(message, ...args);\n}\n","// ── Detection result types ──\n\nexport interface PostHogCall {\n method: string;\n key: string;\n line: number;\n keyStartCol: number;\n keyEndCol: number;\n /** True when the first argument is a non-literal expression (ternary, variable, etc.) */\n dynamic?: boolean;\n}\n\nexport interface FunctionInfo {\n name: string;\n params: string[];\n isComponent: boolean;\n bodyLine: number;\n bodyIndent: string;\n}\n\nexport interface VariantBranch {\n flagKey: string;\n variantKey: string;\n conditionLine: number;\n startLine: number;\n endLine: number;\n}\n\nexport interface FlagAssignment {\n varName: string;\n method: string;\n flagKey: string;\n line: number;\n varNameEndCol: number;\n hasTypeAnnotation: boolean;\n}\n\nexport interface PostHogInitCall {\n token: string;\n tokenLine: number;\n tokenStartCol: number;\n tokenEndCol: number;\n apiHost: string | null;\n configProperties: Map<string, string>;\n}\n\n// ── Detection configuration ──\n\nexport interface DetectionConfig {\n additionalClientNames: string[];\n additionalFlagFunctions: string[];\n detectNestedClients: boolean;\n onError?: (message: string, error?: unknown) => void;\n}\n\nexport const DEFAULT_CONFIG: DetectionConfig = {\n additionalClientNames: [],\n additionalFlagFunctions: [],\n detectNestedClients: true,\n};\n\n// ── Supported languages ──\n\nexport type SupportedLanguage =\n | \"javascript\"\n | \"javascriptreact\"\n | \"typescript\"\n | \"typescriptreact\"\n | \"python\"\n | \"go\"\n | \"ruby\";\n\n// ── PostHog entity types (for flag classification / stale detection) ──\n\nexport interface FeatureFlag {\n id: number;\n key: string;\n name: string;\n active: boolean;\n filters: Record<string, unknown>;\n created_at: string;\n created_by: { email: string; first_name: string } | null;\n deleted: boolean;\n}\n\nexport interface Experiment {\n id: number;\n name: string;\n description: string | null;\n start_date: string | null;\n end_date: string | null;\n feature_flag_key: string;\n created_at: string;\n created_by: { email: string; first_name: string } | null;\n metrics?: ExperimentMetric[];\n metrics_secondary?: ExperimentMetric[];\n parameters?: {\n feature_flag_variants?: { key: string; rollout_percentage: number }[];\n recommended_sample_size?: number;\n };\n conclusion?:\n | \"won\"\n | \"lost\"\n | \"inconclusive\"\n | \"stopped_early\"\n | \"invalid\"\n | null;\n conclusion_comment?: string | null;\n}\n\nexport interface ExperimentMetric {\n name: string;\n metric_type: \"funnel\" | \"mean\" | \"ratio\" | \"retention\";\n goal: \"increase\" | \"decrease\";\n uuid: string;\n}\n\nexport interface EventDefinition {\n id: string;\n name: string;\n description?: string | null;\n tags: string[];\n last_seen_at: string | null;\n verified?: boolean;\n hidden?: boolean;\n}\n\n// ── Stale flag types ──\n\nexport type StalenessReason =\n | \"fully_rolled_out\"\n | \"inactive\"\n | \"not_in_posthog\"\n | \"experiment_complete\";\n\nexport type FlagType = \"boolean\" | \"multivariate\" | \"remote_config\";\n\n// ── Enricher types ──\n\nexport interface CapturedEvent {\n name: string;\n line: number;\n dynamic: boolean;\n}\n\nexport interface FlagCheck {\n method: string;\n flagKey: string;\n line: number;\n}\n\nexport interface ListItem {\n type: \"event\" | \"flag\" | \"init\";\n line: number;\n name: string;\n method: string;\n detail?: string;\n}\n\nexport interface EnrichedListItem extends ListItem {\n flagType?: FlagType;\n staleness?: StalenessReason | null;\n rollout?: number | null;\n experimentName?: string | null;\n experimentStatus?: \"running\" | \"complete\" | null;\n verified?: boolean;\n description?: string | null;\n volume?: number;\n uniqueUsers?: number;\n lastSeenAt?: string | null;\n tags?: string[];\n}\n\nexport interface EventStats {\n volume?: number;\n uniqueUsers?: number;\n lastSeenAt?: string | null;\n}\n\nexport interface EnrichmentContext {\n flags?: Map<string, FeatureFlag>;\n experiments?: Experiment[];\n eventDefinitions?: Map<string, EventDefinition>;\n eventStats?: Map<string, EventStats>;\n stalenessOptions?: StalenessCheckOptions;\n}\n\nexport interface StalenessCheckOptions {\n staleFlagAgeDays?: number;\n}\n\nexport interface EnrichedFlag {\n flagKey: string;\n occurrences: FlagCheck[];\n flag: FeatureFlag | undefined;\n flagType: FlagType;\n staleness: StalenessReason | null;\n rollout: number | null;\n variants: { key: string; rollout_percentage: number }[];\n experiment: Experiment | undefined;\n}\n\nexport interface EnrichedEvent {\n eventName: string;\n occurrences: CapturedEvent[];\n definition: EventDefinition | undefined;\n verified: boolean;\n lastSeenAt: string | null;\n tags: string[];\n stats: EventStats | undefined;\n}\n\n// ── API configuration ──\n\nexport interface EnricherApiConfig {\n apiKey: string;\n host: string;\n projectId: number;\n /** Timeout in ms for each API request (default: 10 000). */\n timeoutMs?: number;\n}\n","import type Parser from \"web-tree-sitter\";\nimport {\n buildConstantMap,\n findAliases,\n getEffectiveClients,\n} from \"./alias-resolver.js\";\nimport {\n cleanStringValue,\n extractClientName,\n extractIdentifier,\n extractStringFromCaseValue,\n extractStringFromNode,\n getCapture,\n walkNodes,\n} from \"./ast-helpers.js\";\nimport type { LangFamily } from \"./languages.js\";\nimport type { ParserManager } from \"./parser-manager.js\";\nimport type { VariantBranch } from \"./types.js\";\n\nexport async function findVariantBranches(\n pm: ParserManager,\n source: string,\n languageId: string,\n): Promise<VariantBranch[]> {\n const ready = await pm.ensureReady(languageId);\n if (!ready) {\n return [];\n }\n\n const { lang, family } = ready;\n const tree = pm.parse(source, lang);\n if (!tree) {\n return [];\n }\n\n const allClients = getEffectiveClients(pm.config);\n const { clientAliases } = findAliases(pm, lang, tree, family);\n for (const a of clientAliases) {\n allClients.add(a);\n }\n\n const branches: VariantBranch[] = [];\n\n // 1. Find flag variable assignments: const variant = posthog.getFeatureFlag(\"key\")\n const assignQuery = pm.getQuery(lang, family.queries.flagAssignments);\n if (assignQuery) {\n const matches = assignQuery.matches(tree.rootNode);\n for (const match of matches) {\n const varNode = getCapture(match.captures, \"var_name\");\n const clientNode = getCapture(match.captures, \"client\");\n const methodNode = getCapture(match.captures, \"method\");\n const keyNode = getCapture(match.captures, \"flag_key\");\n const assignNode = getCapture(match.captures, \"assignment\");\n\n if (!varNode || !clientNode || !methodNode || !keyNode) {\n continue;\n }\n const varClientName = extractClientName(\n clientNode,\n pm.config.detectNestedClients,\n );\n if (!varClientName || !allClients.has(varClientName)) {\n continue;\n }\n\n const method = methodNode.text;\n if (!family.flagMethods.has(method)) {\n continue;\n }\n\n const varName = varNode.text;\n const flagKey = cleanStringValue(keyNode.text);\n const afterNode = assignNode ?? varNode;\n\n // Find if-chains and switches using this variable\n findIfChainsForVar(tree.rootNode, varName, flagKey, afterNode, branches);\n findSwitchForVar(tree.rootNode, varName, flagKey, afterNode, branches);\n }\n }\n\n // 1a. Resolve flag assignments with identifier arguments: const v = posthog.getFeatureFlag(MY_FLAG)\n const constantMap = buildConstantMap(pm, lang, tree);\n if (constantMap.size > 0) {\n let identAssignQueryStr: string;\n if (family.queries.rubyCaptureCalls !== undefined) {\n // Ruby: assignment with identifier or constant argument\n identAssignQueryStr = `\n (assignment\n left: (identifier) @var_name\n right: (call\n receiver: (_) @client\n method: (identifier) @method\n arguments: (argument_list . (identifier) @flag_id))) @assignment\n\n (assignment\n left: (identifier) @var_name\n right: (call\n receiver: (_) @client\n method: (identifier) @method\n arguments: (argument_list . (constant) @flag_id))) @assignment`;\n } else if (family.queries.pythonCaptureCalls !== undefined) {\n // Python: assignment with identifier argument\n identAssignQueryStr = `(expression_statement\n (assignment\n left: (identifier) @var_name\n right: (call\n function: (attribute\n object: (_) @client\n attribute: (identifier) @method)\n arguments: (argument_list . (identifier) @flag_id)))) @assignment`;\n } else {\n // JS: const/let/var with identifier argument\n identAssignQueryStr = `(lexical_declaration\n (variable_declarator\n name: (identifier) @var_name\n value: (call_expression\n function: (member_expression\n object: (_) @client\n property: (property_identifier) @method)\n arguments: (arguments . (identifier) @flag_id)))) @assignment\n\n (lexical_declaration\n (variable_declarator\n name: (identifier) @var_name\n value: (await_expression\n (call_expression\n function: (member_expression\n object: (_) @client\n property: (property_identifier) @method)\n arguments: (arguments . (identifier) @flag_id))))) @assignment\n\n (variable_declaration\n (variable_declarator\n name: (identifier) @var_name\n value: (call_expression\n function: (member_expression\n object: (_) @client\n property: (property_identifier) @method)\n arguments: (arguments . (identifier) @flag_id)))) @assignment\n\n (variable_declaration\n (variable_declarator\n name: (identifier) @var_name\n value: (await_expression\n (call_expression\n function: (member_expression\n object: (_) @client\n property: (property_identifier) @method)\n arguments: (arguments . (identifier) @flag_id))))) @assignment`;\n }\n const identAssignQuery = pm.getQuery(lang, identAssignQueryStr);\n if (identAssignQuery) {\n const matches = identAssignQuery.matches(tree.rootNode);\n for (const match of matches) {\n const varNode = getCapture(match.captures, \"var_name\");\n const clientNode = getCapture(match.captures, \"client\");\n const methodNode = getCapture(match.captures, \"method\");\n const argNode = getCapture(match.captures, \"flag_id\");\n const assignNode = getCapture(match.captures, \"assignment\");\n\n if (!varNode || !clientNode || !methodNode || !argNode) {\n continue;\n }\n const varClientName = extractClientName(\n clientNode,\n pm.config.detectNestedClients,\n );\n if (!varClientName || !allClients.has(varClientName)) {\n continue;\n }\n if (!family.flagMethods.has(methodNode.text)) {\n continue;\n }\n\n const resolved = constantMap.get(argNode.text);\n if (!resolved) {\n continue;\n }\n\n const varName = varNode.text;\n const afterNode = assignNode ?? varNode;\n findIfChainsForVar(\n tree.rootNode,\n varName,\n resolved,\n afterNode,\n branches,\n );\n findSwitchForVar(tree.rootNode, varName, resolved, afterNode, branches);\n }\n }\n }\n\n // 1b. Find bare function call assignments: const x = useFeatureFlag(\"key\")\n const bareFlagFunctions = new Set([\n ...pm.config.additionalFlagFunctions,\n \"useFeatureFlag\",\n \"useFeatureFlagPayload\",\n \"useFeatureFlagVariantKey\",\n ]);\n if (bareFlagFunctions.size > 0 && family.queries.bareFunctionCalls) {\n const bareAssignQueryStr =\n family.queries.pythonCaptureCalls !== undefined\n ? // Python: bare function assignment\n `(expression_statement\n (assignment\n left: (identifier) @var_name\n right: (call\n function: (identifier) @func_name\n arguments: (argument_list . (string (string_content) @flag_key))))) @assignment`\n : // JS: const/let/var bare function assignment\n `(lexical_declaration\n (variable_declarator\n name: (identifier) @var_name\n value: (call_expression\n function: (identifier) @func_name\n arguments: (arguments . (string (string_fragment) @flag_key))))) @assignment\n\n (variable_declaration\n (variable_declarator\n name: (identifier) @var_name\n value: (call_expression\n function: (identifier) @func_name\n arguments: (arguments . (string (string_fragment) @flag_key))))) @assignment`;\n const bareAssignQuery = pm.getQuery(lang, bareAssignQueryStr);\n if (bareAssignQuery) {\n const matches = bareAssignQuery.matches(tree.rootNode);\n for (const match of matches) {\n const varNode = getCapture(match.captures, \"var_name\");\n const funcNode = getCapture(match.captures, \"func_name\");\n const keyNode = getCapture(match.captures, \"flag_key\");\n const assignNode = getCapture(match.captures, \"assignment\");\n\n if (!varNode || !funcNode || !keyNode) {\n continue;\n }\n if (!bareFlagFunctions.has(funcNode.text)) {\n continue;\n }\n\n const varName = varNode.text;\n const flagKey = cleanStringValue(keyNode.text);\n const afterNode = assignNode ?? varNode;\n\n findIfChainsForVar(\n tree.rootNode,\n varName,\n flagKey,\n afterNode,\n branches,\n );\n findSwitchForVar(tree.rootNode, varName, flagKey, afterNode, branches);\n }\n }\n }\n\n // 2. Find inline flag checks: if (posthog.getFeatureFlag(\"key\") === \"variant\")\n const detectNested = pm.config.detectNestedClients;\n findInlineFlagIfs(tree.rootNode, allClients, family, branches, detectNested);\n\n // 3. Find isFeatureEnabled checks: if (posthog.isFeatureEnabled(\"key\"))\n findEnabledIfs(tree.rootNode, allClients, family, branches, detectNested);\n\n return branches;\n}\n\n// ── Variant detection helpers ──\n\nfunction findIfChainsForVar(\n _root: Parser.SyntaxNode,\n varName: string,\n flagKey: string,\n afterNode: Parser.SyntaxNode,\n branches: VariantBranch[],\n): void {\n // Find the containing scope\n const scope = afterNode.parent;\n if (!scope) {\n return;\n }\n\n let foundAssignment = false;\n for (const child of scope.namedChildren) {\n if (\n child.startIndex >= afterNode.startIndex &&\n child.endIndex >= afterNode.endIndex\n ) {\n foundAssignment = true;\n }\n if (!foundAssignment) {\n continue;\n }\n if (child === afterNode) {\n continue;\n }\n\n // JS/Go: if_statement, Ruby: if\n if (child.type === \"if_statement\" || child.type === \"if\") {\n extractIfChainBranches(child, varName, flagKey, branches);\n }\n }\n}\n\nfunction extractIfChainBranches(\n ifNode: Parser.SyntaxNode,\n varName: string,\n flagKey: string,\n branches: VariantBranch[],\n): void {\n const condition = ifNode.childForFieldName(\"condition\");\n const consequence = ifNode.childForFieldName(\"consequence\");\n const alternative = ifNode.childForFieldName(\"alternative\");\n\n if (!condition || !consequence) {\n return;\n }\n\n // Only process if the condition actually references the tracked variable\n if (\n !new RegExp(`\\\\b${varName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}\\\\b`).test(\n condition.text,\n )\n ) {\n return;\n }\n\n let variant = extractComparison(condition, varName);\n\n // Truthiness check: if (varName) or if (!varName)\n if (variant === null) {\n const isTruthinessCheck = isTruthinessCheckForVar(condition, varName);\n if (isTruthinessCheck) {\n const negated = isNegated(condition);\n variant = negated ? \"false\" : \"true\";\n }\n }\n\n if (variant === null) {\n return;\n }\n\n branches.push({\n flagKey,\n variantKey: variant,\n conditionLine: ifNode.startPosition.row,\n startLine: ifNode.startPosition.row,\n endLine: consequence.endPosition.row,\n });\n\n if (alternative) {\n // Python: elif_clause, Ruby: elsif — has condition, consequence, alternative\n if (alternative.type === \"elif_clause\" || alternative.type === \"elsif\") {\n extractIfChainBranches(alternative, varName, flagKey, branches);\n } else if (alternative.type === \"else_clause\") {\n // JS else_clause may wrap an if_statement (else if). Recurse if so.\n // Otherwise treat as terminal else (Python: body field; JS: statement_block).\n const innerIf = alternative.namedChildren.find(\n (c) => c.type === \"if_statement\",\n );\n if (innerIf) {\n extractIfChainBranches(innerIf, varName, flagKey, branches);\n } else {\n const body =\n alternative.childForFieldName(\"body\") || alternative.namedChildren[0];\n if (body) {\n const elseVariant =\n variant === \"true\"\n ? \"false\"\n : variant === \"false\"\n ? \"true\"\n : \"else\";\n branches.push({\n flagKey,\n variantKey: elseVariant,\n conditionLine: alternative.startPosition.row,\n startLine: alternative.startPosition.row,\n endLine: body.endPosition.row,\n });\n }\n }\n } else if (alternative.type === \"if_statement\") {\n // Go: else if — alternative is directly an if_statement\n extractIfChainBranches(alternative, varName, flagKey, branches);\n } else if (alternative.type === \"block\") {\n // Go: else { ... } — alternative is directly a block\n const elseVariant =\n variant === \"true\" ? \"false\" : variant === \"false\" ? \"true\" : \"else\";\n branches.push({\n flagKey,\n variantKey: elseVariant,\n conditionLine: alternative.startPosition.row,\n startLine: alternative.startPosition.row,\n endLine: alternative.endPosition.row,\n });\n } else if (alternative.type === \"else\") {\n // Ruby: else — children are direct statements (no body field)\n const lastChild =\n alternative.namedChildren[alternative.namedChildren.length - 1] ||\n alternative;\n const elseVariant =\n variant === \"true\" ? \"false\" : variant === \"false\" ? \"true\" : \"else\";\n branches.push({\n flagKey,\n variantKey: elseVariant,\n conditionLine: alternative.startPosition.row,\n startLine: alternative.startPosition.row,\n endLine: lastChild.endPosition.row,\n });\n }\n }\n}\n\nfunction findSwitchForVar(\n _root: Parser.SyntaxNode,\n varName: string,\n flagKey: string,\n afterNode: Parser.SyntaxNode,\n branches: VariantBranch[],\n): void {\n const scope = afterNode.parent;\n if (!scope) {\n return;\n }\n\n let foundAssignment = false;\n for (const child of scope.namedChildren) {\n if (child.startIndex >= afterNode.startIndex) {\n foundAssignment = true;\n }\n if (!foundAssignment || child === afterNode) {\n continue;\n }\n\n // JS/TS: switch_statement, Go: expression_switch_statement\n if (\n child.type === \"switch_statement\" ||\n child.type === \"expression_switch_statement\"\n ) {\n const value = child.childForFieldName(\"value\");\n if (!value) {\n continue;\n }\n\n // Check if switch is on our variable\n const switchedVar = extractIdentifier(value);\n if (switchedVar !== varName) {\n continue;\n }\n\n // JS/TS: cases are inside a 'body' (switch_body) node\n // Go: cases are direct children of the switch node\n const caseContainer = child.childForFieldName(\"body\") || child;\n\n for (const caseNode of caseContainer.namedChildren) {\n // JS/TS: switch_case, Go: expression_case\n if (\n caseNode.type === \"switch_case\" ||\n caseNode.type === \"expression_case\"\n ) {\n const caseValue = caseNode.childForFieldName(\"value\");\n const variantKey = caseValue\n ? extractStringFromCaseValue(caseValue)\n : null;\n\n // Get the body range: from case line to before next case or end of switch\n const nextSibling = caseNode.nextNamedSibling;\n const endLine = nextSibling\n ? nextSibling.startPosition.row - 1\n : caseContainer.endPosition.row - 1;\n\n branches.push({\n flagKey,\n variantKey: variantKey || \"default\",\n conditionLine: caseNode.startPosition.row,\n startLine: caseNode.startPosition.row,\n endLine,\n });\n // JS/TS: switch_default, Go: default_case\n } else if (\n caseNode.type === \"switch_default\" ||\n caseNode.type === \"default_case\"\n ) {\n const nextSibling = caseNode.nextNamedSibling;\n const endLine = nextSibling\n ? nextSibling.startPosition.row - 1\n : caseContainer.endPosition.row - 1;\n\n branches.push({\n flagKey,\n variantKey: \"default\",\n conditionLine: caseNode.startPosition.row,\n startLine: caseNode.startPosition.row,\n endLine,\n });\n }\n }\n }\n\n // Ruby: case/when/else\n if (child.type === \"case\") {\n const value = child.namedChildren[0]; // First named child is the matched expression\n if (!value || value.type === \"when\") {\n continue;\n } // case without value\n\n const switchedVar = extractIdentifier(value);\n if (switchedVar !== varName) {\n continue;\n }\n\n for (const caseChild of child.namedChildren) {\n if (caseChild.type === \"when\") {\n // when has pattern children and a body (then)\n const patterns = caseChild.namedChildren.filter(\n (c) => c.type === \"pattern\",\n );\n const body = caseChild.childForFieldName(\"body\");\n const firstPattern = patterns[0];\n const patternStr = firstPattern?.namedChildren[0];\n const variantKey = patternStr\n ? extractStringFromNode(patternStr)\n : null;\n\n const endLine = body\n ? body.endPosition.row\n : caseChild.endPosition.row;\n\n branches.push({\n flagKey,\n variantKey: variantKey || \"default\",\n conditionLine: caseChild.startPosition.row,\n startLine: caseChild.startPosition.row,\n endLine,\n });\n } else if (caseChild.type === \"else\") {\n const lastChild =\n caseChild.namedChildren[caseChild.namedChildren.length - 1] ||\n caseChild;\n branches.push({\n flagKey,\n variantKey: \"default\",\n conditionLine: caseChild.startPosition.row,\n startLine: caseChild.startPosition.row,\n endLine: lastChild.endPosition.row,\n });\n }\n }\n }\n }\n}\n\nfunction findInlineFlagIfs(\n root: Parser.SyntaxNode,\n clients: Set<string>,\n family: LangFamily,\n branches: VariantBranch[],\n detectNested: boolean,\n): void {\n // Walk all if_statements (JS/Go) and if nodes (Ruby) for inline flag comparisons\n const ifTypes = [\"if_statement\", \"if\"];\n for (const ifType of ifTypes) {\n walkNodes(root, ifType, (ifNode) => {\n const condition = ifNode.childForFieldName(\"condition\");\n const consequence = ifNode.childForFieldName(\"consequence\");\n if (!condition || !consequence) {\n return;\n }\n\n // Look for: getFeatureFlag(\"key\") === \"variant\"\n const callInfo = extractFlagCallComparison(\n condition,\n clients,\n family,\n detectNested,\n );\n if (!callInfo) {\n return;\n }\n\n branches.push({\n flagKey: callInfo.flagKey,\n variantKey: callInfo.variant,\n conditionLine: ifNode.startPosition.row,\n startLine: ifNode.startPosition.row,\n endLine: consequence.endPosition.row,\n });\n\n // Process else chain\n const alternative = ifNode.childForFieldName(\"alternative\");\n if (alternative) {\n // Python: elif_clause, Ruby: elsif\n if (\n alternative.type === \"elif_clause\" ||\n alternative.type === \"elsif\"\n ) {\n // walkNodes will find it via recursive walking\n } else if (alternative.type === \"else_clause\") {\n // JS else_clause may wrap another if_statement (else if).\n // Skip the else label in that case — walkNodes will visit the inner if.\n const innerIf = alternative.namedChildren.find(\n (c) => c.type === \"if_statement\",\n );\n if (!innerIf) {\n const body =\n alternative.childForFieldName(\"body\") ||\n alternative.namedChildren[0];\n if (body) {\n branches.push({\n flagKey: callInfo.flagKey,\n variantKey: \"else\",\n conditionLine: alternative.startPosition.row,\n startLine: alternative.startPosition.row,\n endLine: body.endPosition.row,\n });\n }\n }\n } else if (alternative.type === \"if_statement\") {\n // Go: else if — alternative is directly an if_statement (handled by walkNodes)\n } else if (alternative.type === \"block\") {\n // Go: else { ... } — alternative is directly a block\n branches.push({\n flagKey: callInfo.flagKey,\n variantKey: \"else\",\n conditionLine: alternative.startPosition.row,\n startLine: alternative.startPosition.row,\n endLine: alternative.endPosition.row,\n });\n } else if (alternative.type === \"else\") {\n // Ruby: else — children are direct statements\n const lastChild =\n alternative.namedChildren[alternative.namedChildren.length - 1] ||\n alternative;\n branches.push({\n flagKey: callInfo.flagKey,\n variantKey: \"else\",\n conditionLine: alternative.startPosition.row,\n startLine: alternative.startPosition.row,\n endLine: lastChild.endPosition.row,\n });\n }\n }\n });\n }\n\n // Python: also walk elif_clause nodes for inline flag comparisons\n walkNodes(root, \"elif_clause\", (elifNode) => {\n const condition = elifNode.childForFieldName(\"condition\");\n const consequence = elifNode.childForFieldName(\"consequence\");\n if (!condition || !consequence) {\n return;\n }\n\n const callInfo = extractFlagCallComparison(\n condition,\n clients,\n family,\n detectNested,\n );\n if (!callInfo) {\n return;\n }\n\n branches.push({\n flagKey: callInfo.flagKey,\n variantKey: callInfo.variant,\n conditionLine: elifNode.startPosition.row,\n startLine: elifNode.startPosition.row,\n endLine: consequence.endPosition.row,\n });\n\n const alternative = elifNode.childForFieldName(\"alternative\");\n if (alternative) {\n if (alternative.type === \"else_clause\") {\n const body =\n alternative.childForFieldName(\"body\") || alternative.namedChildren[0];\n if (body) {\n branches.push({\n flagKey: callInfo.flagKey,\n variantKey: \"else\",\n conditionLine: alternative.startPosition.row,\n startLine: alternative.startPosition.row,\n endLine: body.endPosition.row,\n });\n }\n }\n // elif_clause chaining: will be handled by walking all elif_clause nodes\n }\n });\n}\n\nfunction findEnabledIfs(\n root: Parser.SyntaxNode,\n clients: Set<string>,\n family: LangFamily,\n branches: VariantBranch[],\n detectNested: boolean,\n): void {\n const enabledIfTypes = [\"if_statement\", \"if\"];\n for (const ifType of enabledIfTypes) {\n walkNodes(root, ifType, (ifNode) => {\n const condition = ifNode.childForFieldName(\"condition\");\n const consequence = ifNode.childForFieldName(\"consequence\");\n if (!condition || !consequence) {\n return;\n }\n\n const flagKey = extractEnabledCall(\n condition,\n clients,\n family,\n detectNested,\n );\n if (!flagKey) {\n return;\n }\n\n // Check for negation\n const negated = isNegated(condition);\n\n branches.push({\n flagKey,\n variantKey: negated ? \"false\" : \"true\",\n conditionLine: ifNode.startPosition.row,\n startLine: ifNode.startPosition.row,\n endLine: consequence.endPosition.row,\n });\n\n const alternative = ifNode.childForFieldName(\"alternative\");\n if (alternative) {\n // Python: elif_clause, Ruby: elsif\n if (\n alternative.type === \"elif_clause\" ||\n alternative.type === \"elsif\"\n ) {\n // Handled by walk below\n } else if (alternative.type === \"else_clause\") {\n // JS else_clause may wrap another if_statement (else if).\n // Skip the else label in that case — walkNodes will visit the inner if.\n const innerIf = alternative.namedChildren.find(\n (c) => c.type === \"if_statement\",\n );\n if (!innerIf) {\n const body =\n alternative.childForFieldName(\"body\") ||\n alternative.namedChildren[0];\n if (body) {\n branches.push({\n flagKey,\n variantKey: negated ? \"true\" : \"false\",\n conditionLine: alternative.startPosition.row,\n startLine: alternative.startPosition.row,\n endLine: body.endPosition.row,\n });\n }\n }\n } else if (alternative.type === \"block\") {\n // Go: else { ... } — alternative is directly a block\n branches.push({\n flagKey,\n variantKey: negated ? \"true\" : \"false\",\n conditionLine: alternative.startPosition.row,\n startLine: alternative.startPosition.row,\n endLine: alternative.endPosition.row,\n });\n } else if (alternative.type === \"else\") {\n // Ruby: else — children are direct statements\n const lastChild =\n alternative.namedChildren[alternative.namedChildren.length - 1] ||\n alternative;\n branches.push({\n flagKey,\n variantKey: negated ? \"true\" : \"false\",\n conditionLine: alternative.startPosition.row,\n startLine: alternative.startPosition.row,\n endLine: lastChild.endPosition.row,\n });\n }\n }\n });\n }\n\n // Python/Ruby: also walk elif_clause/elsif nodes for enabled checks\n const elifTypes = [\"elif_clause\", \"elsif\"];\n for (const elifType of elifTypes) {\n walkNodes(root, elifType, (elifNode) => {\n const condition = elifNode.childForFieldName(\"condition\");\n const consequence = elifNode.childForFieldName(\"consequence\");\n if (!condition || !consequence) {\n return;\n }\n\n const flagKey = extractEnabledCall(\n condition,\n clients,\n family,\n detectNested,\n );\n if (!flagKey) {\n return;\n }\n\n const negated = isNegated(condition);\n\n branches.push({\n flagKey,\n variantKey: negated ? \"false\" : \"true\",\n conditionLine: elifNode.startPosition.row,\n startLine: elifNode.startPosition.row,\n endLine: consequence.endPosition.row,\n });\n\n const alternative = elifNode.childForFieldName(\"alternative\");\n if (alternative) {\n if (alternative.type === \"else_clause\") {\n const body =\n alternative.childForFieldName(\"body\") ||\n alternative.namedChildren[0];\n if (body) {\n branches.push({\n flagKey,\n variantKey: negated ? \"true\" : \"false\",\n conditionLine: alternative.startPosition.row,\n startLine: alternative.startPosition.row,\n endLine: body.endPosition.row,\n });\n }\n } else if (alternative.type === \"else\") {\n // Ruby: else\n const lastChild =\n alternative.namedChildren[alternative.namedChildren.length - 1] ||\n alternative;\n branches.push({\n flagKey,\n variantKey: negated ? \"true\" : \"false\",\n conditionLine: alternative.startPosition.row,\n startLine: alternative.startPosition.row,\n endLine: lastChild.endPosition.row,\n });\n }\n }\n });\n }\n}\n\n// ── Node extraction helpers ──\n\nfunction extractComparison(\n conditionNode: Parser.SyntaxNode,\n varName: string,\n): string | null {\n // Unwrap parenthesized_expression\n let node = conditionNode;\n while (\n node.type === \"parenthesized_expression\" &&\n node.namedChildren.length === 1\n ) {\n node = node.namedChildren[0];\n }\n\n // JS/Go: binary_expression, Ruby: binary\n if (node.type === \"binary_expression\" || node.type === \"binary\") {\n const left = node.childForFieldName(\"left\");\n const right = node.childForFieldName(\"right\");\n const op = node.childForFieldName(\"operator\");\n\n if (!left || !right) {\n return null;\n }\n\n const opText = op?.text || \"\";\n if (\n opText !== \"===\" &&\n opText !== \"==\" &&\n opText !== \"!==\" &&\n opText !== \"!=\"\n ) {\n return null;\n }\n\n if (left.text === varName) {\n return extractStringFromNode(right);\n }\n if (right.text === varName) {\n return extractStringFromNode(left);\n }\n }\n\n // Python: comparison_operator (e.g. `flag == \"variant\"`)\n if (node.type === \"comparison_operator\") {\n const children = node.namedChildren;\n // comparison_operator has: left_operand, operator(s), right_operand(s)\n // For simple `a == b`, children are [a, b] with operator tokens between\n if (children.length >= 2) {\n const left = children[0];\n const right = children[children.length - 1];\n // Check the operator text between operands\n const fullText = node.text;\n if (fullText.includes(\"==\") || fullText.includes(\"!=\")) {\n if (left.text === varName) {\n return extractStringFromNode(right);\n }\n if (right.text === varName) {\n return extractStringFromNode(left);\n }\n }\n }\n }\n\n return null;\n}\n\nfunction extractFlagCallComparison(\n conditionNode: Parser.SyntaxNode,\n clients: Set<string>,\n family: LangFamily,\n detectNested: boolean,\n): { flagKey: string; variant: string } | null {\n let node = conditionNode;\n while (\n node.type === \"parenthesized_expression\" &&\n node.namedChildren.length === 1\n ) {\n node = node.namedChildren[0];\n }\n\n let left: Parser.SyntaxNode | null = null;\n let right: Parser.SyntaxNode | null = null;\n\n // JS/Go: binary_expression, Ruby: binary, Python: comparison_operator\n if (node.type === \"binary_expression\" || node.type === \"binary\") {\n left = node.childForFieldName(\"left\");\n right = node.childForFieldName(\"right\");\n } else if (node.type === \"comparison_operator\") {\n // Python: comparison_operator children are [left_operand, right_operand]\n const children = node.namedChildren;\n if (children.length >= 2) {\n left = children[0];\n right = children[children.length - 1];\n }\n }\n\n if (!left || !right) {\n return null;\n }\n\n // Check if left is a posthog.getFeatureFlag(\"key\") call\n const callTypes = new Set([\"call_expression\", \"call\"]);\n const callNode = callTypes.has(left.type)\n ? left\n : callTypes.has(right.type)\n ? right\n : null;\n const valueNode = callNode === left ? right : left;\n if (!callNode || !valueNode) {\n return null;\n }\n\n let obj: Parser.SyntaxNode | null = null;\n let prop: Parser.SyntaxNode | null = null;\n\n const func = callNode.childForFieldName(\"function\");\n if (\n func &&\n (func.type === \"member_expression\" ||\n func.type === \"attribute\" ||\n func.type === \"selector_expression\")\n ) {\n obj = func.childForFieldName(\"object\") || func.childForFieldName(\"operand\");\n prop =\n func.childForFieldName(\"property\") ||\n func.childForFieldName(\"attribute\") ||\n func.childForFieldName(\"field\");\n } else {\n // Ruby: call has receiver + method as separate fields\n obj = callNode.childForFieldName(\"receiver\");\n prop = callNode.childForFieldName(\"method\");\n }\n if (!obj || !prop) {\n return null;\n }\n const extractedClient = extractClientName(obj, detectNested);\n if (!extractedClient || !clients.has(extractedClient)) {\n return null;\n }\n\n const method = prop.text;\n // Only match getFeatureFlag-like methods (not isFeatureEnabled which returns bool)\n const flagGetters = new Set(\n [...family.flagMethods].filter(\n (m) =>\n m.toLowerCase().includes(\"get\") || m.toLowerCase().includes(\"flag\"),\n ),\n );\n if (!flagGetters.has(method)) {\n return null;\n }\n\n const args = callNode.childForFieldName(\"arguments\");\n if (!args) {\n return null;\n }\n const firstArg = args.namedChildren[0];\n if (!firstArg) {\n return null;\n }\n\n const flagKey = extractStringFromNode(firstArg);\n const variant = extractStringFromNode(valueNode);\n if (!flagKey || !variant) {\n return null;\n }\n\n return { flagKey, variant };\n}\n\nfunction extractEnabledCall(\n conditionNode: Parser.SyntaxNode,\n clients: Set<string>,\n family: LangFamily,\n detectNested: boolean,\n): string | null {\n let node = conditionNode;\n // Unwrap parenthesized_expression and unary ! (negation)\n while (\n node.type === \"parenthesized_expression\" &&\n node.namedChildren.length === 1\n ) {\n node = node.namedChildren[0];\n }\n // JS: unary_expression, Python: not_operator, Ruby: unary\n if (\n node.type === \"unary_expression\" ||\n node.type === \"not_operator\" ||\n node.type === \"unary\"\n ) {\n const operand =\n node.childForFieldName(\"operand\") ||\n node.namedChildren[node.namedChildren.length - 1];\n if (operand) {\n node = operand;\n }\n }\n while (\n node.type === \"parenthesized_expression\" &&\n node.namedChildren.length === 1\n ) {\n node = node.namedChildren[0];\n }\n\n if (node.type !== \"call_expression\" && node.type !== \"call\") {\n return null;\n }\n\n let clientName: string | undefined;\n let methodName: string | undefined;\n\n const func = node.childForFieldName(\"function\");\n if (func) {\n if (\n func.type === \"member_expression\" ||\n func.type === \"attribute\" ||\n func.type === \"selector_expression\"\n ) {\n const obj =\n func.childForFieldName(\"object\") || func.childForFieldName(\"operand\");\n const prop =\n func.childForFieldName(\"property\") ||\n func.childForFieldName(\"attribute\") ||\n func.childForFieldName(\"field\");\n clientName = obj\n ? (extractClientName(obj, detectNested) ?? undefined)\n : undefined;\n methodName = prop?.text;\n }\n } else {\n // Ruby: call has receiver + method as separate fields\n const receiver = node.childForFieldName(\"receiver\");\n const method = node.childForFieldName(\"method\");\n if (receiver && method) {\n clientName = extractClientName(receiver, detectNested) ?? undefined;\n methodName = method.text;\n }\n }\n\n if (!clientName || !methodName || !clients.has(clientName)) {\n return null;\n }\n\n // Match isFeatureEnabled-like methods\n const enabledMethods = new Set(\n [...family.flagMethods].filter(\n (m) =>\n m.toLowerCase().includes(\"enabled\") ||\n m.toLowerCase().includes(\"is_feature\"),\n ),\n );\n if (!enabledMethods.has(methodName)) {\n return null;\n }\n\n const args = node.childForFieldName(\"arguments\");\n if (!args) {\n return null;\n }\n const firstArg = args.namedChildren[0];\n return firstArg ? extractStringFromNode(firstArg) : null;\n}\n\nfunction isNegated(conditionNode: Parser.SyntaxNode): boolean {\n let node = conditionNode;\n while (\n node.type === \"parenthesized_expression\" &&\n node.namedChildren.length === 1\n ) {\n node = node.namedChildren[0];\n }\n // JS: unary_expression, Python: not_operator, Ruby: unary\n return (\n (node.type === \"unary_expression\" && node.text.startsWith(\"!\")) ||\n node.type === \"not_operator\" ||\n (node.type === \"unary\" && node.text.startsWith(\"!\"))\n );\n}\n\n/** Check if a condition is a simple truthiness check on a variable: `if (varName)` or `if (!varName)` */\nfunction isTruthinessCheckForVar(\n conditionNode: Parser.SyntaxNode,\n varName: string,\n): boolean {\n let node = conditionNode;\n while (\n node.type === \"parenthesized_expression\" &&\n node.namedChildren.length === 1\n ) {\n node = node.namedChildren[0];\n }\n // if (varName)\n if (node.type === \"identifier\" && node.text === varName) {\n return true;\n }\n // if (!varName) — JS: unary_expression, Python: not_operator, Ruby: unary\n if (\n (node.type === \"unary_expression\" ||\n node.type === \"not_operator\" ||\n node.type === \"unary\") &&\n node.namedChildren.length > 0\n ) {\n let inner = node.namedChildren[node.namedChildren.length - 1];\n while (\n inner.type === \"parenthesized_expression\" &&\n inner.namedChildren.length === 1\n ) {\n inner = inner.namedChildren[0];\n }\n if (inner.type === \"identifier\" && inner.text === varName) {\n return true;\n }\n }\n return false;\n}\n\n/** Build a map of const/let/var identifier → string value from the file */\n","import {\n findFlagAssignments as _findFlagAssignments,\n findFunctions as _findFunctions,\n findInitCalls as _findInitCalls,\n findPostHogCalls as _findPostHogCalls,\n} from \"./call-detector.js\";\nimport { ParserManager } from \"./parser-manager.js\";\nimport type {\n DetectionConfig,\n FlagAssignment,\n FunctionInfo,\n PostHogCall,\n PostHogInitCall,\n VariantBranch,\n} from \"./types.js\";\nimport { findVariantBranches as _findVariantBranches } from \"./variant-detector.js\";\n\nexport class PostHogDetector {\n private pm = new ParserManager();\n\n updateConfig(config: DetectionConfig): void {\n this.pm.updateConfig(config);\n }\n\n isSupported(langId: string): boolean {\n return this.pm.isSupported(langId);\n }\n\n get supportedLanguages(): string[] {\n return this.pm.supportedLanguages;\n }\n\n async findPostHogCalls(\n source: string,\n languageId: string,\n ): Promise<PostHogCall[]> {\n return _findPostHogCalls(this.pm, source, languageId);\n }\n\n async findInitCalls(\n source: string,\n languageId: string,\n ): Promise<PostHogInitCall[]> {\n return _findInitCalls(this.pm, source, languageId);\n }\n\n async findFunctions(\n source: string,\n languageId: string,\n ): Promise<FunctionInfo[]> {\n return _findFunctions(this.pm, source, languageId);\n }\n\n async findVariantBranches(\n source: string,\n languageId: string,\n ): Promise<VariantBranch[]> {\n return _findVariantBranches(this.pm, source, languageId);\n }\n\n async findFlagAssignments(\n source: string,\n languageId: string,\n ): Promise<FlagAssignment[]> {\n return _findFlagAssignments(this.pm, source, languageId);\n }\n\n dispose(): void {\n this.pm.dispose();\n }\n}\n","import type { FeatureFlag, FlagType } from \"./types.js\";\n\n/** Classify a flag as boolean release, multivariate, or remote config */\nexport function classifyFlagType(flag: FeatureFlag | undefined): FlagType {\n if (!flag) {\n return \"boolean\";\n }\n const filters = flag.filters as Record<string, unknown> | undefined;\n if (filters?.multivariate && typeof filters.multivariate === \"object\") {\n const mv = filters.multivariate as { variants?: unknown[] };\n if (mv.variants && mv.variants.length > 0) {\n return \"multivariate\";\n }\n }\n if (filters?.payloads && typeof filters.payloads === \"object\") {\n const payloads = filters.payloads as Record<string, unknown>;\n if (Object.values(payloads).some((v) => v !== null && v !== undefined)) {\n return \"remote_config\";\n }\n }\n return \"boolean\";\n}\n\n/** Check if a flag is fully rolled out (100%, no conditions, no multivariate) */\nexport function isFullyRolledOut(flag: FeatureFlag): boolean {\n const filters = flag.filters as Record<string, unknown> | undefined;\n if (!filters) {\n return false;\n }\n\n if (filters.multivariate && typeof filters.multivariate === \"object\") {\n const mv = filters.multivariate as { variants?: unknown[] };\n if (mv.variants && mv.variants.length > 0) {\n return false;\n }\n }\n\n if (filters.groups && Array.isArray(filters.groups)) {\n const groups = filters.groups as Array<Record<string, unknown>>;\n if (groups.length === 0) {\n return false;\n }\n return groups.every((g) => {\n const rollout = g.rollout_percentage;\n const props = g.properties;\n const hasConditions = Array.isArray(props) && props.length > 0;\n return rollout === 100 && !hasConditions;\n });\n }\n\n return false;\n}\n\n/** Extract rollout percentage from a flag's filters */\nexport function extractRollout(flag: FeatureFlag): number | null {\n const filters = flag.filters as Record<string, unknown> | undefined;\n if (filters?.groups && Array.isArray(filters.groups)) {\n for (const group of filters.groups) {\n if (typeof group === \"object\" && group !== null) {\n const rp = (group as Record<string, unknown>).rollout_percentage;\n if (typeof rp === \"number\") {\n return rp;\n }\n }\n }\n }\n return null;\n}\n\n/** Extract multivariate variants from a flag */\nexport function extractVariants(\n flag: FeatureFlag,\n): { key: string; rollout_percentage: number }[] {\n const filters = flag.filters as Record<string, unknown> | undefined;\n if (filters?.multivariate && typeof filters.multivariate === \"object\") {\n const mv = filters.multivariate as {\n variants?: { key: string; rollout_percentage: number }[];\n };\n if (mv.variants && mv.variants.length > 0) {\n return mv.variants;\n }\n }\n return [];\n}\n\n/** Count release conditions (groups with property filters) */\nexport function extractConditionCount(flag: FeatureFlag): number {\n const filters = flag.filters as Record<string, unknown> | undefined;\n if (!filters?.groups || !Array.isArray(filters.groups)) {\n return 0;\n }\n return (filters.groups as Array<Record<string, unknown>>).filter(\n (g) =>\n g.properties &&\n Array.isArray(g.properties) &&\n (g.properties as unknown[]).length > 0,\n ).length;\n}\n","import { isFullyRolledOut } from \"./flag-classification.js\";\nimport type {\n Experiment,\n FeatureFlag,\n StalenessCheckOptions,\n StalenessReason,\n} from \"./types.js\";\n\n/** Classify why a flag key is stale, or return null if it's not stale. */\nexport function classifyStaleness(\n flagKey: string,\n flag: FeatureFlag | undefined,\n experiments: Experiment[],\n options: StalenessCheckOptions = {},\n): StalenessReason | null {\n if (!flag) {\n return \"not_in_posthog\";\n }\n\n if (!flag.active) {\n return \"inactive\";\n }\n\n const experiment = experiments.find((e) => e.feature_flag_key === flagKey);\n if (experiment?.end_date) {\n return \"experiment_complete\";\n }\n\n if (isFullyRolledOut(flag)) {\n const ageDays = options.staleFlagAgeDays ?? 30;\n if (ageDays > 0 && flag.created_at) {\n const createdAt = new Date(flag.created_at);\n const ageMs = Date.now() - createdAt.getTime();\n if (ageMs < ageDays * 86_400_000) {\n return null;\n }\n }\n return \"fully_rolled_out\";\n }\n\n return null;\n}\n\n/** Sort order for staleness reasons (most severe first) */\nexport const STALENESS_ORDER: Record<StalenessReason, number> = {\n not_in_posthog: 0,\n inactive: 1,\n experiment_complete: 2,\n fully_rolled_out: 3,\n};\n","import type { EnrichedEvent, EnrichedFlag, EnrichedListItem } from \"./types.js\";\n\nfunction commentPrefix(languageId: string): string {\n if (languageId === \"python\" || languageId === \"ruby\") {\n return \"#\";\n }\n return \"//\";\n}\n\nfunction formatFlagComment(flag: EnrichedFlag): string {\n const parts: string[] = [`Flag: \"${flag.flagKey}\"`];\n\n if (flag.flag) {\n parts.push(flag.flagType);\n if (flag.rollout !== null) {\n parts.push(`${flag.rollout}% rolled out`);\n }\n if (flag.experiment) {\n const status = flag.experiment.end_date ? \"complete\" : \"running\";\n parts.push(`Experiment: \"${flag.experiment.name}\" (${status})`);\n }\n if (flag.staleness) {\n parts.push(`STALE (${flag.staleness})`);\n }\n }\n\n return parts.join(\" \\u2014 \");\n}\n\nfunction formatEventComment(event: EnrichedEvent): string {\n const parts: string[] = [`Event: \"${event.eventName}\"`];\n if (event.verified) {\n parts.push(\"(verified)\");\n }\n if (event.stats?.volume !== undefined) {\n parts.push(`${event.stats.volume.toLocaleString()} events`);\n }\n if (event.stats?.uniqueUsers !== undefined) {\n parts.push(`${event.stats.uniqueUsers.toLocaleString()} users`);\n }\n if (event.definition?.description) {\n parts.push(event.definition.description);\n }\n return parts.join(\" \\u2014 \");\n}\n\nfunction buildCommentBody(\n item: EnrichedListItem,\n enrichedFlags: Map<string, EnrichedFlag>,\n enrichedEvents: Map<string, EnrichedEvent>,\n): string | null {\n if (item.type === \"flag\") {\n const flag = enrichedFlags.get(item.name);\n if (flag) return formatFlagComment(flag);\n return null;\n }\n if (item.type === \"event\") {\n const event = enrichedEvents.get(item.name);\n if (event) return formatEventComment(event);\n if (item.detail) return `Event: ${item.detail}`;\n return null;\n }\n if (item.type === \"init\") {\n return `Init: token \"${item.name}\"`;\n }\n return null;\n}\n\nexport function formatComments(\n source: string,\n languageId: string,\n items: EnrichedListItem[],\n enrichedFlags: Map<string, EnrichedFlag>,\n enrichedEvents: Map<string, EnrichedEvent>,\n): string {\n const prefix = commentPrefix(languageId);\n const lines = source.split(\"\\n\");\n const sorted = [...items].sort((a, b) => a.line - b.line);\n\n let offset = 0;\n\n for (const item of sorted) {\n const targetLine = item.line + offset;\n const body = buildCommentBody(item, enrichedFlags, enrichedEvents);\n if (!body) continue;\n\n const comment = `${prefix} [PostHog] ${body}`;\n const indent = lines[targetLine]?.match(/^(\\s*)/)?.[1] ?? \"\";\n lines.splice(targetLine, 0, `${indent}${comment}`);\n offset++;\n }\n\n return lines.join(\"\\n\");\n}\n\nexport function formatInlineComments(\n source: string,\n languageId: string,\n items: EnrichedListItem[],\n enrichedFlags: Map<string, EnrichedFlag>,\n enrichedEvents: Map<string, EnrichedEvent>,\n): string {\n const prefix = commentPrefix(languageId);\n const lines = source.split(\"\\n\");\n const byLine = new Map<number, string[]>();\n\n for (const item of items) {\n const body = buildCommentBody(item, enrichedFlags, enrichedEvents);\n if (!body) continue;\n const arr = byLine.get(item.line) ?? [];\n arr.push(body);\n byLine.set(item.line, arr);\n }\n\n for (const [lineIdx, bodies] of byLine) {\n if (lineIdx < 0 || lineIdx >= lines.length) continue;\n const suffix = ` ${prefix} [PostHog] ${bodies.join(\" | \")}`;\n lines[lineIdx] = `${lines[lineIdx]}${suffix}`;\n }\n\n return lines.join(\"\\n\");\n}\n","import { formatComments, formatInlineComments } from \"./comment-formatter.js\";\nimport {\n classifyFlagType,\n extractRollout,\n extractVariants,\n} from \"./flag-classification.js\";\nimport type { ParseResult } from \"./parse-result.js\";\nimport { classifyStaleness } from \"./stale-flags.js\";\nimport type {\n EnrichedEvent,\n EnrichedFlag,\n EnrichedListItem,\n EnrichmentContext,\n} from \"./types.js\";\n\nexport class EnrichedResult {\n private readonly parsed: ParseResult;\n private readonly context: EnrichmentContext;\n private cachedFlags: EnrichedFlag[] | null = null;\n private cachedEvents: EnrichedEvent[] | null = null;\n\n constructor(parsed: ParseResult, context: EnrichmentContext) {\n this.parsed = parsed;\n this.context = context;\n }\n\n get flags(): EnrichedFlag[] {\n if (this.cachedFlags) {\n return this.cachedFlags;\n }\n\n const flagMap = new Map<string, EnrichedFlag>();\n const checks = this.parsed.flagChecks;\n const experiments = this.context.experiments ?? [];\n\n for (const check of checks) {\n let entry = flagMap.get(check.flagKey);\n if (!entry) {\n const flag = this.context.flags?.get(check.flagKey);\n entry = {\n flagKey: check.flagKey,\n occurrences: [],\n flag,\n flagType: classifyFlagType(flag),\n staleness: classifyStaleness(\n check.flagKey,\n flag,\n experiments,\n this.context.stalenessOptions,\n ),\n rollout: flag ? extractRollout(flag) : null,\n variants: flag ? extractVariants(flag) : [],\n experiment: experiments.find(\n (e) => e.feature_flag_key === check.flagKey,\n ),\n };\n flagMap.set(check.flagKey, entry);\n }\n entry.occurrences.push(check);\n }\n\n this.cachedFlags = [...flagMap.values()];\n return this.cachedFlags;\n }\n\n get events(): EnrichedEvent[] {\n if (this.cachedEvents) {\n return this.cachedEvents;\n }\n\n const eventMap = new Map<string, EnrichedEvent>();\n const events = this.parsed.events;\n\n for (const event of events) {\n if (event.dynamic) {\n continue;\n }\n let entry = eventMap.get(event.name);\n if (!entry) {\n const definition = this.context.eventDefinitions?.get(event.name);\n const stats = this.context.eventStats?.get(event.name);\n entry = {\n eventName: event.name,\n occurrences: [],\n definition,\n verified: definition?.verified ?? false,\n lastSeenAt: stats?.lastSeenAt ?? definition?.last_seen_at ?? null,\n tags: definition?.tags ?? [],\n stats,\n };\n eventMap.set(event.name, entry);\n }\n entry.occurrences.push(event);\n }\n\n this.cachedEvents = [...eventMap.values()];\n return this.cachedEvents;\n }\n\n toList(): EnrichedListItem[] {\n const baseList = this.parsed.toList();\n const _experiments = this.context.experiments ?? [];\n\n const flagLookup = new Map<string, EnrichedFlag>();\n for (const f of this.flags) {\n flagLookup.set(f.flagKey, f);\n }\n\n const eventLookup = new Map<string, EnrichedEvent>();\n for (const e of this.events) {\n eventLookup.set(e.eventName, e);\n }\n\n return baseList.map((item) => {\n const enriched: EnrichedListItem = { ...item };\n\n if (item.type === \"flag\") {\n const flag = flagLookup.get(item.name);\n if (flag) {\n enriched.flagType = flag.flagType;\n enriched.staleness = flag.staleness;\n enriched.rollout = flag.rollout;\n if (flag.experiment) {\n enriched.experimentName = flag.experiment.name;\n enriched.experimentStatus = flag.experiment.end_date\n ? \"complete\"\n : \"running\";\n }\n }\n } else if (item.type === \"event\") {\n const event = eventLookup.get(item.name);\n if (event) {\n enriched.verified = event.verified;\n enriched.description = event.definition?.description ?? null;\n enriched.lastSeenAt = event.lastSeenAt;\n enriched.tags = event.tags;\n enriched.volume = event.stats?.volume;\n enriched.uniqueUsers = event.stats?.uniqueUsers;\n }\n }\n\n return enriched;\n });\n }\n\n toComments(): string {\n const flagLookup = new Map<string, EnrichedFlag>();\n for (const f of this.flags) {\n flagLookup.set(f.flagKey, f);\n }\n\n const eventLookup = new Map<string, EnrichedEvent>();\n for (const e of this.events) {\n eventLookup.set(e.eventName, e);\n }\n\n return formatComments(\n this.parsed.source,\n this.parsed.languageId,\n this.toList(),\n flagLookup,\n eventLookup,\n );\n }\n\n toInlineComments(): string {\n const flagLookup = new Map<string, EnrichedFlag>();\n for (const f of this.flags) {\n flagLookup.set(f.flagKey, f);\n }\n\n const eventLookup = new Map<string, EnrichedEvent>();\n for (const e of this.events) {\n eventLookup.set(e.eventName, e);\n }\n\n return formatInlineComments(\n this.parsed.source,\n this.parsed.languageId,\n this.toList(),\n flagLookup,\n eventLookup,\n );\n }\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { PostHogDetector } from \"./detector.js\";\nimport { EXT_TO_LANG_ID } from \"./languages.js\";\nimport { warn } from \"./log.js\";\nimport { ParseResult } from \"./parse-result.js\";\nimport type { DetectionConfig } from \"./types.js\";\n\nexport class PostHogEnricher {\n private detector = new PostHogDetector();\n\n updateConfig(config: DetectionConfig): void {\n this.detector.updateConfig(config);\n }\n\n isSupported(langId: string): boolean {\n return this.detector.isSupported(langId);\n }\n\n get supportedLanguages(): string[] {\n return this.detector.supportedLanguages;\n }\n\n async parse(source: string, languageId: string): Promise<ParseResult> {\n const results = await Promise.allSettled([\n this.detector.findPostHogCalls(source, languageId),\n this.detector.findInitCalls(source, languageId),\n this.detector.findFlagAssignments(source, languageId),\n this.detector.findVariantBranches(source, languageId),\n this.detector.findFunctions(source, languageId),\n ]);\n\n const settled = results.map((r, i) => {\n if (r.status === \"fulfilled\") {\n return r.value;\n }\n const labels = [\n \"calls\",\n \"initCalls\",\n \"flagAssignments\",\n \"variantBranches\",\n \"functions\",\n ];\n warn(`enricher: ${labels[i]} detection failed`, r.reason);\n return [];\n });\n\n return new ParseResult(\n source,\n languageId,\n settled[0] as Awaited<ReturnType<PostHogDetector[\"findPostHogCalls\"]>>,\n settled[1] as Awaited<ReturnType<PostHogDetector[\"findInitCalls\"]>>,\n settled[2] as Awaited<ReturnType<PostHogDetector[\"findFlagAssignments\"]>>,\n settled[3] as Awaited<ReturnType<PostHogDetector[\"findVariantBranches\"]>>,\n settled[4] as Awaited<ReturnType<PostHogDetector[\"findFunctions\"]>>,\n );\n }\n\n async parseFile(filePath: string): Promise<ParseResult> {\n const ext = path.extname(filePath).toLowerCase();\n const languageId = EXT_TO_LANG_ID[ext];\n if (!languageId) {\n throw new Error(`Unsupported file extension: ${ext}`);\n }\n const source = await fs.readFile(filePath, \"utf-8\");\n return this.parse(source, languageId);\n }\n\n dispose(): void {\n this.detector.dispose();\n }\n}\n","import type {\n EnricherApiConfig,\n EventDefinition,\n EventStats,\n Experiment,\n FeatureFlag,\n} from \"./types.js\";\n\nexport class PostHogApi {\n private config: EnricherApiConfig;\n\n constructor(config: EnricherApiConfig) {\n this.config = config;\n }\n\n private get baseUrl(): string {\n const host = this.config.host.replace(/\\/$/, \"\");\n return `${host}/api/projects/${this.config.projectId}`;\n }\n\n private get signal(): AbortSignal {\n return AbortSignal.timeout(this.config.timeoutMs ?? 10_000);\n }\n\n private async get<T>(path: string): Promise<T> {\n const res = await fetch(`${this.baseUrl}${path}`, {\n headers: {\n Authorization: `Bearer ${this.config.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n signal: this.signal,\n });\n if (!res.ok) {\n throw new Error(\n `PostHog API error: ${res.status} ${res.statusText} on GET ${path}`,\n );\n }\n return res.json() as Promise<T>;\n }\n\n private async post<T>(path: string, body: unknown): Promise<T> {\n const res = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.config.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n signal: this.signal,\n });\n if (!res.ok) {\n throw new Error(\n `PostHog API error: ${res.status} ${res.statusText} on POST ${path}`,\n );\n }\n return res.json() as Promise<T>;\n }\n\n async getFeatureFlags(): Promise<FeatureFlag[]> {\n const data = await this.get<{ results: FeatureFlag[] }>(\n \"/feature_flags/?limit=500\",\n );\n return data.results.filter((f) => !f.deleted);\n }\n\n async getExperiments(): Promise<Experiment[]> {\n const data = await this.get<{ results: Experiment[] }>(\n \"/experiments/?limit=500\",\n );\n return data.results;\n }\n\n async getEventDefinitions(names?: string[]): Promise<EventDefinition[]> {\n let path = \"/event_definitions/?limit=500\";\n if (names && names.length > 0) {\n path += `&search=${encodeURIComponent(names.join(\",\"))}`;\n }\n const data = await this.get<{ results: EventDefinition[] }>(path);\n return data.results;\n }\n\n async getEventStats(\n eventNames: string[],\n daysBack = 30,\n ): Promise<Map<string, EventStats>> {\n if (eventNames.length === 0) {\n return new Map();\n }\n\n // HogQL over `/query/` rejects typed placeholders (`{name:Type}`) and\n // placeholder values in INTERVAL, so `days` is inlined (clamped).\n const days = Math.max(1, Math.min(365, Math.floor(daysBack)));\n const query = `\n SELECT\n event,\n count() AS volume,\n count(DISTINCT person_id) AS unique_users,\n max(timestamp) AS last_seen\n FROM events\n WHERE event IN {eventNames}\n AND timestamp >= now() - INTERVAL ${days} DAY\n GROUP BY event\n `;\n\n const data = await this.post<{\n results: [string, number, number, string][];\n }>(\"/query/\", {\n query: {\n kind: \"HogQLQuery\",\n query,\n values: { eventNames },\n },\n });\n\n const stats = new Map<string, EventStats>();\n for (const [event, volume, uniqueUsers, lastSeen] of data.results) {\n stats.set(event, {\n volume,\n uniqueUsers,\n lastSeenAt: lastSeen || null,\n });\n }\n return stats;\n }\n}\n","import { EnrichedResult } from \"./enriched-result.js\";\nimport { warn } from \"./log.js\";\nimport { PostHogApi } from \"./posthog-api.js\";\nimport type {\n CapturedEvent,\n EnricherApiConfig,\n EventStats,\n FlagAssignment,\n FlagCheck,\n FunctionInfo,\n ListItem,\n PostHogCall,\n PostHogInitCall,\n VariantBranch,\n} from \"./types.js\";\n\nconst CAPTURE_METHODS = new Set([\"capture\", \"Enqueue\"]);\n\nexport class ParseResult {\n readonly source: string;\n readonly languageId: string;\n readonly calls: readonly PostHogCall[];\n readonly initCalls: readonly PostHogInitCall[];\n readonly flagAssignments: readonly FlagAssignment[];\n readonly variantBranches: readonly VariantBranch[];\n readonly functions: readonly FunctionInfo[];\n\n constructor(\n source: string,\n languageId: string,\n calls: PostHogCall[],\n initCalls: PostHogInitCall[],\n flagAssignments: FlagAssignment[],\n variantBranches: VariantBranch[],\n functions: FunctionInfo[],\n ) {\n this.source = source;\n this.languageId = languageId;\n this.calls = calls;\n this.initCalls = initCalls;\n this.flagAssignments = flagAssignments;\n this.variantBranches = variantBranches;\n this.functions = functions;\n }\n\n get events(): CapturedEvent[] {\n return this.calls\n .filter((c) => CAPTURE_METHODS.has(c.method))\n .map((c) => ({\n name: c.key,\n line: c.line,\n dynamic: c.dynamic ?? false,\n }));\n }\n\n get flagChecks(): FlagCheck[] {\n return this.calls\n .filter((c) => !CAPTURE_METHODS.has(c.method))\n .map((c) => ({\n method: c.method,\n flagKey: c.key,\n line: c.line,\n }));\n }\n\n get flagKeys(): string[] {\n return [...new Set(this.flagChecks.map((c) => c.flagKey))];\n }\n\n get eventNames(): string[] {\n return [\n ...new Set(this.events.filter((e) => !e.dynamic).map((e) => e.name)),\n ];\n }\n\n toList(): ListItem[] {\n const items: ListItem[] = [];\n\n for (const init of this.initCalls) {\n items.push({\n type: \"init\",\n line: init.tokenLine,\n name: init.token,\n method: \"init\",\n });\n }\n\n for (const call of this.calls) {\n const isEvent = CAPTURE_METHODS.has(call.method);\n items.push({\n type: isEvent ? \"event\" : \"flag\",\n line: call.line,\n name: call.key,\n method: call.method,\n detail: call.dynamic ? \"dynamic event name\" : undefined,\n });\n }\n\n return items.sort((a, b) => a.line - b.line);\n }\n\n async enrichFromApi(config: EnricherApiConfig): Promise<EnrichedResult> {\n const api = new PostHogApi(config);\n const flagKeys = this.flagKeys;\n const eventNames = this.eventNames;\n\n const settled = await Promise.allSettled([\n flagKeys.length > 0 ? api.getFeatureFlags() : Promise.resolve([]),\n flagKeys.length > 0 ? api.getExperiments() : Promise.resolve([]),\n eventNames.length > 0\n ? api.getEventDefinitions(eventNames)\n : Promise.resolve([]),\n eventNames.length > 0\n ? api.getEventStats(eventNames)\n : Promise.resolve(new Map()),\n ]);\n\n const [flagsResult, experimentsResult, eventDefsResult, eventStatsResult] =\n settled;\n\n const labels = [\n \"getFeatureFlags\",\n \"getExperiments\",\n \"getEventDefinitions\",\n \"getEventStats\",\n ];\n settled.forEach((r, i) => {\n if (r.status === \"rejected\") {\n warn(`enricher: ${labels[i]} failed`, r.reason);\n }\n });\n\n const allFlags =\n flagsResult.status === \"fulfilled\" ? flagsResult.value : [];\n const allExperiments =\n experimentsResult.status === \"fulfilled\" ? experimentsResult.value : [];\n const allEventDefs =\n eventDefsResult.status === \"fulfilled\" ? eventDefsResult.value : [];\n const eventStats =\n eventStatsResult.status === \"fulfilled\"\n ? eventStatsResult.value\n : new Map<string, EventStats>();\n\n const flagKeySet = new Set(flagKeys);\n const flags = new Map(\n allFlags.filter((f) => flagKeySet.has(f.key)).map((f) => [f.key, f]),\n );\n\n const experiments = allExperiments.filter((e) =>\n flagKeySet.has(e.feature_flag_key),\n );\n\n const eventDefinitions = new Map(\n allEventDefs\n .filter((d) => eventNames.includes(d.name))\n .map((d) => [d.name, d]),\n );\n\n return new EnrichedResult(this, {\n flags,\n experiments,\n eventDefinitions,\n eventStats,\n });\n }\n}\n","import type { Logger } from \"./logger\";\n\n/**\n * Races an operation against a timeout.\n * Returns success with the value if the operation completes in time,\n * or timeout if the operation takes longer than the specified duration.\n */\nexport async function withTimeout<T>(\n operation: Promise<T>,\n timeoutMs: number,\n): Promise<{ result: \"success\"; value: T } | { result: \"timeout\" }> {\n const timeoutPromise = new Promise<{ result: \"timeout\" }>((resolve) =>\n setTimeout(() => resolve({ result: \"timeout\" }), timeoutMs),\n );\n const operationPromise = operation.then((value) => ({\n result: \"success\" as const,\n value,\n }));\n return Promise.race([operationPromise, timeoutPromise]);\n}\n\nexport const IS_ROOT =\n typeof process !== \"undefined\" &&\n (process.geteuid?.() ?? process.getuid?.()) === 0;\n\nexport function unreachable(value: never, logger: Logger): void {\n let valueAsString: string;\n try {\n valueAsString = JSON.stringify(value);\n } catch {\n valueAsString = String(value);\n }\n logger.error(`Unexpected case: ${valueAsString}`);\n}\n","export interface GatewayModel {\n id: string;\n owned_by: string;\n context_window: number;\n supports_streaming: boolean;\n supports_vision: boolean;\n}\n\ninterface GatewayModelsResponse {\n object: \"list\";\n data: GatewayModel[];\n}\n\nexport interface FetchGatewayModelsOptions {\n gatewayUrl: string;\n}\n\nexport const DEFAULT_GATEWAY_MODEL = \"claude-opus-4-7\";\n\nexport const DEFAULT_CODEX_MODEL = \"gpt-5.4\";\n\nexport const BLOCKED_MODELS = new Set([\"gpt-5-mini\", \"openai/gpt-5-mini\"]);\n\ntype ModelsListResponse =\n | {\n data?: Array<{ id?: string; owned_by?: string }>;\n models?: Array<{ id?: string; owned_by?: string }>;\n }\n | Array<{ id?: string; owned_by?: string }>;\n\nconst CACHE_TTL = 10 * 60 * 1000; // 10 minutes\n\nlet gatewayModelsCache: {\n models: GatewayModel[];\n expiry: number;\n url: string;\n} | null = null;\n\nexport async function fetchGatewayModels(\n options?: FetchGatewayModelsOptions,\n): Promise<GatewayModel[]> {\n const gatewayUrl = options?.gatewayUrl ?? process.env.ANTHROPIC_BASE_URL;\n if (!gatewayUrl) {\n return [];\n }\n\n if (\n gatewayModelsCache &&\n gatewayModelsCache.url === gatewayUrl &&\n Date.now() < gatewayModelsCache.expiry\n ) {\n return gatewayModelsCache.models;\n }\n\n const modelsUrl = `${gatewayUrl}/v1/models`;\n\n try {\n const response = await fetch(modelsUrl);\n\n if (!response.ok) {\n return [];\n }\n\n const data = (await response.json()) as GatewayModelsResponse;\n const models = (data.data ?? []).filter((m) => !BLOCKED_MODELS.has(m.id));\n gatewayModelsCache = {\n models,\n expiry: Date.now() + CACHE_TTL,\n url: gatewayUrl,\n };\n return models;\n } catch {\n return [];\n }\n}\n\nexport function isAnthropicModel(model: GatewayModel): boolean {\n if (model.owned_by) {\n return model.owned_by === \"anthropic\";\n }\n return model.id.startsWith(\"claude-\") || model.id.startsWith(\"anthropic/\");\n}\n\nexport function isOpenAIModel(model: GatewayModel): boolean {\n if (model.owned_by) {\n return model.owned_by === \"openai\";\n }\n return model.id.startsWith(\"gpt-\") || model.id.startsWith(\"openai/\");\n}\n\nexport interface ModelInfo {\n id: string;\n owned_by?: string;\n}\n\nlet modelsListCache: {\n models: ModelInfo[];\n expiry: number;\n url: string;\n} | null = null;\n\nexport async function fetchModelsList(\n options?: FetchGatewayModelsOptions,\n): Promise<ModelInfo[]> {\n const gatewayUrl = options?.gatewayUrl ?? process.env.ANTHROPIC_BASE_URL;\n if (!gatewayUrl) {\n return [];\n }\n\n if (\n modelsListCache &&\n modelsListCache.url === gatewayUrl &&\n Date.now() < modelsListCache.expiry\n ) {\n return modelsListCache.models;\n }\n\n try {\n const modelsUrl = `${gatewayUrl}/v1/models`;\n const response = await fetch(modelsUrl);\n if (!response.ok) {\n return [];\n }\n const data = (await response.json()) as ModelsListResponse;\n const models = Array.isArray(data)\n ? data\n : (data.data ?? data.models ?? []);\n const results: ModelInfo[] = [];\n for (const model of models) {\n const id = model?.id ? String(model.id) : \"\";\n if (!id) continue;\n results.push({ id, owned_by: model?.owned_by });\n }\n modelsListCache = {\n models: results,\n expiry: Date.now() + CACHE_TTL,\n url: gatewayUrl,\n };\n return results;\n } catch {\n return [];\n }\n}\n\nconst PROVIDER_NAMES: Record<string, string> = {\n anthropic: \"Anthropic\",\n openai: \"OpenAI\",\n \"google-vertex\": \"Gemini\",\n};\n\nexport function getProviderName(ownedBy: string): string {\n return PROVIDER_NAMES[ownedBy] ?? ownedBy;\n}\n\nconst PROVIDER_PREFIXES = [\"anthropic/\", \"openai/\", \"google-vertex/\"];\n\nexport function formatGatewayModelName(model: GatewayModel): string {\n return formatModelId(model.id);\n}\n\nexport function formatModelId(modelId: string): string {\n let cleanId = modelId;\n for (const prefix of PROVIDER_PREFIXES) {\n if (cleanId.startsWith(prefix)) {\n cleanId = cleanId.slice(prefix.length);\n break;\n }\n }\n\n cleanId = cleanId.replace(/(\\d)-(\\d)/g, \"$1.$2\");\n\n const words = cleanId.split(/[-_]/).map((word) => {\n if (word.match(/^[0-9.]+$/)) return word;\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n });\n\n return words.join(\" \");\n}\n","import type {\n Agent,\n AgentSideConnection,\n AuthenticateRequest,\n CancelNotification,\n InitializeRequest,\n InitializeResponse,\n NewSessionRequest,\n NewSessionResponse,\n PromptRequest,\n PromptResponse,\n ReadTextFileRequest,\n ReadTextFileResponse,\n SessionConfigSelectOption,\n SessionNotification,\n WriteTextFileRequest,\n WriteTextFileResponse,\n} from \"@agentclientprotocol/sdk\";\nimport {\n DEFAULT_GATEWAY_MODEL,\n fetchGatewayModels,\n formatGatewayModelName,\n type GatewayModel,\n isAnthropicModel,\n} from \"../gateway-models\";\nimport { Logger } from \"../utils/logger\";\n/**\n * Shared settings manager interface that both Claude's SettingsManager\n * and Codex's CodexSettingsManager implement. BaseAcpAgent only calls\n * dispose() on this; each adapter's Session type narrows it to the\n * concrete implementation.\n */\nexport interface BaseSettingsManager {\n dispose(): void;\n getCwd(): string;\n setCwd(cwd: string): Promise<void>;\n initialize(): Promise<void>;\n}\n\nexport interface BaseSession {\n notificationHistory: SessionNotification[];\n cancelled: boolean;\n interruptReason?: string;\n abortController: AbortController;\n settingsManager: BaseSettingsManager;\n}\n\nconst DEFAULT_CONTEXT_WINDOW = 200_000;\n\nexport abstract class BaseAcpAgent implements Agent {\n abstract readonly adapterName: string;\n protected session!: BaseSession;\n protected sessionId!: string;\n client: AgentSideConnection;\n logger: Logger;\n fileContentCache: { [key: string]: string } = {};\n protected gatewayModels: GatewayModel[] = [];\n\n constructor(client: AgentSideConnection) {\n this.client = client;\n this.logger = new Logger({ debug: true, prefix: \"[BaseAcpAgent]\" });\n }\n\n abstract initialize(request: InitializeRequest): Promise<InitializeResponse>;\n abstract newSession(params: NewSessionRequest): Promise<NewSessionResponse>;\n abstract prompt(params: PromptRequest): Promise<PromptResponse>;\n protected abstract interrupt(): Promise<void>;\n\n async cancel(params: CancelNotification): Promise<void> {\n if (this.sessionId !== params.sessionId) {\n throw new Error(\"Session ID mismatch\");\n }\n this.session.cancelled = true;\n const meta = params._meta as { interruptReason?: string } | undefined;\n if (meta?.interruptReason) {\n this.session.interruptReason = meta.interruptReason;\n }\n await this.interrupt();\n }\n\n async closeSession(): Promise<void> {\n try {\n // Abort first so in-flight HTTP requests are cancelled,\n // otherwise interrupt() deadlocks waiting for the query to stop\n // while the query waits on an API call that will never abort.\n this.session.abortController.abort();\n await this.cancel({ sessionId: this.sessionId });\n this.session.settingsManager.dispose();\n this.logger.info(\"Closed session\", { sessionId: this.sessionId });\n } catch (err) {\n this.logger.warn(\"Failed to close session\", {\n sessionId: this.sessionId,\n error: err,\n });\n }\n }\n\n hasSession(sessionId: string): boolean {\n return this.sessionId === sessionId;\n }\n\n appendNotification(\n sessionId: string,\n notification: SessionNotification,\n ): void {\n if (this.sessionId === sessionId) {\n this.session.notificationHistory.push(notification);\n }\n }\n\n async readTextFile(\n params: ReadTextFileRequest,\n ): Promise<ReadTextFileResponse> {\n const response = await this.client.readTextFile(params);\n if (!params.limit && !params.line) {\n this.fileContentCache[params.path] = response.content;\n }\n return response;\n }\n\n async writeTextFile(\n params: WriteTextFileRequest,\n ): Promise<WriteTextFileResponse> {\n const response = await this.client.writeTextFile(params);\n this.fileContentCache[params.path] = params.content;\n return response;\n }\n\n async authenticate(_params: AuthenticateRequest): Promise<void> {\n throw new Error(\"Method not implemented.\");\n }\n\n async getModelConfigOptions(currentModelOverride?: string): Promise<{\n currentModelId: string;\n options: SessionConfigSelectOption[];\n }> {\n this.gatewayModels = await fetchGatewayModels();\n\n const options = this.gatewayModels\n .filter((model) => isAnthropicModel(model))\n .map((model) => ({\n value: model.id,\n name: formatGatewayModelName(model),\n description: `Context: ${model.context_window.toLocaleString()} tokens`,\n }));\n\n const isAnthropicModelId = (modelId: string): boolean =>\n modelId.startsWith(\"claude-\") || modelId.startsWith(\"anthropic/\");\n\n let currentModelId = currentModelOverride ?? DEFAULT_GATEWAY_MODEL;\n\n if (!options.some((opt) => opt.value === currentModelId)) {\n if (!isAnthropicModelId(currentModelId)) {\n currentModelId = DEFAULT_GATEWAY_MODEL;\n }\n }\n\n if (!options.some((opt) => opt.value === currentModelId)) {\n options.unshift({\n value: currentModelId,\n name: currentModelId,\n description: \"Custom model\",\n });\n }\n\n return { currentModelId, options };\n }\n\n getContextWindowForModel(modelId: string): number {\n const match = this.gatewayModels.find((m) => m.id === modelId);\n return match?.context_window ?? DEFAULT_CONTEXT_WINDOW;\n }\n}\n","import * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { PromptRequest } from \"@agentclientprotocol/sdk\";\nimport type { SDKUserMessage } from \"@anthropic-ai/claude-agent-sdk\";\nimport type { ContentBlockParam } from \"@anthropic-ai/sdk/resources\";\n\ntype ImageMimeType = \"image/jpeg\" | \"image/png\" | \"image/gif\" | \"image/webp\";\n\nfunction sdkText(value: string): ContentBlockParam {\n return { type: \"text\", text: value };\n}\n\nfunction formatUriAsLink(uri: string): string {\n try {\n if (uri.startsWith(\"zed://\")) {\n const name = path.basename(uri) || uri;\n return `[@${name}](${uri})`;\n }\n return uri;\n } catch {\n return uri;\n }\n}\n\nfunction formatFileAttachment(uri: string): string {\n try {\n const filePath = fileURLToPath(uri);\n const name = path.basename(filePath) || filePath;\n return [\n \"Attached file available in the workspace:\",\n `- name: ${name}`,\n `- path: ${filePath}`,\n \"Use the available tools to inspect this file if needed.\",\n ].join(\"\\n\");\n } catch {\n return `Attached file available at ${uri}`;\n }\n}\n\nfunction transformMcpCommand(text: string): string {\n const mcpMatch = text.match(/^\\/mcp:([^:\\s]+):(\\S+)(\\s+.*)?$/);\n if (mcpMatch) {\n const [, server, command, args] = mcpMatch;\n return `/${server}:${command} (MCP)${args || \"\"}`;\n }\n return text;\n}\n\nfunction processPromptChunk(\n chunk: PromptRequest[\"prompt\"][number],\n content: ContentBlockParam[],\n context: ContentBlockParam[],\n): void {\n switch (chunk.type) {\n case \"text\":\n content.push(sdkText(transformMcpCommand(chunk.text)));\n break;\n\n case \"resource_link\":\n content.push(\n sdkText(\n chunk.uri.startsWith(\"file://\")\n ? formatFileAttachment(chunk.uri)\n : formatUriAsLink(chunk.uri),\n ),\n );\n break;\n\n case \"resource\":\n if (\"text\" in chunk.resource) {\n content.push(sdkText(formatUriAsLink(chunk.resource.uri)));\n context.push(\n sdkText(\n `\\n<context ref=\"${chunk.resource.uri}\">\\n${chunk.resource.text}\\n</context>`,\n ),\n );\n }\n break;\n\n case \"image\":\n if (chunk.data) {\n content.push({\n type: \"image\",\n source: {\n type: \"base64\",\n data: chunk.data,\n media_type: chunk.mimeType as ImageMimeType,\n },\n });\n } else if (chunk.uri?.startsWith(\"http\")) {\n content.push({\n type: \"image\",\n source: { type: \"url\", url: chunk.uri },\n });\n }\n break;\n\n default:\n break;\n }\n}\n\nexport function promptToClaude(prompt: PromptRequest): SDKUserMessage {\n const content: ContentBlockParam[] = [];\n const context: ContentBlockParam[] = [];\n\n const prContext = (prompt._meta as Record<string, unknown> | undefined)\n ?.prContext;\n if (typeof prContext === \"string\") {\n content.push(sdkText(prContext));\n }\n\n for (const chunk of prompt.prompt) {\n processPromptChunk(chunk, content, context);\n }\n\n content.push(...context);\n\n return {\n type: \"user\",\n message: { role: \"user\", content },\n session_id: prompt.sessionId,\n parent_tool_use_id: null,\n };\n}\n","import type {\n AgentSideConnection,\n Role,\n SessionNotification,\n SessionUpdate,\n} from \"@agentclientprotocol/sdk\";\nimport { RequestError, type StopReason } from \"@agentclientprotocol/sdk\";\nimport type {\n SDKAssistantMessage,\n SDKMessage,\n SDKPartialAssistantMessage,\n SDKResultMessage,\n SDKUserMessage,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport type { ContentBlockParam } from \"@anthropic-ai/sdk/resources\";\nimport type {\n BetaContentBlock,\n BetaRawContentBlockDelta,\n} from \"@anthropic-ai/sdk/resources/beta.mjs\";\nimport { POSTHOG_NOTIFICATIONS } from \"@/acp-extensions\";\nimport { image, text } from \"../../../utils/acp-content\";\nimport { unreachable } from \"../../../utils/common\";\nimport type { Logger } from \"../../../utils/logger\";\nimport { type EnrichedReadCache, registerHookCallback } from \"../hooks\";\nimport type { Session, ToolUpdateMeta, ToolUseCache } from \"../types\";\nimport {\n type ClaudePlanEntry,\n planEntries,\n toolInfoFromToolUse,\n toolUpdateFromEditToolResponse,\n toolUpdateFromToolResult,\n} from \"./tool-use-to-acp\";\n\ntype AnthropicContentChunk =\n | ContentBlockParam\n | BetaContentBlock\n | BetaRawContentBlockDelta;\n\ntype AnthropicMessageContent = string | Array<{ type: string; text?: string }>;\n\ninterface AnthropicMessageWithContent {\n type: Role;\n message: {\n content: AnthropicMessageContent;\n role?: Role;\n model?: string;\n };\n}\n\ntype ChunkHandlerContext = {\n sessionId: string;\n toolUseCache: ToolUseCache;\n fileContentCache: { [key: string]: string };\n enrichedReadCache?: EnrichedReadCache;\n client: AgentSideConnection;\n logger: Logger;\n parentToolCallId?: string;\n registerHooks?: boolean;\n supportsTerminalOutput?: boolean;\n cwd?: string;\n /** Raw MCP tool result from SDKUserMessage.tool_use_result (contains content, structuredContent, _meta) */\n mcpToolUseResult?: Record<string, unknown>;\n};\n\nexport interface MessageHandlerContext {\n session: Session;\n sessionId: string;\n client: AgentSideConnection;\n toolUseCache: ToolUseCache;\n fileContentCache: { [key: string]: string };\n enrichedReadCache?: EnrichedReadCache;\n logger: Logger;\n registerHooks?: boolean;\n supportsTerminalOutput?: boolean;\n}\n\nfunction messageUpdateType(role: Role) {\n return role === \"assistant\" ? \"agent_message_chunk\" : \"user_message_chunk\";\n}\n\nfunction toolMeta(\n toolName: string,\n toolResponse?: unknown,\n parentToolCallId?: string,\n): ToolUpdateMeta {\n const meta: ToolUpdateMeta[\"claudeCode\"] = { toolName };\n if (toolResponse !== undefined) meta.toolResponse = toolResponse;\n if (parentToolCallId) meta.parentToolCallId = parentToolCallId;\n return { claudeCode: meta };\n}\n\nfunction handleTextChunk(\n chunk: { text: string },\n role: Role,\n parentToolCallId?: string,\n): SessionUpdate {\n const update: SessionUpdate = {\n sessionUpdate: messageUpdateType(role),\n content: text(chunk.text),\n };\n if (parentToolCallId) {\n (update as Record<string, unknown>)._meta = toolMeta(\n \"__text__\",\n undefined,\n parentToolCallId,\n );\n }\n return update;\n}\n\nfunction handleImageChunk(\n chunk: {\n source: { type: string; data?: string; media_type?: string; url?: string };\n },\n role: Role,\n): SessionUpdate {\n return {\n sessionUpdate: messageUpdateType(role),\n content: image(\n chunk.source.type === \"base64\" ? (chunk.source.data ?? \"\") : \"\",\n chunk.source.type === \"base64\" ? (chunk.source.media_type ?? \"\") : \"\",\n chunk.source.type === \"url\" ? chunk.source.url : undefined,\n ),\n };\n}\n\nfunction handleThinkingChunk(\n chunk: { thinking: string },\n parentToolCallId?: string,\n): SessionUpdate {\n const update: SessionUpdate = {\n sessionUpdate: \"agent_thought_chunk\",\n content: text(chunk.thinking),\n };\n if (parentToolCallId) {\n (update as Record<string, unknown>)._meta = toolMeta(\n \"__thinking__\",\n undefined,\n parentToolCallId,\n );\n }\n return update;\n}\n\nfunction handleToolUseChunk(\n chunk: ToolUseCache[string],\n ctx: ChunkHandlerContext,\n): SessionUpdate | null {\n const alreadyCached = chunk.id in ctx.toolUseCache;\n ctx.toolUseCache[chunk.id] = chunk;\n\n if (chunk.name === \"TodoWrite\") {\n const input = chunk.input as { todos?: unknown[] };\n if (Array.isArray(input.todos)) {\n return {\n sessionUpdate: \"plan\",\n entries: planEntries(chunk.input as { todos: ClaudePlanEntry[] }),\n };\n }\n return null;\n }\n\n if (!alreadyCached && ctx.registerHooks !== false) {\n registerHookCallback(chunk.id, {\n onPostToolUseHook: async (toolUseId, _toolInput, toolResponse) => {\n const toolUse = ctx.toolUseCache[toolUseId];\n if (toolUse) {\n const editUpdate =\n toolUse.name === \"Edit\"\n ? toolUpdateFromEditToolResponse(toolResponse)\n : null;\n\n await ctx.client.sessionUpdate({\n sessionId: ctx.sessionId,\n update: {\n _meta: toolMeta(toolUse.name, toolResponse, ctx.parentToolCallId),\n toolCallId: toolUseId,\n sessionUpdate: \"tool_call_update\",\n ...(editUpdate ? editUpdate : {}),\n },\n });\n } else {\n ctx.logger.error(\n `Got a tool response for tool use that wasn't tracked: ${toolUseId}`,\n );\n }\n },\n });\n }\n\n let rawInput: Record<string, unknown> | undefined;\n try {\n rawInput = JSON.parse(JSON.stringify(chunk.input));\n } catch {\n // ignore\n }\n\n const toolInfo = toolInfoFromToolUse(chunk, {\n supportsTerminalOutput: ctx.supportsTerminalOutput,\n toolUseId: chunk.id,\n cachedFileContent: ctx.fileContentCache,\n cwd: ctx.cwd,\n });\n\n const meta: Record<string, unknown> = {\n ...toolMeta(chunk.name, undefined, ctx.parentToolCallId),\n };\n if (chunk.name === \"Bash\" && ctx.supportsTerminalOutput && !alreadyCached) {\n meta.terminal_info = { terminal_id: chunk.id };\n }\n\n if (alreadyCached) {\n return {\n _meta: meta,\n toolCallId: chunk.id,\n sessionUpdate: \"tool_call_update\" as const,\n rawInput,\n ...toolInfo,\n };\n }\n\n return {\n _meta: meta,\n toolCallId: chunk.id,\n sessionUpdate: \"tool_call\" as const,\n rawInput,\n status: \"pending\",\n ...toolInfo,\n };\n}\n\nfunction extractTextFromContent(content: unknown): string | null {\n if (Array.isArray(content)) {\n const parts: string[] = [];\n for (const item of content) {\n if (\n typeof item === \"object\" &&\n item !== null &&\n \"text\" in item &&\n typeof (item as Record<string, unknown>).text === \"string\"\n ) {\n parts.push((item as { text: string }).text);\n }\n }\n return parts.length > 0 ? parts.join(\"\") : null;\n }\n if (typeof content === \"string\") {\n return content;\n }\n return null;\n}\n\nexport function stripCatLineNumbers(text: string): string {\n return text.replace(/^ *\\d+[\\t→]/gm, \"\");\n}\n\nfunction updateFileContentCache(\n toolUse: { name: string; input: unknown },\n chunk: { content?: unknown },\n ctx: ChunkHandlerContext,\n): void {\n const input = toolUse.input as Record<string, unknown> | undefined;\n const filePath = input?.file_path ? String(input.file_path) : undefined;\n if (!filePath) return;\n\n if (toolUse.name === \"Read\" && !input?.limit && !input?.offset) {\n const fileText = extractTextFromContent(chunk.content);\n if (fileText !== null) {\n ctx.fileContentCache[filePath] = stripCatLineNumbers(fileText);\n }\n } else if (toolUse.name === \"Write\") {\n const content = input?.content;\n if (typeof content === \"string\") {\n ctx.fileContentCache[filePath] = content;\n }\n } else if (toolUse.name === \"Edit\") {\n const oldString = input?.old_string;\n const newString = input?.new_string;\n if (\n typeof oldString === \"string\" &&\n typeof newString === \"string\" &&\n filePath in ctx.fileContentCache\n ) {\n const current = ctx.fileContentCache[filePath];\n ctx.fileContentCache[filePath] = input?.replace_all\n ? current.replaceAll(oldString, newString)\n : current.replace(oldString, newString);\n }\n }\n}\n\nfunction handleToolResultChunk(\n chunk: AnthropicContentChunk & {\n tool_use_id: string;\n is_error?: boolean;\n content?: unknown;\n },\n ctx: ChunkHandlerContext,\n): SessionUpdate[] {\n const toolUse = ctx.toolUseCache[chunk.tool_use_id];\n if (!toolUse) {\n ctx.logger.error(\n `Got a tool result for tool use that wasn't tracked: ${chunk.tool_use_id}`,\n );\n return [];\n }\n\n if (toolUse.name === \"TodoWrite\") {\n return [];\n }\n\n if (!chunk.is_error) {\n updateFileContentCache(toolUse, chunk, ctx);\n }\n\n const { _meta: resultMeta, ...toolUpdate } = toolUpdateFromToolResult(\n chunk as Parameters<typeof toolUpdateFromToolResult>[0],\n toolUse,\n {\n supportsTerminalOutput: ctx.supportsTerminalOutput,\n toolUseId: chunk.tool_use_id,\n cachedFileContent: ctx.fileContentCache,\n enrichedReadCache: ctx.enrichedReadCache,\n },\n );\n\n const updates: SessionUpdate[] = [];\n\n if (resultMeta?.terminal_output) {\n const terminalOutputMeta: Record<string, unknown> = {\n terminal_output: resultMeta.terminal_output,\n };\n if (ctx.parentToolCallId) {\n terminalOutputMeta.claudeCode = {\n parentToolCallId: ctx.parentToolCallId,\n };\n }\n updates.push({\n _meta: terminalOutputMeta,\n toolCallId: chunk.tool_use_id,\n sessionUpdate: \"tool_call_update\" as const,\n });\n }\n\n const meta: Record<string, unknown> = {\n ...toolMeta(toolUse.name, undefined, ctx.parentToolCallId),\n ...(resultMeta?.terminal_exit\n ? { terminal_exit: resultMeta.terminal_exit }\n : {}),\n };\n\n updates.push({\n _meta: meta,\n toolCallId: chunk.tool_use_id,\n sessionUpdate: \"tool_call_update\",\n status: chunk.is_error ? \"failed\" : \"completed\",\n rawOutput: ctx.mcpToolUseResult\n ? { ...ctx.mcpToolUseResult, isError: chunk.is_error ?? false }\n : {\n content: Array.isArray(chunk.content)\n ? chunk.content\n : typeof chunk.content === \"string\"\n ? [{ type: \"text\" as const, text: chunk.content }]\n : [],\n isError: chunk.is_error ?? false,\n },\n ...toolUpdate,\n });\n\n return updates;\n}\n\nfunction processContentChunk(\n chunk: AnthropicContentChunk,\n role: Role,\n ctx: ChunkHandlerContext,\n): SessionUpdate[] {\n switch (chunk.type) {\n case \"text\":\n case \"text_delta\": {\n const update = handleTextChunk(chunk, role, ctx.parentToolCallId);\n return update ? [update] : [];\n }\n\n case \"image\": {\n const update = handleImageChunk(chunk, role);\n return update ? [update] : [];\n }\n\n case \"thinking\":\n case \"thinking_delta\": {\n const update = handleThinkingChunk(chunk, ctx.parentToolCallId);\n return update ? [update] : [];\n }\n\n case \"tool_use\":\n case \"server_tool_use\":\n case \"mcp_tool_use\": {\n const update = handleToolUseChunk(chunk as ToolUseCache[string], ctx);\n return update ? [update] : [];\n }\n\n case \"tool_result\":\n case \"tool_search_tool_result\":\n case \"web_fetch_tool_result\":\n case \"web_search_tool_result\":\n case \"code_execution_tool_result\":\n case \"bash_code_execution_tool_result\":\n case \"text_editor_code_execution_tool_result\":\n case \"mcp_tool_result\":\n return handleToolResultChunk(\n chunk as AnthropicContentChunk & {\n tool_use_id: string;\n is_error?: boolean;\n content?: unknown;\n },\n ctx,\n );\n\n case \"document\":\n case \"search_result\":\n case \"redacted_thinking\":\n case \"input_json_delta\":\n case \"citations_delta\":\n case \"signature_delta\":\n case \"container_upload\":\n case \"compaction\":\n case \"compaction_delta\":\n return [];\n\n default:\n unreachable(chunk as never, ctx.logger);\n return [];\n }\n}\n\nfunction toAcpNotifications(\n content:\n | string\n | ContentBlockParam[]\n | BetaContentBlock[]\n | BetaRawContentBlockDelta[],\n role: Role,\n sessionId: string,\n toolUseCache: ToolUseCache,\n fileContentCache: { [key: string]: string },\n client: AgentSideConnection,\n logger: Logger,\n parentToolCallId?: string,\n registerHooks?: boolean,\n supportsTerminalOutput?: boolean,\n cwd?: string,\n mcpToolUseResult?: Record<string, unknown>,\n enrichedReadCache?: EnrichedReadCache,\n): SessionNotification[] {\n if (typeof content === \"string\") {\n const update: SessionUpdate = {\n sessionUpdate: messageUpdateType(role),\n content: text(content),\n };\n if (parentToolCallId) {\n (update as Record<string, unknown>)._meta = toolMeta(\n \"__text__\",\n undefined,\n parentToolCallId,\n );\n }\n return [{ sessionId, update }];\n }\n\n const ctx: ChunkHandlerContext = {\n sessionId,\n toolUseCache,\n fileContentCache,\n enrichedReadCache,\n client,\n logger,\n parentToolCallId,\n registerHooks,\n supportsTerminalOutput,\n cwd,\n mcpToolUseResult,\n };\n const output: SessionNotification[] = [];\n\n for (const chunk of content) {\n for (const update of processContentChunk(chunk, role, ctx)) {\n output.push({ sessionId, update });\n }\n }\n\n return output;\n}\n\nfunction streamEventToAcpNotifications(\n message: SDKPartialAssistantMessage,\n sessionId: string,\n toolUseCache: ToolUseCache,\n fileContentCache: { [key: string]: string },\n client: AgentSideConnection,\n logger: Logger,\n parentToolCallId?: string,\n registerHooks?: boolean,\n supportsTerminalOutput?: boolean,\n cwd?: string,\n enrichedReadCache?: EnrichedReadCache,\n): SessionNotification[] {\n const event = message.event;\n switch (event.type) {\n case \"content_block_start\":\n return toAcpNotifications(\n [event.content_block],\n \"assistant\",\n sessionId,\n toolUseCache,\n fileContentCache,\n client,\n logger,\n parentToolCallId,\n registerHooks,\n supportsTerminalOutput,\n cwd,\n undefined,\n enrichedReadCache,\n );\n case \"content_block_delta\":\n return toAcpNotifications(\n [event.delta],\n \"assistant\",\n sessionId,\n toolUseCache,\n fileContentCache,\n client,\n logger,\n parentToolCallId,\n registerHooks,\n supportsTerminalOutput,\n cwd,\n undefined,\n enrichedReadCache,\n );\n case \"message_start\":\n case \"message_delta\":\n case \"message_stop\":\n case \"content_block_stop\":\n return [];\n\n default:\n unreachable(event as never, logger);\n return [];\n }\n}\n\nexport async function handleSystemMessage(\n message: Extract<SDKMessage, { type: \"system\" }>,\n context: MessageHandlerContext,\n): Promise<void> {\n const { session, sessionId, client, logger } = context;\n\n switch (message.subtype) {\n case \"init\":\n break;\n case \"compact_boundary\":\n await client.extNotification(POSTHOG_NOTIFICATIONS.COMPACT_BOUNDARY, {\n sessionId,\n trigger: message.compact_metadata.trigger,\n preTokens: message.compact_metadata.pre_tokens,\n contextSize: session.contextSize,\n });\n break;\n case \"hook_response\":\n logger.info(\"Hook response received\", {\n hookName: message.hook_name,\n hookEvent: message.hook_event,\n });\n break;\n case \"status\":\n if (message.status === \"compacting\") {\n logger.info(\"Session compacting started\", { sessionId });\n await client.extNotification(POSTHOG_NOTIFICATIONS.STATUS, {\n sessionId,\n status: \"compacting\",\n });\n }\n break;\n case \"task_notification\": {\n logger.info(\"Task notification received\", {\n sessionId,\n taskId: message.task_id,\n status: message.status,\n summary: message.summary,\n });\n await client.extNotification(POSTHOG_NOTIFICATIONS.TASK_NOTIFICATION, {\n sessionId,\n taskId: message.task_id,\n status: message.status,\n summary: message.summary,\n outputFile: message.output_file,\n });\n break;\n }\n default:\n break;\n }\n}\n\nexport type ResultMessageHandlerResult = {\n shouldStop: boolean;\n stopReason?: StopReason;\n error?: Error;\n usage?: {\n inputTokens: number;\n outputTokens: number;\n cachedReadTokens: number;\n cachedWriteTokens: number;\n costUsd?: number;\n contextWindowSize?: number;\n };\n};\n\nexport function handleResultMessage(\n message: SDKResultMessage,\n): ResultMessageHandlerResult {\n const usage = extractUsageFromResult(message);\n\n switch (message.subtype) {\n case \"success\": {\n if (message.result.includes(\"Please run /login\")) {\n return {\n shouldStop: true,\n error: RequestError.authRequired(),\n usage,\n };\n }\n if ((message as Record<string, unknown>).stop_reason === \"max_tokens\") {\n return { shouldStop: true, stopReason: \"max_tokens\", usage };\n }\n if (message.is_error) {\n return {\n shouldStop: true,\n error: RequestError.internalError(undefined, message.result),\n usage,\n };\n }\n return { shouldStop: true, stopReason: \"end_turn\", usage };\n }\n case \"error_during_execution\":\n if ((message as Record<string, unknown>).stop_reason === \"max_tokens\") {\n return { shouldStop: true, stopReason: \"max_tokens\", usage };\n }\n if (message.is_error) {\n return {\n shouldStop: true,\n error: RequestError.internalError(\n undefined,\n message.errors.join(\", \") || message.subtype,\n ),\n usage,\n };\n }\n return { shouldStop: true, stopReason: \"end_turn\", usage };\n case \"error_max_budget_usd\":\n case \"error_max_turns\":\n case \"error_max_structured_output_retries\":\n if (message.is_error) {\n return {\n shouldStop: true,\n error: RequestError.internalError(\n undefined,\n message.errors.join(\", \") || message.subtype,\n ),\n usage,\n };\n }\n return { shouldStop: true, stopReason: \"max_turn_requests\", usage };\n default:\n return { shouldStop: false, usage };\n }\n}\n\nfunction extractUsageFromResult(\n message: SDKResultMessage,\n): ResultMessageHandlerResult[\"usage\"] {\n const msg = message as Record<string, unknown>;\n const msgUsage = msg.usage as Record<string, number> | undefined;\n if (!msgUsage) return undefined;\n\n const modelUsage = msg.modelUsage as\n | Record<string, { contextWindow: number }>\n | undefined;\n let contextWindowSize: number | undefined;\n if (modelUsage) {\n const contextWindows = Object.values(modelUsage).map(\n (m) => m.contextWindow,\n );\n if (contextWindows.length > 0) {\n contextWindowSize = Math.min(...contextWindows);\n }\n }\n\n return {\n inputTokens: msgUsage.input_tokens ?? 0,\n outputTokens: msgUsage.output_tokens ?? 0,\n cachedReadTokens: msgUsage.cache_read_input_tokens ?? 0,\n cachedWriteTokens: msgUsage.cache_creation_input_tokens ?? 0,\n costUsd:\n typeof msg.total_cost_usd === \"number\" ? msg.total_cost_usd : undefined,\n contextWindowSize,\n };\n}\n\nexport async function handleStreamEvent(\n message: SDKPartialAssistantMessage,\n context: MessageHandlerContext,\n): Promise<void> {\n const { sessionId, client, toolUseCache, fileContentCache, logger } = context;\n const parentToolCallId = message.parent_tool_use_id ?? undefined;\n\n for (const notification of streamEventToAcpNotifications(\n message,\n sessionId,\n toolUseCache,\n fileContentCache,\n client,\n logger,\n parentToolCallId,\n context.registerHooks,\n context.supportsTerminalOutput,\n context.session.cwd,\n context.enrichedReadCache,\n )) {\n await client.sessionUpdate(notification);\n context.session.notificationHistory.push(notification);\n }\n}\n\nfunction hasLocalCommandStdout(content: AnthropicMessageContent): boolean {\n return (\n typeof content === \"string\" && content.includes(\"<local-command-stdout>\")\n );\n}\n\nfunction hasLocalCommandStderr(content: AnthropicMessageContent): boolean {\n return (\n typeof content === \"string\" && content.includes(\"<local-command-stderr>\")\n );\n}\n\nfunction isLoginRequiredMessage(message: AnthropicMessageWithContent): boolean {\n return (\n message.type === \"assistant\" &&\n message.message.model === \"<synthetic>\" &&\n Array.isArray(message.message.content) &&\n message.message.content.length === 1 &&\n message.message.content[0].type === \"text\" &&\n message.message.content[0].text?.includes(\"Please run /login\") === true\n );\n}\n\nfunction isPlainTextUserMessage(message: AnthropicMessageWithContent): boolean {\n const content = message.message.content;\n return (\n message.type === \"user\" &&\n (typeof content === \"string\" ||\n (Array.isArray(content) &&\n content.length === 1 &&\n content[0].type === \"text\"))\n );\n}\n\nfunction shouldSkipUserAssistantMessage(\n message: AnthropicMessageWithContent,\n): boolean {\n return (\n hasLocalCommandStdout(message.message.content) ||\n hasLocalCommandStderr(message.message.content) ||\n isLoginRequiredMessage(message)\n );\n}\n\nfunction logSpecialMessages(\n message: AnthropicMessageWithContent,\n logger: Logger,\n): void {\n const content = message.message.content;\n if (hasLocalCommandStdout(content) && typeof content === \"string\") {\n logger.info(content);\n }\n if (hasLocalCommandStderr(content) && typeof content === \"string\") {\n logger.error(content);\n }\n}\n\nfunction filterMessageContent(\n content: AnthropicMessageContent,\n): AnthropicMessageContent {\n if (!Array.isArray(content)) {\n return content;\n }\n return content.filter(\n (block) => block.type !== \"text\" && block.type !== \"thinking\",\n );\n}\n\nexport async function handleUserAssistantMessage(\n message: SDKUserMessage | SDKAssistantMessage,\n context: MessageHandlerContext,\n): Promise<{ shouldStop?: boolean; error?: Error }> {\n const { session, sessionId, client, toolUseCache, fileContentCache, logger } =\n context;\n\n if (shouldSkipUserAssistantMessage(message)) {\n logSpecialMessages(message, logger);\n\n if (isLoginRequiredMessage(message)) {\n return { shouldStop: true, error: RequestError.authRequired() };\n }\n return {};\n }\n\n // Skip plain text user messages (already displayed by the ACP client)\n if (isPlainTextUserMessage(message)) {\n return {};\n }\n\n const content = message.message.content;\n const contentToProcess =\n message.type === \"assistant\" ? filterMessageContent(content) : content;\n const parentToolCallId =\n \"parent_tool_use_id\" in message\n ? (message.parent_tool_use_id ?? undefined)\n : undefined;\n\n // Pass the raw MCP tool result (contains content, structuredContent, _meta)\n // so it can be forwarded as-is to the renderer for MCP Apps\n const mcpToolUseResult =\n message.type === \"user\" && message.tool_use_result != null\n ? (message.tool_use_result as Record<string, unknown>)\n : undefined;\n\n for (const notification of toAcpNotifications(\n contentToProcess as typeof content,\n message.message.role,\n sessionId,\n toolUseCache,\n fileContentCache,\n client,\n logger,\n parentToolCallId,\n context.registerHooks,\n context.supportsTerminalOutput,\n session.cwd,\n mcpToolUseResult,\n context.enrichedReadCache,\n )) {\n await client.sessionUpdate(notification);\n session.notificationHistory.push(notification);\n }\n\n return {};\n}\n","import type { ContentBlock, ToolCallContent } from \"@agentclientprotocol/sdk\";\n\nexport function text(value: string): ContentBlock {\n return { type: \"text\", text: value };\n}\n\nexport function image(\n data: string,\n mimeType: string,\n uri?: string,\n): ContentBlock {\n return { type: \"image\", data, mimeType, uri };\n}\n\nexport function resourceLink(\n uri: string,\n name: string,\n options?: {\n mimeType?: string;\n title?: string;\n description?: string;\n size?: number | null;\n },\n): ContentBlock {\n return {\n type: \"resource_link\",\n uri,\n name,\n ...options,\n };\n}\n\nclass ToolContentBuilder {\n private items: ToolCallContent[] = [];\n\n text(value: string): this {\n this.items.push({ type: \"content\", content: text(value) });\n return this;\n }\n\n image(data: string, mimeType: string, uri?: string): this {\n this.items.push({ type: \"content\", content: image(data, mimeType, uri) });\n return this;\n }\n\n diff(path: string, oldText: string | null, newText: string): this {\n this.items.push({ type: \"diff\", path, oldText, newText });\n return this;\n }\n\n build(): ToolCallContent[] {\n return this.items;\n }\n}\n\nexport function toolContent(): ToolContentBuilder {\n return new ToolContentBuilder();\n}\n","import type { HookCallback, HookInput } from \"@anthropic-ai/claude-agent-sdk\";\nimport {\n enrichFileForAgent,\n type FileEnrichmentDeps,\n} from \"../../enrichment/file-enricher\";\nimport type { Logger } from \"../../utils/logger\";\nimport { stripCatLineNumbers } from \"./conversion/sdk-to-acp\";\nimport type { SettingsManager } from \"./session/settings\";\nimport type { CodeExecutionMode } from \"./tools\";\n\nfunction extractTextFromToolResponse(response: unknown): string | null {\n if (typeof response === \"string\") return response;\n if (!response) return null;\n if (Array.isArray(response)) {\n const parts: string[] = [];\n for (const part of response) {\n if (typeof part === \"string\") {\n parts.push(part);\n } else if (\n part &&\n typeof part === \"object\" &&\n \"text\" in part &&\n typeof (part as { text?: unknown }).text === \"string\"\n ) {\n parts.push((part as { text: string }).text);\n }\n }\n return parts.length > 0 ? parts.join(\"\") : null;\n }\n if (typeof response === \"object\" && response !== null) {\n const maybe = response as {\n content?: unknown;\n text?: unknown;\n file?: { content?: unknown };\n };\n if (\n maybe.file &&\n typeof maybe.file === \"object\" &&\n typeof maybe.file.content === \"string\"\n ) {\n return maybe.file.content;\n }\n if (typeof maybe.text === \"string\") return maybe.text;\n if (maybe.content) return extractTextFromToolResponse(maybe.content);\n }\n return null;\n}\n\n/**\n * Per-toolUseId handoff from the PostToolUse hook to `toolUpdateFromToolResult`.\n * Can't emit a standalone `tool_call_update` because the SDK emits its own\n * when it processes the tool_result, and the renderer applies it via\n * `Object.assign` — our earlier update would be overwritten.\n */\nexport type EnrichedReadCache = Map<string, string>;\n\nexport const createReadEnrichmentHook =\n (deps: FileEnrichmentDeps, cache: EnrichedReadCache): HookCallback =>\n async (input: HookInput) => {\n if (input.hook_event_name !== \"PostToolUse\") return { continue: true };\n if (input.tool_name !== \"Read\") return { continue: true };\n\n const toolInput = input.tool_input as { file_path?: string } | undefined;\n const filePath = toolInput?.file_path;\n if (!filePath) return { continue: true };\n\n const raw = extractTextFromToolResponse(input.tool_response);\n if (!raw) return { continue: true };\n\n const enriched = await enrichFileForAgent(\n deps,\n filePath,\n stripCatLineNumbers(raw),\n );\n if (!enriched) return { continue: true };\n\n if (input.tool_use_id) {\n cache.set(input.tool_use_id, enriched);\n }\n\n return {\n continue: true,\n hookSpecificOutput: {\n hookEventName: \"PostToolUse\" as const,\n additionalContext: [\n `## PostHog metadata for ${filePath}`,\n \"\",\n \"The file below is annotated with live data from the user's PostHog project:\",\n \"flag type / rollout / staleness / linked experiment, and for events the verification status,\",\n \"30-day volume, and unique-user count. Treat these as authoritative product context —\",\n \"they describe what is actually running in production.\",\n \"\",\n enriched,\n ].join(\"\\n\"),\n },\n };\n };\n\nconst toolUseCallbacks: {\n [toolUseId: string]: {\n onPostToolUseHook?: (\n toolUseID: string,\n toolInput: unknown,\n toolResponse: unknown,\n ) => Promise<void>;\n };\n} = {};\n\nexport const registerHookCallback = (\n toolUseID: string,\n {\n onPostToolUseHook,\n }: {\n onPostToolUseHook?: (\n toolUseID: string,\n toolInput: unknown,\n toolResponse: unknown,\n ) => Promise<void>;\n },\n) => {\n toolUseCallbacks[toolUseID] = {\n onPostToolUseHook,\n };\n};\n\nexport type OnModeChange = (mode: CodeExecutionMode) => Promise<void>;\n\ninterface CreatePostToolUseHookParams {\n onModeChange?: OnModeChange;\n logger?: Logger;\n}\n\nexport const createPostToolUseHook =\n ({ onModeChange, logger }: CreatePostToolUseHookParams): HookCallback =>\n async (\n input: HookInput,\n toolUseID: string | undefined,\n ): Promise<{ continue: boolean }> => {\n if (input.hook_event_name === \"PostToolUse\") {\n const toolName = input.tool_name;\n\n if (onModeChange && toolName === \"EnterPlanMode\") {\n await onModeChange(\"plan\");\n }\n\n if (toolUseID) {\n const onPostToolUseHook =\n toolUseCallbacks[toolUseID]?.onPostToolUseHook;\n if (onPostToolUseHook) {\n await onPostToolUseHook(\n toolUseID,\n input.tool_input,\n input.tool_response,\n );\n delete toolUseCallbacks[toolUseID];\n } else {\n delete toolUseCallbacks[toolUseID];\n }\n }\n }\n return { continue: true };\n };\n\n/**\n * Rewrites Agent tool calls targeting built-in subagent types to use our custom\n * definitions instead. This works around a Claude Agent SDK bug where\n * `options.agents` cannot override built-in agent definitions because the\n * built-ins appear first in the agents array and `Array.find()` returns the\n * first match.\n *\n * By giving our custom agent a different name (e.g. \"ph-explore\") and rewriting\n * the subagent_type in the tool input, we sidestep the collision entirely.\n *\n * https://github.com/anthropics/claude-agent-sdk-typescript/issues/267\n */\nconst SUBAGENT_REWRITES: Record<string, string> = {\n Explore: \"ph-explore\",\n};\n\nexport const createSubagentRewriteHook =\n (logger: Logger): HookCallback =>\n async (input: HookInput, _toolUseID: string | undefined) => {\n if (input.hook_event_name !== \"PreToolUse\") {\n return { continue: true };\n }\n\n if (input.tool_name !== \"Agent\") {\n return { continue: true };\n }\n\n const toolInput = input.tool_input as Record<string, unknown> | undefined;\n const subagentType = toolInput?.subagent_type;\n if (typeof subagentType !== \"string\" || !SUBAGENT_REWRITES[subagentType]) {\n return { continue: true };\n }\n\n const target = SUBAGENT_REWRITES[subagentType];\n logger.info(\n `[SubagentRewriteHook] Rewriting subagent_type: ${subagentType} → ${target}`,\n );\n\n return {\n continue: true,\n hookSpecificOutput: {\n hookEventName: \"PreToolUse\" as const,\n updatedInput: {\n ...toolInput,\n subagent_type: target,\n },\n },\n };\n };\n\nexport const createPreToolUseHook =\n (settingsManager: SettingsManager, logger: Logger): HookCallback =>\n async (input: HookInput, _toolUseID: string | undefined) => {\n if (input.hook_event_name !== \"PreToolUse\") {\n return { continue: true };\n }\n\n const toolName = input.tool_name;\n const toolInput = input.tool_input;\n const permissionCheck = settingsManager.checkPermission(\n toolName,\n toolInput,\n );\n\n if (permissionCheck.decision !== \"ask\") {\n logger.info(\n `[PreToolUseHook] Tool: ${toolName}, Decision: ${permissionCheck.decision}, Rule: ${permissionCheck.rule}`,\n );\n }\n\n switch (permissionCheck.decision) {\n case \"allow\":\n return {\n continue: true,\n hookSpecificOutput: {\n hookEventName: \"PreToolUse\" as const,\n permissionDecision: \"allow\" as const,\n permissionDecisionReason: `Allowed by settings rule: ${permissionCheck.rule}`,\n },\n };\n case \"deny\":\n return {\n continue: true,\n hookSpecificOutput: {\n hookEventName: \"PreToolUse\" as const,\n permissionDecision: \"deny\" as const,\n permissionDecisionReason: `Denied by settings rule: ${permissionCheck.rule}`,\n },\n };\n default:\n return { continue: true };\n }\n };\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type {\n PlanEntry,\n ToolCall,\n ToolCallContent,\n ToolCallLocation,\n ToolCallUpdate,\n ToolKind,\n} from \"@agentclientprotocol/sdk\";\nimport type {\n ToolResultBlockParam,\n ToolUseBlock,\n WebSearchToolResultBlockParam,\n} from \"@anthropic-ai/sdk/resources\";\nimport type {\n BetaBashCodeExecutionToolResultBlockParam,\n BetaCodeExecutionToolResultBlockParam,\n BetaRequestMCPToolResultBlockParam,\n BetaTextEditorCodeExecutionToolResultBlockParam,\n BetaToolSearchToolResultBlockParam,\n BetaWebFetchToolResultBlockParam,\n BetaWebSearchToolResultBlockParam,\n} from \"@anthropic-ai/sdk/resources/beta.mjs\";\n\nconst SYSTEM_REMINDER_REGEX =\n /\\s*<system-reminder>[\\s\\S]*?<\\/system-reminder>/g;\n\nfunction stripSystemReminders(value: string): string {\n return value.replace(SYSTEM_REMINDER_REGEX, \"\");\n}\n\nimport { resourceLink, text, toolContent } from \"../../../utils/acp-content\";\nimport type { EnrichedReadCache } from \"../hooks\";\nimport { getMcpToolMetadata } from \"../mcp/tool-metadata\";\n\ntype ToolInfo = Pick<ToolCall, \"title\" | \"kind\" | \"content\" | \"locations\">;\n\n/**\n * Convert an absolute file path to a project-relative path for display.\n * Returns the original path if it's outside the project directory or if no cwd is provided.\n */\nexport function toDisplayPath(filePath: string, cwd?: string): string {\n if (!cwd) return filePath;\n const resolvedCwd = path.resolve(cwd);\n const resolvedFile = path.resolve(filePath);\n if (\n resolvedFile.startsWith(resolvedCwd + path.sep) ||\n resolvedFile === resolvedCwd\n ) {\n return path.relative(resolvedCwd, resolvedFile);\n }\n return filePath;\n}\n\nexport function toolInfoFromToolUse(\n toolUse: Pick<ToolUseBlock, \"name\" | \"input\">,\n options?: {\n supportsTerminalOutput?: boolean;\n toolUseId?: string;\n cachedFileContent?: Record<string, string>;\n cwd?: string;\n },\n): ToolInfo {\n const name = toolUse.name;\n const input = toolUse.input as Record<string, unknown> | undefined;\n\n switch (name) {\n case \"Task\":\n case \"Agent\":\n return {\n title: input?.description ? String(input.description) : name,\n kind: \"think\",\n content: input?.prompt\n ? toolContent().text(String(input.prompt)).build()\n : [],\n };\n\n case \"NotebookRead\":\n return {\n title: input?.notebook_path\n ? `Read Notebook ${String(input.notebook_path)}`\n : \"Read Notebook\",\n kind: \"read\",\n content: [],\n locations: input?.notebook_path\n ? [{ path: String(input.notebook_path) }]\n : [],\n };\n\n case \"NotebookEdit\":\n return {\n title: input?.notebook_path\n ? `Edit Notebook ${String(input.notebook_path)}`\n : \"Edit Notebook\",\n kind: \"edit\",\n content: input?.new_source\n ? toolContent().text(String(input.new_source)).build()\n : [],\n locations: input?.notebook_path\n ? [{ path: String(input.notebook_path) }]\n : [],\n };\n\n case \"Bash\":\n if (options?.supportsTerminalOutput && options?.toolUseId) {\n return {\n title: input?.description\n ? String(input.description)\n : \"Execute command\",\n kind: \"execute\",\n content: [{ type: \"terminal\", terminalId: options.toolUseId }],\n };\n }\n return {\n title: input?.description\n ? String(input.description)\n : \"Execute command\",\n kind: \"execute\",\n content: input?.command\n ? toolContent().text(String(input.command)).build()\n : [],\n };\n\n case \"BashOutput\":\n return {\n title: \"Tail Logs\",\n kind: \"execute\",\n content: [],\n };\n\n case \"KillShell\":\n return {\n title: \"Kill Process\",\n kind: \"execute\",\n content: [],\n };\n\n case \"Read\": {\n let limit = \"\";\n const inputLimit = input?.limit as number | undefined;\n const inputOffset = (input?.offset as number | undefined) ?? 1;\n if (inputLimit) {\n limit = ` (${inputOffset} - ${inputOffset + inputLimit - 1})`;\n } else if (inputOffset > 1) {\n limit = ` (from line ${inputOffset})`;\n }\n const displayPath = input?.file_path\n ? toDisplayPath(String(input.file_path), options?.cwd)\n : \"File\";\n return {\n title: `Read ${displayPath}${limit}`,\n kind: \"read\",\n locations: input?.file_path\n ? [\n {\n path: String(input.file_path),\n line: inputOffset,\n },\n ]\n : [],\n content: [],\n };\n }\n\n case \"LS\":\n return {\n title: `List the ${input?.path ? `\\`${String(input.path)}\\`` : \"current\"} directory's contents`,\n kind: \"search\",\n content: [],\n locations: [],\n };\n\n case \"Edit\": {\n const filePath = input?.file_path ? String(input.file_path) : undefined;\n const displayPath = filePath\n ? toDisplayPath(filePath, options?.cwd)\n : undefined;\n let oldText: string | null = input?.old_string\n ? String(input.old_string)\n : null;\n let newText: string = input?.new_string ? String(input.new_string) : \"\";\n\n // try to display a rich diff by first checking if file content is cached\n // and valid (old_text exists in the content), then fall back to reading\n // file from disk, then fall back to fragemented snippet diff\n if (filePath && oldText !== null) {\n const fileContent = resolveFileContent(\n filePath,\n oldText,\n options?.cachedFileContent,\n );\n if (fileContent) {\n const newContent = input?.replace_all\n ? fileContent.replaceAll(oldText, newText)\n : fileContent.replace(oldText, newText);\n oldText = fileContent;\n newText = newContent;\n }\n }\n\n return {\n title: displayPath ? `Edit \\`${displayPath}\\`` : \"Edit\",\n kind: \"edit\",\n content:\n input && filePath\n ? [\n {\n type: \"diff\",\n path: filePath,\n oldText,\n newText,\n },\n ]\n : [],\n locations: filePath ? [{ path: filePath }] : [],\n };\n }\n\n case \"Write\": {\n let contentResult: ToolCallContent[] = [];\n const writeFilePath = input?.file_path\n ? String(input.file_path)\n : undefined;\n const writeDisplayPath = writeFilePath\n ? toDisplayPath(writeFilePath, options?.cwd)\n : undefined;\n const contentStr = input?.content ? String(input.content) : undefined;\n if (writeFilePath) {\n let oldContent: string | null = null;\n if (\n options?.cachedFileContent &&\n writeFilePath in options.cachedFileContent\n ) {\n oldContent = options.cachedFileContent[writeFilePath];\n } else {\n try {\n oldContent = fs.readFileSync(writeFilePath, \"utf-8\");\n } catch {\n // File doesn't exist — genuinely a new file\n }\n }\n contentResult = toolContent()\n .diff(writeFilePath, oldContent, contentStr ?? \"\")\n .build();\n } else if (contentStr) {\n contentResult = toolContent().text(contentStr).build();\n }\n return {\n title: writeDisplayPath ? `Write ${writeDisplayPath}` : \"Write\",\n kind: \"edit\",\n content: contentResult,\n locations: writeFilePath ? [{ path: writeFilePath }] : [],\n };\n }\n\n case \"Glob\": {\n let label = \"Find\";\n const pathStr = input?.path ? String(input.path) : undefined;\n if (pathStr) {\n label += ` \"${pathStr}\"`;\n }\n if (input?.pattern) {\n label += ` \"${String(input.pattern)}\"`;\n }\n return {\n title: label,\n kind: \"search\",\n content: [],\n locations: pathStr ? [{ path: pathStr }] : [],\n };\n }\n\n case \"Grep\": {\n let label = \"grep\";\n\n if (input?.[\"-i\"]) {\n label += \" -i\";\n }\n if (input?.[\"-n\"]) {\n label += \" -n\";\n }\n\n if (input?.[\"-A\"] !== undefined) {\n label += ` -A ${input[\"-A\"]}`;\n }\n if (input?.[\"-B\"] !== undefined) {\n label += ` -B ${input[\"-B\"]}`;\n }\n if (input?.[\"-C\"] !== undefined) {\n label += ` -C ${input[\"-C\"]}`;\n }\n\n if (input?.output_mode) {\n switch (input.output_mode) {\n case \"files_with_matches\":\n label += \" -l\";\n break;\n case \"count\":\n label += \" -c\";\n break;\n default:\n break;\n }\n }\n\n if (input?.head_limit !== undefined) {\n label += ` | head -${input.head_limit}`;\n }\n\n if (input?.glob) {\n label += ` --include=\"${String(input.glob)}\"`;\n }\n\n if (input?.type) {\n label += ` --type=${String(input.type)}`;\n }\n\n if (input?.multiline) {\n label += \" -P\";\n }\n\n if (input?.pattern) {\n label += ` \"${String(input.pattern)}\"`;\n }\n\n if (input?.path) {\n label += ` ${String(input.path)}`;\n }\n\n return {\n title: label,\n kind: \"search\",\n content: [],\n };\n }\n\n case \"WebFetch\":\n return {\n title: \"Fetch\",\n kind: \"fetch\",\n content: input?.url\n ? [\n {\n type: \"content\",\n content: resourceLink(String(input.url), String(input.url), {\n description: input?.prompt ? String(input.prompt) : undefined,\n }),\n },\n ]\n : [],\n };\n\n case \"WebSearch\": {\n let label = `\"${input?.query ? String(input.query) : \"\"}\"`;\n const allowedDomains = input?.allowed_domains as string[] | undefined;\n const blockedDomains = input?.blocked_domains as string[] | undefined;\n\n if (allowedDomains && allowedDomains.length > 0) {\n label += ` (allowed: ${allowedDomains.join(\", \")})`;\n }\n\n if (blockedDomains && blockedDomains.length > 0) {\n label += ` (blocked: ${blockedDomains.join(\", \")})`;\n }\n\n return {\n title: label,\n kind: \"fetch\",\n content: [],\n };\n }\n\n case \"TodoWrite\":\n return {\n title: Array.isArray(input?.todos)\n ? `Update TODOs: ${input.todos.map((todo: { content?: string }) => todo.content).join(\", \")}`\n : \"Update TODOs\",\n kind: \"think\",\n content: [],\n };\n\n case \"ExitPlanMode\":\n return {\n title: \"Ready to code?\",\n kind: \"switch_mode\",\n content: input?.plan\n ? toolContent().text(String(input.plan)).build()\n : [],\n };\n\n case \"AskUserQuestion\": {\n const questions = input?.questions as\n | Array<{ question?: string }>\n | undefined;\n return {\n title: questions?.[0]?.question || \"Question\",\n kind: \"other\" as ToolKind,\n content: questions\n ? toolContent()\n .text(JSON.stringify(questions, null, 2))\n .build()\n : [],\n };\n }\n\n case \"Other\": {\n let output: string;\n try {\n output = JSON.stringify(input, null, 2);\n } catch {\n output = typeof input === \"string\" ? input : \"{}\";\n }\n return {\n title: name || \"Unknown Tool\",\n kind: \"other\",\n content: toolContent().text(`\\`\\`\\`json\\n${output}\\`\\`\\``).build(),\n };\n }\n\n default: {\n if (name?.startsWith(\"mcp__\")) {\n return mcpToolInfo(name, input);\n }\n return {\n title: name || \"Unknown Tool\",\n kind: \"other\",\n content: [],\n };\n }\n }\n}\n\nfunction mcpToolInfo(\n name: string,\n _input: Record<string, unknown> | undefined,\n): ToolInfo {\n const metadata = getMcpToolMetadata(name);\n // Fallback: parse tool name from mcp__<server>__<tool> prefix\n const title =\n metadata?.name ?? (name.split(\"__\").slice(2).join(\"__\") || name);\n\n return {\n title,\n kind: \"other\",\n content: [],\n };\n}\n\ninterface StructuredPatchHunk {\n oldStart: number;\n oldLines: number;\n newStart: number;\n newLines: number;\n lines: string[];\n}\n\ninterface StructuredPatch {\n oldFileName: string;\n newFileName: string;\n hunks: StructuredPatchHunk[];\n}\n\nexport function toolUpdateFromEditToolResponse(\n toolResponse: unknown,\n): { content: ToolCallContent[]; locations: ToolCallLocation[] } | null {\n if (!toolResponse || typeof toolResponse !== \"object\") return null;\n const response = toolResponse as Record<string, unknown>;\n\n const patches = response.structuredPatch as StructuredPatch[] | undefined;\n if (!Array.isArray(patches) || patches.length === 0) return null;\n\n const content: ToolCallContent[] = [];\n const locations: ToolCallLocation[] = [];\n\n for (const patch of patches) {\n if (!patch.hunks || patch.hunks.length === 0) continue;\n\n const filePath = patch.newFileName || patch.oldFileName;\n\n const oldLines: string[] = [];\n const newLines: string[] = [];\n for (const hunk of patch.hunks) {\n for (const line of hunk.lines) {\n if (line.startsWith(\"-\")) {\n oldLines.push(line.slice(1));\n } else if (line.startsWith(\"+\")) {\n newLines.push(line.slice(1));\n } else if (line.startsWith(\" \")) {\n oldLines.push(line.slice(1));\n newLines.push(line.slice(1));\n }\n }\n }\n\n content.push({\n type: \"diff\",\n path: filePath,\n oldText: oldLines.join(\"\\n\"),\n newText: newLines.join(\"\\n\"),\n });\n\n const firstHunk = patch.hunks[0];\n locations.push({\n path: filePath,\n line: firstHunk.newStart,\n });\n }\n\n if (content.length === 0) return null;\n return { content, locations };\n}\n\nexport function toolUpdateFromToolResult(\n toolResult:\n | ToolResultBlockParam\n | BetaWebSearchToolResultBlockParam\n | BetaWebFetchToolResultBlockParam\n | WebSearchToolResultBlockParam\n | BetaCodeExecutionToolResultBlockParam\n | BetaBashCodeExecutionToolResultBlockParam\n | BetaTextEditorCodeExecutionToolResultBlockParam\n | BetaRequestMCPToolResultBlockParam\n | BetaToolSearchToolResultBlockParam,\n toolUse: Pick<ToolUseBlock, \"name\" | \"input\"> | undefined,\n options?: {\n supportsTerminalOutput?: boolean;\n toolUseId?: string;\n cachedFileContent?: Record<string, string>;\n enrichedReadCache?: EnrichedReadCache;\n },\n): Pick<ToolCallUpdate, \"title\" | \"content\" | \"locations\" | \"_meta\"> {\n if (\n \"is_error\" in toolResult &&\n toolResult.is_error &&\n toolResult.content &&\n (toolResult.content as unknown[]).length > 0\n ) {\n return toAcpContentUpdate(toolResult.content, true);\n }\n\n switch (toolUse?.name) {\n case \"Read\": {\n const cache = options?.enrichedReadCache;\n const enriched =\n cache && options?.toolUseId ? cache.get(options.toolUseId) : undefined;\n if (enriched !== undefined && cache && options?.toolUseId) {\n cache.delete(options.toolUseId);\n return {\n content: [\n {\n type: \"content\" as const,\n content: text(markdownEscape(enriched)),\n },\n ],\n };\n }\n if (Array.isArray(toolResult.content) && toolResult.content.length > 0) {\n return {\n content: toolResult.content.map((item) => {\n const itemObj = item as {\n type?: string;\n text?: string;\n source?: { data?: string; media_type?: string };\n };\n if (itemObj.type === \"text\") {\n return {\n type: \"content\" as const,\n content: text(\n markdownEscape(stripSystemReminders(itemObj.text ?? \"\")),\n ),\n };\n }\n if (itemObj.type === \"image\" && itemObj.source) {\n return {\n type: \"content\" as const,\n content: {\n type: \"image\" as const,\n data: itemObj.source.data ?? \"\",\n mimeType: itemObj.source.media_type ?? \"image/png\",\n },\n };\n }\n return {\n type: \"content\" as const,\n content: item as { type: \"text\"; text: string },\n };\n }),\n };\n } else if (\n typeof toolResult.content === \"string\" &&\n toolResult.content.length > 0\n ) {\n return {\n content: toolContent()\n .text(markdownEscape(stripSystemReminders(toolResult.content)))\n .build(),\n };\n }\n return {};\n }\n\n case \"Bash\": {\n const result = toolResult.content;\n const terminalId =\n \"tool_use_id\" in toolResult ? String(toolResult.tool_use_id) : \"\";\n const isError = \"is_error\" in toolResult && toolResult.is_error;\n\n let output = \"\";\n let exitCode = isError ? 1 : 0;\n\n if (\n result &&\n typeof result === \"object\" &&\n \"type\" in result &&\n (result as { type: string }).type === \"bash_code_execution_result\"\n ) {\n const bashResult = result as {\n stdout?: string;\n stderr?: string;\n return_code: number;\n };\n output = [bashResult.stdout, bashResult.stderr]\n .filter(Boolean)\n .join(\"\\n\");\n exitCode = bashResult.return_code;\n } else if (typeof result === \"string\") {\n output = result;\n } else if (\n Array.isArray(result) &&\n result.length > 0 &&\n \"text\" in result[0] &&\n typeof result[0].text === \"string\"\n ) {\n output = result.map((c: { text?: string }) => c.text ?? \"\").join(\"\\n\");\n }\n\n if (options?.supportsTerminalOutput) {\n return {\n content: [{ type: \"terminal\" as const, terminalId }],\n _meta: {\n terminal_info: {\n terminal_id: terminalId,\n },\n terminal_output: {\n terminal_id: terminalId,\n data: output,\n },\n terminal_exit: {\n terminal_id: terminalId,\n exit_code: exitCode,\n signal: null,\n },\n },\n };\n }\n if (output.trim()) {\n return {\n content: toolContent()\n .text(`\\`\\`\\`console\\n${output.trimEnd()}\\n\\`\\`\\``)\n .build(),\n };\n }\n return {};\n }\n case \"Edit\":\n case \"Write\":\n return {};\n\n case \"ExitPlanMode\": {\n return { title: \"Exited Plan Mode\" };\n }\n case \"AskUserQuestion\": {\n const content = toolResult.content;\n if (Array.isArray(content) && content.length > 0) {\n const firstItem = content[0];\n if (\n typeof firstItem === \"object\" &&\n firstItem !== null &&\n \"text\" in firstItem\n ) {\n return {\n title: \"Answer received\",\n content: toolContent().text(String(firstItem.text)).build(),\n };\n }\n }\n return { title: \"Question answered\" };\n }\n case \"WebFetch\": {\n const input = toolUse?.input as Record<string, unknown> | undefined;\n const url = input?.url ? String(input.url) : \"\";\n const prompt = input?.prompt ? String(input.prompt) : undefined;\n\n const resultContent = toAcpContentUpdate(\n toolResult.content,\n \"is_error\" in toolResult ? toolResult.is_error : false,\n );\n\n const content: ToolCallContent[] = [];\n if (url) {\n content.push({\n type: \"content\",\n content: resourceLink(url, url, {\n description: prompt,\n }),\n });\n }\n if (resultContent.content) {\n content.push(...resultContent.content);\n }\n\n return { content };\n }\n default: {\n return toAcpContentUpdate(\n toolResult.content,\n \"is_error\" in toolResult ? toolResult.is_error : false,\n );\n }\n }\n}\n\nfunction itemToText(item: unknown): string | null {\n if (!item || typeof item !== \"object\") return null;\n const obj = item as Record<string, unknown>;\n // Standard text block\n if (obj.type === \"text\" && typeof obj.text === \"string\") {\n return stripSystemReminders(obj.text);\n }\n // Any other structured object — serialize it\n try {\n return JSON.stringify(obj, null, 2);\n } catch {\n return null;\n }\n}\n\nfunction toAcpContentUpdate(\n content: unknown,\n isError: boolean = false,\n): Pick<ToolCallUpdate, \"content\"> {\n if (Array.isArray(content) && content.length > 0) {\n const texts: string[] = [];\n for (const item of content) {\n const t = itemToText(item);\n if (t) texts.push(t);\n }\n if (texts.length > 0) {\n const combined = texts.join(\"\\n\");\n return {\n content: toolContent()\n .text(isError ? `\\`\\`\\`\\n${combined}\\n\\`\\`\\`` : combined)\n .build(),\n };\n }\n } else if (typeof content === \"string\" && content.length > 0) {\n return {\n content: toolContent()\n .text(isError ? `\\`\\`\\`\\n${content}\\n\\`\\`\\`` : content)\n .build(),\n };\n } else if (content && typeof content === \"object\") {\n try {\n const json = JSON.stringify(content, null, 2);\n if (json && json !== \"{}\") {\n return {\n content: toolContent().text(json).build(),\n };\n }\n } catch {\n // ignore serialization errors\n }\n }\n return {};\n}\n\nexport type ClaudePlanEntry = {\n content: string;\n status: \"pending\" | \"in_progress\" | \"completed\";\n activeForm: string;\n};\n\nexport function planEntries(input: { todos: ClaudePlanEntry[] }): PlanEntry[] {\n return input.todos.map((input) => ({\n content: input.content,\n status: input.status,\n priority: \"medium\",\n }));\n}\n\n/**\n * attempt to resolve full file contents for diff generation\n *\n * 1) check file content cache exists, and is valid (old_text in content)\n * 2) if missing or invalid, read file from disk\n * 3) if both fail, return null, we'll fall back to fragmented snippet diff\n */\nfunction resolveFileContent(\n filePath: string,\n oldText: string,\n cachedFileContent?: Record<string, string>,\n): string | null {\n if (cachedFileContent && filePath in cachedFileContent) {\n const cached = cachedFileContent[filePath];\n if (cached.includes(oldText)) {\n return cached;\n }\n }\n\n try {\n const content = fs.readFileSync(filePath, \"utf-8\");\n if (content.includes(oldText)) {\n return content;\n }\n } catch {\n return null;\n }\n\n return null;\n}\n\nfunction markdownEscape(text: string): string {\n let escapedText = \"```\";\n for (const [m] of text.matchAll(/^```+/gm)) {\n while (m.length >= escapedText.length) {\n escapedText += \"`\";\n }\n }\n return `${escapedText}\\n${text}${text.endsWith(\"\\n\") ? \"\" : \"\\n\"}${escapedText}`;\n}\n","import type { McpServerStatus, Query } from \"@anthropic-ai/claude-agent-sdk\";\nimport { Logger } from \"../../../utils/logger\";\n\nexport interface McpToolMetadata {\n readOnly: boolean;\n name: string;\n description?: string;\n}\n\nconst mcpToolMetadataCache: Map<string, McpToolMetadata> = new Map();\n\nconst PENDING_RETRY_INTERVAL_MS = 1_000;\nconst PENDING_MAX_RETRIES = 10;\n\nfunction buildToolKey(serverName: string, toolName: string): string {\n return `mcp__${serverName}__${toolName}`;\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function fetchMcpToolMetadata(\n q: Query,\n logger: Logger = new Logger({ debug: false, prefix: \"[McpToolMetadata]\" }),\n): Promise<void> {\n let retries = 0;\n\n while (retries <= PENDING_MAX_RETRIES) {\n let statuses: McpServerStatus[];\n try {\n statuses = await q.mcpServerStatus();\n } catch (error) {\n logger.error(\"Failed to fetch MCP server status\", {\n error: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n\n const pendingServers = statuses.filter((s) => s.status === \"pending\");\n\n for (const server of statuses) {\n if (server.status !== \"connected\" || !server.tools) {\n continue;\n }\n\n let readOnlyCount = 0;\n for (const tool of server.tools) {\n const toolKey = buildToolKey(server.name, tool.name);\n const readOnly = tool.annotations?.readOnly === true;\n\n mcpToolMetadataCache.set(toolKey, {\n readOnly,\n name: tool.name,\n description: tool.description,\n });\n if (readOnly) readOnlyCount++;\n }\n\n logger.info(\"Fetched MCP tool metadata\", {\n serverName: server.name,\n toolCount: server.tools.length,\n readOnlyCount,\n });\n }\n\n if (pendingServers.length === 0) {\n return;\n }\n\n retries++;\n if (retries > PENDING_MAX_RETRIES) {\n logger.warn(\"Gave up waiting for pending MCP servers\", {\n pendingServers: pendingServers.map((s) => s.name),\n });\n return;\n }\n\n logger.info(\"Waiting for pending MCP servers\", {\n pendingServers: pendingServers.map((s) => s.name),\n retry: retries,\n });\n await delay(PENDING_RETRY_INTERVAL_MS);\n }\n}\n\nexport function getMcpToolMetadata(\n toolName: string,\n): McpToolMetadata | undefined {\n return mcpToolMetadataCache.get(toolName);\n}\n\nexport function isMcpToolReadOnly(toolName: string): boolean {\n const metadata = mcpToolMetadataCache.get(toolName);\n return metadata?.readOnly === true;\n}\n\nexport function getConnectedMcpServerNames(): string[] {\n const names = new Set<string>();\n for (const key of mcpToolMetadataCache.keys()) {\n const parts = key.split(\"__\");\n if (parts.length >= 3) names.add(parts[1]);\n }\n return [...names];\n}\n\nexport function clearMcpToolMetadataCache(): void {\n mcpToolMetadataCache.clear();\n}\n","import * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { SessionNotification } from \"@agentclientprotocol/sdk\";\n\nfunction getClaudeConfigDir(): string {\n return process.env.CLAUDE_CONFIG_DIR || path.join(os.homedir(), \".claude\");\n}\n\nexport function getClaudePlansDir(): string {\n return path.join(getClaudeConfigDir(), \"plans\");\n}\n\nexport function isClaudePlanFilePath(filePath: string | undefined): boolean {\n if (!filePath) return false;\n const resolved = path.resolve(filePath);\n const plansDir = path.resolve(getClaudePlansDir());\n return resolved === plansDir || resolved.startsWith(plansDir + path.sep);\n}\n\nexport function isPlanReady(plan: string | undefined): boolean {\n if (!plan) return false;\n const trimmed = plan.trim();\n if (trimmed.length < 40) return false;\n return /(^|\\n)#{1,6}\\s+\\S/.test(trimmed);\n}\n\nexport function getLatestAssistantText(\n notifications: SessionNotification[],\n): string | null {\n const chunks: string[] = [];\n let started = false;\n\n for (let i = notifications.length - 1; i >= 0; i -= 1) {\n const update = notifications[i]?.update;\n if (!update) continue;\n\n if (update.sessionUpdate === \"agent_message_chunk\") {\n started = true;\n const content = update.content as {\n type?: string;\n text?: string;\n } | null;\n if (content?.type === \"text\" && content.text) {\n chunks.push(content.text);\n }\n continue;\n }\n\n if (started) {\n break;\n }\n }\n\n if (chunks.length === 0) return null;\n return chunks.reverse().join(\"\");\n}\n","import type { ToolCallContent, ToolKind } from \"@agentclientprotocol/sdk\";\nimport { z } from \"zod\";\nimport type { PermissionOption } from \"../permissions/permission-options\";\n\nexport const OPTION_PREFIX = \"option_\";\n\nexport const QuestionOptionSchema = z.object({\n label: z.string(),\n description: z.string().optional(),\n});\n\nexport const QuestionItemSchema = z.object({\n question: z.string(),\n header: z.string().optional(),\n options: z.array(QuestionOptionSchema),\n multiSelect: z.boolean().optional(),\n completed: z.boolean().optional(),\n});\n\nexport const QuestionMetaSchema = z.object({\n questions: z.array(QuestionItemSchema),\n});\n\nexport type QuestionOption = z.infer<typeof QuestionOptionSchema>;\nexport type QuestionItem = z.infer<typeof QuestionItemSchema>;\nexport type QuestionMeta = z.infer<typeof QuestionMetaSchema>;\n\nexport interface AskUserQuestionInput {\n questions?: QuestionItem[];\n question?: string;\n header?: string;\n options?: QuestionOption[];\n multiSelect?: boolean;\n}\n\nexport function normalizeAskUserQuestionInput(\n input: AskUserQuestionInput,\n): QuestionItem[] | null {\n if (input.questions && input.questions.length > 0) {\n return input.questions;\n }\n\n if (input.question) {\n return [\n {\n question: input.question,\n header: input.header,\n options: input.options || [],\n multiSelect: input.multiSelect,\n },\n ];\n }\n\n return null;\n}\n\ninterface QuestionToolCallData {\n toolCallId: string;\n title: string;\n kind: ToolKind;\n content: ToolCallContent[];\n _meta: {\n codeToolKind: \"question\";\n questions: QuestionItem[];\n };\n}\n\nexport function buildQuestionToolCallData(\n questions: QuestionItem[],\n): QuestionToolCallData {\n return {\n toolCallId: `question-${Date.now()}`,\n title: questions[0]?.question ?? \"Question\",\n kind: \"other\",\n content: [],\n _meta: {\n codeToolKind: \"question\",\n questions,\n },\n };\n}\n\nexport function buildQuestionOptions(\n question: QuestionItem,\n): PermissionOption[] {\n return question.options.map((opt, idx) => ({\n kind: \"allow_once\" as const,\n name: opt.label,\n optionId: `${OPTION_PREFIX}${idx}`,\n _meta: opt.description ? { description: opt.description } : undefined,\n }));\n}\n","import { IS_ROOT } from \"./utils/common\";\n\nexport interface ModeInfo {\n id: string;\n name: string;\n description: string;\n}\n\n// Helper constant that can easily be toggled for env/feature flag/etc\nconst ALLOW_BYPASS = !IS_ROOT;\n\nconst availableModes: ModeInfo[] = [\n {\n id: \"default\",\n name: \"Default\",\n description: \"Standard behavior, prompts for dangerous operations\",\n },\n {\n id: \"acceptEdits\",\n name: \"Accept Edits\",\n description: \"Auto-accept file edit operations\",\n },\n {\n id: \"plan\",\n name: \"Plan Mode\",\n description: \"Planning mode, no actual tool execution\",\n },\n];\n\nif (ALLOW_BYPASS) {\n availableModes.push(\n {\n id: \"bypassPermissions\",\n name: \"Bypass Permissions\",\n description: \"Auto-accept all permission requests\",\n },\n {\n id: \"auto\",\n name: \"Auto Mode\",\n description: \"Use a model classifier to approve/deny permission prompts\",\n },\n );\n}\n\n// Expose execution mode IDs in type-safe order for type checks\nexport const CODE_EXECUTION_MODES = [\n \"default\",\n \"acceptEdits\",\n \"plan\",\n \"bypassPermissions\",\n \"auto\",\n] as const;\n\nexport type CodeExecutionMode = (typeof CODE_EXECUTION_MODES)[number];\n\nexport function isCodeExecutionMode(mode: string): mode is CodeExecutionMode {\n return (CODE_EXECUTION_MODES as readonly string[]).includes(mode);\n}\n\nexport function getAvailableModes(): ModeInfo[] {\n return IS_ROOT\n ? availableModes.filter((m) => m.id !== \"bypassPermissions\")\n : availableModes;\n}\n\n// --- Codex-native modes ---\n\nexport const CODEX_NATIVE_MODES = [\"auto\", \"read-only\", \"full-access\"] as const;\n\nexport type CodexNativeMode = (typeof CODEX_NATIVE_MODES)[number];\n\n/** Union of all permission mode IDs across adapters */\nexport type PermissionMode = CodeExecutionMode | CodexNativeMode;\n\nexport function isCodexNativeMode(mode: string): mode is CodexNativeMode {\n return (CODEX_NATIVE_MODES as readonly string[]).includes(mode);\n}\n\nconst codexModes: ModeInfo[] = [\n {\n id: \"read-only\",\n name: \"Read Only\",\n description: \"Read-only access, no file modifications\",\n },\n {\n id: \"auto\",\n name: \"Auto\",\n description: \"Standard behavior, prompts for dangerous operations\",\n },\n];\n\nif (ALLOW_BYPASS) {\n codexModes.push({\n id: \"full-access\",\n name: \"Full Access\",\n description: \"Auto-accept all permission requests\",\n });\n}\n\nexport function getAvailableCodexModes(): ModeInfo[] {\n return IS_ROOT\n ? codexModes.filter((m) => m.id !== \"full-access\")\n : codexModes;\n}\n","export {\n CODE_EXECUTION_MODES,\n type CodeExecutionMode,\n getAvailableModes,\n type ModeInfo,\n} from \"../../execution-mode\";\n\nimport type { CodeExecutionMode } from \"../../execution-mode\";\nimport { isMcpToolReadOnly } from \"./mcp/tool-metadata\";\n\nexport const READ_TOOLS: Set<string> = new Set([\"Read\", \"NotebookRead\"]);\n\nexport const WRITE_TOOLS: Set<string> = new Set([\n \"Edit\",\n \"Write\",\n \"NotebookEdit\",\n]);\n\nexport const BASH_TOOLS: Set<string> = new Set([\n \"Bash\",\n \"BashOutput\",\n \"KillShell\",\n]);\n\nexport const SEARCH_TOOLS: Set<string> = new Set([\"Glob\", \"Grep\", \"LS\"]);\n\nexport const WEB_TOOLS: Set<string> = new Set([\"WebSearch\", \"WebFetch\"]);\n\nexport const AGENT_TOOLS: Set<string> = new Set([\n \"Task\",\n \"Agent\",\n \"TodoWrite\",\n \"Skill\",\n]);\n\nconst BASE_ALLOWED_TOOLS = [\n ...READ_TOOLS,\n ...SEARCH_TOOLS,\n ...WEB_TOOLS,\n ...AGENT_TOOLS,\n];\n\nconst AUTO_ALLOWED_TOOLS: Record<string, Set<string>> = {\n auto: new Set(BASE_ALLOWED_TOOLS),\n default: new Set(BASE_ALLOWED_TOOLS),\n acceptEdits: new Set([...BASE_ALLOWED_TOOLS, ...WRITE_TOOLS]),\n plan: new Set(BASE_ALLOWED_TOOLS),\n};\n\nexport function isToolAllowedForMode(\n toolName: string,\n mode: CodeExecutionMode,\n): boolean {\n if (mode === \"bypassPermissions\") {\n return true;\n }\n if (AUTO_ALLOWED_TOOLS[mode]?.has(toolName) === true) {\n return true;\n }\n if (isMcpToolReadOnly(toolName)) {\n return true;\n }\n return false;\n}\n","import type { PermissionUpdate } from \"@anthropic-ai/claude-agent-sdk\";\nimport { IS_ROOT } from \"../../../utils/common\";\nimport { BASH_TOOLS, READ_TOOLS, SEARCH_TOOLS, WRITE_TOOLS } from \"../tools\";\n\nexport interface PermissionOption {\n kind: \"allow_once\" | \"allow_always\" | \"reject_once\" | \"reject_always\";\n name: string;\n optionId: string;\n _meta?: { description?: string; customInput?: boolean };\n}\n\nfunction permissionOptions(allowAlwaysLabel: string): PermissionOption[] {\n return [\n { kind: \"allow_once\", name: \"Yes\", optionId: \"allow\" },\n { kind: \"allow_always\", name: allowAlwaysLabel, optionId: \"allow_always\" },\n {\n kind: \"reject_once\",\n name: \"No, and tell the agent what to do differently\",\n optionId: \"reject\",\n _meta: { customInput: true },\n },\n ];\n}\n\nexport function buildPermissionOptions(\n toolName: string,\n toolInput: Record<string, unknown>,\n cwd?: string,\n suggestions?: PermissionUpdate[],\n): PermissionOption[] {\n if (BASH_TOOLS.has(toolName)) {\n const rawRuleContent = suggestions\n ?.flatMap((s) => (\"rules\" in s ? s.rules : []))\n .find((r) => r.toolName === \"Bash\" && r.ruleContent)?.ruleContent;\n const ruleContent = rawRuleContent?.replace(/:?\\*$/, \"\");\n\n const command = toolInput?.command as string | undefined;\n const cmdName = command?.split(/\\s+/)[0] ?? \"this command\";\n const cwdLabel = cwd ? ` in ${cwd}` : \"\";\n const label = ruleContent ?? `\\`${cmdName}\\` commands`;\n\n return permissionOptions(\n `Yes, and don't ask again for ${label}${cwdLabel}`,\n );\n }\n\n if (toolName === \"BashOutput\") {\n return permissionOptions(\"Yes, allow all background process reads\");\n }\n\n if (toolName === \"KillShell\") {\n return permissionOptions(\"Yes, allow killing processes\");\n }\n\n if (WRITE_TOOLS.has(toolName)) {\n return permissionOptions(\"Yes, allow all edits during this session\");\n }\n\n if (READ_TOOLS.has(toolName)) {\n return permissionOptions(\"Yes, allow all reads during this session\");\n }\n\n if (SEARCH_TOOLS.has(toolName)) {\n return permissionOptions(\"Yes, allow all searches during this session\");\n }\n\n if (toolName === \"WebFetch\") {\n const url = toolInput?.url as string | undefined;\n let domain = \"\";\n try {\n domain = url ? new URL(url).hostname : \"\";\n } catch {}\n return permissionOptions(\n domain\n ? `Yes, allow all fetches from ${domain}`\n : \"Yes, allow all fetches\",\n );\n }\n\n if (toolName === \"WebSearch\") {\n return permissionOptions(\"Yes, allow all web searches\");\n }\n\n if (toolName === \"Task\") {\n return permissionOptions(\"Yes, allow all sub-tasks\");\n }\n\n if (toolName === \"TodoWrite\") {\n return permissionOptions(\"Yes, allow all todo updates\");\n }\n\n return permissionOptions(\"Yes, always allow\");\n}\n\nconst ALLOW_BYPASS = !IS_ROOT || !!process.env.IS_SANDBOX;\n\nexport function buildExitPlanModePermissionOptions(): PermissionOption[] {\n const options: PermissionOption[] = [];\n\n if (ALLOW_BYPASS) {\n options.push({\n kind: \"allow_always\",\n name: \"Yes, bypass all permissions\",\n optionId: \"bypassPermissions\",\n });\n }\n\n options.push(\n {\n kind: \"allow_always\",\n name: 'Yes, and use \"auto\" mode',\n optionId: \"auto\",\n },\n {\n kind: \"allow_always\",\n name: \"Yes, and auto-accept edits\",\n optionId: \"acceptEdits\",\n },\n {\n kind: \"allow_once\",\n name: \"Yes, and manually approve edits\",\n optionId: \"default\",\n },\n {\n kind: \"reject_once\",\n name: \"No, and tell the agent what to do differently\",\n optionId: \"reject_with_feedback\",\n _meta: { customInput: true },\n },\n );\n\n return options;\n}\n","import type {\n AgentSideConnection,\n RequestPermissionResponse,\n} from \"@agentclientprotocol/sdk\";\nimport type { PermissionUpdate } from \"@anthropic-ai/claude-agent-sdk\";\nimport { text } from \"../../../utils/acp-content\";\nimport type { Logger } from \"../../../utils/logger\";\nimport { toolInfoFromToolUse } from \"../conversion/tool-use-to-acp\";\nimport {\n getClaudePlansDir,\n getLatestAssistantText,\n isClaudePlanFilePath,\n isPlanReady,\n} from \"../plan/utils\";\nimport {\n type AskUserQuestionInput,\n normalizeAskUserQuestionInput,\n OPTION_PREFIX,\n type QuestionItem,\n} from \"../questions/utils\";\nimport { isToolAllowedForMode, WRITE_TOOLS } from \"../tools\";\nimport type { Session } from \"../types\";\nimport {\n buildExitPlanModePermissionOptions,\n buildPermissionOptions,\n} from \"./permission-options\";\n\nexport type ToolPermissionResult =\n | {\n behavior: \"allow\";\n updatedInput: Record<string, unknown>;\n updatedPermissions?: PermissionUpdate[];\n }\n | {\n behavior: \"deny\";\n message: string;\n interrupt?: boolean;\n };\n\ninterface ToolHandlerContext {\n session: Session;\n toolName: string;\n toolInput: Record<string, unknown>;\n toolUseID: string;\n suggestions?: PermissionUpdate[];\n signal?: AbortSignal;\n client: AgentSideConnection;\n sessionId: string;\n fileContentCache: { [key: string]: string };\n logger: Logger;\n updateConfigOption: (configId: string, value: string) => Promise<void>;\n allowedDomains?: string[];\n}\n\nasync function emitToolDenial(\n context: ToolHandlerContext,\n message: string,\n): Promise<void> {\n context.logger.info(`[canUseTool] Tool denied: ${context.toolName}`, {\n message,\n });\n await context.client.sessionUpdate({\n sessionId: context.sessionId,\n update: {\n sessionUpdate: \"tool_call_update\",\n toolCallId: context.toolUseID,\n status: \"failed\",\n content: [{ type: \"content\", content: text(message) }],\n },\n });\n}\n\nfunction getPlanFromFile(\n session: Session,\n fileContentCache: { [key: string]: string },\n): string | undefined {\n return (\n session.lastPlanContent ||\n (session.lastPlanFilePath\n ? fileContentCache[session.lastPlanFilePath]\n : undefined)\n );\n}\n\nfunction ensurePlanInInput(\n toolInput: Record<string, unknown>,\n fallbackPlan: string | undefined,\n): Record<string, unknown> {\n const hasPlan = typeof (toolInput as { plan?: unknown })?.plan === \"string\";\n if (hasPlan || !fallbackPlan) {\n return toolInput;\n }\n return { ...toolInput, plan: fallbackPlan };\n}\n\nfunction extractPlanText(input: Record<string, unknown>): string | undefined {\n const plan = (input as { plan?: unknown })?.plan;\n return typeof plan === \"string\" ? plan : undefined;\n}\n\nasync function createPlanValidationError(\n message: string,\n context: ToolHandlerContext,\n): Promise<ToolPermissionResult> {\n await emitToolDenial(context, message);\n return { behavior: \"deny\", message, interrupt: false };\n}\n\nasync function validatePlanContent(\n planText: string | undefined,\n context: ToolHandlerContext,\n): Promise<{ valid: true } | { valid: false; error: ToolPermissionResult }> {\n if (!planText) {\n const message = `Plan not ready. Provide the full markdown plan in ExitPlanMode or write it to ${getClaudePlansDir()} before requesting approval.`;\n return {\n valid: false,\n error: await createPlanValidationError(message, context),\n };\n }\n\n if (!isPlanReady(planText)) {\n const message =\n \"Plan not ready. Provide the full markdown plan in ExitPlanMode before requesting approval.\";\n return {\n valid: false,\n error: await createPlanValidationError(message, context),\n };\n }\n\n return { valid: true };\n}\n\nasync function requestPlanApproval(\n context: ToolHandlerContext,\n updatedInput: Record<string, unknown>,\n): Promise<RequestPermissionResponse> {\n const { client, sessionId, toolUseID } = context;\n\n const toolInfo = toolInfoFromToolUse({\n name: context.toolName,\n input: updatedInput,\n });\n\n return await client.requestPermission({\n options: buildExitPlanModePermissionOptions(),\n sessionId,\n toolCall: {\n toolCallId: toolUseID,\n title: toolInfo.title,\n kind: toolInfo.kind,\n content: toolInfo.content,\n locations: toolInfo.locations,\n rawInput: { ...updatedInput, toolName: context.toolName },\n },\n });\n}\n\nasync function applyPlanApproval(\n response: RequestPermissionResponse,\n context: ToolHandlerContext,\n updatedInput: Record<string, unknown>,\n): Promise<ToolPermissionResult> {\n const { session } = context;\n\n if (\n response.outcome?.outcome === \"selected\" &&\n (response.outcome.optionId === \"auto\" ||\n response.outcome.optionId === \"default\" ||\n response.outcome.optionId === \"acceptEdits\" ||\n response.outcome.optionId === \"bypassPermissions\")\n ) {\n session.permissionMode = response.outcome\n .optionId as typeof session.permissionMode;\n await session.query.setPermissionMode(response.outcome.optionId);\n await context.client.sessionUpdate({\n sessionId: context.sessionId,\n update: {\n sessionUpdate: \"current_mode_update\",\n currentModeId: response.outcome.optionId,\n },\n });\n await context.updateConfigOption(\"mode\", response.outcome.optionId);\n\n return {\n behavior: \"allow\",\n updatedInput,\n updatedPermissions: context.suggestions ?? [\n {\n type: \"setMode\",\n mode: response.outcome.optionId,\n destination: \"localSettings\",\n },\n ],\n };\n }\n\n const customInput = (response._meta as Record<string, unknown> | undefined)\n ?.customInput as string | undefined;\n const feedback = customInput?.trim();\n\n const message = feedback\n ? `User rejected the plan with feedback: ${feedback}`\n : \"User rejected the plan. Wait for the user to provide direction.\";\n await emitToolDenial(context, message);\n return { behavior: \"deny\", message, interrupt: !feedback };\n}\n\nasync function handleEnterPlanModeTool(\n context: ToolHandlerContext,\n): Promise<ToolPermissionResult> {\n const { session, toolInput } = context;\n\n session.permissionMode = \"plan\";\n await session.query.setPermissionMode(\"plan\");\n await context.updateConfigOption(\"mode\", \"plan\");\n\n return {\n behavior: \"allow\",\n updatedInput: toolInput as Record<string, unknown>,\n };\n}\n\nasync function handleExitPlanModeTool(\n context: ToolHandlerContext,\n): Promise<ToolPermissionResult> {\n const { session, toolInput, fileContentCache } = context;\n\n const planFromFile = getPlanFromFile(session, fileContentCache);\n const latestText = getLatestAssistantText(session.notificationHistory);\n const fallbackPlan = planFromFile || (latestText ?? undefined);\n const updatedInput = ensurePlanInInput(toolInput, fallbackPlan);\n const planText = extractPlanText(updatedInput);\n\n const validationResult = await validatePlanContent(planText, context);\n if (!validationResult.valid) {\n return validationResult.error;\n }\n\n const response = await requestPlanApproval(context, updatedInput);\n if (context.signal?.aborted || response.outcome?.outcome === \"cancelled\") {\n throw new Error(\"Tool use aborted\");\n }\n return await applyPlanApproval(response, context, updatedInput);\n}\n\nfunction buildQuestionOptions(question: QuestionItem) {\n return (question.options || []).map((opt, idx) => ({\n kind: \"allow_once\" as const,\n name: opt.label,\n optionId: `${OPTION_PREFIX}${idx}`,\n _meta: opt.description ? { description: opt.description } : undefined,\n }));\n}\n\nasync function handleAskUserQuestionTool(\n context: ToolHandlerContext,\n): Promise<ToolPermissionResult> {\n const input = context.toolInput as AskUserQuestionInput;\n context.logger.info(\"[AskUserQuestion] Received input\", { input });\n const questions = normalizeAskUserQuestionInput(input);\n context.logger.info(\"[AskUserQuestion] Normalized questions\", { questions });\n\n if (!questions || questions.length === 0) {\n context.logger.warn(\"[AskUserQuestion] No questions found in input\");\n return {\n behavior: \"deny\",\n message: \"No questions provided\",\n };\n }\n\n const { client, sessionId, toolUseID, toolInput } = context;\n const firstQuestion = questions[0];\n const options = buildQuestionOptions(firstQuestion);\n\n const toolInfo = toolInfoFromToolUse({\n name: context.toolName,\n input: toolInput,\n });\n\n const response = await client.requestPermission({\n options,\n sessionId,\n toolCall: {\n toolCallId: toolUseID,\n title: firstQuestion.question,\n kind: \"other\",\n content: toolInfo.content,\n _meta: {\n codeToolKind: \"question\",\n questions,\n },\n },\n });\n\n if (context.signal?.aborted || response.outcome?.outcome === \"cancelled\") {\n throw new Error(\"Tool use aborted\");\n }\n\n if (response.outcome?.outcome !== \"selected\") {\n const customMessage = (\n response._meta as Record<string, unknown> | undefined\n )?.message;\n return {\n behavior: \"deny\",\n message:\n typeof customMessage === \"string\"\n ? customMessage\n : \"User cancelled the questions\",\n };\n }\n\n const answers = response._meta?.answers as Record<string, string> | undefined;\n if (!answers || Object.keys(answers).length === 0) {\n return {\n behavior: \"deny\",\n message: \"User did not provide answers\",\n };\n }\n\n return {\n behavior: \"allow\",\n updatedInput: {\n ...(context.toolInput as Record<string, unknown>),\n answers,\n },\n };\n}\n\nasync function handleDefaultPermissionFlow(\n context: ToolHandlerContext,\n): Promise<ToolPermissionResult> {\n const {\n session,\n toolName,\n toolInput,\n toolUseID,\n client,\n sessionId,\n suggestions,\n } = context;\n\n const toolInfo = toolInfoFromToolUse(\n { name: toolName, input: toolInput },\n { cachedFileContent: context.fileContentCache, cwd: session?.cwd },\n );\n\n const options = buildPermissionOptions(\n toolName,\n toolInput as Record<string, unknown>,\n session?.cwd,\n suggestions,\n );\n\n const response = await client.requestPermission({\n options,\n sessionId,\n toolCall: {\n toolCallId: toolUseID,\n title: toolInfo.title,\n kind: toolInfo.kind,\n content: toolInfo.content,\n locations: toolInfo.locations,\n rawInput: { ...(toolInput as Record<string, unknown>), toolName },\n },\n });\n\n if (context.signal?.aborted || response.outcome?.outcome === \"cancelled\") {\n throw new Error(\"Tool use aborted\");\n }\n\n if (\n response.outcome?.outcome === \"selected\" &&\n (response.outcome.optionId === \"allow\" ||\n response.outcome.optionId === \"allow_always\")\n ) {\n if (response.outcome.optionId === \"allow_always\") {\n return {\n behavior: \"allow\",\n updatedInput: toolInput as Record<string, unknown>,\n updatedPermissions: suggestions ?? [\n {\n type: \"addRules\",\n rules: [{ toolName }],\n behavior: \"allow\",\n destination: \"localSettings\",\n },\n ],\n };\n }\n return {\n behavior: \"allow\",\n updatedInput: toolInput as Record<string, unknown>,\n };\n } else {\n const feedback = (\n response._meta?.customInput as string | undefined\n )?.trim();\n const message = feedback\n ? `User refused permission to run tool with feedback: ${feedback}`\n : \"User refused permission to run tool\";\n await emitToolDenial(context, message);\n return { behavior: \"deny\", message, interrupt: !feedback };\n }\n}\n\nfunction handlePlanFileException(\n context: ToolHandlerContext,\n): ToolPermissionResult | null {\n const { session, toolName, toolInput } = context;\n\n if (session.permissionMode !== \"plan\" || !WRITE_TOOLS.has(toolName)) {\n return null;\n }\n\n const filePath = (toolInput as { file_path?: string })?.file_path;\n if (!isClaudePlanFilePath(filePath)) {\n return null;\n }\n\n session.lastPlanFilePath = filePath;\n const content = (toolInput as { content?: string })?.content;\n if (typeof content === \"string\") {\n session.lastPlanContent = content;\n }\n\n return {\n behavior: \"allow\",\n updatedInput: toolInput as Record<string, unknown>,\n };\n}\n\nfunction extractDomainFromUrl(url: string): string | null {\n try {\n return new URL(url).hostname;\n } catch {\n return null;\n }\n}\n\nfunction isDomainAllowed(hostname: string, allowedDomains: string[]): boolean {\n return allowedDomains.some((pattern) => {\n if (pattern.startsWith(\"*.\")) {\n const suffix = pattern.slice(1); // \".example.com\"\n return hostname === pattern.slice(2) || hostname.endsWith(suffix);\n }\n return hostname === pattern;\n });\n}\n\nexport async function canUseTool(\n context: ToolHandlerContext,\n): Promise<ToolPermissionResult> {\n const { toolName, toolInput, session, allowedDomains } = context;\n\n // Enforce domain allowlist for web tools\n if (allowedDomains && allowedDomains.length > 0) {\n if (toolName === \"WebFetch\" || toolName === \"WebSearch\") {\n const url = toolInput.url as string | undefined;\n if (url) {\n const hostname = extractDomainFromUrl(url);\n if (hostname && !isDomainAllowed(hostname, allowedDomains)) {\n const message = `Domain \"${hostname}\" is not in the allowed list: ${allowedDomains.join(\", \")}`;\n await emitToolDenial(context, message);\n return { behavior: \"deny\", message, interrupt: false };\n }\n }\n }\n }\n\n if (isToolAllowedForMode(toolName, session.permissionMode)) {\n return {\n behavior: \"allow\",\n updatedInput: toolInput as Record<string, unknown>,\n };\n }\n\n if (toolName === \"EnterPlanMode\") {\n return handleEnterPlanModeTool(context);\n }\n\n if (toolName === \"ExitPlanMode\") {\n return handleExitPlanModeTool(context);\n }\n\n if (toolName === \"AskUserQuestion\") {\n return handleAskUserQuestionTool(context);\n }\n\n const planFileResult = handlePlanFileException(context);\n if (planFileResult) {\n return planFileResult;\n }\n\n // In plan mode, deny tools that aren't in the allowed set. The agent must\n // write its plan to ~/.claude/plans/ and call ExitPlanMode before it can\n // use write or bash tools. Without this guard, cloud runs auto-approve\n // restricted tools and the agent skips planning entirely.\n if (session.permissionMode === \"plan\") {\n const message =\n \"This tool is not available in plan mode. Write your plan \" +\n `to a file in ${getClaudePlansDir()} and call ExitPlanMode when ready.`;\n await emitToolDenial(context, message);\n return { behavior: \"deny\", message, interrupt: false };\n }\n\n return handleDefaultPermissionFlow(context);\n}\n","import type { AvailableCommand } from \"@agentclientprotocol/sdk\";\nimport type { SlashCommand } from \"@anthropic-ai/claude-agent-sdk\";\n\nconst UNSUPPORTED_COMMANDS = [\n \"context\",\n \"cost\",\n \"keybindings-help\",\n \"login\",\n \"logout\",\n \"output-style:new\",\n \"release-notes\",\n \"todos\",\n];\n\nexport function getAvailableSlashCommands(\n commands: SlashCommand[],\n): AvailableCommand[] {\n return commands\n .map((command) => {\n const input =\n command.argumentHint != null\n ? {\n hint: Array.isArray(command.argumentHint)\n ? command.argumentHint.join(\" \")\n : command.argumentHint,\n }\n : null;\n let name = command.name;\n if (command.name.endsWith(\" (MCP)\")) {\n name = `mcp:${name.replace(\" (MCP)\", \"\")}`;\n }\n return {\n name,\n description: command.description || \"\",\n input,\n };\n })\n .filter(\n (command: AvailableCommand) =>\n !UNSUPPORTED_COMMANDS.includes(command.name),\n );\n}\n","import type { NewSessionRequest } from \"@agentclientprotocol/sdk\";\nimport type { McpServerConfig } from \"@anthropic-ai/claude-agent-sdk\";\n\nexport function parseMcpServers(\n params: Pick<NewSessionRequest, \"mcpServers\">,\n): Record<string, McpServerConfig> {\n const mcpServers: Record<string, McpServerConfig> = {};\n if (!Array.isArray(params.mcpServers)) {\n return mcpServers;\n }\n\n for (const server of params.mcpServers) {\n if (\"type\" in server) {\n mcpServers[server.name] = {\n type: server.type,\n url: server.url,\n headers: server.headers\n ? Object.fromEntries(server.headers.map((e) => [e.name, e.value]))\n : undefined,\n };\n } else {\n mcpServers[server.name] = {\n type: \"stdio\",\n command: server.command,\n args: server.args,\n env: server.env\n ? Object.fromEntries(server.env.map((e) => [e.name, e.value]))\n : undefined,\n };\n }\n }\n\n return mcpServers;\n}\n","export const DEFAULT_MODEL = \"opus\";\n\nconst GATEWAY_TO_SDK_MODEL: Record<string, string> = {\n \"claude-opus-4-5\": \"opus\",\n \"claude-opus-4-6\": \"opus\",\n \"claude-opus-4-7\": \"opus\",\n \"claude-sonnet-4-5\": \"sonnet\",\n \"claude-sonnet-4-6\": \"sonnet\",\n \"claude-haiku-4-5\": \"haiku\",\n};\n\nexport function toSdkModelId(modelId: string): string {\n return GATEWAY_TO_SDK_MODEL[modelId] ?? modelId;\n}\n\nconst MODELS_WITH_1M_CONTEXT = new Set([\n \"claude-opus-4-6\",\n \"claude-opus-4-7\",\n \"claude-sonnet-4-6\",\n]);\n\nexport function supports1MContext(modelId: string): boolean {\n return MODELS_WITH_1M_CONTEXT.has(modelId);\n}\n\nconst MODELS_WITH_EFFORT = new Set([\n \"claude-opus-4-5\",\n \"claude-opus-4-6\",\n \"claude-opus-4-7\",\n \"claude-sonnet-4-6\",\n]);\n\nconst MODELS_WITH_XHIGH_EFFORT = new Set([\n \"claude-opus-4-6\",\n \"claude-opus-4-7\",\n]);\n\nexport function supportsEffort(modelId: string): boolean {\n return MODELS_WITH_EFFORT.has(modelId);\n}\n\nexport function supportsXhighEffort(modelId: string): boolean {\n return MODELS_WITH_XHIGH_EFFORT.has(modelId);\n}\n\nconst MODELS_TO_EXCLUDE_MCP_TOOLS = new Set([\"claude-haiku-4-5\"]);\n\nexport function supportsMcpInjection(modelId: string): boolean {\n return !MODELS_TO_EXCLUDE_MCP_TOOLS.has(modelId);\n}\n\ninterface EffortOption {\n value: string;\n name: string;\n}\n\nexport function getEffortOptions(modelId: string): EffortOption[] | null {\n if (!supportsEffort(modelId)) return null;\n\n const options: EffortOption[] = [\n { value: \"low\", name: \"Low\" },\n { value: \"medium\", name: \"Medium\" },\n { value: \"high\", name: \"High\" },\n ];\n\n if (supportsXhighEffort(modelId)) {\n options.push(\n { value: \"xhigh\", name: \"Extra High\" },\n { value: \"max\", name: \"Max\" },\n );\n }\n\n return options;\n}\n\n// Model alias resolution — lets callers use human-friendly aliases like\n// \"opus\" or \"sonnet\" instead of full model IDs like \"claude-opus-4-6\".\n\nconst MODEL_CONTEXT_HINT_PATTERN = /\\[(\\d+m)\\]$/i;\n\nfunction tokenizeModelPreference(model: string): {\n tokens: string[];\n contextHint?: string;\n} {\n const lower = model.trim().toLowerCase();\n const contextHint = lower\n .match(MODEL_CONTEXT_HINT_PATTERN)?.[1]\n ?.toLowerCase();\n\n const normalized = lower.replace(MODEL_CONTEXT_HINT_PATTERN, \" $1 \");\n const rawTokens = normalized.split(/[^a-z0-9]+/).filter(Boolean);\n const tokens = rawTokens\n .map((token) => {\n if (token === \"opusplan\") return \"opus\";\n if (token === \"best\" || token === \"default\") return \"\";\n return token;\n })\n .filter((token) => token && token !== \"claude\")\n .filter((token) => /[a-z]/.test(token) || token.endsWith(\"m\"));\n\n return { tokens, contextHint };\n}\n\ninterface ModelOption {\n value: string;\n name?: string;\n description?: string;\n}\n\nfunction scoreModelMatch(\n model: ModelOption,\n tokens: string[],\n contextHint?: string,\n): number {\n const haystack = `${model.value} ${model.name ?? \"\"}`.toLowerCase();\n let score = 0;\n for (const token of tokens) {\n if (haystack.includes(token)) {\n score += token === contextHint ? 3 : 1;\n }\n }\n return score;\n}\n\nexport function resolveModelPreference(\n preference: string,\n options: ModelOption[],\n): string | null {\n const trimmed = preference.trim();\n if (!trimmed) return null;\n\n const lower = trimmed.toLowerCase();\n\n // Exact match on value or display name\n const directMatch = options.find(\n (o) =>\n o.value === trimmed ||\n o.value.toLowerCase() === lower ||\n (o.name && o.name.toLowerCase() === lower),\n );\n if (directMatch) return directMatch.value;\n\n // Substring match\n const includesMatch = options.find((o) => {\n const value = o.value.toLowerCase();\n const display = (o.name ?? \"\").toLowerCase();\n return (\n value.includes(lower) || display.includes(lower) || lower.includes(value)\n );\n });\n if (includesMatch) return includesMatch.value;\n\n // Tokenized matching for aliases like \"opus[1m]\"\n const { tokens, contextHint } = tokenizeModelPreference(trimmed);\n if (tokens.length === 0) return null;\n\n let bestMatch: ModelOption | null = null;\n let bestScore = 0;\n for (const model of options) {\n const score = scoreModelMatch(model, tokens, contextHint);\n if (0 < score && (!bestMatch || bestScore < score)) {\n bestMatch = model;\n bestScore = score;\n }\n }\n\n return bestMatch?.value ?? null;\n}\n","import { spawn } from \"node:child_process\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type {\n CanUseTool,\n McpServerConfig,\n Options,\n OutputFormat,\n SpawnedProcess,\n SpawnOptions,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport type { FileEnrichmentDeps } from \"../../../enrichment/file-enricher\";\nimport { IS_ROOT } from \"../../../utils/common\";\nimport type { Logger } from \"../../../utils/logger\";\nimport {\n createPostToolUseHook,\n createPreToolUseHook,\n createReadEnrichmentHook,\n createSubagentRewriteHook,\n type EnrichedReadCache,\n type OnModeChange,\n} from \"../hooks\";\nimport type { CodeExecutionMode } from \"../tools\";\nimport type { EffortLevel } from \"../types\";\nimport { APPENDED_INSTRUCTIONS } from \"./instructions\";\nimport { DEFAULT_MODEL } from \"./models\";\nimport type { SettingsManager } from \"./settings\";\n\nexport interface ProcessSpawnedInfo {\n pid: number;\n command: string;\n sessionId: string;\n}\n\nexport interface BuildOptionsParams {\n cwd: string;\n mcpServers: Record<string, McpServerConfig>;\n permissionMode: CodeExecutionMode;\n canUseTool: CanUseTool;\n logger: Logger;\n systemPrompt?: Options[\"systemPrompt\"];\n userProvidedOptions?: Options;\n sessionId: string;\n isResume: boolean;\n forkSession?: boolean;\n additionalDirectories?: string[];\n disableBuiltInTools?: boolean;\n outputFormat?: OutputFormat;\n settingsManager: SettingsManager;\n onModeChange?: OnModeChange;\n onProcessSpawned?: (info: ProcessSpawnedInfo) => void;\n onProcessExited?: (pid: number) => void;\n effort?: EffortLevel;\n enrichmentDeps?: FileEnrichmentDeps;\n enrichedReadCache?: EnrichedReadCache;\n}\n\nexport function buildSystemPrompt(\n customPrompt?: unknown,\n): Options[\"systemPrompt\"] {\n const defaultPrompt: Options[\"systemPrompt\"] = {\n type: \"preset\",\n preset: \"claude_code\",\n append: APPENDED_INSTRUCTIONS,\n };\n\n if (!customPrompt) {\n return defaultPrompt;\n }\n\n if (typeof customPrompt === \"string\") {\n return customPrompt + APPENDED_INSTRUCTIONS;\n }\n\n if (\n typeof customPrompt === \"object\" &&\n customPrompt !== null &&\n \"append\" in customPrompt &&\n typeof customPrompt.append === \"string\"\n ) {\n return {\n ...defaultPrompt,\n append: customPrompt.append + APPENDED_INSTRUCTIONS,\n };\n }\n\n return defaultPrompt;\n}\n\nfunction buildMcpServers(\n userServers: Record<string, McpServerConfig> | undefined,\n acpServers: Record<string, McpServerConfig>,\n): Record<string, McpServerConfig> {\n return {\n ...(userServers || {}),\n ...acpServers,\n };\n}\n\nfunction buildEnvironment(): Record<string, string> {\n return {\n ...process.env,\n ELECTRON_RUN_AS_NODE: \"1\",\n CLAUDE_CODE_ENABLE_ASK_USER_QUESTION_TOOL: \"true\",\n // Offload all MCP tools by default\n ENABLE_TOOL_SEARCH: \"auto:0\",\n // Enable idle state as end-of-turn signal (required for SDK 0.2.114+)\n CLAUDE_CODE_EMIT_SESSION_STATE_EVENTS: \"1\",\n };\n}\n\nfunction buildHooks(\n userHooks: Options[\"hooks\"],\n onModeChange: OnModeChange | undefined,\n settingsManager: SettingsManager,\n logger: Logger,\n enrichmentDeps: FileEnrichmentDeps | undefined,\n enrichedReadCache: EnrichedReadCache | undefined,\n): Options[\"hooks\"] {\n const postToolUseHooks = [createPostToolUseHook({ onModeChange, logger })];\n if (enrichmentDeps && enrichedReadCache) {\n postToolUseHooks.push(\n createReadEnrichmentHook(enrichmentDeps, enrichedReadCache),\n );\n }\n\n return {\n ...userHooks,\n PostToolUse: [\n ...(userHooks?.PostToolUse || []),\n { hooks: postToolUseHooks },\n ],\n PreToolUse: [\n ...(userHooks?.PreToolUse || []),\n {\n hooks: [\n createPreToolUseHook(settingsManager, logger),\n createSubagentRewriteHook(logger),\n ],\n },\n ],\n };\n}\n\nfunction getAbortController(\n userProvidedController: AbortController | undefined,\n): AbortController {\n const controller = userProvidedController ?? new AbortController();\n if (controller.signal.aborted) {\n throw new Error(\"Cancelled\");\n }\n return controller;\n}\n\nfunction buildSpawnWrapper(\n sessionId: string,\n onProcessSpawned: (info: ProcessSpawnedInfo) => void,\n onProcessExited?: (pid: number) => void,\n logger?: Logger,\n): (options: SpawnOptions) => SpawnedProcess {\n return (spawnOpts: SpawnOptions): SpawnedProcess => {\n const child = spawn(spawnOpts.command, spawnOpts.args, {\n cwd: spawnOpts.cwd,\n env: spawnOpts.env as NodeJS.ProcessEnv,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n if (child.pid) {\n onProcessSpawned({\n pid: child.pid,\n command: `${spawnOpts.command} ${spawnOpts.args.join(\" \")}`,\n sessionId,\n });\n }\n\n child.stderr?.on(\"data\", (data: Buffer) => {\n const msg = data.toString().trim();\n if (msg && logger) {\n logger.debug(`[claude-code:${child.pid}] stderr: ${msg}`);\n }\n });\n\n if (onProcessExited) {\n child.on(\"exit\", () => {\n if (child.pid) {\n onProcessExited(child.pid);\n }\n });\n }\n\n // Listen for abort signal\n if (spawnOpts.signal) {\n spawnOpts.signal.addEventListener(\"abort\", () => {\n child.kill(\"SIGTERM\");\n });\n }\n\n if (!child.stdin || !child.stdout) {\n throw new Error(\n `Failed to get stdio streams for spawned process (pid=${child.pid})`,\n );\n }\n\n return {\n stdin: child.stdin,\n stdout: child.stdout,\n get killed() {\n return child.killed;\n },\n get exitCode() {\n return child.exitCode;\n },\n kill(signal: NodeJS.Signals) {\n return child.kill(signal);\n },\n // biome-ignore lint/suspicious/noExplicitAny: ChildProcess event listener types require any[]\n on(event: \"exit\" | \"error\", listener: (...args: any[]) => void) {\n child.on(event, listener);\n },\n // biome-ignore lint/suspicious/noExplicitAny: ChildProcess event listener types require any[]\n once(event: \"exit\" | \"error\", listener: (...args: any[]) => void) {\n child.once(event, listener);\n },\n // biome-ignore lint/suspicious/noExplicitAny: ChildProcess event listener types require any[]\n off(event: \"exit\" | \"error\", listener: (...args: any[]) => void) {\n child.off(event, listener);\n },\n };\n };\n}\n\nfunction ensureLocalSettings(cwd: string): void {\n const claudeDir = path.join(cwd, \".claude\");\n const localSettingsPath = path.join(claudeDir, \"settings.local.json\");\n try {\n if (!fs.existsSync(localSettingsPath)) {\n fs.mkdirSync(claudeDir, { recursive: true });\n fs.writeFileSync(localSettingsPath, \"{}\\n\", { flag: \"wx\" });\n }\n } catch {\n // Best-effort — don't fail session creation if we can't write\n }\n}\n\nexport function buildSessionOptions(params: BuildOptionsParams): Options {\n ensureLocalSettings(params.cwd);\n\n // Resolve which built-in tools to expose.\n // Explicit tools array from userProvidedOptions takes precedence.\n // disableBuiltInTools is a legacy shorthand for tools: [] — kept for\n // backward compatibility but callers should prefer the tools array.\n const tools: Options[\"tools\"] =\n params.userProvidedOptions?.tools ??\n (params.disableBuiltInTools\n ? []\n : { type: \"preset\", preset: \"claude_code\" });\n\n const options: Options = {\n ...params.userProvidedOptions,\n betas: [\"context-1m-2025-08-07\"],\n systemPrompt: params.systemPrompt ?? buildSystemPrompt(),\n settingSources: [\"user\", \"project\", \"local\"],\n stderr: (err) => params.logger.error(err),\n cwd: params.cwd,\n includePartialMessages: true,\n allowDangerouslySkipPermissions: !IS_ROOT,\n permissionMode: params.permissionMode,\n canUseTool: params.canUseTool,\n executable: \"node\",\n tools,\n extraArgs: {\n ...params.userProvidedOptions?.extraArgs,\n \"replay-user-messages\": \"\",\n },\n mcpServers: buildMcpServers(\n params.userProvidedOptions?.mcpServers,\n params.mcpServers,\n ),\n env: buildEnvironment(),\n hooks: buildHooks(\n params.userProvidedOptions?.hooks,\n params.onModeChange,\n params.settingsManager,\n params.logger,\n params.enrichmentDeps,\n params.enrichedReadCache,\n ),\n outputFormat: params.outputFormat,\n abortController: getAbortController(\n params.userProvidedOptions?.abortController,\n ),\n ...(params.onProcessSpawned && {\n spawnClaudeCodeProcess: buildSpawnWrapper(\n params.sessionId,\n params.onProcessSpawned,\n params.onProcessExited,\n params.logger,\n ),\n }),\n };\n\n if (process.env.CLAUDE_CODE_EXECUTABLE) {\n options.pathToClaudeCodeExecutable = process.env.CLAUDE_CODE_EXECUTABLE;\n }\n\n if (params.isResume) {\n options.resume = params.sessionId;\n options.forkSession = params.forkSession ?? false;\n } else {\n options.sessionId = params.sessionId;\n options.model = DEFAULT_MODEL;\n }\n\n if (params.additionalDirectories) {\n options.additionalDirectories = params.additionalDirectories;\n }\n\n if (params.effort) {\n options.effort = params.effort;\n }\n\n clearStatsigCache();\n return options;\n}\n\nfunction clearStatsigCache(): void {\n const statsigPath = path.join(\n process.env.CLAUDE_CONFIG_DIR || path.join(os.homedir(), \".claude\"),\n \"statsig\",\n );\n fs.rm(statsigPath, { recursive: true, force: true }, () => {\n // Best-effort, ignore errors\n });\n}\n","const BRANCH_NAMING = `\n# Branch Naming\n\nWhen working in a detached HEAD state, create a descriptive branch name based on the work being done before committing. Do this automatically without asking the user.\n`;\n\nconst PLAN_MODE = `\n# Plan Mode\n\nOnly enter plan mode (EnterPlanMode) when the user is requesting a significant change in approach or direction mid-task. Do NOT enter plan mode for:\n- Confirmations or approvals (\"yes\", \"looks good\", \"continue\", \"go ahead\")\n- Minor clarifications or small adjustments\n- Answers to questions you asked (unless you are still in the initial planning phase and have not yet started executing)\n- Feedback that does not require replanning\n\nWhen in doubt, continue executing and incorporate the feedback inline.\n`;\n\nexport const APPENDED_INSTRUCTIONS = BRANCH_NAMING + PLAN_MODE;\n","import * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { minimatch } from \"minimatch\";\n\nconst ACP_TOOL_NAME_PREFIX = \"mcp__acp__\";\n\nconst acpToolNames = {\n read: `${ACP_TOOL_NAME_PREFIX}Read`,\n edit: `${ACP_TOOL_NAME_PREFIX}Edit`,\n write: `${ACP_TOOL_NAME_PREFIX}Write`,\n bash: `${ACP_TOOL_NAME_PREFIX}Bash`,\n};\n\nconst SHELL_OPERATORS = [\"&&\", \"||\", \";\", \"|\", \"$(\", \"`\", \"\\n\"];\n\nfunction containsShellOperator(str: string): boolean {\n return SHELL_OPERATORS.some((op) => str.includes(op));\n}\n\nconst FILE_EDITING_TOOLS = [acpToolNames.edit, acpToolNames.write];\n\nconst FILE_READING_TOOLS = [acpToolNames.read];\n\nconst TOOL_ARG_ACCESSORS: Record<\n string,\n (input: Record<string, unknown>) => string | undefined\n> = {\n [acpToolNames.read]: (input) => input?.file_path as string | undefined,\n [acpToolNames.edit]: (input) => input?.file_path as string | undefined,\n [acpToolNames.write]: (input) => input?.file_path as string | undefined,\n [acpToolNames.bash]: (input) => input?.command as string | undefined,\n};\n\ninterface ParsedRule {\n toolName: string;\n argument?: string;\n isWildcard?: boolean;\n}\n\nfunction parseRule(rule: string): ParsedRule {\n const match = rule.match(/^(\\w+)(?:\\((.+)\\))?$/);\n if (!match) {\n return { toolName: rule };\n }\n const toolName = match[1] ?? rule;\n const argument = match[2];\n if (argument?.endsWith(\":*\")) {\n return {\n toolName,\n argument: argument.slice(0, -2),\n isWildcard: true,\n };\n }\n return { toolName, argument };\n}\n\nfunction normalizePath(filePath: string, cwd: string): string {\n let resolved = filePath;\n if (resolved.startsWith(\"~/\")) {\n resolved = path.join(os.homedir(), resolved.slice(2));\n } else if (resolved.startsWith(\"./\")) {\n resolved = path.join(cwd, resolved.slice(2));\n } else if (!path.isAbsolute(resolved)) {\n resolved = path.join(cwd, resolved);\n }\n return path.normalize(resolved).replace(/\\\\/g, \"/\");\n}\n\nfunction matchesGlob(pattern: string, filePath: string, cwd: string): boolean {\n const normalizedPattern = normalizePath(pattern, cwd);\n const normalizedPath = normalizePath(filePath, cwd);\n return minimatch(normalizedPath, normalizedPattern, {\n dot: true,\n matchBase: false,\n nocase: process.platform === \"win32\",\n });\n}\n\nfunction matchesRule(\n rule: ParsedRule,\n toolName: string,\n toolInput: unknown,\n cwd: string,\n): boolean {\n const ruleAppliesToTool =\n (rule.toolName === \"Bash\" && toolName === acpToolNames.bash) ||\n (rule.toolName === \"Edit\" && FILE_EDITING_TOOLS.includes(toolName)) ||\n (rule.toolName === \"Read\" && FILE_READING_TOOLS.includes(toolName));\n\n if (!ruleAppliesToTool) {\n return false;\n }\n\n if (!rule.argument) {\n return true;\n }\n\n const argAccessor = TOOL_ARG_ACCESSORS[toolName];\n if (!argAccessor) {\n return true;\n }\n\n const actualArg = argAccessor(toolInput as Record<string, unknown>);\n if (!actualArg) {\n return false;\n }\n\n if (toolName === acpToolNames.bash) {\n if (rule.isWildcard) {\n if (!actualArg.startsWith(rule.argument)) {\n return false;\n }\n const remainder = actualArg.slice(rule.argument.length);\n if (containsShellOperator(remainder)) {\n return false;\n }\n return true;\n }\n return actualArg === rule.argument;\n }\n\n return matchesGlob(rule.argument, actualArg, cwd);\n}\n\nasync function loadSettingsFile(\n filePath: string | undefined,\n): Promise<ClaudeCodeSettings> {\n if (!filePath) {\n return {};\n }\n try {\n const content = await fs.promises.readFile(filePath, \"utf-8\");\n return JSON.parse(content) as ClaudeCodeSettings;\n } catch (error) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n return {};\n }\n process.stderr.write(\n `[SettingsManager] Failed to load settings from ${filePath}: ${error}\\n`,\n );\n return {};\n }\n}\n\nexport interface PermissionSettings {\n allow?: string[];\n deny?: string[];\n ask?: string[];\n additionalDirectories?: string[];\n defaultMode?: string;\n}\n\nexport interface ClaudeCodeSettings {\n permissions?: PermissionSettings;\n env?: Record<string, string>;\n model?: string;\n}\n\nexport type PermissionDecision = \"allow\" | \"deny\" | \"ask\";\n\nexport interface PermissionCheckResult {\n decision: PermissionDecision;\n rule?: string;\n source?: \"allow\" | \"deny\" | \"ask\";\n}\n\nexport function getManagedSettingsPath(): string {\n switch (process.platform) {\n case \"darwin\":\n return \"/Library/Application Support/ClaudeCode/managed-settings.json\";\n case \"linux\":\n return \"/etc/claude-code/managed-settings.json\";\n case \"win32\":\n return \"C:\\\\Program Files\\\\ClaudeCode\\\\managed-settings.json\";\n default:\n return \"/etc/claude-code/managed-settings.json\";\n }\n}\nexport class SettingsManager {\n private cwd: string;\n private userSettings: ClaudeCodeSettings = {};\n private projectSettings: ClaudeCodeSettings = {};\n private localSettings: ClaudeCodeSettings = {};\n private enterpriseSettings: ClaudeCodeSettings = {};\n private mergedSettings: ClaudeCodeSettings = {};\n private initialized = false;\n private initPromise: Promise<void> | null = null;\n\n constructor(cwd: string) {\n this.cwd = cwd;\n }\n\n async initialize(): Promise<void> {\n if (this.initialized) return;\n if (this.initPromise) return this.initPromise;\n this.initPromise = this.loadAllSettings().then(() => {\n this.initialized = true;\n this.initPromise = null;\n });\n return this.initPromise;\n }\n\n private getUserSettingsPath(): string {\n const configDir =\n process.env.CLAUDE_CONFIG_DIR || path.join(os.homedir(), \".claude\");\n return path.join(configDir, \"settings.json\");\n }\n\n private getProjectSettingsPath(): string {\n return path.join(this.cwd, \".claude\", \"settings.json\");\n }\n\n private getLocalSettingsPath(): string {\n return path.join(this.cwd, \".claude\", \"settings.local.json\");\n }\n\n private async loadAllSettings(): Promise<void> {\n const [userSettings, projectSettings, localSettings, enterpriseSettings] =\n await Promise.all([\n loadSettingsFile(this.getUserSettingsPath()),\n loadSettingsFile(this.getProjectSettingsPath()),\n loadSettingsFile(this.getLocalSettingsPath()),\n loadSettingsFile(getManagedSettingsPath()),\n ]);\n this.userSettings = userSettings;\n this.projectSettings = projectSettings;\n this.localSettings = localSettings;\n this.enterpriseSettings = enterpriseSettings;\n this.mergeAllSettings();\n }\n\n private mergeAllSettings(): void {\n const allSettings = [\n this.userSettings,\n this.projectSettings,\n this.localSettings,\n this.enterpriseSettings,\n ];\n\n const permissions: PermissionSettings = {\n allow: [],\n deny: [],\n ask: [],\n };\n const merged: ClaudeCodeSettings = { permissions };\n\n for (const settings of allSettings) {\n if (settings.permissions) {\n if (settings.permissions.allow) {\n permissions.allow?.push(...settings.permissions.allow);\n }\n if (settings.permissions.deny) {\n permissions.deny?.push(...settings.permissions.deny);\n }\n if (settings.permissions.ask) {\n permissions.ask?.push(...settings.permissions.ask);\n }\n if (settings.permissions.additionalDirectories) {\n permissions.additionalDirectories = [\n ...(permissions.additionalDirectories || []),\n ...settings.permissions.additionalDirectories,\n ];\n }\n if (settings.permissions.defaultMode) {\n permissions.defaultMode = settings.permissions.defaultMode;\n }\n }\n if (settings.env) {\n merged.env = { ...merged.env, ...settings.env };\n }\n if (settings.model) {\n merged.model = settings.model;\n }\n }\n\n this.mergedSettings = merged;\n }\n\n checkPermission(toolName: string, toolInput: unknown): PermissionCheckResult {\n if (!toolName.startsWith(ACP_TOOL_NAME_PREFIX)) {\n return { decision: \"ask\" };\n }\n\n const permissions = this.mergedSettings.permissions;\n if (!permissions) {\n return { decision: \"ask\" };\n }\n\n for (const rule of permissions.deny || []) {\n const parsed = parseRule(rule);\n if (matchesRule(parsed, toolName, toolInput, this.cwd)) {\n return { decision: \"deny\", rule, source: \"deny\" };\n }\n }\n\n for (const rule of permissions.allow || []) {\n const parsed = parseRule(rule);\n if (matchesRule(parsed, toolName, toolInput, this.cwd)) {\n return { decision: \"allow\", rule, source: \"allow\" };\n }\n }\n\n for (const rule of permissions.ask || []) {\n const parsed = parseRule(rule);\n if (matchesRule(parsed, toolName, toolInput, this.cwd)) {\n return { decision: \"ask\", rule, source: \"ask\" };\n }\n }\n\n return { decision: \"ask\" };\n }\n\n getSettings(): ClaudeCodeSettings {\n return this.mergedSettings;\n }\n\n getCwd(): string {\n return this.cwd;\n }\n\n async setCwd(cwd: string): Promise<void> {\n if (this.cwd === cwd) return;\n if (this.initPromise) await this.initPromise;\n this.dispose();\n this.cwd = cwd;\n this.initialized = false;\n await this.initialize();\n }\n\n dispose(): void {\n this.initialized = false;\n }\n}\n","/**\n * In-process ACP proxy agent for Codex.\n *\n * Implements the ACP Agent interface and delegates to the codex-acp binary\n * via a ClientSideConnection. This gives us interception points for:\n * - PostHog-specific notifications (sdk_session, usage_update, turn_complete)\n * - Session resume/fork (not natively supported by codex-acp)\n * - Usage accumulation\n * - System prompt injection\n */\n\nimport {\n type AgentSideConnection,\n type AuthenticateRequest,\n ClientSideConnection,\n type ForkSessionRequest,\n type ForkSessionResponse,\n type InitializeRequest,\n type InitializeResponse,\n type ListSessionsRequest,\n type ListSessionsResponse,\n type LoadSessionRequest,\n type LoadSessionResponse,\n type McpServer,\n type NewSessionRequest,\n type NewSessionResponse,\n ndJsonStream,\n type PromptRequest,\n type PromptResponse,\n RequestError,\n type ResumeSessionRequest,\n type ResumeSessionResponse,\n type SetSessionConfigOptionRequest,\n type SetSessionConfigOptionResponse,\n type SetSessionModeRequest,\n type SetSessionModeResponse,\n} from \"@agentclientprotocol/sdk\";\nimport packageJson from \"../../../package.json\" with { type: \"json\" };\nimport {\n isMethod,\n POSTHOG_METHODS,\n POSTHOG_NOTIFICATIONS,\n} from \"../../acp-extensions\";\nimport {\n createEnrichment,\n type Enrichment,\n} from \"../../enrichment/file-enricher\";\nimport {\n type CodeExecutionMode,\n type CodexNativeMode,\n isCodeExecutionMode,\n isCodexNativeMode,\n type PermissionMode,\n} from \"../../execution-mode\";\nimport type { PostHogAPIConfig, ProcessSpawnedCallback } from \"../../types\";\nimport { Logger } from \"../../utils/logger\";\nimport {\n nodeReadableToWebReadable,\n nodeWritableToWebWritable,\n} from \"../../utils/streams\";\nimport { BaseAcpAgent, type BaseSession } from \"../base-acp-agent\";\nimport { createCodexClient } from \"./codex-client\";\nimport {\n type CodexSessionState,\n createSessionState,\n resetUsage,\n} from \"./session-state\";\nimport { CodexSettingsManager } from \"./settings\";\nimport {\n type CodexProcess,\n type CodexProcessOptions,\n spawnCodexProcess,\n} from \"./spawn\";\n\ninterface NewSessionMeta {\n taskRunId?: string;\n taskId?: string;\n systemPrompt?: string;\n permissionMode?: string;\n model?: string;\n persistence?: { taskId?: string; runId?: string; logUrl?: string };\n claudeCode?: {\n options?: Record<string, unknown>;\n };\n additionalRoots?: string[];\n disableBuiltInTools?: boolean;\n allowedDomains?: string[];\n}\n\nexport interface CodexAcpAgentOptions {\n codexProcessOptions: CodexProcessOptions;\n processCallbacks?: ProcessSpawnedCallback;\n posthogApiConfig?: PostHogAPIConfig;\n}\n\ntype CodexSession = BaseSession & {\n settingsManager: CodexSettingsManager;\n promptRunning: boolean;\n};\n\nfunction toCodexPermissionMode(mode?: string): PermissionMode {\n if (mode && (isCodexNativeMode(mode) || isCodeExecutionMode(mode))) {\n return mode;\n }\n return \"auto\";\n}\n\n/**\n * Prepend `_meta.prContext` (set by the agent-server on Slack-originated\n * follow-up runs) to the prompt as a text block, mirroring Claude's\n * `promptToClaude` behavior. Without this, codex cloud runs lose the\n * PR-review context that follow-up flows rely on.\n */\nfunction prependPrContext(params: PromptRequest): PromptRequest {\n const prContext = (params._meta as Record<string, unknown> | undefined)\n ?.prContext;\n if (typeof prContext !== \"string\" || prContext.length === 0) {\n return params;\n }\n return {\n ...params,\n prompt: [{ type: \"text\", text: prContext }, ...params.prompt],\n };\n}\n\nconst CODEX_NATIVE_MODE: Record<CodeExecutionMode, CodexNativeMode> = {\n auto: \"auto\",\n default: \"auto\",\n acceptEdits: \"auto\",\n plan: \"read-only\",\n bypassPermissions: \"full-access\",\n};\n\nfunction toCodexNativeMode(mode?: string): CodexNativeMode {\n if (mode && isCodexNativeMode(mode)) {\n return mode;\n }\n if (mode && isCodeExecutionMode(mode)) {\n return CODEX_NATIVE_MODE[mode];\n }\n return \"auto\";\n}\n\nfunction getCurrentPermissionMode(\n currentModeId?: string,\n fallbackMode?: string,\n): PermissionMode {\n if (currentModeId && isCodexNativeMode(currentModeId)) {\n return currentModeId;\n }\n\n return toCodexPermissionMode(fallbackMode);\n}\n\nexport class CodexAcpAgent extends BaseAcpAgent {\n readonly adapterName = \"codex\";\n declare session: CodexSession;\n private codexProcess: CodexProcess;\n private codexConnection: ClientSideConnection;\n private sessionState: CodexSessionState;\n /**\n * FIFO serializer for prompt() calls. codex-acp and codex-rs themselves\n * serialize submissions at the conversation level, but our adapter\n * accumulates per-turn usage into sessionState.accumulatedUsage via the\n * codex-client sessionUpdate handler. If two prompts ran concurrently on\n * the JS side, the second's resetUsage() would wipe out the first's\n * in-flight counters and both TURN_COMPLETE notifications would report\n * garbled totals. Serializing on the JS side keeps the accumulator\n * single-owner.\n */\n private promptMutex: Promise<unknown> = Promise.resolve();\n private readonly codexProcessOptions: CodexProcessOptions;\n private readonly processCallbacks?: ProcessSpawnedCallback;\n // Snapshot of the initialize() request so refreshSession can replay the\n // same handshake against a respawned codex-acp subprocess.\n private lastInitRequest?: InitializeRequest;\n private enrichment?: Enrichment;\n\n constructor(client: AgentSideConnection, options: CodexAcpAgentOptions) {\n super(client);\n this.logger = new Logger({ debug: true, prefix: \"[CodexAcpAgent]\" });\n\n // Load user codex settings before spawning so spawnCodexProcess can\n // filter out any [mcp_servers.*] entries from ~/.codex/config.toml.\n const cwd = options.codexProcessOptions.cwd ?? process.cwd();\n const settingsManager = new CodexSettingsManager(cwd);\n\n this.codexProcessOptions = options.codexProcessOptions;\n this.processCallbacks = options.processCallbacks;\n\n // Spawn the codex-acp subprocess\n this.codexProcess = spawnCodexProcess({\n ...options.codexProcessOptions,\n settings: settingsManager.getSettings(),\n logger: this.logger,\n processCallbacks: options.processCallbacks,\n });\n\n // Create ACP connection to codex-acp over stdin/stdout\n const codexReadable = nodeReadableToWebReadable(this.codexProcess.stdout);\n const codexWritable = nodeWritableToWebWritable(this.codexProcess.stdin);\n const codexStream = ndJsonStream(codexWritable, codexReadable);\n\n const abortController = new AbortController();\n this.session = {\n abortController,\n settingsManager,\n notificationHistory: [],\n cancelled: false,\n promptRunning: false,\n };\n\n this.sessionState = createSessionState(\"\", cwd);\n\n this.enrichment = createEnrichment(options.posthogApiConfig, this.logger);\n\n // Create the ClientSideConnection to codex-acp.\n // The Client handler delegates all requests from codex-acp to the upstream\n // PostHog Code client via our AgentSideConnection.\n this.codexConnection = new ClientSideConnection(\n (_agent) =>\n createCodexClient(this.client, this.logger, this.sessionState, {\n enrichmentDeps: this.enrichment?.deps,\n }),\n codexStream,\n );\n }\n\n async initialize(request: InitializeRequest): Promise<InitializeResponse> {\n // Initialize settings\n await this.session.settingsManager.initialize();\n\n // Snapshot the handshake so refreshSession can replay it after respawn.\n this.lastInitRequest = request;\n\n // Forward to codex-acp\n const response = await this.codexConnection.initialize(request);\n\n // Merge our enhanced capabilities\n return {\n ...response,\n agentCapabilities: {\n ...response.agentCapabilities,\n sessionCapabilities: {\n ...response.agentCapabilities?.sessionCapabilities,\n resume: {},\n fork: {},\n },\n _meta: {\n posthog: {\n resumeSession: true,\n },\n },\n },\n agentInfo: {\n name: packageJson.name,\n title: \"Codex Agent\",\n version: packageJson.version,\n },\n };\n }\n\n async newSession(params: NewSessionRequest): Promise<NewSessionResponse> {\n const meta = params._meta as NewSessionMeta | undefined;\n const requestedPermissionMode = toCodexPermissionMode(meta?.permissionMode);\n\n const response = await this.codexConnection.newSession(params);\n\n // Initialize session state\n this.sessionState = createSessionState(response.sessionId, params.cwd, {\n taskRunId: meta?.taskRunId,\n taskId: meta?.taskId ?? meta?.persistence?.taskId,\n modeId: response.modes?.currentModeId ?? \"auto\",\n modelId: response.models?.currentModelId,\n permissionMode: requestedPermissionMode,\n });\n this.sessionId = response.sessionId;\n this.sessionState.configOptions = response.configOptions ?? [];\n\n await this.applyInitialPermissionMode(\n response.sessionId,\n meta?.permissionMode,\n response.modes?.currentModeId,\n );\n\n // Emit _posthog/sdk_session so the app can track the session\n if (meta?.taskRunId) {\n await this.client.extNotification(POSTHOG_NOTIFICATIONS.SDK_SESSION, {\n taskRunId: meta.taskRunId,\n sessionId: response.sessionId,\n adapter: \"codex\",\n });\n }\n\n this.logger.info(\"Codex session created\", {\n sessionId: response.sessionId,\n taskRunId: meta?.taskRunId,\n });\n\n return response;\n }\n\n async loadSession(params: LoadSessionRequest): Promise<LoadSessionResponse> {\n const response = await this.codexConnection.loadSession(params);\n const meta = params._meta as NewSessionMeta | undefined;\n const currentPermissionMode = getCurrentPermissionMode(\n response.modes?.currentModeId,\n meta?.permissionMode,\n );\n\n // Carry taskRunId/taskId across load so prompt() still emits cloud\n // notifications (TURN_COMPLETE, USAGE_UPDATE) after a reload. newSession\n // and unstable_resumeSession both do this; loadSession historically did\n // not, which silently broke task-completion tracking on re-attach.\n this.sessionState = createSessionState(params.sessionId, params.cwd, {\n taskRunId: meta?.taskRunId,\n taskId: meta?.taskId ?? meta?.persistence?.taskId,\n modeId: response.modes?.currentModeId ?? \"auto\",\n permissionMode: currentPermissionMode,\n });\n this.sessionId = params.sessionId;\n this.sessionState.configOptions = response.configOptions ?? [];\n\n if (meta?.taskRunId) {\n await this.client.extNotification(POSTHOG_NOTIFICATIONS.SDK_SESSION, {\n taskRunId: meta.taskRunId,\n sessionId: params.sessionId,\n adapter: \"codex\",\n });\n }\n\n return response;\n }\n\n async unstable_resumeSession(\n params: ResumeSessionRequest,\n ): Promise<ResumeSessionResponse> {\n // codex-acp doesn't support resume natively, use loadSession instead\n const loadResponse = await this.codexConnection.loadSession({\n sessionId: params.sessionId,\n cwd: params.cwd,\n mcpServers: params.mcpServers ?? [],\n });\n\n const meta = params._meta as NewSessionMeta | undefined;\n const currentPermissionMode = getCurrentPermissionMode(\n loadResponse.modes?.currentModeId,\n meta?.permissionMode,\n );\n this.sessionState = createSessionState(params.sessionId, params.cwd, {\n taskRunId: meta?.taskRunId,\n taskId: meta?.taskId ?? meta?.persistence?.taskId,\n modeId: loadResponse.modes?.currentModeId ?? \"auto\",\n permissionMode: currentPermissionMode,\n });\n this.sessionId = params.sessionId;\n this.sessionState.configOptions = loadResponse.configOptions ?? [];\n\n if (meta?.taskRunId) {\n await this.client.extNotification(POSTHOG_NOTIFICATIONS.SDK_SESSION, {\n taskRunId: meta.taskRunId,\n sessionId: params.sessionId,\n adapter: \"codex\",\n });\n }\n\n return {\n modes: loadResponse.modes,\n models: loadResponse.models,\n configOptions: loadResponse.configOptions,\n };\n }\n\n async unstable_forkSession(\n params: ForkSessionRequest,\n ): Promise<ForkSessionResponse> {\n // Create a new session via codex-acp (fork isn't natively supported)\n const newResponse = await this.codexConnection.newSession({\n cwd: params.cwd,\n mcpServers: params.mcpServers ?? [],\n _meta: params._meta,\n });\n\n const meta = params._meta as NewSessionMeta | undefined;\n const requestedPermissionMode = toCodexPermissionMode(meta?.permissionMode);\n this.sessionState = createSessionState(newResponse.sessionId, params.cwd, {\n taskRunId: meta?.taskRunId,\n taskId: meta?.taskId ?? meta?.persistence?.taskId,\n modeId: newResponse.modes?.currentModeId ?? \"auto\",\n permissionMode: requestedPermissionMode,\n });\n this.sessionId = newResponse.sessionId;\n this.sessionState.configOptions = newResponse.configOptions ?? [];\n\n await this.applyInitialPermissionMode(\n newResponse.sessionId,\n meta?.permissionMode,\n newResponse.modes?.currentModeId,\n );\n\n return newResponse;\n }\n\n private async applyInitialPermissionMode(\n sessionId: string,\n permissionMode?: string,\n currentModeId?: string,\n ): Promise<void> {\n if (!permissionMode) {\n return;\n }\n\n const nativeMode = toCodexNativeMode(permissionMode);\n if (nativeMode === currentModeId) {\n this.sessionState.modeId = nativeMode;\n this.sessionState.permissionMode = toCodexPermissionMode(permissionMode);\n return;\n }\n\n await this.codexConnection.setSessionMode({\n sessionId,\n modeId: nativeMode,\n });\n this.sessionState.modeId = nativeMode;\n this.sessionState.permissionMode = toCodexPermissionMode(permissionMode);\n }\n\n async listSessions(\n params: ListSessionsRequest,\n ): Promise<ListSessionsResponse> {\n return this.codexConnection.listSessions(params);\n }\n\n async unstable_listSessions(\n params: ListSessionsRequest,\n ): Promise<ListSessionsResponse> {\n return this.listSessions(params);\n }\n\n async prompt(params: PromptRequest): Promise<PromptResponse> {\n const previous = this.promptMutex;\n const next = previous.catch(() => {}).then(() => this.runPrompt(params));\n this.promptMutex = next;\n return next;\n }\n\n private async runPrompt(params: PromptRequest): Promise<PromptResponse> {\n this.session.cancelled = false;\n this.session.interruptReason = undefined;\n resetUsage(this.sessionState);\n\n // codex-acp does not echo the user prompt back on the agent→client\n // channel, so without this broadcast the tapped stream (persisted to S3\n // and rendered by the PostHog web UI) never sees a user turn and only\n // the assistant reply shows up. Mirrors ClaudeAcpAgent.broadcastUserMessage.\n // The original params (no _meta.prContext prefix) is broadcast so the\n // injected PR context is not rendered as a user message.\n await this.broadcastUserMessage(params);\n\n this.session.promptRunning = true;\n let response: PromptResponse;\n try {\n response = await this.codexConnection.prompt(prependPrContext(params));\n } finally {\n this.session.promptRunning = false;\n }\n\n // Usage is already accumulated via sessionUpdate notifications in\n // codex-client.ts. Do NOT also add response.usage here or tokens\n // get double-counted.\n\n if (this.sessionState.taskRunId) {\n const { accumulatedUsage } = this.sessionState;\n\n await this.client.extNotification(POSTHOG_NOTIFICATIONS.TURN_COMPLETE, {\n sessionId: params.sessionId,\n stopReason: response.stopReason ?? \"end_turn\",\n usage: {\n inputTokens: accumulatedUsage.inputTokens,\n outputTokens: accumulatedUsage.outputTokens,\n cachedReadTokens: accumulatedUsage.cachedReadTokens,\n cachedWriteTokens: accumulatedUsage.cachedWriteTokens,\n totalTokens:\n accumulatedUsage.inputTokens +\n accumulatedUsage.outputTokens +\n accumulatedUsage.cachedReadTokens +\n accumulatedUsage.cachedWriteTokens,\n },\n });\n\n if (response.usage) {\n await this.client.extNotification(POSTHOG_NOTIFICATIONS.USAGE_UPDATE, {\n sessionId: params.sessionId,\n used: {\n inputTokens: response.usage.inputTokens ?? 0,\n outputTokens: response.usage.outputTokens ?? 0,\n cachedReadTokens: response.usage.cachedReadTokens ?? 0,\n cachedWriteTokens: response.usage.cachedWriteTokens ?? 0,\n },\n cost: null,\n });\n }\n }\n\n return response;\n }\n\n protected async interrupt(): Promise<void> {\n await this.codexConnection.cancel({\n sessionId: this.sessionId,\n });\n }\n\n private async broadcastUserMessage(params: PromptRequest): Promise<void> {\n for (const chunk of params.prompt) {\n const notification = {\n sessionId: params.sessionId,\n update: {\n sessionUpdate: \"user_message_chunk\" as const,\n content: chunk,\n },\n };\n await this.client.sessionUpdate(notification);\n this.appendNotification(params.sessionId, notification);\n }\n }\n\n /**\n * Refresh the session between turns. Currently the only refreshable field\n * is `mcpServers`. Unlike Claude (where we rebuild an in-process Query with\n * `resume`), Codex runs as a `codex-acp` subprocess whose MCP set is bound\n * at `newSession`/`loadSession` time and whose user-local MCPs are disabled\n * via spawn-time `-c mcp_servers.<name>.enabled=false` CLI args. To\n * guarantee the caller-supplied set fully wins, we respawn the subprocess\n * and rehydrate the session via `loadSession` — codex-acp persists sessions\n * to disk, so conversation history is preserved.\n *\n * This is an `extMethod` (request/response), not `extNotification`, so the\n * caller can await completion before sending the next prompt.\n *\n * Caller contract: only call REFRESH_SESSION between turns (no prompt in flight).\n */\n async extMethod(\n method: string,\n params: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n if (!isMethod(method, POSTHOG_METHODS.REFRESH_SESSION)) {\n throw RequestError.methodNotFound(method);\n }\n\n // Trust boundary: refresh is only safe when the caller is trusted infra\n // (e.g. the sandbox agent-server). Do not route this method from\n // untrusted clients — mcpServers contents are forwarded verbatim to\n // codex-acp with no URL/command validation.\n if (params.mcpServers === undefined) {\n throw new RequestError(\n -32602,\n \"refresh_session requires at least one refreshable field (e.g. mcpServers)\",\n );\n }\n if (!Array.isArray(params.mcpServers)) {\n throw new RequestError(\n -32602,\n \"refresh_session: mcpServers must be an array\",\n );\n }\n\n await this.refreshSession(params.mcpServers as McpServer[]);\n return { refreshed: true };\n }\n\n private async refreshSession(mcpServers: McpServer[]): Promise<void> {\n const prev = this.session;\n if (prev.promptRunning) {\n throw new RequestError(\n -32002,\n \"Cannot refresh session while a prompt turn is in flight\",\n );\n }\n\n this.logger.info(\"Refreshing Codex session with fresh MCP servers\", {\n serverCount: mcpServers.length,\n sessionId: this.sessionId,\n });\n\n // Abort FIRST so any stuck in-flight ACP request unblocks — otherwise\n // cancel() can deadlock waiting on a codex-acp call that never returns.\n prev.abortController.abort();\n try {\n await this.codexConnection.cancel({ sessionId: this.sessionId });\n } catch (err) {\n this.logger.warn(\"cancel() during refresh failed (non-fatal)\", {\n error: err,\n });\n }\n this.codexProcess.kill();\n\n // Respawn with the same options and a fresh settings manager rooted at\n // the current cwd (so the `mcp_servers.<name>.enabled=false` args are\n // regenerated from the latest ~/.codex/config.toml).\n const cwd = prev.settingsManager.getCwd();\n const newSettingsManager = new CodexSettingsManager(cwd);\n await newSettingsManager.initialize();\n\n const newProcess = spawnCodexProcess({\n ...this.codexProcessOptions,\n cwd,\n settings: newSettingsManager.getSettings(),\n logger: this.logger,\n processCallbacks: this.processCallbacks,\n });\n\n const codexReadable = nodeReadableToWebReadable(newProcess.stdout);\n const codexWritable = nodeWritableToWebWritable(newProcess.stdin);\n const codexStream = ndJsonStream(codexWritable, codexReadable);\n\n const newAbortController = new AbortController();\n const newConnection = new ClientSideConnection(\n (_agent) =>\n createCodexClient(this.client, this.logger, this.sessionState),\n codexStream,\n );\n\n // Re-run ACP init on the new subprocess, then rehydrate the session with\n // the new MCP set. loadSession is codex-acp's equivalent of Claude's\n // `resume` — conversation history is restored from disk.\n const initRequest: InitializeRequest = this.lastInitRequest ?? {\n protocolVersion: 1,\n };\n await newConnection.initialize(initRequest);\n await newConnection.loadSession({\n sessionId: this.sessionId,\n cwd: this.sessionState.cwd,\n mcpServers,\n });\n\n // Swap everything at once so closeSession/prompt/cancel target the new\n // subprocess going forward. Preserve sessionState (accumulatedUsage,\n // taskRunId, configOptions) untouched.\n this.codexProcess = newProcess;\n this.codexConnection = newConnection;\n prev.settingsManager.dispose();\n prev.settingsManager = newSettingsManager;\n prev.abortController = newAbortController;\n }\n\n async setSessionMode(\n params: SetSessionModeRequest,\n ): Promise<SetSessionModeResponse> {\n const requestedMode = toCodexPermissionMode(params.modeId);\n const nativeMode = toCodexNativeMode(params.modeId);\n\n const response = await this.codexConnection.setSessionMode({\n ...params,\n modeId: nativeMode,\n });\n\n this.sessionState.modeId = nativeMode;\n this.sessionState.permissionMode = requestedMode;\n return response ?? {};\n }\n\n async setSessionConfigOption(\n params: SetSessionConfigOptionRequest,\n ): Promise<SetSessionConfigOptionResponse> {\n const response = await this.codexConnection.setSessionConfigOption(params);\n if (response.configOptions) {\n this.sessionState.configOptions = response.configOptions;\n }\n return response;\n }\n\n async authenticate(_params: AuthenticateRequest): Promise<void> {\n // Auth handled externally\n }\n\n async closeSession(): Promise<void> {\n this.logger.info(\"Closing Codex session\", { sessionId: this.sessionId });\n this.session.abortController.abort();\n this.session.settingsManager.dispose();\n try {\n this.codexProcess.kill();\n } catch (err) {\n this.logger.warn(\"Failed to kill codex-acp process\", { error: err });\n }\n this.enrichment?.dispose();\n this.enrichment = undefined;\n }\n}\n","/**\n * ACP Client implementation for communicating with codex-acp subprocess.\n *\n * This acts as the \"client\" from codex-acp's perspective: it receives\n * permission requests, session updates, file I/O, and terminal operations\n * from codex-acp and delegates them to the upstream PostHog Code client.\n */\n\nimport type {\n AgentSideConnection,\n Client,\n CreateTerminalRequest,\n CreateTerminalResponse,\n KillTerminalRequest,\n KillTerminalResponse,\n ReadTextFileRequest,\n ReadTextFileResponse,\n ReleaseTerminalRequest,\n ReleaseTerminalResponse,\n RequestPermissionRequest,\n RequestPermissionResponse,\n SessionNotification,\n TerminalHandle,\n TerminalOutputRequest,\n TerminalOutputResponse,\n ToolKind,\n WaitForTerminalExitRequest,\n WaitForTerminalExitResponse,\n WriteTextFileRequest,\n WriteTextFileResponse,\n} from \"@agentclientprotocol/sdk\";\nimport {\n enrichFileForAgent,\n type FileEnrichmentDeps,\n} from \"../../enrichment/file-enricher\";\nimport type { PermissionMode } from \"../../execution-mode\";\nimport type { Logger } from \"../../utils/logger\";\nimport type { CodexSessionState } from \"./session-state\";\n\nexport interface CodexClientCallbacks {\n /** Called when a usage_update session notification is received */\n onUsageUpdate?: (update: Record<string, unknown>) => void;\n /** When set, Read responses are annotated with PostHog enrichment before reaching codex-acp. */\n enrichmentDeps?: FileEnrichmentDeps;\n}\n\nconst AUTO_APPROVED_KINDS: Record<PermissionMode, Set<ToolKind>> = {\n default: new Set([\"read\", \"search\", \"fetch\", \"think\"]),\n acceptEdits: new Set([\"read\", \"edit\", \"search\", \"fetch\", \"think\"]),\n plan: new Set([\"read\", \"search\", \"fetch\", \"think\"]),\n bypassPermissions: new Set([\n \"read\",\n \"edit\",\n \"delete\",\n \"move\",\n \"search\",\n \"execute\",\n \"think\",\n \"fetch\",\n \"switch_mode\",\n \"other\",\n ]),\n auto: new Set([\"read\", \"search\", \"fetch\", \"think\"]),\n \"read-only\": new Set([\"read\", \"search\", \"fetch\", \"think\"]),\n \"full-access\": new Set([\n \"read\",\n \"edit\",\n \"delete\",\n \"move\",\n \"search\",\n \"execute\",\n \"think\",\n \"fetch\",\n \"switch_mode\",\n \"other\",\n ]),\n};\n\nfunction shouldAutoApprove(\n mode: PermissionMode,\n kind: ToolKind | null | undefined,\n): boolean {\n if (mode === \"bypassPermissions\" || mode === \"full-access\") return true;\n if (!kind) return false;\n return AUTO_APPROVED_KINDS[mode]?.has(kind) ?? false;\n}\n\n/**\n * Creates an ACP Client that delegates all requests from codex-acp\n * to the upstream PostHog Code client (via AgentSideConnection).\n */\nexport function createCodexClient(\n upstreamClient: AgentSideConnection,\n logger: Logger,\n sessionState: CodexSessionState,\n callbacks?: CodexClientCallbacks,\n): Client {\n const terminalHandles = new Map<string, TerminalHandle>();\n\n return {\n async requestPermission(\n params: RequestPermissionRequest,\n ): Promise<RequestPermissionResponse> {\n const kind = params.toolCall?.kind as ToolKind | null | undefined;\n\n if (shouldAutoApprove(sessionState.permissionMode, kind)) {\n logger.debug(\"Auto-approving permission\", {\n mode: sessionState.permissionMode,\n kind,\n toolCallId: params.toolCall?.toolCallId,\n });\n const allowOption = params.options?.find(\n (o) => o.kind === \"allow_once\" || o.kind === \"allow_always\",\n );\n return {\n outcome: {\n outcome: \"selected\",\n optionId: allowOption?.optionId ?? \"allow\",\n },\n };\n }\n\n return upstreamClient.requestPermission(params);\n },\n\n async sessionUpdate(params: SessionNotification): Promise<void> {\n const update = params.update as Record<string, unknown> | undefined;\n if (update?.sessionUpdate === \"usage_update\") {\n const used = update.used as number | undefined;\n const size = update.size as number | undefined;\n if (used !== undefined) sessionState.contextUsed = used;\n if (size !== undefined) sessionState.contextSize = size;\n\n // Accumulate per-message token usage when available\n const inputTokens = update.inputTokens as number | undefined;\n const outputTokens = update.outputTokens as number | undefined;\n if (inputTokens !== undefined) {\n sessionState.accumulatedUsage.inputTokens += inputTokens;\n }\n if (outputTokens !== undefined) {\n sessionState.accumulatedUsage.outputTokens += outputTokens;\n }\n const cachedRead = update.cachedReadTokens as number | undefined;\n const cachedWrite = update.cachedWriteTokens as number | undefined;\n if (cachedRead !== undefined) {\n sessionState.accumulatedUsage.cachedReadTokens += cachedRead;\n }\n if (cachedWrite !== undefined) {\n sessionState.accumulatedUsage.cachedWriteTokens += cachedWrite;\n }\n\n callbacks?.onUsageUpdate?.(update);\n }\n\n await upstreamClient.sessionUpdate(params);\n },\n\n async readTextFile(\n params: ReadTextFileRequest,\n ): Promise<ReadTextFileResponse> {\n const response = await upstreamClient.readTextFile(params);\n if (!callbacks?.enrichmentDeps) return response;\n const enriched = await enrichFileForAgent(\n callbacks.enrichmentDeps,\n params.path,\n response.content,\n );\n return enriched ? { ...response, content: enriched } : response;\n },\n\n async writeTextFile(\n params: WriteTextFileRequest,\n ): Promise<WriteTextFileResponse> {\n return upstreamClient.writeTextFile(params);\n },\n\n async createTerminal(\n params: CreateTerminalRequest,\n ): Promise<CreateTerminalResponse> {\n const handle = await upstreamClient.createTerminal(params);\n terminalHandles.set(handle.id, handle);\n return { terminalId: handle.id };\n },\n\n async terminalOutput(\n params: TerminalOutputRequest,\n ): Promise<TerminalOutputResponse> {\n const handle = terminalHandles.get(params.terminalId);\n if (!handle) {\n return { output: \"\", truncated: false };\n }\n return handle.currentOutput();\n },\n\n async releaseTerminal(\n params: ReleaseTerminalRequest,\n ): Promise<ReleaseTerminalResponse | undefined> {\n const handle = terminalHandles.get(params.terminalId);\n if (handle) {\n terminalHandles.delete(params.terminalId);\n const result = await handle.release();\n return result ?? undefined;\n }\n },\n\n async waitForTerminalExit(\n params: WaitForTerminalExitRequest,\n ): Promise<WaitForTerminalExitResponse> {\n const handle = terminalHandles.get(params.terminalId);\n if (!handle) {\n return { exitCode: 1 };\n }\n return handle.waitForExit();\n },\n\n async killTerminal(\n params: KillTerminalRequest,\n ): Promise<KillTerminalResponse | undefined> {\n const handle = terminalHandles.get(params.terminalId);\n if (handle) {\n return handle.kill();\n }\n },\n\n async extMethod(\n method: string,\n params: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n return upstreamClient.extMethod(method, params);\n },\n\n async extNotification(\n method: string,\n params: Record<string, unknown>,\n ): Promise<void> {\n return upstreamClient.extNotification(method, params);\n },\n };\n}\n","/**\n * Session state tracking for Codex proxy agent.\n * Tracks usage accumulation, model/mode state, and config options.\n */\n\nimport type { SessionConfigOption } from \"@agentclientprotocol/sdk\";\nimport type { PermissionMode } from \"../../execution-mode\";\n\nexport interface CodexUsage {\n inputTokens: number;\n outputTokens: number;\n cachedReadTokens: number;\n cachedWriteTokens: number;\n}\n\nexport interface CodexSessionState {\n sessionId: string;\n cwd: string;\n modelId?: string;\n modeId: string;\n configOptions: SessionConfigOption[];\n accumulatedUsage: CodexUsage;\n contextSize?: number;\n contextUsed?: number;\n permissionMode: PermissionMode;\n taskRunId?: string;\n taskId?: string;\n}\n\nexport function createSessionState(\n sessionId: string,\n cwd: string,\n opts?: {\n taskRunId?: string;\n taskId?: string;\n modeId?: string;\n modelId?: string;\n permissionMode?: PermissionMode;\n },\n): CodexSessionState {\n return {\n sessionId,\n cwd,\n modeId: opts?.modeId ?? \"auto\",\n modelId: opts?.modelId,\n configOptions: [],\n accumulatedUsage: {\n inputTokens: 0,\n outputTokens: 0,\n cachedReadTokens: 0,\n cachedWriteTokens: 0,\n },\n permissionMode: opts?.permissionMode ?? \"auto\",\n taskRunId: opts?.taskRunId,\n taskId: opts?.taskId,\n };\n}\n\nexport function resetUsage(state: CodexSessionState): void {\n state.accumulatedUsage = {\n inputTokens: 0,\n outputTokens: 0,\n cachedReadTokens: 0,\n cachedWriteTokens: 0,\n };\n}\n","import * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\n\n/**\n * Codex settings parsed from ~/.codex/config.toml and project-level config.\n *\n * Mirrors the shape of ClaudeCodeSettings so both adapters have a\n * consistent settings interface.\n */\nexport interface CodexSettings {\n model?: string;\n personality?: string;\n modelReasoningEffort?: string;\n trustLevel?: string;\n // Names of every `[mcp_servers.<name>]` section declared in the user's config.toml\n mcpServerNames: string[];\n}\n\n/**\n * SettingsManager for Codex sessions.\n *\n * Reads from ~/.codex/config.toml (user-level) and respects\n * per-project trust configuration. Has the same public interface\n * as Claude's SettingsManager so both can satisfy BaseSession.\n */\nexport class CodexSettingsManager {\n private cwd: string;\n private settings: CodexSettings = { mcpServerNames: [] };\n\n constructor(cwd: string) {\n this.cwd = cwd;\n this.loadSettings();\n }\n\n async initialize(): Promise<void> {\n // No-op: settings are loaded in the constructor. Kept async to\n // satisfy the BaseSettingsManager interface.\n }\n\n private getConfigPath(): string {\n return path.join(os.homedir(), \".codex\", \"config.toml\");\n }\n\n private loadSettings(): void {\n const configPath = this.getConfigPath();\n try {\n const content = fs.readFileSync(configPath, \"utf-8\");\n this.settings = parseCodexToml(content, this.cwd);\n } catch {\n this.settings = { mcpServerNames: [] };\n }\n }\n\n getSettings(): CodexSettings {\n return this.settings;\n }\n\n getCwd(): string {\n return this.cwd;\n }\n\n async setCwd(cwd: string): Promise<void> {\n if (this.cwd === cwd) return;\n this.cwd = cwd;\n this.loadSettings();\n }\n\n dispose(): void {\n // No-op: no resources to release. Kept to satisfy the BaseSettingsManager interface.\n }\n}\n\n/**\n * Minimal TOML parser for codex config.toml.\n * Handles flat key=value pairs and [projects.\"path\"] sections.\n * Does NOT handle full TOML spec — only what codex config uses.\n */\nfunction parseCodexToml(content: string, cwd: string): CodexSettings {\n const settings: CodexSettings = { mcpServerNames: [] };\n const mcpServerNames = new Set<string>();\n let currentSection = \"\";\n\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n\n // Section header: [projects.\"/some/path\"] or [section]\n const sectionMatch = trimmed.match(/^\\[(.+)\\]$/);\n if (sectionMatch) {\n currentSection = sectionMatch[1] ?? \"\";\n if (currentSection.startsWith(\"mcp_servers.\")) {\n mcpServerNames.add(currentSection.slice(\"mcp_servers.\".length));\n }\n continue;\n }\n\n // Key = value\n const kvMatch = trimmed.match(/^(\\w+)\\s*=\\s*(.+)$/);\n if (!kvMatch) continue;\n\n const key = kvMatch[1];\n let value = kvMatch[2]?.trim() ?? \"\";\n\n // Strip quotes\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n\n if (!currentSection) {\n // Top-level keys\n if (key === \"model\") settings.model = value;\n if (key === \"personality\") settings.personality = value;\n if (key === \"model_reasoning_effort\")\n settings.modelReasoningEffort = value;\n } else if (currentSection === `projects.\"${cwd}\"`) {\n // Project-specific keys\n if (key === \"trust_level\") settings.trustLevel = value;\n }\n }\n\n settings.mcpServerNames = Array.from(mcpServerNames);\n return settings;\n}\n","import { type ChildProcess, spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { delimiter, dirname } from \"node:path\";\nimport type { Readable, Writable } from \"node:stream\";\nimport type { ProcessSpawnedCallback } from \"../../types\";\nimport { Logger } from \"../../utils/logger\";\nimport type { CodexSettings } from \"./settings\";\n\nexport interface CodexProcessOptions {\n cwd?: string;\n apiBaseUrl?: string;\n apiKey?: string;\n model?: string;\n reasoningEffort?: string;\n instructions?: string;\n binaryPath?: string;\n logger?: Logger;\n processCallbacks?: ProcessSpawnedCallback;\n settings?: CodexSettings;\n}\n\nexport interface CodexProcess {\n process: ChildProcess;\n stdin: Writable;\n stdout: Readable;\n kill: () => void;\n}\n\nfunction buildConfigArgs(options: CodexProcessOptions): string[] {\n const args: string[] = [];\n\n args.push(\"-c\", `features.remote_models=false`);\n\n // Disable the user's local MCPs one-by-one so Codex only uses the MCPs we\n // provide via ACP. We can't use `-c mcp_servers={}` because that makes Codex\n // ignore MCPs entirely, including the ones we inject later.\n for (const name of options.settings?.mcpServerNames ?? []) {\n args.push(\"-c\", `mcp_servers.${name}.enabled=false`);\n }\n\n if (options.apiBaseUrl) {\n args.push(\"-c\", `model_provider=\"posthog\"`);\n args.push(\"-c\", `model_providers.posthog.name=\"PostHog Gateway\"`);\n args.push(\"-c\", `model_providers.posthog.base_url=\"${options.apiBaseUrl}\"`);\n args.push(\"-c\", `model_providers.posthog.wire_api=\"responses\"`);\n args.push(\n \"-c\",\n `model_providers.posthog.env_key=\"POSTHOG_GATEWAY_API_KEY\"`,\n );\n }\n\n if (options.model) {\n args.push(\"-c\", `model=\"${options.model}\"`);\n }\n\n if (options.reasoningEffort) {\n args.push(\"-c\", `model_reasoning_effort=\"${options.reasoningEffort}\"`);\n }\n\n if (options.instructions) {\n const escaped = options.instructions\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\\n/g, \"\\\\n\")\n .replace(/\\r/g, \"\\\\r\")\n .replace(/\"/g, '\\\\\"');\n args.push(\"-c\", `instructions=\"${escaped}\"`);\n }\n\n return args;\n}\n\nfunction findCodexBinary(options: CodexProcessOptions): {\n command: string;\n args: string[];\n} {\n const configArgs = buildConfigArgs(options);\n\n if (options.binaryPath && existsSync(options.binaryPath)) {\n return { command: options.binaryPath, args: configArgs };\n }\n\n if (options.binaryPath) {\n throw new Error(\n `codex-acp binary not found at ${options.binaryPath}. Run \"node apps/code/scripts/download-binaries.mjs\" to download it.`,\n );\n }\n\n return { command: \"npx\", args: [\"@zed-industries/codex-acp\", ...configArgs] };\n}\n\nexport function spawnCodexProcess(options: CodexProcessOptions): CodexProcess {\n const logger =\n options.logger ?? new Logger({ debug: true, prefix: \"[CodexSpawn]\" });\n\n const env: NodeJS.ProcessEnv = { ...process.env };\n\n delete env.ELECTRON_RUN_AS_NODE;\n delete env.ELECTRON_NO_ASAR;\n\n if (options.apiKey) {\n env.POSTHOG_GATEWAY_API_KEY = options.apiKey;\n }\n\n const { command, args } = findCodexBinary(options);\n\n if (options.binaryPath && existsSync(options.binaryPath)) {\n const binDir = dirname(options.binaryPath);\n env.PATH = `${binDir}${delimiter}${env.PATH ?? \"\"}`;\n }\n\n logger.info(\"Spawning codex-acp process\", {\n command,\n args,\n cwd: options.cwd,\n hasApiBaseUrl: !!options.apiBaseUrl,\n hasApiKey: !!options.apiKey,\n binaryPath: options.binaryPath,\n });\n\n const child = spawn(command, args, {\n cwd: options.cwd,\n env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n detached: process.platform !== \"win32\",\n });\n\n child.stderr?.on(\"data\", (data: Buffer) => {\n logger.warn(\"codex-acp stderr:\", data.toString());\n });\n\n child.on(\"error\", (err) => {\n logger.error(\"codex-acp process error:\", err);\n });\n\n child.on(\"exit\", (code, signal) => {\n logger.info(\"codex-acp process exited\", { code, signal });\n if (child.pid && options.processCallbacks?.onProcessExited) {\n options.processCallbacks.onProcessExited(child.pid);\n }\n });\n\n if (!child.stdin || !child.stdout) {\n throw new Error(\"Failed to get stdio streams from codex-acp process\");\n }\n\n if (child.pid && options.processCallbacks?.onProcessSpawned) {\n options.processCallbacks.onProcessSpawned({\n pid: child.pid,\n command,\n });\n }\n\n return {\n process: child,\n stdin: child.stdin,\n stdout: child.stdout,\n kill: () => {\n logger.info(\"Killing codex-acp process\", { pid: child.pid });\n child.stdin?.destroy();\n child.stdout?.destroy();\n child.stderr?.destroy();\n child.kill(\"SIGTERM\");\n },\n };\n}\n","export type GatewayProduct = \"posthog_code\" | \"background_agents\";\n\nfunction getGatewayBaseUrl(posthogHost: string): string {\n const url = new URL(posthogHost);\n const hostname = url.hostname;\n\n if (hostname === \"localhost\" || hostname === \"127.0.0.1\") {\n return `${url.protocol}//localhost:3308`;\n }\n\n if (hostname === \"host.docker.internal\") {\n return `${url.protocol}//host.docker.internal:3308`;\n }\n\n const region = hostname.match(/^(us|eu)\\.posthog\\.com$/)?.[1] ?? \"us\";\n return `https://gateway.${region}.posthog.com`;\n}\n\nexport function getLlmGatewayUrl(\n posthogHost: string,\n product: GatewayProduct = \"posthog_code\",\n): string {\n return `${getGatewayBaseUrl(posthogHost)}/${product}`;\n}\n\nexport function getGatewayUsageUrl(\n posthogHost: string,\n product: GatewayProduct = \"posthog_code\",\n): string {\n return `${getGatewayBaseUrl(posthogHost)}/v1/usage/${product}`;\n}\n","import packageJson from \"../package.json\" with { type: \"json\" };\nimport type {\n ArtifactType,\n PostHogAPIConfig,\n StoredEntry,\n Task,\n TaskRun,\n TaskRunArtifact,\n} from \"./types\";\nimport { getGatewayUsageUrl, getLlmGatewayUrl } from \"./utils/gateway\";\n\nexport { getGatewayUsageUrl, getLlmGatewayUrl };\n\nconst DEFAULT_USER_AGENT = `posthog/agent.hog.dev; version: ${packageJson.version}`;\n\nexport interface TaskArtifactUploadPayload {\n name: string;\n type: ArtifactType;\n content: string;\n content_type?: string;\n}\n\nexport type TaskRunUpdate = Partial<\n Pick<\n TaskRun,\n | \"status\"\n | \"branch\"\n | \"stage\"\n | \"error_message\"\n | \"output\"\n | \"state\"\n | \"environment\"\n >\n> & {\n state_remove_keys?: string[];\n};\n\nexport class PostHogAPIClient {\n private config: PostHogAPIConfig;\n\n constructor(config: PostHogAPIConfig) {\n this.config = config;\n }\n\n private get baseUrl(): string {\n const host = this.config.apiUrl.endsWith(\"/\")\n ? this.config.apiUrl.slice(0, -1)\n : this.config.apiUrl;\n return host;\n }\n\n private isAuthFailure(status: number): boolean {\n return status === 401 || status === 403;\n }\n\n private async resolveApiKey(forceRefresh = false): Promise<string> {\n if (forceRefresh && this.config.refreshApiKey) {\n return this.config.refreshApiKey();\n }\n\n return this.config.getApiKey();\n }\n\n private async buildHeaders(\n options: RequestInit,\n forceRefresh = false,\n ): Promise<Headers> {\n const headers = new Headers(options.headers);\n headers.set(\n \"Authorization\",\n `Bearer ${await this.resolveApiKey(forceRefresh)}`,\n );\n headers.set(\"Content-Type\", \"application/json\");\n headers.set(\"User-Agent\", this.config.userAgent ?? DEFAULT_USER_AGENT);\n return headers;\n }\n\n private async performRequest(\n endpoint: string,\n options: RequestInit,\n forceRefresh = false,\n ): Promise<Response> {\n const url = `${this.baseUrl}${endpoint}`;\n\n return fetch(url, {\n ...options,\n headers: await this.buildHeaders(options, forceRefresh),\n });\n }\n\n private async performRequestWithRetry(\n endpoint: string,\n options: RequestInit = {},\n ): Promise<Response> {\n let response = await this.performRequest(endpoint, options);\n\n if (!response.ok && this.isAuthFailure(response.status)) {\n response = await this.performRequest(endpoint, options, true);\n }\n\n return response;\n }\n\n private async apiRequest<T>(\n endpoint: string,\n options: RequestInit = {},\n ): Promise<T> {\n const response = await this.performRequestWithRetry(endpoint, options);\n\n if (!response.ok) {\n let errorMessage: string;\n try {\n const errorResponse = await response.json();\n errorMessage = `Failed request: [${response.status}] ${JSON.stringify(errorResponse)}`;\n } catch {\n errorMessage = `Failed request: [${response.status}] ${response.statusText}`;\n }\n throw new Error(errorMessage);\n }\n\n return response.json();\n }\n\n private getTeamId(): number {\n return this.config.projectId;\n }\n\n async getApiKey(forceRefresh = false): Promise<string> {\n return this.resolveApiKey(forceRefresh);\n }\n\n getLlmGatewayUrl(): string {\n return getLlmGatewayUrl(this.baseUrl);\n }\n\n async getTask(taskId: string): Promise<Task> {\n const teamId = this.getTeamId();\n return this.apiRequest<Task>(`/api/projects/${teamId}/tasks/${taskId}/`);\n }\n\n async getTaskRun(taskId: string, runId: string): Promise<TaskRun> {\n const teamId = this.getTeamId();\n return this.apiRequest<TaskRun>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/`,\n );\n }\n\n async updateTaskRun(\n taskId: string,\n runId: string,\n payload: TaskRunUpdate,\n ): Promise<TaskRun> {\n const teamId = this.getTeamId();\n return this.apiRequest<TaskRun>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/`,\n {\n method: \"PATCH\",\n body: JSON.stringify(payload),\n },\n );\n }\n\n async setTaskRunOutput(\n taskId: string,\n runId: string,\n output: Record<string, unknown>,\n ): Promise<TaskRun> {\n return this.apiRequest(\n `/api/projects/${this.getTeamId()}/tasks/${taskId}/runs/${runId}/set_output/`,\n {\n method: \"PATCH\",\n body: JSON.stringify(output),\n },\n );\n }\n\n async appendTaskRunLog(\n taskId: string,\n runId: string,\n entries: StoredEntry[],\n ): Promise<TaskRun> {\n const teamId = this.getTeamId();\n return this.apiRequest<TaskRun>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/append_log/`,\n {\n method: \"POST\",\n body: JSON.stringify({ entries }),\n },\n );\n }\n\n async relayMessage(\n taskId: string,\n runId: string,\n text: string,\n ): Promise<void> {\n const teamId = this.getTeamId();\n await this.apiRequest<{ status: string }>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/relay_message/`,\n {\n method: \"POST\",\n body: JSON.stringify({ text }),\n },\n );\n }\n\n async uploadTaskArtifacts(\n taskId: string,\n runId: string,\n artifacts: TaskArtifactUploadPayload[],\n ): Promise<TaskRunArtifact[]> {\n if (!artifacts.length) {\n return [];\n }\n\n const teamId = this.getTeamId();\n const response = await this.apiRequest<{ artifacts: TaskRunArtifact[] }>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/artifacts/`,\n {\n method: \"POST\",\n body: JSON.stringify({ artifacts }),\n },\n );\n\n return response.artifacts ?? [];\n }\n\n /**\n * Download artifact content by storage path\n * Streams the file through the PostHog backend so the sandbox does not need\n * direct access to object storage.\n */\n async downloadArtifact(\n taskId: string,\n runId: string,\n storagePath: string,\n ): Promise<ArrayBuffer | null> {\n const teamId = this.getTeamId();\n\n try {\n const response = await this.performRequestWithRetry(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/artifacts/download/`,\n {\n method: \"POST\",\n body: JSON.stringify({ storage_path: storagePath }),\n },\n );\n if (!response.ok) {\n throw new Error(`Failed to download artifact: ${response.status}`);\n }\n return response.arrayBuffer();\n } catch {\n return null;\n }\n }\n\n /**\n * Fetch logs for a task run via the logs API endpoint\n * @param taskRun - The task run to fetch logs for\n * @returns Array of stored entries, or empty array if no logs available\n */\n async fetchTaskRunLogs(taskRun: TaskRun): Promise<StoredEntry[]> {\n const teamId = this.getTeamId();\n const endpoint = `/api/projects/${teamId}/tasks/${taskRun.task}/runs/${taskRun.id}/logs`;\n\n try {\n const response = await this.performRequestWithRetry(endpoint);\n\n if (!response.ok) {\n if (response.status === 404) {\n return [];\n }\n throw new Error(\n `Failed to fetch logs: ${response.status} ${response.statusText}`,\n );\n }\n\n const content = await response.text();\n\n if (!content.trim()) {\n return [];\n }\n\n // Parse newline-delimited JSON\n return content\n .trim()\n .split(\"\\n\")\n .map((line) => JSON.parse(line) as StoredEntry);\n } catch (error) {\n throw new Error(\n `Failed to fetch task run logs: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n}\n","import fs from \"node:fs\";\nimport fsp from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { SessionContext } from \"./otel-log-writer\";\nimport type { PostHogAPIClient } from \"./posthog-api\";\nimport type { StoredNotification } from \"./types\";\nimport { Logger } from \"./utils/logger\";\n\nexport interface SessionLogWriterOptions {\n /** PostHog API client for log persistence */\n posthogAPI?: PostHogAPIClient;\n /** Logger instance */\n logger?: Logger;\n /** Local cache path for instant log loading (e.g., ~/.posthog-code) */\n localCachePath?: string;\n}\n\ninterface ChunkBuffer {\n text: string;\n firstTimestamp: string;\n}\n\ninterface SessionState {\n context: SessionContext;\n chunkBuffer?: ChunkBuffer;\n lastAgentMessage?: string;\n currentTurnMessages: string[];\n}\n\nexport class SessionLogWriter {\n private static readonly FLUSH_DEBOUNCE_MS = 500;\n private static readonly FLUSH_MAX_INTERVAL_MS = 5000;\n private static readonly MAX_FLUSH_RETRIES = 10;\n private static readonly MAX_RETRY_DELAY_MS = 30_000;\n private static readonly SESSIONS_MAX_AGE_MS = 30 * 24 * 60 * 60 * 1000;\n\n private posthogAPI?: PostHogAPIClient;\n private pendingEntries: Map<string, StoredNotification[]> = new Map();\n private flushTimeouts: Map<string, NodeJS.Timeout> = new Map();\n private lastFlushAttemptTime: Map<string, number> = new Map();\n private retryCounts: Map<string, number> = new Map();\n private sessions: Map<string, SessionState> = new Map();\n private flushQueues: Map<string, Promise<void>> = new Map();\n\n private logger: Logger;\n private localCachePath?: string;\n\n constructor(options: SessionLogWriterOptions = {}) {\n this.posthogAPI = options.posthogAPI;\n this.localCachePath = options.localCachePath;\n this.logger =\n options.logger ??\n new Logger({ debug: false, prefix: \"[SessionLogWriter]\" });\n }\n\n async flushAll(): Promise<void> {\n // Coalesce any in-progress chunk buffers before the final flush\n // During normal operation, chunks are coalesced when the next non-chunk\n // event arrives, but on shutdown there may be no subsequent event\n const flushPromises: Promise<void>[] = [];\n for (const [sessionId, session] of this.sessions) {\n this.emitCoalescedMessage(sessionId, session);\n flushPromises.push(this.flush(sessionId));\n }\n await Promise.all(flushPromises);\n }\n\n register(sessionId: string, context: SessionContext): void {\n if (this.sessions.has(sessionId)) {\n return;\n }\n\n this.sessions.set(sessionId, { context, currentTurnMessages: [] });\n\n this.lastFlushAttemptTime.set(sessionId, Date.now());\n\n if (this.localCachePath) {\n const sessionDir = path.join(\n this.localCachePath,\n \"sessions\",\n context.runId,\n );\n try {\n fs.mkdirSync(sessionDir, { recursive: true });\n } catch (error) {\n this.logger.warn(\"Failed to create local cache directory\", {\n sessionDir,\n error,\n });\n }\n }\n }\n\n isRegistered(sessionId: string): boolean {\n return this.sessions.has(sessionId);\n }\n\n appendRawLine(sessionId: string, line: string): void {\n const session = this.sessions.get(sessionId);\n if (!session) {\n this.logger.warn(\"appendRawLine called for unregistered session\", {\n sessionId,\n });\n return;\n }\n\n try {\n const message = JSON.parse(line);\n const timestamp = new Date().toISOString();\n\n // Check if this is an agent_message_chunk event\n if (this.isAgentMessageChunk(message)) {\n const text = this.extractChunkText(message);\n if (text) {\n if (!session.chunkBuffer) {\n session.chunkBuffer = { text, firstTimestamp: timestamp };\n } else {\n session.chunkBuffer.text += text;\n }\n }\n // Don't emit chunk events\n return;\n }\n\n // Non-chunk event: flush any buffered chunks first.\n // If this is a direct agent_message AND there are buffered chunks,\n // the direct message supersedes the partial chunks\n if (this.isDirectAgentMessage(message) && session.chunkBuffer) {\n session.chunkBuffer = undefined;\n } else {\n this.emitCoalescedMessage(sessionId, session);\n }\n\n const nonChunkAgentText = this.extractAgentMessageText(message);\n if (nonChunkAgentText) {\n session.lastAgentMessage = nonChunkAgentText;\n session.currentTurnMessages.push(nonChunkAgentText);\n }\n\n const entry: StoredNotification = {\n type: \"notification\",\n timestamp,\n notification: message,\n };\n\n this.writeToLocalCache(sessionId, entry);\n\n if (this.posthogAPI) {\n const pending = this.pendingEntries.get(sessionId) ?? [];\n pending.push(entry);\n this.pendingEntries.set(sessionId, pending);\n this.scheduleFlush(sessionId);\n }\n } catch {\n this.logger.warn(\"Failed to parse raw line for persistence\", {\n taskId: session.context.taskId,\n runId: session.context.runId,\n lineLength: line.length,\n });\n }\n }\n\n async flush(\n sessionId: string,\n { coalesce = false }: { coalesce?: boolean } = {},\n ): Promise<void> {\n if (coalesce) {\n const session = this.sessions.get(sessionId);\n if (session) {\n this.emitCoalescedMessage(sessionId, session);\n }\n }\n\n // Serialize flushes per session\n const prev = this.flushQueues.get(sessionId) ?? Promise.resolve();\n const next = prev.catch(() => {}).then(() => this._doFlush(sessionId));\n this.flushQueues.set(sessionId, next);\n next.finally(() => {\n if (this.flushQueues.get(sessionId) === next) {\n this.flushQueues.delete(sessionId);\n }\n });\n return next;\n }\n\n private async _doFlush(sessionId: string): Promise<void> {\n const session = this.sessions.get(sessionId);\n if (!session) {\n this.logger.warn(\"flush: no session found\", { sessionId });\n return;\n }\n\n const pending = this.pendingEntries.get(sessionId);\n if (!this.posthogAPI || !pending?.length) {\n return;\n }\n\n this.pendingEntries.delete(sessionId);\n const timeout = this.flushTimeouts.get(sessionId);\n if (timeout) {\n clearTimeout(timeout);\n this.flushTimeouts.delete(sessionId);\n }\n\n this.lastFlushAttemptTime.set(sessionId, Date.now());\n\n try {\n await this.posthogAPI.appendTaskRunLog(\n session.context.taskId,\n session.context.runId,\n pending,\n );\n this.retryCounts.set(sessionId, 0);\n } catch (error) {\n const retryCount = (this.retryCounts.get(sessionId) ?? 0) + 1;\n this.retryCounts.set(sessionId, retryCount);\n\n if (retryCount >= SessionLogWriter.MAX_FLUSH_RETRIES) {\n this.logger.error(\n `Dropping ${pending.length} session log entries after ${retryCount} failed flush attempts`,\n {\n taskId: session.context.taskId,\n runId: session.context.runId,\n error,\n },\n );\n this.retryCounts.set(sessionId, 0);\n } else {\n if (retryCount === 1) {\n this.logger.warn(\n `Failed to persist session logs, will retry (up to ${SessionLogWriter.MAX_FLUSH_RETRIES} attempts)`,\n {\n taskId: session.context.taskId,\n runId: session.context.runId,\n error: error instanceof Error ? error.message : String(error),\n },\n );\n }\n const currentPending = this.pendingEntries.get(sessionId) ?? [];\n this.pendingEntries.set(sessionId, [...pending, ...currentPending]);\n this.scheduleFlush(sessionId);\n }\n }\n }\n\n private getSessionUpdateType(\n message: Record<string, unknown>,\n ): string | undefined {\n if (message.method !== \"session/update\") return undefined;\n const params = message.params as Record<string, unknown> | undefined;\n const update = params?.update as Record<string, unknown> | undefined;\n return update?.sessionUpdate as string | undefined;\n }\n\n private isDirectAgentMessage(message: Record<string, unknown>): boolean {\n return this.getSessionUpdateType(message) === \"agent_message\";\n }\n\n private isAgentMessageChunk(message: Record<string, unknown>): boolean {\n return this.getSessionUpdateType(message) === \"agent_message_chunk\";\n }\n\n private extractChunkText(message: Record<string, unknown>): string {\n const params = message.params as Record<string, unknown> | undefined;\n const update = params?.update as Record<string, unknown> | undefined;\n const content = update?.content as\n | { type: string; text?: string }\n | undefined;\n if (content?.type === \"text\" && content.text) {\n return content.text;\n }\n return \"\";\n }\n\n private emitCoalescedMessage(sessionId: string, session: SessionState): void {\n if (!session.chunkBuffer) return;\n\n const { text, firstTimestamp } = session.chunkBuffer;\n session.chunkBuffer = undefined;\n session.lastAgentMessage = text;\n session.currentTurnMessages.push(text);\n\n const entry: StoredNotification = {\n type: \"notification\",\n timestamp: firstTimestamp,\n notification: {\n jsonrpc: \"2.0\",\n method: \"session/update\",\n params: {\n update: {\n sessionUpdate: \"agent_message\",\n content: { type: \"text\", text },\n },\n },\n },\n };\n\n this.writeToLocalCache(sessionId, entry);\n\n if (this.posthogAPI) {\n const pending = this.pendingEntries.get(sessionId) ?? [];\n pending.push(entry);\n this.pendingEntries.set(sessionId, pending);\n this.scheduleFlush(sessionId);\n }\n }\n\n getLastAgentMessage(sessionId: string): string | undefined {\n return this.sessions.get(sessionId)?.lastAgentMessage;\n }\n\n getFullAgentResponse(sessionId: string): string | undefined {\n const session = this.sessions.get(sessionId);\n if (!session || session.currentTurnMessages.length === 0) return undefined;\n\n if (session.chunkBuffer) {\n this.logger.warn(\n \"getFullAgentResponse called with non-empty chunk buffer\",\n {\n sessionId,\n bufferedLength: session.chunkBuffer.text.length,\n },\n );\n }\n\n return session.currentTurnMessages.join(\"\\n\\n\");\n }\n\n resetTurnMessages(sessionId: string): void {\n const session = this.sessions.get(sessionId);\n if (session) {\n session.currentTurnMessages = [];\n }\n }\n\n private extractAgentMessageText(\n message: Record<string, unknown>,\n ): string | null {\n if (message.method !== \"session/update\") {\n return null;\n }\n\n const params = message.params as Record<string, unknown> | undefined;\n const update = params?.update as Record<string, unknown> | undefined;\n if (update?.sessionUpdate !== \"agent_message\") {\n return null;\n }\n\n const content = update.content as\n | { type?: string; text?: string }\n | undefined;\n if (content?.type === \"text\" && typeof content.text === \"string\") {\n const trimmed = content.text.trim();\n return trimmed.length > 0 ? trimmed : null;\n }\n\n if (typeof update.message === \"string\") {\n const trimmed = update.message.trim();\n return trimmed.length > 0 ? trimmed : null;\n }\n\n return null;\n }\n\n private scheduleFlush(sessionId: string): void {\n const existing = this.flushTimeouts.get(sessionId);\n if (existing) clearTimeout(existing);\n\n const retryCount = this.retryCounts.get(sessionId) ?? 0;\n const lastAttempt = this.lastFlushAttemptTime.get(sessionId) ?? 0;\n const elapsed = Date.now() - lastAttempt;\n\n let delay: number;\n if (retryCount > 0) {\n // Exponential backoff on retries: FLUSH_DEBOUNCE_MS * 2^retryCount, capped\n delay = Math.min(\n SessionLogWriter.FLUSH_DEBOUNCE_MS * 2 ** retryCount,\n SessionLogWriter.MAX_RETRY_DELAY_MS,\n );\n } else if (elapsed >= SessionLogWriter.FLUSH_MAX_INTERVAL_MS) {\n // If we've been accumulating for longer than the max interval, flush immediately\n delay = 0;\n } else {\n delay = SessionLogWriter.FLUSH_DEBOUNCE_MS;\n }\n\n const timeout = setTimeout(() => this.flush(sessionId), delay);\n this.flushTimeouts.set(sessionId, timeout);\n }\n\n private writeToLocalCache(\n sessionId: string,\n entry: StoredNotification,\n ): void {\n if (!this.localCachePath) return;\n\n const session = this.sessions.get(sessionId);\n if (!session) return;\n\n const logPath = path.join(\n this.localCachePath,\n \"sessions\",\n session.context.runId,\n \"logs.ndjson\",\n );\n\n try {\n fs.appendFileSync(logPath, `${JSON.stringify(entry)}\\n`);\n } catch (error) {\n this.logger.warn(\"Failed to write to local cache\", {\n taskId: session.context.taskId,\n runId: session.context.runId,\n logPath,\n error,\n });\n }\n }\n\n static async cleanupOldSessions(localCachePath: string): Promise<number> {\n const sessionsDir = path.join(localCachePath, \"sessions\");\n let deleted = 0;\n try {\n const entries = await fsp.readdir(sessionsDir);\n const now = Date.now();\n for (const entry of entries) {\n const entryPath = path.join(sessionsDir, entry);\n try {\n const stats = await fsp.stat(entryPath);\n if (\n stats.isDirectory() &&\n now - stats.birthtimeMs > SessionLogWriter.SESSIONS_MAX_AGE_MS\n ) {\n await fsp.rm(entryPath, { recursive: true, force: true });\n deleted++;\n }\n } catch {\n // Skip entries we can't stat\n }\n }\n } catch {\n // Sessions dir may not exist yet\n }\n return deleted;\n }\n}\n","import {\n createAcpConnection,\n type InProcessAcpConnection,\n} from \"./adapters/acp-connection\";\nimport {\n BLOCKED_MODELS,\n DEFAULT_CODEX_MODEL,\n DEFAULT_GATEWAY_MODEL,\n fetchModelsList,\n} from \"./gateway-models\";\nimport { PostHogAPIClient, type TaskRunUpdate } from \"./posthog-api\";\nimport { SessionLogWriter } from \"./session-log-writer\";\nimport type { AgentConfig, TaskExecutionOptions } from \"./types\";\nimport { Logger } from \"./utils/logger\";\n\nexport class Agent {\n private posthogAPI?: PostHogAPIClient;\n private logger: Logger;\n private acpConnection?: InProcessAcpConnection;\n private taskRunId?: string;\n private sessionLogWriter?: SessionLogWriter;\n private posthogApiConfig?: AgentConfig[\"posthog\"];\n private enricherEnabled: boolean;\n\n constructor(config: AgentConfig) {\n this.logger = new Logger({\n debug: config.debug || false,\n prefix: \"[PostHog Agent]\",\n onLog: config.onLog,\n });\n\n if (config.posthog) {\n this.posthogAPI = new PostHogAPIClient(config.posthog);\n this.posthogApiConfig = config.posthog;\n }\n this.enricherEnabled = config.enricher?.enabled !== false;\n\n if (config.posthog && !config.skipLogPersistence) {\n this.sessionLogWriter = new SessionLogWriter({\n posthogAPI: this.posthogAPI,\n logger: this.logger.child(\"SessionLogWriter\"),\n localCachePath: config.localCachePath,\n });\n\n if (config.localCachePath) {\n SessionLogWriter.cleanupOldSessions(config.localCachePath).catch(\n () => {},\n );\n }\n }\n }\n\n private async _configureLlmGateway(overrideUrl?: string): Promise<{\n gatewayUrl: string;\n apiKey: string;\n } | null> {\n if (!this.posthogAPI) {\n return null;\n }\n\n try {\n const gatewayUrl = overrideUrl ?? this.posthogAPI.getLlmGatewayUrl();\n const apiKey = await this.posthogAPI.getApiKey();\n\n process.env.OPENAI_BASE_URL = `${gatewayUrl}/v1`;\n process.env.OPENAI_API_KEY = apiKey;\n process.env.ANTHROPIC_BASE_URL = gatewayUrl;\n process.env.ANTHROPIC_AUTH_TOKEN = apiKey;\n\n return { gatewayUrl, apiKey };\n } catch (error) {\n this.logger.error(\"Failed to configure LLM gateway\", error);\n throw error;\n }\n }\n\n async run(\n taskId: string,\n taskRunId: string,\n options: TaskExecutionOptions = {},\n ): Promise<InProcessAcpConnection> {\n const gatewayConfig = await this._configureLlmGateway(options.gatewayUrl);\n this.taskRunId = taskRunId;\n\n let allowedModelIds: Set<string> | undefined;\n let sanitizedModel =\n options.model && !BLOCKED_MODELS.has(options.model)\n ? options.model\n : undefined;\n if (options.adapter === \"codex\" && gatewayConfig) {\n const models = await fetchModelsList({\n gatewayUrl: gatewayConfig.gatewayUrl,\n });\n const codexModelIds = models\n .filter((model) => {\n if (BLOCKED_MODELS.has(model.id)) return false;\n if (model.owned_by) {\n return model.owned_by === \"openai\";\n }\n return model.id.startsWith(\"gpt-\") || model.id.startsWith(\"openai/\");\n })\n .map((model) => model.id);\n\n if (codexModelIds.length > 0) {\n allowedModelIds = new Set(codexModelIds);\n }\n\n if (!sanitizedModel || !allowedModelIds?.has(sanitizedModel)) {\n sanitizedModel = codexModelIds.includes(DEFAULT_CODEX_MODEL)\n ? DEFAULT_CODEX_MODEL\n : codexModelIds[0];\n }\n }\n if (!sanitizedModel && options.adapter !== \"codex\") {\n sanitizedModel = DEFAULT_GATEWAY_MODEL;\n }\n\n this.acpConnection = createAcpConnection({\n adapter: options.adapter,\n logWriter: this.sessionLogWriter,\n taskRunId,\n taskId,\n deviceType: \"local\",\n logger: this.logger,\n processCallbacks: options.processCallbacks,\n onStructuredOutput: options.onStructuredOutput,\n allowedModelIds,\n posthogApiConfig: this.posthogApiConfig,\n enricherEnabled: this.enricherEnabled,\n codexOptions:\n options.adapter === \"codex\" && gatewayConfig\n ? {\n cwd: options.repositoryPath,\n apiBaseUrl: `${gatewayConfig.gatewayUrl}/v1`,\n apiKey: gatewayConfig.apiKey,\n binaryPath: options.codexBinaryPath,\n model: sanitizedModel,\n instructions: options.instructions,\n }\n : undefined,\n });\n\n return this.acpConnection;\n }\n\n async attachPullRequestToTask(\n taskId: string,\n prUrl: string,\n branchName?: string,\n ): Promise<void> {\n this.logger.info(\"Attaching PR to task run\", { taskId, prUrl, branchName });\n\n if (!this.posthogAPI || !this.taskRunId) {\n const error = new Error(\n \"PostHog API not configured or no active run. Cannot attach PR to task.\",\n );\n this.logger.error(\"PostHog API not configured\", error);\n throw error;\n }\n\n const updates: TaskRunUpdate = {\n output: { pr_url: prUrl },\n };\n if (branchName) {\n updates.branch = branchName;\n }\n\n await this.posthogAPI.updateTaskRun(taskId, this.taskRunId, updates);\n this.logger.debug(\"PR attached to task run\", {\n taskId,\n taskRunId: this.taskRunId,\n prUrl,\n });\n }\n\n getPosthogAPI(): PostHogAPIClient | undefined {\n return this.posthogAPI;\n }\n\n async flushAllLogs(): Promise<void> {\n await this.sessionLogWriter?.flushAll();\n }\n\n async cleanup(): Promise<void> {\n if (this.sessionLogWriter && this.taskRunId) {\n await this.sessionLogWriter.flush(this.taskRunId, { coalesce: true });\n }\n await this.acpConnection?.cleanup();\n }\n}\n"],"mappings":"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","names":["path","binary","resolve","err","info","instance","module","metadata","name","i","flags","handle","func","exports","memoryBase","args","libName","localScope","start","text","fs","body","bytes","self","query","ndJsonStream","resolve","err","fs","os","path","RequestError","path","fs","path","name","text","POSTHOG_CLASS_NAMES","GO_CONSTRUCTOR_NAMES","body","query","args","Parser","err","text","query","body","func","parts","body","path","query","init","i","flags","err","resolve","err","path","fileURLToPath","name","text","args","name","path","parts","fs","path","resolve","metadata","parts","path","name","fs","metadata","input","text","parts","text","current","path","i","ALLOW_BYPASS","name","fs","os","path","err","fs","os","path","text","RequestError","resolve","err","initPromise","availableModes","RequestError","handle","fs","os","path","spawn","existsSync","dirname","args","name","existsSync","dirname","spawn","err","RequestError","err","ndJsonStream","text","fs","path","path","fs","text","delay"]}
|