@kb-labs/agent-core 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +83 -0
- package/dist/index.d.ts +2415 -0
- package/dist/index.js +12652 -0
- package/dist/index.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/planning/turn-assembler.ts","../src/planning/session-manager.ts","../src/planning/plan-validator.ts","../src/planning/plan-document-service.ts","../src/planning/spec-validator.ts","../src/tools/tool-manager.ts","../src/tools/core-tool-pack.ts","../src/tools/kb-tool-pack.ts","../src/tools/async-task-pack.ts","../src/tools/index.ts","../src/modes/execute-mode-handler.ts","../src/middleware/builtin/task-middleware.ts","../src/modes/plan-artifact-writer.ts","../src/modes/plan-output-validator.ts","../src/modes/plan-result-mapper.ts","../src/modes/plan-profile.ts","../src/core/session-memory-bridge.ts","../src/modes/plan-mode-handler.ts","../src/modes/edit-mode-handler.ts","../src/modes/debug-mode-handler.ts","../src/modes/spec-mode-handler.ts","../src/modes/mode-registry.ts","../src/modes/mode-handler.ts","../src/planning/index.ts","../src/planning/plan-generator.ts","../src/planning/plan-executor.ts","../src/modes/index.ts","../src/execution/state-machine.ts","../src/execution/task-ledger.ts","../src/execution/policy.ts","../src/execution/workspace-discovery.ts","../src/execution/stop-conditions.ts","../src/execution/loop.ts","../src/execution/linear-execution-loop.ts","../src/prompt/system-prompt-builder.ts","../src/analytics/run-metrics-emitter.ts","../src/middleware/pipeline.ts","../src/middleware/builtin/observability-middleware.ts","../src/middleware/builtin/change-tracking-middleware.ts","../src/middleware/builtin/budget-middleware.ts","../src/middleware/builtin/progress-middleware.ts","../src/middleware/builtin/analytics-middleware.ts","../src/middleware/builtin/context-filter-middleware.ts","../src/middleware/builtin/index.ts","../src/middleware/builtin/search-signal-middleware.ts","../src/middleware/builtin/todo-sync-middleware.ts","../src/middleware/builtin/reflection-middleware.ts","../src/middleware/builtin/task-classifier-middleware.ts","../src/index.ts","../src/agents/agent-registry.ts","../src/agents/parallel-executor.ts","../src/agents/orchestrator.ts","../src/execution/default-run-evaluator.ts","../src/core/runner.ts","../src/execution/event-bus-impl.ts","../src/core/run-context.ts","../src/core/tool-executor.ts","../src/core/loop-context.ts","../src/memory/fact-sheet.ts","../src/middleware/builtin/factsheet-middleware.ts","../src/tools/tool-input-normalizer.ts","../src/core/bootstrap.ts"],"names":["now","fs","path","cmds","path2","clamp01","PASS_THRESHOLD","FILE_PATH_RE","join","path3","extractBullets","SessionArtifactStore","shouldEnablePlanDelegation","PLAN_READ_ONLY_TOOL_NAMES","task","startedAt","AgentSDK","SharedTokenBudget","path4","ExecuteModeHandler","PlanModeHandler","EditModeHandler","DebugModeHandler","SpecModeHandler","modeRegistry","score","heading","words","path5","StopPriority","result","path6","fs10","path7","fs11","path8","fs12","truncated","useLLM","promises","resolve","DEFAULT_CONFIG","randomUUID","path9","fs13","path10","fs14","fs15","SessionManager","_","__","___","taskResult","finalResult","getModeHandler","createToolRegistry"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAkCa,aAAA;AAlCb,IAAA,mBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,gCAAA,GAAA;AAkCO,IAAM,gBAAN,MAAoB;AAAA;AAAA,MAEjB,WAAA,uBAAkB,GAAA,EAAkB;AAAA;AAAA,MAGpC,YAAA,uBAAmB,GAAA,EAA0B;AAAA;AAAA,MAG7C,gBAAA,uBAAuB,GAAA,EAAoB;AAAA;AAAA;AAAA;AAAA;AAAA,MAM3C,mBAAA,uBAA0B,GAAA,EAAiC;AAAA;AAAA;AAAA;AAAA;AAAA,MAMnE,aAAa,KAAA,EAAgC;AAE3C,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AACnC,QAAA,IAAI,CAAC,MAAA,EAAQ;AAAC,UAAA,OAAO,IAAA;AAAA,QAAK;AAG1B,QAAA,IAAI,IAAA,GAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,MAAM,CAAA;AACtC,QAAA,IAAI,CAAC,IAAA,EAAM;AACT,UAAA,IAAA,GAAO,IAAA,CAAK,UAAA,CAAW,KAAA,EAAO,MAAM,CAAA;AACpC,UAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,MAAA,EAAQ,IAAI,CAAA;AAAA,QACnC;AAGA,QAAA,MAAM,SAAS,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,MAAM,KAAK,EAAC;AACjD,QAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AACjB,QAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,MAAA,EAAQ,MAAM,CAAA;AAGpC,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,IAAA,EAAM,OAAO,MAAM,CAAA;AAGnD,QAAA,IAAI,SAAA,GAAY,KAAA;AAChB,QAAA,IAAI,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA,EAAG;AAC9B,UAAA,IAAA,CAAK,MAAA,GAAS,WAAA;AACd,UAAA,IAAA,CAAK,cAAc,KAAA,CAAM,SAAA;AACzB,UAAA,IAAA,CAAK,WAAA,CAAY,OAAO,MAAM,CAAA;AAC9B,UAAA,IAAA,CAAK,YAAA,CAAa,OAAO,MAAM,CAAA;AAC/B,UAAA,SAAA,GAAY,IAAA;AAAA,QACd;AAGA,QAAA,OAAQ,OAAA,IAAW,YAAa,IAAA,GAAO,IAAA;AAAA,MACzC;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,MAAM,iBAAA,CACJ,KAAA,EACA,WAAA,EACsB;AAEtB,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AACnC,QAAA,IAAI,CAAC,MAAA,EAAQ;AAAC,UAAA,OAAO,IAAA;AAAA,QAAK;AAG1B,QAAA,IAAI,IAAA,GAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,MAAM,CAAA;AACtC,QAAA,IAAI,CAAC,IAAA,EAAM;AACT,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,eAAA,CAAgB,KAAA,EAAO,QAAQ,WAAW,CAAA;AAC5D,UAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,MAAA,EAAQ,IAAI,CAAA;AAAA,QACnC;AAGA,QAAA,MAAM,SAAS,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,MAAM,KAAK,EAAC;AACjD,QAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AACjB,QAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,MAAA,EAAQ,MAAM,CAAA;AAGpC,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,IAAA,EAAM,OAAO,MAAM,CAAA;AAGnD,QAAA,IAAI,SAAA,GAAY,KAAA;AAChB,QAAA,IAAI,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA,EAAG;AAC9B,UAAA,IAAA,CAAK,MAAA,GAAS,WAAA;AACd,UAAA,IAAA,CAAK,cAAc,KAAA,CAAM,SAAA;AACzB,UAAA,IAAA,CAAK,WAAA,CAAY,OAAO,MAAM,CAAA;AAC9B,UAAA,IAAA,CAAK,YAAA,CAAa,OAAO,MAAM,CAAA;AAC/B,UAAA,SAAA,GAAY,IAAA;AAAA,QACd;AAEA,QAAA,OAAQ,OAAA,IAAW,YAAa,IAAA,GAAO,IAAA;AAAA,MACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOQ,UAAU,KAAA,EAAkC;AAClD,QAAA,QAAQ,MAAM,IAAA;AAAM,UAClB,KAAK,aAAA;AAAA,UACL,KAAK,WAAA;AAAA,UACL,KAAK,aAAA;AAEH,YAAA,OAAO,KAAA,CAAM,aAAA,GAAgB,IAAA,GAAO,CAAA,KAAA,EAAQ,MAAM,OAAO,CAAA,CAAA;AAAA,UAE3D,KAAK,WAAA;AAAA,UACL,KAAK,YAAA;AAAA,UACL,KAAK,SAAA;AAAA,UACL,KAAK,YAAA;AAAA,UACL,KAAK,UAAA;AAAA,UACL,KAAK,YAAA;AAAA,UACL,KAAK,eAAA;AAAA,UACL,KAAK,gBAAA;AAAA,UACL,KAAK,gBAAA;AAAA,UACL,KAAK,cAAA;AAGH,YAAA,MAAM,gBAAgB,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA;AACxD,YAAA,OAAO,aAAA,CAAc,aAAA,CAAc,MAAA,GAAS,CAAC,CAAA,IAAK,IAAA;AAAA,UAEpD;AACE,YAAA,OAAO,IAAA;AAAA;AACX,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,UAAA,CAAW,OAAmB,MAAA,EAAsB;AAC1D,QAAA,MAAM,SAAA,GAAY,MAAM,SAAA,IAAa,SAAA;AAIrC,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,eAAA,CAAgB,SAAS,CAAA;AAE/C,QAAA,OAAO;AAAA,UACL,EAAA,EAAI,MAAA;AAAA,UACJ,IAAA,EAAM,WAAA;AAAA,UACN,QAAA;AAAA,UACA,WAAW,KAAA,CAAM,SAAA;AAAA,UACjB,WAAA,EAAa,IAAA;AAAA,UACb,MAAA,EAAQ,WAAA;AAAA,UACR,OAAO,EAAC;AAAA,UACR,QAAA,EAAU;AAAA,YACR,OAAA,EAAS,MAAM,OAAA,IAAW,SAAA;AAAA,YAC1B,SAAA,EAAW,MAAA;AAAA,YACX,QAAQ,KAAA,CAAM;AAAA;AAChB,SACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,eAAA,CACZ,KAAA,EACA,MAAA,EACA,WAAA,EACe;AACf,QAAA,MAAM,SAAA,GAAY,MAAM,SAAA,IAAa,SAAA;AAGrC,QAAA,MAAM,QAAA,GAAW,MAAM,WAAA,CAAY,SAAS,CAAA;AAE5C,QAAA,OAAO;AAAA,UACL,EAAA,EAAI,MAAA;AAAA,UACJ,IAAA,EAAM,WAAA;AAAA,UACN,QAAA;AAAA,UACA,WAAW,KAAA,CAAM,SAAA;AAAA,UACjB,WAAA,EAAa,IAAA;AAAA,UACb,MAAA,EAAQ,WAAA;AAAA,UACR,OAAO,EAAC;AAAA,UACR,QAAA,EAAU;AAAA,YACR,OAAA,EAAS,MAAM,OAAA,IAAW,SAAA;AAAA,YAC1B,SAAA,EAAW,MAAA;AAAA,YACX,QAAQ,KAAA,CAAM;AAAA;AAChB,SACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA,MAMQ,UAAA,CAAW,IAAA,EAAY,KAAA,EAAmB,MAAA,EAAyB;AACzE,QAAA,QAAQ,MAAM,IAAA;AAAM,UAClB,KAAK,gBAAA;AAAA,UACL,KAAK,gBAAA,EAAkB;AAErB,YAAA,MAAM,WAAW,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,SAAS,CAAC,CAAA;AACjD,YAAA,MAAM,OAAA,GAAW,KAAA,CAAM,IAAA,EAAM,OAAA,IAAsB,EAAA;AAEnD,YAAA,IAAI,QAAA,EAAU,SAAS,UAAA,EAAY;AAEjC,cAAC,SAA0B,OAAA,IAAW,OAAA;AACtC,cAAA,OAAO,IAAA;AAAA,YACT,CAAA,MAAO;AAEL,cAAA,MAAM,IAAA,GAAqB;AAAA,gBACzB,IAAA,EAAM,UAAA;AAAA,gBACN,EAAA,EAAI,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,SAAS,CAAC,CAAA,CAAA;AAAA,gBACjC,WAAW,KAAA,CAAM,SAAA;AAAA,gBACjB;AAAA,eACF;AACA,cAAA,IAAA,CAAK,KAAA,CAAM,KAAK,IAAI,CAAA;AACpB,cAAA,OAAO,IAAA;AAAA,YACT;AAAA,UACF;AAAA,UAEA,KAAK,eAAA,EAAiB;AACpB,YAAA,MAAM,aAAA,GAAiB,KAAA,CAAM,IAAA,IAAQ,EAAC;AAKtC,YAAA,MAAM,OAAA,GAAU,IAAA,CAAK,0BAAA,CAA2B,aAAa,CAAA;AAC7D,YAAA,IAAI,CAAC,OAAA,EAAS;AACZ,cAAA,OAAO,KAAA;AAAA,YACT;AAEA,YAAA,MAAM,WAAW,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,SAAS,CAAC,CAAA;AACjD,YAAA,IAAI,QAAA,EAAU,IAAA,KAAS,UAAA,IAAc,QAAA,CAAS,YAAY,OAAA,EAAS;AACjE,cAAA,OAAO,KAAA;AAAA,YACT;AAEA,YAAA,MAAM,IAAA,GAAqB;AAAA,cACzB,IAAA,EAAM,UAAA;AAAA,cACN,EAAA,EAAI,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,SAAS,CAAC,CAAA,CAAA;AAAA,cACjC,WAAW,KAAA,CAAM,SAAA;AAAA,cACjB;AAAA,aACF;AACA,YAAA,IAAA,CAAK,KAAA,CAAM,KAAK,IAAI,CAAA;AACpB,YAAA,OAAO,IAAA;AAAA,UACT;AAAA,UAEA,KAAK,YAAA,EAAc;AACjB,YAAA,MAAM,SAAA,GAAY,MAAM,IAAA,EAAM,QAAA;AAC9B,YAAA,MAAM,aAAa,KAAA,CAAM,UAAA;AACzB,YAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,EAAM,QAAA,IAAY,SAAA;AACzC,YAAA,MAAM,IAAA,GAAoB;AAAA,cACxB,IAAA,EAAM,UAAA;AAAA,cACN,EAAA,EAAI,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,SAAS,CAAC,CAAA,CAAA;AAAA,cACjC,WAAW,KAAA,CAAM,SAAA;AAAA,cACjB,QAAA;AAAA,cACA,UAAA;AAAA,cACA,KAAA,EAAQ,KAAA,CAAM,IAAA,EAAM,KAAA,IAAqC,EAAC;AAAA,cAC1D,MAAA,EAAQ,SAAA;AAAA,cACR,GAAI,SAAA,GAAY;AAAA,gBACd,QAAA,EAAU;AAAA,kBACR,UAAU,SAAA,CAAU,QAAA;AAAA,kBACpB,SAAS,SAAA,CAAU,OAAA;AAAA,kBACnB,QAAQ,SAAA,CAAU,MAAA;AAAA,kBAClB,YAAY,SAAA,CAAU;AAAA;AACxB,kBACE;AAAC,aACP;AACA,YAAA,IAAA,CAAK,KAAA,CAAM,KAAK,IAAI,CAAA;AAGpB,YAAA,IAAA,CAAK,wBAAA,CAAyB,IAAA,EAAM,MAAA,EAAQ,IAAI,CAAA;AAEhD,YAAA,OAAO,IAAA;AAAA,UACT;AAAA,UAEA,KAAK,UAAA,EAAY;AACf,YAAA,MAAM,aAAa,KAAA,CAAM,UAAA;AACzB,YAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,EAAM,QAAA,IAAY,SAAA;AACzC,YAAA,MAAM,QAAA,GAAW,KAAK,KAAA,CAAM,IAAA;AAAA,cAC1B,CAAC,CAAA,KACC,CAAA,CAAE,IAAA,KAAS,UAAA,IACX,CAAA,CAAE,MAAA,KAAW,SAAA,KACZ,UAAA,GAAa,CAAA,CAAE,UAAA,KAAe,UAAA,GAAa,EAAE,QAAA,KAAa,QAAA;AAAA,aAC/D;AACA,YAAA,IAAI,QAAA,EAAU;AACZ,cAAA,IAAA,CAAK,YAAA,CAAa,UAAU,KAAK,CAAA;AAAA,YACnC,CAAA,MAAO;AAEL,cAAA,IAAA,CAAK,wBAAA,CAAyB,QAAQ,UAAA,EAAY,QAAA,EAAU,EAAE,KAAA,EAAO,IAAA,EAAM,YAAY,CAAA;AAAA,YACzF;AACA,YAAA,OAAO,IAAA;AAAA,UACT;AAAA,UAEA,KAAK,YAAA,EAAc;AACjB,YAAA,MAAM,aAAa,KAAA,CAAM,UAAA;AACzB,YAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,EAAM,QAAA,IAAY,SAAA;AACzC,YAAA,MAAM,QAAA,GAAW,KAAK,KAAA,CAAM,IAAA;AAAA,cAC1B,CAAC,CAAA,KACC,CAAA,CAAE,IAAA,KAAS,UAAA,IACX,CAAA,CAAE,MAAA,KAAW,SAAA,KACZ,UAAA,GAAa,CAAA,CAAE,UAAA,KAAe,UAAA,GAAa,EAAE,QAAA,KAAa,QAAA;AAAA,aAC/D;AACA,YAAA,IAAI,QAAA,EAAU;AACZ,cAAA,QAAA,CAAS,MAAA,GAAS,OAAA;AAClB,cAAA,QAAA,CAAS,KAAA,GAAS,KAAA,CAAM,IAAA,EAAM,KAAA,IAAoB,eAAA;AAAA,YACpD,CAAA,MAAO;AAEL,cAAA,IAAA,CAAK,wBAAA,CAAyB,QAAQ,UAAA,EAAY,QAAA,EAAU,EAAE,KAAA,EAAO,IAAA,EAAM,cAAc,CAAA;AAAA,YAC3F;AACA,YAAA,OAAO,IAAA;AAAA,UACT;AAAA,UAEA,KAAK,SAAA,EAAW;AACd,YAAA,MAAM,UAAA,GAAc,KAAA,CAAM,IAAA,EAAM,OAAA,IAAkC,EAAA;AAClE,YAAA,MAAM,OAAA,GAAU,IAAA,CAAK,qBAAA,CAAsB,UAAU,CAAA;AACrD,YAAA,MAAM,YAAA,GAAe,OAAA,CAAS,KAAA,CAAM,IAAA,EAAiD,YAAY,CAAA;AAEjG,YAAA,IAAI,OAAA,EAAS;AACX,cAAA,IAAI,YAAA,EAAc;AAChB,gBAAA,MAAM,IAAA,GAAqB;AAAA,kBACzB,IAAA,EAAM,UAAA;AAAA,kBACN,EAAA,EAAI,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,SAAS,CAAC,CAAA,CAAA;AAAA,kBACjC,WAAW,KAAA,CAAM,SAAA;AAAA,kBACjB;AAAA,iBACF;AACA,gBAAA,IAAA,CAAK,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,cACtB,CAAA,MAAO;AACL,gBAAA,MAAM,IAAA,GAAiB;AAAA,kBACrB,IAAA,EAAM,MAAA;AAAA,kBACN,EAAA,EAAI,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,SAAS,CAAC,CAAA,CAAA;AAAA,kBACjC,WAAW,KAAA,CAAM,SAAA;AAAA,kBACjB,OAAA;AAAA,kBACA,IAAA,EAAM;AAAA,iBACR;AACA,gBAAA,IAAA,CAAK,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,cACtB;AAGA,cAAA,IAAI,KAAA,CAAM,MAAM,UAAA,EAAY;AAC1B,gBAAA,IAAA,CAAK,SAAS,WAAA,GAAA,CAAe,IAAA,CAAK,SAAS,WAAA,IAAe,CAAA,IAAK,MAAM,IAAA,CAAK,UAAA;AAAA,cAC5E;AAEA,cAAA,OAAO,IAAA;AAAA,YACT;AACA,YAAA,OAAO,KAAA;AAAA,UACT;AAAA,UAEA,KAAK,WAAA,EAAa;AAIhB,YAAA,MAAM,WAAA,GAAc,KAAK,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,MAAM,CAAA;AAC5D,YAAA,IAAI,CAAC,WAAA,EAAa;AAChB,cAAA,MAAM,OAAA,GAAW,KAAA,CAAM,IAAA,EAAM,OAAA,EAAgC,IAAA,EAAK;AAClE,cAAA,IAAI,OAAA,EAAS;AACX,gBAAA,MAAM,IAAA,GAAiB;AAAA,kBACrB,IAAA,EAAM,MAAA;AAAA,kBACN,EAAA,EAAI,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,SAAS,CAAC,CAAA,CAAA;AAAA,kBACjC,WAAW,KAAA,CAAM,SAAA;AAAA,kBACjB,OAAA,EAAS,OAAA;AAAA,kBACT,IAAA,EAAM;AAAA,iBACR;AACA,gBAAA,IAAA,CAAK,KAAA,CAAM,KAAK,IAAI,CAAA;AACpB,gBAAA,OAAO,IAAA;AAAA,cACT;AAAA,YACF;AACA,YAAA,OAAO,KAAA;AAAA,UACT;AAAA,UAEA,KAAK,aAAA,EAAe;AAClB,YAAA,IAAA,CAAK,MAAA,GAAS,QAAA;AACd,YAAA,IAAA,CAAK,cAAc,KAAA,CAAM,SAAA;AACzB,YAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,cACX,IAAA,EAAM,aAAA;AAAA,cACN,OAAA,EAAS,KAAA,CAAM,IAAA,EAAM,KAAA,IAAS,cAAA;AAAA,cAC9B,OAAA,EAAS;AAAA,aACX;AACA,YAAA,MAAM,IAAA,GAAkB;AAAA,cACtB,IAAA,EAAM,OAAA;AAAA,cACN,EAAA,EAAI,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,SAAS,CAAC,CAAA,CAAA;AAAA,cACjC,WAAW,KAAA,CAAM,SAAA;AAAA,cACjB,IAAA,EAAM,KAAK,KAAA,CAAM,IAAA;AAAA,cACjB,OAAA,EAAS,KAAK,KAAA,CAAM,OAAA;AAAA,cACpB,OAAA,EAAS,KAAK,KAAA,CAAM;AAAA,aACtB;AACA,YAAA,IAAA,CAAK,KAAA,CAAM,KAAK,IAAI,CAAA;AACpB,YAAA,OAAO,IAAA;AAAA,UACT;AAAA,UAEA;AACE,YAAA,OAAO,KAAA;AAAA;AACX,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,eAAe,KAAA,EAA4B;AACjD,QAAA,OAAO,KAAA,CAAM,IAAA,KAAS,WAAA,IAAe,CAAC,KAAA,CAAM,aAAA;AAAA,MAC9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQQ,SAAA,CAAU,MAAA,EAAgB,UAAA,EAAgC,QAAA,EAA0B;AAC1F,QAAA,OAAO,UAAA,GAAa,GAAG,MAAM,CAAA,IAAA,EAAO,UAAU,CAAA,CAAA,GAAK,CAAA,EAAG,MAAM,CAAA,MAAA,EAAS,QAAQ,CAAA,CAAA;AAAA,MAC/E;AAAA;AAAA;AAAA;AAAA;AAAA,MAMQ,wBAAA,CACN,MAAA,EACA,UAAA,EACA,QAAA,EACA,OAAA,EACM;AACN,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,YAAY,QAAQ,CAAA;AACvD,QAAA,MAAM,WAAW,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAI,GAAG,KAAK,EAAC;AACvD,QAAA,QAAA,CAAS,KAAK,OAAO,CAAA;AACrB,QAAA,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAI,GAAA,EAAK,QAAQ,CAAA;AAAA,MAC5C;AAAA;AAAA;AAAA;AAAA,MAKQ,wBAAA,CAAyB,IAAA,EAAY,MAAA,EAAgB,IAAA,EAAyB;AAEpF,QAAA,MAAM,OAAA,GAAU,KAAK,UAAA,GAAa,CAAA,EAAG,MAAM,CAAA,IAAA,EAAO,IAAA,CAAK,UAAU,CAAA,CAAA,GAAK,IAAA;AACtE,QAAA,MAAM,SAAA,GAAY,CAAA,EAAG,MAAM,CAAA,MAAA,EAAS,KAAK,QAAQ,CAAA,CAAA;AAEjD,QAAA,MAAM,cAAc,OAAA,GAAU,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAI,OAAO,CAAA,GAAI,MAAA;AACtE,QAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAI,SAAS,CAAA;AAE5D,QAAA,MAAM,UAAU,WAAA,IAAe,aAAA;AAC/B,QAAA,MAAM,OAAA,GAAU,cAAc,OAAA,GAAW,SAAA;AAEzC,QAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AACpC,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA;AACvC,QAAA,IAAI,IAAA,CAAK,SAAS,UAAA,EAAY;AAC5B,UAAA,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,IAAA,CAAK,KAAqB,CAAA;AAAA,QACpD,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,MAAA,GAAS,OAAA;AACd,UAAA,MAAM,OAAA,GAAU,KAAK,KAAA,CAAM,IAAA;AAC3B,UAAA,IAAA,CAAK,KAAA,GAAQ,SAAS,KAAA,IAAS,eAAA;AAAA,QACjC;AAEA,QAAA,IAAA,CAAK,mBAAA,CAAoB,OAAO,OAAO,CAAA;AAAA,MACzC;AAAA;AAAA;AAAA;AAAA,MAKQ,YAAA,CAAa,MAAmB,KAAA,EAA2B;AACjE,QAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,QAAA,IAAA,CAAK,OAAA,GAAU,MAAM,IAAA,EAAM,OAAA;AAC3B,QAAA,IAAA,CAAK,MAAA,GAAS,MAAM,IAAA,EAAM,MAAA;AAC1B,QAAA,IAAA,CAAK,UAAA,GAAa,MAAM,IAAA,EAAM,UAAA;AAC9B,QAAA,MAAM,CAAA,GAAI,MAAM,IAAA,EAAM,QAAA;AACtB,QAAA,IAAI,CAAA,EAAG;AACL,UAAA,IAAA,CAAK,QAAA,GAAW;AAAA,YACd,UAAU,CAAA,CAAE,QAAA;AAAA,YACZ,aAAa,CAAA,CAAE,WAAA;AAAA,YACf,MAAM,CAAA,CAAE,IAAA;AAAA,YACR,YAAY,CAAA,CAAE,UAAA;AAAA,YACd,YAAY,CAAA,CAAE,UAAA;AAAA,YACd,cAAc,CAAA,CAAE,YAAA;AAAA,YAChB,YAAY,CAAA,CAAE,UAAA;AAAA,YACd,cAAc,CAAA,CAAE,YAAA;AAAA,YAChB,aAAa,CAAA,CAAE,WAAA;AAAA,YACf,SAAS,CAAA,CAAE,OAAA;AAAA,YACX,YAAY,CAAA,CAAE,UAAA;AAAA,YACd,OAAO,CAAA,CAAE,KAAA;AAAA,YACT,UAAU,CAAA,CAAE,QAAA;AAAA,YACZ,SAAS,CAAA,CAAE,OAAA;AAAA,YACX,QAAQ,CAAA,CAAE,MAAA;AAAA,YACV,QAAQ,CAAA,CAAE,MAAA;AAAA,YACV,SAAS,CAAA,CAAE,OAAA;AAAA,YACX,QAAQ,CAAA,CAAE,MAAA;AAAA,YACV,YAAY,CAAA,CAAE;AAAA,WAChB;AAAA,QACF;AAAA,MACF;AAAA,MAEQ,sBAAsB,OAAA,EAAyB;AACrD,QAAA,MAAM,OAAA,GAAU,QAAQ,IAAA,EAAK;AAC7B,QAAA,IAAI,CAAC,OAAA,EAAS;AACZ,UAAA,OAAO,EAAA;AAAA,QACT;AACA,QAAA,MAAM,UAAA,GAAa,QAAQ,WAAA,EAAY;AACvC,QAAA,IACE,eAAe,sBAAA,IACf,UAAA,KAAe,mBACf,UAAA,KAAe,eAAA,IACf,eAAe,gBAAA,EACf;AACA,UAAA,OAAO,EAAA;AAAA,QACT;AACA,QAAA,OAAO,OAAA;AAAA,MACT;AAAA,MAEQ,2BAA2B,OAAA,EAAkF;AACnH,QAAA,MAAM,MAAA,GAAA,CAAU,OAAA,CAAQ,MAAA,IAAU,EAAA,EAAI,WAAA,EAAY;AAClD,QAAA,MAAM,OAAA,GAAA,CAAW,OAAA,CAAQ,OAAA,IAAW,EAAA,EAAI,IAAA,EAAK;AAE7C,QAAA,IAAI,WAAW,UAAA,EAAY;AACzB,UAAA,OAAO,+CAAA;AAAA,QACT;AAEA,QAAA,IAAI,MAAA,KAAW,WAAA,IAAe,OAAA,CAAQ,QAAA,EAAU;AAC9C,UAAA,OAAO,CAAA,0BAAA,EAA6B,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,QAAQ,CAAC,CAAA,CAAA,CAAA;AAAA,QAC3E;AAEA,QAAA,IAAI,CAAC,OAAA,EAAS;AACZ,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,MAAM,UAAA,GAAa,QAAQ,WAAA,EAAY;AACvC,QAAA,IAAI,UAAA,CAAW,QAAA,CAAS,aAAa,CAAA,EAAG;AACtC,UAAA,OAAO,iDAAA;AAAA,QACT;AACA,QAAA,IAAI,UAAA,CAAW,QAAA,CAAS,WAAW,CAAA,EAAG;AACpC,UAAA,OAAO,OAAA,CAAQ,WACX,CAAA,wBAAA,EAA2B,IAAA,CAAK,eAAe,OAAA,CAAQ,QAAQ,CAAC,CAAA,CAAA,CAAA,GAChE,gDAAA;AAAA,QACN;AAEA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,MAEQ,eAAe,IAAA,EAAsB;AAC3C,QAAA,OAAO,IAAA,CACJ,OAAA,CAAQ,OAAA,EAAS,GAAG,EACpB,OAAA,CAAQ,iBAAA,EAAmB,OAAO,CAAA,CAClC,QAAQ,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,CAAA;AAAA,MAC5C;AAAA;AAAA;AAAA;AAAA,MAKA,cAAA,GAAyB;AACvB,QAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA;AAAA,MAC7C;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,gBAAgB,SAAA,EAA2B;AACzC,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,SAAS,CAAA,IAAK,CAAA;AACxD,QAAA,MAAM,OAAO,OAAA,GAAU,CAAA;AACvB,QAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,SAAA,EAAW,IAAI,CAAA;AACzC,QAAA,OAAO,IAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,mBAAmB,SAAA,EAA2B;AAC5C,QAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,SAAS,CAAA,IAAK,CAAA;AAAA,MACjD;AAAA;AAAA;AAAA;AAAA,MAKA,KAAA,GAAc;AACZ,QAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,QAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AACxB,QAAA,IAAA,CAAK,iBAAiB,KAAA,EAAM;AAC5B,QAAA,IAAA,CAAK,oBAAoB,KAAA,EAAM;AAAA,MACjC;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC5lBA,IAAA,uBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,uBAAA,EAAA;AAAA,EAAA,cAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IAyDa;AAzDb,IAAA,oBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,iCAAA,GAAA;AAQA,IAAA,mBAAA,EAAA;AAiDO,IAAM,iBAAN,MAAqB;AAAA,MAClB,UAAA;AAAA,MACS,aAAA;AAAA;AAAA,MAGT,cAAA,uBAAqB,GAAA,EAAoB;AAAA;AAAA,MAEzC,eAAA,uBAAsB,GAAA,EAAoB;AAAA;AAAA,MAG1C,SAAA,GAAY,IAAI,aAAA,EAAc;AAAA;AAAA,MAG9B,WAAA,uBAAkB,GAAA,EAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQ7C,WAAA,uBAAkB,GAAA,EAA2B;AAAA;AAAA,MAE7C,mBAAA,uBAA0B,GAAA,EAA2B;AAAA;AAAA,MAErD,cAAA,uBAAqB,GAAA,EAA2B;AAAA,MAExD,YAAY,UAAA,EAAoB;AAC9B,QAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,QAAA,IAAA,CAAK,aAAA,GAAgB,IAAI,oBAAA,CAAqB,UAAU,CAAA;AAAA,MAC1D;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,cAAc,MAAA,EAOU;AAC5B,QAAA,MAAM,YAAY,MAAA,CAAO,SAAA,IAAa,CAAA,QAAA,EAAW,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,EAAE,EAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AACrG,QAAA,MAAMA,IAAAA,GAAAA,iBAAM,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAEnC,QAAA,MAAM,OAAA,GAAyB;AAAA,UAC7B,EAAA,EAAI,SAAA;AAAA,UACJ,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,SAAS,MAAA,CAAO,OAAA;AAAA,UAChB,MAAM,MAAA,CAAO,IAAA,IAAQ,IAAA,CAAK,mBAAA,CAAoB,OAAO,IAAI,CAAA;AAAA,UACzD,QAAQ,MAAA,CAAO,MAAA;AAAA,UACf,YAAY,IAAA,CAAK,UAAA;AAAA,UACjB,SAAA,EAAWA,IAAAA;AAAA,UACX,SAAA,EAAWA,IAAAA;AAAA,UACX,MAAA,EAAQ;AAAA,SACV;AAEA,QAAA,MAAM,IAAA,CAAK,YAAY,OAAO,CAAA;AAE9B,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,CAAA,EAAG,QAAWA,IAAG,CAAA;AAAA,MACtD;AAAA;AAAA;AAAA;AAAA,MAKQ,oBAAoB,IAAA,EAAsB;AAEhD,QAAA,MAAM,MAAA,GAAS,EAAA;AACf,QAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAQ;AAAC,UAAA,OAAO,IAAA;AAAA,QAAK;AACxC,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA;AAChC,QAAA,MAAM,SAAA,GAAY,GAAA,CAAI,WAAA,CAAY,GAAG,CAAA;AACrC,QAAA,OAAO,SAAA,GAAY,KAAK,GAAA,CAAI,KAAA,CAAM,GAAG,SAAS,CAAA,GAAI,QAAQ,GAAA,GAAM,KAAA;AAAA,MAClE;AAAA;AAAA;AAAA;AAAA,MAKQ,aAAA,CACN,OAAA,EACA,QAAA,EACA,WAAA,EACA,cAAA,EACkB;AAClB,QAAA,OAAO;AAAA,UACL,GAAG,OAAA;AAAA,UACH,SAAS,OAAA,CAAQ,OAAA;AAAA,UACjB,MAAM,OAAA,CAAQ,IAAA;AAAA,UACd,QAAA;AAAA,UACA,WAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,YAAY,OAAA,EAAsD;AACtE,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,EAAE,CAAA;AAChD,QAAA,MAAMC,SAAG,KAAA,CAAM,UAAA,EAAY,EAAE,SAAA,EAAW,MAAM,CAAA;AAE9C,QAAA,MAAM,WAAA,GAAmBC,MAAA,CAAA,IAAA,CAAK,UAAA,EAAY,cAAc,CAAA;AACxD,QAAA,MAAMD,QAAA,CAAG,UAAU,WAAA,EAAa,IAAA,CAAK,UAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,OAAO,CAAA;AACzE,QAAA,MAAM,IAAA,CAAK,aAAA,CAAc,mBAAA,CAAoB,OAAiD,CAAA;AAAA,MAChG;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,YAAY,SAAA,EAAkD;AAClE,QAAA,IAAI;AACF,UAAA,MAAM,cAAmBC,MAAA,CAAA,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,SAAS,GAAG,cAAc,CAAA;AAC3E,UAAA,MAAM,OAAA,GAAU,MAAMD,QAAA,CAAG,QAAA,CAAS,aAAa,OAAO,CAAA;AACtD,UAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,QAC3B,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,eAAe,SAAA,EAAqD;AACxE,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,WAAA,CAAY,SAAS,CAAA;AAChD,QAAA,IAAI,CAAC,OAAA,EAAS;AAAC,UAAA,OAAO,IAAA;AAAA,QAAK;AAE3B,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,gBAAA,CAAiB,SAAS,CAAA;AACpD,QAAA,MAAM,QAAA,GAAW,OAAO,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,aAAa,CAAA,CAAE,MAAA;AAChE,QAAA,MAAM,YAAA,GAAe,CAAC,GAAG,MAAM,CAAA,CAAE,OAAA,EAAQ,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,SAAS,CAAA;AAC3E,QAAA,MAAM,WAAA,GAAc,cAAc,IAAA,EAAM,OAAA;AACxC,QAAA,MAAM,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AAC1C,QAAA,MAAM,cAAA,GAAiB,YACnB,IAAI,IAAA,CAAK,UAAU,SAAS,CAAA,CAAE,WAAA,EAAY,GAC1C,OAAA,CAAQ,SAAA;AAEZ,QAAA,OAAO,IAAA,CAAK,cAAc,OAAA,EAAS,QAAA,EAAU,aAAa,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,EAAG,cAAc,CAAA;AAAA,MACzF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,mBAAA,CACJ,SAAA,EACA,MAAA,EACe;AACf,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,WAAA,CAAY,SAAS,CAAA;AAChD,QAAA,IAAI,CAAC,OAAA,EAAS;AACZ,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsB,SAAS,CAAA,CAAE,CAAA;AAAA,QACnD;AAEA,QAAA,OAAA,CAAQ,MAAA,GAAS,MAAA;AACjB,QAAA,OAAA,CAAQ,SAAA,GAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAE3C,QAAA,MAAM,IAAA,CAAK,YAAY,OAAO,CAAA;AAAA,MAChC;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,aAAa,OAAA,EAK0C;AAC3D,QAAA,MAAM,eAAoBC,MAAA,CAAA,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY,KAAA,EAAO,UAAU,UAAU,CAAA;AAE3E,QAAA,IAAI;AACF,UAAA,MAAM,OAAA,GAAU,MAAMD,QAAA,CAAG,OAAA,CAAQ,cAAc,EAAE,aAAA,EAAe,MAAM,CAAA;AACtE,UAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,EAAa,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAG5E,UAAA,MAAM,YAAA,GAAe,MAAM,OAAA,CAAQ,GAAA;AAAA,YACjC,YAAY,GAAA,CAAI,CAAC,cAAc,IAAA,CAAK,cAAA,CAAe,SAAS,CAAC;AAAA,WAC/D;AAGA,UAAA,IAAI,QAAA,GAA+B,YAAA,CAChC,MAAA,CAAO,CAAC,IAAA,KAAmC;AAC1C,YAAA,IAAI,CAAC,IAAA,EAAM;AACT,cAAA,OAAO,KAAA;AAAA,YACT;AAEA,YAAA,IAAI,OAAA,EAAS,OAAA,IAAW,IAAA,CAAK,OAAA,KAAY,QAAQ,OAAA,EAAS;AACxD,cAAA,OAAO,KAAA;AAAA,YACT;AACA,YAAA,IAAI,OAAA,EAAS,MAAA,IAAU,IAAA,CAAK,MAAA,KAAW,QAAQ,MAAA,EAAQ;AACrD,cAAA,OAAO,KAAA;AAAA,YACT;AACA,YAAA,OAAO,IAAA;AAAA,UACT,CAAC,CAAA;AAGH,UAAA,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,cAAA,CAAe,aAAA,CAAc,CAAA,CAAE,cAAc,CAAC,CAAA;AAExE,UAAA,MAAM,QAAQ,QAAA,CAAS,MAAA;AAGvB,UAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,YAAA,QAAA,GAAW,QAAA,CAAS,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA;AAAA,UAC1C;AACA,UAAA,IAAI,SAAS,KAAA,EAAO;AAClB,YAAA,QAAA,GAAW,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,OAAA,CAAQ,KAAK,CAAA;AAAA,UAC5C;AAEA,UAAA,OAAO,EAAE,UAAU,KAAA,EAAM;AAAA,QAC3B,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,EAAE,QAAA,EAAU,EAAC,EAAG,OAAO,CAAA,EAAE;AAAA,QAClC;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAYA,MAAc,iBAAA,CAAkB,SAAA,EAAmB,KAAA,EAAgC;AACjF,QAAA,MAAM,GAAA,GAAM,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA;AAEjC,QAAA,IAAI,CAAC,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,GAAG,CAAA,EAAG;AACjC,UAAA,IAAI,MAAA,GAAS,CAAA;AACb,UAAA,IAAI;AACF,YAAA,MAAM,OAAA,GAAU,MAAMA,QAAA,CAAG,QAAA,CAAS,KAAK,aAAA,CAAc,SAAS,GAAG,OAAO,CAAA;AACxE,YAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,CAAE,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA;AACxD,YAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,cAAA,IAAI;AACF,gBAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAE3B,gBAAA,IAAI,GAAA,CAAI,UAAU,KAAA,IAAS,GAAA,CAAI,cAAc,IAAA,IAAQ,GAAA,CAAI,aAAa,MAAA,EAAQ;AAC5E,kBAAA,MAAA,GAAS,GAAA,CAAI,UAAA;AAAA,gBACf;AAAA,cACF,CAAA,CAAA,MAAQ;AAAA,cAAuB;AAAA,YACjC;AAAA,UACF,CAAA,CAAA,MAAQ;AAAA,UAER;AACA,UAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,GAAA,EAAK,MAAM,CAAA;AAAA,QACrC;AAEA,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,GAAG,CAAA,GAAK,CAAA;AAC7C,QAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,GAAA,EAAK,IAAI,CAAA;AACjC,QAAA,OAAO,IAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAWA,MAAM,QAAA,CAAS,SAAA,EAAmB,KAAA,EAAkC;AAClE,QAAA,MAAM,OAAO,IAAA,CAAK,WAAA,CAAY,IAAI,SAAS,CAAA,IAAK,QAAQ,OAAA,EAAQ;AAIhE,QAAA,MAAM,IAAA,GAAO,KAAK,IAAA,CAAK,MAAM,KAAK,iBAAA,CAAkB,SAAA,EAAW,KAAK,CAAC,CAAA;AACrE,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,MAAM;AAAA,QAAC,GAAG,MAAM;AAAA,QAAC,CAAC,CAAA;AACzC,QAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,SAAA,EAAW,IAAI,CAAA;AACpC,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,MAEA,MAAc,iBAAA,CAAkB,SAAA,EAAmB,KAAA,EAAkC;AACnF,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,aAAA,CAAc,SAAS,CAAA;AAC/C,QAAA,MAAMA,SAAG,KAAA,CAAM,UAAA,EAAY,EAAE,SAAA,EAAW,MAAM,CAAA;AAC9C,QAAA,MAAM,IAAA,CAAK,aAAA,CAAc,sBAAA,CAAuB,SAAS,CAAA;AAEzD,QAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,IAAS,SAAA;AAC7B,QAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,iBAAA,CAAkB,WAAW,KAAK,CAAA;AAChE,QAAA,MAAM,IAAA,GAAO,KAAK,SAAA,CAAU,EAAE,GAAG,KAAA,EAAO,UAAA,EAAY,CAAA,GAAI,IAAA;AACxD,QAAA,MAAMA,SAAG,UAAA,CAAW,IAAA,CAAK,cAAc,SAAS,CAAA,EAAG,MAAM,OAAO,CAAA;AAChE,QAAA,MAAMA,QAAA,CAAG,WAAW,IAAA,CAAK,aAAA,CAAc,gBAAgB,SAAA,EAAW,cAAc,CAAA,EAAG,IAAA,EAAM,OAAO,CAAA;AAGhG,QAAA,MAAM,KAAK,yBAAA,CAA0B,SAAA,EAAW,EAAE,GAAG,KAAA,EAAO,YAAY,CAAA;AAAA,MAC1E;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,gBAAA,CACJ,SAAA,EACA,OAAA,EACuB;AACvB,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,aAAA,CAAc,SAAS,CAAA;AAE/C,QAAA,IAAI;AACF,UAAA,MAAM,OAAA,GAAU,MAAMA,QAAA,CAAG,QAAA,CAAS,YAAY,OAAO,CAAA;AAGrD,UAAA,IAAI,MAAA,GAAuB,OAAA,CACxB,KAAA,CAAM,IAAI,EACV,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,EAAM,CAAA,CAC5B,GAAA,CAAI,CAAC,IAAA,KAAS;AACb,YAAA,IAAI;AACF,cAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,YACxB,CAAA,CAAA,MAAQ;AACN,cAAA,OAAO,IAAA;AAAA,YACT;AAAA,UACF,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,CAAA,KAAuB,MAAM,IAAI,CAAA;AAG5C,UAAA,IAAI,OAAA,EAAS,OAAO,MAAA,EAAQ;AAC1B,YAAA,MAAA,GAAS,MAAA,CAAO,OAAO,CAAC,CAAA,KAAM,QAAQ,KAAA,CAAO,QAAA,CAAS,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,UAC/D;AAGA,UAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,YAAA,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA;AAAA,UACtC;AACA,UAAA,IAAI,SAAS,KAAA,EAAO;AAClB,YAAA,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,OAAA,CAAQ,KAAK,CAAA;AAAA,UACxC;AAEA,UAAA,OAAO,MAAA;AAAA,QACT,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,EAAC;AAAA,QACV;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,WAAA,CAAY,SAAA,EAAmB,KAAA,EAAmC;AACtE,QAAA,MAAM,SAAS,MAAM,IAAA,CAAK,iBAAiB,SAAA,EAAW,EAAE,OAAO,CAAA;AAC/D,QAAA,OAAO,MAAA,CAAO,MAAA;AAAA,MAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAiBA,MAAM,sBAAA,CACJ,SAAA,EACA,QAAA,GAAW,EAAA,EACsE;AAEjF,QAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,+BAAA,CAAgC,WAAW,QAAQ,CAAA;AAChF,QAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,UAAA,OAAO,SAAA;AAAA,QACT;AAGA,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,gBAAA,CAAiB,SAAS,CAAA;AACpD,QAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,UAAA,OAAO,EAAC;AAAA,QACV;AAEA,QAAA,MAAM,QAAgF,EAAC;AACvF,QAAA,IAAI,WAAA,GAAsF,IAAA;AAE1F,QAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAE1B,UAAA,IAAI,KAAA,CAAM,IAAA,KAAS,aAAA,IAAiB,CAAC,MAAM,aAAA,EAAe;AAExD,YAAA,IAAI,WAAA,EAAa;AACf,cAAA,KAAA,CAAM,KAAK,WAAW,CAAA;AAAA,YACxB;AACA,YAAA,WAAA,GAAc;AAAA,cACZ,QAAA,EAAW,MAAM,IAAA,CAA0B,IAAA;AAAA,cAC3C,WAAW,KAAA,CAAM;AAAA,aACnB;AAAA,UACF;AAGA,UAAA,IAAI,MAAM,IAAA,KAAS,WAAA,IAAe,CAAC,KAAA,CAAM,iBAAiB,WAAA,EAAa;AACrE,YAAA,MAAM,OAAA,GAAW,MAAM,IAAA,CAA6B,OAAA;AAEpD,YAAA,IAAI,OAAA,CAAQ,SAAS,GAAA,EAAM;AACzB,cAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA;AAClC,cAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AAC/B,cAAA,WAAA,CAAY,aAAA,GAAgB,GAAG,IAAI;;AAAA,IAAA,EAAW,OAAA,CAAQ,SAAS,IAAI,CAAA;;AAAA,EAAyB,IAAI,CAAA,CAAA;AAAA,YAClG,CAAA,MAAO;AACL,cAAA,WAAA,CAAY,aAAA,GAAgB,OAAA;AAAA,YAC9B;AAAA,UACF;AAAA,QACF;AAGA,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,KAAA,CAAM,KAAK,WAAW,CAAA;AAAA,QACxB;AAIA,QAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,aAAa,CAAA;AACxD,QAAA,OAAO,cAAA,CAAe,KAAA,CAAM,CAAC,QAAQ,CAAA;AAAA,MACvC;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,MAAc,+BAAA,CACZ,SAAA,EACA,QAAA,EAC6B;AAC7B,QAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA;AAC3C,QAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,UAAA,OAAO,EAAC;AAAA,QACV;AAEA,QAAA,MAAM,MAAA,GAAS,CAAC,GAAG,KAAK,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,QAAA,GAAW,CAAA,CAAE,QAAQ,CAAA;AAChE,QAAA,MAAM,eAAmC,EAAC;AAC1C,QAAA,MAAM,eAA2D,EAAC;AAElE,QAAA,KAAA,MAAW,QAAQ,MAAA,EAAQ;AACzB,UAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,YAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,KAAS,MAAA,IAAU,IAAA,CAAK,IAAA,KAAS,MAAM,CAAA;AAC1F,YAAA,MAAM,IAAA,GAAQ,WAAA,EAAkD,OAAA,EAAS,IAAA,EAAK;AAC9E,YAAA,IAAI,IAAA,EAAM;AACR,cAAA,YAAA,CAAa,KAAK,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,CAAK,WAAW,CAAA;AAAA,YACvD;AACA,YAAA;AAAA,UACF;AAEA,UAAA,IAAI,IAAA,CAAK,SAAS,WAAA,EAAa;AAC7B,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,oBAAA,CAAqB,IAAI,CAAA;AACpD,UAAA,IAAI,CAAC,aAAA,EAAe;AAClB,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,UAAA,GAAa,aAAa,KAAA,EAAM;AACtC,UAAA,YAAA,CAAa,IAAA,CAAK;AAAA,YAChB,QAAA,EAAU,UAAA,EAAY,IAAA,IAAQ,IAAA,CAAK,UAAU,MAAA,IAAU,mBAAA;AAAA,YACvD,aAAA,EAAe,aAAA;AAAA,YACf,SAAA,EAAW,UAAA,EAAY,SAAA,IAAa,IAAA,CAAK;AAAA,WAC1C,CAAA;AAAA,QACH;AAEA,QAAA,OAAO,YAAA,CAAa,KAAA,CAAM,CAAC,QAAQ,CAAA;AAAA,MACrC;AAAA,MAEQ,qBAAqB,IAAA,EAAgC;AAC3D,QAAA,MAAM,SAAA,GAAY,KAAK,KAAA,CAAM,MAAA;AAAA,UAC3B,CAAC,IAAA,KACC,IAAA,CAAK,IAAA,KAAS,MAAA,IAAU,KAAK,IAAA,KAAS;AAAA,SAC1C;AAEA,QAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,UAAA,OAAO,MAAA;AAAA,QACT;AAEA,QAAA,MAAM,OAAA,GAAU,SAAA,CAAU,GAAA,CAAI,CAAC,SAAS,IAAA,CAAK,OAAA,EAAS,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,MAAM,CAAA;AACzF,QAAA,IAAI,CAAC,OAAA,EAAS;AACZ,UAAA,OAAO,MAAA;AAAA,QACT;AAEA,QAAA,IAAI,OAAA,CAAQ,SAAS,GAAA,EAAM;AACzB,UAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA;AAClC,UAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AAC/B,UAAA,OAAO,GAAG,IAAI;;AAAA,IAAA,EAAW,OAAA,CAAQ,SAAS,IAAI,CAAA;;AAAA,EAAyB,IAAI,CAAA,CAAA;AAAA,QAC7E;AACA,QAAA,OAAO,OAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAgBA,MAAM,uCAAA,CACJ,SAAA,EACA,GAAA,EAKC;AACD,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,sBAAA,CAAuB,WAAW,GAAG,CAAA;AAEjE,QAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,UAAA,OAAO,EAAE,QAAQ,EAAC,EAAG,SAAS,EAAC,EAAG,GAAA,EAAK,EAAC,EAAE;AAAA,QAC5C;AAGA,QAAA,MAAM,QAAA,GAAW,CAAC,GAAG,QAAQ,EAAE,OAAA,EAAQ;AACvC,QAAA,MAAM,SAAS,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,CAAC,EAAE,OAAA,EAAQ;AAC5C,QAAA,MAAM,aAAa,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,EAAE,EAAE,OAAA,EAAQ;AACjD,QAAA,MAAM,SAAS,QAAA,CAAS,KAAA,CAAM,EAAA,EAAI,EAAE,EAAE,OAAA,EAAQ;AAI9C,QAAA,MAAM,UAA8B,EAAC;AACrC,QAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,UAAA,MAAM,QAAA,GAAW,KAAK,aAAA,IAAiB,EAAA;AACvC,UAAA,IAAI,UAAA,GAAa,QAAA;AAEjB,UAAA,IAAI,QAAA,CAAS,SAAS,GAAA,EAAK;AACzB,YAAA,IAAI,KAAK,IAAA,EAAM;AAEb,cAAA,IAAI;AACF,gBAAA,UAAA,GAAa,MAAM,IAAI,IAAA,CAAK;AAAA,kBAC1B;AAAA,oBACE,IAAA,EAAM,QAAA;AAAA,oBACN,OAAA,EACE;AAAA,mBACJ;AAAA,kBACA,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,QAAA;AAAS,iBACnC,CAAA;AAED,gBAAA,IAAI,UAAA,CAAW,SAAS,GAAA,EAAK;AAC3B,kBAAA,UAAA,GAAa,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,GAAI,KAAA;AAAA,gBAC1C;AAAA,cACF,CAAA,CAAA,MAAQ;AAEN,gBAAA,UAAA,GAAa,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,GAAI,KAAA;AAAA,cACxC;AAAA,YACF,CAAA,MAAO;AAEL,cAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AAClC,cAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA;AAChC,cAAA,UAAA,GAAa,CAAA,EAAG,IAAI,CAAA,eAAA,EAAkB,IAAI,CAAA,CAAA;AAAA,YAC5C;AAAA,UACF;AAEA,UAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,YACX,UAAU,IAAA,CAAK,QAAA;AAAA,YACf,aAAA,EAAe,UAAA;AAAA,YACf,WAAW,IAAA,CAAK;AAAA,WACjB,CAAA;AAAA,QACH;AAGA,QAAA,MAAM,MAA0B,EAAC;AACjC,QAAA,KAAA,MAAW,QAAQ,MAAA,EAAQ;AACzB,UAAA,MAAM,QAAA,GAAW,KAAK,aAAA,IAAiB,EAAA;AACvC,UAAA,IAAI,KAAA,GAAQ,QAAA;AAEZ,UAAA,IAAI,QAAA,CAAS,SAAS,GAAA,EAAK;AACzB,YAAA,IAAI,KAAK,IAAA,EAAM;AAEb,cAAA,IAAI;AACF,gBAAA,KAAA,GAAQ,MAAM,IAAI,IAAA,CAAK;AAAA,kBACrB;AAAA,oBACE,IAAA,EAAM,QAAA;AAAA,oBACN,OAAA,EAAS;AAAA,mBACX;AAAA,kBACA,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,QAAA;AAAS,iBACnC,CAAA;AACD,gBAAA,IAAI,KAAA,CAAM,SAAS,GAAA,EAAK;AACtB,kBAAA,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,GAAI,KAAA;AAAA,gBAChC;AAAA,cACF,CAAA,CAAA,MAAQ;AAEN,gBAAA,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,GAAI,KAAA;AAAA,cACnC;AAAA,YACF,CAAA,MAAO;AAEL,cAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,KAAA,CAAM,SAAS,EAAE,CAAC,CAAA;AACjD,cAAA,KAAA,GAAQ,aAAA,IAAiB,aAAA,CAAc,MAAA,GAAS,GAAA,GAC5C,cAAc,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,GAAI,QAC9B,aAAA,IAAiB,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,GAAI,KAAA;AAAA,YAChD;AAAA,UACF;AAEA,UAAA,GAAA,CAAI,IAAA,CAAK;AAAA,YACP,UAAU,IAAA,CAAK,QAAA;AAAA,YACf,aAAA,EAAe,KAAA;AAAA,YACf,WAAW,IAAA,CAAK;AAAA,WACjB,CAAA;AAAA,QACH;AAEA,QAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,GAAA,EAAI;AAAA,MAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,MAAM,iBAAA,CAAkB,SAAA,EAAmB,IAAA,EAA2B;AAEpE,QAAA,MAAM,OAAO,IAAA,CAAK,WAAA,CAAY,IAAI,SAAS,CAAA,IAAK,QAAQ,OAAA,EAAQ;AAChE,QAAA,MAAM,IAAA,GAAO,KAAK,IAAA,CAAK,MAAM,KAAK,kBAAA,CAAmB,SAAA,EAAW,IAAI,CAAC,CAAA;AACrE,QAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,SAAA,EAAW,IAAA,CAAK,MAAM,MAAM;AAAA,QAAC,CAAC,CAAC,CAAA;AACpD,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,MAEA,MAAc,kBAAA,CAAmB,SAAA,EAAmB,IAAA,EAA2B;AAC7E,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,YAAA,CAAa,SAAS,CAAA;AAC7C,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,aAAA,CAAc,SAAS,CAAA;AAC/C,QAAA,MAAMA,SAAG,KAAA,CAAM,UAAA,EAAY,EAAE,SAAA,EAAW,MAAM,CAAA;AAE9C,QAAA,IAAI,QAAgB,EAAC;AACrB,QAAA,IAAI;AACF,UAAA,MAAM,OAAA,GAAU,MAAMA,QAAA,CAAG,QAAA,CAAS,WAAW,OAAO,CAAA;AACpD,UAAA,KAAA,GAAQ,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,QAC5B,CAAA,CAAA,MAAQ;AAAA,QAER;AAGA,QAAA,MAAM,KAAA,GAAQ,MAAM,SAAA,CAAU,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,KAAK,EAAE,CAAA;AACrD,QAAA,IAAI,SAAS,CAAA,EAAG;AACd,UAAA,KAAA,CAAM,KAAK,CAAA,GAAI,IAAA;AAAA,QACjB,CAAA,MAAO;AACL,UAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,QACjB;AAEA,QAAA,MAAMA,QAAA,CAAG,UAAU,SAAA,EAAW,IAAA,CAAK,UAAU,KAAA,EAAO,IAAA,EAAM,CAAC,CAAA,EAAG,OAAO,CAAA;AAAA,MACvE;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,MAAM,uBAAA,CACJ,SAAA,EACA,KAAA,EACA,WAAA,EACe;AACf,QAAA,MAAM,OAAO,IAAA,CAAK,WAAA,CAAY,IAAI,SAAS,CAAA,IAAK,QAAQ,OAAA,EAAQ;AAChE,QAAA,MAAM,IAAA,GAAO,KAAK,IAAA,CAAK,MAAM,KAAK,wBAAA,CAAyB,SAAA,EAAW,KAAA,EAAO,WAAW,CAAC,CAAA;AACzF,QAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,SAAA,EAAW,IAAA,CAAK,MAAM,MAAM;AAAA,QAAC,CAAC,CAAC,CAAA;AACpD,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,MAEA,MAAc,wBAAA,CACZ,SAAA,EACA,KAAA,EACA,WAAA,EACe;AACf,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,YAAA,CAAa,SAAS,CAAA;AAE7C,QAAA,IAAI,QAAgB,EAAC;AACrB,QAAA,IAAI;AACF,UAAA,MAAM,OAAA,GAAU,MAAMA,QAAA,CAAG,QAAA,CAAS,WAAW,OAAO,CAAA;AACpD,UAAA,KAAA,GAAQ,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,QAC5B,CAAA,CAAA,MAAQ;AACN,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,YAAY,KAAA,CAAM,SAAA;AAAA,UACtB,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,WAAA,IAAe,CAAA,CAAE,UAAU,KAAA,KAAU;AAAA,SACzD;AACA,QAAA,IAAI,YAAY,CAAA,EAAG;AACjB,UAAA;AAAA,QACF;AAEA,QAAA,KAAA,CAAM,SAAS,CAAA,CAAG,QAAA,CAAS,WAAA,GAAc,WAAA;AACzC,QAAA,MAAMA,QAAA,CAAG,UAAU,SAAA,EAAW,IAAA,CAAK,UAAU,KAAA,EAAO,IAAA,EAAM,CAAC,CAAA,EAAG,OAAO,CAAA;AAAA,MACvE;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,MAAM,qBAAA,CACJ,SAAA,EACA,KAAA,EACA,cAAA,EACe;AACf,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,YAAA,CAAa,SAAS,CAAA;AAC7C,QAAA,IAAI,QAAgB,EAAC;AACrB,QAAA,IAAI;AACF,UAAA,MAAM,OAAA,GAAU,MAAMA,QAAA,CAAG,QAAA,CAAS,WAAW,OAAO,CAAA;AACpD,UAAA,KAAA,GAAQ,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,QAC5B,CAAA,CAAA,MAAQ;AACN,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,YAAY,KAAA,CAAM,SAAA;AAAA,UACtB,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,WAAA,IAAe,CAAA,CAAE,UAAU,KAAA,KAAU;AAAA,SACzD;AACA,QAAA,IAAI,YAAY,CAAA,EAAG;AAAC,UAAA;AAAA,QAAO;AAE3B,QAAA,MAAM,WAAW,KAAA,CAAM,SAAS,CAAA,CAAG,QAAA,CAAS,eAAe,EAAC;AAC5D,QAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,QAAA,EAAU,CAAC,CAAC,CAAC,CAAA;AACnE,QAAA,KAAA,CAAM,SAAS,CAAA,CAAG,QAAA,CAAS,WAAA,GAAc,QAAA,CAAS,GAAA;AAAA,UAAI,CAAC,CAAA,KACrD,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,QAAQ,CAAA,GAAI,EAAE,GAAG,CAAA,EAAG,GAAG,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,QAAQ,GAAE,GAAI;AAAA,SACrE;AACA,QAAA,MAAMA,QAAA,CAAG,UAAU,SAAA,EAAW,IAAA,CAAK,UAAU,KAAA,EAAO,IAAA,EAAM,CAAC,CAAA,EAAG,OAAO,CAAA;AAAA,MACvE;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,SAAS,SAAA,EAAoC;AACjD,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,YAAA,CAAa,SAAS,CAAA;AAE7C,QAAA,IAAI;AACF,UAAA,MAAM,OAAA,GAAU,MAAMA,QAAA,CAAG,QAAA,CAAS,WAAW,OAAO,CAAA;AACpD,UAAA,MAAM,GAAA,GAAc,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAEtC,UAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,UAAA,OAAO,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA,KAAM;AACvB,YAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,EAAG;AAAC,cAAA,OAAO,KAAA;AAAA,YAAM;AAClC,YAAA,IAAA,CAAK,GAAA,CAAI,EAAE,EAAE,CAAA;AACb,YAAA,OAAO,IAAA;AAAA,UACT,CAAC,CAAA;AAAA,QACH,CAAA,CAAA,MAAQ;AAEN,UAAA,OAAO,IAAA,CAAK,uBAAuB,SAAS,CAAA;AAAA,QAC9C;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,MAAc,uBAAuB,SAAA,EAAoC;AACvE,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,mCAAA,EAAsC,SAAS,CAAA,kBAAA,CAAoB,CAAA;AAE/E,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,gBAAA,CAAiB,SAAS,CAAA;AACpD,QAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,UAAA,OAAO,EAAC;AAAA,QACV;AAEA,QAAA,MAAM,SAAA,GAAY,IAAI,aAAA,EAAc;AACpC,QAAA,MAAM,iBAAyB,EAAC;AAEhC,QAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,UAAA,MAAM,IAAA,GAAO,SAAA,CAAU,YAAA,CAAa,KAAK,CAAA;AACzC,UAAA,IAAI,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,WAAA,EAAa;AACvC,YAAA,cAAA,CAAe,KAAK,IAAI,CAAA;AAAA,UAC1B;AAAA,QACF;AAGA,QAAA,MAAM,WAAA,GAAc,UAAU,cAAA,EAAe;AAC7C,QAAA,MAAM,QAAA,GAAW,CAAC,GAAG,cAAA,EAAgB,GAAG,WAAW,CAAA;AAGnD,QAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,UAAA,MAAM,SAAA,GAAY,IAAA,CAAK,YAAA,CAAa,SAAS,CAAA;AAC7C,UAAA,MAAMA,QAAA,CAAG,UAAU,SAAA,EAAW,IAAA,CAAK,UAAU,QAAA,EAAU,IAAA,EAAM,CAAC,CAAA,EAAG,OAAO,CAAA;AAAA,QAC1E;AAEA,QAAA,OAAO,QAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,MAAM,wBAAwB,SAAA,EAI3B;AACD,QAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA;AAC3C,QAAA,MAAM,cAAc,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,WAAW,CAAA;AAGhE,QAAA,MAAM,cAAA,GAAiB,KAAA,CACpB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,WAAA,IAAe,CAAA,CAAE,MAAA,KAAW,QAAQ,CAAA,CAC/D,MAAM,GAAG,CAAA;AAEZ,QAAA,OAAO;AAAA,UACL,cAAA;AAAA,UACA,WAAA;AAAA,UACA,YAAY,KAAA,CAAM;AAAA,SACpB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,MAAM,cAAA,CAAe,SAAA,EAAmB,IAAA,EAAc,KAAA,EAA8B;AAClF,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,uBAAA,CAAwB,SAAS,CAAA;AAC7D,QAAA,MAAM,SAAA,GAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAEzC,QAAA,MAAM,QAAA,GAAiB;AAAA,UACrB,EAAA,EAAI,QAAQ,KAAK,CAAA,KAAA,CAAA;AAAA,UACjB,IAAA,EAAM,MAAA;AAAA,UACN,QAAA;AAAA,UACA,SAAA,EAAW,SAAA;AAAA,UACX,WAAA,EAAa,SAAA;AAAA;AAAA,UACb,MAAA,EAAQ,WAAA;AAAA,UACR,KAAA,EAAO;AAAA,YACL;AAAA,cACE,IAAA,EAAM,MAAA;AAAA,cACN,EAAA,EAAI,CAAA,MAAA,CAAA;AAAA,cACJ,SAAA;AAAA,cACA,OAAA,EAAS,IAAA;AAAA,cACT,IAAA,EAAM;AAAA;AACR,WACF;AAAA,UACA,QAAA,EAAU;AAAA,YACR,OAAA,EAAS;AAAA;AACX,SACF;AAEA,QAAA,MAAM,IAAA,CAAK,iBAAA,CAAkB,SAAA,EAAW,QAAQ,CAAA;AAChD,QAAA,OAAO,QAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,MAAc,wBAAwB,SAAA,EAAoC;AACxE,QAAA,IAAI,QAAA,GAAW,CAAA;AACf,QAAA,MAAM,OAAO,IAAA,CAAK,WAAA,CAAY,IAAI,SAAS,CAAA,IAAK,QAAQ,OAAA,EAAQ;AAChE,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,YAAY;AACjC,UAAA,IAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,SAAS,CAAA,EAAG;AACxC,YAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA;AAC3C,YAAA,MAAM,WAAA,GAAc,KAAA,CAAM,MAAA,KAAW,CAAA,GAAI,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,CAAC,CAAA;AACrF,YAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,SAAA,EAAW,WAAW,CAAA;AAAA,UACjD;AACA,UAAA,QAAA,GAAA,CAAY,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,SAAS,KAAK,CAAA,IAAK,CAAA;AACxD,UAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,SAAA,EAAW,QAAQ,CAAA;AAAA,QAC9C,CAAC,CAAA;AACD,QAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,SAAA,EAAW,IAAA,CAAK,MAAM,MAAM;AAAA,QAAC,CAAC,CAAC,CAAA;AACpD,QAAA,MAAM,IAAA;AACN,QAAA,OAAO,QAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,MAAM,yBAAA,CAA0B,SAAA,EAAmB,KAAA,EAAyC;AAE1F,QAAA,MAAM,OAAO,MAAM,IAAA,CAAK,UAAU,iBAAA,CAAkB,KAAA,EAAO,OAAO,GAAA,KAAQ;AACxE,UAAA,OAAO,IAAA,CAAK,wBAAwB,GAAG,CAAA;AAAA,QACzC,CAAC,CAAA;AAED,QAAA,IAAI,IAAA,EAAM;AAER,UAAA,IAAI,KAAA,CAAM,SAAS,IAAA,CAAK,IAAA,KAAS,eAAe,CAAC,IAAA,CAAK,SAAS,KAAA,EAAO;AACpE,YAAA,IAAA,CAAK,QAAA,CAAS,QAAQ,KAAA,CAAM,KAAA;AAAA,UAC9B;AAEA,UAAA,MAAM,IAAA,CAAK,iBAAA,CAAkB,SAAA,EAAW,IAAI,CAAA;AAC5C,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,mBAAA,CAAoB,SAAA,EAAmB,KAAA,EAAe,YAAA,EAA6D;AACvH,QAAA,IAAI,CAAC,KAAA,IAAS,YAAA,CAAa,MAAA,KAAW,CAAA,EAAG;AACvC,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,SAAA,EAAW,CAAC,KAAA,KAAU;AAC/C,UAAA,MAAM,SAAA,GAAY,IAAA,CAAK,qBAAA,CAAsB,YAAY,CAAA;AACzD,UAAA,IACE,UAAU,KAAA,CAAM,MAAA,KAAW,KAC3B,SAAA,CAAU,QAAA,CAAS,WAAW,CAAA,IAC9B,SAAA,CAAU,UAAU,MAAA,KAAW,CAAA,IAC/B,UAAU,WAAA,CAAY,MAAA,KAAW,KACjC,SAAA,CAAU,UAAA,CAAW,WAAW,CAAA,EAChC;AACA,YAAA,OAAO,KAAA;AAAA,UACT;AAEA,UAAA,MAAM,WAAW,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA,IAAK,KAAK,oBAAA,EAAqB;AACjE,UAAA,KAAA,CAAM,MAAM,KAAK,CAAA,GAAI,IAAA,CAAK,cAAA,CAAe,UAAU,SAAS,CAAA;AAC5D,UAAA,KAAA,CAAM,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,KAAA,CAAM,QAAQ,SAAS,CAAA;AAC1D,UAAA,KAAA,CAAM,SAAA,GAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACzC,UAAA,OAAO,KAAA;AAAA,QACT,CAAC,CAAA;AAAA,MACH;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,yBAAyB,SAAA,EAAoC;AACjE,QAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,aAAA,CAAc,SAAS,CAAA;AAChD,QAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AAErB,QAAA,MAAM,QAAkB,EAAC;AACzB,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,KAAA,CAAM,EAAE,CAAA;AACnC,QAAA,MAAM,QAAA,GAAW,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,EAAE,CAAA;AACzC,QAAA,MAAM,SAAA,GAAY,MAAA,CAAO,SAAA,CAAU,KAAA,CAAM,EAAE,CAAA;AAC3C,QAAA,MAAM,UAAA,GAAa,MAAA,CAAO,UAAA,CAAW,KAAA,CAAM,EAAE,CAAA;AAE7C,QAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,UAAA,KAAA,CAAM,KAAK,0BAA0B,CAAA;AACrC,UAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AAAC,YAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE,CAAA;AAAA,UAAE;AAAA,QACrD;AACA,QAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,UAAA,KAAA,CAAM,KAAK,iCAAiC,CAAA;AAC5C,UAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAAC,YAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,OAAO,CAAA,CAAE,CAAA;AAAA,UAAE;AAAA,QAC9D;AACA,QAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,UAAA,KAAA,CAAM,KAAK,6BAA6B,CAAA;AACxC,UAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAAC,YAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,QAAQ,CAAA,CAAE,CAAA;AAAA,UAAE;AAAA,QACjE;AACA,QAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,UAAA,KAAA,CAAM,KAAK,kCAAkC,CAAA;AAC7C,UAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAAC,YAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE,CAAA;AAAA,UAAE;AAAA,QAC1D;AAEA,QAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,UAAA,OAAO,EAAA;AAAA,QACT;AAEA,QAAA,OAAO,CAAA;AAAA,EAA6B,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC;AAAA,CAAA;AAAA,MACtD;AAAA,MAEA,MAAc,cAAc,SAAA,EAAmD;AAC7E,QAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,gBAAA,CAAiB,SAAS,CAAA;AACrD,QAAA,IAAI;AACF,UAAA,MAAM,GAAA,GAAM,KAAK,KAAA,CAAM,MAAMA,SAAG,QAAA,CAAS,aAAA,EAAe,OAAO,CAAC,CAAA;AAChE,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,IAAI,OAAA,IAAW,CAAA;AAAA,YACxB,WAAW,GAAA,CAAI,SAAA,IAAA,iBAAa,IAAI,IAAA,IAAO,WAAA,EAAY;AAAA,YACnD,KAAA,EAAO,GAAA,CAAI,KAAA,IAAS,EAAC;AAAA,YACrB,MAAA,EAAQ,GAAA,CAAI,MAAA,IAAU,IAAA,CAAK,oBAAA;AAAqB,WAClD;AAAA,QACF,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,CAAA;AAAA,YACT,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,YAClC,OAAO,EAAC;AAAA,YACR,MAAA,EAAQ,KAAK,oBAAA;AAAqB,WACpC;AAAA,QACF;AAAA,MACF;AAAA,MAEA,MAAc,eAAA,CACZ,SAAA,EACA,OAAA,EACe;AACf,QAAA,MAAM,OAAO,IAAA,CAAK,mBAAA,CAAoB,IAAI,SAAS,CAAA,IAAK,QAAQ,OAAA,EAAQ;AACxE,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,YAAY;AACjC,UAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,aAAA,CAAc,SAAS,CAAA;AAChD,UAAA,MAAM,OAAA,GAAU,QAAQ,KAAK,CAAA;AAC7B,UAAA,MAAM,UAAA,GAAa,IAAA,CAAK,aAAA,CAAc,SAAS,CAAA;AAC/C,UAAA,MAAMA,SAAG,KAAA,CAAM,UAAA,EAAY,EAAE,SAAA,EAAW,MAAM,CAAA;AAC9C,UAAA,MAAMA,QAAA,CAAG,SAAA,CAAU,IAAA,CAAK,gBAAA,CAAiB,SAAS,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,OAAO,CAAA;AAAA,QAChG,CAAC,CAAA;AACD,QAAA,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAI,SAAA,EAAW,IAAA,CAAK,MAAM,MAAM;AAAA,QAAC,CAAC,CAAC,CAAA;AAC5D,QAAA,MAAM,IAAA;AAAA,MACR;AAAA,MAEQ,sBAAsB,OAAA,EAA4D;AACxF,QAAA,MAAM,SAAA,GAAY,KAAK,oBAAA,EAAqB;AAE5C,QAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,UAAA,MAAM,OAAO,OAAO,KAAA,CAAM,IAAA,KAAS,QAAA,GAAW,MAAM,IAAA,GAAO,EAAA;AAE3D,UAAA,IAAI,SAAS,iBAAA,EAAmB;AAC9B,YAAA,MAAM,YAAA,GAAgB,KAAA,CAAM,YAAA,IAAwD,EAAC;AACrF,YAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,YAAA,CAAa,KAAK,CAAA,GAAI,YAAA,CAAa,QAAQ,EAAC;AACxE,YAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,YAAA,CAAa,QAAQ,CAAA,GAAI,YAAA,CAAa,WAAW,EAAC;AACjF,YAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,cAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAAC,gBAAA,SAAA,CAAU,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,cAAE;AAAA,YAC5D;AACA,YAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,cAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAAC,gBAAA,SAAA,CAAU,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,cAAE;AAAA,YACrE;AAAA,UACF;AAEA,UAAA,IAAI,SAAS,mBAAA,EAAqB;AAChC,YAAA,MAAM,SAAA,GAAY,OAAO,KAAA,CAAM,SAAA,KAAc,WAAW,KAAA,CAAM,SAAA,CAAU,MAAK,GAAI,EAAA;AACjF,YAAA,IAAI,SAAA,EAAW;AAAC,cAAA,SAAA,CAAU,SAAA,CAAU,KAAK,SAAS,CAAA;AAAA,YAAE;AAAA,UACtD;AAEA,UAAA,IAAI,SAAS,cAAA,EAAgB;AAC3B,YAAA,MAAM,WAAW,OAAO,KAAA,CAAM,QAAA,KAAa,QAAA,GAAW,MAAM,QAAA,GAAW,SAAA;AACvE,YAAA,SAAA,CAAU,SAAA,CAAU,IAAA,CAAK,CAAA,iBAAA,EAAoB,QAAQ,CAAA,CAAA,CAAG,CAAA;AAAA,UAC1D;AAEA,UAAA,IAAI,SAAS,gBAAA,EAAkB;AAC7B,YAAA,MAAM,IAAA,GAAQ,KAAA,CAAM,IAAA,IAAgD,EAAC;AACrE,YAAA,MAAM,KAAA,GAAS,KAAA,CAAM,KAAA,IAAiD,EAAC;AACvE,YAAA,MAAM,WAAW,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,GAAW,KAAK,IAAA,GAAO,EAAA;AAC7D,YAAA,MAAM,WAAW,KAAA,CAAM,IAAA;AACvB,YAAA,MAAM,gBAAgB,KAAA,CAAM,SAAA;AAE5B,YAAA,IAAI,QAAA,EAAU;AACZ,cAAA,SAAA,CAAU,WAAA,CAAY,IAAA,CAAK,CAAA,WAAA,EAAc,QAAQ,CAAA,CAAE,CAAA;AAAA,YACrD;AACA,YAAA,IAAI,OAAO,QAAA,KAAa,QAAA,IAAY,QAAA,CAAS,MAAK,EAAG;AACnD,cAAA,SAAA,CAAU,UAAA,CAAW,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,CAAA;AAAA,YAC3C;AACA,YAAA,IAAI,OAAO,aAAA,KAAkB,QAAA,IAAY,aAAA,CAAc,MAAK,EAAG;AAC7D,cAAA,SAAA,CAAU,UAAA,CAAW,IAAA,CAAK,aAAA,CAAc,IAAA,EAAM,CAAA;AAAA,YAChD;AAAA,UACF;AAAA,QACF;AAEA,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,IAAA,CAAK,UAAA,CAAW,SAAA,CAAU,OAAO,EAAE,CAAA;AAAA,UAC1C,QAAA,EAAU,IAAA,CAAK,UAAA,CAAW,SAAA,CAAU,UAAU,EAAE,CAAA;AAAA,UAChD,SAAA,EAAW,IAAA,CAAK,UAAA,CAAW,SAAA,CAAU,WAAW,EAAE,CAAA;AAAA,UAClD,WAAA,EAAa,IAAA,CAAK,UAAA,CAAW,SAAA,CAAU,aAAa,EAAE,CAAA;AAAA,UACtD,UAAA,EAAY,IAAA,CAAK,UAAA,CAAW,SAAA,CAAU,YAAY,EAAE;AAAA,SACtD;AAAA,MACF;AAAA,MAEQ,cAAA,CAAe,GAAsB,CAAA,EAAyC;AACpF,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,IAAA,CAAK,UAAA,CAAW,CAAC,GAAG,CAAA,CAAE,KAAA,EAAO,GAAG,CAAA,CAAE,KAAK,CAAA,EAAG,EAAE,CAAA;AAAA,UACnD,QAAA,EAAU,IAAA,CAAK,UAAA,CAAW,CAAC,GAAG,CAAA,CAAE,QAAA,EAAU,GAAG,CAAA,CAAE,QAAQ,CAAA,EAAG,EAAE,CAAA;AAAA,UAC5D,SAAA,EAAW,IAAA,CAAK,UAAA,CAAW,CAAC,GAAG,CAAA,CAAE,SAAA,EAAW,GAAG,CAAA,CAAE,SAAS,CAAA,EAAG,EAAE,CAAA;AAAA,UAC/D,WAAA,EAAa,IAAA,CAAK,UAAA,CAAW,CAAC,GAAG,CAAA,CAAE,WAAA,EAAa,GAAG,CAAA,CAAE,WAAW,CAAA,EAAG,EAAE,CAAA;AAAA,UACrE,UAAA,EAAY,IAAA,CAAK,UAAA,CAAW,CAAC,GAAG,CAAA,CAAE,UAAA,EAAY,GAAG,CAAA,CAAE,UAAU,CAAA,EAAG,EAAE;AAAA,SACpE;AAAA,MACF;AAAA,MAEQ,UAAA,CAAW,OAAiB,GAAA,EAAuB;AACzD,QAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,QAAA,MAAM,SAAS,KAAA,CACZ,GAAA,CAAI,CAAC,IAAA,KAAS,KAAK,IAAA,EAAM,CAAA,CACzB,MAAA,CAAO,OAAO,CAAA,CACd,OAAA,EAAQ,CACR,MAAA,CAAO,CAAC,IAAA,KAAS;AAChB,UAAA,IAAI,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG;AAAC,YAAA,OAAO,KAAA;AAAA,UAAM;AAClC,UAAA,IAAA,CAAK,IAAI,IAAI,CAAA;AACb,UAAA,OAAO,IAAA;AAAA,QACT,CAAC,EACA,OAAA,EAAQ;AACX,QAAA,OAAO,MAAA,CAAO,KAAA,CAAM,CAAC,GAAG,CAAA;AAAA,MAC1B;AAAA,MAEQ,oBAAA,GAA0C;AAChD,QAAA,OAAO;AAAA,UACL,OAAO,EAAC;AAAA,UACR,UAAU,EAAC;AAAA,UACX,WAAW,EAAC;AAAA,UACZ,aAAa,EAAC;AAAA,UACd,YAAY;AAAC,SACf;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,cAAc,SAAA,EAA2B;AACvC,QAAA,OAAYC,YAAK,IAAA,CAAK,UAAA,EAAY,KAAA,EAAO,QAAA,EAAU,YAAY,SAAS,CAAA;AAAA,MAC1E;AAAA;AAAA;AAAA;AAAA,MAKA,cAAc,SAAA,EAA2B;AACvC,QAAA,OAAYA,MAAA,CAAA,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,SAAS,GAAG,eAAe,CAAA;AAAA,MACjE;AAAA;AAAA;AAAA;AAAA,MAKA,mBAAmB,SAAA,EAA2B;AAC5C,QAAA,OAAYA,MAAA,CAAA,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,SAAS,GAAG,WAAW,CAAA;AAAA,MAC7D;AAAA;AAAA;AAAA;AAAA,MAKA,mBAAmB,SAAA,EAA2B;AAC5C,QAAA,OAAYA,MAAA,CAAA,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,SAAS,GAAG,WAAW,CAAA;AAAA,MAC7D;AAAA;AAAA;AAAA;AAAA,MAKA,qBAAqB,SAAA,EAA2B;AAC9C,QAAA,OAAYA,MAAA,CAAA,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,SAAS,GAAG,SAAS,CAAA;AAAA,MAC3D;AAAA;AAAA;AAAA;AAAA,MAKA,uBAAuB,SAAA,EAA2B;AAChD,QAAA,OAAYA,MAAA,CAAA,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,SAAS,GAAG,eAAe,CAAA;AAAA,MACjE;AAAA;AAAA;AAAA;AAAA,MAKA,aAAa,SAAA,EAA2B;AACtC,QAAA,OAAYA,MAAA,CAAA,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,SAAS,GAAG,YAAY,CAAA;AAAA,MAC9D;AAAA;AAAA;AAAA;AAAA,MAKA,iBAAiB,SAAA,EAA2B;AAC1C,QAAA,OAAYA,MAAA,CAAA,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,SAAS,GAAG,sBAAsB,CAAA;AAAA,MACxE;AAAA;AAAA;AAAA;AAAA,MAKA,mBAAmB,SAAA,EAA2B;AAC5C,QAAA,OAAYA,MAAA,CAAA,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,SAAS,GAAG,mBAAmB,CAAA;AAAA,MACrE;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,eAAe,SAAA,EAAuD;AAC1E,QAAA,IAAI;AACF,UAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,MAAMD,QAAA,CAAG,QAAA,CAAS,IAAA,CAAK,kBAAA,CAAmB,SAAS,CAAA,EAAG,OAAO,CAAC,CAAA;AACrF,UAAA,IACE,OAAO,GAAA,CAAI,YAAA,KAAiB,QAAA,IACzB,OAAO,GAAA,CAAI,kBAAA,KAAuB,QAAA,IAClC,OAAO,IAAI,gBAAA,KAAqB,QAAA,IAChC,OAAO,GAAA,CAAI,YAAY,QAAA,EAC1B;AACA,YAAA,OAAO,IAAA;AAAA,UACT;AAEA,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,IAAI,OAAA,IAAW,CAAA;AAAA,YACxB,WAAW,GAAA,CAAI,SAAA,IAAA,iBAAa,IAAI,IAAA,IAAO,WAAA,EAAY;AAAA,YACnD,cAAc,GAAA,CAAI,YAAA;AAAA,YAClB,oBAAoB,GAAA,CAAI,kBAAA;AAAA,YACxB,kBAAkB,GAAA,CAAI,gBAAA;AAAA,YACtB,SAAS,GAAA,CAAI,OAAA;AAAA,YACb,YAAA,EAAc,MAAM,OAAA,CAAQ,GAAA,CAAI,YAAY,CAAA,GACxC,GAAA,CAAI,YAAA,CAAa,MAAA,CAAO,CAAC,KAAA,KAA2B,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,QAAA,CAAS,KAAK,CAAC,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAA,GAClH,EAAC;AAAA,YACL,2BAAA,EAA6B,MAAM,OAAA,CAAQ,GAAA,CAAI,2BAA2B,CAAA,GACtE,GAAA,CAAI,2BAAA,CAA4B,MAAA,CAAO,CAAC,KAAA,KAA2B,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,QAAA,CAAS,KAAK,CAAC,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAA,GACjI,EAAC;AAAA,YACL,mBAAA,EAAqB,MAAM,OAAA,CAAQ,GAAA,CAAI,mBAAmB,CAAA,GACtD,GAAA,CAAI,mBAAA,CAAoB,MAAA,CAAO,CAAC,KAAA,KAA2B,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,QAAA,CAAS,KAAK,CAAC,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAA,GACzH;AAAC,WACP;AAAA,QACF,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,iBAAA,CACJ,SAAA,EACA,OAAA,EACe;AACf,QAAA,MAAM,OAAO,IAAA,CAAK,cAAA,CAAe,IAAI,SAAS,CAAA,IAAK,QAAQ,OAAA,EAAQ;AACnE,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,YAAY;AACjC,UAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,cAAA,CAAe,SAAS,CAAA;AACnD,UAAA,MAAM,OAAA,GAAU,QAAQ,OAAO,CAAA;AAC/B,UAAA,MAAM,UAAA,GAAa,IAAA,CAAK,aAAA,CAAc,SAAS,CAAA;AAC/C,UAAA,MAAMA,SAAG,KAAA,CAAM,UAAA,EAAY,EAAE,SAAA,EAAW,MAAM,CAAA;AAC9C,UAAA,MAAMA,QAAA,CAAG,SAAA,CAAU,IAAA,CAAK,kBAAA,CAAmB,SAAS,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,OAAO,CAAA;AAAA,QAClG,CAAC,CAAA;AACD,QAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,SAAA,EAAW,IAAA,CAAK,MAAM,MAAM;AAAA,QAAC,CAAC,CAAC,CAAA;AACvD,QAAA,MAAM,IAAA;AAAA,MACR;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC7pCA,SAAS,eAAe,IAAA,EAAwB;AAC9C,EAAA,MAAM,WAAW,IAAA,CAAK,KAAA,CAAM,8BAA8B,CAAA,IAAK,IAC5D,GAAA,CAAI,CAAC,SAAS,IAAA,CAAK,OAAA,CAAQ,yBAAyB,EAAE,CAAA,CAAE,MAAM,CAAA,CAC9D,OAAO,OAAO,CAAA;AAEjB,EAAA,MAAM,aAAa,IAAA,CAAK,KAAA,CAAM,uBAAuB,CAAA,IAAK,IACvD,GAAA,CAAI,CAAC,SAAS,IAAA,CAAK,OAAA,CAAQ,YAAY,EAAE,CAAA,CAAE,MAAM,CAAA,CACjD,OAAO,OAAO,CAAA;AACjB,EAAA,OAAO,CAAC,GAAG,OAAA,EAAS,GAAG,SAAS,CAAA;AAClC;AAGA,SAAS,QAAQ,CAAA,EAAmB;AAClC,EAAA,OAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAC,CAAA;AACnC;AAGA,SAAS,cAAA,CAAe,MAAc,SAAA,EAA2B;AAC/D,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC7B,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,IAAI,YAAA,GAAe,CAAA;AACnB,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,EAAG;AACxB,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA;AACtC,MAAA,YAAA,GAAe,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,CAAG,MAAA,GAAS,CAAA;AAC1C,MAAA;AAAA,IACF;AACA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,YAAA,GAAe,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA;AAC7C,MAAA,IAAI,YAAA,IAAgB,YAAA,CAAa,CAAC,CAAA,CAAG,UAAU,YAAA,EAAc;AAAC,QAAA;AAAA,MAAM;AACpE,MAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,IAClB;AAAA,EACF;AACA,EAAA,OAAO,MAAA,CAAO,KAAK,IAAI,CAAA;AACzB;AAEA,SAAS,mBAAmB,OAAA,EAAyB;AACnD,EAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAK,CAAE,MAAA,GAAS,CAAC,CAAA,CAAE,MAAA;AAChE;AAnGA,IAyCM,eACA,eAAA,CAAA,CACA,cAAA,CAAA,CACA,cAAA,CAAA,CAEA,cAAA,CAAA,CAOA,cAGA,UAAA,CAAA,CAiDO;AAzGb,IAAA,mBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,gCAAA,GAAA;AAyCA,IAAM,aAAA,GAAkB,GAAA;AACxB,IAAM,eAAA,GAAkB,IAAA;AACxB,IAAM,cAAA,GAAkB,IAAA;AACxB,IAAM,cAAA,GAAkB,GAAA;AAExB,IAAM,cAAA,GAAkB,IAAA;AAOxB,IAAM,YAAA,GAAe,gCAAA;AAGrB,IAAM,UAAA,GAAa,sDAAA;AAiDZ,IAAM,gBAAN,MAAoB;AAAA;AAAA;AAAA;AAAA,MAIzB,SAAS,QAAA,EAAwC;AAC/C,QAAA,MAAM,QAAQ,QAAA,IAAY,EAAA,EAAI,QAAQ,OAAA,EAAS,IAAI,EAAE,IAAA,EAAK;AAC1D,QAAA,MAAM,SAA2B,EAAC;AAGlC,QAAA,MAAM,WAAA,GAAc,IAAA,CAAK,gBAAA,CAAiB,IAAA,EAAM,MAAM,CAAA;AAGtD,QAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,kBAAA,CAAmB,IAAA,EAAM,MAAM,CAAA;AAG1D,QAAA,MAAM,YAAA,GAAe,IAAA,CAAK,iBAAA,CAAkB,IAAA,EAAM,MAAM,CAAA;AAGxD,QAAA,MAAM,YAAA,GAAe,IAAA,CAAK,iBAAA,CAAkB,IAAA,EAAM,MAAM,CAAA;AAExD,QAAA,MAAM,KAAA,GAAQ,OAAA;AAAA,UACZ,YAAY,QAAA,GACZ,aAAA,CAAc,QAAA,GACd,YAAA,CAAa,WACb,YAAA,CAAa;AAAA,SACf;AAEA,QAAA,MAAM,YAAY,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,OAAO,CAAA;AAC3D,QAAA,MAAM,MAAA,GAAS,KAAA,IAAS,cAAA,IAAkB,CAAC,SAAA;AAE3C,QAAA,OAAO;AAAA,UACL,MAAA;AAAA,UACA,KAAA;AAAA,UACA,MAAA,EAAQ,EAAE,WAAA,EAAa,aAAA,EAAe,cAAc,YAAA,EAAa;AAAA,UACjE;AAAA,SACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAMQ,gBAAA,CAAiB,MAAc,MAAA,EAAuC;AAC5E,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,YAAY,KAAK,EAAC;AAC7C,QAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,EAAa,CAAC,CAAA;AAC1D,QAAA,MAAM,QAAQ,MAAA,CAAO,IAAA;AAErB,QAAA,IAAI,GAAA;AACJ,QAAA,IAAI,SAAS,CAAA,EAAG;AACd,UAAA,GAAA,GAAM,CAAA;AAAA,QACR,CAAA,MAAA,IAAW,SAAS,CAAA,EAAG;AACrB,UAAA,GAAA,GAAM,GAAA,GAAA,CAAO,QAAQ,CAAA,IAAK,KAAA;AAAA,QAC5B,CAAA,MAAA,IAAW,UAAU,CAAA,EAAG;AACtB,UAAA,GAAA,GAAM,IAAA;AAAA,QACR,CAAA,MAAO;AACL,UAAA,GAAA,GAAM,CAAA;AAAA,QACR;AACA,QAAA,GAAA,GAAM,QAAQ,GAAG,CAAA;AAEjB,QAAA,IAAI,UAAU,CAAA,EAAG;AACf,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,SAAA,EAAW,aAAA;AAAA,YACX,QAAA,EAAU,SAAA;AAAA,YACV,OAAA,EAAS;AAAA,WACV,CAAA;AAAA,QACH,CAAA,MAAA,IAAW,QAAQ,CAAA,EAAG;AACpB,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,SAAA,EAAW,aAAA;AAAA,YACX,QAAA,EAAU,SAAA;AAAA,YACV,OAAA,EAAS,QAAQ,KAAK,CAAA,+DAAA;AAAA,WACvB,CAAA;AAAA,QACH;AAEA,QAAA,OAAO,EAAE,KAAK,QAAA,EAAU,GAAA,GAAM,eAAe,OAAA,EAAS,CAAA,EAAG,KAAK,CAAA,oBAAA,CAAA,EAAuB;AAAA,MACvF;AAAA;AAAA;AAAA;AAAA,MAMQ,kBAAA,CAAmB,MAAc,MAAA,EAAuC;AAC9E,QAAA,MAAM,OAAA,GAAU,eAAe,IAAI,CAAA;AACnC,QAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,SAAA,EAAW,eAAA;AAAA,YACX,QAAA,EAAU,OAAA;AAAA,YACV,OAAA,EAAS;AAAA,WACV,CAAA;AACD,UAAA,OAAO,EAAE,GAAA,EAAK,CAAA,EAAG,QAAA,EAAU,CAAA,EAAG,SAAS,SAAA,EAAU;AAAA,QACnD;AAEA,QAAA,IAAI,UAAA,GAAa,CAAA;AACjB,QAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,UAAA,MAAM,OAAA,GAAU,YAAA,CAAa,IAAA,CAAK,MAAM,CAAA;AACxC,UAAA,YAAA,CAAa,SAAA,GAAY,CAAA;AACzB,UAAA,MAAM,MAAA,GAAS,UAAA,CAAW,IAAA,CAAK,MAAM,CAAA;AACrC,UAAA,UAAA,CAAW,SAAA,GAAY,CAAA;AACvB,UAAA,IAAI,WAAW,MAAA,EAAQ;AAAC,YAAA,UAAA,EAAA;AAAA,UAAa;AAAA,QACvC;AAEA,QAAA,MAAM,KAAA,GAAQ,aAAa,OAAA,CAAQ,MAAA;AACnC,QAAA,MAAM,GAAA,GAAM,QAAQ,KAAK,CAAA;AAEzB,QAAA,IAAI,eAAe,CAAA,EAAG;AACpB,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,SAAA,EAAW,eAAA;AAAA,YACX,QAAA,EAAU,OAAA;AAAA,YACV,OAAA,EAAS;AAAA,WACV,CAAA;AAAA,QACH,CAAA,MAAA,IAAW,QAAQ,GAAA,EAAK;AACtB,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,SAAA,EAAW,eAAA;AAAA,YACX,QAAA,EAAU,SAAA;AAAA,YACV,OAAA,EAAS,CAAA,KAAA,EAAQ,UAAU,CAAA,CAAA,EAAI,QAAQ,MAAM,CAAA,mCAAA;AAAA,WAC9C,CAAA;AAAA,QACH;AAEA,QAAA,OAAO;AAAA,UACL,GAAA;AAAA,UACA,UAAU,GAAA,GAAM,eAAA;AAAA,UAChB,OAAA,EAAS,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,QAAQ,MAAM,CAAA,iBAAA;AAAA,SAC1C;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAMQ,iBAAA,CAAkB,MAAc,MAAA,EAAuC;AAC7E,QAAA,MAAM,QAAA,GAAmE;AAAA,UACvE,EAAE,IAAA,EAAM,MAAA,EAAQ,EAAA,EAAI,gCAAA,EAAkC,UAAU,IAAA,EAAK;AAAA,UACrE,EAAE,IAAA,EAAM,OAAA,EAAS,EAAA,EAAI,6DAAA,EAA+D,UAAU,IAAA,EAAK;AAAA,UACnG,EAAE,IAAA,EAAM,OAAA,EAAS,EAAA,EAAI,iDAAA,EAAmD,UAAU,KAAA,EAAM;AAAA,UACxF,EAAE,IAAA,EAAM,cAAA,EAAgB,EAAA,EAAI,qDAAA,EAAuD,UAAU,IAAA;AAAK,SACpG;AAEA,QAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,QAAA,IAAI,aAAA,GAAgB,CAAA;AAEpB,QAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,UAAA,IAAI,GAAA,CAAI,EAAA,CAAG,IAAA,CAAK,IAAI,CAAA,EAAG;AACrB,YAAA,KAAA,EAAA;AACA,YAAA,MAAM,IAAA,GAAO,cAAA,CAAe,IAAA,EAAM,GAAA,CAAI,EAAE,CAAA;AACxC,YAAA,IAAI,kBAAA,CAAmB,IAAI,CAAA,IAAK,CAAA,EAAG;AACjC,cAAA,aAAA,EAAA;AAAA,YACF,CAAA,MAAO;AACL,cAAA,MAAA,CAAO,IAAA,CAAK;AAAA,gBACV,SAAA,EAAW,cAAA;AAAA,gBACX,QAAA,EAAU,SAAA;AAAA,gBACV,OAAA,EAAS,CAAA,SAAA,EAAY,GAAA,CAAI,IAAI,CAAA,8CAAA;AAAA,eAC9B,CAAA;AAAA,YACH;AAAA,UACF,CAAA,MAAA,IAAW,IAAI,QAAA,EAAU;AACvB,YAAA,MAAA,CAAO,IAAA,CAAK;AAAA,cACV,SAAA,EAAW,cAAA;AAAA,cACX,QAAA,EAAU,SAAA;AAAA,cACV,OAAA,EAAS,CAAA,0BAAA,EAA6B,GAAA,CAAI,IAAI,CAAA,CAAA;AAAA,aAC/C,CAAA;AAAA,UACH;AAAA,QACF;AAEA,QAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,aAAA,GAAgB,QAAA,CAAS,MAAM,CAAA;AAEnD,QAAA,IAAI,UAAU,CAAA,EAAG;AACf,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,SAAA,EAAW,cAAA;AAAA,YACX,QAAA,EAAU,OAAA;AAAA,YACV,OAAA,EAAS;AAAA,WACV,CAAA;AAAA,QACH;AAEA,QAAA,OAAO;AAAA,UACL,GAAA;AAAA,UACA,UAAU,GAAA,GAAM,cAAA;AAAA,UAChB,OAAA,EAAS,CAAA,EAAG,aAAa,CAAA,CAAA,EAAI,SAAS,MAAM,CAAA,wBAAA;AAAA,SAC9C;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAMQ,iBAAA,CAAkB,MAAc,MAAA,EAAuC;AAC7E,QAAA,MAAM,SAAA,GAAY,cAAA,CAAe,IAAA,EAAM,qDAAqD,CAAA;AAE5F,QAAA,IAAI,CAAC,SAAA,CAAU,IAAA,EAAK,EAAG;AAErB,UAAA,MAAME,KAAAA,GAAO,IAAA,CAAK,KAAA,CAAM,UAAU,KAAK,EAAC;AACxC,UAAA,IAAIA,KAAAA,CAAK,SAAS,CAAA,EAAG;AACnB,YAAA,MAAA,CAAO,IAAA,CAAK;AAAA,cACV,SAAA,EAAW,cAAA;AAAA,cACX,QAAA,EAAU,SAAA;AAAA,cACV,OAAA,EAAS;AAAA,aACV,CAAA;AACD,YAAA,OAAO,EAAE,GAAA,EAAK,GAAA,EAAK,QAAA,EAAU,GAAA,GAAM,gBAAgB,OAAA,EAAS,CAAA,EAAGA,KAAAA,CAAK,MAAM,CAAA,2BAAA,CAAA,EAA8B;AAAA,UAC1G;AAEA,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,SAAA,EAAW,cAAA;AAAA,YACX,QAAA,EAAU,OAAA;AAAA,YACV,OAAA,EAAS;AAAA,WACV,CAAA;AACD,UAAA,OAAO,EAAE,GAAA,EAAK,CAAA,EAAG,QAAA,EAAU,CAAA,EAAG,SAAS,YAAA,EAAa;AAAA,QACtD;AAEA,QAAA,MAAM,IAAA,GAAO,SAAA,CAAU,KAAA,CAAM,UAAU,KAAK,EAAC;AAC7C,QAAA,IAAI,GAAA;AACJ,QAAA,IAAI,IAAA,CAAK,UAAU,CAAA,EAAG;AACpB,UAAA,GAAA,GAAM,CAAA;AAAA,QACR,CAAA,MAAA,IAAW,IAAA,CAAK,MAAA,IAAU,CAAA,EAAG;AAC3B,UAAA,GAAA,GAAM,GAAA,GAAM,KAAK,MAAA,GAAS,GAAA;AAAA,QAC5B,CAAA,MAAO;AACL,UAAA,GAAA,GAAM,CAAA;AACN,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,SAAA,EAAW,cAAA;AAAA,YACX,QAAA,EAAU,SAAA;AAAA,YACV,OAAA,EAAS;AAAA,WACV,CAAA;AAAA,QACH;AACA,QAAA,GAAA,GAAM,QAAQ,GAAG,CAAA;AAEjB,QAAA,OAAO;AAAA,UACL,GAAA;AAAA,UACA,UAAU,GAAA,GAAM,cAAA;AAAA,UAChB,OAAA,EAAS,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,wBAAA;AAAA,SACzB;AAAA,MACF;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;AC5UA,IAQa;AARb,IAAA,0BAAA,GAAA,KAAA,CAAA;AAAA,EAAA,uCAAA,GAAA;AAQO,IAAM,sBAAN,MAA0B;AAAA,MACd,UAAA;AAAA,MACA,QAAA;AAAA,MAEjB,WAAA,CAAY,UAAA,EAAoB,OAAA,GAAsC,EAAC,EAAG;AACxE,QAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,QAAA,IAAA,CAAK,QAAA,GAAW,QAAQ,QAAA,IAAiBC,MAAA,CAAA,IAAA,CAAK,KAAK,UAAA,EAAY,MAAA,EAAQ,SAAS,QAAQ,CAAA;AAAA,MAC1F;AAAA,MAEA,WAAA,GAAsB;AACpB,QAAA,OAAO,IAAA,CAAK,QAAA;AAAA,MACd;AAAA,MAEA,YAAY,IAAA,EAAwB;AAClC,QAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,GAAA,EAAK,CAAA,CAAE,WAAA,EAAY,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AAC7E,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,QAAQ,MAAM,CAAA;AAC7C,QAAA,MAAM,QAAA,GAAA,CAAY,IAAA,CAAK,EAAA,IAAM,MAAA,EAAQ,OAAA,CAAQ,kBAAkB,EAAE,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,IAAK,MAAA;AACjF,QAAA,MAAM,WAAW,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,IAAI,IAAI,QAAQ,CAAA,GAAA,CAAA;AAC5C,QAAA,OAAYA,MAAA,CAAA,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,QAAQ,CAAA;AAAA,MAC1C;AAAA,MAEA,MAAM,YAAY,IAAA,EAA6D;AAC7E,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA;AACtC,QAAA,MAAMH,QAAAA,CAAG,MAAWG,MAAA,CAAA,OAAA,CAAQ,QAAQ,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAE1D,QAAA,MAAM,MAAA,GAAS,OAAO,IAAA,CAAK,QAAA,KAAa,YAAY,IAAA,CAAK,QAAA,CAAS,IAAA,EAAK,CAAE,SAAS,CAAA,GAC9E,IAAA,CAAK,QAAA,GACL,IAAA,CAAK,YAAY,IAAI,CAAA;AACzB,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA;AACvC,QAAA,MAAMH,QAAAA,CAAG,SAAA,CAAU,QAAA,EAAU,QAAA,EAAU,OAAO,CAAA;AAE9C,QAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,QAAA,EAAS;AAAA,MACpC;AAAA,MAEA,YAAY,IAAA,EAAwB;AAClC,QAAA,OAAO,IAAA,CAAK,mBAAmB,IAAI,CAAA;AAAA,MACrC;AAAA,MAEA,MAAM,WAAA,CAAY,QAAA,EAAkB,QAAA,EAAmC;AACrE,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA;AACxC,QAAA,MAAMA,QAAAA,CAAG,MAAWG,MAAA,CAAA,OAAA,CAAQ,QAAQ,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAC1D,QAAA,MAAMH,QAAAA,CAAG,SAAA,CAAU,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAC7C,QAAA,OAAO,OAAA;AAAA,MACT;AAAA,MAEA,MAAM,kBAAA,CAAmB,QAAA,EAAkB,KAAA,EAAgC;AACzE,QAAA,IAAI,OAAA,GAAU,EAAA;AACd,QAAA,IAAI;AACF,UAAA,OAAA,GAAU,MAAMA,QAAAA,CAAG,QAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AAAA,QAC/C,CAAA,CAAA,MAAQ;AACN,UAAA,OAAA,GAAU,8BAAA;AAAA,QACZ;AAEA,QAAA,MAAM,MAAA,GAAS,0BAAA;AACf,QAAA,IAAI,IAAA;AACJ,QAAA,IAAI,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,EAAG;AACxB,UAAA,IAAA,GAAO,CAAA,EAAG,OAAA,CAAQ,OAAA,EAAS;;AAAA,EAAO,KAAA,CAAM,MAAM;AAAA,CAAA;AAAA,QAChD,CAAA,MAAO;AACL,UAAA,IAAA,GAAO,CAAA,EAAG,OAAA,CAAQ,OAAA,EAAS;;AAAA;;AAAA,EAA2B,KAAA,CAAM,MAAM;AAAA,CAAA;AAAA,QACpE;AAEA,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA;AACpC,QAAA,MAAMA,QAAAA,CAAG,SAAA,CAAU,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAC7C,QAAA,OAAO,OAAA;AAAA,MACT;AAAA,MAEA,WAAW,QAAA,EAA0B;AACnC,QAAA,MAAM,UAAA,GAAa,QAAA,CAAS,OAAA,CAAQ,OAAA,EAAS,IAAI,CAAA;AACjD,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,iBAAA,CAAkB,UAAU,CAAA;AACpD,QAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,IAAI,CAAA;AAEnC,QAAA,MAAM,UAAA,GAAa,MAAM,SAAA,CAAU,CAAC,SAAS,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA;AAC/D,QAAA,IAAI,aAAa,CAAA,EAAG;AAClB,UAAA,OAAO,UAAA;AAAA,QACT;AAEA,QAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,eAAA,CAAgB,UAAU,CAAA;AACtD,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,cAAc,CAAA;AAC9C,QAAA,MAAM,WAAW,CAAC,sBAAA,EAAwB,GAAG,QAAQ,CAAA,CAAE,KAAK,IAAI,CAAA;AAEhE,QAAA,MAAM,MAAA,GAAS,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,UAAA,GAAa,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,CAAE,OAAA,EAAQ;AACjE,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,UAAA,GAAa,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,CAAE,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AAEvE,QAAA,MAAM,WAAW,CAAC,MAAA,EAAQ,IAAI,QAAA,EAAU,EAAA,EAAI,MAAM,OAAA,EAAS,CAAA,CACxD,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,CAAC,CAAA,CAChC,KAAK,IAAI,CAAA;AAEZ,QAAA,OAAO,GAAG,QAAQ;AAAA,CAAA;AAAA,MACpB;AAAA,MAEQ,mBAAmB,IAAA,EAAwB;AACjD,QAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,2BAAA,CAA4B,IAAI,CAAA;AAC3D,QAAA,MAAM,gBAAgB,IAAA,CAAK,MAAA,CACxB,GAAA,CAAI,CAAC,OAAO,UAAA,KAAe;AAC1B,UAAA,MAAM,WAAW,IAAA,CAAK,mBAAA,CAAoB,KAAK,CAAA,CAAE,KAAA,CAAM,GAAG,CAAC,CAAA;AAC3D,UAAA,MAAM,kBAAkB,IAAA,CAAK,2BAAA,CAA4B,KAAK,CAAA,CAAE,KAAA,CAAM,GAAG,CAAC,CAAA;AAE1E,UAAA,OAAO;AAAA,YACL,OAAO,KAAA,CAAM,IAAA,IAAQ,CAAA,MAAA,EAAS,UAAA,GAAa,CAAC,CAAA,CAAE,CAAA,CAAA;AAAA,YAC9C,EAAA;AAAA,YACA,MAAM,WAAA,IAAe,uBAAA;AAAA,YACrB,EAAA;AAAA,YACA,YAAA;AAAA,YACA,GAAI,QAAA,CAAS,MAAA,GAAS,CAAA,GAClB,QAAA,CAAS,GAAA,CAAI,CAAC,IAAA,KAAS,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE,CAAA,GAClC,CAAC,gCAAgC,CAAA;AAAA,YACrC,EAAA;AAAA,YACA,uBAAA;AAAA,YACA,GAAI,eAAA,CAAgB,MAAA,GAAS,CAAA,GACzB,eAAA,CAAgB,GAAA,CAAI,CAAC,MAAA,KAAW,CAAA,EAAA,EAAK,MAAM,CAAA,CAAE,CAAA,GAC7C,CAAC,6CAA6C,CAAA;AAAA,YAClD;AAAA,WACF,CAAE,KAAK,IAAI,CAAA;AAAA,QACb,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AAEZ,QAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,MAAA,CAC1B,MAAA,CAAO,CAAC,UAAU,KAAA,CAAM,YAAA,CAAa,MAAA,GAAS,CAAC,CAAA,CAC/C,GAAA,CAAI,CAAC,KAAA,KAAU,CAAA,EAAA,EAAK,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,EAAE,CAAA,aAAA,EAAgB,KAAA,CAAM,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAE5F,QAAA,OAAO;AAAA,UACL,CAAA,QAAA,EAAW,IAAA,CAAK,IAAA,IAAQ,eAAe,CAAA,CAAA;AAAA,UACvC,EAAA;AAAA,UACA,SAAA;AAAA,UACA,EAAA;AAAA,UACA,aAAA;AAAA,UACA,KAAK,IAAA,IAAQ,iBAAA;AAAA,UACb,EAAA;AAAA,UACA,oBAAA;AAAA,UACA,CAAA,iDAAA,EAAoD,IAAA,CAAK,IAAA,IAAQ,WAAW,CAAA,CAAA,CAAA;AAAA,UAC5E,EAAA;AAAA,UACA,UAAA;AAAA,UACA,EAAA;AAAA,UACA,cAAc,IAAA,EAAK;AAAA,UACnB,EAAA;AAAA,UACA,UAAA;AAAA,UACA,EAAA;AAAA,UACA,2DAAA;AAAA,UACA,GAAI,eAAA,CAAgB,MAAA,GAAS,CAAA,GAAI,eAAA,GAAkB,CAAC,sEAAsE,CAAA;AAAA,UAC1H,EAAA;AAAA,UACA,iBAAA;AAAA,UACA,EAAA;AAAA,UACA,6DAAA;AAAA,UACA,GAAI,aAAA,CAAc,MAAA,GAAS,CAAA,GACvB,aAAA,CAAc,GAAA,CAAI,CAAC,OAAA,KAAY,CAAA,IAAA,EAAO,OAAO,CAAA,EAAA,CAAI,CAAA,GACjD,EAAC;AAAA,UACL,EAAA;AAAA,UACA,aAAA;AAAA,UACA,EAAA;AAAA,UACA,CAAA,cAAA,EAAiB,KAAK,MAAM,CAAA,CAAA;AAAA,UAC5B,2DAAA;AAAA,UACA,EAAA;AAAA,UACA,kBAAA;AAAA,UACA,EAAA;AAAA,UACA,8BAAA;AAAA,UACA,EAAA;AAAA,UACA,iBAAA;AAAA,UACA,EAAA;AAAA,UACA,yDAAA;AAAA,UACA,iCAAA;AAAA,UACA,CAAA,MAAA,EAAS,KAAK,SAAS,CAAA,mDAAA,CAAA;AAAA,UACvB;AAAA,SACF,CAAE,KAAK,IAAI,CAAA;AAAA,MACb;AAAA,MAEQ,oBAAoB,KAAA,EAA6C;AACvE,QAAA,MAAM,aAAuB,EAAC;AAE9B,QAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAC9B,UAAA,MAAM,MAAA,GAAA,CAAU,IAAA,CAAK,MAAA,IAAU,EAAA,EAAI,IAAA,EAAK;AACxC,UAAA,IAAI,CAAC,MAAA,EAAQ;AACX,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,WAAA,GAAc,6BAA6B,IAAA,CAAK,MAAM,IACxD,MAAA,CAAO,OAAA,CAAQ,4BAAA,EAA8B,EAAE,CAAA,GAC/C,MAAA;AACJ,UAAA,MAAM,MAAA,GAAS,WAAA,CACZ,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,KAAA,KAAU,KAAA,CAAM,IAAA,EAAM,CAAA,CAC3B,OAAO,OAAO,CAAA;AAEjB,UAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,YAAA,UAAA,CAAW,IAAA,CAAK,GAAG,MAAM,CAAA;AAAA,UAC3B,CAAA,MAAO;AACL,YAAA,UAAA,CAAW,KAAK,MAAM,CAAA;AAAA,UACxB;AAAA,QACF;AAEA,QAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAI,GAAA,CAAI,UAAU,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,eAAA,CAAgB,IAAI,CAAC,CAAA;AAAA,MACjF;AAAA,MAEQ,4BAA4B,KAAA,EAA6C;AAC/E,QAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CACnB,GAAA,CAAI,CAAC,IAAA,KAAA,CAAU,IAAA,CAAK,mBAAmB,EAAA,EAAI,IAAA,EAAM,CAAA,CACjD,MAAA,CAAO,OAAO,CAAA,CACd,GAAA,CAAI,CAAC,KAAA,KAAU,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAC,CAAA;AAC7C,QAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAI,GAAA,CAAI,OAAO,CAAC,CAAA;AAAA,MACpC;AAAA,MAEQ,4BAA4B,IAAA,EAA0B;AAC5D,QAAA,MAAM,WAAqB,EAAC;AAC5B,QAAA,KAAA,MAAW,KAAA,IAAS,KAAK,MAAA,EAAQ;AAC/B,UAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAC9B,YAAA,MAAM,IAAA,GAAA,CAAQ,IAAA,CAAK,IAAA,IAAQ,EAAA,EAAI,WAAA,EAAY;AAC3C,YAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,IAAQ,EAAC;AAC3B,YAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,OAAO,KAAK,CAAC,IAAA,CAAK,QAAA,CAAS,UAAU,CAAA,IAAK,CAAC,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,EAAG;AACnF,cAAA;AAAA,YACF;AACA,YAAA,MAAM,OAAA,GAAU,OAAO,IAAA,CAAK,OAAA,KAAY,WAAW,IAAA,CAAK,OAAA,CAAQ,MAAK,GAAI,EAAA;AACzE,YAAA,IAAI,OAAA,EAAS;AACX,cAAA,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAC,CAAA;AAAA,YAC7C;AAAA,UACF;AAAA,QACF;AACA,QAAA,OAAO,KAAA,CAAM,KAAK,IAAI,GAAA,CAAI,QAAQ,CAAC,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAAA,MACjD;AAAA,MAEQ,gBAAgB,KAAA,EAAuB;AAC7C,QAAA,MAAM,UAAU,KAAA,CAAM,OAAA,CAAQ,MAAA,EAAQ,GAAG,EAAE,IAAA,EAAK;AAChD,QAAA,IAAI,OAAA,CAAQ,UAAU,GAAA,EAAK;AACzB,UAAA,OAAO,OAAA;AAAA,QACT;AACA,QAAA,OAAO,CAAA,EAAG,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,GAAA,CAAA;AAAA,MACjC;AAAA,MAEQ,kBAAkB,QAAA,EAA0B;AAClD,QAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA;AACjC,QAAA,MAAM,QAAA,GAAW,KAAA,CAAM,SAAA,CAAU,CAAC,IAAA,KAAS,+BAA+B,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,CAAC,CAAA;AAC3F,QAAA,IAAI,WAAW,CAAA,EAAG;AAChB,UAAA,OAAO,QAAA;AAAA,QACT;AAEA,QAAA,IAAI,SAAS,KAAA,CAAM,MAAA;AACnB,QAAA,KAAA,IAAS,IAAI,QAAA,GAAW,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AAChD,UAAA,IAAI,SAAS,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,IAAK,EAAE,CAAA,EAAG;AACjC,YAAA,MAAA,GAAS,CAAA;AACT,YAAA;AAAA,UACF;AAAA,QACF;AAEA,QAAA,MAAM,MAAA,GAAS,CAAC,GAAG,KAAA,CAAM,MAAM,CAAA,EAAG,QAAQ,CAAA,EAAG,GAAG,MAAM,KAAA,CAAM,MAAM,CAAC,CAAA,CAAE,KAAK,IAAI,CAAA;AAC9E,QAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,SAAA,EAAW,MAAM,CAAA;AAAA,MACzC;AAAA,MAEQ,gBAAgB,QAAA,EAAyE;AAC/F,QAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA;AACjC,QAAA,MAAM,QAAA,uBAAe,GAAA,EAAoB;AACzC,QAAA,MAAM,WAAkE,EAAC;AAEzE,QAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,UAAA,MAAM,KAAA,GAAQ,uBAAA,CAAwB,IAAA,CAAK,IAAI,CAAA;AAC/C,UAAA,IAAI,CAAC,KAAA,EAAO;AACV,YAAA;AAAA,UACF;AACA,UAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,KAAM,QAAQ,CAAA,GAAI,CAAA;AACvC,UAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,CAAG,IAAA,EAAK;AAC5B,UAAA,IAAI,sBAAA,CAAuB,IAAA,CAAK,IAAI,CAAA,EAAG;AACrC,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,IAAA,GAAO,IAAA,CAAK,cAAA,CAAe,IAAI,CAAA;AACrC,UAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA,IAAK,CAAA;AACpC,UAAA,QAAA,CAAS,GAAA,CAAI,IAAA,EAAM,KAAA,GAAQ,CAAC,CAAA;AAC5B,UAAA,MAAM,SAAS,KAAA,KAAU,CAAA,GAAI,OAAO,CAAA,EAAG,IAAI,IAAI,KAAK,CAAA,CAAA;AACpD,UAAA,QAAA,CAAS,IAAA,CAAK,EAAE,KAAA,EAAO,IAAA,EAAM,QAAQ,CAAA;AAAA,QACvC;AAEA,QAAA,OAAO,QAAA;AAAA,MACT;AAAA,MAEQ,UAAU,QAAA,EAA2E;AAC3F,QAAA,OAAO,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,KAAY;AAC/B,UAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,KAAU,CAAA,GAAI,IAAA,GAAO,EAAA;AAC5C,UAAA,OAAO,GAAG,MAAM,CAAA,GAAA,EAAM,QAAQ,IAAI,CAAA,GAAA,EAAM,QAAQ,MAAM,CAAA,CAAA,CAAA;AAAA,QACxD,CAAC,CAAA;AAAA,MACH;AAAA,MAEQ,QAAQ,KAAA,EAAuB;AACrC,QAAA,OAAO,KAAA,CACJ,aAAY,CACZ,OAAA,CAAQ,iBAAiB,EAAE,CAAA,CAC3B,MAAK,CACL,OAAA,CAAQ,QAAQ,GAAG,CAAA,CACnB,QAAQ,KAAA,EAAO,GAAG,EAClB,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,IAAK,MAAA;AAAA,MACrB;AAAA,MAEQ,eAAe,KAAA,EAAuB;AAC5C,QAAA,OAAO,KAAA,CACJ,WAAA,EAAY,CACZ,OAAA,CAAQ,8BAA8B,EAAE,CAAA,CACxC,IAAA,EAAK,CACL,QAAQ,MAAA,EAAQ,GAAG,CAAA,CACnB,OAAA,CAAQ,OAAO,GAAG,CAAA;AAAA,MACvB;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AChPA,SAASI,SAAQ,CAAA,EAAmB;AAClC,EAAA,OAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAC,CAAA;AACnC;AAlEA,IAmDM,UAAA,CAAA,CACA,WAAA,CAAA,CACA,OAAA,CAAA,CAEAC,eAAAA,CAAAA,CAOAC,aAAAA,CAAAA,CAUO;AAxEb,IAAA,mBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,gCAAA,GAAA;AAmDA,IAAM,UAAA,GAAc,GAAA;AACpB,IAAM,WAAA,GAAc,IAAA;AACpB,IAAM,OAAA,GAAc,IAAA;AAEpB,IAAMD,eAAAA,GAAiB,GAAA;AAOvB,IAAMC,aAAAA,GAAe,+BAAA;AAUd,IAAM,gBAAN,MAAoB;AAAA;AAAA;AAAA;AAAA,MAIzB,QAAA,CAAS,MAAgB,IAAA,EAAsC;AAC7D,QAAA,MAAM,SAA+B,EAAC;AAEtC,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,CAAc,IAAA,EAAM,MAAM,MAAM,CAAA;AACtD,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,cAAA,CAAe,IAAA,EAAM,MAAM,CAAA;AAClD,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,UAAA,CAAW,IAAA,EAAM,MAAM,CAAA;AAE1C,QAAA,MAAM,KAAA,GAAQF,QAAAA;AAAA,UACZ,QAAA,CAAS,QAAA,GACT,SAAA,CAAU,QAAA,GACV,KAAA,CAAM;AAAA,SACR;AACA,QAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,CAAC,GAAA,EAAK,KAAA,KAAU,GAAA,GAAM,KAAA,CAAM,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAA;AACpF,QAAA,MAAM,YAAA,GAAe,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,CAAC,GAAA,EAAK,OAAA,KAAY,GAAA,GAAM,OAAA,CAAQ,OAAA,CAAQ,MAAA,EAAQ,CAAC,CAAA;AAC3F,QAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,GAAA,CAAI,aAAA,EAAe,YAAY,CAAA;AAC5D,QAAA,MAAM,aAAA,GAAgB,IAAI,GAAA,CAAI,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,KAAY,OAAA,CAAQ,WAAW,CAAC,CAAA,CAAE,IAAA;AACnF,QAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,GAAIA,SAAQ,aAAA,GAAgB,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,GAAI,CAAA;AAC7F,QAAA,MAAM,eAAe,aAAA,GAAgB,CAAA,GAAIA,QAAAA,CAAQ,eAAA,GAAkB,aAAa,CAAA,GAAI,CAAA;AAEpF,QAAA,MAAM,YAAY,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,OAAO,CAAA;AAC3D,QAAA,MAAM,MAAA,GAAS,KAAA,IAASC,eAAAA,IAAkB,CAAC,SAAA;AAE3C,QAAA,OAAO;AAAA,UACL,MAAA;AAAA,UACA,KAAA;AAAA,UACA,OAAA,EAAS;AAAA,YACP,aAAA;AAAA,YACA,eAAA;AAAA,YACA,kBAAA,EAAoB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,gBAAgB,eAAe,CAAA;AAAA,YAC/D,aAAA;AAAA,YACA,YAAA;AAAA,YACA,SAAA,EAAW;AAAA,WACb;AAAA,UACA,MAAA,EAAQ,EAAE,QAAA,EAAU,SAAA,EAAW,KAAA,EAAM;AAAA,UACrC;AAAA,SACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,gBAAA,CAAiB,UAAkB,IAAA,EAAsC;AACvE,QAAA,MAAM,SAA+B,EAAC;AACtC,QAAA,MAAM,IAAA,GAAA,CAAQ,QAAA,IAAY,EAAA,EAAI,IAAA,EAAK;AAEnC,QAAA,IAAI,CAAC,IAAA,EAAM;AACT,UAAA,MAAA,CAAO,IAAA,CAAK,EAAE,SAAA,EAAW,UAAA,EAAY,UAAU,OAAA,EAAS,OAAA,EAAS,kBAAkB,CAAA;AACnF,UAAA,MAAM,OAAwB,EAAE,GAAA,EAAK,GAAG,QAAA,EAAU,CAAA,EAAG,SAAS,OAAA,EAAQ;AACtE,UAAA,OAAO;AAAA,YACL,MAAA,EAAQ,KAAA;AAAA,YACR,KAAA,EAAO,CAAA;AAAA,YACP,OAAA,EAAS;AAAA,cACP,aAAA,EAAe,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAA;AAAA,cACrE,eAAA,EAAiB,CAAA;AAAA,cACjB,kBAAA,EAAoB,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAA;AAAA,cAC1E,aAAA,EAAe,CAAA;AAAA,cACf,YAAA,EAAc,CAAA;AAAA,cACd,SAAA,EAAW;AAAA,aACb;AAAA,YACA,QAAQ,EAAE,QAAA,EAAU,MAAM,SAAA,EAAW,IAAA,EAAM,OAAO,IAAA,EAAK;AAAA,YACvD;AAAA,WACF;AAAA,QACF;AAGA,QAAA,MAAM,gBAAgB,IAAA,CAAK,KAAA,CAAM,yBAAyB,CAAA,IAAK,EAAC,EAAG,MAAA;AACnE,QAAA,MAAM,eAAe,IAAA,CAAK,KAAA,CAAM,wBAAwB,CAAA,IAAK,EAAC,EAAG,MAAA;AACjE,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,YAAA,EAAc,WAAW,CAAA;AAGpD,QAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAA;AAE5E,QAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAClC,QAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AACjC,QAAA,MAAM,QAAA,GAAW,uBAAA;AACjB,QAAA,IAAI,KAAA;AACJ,QAAA,OAAA,CAAQ,KAAA,GAAQ,QAAA,CAAS,IAAA,CAAK,IAAI,OAAO,IAAA,EAAM;AAC7C,UAAA,MAAM,GAAA,GAAA,CAAO,KAAA,CAAM,CAAC,CAAA,IAAK,IAAI,IAAA,EAAK;AAClC,UAAA,IAAI,CAAC,GAAA,EAAK;AAAC,YAAA;AAAA,UAAS;AACpB,UAAA,IAAI,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,EAAG;AACrB,YAAA,MAAM,CAAC,OAAA,EAAS,MAAM,CAAA,GAAI,GAAA,CAAI,MAAM,GAAG,CAAA;AACvC,YAAA,IAAI,OAAA,EAAS;AAAC,cAAA,SAAA,CAAU,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAM,CAAA;AAAA,YAAE;AAC5C,YAAA,IAAI,MAAA,EAAQ;AAAC,cAAA,QAAA,CAAS,GAAA,CAAI,GAAG,OAAA,EAAS,IAAA,EAAM,CAAA,CAAA,EAAI,MAAA,CAAO,IAAA,EAAM,CAAA,CAAE,CAAA;AAAA,YAAE;AAAA,UACnE,CAAA,MAAO;AACL,YAAA,SAAA,CAAU,IAAI,GAAG,CAAA;AAAA,UACnB;AAAA,QACF;AAEA,QAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,GAAID,QAAAA,CAAQ,SAAA,CAAU,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,GAAI,CAAA;AAC9F,QAAA,MAAM,kBAAkB,aAAA,GAAgB,CAAA,GAAIA,SAAQ,QAAA,CAAS,IAAA,GAAO,aAAa,CAAA,GAAI,CAAA;AACrF,QAAA,MAAM,eAAe,aAAA,GAAgB,CAAA,GAAIA,QAAAA,CAAQ,SAAA,GAAY,aAAa,CAAA,GAAI,CAAA;AAE9E,QAAA,MAAM,WAAWA,QAAAA,CAAS,YAAA,GAAe,MAAQ,eAAA,GAAkB,IAAA,GAAS,gBAAgB,IAAK,CAAA;AACjG,QAAA,MAAM,QAAA,GAA4B;AAAA,UAChC,GAAA,EAAK,QAAA;AAAA,UACL,UAAU,QAAA,GAAW,UAAA;AAAA,UACrB,OAAA,EAAS,CAAA,EAAG,SAAS,CAAA,uBAAA,EAA0B,SAAS,IAAI,CAAA,CAAA,EAAI,aAAa,CAAA,SAAA,EAAY,SAAA,CAAU,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,OAAO,MAAM,CAAA;AAAA,SAC/H;AAEA,QAAA,IAAI,cAAc,CAAA,EAAG;AACnB,UAAA,MAAA,CAAO,IAAA,CAAK,EAAE,SAAA,EAAW,UAAA,EAAY,UAAU,OAAA,EAAS,OAAA,EAAS,yCAAyC,CAAA;AAAA,QAC5G,CAAA,MAAA,IAAW,kBAAkB,GAAA,EAAK;AAChC,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,SAAA,EAAW,UAAA;AAAA,YACX,QAAA,EAAU,OAAA;AAAA,YACV,OAAA,EAAS,CAAA,iCAAA,EAAoC,QAAA,CAAS,IAAI,IAAI,aAAa,CAAA,uBAAA;AAAA,WAC5E,CAAA;AAAA,QACH,CAAA,MAAA,IAAW,WAAW,GAAA,EAAK;AACzB,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,SAAA,EAAW,UAAA;AAAA,YACX,QAAA,EAAU,SAAA;AAAA,YACV,OAAA,EAAS,wBAAwB,QAAA,CAAS,IAAI,IAAI,aAAa,CAAA,QAAA,EAAW,SAAS,CAAA,CAAA,EAAI,aAAa,CAAA,YAAA;AAAA,WACrG,CAAA;AAAA,QACH;AAGA,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,iBAAiB,KAAK,EAAC;AACrD,QAAA,MAAM,kBAAA,GAAqB,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,CAAQ,YAAA,EAAc,EAAE,CAAA,CAAE,IAAA,EAAK,CAAE,SAAS,CAAC,CAAA;AACjG,QAAA,MAAM,SAAA,GAAY,WAAW,MAAA,GAAS,CAAA,GAAIA,SAAQ,kBAAA,CAAmB,MAAA,GAAS,UAAA,CAAW,MAAM,CAAA,GAAI,CAAA;AACnG,QAAA,MAAM,SAAA,GAA6B;AAAA,UACjC,GAAA,EAAK,SAAA;AAAA,UACL,UAAU,SAAA,GAAY,WAAA;AAAA,UACtB,SAAS,CAAA,EAAG,kBAAA,CAAmB,MAAM,CAAA,CAAA,EAAI,WAAW,MAAM,CAAA,sBAAA;AAAA,SAC5D;AAEA,QAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,UAAA,MAAA,CAAO,IAAA,CAAK,EAAE,SAAA,EAAW,WAAA,EAAa,UAAU,OAAA,EAAS,OAAA,EAAS,4BAA4B,CAAA;AAAA,QAChG;AAGA,QAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,0BAA0B,KAAK,EAAC;AAC/D,QAAA,MAAM,UAAA,GAAa,WAAA,CAAY,MAAA,CAAO,CAAC,CAAA,KAAM;AAC3C,UAAA,MAAMH,MAAAA,GAAO,EAAE,OAAA,CAAQ,mBAAA,EAAqB,EAAE,CAAA,CAAE,OAAA,CAAQ,MAAM,EAAE,CAAA;AAChE,UAAA,OAAOK,aAAAA,CAAa,KAAKL,MAAI,CAAA;AAAA,QAC/B,CAAC,CAAA;AACD,QAAA,MAAM,SAAA,GAAY,YAAY,MAAA,GAAS,CAAA,GAAIG,SAAQ,UAAA,CAAW,MAAA,GAAS,WAAA,CAAY,MAAM,CAAA,GAAI,CAAA;AAC7F,QAAA,MAAM,UAAA,GAA8B;AAAA,UAClC,GAAA,EAAK,SAAA;AAAA,UACL,UAAU,SAAA,GAAY,OAAA;AAAA,UACtB,SAAS,CAAA,EAAG,UAAA,CAAW,MAAM,CAAA,CAAA,EAAI,YAAY,MAAM,CAAA,sBAAA;AAAA,SACrD;AAEA,QAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC5B,UAAA,MAAA,CAAO,IAAA,CAAK,EAAE,SAAA,EAAW,OAAA,EAAS,UAAU,OAAA,EAAS,OAAA,EAAS,6BAA6B,CAAA;AAAA,QAC7F;AAEA,QAAA,MAAM,QAAQA,QAAAA,CAAQ,QAAA,CAAS,WAAW,SAAA,CAAU,QAAA,GAAW,WAAW,QAAQ,CAAA;AAClF,QAAA,MAAM,YAAY,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,OAAO,CAAA;AAE3D,QAAA,MAAM,eAAA,GAAkB,KAAK,GAAA,CAAI,aAAA,EAAe,KAAK,GAAA,CAAI,QAAA,CAAS,IAAA,EAAM,SAAS,CAAC,CAAA;AAClF,QAAA,OAAO;AAAA,UACL,MAAA,EAAQ,KAAA,IAASC,eAAAA,IAAkB,CAAC,SAAA;AAAA,UACpC,KAAA;AAAA,UACA,OAAA,EAAS;AAAA,YACP,aAAA;AAAA,YACA,eAAA;AAAA,YACA,kBAAA,EAAoB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,gBAAgB,eAAe,CAAA;AAAA,YAC/D,aAAA;AAAA,YACA,YAAA,EAAc,eAAA;AAAA,YACd;AAAA,WACF;AAAA,UACA,MAAA,EAAQ,EAAE,QAAA,EAAU,SAAA,EAAW,OAAO,UAAA,EAAW;AAAA,UACjD;AAAA,SACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAMQ,aAAA,CAAc,IAAA,EAAgB,IAAA,EAAgB,MAAA,EAA+C;AACnG,QAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAA;AAC5E,QAAA,MAAM,gBAAA,GAAmB,KAAK,QAAA,CAAS,MAAA;AACvC,QAAA,MAAM,YAAA,GAAe,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,OAAA,CAAQ,MAAA,EAAQ,CAAC,CAAA;AAE/E,QAAA,IAAI,kBAAkB,CAAA,EAAG;AACvB,UAAA,OAAO,EAAE,GAAA,EAAK,CAAA,EAAG,QAAA,EAAU,UAAA,EAAY,SAAS,mBAAA,EAAoB;AAAA,QACtE;AAGA,QAAA,MAAM,aAAA,GAAgB,IAAI,GAAA,CAAI,IAAA,CAAK,QAAA,CAAS,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,CAAC,CAAA;AACrE,QAAA,MAAM,WAAA,GAAc,KAAK,MAAA,CAAO,MAAA;AAChC,QAAA,MAAM,aAAA,GAAgB,cAAc,IAAA,GAAO,WAAA;AAE3C,QAAA,MAAM,YAAA,GAAeD,QAAAA,CAAQ,YAAA,GAAe,aAAa,CAAA;AACzD,QAAA,MAAM,GAAA,GAAMA,QAAAA,CAAS,aAAA,GAAgB,GAAA,GAAQ,eAAe,GAAI,CAAA;AAEhE,QAAA,IAAI,qBAAqB,CAAA,EAAG;AAC1B,UAAA,MAAA,CAAO,IAAA,CAAK,EAAE,SAAA,EAAW,UAAA,EAAY,UAAU,OAAA,EAAS,OAAA,EAAS,yBAAyB,CAAA;AAAA,QAC5F,CAAA,MAAA,IAAW,eAAe,GAAA,EAAK;AAC7B,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,SAAA,EAAW,UAAA;AAAA,YACX,QAAA,EAAU,OAAA;AAAA,YACV,OAAA,EAAS,CAAA,iCAAA,EAAoC,YAAY,CAAA,CAAA,EAAI,aAAa,CAAA,mBAAA;AAAA,WAC3E,CAAA;AAAA,QACH,CAAA,MAAA,IAAW,gBAAgB,GAAA,EAAK;AAC9B,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,SAAA,EAAW,UAAA;AAAA,YACX,QAAA,EAAU,SAAA;AAAA,YACV,OAAA,EAAS,CAAA,KAAA,EAAQ,aAAA,CAAc,IAAI,IAAI,WAAW,CAAA,6BAAA;AAAA,WACnD,CAAA;AAAA,QACH;AAEA,QAAA,OAAO;AAAA,UACL,GAAA;AAAA,UACA,UAAU,GAAA,GAAM,UAAA;AAAA,UAChB,OAAA,EAAS,GAAG,aAAA,CAAc,IAAI,IAAI,WAAW,CAAA,SAAA,EAAY,YAAY,CAAA,CAAA,EAAI,aAAa,CAAA,mBAAA;AAAA,SACxF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAMQ,cAAA,CAAe,MAAgB,MAAA,EAA+C;AACpF,QAAA,MAAM,aAAa,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA;AACzD,QAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,UAAA,MAAA,CAAO,IAAA,CAAK,EAAE,SAAA,EAAW,WAAA,EAAa,UAAU,OAAA,EAAS,OAAA,EAAS,6BAA6B,CAAA;AAC/F,UAAA,OAAO,EAAE,GAAA,EAAK,CAAA,EAAG,QAAA,EAAU,CAAA,EAAG,SAAS,WAAA,EAAY;AAAA,QACrD;AAEA,QAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,QAAA,KAAA,MAAW,UAAU,UAAA,EAAY;AAC/B,UAAA,IAAI,MAAA,CAAO,MAAA,CAAO,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA,IAAK,MAAA,CAAO,KAAA,CAAM,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA,EAAG;AACrE,YAAA,aAAA,EAAA;AAAA,UACF;AAAA,QACF;AAEA,QAAA,MAAM,GAAA,GAAMA,QAAAA,CAAQ,aAAA,GAAgB,UAAA,CAAW,MAAM,CAAA;AAErD,QAAA,IAAI,kBAAkB,CAAA,EAAG;AACvB,UAAA,MAAA,CAAO,IAAA,CAAK,EAAE,SAAA,EAAW,WAAA,EAAa,UAAU,OAAA,EAAS,OAAA,EAAS,+CAA+C,CAAA;AAAA,QACnH,CAAA,MAAA,IAAW,MAAM,GAAA,EAAK;AACpB,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,SAAA,EAAW,WAAA;AAAA,YACX,QAAA,EAAU,SAAA;AAAA,YACV,OAAA,EAAS,CAAA,KAAA,EAAQ,aAAa,CAAA,CAAA,EAAI,WAAW,MAAM,CAAA,0CAAA;AAAA,WACpD,CAAA;AAAA,QACH;AAEA,QAAA,OAAO;AAAA,UACL,GAAA;AAAA,UACA,UAAU,GAAA,GAAM,WAAA;AAAA,UAChB,OAAA,EAAS,CAAA,EAAG,aAAa,CAAA,CAAA,EAAI,WAAW,MAAM,CAAA,eAAA;AAAA,SAChD;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAMQ,UAAA,CAAW,MAAgB,MAAA,EAA+C;AAChF,QAAA,MAAM,aAAa,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA;AACzD,QAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,UAAA,OAAO,EAAE,GAAA,EAAK,CAAA,EAAG,QAAA,EAAU,CAAA,EAAG,SAAS,WAAA,EAAY;AAAA,QACrD;AAEA,QAAA,IAAI,UAAA,GAAa,CAAA;AACjB,QAAA,KAAA,MAAW,UAAU,UAAA,EAAY;AAC/B,UAAA,IAAIE,aAAAA,CAAa,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,EAAG;AAClC,YAAA,UAAA,EAAA;AAAA,UACF;AAAA,QACF;AAEA,QAAA,MAAM,GAAA,GAAMF,QAAAA,CAAQ,UAAA,GAAa,UAAA,CAAW,MAAM,CAAA;AAElD,QAAA,IAAI,eAAe,CAAA,EAAG;AACpB,UAAA,MAAA,CAAO,IAAA,CAAK,EAAE,SAAA,EAAW,OAAA,EAAS,UAAU,OAAA,EAAS,OAAA,EAAS,0CAA0C,CAAA;AAAA,QAC1G;AAEA,QAAA,OAAO;AAAA,UACL,GAAA;AAAA,UACA,UAAU,GAAA,GAAM,OAAA;AAAA,UAChB,OAAA,EAAS,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,WAAW,MAAM,CAAA,iBAAA;AAAA,SAC7C;AAAA,MACF;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AChWA,IA6Ba;AA7Bb,IAAA,iBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,2BAAA,GAAA;AA6BO,IAAM,cAAN,MAAkB;AAAA,MACN,KAAA,uBAAY,GAAA,EAAsB;AAAA,MAClC,aAAA,uBAAoB,GAAA,EAA0B;AAAA,MAC9C,OAAA;AAAA,MAEjB,WAAA,CAAY,OAAA,GAA8B,EAAC,EAAG;AAC5C,QAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,MACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,SAAS,IAAA,EAAsB;AAC7B,QAAA,IAAI,IAAA,CAAK,OAAA,IAAW,CAAC,IAAA,CAAK,SAAQ,EAAG;AACnC,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG;AAC3B,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,UAAA,EAAa,IAAA,CAAK,EAAE,CAAA,uBAAA,CAAyB,CAAA;AAAA,QAC/D;AAEA,QAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,IAAI,CAAA;AAE5B,QAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,KAAA,EAAO;AAC7B,UAAA,MAAM,SAAA,GAAY,IAAA,CAAK,UAAA,CAAW,QAAA,CAAS,IAAA;AAC3C,UAAA,MAAM,aAAA,GAAgB,CAAA,EAAG,IAAA,CAAK,SAAS,IAAI,SAAS,CAAA,CAAA;AAEpD,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,SAAS,CAAA;AAEjD,UAAA,IAAI,QAAA,EAAU;AACZ,YAAA,IAAA,CAAK,eAAA,CAAgB,IAAA,EAAM,IAAA,EAAM,SAAA,EAAW,eAAe,QAAQ,CAAA;AAAA,UACrE,CAAA,MAAO;AAEL,YAAA,IAAA,CAAK,aAAA,CAAc,IAAI,SAAA,EAAW,IAAA,CAAK,eAAe,IAAA,EAAM,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,UAC9E;AAAA,QACF;AAAA,MACF;AAAA,MAEQ,eAAA,CACN,IAAA,EACA,IAAA,EACA,SAAA,EACA,eACA,QAAA,EACM;AACN,QAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,SAAS,MAAM,CAAA;AAGnD,QAAA,MAAM,eAAA,GACJ,IAAA,CAAK,cAAA,KAAmB,OAAA,IAAW,aAAa,cAAA,KAAmB,OAAA,GAC/D,OAAA,GACA,IAAA,CAAK,cAAA,KAAmB,kBAAA,IAAsB,YAAA,CAAa,cAAA,KAAmB,qBAC5E,kBAAA,GACA,UAAA;AAER,QAAA,QAAQ,eAAA;AAAiB,UACvB,KAAK,OAAA;AACH,YAAA,MAAM,IAAI,KAAA;AAAA,cACR,wBAAwB,SAAS,CAAA,kBAAA,EAAqB,SAAS,MAAM,CAAA,YAAA,EACxD,KAAK,EAAE,CAAA,mCAAA;AAAA,aACtB;AAAA,UAEF,KAAK,kBAAA,EAAoB;AAEvB,YAAA,IAAI,QAAA,CAAS,kBAAkB,SAAA,EAAW;AACxC,cAAA,IAAA,CAAK,aAAA,CAAc,OAAO,SAAS,CAAA;AACnC,cAAA,MAAM,iBAAA,GAAoB,CAAA,EAAG,QAAA,CAAS,SAAS,IAAI,SAAS,CAAA,CAAA;AAC5D,cAAA,IAAA,CAAK,aAAA,CAAc,GAAA;AAAA,gBACjB,iBAAA;AAAA,gBACA,IAAA,CAAK,eAAe,YAAA,EAAc,IAAA,CAAK,eAAe,YAAA,EAAc,SAAS,GAAI,iBAAiB;AAAA,eACpG;AAAA,YACF;AAEA,YAAA,IAAA,CAAK,aAAA,CAAc,IAAI,aAAA,EAAe,IAAA,CAAK,eAAe,IAAA,EAAM,IAAA,EAAM,aAAa,CAAC,CAAA;AACpF,YAAA;AAAA,UACF;AAAA,UAEA,KAAK,UAAA,EAAY;AAEf,YAAA,MAAM,uBAAuB,IAAA,CAAK,KAAA,CAAM,IAAI,QAAA,CAAS,MAAM,GAAG,QAAA,IAAY,CAAA;AAC1E,YAAA,IAAI,IAAA,CAAK,WAAW,oBAAA,EAAsB;AACxC,cAAA,IAAA,CAAK,aAAA,CAAc,IAAI,SAAA,EAAW,IAAA,CAAK,eAAe,IAAA,EAAM,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,YAC9E;AAEA,YAAA;AAAA,UACF;AAAA;AACF,MACF;AAAA,MAEQ,cAAA,CAAe,MAAgB,SAAA,EAA2C;AAChF,QAAA,OAAO,IAAA,CAAK,MAAM,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,UAAA,CAAW,QAAA,CAAS,IAAA,KAAS,SAAS,CAAA;AAAA,MACxE;AAAA,MAEQ,cAAA,CAAe,IAAA,EAAgB,IAAA,EAAkB,aAAA,EAAqC;AAC5F,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,UAAA,CAAW,QAAA,CAAS,IAAA;AAG3C,QAAA,MAAM,UAAA,GAA6B,aAAA,KAAkB,SAAA,GACjD,IAAA,CAAK,UAAA,GACL;AAAA,UACE,GAAG,IAAA,CAAK,UAAA;AAAA,UACR,QAAA,EAAU;AAAA,YACR,GAAG,KAAK,UAAA,CAAW,QAAA;AAAA,YACnB,IAAA,EAAM;AAAA;AACR,SACF;AAEJ,QAAA,OAAO;AAAA,UACL,aAAA;AAAA,UACA,SAAA;AAAA,UACA,QAAQ,IAAA,CAAK,EAAA;AAAA,UACb,WAAW,IAAA,CAAK,SAAA;AAAA,UAChB,UAAA;AAAA,UACA,QAAA,EAAU,KAAK,QAAA,IAAY,KAAA;AAAA,UAC3B,eAAA,EAAiB,KAAK,eAAA,IAAmB,KAAA;AAAA,UACzC,YAAY,IAAA,CAAK,UAAA;AAAA,UACjB,OAAA,EAAS,CAAC,KAAA,KAAU,IAAA,CAAK,QAAQ,KAAK;AAAA,SACxC;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,eAAe,MAAA,EAAuC;AACpD,QAAA,OAAO,IAAA,CAAK,SAAS,MAAM,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,EAAE,UAAU,CAAA;AAAA,MACtD;AAAA;AAAA;AAAA;AAAA,MAKA,SAAS,MAAA,EAAqC;AAC5C,QAAA,IAAI,QAAQ,CAAC,GAAG,IAAA,CAAK,aAAA,CAAc,QAAQ,CAAA;AAE3C,QAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,UAAA,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,QAAQ,CAAA;AAAA,QACxC;AACA,QAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,UAAA,KAAA,GAAQ,MAAM,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,UAAA,KAAe,OAAO,UAAU,CAAA;AAAA,QAChE;AACA,QAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,UAAA,KAAA,GAAQ,MAAM,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,SAAA,KAAc,OAAO,SAAS,CAAA;AAAA,QAC9D;AAEA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,QAAQ,IAAA,EAAwC;AAC9C,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,IAAI,CAAA;AAAA,MACpC;AAAA;AAAA;AAAA;AAAA,MAKA,YAAA,GAAyB;AACvB,QAAA,OAAO,CAAC,GAAG,IAAA,CAAK,cAAc,IAAA,EAAM,EAAE,IAAA,EAAK;AAAA,MAC7C;AAAA;AAAA;AAAA;AAAA,MAKA,QAAQ,IAAA,EAAuB;AAC7B,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,IAAI,CAAA;AAAA,MACpC;AAAA;AAAA;AAAA;AAAA,MAKA,UAAA,GAAuB;AACrB,QAAA,OAAO,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAAA,MAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAWA,MAAM,OAAA,CAAQ,IAAA,EAAc,KAAA,EAAqD;AAC/E,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,IAAI,CAAA;AACxC,QAAA,IAAI,CAAC,IAAA,EAAM;AACT,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,KAAA;AAAA,YACT,KAAA,EAAO,SAAS,IAAI,CAAA,wBAAA,EAA2B,KAAK,YAAA,EAAa,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,WAC/E;AAAA,QACF;AAEA,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,KAAK,MAAM,CAAA;AACvC,QAAA,IAAI,CAAC,IAAA,EAAM;AACT,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,KAAA;AAAA,YACT,KAAA,EAAO,CAAA,MAAA,EAAS,IAAA,CAAK,MAAM,yBAAyB,IAAI,CAAA,CAAA;AAAA,WAC1D;AAAA,QACF;AAGA,QAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,gBAAA,CAAiB,IAAA,EAAM,MAAM,KAAK,CAAA;AAC/D,QAAA,IAAI,eAAA,EAAiB;AACnB,UAAA,OAAO,eAAA;AAAA,QACT;AAGA,QAAA,IAAI,IAAA,CAAK,aAAa,UAAA,EAAY;AAChC,UAAA,IAAA,CAAK,OAAA,CAAQ,OAAA,GAAU,IAAA,EAAM,IAAA,CAAK,IAAI,KAAK,CAAA;AAAA,QAC7C;AAGA,QAAA,OAAO,IAAA,CAAK,QAAQ,KAAK,CAAA;AAAA,MAC3B;AAAA,MAEQ,gBAAA,CACN,IAAA,EACA,QAAA,EACA,KAAA,EACmB;AACnB,QAAA,MAAM,QAAQ,IAAA,CAAK,WAAA;AACnB,QAAA,IAAI,CAAC,KAAA,EAAO;AAAC,UAAA,OAAO,IAAA;AAAA,QAAK;AAGzB,QAAA,IAAI,KAAA,CAAM,cAAA,IAAkB,KAAA,CAAM,cAAA,CAAe,SAAS,CAAA,EAAG;AAC3D,UAAA,MAAM,UAAU,OAAO,KAAA,CAAM,OAAA,KAAY,QAAA,GAAW,MAAM,OAAA,GAAU,EAAA;AACpE,UAAA,KAAA,MAAW,MAAA,IAAU,MAAM,cAAA,EAAgB;AACzC,YAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,MAAM,CAAA,EAAG;AAC9B,cAAA,OAAO;AAAA,gBACL,OAAA,EAAS,KAAA;AAAA,gBACT,KAAA,EAAO,CAAA,4BAAA,EAA+B,MAAM,CAAA,uBAAA,EAA0B,KAAK,EAAE,CAAA,CAAA,CAAA;AAAA,gBAC7E,YAAA,EAAc;AAAA,kBACZ,IAAA,EAAM,mBAAA;AAAA,kBACN,OAAA,EAAS,YAAY,MAAM,CAAA,qBAAA,CAAA;AAAA,kBAC3B,SAAA,EAAW;AAAA;AACb,eACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAGA,QAAA,IAAI,KAAA,CAAM,YAAA,IAAgB,KAAA,CAAM,YAAA,CAAa,SAAS,CAAA,EAAG;AACvD,UAAA,MAAMH,SAAO,OAAO,KAAA,CAAM,IAAA,KAAS,QAAA,GAAW,MAAM,IAAA,GAAO,MAAA;AAC3D,UAAA,IAAIA,MAAAA,EAAM;AACR,YAAA,MAAM,OAAA,GAAU,MAAM,YAAA,CAAa,IAAA;AAAA,cAAK,CAAC,OAAA,KACvCA,MAAAA,CAAK,UAAA,CAAW,OAAO,KAAK,OAAA,KAAY;AAAA,aAC1C;AACA,YAAA,IAAI,CAAC,OAAA,EAAS;AACZ,cAAA,OAAO;AAAA,gBACL,OAAA,EAAS,KAAA;AAAA,gBACT,KAAA,EAAO,CAAA,yBAAA,EAA4BA,MAAI,CAAA,oCAAA,EAAuC,KAAK,EAAE,CAAA,CAAA,CAAA;AAAA,gBACrF,YAAA,EAAc;AAAA,kBACZ,IAAA,EAAM,aAAA;AAAA,kBACN,OAAA,EAAS,SAASA,MAAI,CAAA,uBAAA,CAAA;AAAA,kBACtB,SAAA,EAAW;AAAA;AACb,eACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAGA,QAAA,IAAI,KAAA,CAAM,mBAAmB,KAAA,EAAO;AAClC,UAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,QAAA,CAAS,MAAM,CAAA,IAAK,QAAA,CAAS,QAAA,CAAS,OAAO,CAAA,IAAK,QAAA,CAAS,QAAA,CAAS,SAAS,CAAA;AAC5G,UAAA,IAAI,aAAA,EAAe;AACjB,YAAA,OAAO;AAAA,cACL,OAAA,EAAS,KAAA;AAAA,cACT,KAAA,EAAO,CAAA,wDAAA,EAA2D,IAAA,CAAK,EAAE,CAAA,CAAA,CAAA;AAAA,cACzE,YAAA,EAAc;AAAA,gBACZ,IAAA,EAAM,gBAAA;AAAA,gBACN,OAAA,EAAS,+BAAA;AAAA,gBACT,SAAA,EAAW;AAAA;AACb,aACF;AAAA,UACF;AAAA,QACF;AAEA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,eAAe,YAAA,EAA8B;AAC3C,QAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,YAAY,CAAA;AACpC,QAAA,KAAA,MAAW,CAAC,IAAA,EAAM,IAAI,CAAA,IAAK,KAAK,aAAA,EAAe;AAC7C,UAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AAChC,YAAA,IAAA,CAAK,aAAA,CAAc,OAAO,IAAI,CAAA;AAAA,UAChC;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,MAAM,aAAA,GAA+B;AACnC,QAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,MAAA,EAAO,EAAG;AACtC,UAAA,IAAI,KAAK,UAAA,EAAY;AACnB,YAAA,MAAM,KAAK,UAAA,EAAW;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,UAAA,GAA4B;AAChC,QAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,MAAA,EAAO,EAAG;AACtC,UAAA,IAAI,KAAK,OAAA,EAAS;AAChB,YAAA,MAAM,KAAK,OAAA,EAAQ;AAAA,UACrB;AAAA,QACF;AAAA,MACF;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC3PO,SAAS,mBAAmB,QAAA,EAAwC;AACzE,EAAA,MAAM,WAAA,GAAc,SAAS,cAAA,EAAe;AAE5C,EAAA,MAAM,KAAA,GAAsB,WAAA,CAAY,GAAA,CAAI,CAAC,GAAA,KAAQ;AACnD,IAAA,MAAM,IAAA,GAAO,IAAI,QAAA,CAAS,IAAA;AAC1B,IAAA,OAAO;AAAA,MACL,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU,eAAA,CAAgB,GAAA,CAAI,IAAI,CAAA;AAAA,MAClC,eAAA,EAAiB,qBAAA,CAAsB,GAAA,CAAI,IAAI,CAAA;AAAA,MAC/C,UAAA,EAAY,iBAAA,CAAkB,IAAI,CAAA,IAAK,SAAA;AAAA,MACvC,SAAS,CAAC,KAAA,KAAmC,QAAA,CAAS,OAAA,CAAQ,MAAM,KAAK;AAAA,KAC3E;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,MAAA;AAAA,IACJ,SAAA,EAAW,MAAA;AAAA,IACX,OAAA,EAAS,OAAA;AAAA,IACT,QAAA,EAAU,GAAA;AAAA,IACV,cAAA,EAAgB,UAAA;AAAA,IAChB,KAAA;AAAA,IACA,YAAA,EAAc,CAAC,YAAA,EAAc,QAAA,EAAU,SAAS,QAAA,EAAU,aAAA,EAAe,cAAc,cAAc,CAAA;AAAA,IACrG,WAAA,EAAa;AAAA,MACX,cAAA,EAAgB,IAAA;AAAA,MAChB,UAAA,EAAY;AAAA;AACd,GACF;AACF;AAjIA,IAgCM,iBAuBA,qBAAA,EAaA,iBAAA;AApEN,IAAA,mBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,6BAAA,GAAA;AAgCA,IAAM,eAAA,uBAAsB,GAAA,CAAI;AAAA,MAC9B,SAAA;AAAA,MACA,SAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA,MACA,iBAAA;AAAA,MACA,YAAA;AAAA,MACA,YAAA;AAAA,MACA,mBAAA;AAAA,MACA,mBAAA;AAAA,MACA,gBAAA;AAAA,MACA,gBAAA;AAAA,MACA,gBAAA;AAAA,MACA,UAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACD,CAAA;AAOD,IAAM,qBAAA,uBAA4B,GAAA,CAAI;AAAA,MACpC,SAAA;AAAA,MACA,SAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA,MACA,iBAAA;AAAA,MACA,YAAA;AAAA,MACA,YAAA;AAAA,MACA,gBAAA;AAAA,MACA;AAAA,KACD,CAAA;AAGD,IAAM,iBAAA,GAA4C;AAAA,MAChD,OAAA,EAAS,YAAA;AAAA,MACT,QAAA,EAAU,YAAA;AAAA,MACV,QAAA,EAAU,YAAA;AAAA,MACV,UAAA,EAAY,YAAA;AAAA,MACZ,OAAA,EAAS,YAAA;AAAA,MACT,WAAA,EAAa,QAAA;AAAA,MACb,WAAA,EAAa,QAAA;AAAA,MACb,eAAA,EAAiB,QAAA;AAAA,MACjB,UAAA,EAAY,QAAA;AAAA,MACZ,UAAA,EAAY,OAAA;AAAA,MACZ,UAAA,EAAY,QAAA;AAAA,MACZ,iBAAA,EAAmB,QAAA;AAAA,MACnB,iBAAA,EAAmB,QAAA;AAAA,MACnB,cAAA,EAAgB,QAAA;AAAA,MAChB,cAAA,EAAgB,QAAA;AAAA,MAChB,iBAAA,EAAmB,QAAA;AAAA,MACnB,YAAA,EAAc,QAAA;AAAA,MACd,cAAA,EAAgB,QAAA;AAAA,MAChB,QAAA,EAAU,aAAA;AAAA,MACV,UAAA,EAAY,aAAA;AAAA,MACZ,MAAA,EAAQ,aAAA;AAAA,MACR,WAAA,EAAa,YAAA;AAAA,MACb,WAAA,EAAa,YAAA;AAAA,MACb,YAAA,EAAc,YAAA;AAAA,MACd,WAAA,EAAa,cAAA;AAAA,MACb,WAAA,EAAa,cAAA;AAAA,MACb,QAAA,EAAU,cAAA;AAAA,MACV,YAAA,EAAc;AAAA,KAChB;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC7EO,SAAS,oBAAA,GAAiC;AAC/C,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,SAAA;AAAA,IACJ,SAAA,EAAW,IAAA;AAAA,IACX,OAAA,EAAS,OAAA;AAAA,IACT,QAAA,EAAU,EAAA;AAAA,IACV,cAAA,EAAgB,kBAAA;AAAA,IAChB,OAAO,EAAC;AAAA,IACR,cAAc,EAAC;AAAA,IACf,WAAA,EAAa;AAAA,MACX,cAAA,EAAgB,IAAA;AAAA,MAChB,UAAA,EAAY;AAAA,KACd;AAAA,IAEA,OAAA,GAAU;AACR,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,GACF;AACF;AAtCA,IAAA,iBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,2BAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACcO,SAAS,wBAAwB,MAAA,EAAkC;AACxE,EAAA,MAAM,KAAA,GAAsB;AAAA;AAAA,IAE1B;AAAA,MACE,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,UAAA;AAAA,QACN,QAAA,EAAU;AAAA,UACR,IAAA,EAAM,aAAA;AAAA,UACN,WAAA,EACE,2OAAA;AAAA,UAGF,UAAA,EAAY;AAAA,YACV,IAAA,EAAM,QAAA;AAAA,YACN,UAAA,EAAY;AAAA,cACV,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,+CAAA,EAAgD;AAAA,cAC5F,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,8CAAA,EAA+C;AAAA,cACpF,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,CAAC,UAAA,EAAY,SAAA,EAAW,QAAQ,CAAA,EAAG,WAAA,EAAa,yCAAA,EAA0C;AAAA,cAC1H,aAAA,EAAe,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,+DAAA;AAAgE,aAChH;AAAA,YACA,QAAA,EAAU,CAAC,aAAA,EAAe,MAAM;AAAA;AAClC;AACF,OACF;AAAA,MACA,QAAA,EAAU,KAAA;AAAA,MACV,UAAA,EAAY,YAAA;AAAA,MACZ,OAAA,EAAS,OAAO,KAAA,KAAwD;AACtE,QAAA,MAAM,cAAc,KAAA,CAAM,WAAA;AAC1B,QAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AACnB,QAAA,MAAM,QAAA,GAAY,MAAM,MAAA,IAA6B,UAAA;AACrD,QAAA,MAAM,aAAA,GAAiB,MAAM,aAAA,IAAwC,EAAA;AACrE,QAAA,MAAM,cAAA,GAAiB,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,aAAA,GAAgB,GAAG,CAAC,CAAA;AAEnE,QAAA,IAAI;AACF,UAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,MAAA,CAAO,WAAA,EAAa;AAAA,YACjD,IAAA;AAAA,YACA,MAAA,EAAQ,QAAA;AAAA,YACR,aAAA,EAAe,gBAAA,CAAiB,QAAQ,CAAA,IAAK,EAAA;AAAA,YAC7C;AAAA,WACD,CAAA;AACD,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,IAAA;AAAA,YACT,MAAA,EAAQ,CAAA,gBAAA,EAAmB,SAAA,CAAU,EAAE;AAAA,aAAA,EAAkB,WAAW;AAAA,QAAA,EAAa,QAAQ;AAAA,QAAA,EAAa,UAAU,MAAM;;AAAA,iBAAA,EAAwB,SAAA,CAAU,EAAE,CAAA,6BAAA,EAAgC,SAAA,CAAU,EAAE,CAAA,WAAA;AAAA,WACxM;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,CAAA,QAAA,EAAW,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA,EAAG;AAAA,QACtG;AAAA,MACF;AAAA,KACF;AAAA;AAAA,IAGA;AAAA,MACE,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,UAAA;AAAA,QACN,QAAA,EAAU;AAAA,UACR,IAAA,EAAM,aAAA;AAAA,UACN,WAAA,EAAa,4EAAA;AAAA,UACb,UAAA,EAAY;AAAA,YACV,IAAA,EAAM,QAAA;AAAA,YACN,UAAA,EAAY;AAAA,cACV,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,wCAAA;AAAyC,aAClF;AAAA,YACA,UAAU;AAAC;AACb;AACF,OACF;AAAA,MACA,QAAA,EAAU,IAAA;AAAA,MACV,UAAA,EAAY,YAAA;AAAA,MACZ,OAAA,EAAS,OAAO,KAAA,KAAwD;AACtE,QAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,QAAA,MAAM,MAAA,GAAS,MAAA,CAAO,SAAA,CAAU,MAAM,CAAA;AACtC,QAAA,IAAI,WAAW,IAAA,EAAM;AACnB,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,CAAA,iBAAA,EAAoB,MAAM,CAAA,CAAA,CAAA,EAAI;AAAA,QAChE;AACA,QAAA,MAAM,QAAQ,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,GAAI,MAAA,GAAS,CAAC,MAAM,CAAA;AACtD,QAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,UAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,iBAAA,EAAkB;AAAA,QACpD;AACA,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,CAAA,CAAA,KAAK;AAC3B,UAAA,MAAM,IAAA,GAAO,CAAA,CAAE,MAAA,KAAW,WAAA,GAAc,QAAA,GAAM,CAAA,CAAE,MAAA,KAAW,QAAA,GAAW,QAAA,GAAM,CAAA,CAAE,MAAA,KAAW,SAAA,GAAY,QAAA,GAAM,cAAA;AAC3G,UAAA,IAAI,IAAA,GAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,EAAE,CAAA,EAAA,EAAK,CAAA,CAAE,WAAW,CAAA,EAAA,EAAK,CAAA,CAAE,MAAM,CAAA,CAAA,CAAA;AACzD,UAAA,IAAI,EAAE,MAAA,EAAQ;AAAE,YAAA,IAAA,IAAQ;AAAA,WAAA,EAAgB,CAAA,CAAE,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAAA,UAAI;AAClE,UAAA,IAAI,EAAE,KAAA,EAAO;AAAE,YAAA,IAAA,IAAQ;AAAA,UAAA,EAAe,EAAE,KAAK,CAAA,CAAA;AAAA,UAAI;AACjD,UAAA,OAAO,IAAA;AAAA,QACT,CAAC,CAAA;AACD,QAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,QAAQ,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,EAAE;AAAA,MACnD;AAAA,KACF;AAAA;AAAA,IAGA;AAAA,MACE,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,UAAA;AAAA,QACN,QAAA,EAAU;AAAA,UACR,IAAA,EAAM,cAAA;AAAA,UACN,WAAA,EAAa,2FAAA;AAAA,UACb,UAAA,EAAY;AAAA,YACV,IAAA,EAAM,QAAA;AAAA,YACN,UAAA,EAAY;AAAA,cACV,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,0BAAA;AAA2B,aACpE;AAAA,YACA,QAAA,EAAU,CAAC,QAAQ;AAAA;AACrB;AACF,OACF;AAAA,MACA,QAAA,EAAU,IAAA;AAAA,MACV,UAAA,EAAY,YAAA;AAAA,MACZ,OAAA,EAAS,OAAO,KAAA,KAAwD;AACtE,QAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,QAAA,IAAI;AACF,UAAA,MAAM,CAAA,GAAI,MAAM,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA;AACrC,UAAA,MAAM,MAAA,GAAS,CAAA,CAAE,OAAA,GAAU,wBAAA,GAA2B,QAAA;AACtD,UAAA,MAAM,KAAA,GAAQ;AAAA,YACZ,CAAA,KAAA,EAAQ,MAAM,CAAA,CAAA,EAAI,MAAM,YAAY,CAAA,CAAE,MAAM,KAAK,CAAA,CAAE,UAAU,WAAW,CAAA,CAAE,UAAA,CAAW,gBAAgB,CAAA,SAAA,EAAA,CAAa,EAAE,UAAA,GAAa,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA;AAAA,WACnJ;AACA,UAAA,IAAI,CAAA,CAAE,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG;AAAE,YAAA,KAAA,CAAM,IAAA,CAAK,CAAA,YAAA,EAAe,CAAA,CAAE,SAAA,CAAU,MAAM,CAAA,CAAE,CAAA;AAAA,UAAG;AAC/E,UAAA,IAAI,CAAA,CAAE,aAAA,CAAc,MAAA,GAAS,CAAA,EAAG;AAAE,YAAA,KAAA,CAAM,KAAK,CAAA,gBAAA,EAAmB,CAAA,CAAE,cAAc,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,UAAG;AAC/F,UAAA,IAAI,CAAA,CAAE,YAAA,CAAa,MAAA,GAAS,CAAA,EAAG;AAAE,YAAA,KAAA,CAAM,KAAK,CAAA,eAAA,EAAkB,CAAA,CAAE,aAAa,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,UAAG;AAC5F,UAAA,KAAA,CAAM,IAAA,CAAK,EAAA,EAAI,CAAA,CAAE,OAAO,CAAA;AACxB,UAAA,IAAI,EAAE,KAAA,EAAO;AAAE,YAAA,KAAA,CAAM,IAAA,CAAK,EAAA,EAAI,CAAA,OAAA,EAAU,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,UAAG;AACpD,UAAA,OAAO,EAAE,SAAS,CAAA,CAAE,OAAA,EAAS,QAAQ,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,EAAE;AAAA,QACxD,SAAS,KAAA,EAAO;AACd,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,CAAA,mBAAA,EAAsB,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA,EAAG;AAAA,QACjH;AAAA,MACF;AAAA;AACF,GACF;AAEA,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,aAAA;AAAA,IACJ,SAAA,EAAW,aAAA;AAAA,IACX,OAAA,EAAS,OAAA;AAAA,IACT,QAAA,EAAU,EAAA;AAAA,IACV,cAAA,EAAgB,MAAA;AAAA,IAChB,KAAA;AAAA,IACA,YAAA,EAAc,CAAC,YAAY,CAAA;AAAA,IAC3B,WAAA,EAAa,EAAE,cAAA,EAAgB,KAAA,EAAO,YAAY,KAAA;AAAM,GAC1D;AACF;AAxJA,IAYM,gBAAA;AAZN,IAAA,oBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,8BAAA,GAAA;AAYA,IAAM,mBAA2C,EAAE,QAAA,EAAU,IAAI,OAAA,EAAS,GAAA,EAAK,QAAQ,EAAA,EAAG;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACZ1F,IAAA,UAAA,GAAA,KAAA,CAAA;AAAA,EAAA,oBAAA,GAAA;AAAA,IAAA,iBAAA,EAAA;AACA,IAAA,mBAAA,EAAA;AACA,IAAA,iBAAA,EAAA;AACA,IAAA,oBAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACHA,IAAA,4BAAA,GAAA,EAAA;AAAA,QAAA,CAAA,4BAAA,EAAA;AAAA,EAAA,kBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AA0BA,SAAS,oBAAoB,MAAA,EAA0D;AACrF,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,MAAM,UAAoB,EAAC;AAG3B,EAAA,IAAI,OAAO,OAAA,EAAS;AAClB,IAAA,KAAA,IAAS,EAAA;AAAA,EACX,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,KAAK,4BAA4B,CAAA;AAAA,EAC3C;AAGA,EAAA,IAAI,OAAO,aAAA,CAAc,MAAA,GAAS,KAAK,MAAA,CAAO,YAAA,CAAa,SAAS,CAAA,EAAG;AACrE,IAAA,KAAA,IAAS,EAAA;AAAA,EACX,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,KAAK,8BAA8B,CAAA;AAAA,EAC7C;AAGA,EAAA,IAAI,MAAA,CAAO,cAAc,CAAA,EAAG;AAC1B,IAAA,KAAA,IAAS,EAAA;AAAA,EACX,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,KAAA,EAAQ,MAAA,CAAO,UAAU,CAAA,8CAAA,CAA2C,CAAA;AAAA,EACnF;AAGA,EAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,OAAA,CAAQ,SAAS,EAAA,EAAI;AAChD,IAAA,KAAA,IAAS,EAAA;AAAA,EACX,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,KAAK,iCAAiC,CAAA;AAAA,EAChD;AAGA,EAAA,IAAI,MAAA,CAAO,aAAa,GAAA,EAAM;AAC5B,IAAA,KAAA,IAAS,EAAA;AAAA,EACX;AAEA,EAAA,OAAO,EAAE,OAAO,OAAA,EAAQ;AAC1B;AAhEA,IAoBM,eACA,sBAAA,CAAA,CAgDO;AArEb,IAAA,yBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,mCAAA,GAAA;AAgBA,IAAA,UAAA,EAAA;AACA,IAAA,oBAAA,EAAA;AAGA,IAAM,aAAA,GAAgB,CAAA;AACtB,IAAM,sBAAA,GAAyB,EAAA;AAgDxB,IAAM,qBAAN,MAAgD;AAAA,MACrD,MAAM,OAAA,CACJ,IAAA,EACA,MAAA,EACA,YAAA,EACqB;AACrB,QAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,CAAA;AAC/C,QAAA,MAAM,eAAe,IAAA,GAAO,IAAA,CAAK,iBAAA,CAAkB,IAAA,EAAM,IAAI,CAAA,GAAI,IAAA;AAGjE,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAA,EAAQ,IAAA,EAAM,aAAa,CAAA;AAAA,QACzD;AAGA,QAAA,IAAI,SAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,YAAA,EAAc,QAAQ,YAAY,CAAA;AAGlE,QAAA,KAAA,IAAS,QAAA,GAAW,CAAA,EAAG,QAAA,GAAW,aAAA,EAAe,QAAA,EAAA,EAAY;AAC3D,UAAA,MAAM,IAAA,GAAO,oBAAoB,MAAM,CAAA;AACvC,UAAA,IAAI,IAAA,CAAK,SAAS,sBAAA,EAAwB;AACxC,YAAA;AAAA,UACF;AAGA,UAAA,MAAM,YAAA,GAAe,KAAK,iBAAA,CAAkB,IAAA,EAAM,QAAQ,IAAA,CAAK,OAAA,EAAS,WAAW,CAAC,CAAA;AACpF,UAAA,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,YAAA,EAAc,QAAQ,YAAY,CAAA;AAAA,QAChE;AAGA,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,MAAM,KAAK,gBAAA,CAAiB,MAAA,EAAQ,MAAM,MAAA,CAAO,OAAA,GAAU,cAAc,QAAQ,CAAA;AAAA,QACnF;AAEA,QAAA,OAAO,MAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,OAAA,CACZ,IAAA,EACA,MAAA,EACA,YAAA,EACqB;AAErB,QAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAO,GAAG,YAAW,GAAI,MAAA;AACvC,QAAA,MAAM,MAAA,GAAS,IAAI,QAAA,EAAS,CACzB,QAAA,CAAS,mBAAmB,YAAY,CAAC,CAAA,CACzC,YAAA,CAAa,UAAyB,CAAA;AAEzC,QAAA,OAAO,MAAA,CAAO,QAAQ,IAAI,CAAA;AAAA,MAC5B;AAAA;AAAA;AAAA;AAAA,MAKQ,iBAAA,CACN,YAAA,EACA,UAAA,EACA,WAAA,EACA,WAAA,EACQ;AACR,QAAA,MAAM,WAAA,GAAc,WAAW,OAAA,GAC3B,UAAA,CAAW,QAAQ,KAAA,CAAM,CAAA,EAAG,GAAI,CAAA,GAChC,wBAAA;AAEJ,QAAA,MAAM,aAAA,GAAgB,UAAA,CAAW,aAAA,CAAc,MAAA,GAAS,IACpD,CAAA,gBAAA,EAAmB,UAAA,CAAW,aAAA,CAAc,KAAA,CAAM,GAAG,EAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,GACnE,yBAAA;AAEJ,QAAA,OAAO;AAAA,UACL,eAAe,WAAW,CAAA,uDAAA,CAAA;AAAA,UAC1B,EAAA;AAAA,UACA,kBAAkB,YAAY,CAAA,CAAA;AAAA,UAC9B,EAAA;AAAA,UACA,8BAAA;AAAA,UACA,CAAA,WAAA,EAAc,WAAW,OAAO,CAAA,CAAA;AAAA,UAChC,CAAA,cAAA,EAAiB,WAAW,UAAU,CAAA,CAAA;AAAA,UACtC,KAAK,aAAa,CAAA,CAAA;AAAA,UAClB,cAAc,WAAW,CAAA,CAAA;AAAA,UACzB,EAAA;AAAA,UACA,uBAAA;AAAA,UACA,GAAG,WAAA,CAAY,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,EAAA,EAAK,CAAC,CAAA,CAAE,CAAA;AAAA,UAChC,EAAA;AAAA,UACA,kBAAA;AAAA,UACA,kEAAA;AAAA,UACA,wFAAA;AAAA,UACA;AAAA,SACF,CAAE,KAAK,IAAI,CAAA;AAAA,MACb;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,MAAc,iBAAiB,MAAA,EAA+C;AAC5E,QAAA,IAAI,CAAC,MAAA,CAAO,SAAA,IAAa,CAAC,OAAO,UAAA,EAAY;AAAE,UAAA,OAAO,IAAA;AAAA,QAAM;AAG5D,QAAA,IAAI;AACF,UAAA,MAAM,cAAA,GAAiB,IAAI,cAAA,CAAe,MAAA,CAAO,UAAU,CAAA;AAC3D,UAAA,MAAM,QAAA,GAAW,cAAA,CAAe,kBAAA,CAAmB,MAAA,CAAO,SAAS,CAAA;AACnE,UAAA,MAAM,GAAA,GAAM,MAAMD,QAAAA,CAAG,QAAA,CAAS,UAAU,OAAO,CAAA;AAC/C,UAAA,MAAM,IAAA,GAAiB,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AACrC,UAAA,IAAI,IAAA,CAAK,MAAA,KAAW,UAAA,IAAc,IAAA,CAAK,WAAW,OAAA,EAAS;AAAE,YAAA,OAAO,IAAA;AAAA,UAAM;AAC1E,UAAA,OAAO,IAAA;AAAA,QACT,CAAA,CAAA,MAAQ;AAAA,QAER;AAGA,QAAA,IAAI;AACF,UAAA,MAAM,EAAE,IAAA,EAAAO,MAAAA,EAAK,GAAI,MAAM,OAAO,MAAW,CAAA;AACzC,UAAA,MAAM,UAAA,GAAaA,OAAK,MAAA,CAAO,UAAA,EAAY,OAAO,QAAA,EAAU,UAAA,EAAY,MAAA,CAAO,SAAA,EAAW,SAAS,CAAA;AACnG,UAAA,MAAM,QAAA,GAAW,MAAMP,QAAAA,CAAG,QAAA,CAAS,YAAY,OAAO,CAAA;AACtD,UAAA,IAAI,QAAA,CAAS,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA,EAAG;AAC9B,YAAA,OAAO;AAAA,cACL,EAAA,EAAI,CAAA,KAAA,EAAQ,MAAA,CAAO,SAAS,CAAA,CAAA;AAAA,cAC5B,MAAM,MAAA,CAAO,SAAA;AAAA,cACb,MAAA,EAAQ,UAAA;AAAA,cACR,QAAA;AAAA,cACA,QAAQ,EAAC;AAAA,cACT,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,aACpC;AAAA,UACF;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAEA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,gBAAA,CACZ,MAAA,EACA,IAAA,EACA,MAAA,EACe;AACf,QAAA,IAAI,CAAC,MAAA,CAAO,SAAA,IAAa,CAAC,OAAO,UAAA,EAAY;AAAE,UAAA;AAAA,QAAQ;AACvD,QAAA,IAAI;AACF,UAAA,MAAM,cAAA,GAAiB,IAAI,cAAA,CAAe,MAAA,CAAO,UAAU,CAAA;AAC3D,UAAA,MAAM,QAAA,GAAW,cAAA,CAAe,kBAAA,CAAmB,MAAA,CAAO,SAAS,CAAA;AACnE,UAAA,MAAM,OAAA,GAAoB,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,4BAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY,EAAE;AACjF,UAAA,MAAMA,QAAAA,CAAG,UAAU,QAAA,EAAU,IAAA,CAAK,UAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,OAAO,CAAA;AAAA,QACxE,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA,MAMQ,iBAAA,CAAkB,MAAc,IAAA,EAAwB;AAC9D,QAAA,MAAM,cAAc,IAAA,CAAK,QAAA,GACrB,KAAK,QAAA,GACL,IAAA,CAAK,oBAAoB,IAAI,CAAA;AAEjC,QAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,kBAAA,CAAmB,IAAI,CAAA;AAIlD,QAAA,OAAO;AAAA,UACL,iIAAA;AAAA,UACA,EAAA;AAAA,UACA,kBAAkB,IAAI,CAAA,CAAA;AAAA,UACtB,EAAA;AAAA,UACA,gCAAA;AAAA,UACA,2FAAA;AAAA,UACA,0EAAA;AAAA,UACA,oCAAA;AAAA,UACA,yFAAA;AAAA,UACA,gGAAA;AAAA,UACA,2EAAA;AAAA,UACA,EAAA;AAAA,UACA,KAAA;AAAA,UACA,EAAA;AAAA,UACA,WAAA;AAAA,UACA,GAAI,gBAAgB,CAAC,EAAA,EAAI,OAAO,EAAA,EAAI,aAAa,IAAI;AAAC,SACxD,CAAE,KAAK,IAAI,CAAA;AAAA,MACb;AAAA;AAAA;AAAA;AAAA;AAAA,MAMQ,mBAAmB,IAAA,EAA+B;AACxD,QAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,MAAA,IAAU,CAAC,KAAK,SAAA,EAAW;AAAE,UAAA,OAAO,IAAA;AAAA,QAAM;AAE3D,QAAA,MAAM,QAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAC,OAAO,CAAA,KAAM;AAC1C,UAAA,MAAM,eAAe,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAA,GACtC,KAAK,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,MAAM,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA,GAC9C,EAAA;AACJ,UAAA,OAAO,CAAA,EAAA,EAAK,CAAA,GAAI,CAAC,CAAA,GAAA,EAAM,KAAA,CAAM,IAAI,CAAA,EAAG,YAAY,CAAA,mBAAA,EAAiB,CAAA,KAAM,CAAA,GAAI,MAAA,GAAS,QAAQ,CAAA,CAAA;AAAA,QAC9F,CAAC,CAAA;AAED,QAAA,OAAO;AAAA,UACL,sBAAA;AAAA,UACA,EAAA;AAAA,UACA,wGAAA;AAAA,UACA,EAAA;AAAA,UACA,GAAG,KAAA;AAAA,UACH,EAAA;AAAA,UACA;AAAA,SACF,CAAE,KAAK,IAAI,CAAA;AAAA,MACb;AAAA;AAAA;AAAA;AAAA,MAKQ,oBAAoB,IAAA,EAAwB;AAClD,QAAA,MAAM,QAAkB,EAAC;AACzB,QAAA,KAAA,MAAW,KAAA,IAAS,KAAK,MAAA,EAAQ;AAC/B,UAAA,KAAA,CAAM,IAAA,CAAK,CAAA,IAAA,EAAO,KAAA,CAAM,IAAI,CAAA,CAAE,CAAA;AAC9B,UAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAC9B,YAAA,KAAA,CAAM,IAAA,CAAK,CAAA,IAAA,EAAO,IAAA,CAAK,MAAM,CAAA,CAAE,CAAA;AAAA,UACjC;AAAA,QACF;AACA,QAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,MACxB;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;ACpSA,IA6Ba;AA7Bb,IAAA,oBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,2CAAA,GAAA;AA6BO,IAAM,iBAAN,MAAqB;AAAA,MACjB,IAAA,GAAO,cAAA;AAAA,MACP,KAAA,GAAQ,EAAA;AAAA,MACR,MAAA,GAAS,EAAE,UAAA,EAAY,WAAA,EAAsB,WAAW,GAAA,EAAK;AAAA,MAErD,KAAA,uBAAY,GAAA,EAAuB;AAAA,MACnC,QAAA,uBAAe,GAAA,EAAuC;AAAA,MACtD,aAAA;AAAA,MACT,OAAA,GAA0B,IAAA;AAAA,MAElC,WAAA,CAAY,MAAA,GAA+B,EAAC,EAAG;AAC7C,QAAA,IAAA,CAAK,aAAA,GAAgB,OAAO,aAAA,IAAiB,CAAA;AAAA,MAC/C;AAAA;AAAA,MAGA,WAAW,EAAA,EAAmB;AAC5B,QAAA,IAAA,CAAK,OAAA,GAAU,EAAA;AAAA,MACjB;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,MAAM,MAAA,CAAO,WAAA,EAAqB,OAAA,EAAgD;AAChF,QAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,UAAA,MAAM,IAAI,MAAM,iEAA4D,CAAA;AAAA,QAC9E;AAEA,QAAA,MAAM,YAAA,GAAe,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,MAAA,KAAW,SAAS,CAAA;AAChF,QAAA,IAAI,YAAA,CAAa,MAAA,IAAU,IAAA,CAAK,aAAA,EAAe;AAC7C,UAAA,MAAM,GAAA,GAAM,aAAa,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,EAAE,CAAA,CAAE,KAAK,MAAM,CAAA;AACnD,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,CAAA,sBAAA,EAAyB,KAAK,aAAa,CAAA,8BAAA,EACrB,aAAa,CAAC,CAAA,CAAG,EAAE,CAAA,iEAAA,EACrB,GAAG,CAAA,EAAA;AAAA,WACzB;AAAA,QACF;AAEA,QAAA,MAAM,EAAA,GAAK,UAAA,EAAW,CAAE,KAAA,CAAM,GAAG,CAAC,CAAA;AAClC,QAAA,MAAMD,IAAAA,GAAAA,iBAAM,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAEnC,QAAA,MAAM,IAAA,GAAkB;AAAA,UACtB,EAAA;AAAA,UACA,WAAA;AAAA,UACA,MAAA,EAAQ,SAAA;AAAA,UACR,WAAA,EAAaA,IAAAA;AAAA,UACb,SAAA,EAAWA,IAAAA;AAAA,UACX,MAAA,EAAQ,QAAQ,MAAA,IAAU;AAAA,SAC5B;AACA,QAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,EAAA,EAAI,IAAI,CAAA;AAGvB,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA,CAAE,IAAA;AAAA,UACpC,CAAC,MAAA,KAAW;AACV,YAAA,IAAA,CAAK,MAAA,GAAS,WAAA;AACd,YAAA,IAAA,CAAK,WAAA,GAAA,iBAAc,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAC1C,YAAA,IAAA,CAAK,SAAS,MAAA,CAAO,OAAA;AACrB,YAAA,IAAA,CAAK,aAAa,MAAA,CAAO,UAAA;AACzB,YAAA,IAAA,CAAK,YAAY,MAAA,CAAO,SAAA;AACxB,YAAA,IAAA,CAAK,gBAAgB,MAAA,CAAO,aAAA;AAC5B,YAAA,OAAO,MAAA;AAAA,UACT,CAAA;AAAA,UACA,CAAC,GAAA,KAAQ;AACP,YAAA,IAAA,CAAK,MAAA,GAAS,QAAA;AACd,YAAA,IAAA,CAAK,WAAA,GAAA,iBAAc,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAC1C,YAAA,IAAA,CAAK,QAAQ,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC5D,YAAA,MAAM,GAAA;AAAA,UACR;AAAA,SACF;AACA,QAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAA,EAAI,OAAO,CAAA;AAE7B,QAAA,OAAO,IAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,UAAU,MAAA,EAAiD;AACzD,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA,IAAK,IAAA;AAAA,QACnC;AACA,QAAA,OAAO,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAAA,MAChC;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,QAAQ,MAAA,EAA2C;AACvD,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AACxC,QAAA,IAAI,CAAC,OAAA,EAAS;AACZ,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iCAAA,EAAoC,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,QAC/D;AACA,QAAA,OAAO,OAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,cAAc,GAAA,EAAuC;AACnD,QAAA,MAAM,QAAQ,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AACrC,QAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AAAE,UAAA,OAAO,MAAA;AAAA,QAAW;AAE5C,QAAA,MAAM,UAAU,KAAA,CAAM,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,WAAW,SAAS,CAAA;AACxD,QAAA,MAAM,YAAY,KAAA,CAAM,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,WAAW,WAAW,CAAA;AAC5D,QAAA,MAAM,SAAS,KAAA,CAAM,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,WAAW,QAAQ,CAAA;AAGtD,QAAA,GAAA,CAAI,IAAI,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,SAAA,EAAW,QAAQ,MAAM,CAAA;AACnD,QAAA,GAAA,CAAI,IAAI,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,WAAA,EAAa,UAAU,MAAM,CAAA;AACvD,QAAA,GAAA,CAAI,IAAI,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,QAAA,EAAU,OAAO,MAAM,CAAA;AACjD,QAAA,GAAA,CAAI,IAAI,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,OAAA,EAAS,MAAM,MAAM,CAAA;AAG/C,QAAA,MAAM,cAAA,GAAiB,SAAA,CAAU,MAAA,CAAO,CAAA,CAAA,KAAK;AAC3C,UAAA,MAAM,GAAA,GAAM,CAAA,eAAA,EAAkB,CAAA,CAAE,EAAE,CAAA,CAAA;AAClC,UAAA,IAAI,IAAI,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,GAAG,CAAA,EAAG;AAAE,YAAA,OAAO,KAAA;AAAA,UAAO;AACpD,UAAA,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,KAAK,IAAI,CAAA;AACnC,UAAA,OAAO,IAAA;AAAA,QACT,CAAC,CAAA;AAED,QAAA,IAAI,cAAA,CAAe,WAAW,CAAA,EAAG;AAAE,UAAA,OAAO,MAAA;AAAA,QAAW;AAGrD,QAAA,MAAM,aAAA,GAAgB,cAAA,CAAe,GAAA,CAAI,CAAA,CAAA,KAAK;AAC5C,UAAA,MAAM,MAAA,GAAS,CAAA,CAAE,MAAA,KAAW,WAAA,GAAc,QAAA,GAAM,QAAA;AAChD,UAAA,MAAM,MAAA,GAAS,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,KAAA,IAAS,YAAA;AACtC,UAAA,OAAO,CAAA,EAAG,MAAM,CAAA,OAAA,EAAU,CAAA,CAAE,WAAW,CAAA,GAAA,EAAM,CAAA,CAAE,EAAE,CAAA,GAAA,EAAM,MAAM,CAAA,CAAA;AAAA,QAC/D,CAAC,CAAA;AAED,QAAA,MAAM,QAAA,GAAW;AAAA,UACf,IAAA,EAAM,MAAA;AAAA,UACN,OAAA,EAAS,CAAA;AAAA,EAAwB,aAAA,CAAc,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,SAC3D;AAEA,QAAA,OAAO,EAAE,QAAA,EAAU,CAAC,GAAG,GAAA,CAAI,QAAA,EAAU,QAAQ,CAAA,EAAE;AAAA,MACjD;AAAA;AAAA;AAAA;AAAA,MAKA,MAAA,GAAe;AAAA,MAGf;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;AChLA,IAYa;AAZb,IAAA,yBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,mCAAA,GAAA;AAGA,IAAA,0BAAA,EAAA;AACA,IAAA,oBAAA,EAAA;AAQO,IAAM,qBAAN,MAAyB;AAAA,MAC9B,WAAA,CACmB,UAAA,EACA,cAAA,GAAiB,IAAI,cAAA,CAAe,UAAU,CAAA,EAC9C,eAAA,GAAkB,IAAI,mBAAA,CAAoB,UAAU,CAAA,EACrE;AAHiB,QAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,QAAA,IAAA,CAAA,cAAA,GAAA,cAAA;AACA,QAAA,IAAA,CAAA,eAAA,GAAA,eAAA;AAAA,MAChB;AAAA,MAEH,MAAM,KAAA,CAAM,SAAA,EAAmB,IAAA,EAAkD;AAC/E,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,cAAA,CAAe,kBAAA,CAAmB,SAAS,CAAA;AACjE,QAAA,MAAMC,QAAAA,CAAG,MAAWQ,MAAA,CAAA,OAAA,CAAQ,QAAQ,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAC1D,QAAA,MAAMR,QAAAA,CAAG,UAAU,QAAA,EAAU,IAAA,CAAK,UAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAA,EAAG,OAAO,CAAA;AAEnE,QAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,eAAA,CAAgB,YAAY,IAAI,CAAA;AACzD,QAAA,OAAO;AAAA,UACL,QAAA;AAAA,UACA,cAAc,KAAA,CAAM,IAAA;AAAA,UACpB,UAAU,KAAA,CAAM;AAAA,SAClB;AAAA,MACF;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC/BA,IAQa;AARb,IAAA,0BAAA,GAAA,KAAA,CAAA;AAAA,EAAA,oCAAA,GAAA;AAAA,IAAA,mBAAA,EAAA;AAQO,IAAM,sBAAN,MAA0B;AAAA,MACd,SAAA,GAAY,IAAI,aAAA,EAAc;AAAA,MAE/C,SAAS,QAAA,EAAwC;AAC/C,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,QAAA,CAAS,QAAQ,CAAA;AAC/C,QAAA,OAAO;AAAA,UACL,QAAQ,MAAA,CAAO,MAAA;AAAA,UACf,OAAA,EAAS,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA;AAAA,UACjC;AAAA,SACF;AAAA,MACF;AAAA,MAEQ,aAAa,MAAA,EAAsC;AACzD,QAAA,MAAM,SAAA,GAAY,OAAO,MAAA,CACtB,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,QAAA,KAAa,MAAM,CAAA,CAC3C,KAAA,CAAM,GAAG,CAAC,CAAA,CACV,GAAA,CAAI,CAAC,KAAA,KAAU,CAAA,EAAG,MAAM,SAAS,CAAA,EAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAExD,QAAA,OAAO,SAAA,CAAU,MAAA,GAAS,CAAA,GACtB,SAAA,CAAU,IAAA,CAAK,KAAK,CAAA,GACpB,CAAA,kCAAA,EAAqC,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,MAClE;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACrBO,SAAS,uBAAuB,OAAA,EAAgD;AACrF,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,oBAAA;AAAA,IACJ,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,SAAA,GAAY,MAAM,SAAA,IAAa,OAAA,CAAQ,cAAc,SAAA,IAAa,CAAA,QAAA,EAAW,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AAC7F,MAAA,MAAM,EAAE,QAAA,EAAU,UAAA,EAAW,GAAI,mBAAA;AAAA,QAC/B,KAAA,CAAM,MAAA;AAAA,QACN,OAAA,CAAQ,IAAA;AAAA,QACR,QAAQ,YAAA,EAAc;AAAA,OACxB;AACA,MAAA,MAAM,OAAO,aAAA,CAAc;AAAA,QACzB,SAAA;AAAA,QACA,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,YAAY,OAAA,CAAQ,UAAA;AAAA,QACpB,QAAA;AAAA,QACA,YAAA,EAAc,QAAQ,YAAA,IAAgB;AAAA,OACvC,CAAA;AACD,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,IAAA,CAAK,MAAA,GAAS,QAAA;AAAA,MAChB;AACA,MAAA,MAAM,MAAA,GAA6B;AAAA,QACjC,UAAA,EAAY;AAAA,UACV,IAAA;AAAA,UACA,OAAA,EAAS;AAAA,SACX;AAAA,QACA,eAAA,EAAiB;AAAA,UACf,IAAA;AAAA,UACA,YAAA,EAAc;AAAA,SAChB;AAAA,QACA,OAAA,EAAS;AAAA,OACX;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,GACF;AACF;AAEA,SAAS,mBAAA,CAAoB,OAAA,EAAiB,IAAA,EAAc,gBAAA,EAAsE;AAChI,EAAA,MAAM,IAAA,GAAA,CAAQ,OAAA,IAAW,EAAA,EAAI,IAAA,EAAK;AAClC,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,EAAE,QAAA,EAAU,uBAAA,CAAwB,MAAM,gBAAgB,CAAA,EAAG,YAAY,IAAA,EAAK;AAAA,EACvF;AAEA,EAAA,MAAM,eAAe,CAAC,KAAA,KAAkB,cAAc,IAAA,CAAK,KAAK,KAAK,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA,CAAE,MAAA,CAAO,CAAC,IAAA,KAAS,YAAA,CAAa,KAAK,IAAI,CAAC,EAAE,MAAA,IAAU,CAAA;AAC3I,EAAA,IAAI,YAAA,CAAa,IAAI,CAAA,EAAG;AACtB,IAAA,OAAO,EAAE,QAAA,EAAU,IAAA,EAAM,UAAA,EAAY,KAAA,EAAM;AAAA,EAC7C;AAEA,EAAA,MAAM,MAAA,GAAS,yCAAA,CAA0C,IAAA,CAAK,IAAI,CAAA;AAClE,EAAA,MAAM,SAAA,GAAY,MAAA,GAAS,CAAC,CAAA,EAAG,MAAK,IAAK,IAAA;AACzC,EAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,IAAA,OAAO,EAAE,QAAA,EAAU,SAAA,EAAW,UAAA,EAAY,KAAA,EAAM;AAAA,EAClD;AAEA,EAAA,OAAO,EAAE,QAAA,EAAU,uBAAA,CAAwB,MAAM,SAAS,CAAA,EAAG,YAAY,IAAA,EAAK;AAChF;AAEA,SAAS,cAAc,KAAA,EAMV;AACX,EAAA,MAAMD,IAAAA,GAAAA,iBAAM,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACnC,EAAA,MAAM,SAAS,KAAA,CAAM,YAAA,EAAc,MAAM,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,EAAE,EAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AACrG,EAAA,MAAM,MAAA,GAAS,uBAAA,CAAwB,KAAA,CAAM,QAAA,EAAU,MAAM,CAAA;AAC7D,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,MAAA;AAAA,IACJ,WAAW,KAAA,CAAM,SAAA;AAAA,IACjB,MAAM,KAAA,CAAM,IAAA;AAAA,IACZ,IAAA,EAAM,MAAA;AAAA,IACN,MAAA;AAAA,IACA,iBAAA,EAAmB,KAAA,CAAM,YAAA,EAAc,iBAAA,IAAqB,SAAA;AAAA,IAC5D,YAAY,KAAA,CAAM,UAAA;AAAA,IAClB,SAAA,EAAW,KAAA,CAAM,YAAA,EAAc,SAAA,IAAaA,IAAAA;AAAA,IAC5C,SAAA,EAAWA,IAAAA;AAAA,IACX,MAAA,EAAQ,OAAA;AAAA,IACR,UAAU,KAAA,CAAM;AAAA,GAClB;AACF;AAEA,SAAS,uBAAA,CAAwB,UAAkB,MAAA,EAA0B;AAC3E,EAAA,MAAM,KAAA,GAAA,CAAS,YAAY,EAAA,EAAI,OAAA,CAAQ,SAAS,IAAI,CAAA,CAAE,MAAM,IAAI,CAAA;AAChE,EAAA,MAAM,iBAA2B,EAAC;AAClC,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ,KAAK,CAAA,EAAG;AACxC,IAAA,IAAI,SAAA,CAAU,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,IAAK,EAAE,CAAA,IAAK,gBAAA,CAAiB,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,IAAK,EAAE,CAAA,EAAG;AAC3E,MAAA,cAAA,CAAe,KAAK,CAAC,CAAA;AAAA,IACvB;AAAA,EACF;AAEA,EAAA,MAAMU,kBAAiB,CAAC,KAAA,KACtB,KAAA,CACG,GAAA,CAAI,CAAC,IAAA,KAAS;AACb,IAAA,MAAM,MAAA,GAAS,qBAAA,CAAsB,IAAA,CAAK,IAAI,CAAA;AAC9C,IAAA,IAAI,MAAA,GAAS,CAAC,CAAA,EAAG;AACf,MAAA,OAAO,MAAA,CAAO,CAAC,CAAA,CAAE,IAAA,EAAK;AAAA,IACxB;AACA,IAAA,MAAM,QAAA,GAAW,sBAAA,CAAuB,IAAA,CAAK,IAAI,CAAA;AACjD,IAAA,OAAO,QAAA,GAAW,CAAC,CAAA,EAAG,IAAA,EAAK,IAAK,EAAA;AAAA,EAClC,CAAC,CAAA,CACA,MAAA,CAAO,OAAO,CAAA;AAEnB,EAAA,MAAM,YAAA,GAAe,MAAA,GAAS,CAAA,EAAG,MAAM,CAAA,CAAA,CAAA,GAAM,EAAA;AAE7C,EAAA,IAAI,cAAA,CAAe,WAAW,CAAA,EAAG;AAC/B,IAAA,MAAM,OAAA,GAAUA,gBAAe,KAAK,CAAA;AACpC,IAAA,OAAO,CAAC;AAAA,MACN,EAAA,EAAI,SAAA;AAAA,MACJ,IAAA,EAAM,gBAAA;AAAA,MACN,WAAA,EAAa,2BAAA;AAAA,MACb,cAAc,EAAC;AAAA,MACf,MAAA,EAAQ,SAAA;AAAA,MACR,MAAA,EAAQ,GAAG,YAAY,CAAA,OAAA,CAAA;AAAA,MACvB,KAAA,EAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,UAAU,CAAC,+BAA+B,CAAA,EAAG,KAAA,CAAM,GAAG,EAAE,CAAA,CAAE,GAAA,CAAI,CAAC,MAAM,GAAA,MAAS;AAAA,QACzG,EAAA,EAAI,CAAA,OAAA,EAAU,GAAA,GAAM,CAAC,CAAA,CAAA;AAAA,QACrB,MAAA,EAAQ,IAAA;AAAA,QACR,eAAA,EAAiB,cAAc,IAAI,CAAA,CAAA;AAAA,QACnC,MAAA,EAAQ,SAAA;AAAA,QACR,MAAA,EAAQ,CAAA,EAAG,YAAY,CAAA,aAAA,EAAgB,MAAM,CAAC,CAAA;AAAA,OAChD,CAAE;AAAA,KACH,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,cAAA,CAAe,GAAA,CAAI,CAAC,KAAA,EAAO,GAAA,KAAQ;AACxC,IAAA,MAAM,GAAA,GAAM,cAAA,CAAe,GAAA,GAAM,CAAC,KAAK,KAAA,CAAM,MAAA;AAC7C,IAAA,MAAM,KAAA,GAAA,CAAS,KAAA,CAAM,KAAK,CAAA,IAAK,EAAA,EAAI,OAAA,CAAQ,YAAA,EAAc,EAAE,CAAA,CAAE,IAAA,EAAK,IAAK,CAAA,MAAA,EAAS,MAAM,CAAC,CAAA,CAAA;AACvF,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,KAAA,GAAQ,GAAG,GAAG,CAAA;AACvC,IAAA,MAAM,OAAA,GAAUA,gBAAe,IAAI,CAAA;AACnC,IAAA,MAAM,cAAc,IAAA,CAAK,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,MAAK,CAAE,MAAA,GAAS,KAAK,CAAC,uBAAA,CAAwB,KAAK,IAAI,CAAC,GAAG,IAAA,EAAK,IACxG,WAAW,KAAK,CAAA,CAAA;AACrB,IAAA,MAAM,WAAW,GAAA,GAAM,CAAA;AACvB,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,SAAS,QAAQ,CAAA,CAAA;AAAA,MACrB,IAAA,EAAM,KAAA;AAAA,MACN,WAAA;AAAA,MACA,YAAA,EAAc,QAAQ,CAAA,GAAI,KAAK,CAAC,CAAA,MAAA,EAAS,GAAG,CAAA,CAAE,CAAA;AAAA,MAC9C,MAAA,EAAQ,SAAA;AAAA,MACR,MAAA,EAAQ,CAAA,EAAG,YAAY,CAAA,MAAA,EAAS,QAAQ,CAAA,CAAA;AAAA,MACxC,QAAQ,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,OAAA,GAAU,CAAC,CAAA,QAAA,EAAW,KAAK,CAAA,CAAE,CAAA,EAAG,MAAM,CAAA,EAAG,EAAE,EAAE,GAAA,CAAI,CAAC,MAAM,OAAA,MAAa;AAAA,QAChG,EAAA,EAAI,CAAA,KAAA,EAAQ,QAAQ,CAAA,CAAA,EAAI,UAAU,CAAC,CAAA,CAAA;AAAA,QACnC,MAAA,EAAQ,IAAA;AAAA,QACR,eAAA,EAAiB,cAAc,IAAI,CAAA,CAAA;AAAA,QACnC,MAAA,EAAQ,SAAA;AAAA,QACR,QAAQ,CAAA,EAAG,YAAY,SAAS,QAAQ,CAAA,MAAA,EAAS,UAAU,CAAC,CAAA;AAAA,OAC9D,CAAE;AAAA,KACJ;AAAA,EACF,CAAC,CAAA;AACH;AAEA,SAAS,uBAAA,CAAwB,MAAc,YAAA,EAA+B;AAC5E,EAAA,MAAM,OAAA,GAAA,CAAW,YAAA,IAAgB,EAAA,EAAI,IAAA,EAAK;AAC1C,EAAA,MAAM,aAAA,GAAgB,UAClB,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,MAAM,CAAA,CAAE,OAAO,OAAO,CAAA,CAAE,MAAM,CAAA,EAAG,EAAE,IAC1E,EAAC;AAEL,EAAA,OAAO;AAAA,IACL,WAAW,IAAI,CAAA,CAAA;AAAA,IACf,EAAA;AAAA,IACA,oHAAA;AAAA,IACA,EAAA;AAAA,IACA,uBAAA;AAAA,IACA,EAAA;AAAA,IACA,SAAA;AAAA,IACA,mBAAmB,IAAI,CAAA,CAAA;AAAA,IACvB,gEAAA;AAAA,IACA,EAAA;AAAA,IACA,GAAI,aAAA,CAAc,MAAA,GAAS,CAAA,GACvB;AAAA,MACE,yBAAA;AAAA,MACA,oFAAA;AAAA,MACA,EAAA;AAAA,MACA,GAAG,aAAA,CAAc,GAAA,CAAI,CAAC,IAAA,KAAS,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE,CAAA;AAAA,MAC1C;AAAA,QAEF,EAAC;AAAA,IACL,eAAA;AAAA,IACA,yDAAA;AAAA,IACA,gEAAA;AAAA,IACA;AAAA,GACF,CAAE,KAAK,IAAI,CAAA;AACb;AA7LA,IAAA,uBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,iCAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACiDA,SAAS,uBAAuB,gBAAA,EAAyC;AACvE,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,mBAAmB,8BAAA,GAAiC,+BAAA;AAAA,IACxD,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,WAAW,KAAA,CAAM,QAAA;AACvB,MAAA,IAAI,oBAAA,CAAqB,QAAA,EAAU,gBAAgB,CAAA,EAAG;AACpD,QAAA,OAAO;AAAA,UACL,cAAc,QAAA,CAAS,aAAA;AAAA,UACvB,cAAA,EAAgB,GAAA;AAAA,UAChB,gBAAA,EAAkB,SAAS,sBAAA,GAAyB,CAAA;AAAA,UACpD,cAAA,EAAgB,YAAA;AAAA,UAChB,SAAA,EAAW,mBACP,+GAAA,GACA;AAAA,SACN;AAAA,MACF;AAEA,MAAA,IAAI,QAAA,CAAS,yBAAyB,CAAA,EAAG;AACvC,QAAA,OAAO;AAAA,UACL,cAAc,QAAA,CAAS,aAAA;AAAA,UACvB,cAAA,EAAgB,mBAAmB,IAAA,GAAO,IAAA;AAAA,UAC1C,gBAAA,EAAkB,IAAA;AAAA,UAClB,gBAAgB,QAAA,CAAS,aAAA,KAAkB,gBAAA,GAAmB,CAAA,GAAI,KAAK,YAAA,GAAe,QAAA;AAAA,UACtF,WAAW,QAAA,CAAS,aAAA,KAAkB,gBAAA,GAAmB,CAAA,GAAI,KACzD,sGAAA,GACA;AAAA,SACN;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,cAAc,QAAA,CAAS,aAAA;AAAA,QACvB,cAAA,EAAgB,IAAA,CAAK,GAAA,CAAI,gBAAA,GAAmB,GAAA,GAAM,IAAA,EAAM,IAAA,GAAQ,QAAA,CAAS,aAAA,IAAiB,gBAAA,GAAmB,GAAA,GAAM,IAAA,CAAM,CAAA;AAAA,QACzH,gBAAA,EAAkB,KAAA;AAAA,QAClB,cAAA,EAAgB,UAAA;AAAA,QAChB,SAAA,EAAW,mBACP,0DAAA,GACA;AAAA,OACN;AAAA,IACF;AAAA,GACF;AACF;AAEO,SAAS,yBAAyB,OAAA,EAMtB;AACjB,EAAA,MAAM,aAAA,GAAgC,OAAA,EAAS,IAAA,GAC3C,CAAC,sBAAA,CAAuB;AAAA,IACtB,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,UAAA,EAAY,SAAS,UAAA,IAAc,QAAA;AAAA,IACnC,YAAA,EAAc,SAAS,YAAA,IAAgB;AAAA,GACxC,CAAC,CAAA,GACF,EAAC;AACL,EAAA,MAAM,gBAAA,GAAsC,SAAS,IAAA,GACjD,CAAC,iCAAiC,OAAA,CAAQ,IAAI,CAAC,CAAA,GAC/C,EAAC;AACL,EAAA,MAAM,eAAA,GAAoC,OAAA,EAAS,UAAA,GAC/C,CAAC,+BAAA,CAAgC,OAAA,CAAQ,UAAA,EAAY,OAAA,CAAQ,cAAc,CAAC,CAAA,GAC5E,EAAC;AACL,EAAA,MAAM,gBAAA,GAAmB,0BAAA,CAA2B,OAAA,EAAS,IAAA,EAAM,SAAS,UAAU,CAAA;AAEtF,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,cAAA;AAAA,IACJ,IAAA,EAAM,WAAA;AAAA,IACN,WAAA,EAAa,uFAAA;AAAA,IACb,UAAA,EAAY;AAAA,MACV,MAAA,EAAQ,WAAA;AAAA,MACR,gBAAA,EAAkB,mBACd,KAAA,CAAM,IAAA,CAAK,yBAAyB,CAAA,GACpC,KAAA,CAAM,KAAK,sBAAsB;AAAA,KACvC;AAAA,IACA,6BAAA,EAA+B,CAAC,mCAAmC,CAAA;AAAA,IACnE,kBAAkB,CAAC,yBAAA,CAA0B,OAAA,EAAS,IAAA,EAAM,gBAAgB,CAAC,CAAA;AAAA,IAC7E,aAAA,EAAe,CAAC,sBAAA,CAAuB,gBAAgB,CAAC,CAAA;AAAA,IACxD,aAAA;AAAA,IACA,gBAAA;AAAA,IACA,eAAA;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,iBAAA,EAAmB,IAAA;AAAA,MACnB,uBAAA,EAAyB;AAAA;AAC3B,GACF;AACF;AAEA,SAAS,oBAAA,CAAqB,UAA6B,gBAAA,EAAoC;AAC7F,EAAA,IAAI,CAAC,gBAAA,IAAoB,QAAA,CAAS,aAAa,CAAA,IAAK,QAAA,CAAS,iBAAiB,CAAA,EAAG;AAC/E,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,QAAA,CAAS,SAAA,IAAa,CAAA,IAAK,QAAA,CAAS,iBAAiB,CAAA,EAAG;AAC1D,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,QAAA,CAAS,SAAA,IAAa,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,aAAA,GAAgB,GAAG,CAAC,CAAA,IAAK,QAAA,CAAS,iBAAiB,CAAA,EAAG;AAC7G,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,gBAAA,IAAoB,QAAA,CAAS,yBAAyB,CAAA,IAAK,QAAA,CAAS,iBAAiB,CAAA,EAAG;AAC3F,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,QAAA,CAAS,aAAA,IAAiB,CAAA,IAAK,QAAA,CAAS,kBAAkB,CAAA,EAAG;AAC/D,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,QAAA,CAAS,qBAAA,IAAyB,CAAA,IAAK,QAAA,CAAS,iBAAiB,CAAA,EAAG;AACtE,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,yBAAA,CAA0B,MAA0B,gBAAA,EAA4C;AACvG,EAAA,MAAM,UAAA,GAAa,qBAAqB,IAAI,CAAA;AAC5C,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,wBAAA;AAAA,IACJ,OAAA,GAAU;AACR,MAAA,OAAO;AAAA,QACL,kBAAA;AAAA,QACA,yBAAA;AAAA,QACA,0DAAA;AAAA,QACA,gEAAA;AAAA,QACA,iFAAA;AAAA,QACA,+GAAA;AAAA,QACA,GAAI,gBAAA,GACA;AAAA,UACE;AAAA,SACF,GACA;AAAA,UACE,+HAAA;AAAA,UACA;AAAA,SACF;AAAA,QACJ,GAAI,UAAA,CAAW,MAAA,GAAS,CAAA,GACpB;AAAA,UACE,eAAA;AAAA,UACA,uGAAA;AAAA,UACA,GAAG,UAAA,CAAW,GAAA,CAAI,CAAC,IAAA,KAAS,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE;AAAA,YAEzC;AAAC,OACP,CAAE,KAAK,IAAI,CAAA;AAAA,IACb;AAAA,GACF;AACF;AAEA,SAAS,0BAAA,CACP,IAAA,EACA,UAAA,GAA8C,QAAA,EACrC;AACT,EAAA,IAAI,eAAe,SAAA,EAAW;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,kJAAA,CAAmJ,KAAK,IAAI,CAAA;AACrK;AAEA,SAAS,qBAAqB,IAAA,EAAyB;AACrD,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAY;AAC9B,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,0BAA0B,KAAK,EAAC;AAC/D,EAAA,KAAA,MAAW,SAAS,WAAA,EAAa;AAC/B,IAAA,KAAA,CAAM,GAAA,CAAI,CAAA,uDAAA,EAA0D,KAAK,CAAA,GAAA,CAAK,CAAA;AAAA,EAChF;AACA,EAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,KAAA,CAAM,wBAAwB,KAAK,EAAC;AAChE,EAAA,KAAA,MAAW,SAAS,cAAA,EAAgB;AAClC,IAAA,KAAA,CAAM,GAAA,CAAI,CAAA,yCAAA,EAA4C,KAAK,CAAA,gCAAA,CAAkC,CAAA;AAAA,EAC/F;AACA,EAAA,IAAI,+BAAA,CAAgC,IAAA,CAAK,IAAI,CAAA,EAAG;AAC9C,IAAA,KAAA,CAAM,IAAI,2GAA2G,CAAA;AAAA,EACvH;AACA,EAAA,OAAO,MAAM,IAAA,CAAK,KAAK,CAAA,CAAE,KAAA,CAAM,GAAG,CAAC,CAAA;AACrC;AAEA,SAAS,iCAAiC,IAAA,EAA+B;AACvE,EAAA,MAAM,SAAA,GAAY,IAAI,mBAAA,EAAoB;AAC1C,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,+BAAA;AAAA,IACJ,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,WAAW,OAAO,KAAA,CAAM,QAAA,EAAU,YAAA,KAAiB,YAAY,KAAA,CAAM,QAAA,CAAS,YAAA,CAAa,IAAA,GAAO,MAAA,GAAS,CAAA,GAC7G,KAAA,CAAM,QAAA,CAAS,eACf,KAAA,CAAM,MAAA;AACV,MAAA,MAAM,MAAA,GAAS,SAAA,CAAU,QAAA,CAAS,QAAQ,CAAA;AAC1C,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,MAAA,CAAO,MAAA,GAAS,OAAA,GAAU,OAAA;AAAA,QACnC,SAAA,EAAW,MAAA,CAAO,OAAA,IAAW,CAAA,oCAAA,EAAuC,IAAI,CAAA;AAAA,OAC1E;AAAA,IACF;AAAA,GACF;AACF;AAEA,SAAS,+BAAA,CACP,YACA,cAAA,EACgB;AAChB,EAAA,MAAM,MAAA,GAAS,IAAI,kBAAA,CAAmB,UAAA,EAAY,cAAc,CAAA;AAChE,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,8BAAA;AAAA,IACJ,MAAM,MAAM,KAAA,EAAO;AACjB,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,EAAU,IAAA;AAC7B,MAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACrC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,MAAA,CAAO,KAAA,CAAM,KAAA,CAAM,SAAA,EAAW,IAAa,CAAA;AAAA,IACnD;AAAA,GACF;AACF;AA9PA,IAiBM,sBAAA,EAgBA,mCAAA;AAjCN,IAAA,iBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,2BAAA,GAAA;AAYA,IAAA,yBAAA,EAAA;AACA,IAAA,0BAAA,EAAA;AAEA,IAAA,uBAAA,EAAA;AAEA,IAAM,sBAAA,GAAyB;AAAA,MAC7B,SAAA;AAAA,MACA,SAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA,MACA,iBAAA;AAAA,MACA,YAAA;AAAA,MACA,YAAA;AAAA,MACA,gBAAA;AAAA,MACA,gBAAA;AAAA,MACA,gBAAA;AAAA,MACA,UAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAM,mCAAA,GAAoE;AAAA,MACxE,EAAA,EAAI,oCAAA;AAAA,MACJ,OAAO,KAAA,EAAO;AACZ,QAAA,OAAO;AAAA,UACL,YAAA,EAAc;AAAA,YACZ,sBAAA,EAAwB,KAAA;AAAA,YACxB,uBAAA,EAAyB,IAAA;AAAA,YACzB,qBAAA,EAAuB,IAAA;AAAA,YACvB,eAAA,EAAiB,KAAA;AAAA,YACjB,oBAAA,EAAsB;AAAA,WACxB;AAAA,UACA,SAAA,EAAW,CAAA,4FAAA,EAA+F,KAAA,CAAM,IAAI,CAAA;AAAA,SACtH;AAAA,MACF;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;AC1CA,eAAe,kBAAA,CACb,KAAA,EACA,UAAA,EACA,SAAA,EACsB;AACtB,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,eAAA,CAAgB,SAAS,CAAA;AACtD,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,MAAM,UAAU,iBAAA,CAAkB;AAAA,IAChC,SAAA;AAAA,IACA,UAAA;AAAA,IACA,IAAA,EAAM,WAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACP,CAAA;AACD,EAAA,MAAM,KAAA,CAAM,eAAA,CAAgB,SAAA,EAAW,OAAO,CAAA;AAC9C,EAAA,OAAO,OAAA;AACT;AAEO,SAAS,yBAAA,CACd,YACA,SAAA,EACiC;AACjC,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,KAAA,GAAQ,IAAIC,oBAAAA,CAAqB,UAAU,CAAA;AAEjD,EAAA,OAAO;AAAA,IACL,MAAM,eAAA,GAA+C;AACnD,MAAA,OAAO,KAAA,CAAM,gBAAgB,SAAS,CAAA;AAAA,IACxC,CAAA;AAAA,IACA,MAAM,iBAAiB,OAAA,EAAuC;AAC5D,MAAA,MAAM,MAAA,GAAS,MAAM,kBAAA,CAAmB,KAAA,EAAO,YAAY,SAAS,CAAA;AACpE,MAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,MAAA,EAAQ,OAAO,CAAA;AAChD,MAAA,MAAM,KAAA,CAAM,eAAA,CAAgB,SAAA,EAAW,OAAO,CAAA;AAC9C,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IACA,MAAM,iBAAiB,KAAA,EAIE;AACvB,MAAA,MAAM,MAAA,GAAS,MAAM,kBAAA,CAAmB,KAAA,EAAO,YAAY,SAAS,CAAA;AACpE,MAAA,IAAI,UAAU,gBAAA,CAAiB,MAAA,EAAQ,KAAA,CAAM,OAAA,EAAS,MAAM,WAAW,CAAA;AACvE,MAAA,IAAI,MAAM,YAAA,EAAc;AACtB,QAAA,OAAA,GAAU,gBAAA,CAAiB,OAAA,EAAS,KAAA,CAAM,OAAO,CAAA;AAAA,MACnD;AACA,MAAA,MAAM,KAAA,CAAM,eAAA,CAAgB,SAAA,EAAW,OAAO,CAAA;AAC9C,MAAA,OAAO,OAAA;AAAA,IACT;AAAA,GACF;AACF;AA1DA,IAAA,0BAAA,GAAA,KAAA,CAAA;AAAA,EAAA,mCAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACAA,IAAA,yBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,yBAAA,EAAA;AAAA,EAAA,eAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAwlBA,SAASC,2BAAAA,CACP,MACA,UAAA,EACS;AACT,EAAA,IAAI,eAAe,SAAA,EAAW;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,kJAAA,CAAmJ,KAAK,IAAI,CAAA;AACrK;AAEA,SAAS,sBAAsB,gBAAA,EAAwC;AACrE,EAAA,IAAI,gBAAA,EAAkB;AACpB,IAAA,OAAO,IAAI,IAAIC,yBAAyB,CAAA;AAAA,EAC1C;AACA,EAAA,2BAAW,GAAA,CAAI;AAAA,IACb,SAAA;AAAA,IACA,SAAA;AAAA,IACA,aAAA;AAAA,IACA,aAAA;AAAA,IACA,iBAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA;AAAA,IACA,gBAAA;AAAA,IACA,gBAAA;AAAA,IACA,gBAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,GACD,CAAA;AACH;AAtnBA,IA+BM,iBAAA,CAAA,CA0BO;AAzDb,IAAA,sBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,gCAAA,GAAA;AAuBA,IAAA,UAAA,EAAA;AACA,IAAA,oBAAA,EAAA;AACA,IAAA,0BAAA,EAAA;AACA,IAAA,oBAAA,EAAA;AACA,IAAA,iBAAA,EAAA;AAEA,IAAA,0BAAA,EAAA;AAEA,IAAM,oBAAN,MAAwB;AAAA,MAGtB,YAA6B,KAAA,EAAe;AAAf,QAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAAA,MAAgB;AAAA,MAFrC,QAAA,GAAW,CAAA;AAAA,MAInB,IAAI,SAAA,GAAoB;AACtB,QAAA,OAAO,KAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAA,GAAQ,KAAK,QAAQ,CAAA;AAAA,MAC/C;AAAA,MAEA,IAAI,IAAA,GAAe;AACjB,QAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,QAAQ,CAAA;AAAA,MAClC;AAAA,MAEA,QAAA,CAAS,SAAA,EAAmB,OAAA,GAAU,GAAA,EAAc;AAClD,QAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,QAAA,CAAS,SAAS,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,IAAA,CAAK,KAAA,CAAM,SAAS,CAAC,CAAA,GAAI,OAAA;AAC9F,QAAA,IAAI,IAAA,CAAK,aAAa,CAAA,EAAG;AAAC,UAAA,OAAO,CAAA;AAAA,QAAE;AACnC,QAAA,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,SAAA,EAAW,aAAa,CAAA;AAAA,MAC/C;AAAA,MAEA,QAAQ,UAAA,EAA0B;AAChC,QAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA,IAAK,cAAc,CAAA,EAAG;AAAC,UAAA;AAAA,QAAO;AAC7D,QAAA,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AAAA,MACxC;AAAA,KACF;AAGO,IAAM,kBAAN,MAA6C;AAAA,MAClD,MAAM,OAAA,CACJ,IAAA,EACA,MAAA,EACA,YAAA,EACqB;AACrB,QAAA,MAAM,SAAA,GAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACzC,QAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AACzB,QAAA,MAAM,cAAA,GAAiB,IAAI,cAAA,CAAe,MAAA,CAAO,UAAU,CAAA;AAC3D,QAAA,MAAM,YAAY,MAAA,CAAO,SAAA,IAAa,CAAA,QAAA,EAAW,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,EAAE,EAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AACrG,QAAA,MAAM,WAAA,GAAc,OAAO,IAAA,EAAM,OAAA;AACjC,QAAA,MAAM,UAAA,GAAa,aAAa,UAAA,IAAc,QAAA;AAC9C,QAAA,MAAM,gBAAA,GAAmBD,2BAAAA,CAA2B,IAAA,EAAM,UAAU,CAAA;AACpE,QAAA,MAAM,gBAAA,GAAmB,sBAAsB,gBAAgB,CAAA;AAC/D,QAAA,MAAM,gBAAA,GAAmB,cAAA,CAAe,kBAAA,CAAmB,SAAS,CAAA;AACpE,QAAA,MAAM,eAAe,MAAA,CAAO,SAAA,GAAY,MAAM,IAAA,CAAK,QAAA,CAAS,gBAAgB,CAAA,GAAI,IAAA;AAChF,QAAA,MAAM,cAAc,wBAAA,CAAyB;AAAA,UAC3C,YAAY,MAAA,CAAO,UAAA;AAAA,UACnB,cAAA;AAAA,UACA,IAAA;AAAA,UACA,UAAA;AAAA,UACA;AAAA,SACD,CAAA;AACD,QAAA,MAAM,oBAAoB,UAAA,KAAe,QAAA,GAAW,EAAA,GAAK,UAAA,KAAe,YAAY,EAAA,GAAK,EAAA;AAIzF,QAAA,MAAM,iBAAA,GAAoB,CAAA;AAC1B,QAAA,MAAM,sBAAA,GAAyB,KAAK,GAAA,CAAI,MAAA,CAAO,eAAe,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,iBAAiB,CAAC,CAAA;AAC7F,QAAA,MAAM,kBAAkB,IAAA,CAAK,GAAA;AAAA,UAC3B,GAAA;AAAA,UACA,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,WAAA,EAAa,aAAa,GAAS;AAAA,SACvD;AACA,QAAA,MAAM,YAAA,GAAe,IAAI,iBAAA,CAAkB,eAAe,CAAA;AAC1D,QAAA,MAAM,oBAAoB,sBAAA,GAAyB,iBAAA;AACnD,QAAA,MAAM,iBAAiB,IAAA,CAAK,eAAA;AAAA,UAC1B,IAAA;AAAA,UACA,YAAA,EAAc,QAAA;AAAA,UACd,sBAAA;AAAA,UACA,iBAAA;AAAA,UACA,YAAA,CAAa,SAAA;AAAA,UACb,eAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,mBAAA,CAAoB,cAAc,eAAe,CAAA;AAEnF,QAAA,IAAA,CAAK,KAAK,MAAA,EAAQ;AAAA,UAChB,IAAA,EAAM,eAAA;AAAA,UACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,UAClC,SAAA;AAAA,UACA,IAAA,EAAM;AAAA,YACJ,MAAA,EAAQ,UAAA;AAAA,YACR,OAAA,EAAS,mEAAA;AAAA,YACT,GAAG,cAAA;AAAe;AACpB,SACD,CAAA;AACD,QAAA,IAAA,CAAK,KAAK,MAAA,EAAQ;AAAA,UAChB,IAAA,EAAM,iBAAA;AAAA,UACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,UAClC,SAAA;AAAA,UACA,IAAA,EAAM;AAAA,YACJ,KAAA,EAAO,MAAA;AAAA,YACP,QAAA,EAAU,EAAA;AAAA,YACV,OAAA,EAAS,eAAe,8BAAA,GAAiC,2BAAA;AAAA,YACzD,GAAG,cAAA;AAAe;AACpB,SACD,CAAA;AAED,QAAA,IAAI;AAMF,UAAA,MAAM,UAAA,GAAa,mBAAmB,IAAI,cAAA,CAAe,EAAE,aAAA,EAAe,CAAA,EAAG,CAAA,GAAI,KAAA,CAAA;AACjF,UAAA,MAAM,+BAA+B,yCAAA,EAA0C;AAC/E,UAAA,UAAA,EAAY,UAAA,CAAW,OAAO,OAAA,KAAY;AACxC,YAAA,MAAM,mBAAmB,kBAAA,CAAmB;AAAA,cAC1C,GAAG,aAAa,UAAA,EAAW;AAAA,cAC3B,aAAa,OAAA,CAAQ,IAAA;AAAA,cACrB,YAAA,EAAc,gBAAA;AAAA,cACd,aAAA,EAAe,yBAAA;AAAA,gBACb,OAAA,CAAQ,cAAc,MAAA,CAAO,UAAA;AAAA,gBAC7B,MAAA,CAAO;AAAA,eACT;AAAA,cACA,4BAAA,EAA8B,OAAO,EAAE,IAAA,EAAAE,OAAM,MAAA,EAAO,KAKlD,6BAA6B,MAAA,CAAO;AAAA,gBAClC,KAAA,EAAO,MAAA;AAAA,gBACP,UAAU,EAAC;AAAA,gBACX,IAAA,EAAMA,SAAQ,OAAA,CAAQ;AAAA,eACvB;AAAA;AAAA,aAEJ,CAAA;AACD,YAAA,MAAM,iBAAiB,IAAA,CAAK,eAAA;AAAA,cAC1B;AAAA,gBACE,GAAG,MAAA;AAAA,gBACH,IAAA,EAAM,KAAA,CAAA;AAAA,gBACN,aAAA,EAAe,OAAA,CAAQ,aAAA,IAAiB,IAAA,CAAK,IAAI,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,sBAAA,GAAyB,IAAI,CAAC,CAAC,CAAA;AAAA,gBAC3G,UAAA,EAAY,OAAA,CAAQ,UAAA,IAAc,MAAA,CAAO,UAAA;AAAA,gBACzC,WAAA,EAAa;AAAA,kBACX,GAAG,MAAA,CAAO,WAAA;AAAA,kBACV,OAAA,EAAS,IAAA;AAAA,kBACT,SAAA,EAAW,aAAa,QAAA,CAAS,IAAA,CAAK,MAAM,YAAA,CAAa,SAAA,GAAY,GAAI,CAAA,EAAG,GAAI,CAAA;AAAA,kBAChF,cAAA,EAAgB,IAAA;AAAA,kBAChB,cAAA,EAAgB,IAAA;AAAA,kBAChB,QAAA,EAAU,IAAA;AAAA,kBACV,yBAAA,EAA2B,IAAA;AAAA,kBAC3B,6BAAA,EAA+B;AAAA,iBACjC;AAAA,gBACA,SAAS,MAAA,CAAO;AAAA,eAClB;AAAA,cACA;AAAA,aACF;AACA,YAAA,MAAMC,UAAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,YAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,OAAA,CAAQ,QAAQ,IAAI,CAAA;AACxD,YAAA,YAAA,CAAa,OAAA,CAAQ,OAAO,UAAU,CAAA;AACtC,YAAA,OAAO;AAAA,cACL,SAAS,MAAA,CAAO,OAAA;AAAA,cAChB,SAAS,MAAA,CAAO,OAAA;AAAA,cAChB,WAAW,MAAA,CAAO,SAAA;AAAA,cAClB,eAAe,MAAA,CAAO,aAAA;AAAA,cACtB,cAAc,MAAA,CAAO,YAAA;AAAA,cACrB,YAAY,MAAA,CAAO,UAAA;AAAA,cACnB,YAAY,MAAA,CAAO,UAAA;AAAA,cACnB,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAIA,UAAAA;AAAA,cACzB,OAAO,MAAA,CAAO,KAAA;AAAA,cACd,MAAA,EAAQ,QAAQ,MAAA,IAAU;AAAA,aAC5B;AAAA,UACF,CAAC,CAAA;AAED,UAAA,MAAM,qBAAqB,kBAAA,CAAmB;AAAA,YAC5C,GAAG,aAAa,UAAA,EAAW;AAAA,YAC3B,WAAA,EAAa,IAAA;AAAA,YACb,YAAA,EAAc,gBAAA;AAAA,YACd,WAAA,EAAa,UAAA;AAAA,YACb,aAAA,EAAe,yBAAA,CAA0B,MAAA,CAAO,UAAA,EAAY,SAAS,CAAA;AAAA,YACrE,4BAAA,EAA8B,OAAO,EAAE,IAAA,EAAM,YAAY,MAAA,EAAO,KAK9D,6BAA6B,MAAA,CAAO;AAAA,cAClC,KAAA,EAAO,MAAA;AAAA,cACP,UAAU,EAAC;AAAA,cACX,MAAM,UAAA,IAAc;AAAA,aACrB;AAAA,WACJ,CAAA;AAED,UAAA,MAAM,iBAAA,GAAoB,GAAG,cAAc;AAAA,sBAAA,EAA2B,YAAA,CAAa,SAAS,CAAA,CAAA,EAAI,eAAe,CAAA,kGAAA,CAAA;AAC/G,UAAA,IAAI,gBAAA,GAAmB,EAAA;AACvB,UAAA,MAAM,YAAA,GAAuC,CAAC,KAAA,KAAU;AACtD,YAAA,IAAI,MAAM,IAAA,KAAS,UAAA,IAAc,KAAA,CAAM,IAAA,EAAM,aAAa,QAAA,EAAU;AAClE,cAAA,MAAM,cAAA,GAAkB,KAAA,CAAM,IAAA,EAAM,QAAA,EAA+C,MAAA;AACnF,cAAA,MAAM,MAAA,GAAS,OAAO,KAAA,CAAM,IAAA,EAAM,WAAW,QAAA,GAAW,KAAA,CAAM,KAAK,MAAA,GAAS,EAAA;AAC5E,cAAA,MAAM,MAAA,GAAS,OAAO,cAAA,KAAmB,QAAA,GAAW,cAAA,GAAiB,EAAA;AACrE,cAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,EAAK,IAAK,OAAO,IAAA,EAAK;AAC9C,cAAA,IAAI,QAAA,EAAU;AACZ,gBAAA,gBAAA,GAAmB,QAAA;AAAA,cACrB;AAAA,YACF;AACA,YAAA,IAAI,KAAA,CAAM,SAAS,SAAA,EAAW;AAC5B,cAAA,MAAM,OAAA,GAAU,OAAO,KAAA,CAAM,IAAA,EAAM,OAAA,KAAY,WAAW,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAK,GAAI,EAAA;AACtF,cAAA,IAAI,WAAW,aAAA,CAAc,IAAA,CAAK,OAAO,CAAA,IAAK,OAAA,CAAQ,SAAS,GAAA,EAAK;AAClE,gBAAA,gBAAA,GAAmB,OAAA;AAAA,cACrB;AAAA,YACF;AACA,YAAA,MAAA,CAAO,UAAU,KAAK,CAAA;AAAA,UACxB,CAAA;AACA,UAAA,MAAM,aAAa,IAAA,CAAK,eAAA;AAAA,YACtB;AAAA,cACE,GAAG,MAAA;AAAA,cACH,SAAA;AAAA,cACA,IAAA,EAAM,KAAA,CAAA;AAAA,cACN,aAAA,EAAe,sBAAA;AAAA,cACf,WAAA,EAAa;AAAA,gBACX,GAAG,MAAA,CAAO,WAAA;AAAA,gBACV,OAAA,EAAS,IAAA;AAAA,gBACT,SAAA,EAAW,YAAA,CAAa,QAAA,CAAS,IAAA,CAAK,GAAA,CAAI,GAAA,EAAO,IAAA,CAAK,KAAA,CAAM,YAAA,CAAa,SAAA,GAAY,GAAG,CAAC,GAAG,GAAI,CAAA;AAAA,gBAChG,cAAA,EAAgB,MAAA,CAAO,WAAA,EAAa,cAAA,IAAkB,GAAA;AAAA,gBACtD,cAAA,EAAgB,MAAA,CAAO,WAAA,EAAa,cAAA,IAAkB,IAAA;AAAA,gBACtD,QAAA,EAAU,MAAA,CAAO,WAAA,EAAa,QAAA,IAAY,IAAA;AAAA,gBAC1C,yBAAA,EAA2B,MAAA,CAAO,WAAA,EAAa,yBAAA,IAA6B,IAAA;AAAA,gBAC5E,mCAAA,EACE,MAAA,CAAO,WAAA,EAAa,mCAAA,IAAuC,IAAA;AAAA,gBAC7D,6BAAA,EAA+B;AAAA,eACjC;AAAA,cACA,OAAA,EAAS;AAAA,aACX;AAAA,YACA,kBAAA;AAAA,YACA;AAAA,WACF;AAEA,UAAA,MAAM,cAAA,GAAiB,MAAM,UAAA,CAAW,OAAA,CAAQ,iBAAiB,CAAA;AACjE,UAAA,YAAA,CAAa,OAAA,CAAQ,eAAe,UAAU,CAAA;AAC9C,UAAA,MAAM,IAAA,GAAO,cAAA,CAAe,IAAA,IAAQ,IAAA,CAAK,iBAAA,CAAkB,SAAA,EAAW,IAAA,EAAM,UAAA,EAAY,gBAAA,IAAoB,cAAA,CAAe,OAAA,EAAS,YAAY,CAAA;AAChJ,UAAA,MAAM,iBAAA,GAAqB,eAAe,OAAA,EAAS,iBAAA;AAInD,UAAA,MAAM,kBAAA,GAAqB,mBAAmB,iBAAA,EAAmB,IAAA,CAAK,CAAC,MAAA,KAAW,MAAA,CAAO,YAAY,OAAO,CAAA;AAC5G,UAAA,MAAM,UAAA,GAAa;AAAA,YACjB,MAAA,EAAQ,CAAC,iBAAA,EAAmB,eAAA;AAAA,YAC5B,OAAA,EAAS,oBAAoB,SAAA,IAAa;AAAA,WAC5C;AACA,UAAA,MAAM,UAAA,GAAa,KAAK,MAAA,KAAW,QAAA;AAEnC,UAAA,IAAI,UAAA,IAAc,CAAC,UAAA,CAAW,MAAA,EAAQ;AACpC,YAAA,IAAA,CAAK,MAAA,GAAS,QAAA;AAAA,UAChB;AAEA,UAAA,IAAA,CAAK,KAAK,MAAA,EAAQ;AAAA,YAChB,IAAA,EAAM,iBAAA;AAAA,YACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,YAClC,SAAA;AAAA,YACA,IAAA,EAAM;AAAA,cACJ,KAAA,EAAO,MAAA;AAAA,cACP,QAAA,EAAU,EAAA;AAAA,cACV,OAAA,EAAS,aACL,4BAAA,GACA,UAAA,CAAW,SACT,4CAAA,GACA,CAAA,oCAAA,EAAuC,WAAW,OAAO,CAAA,CAAA;AAAA,cAC/D,GAAG,cAAA;AAAe;AACpB,WACD,CAAA;AAED,UAAA,MAAM,QAAA,GAAW,cAAA,CAAe,kBAAA,CAAmB,SAAS,CAAA;AAC5D,UAAA,MAAM,eAAe,IAAI,mBAAA,CAAoB,OAAO,UAAU,CAAA,CAAE,YAAY,IAAI,CAAA;AAChF,UAAA,MAAM,aAAA,GAAgB,CAAC,QAAA,EAAU,YAAY,CAAA;AAC7C,UAAA,MAAM,UAAA,GAAa,KAAK,MAAA,CAAO,MAAA;AAC/B,UAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,CAAC,GAAA,EAAK,KAAA,KAAU,GAAA,GAAM,KAAA,CAAM,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAA;AAEhF,UAAA,IAAI,UAAA,IAAc,CAAC,UAAA,CAAW,MAAA,EAAQ;AACpC,YAAA,IAAA,CAAK,KAAK,MAAA,EAAQ;AAAA,cAChB,IAAA,EAAM,eAAA;AAAA,cACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,cAClC,SAAA;AAAA,cACA,IAAA,EAAM;AAAA,gBACJ,MAAA,EAAQ,OAAA;AAAA,gBACR,OAAA,EAAS,UAAA,GACL,2EAAA,GACA,CAAA,4CAAA,EAA0C,WAAW,OAAO,CAAA,CAAA;AAAA,gBAChE,GAAG,cAAA;AAAe;AACpB,aACD,CAAA;AACD,YAAA,IAAA,CAAK,KAAK,MAAA,EAAQ;AAAA,cAChB,IAAA,EAAM,iBAAA;AAAA,cACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,cAClC,SAAA;AAAA,cACA,IAAA,EAAM;AAAA,gBACJ,KAAA,EAAO,MAAA;AAAA,gBACP,QAAA,EAAU,GAAA;AAAA,gBACV,OAAA,EAAS,iCAAA;AAAA,gBACT,GAAG,cAAA;AAAe;AACpB,aACD,CAAA;AAED,YAAA,OAAO;AAAA,cACL,OAAA,EAAS,KAAA;AAAA,cACT,OAAA,EAAS,UAAA,GACL,8FAAA,GACA,CAAA,4CAAA,EAA0C,WAAW,OAAO,CAAA,CAAA;AAAA,cAChE,YAAA,EAAc,aAAA;AAAA,cACd,eAAe,EAAC;AAAA,cAChB,WAAW,cAAA,CAAe,SAAA;AAAA,cAC1B,YAAY,cAAA,CAAe,UAAA;AAAA,cAC3B,YAAY,cAAA,CAAe,UAAA;AAAA,cAC3B,SAAA;AAAA,cACA;AAAA,aACF;AAAA,UACF;AAEA,UAAA,IAAA,CAAK,KAAK,MAAA,EAAQ;AAAA,YAChB,IAAA,EAAM,eAAA;AAAA,YACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,YAClC,SAAA;AAAA,YACA,IAAA,EAAM;AAAA,cACJ,MAAA,EAAQ,SAAA;AAAA,cACR,OAAA,EAAS,yDAAA;AAAA,cACT,GAAG,cAAA;AAAe;AACpB,WACD,CAAA;AACD,UAAA,IAAA,CAAK,KAAK,MAAA,EAAQ;AAAA,YAChB,IAAA,EAAM,iBAAA;AAAA,YACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,YAClC,SAAA;AAAA,YACA,IAAA,EAAM;AAAA,cACJ,KAAA,EAAO,MAAA;AAAA,cACP,QAAA,EAAU,GAAA;AAAA,cACV,OAAA,EAAS,oBAAA;AAAA,cACT,GAAG,cAAA;AAAe;AACpB,WACD,CAAA;AAED,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,IAAA;AAAA,YACT,OAAA,EAAS,CAAA,kBAAA,EAAqB,UAAU,CAAA,SAAA,EAAY,SAAS,CAAA,2BAAA,CAAA;AAAA,YAC7D,YAAA,EAAc,aAAA;AAAA,YACd,eAAe,EAAC;AAAA,YAChB,WAAW,cAAA,CAAe,SAAA;AAAA,YAC1B,YAAY,cAAA,CAAe,UAAA;AAAA,YAC3B,YAAY,cAAA,CAAe,UAAA;AAAA,YAC3B,SAAA;AAAA,YACA;AAAA,WACF;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,UAAA,IAAA,CAAK,KAAK,MAAA,EAAQ;AAAA,YAChB,IAAA,EAAM,eAAA;AAAA,YACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,YAClC,SAAA;AAAA,YACA,IAAA,EAAM;AAAA,cACJ,MAAA,EAAQ,OAAA;AAAA,cACR;AAAA;AACF,WACD,CAAA;AACD,UAAA,IAAA,CAAK,KAAK,MAAA,EAAQ;AAAA,YAChB,IAAA,EAAM,WAAA;AAAA,YACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,YAClC,SAAA;AAAA,YACA,SAAA;AAAA,YACA,IAAA,EAAM;AAAA,cACJ,OAAA,EAAS,KAAA;AAAA,cACT,OAAA,EAAS,kBAAA;AAAA,cACT,UAAA,EAAY,CAAA;AAAA,cACZ,UAAA,EAAY,CAAA;AAAA,cACZ,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,OAAA;AAAA,cACzB,cAAc,EAAC;AAAA,cACf,eAAe,EAAC;AAAA,cAChB,UAAA,EAAY;AAAA;AACd,WACD,CAAA;AACD,UAAA,MAAM,KAAA;AAAA,QACR;AAAA,MACF;AAAA,MAEA,MAAc,SAAS,QAAA,EAA4C;AACjE,QAAA,IAAI;AACF,UAAA,MAAM,GAAA,GAAM,MAAMd,QAAAA,CAAG,QAAA,CAAS,UAAU,OAAO,CAAA;AAC/C,UAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,QACvB,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF;AAAA,MAEQ,eAAA,CACN,MACA,gBAAA,EACA,aAAA,EACA,mBACA,eAAA,EACA,WAAA,EACA,mBAAmB,KAAA,EACX;AAGR,QAAA,MAAM,gBAAgB,OAAO,eAAA,KAAoB,WAAW,eAAA,CAAgB,cAAA,CAAe,OAAO,CAAA,GAAI,SAAA;AACtG,QAAA,MAAM,YAAY,OAAO,WAAA,KAAgB,WAAW,WAAA,CAAY,cAAA,CAAe,OAAO,CAAA,GAAI,SAAA;AAC1F,QAAA,MAAM,kBAAkB,gBAAA,GACpB;AAAA;;AAAA,EAAsE,gBAAgB;AAAA,CAAA,GACtF,EAAA;AACJ,QAAA,OAAO,CAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,EAQT,IAAI;AAAA,EACJ,eAAe;;AAAA,cAAA,EAED,aAAa,IAAI,SAAS,CAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,EA0BxC,gBAAA,GACE,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,2FAAA,CAAA,GAkBA,CAAA;AAAA;AAAA;AAAA;AAAA,yGAAA,CAIsG;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,8EAAA,CAAA;AAAA,MAqDxG;AAAA,MAEQ,eAAA,CAAgB,MAAA,EAAqB,YAAA,EAA4B,WAAA,EAAyE;AAChJ,QAAA,OAAO,IAAIe,QAAAA,EAAS,CACjB,sBAAA,CAAuB,eAAe,wBAAA,EAA0B,CAAA,CAChE,QAAA,CAAS,kBAAA,CAAmB,YAAY,CAAC,CAAA,CACzC,aAAa,MAAM,CAAA;AAAA,MACxB;AAAA,MAEQ,iBAAA,CACN,SAAA,EACA,IAAA,EACA,UAAA,EACA,SACA,YAAA,EACU;AACV,QAAA,MAAM,QAAA,GAAW;AAAA,UACf,WAAW,IAAI,CAAA,CAAA;AAAA,UACf,EAAA;AAAA,UACA,sGAAA;AAAA,UACA,EAAA;AAAA,UACA,SAAA;AAAA,UACA,IAAA;AAAA,UACA,EAAA;AAAA,UACA,UAAA;AAAA,UACA,OAAA,IAAW;AAAA,SACb,CAAE,KAAK,IAAI,CAAA;AAEX,QAAA,OAAO;AAAA,UACL,IAAI,YAAA,EAAc,EAAA,IAAM,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,EAAE,EAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,UACpF,SAAA;AAAA,UACA,IAAA;AAAA,UACA,IAAA,EAAM,MAAA;AAAA,UACN,QAAQ,EAAC;AAAA,UACT,iBAAA,EAAmB,cAAc,iBAAA,IAAqB,SAAA;AAAA,UACtD,UAAA;AAAA,UACA,WAAW,YAAA,EAAc,SAAA,IAAA,iBAAa,IAAI,IAAA,IAAO,WAAA,EAAY;AAAA,UAC7D,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,UAClC,MAAA,EAAQ,QAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AAAA,MAEQ,mBAAA,CAAoB,cAAiC,WAAA,EAI3D;AACA,QAAA,OAAO;AAAA,UACL,kBAAkB,YAAA,CAAa,IAAA;AAAA,UAC/B,uBAAuB,YAAA,CAAa,SAAA;AAAA,UACpC,iBAAA,EAAmB;AAAA,SACrB;AAAA,MACF;AAAA,MAEQ,IAAA,CAAK,QAAqB,KAAA,EAAyB;AACzD,QAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AAAC,UAAA;AAAA,QAAO;AAC7B,QAAA,MAAA,CAAO,OAAA,CAAQ;AAAA,UACb,GAAG,KAAA;AAAA,UACH,SAAS,MAAA,CAAO,OAAA;AAAA,UAChB,eAAe,MAAA,CAAO;AAAA,SACvB,CAAA;AAAA,MACH;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACtlBA,IAAA,yBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,yBAAA,EAAA;AAAA,EAAA,eAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IAaa;AAbb,IAAA,sBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,gCAAA,GAAA;AAQA,IAAA,UAAA,EAAA;AAKO,IAAM,kBAAN,MAA6C;AAAA,MAClD,MAAM,OAAA,CACJ,IAAA,EACA,MAAA,EACA,YAAA,EACqB;AACrB,QAAA,MAAM,WAAA,GAAc,OAAO,IAAA,EAAM,OAAA;AACjC,QAAA,MAAM,WAAA,GAAc,WAAA,EAAa,WAAA,IAAe,EAAC;AACjD,QAAA,MAAM,MAAA,GAAS,aAAa,MAAA,IAAU,KAAA;AAGtC,QAAA,IAAI,YAAA,GAAe,IAAA;AAEnB,QAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,UAAA,YAAA,IAAgB;;AAAA;AAAA,EAA8B,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAA,EAAK,CAAC,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AACzF,UAAA,YAAA,IAAgB,wEAAA;AAAA,QAClB;AAEA,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,YAAA,IAAgB,mGAAA;AAAA,QAClB;AAEA,QAAA,YAAA,IAAgB,2DAAA;AAGhB,QAAA,MAAM,MAAA,GAAS,IAAIA,QAAAA,EAAS,CACzB,QAAA,CAAS,mBAAmB,YAAY,CAAC,CAAA,CACzC,YAAA,CAAa,MAAM,CAAA;AACtB,QAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA;AAGhD,QAAA,OAAO;AAAA,UACL,GAAG,MAAA;AAAA,UACH,SAAS,MAAA,GACL,CAAA,UAAA,EAAa,MAAA,CAAO,OAAO,KAC3B,MAAA,CAAO;AAAA,SACb;AAAA,MACF;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACnDA,IAAA,0BAAA,GAAA,EAAA;AAAA,QAAA,CAAA,0BAAA,EAAA;AAAA,EAAA,gBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IAca;AAdb,IAAA,uBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,iCAAA,GAAA;AAQA,IAAA,UAAA,EAAA;AAMO,IAAM,mBAAN,MAA8C;AAAA,MACnD,MAAM,OAAA,CACJ,IAAA,EACA,MAAA,EACA,YAAA,EACqB;AACrB,QAAA,MAAM,YAAA,GAAe,OAAO,IAAA,EAAM,OAAA;AAClC,QAAA,MAAM,YAAY,YAAA,EAAc,SAAA;AAChC,QAAA,MAAM,aAAa,YAAA,EAAc,UAAA;AACjC,QAAA,MAAM,aAAA,GAAgB,YAAA,EAAc,aAAA,IAAiB,EAAC;AAGtD,QAAA,IAAI,YAAA,GAAe,eAAe,IAAI;;AAAA,CAAA;AAGtC,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,IAAI;AACF,YAAA,MAAM,YAAA,GAAe,MAAMf,QAAAA,CAAG,QAAA,CAAS,WAAW,OAAO,CAAA;AACzD,YAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,YAAY,CAAA;AAErC,YAAA,YAAA,IAAgB,wBAAA;AAChB,YAAA,YAAA,IAAgB,WAAA;AAChB,YAAA,YAAA,IAAgB,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,IAAA,EAAM,CAAC,CAAA;AAC7C,YAAA,YAAA,IAAgB,WAAA;AAAA,UAClB,CAAA,CAAA,MAAQ;AACN,YAAA,YAAA,IAAgB,2CAAiC,SAAS;;AAAA,CAAA;AAAA,UAC5D;AAAA,QACF;AAGA,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,YAAA,IAAgB,oBAAA;AAChB,UAAA,YAAA,IAAgB,OAAA;AAChB,UAAA,YAAA,IAAgB,UAAA;AAChB,UAAA,YAAA,IAAgB,WAAA;AAAA,QAClB;AAGA,QAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,UAAA,YAAA,IAAgB,uBAAA;AAChB,UAAA,YAAA,IAAgB,aAAA,CAAc,IAAI,CAAC,CAAA,KAAM,KAAK,CAAC,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAC5D,UAAA,YAAA,IAAgB,MAAA;AAChB,UAAA,YAAA,IAAgB,iDAAA;AAAA,QAClB;AAEA,QAAA,YAAA,IAAgB,kBAAA;AAChB,QAAA,YAAA,IAAgB,8CAAA;AAChB,QAAA,YAAA,IAAgB,8BAAA;AAChB,QAAA,YAAA,IAAgB,iCAAA;AAChB,QAAA,YAAA,IAAgB,oDAAA;AAGhB,QAAA,MAAM,MAAA,GAAS,IAAIe,QAAAA,EAAS,CACzB,QAAA,CAAS,mBAAmB,YAAY,CAAC,CAAA,CACzC,YAAA,CAAa,MAAM,CAAA;AACtB,QAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA;AAEhD,QAAA,OAAO;AAAA,UACL,GAAG,MAAA;AAAA,UACH,OAAA,EAAS,CAAA,QAAA,EAAW,MAAA,CAAO,OAAO,CAAA;AAAA,SACpC;AAAA,MACF;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC5EA,IAAA,yBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,yBAAA,EAAA;AAAA,EAAA,eAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IAkCM,oBAAA,CAAA,CAuBAC,oBA8BA,wBAAA,CAAA,CAyCO;AAhIb,IAAA,sBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,gCAAA,GAAA;AAwBA,IAAA,UAAA,EAAA;AACA,IAAA,oBAAA,EAAA;AACA,IAAA,mBAAA,EAAA;AAQA,IAAM,oBAAA,uBAA2B,GAAA,CAAY;AAAA,MAC3C,SAAA;AAAA,MACA,SAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA,MACA,iBAAA;AAAA,MACA,YAAA;AAAA,MACA,YAAA;AAAA,MACA,gBAAA;AAAA,MACA,gBAAA;AAAA,MACA,gBAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA,MACA,UAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACD,CAAA;AAOD,IAAMA,qBAAN,MAAwB;AAAA,MAGtB,YAA6B,KAAA,EAAe;AAAf,QAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAAA,MAAgB;AAAA,MAFrC,QAAA,GAAW,CAAA;AAAA,MAInB,IAAI,SAAA,GAAoB;AACtB,QAAA,OAAO,KAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAA,GAAQ,KAAK,QAAQ,CAAA;AAAA,MAC/C;AAAA,MAEA,IAAI,IAAA,GAAe;AACjB,QAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,QAAQ,CAAA;AAAA,MAClC;AAAA,MAEA,QAAA,CAAS,SAAA,EAAmB,OAAA,GAAU,GAAA,EAAc;AAClD,QAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,QAAA,CAAS,SAAS,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,IAAA,CAAK,KAAA,CAAM,SAAS,CAAC,CAAA,GAAI,OAAA;AAC9F,QAAA,IAAI,IAAA,CAAK,aAAa,CAAA,EAAG;AAAC,UAAA,OAAO,CAAA;AAAA,QAAE;AACnC,QAAA,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,SAAA,EAAW,aAAa,CAAA;AAAA,MAC/C;AAAA,MAEA,QAAQ,UAAA,EAA0B;AAChC,QAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA,IAAK,cAAc,CAAA,EAAG;AAAC,UAAA;AAAA,QAAO;AAC7D,QAAA,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AAAA,MACxC;AAAA,KACF;AAOA,IAAM,wBAAA,GAAN,cAAuC,YAAA,CAAa;AAAA,MAClD,WAAA,CACmB,MACA,YAAA,EACjB;AACA,QAAA,KAAA,CAAM,IAAA,CAAK,YAAY,CAAA;AAHN,QAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,QAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AAAA,MAGnB;AAAA,MAES,IAAI,IAAA,EAAc;AACzB,QAAA,IAAI,CAAC,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA,EAAG;AAAC,UAAA,OAAO,MAAA;AAAA,QAAU;AACpD,QAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA;AAAA,MAC3B;AAAA,MAES,cAAA,GAAmC;AAC1C,QAAA,OAAO,IAAA,CAAK,IAAA,CACT,cAAA,EAAe,CACf,MAAA,CAAO,CAAC,GAAA,KAAQ,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,GAAA,CAAI,QAAA,CAAS,IAAI,CAAC,CAAA;AAAA,MAC7D;AAAA,MAEA,MAAe,OAAA,CAAQ,IAAA,EAAc,KAAA,EAAgC;AACnE,QAAA,IAAI,CAAC,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA,EAAG;AAChC,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,MAAA,EAAS,IAAI,CAAA,uCAAA,CAAyC,CAAA;AAAA,QACxE;AACA,QAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,KAAK,CAAA;AAAA,MACtC;AAAA,MAES,YAAA,GAAyB;AAChC,QAAA,OAAO,IAAA,CAAK,IAAA,CACT,YAAA,EAAa,CACb,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,IAAI,CAAC,CAAA;AAAA,MACjD;AAAA,MAES,UAAA,GAAa;AACpB,QAAA,OAAO,IAAA,CAAK,KAAK,UAAA,EAAW;AAAA,MAC9B;AAAA,KACF;AAMO,IAAM,kBAAN,MAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAS3B,MAAM,OAAA,CACJ,IAAA,EACA,MAAA,EACA,YAAA,EACqB;AACrB,QAAA,MAAM,SAAA,GAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACzC,QAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AACzB,QAAA,MAAM,YAAY,IAAA,CAAK,SAAA;AACvB,QAAA,MAAM,cAAA,GAAiB,IAAI,cAAA,CAAe,MAAA,CAAO,UAAU,CAAA;AAE3D,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,uBAAA,CAAwB,MAAA,EAAQ,IAAI,CAAA;AAC5D,QAAA,MAAM,YAAA,GAAe,IAAIA,kBAAAA,CAAkB,UAAA,CAAW,SAAS,CAAA;AAC/D,QAAA,MAAM,iBAAiB,MAAM,IAAA,CAAK,mBAAA,CAAoB,YAAA,EAAc,WAAW,SAAS,CAAA;AACxF,QAAA,MAAM,sBAAA,GAAyB,IAAA,CAAK,qBAAA,CAAsB,IAAA,EAAM,WAAW,SAAS,CAAA;AACpF,QAAA,MAAM,6BAA6B,IAAA,CAAK,GAAA;AAAA,UACtC,CAAA;AAAA,UACA,IAAA,CAAK,KAAA,CAAM,sBAAA,GAAyB,UAAA,CAAW,qBAAqB;AAAA,SACtE;AACA,QAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,yBAAyB,0BAA0B,CAAA;AAEtF,QAAA,IAAA,CAAK,KAAK,MAAA,EAAQ;AAAA,UAChB,IAAA,EAAM,eAAA;AAAA,UACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,UAClC,SAAA;AAAA,UACA,IAAA,EAAM;AAAA,YACJ,MAAA,EAAQ,UAAA;AAAA,YACR,OAAA,EAAS,iEAAA;AAAA,YACT,GAAG,cAAA;AAAe;AACpB,SACD,CAAA;AACD,QAAA,IAAA,CAAK,KAAK,MAAA,EAAQ;AAAA,UAChB,IAAA,EAAM,iBAAA;AAAA,UACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,UAClC,SAAA;AAAA,UACA,IAAA,EAAM;AAAA,YACJ,KAAA,EAAO,MAAA;AAAA,YACP,QAAA,EAAU,CAAA;AAAA,YACV,OAAA,EAAS,uBAAuB,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,iBAAA,EAAoB,sBAAsB,CAAA,cAAA,EAAiB,UAAA,CAAW,SAAS,CAAA,QAAA,CAAA;AAAA,YACjI,GAAG,cAAA;AAAe;AACpB,SACD,CAAA;AAED,QAAA,IAAI;AACF,UAAA,MAAM,gBAAA,GAAmB,IAAI,wBAAA,CAAyB,YAAA,EAAc,oBAAoB,CAAA;AACxF,UAAA,MAAM,iBAAA,GAAoB,MAAM,IAAA,CAAK,yBAAA;AAAA,YACnC,IAAA;AAAA,YACA,MAAA;AAAA,YACA,gBAAA;AAAA,YACA,YAAA;AAAA,YACA,UAAA,CAAW;AAAA,WACb;AACA,UAAA,MAAM,aAAa,IAAA,CAAK,eAAA;AAAA,YACtB,IAAA;AAAA,YACA,sBAAA;AAAA,YACA,cAAA;AAAA,YACA,0BAAA;AAAA,YACA,UAAA,CAAW,SAAA;AAAA,YACX,YAAA,CAAa,SAAA;AAAA,YACb;AAAA,WACF;AAEA,UAAA,IAAI,gBAAA,GAAmB,EAAA;AACvB,UAAA,IAAI,gBAAA,GAAmB,EAAA;AACvB,UAAA,MAAM,YAAA,GAAuC,CAAC,KAAA,KAAU;AAEtD,YAAA,IAAI,MAAM,IAAA,KAAS,UAAA,IAAc,KAAA,CAAM,IAAA,EAAM,aAAa,QAAA,EAAU;AAClE,cAAA,MAAM,cAAA,GAAkB,KAAA,CAAM,IAAA,EAAM,QAAA,EAA+C,MAAA;AACnF,cAAA,MAAM,MAAA,GAAS,OAAO,KAAA,CAAM,IAAA,EAAM,WAAW,QAAA,GAAW,KAAA,CAAM,KAAK,MAAA,GAAS,EAAA;AAC5E,cAAA,MAAM,MAAA,GAAS,OAAO,cAAA,KAAmB,QAAA,GAAW,cAAA,GAAiB,EAAA;AACrE,cAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,EAAK,IAAK,OAAO,IAAA,EAAK;AAC9C,cAAA,IAAI,QAAA,EAAU;AACZ,gBAAA,gBAAA,GAAmB,QAAA;AAAA,cACrB;AAAA,YACF;AAEA,YAAA,IAAI,KAAA,CAAM,SAAS,SAAA,EAAW;AAC5B,cAAA,MAAM,OAAA,GAAU,OAAO,KAAA,CAAM,IAAA,EAAM,OAAA,KAAY,WAAW,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAK,GAAI,EAAA;AACtF,cAAA,IAAI,OAAA,IAAW,gBAAA,CAAiB,IAAA,CAAK,OAAO,CAAA,EAAG;AAC7C,gBAAA,gBAAA,GAAmB,OAAA;AAAA,cACrB;AAGA,cAAA,IAAI,OAAA,IAAW,QAAQ,MAAA,GAAS,gBAAA,CAAiB,UAAU,YAAA,CAAa,IAAA,CAAK,OAAO,CAAA,EAAG;AACrF,gBAAA,gBAAA,GAAmB,OAAA;AAAA,cACrB;AAAA,YACF;AACA,YAAA,MAAA,CAAO,UAAU,KAAK,CAAA;AAAA,UACxB,CAAA;AAEA,UAAA,MAAM,aAAa,IAAA,CAAK,eAAA;AAAA,YACtB;AAAA,cACE,GAAG,MAAA;AAAA,cACH,SAAA;AAAA,cACA,IAAA,EAAM,KAAA,CAAA;AAAA,cACN,aAAA,EAAe,sBAAA;AAAA,cACf,WAAA,EAAa;AAAA,gBACX,GAAG,MAAA,CAAO,WAAA;AAAA,gBACV,OAAA,EAAS,IAAA;AAAA,gBACT,SAAA,EAAW,YAAA,CAAa,QAAA,CAAS,YAAA,CAAa,WAAW,IAAM,CAAA;AAAA,gBAC/D,cAAA,EAAgB,MAAA,CAAO,WAAA,EAAa,cAAA,IAAkB,IAAA;AAAA,gBACtD,cAAA,EAAgB,MAAA,CAAO,WAAA,EAAa,cAAA,IAAkB,IAAA;AAAA,gBACtD,QAAA,EAAU,MAAA,CAAO,WAAA,EAAa,QAAA,IAAY,IAAA;AAAA,gBAC1C,yBAAA,EAA2B,MAAA,CAAO,WAAA,EAAa,yBAAA,IAA6B,IAAA;AAAA,gBAC5E,mCAAA,EACE,MAAA,CAAO,WAAA,EAAa,mCAAA,IAAuC,IAAA;AAAA,gBAC7D,6BAAA,EACE,MAAA,CAAO,WAAA,EAAa,6BAAA,IAAiC;AAAA,eACzD;AAAA,cACA,OAAA,EAAS;AAAA,aACX;AAAA,YACA;AAAA,WACF;AAEA,UAAA,MAAM,UAAA,GAAa,MAAM,UAAA,CAAW,OAAA,CAAQ,UAAU,CAAA;AACtD,UAAA,YAAA,CAAa,OAAA,CAAQ,WAAW,UAAU,CAAA;AAE1C,UAAA,MAAM,aAAa,UAAA,CAAW,OAAA;AAC9B,UAAA,MAAM,mBAAmB,CAAC,UAAA,IAAc,UAAA,KAAe,oBAAA,IAAwB,WAAW,MAAA,GAAS,EAAA;AACnG,UAAA,IAAI,YAAA,GAAe,gBAAA,KACb,gBAAA,GAAmB,EAAA,GAAK,eACzB,gBAAA,IACA,UAAA;AACL,UAAA,IAAI,CAAC,YAAA,CAAa,IAAA,MAAU,YAAA,CAAa,IAAA,OAAW,+BAAA,EAAiC;AACnF,YAAA,YAAA,GAAe,KAAK,wBAAA,CAAyB,IAAA,EAAM,UAAA,CAAW,SAAA,EAAW,WAAW,SAAS,CAAA;AAAA,UAC/F;AAGA,UAAA,MAAM,SAAA,GAAY,IAAI,aAAA,EAAc;AACpC,UAAA,IAAI,UAAA,GAAa,SAAA,CAAU,gBAAA,CAAiB,YAAA,EAAc,IAAI,CAAA;AAC9D,UAAA,IAAI,CAAC,UAAA,CAAW,MAAA,IAAU,UAAA,CAAW,OAAA,CAAQ,qBAAqB,CAAA,EAAG;AACnE,YAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,6BAAA,CAA8B;AAAA,cACxD,IAAA;AAAA,cACA,mBAAA,EAAqB,YAAA;AAAA,cACrB,cAAA,EAAgB,IAAA,CAAK,yBAAA,CAA0B,IAAA,EAAM,YAAY,CAAA;AAAA,cACjE,UAAA,EAAY,MAAA;AAAA,cACZ,YAAA,EAAc,gBAAA;AAAA,cACd,aAAa,YAAA,CAAa,SAAA;AAAA,cAC1B;AAAA,aACD,CAAA;AACD,YAAA,IAAI,QAAA,EAAU;AACZ,cAAA,MAAM,kBAAA,GAAqB,SAAA,CAAU,gBAAA,CAAiB,QAAA,EAAU,IAAI,CAAA;AACpE,cAAA,IAAI,kBAAA,CAAmB,KAAA,GAAQ,UAAA,CAAW,KAAA,EAAO;AAC/C,gBAAA,YAAA,GAAe,QAAA;AACf,gBAAA,UAAA,GAAa,kBAAA;AAAA,cACf;AAAA,YACF;AAAA,UACF;AAGA,UAAA,MAAMjB,IAAAA,GAAAA,iBAAM,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACnC,UAAA,MAAM,MAAA,GAAS,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAC3E,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,iBAAA,CAAkB,YAAA,EAAc,IAAI,CAAA;AAC1D,UAAA,MAAM,WAAA,GACJ,QAAA,CAAS,MAAA,GAAS,CAAA,IACf,mBAAA,CAAoB,IAAA,CAAK,YAAY,CAAA,IACrC,YAAA,CAAa,IAAA,EAAK,CAAE,MAAA,GAAS,GAAA;AAClC,UAAA,IAAI,UAAA,GAAiC,UAAA,CAAW,MAAA,GAAS,OAAA,GAAU,QAAA;AACnE,UAAA,IAAI,CAAC,UAAA,CAAW,MAAA,IAAU,UAAA,CAAW,oBAAoB,WAAA,EAAa;AACpE,YAAA,UAAA,GAAa,SAAA;AAAA,UACf;AAEA,UAAA,MAAM,IAAA,GAAiB;AAAA,YACrB,EAAA,EAAI,MAAA;AAAA,YACJ,QAAQ,IAAA,CAAK,EAAA;AAAA,YACb,SAAA;AAAA,YACA,MAAM,IAAA,CAAK,IAAA;AAAA,YACX,QAAA;AAAA,YACA,MAAA,EAAQ,UAAA;AAAA,YACR,QAAA,EAAU,YAAA;AAAA,YACV,SAAA,EAAWA,IAAAA;AAAA,YACX,SAAA,EAAWA;AAAA,WACb;AAGA,UAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,YAAA,MAAM,oBAAA,GAAuB,SAAA,CAAU,QAAA,CAAS,IAAA,EAAM,IAAI,CAAA;AAC1D,YAAA,IAAI,CAAC,oBAAA,CAAqB,MAAA,IAAU,EAAE,UAAA,CAAW,oBAAoB,WAAA,CAAA,EAAc;AACjF,cAAA,IAAA,CAAK,MAAA,GAAS,QAAA;AAAA,YAChB;AAAA,UACF;AAGA,UAAA,MAAM,QAAA,GAAW,cAAA,CAAe,kBAAA,CAAmB,SAAS,CAAA;AAC5D,UAAA,MAAM,UAAA,GAAa,cAAA,CAAe,oBAAA,CAAqB,SAAS,CAAA;AAChE,UAAA,MAAMC,QAAAA,CAAG,MAAWiB,MAAA,CAAA,OAAA,CAAQ,QAAQ,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAC1D,UAAA,MAAMjB,QAAAA,CAAG,UAAU,QAAA,EAAU,IAAA,CAAK,UAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAA,EAAG,OAAO,CAAA;AACnE,UAAA,MAAMA,QAAAA,CAAG,SAAA,CAAU,UAAA,EAAY,YAAA,EAAc,OAAO,CAAA;AAGpD,UAAA,IAAI,IAAA,CAAK,MAAA,KAAW,OAAA,IAAW,IAAA,CAAK,WAAW,SAAA,EAAW;AACxD,YAAA,MAAM,QAAA,GAAW,cAAA,CAAe,kBAAA,CAAmB,SAAS,CAAA;AAC5D,YAAA,IAAI;AACF,cAAA,MAAM,QAAA,GAAW,KAAK,KAAA,CAAM,MAAMA,SAAG,QAAA,CAAS,QAAA,EAAU,OAAO,CAAC,CAAA;AAChE,cAAA,QAAA,CAAS,MAAA,GAAS,YAAA;AAClB,cAAA,QAAA,CAAS,SAAA,GAAYD,IAAAA;AACrB,cAAA,MAAMC,QAAAA,CAAG,UAAU,QAAA,EAAU,IAAA,CAAK,UAAU,QAAA,EAAU,IAAA,EAAM,CAAC,CAAA,EAAG,OAAO,CAAA;AAAA,YACzE,CAAA,CAAA,MAAQ;AAAA,YAER;AAAA,UACF;AAEA,UAAA,IAAA,CAAK,KAAK,MAAA,EAAQ;AAAA,YAChB,IAAA,EAAM,iBAAA;AAAA,YACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,YAClC,SAAA;AAAA,YACA,IAAA,EAAM;AAAA,cACJ,KAAA,EAAO,MAAA;AAAA,cACP,QAAA,EAAU,GAAA;AAAA,cACV,OAAA,EAAS,KAAK,MAAA,KAAW,QAAA,GACrB,qCAAqC,UAAA,CAAW,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA,GAChE,eAAe,QAAA,CAAS,MAAM,sBAAsB,IAAA,CAAK,MAAM,YAAY,UAAA,CAAW,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,cAC1G,GAAG,cAAA;AAAe;AACpB,WACD,CAAA;AAED,UAAA,IAAA,CAAK,KAAK,MAAA,EAAQ;AAAA,YAChB,IAAA,EAAM,eAAA;AAAA,YACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,YAClC,SAAA;AAAA,YACA,IAAA,EAAM;AAAA,cACJ,MAAA,EAAQ,IAAA,CAAK,MAAA,KAAW,QAAA,GAAW,OAAA,GAAU,SAAA;AAAA,cAC7C,OAAA,EAAS,IAAA,CAAK,MAAA,KAAW,QAAA,GACrB,kCAAkC,UAAA,CAAW,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA,GAC7D,IAAA,CAAK,MAAA,KAAW,YACd,mDAAA,GACA,sCAAA;AAAA,cACN,GAAG,cAAA;AAAe;AACpB,WACD,CAAA;AAED,UAAA,MAAM,YAAA,GAAe,QAAA,CAAS,MAAA,CAAO,CAAC,GAAA,EAAK,MAAM,GAAA,GAAM,CAAA,CAAE,OAAA,CAAQ,MAAA,EAAQ,CAAC,CAAA;AAC1E,UAAA,MAAM,UAAA,GAAa,KAAK,MAAA,KAAW,QAAA;AAEnC,UAAA,OAAO;AAAA,YACL,SAAS,CAAC,UAAA;AAAA,YACV,OAAA,EAAS,UAAA,GACL,CAAA,gDAAA,EAA8C,UAAA,CAAW,MAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,GACzE,KAAK,MAAA,KAAW,SAAA,GACd,CAAA,oBAAA,EAAuB,QAAA,CAAS,MAAM,CAAA,WAAA,EAAc,YAAY,CAAA,iBAAA,EAAoB,UAAA,CAAW,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,MAC/G,CAAA,YAAA,EAAe,QAAA,CAAS,MAAM,CAAA,WAAA,EAAc,YAAY,CAAA,iBAAA,EAAoB,UAAA,CAAW,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,YAC7G,YAAA,EAAc,CAAC,QAAA,EAAU,UAAU,CAAA;AAAA,YACnC,eAAe,EAAC;AAAA,YAChB,WAAW,UAAA,CAAW,SAAA;AAAA,YACtB,YAAY,UAAA,CAAW,UAAA;AAAA,YACvB,YAAY,UAAA,CAAW,UAAA;AAAA,YACvB,SAAA;AAAA,YACA;AAAA,WACF;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,UAAA,IAAA,CAAK,KAAK,MAAA,EAAQ;AAAA,YAChB,IAAA,EAAM,eAAA;AAAA,YACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,YAClC,SAAA;AAAA,YACA,IAAA,EAAM;AAAA,cACJ,MAAA,EAAQ,OAAA;AAAA,cACR;AAAA;AACF,WACD,CAAA;AACD,UAAA,IAAA,CAAK,KAAK,MAAA,EAAQ;AAAA,YAChB,IAAA,EAAM,WAAA;AAAA,YACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,YAClC,SAAA;AAAA,YACA,SAAA;AAAA,YACA,IAAA,EAAM;AAAA,cACJ,OAAA,EAAS,KAAA;AAAA,cACT,OAAA,EAAS,kBAAA;AAAA,cACT,UAAA,EAAY,CAAA;AAAA,cACZ,UAAA,EAAY,CAAA;AAAA,cACZ,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,OAAA;AAAA,cACzB,cAAc,EAAC;AAAA,cACf,eAAe,EAAC;AAAA,cAChB,UAAA,EAAY;AAAA;AACd,WACD,CAAA;AACD,UAAA,MAAM,KAAA;AAAA,QACR;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAMQ,gBACN,IAAA,EACA,aAAA,EACA,gBACA,0BAAA,EACA,WAAA,EACA,iBACA,iBAAA,EACQ;AACR,QAAA,MAAM,YAAA,GAAe,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,uBAAuB,IAAI,CAAA;AACtE,QAAA,MAAM,2BAA2B,iBAAA,GAC7B;AAAA;AAAA,EAAmC,iBAAiB;AAAA,CAAA,GACpD,EAAA;AAEJ,QAAA,OAAO,CAAA;;AAAA;AAAA,EAGT,YAAY;AAAA,EACZ,wBAAwB;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAAA,EAYhB,aAAa,uBAAuB,WAAW,CAAA;AAAA,sBAAA,EACjC,eAAe,IAAI,WAAW,CAAA;AAAA,8BAAA,EACtB,cAAc,CAAA;AAAA,uCAAA,EACL,0BAA0B,CAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA,oEAAA,CAAA;AAAA,MAiCjE;AAAA,MAEA,MAAc,yBAAA,CACZ,IAAA,EACA,MAAA,EACA,YAAA,EACA,cACA,WAAA,EACiB;AACjB,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,kBAAA,CAAmB,IAAI,CAAA;AAC1C,QAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,UAAA,OAAO,EAAA;AAAA,QACT;AAEA,QAAA,MAAM,UAAoB,EAAC;AAC3B,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,UAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,UAAA,IAAA,CAAK,KAAK,MAAA,EAAQ;AAAA,YAChB,IAAA,EAAM,iBAAA;AAAA,YACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,YAClC,WAAW,IAAA,CAAK,SAAA;AAAA,YAChB,IAAA,EAAM;AAAA,cACJ,KAAA,EAAO,MAAA;AAAA,cACP,UAAU,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAA,GAAM,IAAI,CAAE,CAAA;AAAA,cACnC,OAAA,EAAS,sBAAsB,CAAA,GAAI,CAAC,IAAI,KAAA,CAAM,MAAM,CAAA,EAAA,EAAK,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,cACnE,GAAG,IAAA,CAAK,mBAAA,CAAoB,YAAA,EAAc,WAAW;AAAA;AACvD,WACD,CAAA;AACD,UAAA,IAAI,QAAA,GAAW,EAAA;AACf,UAAA,MAAM,YAAY,IAAA,CAAK,eAAA;AAAA,YACrB;AAAA,cACE,GAAG,MAAA;AAAA,cACH,IAAA,EAAM,MAAA;AAAA,cACN,aAAA,EAAe,CAAA;AAAA,cACf,WAAA,EAAa;AAAA,gBACX,GAAG,MAAA,CAAO,WAAA;AAAA,gBACV,OAAA,EAAS,IAAA;AAAA,gBACT,SAAA,EAAW,aAAa,QAAA,CAAS,IAAA,CAAK,MAAM,YAAA,CAAa,SAAA,GAAY,GAAG,CAAA,EAAG,GAAI,CAAA;AAAA,gBAC/E,cAAA,EAAgB,MAAA,CAAO,WAAA,EAAa,cAAA,IAAkB,IAAA;AAAA,gBACtD,cAAA,EAAgB,MAAA,CAAO,WAAA,EAAa,cAAA,IAAkB,IAAA;AAAA,gBACtD,QAAA,EAAU,MAAA,CAAO,WAAA,EAAa,QAAA,IAAY,IAAA;AAAA,gBAC1C,yBAAA,EAA2B,MAAA,CAAO,WAAA,EAAa,yBAAA,IAA6B,IAAA;AAAA,gBAC5E,mCAAA,EACE,MAAA,CAAO,WAAA,EAAa,mCAAA,IAAuC,IAAA;AAAA,gBAC7D,6BAAA,EAA+B;AAAA,eACjC;AAAA,cACA,OAAA,EAAS,CAAC,KAAA,KAAsB;AAC9B,gBAAA,IAAI,MAAM,IAAA,KAAS,UAAA,IAAc,KAAA,CAAM,IAAA,EAAM,aAAa,QAAA,EAAU;AAClE,kBAAA,MAAM,cAAA,GAAkB,KAAA,CAAM,IAAA,EAAM,QAAA,EAA+C,MAAA;AACnF,kBAAA,MAAM,MAAA,GAAS,OAAO,KAAA,CAAM,IAAA,EAAM,WAAW,QAAA,GAAW,KAAA,CAAM,KAAK,MAAA,GAAS,EAAA;AAC5E,kBAAA,MAAM,MAAA,GAAS,OAAO,cAAA,KAAmB,QAAA,GAAW,cAAA,GAAiB,EAAA;AACrE,kBAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,EAAK,IAAK,OAAO,IAAA,EAAK;AAC9C,kBAAA,IAAI,QAAA,EAAU;AACZ,oBAAA,QAAA,GAAW,QAAA;AAAA,kBACb;AAAA,gBACF;AACA,gBAAA,MAAA,CAAO,UAAU,KAAK,CAAA;AAAA,cACxB;AAAA,aACF;AAAA,YACA;AAAA,WACF;AAEA,UAAA,MAAM,iBAAA,GAAoB,CAAA,EAAG,IAAA,CAAK,MAAM;;AAAA,sBAAA,EAA6B,YAAA,CAAa,SAAS,CAAA,CAAA,EAAI,WAAW,CAAA,qDAAA,CAAA;AAC1G,UAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,OAAA,CAAQ,iBAAiB,CAAA;AACxD,UAAA,YAAA,CAAa,OAAA,CAAQ,OAAO,UAAU,CAAA;AACtC,UAAA,MAAM,IAAA,GAAA,CAAQ,QAAA,IAAY,MAAA,CAAO,OAAA,IAAW,IAAI,IAAA,EAAK;AACrD,UAAA,IAAI,IAAA,EAAM;AACR,YAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,IAAA,EAAO,IAAA,CAAK,KAAK;AAAA,EAAK,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,UAC1D;AAAA,QACF;AAEA,QAAA,OAAO,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,MAC5B;AAAA,MAEQ,mBAAmB,IAAA,EAAyC;AAClE,QAAA,MAAM,QAAiC,EAAC;AACxC,QAAA,MAAM,WAAA,GAAc,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,QAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAK,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAC,CAAC,CAAC,CAAA;AAC/F,QAAA,KAAA,IAAS,CAAA,GAAI,GAAG,CAAA,GAAI,WAAA,CAAY,UAAU,KAAA,CAAM,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AAC/D,UAAA,MAAM,KAAA,GAAQ,YAAY,CAAC,CAAA;AAC3B,UAAA,MAAM,SAAA,GAAY,KAAA,CACf,OAAA,CAAQ,CAAC,KAAA,KAAU,MAAM,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,KAAS,CAAA,EAAA,EAAK,IAAA,CAAK,MAAM,CAAA,CAAE,CAAC,CAAA,CAC5E,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CACX,IAAA,CAAK,IAAI,CAAA;AACZ,UAAA,KAAA,CAAM,IAAA,CAAK;AAAA,YACT,KAAA,EAAO,CAAA,cAAA,EAAiB,CAAA,GAAI,CAAC,CAAA,CAAA;AAAA,YAC7B,MAAA,EAAQ;AAAA,cACN,2CAAA;AAAA,cACA,uEAAA;AAAA,cACA,SAAA,IAAa,4BAAA;AAAA,cACb,EAAA;AAAA,cACA,eAAA;AAAA,cACA,uCAAA;AAAA,cACA,0CAAA;AAAA,cACA,+CAAA;AAAA,cACA,EAAA;AAAA,cACA;AAAA,aACF,CAAE,KAAK,IAAI;AAAA,WACZ,CAAA;AAAA,QACH;AACA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,MAEQ,UAAA,CAAc,OAAY,SAAA,EAA0B;AAC1D,QAAA,IAAI,aAAa,CAAA,EAAG;AAAC,UAAA,OAAO,CAAC,KAAK,CAAA;AAAA,QAAE;AACpC,QAAA,MAAM,SAAgB,EAAC;AACvB,QAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ,KAAK,SAAA,EAAW;AAChD,UAAA,MAAA,CAAO,KAAK,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAA,GAAI,SAAS,CAAC,CAAA;AAAA,QAC3C;AACA,QAAA,OAAO,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,CAAC,KAAK,CAAA;AAAA,MAC5C;AAAA,MAEQ,yBAAA,CAA0B,MAAgB,QAAA,EAA4B;AAC5E,QAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,QAAA,MAAM,QAAA,GAAW,uBAAA;AACjB,QAAA,IAAI,KAAA;AACJ,QAAA,OAAA,CAAQ,KAAA,GAAQ,QAAA,CAAS,IAAA,CAAK,QAAQ,OAAO,IAAA,EAAM;AACjD,UAAA,MAAM,GAAA,GAAM,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AACxB,UAAA,IAAI,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,EAAG;AAAC,YAAA,OAAA,CAAQ,GAAA,CAAI,GAAA,CAAI,IAAA,EAAM,CAAA;AAAA,UAAE;AAAA,QAClD;AAEA,QAAA,MAAM,UAAoB,EAAC;AAC3B,QAAA,KAAA,MAAW,KAAA,IAAS,KAAK,MAAA,EAAQ;AAC/B,UAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAC9B,YAAA,MAAM,MAAM,CAAA,EAAG,KAAA,CAAM,EAAE,CAAA,CAAA,EAAI,KAAK,EAAE,CAAA,CAAA;AAClC,YAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,EAAG;AACrB,cAAA,OAAA,CAAQ,KAAK,CAAA,EAAG,GAAG,CAAA,QAAA,EAAM,IAAA,CAAK,MAAM,CAAA,CAAE,CAAA;AAAA,YACxC;AAAA,UACF;AAAA,QACF;AACA,QAAA,OAAO,OAAA;AAAA,MACT;AAAA,MAEA,MAAc,8BAA8B,KAAA,EAQjB;AACzB,QAAA,IAAI,KAAA,CAAM,cAAA,CAAe,MAAA,KAAW,CAAA,EAAG;AACrC,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,IAAI,QAAA,GAAW,EAAA;AACf,QAAA,MAAM,YAAA,GAAe;AAAA,UACnB,mBAAA;AAAA,UACA,0DAAA;AAAA,UACA,EAAA;AAAA,UACA,qBAAA;AAAA,UACA,KAAA,CAAM,mBAAA;AAAA,UACN,EAAA;AAAA,UACA,8BAAA;AAAA,UACA,GAAG,KAAA,CAAM,cAAA,CAAe,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,KAAS,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE,CAAA;AAAA,UAC9D,EAAA;AAAA,UACA,QAAA;AAAA,UACA,gDAAA;AAAA,UACA,uDAAA;AAAA,UACA,sCAAA;AAAA,UACA,CAAA,kCAAA,EAAqC,KAAA,CAAM,YAAA,CAAa,SAAS,CAAA,oBAAA,CAAA;AAAA,UACjE;AAAA,SACF,CAAE,KAAK,IAAI,CAAA;AAEX,QAAA,MAAM,eAAe,IAAA,CAAK,eAAA;AAAA,UACxB;AAAA,YACE,GAAG,KAAA,CAAM,UAAA;AAAA,YACT,IAAA,EAAM,MAAA;AAAA,YACN,aAAA,EAAe,CAAA;AAAA,YACf,WAAA,EAAa;AAAA,cACX,GAAG,MAAM,UAAA,CAAW,WAAA;AAAA,cACpB,OAAA,EAAS,IAAA;AAAA,cACT,SAAA,EAAW,KAAA,CAAM,YAAA,CAAa,QAAA,CAAS,KAAK,GAAA,CAAI,GAAA,EAAO,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,WAAA,GAAc,GAAG,CAAC,GAAG,GAAI,CAAA;AAAA,cACjG,QAAA,EAAU,IAAA;AAAA,cACV,yBAAA,EAA2B,IAAA;AAAA,cAC3B,6BAAA,EAA+B;AAAA,aACjC;AAAA,YACA,OAAA,EAAS,CAAC,KAAA,KAAsB;AAC9B,cAAA,IAAI,MAAM,IAAA,KAAS,UAAA,IAAc,KAAA,CAAM,IAAA,EAAM,aAAa,QAAA,EAAU;AAClE,gBAAA,MAAM,cAAA,GAAkB,KAAA,CAAM,IAAA,EAAM,QAAA,EAA+C,MAAA;AACnF,gBAAA,MAAM,MAAA,GAAS,OAAO,KAAA,CAAM,IAAA,EAAM,WAAW,QAAA,GAAW,KAAA,CAAM,KAAK,MAAA,GAAS,EAAA;AAC5E,gBAAA,MAAM,MAAA,GAAS,OAAO,cAAA,KAAmB,QAAA,GAAW,cAAA,GAAiB,EAAA;AACrE,gBAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,EAAK,IAAK,OAAO,IAAA,EAAK;AAC9C,gBAAA,IAAI,QAAA,EAAU;AACZ,kBAAA,QAAA,GAAW,QAAA;AAAA,gBACb;AAAA,cACF;AACA,cAAA,KAAA,CAAM,UAAA,CAAW,UAAU,KAAK,CAAA;AAAA,YAClC;AAAA,WACF;AAAA,UACA,KAAA,CAAM;AAAA,SACR;AAEA,QAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,OAAA,CAAQ,YAAY,CAAA;AACtD,QAAA,KAAA,CAAM,YAAA,CAAa,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA;AAC5C,QAAA,MAAM,MAAA,GAAA,CAAU,QAAA,IAAY,MAAA,CAAO,OAAA,IAAW,IAAI,IAAA,EAAK;AACvD,QAAA,OAAO,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,IAAA;AAAA,MACtC;AAAA,MAEQ,uBAAA,CAAwB,YAAyB,IAAA,EAIvD;AACA,QAAA,MAAM,QAAA,GAAW,iCAAA,CAAkC,IAAA,IAAQ,EAAC;AAC5D,QAAA,MAAM,iBAAA,GAAoB,SAAS,UAAA,IAAc,CAAA;AACjD,QAAA,MAAM,kBAAA,GAAqB,SAAS,WAAA,IAAe,GAAA;AACnD,QAAA,MAAM,oBAAA,GAAuB,SAAS,aAAA,IAAiB,IAAA;AACvD,QAAA,MAAM,4BAAA,GAA+B,SAAS,qBAAA,IAAyB,GAAA;AACvE,QAAA,MAAM,uBAAA,GAA0B,SAAS,gBAAA,IAAoB,IAAA;AAC7D,QAAA,MAAM,cAAA,GAAiB,SAAS,OAAA,IAAW,IAAA;AAC3C,QAAA,MAAM,MAAA,GAAS,WAAW,WAAA,EAAa,IAAA;AACvC,QAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,cAAA;AACnC,QAAA,MAAM,mBAAA,GAAsB,IAAA,CAAK,kBAAA,CAAmB,IAAI,CAAA;AAExD,QAAA,IAAI,CAAC,OAAA,EAAS;AACZ,UAAA,OAAO;AAAA,YACL,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,GAAA,EAAQ,sBAAsB,CAAC,CAAA;AAAA,YACnD,qBAAA,EAAuB,4BAAA;AAAA,YACvB,gBAAA,EAAkB;AAAA,WACpB;AAAA,QACF;AAEA,QAAA,MAAM,aAAa,IAAA,CAAK,WAAA,CAAY,QAAQ,UAAA,EAAY,iBAAA,EAAmB,KAAK,CAAC,CAAA;AACjF,QAAA,MAAM,cAAc,IAAA,CAAK,QAAA,CAAS,QAAQ,WAAA,EAAa,kBAAA,EAAoB,KAAQ,GAAS,CAAA;AAC5F,QAAA,MAAM,gBAAgB,IAAA,CAAK,QAAA,CAAS,QAAQ,aAAA,EAAe,oBAAA,EAAsB,aAAa,GAAS,CAAA;AACvG,QAAA,MAAM,wBAAwB,IAAA,CAAK,WAAA;AAAA,UACjC,MAAA,EAAQ,qBAAA;AAAA,UACR,4BAAA;AAAA,UACA,GAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,KAAA,CAAM,mBAAA,GAAsB,UAAU,CAAA;AAClE,QAAA,MAAM,SAAA,GAAY,KAAK,GAAA,CAAI,WAAA,EAAa,KAAK,GAAA,CAAI,aAAA,EAAe,cAAc,CAAC,CAAA;AAE/E,QAAA,OAAO;AAAA,UACL,SAAA;AAAA,UACA,qBAAA;AAAA,UACA,gBAAA,EAAkB,QAAQ,gBAAA,IAAoB;AAAA,SAChD;AAAA,MACF;AAAA,MAEQ,qBAAA,CAAsB,MAAgB,SAAA,EAA2B;AACvE,QAAA,MAAM,cAAc,IAAA,CAAK,GAAA,CAAI,IAAI,IAAA,CAAK,MAAA,CAAO,SAAS,EAAE,CAAA;AACxD,QAAA,MAAM,WAAA,GAAc,IAAA,CAAK,IAAA,CAAK,SAAA,GAAY,GAAI,CAAA;AAC9C,QAAA,OAAO,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,WAAW,CAAC,CAAC,CAAA;AAAA,MACvE;AAAA,MAEQ,mBAAmB,IAAA,EAAwB;AACjD,QAAA,MAAM,QAAA,GAAA,CAAY,IAAA,CAAK,QAAA,IAAY,EAAA,EAAI,IAAA,EAAK;AAC5C,QAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,UAAA,OAAO,IAAA,CAAK,IAAI,GAAA,EAAO,IAAA,CAAK,KAAK,QAAA,CAAS,MAAA,GAAS,CAAC,CAAC,CAAA;AAAA,QACvD;AAEA,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,CAAC,GAAA,EAAK,KAAA,KAAU,GAAA,GAAM,KAAA,CAAM,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAA;AAChF,QAAA,MAAM,UAAA,GAAc,KAAK,IAAA,CAAK,MAAA,GAAS,IAAM,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,IAAA,GAAS,SAAA,GAAY,GAAA;AACvF,QAAA,OAAO,KAAK,GAAA,CAAI,GAAA,EAAO,KAAK,IAAA,CAAK,UAAA,GAAa,CAAC,CAAC,CAAA;AAAA,MAClD;AAAA,MAEQ,WAAA,CAAY,KAAA,EAA2B,QAAA,EAAkB,GAAA,EAAa,GAAA,EAAqB;AACjG,QAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AACxD,UAAA,OAAO,QAAA;AAAA,QACT;AACA,QAAA,OAAO,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,CAAC,CAAA;AAAA,MAC3C;AAAA,MAEQ,QAAA,CAAS,KAAA,EAA2B,QAAA,EAAkB,GAAA,EAAa,GAAA,EAAqB;AAC9F,QAAA,MAAM,OAAO,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO,QAAA,EAAU,KAAK,GAAG,CAAA;AACvD,QAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,MACxB;AAAA,MAEQ,wBAAA,CAAyB,IAAA,EAAgB,SAAA,EAAqB,WAAA,EAA6B;AACjG,QAAA,MAAM,WAAA,GAAc,KAAA,CAAM,IAAA,CAAK,IAAI,GAAA,CAAI,SAAA,CAAU,MAAA,CAAO,OAAO,CAAC,CAAC,CAAA,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AAC9E,QAAA,MAAM,SAAA,GAAY,WAAA,CAAY,MAAA,GAAS,CAAA,GACnC,YAAY,GAAA,CAAI,CAAC,IAAA,KAAS,CAAA,IAAA,EAAO,IAAI,CAAA,EAAA,CAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,GACpD,qCAAA;AACJ,QAAA,MAAM,aAAa,IAAA,CAAK,MAAA,CAAO,IAAI,CAAC,KAAA,EAAO,QAAQ,CAAA,EAAA,EAAK,GAAA,GAAM,CAAC,CAAA,EAAA,EAAK,KAAA,CAAM,IAAI,CAAA,IAAA,EAAO,KAAA,CAAM,EAAE,CAAA,GAAA,CAAK,CAAA,CAAE,KAAK,IAAI,CAAA;AAE7G,QAAA,OAAO;AAAA,UACL,CAAA,kBAAA,EAAqB,KAAK,IAAI,CAAA,CAAA;AAAA,UAC9B,EAAA;AAAA,UACA,sBAAA;AAAA,UACA,iBAAA;AAAA,UACA,yBAAA;AAAA,UACA,qCAAA;AAAA,UACA,2BAAA;AAAA,UACA,EAAA;AAAA,UACA,SAAA;AAAA,UACA,CAAA,WAAA,EAAc,KAAK,EAAE,CAAA,EAAA,CAAA;AAAA,UACrB,gDAAgD,WAAW,CAAA,gBAAA,CAAA;AAAA,UAC3D,EAAA;AAAA,UACA,aAAA;AAAA,UACA,mBAAA;AAAA,UACA,UAAA;AAAA,UACA,EAAA;AAAA,UACA,sGAAA;AAAA,UACA,EAAA;AAAA,UACA,mBAAA;AAAA,UACA,SAAA;AAAA,UACA,EAAA;AAAA,UACA,cAAA;AAAA,UACA,oFAAA;AAAA,UACA,wCAAA;AAAA,UACA;AAAA,SACF,CAAE,KAAK,IAAI,CAAA;AAAA,MACb;AAAA,MAEQ,uBAAuB,IAAA,EAAwB;AACrD,QAAA,MAAM,QAAkB,CAAC,CAAA,EAAA,EAAK,IAAA,CAAK,IAAI,IAAI,EAAE,CAAA;AAC7C,QAAA,KAAA,MAAW,KAAA,IAAS,KAAK,MAAA,EAAQ;AAC/B,UAAA,KAAA,CAAM,IAAA,CAAK,CAAA,GAAA,EAAM,KAAA,CAAM,IAAI,CAAA,CAAE,CAAA;AAC7B,UAAA,KAAA,CAAM,IAAA,CAAK,MAAM,WAAW,CAAA;AAC5B,UAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAC9B,YAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,IAAA,CAAK,MAAM,CAAA,CAAE,CAAA;AAAA,UAC/B;AACA,UAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,QACf;AACA,QAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,MACxB;AAAA;AAAA;AAAA;AAAA,MAMA,iBAAA,CAAkB,UAAkB,IAAA,EAA+B;AACjE,QAAA,MAAM,IAAA,GAAA,CAAQ,QAAA,IAAY,EAAA,EAAI,IAAA,EAAK;AACnC,QAAA,IAAI,CAAC,IAAA,EAAM;AAAC,UAAA,OAAO,EAAC;AAAA,QAAE;AAEtB,QAAA,MAAM,WAA0B,EAAC;AAEjC,QAAA,MAAM,QAAA,GAAW,8BAAA;AACjB,QAAA,MAAM,UAAqF,EAAC;AAE5F,QAAA,IAAI,KAAA;AACJ,QAAA,OAAA,CAAQ,KAAA,GAAQ,QAAA,CAAS,IAAA,CAAK,IAAI,OAAO,IAAA,EAAM;AAC7C,UAAA,MAAM,GAAA,GAAM,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AACxB,UAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,EAAG,MAAK,IAAK,EAAA;AAClC,UAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA;AAC3B,UAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,YACX,OAAO,KAAA,CAAM,KAAA;AAAA,YACb,OAAA,EAAS,KAAA,CAAM,CAAC,CAAA,IAAK,GAAA;AAAA,YACrB,MAAA,EAAQ,MAAM,CAAC,CAAA;AAAA,YACf;AAAA,WACD,CAAA;AAAA,QACH;AAEA,QAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAAC,UAAA,OAAO,EAAC;AAAA,QAAE;AAGrC,QAAA,MAAM,QAAA,uBAAe,GAAA,EAAyB;AAE9C,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,UAAA,MAAM,CAAA,GAAI,QAAQ,CAAC,CAAA;AACnB,UAAA,MAAM,UAAU,OAAA,CAAQ,CAAA,GAAI,CAAC,CAAA,EAAG,SAAS,IAAA,CAAK,MAAA;AAC9C,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,OAAO,OAAO,CAAA;AAEzC,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,gBAAA,CAAiB,KAAK,CAAA;AAC1C,UAAA,IAAI,CAAC,MAAA,EAAQ;AAAC,YAAA;AAAA,UAAS;AAEvB,UAAA,IAAI,OAAA,GAAU,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,OAAO,CAAA;AACpC,UAAA,IAAI,CAAC,OAAA,EAAS;AACZ,YAAA,MAAM,SAAA,GAAY,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,CAAA,CAAE,OAAO,CAAA;AAC5D,YAAA,OAAA,GAAU;AAAA,cACR,aAAa,CAAA,CAAE,OAAA;AAAA,cACf,KAAA,EAAO,SAAA,EAAW,IAAA,IAAQ,CAAA,CAAE,SAAS,CAAA,CAAE,OAAA;AAAA,cACvC,WAAA,EAAa,WAAW,WAAA,IAAe,EAAA;AAAA,cACvC,SAAS;AAAC,aACZ;AACA,YAAA,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,OAAA,EAAS,OAAO,CAAA;AAAA,UACjC;AAEA,UAAA,OAAA,CAAQ,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,QAC7B;AAEA,QAAA,QAAA,CAAS,IAAA,CAAK,GAAG,QAAA,CAAS,MAAA,EAAQ,CAAA;AAClC,QAAA,OAAO,QAAA;AAAA,MACT;AAAA,MAEQ,iBAAiB,KAAA,EAAkC;AAEzD,QAAA,MAAM,SAAA,GAAY,2BAAA,CAA4B,IAAA,CAAK,KAAK,CAAA;AACxD,QAAA,IAAI,CAAC,SAAA,GAAY,CAAC,CAAA,EAAG;AAAC,UAAA,OAAO,IAAA;AAAA,QAAK;AAClC,QAAA,MAAM,IAAA,GAAO,UAAU,CAAC,CAAA;AAGxB,QAAA,MAAM,SAAA,GAAY,mCAAA,CAAoC,IAAA,CAAK,KAAK,CAAA;AAChE,QAAA,MAAM,SAAA,GAAY,SAAA,GAAY,CAAC,CAAA,EAAG,MAAK,IAAK,EAAA;AAG5C,QAAA,MAAM,aAAa,CAAC,GAAG,KAAA,CAAM,QAAA,CAAS,0BAA0B,CAAC,CAAA;AACjE,QAAA,MAAM,gBAAgB,UAAA,CAAW,CAAC,IAAI,CAAC,CAAA,EAAG,SAAQ,IAAK,EAAA;AACvD,QAAA,MAAM,eAAe,UAAA,CAAW,CAAC,IAAI,CAAC,CAAA,EAAG,SAAQ,IAAK,EAAA;AAGtD,QAAA,MAAM,QAAA,GAAW,sBAAA,CAAuB,IAAA,CAAK,KAAK,CAAA;AAClD,QAAA,MAAM,WAAA,GAAc,QAAA,GAAW,CAAC,CAAA,EAAG,MAAK,IAAK,EAAA;AAE7C,QAAA,OAAO;AAAA,UACL,IAAA;AAAA,UACA,SAAA;AAAA,UACA,MAAA,EAAQ,aAAA;AAAA,UACR,KAAA,EAAO,YAAA;AAAA,UACP;AAAA,SACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAMQ,eAAA,CAAgB,QAAqB,YAAA,EAA0C;AACrF,QAAA,OAAO,IAAIe,UAAS,CACjB,QAAA,CAAS,mBAAmB,YAAY,CAAC,CAAA,CACzC,YAAA,CAAa,MAAM,CAAA;AAAA,MACxB;AAAA;AAAA;AAAA;AAAA,MAMQ,IAAA,CAAK,QAAqB,KAAA,EAAyB;AACzD,QAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AAAC,UAAA;AAAA,QAAO;AAC7B,QAAA,MAAA,CAAO,OAAA,CAAQ;AAAA,UACb,GAAG,KAAA;AAAA,UACH,SAAS,MAAA,CAAO,OAAA;AAAA,UAChB,eAAe,MAAA,CAAO;AAAA,SACvB,CAAA;AAAA,MACH;AAAA,MAEQ,mBAAA,CAAoB,cAAiC,WAAA,EAI3D;AACA,QAAA,OAAO;AAAA,UACL,kBAAkB,YAAA,CAAa,IAAA;AAAA,UAC/B,uBAAuB,YAAA,CAAa,SAAA;AAAA,UACpC,iBAAA,EAAmB;AAAA,SACrB;AAAA,MACF;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC95BA,IAAA,qBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,qBAAA,EAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,0BAAA,EAAA,MAAA,0BAAA;AAAA,EAAA,YAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AA+JA,eAAsB,2BAA2B,IAAA,EAAoC;AACnF,EAAA,OAAO,YAAA,CAAa,IAAI,IAAI,CAAA;AAC9B;AAjKA,IAyCa,YAAA,CAAA,CAgHA;AAzJb,IAAA,kBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,4BAAA,GAAA;AAyCO,IAAM,eAAN,MAAmB;AAAA,MACP,aAAA,uBAAoB,GAAA,EAA8B;AAAA,MAEnE,WAAA,GAAc;AACZ,QAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,MACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,QAAA,CAAS,IAAA,EAAc,OAAA,EAA6B,OAAA,GAA2B,EAAC,EAAS;AACvF,QAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,IAAA,OAAW,EAAA,EAAI;AAC/B,UAAA,MAAM,IAAI,MAAM,oDAAoD,CAAA;AAAA,QACtE;AAEA,QAAA,IAAI,KAAK,aAAA,CAAc,GAAA,CAAI,IAAI,CAAA,IAAK,CAAC,QAAQ,QAAA,EAAU;AACrD,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,uBAAuB,IAAI,CAAA,8DAAA;AAAA,WAE7B;AAAA,QACF;AAEA,QAAA,IAAA,CAAK,aAAA,CAAc,IAAI,IAAA,EAAM;AAAA,UAC3B,IAAA;AAAA,UACA,OAAA;AAAA,UACA,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH;AAAA;AAAA;AAAA;AAAA,MAKA,IAAI,IAAA,EAAuB;AACzB,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,IAAI,CAAA;AAAA,MACpC;AAAA;AAAA;AAAA;AAAA,MAKA,IAAA,GAAiB;AACf,QAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,MAAM,CAAA;AAAA,MAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,MAAM,IAAI,IAAA,EAAoC;AAC5C,QAAA,MAAM,YAAA,GAAe,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,IAAI,CAAA;AAEhD,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,OAAO,aAAa,OAAA,EAAQ;AAAA,QAC9B;AAGA,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,SAAS,CAAA;AACjD,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,OAAO,SAAS,OAAA,EAAQ;AAAA,QAC1B;AAEA,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,IAAI,CAAA,oDAAA,CAAsD,CAAA;AAAA,MACnG;AAAA;AAAA,MAIQ,gBAAA,GAAyB;AAC/B,QAAA,MAAM,QAAA,GAAgD;AAAA,UACpD,CAAC,WAAW,YAAY;AACtB,YAAA,MAAM,EAAE,kBAAA,EAAAG,mBAAAA,EAAmB,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,yBAAA,EAAA,EAAA,4BAAA,CAAA,CAAA;AACrC,YAAA,OAAO,IAAIA,mBAAAA,EAAmB;AAAA,UAChC,CAAC,CAAA;AAAA,UACD,CAAC,QAAQ,YAAY;AACnB,YAAA,MAAM,EAAE,eAAA,EAAAC,gBAAAA,EAAgB,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,sBAAA,EAAA,EAAA,yBAAA,CAAA,CAAA;AAClC,YAAA,OAAO,IAAIA,gBAAAA,EAAgB;AAAA,UAC7B,CAAC,CAAA;AAAA,UACD,CAAC,QAAQ,YAAY;AACnB,YAAA,MAAM,EAAE,eAAA,EAAAC,gBAAAA,EAAgB,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,sBAAA,EAAA,EAAA,yBAAA,CAAA,CAAA;AAClC,YAAA,OAAO,IAAIA,gBAAAA,EAAgB;AAAA,UAC7B,CAAC,CAAA;AAAA,UACD,CAAC,SAAS,YAAY;AACpB,YAAA,MAAM,EAAE,gBAAA,EAAAC,iBAAAA,EAAiB,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,uBAAA,EAAA,EAAA,0BAAA,CAAA,CAAA;AACnC,YAAA,OAAO,IAAIA,iBAAAA,EAAiB;AAAA,UAC9B,CAAC;AAAA,SACH;AAGA,QAAA,QAAA,CAAS,IAAA,CAAK,CAAC,MAAA,EAAQ,YAAY;AACjC,UAAA,MAAM,EAAE,eAAA,EAAAC,gBAAAA,EAAgB,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,sBAAA,EAAA,EAAA,yBAAA,CAAA,CAAA;AAClC,UAAA,OAAO,IAAIA,gBAAAA,EAAgB;AAAA,QAC7B,CAAC,CAAC,CAAA;AAEF,QAAA,KAAA,MAAW,CAAC,IAAA,EAAM,OAAO,CAAA,IAAK,QAAA,EAAU;AACtC,UAAA,IAAA,CAAK,aAAA,CAAc,IAAI,IAAA,EAAM,EAAE,MAAM,OAAA,EAAS,OAAA,EAAS,MAAM,CAAA;AAAA,QAC/D;AAAA,MACF;AAAA,KACF;AAWO,IAAM,YAAA,GAAe,IAAI,YAAA,EAAa;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACzJ7C,IAAA,oBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,oBAAA,EAAA;AAAA,EAAA,cAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAqBA,eAAsB,eAAe,UAAA,EAA+C;AAClF,EAAA,MAAM,IAAA,GAAO,YAAY,IAAA,IAAQ,SAAA;AACjC,EAAA,MAAM,EAAE,YAAA,EAAAC,aAAAA,EAAa,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,kBAAA,EAAA,EAAA,qBAAA,CAAA,CAAA;AAC/B,EAAA,OAAOA,aAAAA,CAAa,IAAI,IAAI,CAAA;AAC9B;AAzBA,IAAA,iBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,2BAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACIA,oBAAA,EAAA;;;ACIA,mBAAA,EAAA;AAuDO,IAAM,gBAAN,MAAoB;AAAA;AAAA;AAAA;AAAA,EAIzB,MAAM,SAAS,MAAA,EAYO;AACpB,IAAA,MAAM,YAAA,GAAwB,OAAO,IAAA,IAAQ,OAAA;AAC7C,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,EAAE,IAAA,EAAM,cAAc,CAAA;AACzC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAAA,IACzD;AAEA,IAAA,IAAI,CAAC,IAAI,aAAA,EAAe;AACtB,MAAA,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAAA,IAC5D;AAEA,IAAA,MAAM,kBAAkB,IAAA,CAAK,oBAAA,CAAqB,MAAA,CAAO,IAAA,EAAM,OAAO,YAAY,CAAA;AAGlF,IAAA,MAAM,YAAA,GAAe,KAAK,kBAAA,EAAmB;AAC7C,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,IAAI,CAAA;AACrD,IAAA,MAAM,QAAA,GAAW,iBAAiB,wBAAA,GAC9B,IAAA,CAAK,uBAAuB,eAAe,CAAA,GAC3C,IAAA,CAAK,cAAA,CAAe,eAAe,CAAA;AAGvC,IAAA,MAAM,KAAA,GAAmB,CAAC,YAAA,EAAc,QAAQ,CAAA;AAGhD,IAAA,IAAI,OAAO,YAAA,EAAc;AACvB,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,gBAAA,CAAiB,MAAA,CAAO,YAAY,CAAA;AAC/D,MAAA,KAAA,CAAM,IAAA,CAAK,GAAG,aAAa,CAAA;AAAA,IAC7B;AAEA,IAAA,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,UAAA,EAAY,oCAAoC,CAAA;AACxE,IAAA,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ,iBAAA,EAAmB,EAAA,EAAI,4BAA4B,CAAA;AAE7E,IAAA,MAAM,kBAAkB,MAAA,CAAO,eAAA,IAC1B,MAAM,IAAA,CAAK,sBAAA,CAAuB,KAAK,KAAA,EAAO;AAAA,MAC/C,GAAG,MAAA;AAAA,MACH,IAAA,EAAM;AAAA,KACP,CAAA;AAEH,IAAA,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ,iBAAA,EAAmB,EAAA,EAAI,0BAA0B,CAAA;AAE3E,IAAA,MAAM,eAAe,IAAA,CAAK,iBAAA;AAAA,MACxB,MAAA,CAAO,IAAA;AAAA,MACP,MAAA,CAAO,IAAA;AAAA,MACP,MAAA,CAAO,UAAA;AAAA,MACP,eAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,MAAM,kBAAA,GAAqB;AAAA,MACzB,EAAE,IAAA,EAAM,QAAA,EAAmB,OAAA,EAAS,YAAA,EAAa;AAAA,MACjD,EAAE,IAAA,EAAM,MAAA,EAAiB,SAAS,CAAA,+BAAA,EAAkC,MAAA,CAAO,IAAI,CAAA,CAAA;AAAG,KACpF;AACA,IAAA,MAAM,iBAAA,GAAoB;AAAA,MACxB,KAAA;AAAA,MACA,WAAA,EAAa,GAAA;AAAA,MACb,UAAA,EAAY,EAAE,IAAA,EAAM,UAAA,EAAqB,UAAU,EAAE,IAAA,EAAM,cAAa;AAAE,KAC5E;AAGA,IAAA,MAAM,QAAA,GAAW,KAAK,GAAA,EAAI;AAC1B,IAAA,IAAA,CAAK,UAAU,MAAA,EAAQ;AAAA,MACrB,IAAA,EAAM,WAAA;AAAA,MACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,YAAA;AAAA,QACN,cAAc,kBAAA,CAAmB;AAAA;AACnC,KACD,CAAA;AACD,IAAA,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,UAAA,EAAY,0CAA0C,CAAA;AAE9E,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,aAAA,CAAc,YAAY,CAAA;AACtD,IAAA,IAAA,CAAK,UAAU,MAAA,EAAQ;AAAA,MACrB,IAAA,EAAM,YAAA;AAAA,MACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,UAAA,EAAY,cAAA;AAAA,MACZ,IAAA,EAAM;AAAA,QACJ,QAAA,EAAU,YAAA;AAAA,QACV,KAAA,EAAO;AAAA,UACL,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,YAAY,MAAA,CAAO;AAAA;AACrB;AACF,KACD,CAAA;AAED,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAAM,GAAA,CAAI,aAAA;AAAA,QACnB,kBAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,UAAU,MAAA,EAAQ;AAAA,QACrB,IAAA,EAAM,YAAA;AAAA,QACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAClC,WAAW,MAAA,CAAO,SAAA;AAAA,QAClB,UAAA,EAAY,cAAA;AAAA,QACZ,IAAA,EAAM;AAAA,UACJ,QAAA,EAAU,YAAA;AAAA,UACV,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA;AAC9D,OACD,CAAA;AACD,MAAA,MAAM,KAAA;AAAA,IACR;AAEA,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,EAAI,GAAI,QAAA;AAClC,IAAA,IAAA,CAAK,UAAU,MAAA,EAAQ;AAAA,MACrB,IAAA,EAAM,SAAA;AAAA,MACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,SAAA,EAAW,IAAI,IAAA,CAAK,QAAQ,EAAE,WAAA,EAAY;AAAA,MAC1C,IAAA,EAAM;AAAA,QACJ,UAAA,EAAY,IAAA,CAAK,aAAA,CAAc,QAAQ,CAAA;AAAA,QACvC,UAAA,EAAY,YAAA;AAAA,QACZ,cAAc,OAAA,CAAQ,QAAA,CAAS,aAAa,QAAA,CAAS,SAAA,CAAU,SAAS,CAAC;AAAA;AAC3E,KACD,CAAA;AACD,IAAA,IAAA,CAAK,aAAa,MAAA,EAAQ;AAAA,MACxB,SAAA,EAAW,CAAA;AAAA,MACX,KAAA;AAAA,MACA,aAAa,iBAAA,CAAkB,WAAA;AAAA,MAC/B,QAAA;AAAA,MACA,WAAA,EAAa,QAAA;AAAA,MACb,WAAW,QAAA,GAAW;AAAA,KACvB,CAAA;AAGD,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI,QAAA,CAAS,SAAA,IAAa,QAAA,CAAS,SAAA,CAAU,SAAS,CAAA,EAAG;AACvD,MAAA,MAAM,QAAA,GAAW,SAAS,SAAA,CAAU,IAAA,CAAK,CAAC,EAAA,KAAyC,EAAA,CAAG,SAAS,YAAY,CAAA;AAC3G,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,QAAA,GAAW,QAAA,CAAS,KAAA;AAAA,MACtB;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,IAAA,CAAK,UAAU,MAAA,EAAQ;AAAA,QACrB,IAAA,EAAM,YAAA;AAAA,QACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAClC,WAAW,MAAA,CAAO,SAAA;AAAA,QAClB,UAAA,EAAY,cAAA;AAAA,QACZ,IAAA,EAAM;AAAA,UACJ,QAAA,EAAU,YAAA;AAAA,UACV,KAAA,EAAO,gCAAgC,YAAY,CAAA,WAAA;AAAA;AACrD,OACD,CAAA;AACD,MAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,IAC9D;AAEA,IAAA,MAAM,aAAA,GAAgB,OAAQ,QAAA,CAA+B,QAAA,KAAa,YACpE,QAAA,CAA+B,QAAA,CAAU,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA;AAC/D,IAAA,IAAI,cAAA,GAAqF,IAAA;AACzF,IAAA,IAAI,WAAA,GAAc,KAAA;AAClB,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,sBAAA,CAAwB,QAAA,CAA+B,YAAY,EAAE,CAAA;AACpG,MAAA,cAAA,GAAiB,iBAAA;AACjB,MAAA,IAAI,iBAAA,CAAkB,YAAA,CAAa,MAAA,GAAS,CAAA,EAAG;AAC7C,QAAA,MAAM,gBAAA,GAAmB,QAAA;AACzB,QAAA,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,UAAA,EAAY,yEAAyE,CAAA;AAC7G,QAAA,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ,iBAAA,EAAmB,EAAA,EAAI,wDAAwD,CAAA;AACzG,QAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,iCAAA,CAAkC;AAAA,UAC7D,GAAA;AAAA,UACA,KAAA;AAAA,UACA,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,YAAY,MAAA,CAAO,UAAA;AAAA,UACnB,eAAA;AAAA,UACA,QAAQ,iBAAA,CAAkB,MAAA;AAAA,UAC1B,WAAW,MAAA,CAAO,SAAA;AAAA,UAClB,SAAS,MAAA,CAAO,OAAA;AAAA,UAChB,SAAS,MAAA,CAAO,OAAA;AAAA,UAChB,eAAe,MAAA,CAAO,aAAA;AAAA,UACtB,IAAA,EAAM,YAAA;AAAA,UACN,YAAA;AAAA,UACA;AAAA,SACD,CAAA;AACD,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,sBAAA,CAAuB,SAAA,CAAU,YAAY,EAAE,CAAA;AAC5E,UAAA,MAAM,cAAA,GAAiB,eAAA,CAAgB,YAAA,CAAa,MAAA,GAAS,kBAAkB,YAAA,CAAa,MAAA;AAC5F,UAAA,MAAM,aAAA,GAAgB,eAAA,CAAgB,KAAA,IAAU,iBAAA,CAAkB,KAAA,GAAQ,IAAA;AAC1E,UAAA,IAAI,eAAA,CAAgB,YAAA,CAAa,MAAA,KAAW,CAAA,IAAM,kBAAkB,aAAA,EAAgB;AAClF,YAAA,QAAA,GAAW,SAAA;AACX,YAAA,cAAA,GAAiB,eAAA;AACjB,YAAA,WAAA,GAAc,IAAA;AAAA,UAChB,CAAA,MAAO;AACL,YAAA,QAAA,GAAW,gBAAA;AACX,YAAA,cAAA,GAAiB,iBAAA;AACjB,YAAA,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,UAAA,EAAY,gEAAgE,CAAA;AAAA,UACtG;AAAA,QACF;AAAA,MACF,CAAA,MAAA,IAAW,iBAAA,CAAkB,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAC9C,QAAA,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,UAAA,EAAY,iEAAiE,CAAA;AAAA,MACvG;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,iBAAA,CAAkB,MAAA,CAAO,MAAM,QAA6B,CAAA;AACjF,MAAA,cAAA,GAAiB,OAAA;AACjB,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,MAAM,OAAO,CAAA;AAC7D,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,MAAM,gBAAA,GAAmB,QAAA;AACzB,QAAA,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,UAAA,EAAY,8EAA8E,CAAA;AAClH,QAAA,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ,iBAAA,EAAmB,EAAA,EAAI,0DAA0D,CAAA;AAC3G,QAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,iCAAA,CAAkC;AAAA,UAC7D,GAAA;AAAA,UACA,KAAA;AAAA,UACA,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,YAAY,MAAA,CAAO,UAAA;AAAA,UACnB,eAAA;AAAA,UACA,QAAQ,OAAA,CAAQ,MAAA;AAAA,UAChB,WAAW,MAAA,CAAO,SAAA;AAAA,UAClB,SAAS,MAAA,CAAO,OAAA;AAAA,UAChB,SAAS,MAAA,CAAO,OAAA;AAAA,UAChB,eAAe,MAAA,CAAO,aAAA;AAAA,UACtB,IAAA,EAAM,YAAA;AAAA,UACN,YAAA;AAAA,UACA;AAAA,SACD,CAAA;AACD,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,MAAM,YAAA,GAAe,IAAA,CAAK,iBAAA,CAAkB,MAAA,CAAO,MAAM,SAAS,CAAA;AAClE,UAAA,IAAI,aAAa,KAAA,IAAS,OAAA,CAAQ,SAAS,YAAA,CAAa,YAAA,CAAa,WAAW,CAAA,EAAG;AACjF,YAAA,QAAA,GAAW,SAAA;AACX,YAAA,cAAA,GAAiB,YAAA;AACjB,YAAA,WAAA,GAAc,IAAA;AAAA,UAChB,CAAA,MAAO;AACL,YAAA,QAAA,GAAW,gBAAA;AACX,YAAA,cAAA,GAAiB,OAAA;AACjB,YAAA,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,UAAA,EAAY,mEAAmE,CAAA;AAAA,UACzG;AAAA,QACF;AAAA,MACF,CAAA,MAAA,IAAW,OAAA,CAAQ,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AACpC,QAAA,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,UAAA,EAAY,wDAAwD,CAAA;AAAA,MAC9F;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,UAAU,MAAA,EAAQ;AAAA,MACrB,IAAA,EAAM,UAAA;AAAA,MACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,UAAA,EAAY,cAAA;AAAA,MACZ,SAAA,EAAW,IAAI,IAAA,CAAK,QAAQ,EAAE,WAAA,EAAY;AAAA,MAC1C,IAAA,EAAM;AAAA,QACJ,QAAA,EAAU,YAAA;AAAA,QACV,OAAA,EAAS,IAAA;AAAA,QACT,UAAA,EAAY,YAAA;AAAA,QACZ,MAAA,EAAQ,6BAAA;AAAA,QACR,QAAA,EAAU;AAAA,UACR,UAAA,EAAY;AAAA,YACV,UAAA,EAAY,MAAM,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,GAAI,QAAA,CAAS,OAAO,MAAA,GAAS,CAAA;AAAA,YACtE,YAAY,QAAA,CAAS,UAAA;AAAA,YACrB,WAAA;AAAA,YACA,wBAAA,EAA0B,KAAA;AAAA,YAC1B,YAAA,EAAc,gBAAgB,KAAA,IAAS,IAAA;AAAA,YACvC,aAAA,EAAe,cAAA,EAAgB,MAAA,CAAO,MAAA,IAAU,IAAA;AAAA,YAChD,mBAAA,EAAqB,cAAA,EAAgB,YAAA,CAAa,MAAA,IAAU,IAAA;AAAA,YAC5D,eAAe,KAAA,CAAM,OAAA,CAAS,QAAA,CAA+B,SAAS,IAChE,QAAA,CAA+B,SAAA,CAAwB,MAAA,GACzD,KAAA,CAAM,QAAS,QAAA,CAA+B,iBAAiB,CAAA,GAC3D,QAAA,CAA+B,kBAAgC,MAAA,GACjE,CAAA;AAAA,YACN,cAAA,EAAgB,MAAM,OAAA,CAAS,QAAA,CAA+B,UAAU,CAAA,GAClE,QAAA,CAA+B,WAAyB,MAAA,GAC1D,CAAA;AAAA,YACJ,iBAAA,EAAmB,MAAM,OAAA,CAAS,QAAA,CAA+B,YAAY,CAAA,GACvE,QAAA,CAA+B,aAA2B,MAAA,GAC5D,CAAA;AAAA,YACJ,gBAAgB,OAAQ,QAAA,CAA+B,aAAa,QAAA,GAC/D,QAAA,CAA+B,SAAU,MAAA,GAC1C;AAAA;AACN;AACF;AACF,KACD,CAAA;AAED,IAAA,MAAM,IAAA,GAAO,KAAK,aAAA,CAAc;AAAA,MAC9B,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,gBAAgB,MAAA,CAAO,UAAA;AAAA,MACvB;AAAA,KACD,CAAA;AAED,IAAA,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ,iBAAA,EAAmB,GAAA,EAAK,2BAA2B,CAAA;AAC7E,IAAA,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,MAAA,EAAQ,oBAAoB,CAAA;AACpD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAO,MAAA,EAWS;AACpB,IAAA,MAAM,YAAA,GAAwB,OAAO,IAAA,IAAQ,OAAA;AAC7C,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,EAAE,IAAA,EAAM,cAAc,CAAA;AACzC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,IACrD;AAEA,IAAA,IAAI,CAAC,IAAI,aAAA,EAAe;AACtB,MAAA,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAAA,IAC5D;AAEA,IAAA,MAAM,UAAA,GAAa,KAAK,oBAAA,EAAqB;AAC7C,IAAA,MAAM,YAAA,GAAe,KAAK,kBAAA,EAAmB;AAC7C,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,IAAA,IAAQ,MAAA,CAAO,IAAA,CAAK,IAAA;AAC9C,IAAA,MAAM,UAAA,GAAa,CAAA,EAAG,MAAA,CAAO,IAAA,CAAK,IAAI;;AAAA;AAAA,EAAuB,OAAO,QAAQ,CAAA,CAAA;AAC5E,IAAA,MAAM,gBAAA,GAA8B,CAAC,YAAA,EAAc,UAAU,CAAA;AAC7D,IAAA,IAAI,OAAO,YAAA,EAAc;AACvB,MAAA,gBAAA,CAAiB,KAAK,GAAG,IAAA,CAAK,gBAAA,CAAiB,MAAA,CAAO,YAAY,CAAC,CAAA;AAAA,IACrE;AAEA,IAAA,IAAI,eAAA,GAAkB,EAAA;AACtB,IAAA,IAAI,MAAA,CAAO,cAAA,KAAmB,KAAA,IAAS,MAAA,CAAO,YAAA,EAAc;AAC1D,MAAA,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,aAAA,EAAe,iDAAiD,CAAA;AACxF,MAAA,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ,eAAA,EAAiB,EAAA,EAAI,+BAA+B,CAAA;AAC9E,MAAA,eAAA,GAAkB,MAAM,IAAA,CAAK,sBAAA,CAAuB,GAAA,EAAK,gBAAA,EAAkB;AAAA,QACzE,IAAA,EAAM,UAAA;AAAA,QACN,SAAA,EAAW,OAAO,IAAA,CAAK,SAAA;AAAA,QACvB,IAAA,EAAM,UAAA;AAAA,QACN,UAAA,EAAY,OAAO,IAAA,CAAK,UAAA;AAAA,QACxB,cAAc,MAAA,CAAO,YAAA;AAAA,QACrB,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,eAAe,MAAA,CAAO,aAAA;AAAA,QACtB,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,cAAA,GAAiB;AAAA,MACrB;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,OAAA,EAAS,KAAK,uBAAA,CAAwB,MAAA,CAAO,MAAM,MAAA,CAAO,QAAA,EAAU,YAAY,eAAe;AAAA,OACjG;AAAA,MACA;AAAA,QACE,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS,CAAA,gCAAA,EAAmC,MAAA,CAAO,QAAQ,CAAA;AAAA;AAC7D,KACF;AACA,IAAA,MAAM,aAAA,GAAgB;AAAA,MACpB,KAAA,EAAO,gBAAA;AAAA,MACP,WAAA,EAAa,GAAA;AAAA,MACb,UAAA,EAAY,EAAE,IAAA,EAAM,UAAA,EAAqB,UAAU,EAAE,IAAA,EAAM,eAAc;AAAE,KAC7E;AAEA,IAAA,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,UAAA,EAAY,wCAAwC,CAAA;AAC5E,IAAA,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ,eAAA,EAAiB,EAAA,EAAI,kCAAkC,CAAA;AAEjF,IAAA,MAAM,QAAA,GAAW,KAAK,GAAA,EAAI;AAC1B,IAAA,IAAA,CAAK,UAAU,MAAA,EAAQ;AAAA,MACrB,IAAA,EAAM,WAAA;AAAA,MACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,SAAA,EAAW,OAAO,IAAA,CAAK,SAAA;AAAA,MACvB,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,YAAA;AAAA,QACN,cAAc,cAAA,CAAe;AAAA;AAC/B,KACD,CAAA;AACD,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,aAAA,CAAc,aAAa,CAAA;AACzD,IAAA,IAAA,CAAK,UAAU,MAAA,EAAQ;AAAA,MACrB,IAAA,EAAM,YAAA;AAAA,MACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,SAAA,EAAW,OAAO,IAAA,CAAK,SAAA;AAAA,MACvB,UAAA,EAAY,gBAAA;AAAA,MACZ,IAAA,EAAM;AAAA,QACJ,QAAA,EAAU,aAAA;AAAA,QACV,KAAA,EAAO;AAAA,UACL,MAAA,EAAQ,OAAO,IAAA,CAAK,EAAA;AAAA,UACpB,UAAU,MAAA,CAAO;AAAA;AACnB;AACF,KACD,CAAA;AAED,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAAM,GAAA,CAAI,aAAA;AAAA,QACnB,cAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,UAAU,MAAA,EAAQ;AAAA,QACrB,IAAA,EAAM,YAAA;AAAA,QACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAClC,SAAA,EAAW,OAAO,IAAA,CAAK,SAAA;AAAA,QACvB,UAAA,EAAY,gBAAA;AAAA,QACZ,IAAA,EAAM;AAAA,UACJ,QAAA,EAAU,aAAA;AAAA,UACV,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA;AAC9D,OACD,CAAA;AACD,MAAA,MAAM,KAAA;AAAA,IACR;AAEA,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,GAAA,EAAI,GAAI,QAAA;AACpC,IAAA,IAAA,CAAK,UAAU,MAAA,EAAQ;AAAA,MACrB,IAAA,EAAM,SAAA;AAAA,MACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,SAAA,EAAW,OAAO,IAAA,CAAK,SAAA;AAAA,MACvB,SAAA,EAAW,IAAI,IAAA,CAAK,QAAQ,EAAE,WAAA,EAAY;AAAA,MAC1C,IAAA,EAAM;AAAA,QACJ,UAAA,EAAY,IAAA,CAAK,aAAA,CAAc,QAAQ,CAAA;AAAA,QACvC,UAAA,EAAY,cAAA;AAAA,QACZ,cAAc,OAAA,CAAQ,QAAA,CAAS,aAAa,QAAA,CAAS,SAAA,CAAU,SAAS,CAAC;AAAA;AAC3E,KACD,CAAA;AACD,IAAA,IAAA,CAAK,aAAa,MAAA,EAAQ;AAAA,MACxB,SAAA,EAAW,CAAA;AAAA,MACX,KAAA,EAAO,gBAAA;AAAA,MACP,aAAa,aAAA,CAAc,WAAA;AAAA,MAC3B,QAAA;AAAA,MACA,WAAA,EAAa,QAAA;AAAA,MACb,WAAW,QAAA,GAAW;AAAA,KACvB,CAAA;AAED,IAAA,MAAM,UAAA,GAAa,SAAS,SAAA,EAAW,IAAA,CAAK,CAAC,EAAA,KAAyC,EAAA,CAAG,SAAS,aAAa,CAAA;AAC/G,IAAA,MAAM,WAAW,UAAA,EAAY,KAAA;AAQ7B,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,IAAA,CAAK,UAAU,MAAA,EAAQ;AAAA,QACrB,IAAA,EAAM,YAAA;AAAA,QACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAClC,SAAA,EAAW,OAAO,IAAA,CAAK,SAAA;AAAA,QACvB,UAAA,EAAY,gBAAA;AAAA,QACZ,IAAA,EAAM;AAAA,UACJ,QAAA,EAAU,aAAA;AAAA,UACV,KAAA,EAAO;AAAA;AACT,OACD,CAAA;AACD,MAAA,MAAM,IAAI,MAAM,oDAAoD,CAAA;AAAA,IACtE;AAEA,IAAA,MAAM,OAAA,GAAU,KAAK,aAAA,CAAc;AAAA,MACjC,SAAA,EAAW,OAAO,IAAA,CAAK,SAAA;AAAA,MACvB,IAAA,EAAM,OAAO,IAAA,CAAK,IAAA;AAAA,MAClB,IAAA,EAAM,UAAA;AAAA,MACN,cAAA,EAAgB,OAAO,IAAA,CAAK,UAAA;AAAA,MAC5B,QAAA;AAAA,MACA,cAAc,MAAA,CAAO;AAAA,KACtB,CAAA;AAED,IAAA,IAAA,CAAK,UAAU,MAAA,EAAQ;AAAA,MACrB,IAAA,EAAM,UAAA;AAAA,MACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,SAAA,EAAW,OAAO,IAAA,CAAK,SAAA;AAAA,MACvB,UAAA,EAAY,gBAAA;AAAA,MACZ,SAAA,EAAW,IAAI,IAAA,CAAK,QAAQ,EAAE,WAAA,EAAY;AAAA,MAC1C,IAAA,EAAM;AAAA,QACJ,QAAA,EAAU,aAAA;AAAA,QACV,OAAA,EAAS,IAAA;AAAA,QACT,UAAA,EAAY,cAAA;AAAA,QACZ,MAAA,EAAQ,2BAAA;AAAA,QACR,QAAA,EAAU;AAAA,UACR,UAAA,EAAY;AAAA,YACV,UAAA,EAAY,MAAM,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,GAAI,QAAA,CAAS,OAAO,MAAA,GAAS,CAAA;AAAA,YACtE,YAAY,QAAA,CAAS,UAAA;AAAA,YACrB,gBAAgB,OAAO,QAAA,CAAS,aAAa,QAAA,GAAW,QAAA,CAAS,SAAS,MAAA,GAAS;AAAA;AACrF;AACF;AACF,KACD,CAAA;AACD,IAAA,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ,eAAA,EAAiB,GAAA,EAAK,yBAAyB,CAAA;AACzE,IAAA,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,MAAA,EAAQ,2BAA2B,CAAA;AAE3D,IAAA,OAAO;AAAA,MACL,GAAG,OAAA;AAAA,MACH,SAAA,EAAW,OAAO,IAAA,CAAK,SAAA;AAAA,MACvB,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AAAA,EAEQ,cAAc,KAAA,EAcT;AACX,IAAA,MAAMxB,IAAAA,GAAAA,iBAAM,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACnC,IAAA,MAAM,SAAS,KAAA,CAAM,YAAA,EAAc,MAAM,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,EAAE,EAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AACrG,IAAA,MAAM,mBAAmB,IAAA,CAAK,uBAAA,CAAwB,MAAM,QAAA,CAAS,MAAA,IAAU,EAAE,CAAA;AACjF,IAAA,MAAM,iBAAiB,IAAA,CAAK,uBAAA,CAAwB,KAAA,CAAM,QAAA,CAAS,YAAY,EAAE,CAAA;AACjF,IAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,sCAAA,CAAuC,KAAA,CAAM,SAAS,UAAU,CAAA;AAC/F,IAAA,MAAM,iBAAA,GAAoB,iBAAiB,MAAA,GAAS,CAAA,GAChD,mBACA,cAAA,CAAe,MAAA,GAAS,IACtB,cAAA,GACA,iBAAA;AACN,IAAA,MAAM,MAAA,GAAS,kBAAkB,MAAA,GAAS,CAAA,GACtC,oBACA,IAAA,CAAK,oBAAA,CAAqB,MAAM,IAAI,CAAA;AACxC,IAAA,MAAM,QAAA,GAAW,KAAK,qBAAA,CAAsB,KAAA,CAAM,MAAM,KAAA,CAAM,QAAA,CAAS,UAAU,MAAM,CAAA;AAEvF,IAAA,MAAM,IAAA,GAAiB;AAAA,MACrB,EAAA,EAAI,MAAA;AAAA,MACJ,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,MAAA;AAAA,MACA,iBAAA,EAAmB,KAAA,CAAM,QAAA,CAAS,iBAAA,IAAqB,SAAA;AAAA,MACvD,UAAA,EAAY,KAAA,CAAM,cAAA,IAAkB,KAAA,CAAM,SAAS,UAAA,IAAc,QAAA;AAAA,MACjE,SAAA,EAAW,KAAA,CAAM,YAAA,EAAc,SAAA,IAAaA,IAAAA;AAAA,MAC5C,SAAA,EAAWA,IAAAA;AAAA,MACX,MAAA,EAAQ,KAAA,CAAM,YAAA,EAAc,MAAA,IAAU,OAAA;AAAA,MACtC;AAAA,KACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAc,gBAAA,CACZ,GAAA,EACA,OACA,IAAA,EACA,IAAA,EACA,YACA,WAAA,EAQiB;AACjB,IAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AACzB,IAAA,MAAM,gBAAA,GAAmB;AAAA,MACvB;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,OAAA,EAAS,IAAA,CAAK,yBAAA,CAA0B,IAAA,EAAM,MAAM,UAAU;AAAA,OAChE;AAAA,MACA;AAAA,QACE,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS,kEAAkE,IAAI,CAAA;AAAA;AACjF,KACF;AACA,IAAA,MAAM,eAAA,GAAkB;AAAA,MACtB,KAAA;AAAA,MACA,WAAA,EAAa,GAAA;AAAA,MACb,UAAA,EAAY,EAAE,IAAA,EAAM,UAAA,EAAqB,UAAU,EAAE,IAAA,EAAM,iBAAgB;AAAE,KAC/E;AACA,IAAA,IAAA,CAAK,UAAA,CAAW,WAAA,EAAa,aAAA,EAAe,uCAAuC,CAAA;AACnF,IAAA,IAAA,CAAK,UAAU,WAAA,EAAa;AAAA,MAC1B,IAAA,EAAM,WAAA;AAAA,MACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,WAAW,WAAA,EAAa,SAAA;AAAA,MACxB,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,aAAa,IAAA,IAAQ,OAAA;AAAA,QAC3B,cAAc,gBAAA,CAAiB;AAAA;AACjC,KACD,CAAA;AACD,IAAA,MAAM,kBAAA,GAAqB,IAAA,CAAK,aAAA,CAAc,eAAe,CAAA;AAC7D,IAAA,IAAA,CAAK,UAAU,WAAA,EAAa;AAAA,MAC1B,IAAA,EAAM,YAAA;AAAA,MACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,WAAW,WAAA,EAAa,SAAA;AAAA,MACxB,UAAA,EAAY,kBAAA;AAAA,MACZ,IAAA,EAAM;AAAA,QACJ,QAAA,EAAU,eAAA;AAAA,QACV,KAAA,EAAO;AAAA,UACL,IAAA;AAAA,UACA,IAAA;AAAA,UACA;AAAA;AACF;AACF,KACD,CAAA;AAED,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAAM,GAAA,CAAI,aAAA;AAAA,QACnB,gBAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,UAAU,WAAA,EAAa;AAAA,QAC1B,IAAA,EAAM,YAAA;AAAA,QACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAClC,WAAW,WAAA,EAAa,SAAA;AAAA,QACxB,UAAA,EAAY,kBAAA;AAAA,QACZ,IAAA,EAAM;AAAA,UACJ,QAAA,EAAU,eAAA;AAAA,UACV,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA;AAC9D,OACD,CAAA;AACD,MAAA,MAAM,KAAA;AAAA,IACR;AAEA,IAAA,MAAM,YAAA,GAAe,SAAS,SAAA,EAAW,IAAA,CAAK,CAAC,EAAA,KAAyC,EAAA,CAAG,SAAS,eAAe,CAAA;AACnH,IAAA,MAAM,QAAQ,YAAA,EAAc,KAAA;AAC5B,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,QAAQ,CAAA,GAAI,KAAA,CAAO,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAmB,OAAO,CAAA,KAAM,QAAQ,IAAI,EAAC;AACvH,IAAA,MAAM,OAAA,GAAU,OAAO,KAAA,EAAO,OAAA,KAAY,WAAW,KAAA,CAAM,OAAA,CAAQ,MAAK,GAAI,EAAA;AAE5E,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,OAAA;AAChC,IAAA,IAAA,CAAK,UAAU,WAAA,EAAa;AAAA,MAC1B,IAAA,EAAM,SAAA;AAAA,MACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,WAAW,WAAA,EAAa,SAAA;AAAA,MACxB,SAAA,EAAW,IAAI,IAAA,CAAK,OAAO,EAAE,WAAA,EAAY;AAAA,MACzC,IAAA,EAAM;AAAA,QACJ,UAAA,EAAY,IAAA,CAAK,aAAA,CAAc,QAAQ,CAAA;AAAA,QACvC,UAAA;AAAA,QACA,cAAc,OAAA,CAAQ,QAAA,CAAS,aAAa,QAAA,CAAS,SAAA,CAAU,SAAS,CAAC;AAAA;AAC3E,KACD,CAAA;AACD,IAAA,IAAA,CAAK,aAAa,WAAA,EAAa;AAAA,MAC7B,SAAA,EAAW,CAAA;AAAA,MACX,KAAA;AAAA,MACA,aAAa,eAAA,CAAgB,WAAA;AAAA,MAC7B,QAAA;AAAA,MACA,WAAA,EAAa,OAAA;AAAA,MACb,WAAW,OAAA,GAAU;AAAA,KACtB,CAAA;AAED,IAAA,IAAI,CAAC,OAAA,IAAW,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AACrC,MAAA,IAAA,CAAK,UAAU,WAAA,EAAa;AAAA,QAC1B,IAAA,EAAM,YAAA;AAAA,QACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAClC,WAAW,WAAA,EAAa,SAAA;AAAA,QACxB,UAAA,EAAY,kBAAA;AAAA,QACZ,IAAA,EAAM;AAAA,UACJ,QAAA,EAAU,eAAA;AAAA,UACV,KAAA,EAAO;AAAA;AACT,OACD,CAAA;AACD,MAAA,OAAO,EAAA;AAAA,IACT;AAEA,IAAA,IAAA,CAAK,UAAU,WAAA,EAAa;AAAA,MAC1B,IAAA,EAAM,UAAA;AAAA,MACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,WAAW,WAAA,EAAa,SAAA;AAAA,MACxB,UAAA,EAAY,kBAAA;AAAA,MACZ,SAAA,EAAW,IAAI,IAAA,CAAK,OAAO,EAAE,WAAA,EAAY;AAAA,MACzC,IAAA,EAAM;AAAA,QACJ,QAAA,EAAU,eAAA;AAAA,QACV,OAAA,EAAS,IAAA;AAAA,QACT,UAAA;AAAA,QACA,MAAA,EAAQ,OAAA,IAAW,CAAA,EAAG,QAAA,CAAS,MAAM,CAAA,SAAA,CAAA;AAAA,QACrC,QAAA,EAAU;AAAA,UACR,aAAa,QAAA,CAAS,MAAA;AAAA,UACtB;AAAA;AACF;AACF,KACD,CAAA;AAED,IAAA,OAAO,CAAC,OAAA,EAAS,GAAG,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAA,EAAK,CAAC,CAAA,CAAE,CAAC,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,IAAI,CAAA;AAAA,EAC9E;AAAA,EAEA,MAAc,sBAAA,CACZ,GAAA,EACA,KAAA,EACA,MAAA,EAYiB;AACjB,IAAA,MAAM,qBAAA,GAAwB,MAAM,IAAA,CAAK,oCAAA,CAAqC,MAAM,CAAA;AACpF,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,gBAAA,CAAiB,GAAA,EAAK,KAAA,EAAO,MAAA,CAAO,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,MAAA,CAAO,UAAA,EAAY,MAAM,CAAA;AACnH,IAAA,MAAM,cAAA,GAAiB,CAAC,qBAAA,EAAuB,eAAe,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACzF,IAAA,IAAI,MAAA,CAAO,IAAA,KAAS,MAAA,IAAU,CAAC,OAAO,YAAA,EAAc;AAClD,MAAA,OAAO,cAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAA,GAAO,KAAK,kBAAA,CAAmB,MAAA,CAAO,MAAM,cAAc,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAC5E,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,OAAO,cAAA;AAAA,IACT;AAEA,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,yBAAA,CAA0B,KAAK,KAAA,EAAO;AAAA,MACjE,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,IAAA;AAAA,MACA,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,eAAe,MAAA,CAAO,aAAA;AAAA,MACtB,MAAM,MAAA,CAAO;AAAA,KACd,CAAA;AAED,IAAA,MAAM,mBAAmB,CAAC,SAAA,CAAU,SAAS,GAAG,SAAA,CAAU,SAAS,GAAA,CAAI,CAAC,MAAM,CAAA,EAAA,EAAK,CAAC,EAAE,CAAC,CAAA,CACpF,OAAO,OAAO,CAAA,CACd,KAAK,IAAI,CAAA;AACZ,IAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,MAAA,OAAO,cAAA;AAAA,IACT;AACA,IAAA,OAAO,CAAC,cAAA,EAAgB,EAAA,EAAI,iCAAA,EAAmC,gBAAgB,EAC5E,MAAA,CAAO,OAAO,CAAA,CACd,IAAA,CAAK,IAAI,CAAA;AAAA,EACd;AAAA,EAEA,MAAc,qCAAqC,MAAA,EAU/B;AAClB,IAAA,IAAI,CAAC,OAAO,YAAA,EAAc;AACxB,MAAA,OAAO,EAAA;AAAA,IACT;AAEA,IAAA,MAAM,WAAqB,EAAC;AAC5B,IAAA,MAAM,WAAW,MAAA,CAAO,YAAA;AACxB,IAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,QAAA,CAAS,cAAc,CAAA;AACjD,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAI;AACvB,IAAA,MAAM,mBAAA,GAAsB,IAAA,CAAK,aAAA,CAAc,yBAAyB,CAAA;AACxE,IAAA,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,aAAA,EAAe,iEAAiE,CAAA;AACxG,IAAA,IAAA,CAAK,UAAU,MAAA,EAAQ;AAAA,MACrB,IAAA,EAAM,YAAA;AAAA,MACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,UAAA,EAAY,mBAAA;AAAA,MACZ,IAAA,EAAM;AAAA,QACJ,QAAA,EAAU,yBAAA;AAAA,QACV,KAAA,EAAO;AAAA,UACL,cAAA,EAAgB,KAAA,CAAM,IAAA,CAAK,SAAS;AAAA;AACtC;AACF,KACD,CAAA;AAED,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,gBAAA,CAAiB,MAAA,CAAO,IAAI,CAAA;AAEnD,IAAA,IAAI,SAAA,CAAU,GAAA,CAAI,SAAS,CAAA,EAAG;AAC5B,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,OAAA,CAAQ,SAAA,EAAW,EAAE,IAAA,EAAM,GAAA,EAAK,KAAA,EAAO,EAAA,EAAI,CAAA;AACzE,QAAA,MAAM,SAAS,OAAQ,MAAA,CAAgC,MAAA,KAAW,QAAA,GAC7D,OAA8B,MAAA,GAC/B,EAAA;AACJ,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,QAAA,CAAS,IAAA,CAAK,CAAA;AAAA,EAAoC,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,QAChG;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,IAAI,UAAU,GAAA,CAAI,aAAa,CAAA,IAAK,SAAA,CAAU,SAAS,CAAA,EAAG;AACxD,MAAA,KAAA,MAAW,IAAA,IAAQ,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,EAAG;AACxC,QAAA,IAAI;AACF,UAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAG,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,EAAK,CAAA,CAAA,GAAK,IAAI,IAAI,CAAA,CAAA,CAAA;AAC3E,UAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,OAAA,CAAQ,aAAA,EAAe,EAAE,OAAA,EAAS,SAAA,EAAW,GAAA,EAAK,KAAA,EAAO,EAAA,EAAI,CAAA;AAC3F,UAAA,MAAM,SAAS,OAAQ,MAAA,CAAgC,MAAA,KAAW,QAAA,GAC7D,OAA8B,MAAA,GAC/B,EAAA;AACJ,UAAA,IAAI,MAAA,EAAQ;AACV,YAAA,QAAA,CAAS,IAAA,CAAK,2CAA2C,IAAI,CAAA;AAAA,EAAO,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,UAClH;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,SAAA,CAAU,GAAA,CAAI,aAAa,CAAA,EAAG;AAChC,MAAA,MAAM,QAAA,GAAW,KAAK,mBAAA,CAAoB,MAAA,CAAO,IAAI,CAAA,CAAE,KAAA,CAAM,GAAG,CAAC,CAAA;AACjE,MAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,OAAA,CAAQ,aAAA,EAAe;AAAA,YACnD,OAAA,EAAS,OAAA;AAAA,YACT,SAAA,EAAW,GAAA;AAAA,YACX,KAAA,EAAO,EAAA;AAAA,YACP,IAAA,EAAM;AAAA,WACP,CAAA;AACD,UAAA,MAAM,SAAS,OAAQ,MAAA,CAAgC,MAAA,KAAW,QAAA,GAC7D,OAA8B,MAAA,GAC/B,EAAA;AACJ,UAAA,IAAI,MAAA,IAAU,CAAC,sBAAA,CAAuB,IAAA,CAAK,MAAM,CAAA,EAAG;AAClD,YAAA,QAAA,CAAS,IAAA,CAAK,2CAA2C,OAAO,CAAA;AAAA,EAAO,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,UACrH;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,UAAU,MAAA,EAAQ;AAAA,MACrB,IAAA,EAAM,UAAA;AAAA,MACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,UAAA,EAAY,mBAAA;AAAA,MACZ,SAAA,EAAW,IAAI,IAAA,CAAK,KAAK,EAAE,WAAA,EAAY;AAAA,MACvC,IAAA,EAAM;AAAA,QACJ,QAAA,EAAU,yBAAA;AAAA,QACV,OAAA,EAAS,IAAA;AAAA,QACT,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA;AAAA,QACzB,MAAA,EAAQ,CAAA,UAAA,EAAa,QAAA,CAAS,MAAM,CAAA,kCAAA;AAAA;AACtC,KACD,CAAA;AAED,IAAA,OAAO,QAAA,CAAS,KAAK,MAAM,CAAA;AAAA,EAC7B;AAAA,EAEA,MAAc,yBAAA,CACZ,GAAA,EACA,KAAA,EACA,MAAA,EAUkC;AAClC,IAAA,MAAM,WAAW,MAAA,CAAO,IAAA;AACxB,IAAA,MAAM,WAAqB,EAAC;AAC5B,IAAA,MAAM,YAAsB,EAAC;AAE7B,IAAA,IAAA,CAAK,WAAW,MAAA,EAAQ,aAAA,EAAe,CAAA,iCAAA,EAAoC,QAAA,CAAS,MAAM,CAAA,OAAA,CAAS,CAAA;AACnG,IAAA,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ,eAAA,EAAiB,EAAA,EAAI,yCAAyC,CAAA;AAExF,IAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,QAAA,CAAS,QAAQ,KAAA,EAAA,EAAS;AACpD,MAAA,MAAM,OAAA,GAAU,SAAS,KAAK,CAAA;AAC9B,MAAA,MAAM,SAAA,GAAY,CAAA,cAAA,EAAiB,KAAA,GAAQ,CAAC,CAAA,CAAA,EAAI,KAAK,GAAA,EAAI,CAAE,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA;AACvE,MAAA,MAAM,SAAA,GAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACzC,MAAA,IAAA,CAAK,UAAU,MAAA,EAAQ;AAAA,QACrB,IAAA,EAAM,eAAA;AAAA,QACN,SAAA,EAAW,SAAA;AAAA,QACX,WAAW,MAAA,CAAO,SAAA;AAAA,QAClB,IAAA,EAAM;AAAA,UACJ,SAAA;AAAA,UACA,aAAa,CAAA,EAAG,OAAA,CAAQ,KAAK,CAAA,EAAA,EAAK,QAAQ,GAAG,CAAA,CAAA,CAAA;AAAA,UAC7C,KAAA;AAAA,UACA,OAAO,QAAA,CAAS;AAAA;AAClB,OACD,CAAA;AAED,MAAA,IAAI;AACF,QAAA,MAAM,WAAA,GAAc,CAAA,EAAG,MAAA,CAAO,IAAI;;AAAA,sBAAA,EAA6B,QAAQ,KAAK;AAAA,EAAK,QAAQ,MAAM,CAAA,CAAA;AAC/F,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,gBAAA;AAAA,UACzB,GAAA;AAAA,UACA,KAAA;AAAA,UACA,WAAA;AAAA,UACA,MAAA;AAAA,UACA,MAAA,CAAO,UAAA;AAAA,UACP;AAAA,SACF;AACA,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,4BAAA,CAA6B,OAAO,CAAA;AACxD,QAAA,IAAI,OAAO,OAAA,EAAS;AAClB,UAAA,SAAA,CAAU,KAAK,CAAA,EAAG,OAAA,CAAQ,KAAK,CAAA,EAAA,EAAK,MAAA,CAAO,OAAO,CAAA,CAAE,CAAA;AAAA,QACtD;AACA,QAAA,QAAA,CAAS,IAAA,CAAK,GAAG,MAAA,CAAO,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAA,EAAI,OAAA,CAAQ,KAAK,CAAA,EAAA,EAAK,CAAC,EAAE,CAAC,CAAA;AACtE,QAAA,IAAA,CAAK,UAAU,MAAA,EAAQ;AAAA,UACrB,IAAA,EAAM,aAAA;AAAA,UACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,UAClC,WAAW,MAAA,CAAO,SAAA;AAAA,UAClB,SAAA;AAAA,UACA,IAAA,EAAM;AAAA,YACJ,SAAA;AAAA,YACA,OAAA,EAAS,IAAA;AAAA,YACT,OAAA,EAAS,OAAO,OAAA,IAAW;AAAA;AAC7B,SACD,CAAA;AAAA,MACH,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,QAAA,QAAA,CAAS,KAAK,CAAA,CAAA,EAAI,OAAA,CAAQ,KAAK,CAAA,UAAA,EAAa,OAAO,CAAA,CAAE,CAAA;AACrD,QAAA,IAAA,CAAK,UAAU,MAAA,EAAQ;AAAA,UACrB,IAAA,EAAM,aAAA;AAAA,UACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,UAClC,WAAW,MAAA,CAAO,SAAA;AAAA,UAClB,SAAA;AAAA,UACA,IAAA,EAAM;AAAA,YACJ,SAAA;AAAA,YACA,OAAA,EAAS,KAAA;AAAA,YACT,OAAA,EAAS;AAAA;AACX,SACD,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,QAAA,GAAW,KAAK,KAAA,CAAM,EAAA,GAAA,CAAO,QAAQ,CAAA,IAAK,QAAA,CAAS,SAAU,EAAE,CAAA;AACrE,MAAA,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ,eAAA,EAAiB,QAAA,EAAU,CAAA,kBAAA,EAAqB,QAAQ,CAAC,CAAA,CAAA,EAAI,QAAA,CAAS,MAAM,CAAA,UAAA,CAAY,CAAA;AAAA,IACpH;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AAAA,MAC5B;AAAA,KACF;AAAA,EACF;AAAA,EAEQ,kBAAA,CAAmB,MAAc,eAAA,EAAgF;AACvH,IAAA,MAAM,IAAA,GAAO,GAAG,IAAI;AAAA,EAAK,eAAe,GAAG,WAAA,EAAY;AACvD,IAAA,MAAM,OAA8D,EAAC;AACrE,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,IAAI,CAAA;AAG3C,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,oBAAA,GAAuB,gGAAA,CAAiG,IAAA,CAAK,IAAI,CAAA;AACvI,MAAA,IAAI,CAAC,oBAAA,EAAsB;AACzB,QAAA,IAAA,CAAK,IAAA,CAAK;AAAA,UACR,GAAA,EAAK,oBAAA;AAAA,UACL,KAAA,EAAO,oBAAA;AAAA,UACP,MAAA,EAAQ;AAAA,YACN,4DAAA;AAAA,YACA,8BAAA;AAAA,YACA,iCAAA;AAAA,YACA,gEAAA;AAAA,YACA,kDAAA;AAAA,YACA;AAAA,WACF,CAAE,KAAK,IAAI;AAAA,SACZ,CAAA;AAAA,MACH;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,eAAA,GAAkB,0DAAA,CAA2D,IAAA,CAAK,IAAI,CAAA;AAC5F,IAAA,MAAM,YAAA,GAAe,wDAAA,CAAyD,IAAA,CAAK,IAAI,CAAA;AACvF,IAAA,MAAM,eAAA,GAAkB,oDAAA,CAAqD,IAAA,CAAK,IAAI,CAAA;AACtF,IAAA,MAAM,QAAA,GAAW,qDAAA,CAAsD,IAAA,CAAK,IAAI,CAAA;AAEhF,IAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,MAAA,IAAA,CAAK,IAAA,CAAK;AAAA,QACR,GAAA,EAAK,cAAA;AAAA,QACL,KAAA,EAAO,2BAAA;AAAA,QACP,MAAA,EAAQ;AAAA,OACT,CAAA;AAAA,IACH;AACA,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,IAAA,CAAK,IAAA,CAAK;AAAA,QACR,GAAA,EAAK,WAAA;AAAA,QACL,KAAA,EAAO,uBAAA;AAAA,QACP,MAAA,EAAQ;AAAA,OACT,CAAA;AAAA,IACH;AACA,IAAA,IAAI,CAAC,eAAA,IAAmB,CAAC,QAAA,EAAU;AACjC,MAAA,IAAA,CAAK,IAAA,CAAK;AAAA,QACR,GAAA,EAAK,oBAAA;AAAA,QACL,KAAA,EAAO,sBAAA;AAAA,QACP,MAAA,EAAQ;AAAA,OACT,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,6BAA6B,OAAA,EAA0C;AAC7E,IAAA,MAAM,KAAA,GAAQ,OAAA,CACX,KAAA,CAAM,IAAI,CAAA,CACV,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,EAAM,CAAA,CACzB,OAAO,OAAO,CAAA;AACjB,IAAA,MAAM,QAAA,GAAW,KAAA,CACd,MAAA,CAAO,CAAC,SAAS,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,IAAK,YAAY,IAAA,CAAK,IAAI,CAAC,CAAA,CAC9D,IAAI,CAAC,IAAA,KAAS,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAa,EAAE,CAAA,CAAE,OAAA,CAAQ,gBAAgB,EAAE,CAAA,CAAE,IAAA,EAAM,EAC9E,MAAA,CAAO,OAAO,CAAA,CACd,KAAA,CAAM,GAAG,EAAE,CAAA;AACd,IAAA,MAAM,UAAA,GAAa,MAChB,MAAA,CAAO,CAAC,SAAS,CAAC,QAAA,CAAS,KAAK,IAAI,CAAA,IAAK,CAAC,WAAA,CAAY,IAAA,CAAK,IAAI,CAAC,CAAA,CAChE,MAAM,CAAA,EAAG,CAAC,CAAA,CACV,IAAA,CAAK,GAAG,CAAA;AACX,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,cAAc,KAAA,CAAM,KAAA,CAAM,GAAG,CAAC,CAAA,CAAE,KAAK,GAAG,CAAA;AAAA,MACjD;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAc,kCAAkC,MAAA,EAgBV;AACpC,IAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AACzB,IAAA,MAAM,aAAA,GAAgB;AAAA,MACpB;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,OAAA,EAAS,GAAG,IAAA,CAAK,iBAAA;AAAA,UACf,MAAA,CAAO,IAAA;AAAA,UACP,MAAA,CAAO,IAAA;AAAA,UACP,MAAA,CAAO,UAAA;AAAA,UACP,MAAA,CAAO,eAAA;AAAA,UACP,MAAA,CAAO,YAAA;AAAA,UACP,MAAA,CAAO;AAAA,SACR;;AAAA;AAAA,EAGP,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,CAAC,OAAO,KAAA,KAAU,CAAA,EAAG,KAAA,GAAQ,CAAC,KAAK,KAAK,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC;;AAAA,gFAAA;AAAA,OAGpE;AAAA,MACA;AAAA,QACE,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS,CAAA,uFAAA,EAA0F,MAAA,CAAO,IAAI,CAAA;AAAA;AAChH,KACF;AACA,IAAA,MAAM,YAAA,GAAe;AAAA,MACnB,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,WAAA,EAAa,GAAA;AAAA,MACb,UAAA,EAAY,EAAE,IAAA,EAAM,UAAA,EAAqB,UAAU,EAAE,IAAA,EAAM,MAAA,CAAO,YAAA,EAAa;AAAE,KACnF;AACA,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,aAAA,CAAc,MAAA,CAAO,YAAY,CAAA;AAC9D,IAAA,IAAA,CAAK,UAAU,MAAA,EAAQ;AAAA,MACrB,IAAA,EAAM,WAAA;AAAA,MACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,OAAO,IAAA,IAAQ,OAAA;AAAA,QACrB,cAAc,aAAA,CAAc;AAAA;AAC9B,KACD,CAAA;AACD,IAAA,IAAA,CAAK,UAAU,MAAA,EAAQ;AAAA,MACrB,IAAA,EAAM,YAAA;AAAA,MACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,UAAA,EAAY,eAAA;AAAA,MACZ,IAAA,EAAM;AAAA,QACJ,UAAU,MAAA,CAAO,YAAA;AAAA,QACjB,KAAA,EAAO;AAAA,UACL,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,YAAY,MAAA,CAAO,UAAA;AAAA,UACnB,KAAA,EAAO;AAAA;AACT;AACF,KACD,CAAA;AAED,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAAM,OAAO,GAAA,CAAI,aAAA;AAAA,QAC1B,aAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,UAAU,MAAA,EAAQ;AAAA,QACrB,IAAA,EAAM,YAAA;AAAA,QACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAClC,WAAW,MAAA,CAAO,SAAA;AAAA,QAClB,UAAA,EAAY,eAAA;AAAA,QACZ,IAAA,EAAM;AAAA,UACJ,UAAU,MAAA,CAAO,YAAA;AAAA,UACjB,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA;AAC9D,OACD,CAAA;AACD,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,OAAA;AAChC,IAAA,IAAA,CAAK,UAAU,MAAA,EAAQ;AAAA,MACrB,IAAA,EAAM,SAAA;AAAA,MACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,SAAA,EAAW,IAAI,IAAA,CAAK,OAAO,EAAE,WAAA,EAAY;AAAA,MACzC,IAAA,EAAM;AAAA,QACJ,UAAA,EAAY,IAAA,CAAK,aAAA,CAAc,QAAQ,CAAA;AAAA,QACvC,UAAA;AAAA,QACA,cAAc,OAAA,CAAQ,QAAA,CAAS,aAAa,QAAA,CAAS,SAAA,CAAU,SAAS,CAAC;AAAA;AAC3E,KACD,CAAA;AACD,IAAA,IAAA,CAAK,aAAa,MAAA,EAAQ;AAAA,MACxB,SAAA,EAAW,CAAA;AAAA,MACX,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,aAAa,YAAA,CAAa,WAAA;AAAA,MAC1B,QAAA;AAAA,MACA,WAAA,EAAa,OAAA;AAAA,MACb,WAAW,OAAA,GAAU;AAAA,KACtB,CAAA;AAED,IAAA,MAAM,SAAA,GAAY,SAAS,SAAA,EAAW,IAAA,CAAK,CAAC,EAAA,KAAyC,EAAA,CAAG,IAAA,KAAS,MAAA,CAAO,YAAY,CAAA;AACpH,IAAA,MAAM,YAAY,SAAA,EAAW,KAAA;AAC7B,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,IAAA,CAAK,UAAU,MAAA,EAAQ;AAAA,QACrB,IAAA,EAAM,YAAA;AAAA,QACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAClC,WAAW,MAAA,CAAO,SAAA;AAAA,QAClB,UAAA,EAAY,eAAA;AAAA,QACZ,IAAA,EAAM;AAAA,UACJ,UAAU,MAAA,CAAO,YAAA;AAAA,UACjB,KAAA,EAAO,CAAA,qBAAA,EAAwB,MAAA,CAAO,YAAY,CAAA,WAAA;AAAA;AACpD,OACD,CAAA;AACD,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAA,CAAK,UAAU,MAAA,EAAQ;AAAA,MACrB,IAAA,EAAM,UAAA;AAAA,MACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,UAAA,EAAY,eAAA;AAAA,MACZ,SAAA,EAAW,IAAI,IAAA,CAAK,OAAO,EAAE,WAAA,EAAY;AAAA,MACzC,IAAA,EAAM;AAAA,QACJ,UAAU,MAAA,CAAO,YAAA;AAAA,QACjB,OAAA,EAAS,IAAA;AAAA,QACT,UAAA;AAAA,QACA,MAAA,EAAQ;AAAA;AACV,KACD,CAAA;AAED,IAAA,OAAO,SAAA;AAAA,EACT;AAAA,EAEQ,UAAA,CACN,MAAA,EAOA,MAAA,EACA,OAAA,EACM;AACN,IAAA,IAAA,CAAK,UAAU,MAAA,EAAQ;AAAA,MACrB,IAAA,EAAM,eAAA;AAAA,MACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,WAAW,MAAA,EAAQ,SAAA;AAAA,MACnB,IAAA,EAAM,EAAE,MAAA,EAAQ,OAAA;AAAQ,KACzB,CAAA;AAAA,EACH;AAAA,EAEQ,YAAA,CACN,MAAA,EAOA,KAAA,EACA,QAAA,EACA,OAAA,EACM;AACN,IAAA,IAAA,CAAK,UAAU,MAAA,EAAQ;AAAA,MACrB,IAAA,EAAM,iBAAA;AAAA,MACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,WAAW,MAAA,EAAQ,SAAA;AAAA,MACnB,IAAA,EAAM,EAAE,KAAA,EAAO,QAAA,EAAU,OAAA;AAAQ,KAClC,CAAA;AAAA,EACH;AAAA,EAEQ,SAAA,CACN,QAOA,KAAA,EACM;AACN,IAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,MAAA;AAAA,IACF;AACA,IAAA,MAAA,CAAO,OAAA,CAAQ;AAAA,MACb,GAAG,KAAA;AAAA,MACH,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,eAAe,MAAA,CAAO;AAAA,KACvB,CAAA;AAAA,EACH;AAAA,EAEQ,cAAc,QAAA,EAAgG;AACpH,IAAA,IAAI,CAAC,UAAU,KAAA,EAAO;AACpB,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,OAAA,CAAQ,SAAS,KAAA,CAAM,YAAA,IAAgB,CAAA,KAAM,QAAA,CAAS,MAAM,gBAAA,IAAoB,CAAA,CAAA;AAAA,EAClF;AAAA,EAEQ,YAAA,CACN,QACA,KAAA,EAQM;AACN,IAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACnB,MAAA;AAAA,IACF;AACA,IAAA,IAAI;AACF,MAAA,MAAA,CAAO,MAAA,CAAO,KAAA;AAAA,QACZ,kBAAA,CAAmB;AAAA,UACjB,WAAW,KAAA,CAAM,SAAA;AAAA,UACjB,KAAA,EAAO,KAAA,CAAM,QAAA,CAAS,KAAA,IAAS,SAAA;AAAA,UAC/B,aAAa,KAAA,CAAM,WAAA;AAAA,UACnB,SAAA,EAAW,IAAA;AAAA,UACX,OAAO,KAAA,CAAM,KAAA,CAAM,IAAI,CAAC,IAAA,KAAS,KAAK,IAAI,CAAA;AAAA,UAC1C,UAAU,KAAA,CAAM,QAAA;AAAA,UAChB,WAAW,KAAA,CAAM,WAAA;AAAA,UACjB,SAAS,KAAA,CAAM;AAAA,SAChB;AAAA,OACH;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEQ,cAAc,QAAA,EAA0B;AAC9C,IAAA,OAAO,GAAG,QAAQ,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,EAC5E;AAAA,EAEQ,iBAAA,CAAkB,MAAc,QAAA,EAAoD;AAC1F,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,IAAI,CAAA;AAC3C,IAAA,MAAM,QAAA,GAAW,OAAO,QAAA,CAAS,QAAA,KAAa,WAAW,QAAA,CAAS,QAAA,CAAS,MAAK,GAAI,EAAA;AACpF,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,GAAI,QAAA,CAAS,SAAS,EAAC;AACnE,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,KAAe,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,KAAK,CAAA,GAAI,KAAA,CAAM,KAAA,GAAQ,EAAE,CAAA;AAC3F,IAAA,MAAM,iBAAA,GAAoB,MAAM,OAAA,CAAQ,QAAA,CAAS,iBAAiB,CAAA,GAAI,QAAA,CAAS,oBAAoB,EAAC;AACpG,IAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,QAAA,CAAS,UAAU,CAAA,GAAI,QAAA,CAAS,aAAa,EAAC;AAC/E,IAAA,MAAM,YAAA,GAAe,MAAM,OAAA,CAAQ,QAAA,CAAS,YAAY,CAAA,GAAI,QAAA,CAAS,eAAe,EAAC;AACrF,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,MAAM,eAAyB,EAAC;AAEhC,IAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,IAAK,KAAA,CAAM,WAAW,CAAA,EAAG;AAC7C,MAAA,MAAM,oBAAA,GAAuB,OAAA;AAAA,QAC3B,QAAA,IACG,qBAAA,CAAsB,IAAA,CAAK,QAAQ,CAAA,IACnC,eAAA,CAAgB,IAAA,CAAK,QAAQ,CAAA,IAC7B,kBAAA,CAAmB,IAAA,CAAK,QAAQ;AAAA,OACrC;AACA,MAAA,IAAI,oBAAA,EAAsB;AACxB,QAAA,MAAA,CAAO,KAAK,6EAA6E,CAAA;AACzF,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA;AAAA,UACxB,MAAA;AAAA,UACA,YAAA;AAAA,UACA,OAAA,EAAS;AAAA,YACP,UAAA,EAAY,CAAA;AAAA,YACZ,SAAA,EAAW,CAAA;AAAA,YACX,eAAA,EAAiB,CAAA;AAAA,YACjB,iBAAA,EAAmB,CAAA;AAAA,YACnB,WAAA,EAAa,IAAA;AAAA,YACb,eAAA,EAAiB,KAAA;AAAA,YACjB,kBAAA,EAAoB,CAAA;AAAA,YACpB,iBAAA,EAAmB;AAAA;AACrB,SACF;AAAA,MACF;AAEA,MAAA,IAAI,UAAA,IAAc,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG;AACvC,QAAA,MAAA,CAAO,KAAK,8EAA8E,CAAA;AAC1F,QAAA,MAAM,oBAAA,GAAuB,WAAW,MAAA,GAAS,CAAA;AACjD,QAAA,MAAM,yBAAyB,UAAA,CAAW,MAAA;AAC1C,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,KAAK,OAAA,CAAQ,IAAA,GAAO,KAAK,GAAA,CAAI,GAAA,EAAK,oBAAA,GAAuB,EAAE,CAAC,CAAA;AAAA,UACnE,MAAA;AAAA,UACA,YAAA;AAAA,UACA,OAAA,EAAS;AAAA,YACP,UAAA,EAAY,CAAA;AAAA,YACZ,SAAA,EAAW,oBAAA;AAAA,YACX,eAAA,EAAiB,sBAAA;AAAA,YACjB,iBAAA,EAAmB,CAAA;AAAA,YACnB,WAAA,EAAa,CAAA;AAAA,YACb,eAAA,EAAiB,KAAA;AAAA,YACjB,kBAAA,EAAoB,CAAA;AAAA,YACpB,iBAAA,EAAmB;AAAA;AACrB,SACF;AAAA,MACF;AACA,MAAA,MAAM,MAAA,GAAS,sCAAA;AACf,MAAA,MAAA,CAAO,KAAK,MAAM,CAAA;AAClB,MAAA,YAAA,CAAa,KAAK,MAAM,CAAA;AACxB,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,CAAA;AAAA,QACP,MAAA;AAAA,QACA,YAAA;AAAA,QACA,OAAA,EAAS;AAAA,UACP,YAAY,MAAA,CAAO,MAAA;AAAA,UACnB,WAAW,KAAA,CAAM,MAAA;AAAA,UACjB,eAAA,EAAiB,CAAA;AAAA,UACjB,iBAAA,EAAmB,CAAA;AAAA,UACnB,WAAA,EAAa,CAAA;AAAA,UACb,eAAA,EAAiB,KAAA;AAAA,UACjB,kBAAA,EAAoB,CAAA;AAAA,UACpB,iBAAA,EAAmB;AAAA;AACrB,OACF;AAAA,IACF;AAEA,IAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAC7B,MAAA,MAAA,CAAO,KAAK,oGAAoG,CAAA;AAAA,IAClH;AACA,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAA,CAAO,KAAK,6CAA6C,CAAA;AAAA,IAC3D;AAEA,IAAA,MAAM,UAAA,GAAa,MAAM,GAAA,CAAI,CAAC,SAAc,CAAA,EAAG,IAAA,EAAM,UAAU,EAAE,CAAA,CAAA,EAAI,MAAM,eAAA,IAAmB,EAAE,IAAI,IAAA,CAAK,SAAA,CAAU,MAAM,IAAA,IAAQ,EAAE,CAAC,CAAA,CAAE,CAAA;AACtI,IAAA,MAAM,eAAA,GAAkB,WAAW,IAAA,CAAK,CAAC,SAAS,0BAAA,CAA2B,IAAA,CAAK,IAAI,CAAC,CAAA;AACvF,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,MAAM,MAAA,GAAS,wEAAA;AACf,MAAA,MAAA,CAAO,KAAK,MAAM,CAAA;AAClB,MAAA,YAAA,CAAa,KAAK,MAAM,CAAA;AAAA,IAC1B;AAEA,IAAA,MAAM,aAAA,uBAAoB,GAAA,CAAI;AAAA,MAC5B,gBAAA;AAAA,MAAkB,gBAAA;AAAA,MAClB,SAAA;AAAA,MAAW,SAAA;AAAA,MACX,SAAA;AAAA,MAAW,SAAA;AAAA,MACX,WAAA;AAAA,MAAa,aAAA;AAAA,MAAe,aAAA;AAAA,MAAe,iBAAA;AAAA,MAC3C,kBAAA;AAAA,MAAoB,cAAA;AAAA,MAAgB;AAAA,KACrC,CAAA;AACD,IAAA,MAAM,WAAA,uBAAkB,GAAA,CAAI;AAAA,MAC1B,SAAA;AAAA,MAAW,UAAA;AAAA,MAAY,cAAA;AAAA,MAAgB,UAAA;AAAA,MAAY,UAAA;AAAA,MAAY,YAAA;AAAA,MAAc,YAAA;AAAA,MAC7E,eAAA;AAAA,MAAiB,cAAA;AAAA,MAAgB,cAAA;AAAA,MAAgB,gBAAA;AAAA,MACjD,YAAA;AAAA,MAAc;AAAA,KACf,CAAA;AACD,IAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAc,aAAA,CAAc,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,IAAA,IAAQ,EAAE,CAAC,CAAC,CAAA,CAAE,MAAA;AAC/F,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAc,WAAA,CAAY,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,IAAA,IAAQ,EAAE,CAAC,CAAC,CAAA,CAAE,MAAA;AAC3F,IAAA,MAAM,cAAc,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,WAAA,GAAc,MAAM,MAAA,GAAS,CAAA;AACpE,IAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,MAAA,CAAO,CAAC,KAAA,KAAe,gDAAA,CAAiD,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,IAAA,IAAQ,EAAE,CAAC,CAAC,CAAA,CAAE,MAAA;AACvI,IAAA,MAAM,oBAAoB,KAAA,CAAM,MAAA;AAAA,MAAO,CAAC,IAAA,KACtC,yHAAA,CACG,IAAA,CAAK,CAAA,EAAG,IAAA,EAAM,MAAA,IAAU,EAAE,CAAA,CAAA,EAAI,IAAA,EAAM,eAAA,IAAmB,EAAE,CAAA,CAAE;AAAA,KAChE,CAAE,MAAA;AACF,IAAA,MAAM,oBAAoB,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,iBAAA,GAAoB,MAAM,MAAA,GAAS,CAAA;AAEhF,IAAA,MAAM,mBAAmB,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAc,OAAO,IAAA,EAAM,IAAA,KAAS,QAAA,IAAY,MAAA,CAAO,KAAK,IAAI,CAAA,CAAE,MAAK,CAAE,MAAA,KAAW,CAAC,CAAA,CAAE,MAAA;AAC9H,IAAA,IAAI,mBAAmB,CAAA,EAAG;AACxB,MAAA,MAAA,CAAO,KAAK,6CAA6C,CAAA;AAAA,IAC3D;AAEA,IAAA,MAAM,8BAA8B,KAAA,CAAM,MAAA;AAAA,MAAO,CAAC,SAChD,OAAO,IAAA,EAAM,WAAW,QAAA,IACrB,IAAA,CAAK,OAAO,IAAA,EAAK,CAAE,WAAW,CAAA,IAC9B,OAAO,MAAM,eAAA,KAAoB,QAAA,IACjC,KAAK,eAAA,CAAgB,IAAA,GAAO,MAAA,KAAW;AAAA,KAC5C,CAAE,MAAA;AACF,IAAA,IAAI,8BAA8B,CAAA,EAAG;AACnC,MAAA,MAAM,MAAA,GAAS,qDAAA;AACf,MAAA,MAAA,CAAO,KAAK,MAAM,CAAA;AAClB,MAAA,YAAA,CAAa,KAAK,MAAM,CAAA;AAAA,IAC1B;AAEA,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,MAAMyB,SAAQ,IAAA,CAAK,OAAA;AAAA,QACjB,IAAA,IACG,KAAA,CAAM,MAAA,IAAU,CAAA,GAAI,MAAM,CAAA,CAAA,IAC1B,WAAA,IAAe,IAAA,GAAO,IAAA,GAAO,CAAA,CAAA,IAC7B,iBAAA,IAAqB,GAAA,GAAM,GAAA,GAAM,MACjC,YAAA,CAAa,MAAA,GAAS,CAAA,GAAI,GAAA,GAAM,CAAA,CAAA,IAChC,cAAA,IAAkB,CAAA,GAAI,IAAA,GAAO,MAC7B,eAAA,GAAkB,IAAA,GAAO,CAAA,CAAA,IACzB,gBAAA,GAAmB,CAAA,GAAI,IAAA,GAAO,CAAA,CAAA,IAC9B,2BAAA,GAA8B,IAAI,IAAA,GAAO,CAAA;AAAA,OAC9C;AACA,MAAA,OAAO;AAAA,QACL,KAAA,EAAAA,MAAAA;AAAA,QACA,MAAA;AAAA,QACA,YAAA;AAAA,QACA,OAAA,EAAS;AAAA,UACP,YAAY,MAAA,CAAO,MAAA;AAAA,UACnB,WAAW,KAAA,CAAM,MAAA;AAAA,UACjB,eAAA,EAAiB,WAAA;AAAA,UACjB,iBAAA,EAAmB,aAAA;AAAA,UACnB,WAAA;AAAA,UACA,eAAA;AAAA,UACA,kBAAA,EAAoB,cAAA;AAAA,UACpB;AAAA;AACF,OACF;AAAA,IACF;AAEA,IAAA,IAAI,iBAAA,CAAkB,WAAW,CAAA,EAAG;AAClC,MAAA,MAAA,CAAO,KAAK,6FAA6F,CAAA;AAAA,IAC3G;AACA,IAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,MAAA,MAAA,CAAO,KAAK,sFAAsF,CAAA;AAAA,IACpG;AAEA,IAAA,IAAI,gBAAgB,CAAA,EAAG;AACrB,MAAA,MAAM,MAAA,GAAS,6FAAA;AACf,MAAA,MAAA,CAAO,KAAK,MAAM,CAAA;AAClB,MAAA,YAAA,CAAa,KAAK,MAAM,CAAA;AAAA,IAC1B;AACA,IAAA,IAAI,cAAc,GAAA,EAAK;AACrB,MAAA,MAAA,CAAO,KAAK,0FAA0F,CAAA;AAAA,IACxG;AACA,IAAA,IAAI,aAAA,GAAgB,KAAA,CAAM,MAAA,GAAS,GAAA,EAAK;AACtC,MAAA,MAAA,CAAO,KAAK,oDAAoD,CAAA;AAAA,IAClE;AAEA,IAAA,IAAI,iBAAiB,CAAA,EAAG;AACtB,MAAA,MAAA,CAAO,KAAK,4FAA4F,CAAA;AAAA,IAC1G;AAEA,IAAA,IAAI,oBAAoB,IAAA,EAAM;AAC5B,MAAA,MAAA,CAAO,KAAK,qFAAqF,CAAA;AAAA,IACnG;AAEA,IAAA,MAAM,QAAQ,IAAA,CAAK,OAAA;AAAA,MACjB,GAAA,GACE,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,MAAM,MAAA,GAAS,EAAE,CAAA,GAC9B,WAAA,GAAc,OACd,iBAAA,GAAoB,IAAA,IACpB,cAAA,IAAkB,CAAA,GAAI,MAAM,CAAA,CAAA,IAC5B,YAAA,CAAa,MAAA,GAAS,CAAA,GAAI,IAAA,GAAO,CAAA,CAAA,IACjC,eAAA,GAAkB,IAAA,GAAO,MACzB,WAAA,KAAgB,CAAA,GAAI,IAAA,GAAO,CAAA,CAAA,IAC3B,mBAAmB,CAAA,GAAI,IAAA,GAAO,CAAA,CAAA,IAC9B,2BAAA,GAA8B,IAAI,IAAA,GAAO,CAAA;AAAA,KAC9C;AAEA,IAAA,OAAO;AAAA,MACL,KAAA;AAAA,MACA,MAAA;AAAA,MACA,YAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,YAAY,MAAA,CAAO,MAAA;AAAA,QACnB,WAAW,KAAA,CAAM,MAAA;AAAA,QACjB,eAAA,EAAiB,WAAA;AAAA,QACjB,iBAAA,EAAmB,aAAA;AAAA,QACnB,WAAA;AAAA,QACA,eAAA;AAAA,QACA,kBAAA,EAAoB,cAAA;AAAA,QACpB;AAAA;AACF,KACF;AAAA,EACF;AAAA,EAEQ,uBAAuB,QAAA,EAA+E;AAC5G,IAAA,MAAM,QAAQ,QAAA,IAAY,EAAA,EAAI,QAAQ,OAAA,EAAS,IAAI,EAAE,IAAA,EAAK;AAC1D,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,MAAM,eAAyB,EAAC;AAEhC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAM,MAAA,GAAS,yBAAA;AACf,MAAA,MAAA,CAAO,KAAK,MAAM,CAAA;AAClB,MAAA,YAAA,CAAa,KAAK,MAAM,CAAA;AACxB,MAAA,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,YAAA,EAAa;AAAA,IAC1C;AAGA,IAAA,MAAM,SAAA,GAAY,IAAI,aAAA,EAAc;AACpC,IAAA,MAAM,UAAA,GAAa,SAAA,CAAU,QAAA,CAAS,IAAI,CAAA;AAG1C,IAAA,KAAA,MAAW,KAAA,IAAS,WAAW,MAAA,EAAQ;AACrC,MAAA,MAAA,CAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AACzB,MAAA,IAAI,KAAA,CAAM,aAAa,OAAA,EAAS;AAC9B,QAAA,YAAA,CAAa,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,MACjC;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,SAAS,GAAA,EAAK;AACrB,MAAA,MAAM,MAAA,GAAS,8CAAA;AACf,MAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,EAAG;AAC5B,QAAA,MAAA,CAAO,KAAK,MAAM,CAAA;AAClB,QAAA,YAAA,CAAa,KAAK,MAAM,CAAA;AAAA,MAC1B;AAAA,IACF;AAEA,IAAA,IAAI,qDAAA,CAAsD,IAAA,CAAK,IAAI,CAAA,EAAG;AACpE,MAAA,MAAM,MAAA,GAAS,6CAAA;AACf,MAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,EAAG;AAC5B,QAAA,MAAA,CAAO,KAAK,MAAM,CAAA;AAClB,QAAA,YAAA,CAAa,KAAK,MAAM,CAAA;AAAA,MAC1B;AAAA,IACF;AAGA,IAAA,OAAO,EAAE,KAAA,EAAO,UAAA,CAAW,KAAA,EAAO,QAAQ,YAAA,EAAa;AAAA,EACzD;AAAA,EAEQ,eAAe,IAAA,EAAuB;AAC5C,IAAA,OAAO,2EAAA,CAA4E,KAAK,IAAI,CAAA;AAAA,EAC9F;AAAA,EAEQ,eAAA,CAAgB,MAAc,OAAA,EAAyC;AAE7E,IAAA,IAAI,OAAA,CAAQ,YAAA,CAAa,MAAA,KAAW,CAAA,EAAG;AACrC,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,IAAI,CAAA;AAC3C,IAAA,MAAM,YAAA,GAAe,QAAQ,YAAA,CAAa,IAAA;AAAA,MAAK,CAAC,KAAA,KAC9C,0GAAA,CACG,IAAA,CAAK,KAAK;AAAA,KACf;AAEA,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,IAAI,OAAA,CAAQ,OAAA,CAAQ,SAAA,IAAa,CAAA,IAAK,OAAA,CAAQ,OAAA,CAAQ,eAAA,IAAmB,CAAA,IAAK,OAAA,CAAQ,KAAA,KAAU,UAAA,GAAa,IAAA,GAAO,GAAA,CAAA,EAAM;AACxH,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,QAAQ,KAAA,EAAuB;AACrC,IAAA,IAAI,QAAQ,CAAA,EAAG;AAAC,MAAA,OAAO,CAAA;AAAA,IAAE;AACzB,IAAA,IAAI,QAAQ,CAAA,EAAG;AAAC,MAAA,OAAO,CAAA;AAAA,IAAE;AACzB,IAAA,OAAO,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,EAChC;AAAA,EAEQ,kBAAA,GAA8B;AACpC,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,eAAA;AAAA,MACN,WAAA,EAAa,sFAAA;AAAA,MACb,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,OAAA,EAAS;AAAA,YACP,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,QAAA,EAAU;AAAA,YACR,IAAA,EAAM,OAAA;AAAA,YACN,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YACxB,WAAA,EAAa;AAAA,WACf;AAAA,UACA,aAAA,EAAe;AAAA,YACb,IAAA,EAAM,OAAA;AAAA,YACN,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YACxB,WAAA,EAAa;AAAA;AACf,SACF;AAAA,QACA,QAAA,EAAU,CAAC,SAAA,EAAW,UAAU;AAAA;AAClC,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,OAAA,EAAmC;AACxD,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,eAAA;AAAA,MACN,WAAA,EAAa,CAAA,wCAAA,EAA2C,OAAA,CAAQ,MAAM,CAAA,qDAAA,CAAA;AAAA,MACtE,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,UAAA,EAAY;AAAA,YACV,IAAA,EAAM,QAAA;AAAA,YACN,IAAA,EAAM,CAAC,QAAA,EAAU,QAAA,EAAU,SAAS,CAAA;AAAA,YACpC,WAAA,EAAa;AAAA,WACf;AAAA,UACA,iBAAA,EAAmB;AAAA,YACjB,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,QAAA,EAAU;AAAA,YACR,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,SAAA,EAAW;AAAA,YACT,IAAA,EAAM,QAAA;AAAA,YACN,UAAA,EAAY;AAAA,cACV,YAAA,EAAc,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,cAC/B,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,cAC9B,WAAA,EAAa,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,EAAE,IAAA,EAAM,UAAS;AAAE,aAC1D;AAAA,YACA,QAAA,EAAU,CAAC,cAAA,EAAgB,aAAa;AAAA,WAC1C;AAAA,UACA,QAAA,EAAU;AAAA,YACR,IAAA,EAAM,OAAA;AAAA,YACN,QAAA,EAAU,CAAA;AAAA,YACV,KAAA,EAAO;AAAA,cACL,IAAA,EAAM,QAAA;AAAA,cACN,UAAA,EAAY;AAAA,gBACV,EAAA,EAAI,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,gBACrB,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,gBACzB,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,gBAC3B,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA;AAAS,eAC/B;AAAA,cACA,QAAA,EAAU,CAAC,IAAA,EAAM,QAAA,EAAU,UAAU;AAAA;AACvC,WACF;AAAA,UACA,SAAA,EAAW;AAAA,YACT,IAAA,EAAM,OAAA;AAAA,YACN,QAAA,EAAU,CAAA;AAAA,YACV,KAAA,EAAO;AAAA,cACL,IAAA,EAAM,QAAA;AAAA,cACN,UAAA,EAAY;AAAA,gBACV,EAAA,EAAI,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,gBACrB,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,gBAC5B,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,gBAC5B,WAAA,EAAa,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,EAAE,IAAA,EAAM,UAAS,EAAE;AAAA,gBACxD,cAAA,EAAgB,EAAE,IAAA,EAAM,QAAA;AAAS,eACnC;AAAA,cACA,UAAU,CAAC,IAAA,EAAM,WAAA,EAAa,WAAA,EAAa,eAAe,gBAAgB;AAAA;AAC5E,WACF;AAAA,UACA,YAAA,EAAc;AAAA,YACZ,IAAA,EAAM,OAAA;AAAA,YACN,KAAA,EAAO;AAAA,cACL,IAAA,EAAM,QAAA;AAAA,cACN,UAAA,EAAY;AAAA,gBACV,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,gBACzB,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA;AAAS,eAChC;AAAA,cACA,QAAA,EAAU,CAAC,QAAA,EAAU,aAAa;AAAA;AACpC,WACF;AAAA,UACA,UAAA,EAAY;AAAA,YACV,IAAA,EAAM,OAAA;AAAA,YACN,QAAA,EAAU,CAAA;AAAA,YACV,KAAA,EAAO;AAAA,cACL,IAAA,EAAM,QAAA;AAAA,cACN,UAAA,EAAY;AAAA,gBACV,EAAA,EAAI,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,gBACrB,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,gBAC7B,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,gBAC7B,OAAA,EAAS,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,EAAE,IAAA,EAAM,UAAS,EAAE;AAAA,gBACpD,UAAA,EAAY,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,EAAE,IAAA,EAAM,UAAS,EAAE;AAAA,gBACvD,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA;AAAS,eAC/B;AAAA,cACA,UAAU,CAAC,IAAA,EAAM,YAAA,EAAc,YAAA,EAAc,cAAc,YAAY;AAAA;AACzE,WACF;AAAA,UACA,YAAA,EAAc;AAAA,YACZ,IAAA,EAAM,OAAA;AAAA,YACN,QAAA,EAAU,CAAA;AAAA,YACV,KAAA,EAAO;AAAA,cACL,IAAA,EAAM,QAAA;AAAA,cACN,UAAA,EAAY;AAAA,gBACV,EAAA,EAAI,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,gBACrB,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,gBACxB,eAAA,EAAiB,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,gBAClC,aAAA,EAAe,EAAE,IAAA,EAAM,QAAA;AAAS,eAClC;AAAA,cACA,QAAA,EAAU,CAAC,IAAA,EAAM,OAAA,EAAS,mBAAmB,eAAe;AAAA;AAC9D,WACF;AAAA,UACA,QAAA,EAAU;AAAA,YACR,IAAA,EAAM,QAAA;AAAA,YACN,UAAA,EAAY;AAAA,cACV,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,cAC1B,KAAA,EAAO,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,EAAE,IAAA,EAAM,UAAS;AAAE,aACpD;AAAA,YACA,QAAA,EAAU,CAAC,SAAA,EAAW,OAAO;AAAA,WAC/B;AAAA,UACA,MAAA,EAAQ;AAAA,YACN,IAAA,EAAM,OAAA;AAAA,YACN,WAAA,EAAa,oCAAA;AAAA,YACb,KAAA,EAAO;AAAA,cACL,IAAA,EAAM,QAAA;AAAA,cACN,UAAA,EAAY;AAAA,gBACV,EAAA,EAAI,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,mCAAA,EAAoC;AAAA,gBACvE,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,YAAA,EAAa;AAAA,gBAClD,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,8BAAA,EAA+B;AAAA,gBAC3E,YAAA,EAAc;AAAA,kBACZ,IAAA,EAAM,OAAA;AAAA,kBACN,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,kBACxB,WAAA,EAAa;AAAA,iBACf;AAAA,gBACA,KAAA,EAAO;AAAA,kBACL,IAAA,EAAM,OAAA;AAAA,kBACN,WAAA,EAAa,2BAAA;AAAA,kBACb,KAAA,EAAO;AAAA,oBACL,IAAA,EAAM,QAAA;AAAA,oBACN,UAAA,EAAY;AAAA,sBACV,EAAA,EAAI,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,mCAAA,EAAoC;AAAA,sBACvE,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,uCAAA,EAAwC;AAAA,sBAC/E,IAAA,EAAM;AAAA,wBACJ,IAAA,EAAM,QAAA;AAAA,wBACN,WAAA,EAAa;AAAA,uBACf;AAAA,sBACA,IAAA,EAAM;AAAA,wBACJ,IAAA,EAAM,QAAA;AAAA,wBACN,WAAA,EAAa;AAAA,uBACf;AAAA,sBACA,eAAA,EAAiB;AAAA,wBACf,IAAA,EAAM,QAAA;AAAA,wBACN,WAAA,EAAa;AAAA;AACf,qBACF;AAAA,oBACA,QAAA,EAAU,CAAC,IAAA,EAAM,QAAA,EAAU,iBAAiB;AAAA;AAC9C;AACF,eACF;AAAA,cACA,QAAA,EAAU,CAAC,IAAA,EAAM,MAAA,EAAQ,eAAe,OAAO;AAAA;AACjD;AACF,SACF;AAAA,QACA,QAAA,EAAU,CAAC,UAAU;AAAA;AACvB,KACF;AAAA,EACF;AAAA,EAEQ,uBAAuB,OAAA,EAAmC;AAChE,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,wBAAA;AAAA,MACN,WAAA,EAAa,CAAA,oDAAA,EAAuD,OAAA,CAAQ,MAAM,CAAA,kDAAA,CAAA;AAAA,MAClF,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,UAAA,EAAY;AAAA,YACV,IAAA,EAAM,QAAA;AAAA,YACN,IAAA,EAAM,CAAC,QAAA,EAAU,QAAA,EAAU,SAAS,CAAA;AAAA,YACpC,WAAA,EAAa;AAAA,WACf;AAAA,UACA,iBAAA,EAAmB;AAAA,YACjB,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,QAAA,EAAU;AAAA,YACR,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,SAAA,EAAW;AAAA,YACT,IAAA,EAAM,QAAA;AAAA,YACN,UAAA,EAAY;AAAA,cACV,YAAA,EAAc,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,cAC/B,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,cAC9B,WAAA,EAAa,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,EAAE,IAAA,EAAM,UAAS;AAAE,aAC1D;AAAA,YACA,QAAA,EAAU,CAAC,cAAA,EAAgB,aAAa;AAAA,WAC1C;AAAA,UACA,QAAA,EAAU;AAAA,YACR,IAAA,EAAM,OAAA;AAAA,YACN,QAAA,EAAU,CAAA;AAAA,YACV,KAAA,EAAO;AAAA,cACL,IAAA,EAAM,QAAA;AAAA,cACN,UAAA,EAAY;AAAA,gBACV,EAAA,EAAI,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,gBACrB,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,gBACzB,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,gBAC3B,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA;AAAS,eAC/B;AAAA,cACA,QAAA,EAAU,CAAC,IAAA,EAAM,QAAA,EAAU,UAAU;AAAA;AACvC,WACF;AAAA,UACA,iBAAA,EAAmB;AAAA,YACjB,IAAA,EAAM,OAAA;AAAA,YACN,QAAA,EAAU,CAAA;AAAA,YACV,KAAA,EAAO;AAAA,cACL,IAAA,EAAM,QAAA;AAAA,cACN,UAAA,EAAY;AAAA,gBACV,EAAA,EAAI,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,gBACrB,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,0BAAA,EAA2B;AAAA,gBAClE,MAAA,EAAQ;AAAA,kBACN,IAAA,EAAM,QAAA;AAAA,kBACN,MAAM,CAAC,SAAA,EAAW,SAAS,QAAA,EAAU,UAAA,EAAY,WAAW,aAAa;AAAA,iBAC3E;AAAA,gBACA,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,gBAC5B,cAAA,EAAgB,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,gBACjC,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA;AAAS,eAC/B;AAAA,cACA,UAAU,CAAC,IAAA,EAAM,UAAU,QAAA,EAAU,WAAA,EAAa,kBAAkB,YAAY;AAAA;AAClF,WACF;AAAA,UACA,UAAA,EAAY;AAAA,YACV,IAAA,EAAM,OAAA;AAAA,YACN,QAAA,EAAU,CAAA;AAAA,YACV,KAAA,EAAO;AAAA,cACL,IAAA,EAAM,QAAA;AAAA,cACN,UAAA,EAAY;AAAA,gBACV,EAAA,EAAI,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,gBACrB,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,gBAC7B,WAAA,EAAa,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,EAAE,IAAA,EAAM,UAAS,EAAE;AAAA,gBACxD,UAAA,EAAY,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,EAAE,IAAA,EAAM,UAAS,EAAE;AAAA,gBACvD,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA;AAAS,eAC/B;AAAA,cACA,UAAU,CAAC,IAAA,EAAM,YAAA,EAAc,aAAA,EAAe,cAAc,YAAY;AAAA;AAC1E,WACF;AAAA,UACA,MAAA,EAAQ;AAAA,YACN,IAAA,EAAM,OAAA;AAAA,YACN,WAAA,EAAa,oCAAA;AAAA,YACb,KAAA,EAAO;AAAA,cACL,IAAA,EAAM,QAAA;AAAA,cACN,UAAA,EAAY;AAAA,gBACV,EAAA,EAAI,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,mCAAA,EAAoC;AAAA,gBACvE,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,YAAA,EAAa;AAAA,gBAClD,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,8BAAA,EAA+B;AAAA,gBAC3E,YAAA,EAAc;AAAA,kBACZ,IAAA,EAAM,OAAA;AAAA,kBACN,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,kBACxB,WAAA,EAAa;AAAA,iBACf;AAAA,gBACA,KAAA,EAAO;AAAA,kBACL,IAAA,EAAM,OAAA;AAAA,kBACN,WAAA,EAAa,2BAAA;AAAA,kBACb,KAAA,EAAO;AAAA,oBACL,IAAA,EAAM,QAAA;AAAA,oBACN,UAAA,EAAY;AAAA,sBACV,EAAA,EAAI,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,mCAAA,EAAoC;AAAA,sBACvE,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,uCAAA,EAAwC;AAAA,sBAC/E,IAAA,EAAM;AAAA,wBACJ,IAAA,EAAM,QAAA;AAAA,wBACN,WAAA,EAAa;AAAA,uBACf;AAAA,sBACA,IAAA,EAAM;AAAA,wBACJ,IAAA,EAAM,QAAA;AAAA,wBACN,WAAA,EAAa;AAAA,uBACf;AAAA,sBACA,eAAA,EAAiB;AAAA,wBACf,IAAA,EAAM,QAAA;AAAA,wBACN,WAAA,EAAa;AAAA;AACf,qBACF;AAAA,oBACA,QAAA,EAAU,CAAC,IAAA,EAAM,QAAA,EAAU,iBAAiB;AAAA;AAC9C;AACF,eACF;AAAA,cACA,QAAA,EAAU,CAAC,IAAA,EAAM,MAAA,EAAQ,eAAe,OAAO;AAAA;AACjD;AACF,SACF;AAAA,QACA,QAAA,EAAU,CAAC,UAAU;AAAA;AACvB,KACF;AAAA,EACF;AAAA,EAEQ,oBAAA,GAAgC;AACtC,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,aAAA;AAAA,MACN,WAAA,EAAa,4FAAA;AAAA,MACb,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,UAAA,EAAY;AAAA,YACV,IAAA,EAAM,QAAA;AAAA,YACN,IAAA,EAAM,CAAC,QAAA,EAAU,QAAA,EAAU,SAAS,CAAA;AAAA,YACpC,WAAA,EAAa;AAAA,WACf;AAAA,UACA,iBAAA,EAAmB;AAAA,YACjB,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,eAAA,EAAiB;AAAA,YACf,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,QAAA,EAAU;AAAA,YACR,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,MAAA,EAAQ;AAAA,YACN,IAAA,EAAM,OAAA;AAAA,YACN,WAAA,EAAa,0BAAA;AAAA,YACb,KAAA,EAAO;AAAA,cACL,IAAA,EAAM,QAAA;AAAA,cACN,UAAA,EAAY;AAAA,gBACV,EAAA,EAAI,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,gBACrB,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,gBACvB,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,gBAC9B,YAAA,EAAc,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,EAAE,IAAA,EAAM,UAAS,EAAE;AAAA,gBACzD,KAAA,EAAO;AAAA,kBACL,IAAA,EAAM,OAAA;AAAA,kBACN,KAAA,EAAO;AAAA,oBACL,IAAA,EAAM,QAAA;AAAA,oBACN,UAAA,EAAY;AAAA,sBACV,EAAA,EAAI,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,sBACrB,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,sBACzB,IAAA,EAAM;AAAA,wBACJ,IAAA,EAAM,QAAA;AAAA,wBACN,WAAA,EAAa;AAAA,uBACf;AAAA,sBACA,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,sBACvB,eAAA,EAAiB,EAAE,IAAA,EAAM,QAAA;AAAS,qBACpC;AAAA,oBACA,QAAA,EAAU,CAAC,IAAA,EAAM,QAAA,EAAU,iBAAiB;AAAA;AAC9C;AACF,eACF;AAAA,cACA,QAAA,EAAU,CAAC,IAAA,EAAM,MAAA,EAAQ,eAAe,OAAO;AAAA;AACjD;AACF,SACF;AAAA,QACA,QAAA,EAAU,CAAC,UAAU;AAAA;AACvB,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,QAAA,EAAmC;AAC1D,IAAA,MAAM,QAAmB,EAAC;AAG1B,IAAA,MAAM,iBAAA,GAAoB;AAAA,MACxB,gBAAA;AAAA,MACA,gBAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA,MACA,iBAAA;AAAA,MACA,kBAAA;AAAA,MACA,kBAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,KAAA,MAAW,YAAY,iBAAA,EAAmB;AACxC,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAA;AAClC,MAAA,IAAI,IAAA,EAAM;AAER,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,UACT,IAAA,EAAM,IAAA,CAAK,UAAA,CAAW,QAAA,CAAS,IAAA;AAAA,UAC/B,WAAA,EAAa,IAAA,CAAK,UAAA,CAAW,QAAA,CAAS,WAAA,IAAe,EAAA;AAAA,UACrD,WAAA,EAAa,IAAA,CAAK,UAAA,CAAW,QAAA,CAAS;AAAA,SACvC,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,wBAAwB,MAAA,EAAwB;AACtD,IAAA,OAAO,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,EAAG,GAAA,MAAS;AAAA,MAC7B,EAAA,EAAI,CAAA,CAAE,EAAA,IAAM,CAAA,MAAA,EAAS,MAAM,CAAC,CAAA,CAAA;AAAA,MAC5B,IAAA,EAAM,IAAA,CAAK,kBAAA,CAAmB,CAAA,CAAE,IAAA,EAAM,EAAE,WAAA,EAAa,CAAA,CAAE,KAAA,EAAO,GAAA,GAAM,CAAC,CAAA;AAAA,MACrE,aAAa,IAAA,CAAK,yBAAA,CAA0B,CAAA,CAAE,WAAA,EAAa,EAAE,KAAK,CAAA;AAAA,MAClE,YAAA,EAAc,MAAM,OAAA,CAAQ,CAAA,CAAE,YAAY,CAAA,GAAI,CAAA,CAAE,eAAe,EAAC;AAAA,MAChE,MAAA,EAAQ,SAAA;AAAA,MACR,KAAA,EAAA,CAAQ,EAAE,KAAA,IAAS,IAAI,GAAA,CAAI,CAAC,GAAQ,OAAA,MAAqB;AAAA,QACvD,EAAA,EAAI,EAAE,EAAA,IAAM,CAAA,KAAA,EAAQ,MAAM,CAAC,CAAA,CAAA,EAAI,UAAU,CAAC,CAAA,CAAA;AAAA,QAC1C,MAAA,EAAQ,IAAA,CAAK,mBAAA,CAAoB,CAAA,CAAE,MAAM,CAAA;AAAA,QACzC,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,IAAA,EAAM,CAAA,CAAE,IAAA,IAAQ,EAAC;AAAA,QACjB,iBAAiB,IAAA,CAAK,wBAAA,CAAyB,CAAA,CAAE,eAAA,EAAiB,EAAE,MAAM,CAAA;AAAA,QAC1E,MAAA,EAAQ;AAAA,OACV,CAAE;AAAA,KACJ,CAAE,CAAA;AAAA,EACJ;AAAA,EAEQ,wBAAwB,QAAA,EAA2B;AACzD,IAAA,MAAM,MAAA,GAAS,OAAO,QAAA,KAAa,QAAA,GAAW,SAAS,OAAA,CAAQ,OAAA,EAAS,IAAI,CAAA,GAAI,EAAA;AAChF,IAAA,IAAI,CAAC,MAAA,CAAO,IAAA,EAAK,EAAG;AAClB,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAC/B,IAAA,MAAM,cAAoE,EAAC;AAC3E,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,MAAM,QAAQ,uBAAA,CAAwB,IAAA,CAAK,KAAA,CAAM,CAAC,KAAK,EAAE,CAAA;AACzD,MAAA,IAAI,CAAC,KAAA,EAAO;AAAC,QAAA;AAAA,MAAS;AACtB,MAAA,WAAA,CAAY,IAAA,CAAK;AAAA,QACf,KAAA,EAAO,CAAA;AAAA,QACP,KAAA,EAAO,KAAA,CAAM,CAAC,CAAA,KAAM,QAAQ,CAAA,GAAI,CAAA;AAAA,QAChC,IAAA,EAAA,CAAO,KAAA,CAAM,CAAC,CAAA,IAAK,IAAI,IAAA;AAAK,OAC7B,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,mBAAA,GAAsB,CAAC,IAAA,KAA0B,0FAAA,CAA2F,KAAK,IAAI,CAAA;AAC3J,IAAA,MAAM,cAAA,GAAiB,CAAC,KAAA,EAAc,IAAA,KACnC,UAAU,CAAA,IAAK,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA,IACjC,KAAA,KAAU,CAAA,IAAK,CAAC,oBAAoB,IAAI,CAAA;AAE9C,IAAA,MAAM,sBAAsB,WAAA,CACzB,MAAA,CAAO,CAAC,OAAA,KAAY,eAAe,OAAA,CAAQ,KAAA,EAAO,OAAA,CAAQ,IAAI,CAAC,CAAA,CAC/D,GAAA,CAAI,CAAC,OAAA,KAAY,QAAQ,KAAK,CAAA;AAEjC,IAAA,MAAM,YAAA,GAAe,KAAA,CAAM,SAAA,CAAU,CAAC,IAAA,KAAS,2CAA2C,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,CAAC,CAAA;AAC3G,IAAA,MAAM,aAAa,YAAA,IAAgB,CAAA,GAC/B,KAAA,CAAM,SAAA,CAAU,CAAC,IAAA,EAAM,GAAA,KAAQ,GAAA,GAAM,YAAA,IAAgB,SAAS,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,CAAC,CAAA,GAC/E,EAAA;AAEJ,IAAA,MAAM,qBAAqB,CAAC,IAAA,KAA6B,IAAA,CACtD,GAAA,CAAI,CAAC,IAAA,KAAS;AACb,MAAA,MAAM,MAAA,GAAS,qBAAA,CAAsB,IAAA,CAAK,IAAI,CAAA;AAC9C,MAAA,IAAI,MAAA,GAAS,CAAC,CAAA,EAAG;AAAC,QAAA,OAAO,MAAA,CAAO,CAAC,CAAA,CAAE,IAAA,EAAK;AAAA,MAAE;AAC1C,MAAA,MAAM,QAAA,GAAW,sBAAA,CAAuB,IAAA,CAAK,IAAI,CAAA;AACjD,MAAA,OAAO,QAAA,GAAW,CAAC,CAAA,EAAG,IAAA,EAAK,IAAK,EAAA;AAAA,IAClC,CAAC,CAAA,CACA,MAAA,CAAO,OAAO,CAAA;AAEjB,IAAA,IAAI,mBAAA,CAAoB,WAAW,CAAA,EAAG;AACpC,MAAA,IAAI,eAAe,CAAA,EAAG;AAAC,QAAA,OAAO,EAAC;AAAA,MAAE;AACjC,MAAA,MAAM,WAAA,GAAc,MAAM,KAAA,CAAM,YAAA,GAAe,GAAG,UAAA,IAAc,CAAA,GAAI,UAAA,GAAa,KAAA,CAAM,MAAM,CAAA;AAC7F,MAAA,MAAM,OAAA,GAAU,mBAAmB,WAAW,CAAA;AAC9C,MAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAAC,QAAA,OAAO,EAAC;AAAA,MAAE;AACrC,MAAA,OAAO,CAAC;AAAA,QACN,EAAA,EAAI,SAAA;AAAA,QACJ,IAAA,EAAM,sBAAA;AAAA,QACN,WAAA,EAAa,sDAAA;AAAA,QACb,cAAc,EAAC;AAAA,QACf,MAAA,EAAQ,SAAA;AAAA,QACR,KAAA,EAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAM,GAAA,MAAS;AAAA,UACjC,EAAA,EAAI,CAAA,OAAA,EAAU,GAAA,GAAM,CAAC,CAAA,CAAA;AAAA,UACrB,MAAA,EAAQ,IAAA;AAAA,UACR,eAAA,EAAiB,IAAA,CAAK,wBAAA,CAAyB,IAAI,CAAA;AAAA,UACnD,MAAA,EAAQ;AAAA,SACV,CAAE;AAAA,OACH,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,mBAAA,CAAoB,GAAA,CAAI,CAAC,KAAA,EAAO,GAAA,KAAQ;AAC7C,MAAA,MAAM,cAAA,GAAiB,mBAAA,CAAoB,GAAA,GAAM,CAAC,KAAK,KAAA,CAAM,MAAA;AAC7D,MAAA,MAAM,sBAAsB,WAAA,CACzB,IAAA,CAAK,CAACC,QAAAA,KAAYA,SAAQ,KAAA,GAAQ,KAAA,IAASA,QAAAA,CAAQ,KAAA,KAAU,KAAK,CAAC,WAAA,CAAY,KAAKA,QAAAA,CAAQ,IAAI,CAAC,CAAA,EAChG,KAAA;AACJ,MAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,cAAA,EAAgB,mBAAA,IAAuB,MAAM,MAAM,CAAA;AACxE,MAAA,MAAM,OAAA,GAAA,CAAW,KAAA,CAAM,KAAK,CAAA,IAAK,EAAA,EAAI,OAAA,CAAQ,cAAA,EAAgB,EAAE,CAAA,CAAE,IAAA,EAAK,IAAK,CAAA,WAAA,EAAc,MAAM,CAAC,CAAA,CAAA;AAChG,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,KAAA,GAAQ,GAAG,GAAG,CAAA;AACvC,MAAA,MAAM,OAAA,GAAU,mBAAmB,IAAI,CAAA;AAEvC,MAAA,MAAM,KAAA,GAAA,CAAS,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,OAAA,GAAU,CAAC,0CAA0C,CAAA,EAAG,GAAA,CAAI,CAAC,IAAA,EAAM,OAAA,MAAa;AAAA,QAClH,IAAI,CAAA,KAAA,EAAQ,GAAA,GAAM,CAAC,CAAA,CAAA,EAAI,UAAU,CAAC,CAAA,CAAA;AAAA,QAClC,MAAA,EAAQ,IAAA;AAAA,QACR,eAAA,EAAiB,IAAA,CAAK,wBAAA,CAAyB,IAAI,CAAA;AAAA,QACnD,MAAA,EAAQ;AAAA,OACV,CAAE,CAAA;AAEF,MAAA,MAAM,kBAAkB,IAAA,CAAK,IAAA,CAAK,CAAC,IAAA,KAAS,KAAK,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA,IAAK,CAAC,aAAA,CAAc,IAAA,CAAK,IAAI,CAAC,GAAG,IAAA,EAAK;AAEvG,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,CAAA,MAAA,EAAS,GAAA,GAAM,CAAC,CAAA,CAAA;AAAA,QACpB,MAAM,IAAA,CAAK,kBAAA,CAAmB,SAAS,eAAA,EAAiB,KAAA,EAAO,MAAM,CAAC,CAAA;AAAA,QACtE,WAAA,EAAa,IAAA,CAAK,yBAAA,CAA0B,eAAA,EAAiB,KAAK,CAAA;AAAA,QAClE,YAAA,EAAc,QAAQ,CAAA,GAAI,KAAK,CAAC,CAAA,MAAA,EAAS,GAAG,CAAA,CAAE,CAAA;AAAA,QAC9C,MAAA,EAAQ,SAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,qBAAA,CAAsB,IAAA,EAAc,QAAA,EAAmB,MAAA,EAAyB;AACtF,IAAA,MAAM,IAAA,GAAO,OAAO,QAAA,KAAa,QAAA,GAAW,QAAA,CAAS,QAAQ,OAAA,EAAS,IAAI,CAAA,CAAE,IAAA,EAAK,GAAI,EAAA;AACrF,IAAA,MAAM,oBAAA,GAAuB,qDAAA,CAAsD,IAAA,CAAK,IAAI,CAAA;AAC5F,IAAA,IAAI,IAAA,IAAQ,CAAC,oBAAA,EAAsB;AACjC,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU;AAAA,MAC3C,CAAA,IAAA,EAAO,MAAM,IAAI,CAAA,CAAA;AAAA,MACjB,EAAA;AAAA,MACA,KAAA,CAAM,WAAA;AAAA,MACN,EAAA;AAAA,MACA,GAAG,MAAM,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,CAAA,EAAA,EAAK,IAAA,CAAK,MAAM,CAAA,CAAE;AAAA,MAC/C,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,KAAK,MAAM,CAAA;AAEzB,IAAA,OAAO;AAAA,MACL,CAAA,QAAA,EAAW,QAAQ,eAAe,CAAA,CAAA;AAAA,MAClC,EAAA;AAAA,MACA,SAAA;AAAA,MACA,EAAA;AAAA,MACA,IAAA,IAAQ,iBAAA;AAAA,MACR,EAAA;AAAA,MACA,UAAA;AAAA,MACA,EAAA;AAAA,MACA,cAAA,IAAkB,sEAAA;AAAA,MAClB,EAAA;AAAA,MACA,UAAA;AAAA,MACA,EAAA;AAAA,MACA,wDAAA;AAAA,MACA,EAAA;AAAA,MACA,iBAAA;AAAA,MACA,EAAA;AAAA,MACA,yCAAA;AAAA,MACA,EAAA;AAAA,MACA,aAAA;AAAA,MACA,EAAA;AAAA,MACA;AAAA,KACF,CAAE,IAAA,CAAK,IAAI,CAAA,CAAE,IAAA,EAAK;AAAA,EACpB;AAAA,EAEQ,qBAAqB,IAAA,EAAuB;AAClD,IAAA,MAAM,SAAA,GAAA,CAAa,IAAA,IAAQ,oBAAA,EAAsB,IAAA,EAAK;AACtD,IAAA,OAAO,CAAC;AAAA,MACN,EAAA,EAAI,SAAA;AAAA,MACJ,IAAA,EAAM,mBAAA;AAAA,MACN,WAAA,EAAa,8EAAA;AAAA,MACb,cAAc,EAAC;AAAA,MACf,MAAA,EAAQ,SAAA;AAAA,MACR,KAAA,EAAO;AAAA,QACL;AAAA,UACE,EAAA,EAAI,UAAA;AAAA,UACJ,MAAA,EAAQ,sDAAsD,SAAS,CAAA,CAAA;AAAA,UACvE,eAAA,EAAiB,iDAAA;AAAA,UACjB,MAAA,EAAQ;AAAA,SACV;AAAA,QACA;AAAA,UACE,EAAA,EAAI,UAAA;AAAA,UACJ,MAAA,EAAQ,sCAAsC,SAAS,CAAA,CAAA;AAAA,UACvD,eAAA,EAAiB,gDAAA;AAAA,UACjB,MAAA,EAAQ;AAAA,SACV;AAAA,QACA;AAAA,UACE,EAAA,EAAI,UAAA;AAAA,UACJ,MAAA,EAAQ,gCAAgC,SAAS,CAAA,CAAA;AAAA,UACjD,IAAA,EAAM,YAAA;AAAA,UACN,IAAA,EAAM,EAAE,OAAA,EAAS,0CAAA,EAA2C;AAAA,UAC5D,eAAA,EAAiB,8CAAA;AAAA,UACjB,MAAA,EAAQ;AAAA;AACV;AACF,KACD,CAAA;AAAA,EACH;AAAA,EAEQ,uCAAuC,UAAA,EAA4C;AACzF,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,IAAK,UAAA,CAAW,WAAW,CAAA,EAAG;AACzD,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,OAAO,WACJ,MAAA,CAAO,CAAC,IAAA,KAKJ,OAAO,SAAS,QAAA,IAAY,IAAA,KAAS,IAAI,CAAA,CAC7C,MAAM,CAAA,EAAG,CAAC,EACV,GAAA,CAAI,CAAC,KAAK,GAAA,KAAQ;AACjB,MAAA,MAAM,WAAA,GAAc,MAAM,OAAA,CAAQ,GAAA,CAAI,WAAW,CAAA,GAC7C,GAAA,CAAI,YAAY,MAAA,CAAO,CAAC,UAA2B,OAAO,KAAA,KAAU,YAAY,KAAA,CAAM,IAAA,GAAO,MAAA,GAAS,CAAC,IACvG,EAAC;AACL,MAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA,GAC3C,GAAA,CAAI,WAAW,MAAA,CAAO,CAAC,UAA2B,OAAO,KAAA,KAAU,YAAY,KAAA,CAAM,IAAA,GAAO,MAAA,GAAS,CAAC,IACtG,EAAC;AACL,MAAA,MAAM,UAAA,GAAa,CAAA,KAAA,EAAQ,GAAA,GAAM,CAAC,CAAA,CAAA;AAClC,MAAA,MAAM,QAAwB,EAAC;AAE/B,MAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,UACT,EAAA,EAAI,GAAG,UAAU,CAAA,EAAA,CAAA;AAAA,UACjB,MAAA,EAAQ,CAAA,+BAAA,EAAkC,WAAA,CAAY,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,UAChE,IAAA,EAAM,SAAA;AAAA,UACN,IAAA,EAAM,EAAE,KAAA,EAAO,WAAA,EAAY;AAAA,UAC3B,eAAA,EAAiB,wCAAA;AAAA,UACjB,MAAA,EAAQ;AAAA,SACT,CAAA;AAAA,MACH;AAEA,MAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,UACT,EAAA,EAAI,GAAG,UAAU,CAAA,EAAA,CAAA;AAAA,UACjB,MAAA,EAAQ,CAAA,sBAAA,EAAyB,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,UACtD,IAAA,EAAM,SAAA;AAAA,UACN,IAAA,EAAM,EAAE,UAAA,EAAW;AAAA,UACnB,eAAA,EAAiB,0CAAA;AAAA,UACjB,MAAA,EAAQ;AAAA,SACT,CAAA;AAAA,MACH;AAEA,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,EAAA,EAAI,GAAG,UAAU,CAAA,EAAA,CAAA;AAAA,QACjB,QAAQ,CAAA,mBAAA,EAAsB,GAAA,CAAI,MAAM,CAAA,WAAA,EAAc,GAAA,GAAM,CAAC,CAAA,CAAE,CAAA,CAAA;AAAA,QAC/D,IAAA,EAAM,YAAA;AAAA,QACN,IAAA,EAAM,EAAE,OAAA,EAAS,GAAA,CAAI,cAAc,WAAA,EAAY;AAAA,QAC/C,eAAA,EAAiB,2CAAA;AAAA,QACjB,MAAA,EAAQ;AAAA,OACT,CAAA;AAED,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,CAAA,MAAA,EAAS,GAAA,GAAM,CAAC,CAAA,CAAA;AAAA,QACpB,MAAM,IAAA,CAAK,kBAAA;AAAA,UACT,GAAA,CAAI,EAAA,IAAM,CAAA,WAAA,EAAc,GAAA,GAAM,CAAC,CAAA,CAAA;AAAA,UAC/B,0BAA0B,GAAA,CAAI,EAAA,IAAM,CAAA,WAAA,EAAc,GAAA,GAAM,CAAC,CAAA,CAAE,CAAA,CAAA;AAAA,UAC3D,KAAA;AAAA,UACA,GAAA,GAAM;AAAA,SACR;AAAA,QACA,aAAa,CAAA,uBAAA,EAA0B,GAAA,CAAI,MAAM,CAAA,WAAA,EAAc,GAAA,GAAM,CAAC,CAAA,CAAE,CAAA,CAAA;AAAA,QACxE,YAAA,EAAc,QAAQ,CAAA,GAAI,KAAK,CAAC,CAAA,MAAA,EAAS,GAAG,CAAA,CAAE,CAAA;AAAA,QAC9C,MAAA,EAAQ,SAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAC,CAAA;AAAA,EACL;AAAA,EAEQ,kBAAA,CACN,OAAA,EACA,cAAA,EACA,QAAA,EACA,MAAA,EACQ;AACR,IAAA,MAAM,OAAO,OAAO,OAAA,KAAY,QAAA,GAAW,OAAA,CAAQ,MAAK,GAAI,EAAA;AAC5D,IAAA,MAAM,cAAc,OAAO,cAAA,KAAmB,QAAA,GAAW,cAAA,CAAe,MAAK,GAAI,EAAA;AACjF,IAAA,MAAM,QAAQ,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,WAAW,EAAC;AAEpD,IAAA,MAAM,WAAA,GAAc,8DAAA,CAA+D,IAAA,CAAK,IAAI,CAAA,IACvF,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA,IACpB,mBAAA,CAAoB,IAAA,CAAK,IAAI,CAAA;AAClC,IAAA,IAAI,CAAC,QAAQ,WAAA,EAAa;AACxB,MAAA,MAAM,wBAAA,GAA2B,IAAA,CAAK,iBAAA,CAAkB,WAAW,CAAA;AACnE,MAAA,IAAI,wBAAA,EAA0B;AAAC,QAAA,OAAO,wBAAA;AAAA,MAAyB;AAC/D,MAAA,MAAM,WAAA,GAAc,OAAO,KAAA,CAAM,CAAC,CAAA,EAAG,WAAW,QAAA,GAAW,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA,GAAS,EAAA;AAC7E,MAAA,MAAM,mBAAA,GAAsB,IAAA,CAAK,iBAAA,CAAkB,WAAW,CAAA;AAC9D,MAAA,IAAI,mBAAA,EAAqB;AAAC,QAAA,OAAO,mBAAA;AAAA,MAAoB;AACrD,MAAA,OAAO,aAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,yBAAA,CAA0B,gBAAyB,QAAA,EAA2B;AACpF,IAAA,MAAM,cAAc,OAAO,cAAA,KAAmB,QAAA,GAAW,cAAA,CAAe,MAAK,GAAI,EAAA;AACjF,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,OAAO,WAAA;AAAA,IACT;AACA,IAAA,MAAM,QAAQ,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,WAAW,EAAC;AACpD,IAAA,MAAM,WAAA,GAAc,OAAO,KAAA,CAAM,CAAC,CAAA,EAAG,MAAA,KAAW,QAAA,GAAW,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA,CAAO,IAAA,EAAK,GAAI,EAAA;AACpF,IAAA,OAAO,WAAA,IAAe,6CAAA;AAAA,EACxB;AAAA,EAEQ,oBAAoB,SAAA,EAA4B;AACtD,IAAA,MAAM,SAAS,OAAO,SAAA,KAAc,QAAA,GAAW,SAAA,CAAU,MAAK,GAAI,EAAA;AAClE,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,qCAAA;AAAA,IACT;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,wBAAA,CAAyB,aAAsB,SAAA,EAA4B;AACjF,IAAA,MAAM,WAAW,OAAO,WAAA,KAAgB,QAAA,GAAW,WAAA,CAAY,MAAK,GAAI,EAAA;AACxE,IAAA,IACE,QAAA,IACA,CAAC,yGAAA,CAA0G,IAAA,CAAK,QAAQ,CAAA,EACxH;AACA,MAAA,OAAO,QAAA;AAAA,IACT;AACA,IAAA,MAAM,SAAS,OAAO,SAAA,KAAc,QAAA,GAAW,SAAA,CAAU,MAAK,GAAI,EAAA;AAClE,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAO,IAAA,CAAK,yBAAyB,MAAM,CAAA;AAAA,IAC7C;AACA,IAAA,OAAO,wCAAA;AAAA,EACT;AAAA,EAEQ,kBAAkB,KAAA,EAAuB;AAC/C,IAAA,MAAM,OAAA,GAAU,KAAA,CACb,OAAA,CAAQ,4BAAA,EAA8B,EAAE,CAAA,CACxC,OAAA,CAAQ,yBAAA,EAA2B,cAAc,CAAA,CACjD,OAAA,CAAQ,MAAA,EAAQ,GAAG,EACnB,IAAA,EAAK;AACR,IAAA,IAAI,CAAC,OAAA,EAAS;AAAC,MAAA,OAAO,EAAA;AAAA,IAAG;AACzB,IAAA,MAAM,UAAA,GAAa,QAAQ,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA,EAAG,MAAK,IAAK,EAAA;AACpD,IAAA,IAAI,CAAC,UAAA,EAAY;AAAC,MAAA,OAAO,EAAA;AAAA,IAAG;AAC5B,IAAA,OAAO,UAAA,CAAW,SAAS,EAAA,GAAK,CAAA,EAAG,WAAW,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,GAAA,CAAA,GAAQ,UAAA;AAAA,EACpE;AAAA,EAEQ,yBAAyB,MAAA,EAAwB;AACvD,IAAA,MAAM,UAAA,GAAa,MAAA,CAChB,OAAA,CAAQ,yBAAA,EAA2B,2BAA2B,CAAA,CAC9D,OAAA,CAAQ,4BAAA,EAA8B,EAAE,CAAA,CACxC,OAAA,CAAQ,MAAA,EAAQ,GAAG,EACnB,IAAA,EAAK;AACR,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,OAAO,wCAAA;AAAA,IACT;AACA,IAAA,MAAM,KAAA,GAAQ,WAAW,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA,EAAG,MAAK,IAAK,UAAA;AAClD,IAAA,OAAO,KAAA,CAAM,SAAS,GAAA,GAAM,CAAA,EAAG,MAAM,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,GAAA,CAAA,GAAQ,KAAA;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAKQ,kBACN,IAAA,EACA,IAAA,EACA,YACA,eAAA,EACA,YAAA,GAA2D,iBAC3D,eAAA,EACQ;AACR,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,cAAA,CAAe,IAAI,CAAA;AAC5C,IAAA,MAAM,OAAA,GAAU,eAAA,IAAmB,IAAA,CAAK,oBAAA,CAAqB,IAAI,CAAA;AACjE,IAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,cAAA,CAAe,MAAA,GAAS,IAAI,OAAA,CAAQ,cAAA,GAAiB,CAAC,SAAA,EAAW,UAAA,EAAY,UAAA,EAAY,SAAA,EAAW,YAAA,EAAc,eAAe,aAAa,CAAA;AAC7K,IAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,cAAA,CAAe,MAAA,GAAS,CAAA,GAAI,QAAQ,cAAA,GAAiB,cAAA,CAAe,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAC7G,IAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,YAAA,CAAa,MAAA,GAAS,CAAA,GAAI,QAAQ,YAAA,GAAe,CAAC,UAAA,EAAY,gBAAA,EAAkB,cAAc,CAAA;AAG3H,IAAA,MAAM,kBAAkB,eAAA,GACpB;;AAAA;AAAA;;AAAA,EAGN,eAAe;;AAAA,wHAAA,CAAA,GAGT,EAAA;AAEJ,IAAA,OAAO,CAAA;;AAAA,MAAA,EAEH,IAAI;;AAAA,MAAA,EAEJ,IAAI;AAAA,EACV,WAAW;AAAA,QAAA,EACH,QAAQ,MAAM;AAAA,cAAA,EACR,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC;AAAA,iBAAA,EACpB,cAAA,CAAe,IAAA,CAAK,IAAI,CAAC;AAAA,+BAAA,EACX,cAAA,CAAe,IAAA,CAAK,IAAI,CAAC;;AAAA,EAExD,aAAa,CAAA,iBAAA,EAAoB,UAAU,CAAA,CAAA,GAAK,EAAE,GAAG,eAAe;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,mEAAA,EA4BD,YAAY,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,CAAA;AAAA,EAyC/E;AAAA,EAEQ,yBAAA,CACN,IAAA,EACA,IAAA,EACA,UAAA,EACQ;AACR,IAAA,OAAO,CAAA;;AAAA,MAAA,EAEH,IAAI;AAAA,MAAA,EACJ,IAAI;AAAA,EACV,UAAA,GAAa,CAAA,iBAAA,EAAoB,UAAU,CAAA,CAAA,GAAK,EAAE;;AAAA;AAAA,wFAAA,CAAA;AAAA,EAIlD;AAAA,EAEQ,uBAAA,CACN,IAAA,EACA,QAAA,EACA,IAAA,EACA,eAAA,EACQ;AACR,IAAA,MAAM,kBAAkB,eAAA,GACpB;;AAAA;AAAA,EAAwD,eAAe,CAAA,CAAA,GACvE,EAAA;AAEJ,IAAA,OAAO,CAAA;;AAAA,mBAAA,EAEU,KAAK,IAAI;AAAA,MAAA,EACtB,IAAI;AAAA,UAAA,EACA,QAAQ;;AAAA;AAAA,EAGlB,KAAK,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAO,GAAA,KAAQ,GAAG,GAAA,GAAM,CAAC,KAAK,KAAA,CAAM,IAAI,KAAK,KAAA,CAAM,WAAW,EAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC;;AAAA,EAE7F,eAAe;;AAAA;AAAA;AAAA,4DAAA,CAAA;AAAA,EAKf;AAAA,EAEQ,oBAAA,CAAqB,MAAc,YAAA,EAA8C;AACvF,IAAA,MAAM,IAAA,GAAO,KAAK,WAAA,EAAY;AAC9B,IAAA,MAAM,cAAA,GAAiB,YAAA,EAAc,YAAA,EAAa,IAAK,EAAC;AAExD,IAAA,MAAM,MAAA,GAAS,2DAAA,CAA4D,IAAA,CAAK,IAAI,IAChF,KAAA,GACA,0DAAA,CAA2D,IAAA,CAAK,IAAI,IAClE,SAAA,GACA,6DAAA,CAA8D,IAAA,CAAK,IAAI,IACrE,MAAA,GACA,SAAA;AAER,IAAA,MAAM,YAAA,uBAAmB,GAAA,EAAY;AACrC,IAAA,KAAA,MAAW,QAAQ,cAAA,EAAgB;AACjC,MAAA,IAAI,oDAAA,CAAqD,IAAA,CAAK,IAAI,CAAA,EAAG;AAAC,QAAA,YAAA,CAAa,IAAI,qBAAqB,CAAA;AAAA,MAAE;AAC9G,MAAA,IAAI,sCAAA,CAAuC,IAAA,CAAK,IAAI,CAAA,EAAG;AAAC,QAAA,YAAA,CAAa,IAAI,mBAAmB,CAAA;AAAA,MAAE;AAC9F,MAAA,IAAI,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA,EAAG;AAAC,QAAA,YAAA,CAAa,IAAI,mBAAmB,CAAA;AAAA,MAAE;AACtE,MAAA,IAAI,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA,EAAG;AAAC,QAAA,YAAA,CAAa,IAAI,oBAAoB,CAAA;AAAA,MAAE;AACpE,MAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,EAAG;AAAC,QAAA,YAAA,CAAa,IAAI,iBAAiB,CAAA;AAAA,MAAE;AAC7D,MAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,EAAG;AAAC,QAAA,YAAA,CAAa,IAAI,iBAAiB,CAAA;AAAA,MAAE;AAC7D,MAAA,IAAI,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA,EAAG;AAAC,QAAA,YAAA,CAAa,IAAI,eAAe,CAAA;AAAA,MAAE;AAAA,IAClE;AAEA,IAAA,MAAM,iBAAA,GAAiE;AAAA,MACrE,IAAA,EAAM,CAAC,iBAAA,EAAmB,aAAA,EAAe,eAAe,SAAA,EAAW,UAAA,EAAY,gBAAgB,YAAY,CAAA;AAAA,MAC3G,SAAS,CAAC,kBAAA,EAAoB,kBAAA,EAAoB,eAAA,EAAiB,gBAAgB,gBAAgB,CAAA;AAAA,MACnG,GAAA,EAAK,CAAC,WAAA,EAAa,YAAA,EAAc,eAAe,YAAY,CAAA;AAAA,MAC5D,SAAS,CAAC,aAAA,EAAe,aAAA,EAAe,SAAA,EAAW,cAAc,UAAU;AAAA,KAC7E;AAEA,IAAA,MAAM,cAAA,GAAiB,iBAAA,CAAkB,MAAM,CAAA,CAAE,MAAA,CAAO,CAAC,IAAA,KAAS,cAAA,CAAe,QAAA,CAAS,IAAI,CAAC,CAAA;AAE/F,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,cAAA;AAAA,MACA,cAAA;AAAA,MACA,YAAA,EAAc,KAAA,CAAM,IAAA,CAAK,YAAY;AAAA,KACvC;AAAA,EACF;AAAA,EAEQ,iBAAiB,IAAA,EAAwB;AAC/C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,iCAAiC,KAAK,EAAC;AAClE,IAAA,OAAO,MAAM,IAAA,CAAK,IAAI,IAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,KAAU,KAAA,CAAM,MAAM,CAAA,CAAE,OAAO,OAAO,CAAC,CAAC,CAAA,CAAE,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,EAC7F;AAAA,EAEQ,oBAAoB,IAAA,EAAwB;AAClD,IAAA,MAAMC,SAAQ,IAAA,CACX,WAAA,EAAY,CACZ,OAAA,CAAQ,mBAAmB,GAAG,CAAA,CAC9B,KAAA,CAAM,KAAK,EACX,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,UAAU,CAAC,CAAA;AACtC,IAAA,MAAM,IAAA,mBAAO,IAAI,GAAA,CAAI,CAAC,UAAU,MAAA,EAAQ,YAAA,EAAc,SAAA,EAAW,MAAA,EAAQ,QAAQ,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,MAAM,CAAC,CAAA;AACxH,IAAA,OAAO,MAAM,IAAA,CAAK,IAAI,IAAIA,MAAAA,CAAM,MAAA,CAAO,CAAC,KAAA,KAAU,CAAC,IAAA,CAAK,GAAA,CAAI,KAAK,CAAC,CAAC,CAAC,CAAA,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AAAA,EACnF;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,IAAA,EAAyB;AAC9C,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,MAAA;AACH,QAAA,OAAO,kHAAA;AAAA,MACT,KAAK,MAAA;AACH,QAAA,OAAO,2HAAA;AAAA,MACT,KAAK,OAAA;AACH,QAAA,OAAO,0GAAA;AAAA,MACT,KAAK,SAAA;AAAA,MACL;AACE,QAAA,OAAO,wDAAA;AAAA;AACX,EACF;AAAA,EAEQ,gBAAgB,IAAA,EAA0D;AAChF,IAAA,OAAO,IAAA,CAAK,cAAA,CAAe,IAAI,CAAA,GAAI,wBAAA,GAA2B,eAAA;AAAA,EAChE;AAEF;AC3gFO,IAAM,eAAN,MAAmB;AAAA,EAChB,MAAA;AAAA,EAER,YAAY,MAAA,EAAiB;AAC3B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CACJ,IAAA,EACA,YAAA,EAOC;AACD,IAAA,IAAI,eAAA,GAAkB,CAAA;AACtB,IAAA,IAAI,cAAA,GAAiB,CAAA;AACrB,IAAA,IAAI,WAAA,GAAc,CAAA;AAElB,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,MAAA,EAAQ;AAE/B,MAAA,IAAI,CAAC,IAAA,CAAK,kBAAA,CAAmB,KAAA,EAAO,IAAA,CAAK,MAAM,CAAA,EAAG;AAChD,QAAA,KAAA,CAAM,MAAA,GAAS,SAAA;AACf,QAAA;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,WAAA,CAAY;AAAA,QACf,SAAA,EAAW,CAAA;AAAA,QACX,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAClC,IAAA,EAAM,aAAA;AAAA,QACN,IAAA,EAAM;AAAA,UACJ,SAAS,KAAA,CAAM,EAAA;AAAA,UACf,WAAW,KAAA,CAAM;AAAA;AACnB,OACD,CAAA;AAED,MAAA,KAAA,CAAM,MAAA,GAAS,aAAA;AACf,MAAA,KAAA,CAAM,SAAA,GAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAEzC,MAAA,IAAI;AAEF,QAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAC9B,UAAA,IAAA,CAAK,WAAA,CAAY;AAAA,YACf,SAAA,EAAW,CAAA;AAAA,YACX,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,YAClC,IAAA,EAAM,YAAA;AAAA,YACN,IAAA,EAAM;AAAA,cACJ,QAAQ,IAAA,CAAK,EAAA;AAAA,cACb,QAAQ,IAAA,CAAK,MAAA;AAAA,cACb,MAAM,IAAA,CAAK;AAAA;AACb,WACD,CAAA;AAED,UAAA,IAAA,CAAK,MAAA,GAAS,aAAA;AAEd,UAAA,IAAI;AACF,YAAA,IAAI,KAAK,IAAA,EAAM;AAGb,cAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,IAAA,CAAK,MAAM,IAAA,CAAK,IAAA,IAAQ,EAAE,CAAA;AAC5D,cAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,YAChB;AAEA,YAAA,IAAA,CAAK,MAAA,GAAS,WAAA;AACd,YAAA,cAAA,EAAA;AAEA,YAAA,IAAA,CAAK,WAAA,CAAY;AAAA,cACf,SAAA,EAAW,CAAA;AAAA,cACX,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,cAClC,IAAA,EAAM,UAAA;AAAA,cACN,IAAA,EAAM;AAAA,gBACJ,QAAQ,IAAA,CAAK,EAAA;AAAA,gBACb,MAAA,EAAQ,WAAA;AAAA,gBACR,QAAQ,IAAA,CAAK;AAAA;AACf,aACD,CAAA;AAAA,UACH,SAAS,KAAA,EAAO;AACd,YAAA,IAAA,CAAK,MAAA,GAAS,QAAA;AACd,YAAA,IAAA,CAAK,QAAQ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAClE,YAAA,WAAA,EAAA;AAEA,YAAA,IAAA,CAAK,WAAA,CAAY;AAAA,cACf,SAAA,EAAW,CAAA;AAAA,cACX,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,cAClC,IAAA,EAAM,UAAA;AAAA,cACN,IAAA,EAAM;AAAA,gBACJ,QAAQ,IAAA,CAAK,EAAA;AAAA,gBACb,MAAA,EAAQ,QAAA;AAAA,gBACR,OAAO,IAAA,CAAK;AAAA;AACd,aACD,CAAA;AAGD,YAAA,MAAM,KAAA;AAAA,UACR;AAAA,QACF;AAEA,QAAA,KAAA,CAAM,MAAA,GAAS,WAAA;AACf,QAAA,KAAA,CAAM,WAAA,GAAA,iBAAc,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAC3C,QAAA,eAAA,EAAA;AAEA,QAAA,IAAA,CAAK,WAAA,CAAY;AAAA,UACf,SAAA,EAAW,CAAA;AAAA,UACX,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,UAClC,IAAA,EAAM,WAAA;AAAA,UACN,IAAA,EAAM;AAAA,YACJ,SAAS,KAAA,CAAM,EAAA;AAAA,YACf,MAAA,EAAQ;AAAA;AACV,SACD,CAAA;AAAA,MACH,SAAS,KAAA,EAAO;AACd,QAAA,KAAA,CAAM,MAAA,GAAS,QAAA;AACf,QAAA,KAAA,CAAM,QAAQ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAEnE,QAAA,IAAA,CAAK,WAAA,CAAY;AAAA,UACf,SAAA,EAAW,CAAA;AAAA,UACX,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,UAClC,IAAA,EAAM,WAAA;AAAA,UACN,IAAA,EAAM;AAAA,YACJ,SAAS,KAAA,CAAM,EAAA;AAAA,YACf,MAAA,EAAQ,QAAA;AAAA,YACR,OAAO,KAAA,CAAM;AAAA;AACf,SACD,CAAA;AAED,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,eAAA;AAAA,UACA,cAAA;AAAA,UACA,WAAA;AAAA,UACA,OAAO,KAAA,CAAM;AAAA,SACf;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,eAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAA,CAAmB,OAAc,SAAA,EAA6B;AACpE,IAAA,IAAI,CAAC,KAAA,CAAM,YAAA,IAAgB,KAAA,CAAM,YAAA,CAAa,WAAW,CAAA,EAAG;AAC1D,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,KAAA,MAAW,KAAA,IAAS,MAAM,YAAA,EAAc;AACtC,MAAA,MAAM,WAAW,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,KAAK,CAAA;AACrD,MAAA,IAAI,CAAC,QAAA,IAAY,QAAA,CAAS,MAAA,KAAW,WAAA,EAAa;AAChD,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,IAAA,EAAiC;AACjD,IAAA,MAAM,WAAA,GAAc,KAAK,MAAA,CAAO,MAAA;AAChC,IAAA,MAAM,eAAA,GAAkB,KAAK,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,WAAW,CAAA,CAAE,MAAA;AAE5E,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAA;AACzE,IAAA,MAAM,cAAA,GAAiB,KAAK,MAAA,CAAO,MAAA;AAAA,MACjC,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,WAAW,CAAA,CAAE,MAAA;AAAA,MAClE;AAAA,KACF;AAEA,IAAA,MAAM,UAAA,GAAa,aAAa,CAAA,GAAI,IAAA,CAAK,MAAO,cAAA,GAAiB,UAAA,GAAc,GAAG,CAAA,GAAI,CAAA;AAEtF,IAAA,MAAM,YAAA,GAAe,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,aAAa,CAAA;AACvE,IAAA,MAAM,WAAA,GAAc,cAAc,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,aAAa,CAAA;AAE9E,IAAA,OAAO;AAAA,MACL,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,gBAAgB,YAAA,EAAc,EAAA;AAAA,MAC9B,eAAe,WAAA,EAAa,EAAA;AAAA,MAC5B,eAAA;AAAA,MACA,WAAA;AAAA,MACA,cAAA;AAAA,MACA,UAAA;AAAA,MACA,UAAA;AAAA,MACA,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACpC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,CAAa,QAAA,EAA2B,QAAA,EAAiC;AAC7E,IAAA,MAAM1B,QAAAA,CAAG,UAAU,QAAA,EAAU,IAAA,CAAK,UAAU,QAAA,EAAU,IAAA,EAAM,CAAC,CAAA,EAAG,OAAO,CAAA;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,KAAA,EAAkB;AACpC,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,KAAK,CAAA;AAAA,IACzB;AAAA,EACF;AACF;;;AF9NA,0BAAA,EAAA;AACA,mBAAA,EAAA;AAEA,mBAAA,EAAA;;;AGNA,iBAAA,EAAA;AACA,yBAAA,EAAA;AACA,sBAAA,EAAA;AACA,iBAAA,EAAA;AACA,0BAAA,EAAA;AACA,yBAAA,EAAA;AACA,uBAAA,EAAA;AACA,sBAAA,EAAA;AACA,uBAAA,EAAA;AACA,sBAAA,EAAA;AACA,kBAAA,EAAA;;;ACIA,IAAM,mBAAA,GAAgE;AAAA,EACpE,IAAA,EAAM,CAAC,SAAA,EAAW,eAAA,EAAiB,aAAa,QAAQ,CAAA;AAAA,EACxD,OAAA,EAAS,CAAC,eAAA,EAAiB,WAAA,EAAa,QAAQ,CAAA;AAAA,EAChD,aAAA,EAAe,CAAC,WAAA,EAAa,QAAQ,CAAA;AAAA,EACrC,SAAA,EAAW,CAAC,YAAA,EAAc,WAAA,EAAa,aAAa,QAAQ,CAAA;AAAA,EAC5D,UAAA,EAAY,CAAC,WAAA,EAAa,WAAA,EAAa,aAAa,QAAQ,CAAA;AAAA,EAC5D,SAAA,EAAW,CAAC,WAAA,EAAa,QAAQ,CAAA;AAAA,EACjC,SAAA,EAAW,CAAC,WAAA,EAAa,QAAQ,CAAA;AAAA,EACjC,WAAW,EAAC;AAAA,EACZ,QAAQ;AACV,CAAA;AAEO,IAAM,wBAAN,MAA4B;AAAA,EACzB,OAAA,GAA0B,MAAA;AAAA,EAC1B,cAAiC,EAAC;AAAA,EAClC,SAAA,mBAAY,IAAI,GAAA,CAA4B,CAAC,CAAC,QAAQ,IAAA,CAAK,GAAA,EAAK,CAAC,CAAC,CAAA;AAAA,EAClE,WAAA,uBAAkB,GAAA,EAA4B;AAAA,EAEtD,UAAA,GAA6B;AAC3B,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,cAAA,GAAoC;AAClC,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,WAAW,CAAA;AAAA,EAC7B;AAAA,EAEA,UAAA,CAAW,IAAoB,MAAA,EAAuB;AACpD,IAAA,IAAI,EAAA,KAAO,KAAK,OAAA,EAAS;AACvB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,mBAAA,CAAoB,IAAA,CAAK,OAAO,CAAA;AAChD,IAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,CAAS,EAAE,CAAA,EAAG;AACzB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,KAAK,OAAO,CAAA,IAAA,EAAO,EAAE,CAAA,CAAE,CAAA;AAAA,IACtE;AAEA,IAAA,MAAMD,IAAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,OAAO,CAAA;AAC/C,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,MAAM,UAAUA,IAAAA,GAAM,OAAA;AACtB,MAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAA,CAAK,OAAA,EAAA,CAAU,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA,IAAK,CAAA,IAAK,OAAO,CAAA;AAAA,IACxF;AAEA,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK;AAAA,MACpB,MAAM,IAAA,CAAK,OAAA;AAAA,MACX,EAAA;AAAA,MACA,SAAA,EAAW,IAAI,IAAA,CAAKA,IAAG,EAAE,WAAA,EAAY;AAAA,MACrC;AAAA,KACD,CAAA;AAED,IAAA,IAAA,CAAK,OAAA,GAAU,EAAA;AACf,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,EAAA,EAAIA,IAAG,CAAA;AAAA,EAC5B;AAAA,EAEA,mBAAA,CAAoBA,IAAAA,GAAM,IAAA,CAAK,GAAA,EAAI,EAAmC;AACpE,IAAA,MAAM,GAAA,GAAsC;AAAA,MAC1C,IAAA,EAAM,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,MAAM,CAAA,IAAK,CAAA;AAAA,MACtC,OAAA,EAAS,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA,IAAK,CAAA;AAAA,MAC5C,aAAA,EAAe,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,eAAe,CAAA,IAAK,CAAA;AAAA,MACxD,SAAA,EAAW,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,WAAW,CAAA,IAAK,CAAA;AAAA,MAChD,UAAA,EAAY,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,YAAY,CAAA,IAAK,CAAA;AAAA,MAClD,SAAA,EAAW,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,WAAW,CAAA,IAAK,CAAA;AAAA,MAChD,SAAA,EAAW,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,WAAW,CAAA,IAAK,CAAA;AAAA,MAChD,SAAA,EAAW,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,WAAW,CAAA,IAAK,CAAA;AAAA,MAChD,MAAA,EAAQ,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA,IAAK;AAAA,KAC5C;AAEA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,OAAO,CAAA;AAC/C,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA,IAAKA,IAAAA,GAAM,OAAA;AAAA,IAC7B;AAEA,IAAA,OAAO,GAAA;AAAA,EACT;AACF;;;AClEO,IAAM,aAAN,MAAiB;AAAA,EACd,QAAsB,EAAC;AAAA,EACvB,UAAA,uBAAiB,GAAA,EAAoB;AAAA,EACrC,OAAA,GAAU,CAAA;AAAA,EAElB,UAAU,MAAA,EAIC;AACT,IAAA,IAAA,CAAK,OAAA,IAAW,CAAA;AAChB,IAAA,MAAM,EAAA,GAAK,CAAA,YAAA,EAAe,IAAA,CAAK,OAAO,CAAA,CAAA;AACtC,IAAA,MAAM,IAAA,GAAmB;AAAA,MACvB,EAAA;AAAA,MACA,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,MAAA,EAAQ,SAAA;AAAA,MACR,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACpC;AACA,IAAA,IAAA,CAAK,KAAA,CAAM,KAAK,IAAI,CAAA;AACpB,IAAA,IAAA,CAAK,WAAW,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,KAAA,CAAM,SAAS,CAAC,CAAA;AAC7C,IAAA,OAAO,EAAA;AAAA,EACT;AAAA,EAEA,YAAA,CAAa,QAAgB,QAAA,EAAyB;AACpD,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,MAAM,CAAA;AACtC,IAAA,IAAI,OAAO,IAAA,EAAM;AACf,MAAA;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC3B,IAAA,MAAM,WAAA,GAAA,iBAAc,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAC3C,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AACnB,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,UAAA,GAAa,IAAI,IAAA,CAAK,WAAW,CAAA,CAAE,OAAA,EAAQ,GAAI,IAAI,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA,CAAE,OAAA,EAAQ;AACrF,IAAA,IAAA,CAAK,UAAA,CAAW,OAAO,MAAM,CAAA;AAAA,EAC/B;AAAA,EAEA,QAAA,CAAS,QAAgB,KAAA,EAAqB;AAC5C,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,MAAM,CAAA;AACtC,IAAA,IAAI,OAAO,IAAA,EAAM;AACf,MAAA;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC3B,IAAA,MAAM,WAAA,GAAA,iBAAc,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAC3C,IAAA,IAAA,CAAK,MAAA,GAAS,QAAA;AACd,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AACnB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,UAAA,GAAa,IAAI,IAAA,CAAK,WAAW,CAAA,CAAE,OAAA,EAAQ,GAAI,IAAI,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA,CAAE,OAAA,EAAQ;AACrF,IAAA,IAAA,CAAK,UAAA,CAAW,OAAO,MAAM,CAAA;AAAA,EAC/B;AAAA,EAEA,UAAA,GAOE;AACA,IAAA,MAAM,eAAA,GAAkD;AAAA,MACtD,iBAAA,EAAmB,CAAA;AAAA,MACnB,aAAA,EAAe,CAAA;AAAA,MACf,eAAA,EAAiB,CAAA;AAAA,MACjB,eAAA,EAAiB,CAAA;AAAA,MACjB,aAAA,EAAe,CAAA;AAAA,MACf,iBAAA,EAAmB,CAAA;AAAA,MACnB,eAAA,EAAiB,CAAA;AAAA,MACjB,kBAAA,EAAoB,CAAA;AAAA,MACpB,cAAA,EAAgB;AAAA,KAClB;AAEA,IAAA,IAAI,cAAA,GAAiB,CAAA;AACrB,IAAA,IAAI,WAAA,GAAc,CAAA;AAClB,IAAA,IAAI,YAAA,GAAe,CAAA;AACnB,IAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,IAAA,IAAI,aAAA,GAAgB,CAAA;AAEpB,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,KAAA,EAAO;AAC7B,MAAA,eAAA,CAAgB,IAAA,CAAK,UAAU,CAAA,IAAK,CAAA;AAEpC,MAAA,IAAI,IAAA,CAAK,WAAW,MAAA,EAAQ;AAC1B,QAAA,cAAA,IAAkB,CAAA;AAAA,MACpB,CAAA,MAAA,IAAW,IAAA,CAAK,MAAA,KAAW,QAAA,EAAU;AACnC,QAAA,WAAA,IAAe,CAAA;AAAA,MACjB,CAAA,MAAO;AACL,QAAA,YAAA,IAAgB,CAAA;AAAA,MAClB;AAEA,MAAA,IAAI,IAAA,CAAK,UAAA,IAAc,IAAA,IAAQ,IAAA,CAAK,cAAc,CAAA,EAAG;AACnD,QAAA,aAAA,IAAiB,IAAA,CAAK,UAAA;AACtB,QAAA,aAAA,IAAiB,CAAA;AAAA,MACnB;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,UAAA,EAAY,KAAK,KAAA,CAAM,MAAA;AAAA,MACvB,cAAA;AAAA,MACA,WAAA;AAAA,MACA,YAAA;AAAA,MACA,mBAAmB,aAAA,GAAgB,CAAA,GAAI,KAAK,KAAA,CAAM,aAAA,GAAgB,aAAa,CAAA,GAAI,CAAA;AAAA,MACnF;AAAA,KACF;AAAA,EACF;AACF;AAEO,SAAS,oBAAoB,QAAA,EAAkC;AACpE,EAAA,IAAI,aAAa,QAAA,EAAU;AACzB,IAAA,OAAO,iBAAA;AAAA,EACT;AACA,EAAA,IAAI,QAAA,CAAS,UAAA,CAAW,OAAO,CAAA,EAAG;AAChC,IAAA,OAAO,mBAAA;AAAA,EACT;AACA,EAAA,IAAI,QAAA,CAAS,UAAA,CAAW,SAAS,CAAA,EAAG;AAClC,IAAA,OAAO,eAAA;AAAA,EACT;AACA,EAAA,IAAI,aAAa,YAAA,EAAc;AAC7B,IAAA,OAAO,iBAAA;AAAA,EACT;AACA,EAAA,IAAI,QAAA,CAAS,UAAA,CAAW,KAAK,CAAA,EAAG;AAC9B,IAAA,IAAI,QAAA,KAAa,SAAA,IAAa,QAAA,KAAa,SAAA,EAAW;AACpD,MAAA,OAAO,eAAA;AAAA,IACT;AACA,IAAA,OAAO,iBAAA;AAAA,EACT;AACA,EAAA,IAAI,SAAS,QAAA,CAAS,QAAQ,KAAK,QAAA,CAAS,QAAA,CAAS,MAAM,CAAA,EAAG;AAC5D,IAAA,OAAO,mBAAA;AAAA,EACT;AACA,EAAA,IAAI,SAAS,QAAA,CAAS,KAAK,KAAK,QAAA,CAAS,UAAA,CAAW,SAAS,CAAA,EAAG;AAC9D,IAAA,OAAO,oBAAA;AAAA,EACT;AACA,EAAA,OAAO,gBAAA;AACT;;;AC5IO,SAAS,gCAAA,GAAwD;AACtE,EAAA,OAAO;AAAA,IACL,SAAA,EAAW;AAAA,MACT,kBAAA,EAAoB,EAAA;AAAA,MACpB,qCAAA,EAAuC,CAAA;AAAA,MACvC,8BAAA,EAAgC;AAAA,KAClC;AAAA,IACA,QAAA,EAAU;AAAA,MACR,6BAAA,EAA+B,CAAA;AAAA,MAC/B,kCAAA,EAAoC;AAAA,QAClC,KAAA,EAAO,CAAA;AAAA,QACP,MAAA,EAAQ,CAAA;AAAA,QACR,KAAA,EAAO;AAAA;AACT,KACF;AAAA,IACA,QAAA,EAAU;AAAA,MACR,4BAAA,EAA8B,CAAA;AAAA,MAC9B,kCAAA,EAAoC,GAAA;AAAA,MACpC,6BAAA,EAA+B;AAAA;AACjC,GACF;AACF;ACtBA,SAAS,2BAA2B,eAAA,EAAmC;AACrE,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAS,GAAA,CAAA,YAAA,CAAa,eAAA,EAAiB,OAAO,CAAA;AACpD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA,EAAG;AACpC,MAAA,OAAO,MAAA,CAAO,UAAA;AAAA,IAChB;AACA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,UAAA,EAAY,QAAQ,CAAA,EAAG;AAC9C,MAAA,OAAO,OAAO,UAAA,CAAW,QAAA;AAAA,IAC3B;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,EAAC;AACV;AAEA,SAAS,kBAAkB,KAAA,EAAuB;AAChD,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,cAAA,EAAgB,EAAE,CAAA,CAAE,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA,CAAE,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA;AACpF;AAGA,SAAS,qBAAqB,QAAA,EAA4B;AACxD,EAAA,MAAM,WAAA,GAAmB4B,MAAA,CAAA,IAAA,CAAK,QAAA,EAAU,UAAU,CAAA;AAClD,EAAA,IAAI;AACF,IAAA,MAAM,UAAa,GAAA,CAAA,WAAA,CAAY,WAAA,EAAa,EAAE,aAAA,EAAe,MAAM,CAAA;AACnE,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,IAAI,CAAC,MAAM,WAAA,EAAY,IAAK,MAAM,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AAAC,QAAA;AAAA,MAAS;AAClE,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAS,GAAA,CAAA,YAAA,CAAkBA,MAAA,CAAA,IAAA,CAAK,WAAA,EAAa,KAAA,CAAM,IAAA,EAAM,cAAc,CAAA,EAAG,OAAO,CAAC,CAAA;AACvG,QAAA,IAAI,QAAQ,IAAA,EAAM;AAAC,UAAA,KAAA,CAAM,IAAA,CAAK,QAAQ,IAAI,CAAA;AAAA,QAAE;AAAA,MAC9C,CAAA,CAAA,MAAQ;AAAA,MAAa;AAAA,IACvB;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AAEN,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,KAAK,KAAA,CAAS,GAAA,CAAA,YAAA,CAAkBA,YAAK,QAAA,EAAU,cAAc,CAAA,EAAG,OAAO,CAAC,CAAA;AACxF,MAAA,OAAO,QAAQ,IAAA,GAAO,CAAC,OAAA,CAAQ,IAAI,IAAI,EAAC;AAAA,IAC1C,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AACF;AAGA,SAAS,qBAAqB,QAAA,EAA4B;AACxD,EAAA,IAAI;AACF,IAAA,OAAU,GAAA,CAAA,WAAA,CAAY,QAAA,EAAU,EAAE,aAAA,EAAe,IAAA,EAAM,CAAA,CACpD,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,WAAA,EAAY,IAAK,CAAC,CAAA,CAAE,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,IAAK,CAAA,CAAE,IAAA,KAAS,cAAA,IAAkB,CAAA,CAAE,IAAA,KAAS,MAAM,CAAA,CACxG,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI,CAAA;AAAA,EACpB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAEA,SAAS,OAAA,CACP,GAAA,EACA,OAAA,EACA,QAAA,EACA,MAAA,EACM;AACN,EAAA,MAAM,MAAWA,MAAA,CAAA,UAAA,CAAW,QAAQ,IAAI,QAAA,GAAgBA,MAAA,CAAA,OAAA,CAAQ,SAAS,QAAQ,CAAA;AACjF,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI;AACF,IAAA,IAAA,GAAU,aAAS,GAAG,CAAA;AAAA,EACxB,CAAA,CAAA,MAAQ;AACN,IAAA;AAAA,EACF;AACA,EAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAY,EAAG;AACvB,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,GAAA,GAAWA,iBAAU,GAAG,CAAA;AAC9B,EAAA,MAAM,IAAA,GAAYA,gBAAS,GAAG,CAAA;AAC9B,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA;AAC5B,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,IAAI,CAAC,QAAA,CAAS,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EAAG;AACtC,MAAA,QAAA,CAAS,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,IAC9B;AACA,IAAA;AAAA,EACF;AAEA,EAAA,GAAA,CAAI,IAAI,GAAA,EAAK;AAAA,IACX,IAAA;AAAA,IACA,IAAA,EAAM,GAAA;AAAA,IACN,OAAA,EAAS,CAAC,MAAM,CAAA;AAAA,IAChB,QAAA,EAAU,qBAAqB,GAAG,CAAA;AAAA,IAClC,IAAA,EAAM,qBAAqB,GAAG;AAAA,GAC/B,CAAA;AACH;AAEA,eAAsB,kBAAkB,OAAA,EAAoD;AAC1F,EAAA,MAAM,OAAA,uBAAc,GAAA,EAA+B;AAEnD,EAAA,OAAA,CAAQ,OAAA,EAAS,OAAA,EAAS,OAAA,EAAS,gBAAgB,CAAA;AAEnD,EAAA,MAAM,eAAA,GAAuBA,MAAA,CAAA,IAAA,CAAK,OAAA,EAAS,cAAc,CAAA;AACzD,EAAA,MAAM,cAAA,GAAiB,2BAA2B,eAAe,CAAA;AACjE,EAAA,KAAA,MAAW,OAAO,cAAA,EAAgB;AAChC,IAAA,MAAM,SAAA,GAAY,kBAAkB,GAAG,CAAA;AACvC,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAYA,MAAA,CAAA,OAAA,CAAQ,OAAA,EAAS,SAAS,CAAA;AAC5C,IAAA,IAAI;AACF,MAAA,MAAM,UAAa,GAAA,CAAA,WAAA,CAAY,IAAA,EAAM,EAAE,aAAA,EAAe,MAAM,CAAA;AAC5D,MAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,QAAA,IAAI,CAAC,MAAM,WAAA,EAAY,IAAK,MAAM,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AACtD,UAAA;AAAA,QACF;AACA,QAAA,OAAA,CAAQ,SAAS,OAAA,EAAcA,MAAA,CAAA,IAAA,CAAK,MAAM,KAAA,CAAM,IAAI,GAAG,gBAAgB,CAAA;AAAA,MACzE;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,OAAA,CAAQ,OAAA,EAAS,OAAA,EAAS,IAAA,EAAM,gBAAgB,CAAA;AAAA,IAClD;AAAA,EACF;AAEA,EAAA,MAAM,cAAA,GAAsBA,MAAA,CAAA,IAAA,CAAK,OAAA,EAAS,aAAa,CAAA;AACvD,EAAA,IAAO,GAAA,CAAA,UAAA,CAAW,cAAc,CAAA,EAAG;AACjC,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAa,GAAA,CAAA,YAAA,CAAa,cAAA,EAAgB,OAAO,CAAA;AACvD,MAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,QAAA,CAAS,2BAA2B,CAAA;AAC5D,MAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,QAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,CAAC,CAAA,EAAG,IAAA,EAAK;AACrC,QAAA,IAAI,aAAA,EAAe;AACjB,UAAA,OAAA,CAAQ,OAAA,EAAS,OAAA,EAAS,aAAA,EAAe,eAAe,CAAA;AAAA,QAC1D;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAGA,EAAA,IAAI;AACF,IAAA,MAAM,UAAa,GAAA,CAAA,WAAA,CAAY,OAAA,EAAS,EAAE,aAAA,EAAe,MAAM,CAAA;AAC/D,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,IAAI,CAAC,MAAM,WAAA,EAAY,IAAK,MAAM,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AACtD,QAAA;AAAA,MACF;AACA,MAAA,MAAM,KAAA,GAAaA,MAAA,CAAA,IAAA,CAAK,OAAA,EAAS,KAAA,CAAM,IAAI,CAAA;AAC3C,MAAA,IAAO,GAAA,CAAA,UAAA,CAAgBA,MAAA,CAAA,IAAA,CAAK,KAAA,EAAO,MAAM,CAAC,CAAA,EAAG;AAC3C,QAAA,OAAA,CAAQ,OAAA,EAAS,OAAA,EAAS,KAAA,EAAO,YAAY,CAAA;AAAA,MAC/C;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,OAAO,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,CAAA,CAC/B,IAAA,CAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,IAAA,CAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAC;AAAA,GAChD;AACF;ACrHA,IAAM,oBAAA,GAAsC;AAAA,EAC1C,UAAU,YAAA,CAAa,YAAA;AAAA,EACvB,MAAM,GAAA,EAAK;AACT,IAAA,IAAI,GAAA,CAAI,aAAa,OAAA,EAAS;AAC5B,MAAA,OAAO;AAAA,QACL,UAAU,YAAA,CAAa,YAAA;AAAA,QACvB,MAAA,EAAQ,2CAAA;AAAA,QACR,UAAA,EAAY;AAAA,OACd;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF,CAAA;AAEA,IAAM,uBAAA,GAAyC;AAAA,EAC7C,UAAU,YAAA,CAAa,eAAA;AAAA,EACvB,KAAA,CAAM,MAAM,QAAA,EAAU;AACpB,IAAA,MAAM,aAAa,QAAA,CAAS,SAAA,EAAW,KAAK,CAAA,EAAA,KAAM,EAAA,CAAG,SAAS,QAAQ,CAAA;AACtE,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,QAAQ,UAAA,CAAW,KAAA;AACzB,MAAA,OAAO;AAAA,QACL,UAAU,YAAA,CAAa,eAAA;AAAA,QACvB,MAAA,EAAQ,+CAAA;AAAA,QACR,UAAA,EAAY,iBAAA;AAAA,QACZ,QAAA,EAAU;AAAA,UACR,QAAQ,KAAA,EAAO,MAAA;AAAA,UACf,YAAY,KAAA,EAAO;AAAA;AACrB,OACF;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF,CAAA;AAEA,IAAM,mBAAA,GAAqC;AAAA,EACzC,UAAU,YAAA,CAAa,WAAA;AAAA,EACvB,MAAM,GAAA,EAAK;AACT,IAAA,IAAI,IAAI,cAAA,GAAiB,CAAA,IAAK,GAAA,CAAI,WAAA,IAAe,IAAI,cAAA,EAAgB;AACnE,MAAA,OAAO;AAAA,QACL,UAAU,YAAA,CAAa,WAAA;AAAA,QACvB,QAAQ,CAAA,0BAAA,EAA6B,GAAA,CAAI,WAAW,CAAA,CAAA,EAAI,IAAI,cAAc,CAAA,CAAA,CAAA;AAAA,QAC1E,UAAA,EAAY,aAAA;AAAA,QACZ,QAAA,EAAU;AAAA,UACR,aAAa,GAAA,CAAI,WAAA;AAAA,UACjB,WAAW,GAAA,CAAI;AAAA;AACjB,OACF;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF,CAAA;AAEA,IAAM,sBAAA,GAAwC;AAAA,EAC5C,UAAU,YAAA,CAAa,cAAA;AAAA,EACvB,MAAM,GAAA,EAAK;AACT,IAAA,IAAI,GAAA,CAAI,SAAA,IAAa,GAAA,CAAI,aAAA,GAAgB,CAAA,EAAG;AAC1C,MAAA,OAAO;AAAA,QACL,UAAU,YAAA,CAAa,cAAA;AAAA,QACvB,MAAA,EAAQ,CAAA,4BAAA,EAA+B,GAAA,CAAI,aAAa,CAAA,CAAA,CAAA;AAAA,QACxD,UAAA,EAAY,gBAAA;AAAA,QACZ,QAAA,EAAU;AAAA,UACR,WAAW,GAAA,CAAI,SAAA;AAAA,UACf,eAAe,GAAA,CAAI;AAAA;AACrB,OACF;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF,CAAA;AAEA,IAAM,qBAAA,GAAuC;AAAA,EAC3C,UAAU,YAAA,CAAa,aAAA;AAAA,EACvB,MAAM,GAAA,EAAK;AACT,IAAA,IAAI,IAAI,YAAA,EAAc;AACpB,MAAA,OAAO;AAAA,QACL,UAAU,YAAA,CAAa,aAAA;AAAA,QACvB,MAAA,EAAQ,oCAAA;AAAA,QACR,UAAA,EAAY;AAAA,OACd;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF,CAAA;AAEA,IAAM,oBAAA,GAAsC;AAAA,EAC1C,UAAU,YAAA,CAAa,aAAA;AAAA,EACvB,KAAA,CAAM,MAAM,QAAA,EAAU;AACpB,IAAA,IAAI,CAAC,QAAA,CAAS,SAAA,IAAa,QAAA,CAAS,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1D,MAAA,OAAO;AAAA,QACL,UAAU,YAAA,CAAa,aAAA;AAAA,QACvB,MAAA,EAAQ,yDAAA;AAAA,QACR,UAAA,EAAY;AAAA,OACd;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF,CAAA;AASA,IAAM,cAAA,GAAkC;AAAA,EACtC,oBAAA;AAAA,EACA,uBAAA;AAAA,EACA,mBAAA;AAAA,EACA,sBAAA;AAAA,EACA,qBAAA;AAAA,EACA;AACF,CAAA;AAOO,SAAS,sBAAA,CACd,KACA,QAAA,EAC4B;AAC5B,EAAA,IAAI,IAAA,GAAmC,IAAA;AAEvC,EAAA,KAAA,MAAW,aAAa,cAAA,EAAgB;AACtC,IAAA,MAAM,MAAA,GAAS,SAAA,CAAU,KAAA,CAAM,GAAA,EAAK,QAAQ,CAAA;AAC5C,IAAA,IAAI,WAAW,IAAA,KAAS,IAAA,IAAQ,MAAA,CAAO,QAAA,GAAW,KAAK,QAAA,CAAA,EAAW;AAChE,MAAA,IAAA,GAAO,MAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AASO,IAAM,yBAAN,MAA6B;AAAA,EACjB,gBAAA;AAAA,EAEjB,WAAA,CAAY,gBAAA,GAAuC,EAAC,EAAG;AACrD,IAAA,IAAA,CAAK,gBAAA,GAAmB,gBAAA;AAAA,EAC1B;AAAA,EAEA,QAAA,CACE,GAAA,EACA,QAAA,EAEA,MAAA,EAEA,SAAA,EAC4B;AAC5B,IAAA,IAAI,IAAA,GAAmC,sBAAA,CAAuB,GAAA,EAAK,QAAQ,CAAA;AAG3E,IAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,MAAA,GAAS,CAAA,IAAK,UAAU,SAAA,EAAW;AAC3D,MAAA,KAAA,MAAW,SAAA,IAAa,KAAK,gBAAA,EAAkB;AAC7C,QAAA,MAAM,MAAA,GAAS,SAAA,CAAU,QAAA,CAAS,MAAA,EAAQ,SAAS,CAAA;AACnD,QAAA,IAAI,WAAW,IAAA,KAAS,IAAA,IAAQ,MAAA,CAAO,QAAA,GAAW,KAAK,QAAA,CAAA,EAAW;AAChE,UAAA,IAAA,GAAO,MAAA;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;ACrEO,IAAM,gBAAN,MAA6B;AAAA,EACjB,GAAA;AAAA,EACA,SAAA;AAAA,EAEjB,YAAY,GAAA,EAA2B;AACrC,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,sBAAA,EAAuB;AAAA,EAC9C;AAAA,EAEA,MAAM,GAAA,GAAoC;AACxC,IAAA,IAAI,aAAA,GAAgB,KAAK,GAAA,CAAI,aAAA;AAC7B,IAAA,IAAI,WAAA,GAAc,CAAA;AAElB,IAAA,KAAA,IAAS,SAAA,GAAY,CAAA,EAAG,SAAA,IAAa,aAAA,EAAe,SAAA,EAAA,EAAa;AAC/D,MAAA,MAAM,OAAA,GAA4B;AAAA,QAChC,SAAA;AAAA,QACA,aAAA;AAAA,QACA,WAAA;AAAA,QACA,iBAAiB,SAAA,KAAc;AAAA,OACjC;AAEA,MAAA,IAAA,CAAK,GAAA,CAAI,mBAAmB,OAAO,CAAA;AAEnC,MAAA,IAAI;AAEF,QAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,GAAA,CAAI,mBAAA,CAAoB,WAAW,CAAA;AAChE,QAAA,IAAI,eAAA,EAAiB;AACnB,UAAA,MAAM,SAAA,GAAiC;AAAA,YACrC,UAAUC,YAAAA,CAAa,WAAA;AAAA,YACvB,MAAA,EAAQ,eAAA;AAAA,YACR,UAAA,EAAY;AAAA,WACd;AACA,UAAA,IAAA,CAAK,GAAA,CAAI,MAAA,GAAS,SAAA,EAAW,OAAO,CAAA;AACpC,UAAA,MAAMC,UAAS,MAAM,IAAA,CAAK,IAAI,WAAA,CAAY,eAAA,EAAiB,SAAS,kBAAkB,CAAA;AACtF,UAAA,OAAO,EAAE,OAAA,EAAS,UAAA,EAAY,MAAA,EAAAA,OAAAA,EAAO;AAAA,QACvC;AAGA,QAAA,IAAI,IAAA,CAAK,GAAA,CAAI,SAAA,EAAU,EAAG;AACxB,UAAA,MAAM,SAAA,GAAiC;AAAA,YACrC,UAAUD,YAAAA,CAAa,YAAA;AAAA,YACvB,MAAA,EAAQ,mBAAA;AAAA,YACR,UAAA,EAAY;AAAA,WACd;AACA,UAAA,IAAA,CAAK,GAAA,CAAI,MAAA,GAAS,SAAA,EAAW,OAAO,CAAA;AACpC,UAAA,MAAMC,UAAS,MAAM,IAAA,CAAK,IAAI,WAAA,CAAY,mBAAA,EAAqB,SAAS,cAAc,CAAA;AACtF,UAAA,OAAO,EAAE,OAAA,EAAS,UAAA,EAAY,MAAA,EAAAA,OAAAA,EAAO;AAAA,QACvC;AAGA,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,OAAO,CAAA;AAG/C,QAAA,IAAI,SAAS,KAAA,EAAO;AAClB,UAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,YAAA,GAAe,SAAS,KAAA,CAAM,gBAAA;AAC3D,UAAA,WAAA,IAAe,KAAA;AACf,UAAA,IAAA,CAAK,GAAA,CAAI,gBAAA,GAAmB,KAAA,EAAO,WAAW,CAAA;AAAA,QAChD;AAEA,QAAA,MAAM,SAAA,GAAY,QAAA,CAAS,SAAA,IAAa,EAAC;AAUzC,QAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,mBAAA,CAAoB,SAAS,CAAA;AAE3D,QAAA,IAAI,iBAAiB,KAAA,CAAA,EAAW;AAE9B,UAAA,MAAM,SAAA,GAAiC;AAAA,YACrC,UAAUD,YAAAA,CAAa,eAAA;AAAA,YACvB,MAAA,EAAQ,0BAAA;AAAA,YACR,UAAA,EAAY,iBAAA;AAAA,YACZ,QAAA,EAAU,EAAE,MAAA,EAAQ,YAAA;AAAa,WACnC;AACA,UAAA,IAAA,CAAK,GAAA,CAAI,MAAA,GAAS,SAAA,EAAW,OAAO,CAAA;AACpC,UAAA,IAAA,CAAK,GAAA,CAAI,cAAA,GAAiB,OAAA,EAAS,IAAI,CAAA;AACvC,UAAA,MAAMC,UAAS,MAAM,IAAA,CAAK,IAAI,WAAA,CAAY,YAAA,EAAc,SAAS,iBAAiB,CAAA;AAClF,UAAA,OAAO,EAAE,OAAA,EAAS,UAAA,EAAY,MAAA,EAAAA,OAAAA,EAAO;AAAA,QACvC;AAEA,QAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAE1B,UAAA,MAAM,SAAA,GAAiC;AAAA,YACrC,UAAUD,YAAAA,CAAa,aAAA;AAAA,YACvB,MAAA,EAAQ,4BAAA;AAAA,YACR,UAAA,EAAY;AAAA,WACd;AACA,UAAA,IAAA,CAAK,GAAA,CAAI,MAAA,GAAS,SAAA,EAAW,OAAO,CAAA;AACpC,UAAA,IAAA,CAAK,GAAA,CAAI,cAAA,GAAiB,OAAA,EAAS,KAAK,CAAA;AACxC,UAAA,MAAMC,OAAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,YAAY,QAAA,CAAS,OAAA,EAAS,SAAS,eAAe,CAAA;AACpF,UAAA,OAAO,EAAE,OAAA,EAAS,UAAA,EAAY,MAAA,EAAAA,OAAAA,EAAO;AAAA,QACvC;AAGA,QAAA,MAAM,QAAA,GAA4B;AAAA,UAChC,SAAA;AAAA,UACA,aAAA;AAAA,UACA,WAAA;AAAA,UACA,cAAA,EAAgB,CAAA;AAAA,UAChB,YAAA,EAAc;AAAA,SAChB;AACA,QAAA,KAAK,QAAA;AAGL,QAAA,MAAM,cAAc,MAAM,IAAA,CAAK,GAAA,CAAI,YAAA,CAAa,WAAW,OAAO,CAAA;AAGlE,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,SAAS,CAAA;AAChD,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,MAAM,SAAA,GAAiC;AAAA,YACrC,UAAUD,YAAAA,CAAa,aAAA;AAAA,YACvB,MAAA,EAAQ,UAAA;AAAA,YACR,UAAA,EAAY;AAAA,WACd;AACA,UAAA,IAAA,CAAK,GAAA,CAAI,MAAA,GAAS,SAAA,EAAW,OAAO,CAAA;AACpC,UAAA,IAAA,CAAK,GAAA,CAAI,cAAA,GAAiB,OAAA,EAAS,IAAI,CAAA;AACvC,UAAA,MAAMC,UAAS,MAAM,IAAA,CAAK,IAAI,WAAA,CAAY,UAAA,EAAY,SAAS,eAAe,CAAA;AAC9E,UAAA,OAAO,EAAE,OAAA,EAAS,UAAA,EAAY,MAAA,EAAAA,OAAAA,EAAO;AAAA,QACvC;AAGA,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,kBAAA,CAAmB,OAAO,CAAA;AACtD,QAAA,IAAI,YAAY,cAAA,EAAgB;AAC9B,UAAA,IAAA,CAAK,GAAA,CAAI,cAAA,GAAiB,OAAA,EAAS,IAAI,CAAA;AACvC,UAAA,OAAO,EAAE,OAAA,EAAS,UAAA,EAAY,MAAA,EAAQ,WAAW,MAAA,EAAO;AAAA,QAC1D;AAGA,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,YAAA,CAAa,OAAO,CAAA;AAC/C,QAAA,IAAI,YAAY,aAAA,EAAe;AAC7B,UAAA,aAAA,GAAgB,SAAA;AAAA,QAClB;AAMA,QAAA,IAAI,aAAa,aAAA,EAAe;AAC9B,UAAA,MAAM,SAAA,GAAiC;AAAA,YACrC,UAAUD,YAAAA,CAAa,cAAA;AAAA,YACvB,MAAA,EAAQ,uBAAuB,aAAa,CAAA,SAAA,CAAA;AAAA,YAC5C,UAAA,EAAY;AAAA,WACd;AACA,UAAA,IAAA,CAAK,GAAA,CAAI,MAAA,GAAS,SAAA,EAAW,OAAO,CAAA;AACpC,UAAA,IAAA,CAAK,GAAA,CAAI,cAAA,GAAiB,OAAA,EAAS,IAAI,CAAA;AACvC,UAAA,MAAMC,OAAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,YAAY,QAAA,CAAS,OAAA,EAAS,SAAS,gBAAgB,CAAA;AACrF,UAAA,OAAO,EAAE,OAAA,EAAS,UAAA,EAAY,MAAA,EAAAA,OAAAA,EAAO;AAAA,QACvC;AAEA,QAAA,IAAA,CAAK,GAAA,CAAI,cAAA,GAAiB,OAAA,EAAS,IAAI,CAAA;AAGvC,QAAA,KAAK,WAAA;AAAA,MACP,SAAS,KAAA,EAAO;AAEd,QAAA,MAAM,MAAM,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACjE,QAAA,MAAMA,OAAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,WAAA;AAAA,UAC5B,CAAA,mBAAA,EAAsB,SAAS,CAAA,EAAA,EAAK,GAAG,CAAA,CAAA;AAAA,UACvC,EAAE,GAAG,OAAA,EAAS,eAAA,EAAiB,IAAA,EAAK;AAAA,UACpC;AAAA,SACF;AACA,QAAA,OAAO,EAAE,OAAA,EAAS,UAAA,EAAY,MAAA,EAAAA,OAAAA,EAAO;AAAA,MACvC;AAAA,IACF;AAGA,IAAA,MAAM,QAAA,GAA6B;AAAA,MACjC,SAAA,EAAW,aAAA;AAAA,MACX,aAAA;AAAA,MACA,WAAA;AAAA,MACA,eAAA,EAAiB;AAAA,KACnB;AACA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,WAAA;AAAA,MAC5B,mBAAmB,aAAa,CAAA,4BAAA,CAAA;AAAA,MAChC,QAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,OAAO,EAAE,OAAA,EAAS,UAAA,EAAY,MAAA,EAAO;AAAA,EACvC;AACF;;;ACrTA,SAAS,cAAc,KAAA,EAAwB;AAC7C,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,OAAO,KAAA,KAAU,QAAA,EAAU;AAAC,IAAA,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,EAAE;AAC/E,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAAC,IAAA,OAAO,MAAM,KAAA,CAAM,GAAA,CAAI,aAAa,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,GAAI,GAAA;AAAA,EAAI;AACjF,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,KAAe,EAAE,IAAA,EAAK;AAC/C,EAAA,OAAO,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK,IAAA,CAAK,UAAU,CAAC,CAAA,GAAI,GAAA,GAAM,aAAA,CAAe,MAAkC,CAAC,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,GAAI,GAAA;AACzH;AAIA,IAAM,QAAA,GAAW;AAAA,EACf,KAAA,EAAO,CAAA;AAAA,EACP,MAAA,EAAQ,CAAA;AAAA,EACR,WAAA,EAAa,CAAA;AAAA,EACb,QAAA,EAAU,CAAA;AAAA,EACV,IAAA,EAAM,CAAA;AAAA,EACN,QAAA,EAAU;AACZ,CAAA;AAYA,IAAM,eAAN,MAAmB;AAAA,EACA,UAAoB,EAAC;AAAA,EACrB,UAAA;AAAA,EAEjB,WAAA,CAAY,aAAa,CAAA,EAAG;AAC1B,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA,EACpB;AAAA;AAAA,EAGA,MAAM,KAAA,EAAiC;AAErC,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,GAAA,CAAI,CAAA,CAAA,KAAK;AACzB,MAAA,MAAM,UAAA,GAAa,EAAE,GAAG,CAAA,CAAE,KAAA,EAAiC;AAC3D,MAAA,OAAO,WAAW,QAAQ,CAAA;AAC1B,MAAA,OAAO,WAAW,OAAO,CAAA;AACzB,MAAA,OAAO,GAAG,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,aAAA,CAAc,UAAU,CAAC,CAAA,CAAA;AAAA,IAC/C,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AACX,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,GAAG,CAAA;AACrB,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,IAAA,CAAK,UAAA,EAAY;AACzC,MAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AAAA,IACrB;AAEA,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,IAAA,CAAK,UAAA,EAAY;AAAC,MAAA,OAAO,KAAA;AAAA,IAAM;AAEzD,IAAA,MAAM,IAAA,GAAO,KAAK,UAAA,GAAa,CAAA;AAC/B,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,CAAQ,KAAA,CAAM,CAAC,IAAI,CAAA,CAAE,KAAK,KAAK,CAAA;AACjD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,CAAC,IAAA,CAAK,UAAA,EAAY,CAAC,IAAI,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA;AACnE,IAAA,OAAO,IAAA,KAAS,IAAA;AAAA,EAClB;AACF,CAAA;AAIO,IAAM,sBAAN,MAAmD;AAAA,EACxD,MAAM,IAAI,GAAA,EAAuC;AAC/C,IAAA,MAAM,EAAE,KAAI,GAAI,GAAA;AAChB,IAAA,MAAM,YAAA,GAAe,IAAI,YAAA,EAAa;AACtC,IAAA,IAAI,WAAA,GAAc,CAAA;AAElB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,eAAe,CAAA,EAAA,EAAK;AAC1C,MAAA,GAAA,CAAI,YAAY,CAAA,GAAI,CAAA;AAGpB,MAAA,IAAI,GAAA,CAAI,WAAA,CAAY,OAAA,IAAW,GAAA,CAAI,OAAA,EAAS;AAC1C,QAAA,OAAO,QAAA,CAAS;AAAA,UACd,UAAU,QAAA,CAAS,KAAA;AAAA,UACnB,UAAA,EAAY,cAAA;AAAA,UACZ,MAAA,EAAQ;AAAA,SACT,CAAA;AAAA,MACH;AAGA,MAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,eAAA,EAAgB;AACzC,MAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,QAAA,OAAO,QAAA,CAAS;AAAA,UACd,UAAU,QAAA,CAAS,WAAA;AAAA,UACnB,UAAA,EAAY,iBAAA;AAAA,UACZ,MAAA,EAAQ;AAAA,SACT,CAAA;AAAA,MACH;AACA,MAAA,IAAI,WAAW,UAAA,EAAY;AACzB,QAAA,OAAO,EAAE,OAAA,EAAS,UAAA,EAAY,MAAA,EAAQ,sCAAA,EAAuC;AAAA,MAC/E;AAGA,MAAA,IAAI,GAAA,CAAI,IAAA,CAAK,GAAA,CAAa,QAAA,EAAU,WAAW,CAAA,EAAG;AAChD,QAAA,OAAO,QAAA,CAAS;AAAA,UACd,UAAU,QAAA,CAAS,WAAA;AAAA,UACnB,UAAA,EAAY,aAAA;AAAA,UACZ,QAAQ,GAAA,CAAI,IAAA,CAAK,GAAA,CAAY,QAAA,EAAU,iBAAiB,CAAA,IAAK;AAAA,SAC9D,CAAA;AAAA,MACH;AAGA,MAAA,IAAI,QAAA;AACJ,MAAA,IAAI;AACF,QAAA,QAAA,GAAW,MAAM,IAAI,OAAA,EAAQ;AAAA,MAC/B,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,QAAA,OAAO,OAAA,CAAQ,CAAA,iBAAA,EAAoB,GAAG,CAAA,CAAE,CAAA;AAAA,MAC1C;AAGA,MAAA,IAAI,SAAS,KAAA,EAAO;AAClB,QAAA,WAAA,IAAe,QAAA,CAAS,KAAA,CAAM,YAAA,GAAe,QAAA,CAAS,KAAA,CAAM,gBAAA;AAC5D,QAAA,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,aAAA,EAAe,WAAW,CAAA;AAAA,MACjD;AAEA,MAAA,MAAM,SAAA,GAAY,QAAA,CAAS,SAAA,IAAa,EAAC;AAGzC,MAAA,MAAM,UAAA,GAAa,cAAc,QAAQ,CAAA;AACzC,MAAA,IAAI,UAAA,EAAY;AAGd,QAAA,MAAM,aAAa,QAAA,CAAS,SAAA,EAAW,KAAK,CAAA,EAAA,KAAM,EAAA,CAAG,SAAS,QAAQ,CAAA;AACtE,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,MAAM,WAAA,GAA6B;AAAA,YACjC,IAAI,UAAA,CAAW,EAAA;AAAA,YACf,MAAM,UAAA,CAAW,IAAA;AAAA,YACjB,OAAO,UAAA,CAAW;AAAA,WACpB;AACA,UAAA,IAAI,aAAA,GAAgB,KAAA;AACpB,UAAA,IAAI,cAAA;AACJ,UAAA,IAAI;AACF,YAAA,MAAM,cAAc,MAAM,GAAA,CAAI,YAAA,CAAa,CAAC,WAAW,CAAC,CAAA;AAGxD,YAAA,MAAM,eAAe,WAAA,EAAa,IAAA,CAAK,OAAK,CAAA,CAAE,UAAA,KAAe,WAAW,EAAE,CAAA;AAC1E,YAAA,IAAI,YAAA,IAAgB,YAAA,CAAa,OAAA,KAAY,KAAA,EAAO;AAClD,cAAA,aAAA,GAAgB,IAAA;AAAA,YAClB;AACA,YAAA,cAAA,GAAiB,YAAA,EAAc,QAAA;AAAA,UACjC,CAAA,CAAA,MAAQ;AAAA,UAER;AACA,UAAA,IAAI,aAAA,EAAe;AACjB,YAAA,MAAM,IAAI,cAAA,EAAe;AACzB,YAAA;AAAA,UACF;AACA,UAAA,MAAM,IAAI,cAAA,EAAe;AACzB,UAAA,OAAO,QAAA,CAAS;AAAA,YACd,GAAG,UAAA;AAAA,YACH,QAAA,EAAU;AAAA,WACX,CAAA;AAAA,QACH;AACA,QAAA,MAAM,IAAI,cAAA,EAAe;AACzB,QAAA,OAAO,SAAS,UAAU,CAAA;AAAA,MAC5B;AAGA,MAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,QAAA,IAAI,SAAS,OAAA,IAAW,QAAA,CAAS,QAAQ,IAAA,EAAK,CAAE,SAAS,CAAA,EAAG;AAG1D,UAAA,IAAI,cAAA,GAAuC,IAAA;AAC3C,UAAA,IAAI;AAEF,YAAA,GAAA,CAAI,aAAA,CAAc;AAAA,cAChB,IAAA,EAAM,QAAA;AAAA,cACN,OAAA,EAAS;AAAA,aACV,CAAA;AACD,YAAA,cAAA,GAAiB,MAAM,IAAI,OAAA,EAAQ;AAAA,UACrC,CAAA,CAAA,MAAQ;AAAA,UAER;AAEA,UAAA,IAAI,cAAA,EAAgB;AAClB,YAAA,MAAM,YAAA,GAAe,cAAc,cAAc,CAAA;AACjD,YAAA,IAAI,YAAA,EAAc;AAChB,cAAA,MAAM,aAAa,cAAA,CAAe,SAAA,EAAW,KAAK,CAAA,EAAA,KAAM,EAAA,CAAG,SAAS,QAAQ,CAAA;AAC5E,cAAA,IAAI,UAAA,EAAY;AACd,gBAAA,IAAI,aAAA,GAAgB,KAAA;AACpB,gBAAA,IAAI,cAAA;AACJ,gBAAA,IAAI;AACF,kBAAA,MAAM,cAAc,MAAM,GAAA,CAAI,YAAA,CAAa,CAAC,EAAE,EAAA,EAAI,UAAA,CAAW,EAAA,EAAI,IAAA,EAAM,WAAW,IAAA,EAAM,KAAA,EAAO,UAAA,CAAW,KAAA,EAAO,CAAC,CAAA;AAClH,kBAAA,MAAM,eAAe,WAAA,EAAa,IAAA,CAAK,OAAK,CAAA,CAAE,UAAA,KAAe,WAAW,EAAE,CAAA;AAC1E,kBAAA,IAAI,YAAA,IAAgB,YAAA,CAAa,OAAA,KAAY,KAAA,EAAO;AAClD,oBAAA,aAAA,GAAgB,IAAA;AAAA,kBAClB;AACA,kBAAA,cAAA,GAAiB,YAAA,EAAc,QAAA;AAAA,gBACjC,CAAA,CAAA,MAAQ;AAAA,gBAAkB;AAC1B,gBAAA,IAAI,aAAA,EAAe;AACjB,kBAAA,MAAM,IAAI,cAAA,EAAe;AACzB,kBAAA;AAAA,gBACF;AACA,gBAAA,MAAM,IAAI,cAAA,EAAe;AACzB,gBAAA,OAAO,QAAA,CAAS;AAAA,kBACd,GAAG,YAAA;AAAA,kBACH,QAAA,EAAU;AAAA,iBACX,CAAA;AAAA,cACH;AACA,cAAA,MAAM,IAAI,cAAA,EAAe;AACzB,cAAA,OAAO,SAAS,YAAY,CAAA;AAAA,YAC9B;AAEA,YAAA,MAAM,IAAI,cAAA,EAAe;AACzB,YAAA,OAAO,QAAA,CAAS;AAAA,cACd,UAAU,QAAA,CAAS,QAAA;AAAA,cACnB,UAAA,EAAY,eAAA;AAAA,cACZ,MAAA,EAAQ,wCAAA;AAAA,cACR,MAAA,EAAQ,cAAA,CAAe,OAAA,IAAW,QAAA,CAAS;AAAA,aAC5C,CAAA;AAAA,UACH;AAAA,QACF;AAEA,QAAA,MAAM,IAAI,cAAA,EAAe;AACzB,QAAA,OAAO,QAAA,CAAS;AAAA,UACd,UAAU,QAAA,CAAS,QAAA;AAAA,UACnB,UAAA,EAAY,eAAA;AAAA,UACZ,MAAA,EAAQ,4BAAA;AAAA,UACR,QAAQ,QAAA,CAAS;AAAA,SAClB,CAAA;AAAA,MACH;AAGA,MAAA,MAAM,MAAA,GAA0B,SAAA,CAAU,GAAA,CAAI,CAAA,EAAA,MAAO;AAAA,QACnD,IAAI,EAAA,CAAG,EAAA;AAAA,QACP,MAAM,EAAA,CAAG,IAAA;AAAA,QACT,OAAO,EAAA,CAAG;AAAA,OACZ,CAAE,CAAA;AAEF,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,CAAI,aAAa,MAAM,CAAA;AAAA,MAC/B,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,QAAA,MAAM,IAAI,cAAA,EAAe;AACzB,QAAA,OAAO,OAAA,CAAQ,CAAA,uBAAA,EAA0B,GAAG,CAAA,CAAE,CAAA;AAAA,MAChD;AAIA,MAAA,MAAM,QAAQ,GAAA,CAAI,IAAA,CAAK,IAAc,OAAA,EAAS,MAAM,KAAK,EAAC;AAC1D,MAAA,MAAM,WAAW,GAAA,CAAI,IAAA,CAAK,IAAc,OAAA,EAAS,UAAU,KAAK,EAAC;AACjE,MAAA,MAAM,UAAU,GAAA,CAAI,IAAA,CAAK,IAAc,OAAA,EAAS,SAAS,KAAK,EAAC;AAC/D,MAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,MAAA,GAAS,QAAA,CAAS,SAAS,OAAA,CAAQ,MAAA;AAC/D,MAAA,MAAM,oBAAoB,GAAA,CAAI,IAAA,CAAK,GAAA,CAAY,MAAA,EAAQ,mBAAmB,CAAA,IAAK,CAAA;AAE/E,MAAA,MAAM,cAAc,aAAA,GAAgB,iBAAA;AAIpC,MAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM;AACtC,QAAA,MAAM,UAAA,GAAa,EAAE,GAAG,CAAA,CAAE,KAAA,EAAiC;AAC3D,QAAA,OAAO,WAAW,OAAO,CAAA;AACzB,QAAA,OAAO,GAAG,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,aAAA,CAAc,UAAU,CAAC,CAAA,CAAA;AAAA,MAC/C,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AACX,MAAA,MAAM,oBAAoB,GAAA,CAAI,IAAA,CAAK,GAAA,CAAY,MAAA,EAAQ,mBAAmB,CAAA,IAAK,EAAA;AAC/E,MAAA,IAAI,yBAAyB,GAAA,CAAI,IAAA,CAAK,GAAA,CAAY,MAAA,EAAQ,wBAAwB,CAAA,IAAK,CAAA;AACvF,MAAA,IAAI,wBAAwB,GAAA,CAAI,IAAA,CAAK,GAAA,CAAY,MAAA,EAAQ,uBAAuB,CAAA,IAAK,CAAA;AACrF,MAAA,IAAI,CAAC,WAAA,IAAe,aAAA,KAAkB,iBAAA,EAAmB;AACvD,QAAA,sBAAA,IAA0B,CAAA;AAC1B,QAAA,qBAAA,IAAyB,CAAA;AAAA,MAC3B,CAAA,MAAO;AACL,QAAA,sBAAA,GAAyB,CAAA;AAAA,MAC3B;AAEA,MAAA,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,mBAAA,EAAqB,aAAa,CAAA;AACvD,MAAA,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,mBAAA,EAAqB,aAAa,CAAA;AACvD,MAAA,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,wBAAA,EAA0B,sBAAsB,CAAA;AACrE,MAAA,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,uBAAA,EAAyB,qBAAqB,CAAA;AACnE,MAAA,GAAA,CAAI,IAAA,CAAK,GAAA;AAAA,QACP,MAAA;AAAA,QACA,sBAAA;AAAA,QACA,CAAA,UAAA,EAAa,GAAA,CAAI,SAAS,CAAA,QAAA,EAAW,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,WAAA,EAC3D,WAAA,GAAc,KAAA,GAAQ,MAAM,CAAA,aAAA,EAAgB,KAAA,CAAM,MAAM,CAAA,WAAA,EAAc,QAAA,CAAS,MAAM,CAAA,UAAA,EAAa,OAAA,CAAQ,MAAM,CAAA,CAAA;AAAA,OAChI;AAEA,MAAA,MAAM,QAAA,GAA8B;AAAA,QAClC,WAAW,GAAA,CAAI,SAAA;AAAA,QACf,eAAe,GAAA,CAAI,aAAA;AAAA,QACnB,WAAW,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAAA,QACnC,aAAA;AAAA,QACA,WAAA;AAAA,QACA,aAAA;AAAA,QACA,aAAA,EAAe,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,gBAAgB,iBAAiB,CAAA;AAAA,QAC5D,gBAAgB,KAAA,CAAM,MAAA;AAAA,QACtB,oBAAoB,QAAA,CAAS,MAAA;AAAA,QAC7B,mBAAmB,OAAA,CAAQ,MAAA;AAAA,QAC3B,WAAA;AAAA,QACA,sBAAA;AAAA,QACA,qBAAA;AAAA,QACA,oBAAA,EAAsB,GAAA,CAAI,IAAA,CAAK,GAAA,CAAY,QAAQ,sBAAsB;AAAA,OAC3E;AACA,MAAA,MAAM,UAAA,GAAa,MAAM,GAAA,CAAI,WAAA,CAAY,QAAQ,CAAA;AACjD,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,YAAA,EAAc,oBAAA,EAAsB,WAAW,cAAc,CAAA;AAC1E,QAAA,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,YAAA,EAAc,oBAAA,EAAsB,WAAW,cAAc,CAAA;AAC1E,QAAA,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,YAAA,EAAc,kBAAA,EAAoB,WAAW,YAAY,CAAA;AACtE,QAAA,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,YAAA,EAAc,eAAA,EAAiB,WAAW,SAAS,CAAA;AAAA,MAClE;AAEA,MAAA,MAAM,IAAI,cAAA,EAAe;AAEzB,MAAA,IAAI,UAAA,EAAY,mBAAmB,QAAA,EAAU;AAC3C,QAAA,MAAM,kBAAkB,GAAA,CAAI,IAAA,CAAK,GAAA,CAAa,YAAA,EAAc,iBAAiB,CAAA,IAAK,KAAA;AAClF,QAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,UAAA,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,YAAA,EAAc,iBAAA,EAAmB,IAAI,CAAA;AAClD,UAAA,GAAA,CAAI,aAAA,CAAc;AAAA,YAChB,IAAA,EAAM,QAAA;AAAA,YACN,OAAA,EACE;AAAA,WACH,CAAA;AAAA,QACH;AAAA,MACF;AAEA,MAAA,IAAI,UAAA,EAAY,mBAAmB,YAAA,EAAc;AAC/C,QAAA,MAAM,qBAAqB,GAAA,CAAI,IAAA,CAAK,GAAA,CAAa,YAAA,EAAc,oBAAoB,CAAA,IAAK,KAAA;AACxF,QAAA,IAAI,CAAC,kBAAA,EAAoB;AACvB,UAAA,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,YAAA,EAAc,oBAAA,EAAsB,IAAI,CAAA;AACrD,UAAA,GAAA,CAAI,aAAA,CAAc;AAAA,YAChB,IAAA,EAAM,QAAA;AAAA,YACN,OAAA,EACE;AAAA,WACH,CAAA;AACD,UAAA;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,0BAA0B,CAAA,EAAG;AAC/B,QAAA,OAAO,QAAA,CAAS;AAAA,UACd,UAAU,QAAA,CAAS,IAAA;AAAA,UACnB,UAAA,EAAY,2BAAA;AAAA,UACZ,MAAA,EAAQ,2CAAA;AAAA,UACR,MAAA,EAAQ;AAAA,SACT,CAAA;AAAA,MACH;AAGA,MAAA,IAAI,YAAA,CAAa,KAAA,CAAM,MAAM,CAAA,EAAG;AAC9B,QAAA,OAAO,QAAA,CAAS;AAAA,UACd,UAAU,QAAA,CAAS,IAAA;AAAA,UACnB,UAAA,EAAY,eAAA;AAAA,UACZ,MAAA,EAAQ,2CAAA;AAAA,UACR,MAAA,EAAQ;AAAA,SACT,CAAA;AAAA,MACH;AAGA,MAAA,IAAI,CAAA,GAAI,CAAA,IAAK,GAAA,CAAI,aAAA,EAAe;AAC9B,QAAA,OAAO,QAAA,CAAS;AAAA,UACd,UAAU,QAAA,CAAS,QAAA;AAAA,UACnB,UAAA,EAAY,gBAAA;AAAA,UACZ,MAAA,EAAQ,CAAA,4BAAA,EAA+B,GAAA,CAAI,aAAa,CAAA,CAAA,CAAA;AAAA,UACxD,MAAA,EAAQ,CAAA,4BAAA,EAA+B,GAAA,CAAI,aAAa,CAAA,oDAAA;AAAA,SACzD,CAAA;AAAA,MACH;AAAA,IACF;AAGA,IAAA,OAAO,QAAQ,4CAA4C,CAAA;AAAA,EAC7D;AACF;AAIA,SAAS,cAAc,QAAA,EAA4C;AACjE,EAAA,MAAM,aAAa,QAAA,CAAS,SAAA,EAAW,KAAK,CAAA,EAAA,KAAM,EAAA,CAAG,SAAS,QAAQ,CAAA;AACtE,EAAA,IAAI,CAAC,UAAA,EAAY;AAAC,IAAA,OAAO,IAAA;AAAA,EAAK;AAE9B,EAAA,MAAM,MAAA,GACJ,OAAO,UAAA,CAAW,KAAA,GAAQ,QAAQ,CAAA,KAAM,QAAA,GACpC,UAAA,CAAW,KAAA,CAAM,QAAQ,CAAA,GACzB,QAAA,CAAS,OAAA;AAEf,EAAA,OAAO;AAAA,IACL,UAAU,QAAA,CAAS,MAAA;AAAA,IACnB,UAAA,EAAY,iBAAA;AAAA,IACZ,MAAA,EAAQ,0BAAA;AAAA,IACR;AAAA,GACF;AACF;AAEA,SAAS,SAAS,IAAA,EAA8B;AAC9C,EAAA,MAAM,kCAAkB,IAAI,GAAA,CAAI,CAAC,iBAAA,EAAmB,eAAe,CAAC,CAAA;AACpE,EAAA,MAAM,MAAA,GAAqB;AAAA,IACzB,MAAA,EAAQ,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,MAAA;AAAA,IAC5B,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,OAAA,EAAS,eAAA,CAAgB,GAAA,CAAI,IAAA,CAAK,UAAU,CAAA;AAAA,IAC5C,QAAA,EAAU,EAAE,YAAA,EAAc,IAAA,CAAK,UAAU,GAAI,IAAA,CAAK,QAAA,IAAY,EAAC;AAAG,GACpE;AACA,EAAA,OAAO,EAAE,OAAA,EAAS,UAAA,EAAY,MAAA,EAAO;AACvC;AAEA,SAAS,QAAQ,MAAA,EAA4B;AAC3C,EAAA,MAAM,MAAA,GAAqB;AAAA,IACzB,MAAA,EAAQ,MAAA;AAAA,IACR,UAAA,EAAY,OAAA;AAAA,IACZ,OAAA,EAAS,KAAA;AAAA,IACT,QAAA,EAAU,EAAE,YAAA,EAAc,EAAA;AAAG,GAC/B;AACA,EAAA,OAAO,EAAE,OAAA,EAAS,UAAA,EAAY,MAAA,EAAO;AACvC;AChaA,IAAM,sBAAA,GAAyB,GAAA;AAC/B,IAAM,sBAAA,GAAyB,CAAC,UAAA,EAAY,aAAA,EAAe,aAAa,WAAW,CAAA;AAmBnF,IAAI,mBAAA,GAAqC,IAAA;AAUlC,IAAM,sBAAN,MAA0B;AAAA,EAC/B,MAAM,MAAM,KAAA,EAA2C;AACrD,IAAA,MAAM,WAAqB,EAAC;AAG5B,IAAA,QAAA,CAAS,IAAA,CAAK,iBAAiB,CAAA;AAG/B,IAAA,QAAA,CAAS,IAAA,CAAK,mBAAA,CAAoB,KAAK,CAAC,CAAA;AAGxC,IAAA,MAAM,OAAA,GAAU,MAAM,mBAAA,CAAoB,KAAK,CAAA;AAC/C,IAAA,IAAI,OAAA,EAAS;AAAE,MAAA,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,IAAG;AAEvC,IAAA,OAAO,QAAA,CAAS,KAAK,MAAM,CAAA;AAAA,EAC7B;AACF;AAMA,SAAS,eAAA,GAA0B;AACjC,EAAA,IAAI,mBAAA,EAAqB;AAAE,IAAA,OAAO,mBAAA;AAAA,EAAqB;AACvD,EAAA,mBAAA,GAAsB,iBAAA,EAAkB;AACxC,EAAA,OAAO,mBAAA;AACT;AAEA,SAAS,iBAAA,GAA4B;AACnC,EAAA,OAAO,CAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,mEAAA,CAAA;AAkCT;AAMA,SAAS,oBAAoB,KAAA,EAAkC;AAC7D,EAAA,MAAM,QAAkB,EAAC;AAGzB,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA;AAAA,EAAA,EAA0B,KAAA,CAAM,UAAU,CAAA,EAAA,CAAI,CAAA;AAGzD,EAAA,IAAI,CAAC,MAAM,UAAA,EAAY;AACrB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA;AAAA;AAAA;AAAA;AAAA,gFAAA,CAIkE,CAAA;AAAA,EAC/E;AAGA,EAAA,MAAM,YAAA,GAAe,uBAAA,CAAwB,KAAA,CAAM,UAAU,CAAA;AAC7D,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,MAAM,SAAA,GAAY,aAAa,MAAA,GAAS,sBAAA,GACpC,aAAa,KAAA,CAAM,CAAA,EAAG,sBAAsB,CAAA,GAAI,2DAAA,GAChD,YAAA;AACJ,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA;AAAA,EAA2B,SAAS,CAAA,CAAE,CAAA;AAAA,EACnD;AAGA,EAAA,IAAI,MAAM,SAAA,EAAW;AACnB,IAAA,KAAA,CAAM,KAAK,sIAAsI,CAAA;AAAA,EACnJ;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,MAAM,CAAA;AAC1B;AAMA,eAAe,oBAAoB,KAAA,EAAkD;AACnF,EAAA,MAAM,QAAkB,EAAC;AAGzB,EAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,IAAA,MAAM,MAAA,GAAS,MAAM,gBAAA,CAAiB,KAAA,CAAM,MAAM,CAAA;AAClD,IAAA,IAAI,MAAA,CAAO,MAAK,EAAG;AACjB,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA;AAAA,EAAqB,MAAM,CAAA,CAAE,CAAA;AAAA,IAC1C;AACA,IAAA,MAAM,UAAU,MAAM,sBAAA,CAAuB,KAAA,CAAM,MAAA,EAAQ,MAAM,WAAW,CAAA;AAC5E,IAAA,IAAI,OAAA,EAAS;AAAE,MAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAAA,IAAG;AAAA,EACtC;AAGA,EAAA,IAAI,MAAM,gBAAA,EAAkB;AAC1B,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA;AAAA,EAA4B,KAAA,CAAM,gBAAgB,CAAA,CAAE,CAAA;AAAA,EACjE;AAGA,EAAA,IAAI,MAAM,kBAAA,EAAoB;AAC5B,IAAA,KAAA,CAAM,IAAA,CAAK,MAAM,kBAAkB,CAAA;AAAA,EACrC;AAGA,EAAA,MAAM,QAAA,GAAW,6BAAA,CAA8B,KAAA,CAAM,kBAAkB,CAAA;AACvE,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AAAA,EACrB;AAEA,EAAA,OAAO,MAAM,MAAA,GAAS,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA,GAAI,IAAA;AACjD;AAMO,SAAS,wBAAwB,UAAA,EAAmC;AACzE,EAAA,KAAA,MAAW,YAAY,sBAAA,EAAwB;AAC7C,IAAA,MAAM,QAAA,GAAgBC,MAAA,CAAA,IAAA,CAAK,UAAA,EAAY,QAAQ,CAAA;AAC/C,IAAA,IAAOC,GAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC3B,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAaA,GAAA,CAAA,YAAA,CAAa,QAAA,EAAU,OAAO,EAAE,IAAA,EAAK;AACxD,QAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AAAE,UAAA,OAAO,OAAA;AAAA,QAAS;AAAA,MAC5C,CAAA,CAAA,MAAQ;AACN,QAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEA,eAAe,iBAAiB,MAAA,EAAsC;AACpE,EAAA,IAAI;AACF,IAAA,IAAI,sBAAA,IAA0B,MAAA,IAAU,OAAO,MAAA,CAAO,yBAAyB,UAAA,EAAY;AACzF,MAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,oBAAA,CAAqB,IAAI,CAAA;AACzD,MAAA,IAAI,UAAA,IAAc,OAAO,UAAA,KAAe,QAAA,IAAY,WAAW,IAAA,EAAK,CAAE,SAAS,CAAA,EAAG;AAChF,QAAA,OAAO,UAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,IAAI,YAAA,IAAgB,MAAA,IAAU,OAAO,MAAA,CAAO,eAAe,UAAA,EAAY;AACrE,MAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,UAAA,CAAW,GAAI,CAAA;AAC5C,MAAA,IAAI,OAAA,IAAW,OAAO,OAAA,KAAY,QAAA,IAAY,QAAQ,IAAA,EAAK,CAAE,SAAS,CAAA,EAAG;AACvE,QAAA,OAAO,OAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,EAAA;AACT;AAEA,eAAe,sBAAA,CACb,QACA,WAAA,EACwB;AACxB,EAAA,IAAI;AACF,IAAA,IAAI,EAAE,YAAA,IAAgB,MAAA,CAAA,IAAW,OAAO,MAAA,CAAO,eAAe,UAAA,EAAY;AACxE,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,UAAA,CAAW,GAAI,CAAA;AAC5C,IAAA,IAAI,CAAC,OAAA,IAAW,OAAO,OAAA,KAAY,QAAA,EAAU;AAC3C,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,KAAA,CAAM,gDAAgD,CAAA;AAC/E,IAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,KAAA,CAAM,8BAA8B,CAAA;AAEjE,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,YAAA,EAAc;AAC9B,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,GAAA,GAAM,qEAAA;AACV,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,GAAA,IAAO,CAAA,oBAAA,EAAuB,QAAA,CAAS,CAAC,CAAA,EAAG,MAAM;AAAA,CAAA;AAAA,IACnD;AACA,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,GAAA,IAAO,CAAA,gBAAA,EAAmB,YAAA,CAAa,CAAC,CAAA,EAAG,MAAM;AAAA,CAAA;AAAA,IACnD;AACA,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,GAAA,IAAO,sBAAsB,WAAW;AAAA,CAAA;AAAA,IAC1C;AAEA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,8BACP,SAAA,EACe;AACf,EAAA,IAAI,CAAC,SAAA,EAAW,KAAA,EAAO,MAAA,EAAQ;AAAE,IAAA,OAAO,IAAA;AAAA,EAAM;AAG9C,EAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,KAAA,CAAM,KAAA,CAAM,GAAG,EAAE,CAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,CAAA,CAAA,KAAK;AAC3B,IAAA,MAAM,QAAA,GAAW,CAAA,CAAE,QAAA,EAAU,MAAA,IAAU,CAAA;AACvC,IAAA,OAAO,CAAA,EAAA,EAAK,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,CAAA,CAAE,IAAI,CAAA,EAAG,QAAA,GAAW,CAAA,GAAI,CAAA,EAAA,EAAK,QAAQ,CAAA,UAAA,CAAA,GAAe,EAAE,CAAA,CAAA;AAAA,EAC/E,CAAC,CAAA;AAED,EAAA,OAAO,CAAA,aAAA,EAAgB,MAAM,MAAM,CAAA;AAAA,EAAY,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AACjE;;;ACpKA,IAAM,qBAAA,uBAA4B,GAAA,EAAyB;AAGpD,SAAS,wBAAA,GAAiC;AAC/C,EAAA,qBAAA,CAAsB,KAAA,EAAM;AAC9B;AAMO,IAAM,oBAAN,MAAwB;AAAA,EACpB,kBAAoC,EAAC;AAAA;AAAA,EAI9C,MAAM,oBAAA,CACJ,IAAA,EACA,EAAA,EACA,MAAA,EACA,WACA,GAAA,EAQe;AACf,IAAA,IAAA,CAAK,gBAAgB,IAAA,CAAK,EAAE,MAAM,EAAA,EAAI,MAAA,EAAQ,WAAW,CAAA;AAEzD,IAAA,IAAI,CAAC,IAAI,SAAA,EAAW;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,CAAI,SAAA,CACP,KAAA,CAAM,GAAA,CAAI,kBAAA,EAAoB;AAAA,MAC7B,WAAW,GAAA,CAAI,SAAA;AAAA,MACf,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,QAAA,EAAU,IAAA;AAAA,MACV,MAAA,EAAQ,EAAA;AAAA,MACR,MAAA;AAAA,MACA,SAAA;AAAA,MACA,eAAA,EAAiB,KAAK,eAAA,CAAgB;AAAA,KACvC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,MAAA,GAAA,CAAI,GAAA,CAAI,CAAA,kDAAA,EAAqD,GAAG,CAAA,CAAE,CAAA;AAAA,IACpE,CAAC,CAAA;AAAA,EACL;AAAA;AAAA,EAIA,gBAAA,CACE,OACA,GAAA,EAKM;AACN,IAAA,IAAI,CAAC,IAAI,SAAA,EAAW;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,KAAK,GAAA,CAAI,SAAA,CACN,KAAA,CAAM,GAAA,CAAI,eAAA,EAAiB;AAAA,MAC1B,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,YAAY,KAAA,CAAM,UAAA;AAAA,MAClB,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,WAAW,KAAA,CAAM;AAAA,KAClB,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,MAAA,GAAA,CAAI,GAAA,CAAI,CAAA,uCAAA,EAA0C,MAAA,CAAO,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,IACjE,CAAC,CAAA;AAAA,EACL;AAAA;AAAA,EAIA,MAAM,WAAA,CAAY,OAAA,EAAwB,GAAA,EAAiC;AACzE,IAAA,IAAI,CAAC,IAAI,SAAA,EAAW;AAClB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,oBAAoB,OAAA,CAAQ,WAAA,EAAa,MAAA,KAAW,OAAA,CAAQ,UAAU,MAAA,GAAS,SAAA,CAAA;AACrF,IAAA,MAAM,eAAe,OAAA,CAAQ,WAAA,EAAa,KAAA,KAAU,OAAA,CAAQ,UAAU,CAAA,GAAI,CAAA,CAAA;AAC1E,IAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,WAAA,EAAa,OAAA,IAAW,EAAC;AAExD,IAAA,MAAM,iBAAiB,OAAA,CAAQ,cAAA;AAC/B,IAAA,MAAM,SAAA,GACJ,cAAA,GAAiB,CAAA,GACb,IAAA,CAAK,GAAA,CAAI,GAAG,OAAA,CAAQ,gBAAA,GAAmB,CAAC,CAAA,GAAI,cAAA,GAC5C,CAAA;AACN,IAAA,MAAM,aAAA,GACJ,OAAA,CAAQ,cAAA,GAAiB,OAAA,CAAQ,qBAAqB,OAAA,CAAQ,iBAAA;AAChE,IAAA,MAAM,kBACJ,OAAA,CAAQ,cAAA,GAAiB,CAAA,GACrB,aAAA,GAAgB,QAAQ,cAAA,GACxB,aAAA;AACN,IAAA,MAAM,aAAA,GACJ,cAAA,GAAiB,CAAA,GAAI,OAAA,CAAQ,iBAAiB,cAAA,GAAiB,CAAA;AACjE,IAAA,MAAM,uBACJ,OAAA,CAAQ,eAAA,GAAkB,IACtB,OAAA,CAAQ,cAAA,GAAiB,QAAQ,eAAA,GACjC,CAAA;AAEN,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,GAAG,OAAA;AAAA,MACH,WAAA,EAAa;AAAA,QACX,MAAA,EAAQ,iBAAA;AAAA,QACR,KAAA,EAAO,YAAA;AAAA,QACP,OAAA,EAAS;AAAA,OACX;AAAA,MACA,SAAA,EAAW,IAAA,CAAK,eAAA,CAAgB,MAAA,GAAS,CAAA;AAAA,MACzC,eAAA,EAAiB,KAAK,eAAA,CAAgB,MAAA;AAAA,MACtC,mBAAmB,IAAA,CAAK,eAAA,CAAgB,IAAI,CAAC,CAAA,KAAM,EAAE,MAAM,CAAA;AAAA,MAC3D,cAAA,EAAgB,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,CAAA,CAAE,EAAE,CAAA,CAAE,CAAA;AAAA,MACpE,aAAA;AAAA,MACA,QAAA,EAAU,QAAQ,aAAA,GAAgB,CAAA;AAAA,MAClC,eAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAM,iBAAA,GAAuC;AAAA,MAC3C,SAAA;AAAA,MACA,eAAA;AAAA,MACA,aAAA;AAAA,MACA,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,gBAAgB,OAAA,CAAQ,cAAA;AAAA,MACxB,iBAAiB,OAAA,CAAQ,eAAA;AAAA,MACzB,oBAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAM,IAAA,CAAK,0BAAA,CAA2B,iBAAA,EAAmB,GAAG,CAAA;AAE5D,IAAA,MAAM,GAAA,CAAI,UAAU,KAAA,CAAM,yBAAA,EAA2B,WAAW,CAAA,CAAE,KAAA,CAAM,CAAC,GAAA,KAAQ;AAC/E,MAAA,GAAA,CAAI,GAAA,CAAI,CAAA,sCAAA,EAAyC,GAAG,CAAA,CAAE,CAAA;AAAA,IACxD,CAAC,CAAA;AAAA,EACH;AAAA;AAAA,EAIA,MAAc,0BAAA,CACZ,OAAA,EACA,GAAA,EACe;AACf,IAAA,IAAI,CAAC,IAAI,SAAA,EAAW;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,QAAA,GAAwB;AAAA,MAC1B,cAAc,OAAA,CAAQ,SAAA;AAAA,MACtB,oBAAoB,OAAA,CAAQ,eAAA;AAAA,MAC5B,kBAAkB,OAAA,CAAQ,aAAA;AAAA,MAC1B,OAAA,EAAS,CAAA;AAAA,MACT,cAAc,EAAC;AAAA,MACf,6BAA6B,EAAC;AAAA,MAC9B,qBAAqB;AAAC,KACxB;AAEA,IAAA,IAAI,GAAA,CAAI,SAAA,IAAa,GAAA,CAAI,SAAA,EAAW;AAClC,MAAA,IAAI;AACF,QAAA,MAAM,YAAY,MAAM,GAAA,CAAI,SAAA,CAAU,cAAA,CAAe,IAAI,SAAS,CAAA;AAClE,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,QAAA,GAAW,SAAA;AAAA,QACb;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,GAAA,CAAI,GAAA,CAAI,CAAA,+CAAA,EAAkD,GAAG,CAAA,CAAE,CAAA;AAAA,MACjE;AAAA,IACF,CAAA,MAAO;AACL,MAAA,QAAA,GAAW,qBAAA,CAAsB,GAAA,CAAI,GAAA,CAAI,WAAW,CAAA,IAAK,QAAA;AAAA,IAC3D;AAEA,IAAA,MAAM,OAAA,GAAU,uBAAA,CAAwB,OAAA,EAAS,QAAQ,CAAA;AAEzD,IAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,MAAA,MAAM,GAAA,CAAI,SAAA,CACP,KAAA,CAAM,8BAAA,EAAgC;AAAA,QACrC,WAAW,GAAA,CAAI,SAAA;AAAA,QACf,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,OAAA;AAAA,QACA,QAAA,EAAU;AAAA,UACR,cAAc,QAAA,CAAS,YAAA;AAAA,UACvB,oBAAoB,QAAA,CAAS,kBAAA;AAAA,UAC7B,kBAAkB,QAAA,CAAS,gBAAA;AAAA,UAC3B,SAAS,QAAA,CAAS;AAAA;AACpB,OACD,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,QAAA,GAAA,CAAI,GAAA,CAAI,CAAA,qDAAA,EAAwD,GAAG,CAAA,CAAE,CAAA;AAAA,MACvE,CAAC,CAAA;AAAA,IACL;AAEA,IAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,QAAA,EAAU,OAAO,CAAA;AAEnD,IAAA,IAAI,GAAA,CAAI,SAAA,IAAa,GAAA,CAAI,SAAA,EAAW;AAClC,MAAA,MAAM,GAAA,CAAI,SAAA,CACP,iBAAA,CAAkB,GAAA,CAAI,WAAW,OAAO;AAAA,QACvC,OAAA,EAAS,CAAA;AAAA,QACT,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAClC,GAAG;AAAA,OACL,CAAE,CAAA,CACD,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,QAAA,GAAA,CAAI,GAAA,CAAI,CAAA,wCAAA,EAA2C,GAAG,CAAA,CAAE,CAAA;AAAA,MAC1D,CAAC,CAAA;AACH,MAAA;AAAA,IACF;AAEA,IAAA,qBAAA,CAAsB,GAAA,CAAI,GAAA,CAAI,WAAA,EAAa,OAAO,CAAA;AAAA,EACpD;AAAA;AAAA,EAIA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,gBAAgB,MAAA,GAAS,CAAA;AAAA,EAChC;AACF;AAMO,SAAS,iBAAA,CACd,gBACA,UAAA,EACQ;AACR,EAAA,OAAO,CAAA,EAAG,cAAA,IAAkB,UAAA,IAAc,WAAW,CAAA,OAAA,CAAA;AACvD;AAEO,SAAS,uBAAA,CACd,SACA,QAAA,EAC2C;AAC3C,EAAA,MAAM,aAAA,GAAgB,SAAS,OAAA,IAAW,CAAA;AAC1C,EAAA,MAAM,cAAA,GACJ,aAAA,IAAiB,OAAA,CAAQ,SAAA,GAAY,SAAS,YAAA,GAAe,IAAA;AAC/D,EAAA,MAAM,iBAAA,GACJ,aAAA,IAAiB,OAAA,CAAQ,eAAA,GAAkB,SAAS,kBAAA,GAAqB,GAAA;AAC3E,EAAA,MAAM,cAAA,GACJ,aAAA,IAAiB,OAAA,CAAQ,aAAA,GAAgB,SAAS,gBAAA,GAAmB,IAAA;AACvE,EAAA,MAAM,aACJ,OAAA,CAAQ,eAAA,GAAkB,KACvB,OAAA,CAAQ,cAAA,GAAiB,QAAQ,eAAA,GAAkB,GAAA;AACxD,EAAA,MAAM,WAAA,GAAc,QAAQ,iBAAA,KAAsB,SAAA;AAElD,EAAA,MAAM,SAAA,GACJ,cAAA,IAAkB,iBAAA,IAAqB,cAAA,IAAmB,WAAA,IAAe,UAAA;AAE3E,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,IAAI,cAAA,EAAgB;AAAE,IAAA,OAAA,CAAQ,KAAK,sBAAsB,CAAA;AAAA,EAAG;AAC5D,EAAA,IAAI,iBAAA,EAAmB;AAAE,IAAA,OAAA,CAAQ,KAAK,4BAA4B,CAAA;AAAA,EAAG;AACrE,EAAA,IAAI,cAAA,EAAgB;AAAE,IAAA,OAAA,CAAQ,KAAK,2BAA2B,CAAA;AAAA,EAAG;AACjE,EAAA,IAAI,eAAe,UAAA,EAAY;AAAE,IAAA,OAAA,CAAQ,KAAK,mCAAmC,CAAA;AAAA,EAAG;AAEpF,EAAA,OAAO,EAAE,WAAW,OAAA,EAAQ;AAC9B;AAEO,SAAS,iBAAA,CACd,QAAA,EACA,OAAA,EACA,KAAA,GAAQ,IAAA,EACK;AACb,EAAA,OAAO;AAAA,IACL,YAAA,EACE,QAAA,CAAS,OAAA,KAAY,CAAA,GACjB,OAAA,CAAQ,SAAA,GACR,QAAA,CAAS,YAAA,IAAgB,CAAA,GAAI,KAAA,CAAA,GAAS,OAAA,CAAQ,SAAA,GAAY,KAAA;AAAA,IAChE,kBAAA,EACE,QAAA,CAAS,OAAA,KAAY,CAAA,GACjB,OAAA,CAAQ,eAAA,GACR,QAAA,CAAS,kBAAA,IAAsB,CAAA,GAAI,KAAA,CAAA,GAAS,OAAA,CAAQ,eAAA,GAAkB,KAAA;AAAA,IAC5E,gBAAA,EACE,QAAA,CAAS,OAAA,KAAY,CAAA,GACjB,OAAA,CAAQ,aAAA,GACR,QAAA,CAAS,gBAAA,IAAoB,CAAA,GAAI,KAAA,CAAA,GAAS,OAAA,CAAQ,aAAA,GAAgB,KAAA;AAAA,IACxE,OAAA,EAAS,SAAS,OAAA,GAAU,CAAA;AAAA,IAC5B,YAAA,EAAc,CAAC,GAAG,QAAA,CAAS,cAAc,OAAA,CAAQ,UAAU,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA;AAAA,IACtE,2BAAA,EAA6B;AAAA,MAC3B,GAAG,QAAA,CAAS,2BAAA;AAAA,MACZ,OAAA,CAAQ;AAAA,KACV,CAAE,MAAM,GAAG,CAAA;AAAA,IACX,qBAAqB,CAAC,GAAG,SAAS,mBAAA,EAAqB,OAAA,CAAQ,YAAY,CAAA,CAAE,KAAA;AAAA,MAC3E;AAAA;AACF,GACF;AACF;AAEO,SAAS,qBAAqB,MAAA,EAKnB;AAChB,EAAA,IAAI,MAAA,CAAO,cAAc,IAAA,EAAM;AAC7B,IAAA,OAAO,OAAO,YAAA,CAAa,IAAA;AAAA,EAC7B;AACA,EAAA,IACE,MAAA,CAAO,QAAA,IACJ,OAAO,MAAA,CAAO,QAAA,CAAS,SAAA,KAAc,QAAA,IACpC,MAAA,CAAO,QAAA,CAAS,SAAA,CAAqB,IAAA,EAAK,EAC9C;AACA,IAAA,OAAO,OAAO,QAAA,CAAS,SAAA;AAAA,EACzB;AACA,EAAA,MAAM,SAAA,GAAY,OAAO,KAAA,IAAS,EAAA;AAClC,EAAA,MAAM,QAAA,GAAW,SAAA,CAAU,KAAA,CAAM,mBAAmB,CAAA;AACpD,EAAA,OAAO,QAAA,GAAW,CAAC,CAAA,IAAK,IAAA;AAC1B;;;ACjZA,IAAM,kBAAA,GAAqB,GAAA;AAOpB,IAAM,qBAAN,MAAyB;AAAA,EACb,GAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EAEjB,WAAA,CAAY,aAAgC,OAAA,EAA0B;AACpE,IAAA,MAAM,MAAA,GAAS,CAAC,GAAG,WAAW,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,KAAK,CAAA;AAChE,IAAA,IAAA,CAAK,GAAA,GAAO,MAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,CAAC,GAAG,MAAM,EAAE,OAAA,EAAQ;AAChC,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA,EAEQ,UAAU,IAAA,EAA4C;AAC5D,IAAA,OAAO,IAAA,CAAK,OAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,OAAA,EAAS,CAAA;AAAA,EACrD;AAAA,EAEA,MAAc,OAAA,CACZ,UAAA,EACA,QAAA,EACA,IACA,QAAA,EACwC;AACxC,IAAA,MAAM,SAAA,GAAY,UAAA,CAAW,MAAA,EAAQ,SAAA,IAAa,kBAAA;AAElD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,SAAA,GAAY,CAAA,GACvB,MAAM,QAAQ,IAAA,CAAK;AAAA,QACjB,OAAA,CAAQ,OAAA,CAAQ,EAAA,EAAI,CAAA;AAAA,QACpB,IAAI,OAAA,CAAe,CAAC,CAAA,EAAG,MAAA,KAAW;AAChC,UAAA,UAAA;AAAA,YACE,MAAM,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,YAAA,EAAe,UAAA,CAAW,IAAI,CAAA,CAAA,EAAI,QAAQ,CAAA,kBAAA,EAAqB,SAAS,CAAA,EAAA,CAAI,CAAC,CAAA;AAAA,YACpG;AAAA,WACF;AAAA,QACF,CAAC;AAAA,OACF,CAAA,GACD,MAAM,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAA;AAE9B,MAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAM;AAAA,IACxC,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,OAAA,CAAQ,OAAA,GAAU,UAAA,CAAW,IAAA,EAAM,UAAU,KAAK,CAAA;AACvD,MAAA,IAAI,UAAA,CAAW,MAAA,EAAQ,UAAA,KAAe,aAAA,EAAe;AAAC,QAAA,MAAM,KAAA;AAAA,MAAM;AAClE,MAAA,OAAO,EAAE,KAAA,EAAO,QAAA,EAAU,MAAA,EAAQ,IAAA,EAAK;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,GAAA,EAAgC;AAC5C,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,GAAG,CAAA,EAAG;AACxC,MAAA,IAAI,CAAC,EAAE,OAAA,EAAS;AAAC,QAAA;AAAA,MAAS;AAC1B,MAAA,MAAM,IAAA,CAAK,QAAQ,CAAA,EAAG,SAAA,EAAW,MAAM,CAAA,CAAE,OAAA,CAAS,GAAG,CAAA,EAAG,MAAS,CAAA;AAAA,IACnE;AAAA,EACF;AAAA,EAEA,MAAM,MAAA,CAAO,GAAA,EAAiB,MAAA,EAA+B;AAC3D,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,EAAG;AACzC,MAAA,IAAI,CAAC,EAAE,MAAA,EAAQ;AAAC,QAAA;AAAA,MAAS;AACzB,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,CAAA,EAAG,QAAA,EAAU,MAAM,EAAE,MAAA,CAAQ,GAAA,EAAK,MAAM,CAAA,EAAG,MAAS,CAAA;AAAA,IACzE;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,GAAA,EAAgC;AAC/C,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,EAAG;AACzC,MAAA,IAAI,CAAC,EAAE,UAAA,EAAY;AAAC,QAAA;AAAA,MAAS;AAC7B,MAAA,MAAM,IAAA,CAAK,QAAQ,CAAA,EAAG,YAAA,EAAc,MAAM,CAAA,CAAE,UAAA,CAAY,GAAG,CAAA,EAAG,MAAS,CAAA;AAAA,IACzE;AAAA,EACF;AAAA,EAEA,MAAM,gBAAgB,GAAA,EAAyC;AAC7D,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,GAAG,CAAA,EAAG;AACxC,MAAA,IAAI,CAAC,EAAE,eAAA,EAAiB;AAAC,QAAA;AAAA,MAAS;AAClC,MAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,IAAA,CAAK,OAAA,CAAQ,CAAA,EAAG,iBAAA,EAAmB,MAAM,CAAA,CAAE,eAAA,CAAiB,GAAG,GAAG,UAA2B,CAAA;AACrH,MAAA,IAAI,UAAU,UAAA,EAAY;AAAC,QAAA,OAAO,KAAA;AAAA,MAAM;AAAA,IAC1C;AACA,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEA,MAAM,eAAe,GAAA,EAAgC;AACnD,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,EAAG;AACzC,MAAA,IAAI,CAAC,EAAE,cAAA,EAAgB;AAAC,QAAA;AAAA,MAAS;AACjC,MAAA,MAAM,IAAA,CAAK,QAAQ,CAAA,EAAG,gBAAA,EAAkB,MAAM,CAAA,CAAE,cAAA,CAAgB,GAAG,CAAA,EAAG,MAAS,CAAA;AAAA,IACjF;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,cAAc,GAAA,EAAoC;AACtD,IAAA,IAAI,QAAsB,EAAC;AAC3B,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,GAAG,CAAA,EAAG;AACxC,MAAA,IAAI,CAAC,EAAE,aAAA,EAAe;AAAC,QAAA;AAAA,MAAS;AAChC,MAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,IAAA,CAAK,OAAA,CAAQ,CAAA,EAAG,eAAA,EAAiB,MAAM,CAAA,CAAE,aAAA,CAAe,GAAG,GAAG,MAAS,CAAA;AAC/F,MAAA,IAAI,KAAA,EAAO;AAAC,QAAA,KAAA,GAAQ,EAAE,GAAG,KAAA,EAAO,GAAG,KAAA,EAAM;AAAA,MAAE;AAAA,IAC7C;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAM,YAAA,CAAa,GAAA,EAAa,MAAA,EAAsC;AACpE,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,EAAG;AACzC,MAAA,IAAI,CAAC,EAAE,YAAA,EAAc;AAAC,QAAA;AAAA,MAAS;AAC/B,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,CAAA,EAAG,cAAA,EAAgB,MAAM,EAAE,YAAA,CAAc,GAAA,EAAK,MAAM,CAAA,EAAG,MAAS,CAAA;AAAA,IACrF;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,eAAe,GAAA,EAA+C;AAClE,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,GAAG,CAAA,EAAG;AACxC,MAAA,IAAI,CAAC,EAAE,cAAA,EAAgB;AAAC,QAAA;AAAA,MAAS;AACjC,MAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,IAAA,CAAK,OAAA,CAAQ,CAAA,EAAG,gBAAA,EAAkB,MAAM,CAAA,CAAE,cAAA,CAAgB,GAAG,GAAG,SAAkB,CAAA;AAC1G,MAAA,IAAI,UAAU,MAAA,EAAQ;AAAC,QAAA,OAAO,MAAA;AAAA,MAAO;AAAA,IACvC;AACA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA,EAEA,MAAM,aAAA,CAAc,GAAA,EAAkB,MAAA,EAAmC;AACvE,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,EAAG;AACzC,MAAA,IAAI,CAAC,EAAE,aAAA,EAAe;AAAC,QAAA;AAAA,MAAS;AAChC,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,CAAA,EAAG,eAAA,EAAiB,MAAM,EAAE,aAAA,CAAe,GAAA,EAAK,MAAM,CAAA,EAAG,MAAS,CAAA;AAAA,IACvF;AAAA,EACF;AACF;;;ACvGA,IAAM,kCAAkB,IAAI,GAAA,CAAI,CAAC,SAAA,EAAW,SAAS,CAAC,CAAA;AACtD,IAAM,mCAAmB,IAAI,GAAA,CAAI,CAAC,UAAA,EAAY,UAAU,CAAC,CAAA;AACzD,IAAM,iBAAA,mBAAoB,IAAI,GAAA,CAAI,CAAC,UAAU,CAAC,CAAA;AAI9C,SAAS,GAAA,GAAc;AACrB,EAAA,OAAA,iBAAO,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAChC;AAEA,SAAS,QAAA,CACP,IAAA,EACA,OAAA,EACA,aAAA,EACA,SAAA,EACA;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,KAAI,EAAG,OAAA,EAAS,eAAe,SAAA,EAAU;AACrE;AAEA,SAAS,SAAA,CAAU,IAAA,EAAmB,GAAA,EAAsC,QAAA,EAAwB;AAClG,EAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAc,OAAA,EAAS,GAAG,KAAK,EAAC;AACtD,EAAA,IAAI,CAAC,QAAA,CAAS,QAAA,CAAS,QAAQ,CAAA,EAAG;AAChC,IAAA,IAAA,CAAK,IAAI,OAAA,EAAS,GAAA,EAAK,CAAC,GAAG,QAAA,EAAU,QAAQ,CAAC,CAAA;AAAA,EAChD;AACF;AAEA,SAAS,gBAAA,CAAiB,KAAkB,MAAA,EAA0B;AACpE,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AAAC,IAAA;AAAA,EAAO;AAE7B,EAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAA;AACrB,EAAA,MAAM,WAAW,GAAA,CAAI,QAAA;AACrB,EAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAGlB,EAAA,MAAM,QAAA,GACJ,OAAO,KAAA,CAAM,MAAM,CAAA,KAAM,WAAW,KAAA,CAAM,MAAM,CAAA,GAChD,OAAO,KAAA,CAAM,WAAW,MAAM,QAAA,GAAW,KAAA,CAAM,WAAW,CAAA,GAC1D,OAAO,KAAA,CAAM,UAAU,CAAA,KAAM,QAAA,GAAW,KAAA,CAAM,UAAU,CAAA,GACxD,IAAA;AAEF,EAAA,IAAI,CAAC,QAAA,EAAU;AAAC,IAAA;AAAA,EAAO;AAEvB,EAAA,IAAI,eAAA,CAAgB,GAAA,CAAI,QAAQ,CAAA,EAAG;AACjC,IAAA,SAAA,CAAU,IAAA,EAAM,QAAQ,QAAQ,CAAA;AAAA,EAClC;AAEA,EAAA,IAAI,gBAAA,CAAiB,GAAA,CAAI,QAAQ,CAAA,EAAG;AAClC,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,MAAA,CAAO,WAAA,EAAY;AAC9C,IAAA,IAAI,kBAAkB,GAAA,CAAI,QAAQ,KAAK,WAAA,CAAY,QAAA,CAAS,SAAS,CAAA,EAAG;AACtE,MAAA,SAAA,CAAU,IAAA,EAAM,WAAW,QAAQ,CAAA;AAAA,IACrC,CAAA,MAAO;AACL,MAAA,SAAA,CAAU,IAAA,EAAM,YAAY,QAAQ,CAAA;AAAA,IACtC;AAAA,EACF;AACF;AAIO,IAAM,0BAAN,MAA8B;AAAA,EAmBnC,WAAA,CACmB,OAAA,EACA,aAAA,EACA,SAAA,EACA,OAAA,EACjB;AAJiB,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,aAAA,GAAA,aAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAChB;AAAA,EAvBM,IAAA,GAAO,eAAA;AAAA,EACP,KAAA,GAAQ,CAAA;AAAA,EACR,MAAA,GAAS,EAAE,UAAA,EAAY,WAAA,EAAqB;AAAA,EAE7C,UAAA,GAAa,CAAA;AAAA,EACb,aAAA,GAAgB,CAAA;AAAA,EAChB,cAAA,uBAAqB,GAAA,EAAoB;AAAA,EACzC,cAAA,GAAiB,CAAA;AAAA,EACjB,YAAA,GAAe,CAAA;AAAA,EACf,aAAA,GAA8G,IAAA;AAAA;AAAA,EAGtH,SAAA;AAAA;AAAA,EAeA,QAAQ,GAAA,EAAuB;AAC7B,IAAA,IAAA,CAAK,UAAA,GAAa,KAAK,GAAA,EAAI;AAG3B,IAAA,GAAA,CAAI,QAAA,CAAS,EAAA,CAAG,SAAA,EAAW,CAAC,CAAA,KAAM;AAChC,MAAA,IAAA,CAAK,YAAA,IAAgB,CAAA,CAAE,YAAA,GAAe,CAAA,CAAE,gBAAA;AACxC,MAAA,IAAA,CAAK,KAAA,CAAM;AAAA,QACT,GAAG,SAAS,SAAA,EAAW,IAAA,CAAK,SAAS,IAAA,CAAK,aAAA,EAAe,KAAK,SAAS,CAAA;AAAA,QACvE,IAAA,EAAM;AAAA,UACJ,UAAA,EAAY,CAAA,CAAE,YAAA,GAAe,CAAA,CAAE,gBAAA;AAAA,UAC/B,cAAc,CAAA,CAAE,YAAA;AAAA,UAChB,kBAAkB,CAAA,CAAE,gBAAA;AAAA,UACpB,YAAY,CAAA,CAAE,UAAA;AAAA,UACd,cAAc,CAAA,CAAE,YAAA;AAAA,UAChB,aAAA,EAAe,EAAE,aAAA,IAAiB,CAAA;AAAA,UAClC,YAAY,CAAA,CAAE,UAAA;AAAA,UACd,OAAA,EAAS,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,GAAW,EAAE,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,GAAI;AAAA;AACrE,OACa,CAAA;AAAA,IACjB,CAAC,CAAA;AAED,IAAA,GAAA,CAAI,QAAA,CAAS,EAAA,CAAG,UAAA,EAAY,CAAC,CAAA,KAAM;AACjC,MAAA,IAAA,CAAK,KAAA,CAAM;AAAA,QACT,GAAG,SAAS,UAAA,EAAY,IAAA,CAAK,SAAS,IAAA,CAAK,aAAA,EAAe,KAAK,SAAS,CAAA;AAAA,QACxE,IAAA,EAAM;AAAA,UACJ,UAAU,CAAA,CAAE,QAAA;AAAA,UACZ,SAAS,CAAA,CAAE,OAAA;AAAA,UACX,YAAY,CAAA,CAAE,UAAA;AAAA,UACd,cAAc,CAAA,CAAE,YAAA;AAAA,UAChB,QAAQ,CAAA,CAAE,MAAA;AAAA,UACV,UAAU,CAAA,CAAE;AAAA;AACd,OACa,CAAA;AAAA,IACjB,CAAC,CAAA;AAED,IAAA,GAAA,CAAI,QAAA,CAAS,EAAA,CAAG,kBAAA,EAAoB,CAAC,CAAA,KAAM;AACzC,MAAA,IAAA,CAAK,KAAA,CAAM;AAAA,QACT,GAAG,SAAS,qBAAA,EAA6C,IAAA,CAAK,SAAS,IAAA,CAAK,aAAA,EAAe,KAAK,SAAS,CAAA;AAAA,QACzG,IAAA,EAAM;AAAA,UACJ,YAAY,CAAA,CAAE,IAAA;AAAA,UACd,UAAU,CAAA,CAAE,KAAA;AAAA,UACZ,SAAS,CAAA,CAAE;AAAA;AACb,OACa,CAAA;AAAA,IACjB,CAAC,CAAA;AAED,IAAA,GAAA,CAAI,QAAA,CAAS,EAAA,CAAG,WAAA,EAAa,CAAC,CAAA,KAAM;AAClC,MAAA,IAAA,CAAK,KAAA,CAAM;AAAA,QACT,GAAG,SAAS,WAAA,EAAmC,IAAA,CAAK,SAAS,IAAA,CAAK,aAAA,EAAe,KAAK,SAAS,CAAA;AAAA,QAC/F,IAAA,EAAM;AAAA,OACO,CAAA;AAAA,IACjB,CAAC,CAAA;AAGD,IAAA,MAAM,KAAA,GAAyB;AAAA,MAC7B,GAAG,SAAS,aAAA,EAAe,IAAA,CAAK,SAAS,IAAA,CAAK,aAAA,EAAe,KAAK,SAAS,CAAA;AAAA,MAC3E,IAAA,EAAM;AAAA,QACJ,IAAA,EAAO,IAAqC,IAAA,IAAQ,EAAA;AAAA,QACpD,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,eAAe,GAAA,CAAI,aAAA;AAAA,QACnB,SAAA,EAAW,IAAI,KAAA,CAAM,MAAA;AAAA,QACrB,MAAA,EAAQ,KAAK,SAAA,EAAW,MAAA;AAAA,QACxB,iBAAA,EAAmB,KAAK,SAAA,EAAW,iBAAA;AAAA,QACnC,UAAA,EAAY,KAAK,SAAA,EAAW;AAAA;AAC9B,KACF;AACA,IAAA,IAAA,CAAK,MAAM,KAAK,CAAA;AAAA,EAClB;AAAA,EAEA,MAAA,CAAO,KAAiB,MAAA,EAAsB;AAC5C,IAAA,MAAM,eAAe,GAAA,CAAI,IAAA,CAAK,IAAc,OAAA,EAAS,SAAS,KAAK,EAAC;AACpE,IAAA,MAAM,gBAAgB,GAAA,CAAI,IAAA,CAAK,IAAc,OAAA,EAAS,UAAU,KAAK,EAAC;AACtE,IAAA,MAAM,cAAc,GAAA,CAAI,IAAA,CAAK,GAAA,CAAY,OAAA,EAAS,aAAa,CAAA,IAAK,EAAA;AACpE,IAAA,MAAM,OAAA,GAAU,MAAA,KAAW,iBAAA,IAAqB,MAAA,KAAW,eAAA;AAC3D,IAAA,MAAM,KAAA,GAAuB;AAAA,MAC3B,GAAG,SAAS,WAAA,EAAa,IAAA,CAAK,SAAS,IAAA,CAAK,aAAA,EAAe,KAAK,SAAS,CAAA;AAAA,MACzE,IAAA,EAAM;AAAA,QACJ,OAAA;AAAA,QACA,OAAA,EAAS,WAAA;AAAA,QACT,YAAY,IAAA,CAAK,cAAA;AAAA,QACjB,YAAY,IAAA,CAAK,YAAA;AAAA,QACjB,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,UAAA;AAAA,QAC9B,YAAA;AAAA,QACA,aAAA;AAAA,QACA,UAAA,EAAY;AAAA;AACd,KACF;AACA,IAAA,IAAA,CAAK,MAAM,KAAK,CAAA;AAAA,EAClB;AAAA;AAAA,EAIA,gBAAgB,GAAA,EAA6B;AAC3C,IAAA,MAAM,KAAA,GAA6B;AAAA,MACjC,GAAG,SAAS,iBAAA,EAAmB,IAAA,CAAK,SAAS,IAAA,CAAK,aAAA,EAAe,KAAK,SAAS,CAAA;AAAA,MAC/E,IAAA,EAAM;AAAA,QACJ,WAAW,GAAA,CAAI,SAAA;AAAA,QACf,eAAe,GAAA,CAAI;AAAA;AACrB,KACF;AACA,IAAA,IAAA,CAAK,MAAM,KAAK,CAAA;AAChB,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEA,eAAe,GAAA,EAAuB;AACpC,IAAA,IAAA,CAAK,iBAAiB,GAAA,CAAI,SAAA;AAC1B,IAAA,MAAM,KAAA,GAA2B;AAAA,MAC/B,GAAG,SAAS,eAAA,EAAiB,IAAA,CAAK,SAAS,IAAA,CAAK,aAAA,EAAe,KAAK,SAAS,CAAA;AAAA,MAC7E,IAAA,EAAM;AAAA,QACJ,WAAW,GAAA,CAAI,SAAA;AAAA,QACf,YAAA,EAAc,KAAA;AAAA,QACd,aAAA,EAAe,CAAA;AAAA,QACf,kBAAkB,IAAA,CAAK;AAAA;AACzB,KACF;AACA,IAAA,IAAA,CAAK,MAAM,KAAK,CAAA;AAAA,EAClB;AAAA;AAAA,EAIA,cAAc,GAAA,EAAwB;AACpC,IAAA,IAAA,CAAK,aAAA,GAAgB,KAAK,GAAA,EAAI;AAC9B,IAAA,MAAM,SAAS,GAAA,CAAI,QAAA,CAAS,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,QAAQ,CAAA;AACzD,IAAA,MAAM,oBAAoB,OAAO,MAAA,EAAQ,YAAY,QAAA,GAAW,MAAA,CAAO,QAAQ,MAAA,GAAS,CAAA;AAExF,IAAA,GAAA,CAAI,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,WAAA,EAAa;AAAA,MACjC,SAAA,EAAW,IAAI,GAAA,CAAI,SAAA;AAAA,MACnB,YAAA,EAAc,IAAI,QAAA,CAAS,MAAA;AAAA,MAC3B,SAAA,EAAW,IAAI,KAAA,CAAM,MAAA;AAAA,MACrB;AAAA,KACD,CAAA;AAGD,IAAA,IAAA,CAAK,aAAA,GAAgB;AAAA,MACnB,cAAc,OAAO,MAAA,EAAQ,OAAA,KAAY,QAAA,GAAW,OAAO,OAAA,GAAU,EAAA;AAAA,MACrE,UAAU,GAAA,CAAI;AAAA,KAChB;AAGA,IAAA,MAAM,KAAA,GAAuB;AAAA,MAC3B,GAAG,SAAS,WAAA,EAAa,IAAA,CAAK,SAAS,IAAA,CAAK,aAAA,EAAe,KAAK,SAAS,CAAA;AAAA,MACzE,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,IAAI,GAAA,CAAI,IAAA;AAAA,QACd,SAAA,EAAW,IAAI,GAAA,CAAI,SAAA;AAAA,QACnB,YAAA,EAAc,IAAI,QAAA,CAAS,MAAA;AAAA,QAC3B,SAAA,EAAW,IAAI,KAAA,CAAM,MAAA;AAAA,QACrB;AAAA;AACF,KACF;AACA,IAAA,IAAA,CAAK,MAAM,KAAK,CAAA;AAEhB,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,YAAA,CAAa,KAAa,MAAA,EAA6B;AACrD,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,aAAA;AACrC,IAAA,GAAA,CAAI,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,SAAA,EAAW;AAAA,MAC/B,SAAA,EAAW,IAAI,GAAA,CAAI,SAAA;AAAA,MACnB,YAAA,EAAc,MAAA,CAAO,KAAA,EAAO,YAAA,IAAgB,CAAA;AAAA,MAC5C,gBAAA,EAAkB,MAAA,CAAO,KAAA,EAAO,gBAAA,IAAoB,CAAA;AAAA,MACpD,UAAA,EAAY,OAAO,UAAA,IAAc,SAAA;AAAA,MACjC,YAAA,EAAA,CAAe,MAAA,CAAO,SAAA,EAAW,MAAA,IAAU,CAAA,IAAK,CAAA;AAAA,MAChD,aAAA,EAAe,MAAA,CAAO,SAAA,EAAW,MAAA,IAAU,CAAA;AAAA,MAC3C,UAAA;AAAA,MACA,SAAS,MAAA,CAAO;AAAA,KACjB,CAAA;AAED,IAAA,IAAI,KAAK,aAAA,EAAe;AAEtB,MAAA,GAAA,CAAI,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,WAAA,EAAa;AAAA,QACjC,SAAA,EAAW,IAAI,GAAA,CAAI,SAAA;AAAA,QACnB,YAAA,EAAc,KAAK,aAAA,CAAc,YAAA;AAAA,QACjC,QAAA,EAAU,IAAA,CAAK,aAAA,CAAc,QAAA,CAAS,IAAI,CAAA,CAAA,MAAM;AAAA,UAC9C,MAAM,CAAA,CAAE,IAAA;AAAA,UACR,OAAA,EAAS,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,GAAW,EAAE,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,OAAO;AAAA,SAC/E,CAAE,CAAA;AAAA,QACF,iBAAiB,MAAA,CAAO;AAAA,OACzB,CAAA;AACD,MAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AAAA,IACvB;AAAA,EACF;AAAA;AAAA,EAIA,eAAe,GAAA,EAA6B;AAC1C,IAAA,IAAA,CAAK,eAAe,GAAA,CAAI,GAAA,CAAI,QAAA,EAAU,IAAA,CAAK,KAAK,CAAA;AAEhD,IAAA,GAAA,CAAI,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,YAAA,EAAc;AAAA,MAClC,SAAA,EAAW,IAAI,GAAA,CAAI,SAAA;AAAA,MACnB,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,OAAO,GAAA,CAAI;AAAA,KACZ,CAAA;AAGD,IAAA,IAAA,CAAK,KAAA,CAAM;AAAA,MACT,GAAG,SAAS,YAAA,EAAc,IAAA,CAAK,SAAS,IAAA,CAAK,aAAA,EAAe,KAAK,SAAS,CAAA;AAAA,MAC1E,IAAA,EAAM;AAAA,QACJ,UAAU,GAAA,CAAI,QAAA;AAAA,QACd,OAAO,GAAA,CAAI;AAAA;AACb,KACa,CAAA;AAEf,IAAA,OAAO,SAAA;AAAA,EACT;AAAA,EAEA,aAAA,CAAc,KAAkB,MAAA,EAA0B;AAExD,IAAA,gBAAA,CAAiB,KAAK,MAAM,CAAA;AAE5B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,IAAK,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,GAAA,CAAI,QAAQ,CAAA,IAAK,IAAA,CAAK,GAAA,EAAI,CAAA;AACnF,IAAA,IAAA,CAAK,cAAA,CAAe,MAAA,CAAO,GAAA,CAAI,QAAQ,CAAA;AAEvC,IAAA,GAAA,CAAI,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,UAAA,EAAY;AAAA,MAChC,SAAA,EAAW,IAAI,GAAA,CAAI,SAAA;AAAA,MACnB,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,UAAA;AAAA,MACA,YAAA,EAAc,OAAO,MAAA,CAAO,MAAA;AAAA,MAC5B,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,UAAU,MAAA,CAAO;AAAA,KAClB,CAAA;AAAA,EAEH;AAAA;AAAA,EAIQ,MAAM,KAAA,EAAyB;AACrC,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,IACtB,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACF;ACvTA,IAAM,EAAA,GAAK,SAAA;AACX,IAAM,aAAA,GAAgB,WAAA;AAGtB,IAAM,gCAAgB,IAAI,GAAA,CAAI,CAAC,UAAA,EAAY,UAAA,EAAY,WAAW,CAAC,CAAA;AAa5D,IAAM,2BAAN,MAA+B;AAAA,EAC3B,IAAA,GAAO,iBAAA;AAAA,EACP,KAAA,GAAQ,CAAA;AAAA,EACR,MAAA,GAAS,EAAE,UAAA,EAAY,WAAA,EAAqB;AAAA,EAEpC,KAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA;AAAA,EAET,KAAA,GAAQ,EAAA;AAAA,EAEhB,YAAY,GAAA,EAA2B;AACrC,IAAA,IAAA,CAAK,UAAU,GAAA,CAAI,OAAA;AACnB,IAAA,IAAA,CAAK,YAAY,GAAA,CAAI,SAAA;AACrB,IAAA,IAAA,CAAK,QAAQ,IAAI,WAAA,CAAY,GAAA,CAAI,UAAA,EAAY,IAAI,aAAa,CAAA;AAAA,EAChE;AAAA,EAEA,QAAQ,GAAA,EAAuB;AAC7B,IAAA,IAAA,CAAK,QAAQ,GAAA,CAAI,SAAA;AAAA,EACnB;AAAA,EAEA,MAAM,aAAA,CAAc,GAAA,EAAkB,MAAA,EAAmC;AACvE,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AAAC,MAAA;AAAA,IAAO;AAC7B,IAAA,IAAI,CAAC,aAAA,CAAc,GAAA,CAAI,GAAA,CAAI,QAAQ,CAAA,EAAG;AAAC,MAAA;AAAA,IAAO;AAE9C,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,GAAA,CAAI,SAAA,IAAa,IAAA,CAAK,SAAA;AAC5C,IAAA,IAAI,CAAC,SAAA,EAAW;AAAC,MAAA;AAAA,IAAO;AAExB,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,QAAA,GAAW,gBAAgB,CAAA;AAC/C,IAAA,IAAI,CAAC,IAAA,EAAM;AAAC,MAAA;AAAA,IAAO;AAGnB,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA;AACjC,IAAA,IAAI,CAAC,QAAA,EAAU;AAAC,MAAA;AAAA,IAAO;AAEvB,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK;AAAA,MACnC,SAAA;AAAA,MACA,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAA;AAAA,MACA,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,eAAe,IAAA,CAAK,aAAA;AAAA,MACpB,cAAc,IAAA,CAAK,YAAA;AAAA,MACnB,QAAA,EAAU;AAAA,QACR,aAAa,IAAA,CAAK,WAAA;AAAA,QAClB,WAAW,IAAA,CAAK,SAAA;AAAA,QAChB,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,YAAY,IAAA,CAAK,UAAA;AAAA,QACjB,cAAc,IAAA,CAAK,YAAA;AAAA,QACnB,YAAY,IAAA,CAAK;AAAA;AACnB,KACD,CAAA;AAGD,IAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,IAAA,CAAK,IAAyB,EAAA,EAAI,aAAa,KAAK,EAAC;AAC9E,IAAA,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,aAAA,EAAe,CAAC,GAAG,QAAA,EAAU,SAAA,CAAU,MAAM,CAAC,CAAC,CAAA;AAAA,EACtE;AAAA;AAAA,EAGA,MAAM,WAAA,CAAY,SAAA,EAAmB,UAAA,EAAuE;AAC1G,IAAA,MAAM,UAAU,MAAM,IAAA,CAAK,MAAM,OAAA,CAAQ,SAAA,EAAW,KAAK,KAAK,CAAA;AAE9D,IAAA,MAAM,OAAA,GAAU,CAAC,GAAG,OAAO,CAAA,CAAE,IAAA;AAAA,MAC3B,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,KAAK,CAAA,CAAE,SAAS,CAAA,CAAE,OAAA,KAAY,IAAI,IAAA,CAAK,CAAA,CAAE,SAAS,EAAE,OAAA;AAAQ,KAC5E;AAEA,IAAA,IAAI,UAAA,GAAa,CAAA;AACjB,IAAA,MAAM,SAAmB,EAAC;AAE1B,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,MAAM,QAAA,GAAgBC,MAAA,CAAA,IAAA,CAAK,UAAA,EAAY,MAAA,CAAO,QAAQ,CAAA;AACtD,MAAA,IAAI;AACF,QAAA,IAAI,MAAA,CAAO,cAAc,QAAA,EAAU;AAEjC,UAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,YAAA,MAASC,GAAA,CAAA,QAAA,CAAS,MAAWD,MAAA,CAAA,OAAA,CAAQ,QAAQ,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACnE,YAAA,MAASC,aAAS,SAAA,CAAU,QAAA,EAAU,MAAA,CAAO,MAAA,CAAO,SAAS,OAAO,CAAA;AACpE,YAAA,UAAA,EAAA;AAAA,UACF;AAAA,QACF,CAAA,MAAA,IAAW,OAAO,MAAA,EAAQ;AAExB,UAAA,MAASA,GAAA,CAAA,QAAA,CAAS,MAAWD,MAAA,CAAA,OAAA,CAAQ,QAAQ,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACnE,UAAA,MAASC,aAAS,SAAA,CAAU,QAAA,EAAU,MAAA,CAAO,MAAA,CAAO,SAAS,OAAO,CAAA;AACpE,UAAA,UAAA,EAAA;AAAA,QACF,CAAA,MAAO;AAEL,UAAA,MAASA,aAAS,MAAA,CAAO,QAAQ,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,KAA6B;AACrE,YAAA,IAAI,CAAA,CAAE,SAAS,QAAA,EAAU;AAAC,cAAA,MAAM,CAAA;AAAA,YAAE;AAAA,UACpC,CAAC,CAAA;AACD,UAAA,UAAA,EAAA;AAAA,QACF;AAAA,MACF,SAAS,CAAA,EAAG;AACV,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,MAAA,CAAO,QAAQ,KAAK,MAAA,CAAO,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,MAChD;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,YAAY,MAAA,EAAO;AAAA,EAC9B;AAAA;AAAA,EAGA,IAAI,WAAA,GAA2B;AAC7B,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AACF;AAMO,SAAS,uBAAuB,GAAA,EAAsC;AAC3E,EAAA,OAAO,IAAI,IAAA,CAAK,GAAA,CAAyB,EAAA,EAAI,aAAa,KAAK,EAAC;AAClE;;;ACtJA,IAAM,0BAAA,GAA6B,CAAA;AACnC,IAAM,2BAAA,GAA8B,GAAA;AAE7B,IAAM,mBAAN,MAAuB;AAAA,EACnB,IAAA,GAAO,QAAA;AAAA,EACP,KAAA,GAAQ,EAAA;AAAA,EACR,MAAA,GAAS,EAAE,UAAA,EAAY,aAAA,EAAwB,WAAW,GAAA,EAAK;AAAA,EAEvD,MAAA;AAAA,EACA,aAAA;AAAA,EACT,qBAAA,GAAwB,KAAA;AAAA;AAAA,EAExB,mBAA6B,EAAC;AAAA,EAC9B,eAAA,GAAkB,CAAA;AAAA,EAClB,qBAAA,GAAwB,KAAA;AAAA,EAEhC,WAAA,CAAY,QAAsB,aAAA,EAA6B;AAC7D,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AAAA,EACvB;AAAA,EAEA,IAAI,oBAAA,GAAgC;AAClC,IAAA,OAAO,IAAA,CAAK,qBAAA;AAAA,EACd;AAAA,EAEA,gBAAgB,GAAA,EAAgC;AAC9C,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,UAAU,IAAA,CAAK,MAAA,CAAO,aAAa,CAAA,EAAG;AAAC,MAAA,OAAO,UAAA;AAAA,IAAW;AAE1E,IAAA,MAAM,IAAA,GAAO,KAAK,aAAA,EAAc;AAChC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,SAAA,GAAY,KAAK,MAAA,CAAO,cAAA;AAKtD,IAAA,MAAM,KAAA,GAAQ,OAAO,IAAA,CAAK,eAAA;AAC1B,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,IAAA,IAAI,GAAA,CAAI,YAAY,CAAA,EAAG;AACrB,MAAA,IAAA,CAAK,gBAAA,CAAiB,KAAK,KAAK,CAAA;AAChC,MAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,MAAA,GAAS,0BAAA,EAA4B;AAC7D,QAAA,IAAA,CAAK,iBAAiB,KAAA,EAAM;AAAA,MAC9B;AAAA,IACF;AAGA,IAAA,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,YAAA,EAAc,IAAI,CAAA;AACzC,IAAA,GAAA,CAAI,KAAK,GAAA,CAAI,QAAA,EAAU,WAAA,EAAa,IAAA,CAAK,OAAO,SAAS,CAAA;AAEzD,IAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,MAAA,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,WAAA,EAAa,IAAI,CAAA;AACxC,MAAA,GAAA,CAAI,IAAA,CAAK,IAAI,QAAA,EAAU,iBAAA,EAAmB,qBAAqB,IAAI,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,CAAA;AAElF,MAAA,IAAI,IAAA,CAAK,MAAA,CAAO,QAAA,IAAY,IAAA,CAAK,OAAO,yBAAA,EAA2B;AACjE,QAAA,GAAA,CAAI,KAAK,GAAA,CAAI,QAAA,EAAU,gBAAA,EAAkB,IAAA,CAAK,OAAO,yBAAyB,CAAA;AAC9E,QAAA,GAAA,CAAI,QAAA,CAAS,KAAK,kBAAA,EAAoB;AAAA,UACpC,IAAA,EAAM,QAAA;AAAA,UACN,KAAA,EAAO,WAAA;AAAA,UACP,IAAA,EAAM,EAAE,UAAA,EAAY,IAAA,EAAM,WAAW,SAAA;AAAU,SAChD,CAAA;AACD,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEA,cAAc,GAAA,EAAuC;AACnD,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,UAAU,IAAA,CAAK,MAAA,CAAO,aAAa,CAAA,EAAG;AAAC,MAAA,OAAO,MAAA;AAAA,IAAU;AACzE,IAAA,IAAI,KAAK,qBAAA,EAAuB;AAAC,MAAA,OAAO,MAAA;AAAA,IAAU;AAElD,IAAA,MAAM,IAAA,GAAO,KAAK,aAAA,EAAc;AAChC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,SAAA,GAAY,KAAK,MAAA,CAAO,cAAA;AAEtD,IAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,MAAA,IAAA,CAAK,qBAAA,GAAwB,IAAA;AAC7B,MAAA,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,wBAAwB,IAAI,CAAA;AAEvD,MAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAO,OAAO,IAAA,CAAK,MAAA,CAAO,YAAa,GAAG,CAAA;AAC/D,MAAA,GAAA,CAAI,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,kBAAA,EAAoB;AAAA,QACxC,IAAA,EAAM,QAAA;AAAA,QACN,KAAA,EAAO,cAAA;AAAA,QACP,IAAA,EAAM,EAAE,UAAA,EAAY,IAAA,EAAM,WAAW,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW,KAAA,EAAO,OAAA;AAAQ,OAC5E,CAAA;AACD,MAAA,OAAO;AAAA,QACL,QAAA,EAAU;AAAA,UACR,GAAG,GAAA,CAAI,QAAA;AAAA,UACP;AAAA,YACE,IAAA,EAAM,MAAA;AAAA,YACN,OAAA,EACE,CAAA,2BAAA,EAAoB,OAAO,CAAA,YAAA,EAAe,IAAA,CAAK,cAAA,EAAgB,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,cAAA,EAAgB,CAAA,0LAAA;AAAA;AAE7G;AACF,OACF;AAAA,IACF;AAKA,IAAA,IACE,CAAC,IAAA,CAAK,qBAAA,IACN,IAAA,CAAK,gBAAA,CAAiB,MAAA,IAAU,0BAAA,IAChC,IAAA,CAAK,gBAAA,CAAiB,KAAA,CAAM,CAAA,CAAA,KAAK,CAAA,GAAI,2BAA2B,CAAA,EAChE;AACA,MAAA,IAAA,CAAK,qBAAA,GAAwB,IAAA;AAC7B,MAAA,GAAA,CAAI,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,kBAAA,EAAoB;AAAA,QACxC,IAAA,EAAM,QAAA;AAAA,QACN,KAAA,EAAO,qBAAA;AAAA,QACP,IAAA,EAAM;AAAA,UACJ,YAAA,EAAc,CAAC,GAAG,IAAA,CAAK,gBAAgB,CAAA;AAAA,UACvC,SAAA,EAAW,2BAAA;AAAA,UACX,MAAA,EAAQ;AAAA;AACV,OACD,CAAA;AACD,MAAA,OAAO;AAAA,QACL,QAAA,EAAU;AAAA,UACR,GAAG,GAAA,CAAI,QAAA;AAAA,UACP;AAAA,YACE,IAAA,EAAM,MAAA;AAAA,YACN,OAAA,EACE,CAAA,4CAAA,EAAqC,0BAA0B,CAAA,qCAAA,EAAwC,2BAA2B,CAAA,yKAAA;AAAA;AACtI;AACF,OACF;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,qBAAA,GAAwB,KAAA;AAC7B,IAAA,IAAA,CAAK,mBAAmB,EAAC;AACzB,IAAA,IAAA,CAAK,eAAA,GAAkB,CAAA;AACvB,IAAA,IAAA,CAAK,qBAAA,GAAwB,KAAA;AAAA,EAC/B;AACF;AC5IO,IAAM,qBAAN,MAAyB;AAAA,EACrB,IAAA,GAAO,UAAA;AAAA,EACP,KAAA,GAAQ,EAAA;AAAA,EACR,MAAA,GAAS,EAAE,UAAA,EAAY,WAAA,EAAsB,WAAW,GAAA,EAAK;AAAA,EAErD,cAAA;AAAA,EACA,SAAA;AAAA,EACT,wBAAA,GAA2B,CAAA;AAAA,EAC3B,mBAA6B,EAAC;AAAA,EAC9B,kBAAA,GAAqB,KAAA;AAAA;AAAA,EAErB,gBAAA,GAAmB,CAAA;AAAA;AAAA,EAEnB,wBAAA,GAA2B,CAAA;AAAA;AAAA,EAE3B,sBAAA,GAAyB,KAAA;AAAA,EAEjC,WAAA,CAAY,cAAA,GAAiB,CAAA,EAAG,SAAA,GAA+B,EAAC,EAAG;AACjE,IAAA,IAAA,CAAK,cAAA,GAAiB,cAAA;AACtB,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,EACnB;AAAA,EAEA,IAAI,uBAAA,GAAkC;AACpC,IAAA,OAAO,IAAA,CAAK,wBAAA;AAAA,EACd;AAAA,EAEA,IAAI,OAAA,GAAmB;AACrB,IAAA,OAAO,IAAA,CAAK,4BAA4B,IAAA,CAAK,cAAA;AAAA,EAC/C;AAAA,EAEA,gBAAgB,GAAA,EAAgC;AAC9C,IAAA,IAAA,CAAK,wBAAA,EAAA;AAEL,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,SAAA,EAAW,IAAI,CAAA;AACxC,MAAA,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,yBAAA,EAA2B,KAAK,wBAAwB,CAAA;AACjF,MAAA,IAAA,CAAK,SAAA,CAAU,OAAA,GAAU,GAAA,CAAI,SAAA,EAAW,KAAK,wBAAwB,CAAA;AACrE,MAAA,GAAA,CAAI,QAAA,CAAS,KAAK,kBAAA,EAAoB;AAAA,QACpC,IAAA,EAAM,UAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,MAAM,EAAE,SAAA,EAAW,IAAI,SAAA,EAAW,uBAAA,EAAyB,KAAK,wBAAA;AAAyB,OAC1F,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEA,cAAc,GAAA,EAAuC;AACnD,IAAA,IAAI,KAAK,kBAAA,EAAoB;AAAC,MAAA,OAAO,MAAA;AAAA,IAAU;AAE/C,IAAA,MAAM,EAAE,SAAA,EAAW,aAAA,EAAc,GAAI,GAAA,CAAI,GAAA;AAEzC,IAAA,IAAI,aAAa,aAAA,EAAe;AAC9B,MAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAC1B,MAAA,GAAA,CAAI,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,kBAAA,EAAoB;AAAA,QACxC,IAAA,EAAM,UAAA;AAAA,QACN,KAAA,EAAO,sBAAA;AAAA,QACP,IAAA,EAAM,EAAE,SAAA,EAAW,aAAA;AAAc,OAClC,CAAA;AACD,MAAA,OAAO;AAAA,QACL,QAAA,EAAU;AAAA,UACR,GAAG,GAAA,CAAI,QAAA;AAAA,UACP;AAAA,YACE,IAAA,EAAM,QAAA;AAAA,YACN,OAAA,EACE,CAAA,8BAAA,EAAuB,SAAS,CAAA,CAAA,EAAI,aAAa,CAAA,0GAAA;AAAA;AACrD,SACF;AAAA,QACA,UAAA,EAAY,EAAE,IAAA,EAAM,UAAA,EAAqB,UAAU,EAAE,IAAA,EAAM,UAAS;AAAE,OACxE;AAAA,IACF;AAMA,IAAA,MAAM,gBAAgB,IAAA,CAAK,wBAAA;AAE3B,IAAA,IAAI,aAAA,IAAiB,IAAA,CAAK,cAAA,IAAkB,IAAA,CAAK,mBAAmB,CAAA,EAAG;AACrE,MAAA,MAAM,eAAA,GAAkB,KAAK,cAAA,GAAiB,CAAA;AAC9C,MAAA,MAAM,eAAA,GAAkB,KAAK,cAAA,GAAiB,CAAA;AAE9C,MAAA,IAAI,aAAA,IAAiB,eAAA,IAAmB,IAAA,CAAK,gBAAA,GAAmB,CAAA,EAAG;AACjE,QAAA,IAAA,CAAK,gBAAA,GAAmB,CAAA;AACxB,QAAA,GAAA,CAAI,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,kBAAA,EAAoB;AAAA,UACxC,IAAA,EAAM,UAAA;AAAA,UACN,KAAA,EAAO,aAAA;AAAA,UACP,IAAA,EAAM,EAAE,KAAA,EAAO,CAAA,EAAG,WAAW,aAAA;AAAc,SAC5C,CAAA;AACD,QAAA,OAAO;AAAA,UACL,QAAA,EAAU;AAAA,YACR,GAAG,GAAA,CAAI,QAAA;AAAA,YACP;AAAA,cACE,IAAA,EAAM,MAAA;AAAA,cACN,OAAA,EACE,uBAAa,aAAa,CAAA,8LAAA;AAAA;AAC9B,WACF;AAAA,UACA,UAAA,EAAY,EAAE,IAAA,EAAM,UAAA,EAAqB,UAAU,EAAE,IAAA,EAAM,UAAS;AAAE,SACxE;AAAA,MACF;AAEA,MAAA,IAAI,aAAA,IAAiB,eAAA,IAAmB,IAAA,CAAK,gBAAA,GAAmB,CAAA,EAAG;AACjE,QAAA,IAAA,CAAK,gBAAA,GAAmB,CAAA;AACxB,QAAA,GAAA,CAAI,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,kBAAA,EAAoB;AAAA,UACxC,IAAA,EAAM,UAAA;AAAA,UACN,KAAA,EAAO,aAAA;AAAA,UACP,IAAA,EAAM,EAAE,KAAA,EAAO,CAAA,EAAG,WAAW,aAAA;AAAc,SAC5C,CAAA;AACD,QAAA,OAAO;AAAA,UACL,QAAA,EAAU;AAAA,YACR,GAAG,GAAA,CAAI,QAAA;AAAA,YACP;AAAA,cACE,IAAA,EAAM,MAAA;AAAA,cACN,OAAA,EACE,6BAAmB,aAAa,CAAA,iLAAA;AAAA;AACpC;AACF,SACF;AAAA,MACF;AAEA,MAAA,IAAI,IAAA,CAAK,mBAAmB,CAAA,EAAG;AAC7B,QAAA,IAAA,CAAK,gBAAA,GAAmB,CAAA;AACxB,QAAA,GAAA,CAAI,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,kBAAA,EAAoB;AAAA,UACxC,IAAA,EAAM,UAAA;AAAA,UACN,KAAA,EAAO,aAAA;AAAA,UACP,IAAA,EAAM,EAAE,KAAA,EAAO,CAAA,EAAG,WAAW,aAAA;AAAc,SAC5C,CAAA;AACD,QAAA,OAAO;AAAA,UACL,QAAA,EAAU;AAAA,YACR,GAAG,GAAA,CAAI,QAAA;AAAA,YACP;AAAA,cACE,IAAA,EAAM,MAAA;AAAA,cACN,OAAA,EACE,+BAAqB,aAAa,CAAA,kHAAA;AAAA;AACtC;AACF,SACF;AAAA,MACF;AAAA,IACF;AAKA,IAAA,IAAI,KAAK,sBAAA,EAAwB;AAC/B,MAAA,IAAA,CAAK,sBAAA,GAAyB,KAAA;AAC9B,MAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,IAAA,CAAK,IAAa,MAAA,EAAQ,YAAY,KAC5D,GAAA,CAAI,QAAA,CAAS,KAAK,CAAA,CAAA,KAAK,OAAO,EAAE,OAAA,KAAY,QAAA,IAAY,EAAE,OAAA,CAAQ,QAAA,CAAS,WAAW,CAAC,CAAA;AAC5F,MAAA,IAAI,UAAA,EAAY;AAEd,QAAA,MAAM,WAAA,GAAc,IAAA,CAAK,aAAA,CAAc,GAAG,CAAA;AAC1C,QAAA,MAAM,cAAc,WAAA,GAChB;;AAAA;AAAA;AAAA,EAAiD,WAAA,CAAY,KAAA,CAAM,CAAA,EAAG,GAAI,CAAC;AAAA;;AAAA,4EAAA,CAAA,GAC3E,wGAAA;AAEJ,QAAA,GAAA,CAAI,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,kBAAA,EAAoB;AAAA,UACxC,IAAA,EAAM,UAAA;AAAA,UACN,KAAA,EAAO,uBAAA;AAAA,UACP,IAAA,EAAM,EAAE,uBAAA,EAAyB,IAAA,CAAK,wBAAA;AAAyB,SAChE,CAAA;AACD,QAAA,OAAO;AAAA,UACL,QAAA,EAAU;AAAA,YACR,GAAG,GAAA,CAAI,QAAA;AAAA,YACP;AAAA,cACE,IAAA,EAAM,MAAA;AAAA,cACN,OAAA,EACE,CAAA,0CAAA,EAAmC,IAAA,CAAK,wBAAwB,0GACF,WAAW,CAAA;AAAA;AAC7E;AACF,SACF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,eAAe,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,GAAA,CAAa,YAAY,cAAc,CAAA;AACzE,IAAA,IAAI,YAAA,EAAc;AAEhB,MAAA,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,gBAAgB,KAAK,CAAA;AAClD,MAAA,OAAO;AAAA,QACL,QAAA,EAAU;AAAA,UACR,GAAG,GAAA,CAAI,QAAA;AAAA,UACP;AAAA,YACE,IAAA,EAAM,MAAA;AAAA,YACN,OAAA,EACE;AAAA;AACJ;AACF,OACF;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,aAAA,CAAc,KAAkB,MAAA,EAA0B;AAExD,IAAA,IAAI,GAAA,CAAI,aAAa,YAAA,EAAc;AACjC,MAAA,IAAA,CAAK,wBAAA,GAA2B,CAAA;AAAA,IAClC,WAAW,GAAA,CAAI,QAAA,KAAa,QAAA,IAAY,GAAA,CAAI,aAAa,eAAA,EAAiB;AACxE,MAAA,IAAA,CAAK,wBAAA,EAAA;AAEL,MAAA,IAAI,IAAA,CAAK,4BAA4B,CAAA,EAAG;AACtC,QAAA,IAAA,CAAK,sBAAA,GAAyB,IAAA;AAAA,MAChC;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAM,GAAG,GAAA,CAAI,QAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAC,CAAA,CAAA;AACxD,IAAA,IAAA,CAAK,gBAAA,CAAiB,KAAK,GAAG,CAAA;AAC9B,IAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,MAAA,GAAS,CAAA,EAAG;AACpC,MAAA,IAAA,CAAK,iBAAiB,KAAA,EAAM;AAAA,IAC9B;AAGA,IAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,MAAA,IAAU,CAAA,EAAG;AACrC,MAAA,MAAM,QAAQ,IAAA,CAAK,gBAAA,CAAiB,MAAM,EAAE,CAAA,CAAE,KAAK,GAAG,CAAA;AACtD,MAAA,MAAM,KAAA,GAAQ,KAAK,gBAAA,CAAiB,KAAA,CAAM,IAAI,EAAE,CAAA,CAAE,KAAK,GAAG,CAAA;AAC1D,MAAA,IAAI,UAAU,KAAA,EAAO;AACnB,QAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,gBAAA,CAAiB,KAAA,CAAM,EAAE,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,KAAK,CAAC,CAAA;AACrF,QAAA,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,gBAAgB,IAAI,CAAA;AACjD,QAAA,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,iBAAiB,aAAa,CAAA;AAC3D,QAAA,IAAA,CAAK,SAAA,CAAU,MAAA,GAAS,GAAA,CAAI,SAAA,EAAW,aAAa,CAAA;AACpD,QAAA,GAAA,CAAI,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,kBAAA,EAAoB;AAAA,UACxC,IAAA,EAAM,UAAA;AAAA,UACN,KAAA,EAAO,eAAA;AAAA,UACP,IAAA,EAAM,EAAE,SAAA,EAAW,GAAA,CAAI,WAAW,aAAA;AAAc,SACjD,CAAA;AAAA,MACH;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,OAAA,IAAW,MAAA,CAAO,UAAU,MAAA,CAAO,MAAA,CAAO,SAAS,CAAA,EAAG;AAC/D,MAAA,IAAA,CAAK,wBAAA,GAA2B,CAAA;AAChC,MAAA,IAAA,CAAK,gBAAA,GAAmB,CAAA;AACxB,MAAA,IAAA,CAAK,SAAA,CAAU,UAAA,GAAa,GAAA,CAAI,SAAS,CAAA;AAAA,IAC3C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,cAAc,GAAA,EAA4B;AAChD,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,IAAA,CAAK,IAAY,SAAA,EAAW,IAAI,CAAA,IACrD,GAAA,CAAI,GAAA,CAAI,SAAA;AACb,MAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,IAAA,CAAK,IAAY,SAAA,EAAW,YAAY,CAAA,IAC9D,OAAA,CAAQ,GAAA,EAAI;AACjB,MAAA,MAAM,WAAgBC,MAAA,CAAA,IAAA,CAAK,UAAA,EAAY,OAAO,QAAA,EAAU,UAAA,EAAY,WAAW,SAAS,CAAA;AACxF,MAAA,IAAOC,GAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC3B,QAAA,OAAUA,GAAA,CAAA,YAAA,CAAa,UAAU,OAAO,CAAA;AAAA,MAC1C;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,wBAAA,GAA2B,CAAA;AAChC,IAAA,IAAA,CAAK,mBAAmB,EAAC;AACzB,IAAA,IAAA,CAAK,kBAAA,GAAqB,KAAA;AAC1B,IAAA,IAAA,CAAK,gBAAA,GAAmB,CAAA;AACxB,IAAA,IAAA,CAAK,wBAAA,GAA2B,CAAA;AAChC,IAAA,IAAA,CAAK,sBAAA,GAAyB,KAAA;AAAA,EAChC;AACF;;;ACzPO,IAAM,sBAAN,MAA0B;AAAA,EACtB,IAAA,GAAO,WAAA;AAAA,EACP,KAAA,GAAQ,EAAA;AAAA,EACR,MAAA,GAAS,EAAE,UAAA,EAAY,WAAA,EAAsB,WAAW,GAAA,EAAK;AAAA,EAErD,SAAA;AAAA,EACT,UAAA,GAAa,CAAA;AAAA,EACb,gBAA+B,EAAC;AAAA,EAChC,iBAAA,GAAoB,CAAA;AAAA,EACpB,eAAA,GAAkB,CAAA;AAAA,EAClB,cAAA,GAAiB,CAAA;AAAA,EAEzB,WAAA,CAAY,SAAA,GAAgC,EAAC,EAAG;AAC9C,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,EACnB;AAAA,EAEA,IAAI,gBAAA,GAA2B;AAAE,IAAA,OAAO,IAAA,CAAK,iBAAA;AAAA,EAAmB;AAAA,EAChE,IAAI,cAAA,GAA2B;AAAE,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,EAAiB;AAAA,EAC9D,IAAI,YAAA,GAA2C;AAAE,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EAAe;AAAA,EAE5E,QAAQ,IAAA,EAAwB;AAC9B,IAAA,IAAA,CAAK,UAAA,GAAa,KAAK,GAAA,EAAI;AAC3B,IAAA,IAAA,CAAK,gBAAgB,EAAC;AACtB,IAAA,IAAA,CAAK,iBAAA,GAAoB,CAAA;AACzB,IAAA,IAAA,CAAK,eAAA,GAAkB,CAAA;AAAA,EACzB;AAAA,EAEA,YAAA,CAAa,KAAa,MAAA,EAA6B;AACrD,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAI,GAAA,CAAI,SAAA;AAC9B,IAAA,IAAI,OAAO,KAAA,EAAO;AAChB,MAAA,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,eAAA,EAAiB,OAAO,KAAA,CAAM,YAAA,GAAe,MAAA,CAAO,KAAA,CAAM,gBAAgB,CAAA;AAAA,IAC1G;AAAA,EACF;AAAA,EAEA,aAAA,CAAc,MAAmB,MAAA,EAA0B;AACzD,IAAA,MAAM,OAAA,GAAuB;AAAA,MAC3B,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,SAAA,EAAW,MAAA,CAAO,OAAA,GAAU,MAAA,GAAY;AAAA,KAC1C;AAEA,IAAA,IAAA,CAAK,aAAA,CAAc,KAAK,OAAO,CAAA;AAC/B,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,MAAA,IAAA,CAAK,eAAA,EAAA;AAAA,IACP,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,iBAAA,EAAA;AAAA,IACP;AAEA,IAAA,IAAA,CAAK,SAAA,CAAU,gBAAgB,OAAO,CAAA;AAAA,EACxC;AAAA,EAEA,MAAA,CAAO,MAAkB,MAAA,EAAsB;AAC7C,IAAA,MAAM,OAAA,GAAsB;AAAA,MAC1B,WAAW,IAAA,CAAK,UAAA;AAAA,MAChB,OAAA,EAAS,KAAK,GAAA,EAAI;AAAA,MAClB,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,UAAA;AAAA,MAC9B,eAAA,EAAiB,KAAK,cAAA,GAAiB,CAAA;AAAA,MACvC,cAAc,IAAA,CAAK,aAAA;AAAA,MACnB,kBAAkB,IAAA,CAAK,iBAAA;AAAA,MACvB,gBAAgB,IAAA,CAAK,eAAA;AAAA,MACrB,UAAA,EAAY;AAAA,KACd;AAEA,IAAA,IAAA,CAAK,SAAA,CAAU,gBAAgB,OAAO,CAAA;AAAA,EACxC;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,UAAA,GAAa,CAAA;AAClB,IAAA,IAAA,CAAK,gBAAgB,EAAC;AACtB,IAAA,IAAA,CAAK,iBAAA,GAAoB,CAAA;AACzB,IAAA,IAAA,CAAK,eAAA,GAAkB,CAAA;AACvB,IAAA,IAAA,CAAK,cAAA,GAAiB,CAAA;AAAA,EACxB;AACF;ACjFO,IAAM,0BAAN,MAA8B;AAAA,EAC1B,IAAA,GAAO,gBAAA;AAAA,EACP,KAAA,GAAQ,EAAA;AAAA,EACR,MAAA;AAAA,EAEQ,eAAA;AAAA,EACA,iBAAA;AAAA,EACA,gBAAA;AAAA;AAAA;AAAA,EAIA,SAA8B,EAAC;AAAA;AAAA;AAAA,EAIxC,eAAA,GAAgE,IAAA;AAAA,EAChE,GAAA,GAAmB,IAAA;AAAA,EAE3B,WAAA,CAAY,MAAA,GAAgC,EAAC,EAAG;AAC9C,IAAA,IAAA,CAAK,eAAA,GAAkB,OAAO,eAAA,IAAmB,GAAA;AACjD,IAAA,IAAA,CAAK,iBAAA,GAAoB,OAAO,iBAAA,IAAqB,EAAA;AACrD,IAAA,IAAA,CAAK,gBAAA,GAAmB,OAAO,gBAAA,IAAoB,KAAA;AAGnD,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,UAAA,EAAY,WAAA;AAAA,MACZ,SAAA,EAAW,IAAA,CAAK,gBAAA,GAAmB,IAAA,GAAS;AAAA,KAC9C;AAAA,EACF;AAAA;AAAA,EAIA,aAAA,CAAc,KAAkB,MAAA,EAA0B;AAEnD,EACP;AAAA;AAAA,EAIA,MAAM,cAAc,GAAA,EAAgD;AAClE,IAAA,MAAM,OAAO,GAAA,CAAI,QAAA;AAGjB,IAAA,MAAM,SAAA,GAAY,cAAc,IAAI,CAAA;AAEpC,IAAA,IAAI,SAAA,IAAa,KAAK,MAAA,EAAQ;AAC5B,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,SAAS,CAAA;AACtC,IAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,IAAA,CAAK,KAAA,CAAM,SAAS,CAAC,CAAA;AAGpD,IAAA,IAAI,MAAA,CAAO,MAAA,IAAU,IAAA,CAAK,iBAAA,EAAmB;AAC3C,MAAA,MAAMC,UAAAA,GAAY,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAC,CAAA;AACtE,MAAA,IAAI,CAAC,gBAAA,CAAiBA,UAAAA,EAAW,KAAK,KAAA,CAAM,SAAS,CAAC,CAAA,EAAG;AACvD,QAAA,OAAO,MAAA;AAAA,MACT;AACA,MAAA,OAAO,EAAE,QAAA,EAAU,CAAC,GAAG,MAAA,EAAQ,GAAGA,UAAS,CAAA,EAAE;AAAA,IAC/C;AAGA,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,CAAC,KAAK,iBAAiB,CAAA;AAEjD,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,YAAA,CAAa,IAAI,CAAA;AAC7C,IAAA,MAAM,SAAA,GAAY,cAAA,CAAe,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAC,CAAA;AAC9E,IAAA,MAAM,gBAAgB,MAAA,CAAO,KAAA,CAAM,GAAG,MAAA,CAAO,MAAA,GAAS,KAAK,iBAAiB,CAAA;AAC5E,IAAA,MAAM,eAAe,aAAA,CAAc,MAAA;AAEnC,IAAA,GAAA,CAAI,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,kBAAA,EAAoB;AAAA,MACxC,IAAA,EAAM,gBAAA;AAAA,MACN,KAAA,EAAO,SAAA;AAAA,MACP,MAAM,EAAE,aAAA,EAAe,YAAA,EAAc,UAAA,EAAY,KAAK,iBAAA;AAAkB,KACzE,CAAA;AAGD,IAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,gBAAA,CAAiB,eAAe,YAAY,CAAA;AAC9E,IAAA,MAAM,UAAA,GAAyB,EAAE,IAAA,EAAM,QAAA,EAAU,SAAS,cAAA,EAAe;AAEzE,IAAA,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,UAAA,EAAY,GAAG,SAAS,CAAA,EAAE;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAc,gBAAA,CACZ,aAAA,EACA,YAAA,EACiB;AACjB,IAAA,IAAI,CAAC,KAAK,gBAAA,EAAkB;AAC1B,MAAA,OAAO,oBAAoB,YAAY,CAAA,4DAAA,CAAA;AAAA,IACzC;AAGA,IAAA,IAAI,IAAA,CAAK,eAAA,IAAmB,IAAA,CAAK,eAAA,CAAgB,aAAa,YAAA,EAAc;AAC1E,MAAA,OAAO,KAAK,eAAA,CAAgB,OAAA;AAAA,IAC9B;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,eAAA,CAAgB,aAAa,CAAA;AACxD,MAAA,IAAA,CAAK,eAAA,GAAkB,EAAE,QAAA,EAAU,YAAA,EAAc,OAAA,EAAQ;AACzD,MAAA,OAAO,OAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AAEN,MAAA,OAAO,oBAAoB,YAAY,CAAA,4DAAA,CAAA;AAAA,IACzC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,gBAAgB,MAAA,EAAyC;AACrE,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACb,MAAA,IAAA,CAAK,MAAMC,MAAAA,CAAO,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA,IAAK,IAAA;AAAA,IAC1C;AACA,IAAA,IAAI,CAAC,IAAA,CAAK,GAAA,EAAK,QAAA,EAAU;AACvB,MAAA,MAAM,IAAI,MAAM,iCAAiC,CAAA;AAAA,IACnD;AAGA,IAAA,MAAM,UAAA,GAAa,MAAA,CAChB,GAAA,CAAI,CAAC,OAAO,CAAA,KAAM;AACjB,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM;AAC7B,QAAA,MAAM,UAAU,OAAO,CAAA,CAAE,YAAY,QAAA,GACjC,CAAA,CAAE,QAAQ,KAAA,CAAM,CAAA,EAAG,GAAI,CAAA,GACvB,IAAA,CAAK,UAAU,CAAA,CAAE,OAAA,IAAW,EAAE,CAAA,CAAE,KAAA,CAAM,GAAG,GAAI,CAAA;AACjD,QAAA,OAAO,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA;AAAA,MAC/B,CAAC,CAAA;AACD,MAAA,OAAO,CAAA,UAAA,EAAa,IAAI,CAAC,CAAA;AAAA,EAAS,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,IACpD,CAAC,CAAA,CACA,IAAA,CAAK,MAAM,CAAA;AAGd,IAAA,MAAM,gBAAA,GAAmB,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,IAAM,CAAA;AAEnD,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,0DAAA;AAAA,MACA,EAAA;AAAA,MACA,4EAAA;AAAA,MACA,wEAAA;AAAA,MACA,EAAA;AAAA,MACA,+FAAA;AAAA,MACA,sFAAA;AAAA,MACA,0IAAA;AAAA,MACA,4FAAA;AAAA,MACA,qFAAA;AAAA,MACA,qFAAA;AAAA,MACA,sDAAA;AAAA,MACA,EAAA;AAAA,MACA,kFAAA;AAAA,MACA,8FAAA;AAAA,MACA,gGAAA;AAAA,MACA,EAAA;AAAA,MACA;AAAA,KACF,CAAE,KAAK,IAAI,CAAA;AAEX,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,GAAA,CAAI,SAAS,MAAA,EAAQ;AAAA,MAC/C,SAAA,EAAW,GAAA;AAAA,MACX,WAAA,EAAa;AAAA,KACd,CAAA;AAED,IAAA,MAAM,OAAO,OAAO,QAAA,KAAa,QAAA,GAAW,QAAA,GAAW,UAAU,OAAA,IAAW,EAAA;AAE5E,IAAA,OAAO,CAAA,sBAAA,EAAyB,OAAO,MAAM,CAAA;;AAAA,EAA6B,IAAA,CAAK,MAAM,CAAA,CAAA;AAAA,EACvF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYQ,YAAA,CAAa,MAAA,EAAwB,cAAA,GAAiB,CAAA,EAAmB;AAC/E,IAAA,IAAI,MAAA,CAAO,UAAU,cAAA,EAAgB;AAAE,MAAA,OAAO,MAAA;AAAA,IAAQ;AAEtD,IAAA,MAAM,cAAA,GAAiB,OAAO,MAAA,GAAS,cAAA;AACvC,IAAA,OAAO,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAO,CAAA,KAAM;AAC9B,MAAA,IAAI,KAAK,cAAA,EAAgB;AAAE,QAAA,OAAO,KAAA;AAAA,MAAO;AAEzC,MAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,GAAA,KAAQ;AACxB,QAAA,IAAI,GAAA,CAAI,SAAS,MAAA,EAAQ;AAAE,UAAA,OAAO,GAAA;AAAA,QAAK;AAEvC,QAAA,MAAM,UAAU,OAAO,GAAA,CAAI,OAAA,KAAY,QAAA,GAAW,IAAI,OAAA,GAAU,EAAA;AAChE,QAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,CAAE,CAAC,CAAA,EAAG,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,IAAK,EAAA;AAC3D,QAAA,OAAO;AAAA,UACL,GAAG,GAAA;AAAA,UACH,OAAA,EAAS,2CAAsC,SAAS,CAAA,IAAA;AAAA,SAC1D;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAAA;AAAA,EAIQ,SAAS,GAAA,EAA6B;AAC5C,IAAA,IAAI,GAAA,CAAI,SAAS,MAAA,EAAQ;AAAE,MAAA,OAAO,GAAA;AAAA,IAAK;AAEvC,IAAA,MAAM,UAAU,OAAO,GAAA,CAAI,OAAA,KAAY,QAAA,GAAW,IAAI,OAAA,GAAU,EAAA;AAChE,IAAA,IAAI,OAAA,CAAQ,MAAA,IAAU,IAAA,CAAK,eAAA,EAAiB;AAAE,MAAA,OAAO,GAAA;AAAA,IAAK;AAE1D,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,KAAK,eAAe,CAAA;AACvD,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,MAAA,GAAS,IAAA,CAAK,eAAA;AACxC,IAAA,OAAO;AAAA,MACL,GAAG,GAAA;AAAA,MACH,OAAA,EAAS,GAAG,SAAS;;AAAA,YAAA,EAAmB,SAAS,CAAA,yDAAA,EAAuD,IAAA,CAAK,eAAe,CAAA,oHAAA;AAAA,KAC9H;AAAA,EACF;AACF;AAQA,SAAS,cAAc,IAAA,EAAqC;AAC1D,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,IAAI,IAAA,CAAK,CAAC,CAAA,EAAG,IAAA,KAAS,WAAA,EAAa;AAAE,MAAA,OAAO,CAAA;AAAA,IAAG;AAAA,EACjD;AACA,EAAA,OAAO,IAAA,CAAK,MAAA;AACd;AAMA,SAAS,gBAAgB,IAAA,EAA6C;AACpE,EAAA,MAAM,SAAyB,EAAC;AAChC,EAAA,IAAI,UAAwB,EAAC;AAE7B,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,IAAI,GAAA,CAAI,SAAS,WAAA,EAAa;AAC5B,MAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,QAAA,MAAA,CAAO,KAAK,OAAO,CAAA;AAAA,MACrB;AACA,MAAA,OAAA,GAAU,CAAC,GAAG,CAAA;AAAA,IAChB,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA,IAClB;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,IAAA,MAAA,CAAO,KAAK,OAAO,CAAA;AAAA,EACrB;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,gBAAA,CAAiB,OAAqB,MAAA,EAAwC;AACrF,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,MAAA,CAAO,MAAA,EAAQ;AAAE,IAAA,OAAO,IAAA;AAAA,EAAM;AACnD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,IAAI,MAAM,CAAC,CAAA,EAAG,YAAY,MAAA,CAAO,CAAC,GAAG,OAAA,EAAS;AAAE,MAAA,OAAO,IAAA;AAAA,IAAM;AAAA,EAC/D;AACA,EAAA,OAAO,KAAA;AACT;;;AC1RA,oBAAA,EAAA;;;ACHA,IAAM,iBAAA,uBAAwB,GAAA,CAAI,CAAC,eAAe,aAAA,EAAe,iBAAA,EAAmB,SAAS,CAAC,CAAA;AAavF,IAAM,yBAAN,MAA6B;AAAA,EACzB,IAAA,GAAO,eAAA;AAAA,EACP,KAAA,GAAQ,EAAA;AAAA,EACR,MAAA,GAAS,EAAE,UAAA,EAAY,WAAA,EAAsB,WAAW,GAAA,EAAK;AAAA,EAErD,SAAA;AAAA,EACT,KAAA,GAAQ,CAAA;AAAA,EACR,oBAAA,GAAuB,EAAA;AAAA,EACvB,eAAA,GAAkB,CAAA;AAAA,EAClB,aAAA;AAAA,EAER,WAAA,CAAY,SAAA,GAAmC,EAAC,EAAG;AACjD,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,EACnB;AAAA,EAEA,OAAA,GAAmB;AACjB,IAAA,OAAO,IAAA,CAAK,eAAe,YAAA,IAAgB,KAAA;AAAA,EAC7C;AAAA,EAEA,iBAAiB,KAAA,EAA2B;AAC1C,IAAA,IAAA,CAAK,aAAA,GAAgB,KAAA;AACrB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,IAAI,KAAA,GAA6B;AAC/B,IAAA,OAAO;AAAA,MACL,kBAAkB,IAAA,CAAK,KAAA;AAAA,MACvB,qBAAqB,IAAA,CAAK,oBAAA;AAAA,MAC1B,gBAAgB,IAAA,CAAK;AAAA,KACvB;AAAA,EACF;AAAA,EAEA,aAAA,CAAc,KAAkB,MAAA,EAA0B;AACxD,IAAA,IAAI,CAAC,iBAAA,CAAkB,GAAA,CAAI,GAAA,CAAI,QAAQ,CAAA,EAAG;AAAC,MAAA;AAAA,IAAO;AAElD,IAAA,MAAM,aAAa,MAAA,CAAO,MAAA,IAAU,OAAO,MAAA,CAAO,MAAA,GAAS,MAAM,MAAA,CAAO,OAAA;AAExE,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,IAAA,CAAK,KAAA,EAAA;AACL,MAAA,IAAA,CAAK,uBAAuB,GAAA,CAAI,SAAA;AAChC,MAAA,IAAA,CAAK,eAAA,GAAkB,CAAA;AACvB,MAAA,IAAA,CAAK,SAAA,CAAU,WAAA,GAAc,GAAA,CAAI,QAAA,EAAU,IAAI,SAAS,CAAA;AAAA,IAC1D,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,eAAA,EAAA;AACL,MAAA,IAAA,CAAK,SAAA,CAAU,gBAAA,GAAmB,IAAA,CAAK,eAAA,EAAiB,IAAI,SAAS,CAAA;AAAA,IACvE;AAEA,IAAA,GAAA,CAAI,IAAI,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,YAAA,EAAc,KAAK,KAAK,CAAA;AACnD,IAAA,GAAA,CAAI,IAAI,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,qBAAA,EAAuB,KAAK,oBAAoB,CAAA;AAAA,EAC7E;AAAA,EAEA,MAAA,GAAe;AACb,IAAA,IAAA,CAAK,KAAA,EAAM;AAAA,EACb;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,CAAA;AACb,IAAA,IAAA,CAAK,oBAAA,GAAuB,EAAA;AAC5B,IAAA,IAAA,CAAK,eAAA,GAAkB,CAAA;AAAA,EACzB;AACF;;;ACpEO,IAAM,qBAAN,MAAyB;AAAA,EACrB,IAAA,GAAO,WAAA;AAAA,EACP,KAAA,GAAQ,EAAA;AAAA,EACR,MAAA,GAAS,EAAE,UAAA,EAAY,WAAA,EAAsB,WAAW,GAAA,EAAK;AAAA,EAErD,SAAA;AAAA,EACT,UAAA,GAAa,KAAA;AAAA,EACb,aAAA;AAAA,EAER,WAAA,CAAY,SAAA,GAA+B,EAAC,EAAG;AAC7C,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,EACnB;AAAA,EAEA,OAAA,GAAmB;AACjB,IAAA,OAAO,IAAA,CAAK,eAAe,QAAA,IAAY,KAAA;AAAA,EACzC;AAAA,EAEA,iBAAiB,KAAA,EAA2B;AAC1C,IAAA,IAAA,CAAK,aAAA,GAAgB,KAAA;AACrB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,IAAI,SAAA,GAAqB;AACvB,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA,EAEA,gBAAgB,IAAA,EAAiC;AAC/C,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEA,cAAc,GAAA,EAAuC;AACnD,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,IAAc,GAAA,CAAI,GAAA,CAAI,aAAa,CAAA,EAAG;AAC9C,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,MAAA,IAAA,CAAK,SAAA,CAAU,OAAA,GAAU,GAAA,CAAI,GAAA,CAAI,SAAS,CAAA;AAE1C,MAAA,OAAO;AAAA,QACL,QAAA,EAAU;AAAA,UACR,GAAG,GAAA,CAAI,QAAA;AAAA,UACP;AAAA,YACE,IAAA,EAAM,QAAA;AAAA,YACN,OAAA,EACE;AAAA;AAEJ;AACF,OACF;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAA,CAAO,MAAkB,MAAA,EAAsB;AAC7C,IAAA,MAAM,UAAU,MAAA,KAAW,iBAAA;AAC3B,IAAA,IAAA,CAAK,SAAA,CAAU,aAAa,OAAO,CAAA;AAAA,EACrC;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAAA,EACpB;AACF;;;AC5DO,IAAM,uBAAN,MAA2B;AAAA,EACvB,IAAA,GAAO,YAAA;AAAA,EACP,KAAA,GAAQ,EAAA;AAAA,EACR,MAAA,GAAS,EAAE,UAAA,EAAY,WAAA,EAAsB,WAAW,GAAA,EAAK;AAAA,EAErD,SAAA;AAAA,EACT,yBAAA,GAA4B,CAAA;AAAA,EAC5B,2BAAA,GAA8B,CAAA;AAAA,EACrB,kBAAA;AAAA,EACT,aAAA;AAAA,EAER,WAAA,CAAY,SAAA,GAAiC,EAAC,EAAG,qBAAqB,CAAA,EAAG;AACvE,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,kBAAA,GAAqB,kBAAA;AAAA,EAC5B;AAAA,EAEA,OAAA,GAAmB;AACjB,IAAA,OAAO,IAAA,CAAK,eAAe,UAAA,IAAc,KAAA;AAAA,EAC3C;AAAA,EAEA,iBAAiB,KAAA,EAA2B;AAC1C,IAAA,IAAA,CAAK,aAAA,GAAgB,KAAA;AACrB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,aAAA,CAAc,KAAkB,MAAA,EAA0B;AACxD,IAAA,IAAA,CAAK,yBAAA,EAAA;AACL,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,MAAA,IAAA,CAAK,2BAAA,EAAA;AAAA,IACP;AAEA,IAAA,MAAM,aAAA,GACJ,KAAK,yBAAA,IAA6B,IAAA,CAAK,sBACtC,IAAA,CAAK,2BAAA,IAA+B,CAAA,IAAK,IAAA,CAAK,yBAAA,IAA6B,CAAA;AAE9E,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,2BAAA,IAA+B,CAAA,GAAI,mBAAA,GAAsB,UAAA;AAC9E,MAAA,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,YAAA,EAAc,UAAU,IAAI,CAAA;AAC7C,MAAA,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,YAAA,EAAc,WAAW,OAAO,CAAA;AACjD,MAAA,IAAA,CAAK,SAAA,CAAU,kBAAA,GAAqB,OAAA,EAAS,GAAA,CAAI,SAAS,CAAA;AAC1D,MAAA,IAAA,CAAK,yBAAA,GAA4B,CAAA;AACjC,MAAA,IAAA,CAAK,2BAAA,GAA8B,CAAA;AAAA,IACrC;AAAA,EACF;AAAA,EAEA,MAAA,GAAe;AACb,IAAA,IAAA,CAAK,KAAA,EAAM;AAAA,EACb;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,yBAAA,GAA4B,CAAA;AACjC,IAAA,IAAA,CAAK,2BAAA,GAA8B,CAAA;AAAA,EACrC;AACF;ACzCA,IAAM,kBAAA,GAA8B;AAAA,EAClC,IAAA,EAAM,eAAA;AAAA,EACN,WAAA,EAAa,kDAAA;AAAA,EACb,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,CAAC,QAAA,EAAU,WAAA,EAAa,UAAU,CAAA;AAAA,QACxC,WAAA,EAAa;AAAA,OACf;AAAA,MACA,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,OAAA,EAAS,CAAA;AAAA,QACT,OAAA,EAAS,CAAA;AAAA,QACT,WAAA,EAAa;AAAA;AACf,KACF;AAAA,IACA,QAAA,EAAU,CAAC,QAAA,EAAU,YAAY;AAAA;AAErC,CAAA;AAIA,IAAM,eAAA,GAAqB,iJAAA;AAC3B,IAAM,kBAAA,GAAqB,0HAAA;AAC3B,IAAM,iBAAA,GAAqB,sHAAA;AAE3B,SAAS,kBAAkB,IAAA,EAAkC;AAC3D,EAAA,MAAM,SAAA,GAAe,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA;AAC9C,EAAA,MAAM,YAAA,GAAe,kBAAA,CAAmB,IAAA,CAAK,IAAI,CAAA;AACjD,EAAA,MAAM,WAAA,GAAe,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA;AAEhD,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,UAAA;AAEJ,EAAA,IAAI,SAAA,IAAa,CAAC,YAAA,IAAgB,CAAC,WAAA,EAAa;AAC9C,IAAA,MAAA,GAAS,QAAA;AAAU,IAAA,UAAA,GAAa,GAAA;AAAA,EAClC,CAAA,MAAA,IAAW,WAAA,IAAe,CAAC,SAAA,EAAW;AACpC,IAAA,MAAA,GAAS,UAAA;AAAY,IAAA,UAAA,GAAa,GAAA;AAAA,EACpC,CAAA,MAAA,IAAW,YAAA,IAAgB,CAAC,SAAA,IAAa,CAAC,WAAA,EAAa;AACrD,IAAA,MAAA,GAAS,WAAA;AAAa,IAAA,UAAA,GAAa,GAAA;AAAA,EACrC,CAAA,MAAA,IAAW,SAAA,KAAc,YAAA,IAAgB,WAAA,CAAA,EAAc;AACrD,IAAA,MAAA,GAAS,QAAA;AAAU,IAAA,UAAA,GAAa,GAAA;AAAA,EAClC,CAAA,MAAO;AACL,IAAA,MAAA,GAAS,QAAA;AAAU,IAAA,UAAA,GAAa,GAAA;AAAA,EAClC;AAEA,EAAA,OAAO,EAAE,QAAQ,UAAA,EAAW;AAC9B;AAQO,IAAM,2BAAN,MAA+B;AAAA,EAC3B,IAAA,GAAO,iBAAA;AAAA,EACP,KAAA,GAAQ,CAAA;AAAA,EACR,MAAA,GAAS,EAAE,UAAA,EAAY,WAAA,EAAsB,WAAW,GAAA,EAAK;AAAA,EAErD,SAAA;AAAA,EACT,eAAA,GAA6C,IAAA;AAAA,EAC7C,aAAA;AAAA,EAER,WAAA,CAAY,SAAA,GAAqC,EAAC,EAAG;AACnD,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,EACnB;AAAA,EAEA,OAAA,GAAmB;AACjB,IAAA,OAAO,IAAA,CAAK,eAAe,cAAA,IAAkB,KAAA;AAAA,EAC/C;AAAA,EAEA,iBAAiB,KAAA,EAA2B;AAC1C,IAAA,IAAA,CAAK,aAAA,GAAgB,KAAA;AACrB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,IAAI,cAAA,GAA4C;AAC9C,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,EACd;AAAA,EAEA,MAAM,QAAQ,GAAA,EAAgC;AAC5C,IAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,QAAA,CAAS,IAAI,IAAI,CAAA;AACnD,IAAA,IAAA,CAAK,eAAA,GAAkB,cAAA;AACvB,IAAA,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,YAAA,EAAc,QAAA,EAAU,eAAe,MAAM,CAAA;AAC1D,IAAA,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,YAAA,EAAc,YAAA,EAAc,eAAe,UAAU,CAAA;AAClE,IAAA,IAAI,eAAe,KAAA,EAAO;AACxB,MAAA,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,YAAA,EAAc,OAAA,EAAS,eAAe,KAAK,CAAA;AAAA,IAC1D;AACA,IAAA,IAAA,CAAK,SAAA,CAAU,eAAe,cAAc,CAAA;AAAA,EAC9C;AAAA,EAEA,MAAc,SAAS,IAAA,EAA2C;AAEhE,IAAA,MAAM,GAAA,GAAMA,MAAAA,CAAO,EAAE,IAAA,EAAM,SAAS,CAAA;AACpC,IAAA,IAAI,KAAK,aAAA,EAAe;AACtB,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,aAAA;AAAA,UACzB;AAAA,YACE;AAAA,cACE,IAAA,EAAM,QAAA;AAAA,cACN,OAAA,EAAS;AAAA,aACX;AAAA,YACA,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,IAAA;AAAK,WAChC;AAAA,UACA;AAAA,YACE,KAAA,EAAO,CAAC,kBAAkB,CAAA;AAAA,YAC1B,UAAA,EAAY,EAAE,IAAA,EAAM,UAAA,EAAY,UAAU,EAAE,IAAA,EAAM,iBAAgB,EAAE;AAAA,YACpE,WAAA,EAAa,CAAA;AAAA,YACb,SAAA,EAAW;AAAA;AACb,SACF;AAEA,QAAA,MAAM,OAAO,QAAA,CAAS,SAAA,EAAW,KAAK,CAAA,EAAA,KAAM,EAAA,CAAG,SAAS,eAAe,CAAA;AACvE,QAAA,IAAI,MAAM,KAAA,EAAO;AACf,UAAA,MAAM,OAAO,IAAA,CAAK,KAAA;AAClB,UAAA,IAAI,IAAA,CAAK,WAAW,QAAA,IAAY,IAAA,CAAK,WAAW,WAAA,IAAe,IAAA,CAAK,WAAW,UAAA,EAAY;AACzF,YAAA,OAAO;AAAA,cACL,QAAQ,IAAA,CAAK,MAAA;AAAA,cACb,OAAO,IAAA,CAAK,KAAA;AAAA,cACZ,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAK,IAAA,CAAK,IAAI,CAAA,EAAK,IAAA,CAAK,UAAA,IAAc,GAAG,CAAC;AAAA,aACjE;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAGA,IAAA,OAAO,kBAAkB,IAAI,CAAA;AAAA,EAC/B;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,EACzB;AACF;;;AC9IA,UAAA,EAAA;ACkCA,IAAM,OAAA,GAA0C;AAAA,EAC9C;AAAA,IACE,EAAA,EAAI,YAAA;AAAA,IACJ,KAAA,EAAO,YAAA;AAAA,IACP,WAAA,EACE,kGAAA;AAAA,IACF,SAAA,EAAW,CAAC,MAAA,EAAQ,SAAS,CAAA;AAAA,IAC7B,YAAA,EAAc;AAAA,MACZ,YAAA,EAAc,IAAA;AAAA,MACd,cAAA,EAAgB;AAAA,KAClB;AAAA,IACA,kBAAA,EACE,2GAAA;AAAA,IACF,aAAA,EAAe,EAAA;AAAA,IACf,QAAA,EAAU,IAAA;AAAA,IACV,QAAA,EAAU;AAAA,GACZ;AAAA,EACA;AAAA,IACE,EAAA,EAAI,OAAA;AAAA,IACJ,KAAA,EAAO,OAAA;AAAA,IACP,WAAA,EACE,4FAAA;AAAA,IACF,SAAA,EAAW,CAAC,MAAA,EAAQ,OAAA,EAAS,SAAS,CAAA;AAAA,IACtC,YAAA,EAAc;AAAA,MACZ,QAAA,EAAU,IAAA;AAAA,MACV,UAAA,EAAY;AAAA,KACd;AAAA,IACA,kBAAA,EACE,+EAAA;AAAA,IACF,aAAA,EAAe,EAAA;AAAA,IACf,QAAA,EAAU,KAAA;AAAA,IACV,QAAA,EAAU;AAAA,GACZ;AAAA,EACA;AAAA,IACE,EAAA,EAAI,UAAA;AAAA,IACJ,KAAA,EAAO,UAAA;AAAA,IACP,WAAA,EACE,oEAAA;AAAA,IACF,SAAA,EAAW,CAAC,MAAM,CAAA;AAAA,IAClB,YAAA,EAAc;AAAA,MACZ,YAAA,EAAc,IAAA;AAAA,MACd,cAAA,EAAgB,IAAA;AAAA,MAChB,UAAA,EAAY;AAAA,KACd;AAAA,IACA,kBAAA,EACE,8GAAA;AAAA,IACF,aAAA,EAAe,EAAA;AAAA,IACf,QAAA,EAAU,IAAA;AAAA,IACV,QAAA,EAAU;AAAA,GACZ;AAAA,EACA;AAAA,IACE,EAAA,EAAI,cAAA;AAAA,IACJ,KAAA,EAAO,cAAA;AAAA,IACP,WAAA,EACE,mFAAA;AAAA,IACF,SAAA,EAAW,CAAC,MAAA,EAAQ,SAAS,CAAA;AAAA,IAC7B,YAAA,EAAc;AAAA,MACZ,cAAA,EAAgB,IAAA;AAAA,MAChB,cAAA,EAAgB;AAAA,KAClB;AAAA,IACA,kBAAA,EACE,qGAAA;AAAA,IACF,aAAA,EAAe,EAAA;AAAA,IACf,QAAA,EAAU,IAAA;AAAA,IACV,QAAA,EAAU;AAAA;AAEd,CAAA;AAMO,IAAM,gBAAN,MAAoB;AAAA,EACR,WAAA,uBAAkB,GAAA,EAAiC;AAAA,EAEpE,WAAA,GAAc;AAEZ,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,MAAA,CAAO,EAAA,EAAI,MAAM,CAAA;AAAA,IACxC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,UAAA,EAAuC;AAC9C,IAAA,IAAI,CAAC,UAAA,CAAW,EAAA,CAAG,IAAA,EAAK,EAAG;AACzB,MAAA,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAAA,IAC5D;AACA,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,UAAA,CAAW,EAAA,EAAI,UAAU,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,EAAA,EAA6C;AAC/C,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,EAAA,EAAiC;AAC1C,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA;AACnC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,YAAA,EAAe,EAAE,CAAA,oCAAA,EAAuC,IAAA,CAAK,SAAQ,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,OACnF;AAAA,IACF;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAoB;AAClB,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,GAA8B;AAC5B,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAoB,EAAA,EAA0B;AAC5C,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AACvB,IAAA,OAAO;AAAA,MACL,GAAG,qBAAA;AAAA,MACH,GAAI,GAAA,EAAK,YAAA,IAAgB;AAAC,KAC5B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,EAAA,EAAqB;AACvB,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA;AAAA,EAChC;AACF;AAKO,IAAM,mBAAA,GAAsB,IAAI,aAAA;;;AC1IvC,IAAM,cAAA,GAAyC;AAAA,EAC7C,aAAA,EAAe,CAAA;AAAA,EACf,YAAA,EAAc,EAAA;AAAA,EACd,QAAA,EAAU,CAAA;AAAA,EACV,aAAA,EAAe,IAAA;AAAA,EACf,cAAA,EAAgB,OAAA;AAAA,EAChB,iBAAA,EAAmB;AACrB,CAAA;AAgBO,IAAM,mBAAN,MAAuB;AAAA,EACX,MAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA;AAAA,EAGT,OAAA,GAAU,CAAA;AAAA;AAAA,EAED,QAA2B,EAAC;AAAA;AAAA,EAE5B,SAAA,uBAAgB,GAAA,EAAqC;AAAA,EAEtE,WAAA,CACE,MAAA,EACA,YAAA,EACA,MAAA,GAA0C,EAAC,EAC3C;AACA,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,YAAA,GAAe,YAAA;AACpB,IAAA,IAAA,CAAK,MAAA,GAAS,EAAE,GAAG,cAAA,EAAgB,GAAG,MAAA,EAAO;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,UAAA,CAAW,QAAA,EAA6B,KAAA,GAAQ,CAAA,EAA8B;AAClF,IAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,QAAA,EAAU;AAChC,MAAA,OAAO,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QAC1B,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,SAAA,EAAW,EAAE,SAAA,IAAa,YAAA;AAAA,QAC1B,OAAA,EAAS,KAAA;AAAA,QACT,MAAA,EAAQ,EAAA;AAAA,QACR,UAAA,EAAY,CAAA;AAAA,QACZ,UAAA,EAAY,CAAA;AAAA,QACZ,OAAO,CAAA,UAAA,EAAa,IAAA,CAAK,MAAA,CAAO,QAAQ,uBAAuB,KAAK,CAAA;AAAA,OACtE,CAAE,CAAA;AAAA,IACJ;AAEA,IAAA,IAAI,IAAA,CAAK,aAAa,OAAA,EAAS;AAC7B,MAAA,OAAO,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QAC1B,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,SAAA,EAAW,EAAE,SAAA,IAAa,YAAA;AAAA,QAC1B,OAAA,EAAS,KAAA;AAAA,QACT,MAAA,EAAQ,EAAA;AAAA,QACR,UAAA,EAAY,CAAA;AAAA,QACZ,UAAA,EAAY,CAAA;AAAA,QACZ,KAAA,EAAO;AAAA,OACT,CAAE,CAAA;AAAA,IACJ;AAEA,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,eAAA,CAAgB,QAAQ,CAAA;AAElD,IAAA,MAAMC,YAAW,QAAA,CAAS,GAAA;AAAA,MAAI,CAAC,KAAK,CAAA,KAClC,IAAA,CAAK,OAAO,GAAA,EAAK,YAAA,CAAa,CAAC,CAAA,EAAI,KAAK;AAAA,KAC1C;AAEA,IAAA,OAAO,IAAA,CAAK,eAAA,CAAgBA,SAAAA,EAAU,IAAA,CAAK,OAAO,aAAa,CAAA;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,MAAA,CAAO,GAAA,EAAsB,WAAA,EAAqB,QAAQ,CAAA,EAA4B;AAC1F,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,SAAA,IAAa,GAAA,CAAI,IAAA;AAGjC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AACvC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,OAAO,QAAA,CAAS,KAAK,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAG,OAAA,EAAS,IAAA,EAAK,CAAE,CAAA;AAAA,IACvD;AAGA,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,IAAU,IAAA,CAAK,OAAO,YAAA,EAAc;AACjD,MAAA,OAAO;AAAA,QACL,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,SAAA,EAAW,IAAI,SAAA,IAAa,YAAA;AAAA,QAC5B,OAAA,EAAS,KAAA;AAAA,QACT,MAAA,EAAQ,EAAA;AAAA,QACR,UAAA,EAAY,CAAA;AAAA,QACZ,UAAA,EAAY,CAAA;AAAA,QACZ,KAAA,EAAO,CAAA,mCAAA,EAAsC,IAAA,CAAK,MAAA,CAAO,YAAY,CAAA,CAAA;AAAA,OACvE;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,aAAa,KAAK,CAAA;AACpD,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA;AAG/B,IAAA,OAAA,CAAQ,QAAQ,MAAM;AACpB,MAAA,IAAA,CAAK,SAAA,CAAU,OAAO,GAAG,CAAA;AAAA,IAC3B,CAAC,CAAA;AAED,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA,EAIQ,OAAA,CAAQ,GAAA,EAAsB,WAAA,EAAqB,KAAA,EAAwC;AACjG,IAAA,OAAO,IAAI,OAAA,CAAQ,CAACC,QAAAA,KAAY;AAC9B,MAAA,MAAM,UAAU,MAAM;AACpB,QAAA,IAAI,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,aAAA,EAAe;AAC5C,UAAA,IAAA,CAAK,OAAA,EAAA;AACL,UAAA,IAAA,CAAK,MAAA,CAAO,KAAK,WAAA,EAAa,KAAK,EAChC,IAAA,CAAKA,QAAO,CAAA,CACZ,OAAA,CAAQ,MAAM;AACb,YAAA,IAAA,CAAK,OAAA,EAAA;AACL,YAAA,IAAA,CAAK,UAAA,EAAW;AAAA,UAClB,CAAC,CAAA;AAAA,QACL,CAAA,MAAO;AAEL,UAAA,IAAA,CAAK,KAAA,CAAM,KAAK,OAAO,CAAA;AAAA,QACzB;AAAA,MACF,CAAA;AACA,MAAA,OAAA,EAAQ;AAAA,IACV,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,UAAA,GAAmB;AACzB,IAAA,OAAO,IAAA,CAAK,MAAM,MAAA,GAAS,CAAA,IAAK,KAAK,OAAA,GAAU,IAAA,CAAK,OAAO,aAAA,EAAe;AACxE,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,KAAA,EAAM;AAC9B,MAAA,IAAA,EAAK;AAAA,IACP;AAAA,EACF;AAAA,EAEA,MAAc,MAAA,CACZ,GAAA,EACA,WAAA,EACA,KAAA,EACyB;AACzB,IAAA,IAAI,IAAA,CAAK,aAAa,OAAA,EAAS;AAC7B,MAAA,OAAO;AAAA,QACL,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,SAAA,EAAW,IAAI,SAAA,IAAa,YAAA;AAAA,QAC5B,OAAA,EAAS,KAAA;AAAA,QACT,MAAA,EAAQ,EAAA;AAAA,QACR,UAAA,EAAY,CAAA;AAAA,QACZ,UAAA,EAAY,CAAA;AAAA,QACZ,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAGA,IAAA,MAAM,eAAA,GAAkB,IAAI,eAAA,EAAgB;AAC5C,IAAA,MAAM,aAAA,GAAgB,MAAM,eAAA,CAAgB,KAAA,EAAM;AAClD,IAAA,IAAA,CAAK,aAAa,gBAAA,CAAiB,OAAA,EAAS,eAAe,EAAE,IAAA,EAAM,MAAM,CAAA;AAEzE,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,MAAA,CAAO,GAAA,EAAK,WAAA,EAAa,gBAAgB,MAAM,CAAA;AAAA,IACnE,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,SAAA,EAAW,IAAI,SAAA,IAAa,YAAA;AAAA,QAC5B,OAAA,EAAS,KAAA;AAAA,QACT,MAAA,EAAQ,EAAA;AAAA,QACR,UAAA,EAAY,CAAA;AAAA,QACZ,UAAA,EAAY,CAAA;AAAA,QACZ,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,OAC9D;AAAA,IACF,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,YAAA,CAAa,mBAAA,CAAoB,OAAA,EAAS,aAAa,CAAA;AAAA,IAC9D;AAAA,EACF;AAAA,EAEQ,gBAAgB,QAAA,EAAuC;AAC7D,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,CAAO,iBAAA;AAC1B,IAAA,IAAI,KAAA,KAAU,CAAA,IAAK,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AACxC,MAAA,OAAO,QAAA,CAAS,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,IAC7B;AAEA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,cAAA,KAAmB,OAAA,EAAS;AAC1C,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,SAAS,MAAM,CAAA;AAChD,MAAA,OAAO,QAAA,CAAS,GAAA,CAAI,MAAM,KAAK,CAAA;AAAA,IACjC;AAGA,IAAA,MAAM,UAAU,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,CAAC,CAAA;AACjD,IAAA,MAAM,WAAA,GAAc,QAAQ,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AACrD,IAAA,OAAO,OAAA,CAAQ,IAAI,CAAC,CAAA,KAAM,KAAK,KAAA,CAAO,CAAA,GAAI,WAAA,GAAe,KAAK,CAAC,CAAA;AAAA,EACjE;AAAA,EAEA,MAAc,eAAA,CACZD,SAAAA,EACA,SAAA,EAC2B;AAC3B,IAAA,IAAIA,SAAAA,CAAS,WAAW,CAAA,EAAG;AAAC,MAAA,OAAO,EAAC;AAAA,IAAE;AAEtC,IAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AACjC,IAAA,MAAM,OAAA,GAA4B,IAAI,KAAA,CAAMA,SAAAA,CAAS,MAAM,CAAA;AAG3D,IAAA,MAAM,KAAA,GAAQA,SAAAA,CAAS,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM;AACnC,MAAA,MAAM,KAAA,GAAQ,IAAI,OAAA,CAAwB,CAACC,QAAAA,KAAY;AACrD,QAAA,UAAA,CAAW,MAAM;AACf,UAAA,QAAA,CAAS,IAAI,CAAC,CAAA;AACd,UAAAA,QAAAA,CAAQ;AAAA,YACN,IAAA,EAAM,EAAA;AAAA,YACN,SAAA,EAAW,EAAA;AAAA,YACX,OAAA,EAAS,KAAA;AAAA,YACT,MAAA,EAAQ,EAAA;AAAA,YACR,UAAA,EAAY,CAAA;AAAA,YACZ,UAAA,EAAY,CAAA;AAAA,YACZ,QAAA,EAAU,IAAA;AAAA,YACV,KAAA,EAAO,mBAAmB,SAAS,CAAA,EAAA;AAAA,WACpC,CAAA;AAAA,QACH,GAAG,SAAS,CAAA;AAAA,MACd,CAAC,CAAA;AACD,MAAA,OAAO,OAAA,CAAQ,KAAK,CAAC,CAAA,EAAG,KAAK,CAAC,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM;AAC1C,QAAA,OAAA,CAAQ,CAAC,CAAA,GAAI,CAAA;AAAA,MACf,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAED,IAAA,MAAM,OAAA,CAAQ,IAAI,KAAK,CAAA;AACvB,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA,EAGA,KAAA,GAA8D;AAC5D,IAAA,OAAO;AAAA,MACL,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,MAAA,EAAQ,KAAK,KAAA,CAAM,MAAA;AAAA,MACnB,OAAA,EAAS,KAAK,SAAA,CAAU;AAAA,KAC1B;AAAA,EACF;AACF;;;ACrQA,IAAMC,eAAAA,GAAqC;AAAA,EACzC,QAAA,EAAU,YAAA;AAAA,EACV,UAAU,EAAC;AAAA,EACX,KAAA,EAAO;AACT,CAAA;AAMO,IAAM,uBAAN,MAA2B;AAAA,EACf,MAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EAEjB,WAAA,CACE,MAAA,EACA,YAAA,EACA,MAAA,GAAsC,EAAC,EACvC;AACA,IAAA,IAAA,CAAK,MAAA,GAAS,EAAE,GAAGA,eAAAA,EAAgB,GAAG,MAAA,EAAO;AAC7C,IAAA,IAAA,CAAK,QAAA,GAAW,OAAO,QAAA,IAAY,mBAAA;AACnC,IAAA,IAAA,CAAK,WAAW,IAAI,gBAAA,CAAiB,QAAQ,YAAA,EAAc,IAAA,CAAK,OAAO,QAAQ,CAAA;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,GAAA,EAAqD;AAClE,IAAA,MAAM,MAAA,GAA0B;AAAA,MAC9B,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,SAAA,EAAW,YAAA;AAAA;AAAA,MACX,eAAe,GAAA,CAAI,aAAA;AAAA,MACnB,YAAY,GAAA,CAAI;AAAA,KAClB;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,QAAA,CAAS,OAAO,MAAA,EAAQ,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AACtE,IAAA,OAAO,IAAA,CAAK,eAAe,MAAM,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAA,CACJ,QAAA,EACA,QAAA,EAC2B;AAC3B,IAAA,MAAM,KAAA,GAAQ,QAAA,IAAY,IAAA,CAAK,MAAA,CAAO,QAAA;AAEtC,IAAA,IAAI,UAAU,UAAA,EAAY;AACxB,MAAA,OAAO,KAAK,QAAA,CAAS,UAAA,CAAW,QAAA,EAAU,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,IAC7D;AAGA,IAAA,MAAM,UAA4B,EAAC;AACnC,IAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,QAAA,CAAS,OAAO,GAAA,EAAK,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AACnE,MAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAEnB,MAAA,IAAI,MAAA,CAAO,KAAA,EAAO,QAAA,CAAS,SAAS,CAAA,EAAG;AAAC,QAAA;AAAA,MAAM;AAAA,IAChD;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAiB,SAAA,EAAmB;AAClC,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAQ;AACN,IAAA,OAAO,IAAA,CAAK,SAAS,KAAA,EAAM;AAAA,EAC7B;AAAA;AAAA,EAIQ,eAAe,CAAA,EAAsC;AAC3D,IAAA,OAAO;AAAA,MACL,SAAS,CAAA,CAAE,OAAA;AAAA,MACX,QAAQ,CAAA,CAAE,KAAA,GAAQ,UAAU,CAAA,CAAE,KAAK,KAAK,CAAA,CAAE,MAAA;AAAA,MAC1C,YAAY,CAAA,CAAE,UAAA;AAAA,MACd,YAAY,CAAA,CAAE;AAAA,KAChB;AAAA,EACF;AACF;;;ACjJA,IAAM,uBAAA,GAA0B,IAAA;AAChC,IAAM,kBAAA,GAAqB,GAAA;AAEpB,SAAS,yBAAA,GAA0C;AACxD,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,uBAAA;AAAA,IACJ,SAAS,KAAA,EAAwE;AAC/E,MAAA,MAAM,EAAE,GAAA,EAAK,QAAA,EAAS,GAAI,KAAA;AAE1B,MAAA,MAAM,gBAAgB,QAAA,CAAS,aAAA,GAAgB,IAC3C,QAAA,CAAS,SAAA,GAAY,SAAS,aAAA,GAC9B,CAAA;AACJ,MAAA,MAAM,YAAA,GAAepC,QAAAA;AAAA,QAAA,CAClB,QAAA,CAAS,iBAAiB,CAAA,GAAI,GAAA,GAAM,SAAS,aAAA,GAAgB,CAAA,GAAI,OAAO,CAAA,KACtE,QAAA,CAAS,iBAAiB,CAAA,GAAI,IAAA,GAAO,MACrC,QAAA,CAAS,kBAAA,GAAqB,KAAK,QAAA,CAAS,iBAAA,GAAoB,IAAI,GAAA,GAAM,CAAA;AAAA,OAC/E;AACA,MAAA,MAAM,gBAAA,GAAmBA,QAAAA,CAAQ,QAAA,CAAS,aAAA,GAAgB,CAAC,CAAA;AAC3D,MAAA,MAAM,cAAA,GAAiBA,QAAAA;AAAA,QACpB,gBAAA,GAAmB,GAAA,GACjB,aAAA,GAAgB,GAAA,IAChB,QAAA,CAAS,WAAA,GAAc,GAAA,GAAM,CAAA,CAAA,IAC7B,QAAA,CAAS,sBAAA,GAAyB,CAAA,GAAI,GAAA,GAAM,CAAA;AAAA,OACjD;AACA,MAAA,MAAM,gBAAA,GAAmB,SAAS,sBAAA,GAAyB,CAAA;AAC3D,MAAA,MAAM,sBAAA,GAAyB,GAAA,CAAI,IAAA,CAAK,GAAA,CAAY,cAAc,oBAAoB,CAAA;AAEtF,MAAA,IAAI,cAAA,GAAkD,UAAA;AACtD,MAAA,IAAI,SAAA,GAAY,qDAAA;AAEhB,MAAA,IAAI,CAAC,QAAA,CAAS,WAAA,IAAe,gBAAA,IAAoB,iBAAiB,uBAAA,EAAyB;AACzF,QAAA,cAAA,GAAiB,QAAA;AACjB,QAAA,SAAA,GAAY,gGAAA;AAAA,MACd;AAEA,MAAA,IACE,CAAC,SAAS,WAAA,IACP,cAAA,IAAkB,4BAEnB,gBAAA,IACG,YAAA,IAAgB,kBAAA,IAChB,sBAAA,KAA2B,QAAA,CAAA,EAEhC;AACA,QAAA,cAAA,GAAiB,YAAA;AACjB,QAAA,SAAA,GAAY,4FAAA;AAAA,MACd;AAEA,MAAA,OAAO;AAAA,QACL,YAAA;AAAA,QACA,cAAA;AAAA,QACA,gBAAA;AAAA,QACA,cAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,GACF;AACF;AAEA,SAASA,SAAQ,KAAA,EAAuB;AACtC,EAAA,IAAI,SAAS,CAAA,EAAG;AACd,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,IAAI,SAAS,CAAA,EAAG;AACd,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,GAAG,CAAA,GAAI,GAAA;AACnC;;;ACdA,iBAAA,EAAA;;;AC1CO,IAAM,eAAN,MAA4C;AAAA,EAChC,SAAA,uBAAgB,GAAA,EAAmC;AAAA,EAEpE,IAAA,CAAkC,OAAU,IAAA,EAA4B;AACtE,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAe,CAAA;AACnD,IAAA,IAAI,CAAC,QAAA,EAAU;AAAC,MAAA;AAAA,IAAO;AACvB,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,IAAI;AACF,QAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,MACd,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAAA,EAEA,EAAA,CACE,OACA,OAAA,EACa;AACb,IAAA,IAAI,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAe,CAAA;AAC5C,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,GAAA,uBAAU,GAAA,EAAI;AACd,MAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAA,EAAiB,GAAG,CAAA;AAAA,IACzC;AACA,IAAA,GAAA,CAAI,IAAI,OAA2B,CAAA;AACnC,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAe,CAAA,EAAG,OAAO,OAA2B,CAAA;AAAA,IACzE,CAAA;AAAA,EACF;AAAA,EAEA,OAAA,CACE,OACA,OAAA,EACa;AAEb,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,KAAA,EAAO,CAAC,IAAA,KAAS;AAC9B,MAAA,OAAA,CAAQ,IAAI,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AAAA,IAC9B,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,KAAA,GAAuB;AAAA,EAE7B;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AAAA,EACvB;AACF,CAAA;AAEO,SAAS,cAAA,GAAgC;AAC9C,EAAA,OAAO,IAAI,YAAA,EAAa;AAC1B;;;AC7CO,IAAM,kBAAN,MAA6C;AAAA,EACjC,KAAA,uBAAY,GAAA,EAAkC;AAAA,EAE/D,GAAA,CAAO,WAAmB,GAAA,EAA4B;AACpD,IAAA,OAAO,KAAK,KAAA,CAAM,GAAA,CAAI,SAAS,CAAA,EAAG,IAAI,GAAG,CAAA;AAAA,EAC3C;AAAA,EAEA,GAAA,CAAO,SAAA,EAAmB,GAAA,EAAa,KAAA,EAAgB;AACrD,IAAA,IAAI,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,SAAS,CAAA;AACjC,IAAA,IAAI,CAAC,EAAA,EAAI;AACP,MAAA,EAAA,uBAAS,GAAA,EAAI;AACb,MAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,SAAA,EAAW,EAAE,CAAA;AAAA,IAC9B;AACA,IAAA,EAAA,CAAG,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,EACnB;AAAA,EAEA,aAAa,SAAA,EAA4C;AACvD,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,SAAS,CAAA;AACnC,IAAA,IAAI,CAAC,EAAA,EAAI;AAAC,MAAA,OAAO,EAAC;AAAA,IAAE;AACpB,IAAA,OAAO,MAAA,CAAO,WAAA,CAAY,EAAA,CAAG,OAAA,EAAS,CAAA;AAAA,EACxC;AACF;AAMA,IAAM,iBAAN,MAA2C;AAAA,EACzC,IAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA,GAAoB,CAAA;AAAA,EACpB,aAAA;AAAA,EACA,OAAA,GAAmB,KAAA;AAAA,EACnB,WAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA;AAAA,EAGS,YAA0B,EAAC;AAAA,EAEpC,IAAI,QAAA,GAAsC;AACxC,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA,EAEA,WAAA,CACE,IAAA,EACA,IAAA,EACA,KAAA,EACA,aAAA,EACA,aACA,SAAA,EACA,SAAA,EACA,IAAA,EACA,QAAA,EACA,KAAA,EACA;AACA,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AACrB,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AACnB,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AACF,CAAA;AAkBO,SAAS,iBAAiB,OAAA,EAG/B;AACA,EAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,eAAA,EAAiB,WAAU,GAAI,OAAA;AAE5D,EAAA,MAAM,IAAA,GAAO,IAAI,eAAA,EAAgB;AACjC,EAAA,MAAM,UAAA,GAAa,aAAaqC,UAAAA,EAAW;AAC3C,EAAA,MAAM,WAAW,cAAA,EAAe;AAEhC,EAAA,MAAM,OAAO,IAAI,cAAA;AAAA;AAAA,IACI,EAAA;AAAA;AAAA;AAAA,IACA,IAAA;AAAA;AAAA,IACA,KAAA;AAAA;AAAA,IACA,MAAA,CAAO,aAAA;AAAA;AAAA,IACP,eAAA,CAAgB,MAAA;AAAA;AAAA,IAChB,UAAA;AAAA;AAAA,IACA,MAAA,CAAO,SAAA;AAAA;AAAA,IACP,IAAA;AAAA;AAAA,IACA,QAAA;AAAA;AAAA,IACC,OAA+B,KAAA,IAAS;AAAA,GAC9D;AAGA,EAAA,eAAA,CAAgB,MAAA,CAAO,gBAAA,CAAiB,OAAA,EAAS,MAAM;AACrD,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,EACjB,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,IAAA;AAAA,IACL,UAAU,IAAA,CAAK;AAAA,GACjB;AACF;;;AC9HO,IAAM,eAAN,MAAmB;AAAA,EACxB,YACmB,WAAA,EACA,MAAA,EACA,UAAA,EACA,WAAA,GAA8C,EAAC,EAChE;AAJiB,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AAAA,EAChB;AAAA,EAEH,cAAA,GAA8B;AAC5B,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA,EAEA,MAAM,OAAA,CAAQ,KAAA,EAAwB,GAAA,EAAwC;AAC5E,IAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,aAAA,CAAc,IAAA,EAAM,GAAG,CAAC,CAAC,CAAA;AAAA,EACvE;AAAA,EAEA,MAAc,aAAA,CAAc,IAAA,EAAqB,GAAA,EAAsC;AACrF,IAAA,IAAI,QAAQ,IAAA,CAAK,KAAA;AAGjB,IAAA,MAAM,GAAA,GAAmB;AAAA,MACvB,GAAA;AAAA,MACA,UAAU,IAAA,CAAK,IAAA;AAAA,MACf,KAAA;AAAA,MACA,WAAW,GAAA,CAAI,SAAA;AAAA,MACf,aAAa,GAAA,CAAI,WAAA;AAAA,MACjB,WAAW,GAAA,CAAI;AAAA,KACjB;AAEA,IAAA,KAAA,MAAW,UAAA,IAAc,KAAK,WAAA,EAAa;AACzC,MAAA,IAAI;AACF,QAAA,KAAA,GAAQ,MAAM,UAAA,CAAW,SAAA,CAAU,IAAA,CAAK,IAAA,EAAM,OAAO,GAAG,CAAA;AAExD,QAAC,IAA2C,KAAA,GAAQ,KAAA;AAAA,MACtD,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,MAAA,EAAQ;AAC/B,MAAA,IAAI,CAAC,MAAM,aAAA,EAAe;AAAC,QAAA;AAAA,MAAS;AACpC,MAAA,MAAM,SAAS,MAAM,KAAA,CAAM,cAAc,IAAA,CAAK,IAAA,EAAM,OAAO,GAAG,CAAA;AAC9D,MAAA,IAAI,CAAC,MAAA,CAAO,EAAA,IAAM,MAAA,CAAO,WAAW,QAAA,EAAU;AAC5C,QAAA,OAAO;AAAA,UACL,YAAY,IAAA,CAAK,EAAA;AAAA,UACjB,QAAQ,CAAA,OAAA,EAAU,KAAA,CAAM,IAAI,CAAA,kBAAA,EAAqB,OAAO,MAAM,CAAA,CAAA;AAAA,UAC9D,OAAA,EAAS,KAAA;AAAA,UACT,OAAO,MAAA,CAAO;AAAA,SAChB;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI,QAAA;AAEJ,IAAA,IAAI;AACF,MAAA,MAAM,aAAa,MAAM,IAAA,CAAK,YAAY,OAAA,CAAQ,IAAA,CAAK,MAAM,KAAK,CAAA;AAClE,MAAA,OAAA,GAAU,UAAA,CAAW,OAAA;AACrB,MAAA,SAAA,GAAY,UAAA,CAAW,MAAA,IAAU,UAAA,CAAW,KAAA,IAAS,EAAA;AACrD,MAAA,KAAA,GAAQ,UAAA,CAAW,KAAA;AACnB,MAAA,QAAA,GAAW,UAAA,CAAW,QAAA;AAAA,IACxB,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,MAAA,OAAO;AAAA,QACL,YAAY,IAAA,CAAK,EAAA;AAAA,QACjB,MAAA,EAAQ,yBAAyB,GAAG,CAAA,CAAA;AAAA,QACpC,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,MAAA,EAAQ;AAC/B,MAAA,IAAI,CAAC,MAAM,cAAA,EAAgB;AAAC,QAAA;AAAA,MAAS;AACrC,MAAA,MAAM,SAAS,MAAM,KAAA,CAAM,eAAe,IAAA,CAAK,IAAA,EAAM,WAAW,GAAG,CAAA;AACnE,MAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,QAAA,IAAI,MAAA,CAAO,WAAW,UAAA,EAAY;AAChC,UAAA,SAAA,GAAY,MAAA,CAAO,SAAA;AAAA,QACrB,CAAA,MAAA,IAAW,MAAA,CAAO,MAAA,KAAW,QAAA,EAAU;AACrC,UAAA,OAAO;AAAA,YACL,YAAY,IAAA,CAAK,EAAA;AAAA,YACjB,QAAQ,CAAA,OAAA,EAAU,KAAA,CAAM,IAAI,CAAA,mBAAA,EAAsB,OAAO,MAAM,CAAA,CAAA;AAAA,YAC/D,OAAA,EAAS,KAAA;AAAA,YACT,OAAO,MAAA,CAAO;AAAA,WAChB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,SAAA,IAAa,KAAK,UAAA,EAAY;AACvC,MAAA,SAAA,GAAY,MAAM,SAAA,CAAU,OAAA,CAAQ,SAAA,EAAW,GAAG,CAAA;AAAA,IACpD;AAEA,IAAA,OAAO;AAAA,MACL,YAAY,IAAA,CAAK,EAAA;AAAA,MACjB,MAAA,EAAQ,SAAA;AAAA,MACR,OAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;AC5FO,IAAM,eAAA,GAAN,MAAM,gBAAA,CAAuC;AAAA,EAGlD,YACE,GAAA,EACiB,QAAA,EACA,KACA,QAAA,EACA,QAAA,EACA,kBACA,YAAA,EACjB;AANiB,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,gBAAA,GAAA,gBAAA;AACA,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AAEjB,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AAAA,EACb;AAAA,EAZS,GAAA;AAAA;AAAA,EAgBT,cAAc,OAAA,EAA2B;AACvC,IAAA,IAAA,CAAK,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,EAC5B;AAAA,EAEA,MAAM,eAAA,GAA0C;AAC9C,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,eAAA,CAAgB,IAAA,CAAK,GAAG,CAAA;AAAA,EAC/C;AAAA,EAEA,MAAM,cAAA,GAAgC;AACpC,IAAA,MAAM,IAAA,CAAK,QAAA,CAAS,cAAA,CAAe,IAAA,CAAK,GAAG,CAAA;AAAA,EAC7C;AAAA,EAEA,MAAM,OAAA,GAAkC;AACtC,IAAA,MAAM,MAAA,GAAiB;AAAA,MACrB,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAA,EAAU,CAAC,GAAG,IAAA,CAAK,QAAQ,CAAA;AAAA,MAC3B,KAAA,EAAO,KAAK,GAAA,CAAI;AAAA,KAClB;AAGA,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,QAAA,CAAS,cAAc,MAAM,CAAA;AAEtD,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,QAAA,IAAY,MAAA,CAAO,QAAA;AAC1C,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,IAAS,MAAA,CAAO,KAAA;AACpC,IAAA,MAAM,cAAc,KAAA,CAAM,WAAA;AAC1B,IAAA,MAAM,aAAa,KAAA,CAAM,UAAA;AAGzB,IAAA,IAAI,WAAA;AACJ,IAAA,IAAI;AACF,MAAA,WAAA,GAAc,MAAM,IAAA,CAAK,GAAA,CAAI,aAAA,CAAe,QAAA,EAAU;AAAA,QACpD,KAAA;AAAA,QACA,GAAI,WAAA,KAAgB,KAAA,CAAA,GAAY,EAAE,WAAA,KAAgB,EAAC;AAAA,QACnD,GAAI,UAAA,KAAe,KAAA,CAAA,GAAY,EAAE,UAAA,KAAe;AAAC,OAClD,CAAA;AAAA,IACH,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,GAAA;AAAA,IACR;AAGA,IAAA,MAAM,MAAA,GAAwB;AAAA,MAC5B,SAAS,WAAA,CAAY,OAAA;AAAA,MACrB,YAAY,WAAA,CAAY,SAAA,IAAa,EAAC,EAAG,GAAA,CAAI,CAAC,EAAA,MAAQ;AAAA,QACpD,IAAI,EAAA,CAAG,EAAA;AAAA,QACP,MAAM,EAAA,CAAG,IAAA;AAAA,QACT,OAAO,EAAA,CAAG;AAAA,OACZ,CAAE,CAAA;AAAA,MACF,KAAA,EAAO,YAAY,KAAA,GACf;AAAA,QACE,YAAA,EAAc,YAAY,KAAA,CAAM,YAAA;AAAA,QAChC,gBAAA,EAAkB,YAAY,KAAA,CAAM;AAAA,OACtC,GACA,MAAA;AAAA;AAAA,MAEJ,UAAA,EACG,WAAA,CAAwC,UAAA,IACxC,WAAA,CAAY,OAAO,aAAA,EAAuD;AAAA,KAC/E;AAGA,IAAA,IAAI,OAAO,KAAA,EAAO;AAChB,MAAA,IAAA,CAAK,iBAAiB,MAAA,CAAO,KAAA,CAAM,YAAA,GAAe,MAAA,CAAO,MAAM,gBAAgB,CAAA;AAAA,IACjF;AAGA,IAAA,MAAM,gBAAA,GAA+B;AAAA,MACnC,IAAA,EAAM,WAAA;AAAA,MACN,SAAS,WAAA,CAAY,OAAA;AAAA,MACrB,WAAW,WAAA,CAAY;AAAA,KACzB;AACA,IAAA,IAAA,CAAK,QAAA,CAAS,KAAK,gBAAgB,CAAA;AAGnC,IAAA,MAAM,IAAA,CAAK,QAAA,CAAS,YAAA,CAAa,MAAA,EAAQ,MAAM,CAAA;AAE/C,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,aAAa,KAAA,EAA+C;AAKhE,IAAA,MAAM,kBAAmC,EAAC;AAC1C,IAAA,MAAM,kBAAmC,EAAC;AAE1C,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,WAAW,IAAA,CAAK,QAAA,CAAS,gBAAe,CAAE,OAAA,CAAQ,KAAK,IAAI,CAAA;AACjE,MAAA,IAAI,QAAA,EAAU,eAAA,IAAmB,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACjD,QAAA,eAAA,CAAgB,KAAK,IAAI,CAAA;AAAA,MAC3B,CAAA,MAAO;AACL,QAAA,eAAA,CAAgB,KAAK,IAAI,CAAA;AAAA,MAC3B;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,uBAAgB,GAAA,EAAwB;AAG9C,IAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC9B,MAAA,MAAM,iBAAA,GAAoB,MAAM,OAAA,CAAQ,GAAA;AAAA,QACtC,gBAAgB,GAAA,CAAI,CAAA,IAAA,KAAQ,IAAA,CAAK,kBAAA,CAAmB,IAAI,CAAC;AAAA,OAC3D;AACA,MAAA,KAAA,MAAW,UAAU,iBAAA,EAAmB;AACtC,QAAA,SAAA,CAAU,GAAA,CAAI,MAAA,CAAO,UAAA,EAAY,MAAM,CAAA;AAAA,MACzC;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,QAAQ,eAAA,EAAiB;AAClC,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,kBAAA,CAAmB,IAAI,CAAA;AACjD,MAAA,SAAA,CAAU,GAAA,CAAI,MAAA,CAAO,UAAA,EAAY,MAAM,CAAA;AAAA,IACzC;AAGA,IAAA,MAAM,UAAwB,EAAC;AAC/B,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,MAAA,GAAS,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AACpC,MAAA,IAAI,MAAA,EAAQ;AAAC,QAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,MAAE;AAAA,IACpC;AAIA,IAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,MAAA,IAAA,CAAK,SAAS,IAAA,CAAK;AAAA,QACjB,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS,IAAA,CAAK,mBAAA,CAAoB,GAAG,CAAA;AAAA,QACrC,YAAY,GAAA,CAAI;AAAA,OACjB,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAc,mBAAmB,IAAA,EAA0C;AACzE,IAAA,MAAM,OAAA,GAAuB;AAAA,MAC3B,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,UAAU,IAAA,CAAK,IAAA;AAAA,MACf,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,SAAA,EAAW,KAAK,GAAA,CAAI,SAAA;AAAA,MACpB,WAAA,EAAa,KAAK,GAAA,CAAI,WAAA;AAAA,MACtB,SAAA,EAAW,KAAK,GAAA,CAAI;AAAA,KACtB;AAGA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,QAAA,CAAS,eAAe,OAAO,CAAA;AAC3D,IAAA,IAAI,aAAa,MAAA,EAAQ;AACvB,MAAA,OAAO;AAAA,QACL,YAAY,IAAA,CAAK,EAAA;AAAA,QACjB,MAAA,EAAQ,yBAAA;AAAA,QACR,OAAA,EAAS;AAAA,OACX;AAAA,IACF;AAGA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAC,IAAI,CAAA,EAAG,IAAA,CAAK,GAAG,CAAA;AAC5D,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,CAAC,CAAA,IAAK;AAAA,MAC3B,YAAY,IAAA,CAAK,EAAA;AAAA,MACjB,MAAA,EAAQ,mCAAA;AAAA,MACR,OAAA,EAAS;AAAA,KACX;AAGA,IAAA,MAAM,IAAA,CAAK,QAAA,CAAS,aAAA,CAAc,OAAA,EAAS,MAAM,CAAA;AAEjD,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMA,OAAwB,wBAAA,GAA2B,GAAA;AAAA;AAAA,EACnD,OAAwB,qBAAA,GAAwB,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOhD,OAAwB,oBAAA,mBAAuB,IAAI,GAAA,CAAI;AAAA,IACrD,SAAA;AAAA,IAAW,SAAA;AAAA,IAAW,UAAA;AAAA,IAAY,UAAA;AAAA,IAAY,YAAA;AAAA,IAC9C,YAAA;AAAA,IAAc,eAAA;AAAA,IAAiB,QAAA;AAAA,IAC/B,YAAA;AAAA,IAAc,gBAAA;AAAA,IACd,aAAA;AAAA,IAAe,aAAA;AAAA,IAAe;AAAA,GAC/B,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,oBAAoB,GAAA,EAAyB;AACnD,IAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,IAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,MAAA,IAAU,iBAAgB,wBAAA,EAA0B;AACxE,MAAA,OAAO,MAAA;AAAA,IACT;AAGA,IAAA,MAAM,QAAA,GAAY,IAA8B,QAAA,IAC3C,GAAA,CAAI,YAAY,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAC5B,EAAA;AACL,IAAA,IAAI,gBAAA,CAAgB,oBAAA,CAAqB,GAAA,CAAI,QAAQ,CAAA,EAAG;AACtD,MAAA,OAAO,MAAA;AAAA,IACT;AAGA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,CAAI,IAAA,CAAK,IAAY,SAAA,EAAW,IAAI,CAAA,IAAK,IAAA,CAAK,GAAA,CAAI,SAAA;AACzE,IAAA,MAAM,UAAA,GAAa,KAAK,GAAA,CAAI,IAAA,CAAK,IAAY,SAAA,EAAW,YAAY,CAAA,IAAK,OAAA,CAAQ,GAAA,EAAI;AACrF,IAAA,MAAM,YAAiBC,MAAA,CAAA,IAAA,CAAK,UAAA,EAAY,OAAO,QAAA,EAAU,UAAA,EAAY,WAAW,cAAc,CAAA;AAE9F,IAAA,IAAI;AACF,MAAA,IAAI,CAAIC,GAAA,CAAA,UAAA,CAAW,SAAS,CAAA,EAAG;AAC7B,QAAGA,GAAA,CAAA,SAAA,CAAU,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,MAC7C;AAEA,MAAA,MAAM,WAAW,CAAA,EAAG,GAAA,CAAI,UAAA,IAAc,IAAA,CAAK,KAAK,CAAA,IAAA,CAAA;AAChD,MAAA,MAAM,QAAA,GAAgBD,MAAA,CAAA,IAAA,CAAK,SAAA,EAAW,QAAQ,CAAA;AAC9C,MAAGC,GAAA,CAAA,aAAA,CAAc,QAAA,EAAU,MAAA,EAAQ,OAAO,CAAA;AAE1C,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,iBAAgB,qBAAqB,CAAA;AACrE,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,MAAA,GAAS,gBAAA,CAAgB,qBAAA;AAElD,MAAA,OAAO,GAAG,OAAO;;AAAA,mBAAA,EAA0B,SAAS,wBAAwB,QAAQ,CAAA,iDAAA,CAAA;AAAA,IACtF,CAAA,CAAA,MAAQ;AAEN,MAAA,OAAO,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,gBAAA,CAAgB,wBAAwB,CAAA,GAC7D;;AAAA,YAAA,EAAmB,MAAA,CAAO,MAAA,GAAS,gBAAA,CAAgB,wBAAwB,CAAA,sBAAA,CAAA;AAAA,IAC/E;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,QAAA,EAA4D;AAC5E,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,GAAA,EAAK,QAAQ,CAAA;AAAA,EAC7C;AACF;;;AC9PA,IAAM,QAAA,GAAW;AAAA,EACf,SAAA,EAAW,GAAA;AAAA,EACX,UAAA,EAAY,EAAA;AAAA,EACZ,aAAA,EAAe;AACjB,CAAA;AAIA,IAAM,iBAAA,GAAoC;AAAA,EACxC,YAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,gBAAA,GAAiD;AAAA,EACrD,UAAA,EAAY,aAAA;AAAA,EACZ,OAAA,EAAS,UAAA;AAAA,EACT,QAAA,EAAU,WAAA;AAAA,EACV,OAAA,EAAS,UAAA;AAAA,EACT,YAAA,EAAc,YAAA;AAAA,EACd,YAAA,EAAc,cAAA;AAAA,EACd,WAAA,EAAa,cAAA;AAAA,EACb,WAAA,EAAa;AACf,CAAA;AAGA,IAAM,4BAAuC,IAAI,GAAA,CAAI,CAAC,YAAA,EAAc,SAAS,CAAC,CAAA;AAG9E,IAAM,UAAA,mBAAwC,IAAI,GAAA,CAAI,CAAC,cAAc,CAAC,CAAA;AAEtE,IAAM,eAAA,GAAkB,GAAA;AAIjB,IAAM,SAAA,GAAN,MAAM,UAAA,CAAU;AAAA,EACb,KAAA,uBAAY,GAAA,EAA4B;AAAA,EACxC,MAAA,GAAS,CAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACR,aAAA;AAAA,EAET,WAAA,CAAY,MAAA,GAA0B,EAAC,EAAG;AACxC,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA,CAAO,SAAA,IAAa,QAAA,CAAS,SAAA;AAC9C,IAAA,IAAA,CAAK,UAAA,GAAa,MAAA,CAAO,UAAA,IAAc,QAAA,CAAS,UAAA;AAChD,IAAA,IAAA,CAAK,aAAA,GAAgB,MAAA,CAAO,aAAA,IAAiB,QAAA,CAAS,aAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,MAAA,EAOkD;AACpD,IAAA,IAAI,MAAA,CAAO,UAAA,GAAa,IAAA,CAAK,aAAA,EAAe;AAAC,MAAA,OAAO,IAAA;AAAA,IAAK;AAGzD,IAAA,IAAI,OAAO,UAAA,EAAY;AAAC,MAAA,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,MAAA,CAAO,UAAU,CAAA;AAAA,IAAE;AAG7D,IAAA,MAAM,UAAU,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,QAAA,EAAU,OAAO,IAAI,CAAA;AAC7D,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,IAAA,GAAO,OAAO,IAAA,CAAK,MAAA,GAAS,QAAQ,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,IAAA,GAAO,OAAA,CAAQ,IAAA;AAChF,MAAA,OAAA,CAAQ,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAK,IAAA,CAAK,IAAI,OAAA,CAAQ,UAAA,EAAY,MAAA,CAAO,UAAU,CAAC,CAAA;AAClF,MAAA,OAAA,CAAQ,aAAA,IAAiB,CAAA;AACzB,MAAA,OAAA,CAAQ,YAAY,MAAA,CAAO,SAAA;AAC3B,MAAA,OAAA,CAAQ,SAAA,GAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAC3C,MAAA,OAAA,CAAQ,SAAS,MAAA,CAAO,MAAA;AACxB,MAAA,IAAA,CAAK,YAAA,EAAa;AAClB,MAAA,OAAO,EAAE,KAAA,EAAO,OAAA,EAAS,MAAA,EAAQ,IAAA,EAAK;AAAA,IACxC;AAGA,IAAA,MAAM,EAAA,GAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,CAAA,CAAA;AAChC,IAAA,MAAM,KAAA,GAAwB;AAAA,MAC5B,EAAA;AAAA,MACA,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,aAAA,EAAe,CAAA;AAAA,MACf,YAAY,MAAA,CAAO;AAAA,KACrB;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,EAAA,EAAI,KAAK,CAAA;AACxB,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAM;AAAA,EAChC;AAAA,EAEA,OAAO,EAAA,EAAqB;AAC1B,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,EAAE,CAAA;AAAA,EAC7B;AAAA;AAAA,EAIA,MAAA,GAA2B;AACzB,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AAC7C,MAAA,MAAM,EAAA,GAAK,iBAAA,CAAkB,OAAA,CAAQ,CAAA,CAAE,QAAQ,CAAA;AAC/C,MAAA,MAAM,EAAA,GAAK,iBAAA,CAAkB,OAAA,CAAQ,CAAA,CAAE,QAAQ,CAAA;AAC/C,MAAA,IAAI,OAAO,EAAA,EAAI;AAAC,QAAA,OAAO,EAAA,GAAK,EAAA;AAAA,MAAG;AAC/B,MAAA,OAAO,CAAA,CAAE,YAAY,CAAA,CAAE,SAAA;AAAA,IACzB,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,IAAI,IAAA,GAAe;AACjB,IAAA,OAAO,KAAK,KAAA,CAAM,IAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAA,GAAiB;AACf,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,IAAA,KAAS,CAAA,EAAG;AAAC,MAAA,OAAO,EAAA;AAAA,IAAG;AAEtC,IAAA,MAAM,MAAA,GAAS,KAAK,MAAA,EAAO;AAC3B,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,IAAI,eAAA,GAAuC,IAAA;AAE3C,IAAA,KAAA,MAAW,QAAQ,MAAA,EAAQ;AACzB,MAAA,IAAI,IAAA,CAAK,aAAa,eAAA,EAAiB;AACrC,QAAA,eAAA,GAAkB,IAAA,CAAK,QAAA;AACvB,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,GAAA,EAAQ,gBAAA,CAAiB,eAAe,CAAA,IAAK,eAAe,CAAA,CAAE,CAAA;AAAA,MAC3E;AACA,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA,IAAc,GAAA,GAAM,EAAA,GAAK,UAAU,IAAA,CAAK,UAAA,CAAW,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAC/E,MAAA,KAAA,CAAM,KAAK,CAAA,EAAA,EAAK,IAAA,CAAK,IAAI,CAAA,EAAG,IAAI,CAAA,CAAE,CAAA;AAAA,IACpC;AAEA,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB;AAAA;AAAA,EAIA,QAAA,GAAgG;AAC9F,IAAA,MAAM,aAAqC,EAAC;AAC5C,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,KAAA,CAAM,MAAA,EAAO,EAAG;AACnC,MAAA,UAAA,CAAW,EAAE,QAAQ,CAAA,GAAA,CAAK,WAAW,CAAA,CAAE,QAAQ,KAAK,CAAA,IAAK,CAAA;AAAA,IAC3D;AACA,IAAA,OAAO;AAAA,MACL,UAAA,EAAY,KAAK,KAAA,CAAM,IAAA;AAAA,MACvB,iBAAiB,IAAA,CAAK,IAAA,CAAK,KAAK,MAAA,EAAO,CAAE,SAAS,CAAC,CAAA;AAAA,MACnD;AAAA,KACF;AAAA,EACF;AAAA;AAAA,EAIA,MAAA,GAAqE;AACnE,IAAA,OAAO,EAAE,KAAA,EAAO,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,OAAA,EAAS,CAAA,EAAG,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAO;AAAA,EACjE;AAAA,EAEA,OAAO,QAAA,CACL,IAAA,EACA,MAAA,EACW;AACX,IAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAU,MAAM,CAAA;AAClC,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,KAAK,KAAA,EAAO;AACrC,MAAA,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,IAC5B;AACA,IAAA,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA,EAIQ,WAAA,CAAY,UAAwB,IAAA,EAA0C;AACpF,IAAA,IAAI,UAAA,CAAW,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC5B,MAAA,MAAM,SAAA,GAAY,gBAAgB,IAAI,CAAA;AACtC,MAAA,IAAI,CAAC,SAAA,EAAW;AAAC,QAAA,OAAO,MAAA;AAAA,MAAU;AAClC,MAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,KAAA,CAAM,MAAA,EAAO,EAAG;AACnC,QAAA,IAAI,CAAA,CAAE,aAAa,QAAA,EAAU;AAAC,UAAA;AAAA,QAAS;AACvC,QAAA,IAAI,eAAA,CAAgB,CAAA,CAAE,IAAI,CAAA,KAAM,SAAA,EAAW;AAAC,UAAA,OAAO,CAAA;AAAA,QAAE;AAAA,MACvD;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,UAAA,GAAa,MAAM,IAAI,CAAA;AAC7B,IAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AAAC,MAAA,OAAO,MAAA;AAAA,IAAU;AAE7C,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,KAAA,CAAM,MAAA,EAAO,EAAG;AACnC,MAAA,IAAI,CAAA,CAAE,aAAa,QAAA,EAAU;AAAC,QAAA;AAAA,MAAS;AACvC,MAAA,MAAM,EAAA,GAAK,KAAA,CAAM,CAAA,CAAE,IAAI,CAAA;AACvB,MAAA,IAAI,EAAA,CAAG,SAAS,CAAA,EAAG;AAAC,QAAA;AAAA,MAAS;AAC7B,MAAA,IAAI,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA,IAAK,eAAA,EAAiB;AAAC,QAAA,OAAO,CAAA;AAAA,MAAE;AAAA,IAC5D;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,YAAA,GAAqB;AAC3B,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,IAAA,CAAK,UAAA,EAAY;AAAC,MAAA,IAAA,CAAK,QAAA,EAAS;AAAA,IAAE;AAE3D,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG;AAC1B,MAAA,MAAM,SAAS,IAAA,CAAK,IAAA,CAAK,KAAK,MAAA,EAAO,CAAE,SAAS,CAAC,CAAA;AACjD,MAAA,IAAI,MAAA,IAAU,KAAK,SAAA,EAAW;AAAC,QAAA;AAAA,MAAM;AACrC,MAAA,IAAA,CAAK,QAAA,EAAS;AAAA,IAChB;AAAA,EACF;AAAA,EAEQ,QAAA,GAAiB;AACvB,IAAA,IAAI,SAAA,GAAmC,IAAA;AAEvC,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,KAAA,CAAM,MAAA,EAAO,EAAG;AACnC,MAAA,IAAI,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,QAAQ,CAAA,EAAG;AAAC,QAAA;AAAA,MAAS;AACzC,MAAA,IAAI,CAAC,SAAA,EAAW;AAAE,QAAA,SAAA,GAAY,CAAA;AAAG,QAAA;AAAA,MAAU;AAG3C,MAAA,IACE,CAAA,CAAE,aAAa,SAAA,CAAU,UAAA,IACrB,EAAE,UAAA,KAAe,SAAA,CAAU,UAAA,IAAc,CAAA,CAAE,aAAA,GAAgB,SAAA,CAAU,iBACrE,CAAA,CAAE,UAAA,KAAe,SAAA,CAAU,UAAA,IAAc,CAAA,CAAE,aAAA,KAAkB,UAAU,aAAA,IAAiB,CAAA,CAAE,SAAA,GAAY,SAAA,CAAU,SAAA,EACpH;AACA,QAAA,SAAA,GAAY,CAAA;AAAA,MACd;AAAA,IACF;AAEA,IAAA,IAAI,SAAA,EAAW;AAAC,MAAA,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,SAAA,CAAU,EAAE,CAAA;AAAA,IAAE;AAAA,EAClD;AACF,CAAA;AAIA,SAAS,gBAAgB,IAAA,EAA6B;AACpD,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,qBAAqB,CAAA,GAAI,CAAC,CAAA,IAAK,IAAA;AACnD;AAEA,SAAS,MAAM,IAAA,EAA2B;AACxC,EAAA,OAAO,IAAI,GAAA;AAAA,IACT,IAAA,CAAK,WAAA,EAAY,CAAE,OAAA,CAAQ,gBAAgB,GAAG,CAAA,CAAE,KAAA,CAAM,KAAK,CAAA,CAAE,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,CAAC;AAAA,GACvF;AACF;AAEA,SAAS,OAAA,CAAQ,GAAgB,CAAA,EAAwB;AACvD,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,MAAW,KAAK,CAAA,EAAG;AAAC,IAAA,IAAI,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG;AAAC,MAAA,KAAA,EAAA;AAAA,IAAQ;AAAA,EAAC;AAC5C,EAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,IAAA,EAAM,EAAE,IAAI,CAAA;AACnC,EAAA,OAAO,GAAA,KAAQ,CAAA,GAAI,CAAA,GAAI,KAAA,GAAQ,GAAA;AACjC;AC3OA,IAAM,gBAAA,GAAmB,CAAA;AACzB,IAAM,0BAAA,GAA6B,GAAA;AAa5B,IAAM,sBAAN,MAAqD;AAAA,EACjD,IAAA,GAAO,WAAA;AAAA,EACP,KAAA,GAAQ,EAAA;AAAA,EACR,MAAA,GAAS,EAAE,UAAA,EAAY,WAAA,EAAqB;AAAA,EAE7C,KAAA;AAAA,EACS,eAAA;AAAA,EACA,QAAA;AAAA,EACA,gBAAA;AAAA,EACA,UAAA;AAAA,EACT,GAAA,GAAmB,IAAA;AAAA,EACnB,oBAAA,GAA6C,IAAA;AAAA,EAErD,WAAA,CAAY,GAAA,GAAiC,EAAC,EAAG;AAC/C,IAAA,IAAA,CAAK,eAAA,GAAkB,GAAA,CAAI,SAAA,IAAa,EAAC;AACzC,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,SAAA,CAAU,IAAA,CAAK,eAAe,CAAA;AAC/C,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,qBAAA,IAAyB,gBAAA;AAC7C,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAI,gBAAA,IAAoB,0BAAA;AAChD,IAAA,IAAA,CAAK,aAAa,GAAA,CAAI,UAAA;AAAA,EACxB;AAAA;AAAA,EAIA,MAAM,QAAQ,GAAA,EAAgC;AAE5C,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,IAAA,CAAK,KAAA,GAAQ,MAAM,IAAA,CAAK,YAAA,CAAa,KAAK,UAAU,CAAA;AAAA,IACtD;AAGA,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,IAAA,CAAK,MAAMN,MAAAA,CAAO,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA,IAAK,IAAA;AAAA,IAC1C;AAGA,IAAA,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,SAAA,EAAW,IAAI,CAAA;AAAA,EAC3C;AAAA,EAEA,MAAM,MAAA,CAAO,GAAA,EAAiB,OAAA,EAAgC;AAE5D,IAAA,IAAI,KAAK,oBAAA,EAAsB;AAC7B,MAAA,IAAI;AAAE,QAAA,MAAM,IAAA,CAAK,oBAAA;AAAA,MAAsB,CAAA,CAAA,MAAQ;AAAA,MAAqB;AAAA,IACtE;AAGA,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,MAAM,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,UAAU,CAAA;AAAA,IACvC;AAGA,IAAA,GAAA,CAAI,KAAK,GAAA,CAAI,WAAA,EAAa,cAAc,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AAAA,EAC/D;AAAA;AAAA,EAIA,cAAc,GAAA,EAAuC;AACnD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,MAAA,EAAO;AACnC,IAAA,MAAM,cAAA,GAAiB,mBAAA,CAAoB,GAAA,CAAI,GAAG,CAAA;AAClD,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,cAAA,EAAgB;AAAC,MAAA,OAAO,MAAA;AAAA,IAAU;AAGpD,IAAA,MAAM,QAAA,GAAW,CAAC,GAAG,GAAA,CAAI,QAAQ,CAAA;AACjC,IAAA,MAAM,SAAS,QAAA,CAAS,SAAA,CAAU,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,QAAQ,CAAA;AAC1D,IAAA,MAAM,WAAqB,EAAC;AAC5B,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,QAAA,CAAS,IAAA,CAAK,CAAA,kBAAA,EAAqB,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAAA,EAAY,QAAQ,CAAA,CAAE,CAAA;AAAA,IAC1E;AACA,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,QAAA,CAAS,KAAK,cAAc,CAAA;AAAA,IAC9B;AACA,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,IAAA,CAAK,MAAM,CAAA;AAErC,IAAA,IAAI,UAAU,CAAA,EAAG;AACf,MAAA,MAAM,GAAA,GAAM,SAAS,MAAM,CAAA;AAC3B,MAAA,QAAA,CAAS,MAAM,CAAA,GAAI;AAAA,QACjB,GAAG,GAAA;AAAA,QACH,OAAA,EAAS,IAAI,OAAA,GAAU;;AAAA,EAAO,QAAQ,CAAA;AAAA,OACxC;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,QAAA,CAAS,OAAA,CAAQ;AAAA,QACf,IAAA,EAAM,QAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,EAAE,QAAA,EAAS;AAAA,EACpB;AAAA;AAAA,EAIA,aAAA,CAAc,KAAkB,MAAA,EAA0B;AACxD,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AAAC,MAAA;AAAA,IAAO;AAG7B,IAAA,MAAM,UAAA,GAAa,OAAO,QAAA,EAAU,UAAA;AACpC,IAAA,IAAA,CAAK,GAAA,CAAI,QAAA,KAAa,aAAA,IAAiB,GAAA,CAAI,QAAA,KAAa,iBAAiB,GAAA,CAAI,QAAA,KAAa,UAAA,KACrF,UAAA,EAAY,QAAA,EAAU;AACzB,MAAA,MAAM,WAAW,UAAA,CAAW,QAAA;AAC5B,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,EAAG;AACjC,QAAA,MAAM,QAAQ,QAAA,CAAS,KAAA;AACvB,QAAA,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,SAAA,EAAW;AAAA,UAClC,WAAW,KAAA,CAAM,MAAA,CAAO,OAAK,CAAA,CAAE,MAAA,KAAW,WAAW,CAAA,CAAE,MAAA;AAAA,UACvD,YAAY,KAAA,CAAM,MAAA,CAAO,OAAK,CAAA,CAAE,MAAA,KAAW,aAAa,CAAA,CAAE,MAAA;AAAA,UAC1D,SAAS,KAAA,CAAM,MAAA,CAAO,OAAK,CAAA,CAAE,MAAA,KAAW,SAAS,CAAA,CAAE,MAAA;AAAA,UACnD,SAAS,KAAA,CAAM,MAAA,CAAO,OAAK,CAAA,CAAE,MAAA,KAAW,SAAS,CAAA,CAAE,MAAA;AAAA,UACnD,OAAO,KAAA,CAAM;AAAA,SACd,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,MAAM,QAAQ,qBAAA,CAAsB,GAAA,CAAI,UAAU,GAAA,CAAI,KAAA,EAAO,OAAO,MAAM,CAAA;AAC1E,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,IAAA,CAAK,MAAM,GAAA,CAAI;AAAA,QACb,GAAG,CAAA;AAAA,QACH,WAAW,GAAA,CAAI;AAAA,OAChB,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAIA,MAAM,eAAe,GAAA,EAAgC;AACnD,IAAA,IAAI,IAAA,CAAK,QAAA,IAAY,CAAA,IAAK,CAAC,KAAK,GAAA,EAAK;AAAC,MAAA;AAAA,IAAO;AAC7C,IAAA,IAAI,GAAA,CAAI,SAAA,GAAY,IAAA,CAAK,QAAA,KAAa,CAAA,EAAG;AAAC,MAAA;AAAA,IAAO;AAGjD,IAAA,IAAA,CAAK,uBAAuB,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAA,CAAE,MAAM,MAAM;AAAA,IAAkB,CAAC,CAAA;AAAA,EACxF;AAAA;AAAA,EAIA,MAAc,iBAAiB,GAAA,EAAgC;AAC7D,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AAAC,MAAA;AAAA,IAAO;AAGvB,IAAA,MAAM,iBAAiB,GAAA,CAAI,QAAA,CAAS,MAAM,CAAC,IAAA,CAAK,WAAW,CAAC,CAAA;AAC5D,IAAA,MAAM,UAAA,GAAa,iBAAiB,cAA8B,CAAA;AAClE,IAAA,IAAI,CAAC,UAAA,EAAY;AAAC,MAAA;AAAA,IAAO;AAEzB,IAAA,MAAM,eAAe,2BAAA,CAA4B,GAAA,CAAI,YAAY,IAAA,CAAK,QAAA,EAAU,IAAI,SAAS,CAAA;AAC7F,IAAA,MAAM,QAAA,GAAyB;AAAA,MAC7B,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,YAAA,EAAa;AAAA,MACxC,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,UAAA;AAAW,KACtC;AAEA,IAAA,IAAI,QAAyB,EAAC;AAG9B,IAAA,IAAI,IAAA,CAAK,IAAI,aAAA,EAAe;AAC1B,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,GAAA,CAAI,cAAc,QAAA,EAAU;AAAA,UACtD,KAAA,EAAO,CAAC,kBAAkB,CAAA;AAAA,UAC1B,UAAA,EAAY,EAAE,IAAA,EAAM,UAAA,EAAY,UAAU,EAAE,IAAA,EAAM,iBAAgB,EAAE;AAAA,UACpE,WAAA,EAAa,GAAA;AAAA,UACb,WAAW,IAAA,CAAK;AAAA,SACjB,CAAA;AACD,QAAA,MAAM,OAAO,QAAA,CAAS,SAAA,EAAW,KAAK,CAAA,EAAA,KAAM,EAAA,CAAG,SAAS,eAAe,CAAA;AACvE,QAAA,IAAI,MAAM,KAAA,EAAO;AACf,UAAA,KAAA,GAAQ,gCAAA,CAAiC,KAAK,KAAK,CAAA;AAAA,QACrD;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAGA,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,IAAK,IAAA,CAAK,IAAI,QAAA,EAAU;AAC3C,MAAA,MAAM,MAAA,GAAS,8BAA8B,UAAA,EAAY,GAAA,CAAI,YAAY,IAAA,CAAK,QAAA,EAAU,IAAI,SAAS,CAAA;AACrG,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,GAAA,CAAI,SAAS,MAAA,EAAQ;AAAA,QAC/C,WAAA,EAAa,GAAA;AAAA,QACb,WAAW,IAAA,CAAK;AAAA,OACjB,CAAA;AACD,MAAA,KAAA,GAAQ,2BAAA,CAAA,CAA6B,QAAA,CAAS,OAAA,IAAW,EAAA,EAAI,MAAM,CAAA;AAAA,IACrE;AAEA,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,IAAA,CAAK,MAAM,GAAA,CAAI;AAAA,QACb,GAAG,CAAA;AAAA,QACH,WAAW,GAAA,CAAI;AAAA,OAChB,CAAA;AAAA,IACH;AAEA,IAAA,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,mBAAA,EAAqB;AAAA,MAC7C,WAAW,GAAA,CAAI,SAAA;AAAA,MACf,gBAAgB,KAAA,CAAM,MAAA;AAAA,MACtB,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,QAAA;AAAS,KAC5B,CAAA;AAED,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,MAAA,GAAA,CAAI,QAAA,CAAS,KAAK,kBAAA,EAAoB;AAAA,QACpC,IAAA,EAAM,WAAA;AAAA,QACN,KAAA,EAAO,YAAA;AAAA,QACP,IAAA,EAAM,EAAE,UAAA,EAAY,KAAA,CAAM,MAAA,EAAQ,UAAA,EAAY,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM,SAAA,EAAW,GAAA,CAAI,SAAA;AAAU,OACzF,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAIA,MAAc,aAAa,GAAA,EAAiC;AAC1D,IAAA,MAAM,QAAA,GAAgBO,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,iBAAiB,CAAA;AACjD,IAAA,IAAI;AACF,MAAA,IAAI,CAAIC,GAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,EAAG;AAAC,QAAA,OAAO,IAAA,CAAK,KAAA;AAAA,MAAM;AACjD,MAAA,MAAM,GAAA,GAASA,GAAA,CAAA,YAAA,CAAa,QAAA,EAAU,OAAO,CAAA;AAC7C,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC3B,MAAA,OAAO,SAAA,CAAU,QAAA,CAAS,IAAA,EAAM,IAAA,CAAK,eAAe,CAAA;AAAA,IACtD,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA,CAAK,KAAA;AAAA,IACd;AAAA,EACF;AAAA,EAEA,MAAc,WAAW,GAAA,EAA4B;AACnD,IAAA,IAAI;AACF,MAAGA,GAAA,CAAA,SAAA,CAAU,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AACrC,MAAGA,GAAA,CAAA,aAAA;AAAA,QACID,MAAA,CAAA,IAAA,CAAK,KAAK,iBAAiB,CAAA;AAAA,QAChC,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAAA,QAClC;AAAA,OACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAAqB;AAAA,EAC/B;AACF,CAAA;AAEA,SAAS,oBAAoB,GAAA,EAAgC;AAC3D,EAAA,MAAM,WAAA,GAAc,GAAA,CAAI,IAAA,CAAK,GAAA,CAAY,QAAQ,sBAAsB,CAAA;AACvE,EAAA,MAAM,yBAAyB,GAAA,CAAI,IAAA,CAAK,GAAA,CAAY,MAAA,EAAQ,wBAAwB,CAAA,IAAK,CAAA;AACzF,EAAA,MAAM,wBAAwB,GAAA,CAAI,IAAA,CAAK,GAAA,CAAY,MAAA,EAAQ,uBAAuB,CAAA,IAAK,CAAA;AACvF,EAAA,MAAM,oBAAoB,GAAA,CAAI,IAAA,CAAK,GAAA,CAAY,MAAA,EAAQ,mBAAmB,CAAA,IAAK,CAAA;AAC/E,EAAA,MAAM,kBAAA,GAAqB,GAAA,CAAI,IAAA,CAAK,GAAA,CAAY,cAAc,oBAAoB,CAAA;AAClF,EAAA,MAAM,kBAAA,GAAqB,GAAA,CAAI,IAAA,CAAK,GAAA,CAAY,cAAc,oBAAoB,CAAA;AAClF,EAAA,MAAM,gBAAA,GAAmB,GAAA,CAAI,IAAA,CAAK,GAAA,CAAY,cAAc,kBAAkB,CAAA;AAG9E,EAAA,IAAI,GAAA,CAAI,aAAa,CAAA,IAAK,CAAC,eAAe,qBAAA,KAA0B,CAAA,IAAK,sBAAsB,CAAA,EAAG;AAChG,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GAAQ,IAAqC,IAAA,IAAQ,EAAA;AAG3D,EAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAO,IAAI,SAAA,GAAY,GAAA,CAAI,gBAAiB,GAAG,CAAA;AAGpE,EAAA,MAAM,aAAa,GAAA,CAAI,IAAA,CAAK,GAAA,CAAY,QAAA,EAAU,YAAY,CAAA,IAAK,CAAA;AACnE,EAAA,MAAM,YAAY,GAAA,CAAI,IAAA,CAAK,GAAA,CAAY,QAAA,EAAU,WAAW,CAAA,IAAK,CAAA;AACjE,EAAA,IAAI,UAAA,GAAa,EAAA;AACjB,EAAA,IAAI,YAAY,CAAA,EAAG;AACjB,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAO,UAAA,GAAa,YAAa,GAAG,CAAA;AAC3D,IAAA,MAAM,SAAA,GAAY,aAAa,EAAA,GAAK,YAAA,GAChC,aAAa,EAAA,GAAK,WAAA,GAClB,SAAA,IAAa,EAAA,GAAK,WAAA,GAClB,MAAA;AACJ,IAAA,UAAA,GAAa,CAAA,QAAA,EAAW,UAAA,CAAW,cAAA,EAAgB,CAAA,CAAA,EAAI,SAAA,CAAU,cAAA,EAAgB,CAAA,SAAA,EAAY,SAAS,CAAA,GAAA,EAAM,SAAS,CAAA,CAAA;AAAA,EACvH;AAGA,EAAA,MAAM,UAAU,GAAA,CAAI,IAAA,CAAK,GAAA,CAAa,UAAA,EAAY,SAAS,CAAA,IAAK,KAAA;AAChE,EAAA,MAAM,qBAAqB,GAAA,CAAI,IAAA,CAAK,GAAA,CAAY,UAAA,EAAY,yBAAyB,CAAA,IAAK,CAAA;AAC1F,EAAA,MAAM,cAAA,GAAiB,UACnB,CAAA,OAAA,EAAU,kBAAkB,kCAC5B,kBAAA,GAAqB,CAAA,GACnB,CAAA,QAAA,EAAW,kBAAkB,CAAA,gCAAA,CAAA,GAC7B,QAAA;AAGN,EAAA,MAAM,YAAY,GAAA,CAAI,IAAA,CAAK,IAAc,OAAA,EAAS,MAAM,KAAK,EAAC;AAC9D,EAAA,MAAM,gBAAgB,GAAA,CAAI,IAAA,CAAK,IAAc,OAAA,EAAS,UAAU,KAAK,EAAC;AACtE,EAAA,MAAM,eAAe,GAAA,CAAI,IAAA,CAAK,IAAc,OAAA,EAAS,SAAS,KAAK,EAAC;AAGpE,EAAA,MAAM,WAAA,GAAc,GAAA,CAAI,IAAA,CAAK,GAAA,CAAgG,QAAQ,SAAS,CAAA;AAG9I,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtB,gBAAA;AAAA,IACA,CAAA,MAAA,EAAS,QAAQ,WAAW,CAAA,CAAA;AAAA,IAC5B,cAAc,GAAA,CAAI,SAAS,IAAI,GAAA,CAAI,aAAa,KAAK,OAAO,CAAA,EAAA;AAAA,GAC9D;AACA,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,KAAA,CAAM,KAAK,UAAU,CAAA;AAAA,EACvB;AACA,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,UAAA,EAAa,cAAc,CAAA,CAAE,CAAA;AACxC,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,YAAA,EAAe,SAAA,CAAU,MAAM,CAAA,WAAA,EAAc,cAAc,MAAM,CAAA,UAAA,EAAa,YAAA,CAAa,MAAM,CAAA,CAAE,CAAA;AAC9G,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,EAAG,WAAA,CAAY,SAAS,CAAA,CAAA,EAAI,WAAA,CAAY,KAAK,CAAA,UAAA,CAAY,CAAA;AACxE,IAAA,IAAI,WAAA,CAAY,aAAa,CAAA,EAAG;AAAC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,WAAA,CAAY,UAAU,CAAA,YAAA,CAAc,CAAA;AAAA,IAAE;AACrF,IAAA,IAAI,WAAA,CAAY,UAAU,CAAA,EAAG;AAAC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,WAAA,CAAY,OAAO,CAAA,QAAA,CAAU,CAAA;AAAA,IAAE;AAC3E,IAAA,KAAA,CAAM,KAAK,CAAA,OAAA,EAAU,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EACzC;AACA,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,UAAA,EAAa,iBAAiB,CAAA,gBAAA,CAAkB,CAAA;AAC3D,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,MAAA,EAAS,WAAW,CAAA,CAAE,CAAA;AAAA,EACnC;AACA,EAAA,IAAI,yBAAyB,CAAA,EAAG;AAC9B,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,wBAAA,EAA2B,sBAAsB,CAAA,CAAE,CAAA;AAAA,EAChE;AACA,EAAA,IAAI,wBAAwB,CAAA,EAAG;AAC7B,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,sCAAA,EAAyC,qBAAqB,CAAA,CAAE,CAAA;AAAA,EAC7E;AACA,EAAA,IAAI,kBAAA,EAAoB;AACtB,IAAA,MAAM,YAAY,OAAO,kBAAA,KAAuB,QAAA,GAAW,CAAA,YAAA,EAAe,kBAAkB,CAAA,CAAA,GAAK,EAAA;AACjG,IAAA,MAAM,OAAO,OAAO,gBAAA,KAAqB,QAAA,GAAW,CAAA,OAAA,EAAU,gBAAgB,CAAA,CAAA,GAAK,EAAA;AACnF,IAAA,KAAA,CAAM,KAAK,CAAA,aAAA,EAAgB,kBAAkB,GAAG,SAAS,CAAA,EAAG,IAAI,CAAA,CAAE,CAAA;AAAA,EACpE;AACA,EAAA,KAAA,CAAM,KAAK,kGAAkG,CAAA;AAE7G,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAIA,SAAS,qBAAA,CACP,QAAA,EACA,KAAA,EACA,MAAA,EACiB;AACjB,EAAA,MAAM,QAAyB,EAAC;AAEhC,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,WAAW,KAAA,CAAM,IAAA;AACvB,MAAA,MAAM,SAAS,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA,IAAK,IAAI,MAAA,GAAS,CAAA;AACnD,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,CAAE,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,EAAK,CAAE,MAAA,GAAS,CAAC,CAAA,IAAK,EAAA;AACvE,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,QAAA,EAAU,cAAA;AAAA,QACV,IAAA,EAAM,CAAA,KAAA,EAAQ,QAAQ,CAAA,EAAA,EAAK,KAAK,yBAAyB,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AAAA,QAC/E,UAAA,EAAY,GAAA;AAAA,QACZ,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA;AAAA,IACF;AAAA,IAEA,KAAK,aAAA,EAAe;AAClB,MAAA,MAAM,UAAU,KAAA,CAAM,OAAA;AACtB,MAAA,MAAM,cAAc,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA,IAAK,EAAC,EAAG,MAAA;AAC/C,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,QAAA,EAAU,aAAA;AAAA,QACV,IAAA,EAAM,CAAA,MAAA,EAAS,OAAO,CAAA,SAAA,EAAY,UAAU,CAAA,QAAA,CAAA;AAAA,QAC5C,UAAA,EAAY,GAAA;AAAA,QACZ,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA;AAAA,IACF;AAAA,IAEA,KAAK,aAAA,EAAe;AAClB,MAAA,MAAM,cAAc,KAAA,CAAM,OAAA;AAC1B,MAAA,MAAM,aAAa,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA,IAAK,EAAC,EAAG,MAAA;AAC9C,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,QAAA,EAAU,aAAA;AAAA,QACV,IAAA,EAAM,CAAA,MAAA,EAAS,WAAW,CAAA,SAAA,EAAY,SAAS,CAAA,MAAA,CAAA;AAAA,QAC/C,UAAA,EAAY,GAAA;AAAA,QACZ,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA;AAAA,IACF;AAAA,IAEA,KAAK,iBAAA,EAAmB;AACtB,MAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AACnB,MAAA,MAAM,OAAA,GAAU,OAAO,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,CAAE,OAAA,CAAQ,OAAO,GAAG,CAAA;AACvD,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,QAAA,EAAU,SAAA;AAAA,QACV,IAAA,EAAM,CAAA,eAAA,EAAkB,IAAI,CAAA,GAAA,EAAM,OAAO,CAAA,CAAA;AAAA,QACzC,UAAA,EAAY,IAAA;AAAA,QACZ,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA;AAAA,IACF;AAAA,IAEA,KAAK,YAAA,EAAc;AACjB,MAAA,MAAM,OAAO,KAAA,CAAM,OAAA,IAAqB,EAAA,EAAI,KAAA,CAAM,GAAG,EAAE,CAAA;AACvD,MAAA,MAAM,OAAA,GAAU,OAAO,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,CAAE,OAAA,CAAQ,OAAO,GAAG,CAAA;AACvD,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,QAAA,EAAU,aAAA;AAAA,QACV,IAAA,EAAM,CAAA,OAAA,EAAU,GAAG,CAAA,sBAAA,EAAyB,OAAO,CAAA,CAAA;AAAA,QACnD,UAAA,EAAY,GAAA;AAAA,QACZ,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA;AAAA,IACF;AAAA;AAGF,EAAA,OAAO,KAAA;AACT;AAIA,SAAS,iBAAiB,QAAA,EAAuC;AAC/D,EAAA,MAAM,KAAA,GAAQ,QAAA,CACX,GAAA,CAAI,CAAA,GAAA,KAAO;AACV,IAAA,IAAI,GAAA,CAAI,SAAS,MAAA,EAAQ;AACvB,MAAA,MAAM,OAAA,GAAU,IAAI,OAAA,IAAW,EAAA;AAC/B,MAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,GAAI,CAAA;AACrC,MAAA,OAAO,gBAAgB,OAAO,CAAA,EAAG,QAAQ,MAAA,GAAS,GAAA,GAAO,QAAQ,EAAE,CAAA,CAAA;AAAA,IACrE;AACA,IAAA,IAAI,GAAA,CAAI,SAAS,WAAA,EAAa;AAC5B,MAAA,MAAM,QAAkB,EAAC;AACzB,MAAA,IAAI,GAAA,CAAI,OAAA,EAAS,IAAA,EAAK,EAAG;AACvB,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,GAAA,CAAI,OAAA,CAAQ,MAAM,CAAA,EAAG,GAAG,CAAC,CAAA,EAAI,IAAI,OAAA,CAAQ,MAAA,GAAS,GAAA,GAAO,KAAA,GAAQ,EAAE,CAAA,CAAE,CAAA;AAAA,MAC5F;AACA,MAAA,IAAI,GAAA,CAAI,WAAW,MAAA,EAAQ;AACzB,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,GAAA,CAAI,SAAA,CAAU,IAAI,CAAA,EAAA,KAAM,EAAA,CAAG,IAAA,IAAS,EAAA,CAAW,UAAU,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,MAClG;AACA,MAAA,OAAO,MAAM,MAAA,GAAS,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AAAA,IAC/C;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,CAAA,KAAmB,MAAM,IAAI,CAAA;AAExC,EAAA,OAAO,MAAM,MAAA,GAAS,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA,GAAI,IAAA;AACjD;AAIA,IAAM,kBAAA,GAA8B;AAAA,EAClC,IAAA,EAAM,eAAA;AAAA,EACN,WAAA,EAAa,2EAAA;AAAA,EACb,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,WAAA,EAAa,yDAAA;AAAA,QACb,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY;AAAA,YACV,QAAA,EAAU;AAAA,cACR,IAAA,EAAM,QAAA;AAAA,cACN,IAAA,EAAM,CAAC,cAAA,EAAgB,cAAA,EAAgB,WAAW,UAAA,EAAY,SAAA,EAAW,YAAA,EAAc,aAAA,EAAe,aAAa,CAAA;AAAA,cACnH,WAAA,EAAa;AAAA,aACf;AAAA,YACA,IAAA,EAAM;AAAA,cACJ,IAAA,EAAM,QAAA;AAAA,cACN,WAAA,EAAa;AAAA,aACf;AAAA,YACA,UAAA,EAAY;AAAA,cACV,IAAA,EAAM,QAAA;AAAA,cACN,OAAA,EAAS,CAAA;AAAA,cACT,OAAA,EAAS,CAAA;AAAA,cACT,WAAA,EAAa;AAAA,aACf;AAAA,YACA,MAAA,EAAQ;AAAA,cACN,IAAA,EAAM,QAAA;AAAA,cACN,WAAA,EAAa;AAAA;AACf,WACF;AAAA,UACA,QAAA,EAAU,CAAC,UAAA,EAAY,MAAA,EAAQ,cAAc,QAAQ;AAAA;AACvD;AACF,KACF;AAAA,IACA,QAAA,EAAU,CAAC,OAAO;AAAA;AAEtB,CAAA;AAEA,SAAS,2BAAA,CAA4B,UAAkB,MAAA,EAAwB;AAC7E,EAAA,OAAO,CAAA,6DAAA,EAAgE,QAAQ,CAAA,IAAA,EAAO,MAAM,CAAA;;AAAA;AAAA;AAAA;AAAA,kDAAA,CAAA;AAM9F;AAGA,SAAS,6BAAA,CAA8B,OAAA,EAAiB,QAAA,EAAkB,MAAA,EAAwB;AAChG,EAAA,OAAO,CAAA,yDAAA,EAA4D,QAAQ,CAAA,IAAA,EAAO,MAAM,CAAA;;AAAA,EAExF,OAAO;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA,2BAAA,CAAA;AAaT;AAGA,SAAS,iCAAiC,KAAA,EAAiC;AACzE,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,KAAA;AACb,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAM,KAAK,CAAA,EAAG;AAAC,MAAA,OAAO,EAAC;AAAA,IAAE;AAC5C,IAAA,OAAO,IAAA,CAAK,KAAA,CACT,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,YAAY,CAAA,CAAE,IAAI,CAAA,CAChC,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,MACT,QAAA,EAAW,EAAE,QAAA,IAA6B,SAAA;AAAA,MAC1C,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAK,IAAA,CAAK,IAAI,CAAA,EAAK,CAAA,CAAE,UAAA,IAAc,GAAG,CAAC,CAAA;AAAA,MAC5D,MAAA,EAAQ,EAAE,MAAA,IAAU;AAAA,KACtB,CAAE,CAAA;AAAA,EACN,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAGA,SAAS,4BAA4B,GAAA,EAA8B;AACjE,EAAA,IAAI;AAEF,IAAA,IAAI,QAAA,GAAW,GAAA,CAAI,WAAA,CAAY,GAAG,CAAA;AAClC,IAAA,OAAO,YAAY,CAAA,EAAG;AACpB,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA;AAChC,MAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,MAAA,IAAI,MAAA,GAAS,CAAA,CAAA;AACb,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,QAAA,IAAI,KAAA,CAAM,CAAC,CAAA,KAAM,GAAA,EAAK;AAAC,UAAA,KAAA,EAAA;AAAA,QAAQ,CAAA,MAAA,IACtB,KAAA,CAAM,CAAC,CAAA,KAAM,GAAA,EAAK;AACzB,UAAA,KAAA,EAAA;AACA,UAAA,IAAI,UAAU,CAAA,EAAG;AAAE,YAAA,MAAA,GAAS,CAAA;AAAG,YAAA;AAAA,UAAO;AAAA,QACxC;AAAA,MACF;AACA,MAAA,IAAI,UAAU,CAAA,EAAG;AACf,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,KAAK,KAAA,CAAM,KAAA,CAAM,MAAM,CAAA,EAAG,MAAA,GAAS,CAAC,CAAC,CAAA;AAGpD,UAAA,IAAI,MAAM,OAAA,CAAQ,MAAM,CAAA,IAAK,MAAA,CAAO,SAAS,CAAA,EAAG;AAC9C,YAAA,OAAO,MAAA,CACJ,OAAO,CAAA,CAAA,KAAK,CAAA,CAAE,YAAY,CAAA,CAAE,IAAI,CAAA,CAChC,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,cACT,QAAA,EAAW,EAAE,QAAA,IAA6B,SAAA;AAAA,cAC1C,MAAM,CAAA,CAAE,IAAA;AAAA,cACR,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAK,IAAA,CAAK,IAAI,CAAA,EAAK,CAAA,CAAE,UAAA,IAAc,GAAG,CAAC,CAAA;AAAA,cAC5D,MAAA,EAAQ,EAAE,MAAA,IAAU;AAAA,aACtB,CAAE,CAAA;AAAA,UACN;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAAwB;AAAA,MAClC;AACA,MAAA,QAAA,GAAW,GAAA,CAAI,WAAA,CAAY,GAAA,EAAK,QAAA,GAAW,CAAC,CAAA;AAAA,IAC9C;AACA,IAAA,OAAO,EAAC;AAAA,EACV,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;;;ANjhBA,oBAAA,EAAA;AO1CA,IAAM,cAAA,GAAiB;AAAA,EACrB,KAAA,EAAQ,GAAA;AAAA,EACR,MAAA,EAAQ,GAAA;AAAA,EACR,KAAA,EAAQ;AACV,CAAA;AAEA,IAAM,yBAAA,GAA4B;AAAA,EAChC,KAAA,EAAQ,GAAA;AAAA,EACR,MAAA,EAAQ,GAAA;AAAA,EACR,KAAA,EAAQ;AACV,CAAA;AAEA,IAAM,uBAAA,GAA0B;AAAA,EAC9B,KAAA,EAAQ,GAAA;AAAA,EACR,MAAA,EAAQ,GAAA;AAAA,EACR,KAAA,EAAQ;AACV,CAAA;AAEA,IAAM,cAAA,GAAiB,GAAA;AACvB,IAAM,oBAAA,GAAuB,GAAA;AAItB,IAAM,sBAAN,MAAqD;AAAA,EACjD,IAAA,GAAO,YAAA;AAAA,EAEC,UAAA;AAAA,EACA,gBAAA,uBAAuB,GAAA,EAAoB;AAAA,EAE5D,YAAY,MAAA,EAAmC;AAC7C,IAAA,IAAA,CAAK,aAAa,MAAA,CAAO,UAAA;AAAA,EAC3B;AAAA,EAEA,SAAA,CACE,QAAA,EACA,KAAA,EACA,GAAA,EACyB;AACzB,IAAA,MAAM,UAAA,GAAa,EAAE,GAAG,KAAA,EAAM;AAG9B,IAAA,IACE,aAAa,aAAA,IACV,QAAA,KAAa,iBACb,QAAA,KAAa,iBAAA,IACb,aAAa,YAAA,EAChB;AACA,MAAA,IAAA,CAAK,wBAAwB,UAAU,CAAA;AAAA,IACzC;AAGA,IAAA,IAAI,aAAa,aAAA,EAAe;AAC9B,MAAA,IAAA,CAAK,qBAAqB,UAAU,CAAA;AAAA,IACtC;AAGA,IAAA,IAAI,QAAA,KAAa,SAAA,IAAa,OAAO,UAAA,CAAW,SAAS,QAAA,EAAU;AACjE,MAAA,IAAA,CAAK,iBAAA,CAAkB,YAAY,GAAG,CAAA;AAAA,IACxC;AAGA,IAAA,IAAI,aAAa,YAAA,EAAc;AAC7B,MAAA,MAAM,MAAA,GAAS,OAAO,UAAA,CAAW,GAAA,KAAQ,WAAW,UAAA,CAAW,GAAA,CAAI,MAAK,GAAI,EAAA;AAC5E,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,UAAA,CAAW,GAAA,GAAM,GAAA;AAAA,MACnB;AAAA,IACF;AAEA,IAAA,OAAO,UAAA;AAAA,EACT;AAAA;AAAA,EAIQ,qBAAqB,KAAA,EAAsC;AAEjE,IAAA,MAAM,OAAA,GACJ,OAAO,KAAA,CAAM,OAAA,KAAY,QAAA,GACrB,KAAA,CAAM,OAAA,GACN,OAAO,KAAA,CAAM,KAAA,KAAU,QAAA,GACrB,KAAA,CAAM,KAAA,GACN,EAAA;AAER,IAAA,IAAI,OAAA,IAAW,OAAO,KAAA,CAAM,OAAA,KAAY,QAAA,EAAU;AAChD,MAAA,KAAA,CAAM,OAAA,GAAU,OAAA;AAAA,IAClB;AAEA,IAAA,IAAI,OAAO,KAAA,CAAM,OAAA,KAAY,QAAA,EAAU;AACrC,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAK;AACnC,MAAA,MAAM,WAAA,GAAc,WAAA,CAAY,IAAA,CAAK,OAAO,CAAA;AAE5C,MAAA,IAAI,OAAA,IAAW,CAAC,WAAA,EAAa;AAC3B,QAAA,KAAA,CAAM,OAAA,GAAU,OAAO,OAAO,CAAA,CAAA,CAAA;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAIQ,iBAAA,CAAkB,OAAgC,GAAA,EAAwB;AAChF,IAAA,MAAM,QAAA,GAAY,KAAA,CAAM,IAAA,CAAgB,IAAA,EAAK;AAG7C,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,iBAAA,CAAkB,QAAQ,CAAA;AACpD,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,KAAA,CAAM,IAAA,GAAO,YAAA;AAAA,IACf;AAGA,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AACnC,IAAA,IAAI,mBAAA,CAAoB,SAAS,CAAA,EAAG;AAElC,MAAA,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,YAAA,EAAc,oBAAoB,SAAS,CAAA;AAAA,IAC9D;AAGA,IAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA;AACzC,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,QAAA,CAAS,aAAa,CAAA,IAAK,gBAAgB,CAAA,GACjE,IAAA,CAAK,KAAA,CAAM,aAAa,CAAA,GACxB,CAAA;AACJ,IAAA,KAAA,CAAM,MAAA,GAAS,UAAA;AAGf,IAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA;AACzC,IAAA,MAAM,gBAAgB,IAAA,CAAK,oBAAA;AAAA,MACzB,SAAA;AAAA,MACA,MAAA,CAAO,SAAS,cAAc,CAAA,IAAK,iBAAiB,CAAA,GAChD,IAAA,CAAK,KAAA,CAAM,cAAc,CAAA,GACzB,MAAA;AAAA,MACJ,IAAI,GAAA,CAAI;AAAA,KACV;AACA,IAAA,IAAI,gBAAgB,CAAA,EAAG;AACrB,MAAA,KAAA,CAAM,KAAA,GAAQ,aAAA;AAAA,IAChB;AAAA,EACF;AAAA;AAAA,EAIQ,kBAAkB,QAAA,EAAiC;AACzD,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AAG9C,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,uBAAA,CAAwB,UAAU,CAAA;AAC5D,IAAA,IAAI,YAAA,EAAc;AAAC,MAAA,OAAO,YAAA;AAAA,IAAa;AAGvC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,kBAAA,CAAmB,UAAU,CAAA;AACnD,IAAA,IAAI,QAAA,EAAU;AAAC,MAAA,OAAO,QAAA;AAAA,IAAS;AAE/B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,wBAAwB,QAAA,EAAiC;AAC/D,IAAA,MAAM,KAAA,GAAQ,SAAS,WAAA,EAAY;AACnC,IAAA,MAAM,QAAA,GAAW,CAAC,SAAA,EAAW,MAAA,EAAQ,SAAS,MAAM,CAAA;AACpD,IAAA,MAAM,UAAU,QAAA,CAAS,IAAA,CAAK,OAAK,KAAA,CAAM,QAAA,CAAS,CAAC,CAAC,CAAA;AACpD,IAAA,IAAI,CAAC,OAAA,EAAS;AAAC,MAAA,OAAO,IAAA;AAAA,IAAK;AAE3B,IAAA,MAAM,YAAY,QAAA,CAAS,KAAA,CAAM,GAAG,QAAA,CAAS,MAAA,GAAS,QAAQ,MAAM,CAAA;AACpE,IAAA,MAAM,GAAA,GAAW,kBAAW,SAAS,CAAA,GAAI,YAAiB,MAAA,CAAA,IAAA,CAAK,IAAA,CAAK,YAAY,SAAS,CAAA;AAEzF,IAAA,IAAI,CAAC,UAAA,CAAW,GAAG,CAAA,EAAG;AAAC,MAAA,OAAO,IAAA;AAAA,IAAK;AACnC,IAAA,OAAY,MAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,GAAI,GAAA,GAAM,SAAA;AAAA,EAC3C;AAAA,EAEQ,mBAAmB,QAAA,EAAiC;AAC1D,IAAA,IAAI,CAAC,QAAA,CAAS,QAAA,CAAS,KAAK,CAAA,EAAG;AAAC,MAAA,OAAO,IAAA;AAAA,IAAK;AAE5C,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AACjC,IAAA,KAAA,MAAW,GAAA,IAAO,CAAC,KAAA,EAAO,MAAM,CAAA,EAAG;AACjC,MAAA,MAAM,YAAY,IAAA,GAAO,GAAA;AACzB,MAAA,MAAM,GAAA,GAAW,kBAAW,SAAS,CAAA,GAAI,YAAiB,MAAA,CAAA,IAAA,CAAK,IAAA,CAAK,YAAY,SAAS,CAAA;AACzF,MAAA,IAAI,UAAA,CAAW,GAAG,CAAA,EAAG;AACnB,QAAA,OAAY,MAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,GAAI,GAAA,GAAM,SAAA;AAAA,MAC3C;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAIQ,oBAAA,CACN,QAAA,EACA,cAAA,EACA,IAAA,EACQ;AACR,IAAA,MAAM,YAAY,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,QAAQ,KAAK,CAAA,IAAK,CAAA;AAC9D,IAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,QAAA,EAAU,QAAQ,CAAA;AAG5C,IAAA,IAAI,cAAA,IAAkB,kBAAkB,GAAA,EAAK;AAC3C,MAAA,OAAO,IAAA,CAAK,GAAA,CAAI,cAAA,EAAgB,cAAc,CAAA;AAAA,IAChD;AAGA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,gBAAA,CAAiB,QAAQ,CAAA;AAChD,IAAA,IAAI,QAAA,GAAmB,cAAA,CAAe,IAAmC,CAAA,IAAK,cAAA,CAAe,MAAA;AAE7F,IAAA,IAAI,cAAc,IAAA,EAAM;AACtB,MAAA,IAAI,aAAa,oBAAA,EAAsB;AAErC,QAAA,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,cAAA,EAAgB,SAAS,CAAA;AAAA,MAC/C,CAAA,MAAA,IAAW,aAAa,GAAA,EAAM;AAC5B,QAAA,QAAA,GAAW,yBAAA,CAA0B,IAA8C,CAAA,IAAK,yBAAA,CAA0B,MAAA;AAAA,MACpH,CAAA,MAAA,IAAW,aAAa,IAAA,EAAM;AAC5B,QAAA,QAAA,GAAW,uBAAA,CAAwB,IAA4C,CAAA,IAAK,uBAAA,CAAwB,MAAA;AAAA,MAC9G;AAAA,IACF;AAGA,IAAA,IAAI,YAAY,CAAA,EAAG;AACjB,MAAA,QAAA,GAAW,KAAK,GAAA,CAAI,cAAA,EAAgB,KAAK,KAAA,CAAM,QAAA,GAAW,GAAG,CAAC,CAAA;AAAA,IAChE,CAAA,MAAA,IAAW,YAAY,CAAA,EAAG;AACxB,MAAA,QAAA,GAAW,KAAK,GAAA,CAAI,cAAA,EAAgB,KAAK,KAAA,CAAM,QAAA,GAAW,GAAG,CAAC,CAAA;AAAA,IAChE;AAGA,IAAA,IAAI,cAAA,IAAkB,iBAAiB,CAAA,EAAG;AACxC,MAAA,OAAO,KAAK,GAAA,CAAI,cAAA,EAAgB,KAAK,GAAA,CAAI,cAAA,EAAgB,QAAQ,CAAC,CAAA;AAAA,IACpE;AAEA,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,cAAA,EAAgB,QAAQ,CAAA;AAAA,EAC1C;AAAA,EAEQ,iBAAiB,QAAA,EAAiC;AACxD,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAW,kBAAW,QAAQ,CAAA,GAAI,WAAgB,MAAA,CAAA,IAAA,CAAK,IAAA,CAAK,YAAY,QAAQ,CAAA;AACtF,MAAA,MAAM,IAAA,GAAUE,aAAS,GAAG,CAAA;AAC5B,MAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAO,EAAG;AAAC,QAAA,OAAO,IAAA;AAAA,MAAK;AAEjC,MAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAA,GAAO,EAAE,CAAA;AAAA,IACjC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA,EAIQ,wBAAwB,KAAA,EAAsC;AACpE,IAAA,IAAI,OAAO,KAAA,CAAM,SAAA,KAAc,QAAA,EAAU;AAAC,MAAA;AAAA,IAAO;AAEjD,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,SAAA,CAAU,IAAA,EAAK;AACjC,IAAA,IAAI,CAAC,GAAA,IAAO,GAAA,KAAQ,GAAA,EAAK;AAAC,MAAA;AAAA,IAAO;AAEjC,IAAA,MAAM,GAAA,GAAW,kBAAW,GAAG,CAAA,GAAI,MAAW,MAAA,CAAA,OAAA,CAAQ,IAAA,CAAK,YAAY,GAAG,CAAA;AAE1E,IAAA,IAAI,UAAA,CAAW,GAAG,CAAA,EAAG;AACnB,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAUA,aAAS,GAAG,CAAA;AAC5B,QAAA,IAAI,IAAA,CAAK,QAAO,EAAG;AAEjB,UAAA,MAAM,MAAW,MAAA,CAAA,QAAA,CAAS,IAAA,CAAK,UAAA,EAAiB,MAAA,CAAA,OAAA,CAAQ,GAAG,CAAC,CAAA;AAC5D,UAAA,KAAA,CAAM,SAAA,GAAa,CAAC,GAAA,IAAO,GAAA,KAAQ,GAAA,GAAO,MAAO,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA,GAAI,GAAA,GAAM,GAAA;AAAA,QAChF;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAAsB;AAC9B,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,eAAA,CAAgB,IAAA,CAAK,GAAG,CAAA,EAAG;AAC7B,MAAA,MAAM,SAAA,GAAiB,eAAQ,GAAG,CAAA;AAClC,MAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,QAAA,IAAI;AACF,UAAA,IAAOA,GAAA,CAAA,QAAA,CAAS,SAAS,CAAA,CAAE,WAAA,EAAY,EAAG;AACxC,YAAA,MAAM,GAAA,GAAW,MAAA,CAAA,QAAA,CAAS,IAAA,CAAK,UAAA,EAAY,SAAS,CAAA;AACpD,YAAA,KAAA,CAAM,SAAA,GAAa,CAAC,GAAA,IAAO,GAAA,KAAQ,GAAA,GAAO,MAAO,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA,GAAI,GAAA,GAAM,GAAA;AAAA,UAChF;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAAsB;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AACF,CAAA;AAIA,SAAS,WAAW,CAAA,EAAoB;AACtC,EAAA,IAAI;AACF,IAAGA,eAAW,CAAC,CAAA;AACf,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEO,SAAS,oBAAoB,QAAA,EAA2B;AAC7D,EAAA,MAAM,aAAa,QAAA,CAAS,OAAA,CAAQ,KAAA,EAAO,GAAG,EAAE,WAAA,EAAY;AAC5D,EAAA,OACE,UAAA,CAAW,QAAA,CAAS,QAAQ,CAAA,IACzB,UAAA,CAAW,QAAA,CAAS,SAAS,CAAA,IAC7B,UAAA,CAAW,QAAA,CAAS,MAAM,CAAA,IAC1B,WAAW,QAAA,CAAS,SAAS,CAAA,IAC7B,UAAA,CAAW,QAAA,CAAS,SAAS,CAAA,IAC7B,UAAA,CAAW,QAAA,CAAS,MAAM,CAAA,IAC1B,UAAA,CAAW,QAAA,CAAS,OAAO,CAAA,IAC3B,UAAA,CAAW,SAAS,MAAM,CAAA;AAEjC;;;AP1PA,oBAAA,EAAA;AACA,oBAAA,EAAA;AAGA,0BAAA,EAAA;AAMA,IAAM,UAAA,GAAwB,CAAC,OAAA,EAAS,QAAA,EAAU,OAAO,CAAA;AAEzD,SAAS,SAAS,OAAA,EAAuC;AACvD,EAAA,MAAM,GAAA,GAAM,UAAA,CAAW,OAAA,CAAQ,OAAO,CAAA;AACtC,EAAA,OAAO,GAAA,IAAO,KAAK,GAAA,GAAM,UAAA,CAAW,SAAS,CAAA,GAAI,UAAA,CAAW,GAAA,GAAM,CAAC,CAAA,GAAI,MAAA;AACzE;AAyBO,IAAM,cAAA,GAAN,MAAM,eAAA,CAAuC;AAAA,EASlD,WAAA,CACmB,QACA,GAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAEjB,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA,CAAO,OAAA,IAAWL,UAAAA,EAAW;AAC5C,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAI,eAAA,EAAgB;AAG3C,IAAA,IAAI,OAAO,WAAA,EAAa;AACtB,MAAA,MAAA,CAAO,YAAY,gBAAA,CAAiB,OAAA,EAAS,MAAM,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAA;AAAA,IACjF;AAAA,EACF;AAAA,EAnBS,OAAA;AAAA,EAEQ,eAAA;AAAA,EACA,mBAAiC,EAAC;AAAA,EAClC,iBAAA,GAAoB,IAAI,iBAAA,EAAkB;AAAA;AAAA,EAEnD,WAAA,GAAc,CAAA;AAAA;AAAA,EAiBtB,MAAM,QAAQ,IAAA,EAAmC;AAC/C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,IAAA,IAAQ,SAAA;AAGvC,IAAA,IAAI,SAAS,SAAA,EAAW;AACtB,MAAA,OAAO,IAAA,CAAK,mBAAmB,IAAI,CAAA;AAAA,IACrC;AAIA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,SAAA,IAAa,IAAA,CAAK,OAAO,UAAA,EAAY;AACnD,MAAA,MAAM,EAAE,cAAA,EAAAM,eAAAA,EAAe,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,oBAAA,EAAA,EAAA,uBAAA,CAAA,CAAA;AACjC,MAAA,MAAM,EAAE,QAAA,EAAU/C,IAAAA,EAAG,GAAI,MAAM,OAAO,IAAS,CAAA;AAC/C,MAAA,IAAI;AACF,QAAA,MAAM,cAAA,GAAiB,IAAI+C,eAAAA,CAAe,IAAA,CAAK,OAAO,UAAU,CAAA;AAChE,QAAA,MAAM,QAAA,GAAW,cAAA,CAAe,kBAAA,CAAmB,IAAA,CAAK,OAAO,SAAS,CAAA;AACxE,QAAA,MAAM,GAAA,GAAM,MAAM/C,IAAAA,CAAG,QAAA,CAAS,UAAU,OAAO,CAAA;AAC/C,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC3B,QAAA,IAAI,IAAA,CAAK,MAAA,KAAW,UAAA,IAAc,IAAA,CAAK,WAAW,OAAA,EAAS;AACzD,UAAA,OAAO,IAAA,CAAK,mBAAmB,IAAI,CAAA;AAAA,QACrC;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,OAAO,IAAA,CAAK,eAAe,IAAI,CAAA;AAAA,EACjC;AAAA,EAEA,WAAA,GAAoB;AAClB,IAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAAA,EAC7B;AAAA,EAEA,kBAAkB,OAAA,EAAuB;AACvC,IAAA,IAAA,CAAK,iBAAiB,IAAA,CAAK,EAAE,MAAM,MAAA,EAAQ,OAAA,EAAS,SAAS,CAAA;AAAA,EAC/D;AAAA;AAAA,EAIA,MAAc,eAAe,IAAA,EAAmC;AAC9D,IAAA,IAAA,CAAK,kBAAkB,KAAA,EAAM;AAC7B,IAAA,MAAM,SAAA,GAAqB,IAAA,CAAK,MAAA,CAAO,IAAA,IAAQ,QAAA;AAC/C,IAAA,IAAI,WAAA,GAAc,SAAA;AAClB,IAAA,IAAI,SAAA,GAAY,CAAA;AAChB,IAAA,IAAI,mBAAA,GAAsB,CAAA;AAC1B,IAAA,IAAI,kBAAA,GAAqB,CAAA;AACzB,IAAA,IAAI,sBAAA,GAAyB,CAAA;AAC7B,IAAA,IAAI,mBAAA,GAAsB,CAAA;AAC1B,IAAA,IAAI,eAAA,GAAkB,CAAA;AACtB,IAAA,IAAI,mBAAA,GAAsB,CAAA;AAC1B,IAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAClC,IAAA,MAAM,aAAA,uBAAoB,GAAA,EAAY;AACtC,IAAA,MAAM,YAAA,uBAAmB,GAAA,EAAY;AAErC,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,eAAA,CAAgB,MAAM,WAAW,CAAA;AAC3D,MAAA,SAAA,IAAa,CAAA;AACb,MAAA,mBAAA,IAAuB,OAAO,QAAA,CAAS,UAAA;AACvC,MAAA,kBAAA,IAAsB,OAAO,QAAA,CAAS,cAAA;AACtC,MAAA,sBAAA,IAA0B,OAAO,QAAA,CAAS,gBAAA;AAC1C,MAAA,mBAAA,IAAuB,OAAO,QAAA,CAAS,cAAA;AACvC,MAAA,eAAA,IAAmB,MAAA,CAAO,UAAA;AAC1B,MAAA,mBAAA,IAAuB,MAAA,CAAO,UAAA;AAC9B,MAAA,KAAA,MAAWC,MAAAA,IAAQ,OAAO,SAAA,EAAW;AAAC,QAAA,SAAA,CAAU,IAAIA,MAAI,CAAA;AAAA,MAAE;AAC1D,MAAA,KAAA,MAAWA,MAAAA,IAAQ,OAAO,aAAA,EAAe;AAAC,QAAA,aAAA,CAAc,IAAIA,MAAI,CAAA;AAAA,MAAE;AAClE,MAAA,KAAA,MAAWA,MAAAA,IAAQ,OAAO,YAAA,EAAc;AAAC,QAAA,YAAA,CAAa,IAAIA,MAAI,CAAA;AAAA,MAAE;AAEhE,MAAA,IAAI,OAAO,UAAA,EAAY;AACrB,QAAA,MAAM,IAAA,GAAO,SAAS,WAAW,CAAA;AACjC,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,MAAM,SAAS,SAAA,EAAU;AACzB,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,6BAAA,EAAgC,WAAW,CAAA,QAAA,EAAM,IAAI,CAAA,CAAE,CAAA;AACnE,UAAA,MAAM,IAAA,CAAK,oBAAA;AAAA,YACT,WAAA;AAAA,YACA,IAAA;AAAA,YACA,MAAA,CAAO,qBAAqB,MAAA,CAAO,OAAA;AAAA,YACnC,MAAA,CAAO,UAAA;AAAA,YACP;AAAA,WACF;AACA,UAAA,IAAA,CAAK,OAAO,OAAA,GAAU;AAAA,YACpB,IAAA,EAAM,eAAA;AAAA,YACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,YAClC,SAAS,IAAA,CAAK,OAAA;AAAA,YACd,IAAA,EAAM,EAAE,MAAA,EAAQ,YAAA,EAAc,SAAS,CAAA,iBAAA,EAAoB,WAAW,CAAA,QAAA,EAAM,IAAI,CAAA,CAAA;AAAG,WAC7E,CAAA;AACR,UAAA,WAAA,GAAc,IAAA;AACd,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,EAAE,YAAY+C,EAAAA,EAAG,iBAAA,EAAmBC,KAAI,QAAA,EAAUC,IAAAA,EAAK,GAAGC,WAAAA,EAAW,GAAI,MAAA;AAC/E,QAAA,MAAMC,YAAAA,GAA0B;AAAA,UAC9B,GAAGD,WAAAA;AAAA,UACH,UAAA,EAAY,mBAAA;AAAA,UACZ,UAAA,EAAY,eAAA;AAAA,UACZ,SAAA,EAAW,CAAC,GAAG,SAAS,CAAA;AAAA,UACxB,aAAA,EAAe,CAAC,GAAG,aAAa,CAAA;AAAA,UAChC,YAAA,EAAc,CAAC,GAAG,YAAY;AAAA,SAChC;AACA,QAAA,MAAM,KAAK,WAAA,CAAY,IAAA,EAAM,SAAA,EAAW,WAAA,EAAa,WAAWC,YAAAA,EAAa;AAAA,UAC3E,UAAA,EAAY,mBAAA;AAAA,UACZ,cAAA,EAAgB,kBAAA;AAAA,UAChB,gBAAA,EAAkB,sBAAA;AAAA,UAClB,cAAA,EAAgB;AAAA,SACjB,CAAA;AACD,QAAA,OAAOA,YAAAA;AAAA,MACT;AAEA,MAAA,MAAM,EAAE,YAAY,CAAA,EAAG,iBAAA,EAAmB,IAAI,QAAA,EAAU,GAAA,EAAK,GAAG,UAAA,EAAW,GAAI,MAAA;AAC/E,MAAA,MAAM,WAAA,GAA0B;AAAA,QAC9B,GAAG,UAAA;AAAA,QACH,UAAA,EAAY,mBAAA;AAAA,QACZ,UAAA,EAAY,eAAA;AAAA,QACZ,SAAA,EAAW,CAAC,GAAG,SAAS,CAAA;AAAA,QACxB,aAAA,EAAe,CAAC,GAAG,aAAa,CAAA;AAAA,QAChC,YAAA,EAAc,CAAC,GAAG,YAAY;AAAA,OAChC;AACA,MAAA,MAAM,KAAK,WAAA,CAAY,IAAA,EAAM,SAAA,EAAW,WAAA,EAAa,WAAW,WAAA,EAAa;AAAA,QAC3E,UAAA,EAAY,mBAAA;AAAA,QACZ,cAAA,EAAgB,kBAAA;AAAA,QAChB,gBAAA,EAAkB,sBAAA;AAAA,QAClB,cAAA,EAAgB;AAAA,OACjB,CAAA;AACD,MAAA,OAAO,WAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA,EAIA,MAAc,eAAA,CACZ,IAAA,EACA,IAAA,EACqB;AACrB,IAAA,MAAM,SAAS,SAAA,EAAU;AACzB,IAAA,MAAM,aAAA,GAAgB,KAAK,GAAA,EAAI;AAC/B,IAAA,IAAI,gBAAA,GAAmB,CAAA;AACvB,IAAA,IAAI,cAAA,GAAiB,CAAA;AACrB,IAAA,IAAI,cAAA,GAAiB,CAAA;AACrB,IAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,IAAA,MAAM,YAAA,GAAe,KAAK,MAAA,CAAO,SAAA,GAC7B,IAAI1C,oBAAAA,CAAqB,IAAA,CAAK,MAAA,CAAO,UAAU,CAAA,GAC/C,IAAA;AACJ,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,MAAA,CAAO,SAAA,IAAa,YAAA,GAC3C,IAAI,aAAA,CAAc,IAAA,CAAK,GAAA,EAAK,YAAY,CAAA,GACxC,IAAA;AAGJ,IAAA,MAAM,GAAA,GAAM2B,MAAAA,CAAO,EAAE,IAAA,EAAM,CAAA;AAC3B,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACvB,MAAA,OAAO,IAAA,CAAK,WAAA;AAAA,QACV,IAAA,CAAK,UAAA,CAAW,CAAA,UAAA,EAAa,IAAI,mDAAmD,CAAC,CAAA;AAAA,QACrF,EAAE,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,aAAA,EAAe,cAAA,EAAgB,CAAA,EAAG,gBAAA,EAAkB,CAAA,EAAG,cAAA,EAAgB,CAAA;AAAE,OACtG;AAAA,IACF;AAGA,IAAA,MAAM,WAAA,GAAc,IAAI,WAAA,CAAY;AAAA,MAClC,OAAA,EAAS,CAAC,QAAA,EAAU,MAAA,EAAQ,KAAA,KAAU;AACpC,QAAA,MAAA,EAAQ,KAAA,GAAQ,CAAA,aAAA,EAAgB,MAAM,CAAA,MAAA,EAAS,QAAQ,UAAU,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,MAC1F;AAAA,KACD,CAAA;AAED,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO;AACjC,MAAA,WAAA,CAAY,SAAS,IAAI,CAAA;AAAA,IAC3B;AAGA,IAAA,MAAM,SAAS,IAAI,cAAA,CAAe,EAAE,aAAA,EAAe,GAAG,CAAA;AACtD,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,aAAA,EAAe;AAC9B,MAAA,MAAA,CAAO,WAAW,CAAC,GAAA,KAAQ,IAAA,CAAK,eAAA,CAAgB,GAAG,CAAC,CAAA;AACpD,MAAA,WAAA,CAAY,QAAA,CAAS,uBAAA,CAAwB,MAAM,CAAC,CAAA;AAAA,IACtD;AAEA,IAAA,MAAM,YAAY,aAAA,EAAc;AAGhC,IAAA,IAAI,KAAK,MAAA,CAAO,YAAA,IAAgB,KAAK,MAAA,CAAO,YAAA,CAAa,SAAS,CAAA,EAAG;AACnE,MAAA,WAAA,CAAY,cAAA,CAAe,IAAA,CAAK,MAAA,CAAO,YAAY,CAAA;AAAA,IACrD;AAGA,IAAA,MAAM,cAAA,GAAiB,IAAI,mBAAA,CAAoB;AAAA,MAC7C,UAAA,EAAY,KAAK,MAAA,CAAO;AAAA,KACzB,CAAA;AACD,IAAA,MAAM,eAAe,IAAI,YAAA;AAAA,MACvB,WAAA;AAAA,MACA,KAAK,GAAA,CAAI,MAAA;AAAA,MACT,KAAK,GAAA,CAAI,gBAAA;AAAA,MACT,CAAC,cAAA,EAAgB,GAAG,IAAA,CAAK,IAAI,gBAAgB;AAAA,KAC/C;AAKA,IAAA,IAAA,CAAK,WAAA,GAAc,CAAA;AAGnB,IAAA,MAAM,mBAAA,GAA8C,CAAC,KAAA,KAAU;AAC7D,MAAA,IAAI,aAAA,IAAiB,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW;AAC1C,QAAA,KAAK,aAAA,CAAc,WAAA,CAAY,EAAE,GAAG,KAAA,EAAO,SAAA,EAAW,KAAA,CAAM,SAAA,IAAa,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW,CAAA;AAAA,MAClG;AACA,MAAA,KAAK,IAAA,CAAK,MAAA,CAAO,OAAA,GAAU,KAAK,CAAA;AAAA,IAClC,CAAA;AAEA,IAAA,MAAM,kBAAkB,IAAI,uBAAA;AAAA,MAC1B,IAAA,CAAK,OAAA;AAAA,MACL,KAAK,MAAA,CAAO,aAAA;AAAA,MACZ,KAAK,MAAA,CAAO,SAAA;AAAA,MACZ;AAAA,KACF;AAKA,IAAA,MAAM,SAAA,GAAY,KAAK,MAAA,CAAO,WAAA;AAC9B,IAAA,MAAM,gBAAA,GAAmB,GAAA;AACzB,IAAA,MAAM,WAAW,IAAI,gBAAA;AAAA,MACnB;AAAA,QACE,MAAA,EAAQ,IAAA;AAAA,QACR,SAAA,EAAW,WAAW,SAAA,IAAa,gBAAA;AAAA,QACnC,cAAA,EAAgB,WAAW,cAAA,IAAkB,GAAA;AAAA,QAC7C,cAAA,EAAgB,WAAW,cAAA,IAAkB,CAAA;AAAA,QAC7C,QAAA,EAAU,WAAW,QAAA,IAAY,KAAA;AAAA,QACjC,yBAAA,EAA2B,WAAW,yBAAA,IAA6B;AAAA,OACrE;AAAA,MACA,MAAM,IAAA,CAAK;AAAA,KACb;AAGA,IAAA,MAAM,eAAA,GAAkB,IAAI,uBAAA,CAAwB;AAAA,MAClD,eAAA,EAAiB,GAAA;AAAA,MACjB,iBAAA,EAAmB,EAAA;AAAA,MACnB,gBAAA,EAAkB;AAAA,KACnB,CAAA;AAGD,IAAA,MAAM,WAAA,GAAc,IAAI,mBAAA,CAAoB;AAAA,MAC1C,UAAA,EAAY,IAAA,CAAK,MAAA,CAAO,SAAA,GACpB,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,UAAU,CAAA,qBAAA,EAAwB,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,CAAA,GACtE,MAAA;AAAA,MACJ,qBAAA,EAAuB;AAAA,KACxB,CAAA;AAGD,IAAA,MAAM,gBAAA,GAAmB,IAAI,wBAAA,CAAyB;AAAA,MACpD,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,SAAA,EAAW,KAAK,MAAA,CAAO,SAAA;AAAA,MACvB,UAAA,EAAY,KAAK,MAAA,CAAO;AAAA,KACzB,CAAA;AAGD,IAAA,MAAM,UAAA,GAAa,IAAI,kBAAA,CAAmB,CAAA,EAAG;AAAA,MAC3C,OAAA,EAAS,CAAC,SAAA,EAAW,KAAA,KAAU;AAC7B,QAAA,MAAA,EAAQ,IAAA,GAAO,CAAA,8BAAA,EAAiC,SAAS,CAAA,EAAA,EAAK,KAAK,CAAA,wBAAA,CAA0B,CAAA;AAAA,MAC/F,CAAA;AAAA,MACA,MAAA,EAAQ,CAAC,SAAA,EAAW,KAAA,KAAU;AAC5B,QAAA,MAAA,EAAQ,IAAA,GAAO,yCAAyC,SAAS,CAAA,EAAA,EAAK,MAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,MAC1F;AAAA,KACD,CAAA;AACD,IAAA,MAAM,SAAA,GAAY,KAAK,YAAA,EAAa;AACpC,IAAA,MAAM,WAAA,GAAc,IAAI,mBAAA,CAAoB;AAAA,MAC1C,aAAA,EAAe,CAAC,OAAA,KAAY;AAC1B,QAAA,cAAA,IAAkB,CAAA;AAClB,QAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,UAAA,gBAAA,IAAoB,CAAA;AAAA,QACtB,CAAA,MAAO;AACL,UAAA,cAAA,IAAkB,CAAA;AAAA,QACpB;AACA,QAAA,IAAA,CAAK,iBAAA,CAAkB,gBAAA;AAAA,UACrB;AAAA,YACE,UAAU,OAAA,CAAQ,QAAA;AAAA,YAClB,SAAS,OAAA,CAAQ,OAAA;AAAA,YACjB,UAAA,EAAY,QAAQ,UAAA,IAAc,CAAA;AAAA,YAClC,WAAW,OAAA,CAAQ;AAAA,WACrB;AAAA,UACA;AAAA,YACE,SAAA;AAAA,YACA,iBAAiB,sBAAA,CAAuB,WAAA;AAAA,YACxC,GAAA,EAAK,CAAC,GAAA,KAAgB,MAAA,EAAQ,OAAO,GAAG;AAAA;AAC1C,SACF;AAAA,MACF,CAAA;AAAA,MACA,aAAA,EAAe,CAAC,OAAA,KAAY;AAC1B,QAAA,aAAA,GAAgB,OAAA,CAAQ,UAAA;AAAA,MAC1B;AAAA,KACD,CAAA;AAID,IAAA,MAAM,YAAA,GAAe;AAAA,MACnB,aAAA,EAAe,IAAA;AAAA,MAAM,QAAA,EAAU,IAAA;AAAA,MAAM,YAAA,EAAc,IAAA;AAAA,MACnD,UAAA,EAAY,IAAA;AAAA,MAAM,cAAA,EAAgB,IAAA;AAAA,MAAM,eAAA,EAAiB,IAAA;AAAA,MACzD,cAAA,EAAgB;AAAA,KAClB;AACA,IAAA,MAAM,WAAW,IAAI,kBAAA;AAAA,MACnB,CAAC,eAAA,EAAiB,gBAAA,EAAkB,QAAA,EAAU,eAAA,EAAiB,WAAA,EAAa,MAAA,EAAQ,UAAA,EAAY,WAAA,EAAa,GAAG,IAAA,CAAK,GAAA,CAAI,WAAW,CAAA;AAAA,MACpI;AAAA,QACE,YAAA;AAAA,QACA,OAAA,EAAS,CAAC,cAAA,EAAgB,QAAA,EAAU,KAAA,KAAU;AAC5C,UAAA,MAAM,MAAM,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACjE,UAAA,MAAA,EAAQ,OAAO,CAAA,aAAA,EAAgB,cAAc,IAAI,QAAQ,CAAA,qBAAA,EAAwB,GAAG,CAAA,CAAE,CAAA;AAAA,QACxF;AAAA;AACF,KACF;AAGA,IAAA,MAAM,YAAYI,UAAAA,EAAW;AAC7B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,aAAA,CAAc,WAAW,CAAA;AAE5C,IAAA,MAAM,EAAE,GAAA,EAAK,QAAA,EAAS,GAAI,gBAAA,CAAiB;AAAA,MACzC,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,IAAA;AAAA,MACA,KAAA;AAAA,MACA,iBAAiB,IAAA,CAAK,eAAA;AAAA,MACtB;AAAA,KACD,CAAA;AACD,IAAC,IAAyB,IAAA,GAAO,IAAA;AAGjC,IAAA,MAAM,kBAAA,GAAqB,MAAM,iBAAA,CAAkB,IAAA,CAAK,OAAO,UAAU,CAAA,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAC3F,IAAA,MAAM,cAAA,GAAiB,KAAK,MAAA,CAAO,SAAA,GAC/B,IAAI,cAAA,CAAe,IAAA,CAAK,MAAA,CAAO,UAAU,CAAA,GACzC,IAAA;AACJ,IAAA,IAAI,aAAA,IAAiB,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW;AAC1C,MAAA,MAAM,cAAc,kBAAA,CAAmB;AAAA,QACrC,SAAA,EAAW,KAAK,MAAA,CAAO,SAAA;AAAA,QACvB,UAAA,EAAY,KAAK,MAAA,CAAO,UAAA;AAAA,QACxB,IAAA,EAAM,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,IAAA;AAAA,QACxB;AAAA,OACD,CAAA;AAAA,IACH;AACA,IAAA,MAAM,eAAe,aAAA,GACjB,MAAM,cAAc,sBAAA,CAAuB,EAAE,CAAA,GAC7C,IAAA;AACJ,IAAA,IAAI,aAAA,IAAiB,YAAA,IAAgB,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW;AAC1D,MAAA,MAAM,cAAc,WAAA,CAAY;AAAA,QAC9B,SAAA,EAAW,KAAK,MAAA,CAAO,SAAA;AAAA,QACvB,IAAA,EAAM,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,IAAA;AAAA,QACxB,SAAS,YAAA,CAAa,MAAA;AAAA,QACtB,WAAW,YAAA,CAAa;AAAA,OACzB,CAAA;AACD,MAAA,MAAM,YAAA,GAA2B;AAAA,QAC/B,OAAA,EAAS,IAAA;AAAA,QACT,SAAS,YAAA,CAAa,MAAA;AAAA,QACtB,cAAc,EAAC;AAAA,QACf,eAAe,EAAC;AAAA,QAChB,WAAW,YAAA,CAAa,SAAA;AAAA,QACxB,UAAA,EAAY,CAAA;AAAA,QACZ,UAAA,EAAY,CAAA;AAAA,QACZ,SAAA,EAAW,KAAK,MAAA,CAAO;AAAA,OACzB;AACA,MAAA,OAAO,IAAA,CAAK,YAAY,YAAA,EAAc;AAAA,QACpC,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,aAAA;AAAA,QACzB,cAAA,EAAgB,CAAA;AAAA,QAChB,gBAAA,EAAkB,CAAA;AAAA,QAClB,cAAA,EAAgB;AAAA,OACjB,CAAA;AAAA,IACH;AACA,IAAA,MAAM,iBAAA,GAAoB,CAAC,CAAC,IAAA,CAAK,MAAA,CAAO,SAAA;AACxC,IAAA,MAAM,wBAAwB,iBAAA,IAAqB,IAAA,CAAK,MAAA,CAAO,SAAA,IAAa,iBACxE,MAAM,cAAA,CAAe,wBAAA,CAAyB,IAAA,CAAK,OAAO,SAAS,CAAA,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA,GACnF,EAAA;AACJ,IAAA,MAAM,mBAAmB,IAAA,CAAK,MAAA,CAAO,SAAA,IAAa,cAAA,IAAkB,KAAK,wBAAA,CAAyB,IAAI,CAAA,GAClG,MAAM,KAAK,mBAAA,CAAoB,cAAA,EAAgB,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,GACpE,EAAA;AACJ,IAAA,MAAM,uBAAuB,aAAA,GACzB,MAAM,cAAc,aAAA,CAAc,EAAE,CAAA,GACpC,EAAA;AAEJ,IAAA,MAAM,aAAA,GAAgB,IAAI,mBAAA,EAAoB;AAC9C,IAAA,MAAM,YAAA,GAAe,MAAM,aAAA,CAAc,KAAA,CAAM;AAAA,MAC7C,UAAA,EAAY,KAAK,MAAA,CAAO,UAAA;AAAA,MACxB,YAAA,EAAc,MAAA;AAAA,MACd,UAAA,EAAY,CAAC,CAAC,IAAA,CAAK,MAAA,CAAO,aAAA;AAAA,MAC1B,SAAA,EAAW,KAAK,MAAA,CAAO,SAAA;AAAA,MACvB,WAAA,EAAa,IAAA;AAAA,MACb,oBAAoB,kBAAA,IAAsB,MAAA;AAAA,MAC1C,kBAAA,EAAoB,CAAC,oBAAA,EAAsB,gBAAA,EAAkB,qBAAqB,CAAA,CAC/E,MAAA,CAAO,OAAO,CAAA,CACd,IAAA,CAAK,MAAM,CAAA,IAAK;AAAA,KACpB,CAAA;AAGD,IAAA,QAAA,CAAS,KAAK,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,cAAc,CAAA;AAEvD,IAAA,MAAM,kBAAkB,iBAAA,GAAoB,MAAM,KAAK,wBAAA,CAAyB,IAAI,IAAI,EAAC;AACzF,IAAA,QAAA,CAAS,IAAA,CAAK,GAAG,eAAe,CAAA;AAEhC,IAAA,QAAA,CAAS,KAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,MAAM,CAAA;AAG7C,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,gBAAA,EAAkB;AACvC,MAAA,QAAA,CAAS,KAAK,GAAG,CAAA;AAAA,IACnB;AAGA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,IAAQ,IAAI,mBAAA,EAAoB;AAEtD,IAAA,MAAM,UAAU,IAAI,eAAA;AAAA,MAClB,GAAA;AAAA,MACA,QAAA;AAAA,MACA,GAAA;AAAA,MACA,QAAA;AAAA,MACA,YAAA;AAAA,MACA,CAAC,KAAA,KAAU;AAAE,QAAA,IAAA,CAAK,WAAA,IAAe,KAAA;AAAA,MAAO,CAAA;AAAA,MACxC,OAAO,WAAW,QAAA,KAAa;AAC7B,QAAA,MAAM,wBAAA,GAA2B,aAAA,EAAe,gBAAA,EAAiB,EAAG,iBAAiB,EAAC;AACtF,QAAA,MAAM,UAAA,GAAa;AAAA,UACjB,GAAG,wBAAA;AAAA,UACH,GAAG,KAAK,GAAA,CAAI,aAAA;AAAA,UACZ,yBAAA;AAA0B,SAC5B;AACA,QAAA,IAAI,IAAA,GAAmE,IAAA;AACvE,QAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,UAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,QAAA,CAAS,EAAE,GAAA,EAAK,SAAA,EAAW,UAAU,CAAA;AACpE,UAAA,IAAI,CAAC,MAAA,EAAQ;AACX,YAAA;AAAA,UACF;AACA,UAAA,IAAI,CAAC,IAAA,IAAQ,MAAA,CAAO,cAAA,IAAkB,KAAK,cAAA,EAAgB;AACzD,YAAA,IAAA,GAAO,MAAA;AAAA,UACT;AAAA,QACF;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACF;AAGA,IAAA,eAAA,CAAgB,SAAA,GAAY;AAAA,MAC1B,MAAA,EAAQ;AAAA,QACN,SAAA,EAAW,QAAA,CAAS,QAAQ,CAAA,CAAE,SAAA;AAAA,QAC9B,cAAA,EAAgB,QAAA,CAAS,QAAQ,CAAA,CAAE,cAAA;AAAA,QACnC,cAAA,EAAgB,QAAA,CAAS,QAAQ,CAAA,CAAE;AAAA,OACrC;AAAA,MACA,iBAAA,EAAmB,kBAAA,EAAoB,KAAA,CAAM,GAAA,CAAI,CAAA,CAAA,KAAK;AACpD,QAAA,MAAM,GAAA,GAAM,EAAE,IAAA,CAAK,OAAA,CAAQ,KAAK,MAAA,CAAO,UAAA,GAAa,GAAA,EAAK,EAAE,CAAA,IAAK,GAAA;AAChE,QAAA,OAAO,GAAG,GAAG,CAAA,EAAA,EAAK,EAAE,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,MACxC,CAAC,CAAA;AAAA,MACD,UAAA,EAAY,KAAK,MAAA,CAAO;AAAA,KAC1B;AAEA,IAAA,MAAM,QAAA,CAAS,QAAQ,GAAG,CAAA;AAE1B,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA;AAGzC,IAAA,IAAI,UAAA,CAAW,YAAY,UAAA,EAAY;AACrC,MAAA,MAAM,QAAA,CAAS,MAAA,CAAO,GAAA,EAAK,UAAU,CAAA;AACrC,MAAA,OAAO,KAAK,WAAA,CAAY;AAAA,QACtB,GAAG,KAAK,UAAA,CAAW,CAAA,yBAAA,EAA4B,WAAW,MAAM,CAAA,CAAA,EAAI,IAAI,SAAS,CAAA;AAAA,QACjF,UAAA,EAAY,IAAA;AAAA,QACZ,mBAAmB,UAAA,CAAW;AAAA,OAChC,EAAG;AAAA,QACD,UAAA,EAAY,aAAA,IAAkB,IAAA,CAAK,GAAA,EAAI,GAAI,aAAA;AAAA,QAC3C,cAAA;AAAA,QACA,gBAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH;AAIA,IAAA,IAAI,UAAA,CAAW,YAAY,SAAA,EAAW;AACpC,MAAA,MAAM,QAAA,CAAS,MAAA,CAAO,GAAA,EAAK,SAAS,CAAA;AACpC,MAAA,MAAM,YAAY,UAAA,EAAW;AAC7B,MAAA,OAAO,IAAA,CAAK,YAAY,IAAA,CAAK,UAAA;AAAA,QAC3B,CAAA,4BAAA,EAA+B,WAAW,OAAO,CAAA,mCAAA,CAAA;AAAA,QACjD,GAAA,CAAI;AAAA,OACN,EAAG;AAAA,QACD,UAAA,EAAY,aAAA,IAAkB,IAAA,CAAK,GAAA,EAAI,GAAI,aAAA;AAAA,QAC3C,cAAA;AAAA,QACA,gBAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,SAAS,UAAA,CAAW,MAAA;AAG1B,IAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,MAAA,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,aAAA,EAAe,OAAO,MAAM,CAAA;AAAA,IACpD;AAEA,IAAA,MAAM,QAAA,CAAS,MAAA,CAAO,GAAA,EAAK,MAAA,CAAO,UAAU,CAAA;AAC5C,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,MAAM,QAAA,CAAS,WAAW,GAAG,CAAA;AAAA,IAC/B;AAEA,IAAA,MAAM,YAAY,UAAA,EAAW;AAG7B,IAAA,MAAM,YAAY,GAAA,CAAI,IAAA,CAAK,IAAc,OAAA,EAAS,MAAM,KAAK,EAAC;AAC9D,IAAA,MAAM,gBAAgB,GAAA,CAAI,IAAA,CAAK,IAAc,OAAA,EAAS,UAAU,KAAK,EAAC;AACtE,IAAA,MAAM,eAAe,GAAA,CAAI,IAAA,CAAK,IAAc,OAAA,EAAS,SAAS,KAAK,EAAC;AAGpE,IAAA,MAAM,WAAA,GAAc,uBAAuB,GAAG,CAAA;AAE9C,IAAA,MAAM,qBAAqB,EAAE,GAAI,MAAA,CAAO,QAAA,IAAY,EAAC,EAAG;AACxD,IAAA,MAAM,2BAAA,GAA8B,aAAA,EAAe,gBAAA,EAAiB,EAAG,iBAAiB,EAAC;AAEzF,IAAA,IAAI,UAAA,GAAyB;AAAA,MAC3B,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,SAAS,MAAA,CAAO,MAAA;AAAA,MAChB,YAAA;AAAA,MACA,aAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAY,GAAA,CAAI,SAAA;AAAA,MAChB,YAAY,IAAA,CAAK,WAAA;AAAA,MACjB,SAAA,EAAW,KAAK,MAAA,CAAO,SAAA;AAAA,MACvB,WAAA,EAAa,WAAA,CAAY,MAAA,GAAS,CAAA,GAAI,WAAA,GAAc,MAAA;AAAA,MACpD,OAAA,EAAS;AAAA,QACP,gBAAgB,MAAA,CAAO,UAAA;AAAA,QACvB,uBAAuB,GAAA,CAAI,IAAA,CAAK,GAAA,CAAY,MAAA,EAAQ,uBAAuB,CAAA,IAAK,CAAA;AAAA,QAChF,oBAAA,EACE,GAAA,CAAI,SAAA,GAAY,CAAA,GAAA,CACX,GAAA,CAAI,IAAA,CAAK,GAAA,CAAY,MAAA,EAAQ,uBAAuB,CAAA,IAAK,CAAA,IAAK,GAAA,CAAI,SAAA,GACnE,CAAA;AAAA,QACN,2BAA2B,GAAA,CAAI,IAAA,CAAK,GAAA,CAAY,YAAA,EAAc,oBAAoB,CAAA,IAAK,UAAA;AAAA,QACvF,2BAA2B,GAAA,CAAI,IAAA,CAAK,GAAA,CAAY,YAAA,EAAc,oBAAoB,CAAA,IAAK,CAAA;AAAA,QACvF,yBAAyB,GAAA,CAAI,IAAA,CAAK,GAAA,CAAY,YAAA,EAAc,kBAAkB,CAAA,IAAK;AAAA;AACrF,KACF;AAEA,IAAA,KAAA,MAAW,UAAU,2BAAA,EAA6B;AAChD,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,GAAA,CAAI;AAAA,QAC9B,KAAA,EAAO,aAAA,EAAe,SAAA,EAAU,IAAK,IAAA;AAAA,QACrC,QAAQ,UAAA,CAAW,OAAA;AAAA,QACnB,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,IAAA,KAAS,YAC7B,YAAA,GACA,WAAA;AAAA,QACJ,IAAA;AAAA,QACA,SAAA,EAAW,KAAK,MAAA,CAAO,SAAA;AAAA,QACvB,UAAA,EAAY,KAAK,MAAA,CAAO,UAAA;AAAA,QACxB,QAAA,EAAU;AAAA,OACX,CAAA;AACD,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA;AAAA,MACF;AACA,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,UAAA,CAAW,UAAU,MAAA,CAAO,OAAA;AAAA,MAC9B;AACA,MAAA,IAAI,OAAO,UAAA,EAAY;AACrB,QAAA,UAAA,GAAa;AAAA,UACX,GAAG,UAAA;AAAA,UACH,GAAG,MAAA,CAAO,UAAA;AAAA,UACV,OAAA,EAAS;AAAA,YACP,GAAI,UAAA,CAAW,OAAA,IAAW,EAAC;AAAA,YAC3B,GAAK,MAAA,CAAO,UAAA,CAAW,OAAA,IAAmD;AAAC;AAC7E,SACF;AAAA,MACF;AACA,MAAA,IAAI,OAAO,eAAA,EAAiB;AAC1B,QAAA,MAAA,CAAO,MAAA,CAAO,kBAAA,EAAoB,MAAA,CAAO,eAAe,CAAA;AAAA,MAC1D;AAAA,IACF;AAEA,IAAA,IAAI,aAAA,IAAiB,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW;AAC1C,MAAA,MAAM,UAAA,GAAa,MAAM,aAAA,CAAc,WAAA,CAAY;AAAA,QACjD,SAAA,EAAW,KAAK,MAAA,CAAO,SAAA;AAAA,QACvB,KAAA,EAAO,SAAA;AAAA,QACP,IAAA,EAAM,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,IAAA;AAAA,QACxB,SAAS,UAAA,CAAW,OAAA;AAAA,QACpB,SAAA;AAAA,QACA,aAAA;AAAA,QACA,YAAA;AAAA,QACA,UAAU,MAAA,CAAO,IAAA,CAAK,kBAAkB,CAAA,CAAE,MAAA,GAAS,IAAI,kBAAA,GAAqB;AAAA,OAC7E,CAAA;AACD,MAAA,UAAA,GAAa;AAAA,QACX,GAAG,UAAA;AAAA,QACH,OAAA,EAAS,UAAA,CAAW,OAAA,IAAW,CAAC,UAAA,CAAW,eAAA;AAAA,QAC3C,SAAS,UAAA,CAAW,eAAA,GAChB,CAAA,gDAAA,EAAmD,UAAA,CAAW,kBAAkB,IAAA,CAAK,CAAC,MAAA,KAAW,MAAA,CAAO,YAAY,OAAO,CAAA,EAAG,SAAA,IAAa,8BAA8B,KACzK,UAAA,CAAW,OAAA;AAAA,QACf,OAAA,EAAS;AAAA,UACP,GAAI,UAAA,CAAW,OAAA,IAAW,EAAC;AAAA,UAC3B,iBAAA,EAAmB;AAAA;AACrB,OACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAA,CAAK,YAAY,UAAA,EAAY;AAAA,MAClC,UAAA,EAAY,aAAA,IAAkB,IAAA,CAAK,GAAA,EAAI,GAAI,aAAA;AAAA,MAC3C,cAAA;AAAA,MACA,gBAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA,EAIQ,eAAA,CAAgB,MAAY,IAAA,EAAgD;AAClF,IAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,CAChB,MAAA;AAAA,MAAO,CAAC,IAAA,KACP,IAAA,CAAK,IAAA,KAAS,MAAA,IAAU,KAAK,IAAA,KAAS;AAAA,KACxC,CACC,GAAA,CAAI,CAAC,IAAA,KAAS,KAAK,OAAA,EAAS,IAAA,EAAM,CAAA,CAClC,MAAA,CAAO,CAAC,KAAA,KAA2B,OAAA,CAAQ,KAAK,CAAC,CAAA;AACpD,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,OAAO,KAAA,CAAM,KAAK,MAAM,CAAA;AAAA,EAC1B;AAAA,EAEA,MAAc,yBAAyB,WAAA,EAA4C;AACjF,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,SAAA,IAAa,IAAA,CAAK,OAAO,aAAA,EAAe;AACvD,MAAA,OAAO,EAAC;AAAA,IACV;AACA,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,IAAI,cAAA,CAAe,IAAA,CAAK,OAAO,UAAU,CAAA;AACzD,MAAA,MAAM,QAAQ,MAAM,OAAA,CAAQ,QAAA,CAAS,IAAA,CAAK,OAAO,SAAS,CAAA;AAC1D,MAAA,MAAM,MAAA,GAAS,CAAC,GAAG,KAAK,EAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,QAAA,GAAW,CAAA,CAAE,QAAQ,CAAA,CAAE,MAAM,CAAA,EAAG,CAAA;AAC3E,MAAA,MAAM,WAAyB,EAAC;AAEhC,MAAA,KAAA,MAAW,QAAQ,MAAA,EAAQ;AACzB,QAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,UAAA,MAAM,IAAA,GAAO,IAAA,CAAK,eAAA,CAAgB,IAAA,EAAM,MAAM,CAAA;AAC9C,UAAA,IAAI,IAAA,EAAM;AACR,YAAA,QAAA,CAAS,KAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,MAAM,CAAA;AAAA,UAC/C;AACA,UAAA;AAAA,QACF;AACA,QAAA,IAAI,IAAA,CAAK,SAAS,WAAA,EAAa;AAC7B,UAAA,MAAM,IAAA,GAAO,IAAA,CAAK,eAAA,CAAgB,IAAA,EAAM,WAAW,CAAA;AACnD,UAAA,IAAI,IAAA,EAAM;AACR,YAAA,QAAA,CAAS,KAAK,EAAE,IAAA,EAAM,WAAA,EAAa,OAAA,EAAS,MAAM,CAAA;AAAA,UACpD;AAAA,QACF;AAAA,MACF;AAGA,MAAA,OAAO,QAAA,CAAS,SAAS,CAAA,EAAG;AAC1B,QAAA,MAAM,IAAA,GAAO,QAAA,CAAS,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA;AACzC,QAAA,IAAI,IAAA,EAAM,SAAS,MAAA,IAAU,IAAA,CAAK,QAAQ,IAAA,EAAK,KAAM,WAAA,CAAY,IAAA,EAAK,EAAG;AACvE,UAAA,QAAA,CAAS,GAAA,EAAI;AACb,UAAA;AAAA,QACF;AACA,QAAA;AAAA,MACF;AAEA,MAAA,OAAO,QAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEQ,cAAc,WAAA,EAAqC;AACzD,IAAA,OAAO,WAAA,CAAY,cAAA,EAAe,CAAE,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,MAChD,IAAA,EAAM,IAAI,QAAA,CAAS,IAAA;AAAA,MACnB,WAAA,EAAa,IAAI,QAAA,CAAS,WAAA;AAAA,MAC1B,WAAA,EAAa,IAAI,QAAA,CAAS;AAAA,KAC5B,CAAE,CAAA;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAc,gBAAgB,OAAA,EAAuD;AACnF,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAG3B,IAAA,MAAM,YAAA,GAAe,KAAK,MAAA,CAAO,WAAA;AACjC,IAAA,MAAM,eAAA,GAAkB,cAAc,SAAA,IAAa,CAAA;AACnD,IAAA,MAAM,eAAA,GAAkB,kBAAkB,CAAA,GAAI,IAAA,CAAK,IAAI,CAAA,EAAG,eAAA,GAAkB,IAAA,CAAK,WAAW,CAAA,GAAI,CAAA;AAChG,IAAA,MAAM,cAAA,GAAiB,QAAQ,cAAA,IAAkB,GAAA;AACjD,IAAA,MAAM,iBAAiB,eAAA,GAAkB,CAAA,GAAI,KAAK,KAAA,CAAM,eAAA,GAAkB,cAAc,CAAA,GAAI,CAAA;AAE5F,IAAA,MAAM,WAAA,GAA2B;AAAA,MAC/B,GAAG,IAAA,CAAK,MAAA;AAAA,MACR,SAASA,UAAAA,EAAW;AAAA,MACpB,eAAe,IAAA,CAAK,OAAA;AAAA,MACpB,aAAA,EAAe,QAAQ,aAAA,IAAiB,GAAA;AAAA,MACxC,UAAA,EAAY,OAAA,CAAQ,UAAA,IAAc,IAAA,CAAK,MAAA,CAAO,UAAA;AAAA,MAC9C,WAAA,EAAa,KAAK,eAAA,CAAgB,MAAA;AAAA,MAClC,cAAc,OAAA,CAAQ,YAAA;AAAA;AAAA,MAEtB,WAAA,EAAa,iBAAiB,CAAA,GAC1B;AAAA,QACA,OAAA,EAAS,IAAA;AAAA,QACT,SAAA,EAAW,cAAA;AAAA,QACX,cAAA,EAAgB,cAAc,cAAA,IAAkB,GAAA;AAAA,QAChD,cAAA,EAAgB,cAAc,cAAA,IAAkB,CAAA;AAAA,QAChD,QAAA,EAAU,cAAc,QAAA,IAAY,KAAA;AAAA,QACpC,yBAAA,EAA2B,cAAc,yBAAA,IAA6B;AAAA,OACxE,GACE,KAAK,MAAA,CAAO;AAAA,KAClB;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,MAAA,EAAO;AACjC,IAAA,MAAM,WAAA,GAAc,IAAI,eAAA,CAAe,WAAA,EAAa,QAAQ,CAAA;AAC5D,IAAA,MAAM,MAAA,GAAyB,QAAQ,MAAA,IAAU,UAAA;AAEjD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,OAAA,CAAQ,QAAQ,IAAI,CAAA;AACrD,MAAA,OAAO;AAAA,QACL,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,WAAW,MAAA,CAAO,SAAA;AAAA,QAClB,eAAe,MAAA,CAAO,aAAA;AAAA,QACtB,cAAc,MAAA,CAAO,YAAA;AAAA,QACrB,YAAY,MAAA,CAAO,UAAA;AAAA,QACnB,YAAY,MAAA,CAAO,UAAA;AAAA,QACnB,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,QACzB,OAAO,MAAA,CAAO,KAAA;AAAA,QACd;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,OAAA,EAAS,EAAA;AAAA,QACT,WAAW,EAAC;AAAA,QACZ,eAAe,EAAC;AAAA,QAChB,cAAc,EAAC;AAAA,QACf,UAAA,EAAY,CAAA;AAAA,QACZ,UAAA,EAAY,CAAA;AAAA,QACZ,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,QACzB,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAAA,QAC5D;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,mBAAmB,IAAA,EAAmC;AAClE,IAAA,MAAM,EAAE,cAAA,EAAAY,eAAAA,EAAe,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,iBAAA,EAAA,EAAA,oBAAA,CAAA,CAAA;AACjC,IAAA,MAAM,EAAE,kBAAA,EAAAC,mBAAAA,EAAmB,GAAI,MAAM,OAAO,sBAAsB,CAAA;AAElE,IAAA,MAAM,eAAeA,mBAAAA,CAAmB;AAAA,MACtC,UAAA,EAAY,KAAK,MAAA,CAAO,UAAA;AAAA,MACxB,SAAA,EAAW,KAAK,MAAA,CAAO,SAAA;AAAA,MACvB,OAAA,EAAS,KAAA;AAAA,MACT,eAAe,yBAAA,CAA0B,IAAA,CAAK,OAAO,UAAA,EAAY,IAAA,CAAK,OAAO,SAAS;AAAA,KACvF,CAAA;AAED,IAAA,MAAM,OAAA,GAAU,MAAMD,eAAAA,CAAe,IAAA,CAAK,OAAO,IAAI,CAAA;AACrD,IAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,IAAA,EAAM,IAAA,CAAK,QAAQ,YAAY,CAAA;AAAA,EACxD;AAAA,EAEQ,WAAA,CACN,QACA,OAAA,EACY;AACZ,IAAA,OAAO;AAAA,MACL,GAAG,MAAA;AAAA,MACH,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,mBAAmB,MAAA,CAAO,iBAAA;AAAA,MAC1B,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAAA,EAEQ,eAAA,GAAkB;AACxB,IAAA,MAAM,SAAA,GAAY,KAAK,YAAA,EAAa;AACpC,IAAA,MAAM,SAAA,GAAY,KAAK,MAAA,CAAO,SAAA;AAC9B,IAAA,MAAM,SAAS,SAAA,EAAU;AAEzB,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,OAAO;AAAA,QACL,SAAA;AAAA,QACA,aAAa,iBAAA,CAAkB,EAAA,EAAI,IAAA,CAAK,MAAA,CAAO,cAAc,EAAE,CAAA;AAAA,QAC/D,GAAA,EAAK,CAAC,GAAA,KAAgB,MAAA,EAAQ,OAAO,GAAG;AAAA,OAC1C;AAAA,IACF;AAEA,IAAA,MAAM,cAAA,GAAiB,IAAI,cAAA,CAAe,IAAA,CAAK,OAAO,UAAU,CAAA;AAChE,IAAA,OAAO;AAAA,MACL,SAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA,EAAW;AAAA,QACT,cAAA,EAAgB,OAAO,GAAA,KAAgB,cAAA,CAAe,eAAe,GAAG,CAAA;AAAA,QACxE,iBAAA,EAAmB,OACjB,GAAA,EACA,OAAA,KAWG,eAAe,iBAAA,CAAkB,GAAA,EAAK,MAAM,OAAA,EAAS;AAAA,OAC5D;AAAA,MACA,aAAa,iBAAA,CAAkB,EAAA,EAAI,IAAA,CAAK,MAAA,CAAO,cAAc,EAAE,CAAA;AAAA,MAC/D,GAAA,EAAK,CAAC,GAAA,KAAgB,MAAA,EAAQ,OAAO,GAAG;AAAA,KAC1C;AAAA,EACF;AAAA,EAEA,MAAc,oBAAA,CACZ,IAAA,EACA,EAAA,EACA,MAAA,EACA,WACA,IAAA,EACe;AACf,IAAA,MAAM,KAAK,iBAAA,CAAkB,oBAAA,CAAqB,IAAA,EAAM,EAAA,EAAI,QAAQ,SAAA,EAAW;AAAA,MAC7E,SAAA,EAAW,KAAK,YAAA,EAAa;AAAA,MAC7B,SAAA,EAAW,KAAK,MAAA,CAAO,SAAA;AAAA,MACvB,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,IAAA;AAAA,MACA,oBAAoB,sBAAA,CAAuB,cAAA;AAAA,MAC3C,KAAK,CAAC,GAAA,KAAgB,SAAA,EAAU,EAAG,OAAO,GAAG;AAAA,KAC9C,CAAA;AAAA,EACH;AAAA,EAEA,MAAc,WAAA,CACZ,IAAA,EACA,WACA,SAAA,EACA,SAAA,EACA,QACA,SAAA,EACe;AACf,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAA,CAAI,IAAA,CAAK,MAAA,CAAO,aAAA,IAAiB,CAAA,IAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,SAAS,CAAC,CAAA;AAC7F,IAAA,MAAM,WAAA,GAAc,KAAK,MAAA,CAAO,WAAA,EAAa,UAAU,IAAA,CAAK,MAAA,CAAO,YAAY,SAAA,GAAY,MAAA;AAC3F,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,kBAAA,CAAmB,MAAM,CAAA;AACnD,IAAA,MAAM,cAAc,IAAA,CAAK,mBAAA,CAAoB,MAAA,EAAQ,SAAA,EAAW,aAAa,MAAM,CAAA;AAEnF,IAAA,MAAM,OAAA,GAAyB;AAAA,MAC7B,SAAA,EAAW,KAAK,MAAA,CAAO,SAAA;AAAA,MACvB,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,IAAA;AAAA,MACA,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,iBAAiB,MAAA,CAAO,OAAA,IAAW,EAAA,EAAI,KAAA,CAAM,GAAG,GAAG,CAAA;AAAA,MACnD,gBAAgB,MAAA,CAAO,UAAA;AAAA,MACvB,eAAA;AAAA,MACA,WAAA;AAAA,MACA,kBAAkB,WAAA,IAAe,WAAA,GAAc,CAAA,GAAI,MAAA,CAAO,aAAa,WAAA,GAAc,MAAA;AAAA,MACrF,SAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAY,SAAA,CAAU,UAAA;AAAA,MACtB,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,gBAAgB,SAAA,CAAU,cAAA;AAAA,MAC1B,kBAAkB,SAAA,CAAU,gBAAA;AAAA,MAC5B,gBAAgB,SAAA,CAAU,cAAA;AAAA,MAC1B,aAAA,EAAe,CAAA;AAAA,MACf,cAAA,EAAgB,OAAO,SAAA,CAAU,MAAA;AAAA,MACjC,kBAAA,EAAoB,OAAO,aAAA,CAAc,MAAA;AAAA,MACzC,iBAAA,EAAmB,OAAO,YAAA,CAAa,MAAA;AAAA,MACvC,kBAAkB,YAAA,CAAa,MAAA;AAAA,MAC/B,YAAA;AAAA,MACA,cAAA,EAAgB,MAAA,CAAO,OAAA,GAAU,UAAA,GAAa,QAAA;AAAA,MAC9C,kBAAkB,EAAC;AAAA,MACnB,oBAAA,EAAsB,CAAA;AAAA,MACtB,kBAAkB,EAAC;AAAA,MACnB,QAAQ,EAAE,WAAA,EAAa,SAAA,CAAU,cAAA,EAAgB,cAAc,CAAA,EAAE;AAAA,MACjE,WAAA;AAAA,MACA,oBAAA,EAAsB,OAAO,MAAA,CAAO,OAAA,GAAU,sBAAsB,CAAA,KAAM,QAAA,GACtE,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,sBAAsB,CAAC,CAAA,GAC7C;AAAA,KACN;AAEA,IAAA,MAAM,KAAK,iBAAA,CAAkB,WAAA,CAAY,OAAA,EAAS,IAAA,CAAK,iBAAiB,CAAA;AAAA,EAC1E;AAAA,EAEQ,YAAA,GAAe;AACrB,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,SAAA,IAAa,YAAA,EAAa,IAAK,IAAA;AAAA,EACpD;AAAA,EAEQ,UAAA,CAAW,SAAiB,UAAA,EAAgC;AAClE,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,OAAA,EAAS,OAAA;AAAA,MACT,cAAc,EAAC;AAAA,MACf,eAAe,EAAC;AAAA,MAChB,WAAW,EAAC;AAAA,MACZ,UAAA;AAAA,MACA,UAAA,EAAY,CAAA;AAAA,MACZ,KAAA,EAAO,OAAA;AAAA,MACP,SAAA,EAAW,KAAK,MAAA,CAAO;AAAA,KACzB;AAAA,EACF;AAAA,EAEA,MAAc,mBAAA,CAAoB,cAAA,EAAgC,SAAA,EAAoC;AACpG,IAAA,MAAM,KAAA,GAAQ,MAAM,cAAA,CAAe,QAAA,CAAS,SAAS,CAAA,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AACrE,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA,OAAO,EAAA;AAAA,IACT;AACA,IAAA,MAAM,kBAAA,GAAqB,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,CAAA,CAAE,MAAA,KAAW,WAAW,CAAA,CAAE,MAAA;AAC9F,IAAA,MAAM,uBAAA,GAA0B,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,WAAA,IAAe,CAAA,CAAE,MAAA,KAAW,WAAW,CAAA,CAAE,MAAA;AACxG,IAAA,MAAM,KAAA,GAAQ;AAAA,MACZ,iBAAA;AAAA,MACA,yCAAyC,kBAAkB,CAAA,CAAA;AAAA,MAC3D,8CAA8C,uBAAuB,CAAA;AAAA,KACvE;AACA,IAAA,KAAA,CAAM,KAAK,6GAA6G,CAAA;AACxH,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB;AAAA,EAEQ,yBAAyB,IAAA,EAAuB;AACtD,IAAA,MAAM,KAAA,GAAQ,KAAK,WAAA,EAAY;AAC/B,IAAA,MAAM,KAAA,GAAQ;AAAA,MACZ,kDAAA;AAAA,MACA,4CAAA;AAAA,MACA,gEAAA;AAAA,MACA,sEAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,eAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,OAAO,MAAM,IAAA,CAAK,CAAC,MAAM,KAAA,CAAM,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,EAC5C;AAAA,EAEQ,mBAAmB,MAAA,EAA8B;AACvD,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,IAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,MAAA,CAAO,SAAA,EAAW,GAAG,MAAA,CAAO,aAAA,EAAe,GAAG,MAAA,CAAO,YAAY,CAAA;AACnF,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AAC1C,MAAA,MAAM,GAAA,GAAM,WAAW,UAAA,CAAW,IAAA,CAAK,OAAO,UAAA,CAAW,OAAA,CAAQ,OAAO,GAAG,CAAC,IACxE,UAAA,CAAW,KAAA,CAAM,KAAK,MAAA,CAAO,UAAA,CAAW,MAAM,CAAA,CAAE,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA,GAClE,UAAA;AACJ,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,KAAK,CAAC,IAAA,KAAS,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA;AAC3D,MAAA,OAAA,CAAQ,GAAA,CAAI,SAAS,GAAG,CAAA;AAAA,IAC1B;AACA,IAAA,OAAO,CAAC,GAAG,OAAO,CAAA;AAAA,EACpB;AAAA,EAEQ,mBAAA,CACN,MAAA,EACA,SAAA,EACA,gBAAA,EACmB;AACnB,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,MAAM,aAAA,GAAgB,OAAO,SAAA,CAAU,MAAA,GAAS,OAAO,aAAA,CAAc,MAAA,GAAS,OAAO,YAAA,CAAa,MAAA;AAClG,IAAA,MAAM,kBAAkB,MAAA,CAAO,UAAA,GAAa,CAAA,GAAI,aAAA,GAAgB,OAAO,UAAA,GAAa,aAAA;AACpF,IAAA,MAAM,eAAA,GAAkB,SAAA,CAAU,cAAA,GAAiB,CAAA,GAC/C,SAAA,CAAU,mBAAmB,SAAA,CAAU,cAAA,GACtC,MAAA,CAAO,OAAA,GAAU,CAAA,GAAI,CAAA;AAE1B,IAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,OAAA,GAAU,CAAA,GAAI,IAAA;AAC7C,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,kBAAkB,GAAG,CAAA;AACvD,IAAA,MAAM,gBAAA,GAAmB,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,eAAe,CAAC,CAAA;AACjE,IAAA,MAAM,oBAAA,GAAuB,OAAO,MAAA,CAAO,OAAA,GAAU,sBAAsB,CAAA,KAAM,QAAA,GAC7E,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,sBAAsB,CAAC,CAAA,GAC7C,CAAA;AACJ,IAAA,MAAM,oBAAA,GAAuB,uBAAuB,GAAA,GAChD,IAAA,CAAK,IAAI,IAAA,EAAM,oBAAA,GAAuB,GAAG,CAAA,GACzC,CAAA;AACJ,IAAA,MAAM,YAAA,GAAe,gBAAA,GAAmB,CAAA,GAAI,IAAA,GAAO,CAAA;AAEnD,IAAA,IAAI,QACD,eAAA,GAAkB,IAAA,GAClB,gBAAgB,IAAA,GAChB,gBAAA,GAAmB,MACpB,YAAA,GACA,oBAAA;AACF,IAAA,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAC,CAAA;AAEtC,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,MAAA,OAAA,CAAQ,KAAK,oBAAoB,CAAA;AAAA,IACnC;AACA,IAAA,IAAI,SAAA,CAAU,iBAAiB,CAAA,EAAG;AAChC,MAAA,OAAA,CAAQ,KAAK,qBAAqB,CAAA;AAAA,IACpC;AACA,IAAA,IAAI,kBAAkB,CAAA,EAAG;AACvB,MAAA,OAAA,CAAQ,KAAK,uBAAuB,CAAA;AAAA,IACtC;AACA,IAAA,IAAI,mBAAmB,CAAA,EAAG;AACxB,MAAA,OAAA,CAAQ,KAAK,sBAAsB,CAAA;AAAA,IACrC;AACA,IAAA,IAAI,uBAAuB,GAAA,EAAK;AAC9B,MAAA,OAAA,CAAQ,KAAK,+BAA+B,CAAA;AAAA,IAC9C;AAEA,IAAA,MAAM,UAAA,GAAa,OAAO,MAAA,CAAO,OAAA,GAAU,gBAAgB,CAAA,KAAM,QAAA,GAC7D,MAAA,CAAO,MAAA,CAAO,OAAA,GAAU,gBAAgB,CAAC,CAAA,GACzC,EAAA;AACJ,IAAA,IAAA,CAAK,UAAA,KAAe,gBAAA,IAAoB,UAAA,KAAe,eAAA,KAAoB,gBAAgB,CAAA,EAAG;AAC5F,MAAA,OAAA,CAAQ,KAAK,gCAAgC,CAAA;AAC7C,MAAA,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,IAAI,CAAA;AAAA,IAC9B;AAEA,IAAA,IAAI,KAAA,IAAS,IAAA,IAAQ,MAAA,CAAO,OAAA,EAAS;AACnC,MAAA,OAAO,EAAE,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO,OAAA,EAAQ;AAAA,IAC1C;AACA,IAAA,IAAI,SAAS,GAAA,EAAK;AAChB,MAAA,OAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,KAAA,EAAO,OAAA,EAAQ;AAAA,IAC7C;AACA,IAAA,OAAO,EAAE,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO,OAAA,EAAQ;AAAA,EAC1C;AACF;;;AQplCO,SAAS,iBAAA,GAA0B;AACxC,EAAAtC,QAAAA,CAAS,iBAAiB,CAAC,MAAA,EAAQ,QAAQ,IAAI,cAAA,CAAe,MAAA,EAAQ,GAAG,CAAC,CAAA;AAC5E;;;Ab4BA,0BAAA,EAAA","file":"index.js","sourcesContent":["/**\n * @module @kb-labs/agent-core/planning/turn-assembler\n * Assembles Turn snapshots from raw AgentEvent stream\n */\n\nimport type {\n AgentEvent,\n ToolEndEvent,\n Turn,\n ThinkingStep,\n ToolUseStep,\n TextStep,\n ErrorStep,\n} from '@kb-labs/agent-contracts';\n\n/**\n * Pending tool:end / tool:error event that arrived before its tool:start.\n * Buffered per turnId, keyed by toolCallId or toolName.\n */\ninterface PendingToolResult {\n event: AgentEvent;\n type: 'tool:end' | 'tool:error';\n}\n\n/**\n * Assembles Turn snapshots from raw AgentEvent stream.\n * Maintains state for in-progress turns and emits snapshots on updates.\n *\n * Out-of-order tolerance: when tool:end / tool:error arrive before their\n * corresponding tool:start (due to fire-and-forget async dispatch), the\n * result event is buffered in orphanedToolResults. As soon as tool:start\n * is processed the buffer is flushed, guaranteeing the step ends up in\n * the correct final state.\n */\nexport class TurnAssembler {\n /** Active turns being assembled (turnId -> Turn) */\n private activeTurns = new Map<string, Turn>();\n\n /** Event buffer for each turn (for replay/debugging) */\n private eventBuffers = new Map<string, AgentEvent[]>();\n\n /** Next sequence number per session */\n private sequenceCounters = new Map<string, number>();\n\n /**\n * Orphaned tool result events (tool:end / tool:error) that arrived before\n * their corresponding tool:start. Key: `${turnId}:${toolCallId|toolName}`.\n */\n private orphanedToolResults = new Map<string, PendingToolResult[]>();\n\n /**\n * Process an event and return updated Turn snapshot if changed.\n * Returns null if no snapshot update needed.\n */\n processEvent(event: AgentEvent): Turn | null {\n // Determine turn ID from event\n const turnId = this.getTurnId(event);\n if (!turnId) {return null;} // Event doesn't belong to a turn\n\n // Get or create turn\n let turn = this.activeTurns.get(turnId);\n if (!turn) {\n turn = this.createTurn(event, turnId);\n this.activeTurns.set(turnId, turn);\n }\n\n // Buffer event for debugging\n const buffer = this.eventBuffers.get(turnId) ?? [];\n buffer.push(event);\n this.eventBuffers.set(turnId, buffer);\n\n // Update turn based on event type\n const updated = this.updateTurn(turn, event, turnId);\n\n // Check if turn completed\n let completed = false;\n if (this.isTurnComplete(event)) {\n turn.status = 'completed';\n turn.completedAt = event.timestamp;\n this.activeTurns.delete(turnId);\n this.eventBuffers.delete(turnId);\n completed = true;\n }\n\n // Return turn if updated OR if it just completed (so caller can persist final status)\n return (updated || completed) ? turn : null;\n }\n\n /**\n * Async version of processEvent that uses external sequence generator.\n * Used when sequence needs to be persistent across SessionManager instances.\n */\n async processEventAsync(\n event: AgentEvent,\n getSequence: (sessionId: string) => Promise<number>\n ): Promise<Turn | null> {\n // Determine turn ID from event\n const turnId = this.getTurnId(event);\n if (!turnId) {return null;}\n\n // Get or create turn\n let turn = this.activeTurns.get(turnId);\n if (!turn) {\n turn = await this.createTurnAsync(event, turnId, getSequence);\n this.activeTurns.set(turnId, turn);\n }\n\n // Buffer event for debugging\n const buffer = this.eventBuffers.get(turnId) ?? [];\n buffer.push(event);\n this.eventBuffers.set(turnId, buffer);\n\n // Update turn based on event type\n const updated = this.updateTurn(turn, event, turnId);\n\n // Check if turn completed\n let completed = false;\n if (this.isTurnComplete(event)) {\n turn.status = 'completed';\n turn.completedAt = event.timestamp;\n this.activeTurns.delete(turnId);\n this.eventBuffers.delete(turnId);\n completed = true;\n }\n\n return (updated || completed) ? turn : null;\n }\n\n /**\n * Derive turn ID from event.\n * For root agents: use agentId\n * For sub-agents: return null (handled separately)\n */\n private getTurnId(event: AgentEvent): string | null {\n switch (event.type) {\n case 'agent:start':\n case 'agent:end':\n case 'agent:error':\n // Root agent events = turn boundaries\n return event.parentAgentId ? null : `turn-${event.agentId}`;\n\n case 'llm:start':\n case 'llm:stream':\n case 'llm:end':\n case 'tool:start':\n case 'tool:end':\n case 'tool:error':\n case 'status:change':\n case 'thinking:start':\n case 'thinking:chunk':\n case 'thinking:end':\n // Associate with current turn (assume belongs to most recent active turn)\n // In production, this should use event.metadata.turnId or similar\n const activeTurnIds = Array.from(this.activeTurns.keys());\n return activeTurnIds[activeTurnIds.length - 1] ?? null;\n\n default:\n return null;\n }\n }\n\n /**\n * Create initial Turn snapshot from agent:start event.\n */\n private createTurn(event: AgentEvent, turnId: string): Turn {\n const sessionId = event.sessionId ?? 'unknown';\n\n // Use getNextSequence to properly increment counter\n // This ensures user turns and assistant turns have correct sequence order\n const sequence = this.getNextSequence(sessionId);\n\n return {\n id: turnId,\n type: 'assistant',\n sequence,\n startedAt: event.timestamp,\n completedAt: null,\n status: 'streaming',\n steps: [],\n metadata: {\n agentId: event.agentId ?? 'unknown',\n agentName: undefined,\n taskId: event.taskId,\n },\n };\n }\n\n /**\n * Async version of createTurn that uses external sequence generator.\n */\n private async createTurnAsync(\n event: AgentEvent,\n turnId: string,\n getSequence: (sessionId: string) => Promise<number>\n ): Promise<Turn> {\n const sessionId = event.sessionId ?? 'unknown';\n\n // Get sequence from external source (file system)\n const sequence = await getSequence(sessionId);\n\n return {\n id: turnId,\n type: 'assistant',\n sequence,\n startedAt: event.timestamp,\n completedAt: null,\n status: 'streaming',\n steps: [],\n metadata: {\n agentId: event.agentId ?? 'unknown',\n agentName: undefined,\n taskId: event.taskId,\n },\n };\n }\n\n /**\n * Update turn with new event data.\n * Returns true if turn was modified.\n */\n private updateTurn(turn: Turn, event: AgentEvent, turnId: string): boolean {\n switch (event.type) {\n case 'thinking:start':\n case 'thinking:chunk': {\n // Find or create thinking step\n const lastStep = turn.steps[turn.steps.length - 1];\n const content = (event.data?.content as string) ?? '';\n\n if (lastStep?.type === 'thinking') {\n // Append to existing thinking\n (lastStep as ThinkingStep).content += content;\n return true;\n } else {\n // Create new thinking step\n const step: ThinkingStep = {\n type: 'thinking',\n id: `step-${turn.steps.length + 1}`,\n timestamp: event.timestamp,\n content,\n };\n turn.steps.push(step);\n return true;\n }\n }\n\n case 'status:change': {\n const statusPayload = (event.data ?? {}) as {\n status?: string;\n message?: string;\n toolName?: string;\n };\n const content = this.buildPublicStatusReasoning(statusPayload);\n if (!content) {\n return false;\n }\n\n const lastStep = turn.steps[turn.steps.length - 1];\n if (lastStep?.type === 'thinking' && lastStep.content === content) {\n return false;\n }\n\n const step: ThinkingStep = {\n type: 'thinking',\n id: `step-${turn.steps.length + 1}`,\n timestamp: event.timestamp,\n content,\n };\n turn.steps.push(step);\n return true;\n }\n\n case 'tool:start': {\n const startMeta = event.data?.metadata;\n const toolCallId = event.toolCallId;\n const toolName = event.data?.toolName ?? 'unknown';\n const step: ToolUseStep = {\n type: 'tool_use',\n id: `step-${turn.steps.length + 1}`,\n timestamp: event.timestamp,\n toolName,\n toolCallId,\n input: (event.data?.input as Record<string, unknown>) ?? {},\n status: 'pending',\n ...(startMeta ? {\n metadata: {\n filePath: startMeta.filePath,\n summary: startMeta.summary,\n uiHint: startMeta.uiHint,\n structured: startMeta.structured,\n }\n } : {}),\n };\n turn.steps.push(step);\n\n // Flush any orphaned tool:end / tool:error that arrived before this start\n this.flushOrphanedToolResults(turn, turnId, step);\n\n return true;\n }\n\n case 'tool:end': {\n const toolCallId = event.toolCallId;\n const toolName = event.data?.toolName ?? 'unknown';\n const existing = turn.steps.find(\n (s): s is ToolUseStep =>\n s.type === 'tool_use' &&\n s.status === 'pending' &&\n (toolCallId ? s.toolCallId === toolCallId : s.toolName === toolName)\n );\n if (existing) {\n this.applyToolEnd(existing, event);\n } else {\n // tool:start hasn't been processed yet — buffer for later\n this.bufferOrphanedToolResult(turnId, toolCallId, toolName, { event, type: 'tool:end' });\n }\n return true;\n }\n\n case 'tool:error': {\n const toolCallId = event.toolCallId;\n const toolName = event.data?.toolName ?? 'unknown';\n const existing = turn.steps.find(\n (s): s is ToolUseStep =>\n s.type === 'tool_use' &&\n s.status === 'pending' &&\n (toolCallId ? s.toolCallId === toolCallId : s.toolName === toolName)\n );\n if (existing) {\n existing.status = 'error';\n existing.error = (event.data?.error as string) ?? 'Unknown error';\n } else {\n // tool:start hasn't been processed yet — buffer for later\n this.bufferOrphanedToolResult(turnId, toolCallId, toolName, { event, type: 'tool:error' });\n }\n return true;\n }\n\n case 'llm:end': {\n const rawContent = (event.data?.content as string | undefined) ?? '';\n const content = this.sanitizePublicContent(rawContent);\n const hasToolCalls = Boolean((event.data as { hasToolCalls?: boolean } | undefined)?.hasToolCalls);\n\n if (content) {\n if (hasToolCalls) {\n const step: ThinkingStep = {\n type: 'thinking',\n id: `step-${turn.steps.length + 1}`,\n timestamp: event.timestamp,\n content,\n };\n turn.steps.push(step);\n } else {\n const step: TextStep = {\n type: 'text',\n id: `step-${turn.steps.length + 1}`,\n timestamp: event.timestamp,\n content,\n role: 'assistant',\n };\n turn.steps.push(step);\n }\n\n // Update metadata\n if (event.data?.tokensUsed) {\n turn.metadata.totalTokens = (turn.metadata.totalTokens ?? 0) + event.data.tokensUsed;\n }\n\n return true;\n }\n return false;\n }\n\n case 'agent:end': {\n // Add a TextStep from the final summary only if no TextStep exists yet.\n // When the agent uses the report tool, llm:end has empty content — summary is the only source.\n // When the agent ends with a text-only LLM reply, llm:end already added the TextStep.\n const hasTextStep = turn.steps.some((s) => s.type === 'text');\n if (!hasTextStep) {\n const summary = (event.data?.summary as string | undefined)?.trim();\n if (summary) {\n const step: TextStep = {\n type: 'text',\n id: `step-${turn.steps.length + 1}`,\n timestamp: event.timestamp,\n content: summary,\n role: 'assistant',\n };\n turn.steps.push(step);\n return true;\n }\n }\n return false;\n }\n\n case 'agent:error': {\n turn.status = 'failed';\n turn.completedAt = event.timestamp;\n turn.error = {\n code: 'AGENT_ERROR',\n message: event.data?.error ?? 'Agent failed',\n details: undefined,\n };\n const step: ErrorStep = {\n type: 'error',\n id: `step-${turn.steps.length + 1}`,\n timestamp: event.timestamp,\n code: turn.error.code,\n message: turn.error.message,\n details: turn.error.details,\n };\n turn.steps.push(step);\n return true;\n }\n\n default:\n return false;\n }\n }\n\n /**\n * Check if event marks turn completion.\n */\n private isTurnComplete(event: AgentEvent): boolean {\n return event.type === 'agent:end' && !event.parentAgentId;\n }\n\n // ─── Out-of-order tool result buffering ─────────────────────────────────\n\n /**\n * Build the orphan buffer key for a tool result.\n * Prefer toolCallId (unique per invocation) over toolName (may repeat).\n */\n private orphanKey(turnId: string, toolCallId: string | undefined, toolName: string): string {\n return toolCallId ? `${turnId}:id:${toolCallId}` : `${turnId}:name:${toolName}`;\n }\n\n /**\n * Buffer an orphaned tool:end / tool:error event so it can be applied\n * once the matching tool:start step is created.\n */\n private bufferOrphanedToolResult(\n turnId: string,\n toolCallId: string | undefined,\n toolName: string,\n pending: PendingToolResult\n ): void {\n const key = this.orphanKey(turnId, toolCallId, toolName);\n const existing = this.orphanedToolResults.get(key) ?? [];\n existing.push(pending);\n this.orphanedToolResults.set(key, existing);\n }\n\n /**\n * After a tool:start step is pushed, flush any buffered results for it.\n */\n private flushOrphanedToolResults(turn: Turn, turnId: string, step: ToolUseStep): void {\n // Try lookup by toolCallId first, then fall back to toolName\n const keyById = step.toolCallId ? `${turnId}:id:${step.toolCallId}` : null;\n const keyByName = `${turnId}:name:${step.toolName}`;\n\n const pendingById = keyById ? this.orphanedToolResults.get(keyById) : undefined;\n const pendingByName = this.orphanedToolResults.get(keyByName);\n\n const pending = pendingById ?? pendingByName;\n const usedKey = pendingById ? keyById! : keyByName;\n\n if (!pending || pending.length === 0) {\n return;\n }\n\n // Apply the most recent result (last wins — same semantics as live processing)\n const last = pending[pending.length - 1]!;\n if (last.type === 'tool:end') {\n this.applyToolEnd(step, last.event as ToolEndEvent);\n } else {\n step.status = 'error';\n const errData = last.event.data as { error?: string } | undefined;\n step.error = errData?.error ?? 'Unknown error';\n }\n\n this.orphanedToolResults.delete(usedKey);\n }\n\n /**\n * Apply a tool:end event payload to an existing ToolUseStep.\n */\n private applyToolEnd(step: ToolUseStep, event: ToolEndEvent): void {\n step.status = 'done';\n step.success = event.data?.success;\n step.output = event.data?.output;\n step.durationMs = event.data?.durationMs;\n const m = event.data?.metadata;\n if (m) {\n step.metadata = {\n filePath: m.filePath,\n fileContent: m.fileContent,\n diff: m.diff,\n oldContent: m.oldContent,\n newContent: m.newContent,\n linesChanged: m.linesChanged,\n linesAdded: m.linesAdded,\n linesRemoved: m.linesRemoved,\n resultCount: m.resultCount,\n results: m.results,\n confidence: m.confidence,\n query: m.query,\n exitCode: m.exitCode,\n command: m.command,\n stdout: m.stdout,\n stderr: m.stderr,\n summary: m.summary,\n uiHint: m.uiHint,\n structured: m.structured,\n };\n }\n }\n\n private sanitizePublicContent(content: string): string {\n const trimmed = content.trim();\n if (!trimmed) {\n return '';\n }\n const normalized = trimmed.toLowerCase();\n if (\n normalized === '[executing tools...]' ||\n normalized === '[thinking...]' ||\n normalized === '[planning...]' ||\n normalized === '[analyzing...]'\n ) {\n return '';\n }\n return trimmed;\n }\n\n private buildPublicStatusReasoning(payload: { status?: string; message?: string; toolName?: string }): string | null {\n const status = (payload.status ?? '').toLowerCase();\n const message = (payload.message ?? '').trim();\n\n if (status === 'thinking') {\n return 'Analyzing context and choosing the next step.';\n }\n\n if (status === 'executing' && payload.toolName) {\n return `Checking facts with tool: ${this.formatToolName(payload.toolName)}.`;\n }\n\n if (!message) {\n return null;\n }\n\n const normalized = message.toLowerCase();\n if (normalized.includes('calling llm')) {\n return 'Reviewing context and planning the next action.';\n }\n if (normalized.includes('executing')) {\n return payload.toolName\n ? `Running step with tool: ${this.formatToolName(payload.toolName)}.`\n : 'Running the next step and collecting evidence.';\n }\n\n return null;\n }\n\n private formatToolName(name: string): string {\n return name\n .replace(/[_-]/g, ' ')\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n }\n\n /**\n * Get all active turns (for session snapshots).\n */\n getActiveTurns(): Turn[] {\n return Array.from(this.activeTurns.values());\n }\n\n /**\n * Get next sequence number for a session (for user turns).\n * Also increments the counter so next turn gets a different sequence.\n */\n getNextSequence(sessionId: string): number {\n const current = this.sequenceCounters.get(sessionId) ?? 0;\n const next = current + 1;\n this.sequenceCounters.set(sessionId, next);\n return next;\n }\n\n /**\n * Get current sequence counter value (for testing/debugging).\n */\n getCurrentSequence(sessionId: string): number {\n return this.sequenceCounters.get(sessionId) ?? 0;\n }\n\n /**\n * Clear all state (for testing/cleanup).\n */\n reset(): void {\n this.activeTurns.clear();\n this.eventBuffers.clear();\n this.sequenceCounters.clear();\n this.orphanedToolResults.clear();\n }\n}\n","/**\n * Session manager - handles agent session persistence\n */\n\nimport { promises as fs } from 'node:fs';\nimport * as path from 'node:path';\nimport type { AgentSession, AgentSessionInfo, AgentMode, AgentEvent, Turn, FileChangeSummary } from '@kb-labs/agent-contracts';\nimport { SessionArtifactStore } from '@kb-labs/agent-store';\nimport { TurnAssembler } from './turn-assembler.js';\n\n/**\n * Extended session with agentId for storage\n */\ninterface StoredSession extends AgentSession {\n agentId: string;\n name?: string;\n}\n\n/**\n * Conversation turn extracted from events\n */\nexport interface ConversationTurn {\n userTask: string;\n agentResponse?: string;\n timestamp: string;\n}\n\ninterface RunTraceArtifacts {\n facts: string[];\n findings: string[];\n decisions: string[];\n assumptions: string[];\n scopeHints: string[];\n}\n\ninterface SessionTraceArtifacts {\n version: number;\n updatedAt: string;\n byRun: Record<string, RunTraceArtifacts>;\n merged: RunTraceArtifacts;\n}\n\nexport interface SessionKpiBaseline {\n version: number;\n updatedAt: string;\n driftRateEma: number;\n evidenceDensityEma: number;\n toolErrorRateEma: number;\n samples: number;\n tokenHistory: number[];\n iterationUtilizationHistory: number[];\n qualityScoreHistory: number[];\n}\n\n/**\n * Manages agent sessions (creation, persistence, retrieval)\n */\nexport class SessionManager {\n private workingDir: string;\n private readonly artifactStore: SessionArtifactStore;\n\n /** In-memory cache of per-run sequence counters (initialized lazily from NDJSON) */\n private runSeqCounters = new Map<string, number>();\n /** In-memory cache of turn sequence counters per session (for turns.json). */\n private turnSeqCounters = new Map<string, number>();\n\n /** Turn assembler for creating turn snapshots from events */\n private assembler = new TurnAssembler();\n\n /** Write queue per session to prevent concurrent write race conditions */\n private writeQueues = new Map<string, Promise<void>>();\n\n /**\n * Serialized event-processing queue per session.\n * Ensures addEvent calls for the same session are processed in arrival order\n * even when the caller fires them concurrently with void (fire-and-forget).\n * This prevents tool:end being processed by TurnAssembler before tool:start.\n */\n private eventQueues = new Map<string, Promise<void>>();\n /** Write queue per session for artifact projection updates */\n private artifactWriteQueues = new Map<string, Promise<void>>();\n /** Write queue per session for KPI baseline updates */\n private kpiWriteQueues = new Map<string, Promise<void>>();\n\n constructor(workingDir: string) {\n this.workingDir = workingDir;\n this.artifactStore = new SessionArtifactStore(workingDir);\n }\n\n /**\n * Create a new session\n */\n async createSession(config: {\n mode: AgentMode;\n task: string;\n agentId: string;\n name?: string;\n planId?: string;\n sessionId?: string;\n }): Promise<AgentSessionInfo> {\n const sessionId = config.sessionId || `session-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n const now = new Date().toISOString();\n\n const session: StoredSession = {\n id: sessionId,\n mode: config.mode,\n task: config.task,\n agentId: config.agentId,\n name: config.name || this.generateSessionName(config.task),\n planId: config.planId,\n workingDir: this.workingDir,\n createdAt: now,\n updatedAt: now,\n status: 'active',\n };\n\n await this.saveSession(session);\n\n return this.toSessionInfo(session, 0, undefined, now);\n }\n\n /**\n * Generate a human-readable session name from task\n */\n private generateSessionName(task: string): string {\n // Take first 50 chars, cut at word boundary\n const maxLen = 50;\n if (task.length <= maxLen) {return task;}\n const cut = task.slice(0, maxLen);\n const lastSpace = cut.lastIndexOf(' ');\n return lastSpace > 20 ? cut.slice(0, lastSpace) + '...' : cut + '...';\n }\n\n /**\n * Convert stored session to session info\n */\n private toSessionInfo(\n session: StoredSession,\n runCount: number,\n lastMessage: string | undefined,\n lastActivityAt: string\n ): AgentSessionInfo {\n return {\n ...session,\n agentId: session.agentId,\n name: session.name,\n runCount,\n lastMessage,\n lastActivityAt,\n };\n }\n\n /**\n * Save session to disk\n */\n async saveSession(session: StoredSession | AgentSession): Promise<void> {\n const sessionDir = this.getSessionDir(session.id);\n await fs.mkdir(sessionDir, { recursive: true });\n\n const sessionFile = path.join(sessionDir, 'session.json');\n await fs.writeFile(sessionFile, JSON.stringify(session, null, 2), 'utf-8');\n await this.artifactStore.saveSessionMetadata(session as AgentSession & Record<string, unknown>);\n }\n\n /**\n * Load session from disk\n */\n async loadSession(sessionId: string): Promise<StoredSession | null> {\n try {\n const sessionFile = path.join(this.getSessionDir(sessionId), 'session.json');\n const content = await fs.readFile(sessionFile, 'utf-8');\n return JSON.parse(content);\n } catch {\n return null;\n }\n }\n\n /**\n * Get session with full info\n */\n async getSessionInfo(sessionId: string): Promise<AgentSessionInfo | null> {\n const session = await this.loadSession(sessionId);\n if (!session) {return null;}\n\n const events = await this.getSessionEvents(sessionId);\n const runCount = events.filter((e) => e.type === 'agent:start').length;\n const lastLlmEvent = [...events].reverse().find((e) => e.type === 'llm:end');\n const lastMessage = lastLlmEvent?.data?.content as string | undefined;\n const lastEvent = events[events.length - 1];\n const lastActivityAt = lastEvent\n ? new Date(lastEvent.timestamp).toISOString()\n : session.updatedAt;\n\n return this.toSessionInfo(session, runCount, lastMessage?.slice(0, 100), lastActivityAt);\n }\n\n /**\n * Update session status\n */\n async updateSessionStatus(\n sessionId: string,\n status: AgentSession['status']\n ): Promise<void> {\n const session = await this.loadSession(sessionId);\n if (!session) {\n throw new Error(`Session not found: ${sessionId}`);\n }\n\n session.status = status;\n session.updatedAt = new Date().toISOString();\n\n await this.saveSession(session);\n }\n\n /**\n * List all sessions with info\n */\n async listSessions(options?: {\n agentId?: string;\n status?: AgentSession['status'];\n limit?: number;\n offset?: number;\n }): Promise<{ sessions: AgentSessionInfo[]; total: number }> {\n const sessionsRoot = path.join(this.workingDir, '.kb', 'agents', 'sessions');\n\n try {\n const entries = await fs.readdir(sessionsRoot, { withFileTypes: true });\n const sessionDirs = entries.filter((e) => e.isDirectory()).map((e) => e.name);\n\n // Load session info in parallel for better performance\n const sessionInfos = await Promise.all(\n sessionDirs.map((sessionId) => this.getSessionInfo(sessionId))\n );\n\n // Filter out null results and apply user filters\n let sessions: AgentSessionInfo[] = sessionInfos\n .filter((info): info is AgentSessionInfo => {\n if (!info) {\n return false;\n }\n // Apply filters\n if (options?.agentId && info.agentId !== options.agentId) {\n return false;\n }\n if (options?.status && info.status !== options.status) {\n return false;\n }\n return true;\n });\n\n // Sort by last activity (newest first)\n sessions.sort((a, b) => b.lastActivityAt.localeCompare(a.lastActivityAt));\n\n const total = sessions.length;\n\n // Apply pagination\n if (options?.offset) {\n sessions = sessions.slice(options.offset);\n }\n if (options?.limit) {\n sessions = sessions.slice(0, options.limit);\n }\n\n return { sessions, total };\n } catch {\n return { sessions: [], total: 0 };\n }\n }\n\n // ═══════════════════════════════════════════════════════════════════════\n // Event Storage (NDJSON format - append-safe)\n // ═══════════════════════════════════════════════════════════════════════\n\n /**\n * Get next per-run sessionSeq for a specific run within a session.\n * Each run has independent sequence counters starting from 1.\n * Lazily initialized: reads NDJSON on first call to find max existing sessionSeq for this runId,\n * then uses in-memory counter for subsequent calls.\n */\n private async getNextSessionSeq(sessionId: string, runId: string): Promise<number> {\n const key = `${sessionId}:${runId}`;\n\n if (!this.runSeqCounters.has(key)) {\n let maxSeq = 0;\n try {\n const content = await fs.readFile(this.getEventsPath(sessionId), 'utf-8');\n const lines = content.split('\\n').filter((l) => l.trim());\n for (const line of lines) {\n try {\n const evt = JSON.parse(line);\n // Only count events from this specific runId\n if (evt.runId === runId && evt.sessionSeq != null && evt.sessionSeq > maxSeq) {\n maxSeq = evt.sessionSeq;\n }\n } catch { /* skip malformed */ }\n }\n } catch {\n // File doesn't exist yet - start from 0\n }\n this.runSeqCounters.set(key, maxSeq);\n }\n\n const next = this.runSeqCounters.get(key)! + 1;\n this.runSeqCounters.set(key, next);\n return next;\n }\n\n /**\n * Add event to session (append-only, race-condition safe).\n * Assigns per-run sessionSeq for ordering within each run.\n * Also processes event to update turn snapshots.\n *\n * Events for the same session are serialized via eventQueues so that\n * concurrent fire-and-forget callers (void addEvent(...)) don't cause\n * tool:end to be processed before tool:start in TurnAssembler.\n */\n async addEvent(sessionId: string, event: AgentEvent): Promise<void> {\n const prev = this.eventQueues.get(sessionId) ?? Promise.resolve();\n // Chain this event after prev, but store a \"silenced\" tail that always resolves\n // (never rejects and holds no references to prior chain links after completion).\n // This prevents unbounded promise chain growth which causes OOM on long runs.\n const next = prev.then(() => this._addEventInternal(sessionId, event));\n const tail = next.then(() => {}, () => {});\n this.eventQueues.set(sessionId, tail);\n return next;\n }\n\n private async _addEventInternal(sessionId: string, event: AgentEvent): Promise<void> {\n const sessionDir = this.getSessionDir(sessionId);\n await fs.mkdir(sessionDir, { recursive: true });\n await this.artifactStore.ensureSessionArtifacts(sessionId);\n\n const runId = event.runId || 'unknown';\n const sessionSeq = await this.getNextSessionSeq(sessionId, runId);\n const line = JSON.stringify({ ...event, sessionSeq }) + '\\n';\n await fs.appendFile(this.getEventsPath(sessionId), line, 'utf-8');\n await fs.appendFile(this.artifactStore.getArtifactPath(sessionId, 'trace.ndjson'), line, 'utf-8');\n\n // Process event and update turn snapshot\n await this.processEventAndUpdateTurn(sessionId, { ...event, sessionSeq });\n }\n\n /**\n * Get all events for a session\n */\n async getSessionEvents(\n sessionId: string,\n options?: { limit?: number; offset?: number; types?: string[] }\n ): Promise<AgentEvent[]> {\n const eventsFile = this.getEventsPath(sessionId);\n\n try {\n const content = await fs.readFile(eventsFile, 'utf-8');\n\n // Parse NDJSON (one JSON object per line)\n let events: AgentEvent[] = content\n .split('\\n')\n .filter((line) => line.trim())\n .map((line) => {\n try {\n return JSON.parse(line);\n } catch {\n return null;\n }\n })\n .filter((e): e is AgentEvent => e !== null);\n\n // Filter by types\n if (options?.types?.length) {\n events = events.filter((e) => options.types!.includes(e.type));\n }\n\n // Apply pagination\n if (options?.offset) {\n events = events.slice(options.offset);\n }\n if (options?.limit) {\n events = events.slice(0, options.limit);\n }\n\n return events;\n } catch {\n return [];\n }\n }\n\n /**\n * Count events in session\n */\n async countEvents(sessionId: string, types?: string[]): Promise<number> {\n const events = await this.getSessionEvents(sessionId, { types });\n return events.length;\n }\n\n // ═══════════════════════════════════════════════════════════════════════\n // Conversation History (extracted from events)\n // ═══════════════════════════════════════════════════════════════════════\n\n /**\n * Extract conversation history from session events\n *\n * Parses events.ndjson to reconstruct user-agent conversation turns.\n * Uses agent:start events (without parentAgentId = top-level requests).\n * Uses agent:end for summaries.\n *\n * @param sessionId - Session ID\n * @param maxTurns - Maximum number of turns to return (default: 10)\n * @returns Array of conversation turns, oldest first\n */\n async getConversationHistory(\n sessionId: string,\n maxTurns = 10\n ): Promise<Array<{ userTask: string; agentResponse?: string; timestamp: string }>> {\n // Prefer canonical turn snapshots first.\n const fromTurns = await this.getConversationHistoryFromTurns(sessionId, maxTurns);\n if (fromTurns.length > 0) {\n return fromTurns;\n }\n\n // Fallback for legacy sessions without turns.\n const events = await this.getSessionEvents(sessionId);\n if (events.length === 0) {\n return [];\n }\n\n const turns: Array<{ userTask: string; agentResponse?: string; timestamp: string }> = [];\n let currentTurn: { userTask: string; agentResponse?: string; timestamp: string } | null = null;\n\n for (const event of events) {\n // Use agent:start without parentAgentId (top-level agent, not sub-agents)\n if (event.type === 'agent:start' && !event.parentAgentId) {\n // Save previous turn if exists\n if (currentTurn) {\n turns.push(currentTurn);\n }\n currentTurn = {\n userTask: (event.data as { task: string }).task,\n timestamp: event.timestamp,\n };\n }\n\n // Agent end - capture summary as response\n if (event.type === 'agent:end' && !event.parentAgentId && currentTurn) {\n const summary = (event.data as { summary: string }).summary;\n // Smart truncation: preserve beginning (context) and end (conclusions)\n if (summary.length > 2000) {\n const head = summary.slice(0, 1200);\n const tail = summary.slice(-700);\n currentTurn.agentResponse = `${head}\\n\\n[...${summary.length - 1900} chars omitted...]\\n\\n${tail}`;\n } else {\n currentTurn.agentResponse = summary;\n }\n }\n }\n\n // Don't forget the last turn\n if (currentTurn) {\n turns.push(currentTurn);\n }\n\n // Return last N turns (excluding current one which will be added by caller)\n // Skip the last turn if it doesn't have a response yet (current run)\n const completedTurns = turns.filter(t => t.agentResponse);\n return completedTurns.slice(-maxTurns);\n }\n\n /**\n * Build conversation history from canonical turn snapshots (turns.json).\n * This avoids lossy reconstruction from events summary.\n */\n private async getConversationHistoryFromTurns(\n sessionId: string,\n maxTurns: number\n ): Promise<ConversationTurn[]> {\n const turns = await this.getTurns(sessionId);\n if (turns.length === 0) {\n return [];\n }\n\n const sorted = [...turns].sort((a, b) => a.sequence - b.sequence);\n const conversation: ConversationTurn[] = [];\n const pendingUsers: Array<{ task: string; timestamp: string }> = [];\n\n for (const turn of sorted) {\n if (turn.type === 'user') {\n const userMessage = turn.steps.find((step) => step.type === 'text' && step.role === 'user');\n const task = (userMessage as { content?: string } | undefined)?.content?.trim();\n if (task) {\n pendingUsers.push({ task, timestamp: turn.startedAt });\n }\n continue;\n }\n\n if (turn.type !== 'assistant') {\n continue;\n }\n\n const assistantText = this.extractAssistantText(turn);\n if (!assistantText) {\n continue;\n }\n\n const pairedUser = pendingUsers.shift();\n conversation.push({\n userTask: pairedUser?.task || turn.metadata?.taskId || 'Follow-up request',\n agentResponse: assistantText,\n timestamp: pairedUser?.timestamp || turn.startedAt,\n });\n }\n\n return conversation.slice(-maxTurns);\n }\n\n private extractAssistantText(turn: Turn): string | undefined {\n const textSteps = turn.steps.filter(\n (step): step is Extract<Turn['steps'][number], { type: 'text' }> =>\n step.type === 'text' && step.role === 'assistant'\n );\n\n if (textSteps.length === 0) {\n return undefined;\n }\n\n const content = textSteps.map((step) => step.content?.trim()).filter(Boolean).join('\\n\\n');\n if (!content) {\n return undefined;\n }\n\n if (content.length > 3000) {\n const head = content.slice(0, 1800);\n const tail = content.slice(-900);\n return `${head}\\n\\n[...${content.length - 2700} chars omitted...]\\n\\n${tail}`;\n }\n return content;\n }\n\n /**\n * Get conversation history with progressive summarization for long sessions\n *\n * Strategy:\n * - Recent turns (last 3): Full context (up to 2000 chars each)\n * - Mid-term turns (4-10): Summarized (up to 500 chars each)\n * - Old turns (11+): Ultra-brief (up to 150 chars each, max 10 oldest)\n *\n * This keeps token usage bounded while maintaining context depth.\n *\n * @param sessionId - Session ID\n * @param llm - Optional LLM instance for intelligent summarization (if not provided, uses truncation)\n * @returns Structured history with recent/mid-term/old tiers\n */\n async getConversationHistoryWithSummarization(\n sessionId: string,\n llm?: { chat?: (messages: Array<{ role: string; content: string }>) => Promise<string> }\n ): Promise<{\n recent: ConversationTurn[]; // last 3, full detail\n midTerm: ConversationTurn[]; // 4-10, summarized\n old: ConversationTurn[]; // 11+, ultra-brief\n }> {\n const allTurns = await this.getConversationHistory(sessionId, 100); // Get up to 100 turns\n\n if (allTurns.length === 0) {\n return { recent: [], midTerm: [], old: [] };\n }\n\n // Split into tiers (most recent first after reverse)\n const reversed = [...allTurns].reverse(); // Newest first\n const recent = reversed.slice(0, 3).reverse(); // Last 3, restore chronological order\n const midTermRaw = reversed.slice(3, 10).reverse(); // Turns 4-10\n const oldRaw = reversed.slice(10, 20).reverse(); // Turns 11-20 (max 10)\n\n // Recent: keep as-is (already truncated to 2000 in getConversationHistory)\n // Mid-term: summarize to 500 chars\n const midTerm: ConversationTurn[] = [];\n for (const turn of midTermRaw) {\n const response = turn.agentResponse || '';\n let summarized = response;\n\n if (response.length > 500) {\n if (llm?.chat) {\n // LLM-based intelligent summarization\n try {\n summarized = await llm.chat([\n {\n role: 'system',\n content:\n 'Summarize the following agent response in 2-3 sentences (max 500 chars). Keep key facts, file paths, and decisions.',\n },\n { role: 'user', content: response },\n ]);\n // Enforce hard limit\n if (summarized.length > 500) {\n summarized = summarized.slice(0, 497) + '...';\n }\n } catch {\n // Fallback to truncation\n summarized = response.slice(0, 497) + '...';\n }\n } else {\n // Simple truncation with head+tail\n const head = response.slice(0, 300);\n const tail = response.slice(-150);\n summarized = `${head}...[omitted]...${tail}`;\n }\n }\n\n midTerm.push({\n userTask: turn.userTask,\n agentResponse: summarized,\n timestamp: turn.timestamp,\n });\n }\n\n // Old: ultra-brief (150 chars max)\n const old: ConversationTurn[] = [];\n for (const turn of oldRaw) {\n const response = turn.agentResponse || '';\n let brief = response;\n\n if (response.length > 150) {\n if (llm?.chat) {\n // LLM-based ultra-brief summary\n try {\n brief = await llm.chat([\n {\n role: 'system',\n content: 'Summarize in ONE sentence (max 150 chars). Only the most critical point.',\n },\n { role: 'user', content: response },\n ]);\n if (brief.length > 150) {\n brief = brief.slice(0, 147) + '...';\n }\n } catch {\n // Fallback to simple truncation\n brief = response.slice(0, 147) + '...';\n }\n } else {\n // Extract first sentence or truncate\n const firstSentence = response.split(/[.!?]\\s/)[0];\n brief = firstSentence && firstSentence.length > 150\n ? firstSentence.slice(0, 147) + '...'\n : firstSentence || response.slice(0, 147) + '...';\n }\n }\n\n old.push({\n userTask: turn.userTask,\n agentResponse: brief,\n timestamp: turn.timestamp,\n });\n }\n\n return { recent, midTerm, old };\n }\n\n // ═══════════════════════════════════════════════════════════════════════\n // Turn Snapshots (NEW - Phase 1: Backend Turn Assembly)\n // ═══════════════════════════════════════════════════════════════════════\n\n /**\n * Store turn snapshot to turns.json\n * Serializes writes per session to prevent race-condition duplicates\n */\n async storeTurnSnapshot(sessionId: string, turn: Turn): Promise<void> {\n // Chain writes for same session so concurrent calls don't race\n const prev = this.writeQueues.get(sessionId) ?? Promise.resolve();\n const next = prev.then(() => this._writeTurnSnapshot(sessionId, turn));\n this.writeQueues.set(sessionId, next.catch(() => {})); // swallow to keep chain alive\n return next;\n }\n\n private async _writeTurnSnapshot(sessionId: string, turn: Turn): Promise<void> {\n const turnsPath = this.getTurnsPath(sessionId);\n const sessionDir = this.getSessionDir(sessionId);\n await fs.mkdir(sessionDir, { recursive: true });\n\n let turns: Turn[] = [];\n try {\n const content = await fs.readFile(turnsPath, 'utf-8');\n turns = JSON.parse(content);\n } catch {\n // File doesn't exist yet - start fresh\n }\n\n // Update or append turn\n const index = turns.findIndex((t) => t.id === turn.id);\n if (index >= 0) {\n turns[index] = turn;\n } else {\n turns.push(turn);\n }\n\n await fs.writeFile(turnsPath, JSON.stringify(turns, null, 2), 'utf-8');\n }\n\n /**\n * Attach file change summaries to the assistant turn for a given runId.\n * Called after agent.execute() completes to surface file changes in the UI.\n */\n async attachFileChangesToTurn(\n sessionId: string,\n runId: string,\n fileChanges: FileChangeSummary[]\n ): Promise<void> {\n const prev = this.writeQueues.get(sessionId) ?? Promise.resolve();\n const next = prev.then(() => this._attachFileChangesToTurn(sessionId, runId, fileChanges));\n this.writeQueues.set(sessionId, next.catch(() => {}));\n return next;\n }\n\n private async _attachFileChangesToTurn(\n sessionId: string,\n runId: string,\n fileChanges: FileChangeSummary[]\n ): Promise<void> {\n const turnsPath = this.getTurnsPath(sessionId);\n\n let turns: Turn[] = [];\n try {\n const content = await fs.readFile(turnsPath, 'utf-8');\n turns = JSON.parse(content);\n } catch {\n return; // No turns file yet\n }\n\n // Find the assistant turn for this runId\n const turnIndex = turns.findIndex(\n (t) => t.type === 'assistant' && t.metadata?.runId === runId\n );\n if (turnIndex < 0) {\n return; // Turn not found — may happen if run was never persisted\n }\n\n turns[turnIndex]!.metadata.fileChanges = fileChanges;\n await fs.writeFile(turnsPath, JSON.stringify(turns, null, 2), 'utf-8');\n }\n\n /**\n * Update fileChanges metadata on a turn (e.g. after approve/rollback).\n * Patches individual change entries by changeId.\n */\n async updateTurnFileChanges(\n sessionId: string,\n runId: string,\n updatedChanges: import('@kb-labs/agent-contracts').FileChangeSummary[]\n ): Promise<void> {\n const turnsPath = this.getTurnsPath(sessionId);\n let turns: Turn[] = [];\n try {\n const content = await fs.readFile(turnsPath, 'utf-8');\n turns = JSON.parse(content);\n } catch {\n return;\n }\n\n const turnIndex = turns.findIndex(\n (t) => t.type === 'assistant' && t.metadata?.runId === runId\n );\n if (turnIndex < 0) {return;}\n\n const existing = turns[turnIndex]!.metadata.fileChanges ?? [];\n const patchMap = new Map(updatedChanges.map((c) => [c.changeId, c]));\n turns[turnIndex]!.metadata.fileChanges = existing.map((c) =>\n patchMap.has(c.changeId) ? { ...c, ...patchMap.get(c.changeId) } : c\n );\n await fs.writeFile(turnsPath, JSON.stringify(turns, null, 2), 'utf-8');\n }\n\n /**\n * Load turn snapshots for session\n */\n async getTurns(sessionId: string): Promise<Turn[]> {\n const turnsPath = this.getTurnsPath(sessionId);\n\n try {\n const content = await fs.readFile(turnsPath, 'utf-8');\n const raw: Turn[] = JSON.parse(content);\n // Deduplicate by id (guard against race-condition duplicates in existing files)\n const seen = new Set<string>();\n return raw.filter((t) => {\n if (seen.has(t.id)) {return false;}\n seen.add(t.id);\n return true;\n });\n } catch {\n // File doesn't exist - try lazy migration from events\n return this.migrateTurnsFromEvents(sessionId);\n }\n }\n\n /**\n * Lazy migration: rebuild turns from events.ndjson\n * (for old sessions without turns.json)\n */\n private async migrateTurnsFromEvents(sessionId: string): Promise<Turn[]> {\n console.log(`[SessionManager] Migrating session ${sessionId} to turn format...`);\n\n const events = await this.getSessionEvents(sessionId);\n if (events.length === 0) {\n return [];\n }\n\n const assembler = new TurnAssembler();\n const completedTurns: Turn[] = [];\n\n for (const event of events) {\n const turn = assembler.processEvent(event);\n if (turn && turn.status === 'completed') {\n completedTurns.push(turn);\n }\n }\n\n // Add any active turns\n const activeTurns = assembler.getActiveTurns();\n const allTurns = [...completedTurns, ...activeTurns];\n\n // Cache for future use\n if (allTurns.length > 0) {\n const turnsPath = this.getTurnsPath(sessionId);\n await fs.writeFile(turnsPath, JSON.stringify(allTurns, null, 2), 'utf-8');\n }\n\n return allTurns;\n }\n\n /**\n * Get conversation snapshot for WebSocket connections\n * Returns last 20 completed turns + active turns\n */\n async getConversationSnapshot(sessionId: string): Promise<{\n completedTurns: Turn[];\n activeTurns: Turn[];\n totalTurns: number;\n }> {\n const turns = await this.getTurns(sessionId);\n const activeTurns = turns.filter((t) => t.status === 'streaming');\n\n // Keep last 20 completed turns for history\n const completedTurns = turns\n .filter((t) => t.status === 'completed' || t.status === 'failed')\n .slice(-20);\n\n return {\n completedTurns,\n activeTurns,\n totalTurns: turns.length,\n };\n }\n\n /**\n * Create user turn with task/question\n * Called when user submits a task to agent\n */\n async createUserTurn(sessionId: string, task: string, runId: string): Promise<Turn> {\n const sequence = await this.reserveNextTurnSequence(sessionId);\n const timestamp = new Date().toISOString();\n\n const userTurn: Turn = {\n id: `turn-${runId}-user`,\n type: 'user',\n sequence,\n startedAt: timestamp,\n completedAt: timestamp, // User turn is immediately complete\n status: 'completed',\n steps: [\n {\n type: 'text',\n id: `step-1`,\n timestamp,\n content: task,\n role: 'user',\n },\n ],\n metadata: {\n agentId: 'user',\n },\n };\n\n await this.storeTurnSnapshot(sessionId, userTurn);\n return userTurn;\n }\n\n /**\n * Reserve next turn sequence number atomically per session.\n * Uses the same serialized write queue as turns.json updates.\n */\n private async reserveNextTurnSequence(sessionId: string): Promise<number> {\n let reserved = 1;\n const prev = this.writeQueues.get(sessionId) ?? Promise.resolve();\n const next = prev.then(async () => {\n if (!this.turnSeqCounters.has(sessionId)) {\n const turns = await this.getTurns(sessionId);\n const maxSequence = turns.length === 0 ? 0 : Math.max(...turns.map((t) => t.sequence));\n this.turnSeqCounters.set(sessionId, maxSequence);\n }\n reserved = (this.turnSeqCounters.get(sessionId) ?? 0) + 1;\n this.turnSeqCounters.set(sessionId, reserved);\n });\n this.writeQueues.set(sessionId, next.catch(() => {}));\n await next;\n return reserved;\n }\n\n /**\n * Process event and update turn snapshot\n * Returns updated turn if changed, null otherwise\n */\n async processEventAndUpdateTurn(sessionId: string, event: AgentEvent): Promise<Turn | null> {\n // Pass sequence generator to assembler\n const turn = await this.assembler.processEventAsync(event, async (sid) => {\n return this.reserveNextTurnSequence(sid);\n });\n\n if (turn) {\n // Stamp runId on the turn so fileChanges can be associated by runId later\n if (event.runId && turn.type === 'assistant' && !turn.metadata.runId) {\n turn.metadata.runId = event.runId;\n }\n\n await this.storeTurnSnapshot(sessionId, turn);\n return turn;\n }\n\n return null;\n }\n\n /**\n * Store extracted trace artifacts for a completed run.\n */\n async storeTraceArtifacts(sessionId: string, runId: string, traceEntries: Array<Record<string, unknown>>): Promise<void> {\n if (!runId || traceEntries.length === 0) {\n return;\n }\n\n await this.updateArtifacts(sessionId, (state) => {\n const extracted = this.extractTraceArtifacts(traceEntries);\n if (\n extracted.facts.length === 0 &&\n extracted.findings.length === 0 &&\n extracted.decisions.length === 0 &&\n extracted.assumptions.length === 0 &&\n extracted.scopeHints.length === 0\n ) {\n return state;\n }\n\n const existing = state.byRun[runId] || this.createEmptyArtifacts();\n state.byRun[runId] = this.mergeArtifacts(existing, extracted);\n state.merged = this.mergeArtifacts(state.merged, extracted);\n state.updatedAt = new Date().toISOString();\n return state;\n });\n }\n\n /**\n * Render compact trace-memory context for prompt injection.\n */\n async getTraceArtifactsContext(sessionId: string): Promise<string> {\n const state = await this.loadArtifacts(sessionId);\n const merged = state.merged;\n\n const lines: string[] = [];\n const facts = merged.facts.slice(-5);\n const findings = merged.findings.slice(-5);\n const decisions = merged.decisions.slice(-5);\n const scopeHints = merged.scopeHints.slice(-5);\n\n if (facts.length > 0) {\n lines.push('Facts from trace memory:');\n for (const fact of facts) {lines.push(`- ${fact}`);}\n }\n if (findings.length > 0) {\n lines.push('Key findings from trace memory:');\n for (const finding of findings) {lines.push(`- ${finding}`);}\n }\n if (decisions.length > 0) {\n lines.push('Recent reasoning decisions:');\n for (const decision of decisions) {lines.push(`- ${decision}`);}\n }\n if (scopeHints.length > 0) {\n lines.push('Scope hints (paths used before):');\n for (const hint of scopeHints) {lines.push(`- ${hint}`);}\n }\n\n if (lines.length === 0) {\n return '';\n }\n\n return `# Trace Memory Artifacts\\n${lines.join('\\n')}\\n`;\n }\n\n private async loadArtifacts(sessionId: string): Promise<SessionTraceArtifacts> {\n const artifactsPath = this.getArtifactsPath(sessionId);\n try {\n const raw = JSON.parse(await fs.readFile(artifactsPath, 'utf-8')) as SessionTraceArtifacts;\n return {\n version: raw.version || 1,\n updatedAt: raw.updatedAt || new Date().toISOString(),\n byRun: raw.byRun || {},\n merged: raw.merged || this.createEmptyArtifacts(),\n };\n } catch {\n return {\n version: 1,\n updatedAt: new Date().toISOString(),\n byRun: {},\n merged: this.createEmptyArtifacts(),\n };\n }\n }\n\n private async updateArtifacts(\n sessionId: string,\n updater: (state: SessionTraceArtifacts) => SessionTraceArtifacts\n ): Promise<void> {\n const prev = this.artifactWriteQueues.get(sessionId) ?? Promise.resolve();\n const next = prev.then(async () => {\n const state = await this.loadArtifacts(sessionId);\n const updated = updater(state);\n const sessionDir = this.getSessionDir(sessionId);\n await fs.mkdir(sessionDir, { recursive: true });\n await fs.writeFile(this.getArtifactsPath(sessionId), JSON.stringify(updated, null, 2), 'utf-8');\n });\n this.artifactWriteQueues.set(sessionId, next.catch(() => {}));\n await next;\n }\n\n private extractTraceArtifacts(entries: Array<Record<string, unknown>>): RunTraceArtifacts {\n const artifacts = this.createEmptyArtifacts();\n\n for (const entry of entries) {\n const type = typeof entry.type === 'string' ? entry.type : '';\n\n if (type === 'memory:snapshot') {\n const sharedMemory = (entry.sharedMemory as Record<string, unknown> | undefined) || {};\n const facts = Array.isArray(sharedMemory.facts) ? sharedMemory.facts : [];\n const findings = Array.isArray(sharedMemory.findings) ? sharedMemory.findings : [];\n for (const fact of facts) {\n if (typeof fact === 'string') {artifacts.facts.push(fact);}\n }\n for (const finding of findings) {\n if (typeof finding === 'string') {artifacts.findings.push(finding);}\n }\n }\n\n if (type === 'stopping:analysis') {\n const reasoning = typeof entry.reasoning === 'string' ? entry.reasoning.trim() : '';\n if (reasoning) {artifacts.decisions.push(reasoning);}\n }\n\n if (type === 'context:trim') {\n const strategy = typeof entry.strategy === 'string' ? entry.strategy : 'unknown';\n artifacts.decisions.push(`Context trimmed (${strategy})`);\n }\n\n if (type === 'tool:execution') {\n const tool = (entry.tool as Record<string, unknown> | undefined) || {};\n const input = (entry.input as Record<string, unknown> | undefined) || {};\n const toolName = typeof tool.name === 'string' ? tool.name : '';\n const pathLike = input.path;\n const directoryLike = input.directory;\n\n if (toolName) {\n artifacts.assumptions.push(`Used tool: ${toolName}`);\n }\n if (typeof pathLike === 'string' && pathLike.trim()) {\n artifacts.scopeHints.push(pathLike.trim());\n }\n if (typeof directoryLike === 'string' && directoryLike.trim()) {\n artifacts.scopeHints.push(directoryLike.trim());\n }\n }\n }\n\n return {\n facts: this.uniqueTail(artifacts.facts, 30),\n findings: this.uniqueTail(artifacts.findings, 30),\n decisions: this.uniqueTail(artifacts.decisions, 30),\n assumptions: this.uniqueTail(artifacts.assumptions, 30),\n scopeHints: this.uniqueTail(artifacts.scopeHints, 30),\n };\n }\n\n private mergeArtifacts(a: RunTraceArtifacts, b: RunTraceArtifacts): RunTraceArtifacts {\n return {\n facts: this.uniqueTail([...a.facts, ...b.facts], 30),\n findings: this.uniqueTail([...a.findings, ...b.findings], 30),\n decisions: this.uniqueTail([...a.decisions, ...b.decisions], 30),\n assumptions: this.uniqueTail([...a.assumptions, ...b.assumptions], 30),\n scopeHints: this.uniqueTail([...a.scopeHints, ...b.scopeHints], 30),\n };\n }\n\n private uniqueTail(items: string[], max: number): string[] {\n const seen = new Set<string>();\n const unique = items\n .map((item) => item.trim())\n .filter(Boolean)\n .reverse()\n .filter((item) => {\n if (seen.has(item)) {return false;}\n seen.add(item);\n return true;\n })\n .reverse();\n return unique.slice(-max);\n }\n\n private createEmptyArtifacts(): RunTraceArtifacts {\n return {\n facts: [],\n findings: [],\n decisions: [],\n assumptions: [],\n scopeHints: [],\n };\n }\n\n // ═══════════════════════════════════════════════════════════════════════\n // Path Helpers\n // ═══════════════════════════════════════════════════════════════════════\n\n /**\n * Get session directory path\n */\n getSessionDir(sessionId: string): string {\n return path.join(this.workingDir, '.kb', 'agents', 'sessions', sessionId);\n }\n\n /**\n * Get events file path (NDJSON format)\n */\n getEventsPath(sessionId: string): string {\n return path.join(this.getSessionDir(sessionId), 'events.ndjson');\n }\n\n /**\n * Get session plan file path\n */\n getSessionPlanPath(sessionId: string): string {\n return path.join(this.getSessionDir(sessionId), 'plan.json');\n }\n\n /**\n * Get session spec JSON file path\n */\n getSessionSpecPath(sessionId: string): string {\n return path.join(this.getSessionDir(sessionId), 'spec.json');\n }\n\n /**\n * Get session spec markdown file path\n */\n getSessionSpecMdPath(sessionId: string): string {\n return path.join(this.getSessionDir(sessionId), 'spec.md');\n }\n\n /**\n * Get session progress file path\n */\n getSessionProgressPath(sessionId: string): string {\n return path.join(this.getSessionDir(sessionId), 'progress.json');\n }\n\n /**\n * Get turns file path (Turn snapshots JSON)\n */\n getTurnsPath(sessionId: string): string {\n return path.join(this.getSessionDir(sessionId), 'turns.json');\n }\n\n /**\n * Get trace artifacts projection path\n */\n getArtifactsPath(sessionId: string): string {\n return path.join(this.getSessionDir(sessionId), 'trace-artifacts.json');\n }\n\n /**\n * Get KPI baseline projection path\n */\n getKpiBaselinePath(sessionId: string): string {\n return path.join(this.getSessionDir(sessionId), 'kpi-baseline.json');\n }\n\n /**\n * Read persisted KPI baseline for this session.\n */\n async getKpiBaseline(sessionId: string): Promise<SessionKpiBaseline | null> {\n try {\n const raw = JSON.parse(await fs.readFile(this.getKpiBaselinePath(sessionId), 'utf-8')) as Partial<SessionKpiBaseline>;\n if (\n typeof raw.driftRateEma !== 'number'\n || typeof raw.evidenceDensityEma !== 'number'\n || typeof raw.toolErrorRateEma !== 'number'\n || typeof raw.samples !== 'number'\n ) {\n return null;\n }\n\n return {\n version: raw.version || 1,\n updatedAt: raw.updatedAt || new Date().toISOString(),\n driftRateEma: raw.driftRateEma,\n evidenceDensityEma: raw.evidenceDensityEma,\n toolErrorRateEma: raw.toolErrorRateEma,\n samples: raw.samples,\n tokenHistory: Array.isArray(raw.tokenHistory)\n ? raw.tokenHistory.filter((value): value is number => typeof value === 'number' && Number.isFinite(value)).slice(-50)\n : [],\n iterationUtilizationHistory: Array.isArray(raw.iterationUtilizationHistory)\n ? raw.iterationUtilizationHistory.filter((value): value is number => typeof value === 'number' && Number.isFinite(value)).slice(-50)\n : [],\n qualityScoreHistory: Array.isArray(raw.qualityScoreHistory)\n ? raw.qualityScoreHistory.filter((value): value is number => typeof value === 'number' && Number.isFinite(value)).slice(-50)\n : [],\n };\n } catch {\n return null;\n }\n }\n\n /**\n * Update persisted KPI baseline with serialized writes per session.\n */\n async updateKpiBaseline(\n sessionId: string,\n updater: (current: SessionKpiBaseline | null) => SessionKpiBaseline\n ): Promise<void> {\n const prev = this.kpiWriteQueues.get(sessionId) ?? Promise.resolve();\n const next = prev.then(async () => {\n const current = await this.getKpiBaseline(sessionId);\n const updated = updater(current);\n const sessionDir = this.getSessionDir(sessionId);\n await fs.mkdir(sessionDir, { recursive: true });\n await fs.writeFile(this.getKpiBaselinePath(sessionId), JSON.stringify(updated, null, 2), 'utf-8');\n });\n this.kpiWriteQueues.set(sessionId, next.catch(() => {}));\n await next;\n }\n}\n","/**\n * Plan Output Validator — deterministic rubric-based quality gate for generated plans.\n *\n * Checks specificity, actionability, completeness, and verification without LLM calls.\n * Returns a composite score (0–1) and pass/fail verdict.\n */\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type Severity = 'error' | 'warning' | 'info';\n\nexport interface ValidatorIssue {\n dimension: 'specificity' | 'actionability' | 'completeness' | 'verification';\n severity: Severity;\n message: string;\n}\n\nexport interface RubricScore {\n raw: number; // 0.0–1.0 before weighting\n weighted: number; // raw * weight\n details: string;\n}\n\nexport interface PlanValidationResult {\n passed: boolean;\n score: number;\n rubric: {\n specificity: RubricScore;\n actionability: RubricScore;\n completeness: RubricScore;\n verification: RubricScore;\n };\n issues: ValidatorIssue[];\n}\n\n// ---------------------------------------------------------------------------\n// Weights\n// ---------------------------------------------------------------------------\n\nconst W_SPECIFICITY = 0.30;\nconst W_ACTIONABILITY = 0.35;\nconst W_COMPLETENESS = 0.15;\nconst W_VERIFICATION = 0.20;\n\nconst PASS_THRESHOLD = 0.35;\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Detect file-path-like tokens: `foo/bar.ts`, `src/index.js`, etc. */\nconst FILE_PATH_RE = /[\\w@.-]+\\/[\\w@.-]+\\.[\\w]{1,5}/g;\n\n/** Detect backtick-wrapped shell commands or bare pnpm/npm/npx/git invocations. */\nconst COMMAND_RE = /(?:`[^`]+`)|(?:(?:pnpm|npm|npx|git|yarn|bun)\\s+\\S+)/g;\n\n/** Extract bullet items (- or 1.) and table data rows from markdown. */\nfunction extractBullets(text: string): string[] {\n const bullets = (text.match(/^\\s*(?:[-*]|\\d+\\.)\\s+(.+)$/gm) || [])\n .map((line) => line.replace(/^\\s*(?:[-*]|\\d+\\.)\\s+/, '').trim())\n .filter(Boolean);\n // Also treat non-separator table rows as actionable items\n const tableRows = (text.match(/^\\|(?![-:]+\\|).+\\|$/gm) || [])\n .map((line) => line.replace(/^\\||\\|$/g, '').trim())\n .filter(Boolean);\n return [...bullets, ...tableRows];\n}\n\n/** Clamp to [0, 1]. */\nfunction clamp01(n: number): number {\n return Math.max(0, Math.min(1, n));\n}\n\n/** Get text under a heading (## or ###) until the next heading of same or higher level. */\nfunction getSectionBody(text: string, headingRe: RegExp): string {\n const lines = text.split('\\n');\n let capturing = false;\n let captureLevel = 0;\n const result: string[] = [];\n for (const line of lines) {\n if (headingRe.test(line)) {\n capturing = true;\n const match = /^(#{1,6})\\s+/.exec(line);\n captureLevel = match ? match[1]!.length : 2;\n continue;\n }\n if (capturing) {\n const headingMatch = /^(#{1,6})\\s+/.exec(line);\n if (headingMatch && headingMatch[1]!.length <= captureLevel) {break;}\n result.push(line);\n }\n }\n return result.join('\\n');\n}\n\nfunction countNonEmptyLines(section: string): number {\n return section.split('\\n').filter((l) => l.trim().length > 0).length;\n}\n\n// ---------------------------------------------------------------------------\n// Validator\n// ---------------------------------------------------------------------------\n\nexport class PlanValidator {\n /**\n * Validate a markdown plan and return rubric-based scoring.\n */\n validate(markdown: string): PlanValidationResult {\n const text = (markdown || '').replace(/\\r\\n/g, '\\n').trim();\n const issues: ValidatorIssue[] = [];\n\n // ----- Specificity (0.30) -----\n const specificity = this.scoreSpecificity(text, issues);\n\n // ----- Actionability (0.35) -----\n const actionability = this.scoreActionability(text, issues);\n\n // ----- Completeness (0.15) -----\n const completeness = this.scoreCompleteness(text, issues);\n\n // ----- Verification (0.20) -----\n const verification = this.scoreVerification(text, issues);\n\n const score = clamp01(\n specificity.weighted +\n actionability.weighted +\n completeness.weighted +\n verification.weighted\n );\n\n const hasErrors = issues.some((i) => i.severity === 'error');\n const passed = score >= PASS_THRESHOLD && !hasErrors;\n\n return {\n passed,\n score,\n rubric: { specificity, actionability, completeness, verification },\n issues,\n };\n }\n\n // -----------------------------------------------------------------------\n // Specificity — real file paths in the plan\n // -----------------------------------------------------------------------\n\n private scoreSpecificity(text: string, issues: ValidatorIssue[]): RubricScore {\n const matches = text.match(FILE_PATH_RE) || [];\n const unique = new Set(matches.map((m) => m.toLowerCase()));\n const count = unique.size;\n\n let raw: number;\n if (count >= 5) {\n raw = 1.0;\n } else if (count >= 2) {\n raw = 0.5 + (count - 2) * 0.167; // 2→0.5, 5→1.0\n } else if (count === 1) {\n raw = 0.25;\n } else {\n raw = 0;\n }\n raw = clamp01(raw);\n\n if (count === 0) {\n issues.push({\n dimension: 'specificity',\n severity: 'warning',\n message: 'Plan contains no file paths — consider adding specific file references.',\n });\n } else if (count < 2) {\n issues.push({\n dimension: 'specificity',\n severity: 'warning',\n message: `Only ${count} unique file path found. Plans should reference specific files.`,\n });\n }\n\n return { raw, weighted: raw * W_SPECIFICITY, details: `${count} unique file path(s)` };\n }\n\n // -----------------------------------------------------------------------\n // Actionability — steps with concrete actions (file path / command / tool)\n // -----------------------------------------------------------------------\n\n private scoreActionability(text: string, issues: ValidatorIssue[]): RubricScore {\n const bullets = extractBullets(text);\n if (bullets.length === 0) {\n issues.push({\n dimension: 'actionability',\n severity: 'error',\n message: 'Plan has no bullet/numbered steps — nothing to execute.',\n });\n return { raw: 0, weighted: 0, details: '0 steps' };\n }\n\n let actionable = 0;\n for (const bullet of bullets) {\n const hasPath = FILE_PATH_RE.test(bullet);\n FILE_PATH_RE.lastIndex = 0;\n const hasCmd = COMMAND_RE.test(bullet);\n COMMAND_RE.lastIndex = 0;\n if (hasPath || hasCmd) {actionable++;}\n }\n\n const ratio = actionable / bullets.length;\n const raw = clamp01(ratio);\n\n if (actionable === 0) {\n issues.push({\n dimension: 'actionability',\n severity: 'error',\n message: 'No step contains a file path or command — plan is purely descriptive.',\n });\n } else if (ratio < 0.3) {\n issues.push({\n dimension: 'actionability',\n severity: 'warning',\n message: `Only ${actionable}/${bullets.length} steps reference files or commands.`,\n });\n }\n\n return {\n raw,\n weighted: raw * W_ACTIONABILITY,\n details: `${actionable}/${bullets.length} actionable steps`,\n };\n }\n\n // -----------------------------------------------------------------------\n // Completeness — required sections with substance\n // -----------------------------------------------------------------------\n\n private scoreCompleteness(text: string, issues: ValidatorIssue[]): RubricScore {\n const sections: Array<{ name: string; re: RegExp; required: boolean }> = [\n { name: 'Task', re: /^#{2,3}\\s+(task|objective)\\b/im, required: true },\n { name: 'Steps', re: /^#{2,3}\\s+(steps?|execution plan|phases?|steps\\/phases)\\b/im, required: true },\n { name: 'Risks', re: /^#{2,3}\\s+(risks?|risks\\s*&\\s*mitigations?)\\b/im, required: false },\n { name: 'Verification', re: /^#{2,3}\\s+(verification|verification checklist)\\b/im, required: true },\n ];\n\n let found = 0;\n let withSubstance = 0;\n\n for (const sec of sections) {\n if (sec.re.test(text)) {\n found++;\n const body = getSectionBody(text, sec.re);\n if (countNonEmptyLines(body) >= 2) {\n withSubstance++;\n } else {\n issues.push({\n dimension: 'completeness',\n severity: 'warning',\n message: `Section \"${sec.name}\" exists but has less than 2 lines of content.`,\n });\n }\n } else if (sec.required) {\n issues.push({\n dimension: 'completeness',\n severity: 'warning',\n message: `Missing required section: ${sec.name}.`,\n });\n }\n }\n\n const raw = clamp01(withSubstance / sections.length);\n\n if (found === 0) {\n issues.push({\n dimension: 'completeness',\n severity: 'error',\n message: 'Plan has no recognized sections (## Task, ## Steps, etc.).',\n });\n }\n\n return {\n raw,\n weighted: raw * W_COMPLETENESS,\n details: `${withSubstance}/${sections.length} sections with substance`,\n };\n }\n\n // -----------------------------------------------------------------------\n // Verification — runnable commands in verification section\n // -----------------------------------------------------------------------\n\n private scoreVerification(text: string, issues: ValidatorIssue[]): RubricScore {\n const verifBody = getSectionBody(text, /^#{2,3}\\s+(verification|verification checklist)\\b/im);\n\n if (!verifBody.trim()) {\n // Fall back to entire document for commands\n const cmds = text.match(COMMAND_RE) || [];\n if (cmds.length > 0) {\n issues.push({\n dimension: 'verification',\n severity: 'warning',\n message: 'Commands found outside Verification section.',\n });\n return { raw: 0.3, weighted: 0.3 * W_VERIFICATION, details: `${cmds.length} commands (outside section)` };\n }\n\n issues.push({\n dimension: 'verification',\n severity: 'error',\n message: 'No verification commands found anywhere in the plan.',\n });\n return { raw: 0, weighted: 0, details: '0 commands' };\n }\n\n const cmds = verifBody.match(COMMAND_RE) || [];\n let raw: number;\n if (cmds.length >= 3) {\n raw = 1.0;\n } else if (cmds.length >= 1) {\n raw = 0.4 + cmds.length * 0.2;\n } else {\n raw = 0;\n issues.push({\n dimension: 'verification',\n severity: 'warning',\n message: 'Verification section exists but contains no runnable commands.',\n });\n }\n raw = clamp01(raw);\n\n return {\n raw,\n weighted: raw * W_VERIFICATION,\n details: `${cmds.length} verification command(s)`,\n };\n }\n}\n","import { promises as fs } from 'node:fs';\nimport * as path from 'node:path';\nimport type { TaskPlan } from '@kb-labs/agent-contracts';\n\ninterface PlanDocumentServiceOptions {\n plansDir?: string;\n}\n\nexport class PlanDocumentService {\n private readonly workingDir: string;\n private readonly plansDir: string;\n\n constructor(workingDir: string, options: PlanDocumentServiceOptions = {}) {\n this.workingDir = workingDir;\n this.plansDir = options.plansDir ?? path.join(this.workingDir, 'docs', 'plans', 'agents');\n }\n\n getPlansDir(): string {\n return this.plansDir;\n }\n\n getPlanPath(plan: TaskPlan): string {\n const date = new Date(plan.createdAt || Date.now()).toISOString().slice(0, 10);\n const slug = this.slugify(plan.task || 'plan');\n const idSuffix = (plan.id || 'plan').replace(/[^a-zA-Z0-9-]/g, '').slice(-12) || 'plan';\n const filename = `${date}-${slug}-${idSuffix}.md`;\n return path.join(this.plansDir, filename);\n }\n\n async createDraft(plan: TaskPlan): Promise<{ path: string; markdown: string }> {\n const planPath = this.getPlanPath(plan);\n await fs.mkdir(path.dirname(planPath), { recursive: true });\n\n const source = typeof plan.markdown === 'string' && plan.markdown.trim().length > 0\n ? plan.markdown\n : this.renderDraft(plan);\n const markdown = this.refreshToc(source);\n await fs.writeFile(planPath, markdown, 'utf-8');\n\n return { path: planPath, markdown };\n }\n\n renderDraft(plan: TaskPlan): string {\n return this.buildDraftMarkdown(plan);\n }\n\n async reviseDraft(planPath: string, markdown: string): Promise<string> {\n const updated = this.refreshToc(markdown);\n await fs.mkdir(path.dirname(planPath), { recursive: true });\n await fs.writeFile(planPath, updated, 'utf-8');\n return updated;\n }\n\n async appendExecutionLog(planPath: string, entry: string): Promise<string> {\n let current = '';\n try {\n current = await fs.readFile(planPath, 'utf-8');\n } catch {\n current = '# Plan\\n\\n## Execution Log\\n';\n }\n\n const marker = /^##\\s+Execution Log\\s*$/m;\n let next: string;\n if (marker.test(current)) {\n next = `${current.trimEnd()}\\n\\n${entry.trim()}\\n`;\n } else {\n next = `${current.trimEnd()}\\n\\n## Execution Log\\n\\n${entry.trim()}\\n`;\n }\n\n const updated = this.refreshToc(next);\n await fs.writeFile(planPath, updated, 'utf-8');\n return updated;\n }\n\n refreshToc(markdown: string): string {\n const normalized = markdown.replace(/\\r\\n/g, '\\n');\n const withoutToc = this.removeExistingToc(normalized);\n const lines = withoutToc.split('\\n');\n\n const titleIndex = lines.findIndex((line) => /^#\\s+/.test(line));\n if (titleIndex < 0) {\n return withoutToc;\n }\n\n const headingEntries = this.collectHeadings(withoutToc);\n const tocLines = this.renderToc(headingEntries);\n const tocBlock = ['## Table of Contents', ...tocLines].join('\\n');\n\n const before = lines.slice(0, titleIndex + 1).join('\\n').trimEnd();\n const after = lines.slice(titleIndex + 1).join('\\n').replace(/^\\n+/, '');\n\n const combined = [before, '', tocBlock, '', after.trimEnd()]\n .filter((part) => part.length > 0)\n .join('\\n');\n\n return `${combined}\\n`;\n }\n\n private buildDraftMarkdown(plan: TaskPlan): string {\n const phaseCommands = this.collectVerificationCommands(plan);\n const phaseSections = plan.phases\n .map((phase, phaseIndex) => {\n const keySteps = this.expandPhaseKeySteps(phase).slice(0, 6);\n const expectedResults = this.collectPhaseExpectedResults(phase).slice(0, 3);\n\n return [\n `### ${phase.name || `Phase ${phaseIndex + 1}`}`,\n '',\n phase.description || '(scope not specified)',\n '',\n '**Steps:**',\n ...(keySteps.length > 0\n ? keySteps.map((step) => `- ${step}`)\n : ['- (no concrete steps provided)']),\n '',\n '**Expected outcome:**',\n ...(expectedResults.length > 0\n ? expectedResults.map((result) => `- ${result}`)\n : ['- Phase objectives delivered and validated.']),\n '',\n ].join('\\n');\n })\n .join('\\n');\n\n const dependencyRisks = plan.phases\n .filter((phase) => phase.dependencies.length > 0)\n .map((phase) => `- ${phase.name || phase.id}: depends on ${phase.dependencies.join(', ')}`);\n\n return [\n `# Plan: ${plan.task || 'Untitled Task'}`,\n '',\n '## Task',\n '',\n '### Request',\n plan.task || '(not specified)',\n '',\n '### Target Outcome',\n `Move from current state to requested result for: ${plan.task || 'this task'}.`,\n '',\n '## Steps',\n '',\n phaseSections.trim(),\n '',\n '## Risks',\n '',\n '- Unknown coupling or side effects in touched components.',\n ...(dependencyRisks.length > 0 ? dependencyRisks : ['- Hidden dependencies may require plan adjustments during execution.']),\n '',\n '## Verification',\n '',\n '- Run focused checks for touched scope after major changes.',\n ...(phaseCommands.length > 0\n ? phaseCommands.map((command) => `- \\`${command}\\``)\n : []),\n '',\n '## Approval',\n '',\n `- **Status:** ${plan.status}`,\n '- **Approval Question:** Approve this plan for execution?',\n '',\n '## Execution Log',\n '',\n '- Execution has not started.',\n '',\n '## Revision Log',\n '',\n '| Version | Timestamp | Changed By | Reason | Summary |',\n '| --- | --- | --- | --- | --- |',\n `| 1 | ${plan.createdAt} | agent | initial_draft | Initial draft created. |`,\n '',\n ].join('\\n');\n }\n\n private expandPhaseKeySteps(phase: TaskPlan['phases'][number]): string[] {\n const normalized: string[] = [];\n\n for (const step of phase.steps) {\n const action = (step.action || '').trim();\n if (!action) {\n continue;\n }\n\n const prefixedOps = /^implement operations:\\s*/i.test(action)\n ? action.replace(/^implement operations:\\s*/i, '')\n : action;\n const chunks = prefixedOps\n .split(';')\n .map((chunk) => chunk.trim())\n .filter(Boolean);\n\n if (chunks.length > 1) {\n normalized.push(...chunks);\n } else {\n normalized.push(action);\n }\n }\n\n return Array.from(new Set(normalized)).map((item) => this.compactSentence(item));\n }\n\n private collectPhaseExpectedResults(phase: TaskPlan['phases'][number]): string[] {\n const results = phase.steps\n .map((step) => (step.expectedOutcome || '').trim())\n .filter(Boolean)\n .map((value) => this.compactSentence(value));\n return Array.from(new Set(results));\n }\n\n private collectVerificationCommands(plan: TaskPlan): string[] {\n const commands: string[] = [];\n for (const phase of plan.phases) {\n for (const step of phase.steps) {\n const tool = (step.tool || '').toLowerCase();\n const args = step.args || {};\n if (!tool.includes('shell') && !tool.includes('terminal') && !tool.includes('exec')) {\n continue;\n }\n const command = typeof args.command === 'string' ? args.command.trim() : '';\n if (command) {\n commands.push(this.compactSentence(command));\n }\n }\n }\n return Array.from(new Set(commands)).slice(0, 8);\n }\n\n private compactSentence(input: string): string {\n const compact = input.replace(/\\s+/g, ' ').trim();\n if (compact.length <= 180) {\n return compact;\n }\n return `${compact.slice(0, 177)}...`;\n }\n\n private removeExistingToc(markdown: string): string {\n const lines = markdown.split('\\n');\n const tocStart = lines.findIndex((line) => /^##\\s+Table of Contents\\s*$/i.test(line.trim()));\n if (tocStart < 0) {\n return markdown;\n }\n\n let tocEnd = lines.length;\n for (let i = tocStart + 1; i < lines.length; i++) {\n if (/^##\\s+/.test(lines[i] || '')) {\n tocEnd = i;\n break;\n }\n }\n\n const merged = [...lines.slice(0, tocStart), ...lines.slice(tocEnd)].join('\\n');\n return merged.replace(/\\n{3,}/g, '\\n\\n');\n }\n\n private collectHeadings(markdown: string): Array<{ level: 2 | 3; text: string; anchor: string }> {\n const lines = markdown.split('\\n');\n const counters = new Map<string, number>();\n const headings: Array<{ level: 2 | 3; text: string; anchor: string }> = [];\n\n for (const line of lines) {\n const match = /^(##|###)\\s+(.+?)\\s*$/.exec(line);\n if (!match) {\n continue;\n }\n const level = match[1] === '###' ? 3 : 2;\n const text = match[2]!.trim();\n if (/^table of contents$/i.test(text)) {\n continue;\n }\n\n const base = this.slugifyHeading(text);\n const count = counters.get(base) ?? 0;\n counters.set(base, count + 1);\n const anchor = count === 0 ? base : `${base}-${count}`;\n headings.push({ level, text, anchor });\n }\n\n return headings;\n }\n\n private renderToc(headings: Array<{ level: 2 | 3; text: string; anchor: string }>): string[] {\n return headings.map((heading) => {\n const indent = heading.level === 3 ? ' ' : '';\n return `${indent}- [${heading.text}](#${heading.anchor})`;\n });\n }\n\n private slugify(input: string): string {\n return input\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '')\n .trim()\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .slice(0, 60) || 'plan';\n }\n\n private slugifyHeading(input: string): string {\n return input\n .toLowerCase()\n .replace(/[`*_~[\\]()>#+.!?,:;'\"\\\\/]/g, '')\n .trim()\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-');\n }\n}\n","/**\n * Spec Output Validator — deterministic rubric-based quality gate for generated specs.\n *\n * Checks coverage (plan steps covered), precision (before/after diffs present),\n * and file validity without LLM calls.\n * Returns a composite score (0–1) and pass/fail verdict.\n */\n\nimport type { TaskPlan, TaskSpec } from '@kb-labs/agent-contracts';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type SpecSeverity = 'error' | 'warning' | 'info';\n\nexport interface SpecValidatorIssue {\n dimension: 'coverage' | 'precision' | 'files';\n severity: SpecSeverity;\n message: string;\n}\n\nexport interface SpecRubricScore {\n raw: number; // 0.0–1.0 before weighting\n weighted: number; // raw * weight\n details: string;\n}\n\nexport interface SpecValidationResult {\n passed: boolean;\n score: number;\n metrics: {\n planStepCount: number;\n coveredStepRefs: number;\n uncoveredStepCount: number;\n phaseCoverage: number;\n stepCoverage: number;\n diffPairs: number;\n };\n rubric: {\n coverage: SpecRubricScore;\n precision: SpecRubricScore;\n files: SpecRubricScore;\n };\n issues: SpecValidatorIssue[];\n}\n\n// ---------------------------------------------------------------------------\n// Weights\n// ---------------------------------------------------------------------------\n\nconst W_COVERAGE = 0.40;\nconst W_PRECISION = 0.35;\nconst W_FILES = 0.25;\n\nconst PASS_THRESHOLD = 0.60;\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Detect file-path-like tokens. */\nconst FILE_PATH_RE = /[\\w@.-]+\\/[\\w@.-]+\\.[\\w]{1,5}/;\n\nfunction clamp01(n: number): number {\n return Math.max(0, Math.min(1, n));\n}\n\n// ---------------------------------------------------------------------------\n// Validator\n// ---------------------------------------------------------------------------\n\nexport class SpecValidator {\n /**\n * Validate a spec against its source plan and return rubric-based scoring.\n */\n validate(spec: TaskSpec, plan: TaskPlan): SpecValidationResult {\n const issues: SpecValidatorIssue[] = [];\n\n const coverage = this.scoreCoverage(spec, plan, issues);\n const precision = this.scorePrecision(spec, issues);\n const files = this.scoreFiles(spec, issues);\n\n const score = clamp01(\n coverage.weighted +\n precision.weighted +\n files.weighted\n );\n const planStepCount = plan.phases.reduce((sum, phase) => sum + phase.steps.length, 0);\n const totalChanges = spec.sections.reduce((sum, section) => sum + section.changes.length, 0);\n const coveredStepRefs = Math.min(planStepCount, totalChanges);\n const coveredPhases = new Set(spec.sections.map((section) => section.planPhaseId)).size;\n const phaseCoverage = plan.phases.length > 0 ? clamp01(coveredPhases / plan.phases.length) : 0;\n const stepCoverage = planStepCount > 0 ? clamp01(coveredStepRefs / planStepCount) : 0;\n\n const hasErrors = issues.some((i) => i.severity === 'error');\n const passed = score >= PASS_THRESHOLD && !hasErrors;\n\n return {\n passed,\n score,\n metrics: {\n planStepCount,\n coveredStepRefs,\n uncoveredStepCount: Math.max(0, planStepCount - coveredStepRefs),\n phaseCoverage,\n stepCoverage,\n diffPairs: coveredStepRefs,\n },\n rubric: { coverage, precision, files },\n issues,\n };\n }\n\n /**\n * Validate from raw markdown (when structured spec is not yet parsed).\n */\n validateMarkdown(markdown: string, plan: TaskPlan): SpecValidationResult {\n const issues: SpecValidatorIssue[] = [];\n const text = (markdown || '').trim();\n\n if (!text) {\n issues.push({ dimension: 'coverage', severity: 'error', message: 'Spec is empty.' });\n const zero: SpecRubricScore = { raw: 0, weighted: 0, details: 'empty' };\n return {\n passed: false,\n score: 0,\n metrics: {\n planStepCount: plan.phases.reduce((sum, p) => sum + p.steps.length, 0),\n coveredStepRefs: 0,\n uncoveredStepCount: plan.phases.reduce((sum, p) => sum + p.steps.length, 0),\n phaseCoverage: 0,\n stepCoverage: 0,\n diffPairs: 0,\n },\n rubric: { coverage: zero, precision: zero, files: zero },\n issues,\n };\n }\n\n // Count before/after blocks\n const beforeBlocks = (text.match(/\\*\\*Before[^*]*\\*\\*:?/gi) || []).length;\n const afterBlocks = (text.match(/\\*\\*After[^*]*\\*\\*:?/gi) || []).length;\n const diffPairs = Math.min(beforeBlocks, afterBlocks);\n\n // Count plan steps\n const planStepCount = plan.phases.reduce((sum, p) => sum + p.steps.length, 0);\n\n const phaseRefs = new Set<string>();\n const stepRefs = new Set<string>();\n const headerRe = /^###\\s+\\[([^\\]]+)\\]/gm;\n let match: RegExpExecArray | null;\n while ((match = headerRe.exec(text)) !== null) {\n const ref = (match[1] || '').trim();\n if (!ref) {continue;}\n if (ref.includes(':')) {\n const [phaseId, stepId] = ref.split(':');\n if (phaseId) {phaseRefs.add(phaseId.trim());}\n if (stepId) {stepRefs.add(`${phaseId?.trim()}:${stepId.trim()}`);}\n } else {\n phaseRefs.add(ref);\n }\n }\n\n const phaseCoverage = plan.phases.length > 0 ? clamp01(phaseRefs.size / plan.phases.length) : 0;\n const stepRefCoverage = planStepCount > 0 ? clamp01(stepRefs.size / planStepCount) : 0;\n const diffCoverage = planStepCount > 0 ? clamp01(diffPairs / planStepCount) : 0;\n // Balanced coverage: explicit step references + actual diff pairs + phase spread.\n const covRatio = clamp01((diffCoverage * 0.5) + (stepRefCoverage * 0.35) + (phaseCoverage * 0.15));\n const coverage: SpecRubricScore = {\n raw: covRatio,\n weighted: covRatio * W_COVERAGE,\n details: `${diffPairs} diff pairs, step refs ${stepRefs.size}/${planStepCount}, phases ${phaseRefs.size}/${plan.phases.length}`,\n };\n\n if (diffPairs === 0) {\n issues.push({ dimension: 'coverage', severity: 'error', message: 'Spec has no before/after diff blocks.' });\n } else if (stepRefCoverage < 0.5) {\n issues.push({\n dimension: 'coverage',\n severity: 'error',\n message: `Insufficient step coverage: only ${stepRefs.size}/${planStepCount} plan steps referenced.`,\n });\n } else if (covRatio < 0.7) {\n issues.push({\n dimension: 'coverage',\n severity: 'warning',\n message: `Coverage is partial: ${stepRefs.size}/${planStepCount} steps, ${diffPairs}/${planStepCount} diff pairs.`,\n });\n }\n\n // Precision: check that before/after blocks have content (not empty)\n const codeBlocks = text.match(/```[\\s\\S]*?```/g) || [];\n const nonEmptyCodeBlocks = codeBlocks.filter((b) => b.replace(/```\\w*\\n?/g, '').trim().length > 0);\n const precRatio = codeBlocks.length > 0 ? clamp01(nonEmptyCodeBlocks.length / codeBlocks.length) : 0;\n const precision: SpecRubricScore = {\n raw: precRatio,\n weighted: precRatio * W_PRECISION,\n details: `${nonEmptyCodeBlocks.length}/${codeBlocks.length} non-empty code blocks`,\n };\n\n if (codeBlocks.length === 0) {\n issues.push({ dimension: 'precision', severity: 'error', message: 'Spec has no code blocks.' });\n }\n\n // Files: check file paths are present\n const fileMatches = text.match(/\\*\\*File:\\*\\*\\s*`[^`]+`/g) || [];\n const validFiles = fileMatches.filter((m) => {\n const path = m.replace(/\\*\\*File:\\*\\*\\s*`/, '').replace(/`$/, '');\n return FILE_PATH_RE.test(path);\n });\n const fileRatio = fileMatches.length > 0 ? clamp01(validFiles.length / fileMatches.length) : 0;\n const filesScore: SpecRubricScore = {\n raw: fileRatio,\n weighted: fileRatio * W_FILES,\n details: `${validFiles.length}/${fileMatches.length} valid file references`,\n };\n\n if (fileMatches.length === 0) {\n issues.push({ dimension: 'files', severity: 'error', message: 'Spec references no files.' });\n }\n\n const score = clamp01(coverage.weighted + precision.weighted + filesScore.weighted);\n const hasErrors = issues.some((i) => i.severity === 'error');\n\n const coveredStepRefs = Math.min(planStepCount, Math.max(stepRefs.size, diffPairs));\n return {\n passed: score >= PASS_THRESHOLD && !hasErrors,\n score,\n metrics: {\n planStepCount,\n coveredStepRefs,\n uncoveredStepCount: Math.max(0, planStepCount - coveredStepRefs),\n phaseCoverage,\n stepCoverage: stepRefCoverage,\n diffPairs,\n },\n rubric: { coverage, precision, files: filesScore },\n issues,\n };\n }\n\n // -----------------------------------------------------------------------\n // Coverage — all plan steps have corresponding spec sections\n // -----------------------------------------------------------------------\n\n private scoreCoverage(spec: TaskSpec, plan: TaskPlan, issues: SpecValidatorIssue[]): SpecRubricScore {\n const planStepCount = plan.phases.reduce((sum, p) => sum + p.steps.length, 0);\n const specSectionCount = spec.sections.length;\n const totalChanges = spec.sections.reduce((sum, s) => sum + s.changes.length, 0);\n\n if (planStepCount === 0) {\n return { raw: 1, weighted: W_COVERAGE, details: 'Plan has no steps' };\n }\n\n // Check which plan phases are covered\n const coveredPhases = new Set(spec.sections.map((s) => s.planPhaseId));\n const totalPhases = plan.phases.length;\n const phaseCoverage = coveredPhases.size / totalPhases;\n\n const stepCoverage = clamp01(totalChanges / planStepCount);\n const raw = clamp01((phaseCoverage * 0.5) + (stepCoverage * 0.5));\n\n if (specSectionCount === 0) {\n issues.push({ dimension: 'coverage', severity: 'error', message: 'Spec has no sections.' });\n } else if (stepCoverage < 0.5) {\n issues.push({\n dimension: 'coverage',\n severity: 'error',\n message: `Insufficient step coverage: only ${totalChanges}/${planStepCount} changes generated.`,\n });\n } else if (phaseCoverage < 0.5) {\n issues.push({\n dimension: 'coverage',\n severity: 'warning',\n message: `Only ${coveredPhases.size}/${totalPhases} plan phases covered in spec.`,\n });\n }\n\n return {\n raw,\n weighted: raw * W_COVERAGE,\n details: `${coveredPhases.size}/${totalPhases} phases, ${totalChanges}/${planStepCount} step-level changes`,\n };\n }\n\n // -----------------------------------------------------------------------\n // Precision — before/after diffs are non-empty\n // -----------------------------------------------------------------------\n\n private scorePrecision(spec: TaskSpec, issues: SpecValidatorIssue[]): SpecRubricScore {\n const allChanges = spec.sections.flatMap((s) => s.changes);\n if (allChanges.length === 0) {\n issues.push({ dimension: 'precision', severity: 'error', message: 'Spec has no code changes.' });\n return { raw: 0, weighted: 0, details: '0 changes' };\n }\n\n let withBothDiffs = 0;\n for (const change of allChanges) {\n if (change.before.trim().length > 0 && change.after.trim().length > 0) {\n withBothDiffs++;\n }\n }\n\n const raw = clamp01(withBothDiffs / allChanges.length);\n\n if (withBothDiffs === 0) {\n issues.push({ dimension: 'precision', severity: 'error', message: 'No changes have both before and after code.' });\n } else if (raw < 0.5) {\n issues.push({\n dimension: 'precision',\n severity: 'warning',\n message: `Only ${withBothDiffs}/${allChanges.length} changes have complete before/after diffs.`,\n });\n }\n\n return {\n raw,\n weighted: raw * W_PRECISION,\n details: `${withBothDiffs}/${allChanges.length} complete diffs`,\n };\n }\n\n // -----------------------------------------------------------------------\n // Files — valid file paths in changes\n // -----------------------------------------------------------------------\n\n private scoreFiles(spec: TaskSpec, issues: SpecValidatorIssue[]): SpecRubricScore {\n const allChanges = spec.sections.flatMap((s) => s.changes);\n if (allChanges.length === 0) {\n return { raw: 0, weighted: 0, details: '0 changes' };\n }\n\n let validPaths = 0;\n for (const change of allChanges) {\n if (FILE_PATH_RE.test(change.file)) {\n validPaths++;\n }\n }\n\n const raw = clamp01(validPaths / allChanges.length);\n\n if (validPaths === 0) {\n issues.push({ dimension: 'files', severity: 'error', message: 'No changes reference valid file paths.' });\n }\n\n return {\n raw,\n weighted: raw * W_FILES,\n details: `${validPaths}/${allChanges.length} valid file paths`,\n };\n }\n}\n","/**\n * ToolManager — single enforcement layer for tool registration and execution.\n *\n * Responsibilities:\n * 1. Register ToolPacks with namespace assignment and conflict resolution\n * 2. Resolve tool names (short or qualified) to the correct packed tool\n * 3. Enforce permissions (allowedPaths, deniedCommands, networkAllowed)\n * 4. Audit trail logging (when auditTrail: true)\n * 5. Delegate execution to the packed tool\n *\n * Tools and packs do NOT check permissions themselves — ToolManager does.\n */\n\nimport type {\n ToolPack,\n PackedTool,\n ResolvedTool,\n ToolFilter,\n ToolDefinition,\n ToolResult,\n} from '@kb-labs/agent-contracts';\n\nexport interface ToolManagerOptions {\n /** Called before each tool execution when pack has auditTrail: true */\n onAudit?: (toolName: string, packId: string, input: Record<string, unknown>) => void;\n /** Called on registration errors (for logging) */\n onError?: (message: string) => void;\n}\n\nexport class ToolManager {\n private readonly packs = new Map<string, ToolPack>();\n private readonly resolvedTools = new Map<string, ResolvedTool>();\n private readonly options: ToolManagerOptions;\n\n constructor(options: ToolManagerOptions = {}) {\n this.options = options;\n }\n\n // ── Registration ───────────────────────────────────────────────\n\n /**\n * Register a ToolPack. Handles namespace assignment and conflict resolution.\n * @throws If conflictPolicy is 'error' and a name collision occurs\n */\n register(pack: ToolPack): void {\n if (pack.enabled && !pack.enabled()) {\n return; // Pack is disabled, skip\n }\n\n if (this.packs.has(pack.id)) {\n throw new Error(`ToolPack \"${pack.id}\" is already registered`);\n }\n\n this.packs.set(pack.id, pack);\n\n for (const tool of pack.tools) {\n const shortName = tool.definition.function.name;\n const qualifiedName = `${pack.namespace}.${shortName}`;\n\n const existing = this.resolvedTools.get(shortName);\n\n if (existing) {\n this.resolveConflict(pack, tool, shortName, qualifiedName, existing);\n } else {\n // No conflict — register with short name\n this.resolvedTools.set(shortName, this.createResolved(pack, tool, shortName));\n }\n }\n }\n\n private resolveConflict(\n pack: ToolPack,\n tool: PackedTool,\n shortName: string,\n qualifiedName: string,\n existing: ResolvedTool,\n ): void {\n const existingPack = this.packs.get(existing.packId)!;\n\n // Both packs must agree on conflict policy (use the stricter one)\n const effectivePolicy =\n pack.conflictPolicy === 'error' || existingPack.conflictPolicy === 'error'\n ? 'error'\n : pack.conflictPolicy === 'namespace-prefix' || existingPack.conflictPolicy === 'namespace-prefix'\n ? 'namespace-prefix'\n : 'override';\n\n switch (effectivePolicy) {\n case 'error':\n throw new Error(\n `Tool name conflict: \"${shortName}\" exists in pack \"${existing.packId}\" ` +\n `and pack \"${pack.id}\". Both use conflictPolicy 'error'.`,\n );\n\n case 'namespace-prefix': {\n // Move existing to qualified name if not already\n if (existing.qualifiedName === shortName) {\n this.resolvedTools.delete(shortName);\n const existingQualified = `${existing.namespace}.${shortName}`;\n this.resolvedTools.set(\n existingQualified,\n this.createResolved(existingPack, this.findPackedTool(existingPack, shortName)!, existingQualified),\n );\n }\n // Register new with qualified name\n this.resolvedTools.set(qualifiedName, this.createResolved(pack, tool, qualifiedName));\n break;\n }\n\n case 'override': {\n // Higher priority wins\n const existingPackPriority = this.packs.get(existing.packId)?.priority ?? 0;\n if (pack.priority > existingPackPriority) {\n this.resolvedTools.set(shortName, this.createResolved(pack, tool, shortName));\n }\n // else: existing stays\n break;\n }\n }\n }\n\n private findPackedTool(pack: ToolPack, shortName: string): PackedTool | undefined {\n return pack.tools.find((t) => t.definition.function.name === shortName);\n }\n\n private createResolved(pack: ToolPack, tool: PackedTool, qualifiedName: string): ResolvedTool {\n const shortName = tool.definition.function.name;\n\n // Create a definition with the qualified name\n const definition: ToolDefinition = qualifiedName === shortName\n ? tool.definition\n : {\n ...tool.definition,\n function: {\n ...tool.definition.function,\n name: qualifiedName,\n },\n };\n\n return {\n qualifiedName,\n shortName,\n packId: pack.id,\n namespace: pack.namespace,\n definition,\n readOnly: tool.readOnly ?? false,\n concurrencySafe: tool.concurrencySafe ?? false,\n capability: tool.capability,\n execute: (input) => tool.execute(input),\n };\n }\n\n // ── Queries ────────────────────────────────────────────────────\n\n /**\n * Get all tool definitions matching the filter. Used to build the LLM tool list.\n */\n getDefinitions(filter?: ToolFilter): ToolDefinition[] {\n return this.getTools(filter).map((t) => t.definition);\n }\n\n /**\n * Get resolved tools matching the filter.\n */\n getTools(filter?: ToolFilter): ResolvedTool[] {\n let tools = [...this.resolvedTools.values()];\n\n if (filter?.readOnly) {\n tools = tools.filter((t) => t.readOnly);\n }\n if (filter?.capability) {\n tools = tools.filter((t) => t.capability === filter.capability);\n }\n if (filter?.namespace) {\n tools = tools.filter((t) => t.namespace === filter.namespace);\n }\n\n return tools;\n }\n\n /**\n * Get a single tool by name (short or qualified).\n */\n getTool(name: string): ResolvedTool | undefined {\n return this.resolvedTools.get(name);\n }\n\n /**\n * Get sorted list of tool names.\n */\n getToolNames(): string[] {\n return [...this.resolvedTools.keys()].sort();\n }\n\n /**\n * Check if a tool exists.\n */\n hasTool(name: string): boolean {\n return this.resolvedTools.has(name);\n }\n\n /**\n * Get all registered pack IDs.\n */\n getPackIds(): string[] {\n return [...this.packs.keys()];\n }\n\n // ── Execution ──────────────────────────────────────────────────\n\n /**\n * Execute a tool by name. This is the SINGLE enforcement layer:\n * 1. Resolve name → find tool\n * 2. Permission check (allowedPaths, deniedCommands, networkAllowed)\n * 3. Audit trail (if enabled)\n * 4. Delegate to pack executor\n */\n async execute(name: string, input: Record<string, unknown>): Promise<ToolResult> {\n const tool = this.resolvedTools.get(name);\n if (!tool) {\n return {\n success: false,\n error: `Tool \"${name}\" not found. Available: ${this.getToolNames().join(', ')}`,\n };\n }\n\n const pack = this.packs.get(tool.packId);\n if (!pack) {\n return {\n success: false,\n error: `Pack \"${tool.packId}\" not found for tool \"${name}\"`,\n };\n }\n\n // Permission check\n const permissionError = this.checkPermissions(pack, name, input);\n if (permissionError) {\n return permissionError;\n }\n\n // Audit trail\n if (pack.permissions?.auditTrail) {\n this.options.onAudit?.(name, pack.id, input);\n }\n\n // Delegate\n return tool.execute(input);\n }\n\n private checkPermissions(\n pack: ToolPack,\n toolName: string,\n input: Record<string, unknown>,\n ): ToolResult | null {\n const perms = pack.permissions;\n if (!perms) {return null;}\n\n // Check denied commands (for shell tools)\n if (perms.deniedCommands && perms.deniedCommands.length > 0) {\n const command = typeof input.command === 'string' ? input.command : '';\n for (const denied of perms.deniedCommands) {\n if (command.startsWith(denied)) {\n return {\n success: false,\n error: `Permission denied: command \"${denied}\" is blocked for pack \"${pack.id}\"`,\n errorDetails: {\n code: 'PERMISSION_DENIED',\n message: `Command \"${denied}\" is in the deny list`,\n retryable: false,\n },\n };\n }\n }\n }\n\n // Check allowed paths (for filesystem tools)\n if (perms.allowedPaths && perms.allowedPaths.length > 0) {\n const path = typeof input.path === 'string' ? input.path : undefined;\n if (path) {\n const allowed = perms.allowedPaths.some((pattern) =>\n path.startsWith(pattern) || pattern === '*',\n );\n if (!allowed) {\n return {\n success: false,\n error: `Permission denied: path \"${path}\" is not in allowed paths for pack \"${pack.id}\"`,\n errorDetails: {\n code: 'PATH_DENIED',\n message: `Path \"${path}\" outside allowed paths`,\n retryable: false,\n },\n };\n }\n }\n }\n\n // Check network access\n if (perms.networkAllowed === false) {\n const isNetworkTool = toolName.includes('http') || toolName.includes('fetch') || toolName.includes('request');\n if (isNetworkTool) {\n return {\n success: false,\n error: `Permission denied: network access is disabled for pack \"${pack.id}\"`,\n errorDetails: {\n code: 'NETWORK_DENIED',\n message: 'Network access is not allowed',\n retryable: false,\n },\n };\n }\n }\n\n return null;\n }\n\n // ── Filtering ─────────────────────────────────────────────────\n\n /**\n * Remove all resolved tools whose short name is NOT in the allowlist.\n * Used by sub-agents with preset-based tool restrictions.\n */\n applyAllowlist(allowedTools: string[]): void {\n const allowed = new Set(allowedTools);\n for (const [name, tool] of this.resolvedTools) {\n if (!allowed.has(tool.shortName)) {\n this.resolvedTools.delete(name);\n }\n }\n }\n\n // ── Lifecycle ──────────────────────────────────────────────────\n\n /**\n * Initialize all registered packs.\n */\n async initializeAll(): Promise<void> {\n for (const pack of this.packs.values()) {\n if (pack.initialize) {\n await pack.initialize();\n }\n }\n }\n\n /**\n * Dispose all registered packs.\n */\n async disposeAll(): Promise<void> {\n for (const pack of this.packs.values()) {\n if (pack.dispose) {\n await pack.dispose();\n }\n }\n }\n}\n","/**\n * CoreToolPack — wraps the existing tool registry into a ToolPack.\n *\n * This provides backward compatibility: the current 22+ tools continue to\n * work through the new ToolManager, while new packs (kb-labs, MCP) can\n * be added alongside.\n *\n * The pack does NOT re-implement tools — it wraps the existing ToolRegistry.\n */\n\nimport type {\n ToolPack,\n PackedTool,\n ToolConflictPolicy,\n ToolPermissions,\n ToolResult,\n} from '@kb-labs/agent-contracts';\n\n/**\n * Minimal interface matching ToolRegistry from agent-tools.\n * Avoids direct import to keep agent-core independent.\n */\nexport interface LegacyToolRegistry {\n getDefinitions(): Array<{\n type: 'function';\n function: { name: string; description: string; parameters: Record<string, unknown> };\n }>;\n execute(name: string, input: Record<string, unknown>): Promise<ToolResult>;\n getToolNames(): string[];\n}\n\n/** Read-only tools that don't mutate state */\nconst READ_ONLY_TOOLS = new Set([\n 'fs_read',\n 'fs_list',\n 'glob_search',\n 'grep_search',\n 'find_definition',\n 'code_stats',\n 'memory_get',\n 'memory_preference',\n 'memory_constraint',\n 'memory_finding',\n 'memory_blocker',\n 'archive_recall',\n 'todo_get',\n 'ask_user',\n 'ask_parent',\n]);\n\n/**\n * Tools safe to execute concurrently (via Promise.all).\n * Criteria: no shared mutable state, no file writes, no side effects.\n * Conservative default: only read-only tools that don't interact with user.\n */\nconst CONCURRENT_SAFE_TOOLS = new Set([\n 'fs_read',\n 'fs_list',\n 'glob_search',\n 'grep_search',\n 'find_definition',\n 'code_stats',\n 'memory_get',\n 'archive_recall',\n 'todo_get',\n]);\n\n/** Tool capability categories */\nconst TOOL_CAPABILITIES: Record<string, string> = {\n fs_read: 'filesystem',\n fs_write: 'filesystem',\n fs_patch: 'filesystem',\n fs_replace: 'filesystem',\n fs_list: 'filesystem',\n glob_search: 'search',\n grep_search: 'search',\n find_definition: 'search',\n code_stats: 'search',\n shell_exec: 'shell',\n memory_get: 'memory',\n memory_preference: 'memory',\n memory_constraint: 'memory',\n memory_finding: 'memory',\n memory_blocker: 'memory',\n memory_correction: 'memory',\n session_save: 'memory',\n archive_recall: 'memory',\n ask_user: 'interaction',\n ask_parent: 'interaction',\n report: 'interaction',\n task_submit: 'delegation',\n task_status: 'delegation',\n task_collect: 'delegation',\n todo_create: 'organization',\n todo_update: 'organization',\n todo_get: 'organization',\n mass_replace: 'filesystem',\n};\n\n/**\n * Create a CoreToolPack from an existing ToolRegistry.\n */\nexport function createCoreToolPack(registry: LegacyToolRegistry): ToolPack {\n const definitions = registry.getDefinitions();\n\n const tools: PackedTool[] = definitions.map((def) => {\n const name = def.function.name;\n return {\n definition: def as PackedTool['definition'],\n readOnly: READ_ONLY_TOOLS.has(name),\n concurrencySafe: CONCURRENT_SAFE_TOOLS.has(name),\n capability: TOOL_CAPABILITIES[name] ?? 'general',\n execute: (input: Record<string, unknown>) => registry.execute(name, input),\n };\n });\n\n return {\n id: 'core',\n namespace: 'core',\n version: '1.0.0',\n priority: 100,\n conflictPolicy: 'override' as ToolConflictPolicy,\n tools,\n capabilities: ['filesystem', 'search', 'shell', 'memory', 'interaction', 'delegation', 'organization'],\n permissions: {\n networkAllowed: true,\n auditTrail: false,\n } as ToolPermissions,\n };\n}\n","/**\n * KB Labs ToolPack — stub for future kb-labs-specific tools.\n *\n * Will include:\n * - mind-rag integration (semantic code search)\n * - workflow management tools\n * - plugin system integration\n *\n * Currently disabled by default — enabled via configuration.\n */\n\nimport type {\n ToolPack,\n ToolConflictPolicy,\n ToolPermissions,\n} from '@kb-labs/agent-contracts';\n\n/**\n * Create the KB Labs ToolPack (stub — no tools yet).\n */\nexport function createKBLabsToolPack(): ToolPack {\n return {\n id: 'kb-labs',\n namespace: 'kb',\n version: '0.1.0',\n priority: 50,\n conflictPolicy: 'namespace-prefix' as ToolConflictPolicy,\n tools: [],\n capabilities: [],\n permissions: {\n networkAllowed: true,\n auditTrail: true,\n } as ToolPermissions,\n\n enabled() {\n return false; // Disabled until tools are implemented\n },\n };\n}\n","/**\n * AsyncTaskToolPack — ToolPack wrapping task_submit / task_status / task_collect.\n *\n * Created by runner in executeWithTier and registered alongside CoreToolPack.\n * The pack holds a reference to the TaskMiddleware which owns the task registry.\n */\n\nimport type { ToolPack, PackedTool, ToolConflictPolicy, ToolResult, ToolPermissions } from '@kb-labs/agent-contracts';\nimport type { SubAgentPreset } from '@kb-labs/agent-contracts';\nimport type { TaskMiddleware } from '../middleware/builtin/task-middleware.js';\n\n// Inline preset config to avoid importing agent-tools from agent-core\nconst PRESET_MAX_ITERS: Record<string, number> = { research: 50, execute: 100, review: 50 };\n\nexport function createAsyncTaskToolPack(taskMw: TaskMiddleware): ToolPack {\n const tools: PackedTool[] = [\n // ── task_submit ─────────────────────────────────────────────────────────\n {\n definition: {\n type: 'function',\n function: {\n name: 'task_submit',\n description:\n 'Start a sub-agent task in the background. Returns immediately with a task ID.\\n' +\n 'The sub-agent runs concurrently — you can continue working while it executes.\\n' +\n 'Use task_status to check progress or task_collect to wait for results.',\n parameters: {\n type: 'object',\n properties: {\n description: { type: 'string', description: 'Short description of the task (for tracking).' },\n task: { type: 'string', description: 'Detailed task description for the sub-agent.' },\n preset: { type: 'string', enum: ['research', 'execute', 'review'], description: 'Sub-agent preset (default: \"research\").' },\n budgetPercent: { type: 'number', description: 'Percent of remaining budget to allocate (1-100, default: 50).' },\n },\n required: ['description', 'task'],\n },\n },\n },\n readOnly: false,\n capability: 'delegation',\n execute: async (input: Record<string, unknown>): Promise<ToolResult> => {\n const description = input.description as string;\n const task = input.task as string;\n const presetId = (input.preset as SubAgentPreset) ?? 'research';\n const budgetPercent = (input.budgetPercent as number | undefined) ?? 50;\n const budgetFraction = Math.min(1, Math.max(0, budgetPercent / 100));\n\n try {\n const asyncTask = await taskMw.submit(description, {\n task,\n preset: presetId,\n maxIterations: PRESET_MAX_ITERS[presetId] ?? 15,\n budgetFraction,\n });\n return {\n success: true,\n output: `Task submitted: ${asyncTask.id}\\nDescription: ${description}\\nPreset: ${presetId}\\nStatus: ${asyncTask.status}\\n\\nUse task_status(\"${asyncTask.id}\") to check or task_collect(\"${asyncTask.id}\") to wait.`,\n };\n } catch (error) {\n return { success: false, error: `Failed: ${error instanceof Error ? error.message : String(error)}` };\n }\n },\n },\n\n // ── task_status ─────────────────────────────────────────────────────────\n {\n definition: {\n type: 'function',\n function: {\n name: 'task_status',\n description: 'Check status of one or all async tasks. Without taskId: returns all tasks.',\n parameters: {\n type: 'object',\n properties: {\n taskId: { type: 'string', description: 'Specific task ID (omit for all tasks).' },\n },\n required: [],\n },\n },\n },\n readOnly: true,\n capability: 'delegation',\n execute: async (input: Record<string, unknown>): Promise<ToolResult> => {\n const taskId = input.taskId as string | undefined;\n const result = taskMw.getStatus(taskId);\n if (result === null) {\n return { success: false, error: `Task not found: \"${taskId}\"` };\n }\n const tasks = Array.isArray(result) ? result : [result];\n if (tasks.length === 0) {\n return { success: true, output: 'No async tasks.' };\n }\n const lines = tasks.map(t => {\n const icon = t.status === 'completed' ? '✅' : t.status === 'failed' ? '❌' : t.status === 'running' ? '⏳' : '⏸️';\n let line = `${icon} ${t.id}: ${t.description} [${t.status}]`;\n if (t.result) { line += `\\n Result: ${t.result.slice(0, 200)}`; }\n if (t.error) { line += `\\n Error: ${t.error}`; }\n return line;\n });\n return { success: true, output: lines.join('\\n') };\n },\n },\n\n // ── task_collect ────────────────────────────────────────────────────────\n {\n definition: {\n type: 'function',\n function: {\n name: 'task_collect',\n description: 'Wait for a specific async task to complete and return its full result. Blocks until done.',\n parameters: {\n type: 'object',\n properties: {\n taskId: { type: 'string', description: 'The task ID to wait for.' },\n },\n required: ['taskId'],\n },\n },\n },\n readOnly: true,\n capability: 'delegation',\n execute: async (input: Record<string, unknown>): Promise<ToolResult> => {\n const taskId = input.taskId as string;\n try {\n const r = await taskMw.collect(taskId);\n const status = r.success ? 'completed successfully' : 'failed';\n const lines = [\n `Task ${taskId} ${status} [preset=${r.preset}, ${r.iterations} iters, ${r.tokensUsed.toLocaleString()} tokens, ${(r.durationMs / 1000).toFixed(1)}s]`,\n ];\n if (r.filesRead.length > 0) { lines.push(`Files read: ${r.filesRead.length}`); }\n if (r.filesModified.length > 0) { lines.push(`Files modified: ${r.filesModified.join(', ')}`); }\n if (r.filesCreated.length > 0) { lines.push(`Files created: ${r.filesCreated.join(', ')}`); }\n lines.push('', r.summary);\n if (r.error) { lines.push('', `Error: ${r.error}`); }\n return { success: r.success, output: lines.join('\\n') };\n } catch (error) {\n return { success: false, error: `Failed to collect: ${error instanceof Error ? error.message : String(error)}` };\n }\n },\n },\n ];\n\n return {\n id: 'async-tasks',\n namespace: 'async-tasks',\n version: '1.0.0',\n priority: 90,\n conflictPolicy: 'skip' as ToolConflictPolicy,\n tools,\n capabilities: ['delegation'],\n permissions: { networkAllowed: false, auditTrail: false } as ToolPermissions,\n };\n}\n","export { ToolManager, type ToolManagerOptions } from './tool-manager.js';\nexport { createCoreToolPack, type LegacyToolRegistry } from './core-tool-pack.js';\nexport { createKBLabsToolPack } from './kb-tool-pack.js';\nexport { createAsyncTaskToolPack } from './async-task-pack.js';\n","/**\n * Execute mode handler - standard task execution with optional revision loop.\n *\n * When a session has an approved plan, the plan markdown is injected into\n * the task prompt and the plan status is tracked through its lifecycle:\n * approved → in_progress → completed | failed\n *\n * Revision loop (when enabled):\n * execute → quality gate → if fail → compact summary → inject feedback → re-execute\n * Max 2 revisions. Quality gate is heuristic (no LLM).\n */\n\nimport type { TaskResult, AgentConfig, TaskPlan } from '@kb-labs/agent-contracts';\nimport type { ToolRegistry } from '@kb-labs/agent-tools';\nimport type { ModeHandler } from './mode-handler';\nimport { AgentSDK } from '@kb-labs/agent-sdk';\nimport { createCoreToolPack } from '../tools/index.js';\nimport { SessionManager } from '../planning/session-manager';\nimport { promises as fs } from 'node:fs';\n\nconst MAX_REVISIONS = 2;\nconst QUALITY_GATE_THRESHOLD = 70;\n\n/**\n * Heuristic quality gate scoring (no LLM).\n */\nfunction evaluateQualityGate(result: TaskResult): { score: number; reasons: string[] } {\n let score = 0;\n const reasons: string[] = [];\n\n // Success flag (+40)\n if (result.success) {\n score += 40;\n } else {\n reasons.push('execution reported failure');\n }\n\n // Files modified (+10) — agent actually did something\n if (result.filesModified.length > 0 || result.filesCreated.length > 0) {\n score += 10;\n } else {\n reasons.push('no files modified or created');\n }\n\n // Reasonable iteration count — not stuck/aborted early (+20)\n if (result.iterations >= 3) {\n score += 20;\n } else {\n reasons.push(`only ${result.iterations} iteration(s) — may have been interrupted`);\n }\n\n // Has a summary (+15)\n if (result.summary && result.summary.length > 50) {\n score += 15;\n } else {\n reasons.push('summary is missing or too short');\n }\n\n // Tokens used (reasonable range) (+15)\n if (result.tokensUsed > 1000) {\n score += 15;\n }\n\n return { score, reasons };\n}\n\n/**\n * Execute mode - standard agent execution\n */\nexport class ExecuteModeHandler implements ModeHandler {\n async execute(\n task: string,\n config: AgentConfig,\n toolRegistry: ToolRegistry\n ): Promise<TaskResult> {\n const plan = await this.loadApprovedPlan(config);\n const enrichedTask = plan ? this.buildTaskWithPlan(task, plan) : task;\n\n // Mark plan as in_progress before execution starts\n if (plan) {\n await this.updatePlanStatus(config, plan, 'in_progress');\n }\n\n // First execution attempt\n let result = await this.runOnce(enrichedTask, config, toolRegistry);\n\n // Revision loop: if quality gate fails, retry with feedback\n for (let revision = 0; revision < MAX_REVISIONS; revision++) {\n const gate = evaluateQualityGate(result);\n if (gate.score >= QUALITY_GATE_THRESHOLD) {\n break; // Quality is acceptable\n }\n\n // Build revision task with feedback from previous attempt\n const revisionTask = this.buildRevisionTask(task, result, gate.reasons, revision + 1);\n result = await this.runOnce(revisionTask, config, toolRegistry);\n }\n\n // Mark plan as completed or failed based on final result\n if (plan) {\n await this.updatePlanStatus(config, plan, result.success ? 'completed' : 'failed');\n }\n\n return result;\n }\n\n /**\n * Single execution attempt.\n */\n private async runOnce(\n task: string,\n config: AgentConfig,\n toolRegistry: ToolRegistry,\n ): Promise<TaskResult> {\n // Strip mode from config so child runner always uses 'execute' (no recursion)\n const { mode: _mode, ...execConfig } = config;\n const runner = new AgentSDK()\n .register(createCoreToolPack(toolRegistry))\n .createRunner(execConfig as AgentConfig);\n\n return runner.execute(task);\n }\n\n /**\n * Build a revision task that includes compact feedback from previous attempt.\n */\n private buildRevisionTask(\n originalTask: string,\n prevResult: TaskResult,\n failReasons: string[],\n revisionNum: number,\n ): string {\n const prevSummary = prevResult.summary\n ? prevResult.summary.slice(0, 1000)\n : '(no summary available)';\n\n const modifiedFiles = prevResult.filesModified.length > 0\n ? `Modified files: ${prevResult.filesModified.slice(0, 10).join(', ')}`\n : 'No files were modified.';\n\n return [\n `## Revision ${revisionNum} — Previous attempt did not meet quality threshold`,\n '',\n `Original task: ${originalTask}`,\n '',\n '### Previous Attempt Summary',\n `- Success: ${prevResult.success}`,\n `- Iterations: ${prevResult.iterations}`,\n `- ${modifiedFiles}`,\n `- Summary: ${prevSummary}`,\n '',\n '### Issues to Address',\n ...failReasons.map(r => `- ${r}`),\n '',\n '### Instructions',\n 'Review the previous attempt and address the issues listed above.',\n 'Focus on completing the task successfully. Check existing files before making changes.',\n 'Do NOT repeat the same approach if it failed — try a different strategy.',\n ].join('\\n');\n }\n\n /**\n * Load approved (or draft) plan from session storage.\n * Falls back to plan.md (written by plan_write tool) if plan.json not available.\n */\n private async loadApprovedPlan(config: AgentConfig): Promise<TaskPlan | null> {\n if (!config.sessionId || !config.workingDir) { return null; }\n\n // Try plan.json first (structured format)\n try {\n const sessionManager = new SessionManager(config.workingDir);\n const planPath = sessionManager.getSessionPlanPath(config.sessionId);\n const raw = await fs.readFile(planPath, 'utf-8');\n const plan: TaskPlan = JSON.parse(raw);\n if (plan.status !== 'approved' && plan.status !== 'draft') { return null; }\n return plan;\n } catch {\n // plan.json not available — try plan.md\n }\n\n // Fallback: load plan.md (written by plan_write tool during plan mode)\n try {\n const { join } = await import('node:path');\n const planMdPath = join(config.workingDir, '.kb', 'agents', 'sessions', config.sessionId, 'plan.md');\n const markdown = await fs.readFile(planMdPath, 'utf-8');\n if (markdown.trim().length > 0) {\n return {\n id: `plan-${config.sessionId}`,\n task: config.sessionId,\n status: 'approved',\n markdown,\n phases: [],\n createdAt: new Date().toISOString(),\n } as unknown as TaskPlan;\n }\n } catch {\n // No plan available at all\n }\n\n return null;\n }\n\n /**\n * Update plan status on disk.\n */\n private async updatePlanStatus(\n config: AgentConfig,\n plan: TaskPlan,\n status: TaskPlan['status'],\n ): Promise<void> {\n if (!config.sessionId || !config.workingDir) { return; }\n try {\n const sessionManager = new SessionManager(config.workingDir);\n const planPath = sessionManager.getSessionPlanPath(config.sessionId);\n const updated: TaskPlan = { ...plan, status, updatedAt: new Date().toISOString() };\n await fs.writeFile(planPath, JSON.stringify(updated, null, 2), 'utf-8');\n } catch {\n // Non-fatal — execution continues regardless\n }\n }\n\n /**\n * Inject full plan markdown into the task prompt so the agent follows it.\n * Also adds a todo bootstrap instruction so the agent tracks progress.\n */\n private buildTaskWithPlan(task: string, plan: TaskPlan): string {\n const planContent = plan.markdown\n ? plan.markdown\n : this.formatPhasesCompact(plan);\n\n const todoBootstrap = this.buildTodoBootstrap(plan);\n\n // Replace the user task with a directive that makes it clear the plan is already here.\n // Do NOT search the filesystem for plan files — the full plan is provided below.\n return [\n 'Execute the following plan step by step. The full plan is provided below — do NOT search for plan files in the filesystem.',\n '',\n `Original task: ${task}`,\n '',\n '## Execution progress tracking',\n '- After completing each phase/step, call `plan_write` to update the plan with checkboxes:',\n ' - `[x] Phase 2.1 — done (ConversationView empty states migrated)`',\n ' - `[ ] Phase 2.2 — pending`',\n '- This way if execution is interrupted, the next resume will see what was already done.',\n '- If a step in the plan is already marked `[x]`, SKIP it — it was done in a previous run.',\n '- Check git diff or read files to verify completed steps before skipping.',\n '',\n '---',\n '',\n planContent,\n ...(todoBootstrap ? ['', '---', '', todoBootstrap] : []),\n ].join('\\n');\n }\n\n /**\n * Build a todo_create instruction from plan phases so the agent tracks progress.\n * Returns null if no phases or sessionId is missing.\n */\n private buildTodoBootstrap(plan: TaskPlan): string | null {\n if (!plan.phases.length || !plan.sessionId) { return null; }\n\n const items = plan.phases.map((phase, i) => {\n const stepsSummary = phase.steps.length > 0\n ? ` (${phase.steps.map(s => s.action).join('; ')})`\n : '';\n return ` ${i + 1}. \"${phase.name}${stepsSummary}\" — priority: ${i === 0 ? 'high' : 'medium'}`;\n });\n\n return [\n '## Progress Tracking',\n '',\n 'IMPORTANT: Before starting execution, call `todo_create` to set up progress tracking with these items:',\n '',\n ...items,\n '',\n 'Update each todo to \"in-progress\" when you start a phase and \"completed\" when done.',\n ].join('\\n');\n }\n\n /**\n * Fallback compact formatter when markdown is not stored on the plan object.\n */\n private formatPhasesCompact(plan: TaskPlan): string {\n const lines: string[] = [];\n for (const phase of plan.phases) {\n lines.push(`### ${phase.name}`);\n for (const step of phase.steps) {\n lines.push(` - ${step.action}`);\n }\n }\n return lines.join('\\n');\n }\n}\n","/**\n * TaskMiddleware — async task management for sub-agent operations.\n *\n * Manages a registry of async tasks submitted via task_submit tool.\n * Tasks run concurrently as sub-agents and can be polled (task_status)\n * or awaited (task_collect).\n *\n * Hook points:\n * beforeLLMCall → inject pending/completed task summary into Status Block\n * onStop → cancel all pending tasks\n *\n * order = 25 (after FactSheet=20, before Progress=50)\n */\n\nimport type {\n LLMCtx,\n LLMCallPatch,\n} from '@kb-labs/agent-sdk';\nimport type { AsyncTask } from '@kb-labs/agent-contracts';\nimport type { SpawnAgentRequest, SpawnAgentResult } from '@kb-labs/agent-contracts';\nimport { randomUUID } from 'node:crypto';\n\nexport interface TaskMiddlewareConfig {\n /** Max concurrent async tasks (default: 3) */\n maxConcurrent?: number;\n}\n\nexport type SpawnFn = (request: SpawnAgentRequest) => Promise<SpawnAgentResult>;\n\nexport class TaskMiddleware {\n readonly name = 'task-manager';\n readonly order = 25;\n readonly config = { failPolicy: 'fail-open' as const, timeoutMs: 1000 };\n\n private readonly tasks = new Map<string, AsyncTask>();\n private readonly promises = new Map<string, Promise<SpawnAgentResult>>();\n private readonly maxConcurrent: number;\n private spawnFn: SpawnFn | null = null;\n\n constructor(config: TaskMiddlewareConfig = {}) {\n this.maxConcurrent = config.maxConcurrent ?? 3;\n }\n\n /** Set the spawn function (called by runner during setup) */\n setSpawnFn(fn: SpawnFn): void {\n this.spawnFn = fn;\n }\n\n // ── Tool API ────────────────────────────────────────────────────────────────\n\n /**\n * Submit a new async task. Returns immediately with a task ID.\n */\n async submit(description: string, request: SpawnAgentRequest): Promise<AsyncTask> {\n if (!this.spawnFn) {\n throw new Error('TaskMiddleware: spawnFn not set — sub-agents not available');\n }\n\n const runningTasks = [...this.tasks.values()].filter(t => t.status === 'running');\n if (runningTasks.length >= this.maxConcurrent) {\n const ids = runningTasks.map(t => t.id).join('\", \"');\n throw new Error(\n `Max concurrent tasks (${this.maxConcurrent}) reached. ` +\n `Call task_collect(\"${runningTasks[0]!.id}\") to wait for a result before submitting more. ` +\n `Running tasks: [\"${ids}\"]`\n );\n }\n\n const id = randomUUID().slice(0, 8);\n const now = new Date().toISOString();\n\n const task: AsyncTask = {\n id,\n description,\n status: 'running',\n submittedAt: now,\n startedAt: now,\n preset: request.preset ?? 'research',\n };\n this.tasks.set(id, task);\n\n // Fire-and-forget: spawn sub-agent, update task on completion\n const promise = this.spawnFn(request).then(\n (result) => {\n task.status = 'completed';\n task.completedAt = new Date().toISOString();\n task.result = result.summary;\n task.tokensUsed = result.tokensUsed;\n task.filesRead = result.filesRead;\n task.filesModified = result.filesModified;\n return result;\n },\n (err) => {\n task.status = 'failed';\n task.completedAt = new Date().toISOString();\n task.error = err instanceof Error ? err.message : String(err);\n throw err;\n },\n );\n this.promises.set(id, promise);\n\n return task;\n }\n\n /**\n * Get status of one or all tasks.\n */\n getStatus(taskId?: string): AsyncTask | AsyncTask[] | null {\n if (taskId) {\n return this.tasks.get(taskId) ?? null;\n }\n return [...this.tasks.values()];\n }\n\n /**\n * Await a specific task and return its result.\n */\n async collect(taskId: string): Promise<SpawnAgentResult> {\n const promise = this.promises.get(taskId);\n if (!promise) {\n throw new Error(`TaskMiddleware: unknown task ID \"${taskId}\"`);\n }\n return promise;\n }\n\n // ── Middleware hooks ─────────────────────────────────────────────────────────\n\n /**\n * Inject task summary into context via meta (read by FactSheetMiddleware's Status Block).\n */\n beforeLLMCall(ctx: LLMCtx): LLMCallPatch | undefined {\n const tasks = [...this.tasks.values()];\n if (tasks.length === 0) { return undefined; }\n\n const running = tasks.filter(t => t.status === 'running');\n const completed = tasks.filter(t => t.status === 'completed');\n const failed = tasks.filter(t => t.status === 'failed');\n\n // Write summary to meta for Status Block consumption\n ctx.run.meta.set('tasks', 'running', running.length);\n ctx.run.meta.set('tasks', 'completed', completed.length);\n ctx.run.meta.set('tasks', 'failed', failed.length);\n ctx.run.meta.set('tasks', 'total', tasks.length);\n\n // Build a compact summary for newly completed tasks\n const newlyCompleted = completed.filter(t => {\n const key = `tasks:notified:${t.id}`;\n if (ctx.run.meta.get('tasks', key)) { return false; }\n ctx.run.meta.set('tasks', key, true);\n return true;\n });\n\n if (newlyCompleted.length === 0) { return undefined; }\n\n // Inject notification about completed tasks as user message\n const notifications = newlyCompleted.map(t => {\n const status = t.status === 'completed' ? '✅' : '❌';\n const detail = t.result ?? t.error ?? 'no details';\n return `${status} Task \"${t.description}\" (${t.id}): ${detail}`;\n });\n\n const notifMsg = {\n role: 'user' as const,\n content: `[Async task update]\\n${notifications.join('\\n')}`,\n };\n\n return { messages: [...ctx.messages, notifMsg] };\n }\n\n /**\n * On stop: no cleanup needed — promises resolve/reject on their own.\n */\n onStop(): void {\n // Tasks will complete in the background. We don't cancel sub-agents\n // because they're already running and should finish gracefully.\n }\n}\n","import { promises as fs } from 'node:fs';\nimport * as path from 'node:path';\nimport type { TaskPlan } from '@kb-labs/agent-contracts';\nimport { PlanDocumentService } from '../planning/plan-document-service.js';\nimport { SessionManager } from '../planning/session-manager.js';\n\nexport interface PlanArtifactWriteResult {\n planPath: string;\n documentPath: string;\n markdown: string;\n}\n\nexport class PlanArtifactWriter {\n constructor(\n private readonly workingDir: string,\n private readonly sessionManager = new SessionManager(workingDir),\n private readonly documentService = new PlanDocumentService(workingDir),\n ) {}\n\n async write(sessionId: string, plan: TaskPlan): Promise<PlanArtifactWriteResult> {\n const planPath = this.sessionManager.getSessionPlanPath(sessionId);\n await fs.mkdir(path.dirname(planPath), { recursive: true });\n await fs.writeFile(planPath, JSON.stringify(plan, null, 2), 'utf-8');\n\n const draft = await this.documentService.createDraft(plan);\n return {\n planPath,\n documentPath: draft.path,\n markdown: draft.markdown,\n };\n }\n}\n","import { PlanValidator, type PlanValidationResult } from '../planning/plan-validator.js';\n\nexport interface PlanOutputValidation {\n passed: boolean;\n summary: string;\n result: PlanValidationResult;\n}\n\nexport class PlanOutputValidator {\n private readonly validator = new PlanValidator();\n\n validate(markdown: string): PlanOutputValidation {\n const result = this.validator.validate(markdown);\n return {\n passed: result.passed,\n summary: this.buildSummary(result),\n result,\n };\n }\n\n private buildSummary(result: PlanValidationResult): string {\n const topIssues = result.issues\n .filter((issue) => issue.severity !== 'info')\n .slice(0, 3)\n .map((issue) => `${issue.dimension}: ${issue.message}`);\n\n return topIssues.length > 0\n ? topIssues.join(' | ')\n : `Plan validation passed with score ${result.score.toFixed(2)}.`;\n }\n}\n","import type { Phase, TaskPlan } from '@kb-labs/agent-contracts';\nimport type { ResultMapper, ResultMapperResult } from '@kb-labs/agent-sdk';\n\nexport interface PlanResultMapperOptions {\n task: string;\n complexity: 'simple' | 'medium' | 'complex';\n existingPlan?: TaskPlan | null;\n}\n\nexport function createPlanResultMapper(options: PlanResultMapperOptions): ResultMapper {\n return {\n id: 'plan-result-mapper',\n map(input) {\n const sessionId = input.sessionId ?? options.existingPlan?.sessionId ?? `session-${Date.now()}`;\n const { markdown, incomplete } = extractMarkdownPlan(\n input.answer,\n options.task,\n options.existingPlan?.markdown,\n );\n const plan = buildTaskPlan({\n sessionId,\n task: options.task,\n complexity: options.complexity,\n markdown,\n existingPlan: options.existingPlan ?? null,\n });\n if (incomplete) {\n plan.status = 'failed';\n }\n const result: ResultMapperResult = {\n taskResult: {\n plan,\n summary: markdown,\n },\n runtimeMetadata: {\n plan,\n planMarkdown: markdown,\n },\n summary: markdown,\n };\n return result;\n },\n };\n}\n\nfunction extractMarkdownPlan(summary: string, task: string, existingMarkdown?: string): { markdown: string; incomplete: boolean } {\n const text = (summary || '').trim();\n if (!text) {\n return { markdown: buildIncompleteMarkdown(task, existingMarkdown), incomplete: true };\n }\n\n const hasStructure = (value: string) => /^#{1,3}\\s+/m.test(value) && value.split('\\n').filter((line) => /^#{1,3}\\s+/.test(line)).length >= 2;\n if (hasStructure(text)) {\n return { markdown: text, incomplete: false };\n }\n\n const fenced = /^```(?:markdown|md)\\n([\\s\\S]*?)```\\s*$/i.exec(text);\n const candidate = fenced?.[1]?.trim() || text;\n if (hasStructure(candidate)) {\n return { markdown: candidate, incomplete: false };\n }\n\n return { markdown: buildIncompleteMarkdown(task, candidate), incomplete: true };\n}\n\nfunction buildTaskPlan(input: {\n sessionId: string;\n task: string;\n complexity: 'simple' | 'medium' | 'complex';\n markdown: string;\n existingPlan: TaskPlan | null;\n}): TaskPlan {\n const now = new Date().toISOString();\n const planId = input.existingPlan?.id || `plan-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n const phases = parsePhasesFromMarkdown(input.markdown, planId);\n return {\n id: planId,\n sessionId: input.sessionId,\n task: input.task,\n mode: 'plan',\n phases,\n estimatedDuration: input.existingPlan?.estimatedDuration || 'Unknown',\n complexity: input.complexity,\n createdAt: input.existingPlan?.createdAt || now,\n updatedAt: now,\n status: 'draft',\n markdown: input.markdown,\n };\n}\n\nfunction parsePhasesFromMarkdown(markdown: string, planId?: string): Phase[] {\n const lines = (markdown || '').replace(/\\r\\n/g, '\\n').split('\\n');\n const headingIndexes: number[] = [];\n for (let i = 0; i < lines.length; i += 1) {\n if (/^###\\s+/.test(lines[i] || '') || /^##\\s+Phase\\b/i.test(lines[i] || '')) {\n headingIndexes.push(i);\n }\n }\n\n const extractBullets = (chunk: string[]): string[] =>\n chunk\n .map((line) => {\n const bullet = /^\\s*[-*]\\s+(.+)\\s*$/.exec(line);\n if (bullet?.[1]) {\n return bullet[1].trim();\n }\n const numbered = /^\\s*\\d+\\.\\s+(.+)\\s*$/.exec(line);\n return numbered?.[1]?.trim() || '';\n })\n .filter(Boolean);\n\n const anchorPrefix = planId ? `${planId}:` : '';\n\n if (headingIndexes.length === 0) {\n const bullets = extractBullets(lines);\n return [{\n id: 'phase-1',\n name: 'Plan Execution',\n description: 'Execute the drafted plan.',\n dependencies: [],\n status: 'pending',\n anchor: `${anchorPrefix}phase-1`,\n steps: (bullets.length > 0 ? bullets : ['Execute approved plan changes']).slice(0, 20).map((item, idx) => ({\n id: `step-1-${idx + 1}`,\n action: item,\n expectedOutcome: `Completed: ${item}`,\n status: 'pending',\n anchor: `${anchorPrefix}phase-1:step-${idx + 1}`,\n })),\n }];\n }\n\n return headingIndexes.map((start, idx) => {\n const end = headingIndexes[idx + 1] ?? lines.length;\n const title = (lines[start] || '').replace(/^#{2,3}\\s+/, '').trim() || `Phase ${idx + 1}`;\n const body = lines.slice(start + 1, end);\n const bullets = extractBullets(body);\n const description = body.find((line) => line.trim().length > 0 && !/^\\s*(?:[-*]|\\d+\\.)\\s+/.test(line))?.trim()\n || `Execute ${title}`;\n const phaseNum = idx + 1;\n return {\n id: `phase-${phaseNum}`,\n name: title,\n description,\n dependencies: idx === 0 ? [] : [`phase-${idx}`],\n status: 'pending',\n anchor: `${anchorPrefix}phase-${phaseNum}`,\n steps: (bullets.length > 0 ? bullets : [`Execute ${title}`]).slice(0, 20).map((item, stepIdx) => ({\n id: `step-${phaseNum}-${stepIdx + 1}`,\n action: item,\n expectedOutcome: `Completed: ${item}`,\n status: 'pending',\n anchor: `${anchorPrefix}phase-${phaseNum}:step-${stepIdx + 1}`,\n })),\n };\n });\n}\n\nfunction buildIncompleteMarkdown(task: string, capturedText?: string): string {\n const details = (capturedText || '').trim();\n const researchNotes = details\n ? details.split('\\n').map((line) => line.trim()).filter(Boolean).slice(0, 10)\n : [];\n\n return [\n `# Plan: ${task}`,\n '',\n '> **WARNING:** This is an incomplete plan. The agent could not generate a proper plan within the iteration budget.',\n '',\n '## Status: INCOMPLETE',\n '',\n '## Task',\n `- User request: ${task}`,\n '- The agent was unable to produce a concrete, actionable plan.',\n '',\n ...(researchNotes.length > 0\n ? [\n '## Research Notes (raw)',\n 'The following notes were captured during exploration but do not constitute a plan:',\n '',\n ...researchNotes.map((line) => `- ${line}`),\n '',\n ]\n : []),\n '## Next Steps',\n '- Re-run plan mode with a more focused task description',\n '- Provide additional context or constraints to guide the agent',\n '- Consider breaking the task into smaller sub-tasks',\n ].join('\\n');\n}\n","import type { IterationSnapshot } from '@kb-labs/agent-contracts';\nimport type {\n ArtifactWriter,\n OutputValidator,\n ResultMapper,\n RuntimeProfile,\n ResponseRequirementsSelector,\n PromptProjector,\n RunEvaluator,\n} from '@kb-labs/agent-sdk';\nimport { PLAN_READ_ONLY_TOOL_NAMES } from '@kb-labs/agent-tools';\nimport type { SessionManager } from '../planning/session-manager.js';\nimport { PlanArtifactWriter } from './plan-artifact-writer.js';\nimport { PlanOutputValidator } from './plan-output-validator.js';\nimport type { TaskPlan } from '@kb-labs/agent-contracts';\nimport { createPlanResultMapper } from './plan-result-mapper.js';\n\nconst PLAN_SCOPED_TOOL_NAMES = [\n 'fs_read',\n 'fs_list',\n 'glob_search',\n 'grep_search',\n 'find_definition',\n 'code_stats',\n 'memory_get',\n 'memory_finding',\n 'memory_blocker',\n 'archive_recall',\n 'ask_user',\n 'report',\n 'plan_validate',\n] as const;\n\nconst PLAN_RESPONSE_REQUIREMENTS_SELECTOR: ResponseRequirementsSelector = {\n id: 'plan-profile-response-requirements',\n select(input) {\n return {\n requirements: {\n allowsMemoryOnlyRecall: false,\n needsDirectToolEvidence: true,\n needsFileBackedClaims: true,\n allowsInference: false,\n maxUnsupportedClaims: 0,\n },\n rationale: `Plan profile requires repository-backed evidence before proposing implementation steps for: ${input.task}`,\n };\n },\n};\n\nfunction createPlanRunEvaluator(enableDelegation: boolean): RunEvaluator {\n return {\n id: enableDelegation ? 'plan-profile-evaluator-broad' : 'plan-profile-evaluator-scoped',\n evaluate(input) {\n const snapshot = input.snapshot;\n if (shouldSynthesizePlan(snapshot, enableDelegation)) {\n return {\n evidenceGain: snapshot.evidenceDelta,\n readinessScore: 0.9,\n repeatedStrategy: snapshot.repeatsWithoutEvidence > 0,\n recommendation: 'synthesize',\n rationale: enableDelegation\n ? 'Planning profile has enough repository evidence or has stopped gaining new evidence; synthesize the plan now.'\n : 'Scoped planning profile has enough grounded evidence for the main path; stop exploring and draft the plan now.',\n };\n }\n\n if (snapshot.repeatsWithoutEvidence > 0) {\n return {\n evidenceGain: snapshot.evidenceDelta,\n readinessScore: enableDelegation ? 0.72 : 0.82,\n repeatedStrategy: true,\n recommendation: snapshot.evidenceCount >= (enableDelegation ? 2 : 1) ? 'synthesize' : 'narrow',\n rationale: snapshot.evidenceCount >= (enableDelegation ? 2 : 1)\n ? 'Planning profile already has enough grounded context; stop low-yield exploration and draft the plan.'\n : 'Planning profile detected low-yield exploration; narrow the scope before continuing.',\n };\n }\n\n return {\n evidenceGain: snapshot.evidenceDelta,\n readinessScore: Math.min(enableDelegation ? 0.8 : 0.88, 0.22 + (snapshot.evidenceCount * (enableDelegation ? 0.1 : 0.16))),\n repeatedStrategy: false,\n recommendation: 'continue',\n rationale: enableDelegation\n ? 'Planning profile is still gathering repository evidence.'\n : 'Scoped planning profile is still collecting the minimum repository evidence required for an executable plan.',\n };\n },\n };\n}\n\nexport function createPlanRuntimeProfile(options?: {\n workingDir?: string;\n sessionManager?: SessionManager;\n task?: string;\n complexity?: 'simple' | 'medium' | 'complex';\n existingPlan?: TaskPlan | null;\n}): RuntimeProfile {\n const resultMappers: ResultMapper[] = options?.task\n ? [createPlanResultMapper({\n task: options.task,\n complexity: options?.complexity ?? 'medium',\n existingPlan: options?.existingPlan ?? null,\n })]\n : [];\n const outputValidators: OutputValidator[] = options?.task\n ? [createPlanProfileOutputValidator(options.task)]\n : [];\n const artifactWriters: ArtifactWriter[] = options?.workingDir\n ? [createPlanProfileArtifactWriter(options.workingDir, options.sessionManager)]\n : [];\n const enableDelegation = shouldEnablePlanDelegation(options?.task, options?.complexity);\n\n return {\n id: 'plan-profile',\n mode: 'assistant',\n description: 'Planning-first profile with read-only tool access and stricter evidence requirements.',\n toolPolicy: {\n access: 'read-only',\n allowedToolNames: enableDelegation\n ? Array.from(PLAN_READ_ONLY_TOOL_NAMES)\n : Array.from(PLAN_SCOPED_TOOL_NAMES),\n },\n responseRequirementsSelectors: [PLAN_RESPONSE_REQUIREMENTS_SELECTOR],\n promptProjectors: [createPlanPromptProjector(options?.task, enableDelegation)],\n runEvaluators: [createPlanRunEvaluator(enableDelegation)],\n resultMappers,\n outputValidators,\n artifactWriters,\n completionPolicy: {\n requireReportTool: true,\n requireValidatorsToPass: true,\n },\n };\n}\n\nfunction shouldSynthesizePlan(snapshot: IterationSnapshot, enableDelegation: boolean): boolean {\n if (!enableDelegation && snapshot.iteration >= 3 && snapshot.evidenceCount >= 2) {\n return true;\n }\n if (snapshot.iteration >= 4 && snapshot.evidenceCount >= 3) {\n return true;\n }\n if (snapshot.iteration >= Math.max(3, Math.ceil(snapshot.maxIterations * 0.5)) && snapshot.evidenceCount >= 4) {\n return true;\n }\n if (!enableDelegation && snapshot.repeatNoEvidenceCount >= 1 && snapshot.evidenceCount >= 2) {\n return true;\n }\n if (snapshot.evidenceCount >= 6 && snapshot.evidenceDelta === 0) {\n return true;\n }\n if (snapshot.repeatNoEvidenceCount >= 2 && snapshot.evidenceCount >= 3) {\n return true;\n }\n return false;\n}\n\nfunction createPlanPromptProjector(task: string | undefined, enableDelegation: boolean): PromptProjector {\n const focusHints = derivePlanFocusHints(task);\n return {\n id: 'plan-profile-projector',\n project() {\n return [\n '# Active Profile',\n 'Plan profile is active.',\n '- Treat this run as planning-first, not execution-first.',\n '- Prefer repository exploration and evidence-backed synthesis.',\n '- Produce actionable steps only after relevant files and commands are verified.',\n '- Once you have enough grounded evidence for the main implementation path, stop exploring and draft the plan.',\n ...(enableDelegation\n ? [\n '- This task is broad enough to justify selective async delegation when it clearly reduces wall-clock research time.',\n ]\n : [\n '- This task is scoped. Do not fan out into broad workspace exploration or async delegation unless the direct file path fails.',\n '- For scoped tasks, prefer 2-4 directly relevant files, then synthesize.',\n ]),\n ...(focusHints.length > 0\n ? [\n '# Scope Hints',\n '- Prioritize the task-specific scope hints below before searching unrelated repositories or packages.',\n ...focusHints.map((hint) => `- ${hint}`),\n ]\n : []),\n ].join('\\n');\n },\n };\n}\n\nfunction shouldEnablePlanDelegation(\n task?: string,\n complexity: 'simple' | 'medium' | 'complex' = 'medium',\n): boolean {\n if (complexity === 'complex') {\n return true;\n }\n if (!task) {\n return false;\n }\n return /\\b(all repositories|all repos|all packages|entire workspace|whole workspace|across the repo|across repositories|monorepo-wide|workspace-wide)\\b/i.test(task);\n}\n\nfunction derivePlanFocusHints(task?: string): string[] {\n if (!task) {\n return [];\n }\n const hints = new Set<string>();\n const repoMatches = task.match(/\\bkb-labs-[a-z0-9-]+\\b/gi) ?? [];\n for (const match of repoMatches) {\n hints.add(`Focus on repository or package references related to \\`${match}\\`.`);\n }\n const packageMatches = task.match(/\\bagent-[a-z0-9-]+\\b/gi) ?? [];\n for (const match of packageMatches) {\n hints.add(`Inspect package-level files related to \\`${match}\\` before broad workspace scans.`);\n }\n if (/runtime profile architecture/i.test(task)) {\n hints.add('Start with runtime/profile files in the active plugin before exploring generic platform runtime packages.');\n }\n return Array.from(hints).slice(0, 4);\n}\n\nfunction createPlanProfileOutputValidator(task: string): OutputValidator {\n const validator = new PlanOutputValidator();\n return {\n id: 'plan-profile-output-validator',\n validate(input) {\n const markdown = typeof input.metadata?.planMarkdown === 'string' && input.metadata.planMarkdown.trim().length > 0\n ? input.metadata.planMarkdown\n : input.answer;\n const result = validator.validate(markdown);\n return {\n verdict: result.passed ? 'allow' : 'block',\n rationale: result.summary || `Plan validation completed for task: ${task}`,\n };\n },\n };\n}\n\nfunction createPlanProfileArtifactWriter(\n workingDir: string,\n sessionManager?: SessionManager,\n): ArtifactWriter {\n const writer = new PlanArtifactWriter(workingDir, sessionManager);\n return {\n id: 'plan-profile-artifact-writer',\n async write(input) {\n const plan = input.metadata?.plan;\n if (!plan || typeof plan !== 'object') {\n return;\n }\n await writer.write(input.sessionId, plan as never);\n },\n };\n}\n","import { createKernelState, recordConstraint, recordCorrection } from '@kb-labs/agent-kernel';\nimport { SessionArtifactStore } from '@kb-labs/agent-store';\nimport type { KernelState } from '@kb-labs/agent-contracts';\nimport type { SessionMemoryBridge } from '@kb-labs/agent-tools';\n\nasync function loadOrCreateKernel(\n store: SessionArtifactStore,\n workingDir: string,\n sessionId: string,\n): Promise<KernelState> {\n const existing = await store.loadKernelState(sessionId);\n if (existing) {\n return existing;\n }\n const created = createKernelState({\n sessionId,\n workingDir,\n mode: 'assistant',\n task: '',\n });\n await store.saveKernelState(sessionId, created);\n return created;\n}\n\nexport function createSessionMemoryBridge(\n workingDir: string,\n sessionId?: string,\n): SessionMemoryBridge | undefined {\n if (!sessionId) {\n return undefined;\n }\n\n const store = new SessionArtifactStore(workingDir);\n\n return {\n async loadKernelState(): Promise<KernelState | null> {\n return store.loadKernelState(sessionId);\n },\n async recordConstraint(content: string): Promise<KernelState> {\n const kernel = await loadOrCreateKernel(store, workingDir, sessionId);\n const updated = recordConstraint(kernel, content);\n await store.saveKernelState(sessionId, updated);\n return updated;\n },\n async recordCorrection(input: {\n content: string;\n invalidates?: string[];\n asConstraint?: boolean;\n }): Promise<KernelState> {\n const kernel = await loadOrCreateKernel(store, workingDir, sessionId);\n let updated = recordCorrection(kernel, input.content, input.invalidates);\n if (input.asConstraint) {\n updated = recordConstraint(updated, input.content);\n }\n await store.saveKernelState(sessionId, updated);\n return updated;\n },\n };\n}\n","/**\n * Plan mode handler - lightweight \"Claude Code style\" planning flow.\n *\n * Core behavior:\n * - Reuse regular Agent loop (research + tool use).\n * - Restrict tool access to read-only/discovery/reporting tools.\n * - Ask agent to output a markdown plan (free-form, human-oriented).\n * - Persist plan as session plan.json + canonical markdown document.\n */\n\nimport type {\n AgentConfig,\n AgentEvent,\n KernelState,\n TaskPlan,\n TaskResult,\n PlanContext,\n} from '@kb-labs/agent-contracts';\nimport type { ToolRegistry } from '@kb-labs/agent-tools';\nimport { createToolRegistry, PLAN_READ_ONLY_TOOL_NAMES } from '@kb-labs/agent-tools';\nimport type { ModeHandler } from './mode-handler';\nimport { AgentSDK, type IAgentRunner } from '@kb-labs/agent-sdk';\nimport { createDefaultResponseRequirementsSelector } from '@kb-labs/agent-runtime';\nimport { createCoreToolPack } from '../tools/index.js';\nimport { SessionManager } from '../planning/session-manager';\nimport { PlanDocumentService } from '../planning/plan-document-service.js';\nimport { TaskMiddleware } from '../middleware/builtin/task-middleware';\nimport { createPlanRuntimeProfile } from './plan-profile.js';\nimport { promises as fs } from 'node:fs';\nimport { createSessionMemoryBridge } from '../core/session-memory-bridge.js';\n\nclass SharedTokenBudget {\n private consumed = 0;\n\n constructor(private readonly total: number) {}\n\n get remaining(): number {\n return Math.max(0, this.total - this.consumed);\n }\n\n get used(): number {\n return Math.max(0, this.consumed);\n }\n\n allocate(requested: number, minimum = 3000): number {\n const requestedSafe = Number.isFinite(requested) ? Math.max(minimum, Math.floor(requested)) : minimum;\n if (this.remaining <= 0) {return 0;}\n return Math.min(this.remaining, requestedSafe);\n }\n\n consume(tokensUsed: number): void {\n if (!Number.isFinite(tokensUsed) || tokensUsed <= 0) {return;}\n this.consumed += Math.floor(tokensUsed);\n }\n}\n\n\nexport class PlanModeHandler implements ModeHandler {\n async execute(\n task: string,\n config: AgentConfig,\n toolRegistry: ToolRegistry,\n ): Promise<TaskResult> {\n const startedAt = new Date().toISOString();\n const startMs = Date.now();\n const sessionManager = new SessionManager(config.workingDir);\n const sessionId = config.sessionId || `session-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n const planContext = config.mode?.context as PlanContext | undefined;\n const complexity = planContext?.complexity || 'medium';\n const enableDelegation = shouldEnablePlanDelegation(task, complexity);\n const allowedPlanTools = buildPlanAllowedTools(enableDelegation);\n const existingPlanPath = sessionManager.getSessionPlanPath(sessionId);\n const existingPlan = config.sessionId ? await this.loadPlan(existingPlanPath) : null;\n const planProfile = createPlanRuntimeProfile({\n workingDir: config.workingDir,\n sessionManager,\n task,\n complexity,\n existingPlan,\n });\n const complexityDefault = complexity === 'simple' ? 20 : complexity === 'complex' ? 40 : 30;\n // Plan mode caps iterations — token budget is the real control, not iterations.\n // Always reserve at least 3 iterations for plan_validate + report + one retry,\n // so exploration never consumes the entire budget.\n const SYNTHESIS_RESERVE = 3;\n const effectiveMaxIterations = Math.min(config.maxIterations, Math.max(10, complexityDefault));\n const totalPlanBudget = Math.max(\n 10_000,\n Math.floor(config.tokenBudget?.maxTokens ?? 1_000_000),\n );\n const sharedBudget = new SharedTokenBudget(totalPlanBudget);\n const explorationBudget = effectiveMaxIterations - SYNTHESIS_RESERVE;\n const planTaskPrompt = this.buildPlanPrompt(\n task,\n existingPlan?.markdown,\n effectiveMaxIterations,\n explorationBudget,\n sharedBudget.remaining,\n totalPlanBudget,\n enableDelegation,\n );\n const budgetSnapshot = () => this.buildBudgetSnapshot(sharedBudget, totalPlanBudget);\n\n this.emit(config, {\n type: 'status:change',\n timestamp: new Date().toISOString(),\n sessionId,\n data: {\n status: 'planning',\n message: 'Plan mode enabled: read-only exploration + markdown plan drafting',\n ...budgetSnapshot(),\n },\n });\n this.emit(config, {\n type: 'progress:update',\n timestamp: new Date().toISOString(),\n sessionId,\n data: {\n phase: 'plan',\n progress: 10,\n message: existingPlan ? 'Revising existing plan draft' : 'Generating new plan draft',\n ...budgetSnapshot(),\n },\n });\n\n try {\n // Build the plan-writer's toolRegistry with:\n // - allowedTools: read-only set + task_submit/task_status/task_collect for async delegation\n // - taskManager: TaskMiddleware that spawns read-only research sub-agents\n // Sub-agents get allowedTools=PLAN_READ_ONLY_TOOL_NAMES but no taskManager\n // → task tools won't register for them → no recursion.\n const planTaskMw = enableDelegation ? new TaskMiddleware({ maxConcurrent: 5 }) : undefined;\n const responseRequirementsSelector = createDefaultResponseRequirementsSelector();\n planTaskMw?.setSpawnFn(async (request) => {\n const researchRegistry = createToolRegistry({\n ...toolRegistry.getContext(),\n currentTask: request.task,\n allowedTools: allowedPlanTools,\n sessionMemory: createSessionMemoryBridge(\n request.workingDir ?? config.workingDir,\n config.sessionId,\n ),\n responseRequirementsResolver: async ({ task, kernel }: {\n task?: string;\n answer: string;\n kernel: KernelState | null;\n }) =>\n responseRequirementsSelector.select({\n state: kernel,\n messages: [],\n task: task ?? request.task,\n }),\n // no taskManager → task tools not registered → no recursion\n });\n const researchRunner = this.createSubRunner(\n {\n ...config,\n mode: undefined,\n maxIterations: request.maxIterations ?? Math.min(15, Math.max(5, Math.floor(effectiveMaxIterations * 0.25))),\n workingDir: request.workingDir ?? config.workingDir,\n tokenBudget: {\n ...config.tokenBudget,\n enabled: true,\n maxTokens: sharedBudget.allocate(Math.floor(sharedBudget.remaining * 0.30), 4000),\n softLimitRatio: 0.75,\n hardLimitRatio: 0.95,\n hardStop: true,\n forceSynthesisOnHardLimit: true,\n allowIterationBudgetExtension: false,\n },\n onEvent: config.onEvent,\n },\n researchRegistry,\n );\n const startedAt = Date.now();\n const result = await researchRunner.execute(request.task);\n sharedBudget.consume(result.tokensUsed);\n return {\n success: result.success,\n summary: result.summary,\n filesRead: result.filesRead,\n filesModified: result.filesModified,\n filesCreated: result.filesCreated,\n iterations: result.iterations,\n tokensUsed: result.tokensUsed,\n durationMs: Date.now() - startedAt,\n error: result.error,\n preset: request.preset ?? 'research' as const,\n };\n });\n\n const planWriterRegistry = createToolRegistry({\n ...toolRegistry.getContext(),\n currentTask: task,\n allowedTools: allowedPlanTools,\n taskManager: planTaskMw,\n sessionMemory: createSessionMemoryBridge(config.workingDir, sessionId),\n responseRequirementsResolver: async ({ task: activeTask, kernel }: {\n task?: string;\n answer: string;\n kernel: KernelState | null;\n }) =>\n responseRequirementsSelector.select({\n state: kernel,\n messages: [],\n task: activeTask ?? task,\n }),\n });\n\n const budgetAwarePrompt = `${planTaskPrompt}\\nCURRENT TOKEN BUDGET: ${sharedBudget.remaining}/${totalPlanBudget} tokens remaining. Be concise, avoid redundant exploration, and prioritize executable plan output.`;\n let reportedPlanText = '';\n const childOnEvent: AgentConfig['onEvent'] = (event) => {\n if (event.type === 'tool:end' && event.data?.toolName === 'report') {\n const metadataAnswer = (event.data?.metadata as { answer?: unknown } | undefined)?.answer;\n const output = typeof event.data?.output === 'string' ? event.data.output : '';\n const answer = typeof metadataAnswer === 'string' ? metadataAnswer : '';\n const captured = answer.trim() || output.trim();\n if (captured) {\n reportedPlanText = captured;\n }\n }\n if (event.type === 'llm:end') {\n const content = typeof event.data?.content === 'string' ? event.data.content.trim() : '';\n if (content && /^#{1,3}\\s+/m.test(content) && content.length > 200) {\n reportedPlanText = content;\n }\n }\n config.onEvent?.(event);\n };\n const planRunner = this.createSubRunner(\n {\n ...config,\n sessionId,\n mode: undefined,\n maxIterations: effectiveMaxIterations,\n tokenBudget: {\n ...config.tokenBudget,\n enabled: true,\n maxTokens: sharedBudget.allocate(Math.max(8_000, Math.floor(sharedBudget.remaining * 0.9)), 8000),\n softLimitRatio: config.tokenBudget?.softLimitRatio ?? 0.40,\n hardLimitRatio: config.tokenBudget?.hardLimitRatio ?? 0.95,\n hardStop: config.tokenBudget?.hardStop ?? true,\n forceSynthesisOnHardLimit: config.tokenBudget?.forceSynthesisOnHardLimit ?? true,\n restrictBroadExplorationAtSoftLimit:\n config.tokenBudget?.restrictBroadExplorationAtSoftLimit ?? true,\n allowIterationBudgetExtension: false,\n },\n onEvent: childOnEvent,\n },\n planWriterRegistry,\n planProfile,\n );\n\n const planningResult = await planRunner.execute(budgetAwarePrompt);\n sharedBudget.consume(planningResult.tokensUsed);\n const plan = planningResult.plan ?? this.buildFallbackPlan(sessionId, task, complexity, reportedPlanText || planningResult.summary, existingPlan);\n const runtimeCompletion = (planningResult.metrics?.runtimeCompletion as {\n blockedByPolicy?: boolean;\n validationResults?: Array<{ verdict: 'allow' | 'warn' | 'block'; rationale: string }>;\n } | undefined);\n const blockingValidation = runtimeCompletion?.validationResults?.find((result) => result.verdict === 'block');\n const validation = {\n passed: !runtimeCompletion?.blockedByPolicy,\n summary: blockingValidation?.rationale ?? 'Plan validation passed.',\n };\n const incomplete = plan.status === 'failed';\n\n if (incomplete || !validation.passed) {\n plan.status = 'failed';\n }\n\n this.emit(config, {\n type: 'progress:update',\n timestamp: new Date().toISOString(),\n sessionId,\n data: {\n phase: 'plan',\n progress: 78,\n message: incomplete\n ? 'Plan generation incomplete'\n : validation.passed\n ? 'Plan draft validated, persisting artifacts'\n : `Plan draft failed final validation: ${validation.summary}`,\n ...budgetSnapshot(),\n },\n });\n\n const planPath = sessionManager.getSessionPlanPath(sessionId);\n const documentPath = new PlanDocumentService(config.workingDir).getPlanPath(plan);\n const artifactPaths = [planPath, documentPath];\n const phaseCount = plan.phases.length;\n const stepCount = plan.phases.reduce((sum, phase) => sum + phase.steps.length, 0);\n\n if (incomplete || !validation.passed) {\n this.emit(config, {\n type: 'status:change',\n timestamp: new Date().toISOString(),\n sessionId,\n data: {\n status: 'error',\n message: incomplete\n ? 'Plan generation incomplete — agent did not produce a structured plan'\n : `Plan failed deterministic validation — ${validation.summary}`,\n ...budgetSnapshot(),\n },\n });\n this.emit(config, {\n type: 'progress:update',\n timestamp: new Date().toISOString(),\n sessionId,\n data: {\n phase: 'plan',\n progress: 100,\n message: 'Plan mode complete (incomplete)',\n ...budgetSnapshot(),\n },\n });\n\n return {\n success: false,\n summary: incomplete\n ? 'Plan generation incomplete — agent could not produce a concrete plan within the budget.'\n : `Plan failed deterministic validation — ${validation.summary}`,\n filesCreated: artifactPaths,\n filesModified: [],\n filesRead: planningResult.filesRead,\n iterations: planningResult.iterations,\n tokensUsed: planningResult.tokensUsed,\n sessionId,\n plan,\n };\n }\n\n this.emit(config, {\n type: 'status:change',\n timestamp: new Date().toISOString(),\n sessionId,\n data: {\n status: 'waiting',\n message: 'Plan ready. Waiting for user approval before execution.',\n ...budgetSnapshot(),\n },\n });\n this.emit(config, {\n type: 'progress:update',\n timestamp: new Date().toISOString(),\n sessionId,\n data: {\n phase: 'plan',\n progress: 100,\n message: 'Plan mode complete',\n ...budgetSnapshot(),\n },\n });\n\n return {\n success: true,\n summary: `Plan draft ready (${phaseCount} phases, ${stepCount} steps). Awaiting approval.`,\n filesCreated: artifactPaths,\n filesModified: [],\n filesRead: planningResult.filesRead,\n iterations: planningResult.iterations,\n tokensUsed: planningResult.tokensUsed,\n sessionId,\n plan,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.emit(config, {\n type: 'status:change',\n timestamp: new Date().toISOString(),\n sessionId,\n data: {\n status: 'error',\n message,\n },\n });\n this.emit(config, {\n type: 'agent:end',\n timestamp: new Date().toISOString(),\n sessionId,\n startedAt,\n data: {\n success: false,\n summary: 'Plan mode failed',\n iterations: 1,\n tokensUsed: 0,\n durationMs: Date.now() - startMs,\n filesCreated: [],\n filesModified: [],\n stopReason: 'error',\n },\n });\n throw error;\n }\n }\n\n private async loadPlan(planPath: string): Promise<TaskPlan | null> {\n try {\n const raw = await fs.readFile(planPath, 'utf-8');\n return JSON.parse(raw) as TaskPlan;\n } catch {\n return null;\n }\n }\n\n private buildPlanPrompt(\n task: string,\n existingMarkdown?: string,\n maxIterations?: number,\n explorationBudget?: number,\n remainingTokens?: number,\n totalTokens?: number,\n enableDelegation = false,\n ): string {\n const budget = maxIterations || 10;\n const researchBudget = explorationBudget ?? Math.ceil(budget * (enableDelegation ? 0.55 : 0.35));\n const remainingText = typeof remainingTokens === 'number' ? remainingTokens.toLocaleString('en-US') : 'unknown';\n const totalText = typeof totalTokens === 'number' ? totalTokens.toLocaleString('en-US') : 'unknown';\n const revisionSection = existingMarkdown\n ? `\\nExisting draft markdown (revise it based on the new request):\\n\\n${existingMarkdown}\\n`\n : '';\n return `PLAN MODE ACTIVE.\n\nGoal:\n- Explore the repository with available read-only tools.\n- Produce an executable implementation/refactor plan for the user request.\n- DO NOT modify source files or run write/edit operations.\n\nUser request:\n${task}\n${revisionSection}\n\nTOKEN BUDGET: ${remainingText}/${totalText} tokens remaining.\n\n⚠️ CRITICAL: EXPLORE AND WRITE SIMULTANEOUSLY — never batch all research first.\n\n## Mandatory workflow — repeat this cycle:\n\n1. **Explore** — Read 3-5 files using fs_read, fs_list, grep_search, glob_search\n2. **Update the plan file** — Call \\`plan_write\\` IMMEDIATELY after each discovery. Do NOT wait until the end.\n - First time: \\`plan_write(content=\"# Plan\\\\n\\\\n## What I found so far\\\\n...\")\\`\n - Later: \\`plan_write(content=\"<full updated plan with all sections>\")\\`\n3. **Continue or finish** — If more exploration needed, go back to step 1. If plan covers all aspects, call \\`plan_validate\\` then \\`report\\`.\n\n## Rules:\n- NEVER make more than 5 tool calls without calling \\`plan_write\\`. The plan file is your working memory.\n- Scale depth to the task: a vague feature request needs thorough exploration; a focused change needs 2-3 files.\n- A partial plan with 3 concrete sections beats no plan with 30 files read.\n- If you run out of budget, what's in plan_write IS your deliverable — so keep it updated.\n- The plan file survives context compaction — your work is never lost.\n- Hard limit: plan should be 30-50 lines. Delete prose if needed — keep file paths and concrete steps.\n\nRESEARCH QUALITY GATE — before writing the plan, verify:\n1. You found the actual entry point files for the feature (not just files that happen to mention keywords).\n2. If your first search returned 0 results or irrelevant files — search again with different terms or explore the directory structure.\n3. Do NOT reference a file in the plan unless you have read it and confirmed it is relevant.\n4. If you are unsure where something lives — use fs_list on the top-level directories first to orient yourself.\n\n${enableDelegation\n ? `DELEGATION WITH task_submit (ASYNC SUB-AGENTS):\nYou have access to async task tools for parallel sub-agent delegation:\n- \\`task_submit\\` — fire off a sub-agent in the background, get a task ID immediately\n- \\`task_status\\` — check progress of running tasks (without blocking)\n- \\`task_collect\\` — wait for a specific task to complete and get its full result\n\nWHEN TO DELEGATE — use task_submit if ANY of these are true:\n- A directory has 3+ files that each need to be read fully (e.g. a whole package or module)\n- You need to find all callers/usages across multiple packages\n- The task involves a large file (500+ lines) AND other files also need reading\n- You can split research into 2-3 independent questions that don't depend on each other\n- The task mentions \"ALL repositories\" or \"all packages\" — delegate each repo/group to a sub-agent\n\nHOW TO USE EFFECTIVELY:\n1. Submit 2-3 parallel tasks, not more.\n2. Continue your own work while sub-agents run in parallel.\n3. Collect results with \\`task_collect\\` only when they are clearly relevant to the final plan.\n4. Stop delegating once you have enough grounded evidence for the main implementation path.`\n : `SCOPED PLANNING:\n- This task is narrow enough that async delegation is usually counterproductive.\n- Prefer directly reading the 2-4 most relevant files, then draft the plan.\n- Do NOT branch into broad workspace scans once the core implementation path is clear.\n- If the first file guess is wrong, re-orient with \\`fs_list\\` or \\`glob_search\\`, then continue locally.`}\n\nOutput requirements:\n- Final output must be a single markdown document.\n- Include: title, Table of Contents, Task (A -> B), Steps/Phases, Risks, Verification, Approval.\n- The ## Verification section MUST list concrete shell commands wrapped in backticks, e.g.:\n - \\`pnpm --filter @kb-labs/agent-core build\\`\n - \\`pnpm --filter @kb-labs/agent-core test\\`\n - \\`pnpm --filter @kb-labs/agent-cli run build\\`\n- If revising existing plan, update the same plan and preserve useful parts.\n- End with a short line that the plan is ready for user approval.\n\nLANGUAGE: Write the plan body text in the SAME language as the user request above. Section headings (## Task, ## Steps, etc.) can stay in English, but all descriptions, explanations, and prose MUST match the user's language.\n\nWRITING STYLE — the plan is for a HUMAN reader, not a machine:\n- Write like you're explaining the plan to a colleague. A real person will read this top to bottom to verify you understood the task and didn't miss anything.\n- For each phase/step, briefly explain WHY — not just \"Edit file X at line Y\" but what the change achieves and why it's needed.\n- Show that you understood the current code: \"Currently \\`log()\\` only calls console.log when verbose=true, but useLogger is already imported and unused — we'll wire it up\".\n- Use short prose paragraphs between steps to connect the narrative — the reader should feel the logical flow, not read a raw checklist.\n- Keep code snippets short (3-5 lines max). The plan is a map, not the implementation itself. Reference line numbers instead of pasting large blocks.\n- DO NOT pad with filler text. Every sentence should either explain context, justify a decision, or describe a concrete action.\n\nQUALITY CRITERIA (your plan will be scored on these):\n1. SPECIFICITY — reference ACTUAL file paths you discovered (e.g. \\`src/planning/plan-generator.ts:1319\\`)\n2. ACTIONABILITY — every step must contain a file path OR a shell command, not just descriptions\n3. VERIFICATION — include runnable commands (e.g. \\`pnpm --filter @kb-labs/agent-core test\\`)\n\nExamples of GOOD vs BAD steps:\n BAD: \"Update the configuration file\"\n GOOD: \"Edit packages/agent-core/src/planning/plan-generator.ts:1319 — add specificity scoring to assessPlanQuality\"\n\n BAD: \"Run tests\"\n GOOD: \"pnpm --filter @kb-labs/agent-core test — verify validator passes\"\n\n BAD: \"Ensure the module exports are correct\"\n GOOD: \"Add \\`export { PlanValidator }\\` to packages/agent-core/src/planning/index.ts\"\n\nPLAN VALIDATION — MANDATORY BEFORE report():\nAfter writing the plan markdown, you MUST validate it before submitting:\n\n1. Call \\`plan_validate(task=\"<original user task>\", plan_markdown=\"<your plan>\")\\`\n - The tool will score your plan and return pass/fail with concrete feedback.\n - If PASSED: call \\`report(answer=<plan>)\\` immediately.\n - If FAILED: read the feedback, improve the specific sections it criticizes, then call \\`plan_validate\\` again.\n - After 3 consecutive FAILED validations: call \\`ask_user(message=<plan + feedback summary>)\\` to escalate.\n\n2. NEVER call \\`report()\\` without a passing \\`plan_validate\\` first (unless you've exhausted all 3 attempts).\n\nCRITICAL — TOOL USE REQUIRED:\nYou MUST call the \\`report\\` tool as your final action. Do NOT write the plan as plain text without a tool call.\n- A plain-text response without calling \\`report()\\` is NOT a valid completion — it will fail the quality gate.\n- Call \\`report(answer=<your full markdown plan>, confidence=0.7)\\` when done.\n- Even if you think you are done, you MUST call \\`report\\` to submit the plan.`;\n }\n\n private createSubRunner(config: AgentConfig, toolRegistry: ToolRegistry, planProfile?: ReturnType<typeof createPlanRuntimeProfile>): IAgentRunner {\n return new AgentSDK()\n .registerRuntimeProfile(planProfile ?? createPlanRuntimeProfile())\n .register(createCoreToolPack(toolRegistry))\n .createRunner(config);\n }\n\n private buildFallbackPlan(\n sessionId: string,\n task: string,\n complexity: 'simple' | 'medium' | 'complex',\n summary: string,\n existingPlan: TaskPlan | null,\n ): TaskPlan {\n const markdown = [\n `# Plan: ${task}`,\n '',\n '> **WARNING:** Shared plan result mapper did not produce a structured plan; using fallback artifact.',\n '',\n '## Task',\n task,\n '',\n '## Notes',\n summary || 'No plan content was produced.',\n ].join('\\n');\n\n return {\n id: existingPlan?.id || `plan-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n sessionId,\n task,\n mode: 'plan',\n phases: [],\n estimatedDuration: existingPlan?.estimatedDuration || 'Unknown',\n complexity,\n createdAt: existingPlan?.createdAt || new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n status: 'failed',\n markdown,\n };\n }\n\n private buildBudgetSnapshot(sharedBudget: SharedTokenBudget, totalBudget: number): {\n budgetUsedTokens: number;\n budgetRemainingTokens: number;\n budgetTotalTokens: number;\n } {\n return {\n budgetUsedTokens: sharedBudget.used,\n budgetRemainingTokens: sharedBudget.remaining,\n budgetTotalTokens: totalBudget,\n };\n }\n\n private emit(config: AgentConfig, event: AgentEvent): void {\n if (!config.onEvent) {return;}\n config.onEvent({\n ...event,\n agentId: config.agentId,\n parentAgentId: config.parentAgentId,\n });\n }\n}\n\nfunction shouldEnablePlanDelegation(\n task: string,\n complexity: 'simple' | 'medium' | 'complex',\n): boolean {\n if (complexity === 'complex') {\n return true;\n }\n return /\\b(all repositories|all repos|all packages|entire workspace|whole workspace|across the repo|across repositories|monorepo-wide|workspace-wide)\\b/i.test(task);\n}\n\nfunction buildPlanAllowedTools(enableDelegation: boolean): Set<string> {\n if (enableDelegation) {\n return new Set(PLAN_READ_ONLY_TOOL_NAMES);\n }\n return new Set([\n 'fs_read',\n 'fs_list',\n 'glob_search',\n 'grep_search',\n 'find_definition',\n 'code_stats',\n 'memory_get',\n 'memory_finding',\n 'memory_blocker',\n 'archive_recall',\n 'ask_user',\n 'report',\n 'plan_validate',\n 'plan_write',\n ]);\n}\n","/**\n * Edit mode handler - modify existing files\n */\n\nimport type { TaskResult, AgentConfig, EditContext } from '@kb-labs/agent-contracts';\nimport type { ToolRegistry } from '@kb-labs/agent-tools';\nimport type { ModeHandler } from './mode-handler';\nimport { AgentSDK } from '@kb-labs/agent-sdk';\nimport { createCoreToolPack } from '../tools/index.js';\n\n/**\n * Edit mode - focus on modifying existing files\n */\nexport class EditModeHandler implements ModeHandler {\n async execute(\n task: string,\n config: AgentConfig,\n toolRegistry: ToolRegistry\n ): Promise<TaskResult> {\n const editContext = config.mode?.context as EditContext | undefined;\n const targetFiles = editContext?.targetFiles || [];\n const dryRun = editContext?.dryRun || false;\n\n // Enhanced task prompt for edit mode\n let enhancedTask = task;\n\n if (targetFiles.length > 0) {\n enhancedTask += `\\n\\nTarget files to edit:\\n${targetFiles.map((f) => `- ${f}`).join('\\n')}`;\n enhancedTask += '\\n\\nFocus on reading these files first, then applying necessary edits.';\n }\n\n if (dryRun) {\n enhancedTask += '\\n\\nDRY RUN MODE: Preview changes but DO NOT write to files. Describe what changes would be made.';\n }\n\n enhancedTask += '\\n\\nPrefer editing existing files over creating new ones.';\n\n // Execute with SDK agent\n const runner = new AgentSDK()\n .register(createCoreToolPack(toolRegistry))\n .createRunner(config);\n const result = await runner.execute(enhancedTask);\n\n // Add edit mode context to result\n return {\n ...result,\n summary: dryRun\n ? `[DRY RUN] ${result.summary}`\n : result.summary,\n };\n }\n}\n","/**\n * Debug mode handler - analyze errors with trace context\n */\n\nimport type { TaskResult, AgentConfig, DebugContext } from '@kb-labs/agent-contracts';\nimport type { ToolRegistry } from '@kb-labs/agent-tools';\nimport type { ModeHandler } from './mode-handler';\nimport { AgentSDK } from '@kb-labs/agent-sdk';\nimport { createCoreToolPack } from '../tools/index.js';\nimport { promises as fs } from 'node:fs';\n\n/**\n * Debug mode - analyze errors and suggest fixes with trace context\n */\nexport class DebugModeHandler implements ModeHandler {\n async execute(\n task: string,\n config: AgentConfig,\n toolRegistry: ToolRegistry\n ): Promise<TaskResult> {\n const debugContext = config.mode?.context as DebugContext | undefined;\n const traceFile = debugContext?.traceFile;\n const errorTrace = debugContext?.errorTrace;\n const relevantFiles = debugContext?.relevantFiles || [];\n\n // Enhanced task prompt for debug mode\n let enhancedTask = `DEBUG MODE: ${task}\\n\\n`;\n\n // Load trace file if provided\n if (traceFile) {\n try {\n const traceContent = await fs.readFile(traceFile, 'utf-8');\n const trace = JSON.parse(traceContent);\n\n enhancedTask += '## Execution Trace\\n\\n';\n enhancedTask += '```json\\n';\n enhancedTask += JSON.stringify(trace, null, 2);\n enhancedTask += '\\n```\\n\\n';\n } catch {\n enhancedTask += `⚠️ Failed to load trace file: ${traceFile}\\n\\n`;\n }\n }\n\n // Add error trace if provided\n if (errorTrace) {\n enhancedTask += '## Error Trace\\n\\n';\n enhancedTask += '```\\n';\n enhancedTask += errorTrace;\n enhancedTask += '\\n```\\n\\n';\n }\n\n // Add relevant files if provided\n if (relevantFiles.length > 0) {\n enhancedTask += '## Relevant Files\\n\\n';\n enhancedTask += relevantFiles.map((f) => `- ${f}`).join('\\n');\n enhancedTask += '\\n\\n';\n enhancedTask += 'Read these files to understand the context.\\n\\n';\n }\n\n enhancedTask += '## Your Task\\n\\n';\n enhancedTask += '1. Analyze the trace and error information\\n';\n enhancedTask += '2. Identify the root cause\\n';\n enhancedTask += '3. Suggest or implement fixes\\n';\n enhancedTask += '4. Explain what went wrong and why the fix works\\n';\n\n // Execute with SDK agent\n const runner = new AgentSDK()\n .register(createCoreToolPack(toolRegistry))\n .createRunner(config);\n const result = await runner.execute(enhancedTask);\n\n return {\n ...result,\n summary: `[DEBUG] ${result.summary}`,\n };\n }\n}\n","/**\n * Spec mode handler — generates a detailed specification from an approved plan.\n *\n * Not a separate AgentMode. Called from REST/CLI after plan approval.\n * Creates a child agent with read-only tools + plan markdown in the system prompt.\n * The agent reads actual source files, verifies code at specified line numbers,\n * and produces exact before/after diffs for each plan step.\n *\n * Output: TaskSpec (structured) + spec.md (human-readable markdown).\n */\n\nimport type {\n AgentConfig,\n AgentEvent,\n TaskPlan,\n TaskSpec,\n SpecSection,\n SpecChange,\n TaskResult,\n ToolDefinition,\n} from '@kb-labs/agent-contracts';\nimport { DEFAULT_AGENT_TOKEN_BUDGET_CONFIG } from '@kb-labs/agent-contracts';\nimport { ToolRegistry } from '@kb-labs/agent-tools';\nimport { AgentSDK, type IAgentRunner } from '@kb-labs/agent-sdk';\nimport { createCoreToolPack } from '../tools/index.js';\nimport { SessionManager } from '../planning/session-manager';\nimport { SpecValidator } from '../planning/spec-validator';\nimport { promises as fs } from 'node:fs';\nimport * as path from 'node:path';\n\n// ---------------------------------------------------------------------------\n// Read-only tool set (same as plan mode, but spec needs deeper file reads)\n// ---------------------------------------------------------------------------\n\nconst SPEC_READ_ONLY_TOOLS = new Set<string>([\n 'fs_read',\n 'fs_list',\n 'glob_search',\n 'grep_search',\n 'find_definition',\n 'code_stats',\n 'memory_get',\n 'memory_finding',\n 'memory_blocker',\n 'archive_recall',\n 'todo_create',\n 'todo_update',\n 'todo_get',\n 'ask_user',\n 'report',\n]);\n\ninterface DelegatedResearchPack {\n title: string;\n prompt: string;\n}\n\nclass SharedTokenBudget {\n private consumed = 0;\n\n constructor(private readonly total: number) {}\n\n get remaining(): number {\n return Math.max(0, this.total - this.consumed);\n }\n\n get used(): number {\n return Math.max(0, this.consumed);\n }\n\n allocate(requested: number, minimum = 4000): number {\n const requestedSafe = Number.isFinite(requested) ? Math.max(minimum, Math.floor(requested)) : minimum;\n if (this.remaining <= 0) {return 0;}\n return Math.min(this.remaining, requestedSafe);\n }\n\n consume(tokensUsed: number): void {\n if (!Number.isFinite(tokensUsed) || tokensUsed <= 0) {return;}\n this.consumed += Math.floor(tokensUsed);\n }\n}\n\n/**\n * A ToolRegistry restricted to an allowed set of tool names.\n * Extends ToolRegistry so it can be passed wherever ToolRegistry is expected\n * without unsafe casts — override the read/execute methods to filter by allowedNames.\n */\nclass ReadOnlySpecToolRegistry extends ToolRegistry {\n constructor(\n private readonly base: ToolRegistry,\n private readonly allowedNames: Set<string>,\n ) {\n super(base.getContext());\n }\n\n override get(name: string) {\n if (!this.allowedNames.has(name)) {return undefined;}\n return this.base.get(name);\n }\n\n override getDefinitions(): ToolDefinition[] {\n return this.base\n .getDefinitions()\n .filter((def) => this.allowedNames.has(def.function.name));\n }\n\n override async execute(name: string, input: Record<string, unknown>) {\n if (!this.allowedNames.has(name)) {\n throw new Error(`Tool \"${name}\" is disabled in spec mode (read-only).`);\n }\n return this.base.execute(name, input);\n }\n\n override getToolNames(): string[] {\n return this.base\n .getToolNames()\n .filter((tool) => this.allowedNames.has(tool));\n }\n\n override getContext() {\n return this.base.getContext();\n }\n}\n\n// ---------------------------------------------------------------------------\n// SpecModeHandler\n// ---------------------------------------------------------------------------\n\nexport class SpecModeHandler {\n /**\n * Generate a detailed specification from an approved plan.\n *\n * @param plan - Approved TaskPlan (must have status 'approved')\n * @param config - Agent config (workingDir, onEvent, etc.)\n * @param toolRegistry - Full tool registry (will be wrapped read-only)\n * @returns TaskResult with .spec populated\n */\n async execute(\n plan: TaskPlan,\n config: AgentConfig,\n toolRegistry: ToolRegistry,\n ): Promise<TaskResult> {\n const startedAt = new Date().toISOString();\n const startMs = Date.now();\n const sessionId = plan.sessionId;\n const sessionManager = new SessionManager(config.workingDir);\n\n const specBudget = this.resolveSpecBudgetPolicy(config, plan);\n const sharedBudget = new SharedTokenBudget(specBudget.maxTokens);\n const budgetSnapshot = () => this.buildBudgetSnapshot(sharedBudget, specBudget.maxTokens);\n const effectiveMaxIterations = this.resolveSpecIterations(plan, specBudget.maxTokens);\n const synthesisReserveIterations = Math.max(\n 2,\n Math.floor(effectiveMaxIterations * specBudget.synthesisReserveRatio),\n );\n const researchBudget = Math.max(4, effectiveMaxIterations - synthesisReserveIterations);\n\n this.emit(config, {\n type: 'status:change',\n timestamp: new Date().toISOString(),\n sessionId,\n data: {\n status: 'planning',\n message: 'Spec mode: generating detailed specification from approved plan',\n ...budgetSnapshot(),\n },\n });\n this.emit(config, {\n type: 'progress:update',\n timestamp: new Date().toISOString(),\n sessionId,\n data: {\n phase: 'spec',\n progress: 5,\n message: `Generating spec for ${plan.phases.length} phases (budget: ${effectiveMaxIterations} iterations, ~${specBudget.maxTokens} tokens)`,\n ...budgetSnapshot(),\n },\n });\n\n try {\n const readOnlyRegistry = new ReadOnlySpecToolRegistry(toolRegistry, SPEC_READ_ONLY_TOOLS);\n const delegatedResearch = await this.runDelegatedResearchPacks(\n plan,\n config,\n readOnlyRegistry,\n sharedBudget,\n specBudget.maxTokens,\n );\n const specPrompt = this.buildSpecPrompt(\n plan,\n effectiveMaxIterations,\n researchBudget,\n synthesisReserveIterations,\n specBudget.maxTokens,\n sharedBudget.remaining,\n delegatedResearch,\n );\n\n let reportedSpecText = '';\n let lastLongThinking = '';\n const childOnEvent: AgentConfig['onEvent'] = (event) => {\n // Capture report tool output — the spec markdown\n if (event.type === 'tool:end' && event.data?.toolName === 'report') {\n const metadataAnswer = (event.data?.metadata as { answer?: unknown } | undefined)?.answer;\n const output = typeof event.data?.output === 'string' ? event.data.output : '';\n const answer = typeof metadataAnswer === 'string' ? metadataAnswer : '';\n const captured = answer.trim() || output.trim();\n if (captured) {\n reportedSpecText = captured;\n }\n }\n // Capture direct LLM output that looks like a spec\n if (event.type === 'llm:end') {\n const content = typeof event.data?.content === 'string' ? event.data.content.trim() : '';\n if (content && /\\*\\*File:\\*\\*/m.test(content)) {\n reportedSpecText = content;\n }\n // Keep the longest thinking output as fallback — agent may write\n // the spec in the final Thought when report tool fails\n if (content && content.length > lastLongThinking.length && /```[\\w]*\\n/.test(content)) {\n lastLongThinking = content;\n }\n }\n config.onEvent?.(event);\n };\n\n const specRunner = this.createSubRunner(\n {\n ...config,\n sessionId,\n mode: undefined,\n maxIterations: effectiveMaxIterations,\n tokenBudget: {\n ...config.tokenBudget,\n enabled: true,\n maxTokens: sharedBudget.allocate(sharedBudget.remaining, 12_000),\n softLimitRatio: config.tokenBudget?.softLimitRatio ?? 0.75,\n hardLimitRatio: config.tokenBudget?.hardLimitRatio ?? 0.95,\n hardStop: config.tokenBudget?.hardStop ?? true,\n forceSynthesisOnHardLimit: config.tokenBudget?.forceSynthesisOnHardLimit ?? true,\n restrictBroadExplorationAtSoftLimit:\n config.tokenBudget?.restrictBroadExplorationAtSoftLimit ?? true,\n allowIterationBudgetExtension:\n config.tokenBudget?.allowIterationBudgetExtension ?? false,\n },\n onEvent: childOnEvent,\n },\n readOnlyRegistry,\n );\n\n const specResult = await specRunner.execute(specPrompt);\n sharedBudget.consume(specResult.tokensUsed);\n // Priority: report tool output > LLM direct output > last long thinking > summary\n const rawSummary = specResult.summary;\n const isSummaryUseless = !rawSummary || rawSummary === 'No answer provided' || rawSummary.length < 50;\n let specMarkdown = reportedSpecText\n || (isSummaryUseless ? '' : rawSummary)\n || lastLongThinking\n || rawSummary;\n if (!specMarkdown.trim() || specMarkdown.trim() === 'Unable to synthesize findings') {\n specMarkdown = this.buildFallbackPartialSpec(plan, specResult.filesRead, specBudget.maxTokens);\n }\n\n // Parse and validate\n const validator = new SpecValidator();\n let validation = validator.validateMarkdown(specMarkdown, plan);\n if (!validation.passed && validation.metrics.uncoveredStepCount > 0) {\n const repaired = await this.tryRepairSpecWithCoverageGaps({\n plan,\n currentSpecMarkdown: specMarkdown,\n uncoveredSteps: this.collectUncoveredPlanSteps(plan, specMarkdown),\n baseConfig: config,\n toolRegistry: readOnlyRegistry,\n tokenBudget: sharedBudget.remaining,\n sharedBudget,\n });\n if (repaired) {\n const repairedValidation = validator.validateMarkdown(repaired, plan);\n if (repairedValidation.score > validation.score) {\n specMarkdown = repaired;\n validation = repairedValidation;\n }\n }\n }\n\n // Build structured spec\n const now = new Date().toISOString();\n const specId = `spec-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n const sections = this.parseSpecSections(specMarkdown, plan);\n const hasMaterial =\n sections.length > 0\n || /\\*\\*File:\\*\\*\\s*`/.test(specMarkdown)\n || specMarkdown.trim().length > 300;\n let specStatus: TaskSpec['status'] = validation.passed ? 'draft' : 'failed';\n if (!validation.passed && specBudget.partialOnFailure && hasMaterial) {\n specStatus = 'partial';\n }\n\n const spec: TaskSpec = {\n id: specId,\n planId: plan.id,\n sessionId,\n task: plan.task,\n sections,\n status: specStatus,\n markdown: specMarkdown,\n createdAt: now,\n updatedAt: now,\n };\n\n // Also validate structured spec if sections were parsed\n if (sections.length > 0) {\n const structuredValidation = validator.validate(spec, plan);\n if (!structuredValidation.passed && !(specBudget.partialOnFailure && hasMaterial)) {\n spec.status = 'failed';\n }\n }\n\n // Persist spec.json + spec.md\n const specPath = sessionManager.getSessionSpecPath(sessionId);\n const specMdPath = sessionManager.getSessionSpecMdPath(sessionId);\n await fs.mkdir(path.dirname(specPath), { recursive: true });\n await fs.writeFile(specPath, JSON.stringify(spec, null, 2), 'utf-8');\n await fs.writeFile(specMdPath, specMarkdown, 'utf-8');\n\n // Update plan status to spec_ready if spec is usable\n if (spec.status === 'draft' || spec.status === 'partial') {\n const planPath = sessionManager.getSessionPlanPath(sessionId);\n try {\n const planData = JSON.parse(await fs.readFile(planPath, 'utf-8')) as TaskPlan;\n planData.status = 'spec_ready';\n planData.updatedAt = now;\n await fs.writeFile(planPath, JSON.stringify(planData, null, 2), 'utf-8');\n } catch {\n // Plan file may not exist in some flows — non-critical\n }\n }\n\n this.emit(config, {\n type: 'progress:update',\n timestamp: new Date().toISOString(),\n sessionId,\n data: {\n phase: 'spec',\n progress: 100,\n message: spec.status === 'failed'\n ? `Spec quality insufficient (score: ${validation.score.toFixed(2)})`\n : `Spec ready (${sections.length} sections, status: ${spec.status}, score: ${validation.score.toFixed(2)})`,\n ...budgetSnapshot(),\n },\n });\n\n this.emit(config, {\n type: 'status:change',\n timestamp: new Date().toISOString(),\n sessionId,\n data: {\n status: spec.status === 'failed' ? 'error' : 'waiting',\n message: spec.status === 'failed'\n ? `Spec generation failed (score: ${validation.score.toFixed(2)})`\n : spec.status === 'partial'\n ? 'Partial spec ready. Review gaps before execution.'\n : 'Spec ready. Review before execution.',\n ...budgetSnapshot(),\n },\n });\n\n const totalChanges = sections.reduce((sum, s) => sum + s.changes.length, 0);\n const specFailed = spec.status === 'failed';\n\n return {\n success: !specFailed,\n summary: specFailed\n ? `Spec generation incomplete — quality score ${validation.score.toFixed(2)}`\n : spec.status === 'partial'\n ? `Partial spec ready (${sections.length} sections, ${totalChanges} changes, score: ${validation.score.toFixed(2)})`\n : `Spec ready (${sections.length} sections, ${totalChanges} changes, score: ${validation.score.toFixed(2)})`,\n filesCreated: [specPath, specMdPath],\n filesModified: [],\n filesRead: specResult.filesRead,\n iterations: specResult.iterations,\n tokensUsed: specResult.tokensUsed,\n sessionId,\n spec,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.emit(config, {\n type: 'status:change',\n timestamp: new Date().toISOString(),\n sessionId,\n data: {\n status: 'error',\n message,\n },\n });\n this.emit(config, {\n type: 'agent:end',\n timestamp: new Date().toISOString(),\n sessionId,\n startedAt,\n data: {\n success: false,\n summary: 'Spec mode failed',\n iterations: 1,\n tokensUsed: 0,\n durationMs: Date.now() - startMs,\n filesCreated: [],\n filesModified: [],\n stopReason: 'error',\n },\n });\n throw error;\n }\n }\n\n // -------------------------------------------------------------------------\n // Spec prompt\n // -------------------------------------------------------------------------\n\n private buildSpecPrompt(\n plan: TaskPlan,\n maxIterations: number,\n researchBudget: number,\n synthesisReserveIterations: number,\n tokenBudget: number,\n remainingTokens: number,\n delegatedResearch?: string,\n ): string {\n const planMarkdown = plan.markdown || this.planToMarkdownFallback(plan);\n const delegatedResearchSection = delegatedResearch\n ? `\\nDELEGATED RESEARCH SNAPSHOT:\\n${delegatedResearch}\\n`\n : '';\n\n return `SPEC MODE ACTIVE — Generating detailed specification from approved plan.\n\nAPPROVED PLAN:\n${planMarkdown}\n${delegatedResearchSection}\n\nYOUR TASK:\nFor EACH step in the plan above, produce an exact before/after code diff.\n\nPROCESS:\n1. Read the file mentioned in the plan step using fs_read\n2. Find the exact lines described in the step\n3. Verify the current code matches what the plan describes\n4. Write the before/after diff showing the minimal change needed\n5. Repeat for every step\n\nBUDGET: ${maxIterations} iterations total (~${tokenBudget} tokens).\nCURRENT TOKEN BUDGET: ${remainingTokens}/${tokenBudget} tokens remaining. Work carefully and avoid low-value exploration.\n- Research/read budget: up to ${researchBudget} iterations\n- Reserved for synthesis/verification: ${synthesisReserveIterations} iterations\n- Prefer spending budget on concrete section output over extra exploration near the end.\n\nOUTPUT FORMAT — for each change, use exactly this structure:\n\n### [phase-id:step-id] Short title\n\n**File:** \\`path/to/file.ts\\`\n**Lines:** start-end\n\n**Before (current):**\n\\`\\`\\`ts\n<EXACT copy of current code — verified by reading the file>\n\\`\\`\\`\n\n**After:**\n\\`\\`\\`ts\n<new code — minimal diff, change only what's needed>\n\\`\\`\\`\n\n**Why:** Brief explanation of what the change achieves.\n\nRULES:\n- NEVER guess code. ALWAYS use fs_read first. If line numbers in the plan are slightly off, find the correct ones.\n- The \"Before\" block MUST be an EXACT copy-paste of the current file content. Do not paraphrase.\n- The \"After\" block must show the minimal change — do not refactor surrounding code.\n- If a plan step is vague, make a concrete implementation decision and explain why.\n- If a file doesn't exist yet (new file), use \"Before: (new file)\" and show full content in After.\n- If you run out of budget, output whatever spec sections you've completed so far.\n\nLANGUAGE: Match the plan's language for explanations. Code stays in its original language.\n\nWhen finished, call the report tool with the complete spec markdown.`;\n }\n\n private async runDelegatedResearchPacks(\n plan: TaskPlan,\n config: AgentConfig,\n toolRegistry: ToolRegistry,\n sharedBudget: SharedTokenBudget,\n totalBudget: number,\n ): Promise<string> {\n const packs = this.buildResearchPacks(plan);\n if (packs.length === 0) {\n return '';\n }\n\n const outputs: string[] = [];\n for (let i = 0; i < packs.length; i++) {\n const pack = packs[i]!;\n this.emit(config, {\n type: 'progress:update',\n timestamp: new Date().toISOString(),\n sessionId: plan.sessionId,\n data: {\n phase: 'spec',\n progress: Math.min(45, 12 + (i * 8)),\n message: `Delegated research ${i + 1}/${packs.length}: ${pack.title}`,\n ...this.buildBudgetSnapshot(sharedBudget, totalBudget),\n },\n });\n let reported = '';\n const subRunner = this.createSubRunner(\n {\n ...config,\n mode: undefined,\n maxIterations: 6,\n tokenBudget: {\n ...config.tokenBudget,\n enabled: true,\n maxTokens: sharedBudget.allocate(Math.floor(sharedBudget.remaining * 0.2), 5000),\n softLimitRatio: config.tokenBudget?.softLimitRatio ?? 0.75,\n hardLimitRatio: config.tokenBudget?.hardLimitRatio ?? 0.95,\n hardStop: config.tokenBudget?.hardStop ?? true,\n forceSynthesisOnHardLimit: config.tokenBudget?.forceSynthesisOnHardLimit ?? true,\n restrictBroadExplorationAtSoftLimit:\n config.tokenBudget?.restrictBroadExplorationAtSoftLimit ?? true,\n allowIterationBudgetExtension: false,\n },\n onEvent: (event: AgentEvent) => {\n if (event.type === 'tool:end' && event.data?.toolName === 'report') {\n const metadataAnswer = (event.data?.metadata as { answer?: unknown } | undefined)?.answer;\n const output = typeof event.data?.output === 'string' ? event.data.output : '';\n const answer = typeof metadataAnswer === 'string' ? metadataAnswer : '';\n const captured = answer.trim() || output.trim();\n if (captured) {\n reported = captured;\n }\n }\n config.onEvent?.(event);\n },\n },\n toolRegistry,\n );\n\n const budgetAwarePrompt = `${pack.prompt}\\n\\nCURRENT TOKEN BUDGET: ${sharedBudget.remaining}/${totalBudget} tokens remaining. Prioritize concrete file evidence.`;\n const result = await subRunner.execute(budgetAwarePrompt);\n sharedBudget.consume(result.tokensUsed);\n const text = (reported || result.summary || '').trim();\n if (text) {\n outputs.push(`### ${pack.title}\\n${text.slice(0, 2500)}`);\n }\n }\n\n return outputs.join('\\n\\n');\n }\n\n private buildResearchPacks(plan: TaskPlan): DelegatedResearchPack[] {\n const packs: DelegatedResearchPack[] = [];\n const phaseChunks = this.chunkArray(plan.phases, Math.max(1, Math.ceil(plan.phases.length / 3)));\n for (let i = 0; i < phaseChunks.length && packs.length < 3; i++) {\n const chunk = phaseChunks[i]!;\n const stepHints = chunk\n .flatMap((phase) => phase.steps.slice(0, 4).map((step) => `- ${step.action}`))\n .slice(0, 12)\n .join('\\n');\n packs.push({\n title: `Research Pack ${i + 1}`,\n prompt: [\n 'Research only. Do not propose final spec.',\n 'Analyze these plan steps and gather concrete implementation evidence:',\n stepHints || '- (no explicit step hints)',\n '',\n 'Deliverables:',\n '- file paths and relevant line ranges',\n '- constraints/dependencies found in code',\n '- concrete implementation decisions and risks',\n '',\n 'Return concise markdown bullets and call report tool.',\n ].join('\\n'),\n });\n }\n return packs;\n }\n\n private chunkArray<T>(items: T[], chunkSize: number): T[][] {\n if (chunkSize <= 0) {return [items];}\n const chunks: T[][] = [];\n for (let i = 0; i < items.length; i += chunkSize) {\n chunks.push(items.slice(i, i + chunkSize));\n }\n return chunks.length > 0 ? chunks : [items];\n }\n\n private collectUncoveredPlanSteps(plan: TaskPlan, markdown: string): string[] {\n const covered = new Set<string>();\n const refRegex = /^###\\s+\\[([^\\]]+)\\]/gm;\n let match: RegExpExecArray | null;\n while ((match = refRegex.exec(markdown)) !== null) {\n const ref = match[1] || '';\n if (ref.includes(':')) {covered.add(ref.trim());}\n }\n\n const missing: string[] = [];\n for (const phase of plan.phases) {\n for (const step of phase.steps) {\n const ref = `${phase.id}:${step.id}`;\n if (!covered.has(ref)) {\n missing.push(`${ref} — ${step.action}`);\n }\n }\n }\n return missing;\n }\n\n private async tryRepairSpecWithCoverageGaps(input: {\n plan: TaskPlan;\n currentSpecMarkdown: string;\n uncoveredSteps: string[];\n baseConfig: AgentConfig;\n toolRegistry: ToolRegistry;\n tokenBudget: number;\n sharedBudget: SharedTokenBudget;\n }): Promise<string | null> {\n if (input.uncoveredSteps.length === 0) {\n return null;\n }\n\n let reported = '';\n const repairPrompt = [\n 'SPEC REPAIR MODE.',\n 'The current spec is incomplete. Fill ONLY missing steps.',\n '',\n 'Current spec draft:',\n input.currentSpecMarkdown,\n '',\n 'Missing plan steps to cover:',\n ...input.uncoveredSteps.slice(0, 25).map((step) => `- ${step}`),\n '',\n 'Rules:',\n '- Read files before writing each missing step.',\n '- Output only additional sections in the same format.',\n '- Keep changes minimal and concrete.',\n `- Current token budget remaining: ${input.sharedBudget.remaining} tokens. Be concise.`,\n '- Use report tool with the repaired full spec markdown (updated entire document).',\n ].join('\\n');\n\n const repairRunner = this.createSubRunner(\n {\n ...input.baseConfig,\n mode: undefined,\n maxIterations: 6,\n tokenBudget: {\n ...input.baseConfig.tokenBudget,\n enabled: true,\n maxTokens: input.sharedBudget.allocate(Math.max(8_000, Math.floor(input.tokenBudget * 0.9)), 5000),\n hardStop: true,\n forceSynthesisOnHardLimit: true,\n allowIterationBudgetExtension: false,\n },\n onEvent: (event: AgentEvent) => {\n if (event.type === 'tool:end' && event.data?.toolName === 'report') {\n const metadataAnswer = (event.data?.metadata as { answer?: unknown } | undefined)?.answer;\n const output = typeof event.data?.output === 'string' ? event.data.output : '';\n const answer = typeof metadataAnswer === 'string' ? metadataAnswer : '';\n const captured = answer.trim() || output.trim();\n if (captured) {\n reported = captured;\n }\n }\n input.baseConfig.onEvent?.(event);\n },\n },\n input.toolRegistry,\n );\n\n const result = await repairRunner.execute(repairPrompt);\n input.sharedBudget.consume(result.tokensUsed);\n const merged = (reported || result.summary || '').trim();\n return merged.length > 0 ? merged : null;\n }\n\n private resolveSpecBudgetPolicy(planConfig: AgentConfig, plan: TaskPlan): {\n maxTokens: number;\n synthesisReserveRatio: number;\n partialOnFailure: boolean;\n } {\n const defaults = DEFAULT_AGENT_TOKEN_BUDGET_CONFIG.spec ?? {};\n const defaultMultiplier = defaults.multiplier ?? 4.0;\n const defaultFloorTokens = defaults.floorTokens ?? 100_000;\n const defaultCeilingTokens = defaults.ceilingTokens ?? 250_000;\n const defaultSynthesisReserveRatio = defaults.synthesisReserveRatio ?? 0.2;\n const defaultPartialOnFailure = defaults.partialOnFailure ?? true;\n const defaultEnabled = defaults.enabled ?? true;\n const policy = planConfig.tokenBudget?.spec;\n const enabled = policy?.enabled ?? defaultEnabled;\n const estimatedPlanTokens = this.estimatePlanTokens(plan);\n\n if (!enabled) {\n return {\n maxTokens: Math.max(20_000, estimatedPlanTokens * 2),\n synthesisReserveRatio: defaultSynthesisReserveRatio,\n partialOnFailure: defaultPartialOnFailure,\n };\n }\n\n const multiplier = this.clampNumber(policy?.multiplier, defaultMultiplier, 1.5, 8);\n const floorTokens = this.clampInt(policy?.floorTokens, defaultFloorTokens, 20_000, 1_000_000);\n const ceilingTokens = this.clampInt(policy?.ceilingTokens, defaultCeilingTokens, floorTokens, 2_000_000);\n const synthesisReserveRatio = this.clampNumber(\n policy?.synthesisReserveRatio,\n defaultSynthesisReserveRatio,\n 0.1,\n 0.5,\n );\n const computedBudget = Math.round(estimatedPlanTokens * multiplier);\n const maxTokens = Math.max(floorTokens, Math.min(ceilingTokens, computedBudget));\n\n return {\n maxTokens,\n synthesisReserveRatio,\n partialOnFailure: policy?.partialOnFailure ?? defaultPartialOnFailure,\n };\n }\n\n private resolveSpecIterations(plan: TaskPlan, maxTokens: number): number {\n const phaseDriven = Math.max(20, plan.phases.length * 10);\n const tokenDriven = Math.ceil(maxTokens / 3000);\n return Math.max(20, Math.min(180, Math.max(phaseDriven, tokenDriven)));\n }\n\n private estimatePlanTokens(plan: TaskPlan): number {\n const markdown = (plan.markdown || '').trim();\n if (markdown.length > 0) {\n return Math.max(1_000, Math.ceil(markdown.length / 4));\n }\n\n const stepCount = plan.phases.reduce((sum, phase) => sum + phase.steps.length, 0);\n const roughChars = (plan.task.length * 8) + (plan.phases.length * 1200) + (stepCount * 900);\n return Math.max(1_000, Math.ceil(roughChars / 4));\n }\n\n private clampNumber(value: number | undefined, fallback: number, min: number, max: number): number {\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n return fallback;\n }\n return Math.max(min, Math.min(max, value));\n }\n\n private clampInt(value: number | undefined, fallback: number, min: number, max: number): number {\n const next = this.clampNumber(value, fallback, min, max);\n return Math.floor(next);\n }\n\n private buildFallbackPartialSpec(plan: TaskPlan, filesRead: string[], tokenBudget: number): string {\n const uniqueFiles = Array.from(new Set(filesRead.filter(Boolean))).slice(0, 40);\n const fileLines = uniqueFiles.length > 0\n ? uniqueFiles.map((file) => `- \\`${file}\\``).join('\\n')\n : '- (no explicit file reads captured)';\n const phaseLines = plan.phases.map((phase, idx) => `- ${idx + 1}. ${phase.name} (\\`${phase.id}\\`)`).join('\\n');\n\n return [\n `# Spec (Partial): ${plan.task}`,\n '',\n '## Table of Contents',\n '- [Task](#task)',\n '- [Coverage](#coverage)',\n '- [Observed Files](#observed-files)',\n '- [Next Pass](#next-pass)',\n '',\n '## Task',\n `Plan ID: \\`${plan.id}\\``,\n `Budget exhausted before complete synthesis (~${tokenBudget} tokens target).`,\n '',\n '## Coverage',\n 'Phases from plan:',\n phaseLines,\n '',\n 'Current status: partial draft. Continue spec generation to fill exact before/after blocks per phase.',\n '',\n '## Observed Files',\n fileLines,\n '',\n '## Next Pass',\n '- Resume from first uncovered phase and produce concrete before/after code blocks.',\n '- Prioritize high-impact phases first.',\n '- Keep changes minimal and file-scoped.',\n ].join('\\n');\n }\n\n private planToMarkdownFallback(plan: TaskPlan): string {\n const lines: string[] = [`# ${plan.task}`, ''];\n for (const phase of plan.phases) {\n lines.push(`## ${phase.name}`);\n lines.push(phase.description);\n for (const step of phase.steps) {\n lines.push(`- ${step.action}`);\n }\n lines.push('');\n }\n return lines.join('\\n');\n }\n\n // -------------------------------------------------------------------------\n // Parse spec markdown into SpecSection[]\n // -------------------------------------------------------------------------\n\n parseSpecSections(markdown: string, plan: TaskPlan): SpecSection[] {\n const text = (markdown || '').trim();\n if (!text) {return [];}\n\n const sections: SpecSection[] = [];\n // Match ### [phase-id:step-id] or ### [phase-id] headers\n const headerRe = /^###\\s+\\[([^\\]]+)\\]\\s*(.*)/gm;\n const matches: Array<{ index: number; phaseId: string; stepId?: string; title: string }> = [];\n\n let match: RegExpExecArray | null;\n while ((match = headerRe.exec(text)) !== null) {\n const ref = match[1] ?? '';\n const title = match[2]?.trim() || '';\n const parts = ref.split(':');\n matches.push({\n index: match.index,\n phaseId: parts[0] ?? ref,\n stepId: parts[1],\n title,\n });\n }\n\n if (matches.length === 0) {return [];}\n\n // Group changes by planPhaseId\n const phaseMap = new Map<string, SpecSection>();\n\n for (let i = 0; i < matches.length; i++) {\n const m = matches[i]!;\n const nextIdx = matches[i + 1]?.index ?? text.length;\n const block = text.slice(m.index, nextIdx);\n\n const change = this.parseChangeBlock(block);\n if (!change) {continue;}\n\n let section = phaseMap.get(m.phaseId);\n if (!section) {\n const planPhase = plan.phases.find((p) => p.id === m.phaseId);\n section = {\n planPhaseId: m.phaseId,\n title: planPhase?.name || m.title || m.phaseId,\n description: planPhase?.description || '',\n changes: [],\n };\n phaseMap.set(m.phaseId, section);\n }\n\n section.changes.push(change);\n }\n\n sections.push(...phaseMap.values());\n return sections;\n }\n\n private parseChangeBlock(block: string): SpecChange | null {\n // Extract file path\n const fileMatch = /\\*\\*File:\\*\\*\\s*`([^`]+)`/.exec(block);\n if (!fileMatch?.[1]) {return null;}\n const file = fileMatch[1];\n\n // Extract line range\n const lineMatch = /\\*\\*Lines?:\\*\\*\\s*(\\d[\\d\\s,\\-–]+)/.exec(block);\n const lineRange = lineMatch?.[1]?.trim() || '';\n\n // Extract before/after code blocks\n const codeBlocks = [...block.matchAll(/```[\\w]*\\n([\\s\\S]*?)```/g)];\n const beforeContent = codeBlocks[0]?.[1]?.trimEnd() || '';\n const afterContent = codeBlocks[1]?.[1]?.trimEnd() || '';\n\n // Extract explanation\n const whyMatch = /\\*\\*Why:\\*\\*\\s*(.+)/i.exec(block);\n const explanation = whyMatch?.[1]?.trim() || '';\n\n return {\n file,\n lineRange,\n before: beforeContent,\n after: afterContent,\n explanation,\n };\n }\n\n // -------------------------------------------------------------------------\n // SDK runner factory\n // -------------------------------------------------------------------------\n\n private createSubRunner(config: AgentConfig, toolRegistry: ToolRegistry): IAgentRunner {\n return new AgentSDK()\n .register(createCoreToolPack(toolRegistry))\n .createRunner(config);\n }\n\n // -------------------------------------------------------------------------\n // Event emitter helper\n // -------------------------------------------------------------------------\n\n private emit(config: AgentConfig, event: AgentEvent): void {\n if (!config.onEvent) {return;}\n config.onEvent({\n ...event,\n agentId: config.agentId,\n parentAgentId: config.parentAgentId,\n });\n }\n\n private buildBudgetSnapshot(sharedBudget: SharedTokenBudget, totalBudget: number): {\n budgetUsedTokens: number;\n budgetRemainingTokens: number;\n budgetTotalTokens: number;\n } {\n return {\n budgetUsedTokens: sharedBudget.used,\n budgetRemainingTokens: sharedBudget.remaining,\n budgetTotalTokens: totalBudget,\n };\n }\n}\n","/**\n * ModeRegistry — dynamic mode registration without modifying core.\n *\n * Replaces the switch/case in getModeHandler() with a registry that can\n * be extended with custom modes at runtime.\n *\n * Built-in modes are registered lazily (dynamic import) to preserve\n * tree-shaking and the existing performance characteristics.\n *\n * Usage (custom mode):\n * modeRegistry.register('review', () => new ReviewModeHandler());\n * // Now agent config { mode: 'review' } uses ReviewModeHandler\n *\n * Usage (override built-in):\n * modeRegistry.register('plan', () => new CustomPlanHandler(), { override: true });\n */\n\nimport type { ModeHandler } from './mode-handler.js';\n\n// ═══════════════════════════════════════════════════════════════════════\n// Types\n// ═══════════════════════════════════════════════════════════════════════\n\n/** Factory function that creates a ModeHandler instance */\nexport type ModeHandlerFactory = () => ModeHandler | Promise<ModeHandler>;\n\nexport interface ModeRegistration {\n readonly mode: string;\n readonly factory: ModeHandlerFactory;\n readonly builtIn: boolean;\n}\n\nexport interface RegisterOptions {\n /** Allow overriding an already-registered mode (including built-ins) */\n override?: boolean;\n}\n\n// ═══════════════════════════════════════════════════════════════════════\n// ModeRegistry\n// ═══════════════════════════════════════════════════════════════════════\n\nexport class ModeRegistry {\n private readonly registrations = new Map<string, ModeRegistration>();\n\n constructor() {\n this.registerBuiltIns();\n }\n\n // ── Registration ────────────────────────────────────────────────────\n\n /**\n * Register a mode handler factory.\n *\n * @throws If mode is already registered and override is not set.\n */\n register(mode: string, factory: ModeHandlerFactory, options: RegisterOptions = {}): void {\n if (!mode || mode.trim() === '') {\n throw new Error('ModeRegistry: mode name must be a non-empty string');\n }\n\n if (this.registrations.has(mode) && !options.override) {\n throw new Error(\n `ModeRegistry: mode \"${mode}\" is already registered. ` +\n `Use { override: true } to replace it.`,\n );\n }\n\n this.registrations.set(mode, {\n mode,\n factory,\n builtIn: false,\n });\n }\n\n /**\n * Check whether a mode is registered.\n */\n has(mode: string): boolean {\n return this.registrations.has(mode);\n }\n\n /**\n * List all registered mode names.\n */\n list(): string[] {\n return Array.from(this.registrations.keys());\n }\n\n /**\n * Get a ModeHandler for the given mode.\n * Falls back to 'execute' if mode is not found.\n *\n * @throws If neither the requested mode nor 'execute' fallback is registered.\n */\n async get(mode: string): Promise<ModeHandler> {\n const registration = this.registrations.get(mode);\n\n if (registration) {\n return registration.factory();\n }\n\n // Fallback to execute\n const fallback = this.registrations.get('execute');\n if (fallback) {\n return fallback.factory();\n }\n\n throw new Error(`ModeRegistry: mode \"${mode}\" is not registered and no 'execute' fallback exists`);\n }\n\n // ── Built-in Modes ──────────────────────────────────────────────────\n\n private registerBuiltIns(): void {\n const builtIns: Array<[string, ModeHandlerFactory]> = [\n ['execute', async () => {\n const { ExecuteModeHandler } = await import('./execute-mode-handler.js');\n return new ExecuteModeHandler();\n }],\n ['plan', async () => {\n const { PlanModeHandler } = await import('./plan-mode-handler.js');\n return new PlanModeHandler();\n }],\n ['edit', async () => {\n const { EditModeHandler } = await import('./edit-mode-handler.js');\n return new EditModeHandler();\n }],\n ['debug', async () => {\n const { DebugModeHandler } = await import('./debug-mode-handler.js');\n return new DebugModeHandler();\n }],\n ];\n\n // Spec mode is optional — only register if present\n builtIns.push(['spec', async () => {\n const { SpecModeHandler } = await import('./spec-mode-handler.js');\n return new SpecModeHandler() as unknown as ModeHandler;\n }]);\n\n for (const [mode, factory] of builtIns) {\n this.registrations.set(mode, { mode, factory, builtIn: true });\n }\n }\n}\n\n// ── Global registry singleton ────────────────────────────────────────\n\n/**\n * Global ModeRegistry instance.\n *\n * Use this to register custom modes application-wide:\n * import { modeRegistry } from '@kb-labs/agent-core';\n * modeRegistry.register('my-mode', () => new MyModeHandler());\n */\nexport const modeRegistry = new ModeRegistry();\n\n/**\n * Convenience function that replaces the old getModeHandler() switch/case.\n * Delegates to the global modeRegistry.\n */\nexport async function getModeHandlerFromRegistry(mode: string): Promise<ModeHandler> {\n return modeRegistry.get(mode);\n}\n","/**\n * Mode handler interface and base implementation\n */\n\nimport type { TaskResult, ModeConfig, AgentConfig } from '@kb-labs/agent-contracts';\nimport type { ToolRegistry } from '@kb-labs/agent-tools';\n\n/**\n * Mode handler interface - each mode implements this\n */\nexport interface ModeHandler {\n /**\n * Execute task in this mode\n */\n execute(task: string, config: AgentConfig, toolRegistry: ToolRegistry): Promise<TaskResult>;\n}\n\n/**\n * Get mode handler for specified mode.\n * Delegates to ModeRegistry — supports built-in and custom modes.\n */\nexport async function getModeHandler(modeConfig?: ModeConfig): Promise<ModeHandler> {\n const mode = modeConfig?.mode || 'execute';\n const { modeRegistry } = await import('./mode-registry.js');\n return modeRegistry.get(mode);\n}\n","/**\n * Planning system exports\n */\n\nexport { SessionManager } from './session-manager.js';\nexport { PlanGenerator } from './plan-generator.js';\nexport { PlanExecutor } from './plan-executor.js';\nexport { PlanDocumentService } from './plan-document-service.js';\nexport { PlanValidator } from './plan-validator.js';\nexport type { PlanValidationResult, RubricScore, ValidatorIssue } from './plan-validator.js';\nexport { SpecValidator } from './spec-validator.js';\nexport type { SpecValidationResult, SpecRubricScore, SpecValidatorIssue } from './spec-validator.js';\n","/**\n * Plan generator - creates execution plans using LLM with native tool calling\n */\n\nimport { useLLM, type LLMTool, type LLMToolCallResponse } from '@kb-labs/sdk';\nimport type { TaskPlan, Phase, AgentMode, AgentEvent, AgentEventCallback, Tracer, LLMTier } from '@kb-labs/agent-contracts';\nimport type { ToolRegistry } from '@kb-labs/agent-tools';\nimport { createLLMCallEvent } from '@kb-labs/agent-tracing';\nimport { PlanValidator } from './plan-validator.js';\n\ninterface GeneratedPlanData {\n complexity?: 'simple' | 'medium' | 'complex';\n estimatedDuration?: string;\n markdown?: string;\n phases?: unknown[];\n refactorDecisions?: unknown[];\n changeSets?: unknown[];\n objective?: {\n currentState?: string;\n targetState?: string;\n constraints?: string[];\n };\n evidence?: unknown[];\n decisions?: unknown[];\n alternatives?: unknown[];\n verification?: unknown[];\n rollback?: {\n trigger?: string;\n steps?: string[];\n };\n}\n\ninterface PlanningProfile {\n domain: 'code' | 'browser' | 'mcp' | 'general';\n availableTools: string[];\n preferredTools: string[];\n capabilities: string[];\n}\n\ninterface PlanQualityAssessment {\n score: number;\n issues: string[];\n severeIssues: string[];\n metrics: {\n phaseCount: number;\n stepCount: number;\n changeStepCount: number;\n readOnlyStepCount: number;\n changeRatio: number;\n hasPlaceholders: boolean;\n analysisPhaseCount: number;\n solutionStepRatio: number;\n };\n}\n\ninterface DelegatedResearchOutput {\n summary: string;\n findings: string[];\n}\n\n/**\n * Generates execution plans from task descriptions\n */\nexport class PlanGenerator {\n /**\n * Generate a task execution plan using native tool calling\n */\n async generate(config: {\n task: string;\n sessionId: string;\n mode: AgentMode;\n complexity?: 'simple' | 'medium' | 'complex';\n toolRegistry?: ToolRegistry;\n researchContext?: string; // Context from research phase (if available)\n onEvent?: AgentEventCallback;\n agentId?: string;\n parentAgentId?: string;\n tracer?: Tracer;\n tier?: LLMTier;\n }): Promise<TaskPlan> {\n const planningTier: LLMTier = config.tier || 'large';\n const llm = useLLM({ tier: planningTier });\n if (!llm) {\n throw new Error('LLM not available for plan generation');\n }\n\n if (!llm.chatWithTools) {\n throw new Error('LLM does not support native tool calling');\n }\n\n const planningProfile = this.buildPlanningProfile(config.task, config.toolRegistry);\n\n // Create planning tools\n const researchTool = this.createResearchTool();\n const planToolName = this.getPlanToolName(config.task);\n const planTool = planToolName === 'plan_generate_refactor'\n ? this.createRefactorPlanTool(planningProfile)\n : this.createPlanTool(planningProfile);\n\n // Build tools array - research/planning tools + optional read-only discovery tools\n const tools: LLMTool[] = [researchTool, planTool];\n\n // Add research tools if registry provided\n if (config.toolRegistry) {\n const researchTools = this.getResearchTools(config.toolRegistry);\n tools.push(...researchTools);\n }\n\n this.emitStatus(config, 'planning', 'Preparing plan generation pipeline');\n this.emitProgress(config, 'plan-generation', 10, 'Initialized planning tools');\n\n const researchContext = config.researchContext\n || await this.collectResearchContext(llm, tools, {\n ...config,\n tier: planningTier,\n });\n\n this.emitProgress(config, 'plan-generation', 45, 'Research phase completed');\n\n const systemPrompt = this.buildSystemPrompt(\n config.task,\n config.mode,\n config.complexity,\n researchContext,\n planToolName,\n planningProfile,\n );\n const generationMessages = [\n { role: 'system' as const, content: systemPrompt },\n { role: 'user' as const, content: `Create an executable plan for: ${config.task}` },\n ];\n const generationOptions = {\n tools,\n temperature: 0.1,\n toolChoice: { type: 'function' as const, function: { name: planToolName } },\n };\n\n // Use native tool calling for explicit plan tool submission\n const llmStart = Date.now();\n this.emitEvent(config, {\n type: 'llm:start',\n timestamp: new Date().toISOString(),\n sessionId: config.sessionId,\n data: {\n tier: planningTier,\n messageCount: generationMessages.length,\n },\n });\n this.emitStatus(config, 'planning', 'Generating executable plan from research');\n\n const planToolCallId = this.newToolCallId(planToolName);\n this.emitEvent(config, {\n type: 'tool:start',\n timestamp: new Date().toISOString(),\n sessionId: config.sessionId,\n toolCallId: planToolCallId,\n data: {\n toolName: planToolName,\n input: {\n task: config.task,\n mode: config.mode,\n complexity: config.complexity,\n },\n },\n });\n\n let response: LLMToolCallResponse;\n try {\n response = await llm.chatWithTools!(\n generationMessages,\n generationOptions,\n );\n } catch (error) {\n this.emitEvent(config, {\n type: 'tool:error',\n timestamp: new Date().toISOString(),\n sessionId: config.sessionId,\n toolCallId: planToolCallId,\n data: {\n toolName: planToolName,\n error: error instanceof Error ? error.message : String(error),\n },\n });\n throw error;\n }\n\n const planDuration = Date.now() - llmStart;\n this.emitEvent(config, {\n type: 'llm:end',\n timestamp: new Date().toISOString(),\n sessionId: config.sessionId,\n startedAt: new Date(llmStart).toISOString(),\n data: {\n tokensUsed: this.getTokensUsed(response),\n durationMs: planDuration,\n hasToolCalls: Boolean(response.toolCalls && response.toolCalls.length > 0),\n },\n });\n this.traceLLMCall(config, {\n iteration: 1,\n tools,\n temperature: generationOptions.temperature,\n response,\n startedAtMs: llmStart,\n endedAtMs: llmStart + planDuration,\n });\n\n // Extract plan from tool call\n let planData: any;\n if (response.toolCalls && response.toolCalls.length > 0) {\n const planCall = response.toolCalls.find((tc: { name: string; input: unknown }) => tc.name === planToolName);\n if (planCall) {\n planData = planCall.input;\n }\n }\n\n if (!planData) {\n this.emitEvent(config, {\n type: 'tool:error',\n timestamp: new Date().toISOString(),\n sessionId: config.sessionId,\n toolCallId: planToolCallId,\n data: {\n toolName: planToolName,\n error: `LLM response did not contain ${planToolName} tool input`,\n },\n });\n throw new Error('LLM did not generate a plan using the tool');\n }\n\n const markdownFirst = typeof (planData as GeneratedPlanData).markdown === 'string'\n && (planData as GeneratedPlanData).markdown!.trim().length > 0;\n let qualitySummary: { score: number; issues: string[]; severeIssues: string[] } | null = null;\n let regenerated = false;\n if (markdownFirst) {\n const initialAssessment = this.assessFreeformMarkdown((planData as GeneratedPlanData).markdown || '');\n qualitySummary = initialAssessment;\n if (initialAssessment.severeIssues.length > 0) {\n const originalPlanData = planData as GeneratedPlanData;\n this.emitStatus(config, 'planning', 'Free-form markdown failed minimal quality checks, attempting one repair');\n this.emitProgress(config, 'plan-generation', 70, 'Repairing markdown draft with missing/invalid sections');\n const retryData = await this.regeneratePlanWithQualityFeedback({\n llm,\n tools,\n task: config.task,\n mode: config.mode,\n complexity: config.complexity,\n researchContext,\n issues: initialAssessment.issues,\n sessionId: config.sessionId,\n onEvent: config.onEvent,\n agentId: config.agentId,\n parentAgentId: config.parentAgentId,\n tier: planningTier,\n planToolName,\n planningProfile,\n });\n if (retryData) {\n const retryAssessment = this.assessFreeformMarkdown(retryData.markdown || '');\n const severeImproved = retryAssessment.severeIssues.length < initialAssessment.severeIssues.length;\n const scoreNotWorse = retryAssessment.score >= (initialAssessment.score - 0.05);\n if (retryAssessment.severeIssues.length === 0 || (severeImproved && scoreNotWorse)) {\n planData = retryData;\n qualitySummary = retryAssessment;\n regenerated = true;\n } else {\n planData = originalPlanData;\n qualitySummary = initialAssessment;\n this.emitStatus(config, 'planning', 'Markdown repair did not improve enough, keeping original draft');\n }\n }\n } else if (initialAssessment.issues.length > 0) {\n this.emitStatus(config, 'planning', 'Plan generated in one shot with minor markdown quality warnings');\n }\n } else {\n const quality = this.assessPlanQuality(config.task, planData as GeneratedPlanData);\n qualitySummary = quality;\n const shouldRetry = this.shouldRetryPlan(config.task, quality);\n if (shouldRetry) {\n const originalPlanData = planData as GeneratedPlanData;\n this.emitStatus(config, 'planning', 'Plan quality gate failed, regenerating with stricter refactoring constraints');\n this.emitProgress(config, 'plan-generation', 70, 'Regenerating plan with concrete refactoring requirements');\n const retryData = await this.regeneratePlanWithQualityFeedback({\n llm,\n tools,\n task: config.task,\n mode: config.mode,\n complexity: config.complexity,\n researchContext,\n issues: quality.issues,\n sessionId: config.sessionId,\n onEvent: config.onEvent,\n agentId: config.agentId,\n parentAgentId: config.parentAgentId,\n tier: planningTier,\n planToolName,\n planningProfile,\n });\n if (retryData) {\n const retryQuality = this.assessPlanQuality(config.task, retryData);\n if (retryQuality.score >= quality.score && retryQuality.severeIssues.length === 0) {\n planData = retryData;\n qualitySummary = retryQuality;\n regenerated = true;\n } else {\n planData = originalPlanData;\n qualitySummary = quality;\n this.emitStatus(config, 'planning', 'Retry plan quality did not improve enough, keeping original draft');\n }\n }\n } else if (quality.issues.length > 0) {\n this.emitStatus(config, 'planning', 'Plan generated in one shot with minor quality warnings');\n }\n }\n\n this.emitEvent(config, {\n type: 'tool:end',\n timestamp: new Date().toISOString(),\n sessionId: config.sessionId,\n toolCallId: planToolCallId,\n startedAt: new Date(llmStart).toISOString(),\n data: {\n toolName: planToolName,\n success: true,\n durationMs: planDuration,\n output: 'Plan generated successfully',\n metadata: {\n structured: {\n phaseCount: Array.isArray(planData.phases) ? planData.phases.length : 0,\n complexity: planData.complexity,\n regenerated,\n qualityValidationSkipped: false,\n qualityScore: qualitySummary?.score ?? null,\n qualityIssues: qualitySummary?.issues.length ?? null,\n severeQualityIssues: qualitySummary?.severeIssues.length ?? null,\n decisionCount: Array.isArray((planData as GeneratedPlanData).decisions)\n ? ((planData as GeneratedPlanData).decisions as unknown[]).length\n : Array.isArray((planData as GeneratedPlanData).refactorDecisions)\n ? ((planData as GeneratedPlanData).refactorDecisions as unknown[]).length\n : 0,\n changeSetCount: Array.isArray((planData as GeneratedPlanData).changeSets)\n ? ((planData as GeneratedPlanData).changeSets as unknown[]).length\n : 0,\n verificationCount: Array.isArray((planData as GeneratedPlanData).verification)\n ? ((planData as GeneratedPlanData).verification as unknown[]).length\n : 0,\n markdownLength: typeof (planData as GeneratedPlanData).markdown === 'string'\n ? (planData as GeneratedPlanData).markdown!.length\n : 0,\n },\n },\n },\n });\n\n const plan = this.buildTaskPlan({\n sessionId: config.sessionId,\n task: config.task,\n mode: config.mode,\n complexityHint: config.complexity,\n planData,\n });\n\n this.emitProgress(config, 'plan-generation', 100, 'Plan generation completed');\n this.emitStatus(config, 'done', 'Plan draft created');\n return plan;\n }\n\n /**\n * Update an existing plan based on user feedback.\n * Uses a dedicated plan_update tool instead of free-form JSON.\n */\n async update(config: {\n plan: TaskPlan;\n feedback: string;\n mode?: AgentMode;\n toolRegistry?: ToolRegistry;\n enableResearch?: boolean;\n onEvent?: AgentEventCallback;\n agentId?: string;\n parentAgentId?: string;\n tracer?: Tracer;\n tier?: LLMTier;\n }): Promise<TaskPlan> {\n const planningTier: LLMTier = config.tier || 'large';\n const llm = useLLM({ tier: planningTier });\n if (!llm) {\n throw new Error('LLM not available for plan update');\n }\n\n if (!llm.chatWithTools) {\n throw new Error('LLM does not support native tool calling');\n }\n\n const updateTool = this.createPlanUpdateTool();\n const researchTool = this.createResearchTool();\n const targetMode = config.mode || config.plan.mode;\n const updateTask = `${config.plan.task}\\n\\nRevision goal:\\n${config.feedback}`;\n const toolCallingTools: LLMTool[] = [researchTool, updateTool];\n if (config.toolRegistry) {\n toolCallingTools.push(...this.getResearchTools(config.toolRegistry));\n }\n\n let researchContext = '';\n if (config.enableResearch !== false && config.toolRegistry) {\n this.emitStatus(config, 'researching', 'Collecting additional context for plan revision');\n this.emitProgress(config, 'plan-revision', 10, 'Running pre-revision research');\n researchContext = await this.collectResearchContext(llm, toolCallingTools, {\n task: updateTask,\n sessionId: config.plan.sessionId,\n mode: targetMode,\n complexity: config.plan.complexity,\n toolRegistry: config.toolRegistry,\n onEvent: config.onEvent,\n agentId: config.agentId,\n parentAgentId: config.parentAgentId,\n tier: planningTier,\n });\n }\n\n const updateMessages = [\n {\n role: 'system' as const,\n content: this.buildUpdateSystemPrompt(config.plan, config.feedback, targetMode, researchContext),\n },\n {\n role: 'user' as const,\n content: `Revise the plan using feedback: ${config.feedback}`,\n },\n ];\n const updateOptions = {\n tools: toolCallingTools,\n temperature: 0.1,\n toolChoice: { type: 'function' as const, function: { name: 'plan_update' } },\n };\n\n this.emitStatus(config, 'planning', 'Revising plan draft from user feedback');\n this.emitProgress(config, 'plan-revision', 20, 'Submitting plan revision request');\n\n const llmStart = Date.now();\n this.emitEvent(config, {\n type: 'llm:start',\n timestamp: new Date().toISOString(),\n sessionId: config.plan.sessionId,\n data: {\n tier: planningTier,\n messageCount: updateMessages.length,\n },\n });\n const updateToolCallId = this.newToolCallId('plan_update');\n this.emitEvent(config, {\n type: 'tool:start',\n timestamp: new Date().toISOString(),\n sessionId: config.plan.sessionId,\n toolCallId: updateToolCallId,\n data: {\n toolName: 'plan_update',\n input: {\n planId: config.plan.id,\n feedback: config.feedback,\n },\n },\n });\n\n let response: LLMToolCallResponse;\n try {\n response = await llm.chatWithTools!(\n updateMessages,\n updateOptions,\n );\n } catch (error) {\n this.emitEvent(config, {\n type: 'tool:error',\n timestamp: new Date().toISOString(),\n sessionId: config.plan.sessionId,\n toolCallId: updateToolCallId,\n data: {\n toolName: 'plan_update',\n error: error instanceof Error ? error.message : String(error),\n },\n });\n throw error;\n }\n\n const updateDuration = Date.now() - llmStart;\n this.emitEvent(config, {\n type: 'llm:end',\n timestamp: new Date().toISOString(),\n sessionId: config.plan.sessionId,\n startedAt: new Date(llmStart).toISOString(),\n data: {\n tokensUsed: this.getTokensUsed(response),\n durationMs: updateDuration,\n hasToolCalls: Boolean(response.toolCalls && response.toolCalls.length > 0),\n },\n });\n this.traceLLMCall(config, {\n iteration: 1,\n tools: toolCallingTools,\n temperature: updateOptions.temperature,\n response,\n startedAtMs: llmStart,\n endedAtMs: llmStart + updateDuration,\n });\n\n const updateCall = response.toolCalls?.find((tc: { name: string; input: unknown }) => tc.name === 'plan_update');\n const planData = updateCall?.input as {\n complexity?: 'simple' | 'medium' | 'complex';\n estimatedDuration?: string;\n markdown?: string;\n phases?: unknown[];\n revisionSummary?: string;\n } | undefined;\n\n if (!planData) {\n this.emitEvent(config, {\n type: 'tool:error',\n timestamp: new Date().toISOString(),\n sessionId: config.plan.sessionId,\n toolCallId: updateToolCallId,\n data: {\n toolName: 'plan_update',\n error: 'LLM response did not contain plan_update tool input',\n },\n });\n throw new Error('LLM did not update the plan using plan_update tool');\n }\n\n const updated = this.buildTaskPlan({\n sessionId: config.plan.sessionId,\n task: config.plan.task,\n mode: targetMode,\n complexityHint: config.plan.complexity,\n planData,\n existingPlan: config.plan,\n });\n\n this.emitEvent(config, {\n type: 'tool:end',\n timestamp: new Date().toISOString(),\n sessionId: config.plan.sessionId,\n toolCallId: updateToolCallId,\n startedAt: new Date(llmStart).toISOString(),\n data: {\n toolName: 'plan_update',\n success: true,\n durationMs: updateDuration,\n output: 'Plan updated successfully',\n metadata: {\n structured: {\n phaseCount: Array.isArray(planData.phases) ? planData.phases.length : 0,\n complexity: planData.complexity,\n markdownLength: typeof planData.markdown === 'string' ? planData.markdown.length : 0,\n },\n },\n },\n });\n this.emitProgress(config, 'plan-revision', 100, 'Plan revision completed');\n this.emitStatus(config, 'done', 'Plan revision draft ready');\n\n return {\n ...updated,\n createdAt: config.plan.createdAt,\n status: 'draft',\n };\n }\n\n private buildTaskPlan(input: {\n sessionId: string;\n task: string;\n mode: AgentMode;\n complexityHint?: 'simple' | 'medium' | 'complex';\n planData: {\n complexity?: 'simple' | 'medium' | 'complex';\n estimatedDuration?: string;\n markdown?: string;\n phases?: unknown[];\n refactorDecisions?: unknown[];\n changeSets?: unknown[];\n };\n existingPlan?: TaskPlan;\n }): TaskPlan {\n const now = new Date().toISOString();\n const planId = input.existingPlan?.id || `plan-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n const normalizedPhases = this.normalizePhasesFromTool(input.planData.phases || []);\n const markdownPhases = this.parsePhasesFromMarkdown(input.planData.markdown || '');\n const synthesizedPhases = this.synthesizeRefactorPhasesFromChangeSets(input.planData.changeSets);\n const phasesFromSources = normalizedPhases.length > 0\n ? normalizedPhases\n : markdownPhases.length > 0\n ? markdownPhases\n : synthesizedPhases;\n const phases = phasesFromSources.length > 0\n ? phasesFromSources\n : this.createFallbackPhases(input.task);\n const markdown = this.normalizePlanMarkdown(input.task, input.planData.markdown, phases);\n\n const plan: TaskPlan = {\n id: planId,\n sessionId: input.sessionId,\n task: input.task,\n mode: input.mode,\n phases,\n estimatedDuration: input.planData.estimatedDuration || 'Unknown',\n complexity: input.complexityHint || input.planData.complexity || 'medium',\n createdAt: input.existingPlan?.createdAt || now,\n updatedAt: now,\n status: input.existingPlan?.status || 'draft',\n markdown,\n };\n\n return plan;\n }\n\n private async runResearchPhase(\n llm: NonNullable<ReturnType<typeof useLLM>>,\n tools: LLMTool[],\n task: string,\n mode: AgentMode,\n complexity?: 'simple' | 'medium' | 'complex',\n eventConfig?: {\n sessionId: string;\n onEvent?: AgentEventCallback;\n agentId?: string;\n parentAgentId?: string;\n tracer?: Tracer;\n tier?: LLMTier;\n }\n ): Promise<string> {\n const started = Date.now();\n const researchMessages = [\n {\n role: 'system' as const,\n content: this.buildResearchSystemPrompt(task, mode, complexity),\n },\n {\n role: 'user' as const,\n content: `Research this task and submit findings via plan_research tool: ${task}`,\n },\n ];\n const researchOptions = {\n tools,\n temperature: 0.1,\n toolChoice: { type: 'function' as const, function: { name: 'plan_research' } },\n };\n this.emitStatus(eventConfig, 'researching', 'Researching codebase for plan context');\n this.emitEvent(eventConfig, {\n type: 'llm:start',\n timestamp: new Date().toISOString(),\n sessionId: eventConfig?.sessionId,\n data: {\n tier: eventConfig?.tier || 'large',\n messageCount: researchMessages.length,\n },\n });\n const researchToolCallId = this.newToolCallId('plan_research');\n this.emitEvent(eventConfig, {\n type: 'tool:start',\n timestamp: new Date().toISOString(),\n sessionId: eventConfig?.sessionId,\n toolCallId: researchToolCallId,\n data: {\n toolName: 'plan_research',\n input: {\n task,\n mode,\n complexity,\n },\n },\n });\n\n let response: LLMToolCallResponse;\n try {\n response = await llm.chatWithTools!(\n researchMessages,\n researchOptions,\n );\n } catch (error) {\n this.emitEvent(eventConfig, {\n type: 'tool:error',\n timestamp: new Date().toISOString(),\n sessionId: eventConfig?.sessionId,\n toolCallId: researchToolCallId,\n data: {\n toolName: 'plan_research',\n error: error instanceof Error ? error.message : String(error),\n },\n });\n throw error;\n }\n\n const researchCall = response.toolCalls?.find((tc: { name: string; input: unknown }) => tc.name === 'plan_research');\n const input = researchCall?.input as { summary?: string; findings?: string[] } | undefined;\n const findings = Array.isArray(input?.findings) ? input!.findings.filter((v): v is string => typeof v === 'string') : [];\n const summary = typeof input?.summary === 'string' ? input.summary.trim() : '';\n\n const durationMs = Date.now() - started;\n this.emitEvent(eventConfig, {\n type: 'llm:end',\n timestamp: new Date().toISOString(),\n sessionId: eventConfig?.sessionId,\n startedAt: new Date(started).toISOString(),\n data: {\n tokensUsed: this.getTokensUsed(response),\n durationMs,\n hasToolCalls: Boolean(response.toolCalls && response.toolCalls.length > 0),\n },\n });\n this.traceLLMCall(eventConfig, {\n iteration: 1,\n tools,\n temperature: researchOptions.temperature,\n response,\n startedAtMs: started,\n endedAtMs: started + durationMs,\n });\n\n if (!summary && findings.length === 0) {\n this.emitEvent(eventConfig, {\n type: 'tool:error',\n timestamp: new Date().toISOString(),\n sessionId: eventConfig?.sessionId,\n toolCallId: researchToolCallId,\n data: {\n toolName: 'plan_research',\n error: 'No research summary/findings returned',\n },\n });\n return '';\n }\n\n this.emitEvent(eventConfig, {\n type: 'tool:end',\n timestamp: new Date().toISOString(),\n sessionId: eventConfig?.sessionId,\n toolCallId: researchToolCallId,\n startedAt: new Date(started).toISOString(),\n data: {\n toolName: 'plan_research',\n success: true,\n durationMs,\n output: summary || `${findings.length} findings`,\n metadata: {\n resultCount: findings.length,\n summary,\n },\n },\n });\n\n return [summary, ...findings.map((f) => `- ${f}`)].filter(Boolean).join('\\n');\n }\n\n private async collectResearchContext(\n llm: NonNullable<ReturnType<typeof useLLM>>,\n tools: LLMTool[],\n config: {\n task: string;\n sessionId: string;\n mode: AgentMode;\n complexity?: 'simple' | 'medium' | 'complex';\n toolRegistry?: ToolRegistry;\n onEvent?: AgentEventCallback;\n agentId?: string;\n parentAgentId?: string;\n tracer?: Tracer;\n tier?: LLMTier;\n }\n ): Promise<string> {\n const deterministicEvidence = await this.collectDeterministicResearchEvidence(config);\n const baselineContext = await this.runResearchPhase(llm, tools, config.task, config.mode, config.complexity, config);\n const mergedBaseline = [deterministicEvidence, baselineContext].filter(Boolean).join('\\n');\n if (config.mode !== 'plan' || !config.toolRegistry) {\n return mergedBaseline;\n }\n\n const gaps = this.selectResearchGaps(config.task, mergedBaseline).slice(0, 2);\n if (gaps.length === 0) {\n return mergedBaseline;\n }\n\n const delegated = await this.runDelegatedResearchPhase(llm, tools, {\n task: config.task,\n sessionId: config.sessionId,\n complexity: config.complexity,\n gaps,\n onEvent: config.onEvent,\n agentId: config.agentId,\n parentAgentId: config.parentAgentId,\n tier: config.tier,\n });\n\n const delegatedContext = [delegated.summary, ...delegated.findings.map((f) => `- ${f}`)]\n .filter(Boolean)\n .join('\\n');\n if (!delegatedContext) {\n return mergedBaseline;\n }\n return [mergedBaseline, '', 'Delegated gap-focused findings:', delegatedContext]\n .filter(Boolean)\n .join('\\n');\n }\n\n private async collectDeterministicResearchEvidence(config: {\n task: string;\n sessionId: string;\n mode: AgentMode;\n complexity?: 'simple' | 'medium' | 'complex';\n toolRegistry?: ToolRegistry;\n onEvent?: AgentEventCallback;\n agentId?: string;\n parentAgentId?: string;\n tracer?: Tracer;\n }): Promise<string> {\n if (!config.toolRegistry) {\n return '';\n }\n\n const evidence: string[] = [];\n const registry = config.toolRegistry;\n const toolNames = new Set(registry.getToolNames());\n const start = Date.now();\n const bootstrapToolCallId = this.newToolCallId('plan_research_bootstrap');\n this.emitStatus(config, 'researching', 'Collecting deterministic research evidence from available tools');\n this.emitEvent(config, {\n type: 'tool:start',\n timestamp: new Date().toISOString(),\n sessionId: config.sessionId,\n toolCallId: bootstrapToolCallId,\n data: {\n toolName: 'plan_research_bootstrap',\n input: {\n availableTools: Array.from(toolNames),\n },\n },\n });\n\n const pathHints = this.extractPathHints(config.task);\n\n if (toolNames.has('fs_list')) {\n try {\n const result = await registry.execute('fs_list', { path: '.', limit: 40 });\n const output = typeof (result as { output?: unknown }).output === 'string'\n ? (result as { output: string }).output\n : '';\n if (output) {\n evidence.push(`Deterministic fs_list evidence:\\n${output.split('\\n').slice(0, 20).join('\\n')}`);\n }\n } catch {\n // Best effort evidence collection; do not fail planning flow.\n }\n }\n\n if (toolNames.has('glob_search') && pathHints.length > 0) {\n for (const hint of pathHints.slice(0, 3)) {\n try {\n const pattern = hint.includes('.') ? `*${hint.split('/').pop()}` : `*${hint}*`;\n const result = await registry.execute('glob_search', { pattern, directory: '.', limit: 20 });\n const output = typeof (result as { output?: unknown }).output === 'string'\n ? (result as { output: string }).output\n : '';\n if (output) {\n evidence.push(`Deterministic glob_search evidence for \"${hint}\":\\n${output.split('\\n').slice(0, 12).join('\\n')}`);\n }\n } catch {\n // Best effort evidence collection; do not fail planning flow.\n }\n }\n }\n\n if (toolNames.has('grep_search')) {\n const keywords = this.extractKeywordHints(config.task).slice(0, 2);\n for (const keyword of keywords) {\n try {\n const result = await registry.execute('grep_search', {\n pattern: keyword,\n directory: '.',\n limit: 10,\n mode: 'literal',\n });\n const output = typeof (result as { output?: unknown }).output === 'string'\n ? (result as { output: string }).output\n : '';\n if (output && !/No matches|No files/i.test(output)) {\n evidence.push(`Deterministic grep_search evidence for \"${keyword}\":\\n${output.split('\\n').slice(0, 10).join('\\n')}`);\n }\n } catch {\n // Best effort evidence collection; do not fail planning flow.\n }\n }\n }\n\n this.emitEvent(config, {\n type: 'tool:end',\n timestamp: new Date().toISOString(),\n sessionId: config.sessionId,\n toolCallId: bootstrapToolCallId,\n startedAt: new Date(start).toISOString(),\n data: {\n toolName: 'plan_research_bootstrap',\n success: true,\n durationMs: Date.now() - start,\n output: `Collected ${evidence.length} deterministic evidence snippet(s)`,\n },\n });\n\n return evidence.join('\\n\\n');\n }\n\n private async runDelegatedResearchPhase(\n llm: NonNullable<ReturnType<typeof useLLM>>,\n tools: LLMTool[],\n config: {\n task: string;\n sessionId: string;\n complexity?: 'simple' | 'medium' | 'complex';\n gaps: Array<{ key: string; title: string; prompt: string }>;\n onEvent?: AgentEventCallback;\n agentId?: string;\n parentAgentId?: string;\n tier?: LLMTier;\n }\n ): Promise<DelegatedResearchOutput> {\n const subtasks = config.gaps;\n const findings: string[] = [];\n const summaries: string[] = [];\n\n this.emitStatus(config, 'researching', `Delegating targeted research for ${subtasks.length} gap(s)`);\n this.emitProgress(config, 'plan-research', 55, 'Starting gap-focused delegated research');\n\n for (let index = 0; index < subtasks.length; index++) {\n const subtask = subtasks[index]!;\n const subtaskId = `plan-research-${index + 1}-${Date.now().toString(36)}`;\n const startedAt = new Date().toISOString();\n this.emitEvent(config, {\n type: 'subtask:start',\n timestamp: startedAt,\n sessionId: config.sessionId,\n data: {\n subtaskId,\n description: `${subtask.title} (${subtask.key})`,\n index,\n total: subtasks.length,\n },\n });\n\n try {\n const focusedTask = `${config.task}\\n\\nFocused research gap: ${subtask.title}\\n${subtask.prompt}`;\n const context = await this.runResearchPhase(\n llm,\n tools,\n focusedTask,\n 'plan',\n config.complexity,\n config,\n );\n const output = this.normalizeChildResearchOutput(context);\n if (output.summary) {\n summaries.push(`${subtask.title}: ${output.summary}`);\n }\n findings.push(...output.findings.map((f) => `[${subtask.title}] ${f}`));\n this.emitEvent(config, {\n type: 'subtask:end',\n timestamp: new Date().toISOString(),\n sessionId: config.sessionId,\n startedAt,\n data: {\n subtaskId,\n success: true,\n summary: output.summary || 'Gap research completed',\n },\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n findings.push(`[${subtask.title}] Failed: ${message}`);\n this.emitEvent(config, {\n type: 'subtask:end',\n timestamp: new Date().toISOString(),\n sessionId: config.sessionId,\n startedAt,\n data: {\n subtaskId,\n success: false,\n summary: message,\n },\n });\n }\n\n const progress = Math.round(55 + ((index + 1) / subtasks.length) * 15);\n this.emitProgress(config, 'plan-research', progress, `Delegated subtask ${index + 1}/${subtasks.length} completed`);\n }\n\n return {\n summary: summaries.join('\\n'),\n findings,\n };\n }\n\n private selectResearchGaps(task: string, baselineContext: string): Array<{ key: string; title: string; prompt: string }> {\n const text = `${task}\\n${baselineContext}`.toLowerCase();\n const gaps: Array<{ key: string; title: string; prompt: string }> = [];\n const isRefactor = this.isRefactorTask(task);\n\n // For refactoring tasks, prefer a single focused \"solution gap\" instead of broad audits.\n if (isRefactor) {\n const hasConcreteDecisions = /(extract|split|rename|decouple|replace|interface|module boundary|target file|fs:edit|fs:write)/.test(text);\n if (!hasConcreteDecisions) {\n gaps.push({\n key: 'refactor-decisions',\n title: 'Refactor Decisions',\n prompt: [\n 'Derive concrete refactoring decisions (not analysis plan).',\n 'Return 3-6 decision bullets:',\n '- exact files/modules to change',\n '- concrete change type (extract/split/rename/decouple/replace)',\n '- expected effect on maintainability/testability',\n '- key risk and validation command',\n ].join('\\n'),\n });\n }\n return gaps;\n }\n\n const hasArchitecture = /(module|boundary|architecture|component|layer|responsib)/.test(text);\n const hasContracts = /(interface|type|contract|api|schema|input|output|flow)/.test(text);\n const hasVerification = /(test|verify|validation|build|lint|check|rollback)/.test(text);\n const hasRisks = /(risk|tradeoff|debt|constraint|coupling|regression)/.test(text);\n\n if (!hasArchitecture) {\n gaps.push({\n key: 'architecture',\n title: 'Architecture & Boundaries',\n prompt: 'Find module boundaries, responsibilities, and concrete files likely to change.',\n });\n }\n if (!hasContracts) {\n gaps.push({\n key: 'contracts',\n title: 'Data Flow & Contracts',\n prompt: 'Map input->processing->output flow, key interfaces/types/contracts, and coupling points.',\n });\n }\n if (!hasVerification || !hasRisks) {\n gaps.push({\n key: 'verification-risks',\n title: 'Verification & Risks',\n prompt: 'Identify verification commands, regression risks, and rollback constraints for refactoring.',\n });\n }\n\n return gaps;\n }\n\n private normalizeChildResearchOutput(summary: string): DelegatedResearchOutput {\n const lines = summary\n .split('\\n')\n .map((line) => line.trim())\n .filter(Boolean);\n const findings = lines\n .filter((line) => /^[-*•]/.test(line) || /^[0-9]+\\./.test(line))\n .map((line) => line.replace(/^[-*•]\\s*/, '').replace(/^[0-9]+\\.\\s*/, '').trim())\n .filter(Boolean)\n .slice(0, 24);\n const topSummary = lines\n .filter((line) => !/^[-*•]/.test(line) && !/^[0-9]+\\./.test(line))\n .slice(0, 3)\n .join(' ');\n return {\n summary: topSummary || lines.slice(0, 2).join(' '),\n findings,\n };\n }\n\n private async regeneratePlanWithQualityFeedback(config: {\n llm: NonNullable<ReturnType<typeof useLLM>>;\n tools: LLMTool[];\n task: string;\n mode: AgentMode;\n complexity?: 'simple' | 'medium' | 'complex';\n researchContext?: string;\n issues: string[];\n sessionId: string;\n onEvent?: AgentEventCallback;\n agentId?: string;\n parentAgentId?: string;\n tracer?: Tracer;\n planToolName: 'plan_generate' | 'plan_generate_refactor';\n planningProfile: PlanningProfile;\n tier?: LLMTier;\n }): Promise<GeneratedPlanData | null> {\n const started = Date.now();\n const retryMessages = [\n {\n role: 'system' as const,\n content: `${this.buildSystemPrompt(\n config.task,\n config.mode,\n config.complexity,\n config.researchContext,\n config.planToolName,\n config.planningProfile,\n )}\n\nQUALITY GATE FEEDBACK FROM PREVIOUS DRAFT:\n${config.issues.map((issue, index) => `${index + 1}. ${issue}`).join('\\n')}\n\nYou MUST fix these issues and return a concrete implementation/refactoring plan.`,\n },\n {\n role: 'user' as const,\n content: `Regenerate the plan to fix quality issues and return an executable markdown draft for: ${config.task}`,\n },\n ];\n const retryOptions = {\n tools: config.tools,\n temperature: 0.1,\n toolChoice: { type: 'function' as const, function: { name: config.planToolName } },\n };\n const retryToolCallId = this.newToolCallId(config.planToolName);\n this.emitEvent(config, {\n type: 'llm:start',\n timestamp: new Date().toISOString(),\n sessionId: config.sessionId,\n data: {\n tier: config.tier || 'large',\n messageCount: retryMessages.length,\n },\n });\n this.emitEvent(config, {\n type: 'tool:start',\n timestamp: new Date().toISOString(),\n sessionId: config.sessionId,\n toolCallId: retryToolCallId,\n data: {\n toolName: config.planToolName,\n input: {\n task: config.task,\n mode: config.mode,\n complexity: config.complexity,\n retry: true,\n },\n },\n });\n\n let response: LLMToolCallResponse;\n try {\n response = await config.llm.chatWithTools!(\n retryMessages,\n retryOptions,\n );\n } catch (error) {\n this.emitEvent(config, {\n type: 'tool:error',\n timestamp: new Date().toISOString(),\n sessionId: config.sessionId,\n toolCallId: retryToolCallId,\n data: {\n toolName: config.planToolName,\n error: error instanceof Error ? error.message : String(error),\n },\n });\n return null;\n }\n\n const durationMs = Date.now() - started;\n this.emitEvent(config, {\n type: 'llm:end',\n timestamp: new Date().toISOString(),\n sessionId: config.sessionId,\n startedAt: new Date(started).toISOString(),\n data: {\n tokensUsed: this.getTokensUsed(response),\n durationMs,\n hasToolCalls: Boolean(response.toolCalls && response.toolCalls.length > 0),\n },\n });\n this.traceLLMCall(config, {\n iteration: 1,\n tools: config.tools,\n temperature: retryOptions.temperature,\n response,\n startedAtMs: started,\n endedAtMs: started + durationMs,\n });\n\n const retryCall = response.toolCalls?.find((tc: { name: string; input: unknown }) => tc.name === config.planToolName);\n const retryData = retryCall?.input as GeneratedPlanData | undefined;\n if (!retryData) {\n this.emitEvent(config, {\n type: 'tool:error',\n timestamp: new Date().toISOString(),\n sessionId: config.sessionId,\n toolCallId: retryToolCallId,\n data: {\n toolName: config.planToolName,\n error: `Retry did not return ${config.planToolName} tool input`,\n },\n });\n return null;\n }\n\n this.emitEvent(config, {\n type: 'tool:end',\n timestamp: new Date().toISOString(),\n sessionId: config.sessionId,\n toolCallId: retryToolCallId,\n startedAt: new Date(started).toISOString(),\n data: {\n toolName: config.planToolName,\n success: true,\n durationMs,\n output: 'Plan regenerated after quality gate',\n },\n });\n\n return retryData;\n }\n\n private emitStatus(\n config: {\n sessionId?: string;\n onEvent?: AgentEventCallback;\n agentId?: string;\n parentAgentId?: string;\n tracer?: Tracer;\n } | undefined,\n status: 'idle' | 'thinking' | 'executing' | 'waiting' | 'done' | 'error' | 'analyzing' | 'planning' | 'researching' | 'finalizing',\n message: string\n ): void {\n this.emitEvent(config, {\n type: 'status:change',\n timestamp: new Date().toISOString(),\n sessionId: config?.sessionId,\n data: { status, message },\n });\n }\n\n private emitProgress(\n config: {\n sessionId?: string;\n onEvent?: AgentEventCallback;\n agentId?: string;\n parentAgentId?: string;\n tracer?: Tracer;\n } | undefined,\n phase: string,\n progress: number,\n message: string\n ): void {\n this.emitEvent(config, {\n type: 'progress:update',\n timestamp: new Date().toISOString(),\n sessionId: config?.sessionId,\n data: { phase, progress, message },\n });\n }\n\n private emitEvent(\n config: {\n sessionId?: string;\n onEvent?: AgentEventCallback;\n agentId?: string;\n parentAgentId?: string;\n tracer?: Tracer;\n } | undefined,\n event: AgentEvent\n ): void {\n if (!config?.onEvent) {\n return;\n }\n config.onEvent({\n ...event,\n agentId: config.agentId,\n parentAgentId: config.parentAgentId,\n });\n }\n\n private getTokensUsed(response: { usage?: { promptTokens?: number; completionTokens?: number } } | undefined): number {\n if (!response?.usage) {\n return 0;\n }\n return (response.usage.promptTokens || 0) + (response.usage.completionTokens || 0);\n }\n\n private traceLLMCall(\n config: { tracer?: Tracer } | undefined,\n input: {\n iteration: number;\n tools: LLMTool[];\n temperature: number;\n response: LLMToolCallResponse;\n startedAtMs: number;\n endedAtMs: number;\n }\n ): void {\n if (!config?.tracer) {\n return;\n }\n try {\n config.tracer.trace(\n createLLMCallEvent({\n iteration: input.iteration,\n model: input.response.model || 'unknown',\n temperature: input.temperature,\n maxTokens: 4096,\n tools: input.tools.map((tool) => tool.name),\n response: input.response,\n startTime: input.startedAtMs,\n endTime: input.endedAtMs,\n })\n );\n } catch {\n // Tracing must never break planning flow.\n }\n }\n\n private newToolCallId(toolName: string): string {\n return `${toolName}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n }\n\n private assessPlanQuality(task: string, planData: GeneratedPlanData): PlanQualityAssessment {\n const isRefactor = this.isRefactorTask(task);\n const markdown = typeof planData.markdown === 'string' ? planData.markdown.trim() : '';\n const phases = Array.isArray(planData.phases) ? planData.phases : [];\n const steps = phases.flatMap((phase: any) => Array.isArray(phase?.steps) ? phase.steps : []);\n const refactorDecisions = Array.isArray(planData.refactorDecisions) ? planData.refactorDecisions : [];\n const changeSets = Array.isArray(planData.changeSets) ? planData.changeSets : [];\n const verification = Array.isArray(planData.verification) ? planData.verification : [];\n const issues: string[] = [];\n const severeIssues: string[] = [];\n\n if (phases.length === 0 || steps.length === 0) {\n const markdownHasStructure = Boolean(\n markdown\n && /(^|\\n)##\\s+steps\\b/i.test(markdown)\n && /(^|\\n)###\\s+/i.test(markdown)\n && /(^|\\n)\\s*[-*]\\s+/.test(markdown)\n );\n if (markdownHasStructure) {\n issues.push('Structured phases are omitted; they will be derived from markdown headings.');\n return {\n score: this.clamp01(0.55),\n issues,\n severeIssues,\n metrics: {\n phaseCount: 0,\n stepCount: 4,\n changeStepCount: 1,\n readOnlyStepCount: 0,\n changeRatio: 0.25,\n hasPlaceholders: false,\n analysisPhaseCount: 0,\n solutionStepRatio: 0.35,\n },\n };\n }\n\n if (isRefactor && changeSets.length > 0) {\n issues.push('Refactoring plan omitted phases; phases will be synthesized from changeSets.');\n const synthesizedStepCount = changeSets.length * 2;\n const synthesizedChangeCount = changeSets.length;\n return {\n score: this.clamp01(0.45 + Math.min(0.2, synthesizedStepCount / 30)),\n issues,\n severeIssues,\n metrics: {\n phaseCount: 0,\n stepCount: synthesizedStepCount,\n changeStepCount: synthesizedChangeCount,\n readOnlyStepCount: 0,\n changeRatio: 1,\n hasPlaceholders: false,\n analysisPhaseCount: 0,\n solutionStepRatio: 0.6,\n },\n };\n }\n const reason = 'Plan has no executable phases/steps.';\n issues.push(reason);\n severeIssues.push(reason);\n return {\n score: 0,\n issues,\n severeIssues,\n metrics: {\n phaseCount: phases.length,\n stepCount: steps.length,\n changeStepCount: 0,\n readOnlyStepCount: 0,\n changeRatio: 0,\n hasPlaceholders: false,\n analysisPhaseCount: 0,\n solutionStepRatio: 0,\n },\n };\n }\n\n if (verification.length === 0) {\n issues.push('Plan does not include explicit verification checks; ensure runtime validation is covered in steps.');\n }\n if (!markdown) {\n issues.push('Plan tool output is missing markdown draft.');\n }\n\n const textFields = steps.map((step: any) => `${step?.action || ''} ${step?.expectedOutcome || ''} ${JSON.stringify(step?.args || {})}`);\n const hasPlaceholders = textFields.some((text) => /<[^>]+>|\\bTBD\\b|\\bTODO\\b/.test(text));\n if (hasPlaceholders) {\n const reason = 'Plan contains placeholders instead of concrete file/module references.';\n issues.push(reason);\n severeIssues.push(reason);\n }\n\n const readOnlyTools = new Set([\n 'mind:rag-query', 'mind_rag_query',\n 'fs:read', 'fs_read',\n 'fs:list', 'fs_list',\n 'fs:search', 'glob_search', 'grep_search', 'find_definition',\n 'browser_snapshot', 'browser_read', 'mcp_query',\n ]);\n const changeTools = new Set([\n 'fs:edit', 'fs_patch', 'mass_replace', 'fs:write', 'fs_write', 'shell:exec', 'shell_exec',\n 'browser_click', 'browser_type', 'browser_fill', 'browser_submit',\n 'mcp_invoke', 'plugin_invoke',\n ]);\n const readOnlyCount = steps.filter((step: any) => readOnlyTools.has(String(step?.tool || ''))).length;\n const changeCount = steps.filter((step: any) => changeTools.has(String(step?.tool || ''))).length;\n const changeRatio = steps.length > 0 ? changeCount / steps.length : 0;\n const analysisPhases = phases.filter((phase: any) => /(discovery|inventory|audit|analysis|research)/i.test(String(phase?.name || ''))).length;\n const solutionStepCount = steps.filter((step: any) =>\n /(extract|split|rename|decouple|inject|interface|abstraction|remove|replace|refactor|test|coverage|consolidate|modular)/i\n .test(`${step?.action || ''} ${step?.expectedOutcome || ''}`)\n ).length;\n const solutionStepRatio = steps.length > 0 ? solutionStepCount / steps.length : 0;\n\n const missingToolCount = steps.filter((step: any) => typeof step?.tool !== 'string' || String(step.tool).trim().length === 0).length;\n if (missingToolCount > 0) {\n issues.push('Some plan steps are missing explicit tools.');\n }\n\n const missingActionOrOutcomeCount = steps.filter((step: any) =>\n typeof step?.action !== 'string'\n || step.action.trim().length === 0\n || typeof step?.expectedOutcome !== 'string'\n || step.expectedOutcome.trim().length === 0\n ).length;\n if (missingActionOrOutcomeCount > 0) {\n const reason = 'Some plan steps are missing action/expectedOutcome.';\n issues.push(reason);\n severeIssues.push(reason);\n }\n\n if (!isRefactor) {\n const score = this.clamp01(\n 0.25\n + (steps.length >= 4 ? 0.2 : 0)\n + (changeRatio >= 0.25 ? 0.15 : 0)\n + (solutionStepRatio >= 0.2 ? 0.1 : 0)\n + (verification.length > 0 ? 0.1 : 0)\n + (analysisPhases <= 1 ? 0.05 : 0)\n - (hasPlaceholders ? 0.35 : 0)\n - (missingToolCount > 0 ? 0.25 : 0)\n - (missingActionOrOutcomeCount > 0 ? 0.25 : 0)\n );\n return {\n score,\n issues,\n severeIssues,\n metrics: {\n phaseCount: phases.length,\n stepCount: steps.length,\n changeStepCount: changeCount,\n readOnlyStepCount: readOnlyCount,\n changeRatio,\n hasPlaceholders,\n analysisPhaseCount: analysisPhases,\n solutionStepRatio,\n },\n };\n }\n\n if (refactorDecisions.length === 0) {\n issues.push('Refactoring plan does not include explicit refactorDecisions; rely on concrete phase steps.');\n }\n if (changeSets.length === 0) {\n issues.push('Refactoring plan does not include explicit changeSets; rely on concrete phase steps.');\n }\n\n if (changeCount === 0) {\n const reason = 'Refactoring plan contains no concrete execution steps (change tools or executable actions).';\n issues.push(reason);\n severeIssues.push(reason);\n }\n if (changeRatio < 0.4) {\n issues.push('Refactoring plan is too discovery-heavy and lacks implementation-heavy refactor actions.');\n }\n if (readOnlyCount / steps.length > 0.6) {\n issues.push('Too many read/search steps for a refactoring plan.');\n }\n\n if (analysisPhases > 1) {\n issues.push('Refactoring plan has multiple analysis-only phases; keep at most one short analysis phase.');\n }\n\n if (solutionStepRatio < 0.35) {\n issues.push('Refactoring plan does not describe enough concrete design/implementation decisions.');\n }\n\n const score = this.clamp01(\n 0.2\n + Math.min(0.2, steps.length / 30)\n + (changeRatio * 0.35)\n + (solutionStepRatio * 0.25)\n + (analysisPhases <= 1 ? 0.1 : 0)\n + (verification.length > 0 ? 0.05 : 0)\n - (hasPlaceholders ? 0.35 : 0)\n - (changeCount === 0 ? 0.35 : 0)\n - (missingToolCount > 0 ? 0.25 : 0)\n - (missingActionOrOutcomeCount > 0 ? 0.25 : 0)\n );\n\n return {\n score,\n issues,\n severeIssues,\n metrics: {\n phaseCount: phases.length,\n stepCount: steps.length,\n changeStepCount: changeCount,\n readOnlyStepCount: readOnlyCount,\n changeRatio,\n hasPlaceholders,\n analysisPhaseCount: analysisPhases,\n solutionStepRatio,\n },\n };\n }\n\n private assessFreeformMarkdown(markdown: string): { score: number; issues: string[]; severeIssues: string[] } {\n const text = (markdown || '').replace(/\\r\\n/g, '\\n').trim();\n const issues: string[] = [];\n const severeIssues: string[] = [];\n\n if (!text) {\n const reason = 'Markdown plan is empty.';\n issues.push(reason);\n severeIssues.push(reason);\n return { score: 0, issues, severeIssues };\n }\n\n // Delegate to PlanValidator for rubric-based scoring\n const validator = new PlanValidator();\n const validation = validator.validate(text);\n\n // Map validator issues back to legacy format\n for (const issue of validation.issues) {\n issues.push(issue.message);\n if (issue.severity === 'error') {\n severeIssues.push(issue.message);\n }\n }\n\n // Legacy structural checks for backward compatibility\n if (text.length < 160) {\n const reason = 'Markdown plan is too short to be actionable.';\n if (!issues.includes(reason)) {\n issues.push(reason);\n severeIssues.push(reason);\n }\n }\n\n if (/(placeholder|need research first|\\btbd\\b|\\btodo\\b)/i.test(text)) {\n const reason = 'Markdown plan contains placeholder content.';\n if (!issues.includes(reason)) {\n issues.push(reason);\n severeIssues.push(reason);\n }\n }\n\n // Use validator score as the primary score\n return { score: validation.score, issues, severeIssues };\n }\n\n private isRefactorTask(task: string): boolean {\n return /\\brefactor|refactoring|restructure|cleanup|maintainability|testability\\b/i.test(task);\n }\n\n private shouldRetryPlan(task: string, quality: PlanQualityAssessment): boolean {\n // Retry should be rare: only when draft is structurally unusable.\n if (quality.severeIssues.length === 0) {\n return false;\n }\n\n const isRefactor = this.isRefactorTask(task);\n const hardFailures = quality.severeIssues.some((issue) =>\n /no executable phases\\/steps|no concrete execution steps|missing action\\/expectedOutcome|did not contain/i\n .test(issue)\n );\n\n if (!hardFailures) {\n return false;\n }\n\n // Additional guard: avoid retries for mostly-usable drafts.\n if (quality.metrics.stepCount >= 4 && quality.metrics.changeStepCount >= 2 && quality.score >= (isRefactor ? 0.45 : 0.5)) {\n return false;\n }\n\n return true;\n }\n\n private clamp01(value: number): number {\n if (value < 0) {return 0;}\n if (value > 1) {return 1;}\n return Number(value.toFixed(3));\n }\n\n private createResearchTool(): LLMTool {\n return {\n name: 'plan_research',\n description: 'Submit structured research findings that will be used as context for plan generation',\n inputSchema: {\n type: 'object',\n properties: {\n summary: {\n type: 'string',\n description: 'Concise research summary grounded in codebase evidence',\n },\n findings: {\n type: 'array',\n items: { type: 'string' },\n description: 'Concrete findings with file/module references',\n },\n openQuestions: {\n type: 'array',\n items: { type: 'string' },\n description: 'Known unknowns to track in the plan',\n },\n },\n required: ['summary', 'findings'],\n },\n };\n }\n\n /**\n * Create the plan generation tool\n */\n private createPlanTool(profile: PlanningProfile): LLMTool {\n return {\n name: 'plan_generate',\n description: `Generate an executable plan for domain \"${profile.domain}\" with concise phases and concrete tool-driven steps.`,\n inputSchema: {\n type: 'object',\n properties: {\n complexity: {\n type: 'string',\n enum: ['simple', 'medium', 'complex'],\n description: 'Task complexity assessment',\n },\n estimatedDuration: {\n type: 'string',\n description: 'Estimated implementation time (e.g., \"2 hours\", \"1 day\")',\n },\n markdown: {\n type: 'string',\n description: 'Human-readable markdown plan. Keep concise and practical.',\n },\n objective: {\n type: 'object',\n properties: {\n currentState: { type: 'string' },\n targetState: { type: 'string' },\n constraints: { type: 'array', items: { type: 'string' } },\n },\n required: ['currentState', 'targetState'],\n },\n evidence: {\n type: 'array',\n minItems: 2,\n items: {\n type: 'object',\n properties: {\n id: { type: 'string' },\n source: { type: 'string' },\n artifact: { type: 'string' },\n confidence: { type: 'number' },\n },\n required: ['id', 'source', 'artifact'],\n },\n },\n decisions: {\n type: 'array',\n minItems: 2,\n items: {\n type: 'object',\n properties: {\n id: { type: 'string' },\n statement: { type: 'string' },\n rationale: { type: 'string' },\n evidenceIds: { type: 'array', items: { type: 'string' } },\n expectedImpact: { type: 'string' },\n },\n required: ['id', 'statement', 'rationale', 'evidenceIds', 'expectedImpact'],\n },\n },\n alternatives: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n option: { type: 'string' },\n whyRejected: { type: 'string' },\n },\n required: ['option', 'whyRejected'],\n },\n },\n changeSets: {\n type: 'array',\n minItems: 2,\n items: {\n type: 'object',\n properties: {\n id: { type: 'string' },\n decisionId: { type: 'string' },\n capability: { type: 'string' },\n targets: { type: 'array', items: { type: 'string' } },\n operations: { type: 'array', items: { type: 'string' } },\n validation: { type: 'string' },\n },\n required: ['id', 'decisionId', 'capability', 'operations', 'validation'],\n },\n },\n verification: {\n type: 'array',\n minItems: 1,\n items: {\n type: 'object',\n properties: {\n id: { type: 'string' },\n check: { type: 'string' },\n commandOrMethod: { type: 'string' },\n successSignal: { type: 'string' },\n },\n required: ['id', 'check', 'commandOrMethod', 'successSignal'],\n },\n },\n rollback: {\n type: 'object',\n properties: {\n trigger: { type: 'string' },\n steps: { type: 'array', items: { type: 'string' } },\n },\n required: ['trigger', 'steps'],\n },\n phases: {\n type: 'array',\n description: 'Execution phases with dependencies',\n items: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Unique phase ID (e.g., \"phase-1\")' },\n name: { type: 'string', description: 'Phase name' },\n description: { type: 'string', description: 'What this phase accomplishes' },\n dependencies: {\n type: 'array',\n items: { type: 'string' },\n description: 'IDs of phases that must complete first',\n },\n steps: {\n type: 'array',\n description: 'Concrete executable steps',\n items: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Unique step ID (e.g., \"step-1-1\")' },\n action: { type: 'string', description: 'Concrete action using a specific tool' },\n tool: {\n type: 'string',\n description: 'Tool to execute this step (must be one of available tools)',\n },\n args: {\n type: 'object',\n description: 'Tool arguments (optional)',\n },\n expectedOutcome: {\n type: 'string',\n description: 'Measurable result of this step',\n },\n },\n required: ['id', 'action', 'expectedOutcome'],\n },\n },\n },\n required: ['id', 'name', 'description', 'steps'],\n },\n },\n },\n required: ['markdown'],\n },\n };\n }\n\n private createRefactorPlanTool(profile: PlanningProfile): LLMTool {\n return {\n name: 'plan_generate_refactor',\n description: `Generate an executable refactoring plan for domain \"${profile.domain}\" focused on concrete change steps and validation.`,\n inputSchema: {\n type: 'object',\n properties: {\n complexity: {\n type: 'string',\n enum: ['simple', 'medium', 'complex'],\n description: 'Task complexity assessment',\n },\n estimatedDuration: {\n type: 'string',\n description: 'Estimated implementation time (e.g., \"2 hours\", \"1 day\")',\n },\n markdown: {\n type: 'string',\n description: 'Human-readable markdown refactor plan. Keep concise and actionable.',\n },\n objective: {\n type: 'object',\n properties: {\n currentState: { type: 'string' },\n targetState: { type: 'string' },\n constraints: { type: 'array', items: { type: 'string' } },\n },\n required: ['currentState', 'targetState'],\n },\n evidence: {\n type: 'array',\n minItems: 2,\n items: {\n type: 'object',\n properties: {\n id: { type: 'string' },\n source: { type: 'string' },\n artifact: { type: 'string' },\n confidence: { type: 'number' },\n },\n required: ['id', 'source', 'artifact'],\n },\n },\n refactorDecisions: {\n type: 'array',\n minItems: 3,\n items: {\n type: 'object',\n properties: {\n id: { type: 'string' },\n target: { type: 'string', description: 'Exact file/module target' },\n action: {\n type: 'string',\n enum: ['extract', 'split', 'rename', 'decouple', 'replace', 'consolidate'],\n },\n rationale: { type: 'string' },\n expectedImpact: { type: 'string' },\n validation: { type: 'string' },\n },\n required: ['id', 'target', 'action', 'rationale', 'expectedImpact', 'validation'],\n },\n },\n changeSets: {\n type: 'array',\n minItems: 2,\n items: {\n type: 'object',\n properties: {\n id: { type: 'string' },\n decisionId: { type: 'string' },\n targetFiles: { type: 'array', items: { type: 'string' } },\n operations: { type: 'array', items: { type: 'string' } },\n validation: { type: 'string' },\n },\n required: ['id', 'decisionId', 'targetFiles', 'operations', 'validation'],\n },\n },\n phases: {\n type: 'array',\n description: 'Execution phases with dependencies',\n items: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Unique phase ID (e.g., \"phase-1\")' },\n name: { type: 'string', description: 'Phase name' },\n description: { type: 'string', description: 'What this phase accomplishes' },\n dependencies: {\n type: 'array',\n items: { type: 'string' },\n description: 'IDs of phases that must complete first',\n },\n steps: {\n type: 'array',\n description: 'Concrete executable steps',\n items: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Unique step ID (e.g., \"step-1-1\")' },\n action: { type: 'string', description: 'Concrete action using a specific tool' },\n tool: {\n type: 'string',\n description: 'Tool to execute this step (must be one of available tools)',\n },\n args: {\n type: 'object',\n description: 'Tool arguments (optional)',\n },\n expectedOutcome: {\n type: 'string',\n description: 'Measurable result of this step',\n },\n },\n required: ['id', 'action', 'expectedOutcome'],\n },\n },\n },\n required: ['id', 'name', 'description', 'steps'],\n },\n },\n },\n required: ['markdown'],\n },\n };\n }\n\n private createPlanUpdateTool(): LLMTool {\n return {\n name: 'plan_update',\n description: 'Update an existing plan based on user feedback while keeping it executable and tool-driven',\n inputSchema: {\n type: 'object',\n properties: {\n complexity: {\n type: 'string',\n enum: ['simple', 'medium', 'complex'],\n description: 'Updated complexity assessment',\n },\n estimatedDuration: {\n type: 'string',\n description: 'Updated estimated implementation time',\n },\n revisionSummary: {\n type: 'string',\n description: 'Short summary of what changed in this revision',\n },\n markdown: {\n type: 'string',\n description: 'Updated human-readable markdown plan.',\n },\n phases: {\n type: 'array',\n description: 'Revised execution phases',\n items: {\n type: 'object',\n properties: {\n id: { type: 'string' },\n name: { type: 'string' },\n description: { type: 'string' },\n dependencies: { type: 'array', items: { type: 'string' } },\n steps: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n id: { type: 'string' },\n action: { type: 'string' },\n tool: {\n type: 'string',\n description: 'Tool to execute this step',\n },\n args: { type: 'object' },\n expectedOutcome: { type: 'string' },\n },\n required: ['id', 'action', 'expectedOutcome'],\n },\n },\n },\n required: ['id', 'name', 'description', 'steps'],\n },\n },\n },\n required: ['markdown'],\n },\n };\n }\n\n /**\n * Get research tools from registry (read-only tools for investigation)\n */\n private getResearchTools(registry: ToolRegistry): LLMTool[] {\n const tools: LLMTool[] = [];\n\n // Get all available tools and filter for research tools\n const researchToolNames = [\n 'mind:rag-query',\n 'mind_rag_query',\n 'fs:read',\n 'fs_read',\n 'fs:list',\n 'fs_list',\n 'glob_search',\n 'grep_search',\n 'find_definition',\n 'browser_navigate',\n 'browser_snapshot',\n 'mcp_query',\n 'mcp_invoke',\n ];\n\n for (const toolName of researchToolNames) {\n const tool = registry.get(toolName);\n if (tool) {\n // Convert from agent tool definition to LLM tool format\n tools.push({\n name: tool.definition.function.name,\n description: tool.definition.function.description || '',\n inputSchema: tool.definition.function.parameters,\n });\n }\n }\n\n return tools;\n }\n\n /**\n * Normalize phases from tool call\n */\n private normalizePhasesFromTool(phases: any[]): Phase[] {\n return phases.map((p, idx) => ({\n id: p.id || `phase-${idx + 1}`,\n name: this.normalizePhaseName(p.name, p.description, p.steps, idx + 1),\n description: this.normalizePhaseDescription(p.description, p.steps),\n dependencies: Array.isArray(p.dependencies) ? p.dependencies : [],\n status: 'pending' as const,\n steps: (p.steps || []).map((s: any, stepIdx: number) => ({\n id: s.id || `step-${idx + 1}-${stepIdx + 1}`,\n action: this.normalizeStepAction(s.action),\n tool: s.tool,\n args: s.args || {},\n expectedOutcome: this.normalizeExpectedOutcome(s.expectedOutcome, s.action),\n status: 'pending' as const,\n })),\n }));\n }\n\n private parsePhasesFromMarkdown(markdown: string): Phase[] {\n const source = typeof markdown === 'string' ? markdown.replace(/\\r\\n/g, '\\n') : '';\n if (!source.trim()) {\n return [];\n }\n\n const lines = source.split('\\n');\n const headingMeta: Array<{ index: number; level: 2 | 3; text: string }> = [];\n for (let i = 0; i < lines.length; i++) {\n const match = /^(##|###)\\s+(.+?)\\s*$/.exec(lines[i] || '');\n if (!match) {continue;}\n headingMeta.push({\n index: i,\n level: match[1] === '###' ? 3 : 2,\n text: (match[2] || '').trim(),\n });\n }\n\n const isGenericSubsection = (text: string): boolean => /^(steps?|validation|goal|risks?|verification|approval|objective|task|context|summary)\\b/i.test(text);\n const isPhaseHeading = (level: 2 | 3, text: string): boolean =>\n (level === 2 && /^phase\\b/i.test(text))\n || (level === 3 && !isGenericSubsection(text));\n\n const phaseHeadingIndexes = headingMeta\n .filter((heading) => isPhaseHeading(heading.level, heading.text))\n .map((heading) => heading.index);\n\n const sectionStart = lines.findIndex((line) => /^##\\s+(steps?|execution plan|phases?)\\b/i.test(line.trim()));\n const sectionEnd = sectionStart >= 0\n ? lines.findIndex((line, idx) => idx > sectionStart && /^##\\s+/.test(line.trim()))\n : -1;\n\n const extractStepBullets = (body: string[]): string[] => body\n .map((line) => {\n const bullet = /^\\s*[-*]\\s+(.+)\\s*$/.exec(line);\n if (bullet?.[1]) {return bullet[1].trim();}\n const numbered = /^\\s*\\d+\\.\\s+(.+)\\s*$/.exec(line);\n return numbered?.[1]?.trim() || '';\n })\n .filter(Boolean);\n\n if (phaseHeadingIndexes.length === 0) {\n if (sectionStart < 0) {return [];}\n const stepSection = lines.slice(sectionStart + 1, sectionEnd >= 0 ? sectionEnd : lines.length);\n const bullets = extractStepBullets(stepSection);\n if (bullets.length === 0) {return [];}\n return [{\n id: 'phase-1',\n name: 'Implementation Steps',\n description: 'Execute the planned changes from the markdown draft.',\n dependencies: [],\n status: 'pending',\n steps: bullets.map((item, idx) => ({\n id: `step-1-${idx + 1}`,\n action: item,\n expectedOutcome: this.extractOutcomeFromAction(item),\n status: 'pending' as const,\n })),\n }];\n }\n\n return phaseHeadingIndexes.map((start, idx) => {\n const nextPhaseStart = phaseHeadingIndexes[idx + 1] ?? lines.length;\n const nextTopLevelSection = headingMeta\n .find((heading) => heading.index > start && heading.level === 2 && !/^phase\\b/i.test(heading.text))\n ?.index;\n const end = Math.min(nextPhaseStart, nextTopLevelSection ?? lines.length);\n const heading = (lines[start] || '').replace(/^(##|###)\\s+/, '').trim() || `Step Group ${idx + 1}`;\n const body = lines.slice(start + 1, end);\n const bullets = extractStepBullets(body);\n\n const steps = (bullets.length > 0 ? bullets : ['Execute planned changes for this section']).map((item, stepIdx) => ({\n id: `step-${idx + 1}-${stepIdx + 1}`,\n action: item,\n expectedOutcome: this.extractOutcomeFromAction(item),\n status: 'pending' as const,\n }));\n\n const descriptionLine = body.find((line) => line.trim().length > 0 && !/^\\s*[-*]\\s+/.test(line))?.trim();\n\n return {\n id: `phase-${idx + 1}`,\n name: this.normalizePhaseName(heading, descriptionLine, steps, idx + 1),\n description: this.normalizePhaseDescription(descriptionLine, steps),\n dependencies: idx === 0 ? [] : [`phase-${idx}`],\n status: 'pending' as const,\n steps,\n };\n });\n }\n\n private normalizePlanMarkdown(task: string, markdown: unknown, phases: Phase[]): string {\n const text = typeof markdown === 'string' ? markdown.replace(/\\r\\n/g, '\\n').trim() : '';\n const looksLikePlaceholder = /(placeholder|need research first|\\btbd\\b|\\btodo\\b)/i.test(text);\n if (text && !looksLikePlaceholder) {\n return text;\n }\n\n const renderedPhases = phases.map((phase) => [\n `### ${phase.name}`,\n '',\n phase.description,\n '',\n ...phase.steps.map((step) => `- ${step.action}`),\n ].join('\\n')).join('\\n\\n');\n\n return [\n `# Plan: ${task || 'Untitled Task'}`,\n '',\n '## Task',\n '',\n task || '(not specified)',\n '',\n '## Steps',\n '',\n renderedPhases || '### Core Work\\n\\n- Define and execute the main implementation steps.',\n '',\n '## Risks',\n '',\n '- Unknown dependencies may require scoped adjustments.',\n '',\n '## Verification',\n '',\n '- Run focused checks for touched scope.',\n '',\n '## Approval',\n '',\n '- Approve this plan for execution?',\n ].join('\\n').trim();\n }\n\n private createFallbackPhases(task: string): Phase[] {\n const taskLabel = (task || 'the requested task').trim();\n return [{\n id: 'phase-1',\n name: 'Execute Core Work',\n description: 'Fallback executable sequence when model output is missing structured phases.',\n dependencies: [],\n status: 'pending',\n steps: [\n {\n id: 'step-1-1',\n action: `Identify concrete files/modules and boundaries for ${taskLabel}`,\n expectedOutcome: 'Relevant scope and change points are identified',\n status: 'pending',\n },\n {\n id: 'step-1-2',\n action: `Implement the required changes for ${taskLabel}`,\n expectedOutcome: 'Requested behavior or structure is implemented',\n status: 'pending',\n },\n {\n id: 'step-1-3',\n action: `Run focused verification for ${taskLabel}`,\n tool: 'shell:exec',\n args: { command: 'pnpm test --filter planning || pnpm test' },\n expectedOutcome: 'Verification commands pass for touched scope',\n status: 'pending',\n },\n ],\n }];\n }\n\n private synthesizeRefactorPhasesFromChangeSets(changeSets: unknown[] | undefined): Phase[] {\n if (!Array.isArray(changeSets) || changeSets.length === 0) {\n return [];\n }\n\n return changeSets\n .filter((item): item is {\n id?: string;\n targetFiles?: unknown;\n operations?: unknown;\n validation?: string;\n } => typeof item === 'object' && item !== null)\n .slice(0, 8)\n .map((set, idx) => {\n const targetFiles = Array.isArray(set.targetFiles)\n ? set.targetFiles.filter((value): value is string => typeof value === 'string' && value.trim().length > 0)\n : [];\n const operations = Array.isArray(set.operations)\n ? set.operations.filter((value): value is string => typeof value === 'string' && value.trim().length > 0)\n : [];\n const stepPrefix = `step-${idx + 1}`;\n const steps: Phase['steps'] = [];\n\n if (targetFiles.length > 0) {\n steps.push({\n id: `${stepPrefix}-1`,\n action: `Apply refactor edits in files: ${targetFiles.join(', ')}`,\n tool: 'fs:edit',\n args: { paths: targetFiles },\n expectedOutcome: 'Refactor edits applied to target files',\n status: 'pending',\n });\n }\n\n if (operations.length > 0) {\n steps.push({\n id: `${stepPrefix}-2`,\n action: `Implement operations: ${operations.join('; ')}`,\n tool: 'fs:edit',\n args: { operations },\n expectedOutcome: 'Declared refactor operations implemented',\n status: 'pending',\n });\n }\n\n steps.push({\n id: `${stepPrefix}-3`,\n action: `Run validation for ${set.id || `change-set-${idx + 1}`}`,\n tool: 'shell:exec',\n args: { command: set.validation || 'pnpm test' },\n expectedOutcome: 'Validation command completes successfully',\n status: 'pending',\n });\n\n return {\n id: `phase-${idx + 1}`,\n name: this.normalizePhaseName(\n set.id || `Change Set ${idx + 1}`,\n `Implement and validate ${set.id || `change set ${idx + 1}`}`,\n steps,\n idx + 1\n ),\n description: `Implement and validate ${set.id || `change set ${idx + 1}`}`,\n dependencies: idx === 0 ? [] : [`phase-${idx}`],\n status: 'pending',\n steps,\n };\n });\n }\n\n private normalizePhaseName(\n rawName: unknown,\n rawDescription: unknown,\n rawSteps: unknown,\n _index: number\n ): string {\n const name = typeof rawName === 'string' ? rawName.trim() : '';\n const description = typeof rawDescription === 'string' ? rawDescription.trim() : '';\n const steps = Array.isArray(rawSteps) ? rawSteps : [];\n\n const genericName = /^phase\\s+\\d+(\\s*:\\s*(cs\\d+|change set \\d+|changeset \\d+))?$/i.test(name)\n || /^cs\\d+$/i.test(name)\n || /^change set \\d+$/i.test(name);\n if (!name || genericName) {\n const candidateFromDescription = this.extractHumanLabel(description);\n if (candidateFromDescription) {return candidateFromDescription;}\n const firstAction = typeof steps[0]?.action === 'string' ? steps[0].action : '';\n const candidateFromAction = this.extractHumanLabel(firstAction);\n if (candidateFromAction) {return candidateFromAction;}\n return 'Key Changes';\n }\n return name;\n }\n\n private normalizePhaseDescription(rawDescription: unknown, rawSteps: unknown): string {\n const description = typeof rawDescription === 'string' ? rawDescription.trim() : '';\n if (description) {\n return description;\n }\n const steps = Array.isArray(rawSteps) ? rawSteps : [];\n const firstAction = typeof steps[0]?.action === 'string' ? steps[0].action.trim() : '';\n return firstAction || 'Deliver the planned changes for this phase.';\n }\n\n private normalizeStepAction(rawAction: unknown): string {\n const action = typeof rawAction === 'string' ? rawAction.trim() : '';\n if (!action) {\n return 'Apply planned changes for this step';\n }\n return action;\n }\n\n private normalizeExpectedOutcome(rawExpected: unknown, rawAction: unknown): string {\n const expected = typeof rawExpected === 'string' ? rawExpected.trim() : '';\n if (\n expected &&\n !/^(declared refactor operations implemented|validation command completes successfully|changes applied)$/i.test(expected)\n ) {\n return expected;\n }\n const action = typeof rawAction === 'string' ? rawAction.trim() : '';\n if (action) {\n return this.extractOutcomeFromAction(action);\n }\n return 'Step completed with measurable result.';\n }\n\n private extractHumanLabel(input: string): string {\n const compact = input\n .replace(/^implement operations:\\s*/i, '')\n .replace(/^run validation for\\s*/i, 'Validation: ')\n .replace(/\\s+/g, ' ')\n .trim();\n if (!compact) {return '';}\n const firstChunk = compact.split(';')[0]?.trim() || '';\n if (!firstChunk) {return '';}\n return firstChunk.length > 64 ? `${firstChunk.slice(0, 61)}...` : firstChunk;\n }\n\n private extractOutcomeFromAction(action: string): string {\n const normalized = action\n .replace(/^run validation for\\s*/i, 'Validation completed for ')\n .replace(/^implement operations:\\s*/i, '')\n .replace(/\\s+/g, ' ')\n .trim();\n if (!normalized) {\n return 'Step completed with measurable result.';\n }\n const chunk = normalized.split(';')[0]?.trim() || normalized;\n return chunk.length > 110 ? `${chunk.slice(0, 107)}...` : chunk;\n }\n\n /**\n * Build system prompt for plan generation\n */\n private buildSystemPrompt(\n task: string,\n mode: AgentMode,\n complexity?: 'simple' | 'medium' | 'complex',\n researchContext?: string,\n planToolName: 'plan_generate' | 'plan_generate_refactor' = 'plan_generate',\n planningProfile?: PlanningProfile,\n ): string {\n const modeContext = this.getModeContext(mode);\n const profile = planningProfile || this.buildPlanningProfile(task);\n const availableTools = profile.availableTools.length > 0 ? profile.availableTools : ['fs_read', 'fs_patch', 'fs_write', 'fs_list', 'shell_exec', 'glob_search', 'grep_search'];\n const preferredTools = profile.preferredTools.length > 0 ? profile.preferredTools : availableTools.slice(0, 6);\n const capabilities = profile.capabilities.length > 0 ? profile.capabilities : ['analysis', 'implementation', 'verification'];\n\n // Build research context section if available\n const researchSection = researchContext\n ? `\\n\\nRESEARCH FINDINGS:\nThe following information was gathered by research agents analyzing the codebase:\n\n${researchContext}\n\nUse this research to inform your implementation plan. Focus on ACTIONABLE IMPLEMENTATION STEPS, not meta-level research.`\n : '';\n\n return `You are an AI planning orchestrator creating an EXECUTABLE plan.\n\nTask: ${task}\n\nMode: ${mode}\n${modeContext}\nDomain: ${profile.domain}\nCapabilities: ${capabilities.join(', ')}\nAvailable tools: ${availableTools.join(', ')}\nPreferred tools for this task: ${preferredTools.join(', ')}\n\n${complexity ? `Complexity hint: ${complexity}` : ''}${researchSection}\n\nCRITICAL CONSTRAINTS:\n1. Generate an outcome-driven plan from CURRENT STATE (A) to TARGET STATE (B). No meta-plan about \"how to plan\".\n2. Every step must be executable with available tools. No placeholders, no \"someone else will do X\".\n3. Keep it domain-appropriate:\n - If task is code-centric, use code/search/shell tools.\n - If task is browser/MCP-centric, use browser/MCP tools when available.\n - Do not force file-edit steps when the task domain is not coding.\n4. For refactoring tasks:\n - Include concrete design decisions and exact refactor actions (e.g., extract class/function, split module, add interface, replace dependency).\n - Keep discovery steps minimal; majority of steps should drive actual changes.\n\nPLAN LANGUAGE: Write the plan body text in the SAME language as the task description. Section headings can stay in English, but descriptions and prose MUST match the user's language.\n\nPLAN STYLE — the plan is for a HUMAN reader:\n- Write like you're explaining the plan to a colleague. A real person will read this to verify you understood the task and didn't miss anything.\n- For each phase/step, briefly explain WHY — not just what to change, but what it achieves and why it's needed.\n- Show you understood the current code: describe what exists now before explaining what changes.\n- Use short prose between steps to connect the narrative flow — not a raw checklist.\n- Keep code snippets to 3-5 lines max. Reference line numbers instead of pasting large blocks.\n- Every step MUST reference a real file path or a shell command.\n BAD: \"Update the configuration file\"\n GOOD: \"Edit packages/agent-core/src/planning/plan-generator.ts — add specificity scoring\"\n BAD: \"Run tests\"\n GOOD: \"pnpm --filter @kb-labs/agent-core test\"\n\nTOOL OUTPUT REQUIREMENT:\n- Return a complete markdown draft in the \"markdown\" field through ${planToolName}.\n- Markdown must include at minimum: Task, Steps, Risks, Verification, Approval.\n- You may additionally include structured phases/steps fields, but markdown is mandatory.\n\nPREFERRED MARKDOWN SKELETON:\n# <Short plan title>\n## Table of Contents\n- [Task](#task)\n- [Steps](#steps)\n- [Risks](#risks)\n- [Verification](#verification)\n- [Approval](#approval)\n\n## Task\n- Current state (A):\n- Target state (B):\n- Scope boundaries:\n\n## Steps\n### Phase 1: <Name>\n- Goal:\n- Actions:\n- Expected outcome:\n\n### Phase 2: <Name>\n- Goal:\n- Actions:\n- Expected outcome:\n\n## Risks\n- Risk:\n- Mitigation:\n\n## Verification\n- Command/check:\n- Success signal:\n\n## Approval\n- Ready for approval: yes/no\n- Open questions (if any):\n`;\n }\n\n private buildResearchSystemPrompt(\n task: string,\n mode: AgentMode,\n complexity?: 'simple' | 'medium' | 'complex'\n ): string {\n return `You are planning research for autonomous implementation.\n\nTask: ${task}\nMode: ${mode}\n${complexity ? `Complexity hint: ${complexity}` : ''}\n\nCollect concrete implementation-relevant findings and submit them using the plan_research tool.\nAvoid generic statements. Focus on files, modules, boundaries, and likely change points.`;\n }\n\n private buildUpdateSystemPrompt(\n plan: TaskPlan,\n feedback: string,\n mode: AgentMode,\n researchContext?: string\n ): string {\n const researchSection = researchContext\n ? `\\n\\nAdditional research findings for this revision:\\n${researchContext}`\n : '';\n\n return `You are updating an execution plan from user feedback.\n\nCurrent plan task: ${plan.task}\nMode: ${mode}\nFeedback: ${feedback}\n\nCurrent phases:\n${plan.phases.map((phase, idx) => `${idx + 1}. ${phase.name}: ${phase.description}`).join('\\n')}\n\n${researchSection}\n\nReturn ONLY updated plan data through plan_update tool.\nKeep the revision human-readable and concise; preserve only essential structure and concrete outcomes.\nReturn updated markdown in the \"markdown\" field (mandatory).`;\n }\n\n private buildPlanningProfile(task: string, toolRegistry?: ToolRegistry): PlanningProfile {\n const text = task.toLowerCase();\n const availableTools = toolRegistry?.getToolNames() || [];\n\n const domain = /mcp\\b|model context protocol|server tools|external server/.test(text)\n ? 'mcp'\n : /browser|ui|website|page|dom|click|form|navigation|scrape/.test(text)\n ? 'browser'\n : /refactor|code|typescript|module|api|test|build|lint|package/.test(text)\n ? 'code'\n : 'general';\n\n const capabilities = new Set<string>();\n for (const tool of availableTools) {\n if (/^fs_|^glob_search$|^grep_search$|^find_definition$/.test(tool)) {capabilities.add('filesystem-analysis');}\n if (/^fs_patch$|^fs_write$|^mass_replace$/.test(tool)) {capabilities.add('code-modification');}\n if (/^shell_exec$/.test(tool)) {capabilities.add('command-execution');}\n if (/^browser_/.test(tool)) {capabilities.add('browser-automation');}\n if (/^mcp_/.test(tool)) {capabilities.add('mcp-integration');}\n if (/^mind/.test(tool)) {capabilities.add('semantic-search');}\n if (/^ask_user$/.test(tool)) {capabilities.add('clarification');}\n }\n\n const preferredByDomain: Record<PlanningProfile['domain'], string[]> = {\n code: ['find_definition', 'grep_search', 'glob_search', 'fs_read', 'fs_patch', 'mass_replace', 'shell_exec'],\n browser: ['browser_navigate', 'browser_snapshot', 'browser_click', 'browser_type', 'browser_submit'],\n mcp: ['mcp_query', 'mcp_invoke', 'grep_search', 'shell_exec'],\n general: ['grep_search', 'glob_search', 'fs_list', 'shell_exec', 'ask_user'],\n };\n\n const preferredTools = preferredByDomain[domain].filter((tool) => availableTools.includes(tool));\n\n return {\n domain,\n availableTools,\n preferredTools,\n capabilities: Array.from(capabilities),\n };\n }\n\n private extractPathHints(task: string): string[] {\n const matches = task.match(/[A-Za-z0-9_./-]+\\.[A-Za-z0-9]+/g) || [];\n return Array.from(new Set(matches.map((value) => value.trim()).filter(Boolean))).slice(0, 8);\n }\n\n private extractKeywordHints(task: string): string[] {\n const words = task\n .toLowerCase()\n .replace(/[^a-z0-9_\\s/-]/g, ' ')\n .split(/\\s+/)\n .filter((token) => token.length >= 4);\n const stop = new Set(['create', 'plan', 'executable', 'improve', 'with', 'from', 'this', 'that', 'into', 'mode', 'task']);\n return Array.from(new Set(words.filter((token) => !stop.has(token)))).slice(0, 10);\n }\n\n /**\n * Get mode-specific context for plan generation\n */\n private getModeContext(mode: AgentMode): string {\n switch (mode) {\n case 'plan':\n return 'Focus on generating a comprehensive plan without execution. Include research, design, and implementation phases.';\n case 'edit':\n return 'Focus on file modifications. Start with reading existing files, then editing them. No new file creation unless necessary.';\n case 'debug':\n return 'Focus on error investigation. Include trace analysis, root cause identification, and fix implementation.';\n case 'execute':\n default:\n return 'Focus on complete task execution from start to finish.';\n }\n }\n\n private getPlanToolName(task: string): 'plan_generate' | 'plan_generate_refactor' {\n return this.isRefactorTask(task) ? 'plan_generate_refactor' : 'plan_generate';\n }\n\n}\n","/**\n * Plan executor - executes plans step by step with progress tracking\n */\n\nimport { promises as fs } from 'node:fs';\nimport type {\n TaskPlan,\n Phase,\n SessionProgress,\n Tracer,\n} from '@kb-labs/agent-contracts';\n\n/**\n * Executes task plans with progress tracking\n */\nexport class PlanExecutor {\n private tracer?: Tracer;\n\n constructor(tracer?: Tracer) {\n this.tracer = tracer;\n }\n\n /**\n * Execute a plan\n */\n async execute(\n plan: TaskPlan,\n toolExecutor: (tool: string, args: Record<string, unknown>) => Promise<string>\n ): Promise<{\n success: boolean;\n completedPhases: number;\n completedSteps: number;\n failedSteps: number;\n error?: string;\n }> {\n let completedPhases = 0;\n let completedSteps = 0;\n let failedSteps = 0;\n\n for (const phase of plan.phases) {\n // Check dependencies\n if (!this.areDependenciesMet(phase, plan.phases)) {\n phase.status = 'skipped';\n continue;\n }\n\n this.recordTrace({\n iteration: 0,\n timestamp: new Date().toISOString(),\n type: 'phase_start',\n data: {\n phaseId: phase.id,\n phaseName: phase.name,\n },\n });\n\n phase.status = 'in_progress';\n phase.startedAt = new Date().toISOString();\n\n try {\n // Execute steps in sequence\n for (const step of phase.steps) {\n this.recordTrace({\n iteration: 0,\n timestamp: new Date().toISOString(),\n type: 'step_start',\n data: {\n stepId: step.id,\n action: step.action,\n tool: step.tool,\n },\n });\n\n step.status = 'in_progress';\n\n try {\n if (step.tool) {\n // Sequential tool execution required - plan steps must execute in order\n \n const result = await toolExecutor(step.tool, step.args || {});\n step.result = result;\n }\n\n step.status = 'completed';\n completedSteps++;\n\n this.recordTrace({\n iteration: 0,\n timestamp: new Date().toISOString(),\n type: 'step_end',\n data: {\n stepId: step.id,\n status: 'completed',\n result: step.result,\n },\n });\n } catch (error) {\n step.status = 'failed';\n step.error = error instanceof Error ? error.message : String(error);\n failedSteps++;\n\n this.recordTrace({\n iteration: 0,\n timestamp: new Date().toISOString(),\n type: 'step_end',\n data: {\n stepId: step.id,\n status: 'failed',\n error: step.error,\n },\n });\n\n // Fail the entire phase if a step fails\n throw error;\n }\n }\n\n phase.status = 'completed';\n phase.completedAt = new Date().toISOString();\n completedPhases++;\n\n this.recordTrace({\n iteration: 0,\n timestamp: new Date().toISOString(),\n type: 'phase_end',\n data: {\n phaseId: phase.id,\n status: 'completed',\n },\n });\n } catch (error) {\n phase.status = 'failed';\n phase.error = error instanceof Error ? error.message : String(error);\n\n this.recordTrace({\n iteration: 0,\n timestamp: new Date().toISOString(),\n type: 'phase_end',\n data: {\n phaseId: phase.id,\n status: 'failed',\n error: phase.error,\n },\n });\n\n return {\n success: false,\n completedPhases,\n completedSteps,\n failedSteps,\n error: phase.error,\n };\n }\n }\n\n return {\n success: true,\n completedPhases,\n completedSteps,\n failedSteps,\n };\n }\n\n /**\n * Check if phase dependencies are met\n */\n private areDependenciesMet(phase: Phase, allPhases: Phase[]): boolean {\n if (!phase.dependencies || phase.dependencies.length === 0) {\n return true;\n }\n\n for (const depId of phase.dependencies) {\n const depPhase = allPhases.find((p) => p.id === depId);\n if (!depPhase || depPhase.status !== 'completed') {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Calculate progress\n */\n calculateProgress(plan: TaskPlan): SessionProgress {\n const totalPhases = plan.phases.length;\n const completedPhases = plan.phases.filter((p) => p.status === 'completed').length;\n\n const totalSteps = plan.phases.reduce((sum, p) => sum + p.steps.length, 0);\n const completedSteps = plan.phases.reduce(\n (sum, p) => sum + p.steps.filter((s) => s.status === 'completed').length,\n 0\n );\n\n const percentage = totalSteps > 0 ? Math.round((completedSteps / totalSteps) * 100) : 0;\n\n const currentPhase = plan.phases.find((p) => p.status === 'in_progress');\n const currentStep = currentPhase?.steps.find((s) => s.status === 'in_progress');\n\n return {\n sessionId: plan.sessionId,\n planId: plan.id,\n currentPhaseId: currentPhase?.id,\n currentStepId: currentStep?.id,\n completedPhases,\n totalPhases,\n completedSteps,\n totalSteps,\n percentage,\n startedAt: plan.createdAt,\n updatedAt: new Date().toISOString(),\n };\n }\n\n /**\n * Save progress to file\n */\n async saveProgress(progress: SessionProgress, filePath: string): Promise<void> {\n await fs.writeFile(filePath, JSON.stringify(progress, null, 2), 'utf-8');\n }\n\n /**\n * Record trace entry\n */\n private recordTrace(entry: any): void {\n if (this.tracer) {\n this.tracer.trace(entry);\n }\n }\n}\n","/**\n * Mode handlers exports\n */\n\nexport * from './mode-handler';\nexport { ExecuteModeHandler } from './execute-mode-handler';\nexport { PlanModeHandler } from './plan-mode-handler';\nexport { createPlanRuntimeProfile } from './plan-profile';\nexport { PlanOutputValidator } from './plan-output-validator';\nexport { PlanArtifactWriter } from './plan-artifact-writer';\nexport { createPlanResultMapper } from './plan-result-mapper';\nexport { EditModeHandler } from './edit-mode-handler';\nexport { DebugModeHandler } from './debug-mode-handler';\nexport { SpecModeHandler } from './spec-mode-handler';\nexport {\n ModeRegistry,\n modeRegistry,\n getModeHandlerFromRegistry,\n} from './mode-registry';\nexport type { ModeHandlerFactory, ModeRegistration, RegisterOptions } from './mode-registry';\n","export type ExecutionPhase =\n | 'init'\n | 'scoping'\n | 'planning_lite'\n | 'executing'\n | 'converging'\n | 'verifying'\n | 'reporting'\n | 'completed'\n | 'failed';\n\ntype PhaseTransition = {\n from: ExecutionPhase;\n to: ExecutionPhase;\n timestamp: string;\n reason?: string;\n};\n\nconst ALLOWED_TRANSITIONS: Record<ExecutionPhase, ExecutionPhase[]> = {\n init: ['scoping', 'planning_lite', 'executing', 'failed'],\n scoping: ['planning_lite', 'executing', 'failed'],\n planning_lite: ['executing', 'failed'],\n executing: ['converging', 'verifying', 'reporting', 'failed'],\n converging: ['executing', 'verifying', 'reporting', 'failed'],\n verifying: ['reporting', 'failed'],\n reporting: ['completed', 'failed'],\n completed: [],\n failed: [],\n};\n\nexport class ExecutionStateMachine {\n private current: ExecutionPhase = 'init';\n private transitions: PhaseTransition[] = [];\n private enteredAt = new Map<ExecutionPhase, number>([['init', Date.now()]]);\n private durationsMs = new Map<ExecutionPhase, number>();\n\n getCurrent(): ExecutionPhase {\n return this.current;\n }\n\n getTransitions(): PhaseTransition[] {\n return [...this.transitions];\n }\n\n transition(to: ExecutionPhase, reason?: string): void {\n if (to === this.current) {\n return;\n }\n\n const allowed = ALLOWED_TRANSITIONS[this.current];\n if (!allowed.includes(to)) {\n throw new Error(`Invalid state transition: ${this.current} -> ${to}`);\n }\n\n const now = Date.now();\n const entered = this.enteredAt.get(this.current);\n if (entered != null) {\n const elapsed = now - entered;\n this.durationsMs.set(this.current, (this.durationsMs.get(this.current) ?? 0) + elapsed);\n }\n\n this.transitions.push({\n from: this.current,\n to,\n timestamp: new Date(now).toISOString(),\n reason,\n });\n\n this.current = to;\n this.enteredAt.set(to, now);\n }\n\n getPhaseDurationsMs(now = Date.now()): Record<ExecutionPhase, number> {\n const out: Record<ExecutionPhase, number> = {\n init: this.durationsMs.get('init') ?? 0,\n scoping: this.durationsMs.get('scoping') ?? 0,\n planning_lite: this.durationsMs.get('planning_lite') ?? 0,\n executing: this.durationsMs.get('executing') ?? 0,\n converging: this.durationsMs.get('converging') ?? 0,\n verifying: this.durationsMs.get('verifying') ?? 0,\n reporting: this.durationsMs.get('reporting') ?? 0,\n completed: this.durationsMs.get('completed') ?? 0,\n failed: this.durationsMs.get('failed') ?? 0,\n };\n\n const entered = this.enteredAt.get(this.current);\n if (entered != null) {\n out[this.current] += now - entered;\n }\n\n return out;\n }\n}\n\n","export type StepStatus = 'pending' | 'done' | 'failed';\n\nexport type CapabilityType =\n | 'discover_resource'\n | 'read_resource'\n | 'mutate_resource'\n | 'execute_command'\n | 'memory_access'\n | 'progress_tracking'\n | 'finalize_result'\n | 'integrate_external'\n | 'general_action';\n\nexport type LedgerStep = {\n id: string;\n goal: string;\n capability: CapabilityType;\n toolName?: string;\n status: StepStatus;\n startedAt: string;\n completedAt?: string;\n durationMs?: number;\n error?: string;\n evidence?: string;\n};\n\nexport class TaskLedger {\n private steps: LedgerStep[] = [];\n private activeById = new Map<string, number>();\n private counter = 0;\n\n startStep(params: {\n goal: string;\n capability: CapabilityType;\n toolName?: string;\n }): string {\n this.counter += 1;\n const id = `ledger-step-${this.counter}`;\n const step: LedgerStep = {\n id,\n goal: params.goal,\n capability: params.capability,\n toolName: params.toolName,\n status: 'pending',\n startedAt: new Date().toISOString(),\n };\n this.steps.push(step);\n this.activeById.set(id, this.steps.length - 1);\n return id;\n }\n\n completeStep(stepId: string, evidence?: string): void {\n const idx = this.activeById.get(stepId);\n if (idx == null) {\n return;\n }\n const step = this.steps[idx]!;\n const completedAt = new Date().toISOString();\n step.status = 'done';\n step.completedAt = completedAt;\n step.evidence = evidence;\n step.durationMs = new Date(completedAt).getTime() - new Date(step.startedAt).getTime();\n this.activeById.delete(stepId);\n }\n\n failStep(stepId: string, error: string): void {\n const idx = this.activeById.get(stepId);\n if (idx == null) {\n return;\n }\n const step = this.steps[idx]!;\n const completedAt = new Date().toISOString();\n step.status = 'failed';\n step.completedAt = completedAt;\n step.error = error;\n step.durationMs = new Date(completedAt).getTime() - new Date(step.startedAt).getTime();\n this.activeById.delete(stepId);\n }\n\n getSummary(): {\n totalSteps: number;\n completedSteps: number;\n failedSteps: number;\n pendingSteps: number;\n avgStepDurationMs: number;\n capabilityUsage: Record<CapabilityType, number>;\n } {\n const capabilityUsage: Record<CapabilityType, number> = {\n discover_resource: 0,\n read_resource: 0,\n mutate_resource: 0,\n execute_command: 0,\n memory_access: 0,\n progress_tracking: 0,\n finalize_result: 0,\n integrate_external: 0,\n general_action: 0,\n };\n\n let completedSteps = 0;\n let failedSteps = 0;\n let pendingSteps = 0;\n let durationTotal = 0;\n let durationCount = 0;\n\n for (const step of this.steps) {\n capabilityUsage[step.capability] += 1;\n\n if (step.status === 'done') {\n completedSteps += 1;\n } else if (step.status === 'failed') {\n failedSteps += 1;\n } else {\n pendingSteps += 1;\n }\n\n if (step.durationMs != null && step.durationMs >= 0) {\n durationTotal += step.durationMs;\n durationCount += 1;\n }\n }\n\n return {\n totalSteps: this.steps.length,\n completedSteps,\n failedSteps,\n pendingSteps,\n avgStepDurationMs: durationCount > 0 ? Math.round(durationTotal / durationCount) : 0,\n capabilityUsage,\n };\n }\n}\n\nexport function mapToolToCapability(toolName: string): CapabilityType {\n if (toolName === 'report') {\n return 'finalize_result';\n }\n if (toolName.startsWith('todo_')) {\n return 'progress_tracking';\n }\n if (toolName.startsWith('memory_')) {\n return 'memory_access';\n }\n if (toolName === 'shell_exec') {\n return 'execute_command';\n }\n if (toolName.startsWith('fs_')) {\n if (toolName === 'fs_read' || toolName === 'fs_list') {\n return 'read_resource';\n }\n return 'mutate_resource';\n }\n if (toolName.includes('search') || toolName.includes('find')) {\n return 'discover_resource';\n }\n if (toolName.includes('mcp') || toolName.startsWith('plugin_')) {\n return 'integrate_external';\n }\n return 'general_action';\n}\n\n","import type { LLMTier } from '@kb-labs/agent-contracts';\n\nexport interface AgentBehaviorPolicy {\n retrieval: {\n minReadWindowLines: number;\n maxConsecutiveSmallWindowReadsPerFile: number;\n smallFileReadAllThresholdLines: number;\n };\n noResult: {\n minIterationsBeforeConclusion: number;\n maxConsecutiveNoSignalSearchByTier: Record<LLMTier, number>;\n };\n evidence: {\n minFilesReadForInformational: number;\n minEvidenceDensityForInformational: number;\n minInformationalResponseChars: number;\n };\n}\n\nexport function createDefaultAgentBehaviorPolicy(): AgentBehaviorPolicy {\n return {\n retrieval: {\n minReadWindowLines: 60,\n maxConsecutiveSmallWindowReadsPerFile: 3,\n smallFileReadAllThresholdLines: 400,\n },\n noResult: {\n minIterationsBeforeConclusion: 2,\n maxConsecutiveNoSignalSearchByTier: {\n small: 2,\n medium: 2,\n large: 3,\n },\n },\n evidence: {\n minFilesReadForInformational: 1,\n minEvidenceDensityForInformational: 0.2,\n minInformationalResponseChars: 180,\n },\n };\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nexport interface WorkspaceRepoNode {\n name: string;\n path: string;\n reasons: string[];\n /** Package names found inside each repo */\n packages: string[];\n /** Top-level directory names */\n dirs: string[];\n}\n\nexport interface WorkspaceDiscoveryResult {\n rootDir: string;\n repos: WorkspaceRepoNode[];\n}\n\nfunction parsePackageJsonWorkspaces(packageJsonPath: string): string[] {\n try {\n const raw = fs.readFileSync(packageJsonPath, 'utf-8');\n const parsed = JSON.parse(raw) as { workspaces?: string[] | { packages?: string[] } };\n if (Array.isArray(parsed.workspaces)) {\n return parsed.workspaces;\n }\n if (Array.isArray(parsed.workspaces?.packages)) {\n return parsed.workspaces.packages;\n }\n } catch {\n // Ignore malformed package.json; discovery is best-effort.\n }\n return [];\n}\n\nfunction normalizeGlobLike(input: string): string {\n return input.replace(/\\/\\*\\*\\/\\*$/g, '').replace(/\\/\\*$/g, '').replace(/^\\.\\//, '');\n}\n\n/** Scan packages/ subdirectories for package names (from package.json \"name\" field). */\nfunction discoverPackageNames(repoPath: string): string[] {\n const packagesDir = path.join(repoPath, 'packages');\n try {\n const entries = fs.readdirSync(packagesDir, { withFileTypes: true });\n const names: string[] = [];\n for (const entry of entries) {\n if (!entry.isDirectory() || entry.name.startsWith('.')) {continue;}\n try {\n const pkgJson = JSON.parse(fs.readFileSync(path.join(packagesDir, entry.name, 'package.json'), 'utf-8')) as { name?: string };\n if (pkgJson.name) {names.push(pkgJson.name);}\n } catch { /* skip */ }\n }\n return names;\n } catch {\n // No packages/ directory — check root package.json\n try {\n const pkgJson = JSON.parse(fs.readFileSync(path.join(repoPath, 'package.json'), 'utf-8')) as { name?: string };\n return pkgJson.name ? [pkgJson.name] : [];\n } catch {\n return [];\n }\n }\n}\n\n/** List top-level directory names inside a repo. */\nfunction discoverTopLevelDirs(repoPath: string): string[] {\n try {\n return fs.readdirSync(repoPath, { withFileTypes: true })\n .filter(e => e.isDirectory() && !e.name.startsWith('.') && e.name !== 'node_modules' && e.name !== 'dist')\n .map(e => e.name);\n } catch {\n return [];\n }\n}\n\nfunction addRepo(\n map: Map<string, WorkspaceRepoNode>,\n rootDir: string,\n repoPath: string,\n reason: string\n): void {\n const abs = path.isAbsolute(repoPath) ? repoPath : path.resolve(rootDir, repoPath);\n let stat: fs.Stats;\n try {\n stat = fs.statSync(abs);\n } catch {\n return;\n }\n if (!stat.isDirectory()) {\n return;\n }\n\n const key = path.normalize(abs);\n const name = path.basename(abs);\n const existing = map.get(key);\n if (existing) {\n if (!existing.reasons.includes(reason)) {\n existing.reasons.push(reason);\n }\n return;\n }\n\n map.set(key, {\n name,\n path: abs,\n reasons: [reason],\n packages: discoverPackageNames(abs),\n dirs: discoverTopLevelDirs(abs),\n });\n}\n\nexport async function discoverWorkspace(rootDir: string): Promise<WorkspaceDiscoveryResult> {\n const repoMap = new Map<string, WorkspaceRepoNode>();\n\n addRepo(repoMap, rootDir, rootDir, 'workspace_root');\n\n const packageJsonPath = path.join(rootDir, 'package.json');\n const workspaceGlobs = parsePackageJsonWorkspaces(packageJsonPath);\n for (const raw of workspaceGlobs) {\n const candidate = normalizeGlobLike(raw);\n if (!candidate) {\n continue;\n }\n const base = path.resolve(rootDir, candidate);\n try {\n const entries = fs.readdirSync(base, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory() || entry.name.startsWith('.')) {\n continue;\n }\n addRepo(repoMap, rootDir, path.join(base, entry.name), 'workspace_glob');\n }\n } catch {\n addRepo(repoMap, rootDir, base, 'workspace_path');\n }\n }\n\n const gitModulesPath = path.join(rootDir, '.gitmodules');\n if (fs.existsSync(gitModulesPath)) {\n try {\n const content = fs.readFileSync(gitModulesPath, 'utf-8');\n const matches = content.matchAll(/^\\s*path\\s*=\\s*(.+)\\s*$/gm);\n for (const match of matches) {\n const submodulePath = match[1]?.trim();\n if (submodulePath) {\n addRepo(repoMap, rootDir, submodulePath, 'git_submodule');\n }\n }\n } catch {\n // Ignore malformed .gitmodules.\n }\n }\n\n // Detect nested repositories one level deep.\n try {\n const entries = fs.readdirSync(rootDir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory() || entry.name.startsWith('.')) {\n continue;\n }\n const child = path.join(rootDir, entry.name);\n if (fs.existsSync(path.join(child, '.git'))) {\n addRepo(repoMap, rootDir, child, 'nested_git');\n }\n }\n } catch {\n // Best effort.\n }\n\n return {\n rootDir,\n repos: Array.from(repoMap.values())\n .sort((a, b) => a.path.localeCompare(b.path)),\n };\n}\n","/**\n * StopConditionEvaluator — deterministic evaluation of all stop conditions.\n *\n * Checks ALL conditions in a single pass and returns the highest-priority match.\n * Priority order: abort > report-complete > hard-budget > max-iterations > loop > no-tool-calls.\n *\n * Fixes bug: previously isLastIteration with tool calls (agent.ts:1247) triggered forced\n * synthesis BEFORE checking for report tool (agent.ts:1462). Now REPORT_COMPLETE has\n * priority 1 while MAX_ITERATIONS has priority 3.\n *\n * Custom SDK conditions are evaluated alongside built-ins. Priority >= 10 is reserved\n * for custom conditions (built-ins use 0–5).\n */\n\nimport { StopPriority } from '@kb-labs/agent-contracts';\nimport type { StopConditionResult } from '@kb-labs/agent-contracts';\nimport type { StopCondition as SDKStopCondition, RunContext, LLMCallResult } from '@kb-labs/agent-sdk';\n\n/**\n * Minimal interface for LLM response — only what StopConditionEvaluator needs.\n */\nexport interface StopEvalResponse {\n toolCalls?: Array<{ name: string; input?: Record<string, unknown> }>;\n content?: string;\n}\n\n/**\n * Context needed to evaluate stop conditions.\n */\nexport interface StopEvalContext {\n /** Current iteration (0-based) */\n iteration: number;\n /** Maximum allowed iterations */\n maxIterations: number;\n /** AbortSignal from user / parent agent */\n abortSignal?: AbortSignal;\n /** Total tokens consumed so far */\n totalTokens: number;\n /** Hard token limit (0 = no limit) */\n hardTokenLimit: number;\n /** Whether a loop was detected this iteration */\n loopDetected: boolean;\n}\n\n/**\n * Individual stop condition checker.\n */\ninterface StopCondition {\n priority: StopPriority;\n check(ctx: StopEvalContext, response: StopEvalResponse): StopConditionResult | null;\n}\n\n// ═══════════════════════════════════════════════════════════════════════\n// Individual Conditions\n// ═══════════════════════════════════════════════════════════════════════\n\nconst abortSignalCondition: StopCondition = {\n priority: StopPriority.ABORT_SIGNAL,\n check(ctx) {\n if (ctx.abortSignal?.aborted) {\n return {\n priority: StopPriority.ABORT_SIGNAL,\n reason: 'Execution aborted by user or parent agent',\n reasonCode: 'abort_signal',\n };\n }\n return null;\n },\n};\n\nconst reportCompleteCondition: StopCondition = {\n priority: StopPriority.REPORT_COMPLETE,\n check(_ctx, response) {\n const reportCall = response.toolCalls?.find(tc => tc.name === 'report');\n if (reportCall) {\n const input = reportCall.input as Record<string, unknown> | undefined;\n return {\n priority: StopPriority.REPORT_COMPLETE,\n reason: 'Agent called report tool — task complete',\n reasonCode: 'report_complete',\n metadata: {\n answer: input?.answer,\n confidence: input?.confidence,\n },\n };\n }\n return null;\n },\n};\n\nconst hardBudgetCondition: StopCondition = {\n priority: StopPriority.HARD_BUDGET,\n check(ctx) {\n if (ctx.hardTokenLimit > 0 && ctx.totalTokens >= ctx.hardTokenLimit) {\n return {\n priority: StopPriority.HARD_BUDGET,\n reason: `Token hard limit reached (${ctx.totalTokens}/${ctx.hardTokenLimit})`,\n reasonCode: 'hard_budget',\n metadata: {\n totalTokens: ctx.totalTokens,\n hardLimit: ctx.hardTokenLimit,\n },\n };\n }\n return null;\n },\n};\n\nconst maxIterationsCondition: StopCondition = {\n priority: StopPriority.MAX_ITERATIONS,\n check(ctx) {\n if (ctx.iteration >= ctx.maxIterations - 1) {\n return {\n priority: StopPriority.MAX_ITERATIONS,\n reason: `Maximum iterations reached (${ctx.maxIterations})`,\n reasonCode: 'max_iterations',\n metadata: {\n iteration: ctx.iteration,\n maxIterations: ctx.maxIterations,\n },\n };\n }\n return null;\n },\n};\n\nconst loopDetectedCondition: StopCondition = {\n priority: StopPriority.LOOP_DETECTED,\n check(ctx) {\n if (ctx.loopDetected) {\n return {\n priority: StopPriority.LOOP_DETECTED,\n reason: 'Agent is stuck in a tool call loop',\n reasonCode: 'loop_detected',\n };\n }\n return null;\n },\n};\n\nconst noToolCallsCondition: StopCondition = {\n priority: StopPriority.NO_TOOL_CALLS,\n check(_ctx, response) {\n if (!response.toolCalls || response.toolCalls.length === 0) {\n return {\n priority: StopPriority.NO_TOOL_CALLS,\n reason: 'Agent produced no tool calls — implicit completion',\n reasonCode: 'no_tool_calls',\n };\n }\n return null;\n },\n};\n\n// ═══════════════════════════════════════════════════════════════════════\n// Evaluator\n// ═══════════════════════════════════════════════════════════════════════\n\n/**\n * All conditions in registration order (order doesn't matter — priority is numeric).\n */\nconst ALL_CONDITIONS: StopCondition[] = [\n abortSignalCondition,\n reportCompleteCondition,\n hardBudgetCondition,\n maxIterationsCondition,\n loopDetectedCondition,\n noToolCallsCondition,\n];\n\n/**\n * Evaluate all stop conditions and return the highest-priority match (if any).\n *\n * Returns null if no stop condition fires (execution should continue).\n */\nexport function evaluateStopConditions(\n ctx: StopEvalContext,\n response: StopEvalResponse,\n): StopConditionResult | null {\n let best: StopConditionResult | null = null;\n\n for (const condition of ALL_CONDITIONS) {\n const result = condition.check(ctx, response);\n if (result && (best === null || result.priority < best.priority)) {\n best = result;\n }\n }\n\n return best;\n}\n\n/**\n * StopConditionEvaluator class — stateless, injectable for testing.\n *\n * Pass custom `StopCondition[]` from agent-sdk (via AgentSDK.addStopCondition()) to\n * extend evaluation with user-defined conditions. Built-in conditions use priorities 0–5;\n * custom conditions should use priority >= 10 to avoid overriding built-ins.\n */\nexport class StopConditionEvaluator {\n private readonly customConditions: SDKStopCondition[];\n\n constructor(customConditions: SDKStopCondition[] = []) {\n this.customConditions = customConditions;\n }\n\n evaluate(\n ctx: StopEvalContext,\n response: StopEvalResponse,\n /** Full RunContext — passed to SDK custom conditions (optional for backward compat) */\n runCtx?: RunContext,\n /** Full LLM result — passed to SDK custom conditions (optional for backward compat) */\n llmResult?: LLMCallResult,\n ): StopConditionResult | null {\n let best: StopConditionResult | null = evaluateStopConditions(ctx, response);\n\n // Evaluate custom SDK conditions if we have the rich context\n if (this.customConditions.length > 0 && runCtx && llmResult) {\n for (const condition of this.customConditions) {\n const result = condition.evaluate(runCtx, llmResult);\n if (result && (best === null || result.priority < best.priority)) {\n best = result;\n }\n }\n }\n\n return best;\n }\n}\n","/**\n * ExecutionLoop — the core iteration engine for Agent v2.\n *\n * Extracted from agent.ts `executeWithTier()` (lines 942–1650).\n * Uses a callback-based LoopContext so the loop has no direct dependency\n * on the Agent class itself (enabling independent unit testing).\n *\n * Key improvements over the agent.ts loop:\n * 1. Returns LoopResult<T> — never throws TierEscalationSignal\n * 2. Integrates StopConditionEvaluator for priority-based stop ordering\n * 3. Supports ControlAction ('continue'|'stop'|'escalate') from guards\n * 4. Iteration budget extension is supported via extendBudget callback\n *\n * Strangler fig pattern: agent.ts still owns the loop today.\n * This class is built and tested in isolation first, then wired in.\n */\n\nimport type { LoopResult, StopConditionResult } from '@kb-labs/agent-contracts';\nimport { StopPriority } from '@kb-labs/agent-contracts';\nimport { StopConditionEvaluator } from './stop-conditions.js';\nimport type { StopEvalContext } from './stop-conditions.js';\n\n// ═══════════════════════════════════════════════════════════════════════\n// Public interfaces\n// ═══════════════════════════════════════════════════════════════════════\n\n/**\n * A single LLM response — tool calls or final content.\n */\nexport interface LoopLLMResponse {\n content: string;\n toolCalls?: LoopToolCall[];\n /** Token counts for this turn */\n usage?: { promptTokens: number; completionTokens: number };\n}\n\nexport interface LoopToolCall {\n id: string;\n name: string;\n input: Record<string, unknown>;\n}\n\nexport interface LoopToolResult {\n toolCallId: string;\n output: string;\n isError?: boolean;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Per-iteration snapshot passed to most callbacks.\n */\nexport interface IterationContext {\n iteration: number;\n maxIterations: number;\n totalTokens: number;\n isLastIteration: boolean;\n}\n\n/**\n * Everything the loop needs — implemented by the Agent (or a test stub).\n *\n * Callbacks are kept minimal: only what changes behaviour.\n * Side-effect-only hooks (tracing, metrics, events) are optional.\n */\nexport interface LoopContext<TResult> {\n /** Initial max iterations. Loop may call extendBudget() to raise this. */\n maxIterations: number;\n\n // ── Core callbacks ─────────────────────────────────────────────────\n\n /**\n * Called once per iteration to get the LLM response.\n * Receives accumulated token count for budget decisions.\n */\n callLLM(ctx: IterationContext): Promise<LoopLLMResponse>;\n\n /**\n * Execute all tool calls for this iteration.\n * Returns results in the same order as calls.\n */\n executeTools(\n calls: LoopToolCall[],\n ctx: IterationContext,\n ): Promise<LoopToolResult[]>;\n\n /**\n * Build the final TaskResult from a report call or natural stop.\n */\n buildResult(\n answer: string,\n ctx: IterationContext,\n reasonCode: string,\n ): Promise<TResult>;\n\n // ── Stop condition inputs ───────────────────────────────────────────\n\n /**\n * True when the agent's AbortController has been signalled.\n */\n isAborted(): boolean;\n\n /**\n * Returns the report answer if any tool call in the list is 'report'.\n * Returns undefined otherwise.\n */\n extractReportAnswer(calls: LoopToolCall[]): string | undefined;\n\n /**\n * Returns the reason string if the same tool calls have looped 3x.\n */\n detectLoop(calls: LoopToolCall[]): string | undefined;\n\n /**\n * Returns the escalation reason if the loop should escalate tier.\n * Called after tool execution each iteration.\n */\n evaluateEscalation(ctx: IterationContext): { shouldEscalate: boolean; reason: string } | null;\n\n /**\n * Token hard limit: returns stop reason if limit is exceeded.\n * Called before LLM call each iteration.\n */\n checkHardTokenLimit(totalTokens: number): string | undefined;\n\n // ── Budget extension ────────────────────────────────────────────────\n\n /**\n * Called after tool execution. May return a higher budget than current.\n * Return current maxIterations to keep unchanged.\n */\n extendBudget(ctx: IterationContext): number;\n\n // ── Optional side-effect hooks ──────────────────────────────────────\n\n /** Called at the start of each iteration (for events/tracing). */\n onIterationStart?(ctx: IterationContext): void;\n\n /** Called at the end of each iteration (for events/tracing). */\n onIterationEnd?(ctx: IterationContext, hadToolCalls: boolean): void;\n\n /** Called when a stop condition fires. */\n onStop?(condition: StopConditionResult, ctx: IterationContext): void;\n\n /** Called when token count updates after LLM response. */\n onTokensConsumed?(delta: number, total: number): void;\n}\n\n// ═══════════════════════════════════════════════════════════════════════\n// ExecutionLoop\n// ═══════════════════════════════════════════════════════════════════════\n\n/**\n * Runs the agent iteration loop and returns a LoopResult.\n *\n * Never throws — tier escalation is returned as `{ outcome: 'escalate' }`.\n * All other errors are caught and returned as `{ outcome: 'complete', result: failureResult }`.\n */\nexport class ExecutionLoop<TResult> {\n private readonly ctx: LoopContext<TResult>;\n private readonly evaluator: StopConditionEvaluator;\n\n constructor(ctx: LoopContext<TResult>) {\n this.ctx = ctx;\n this.evaluator = new StopConditionEvaluator();\n }\n\n async run(): Promise<LoopResult<TResult>> {\n let maxIterations = this.ctx.maxIterations;\n let totalTokens = 0;\n\n for (let iteration = 1; iteration <= maxIterations; iteration++) {\n const iterCtx: IterationContext = {\n iteration,\n maxIterations,\n totalTokens,\n isLastIteration: iteration === maxIterations,\n };\n\n this.ctx.onIterationStart?.(iterCtx);\n\n try {\n // ── Pre-LLM: hard token limit ─────────────────────────────────\n const hardLimitReason = this.ctx.checkHardTokenLimit(totalTokens);\n if (hardLimitReason) {\n const condition: StopConditionResult = {\n priority: StopPriority.HARD_BUDGET,\n reason: hardLimitReason,\n reasonCode: 'hard_token_limit',\n };\n this.ctx.onStop?.(condition, iterCtx);\n const result = await this.ctx.buildResult(hardLimitReason, iterCtx, 'hard_token_limit');\n return { outcome: 'complete', result };\n }\n\n // ── Abort check ───────────────────────────────────────────────\n if (this.ctx.isAborted()) {\n const condition: StopConditionResult = {\n priority: StopPriority.ABORT_SIGNAL,\n reason: 'Execution aborted',\n reasonCode: 'abort_signal',\n };\n this.ctx.onStop?.(condition, iterCtx);\n const result = await this.ctx.buildResult('Execution aborted', iterCtx, 'abort_signal');\n return { outcome: 'complete', result };\n }\n\n // ── LLM call ─────────────────────────────────────────────────\n const response = await this.ctx.callLLM(iterCtx);\n\n // Account for tokens\n if (response.usage) {\n const delta = response.usage.promptTokens + response.usage.completionTokens;\n totalTokens += delta;\n this.ctx.onTokensConsumed?.(delta, totalTokens);\n }\n\n const toolCalls = response.toolCalls ?? [];\n\n // ── Pre-tool stop conditions (REPORT_COMPLETE and NO_TOOL_CALLS) ─\n // MAX_ITERATIONS is handled after tool execution (below) to match\n // agent.ts semantics: last iteration still runs its tools first.\n //\n // Priority order (from StopPriority):\n // REPORT_COMPLETE (1) > NO_TOOL_CALLS (5)\n // REPORT_COMPLETE takes precedence even when there are no other tool calls.\n\n const reportAnswer = this.ctx.extractReportAnswer(toolCalls);\n\n if (reportAnswer !== undefined) {\n // REPORT_COMPLETE — highest pre-tool priority\n const condition: StopConditionResult = {\n priority: StopPriority.REPORT_COMPLETE,\n reason: 'Agent called report tool',\n reasonCode: 'report_complete',\n metadata: { answer: reportAnswer },\n };\n this.ctx.onStop?.(condition, iterCtx);\n this.ctx.onIterationEnd?.(iterCtx, true);\n const result = await this.ctx.buildResult(reportAnswer, iterCtx, 'report_complete');\n return { outcome: 'complete', result };\n }\n\n if (toolCalls.length === 0) {\n // NO_TOOL_CALLS — LLM is done, natural stop\n const condition: StopConditionResult = {\n priority: StopPriority.NO_TOOL_CALLS,\n reason: 'LLM produced no tool calls',\n reasonCode: 'no_tool_calls',\n };\n this.ctx.onStop?.(condition, iterCtx);\n this.ctx.onIterationEnd?.(iterCtx, false);\n const result = await this.ctx.buildResult(response.content, iterCtx, 'no_tool_calls');\n return { outcome: 'complete', result };\n }\n\n // Build eval context for potential future use (tracing, analytics)\n const _evalCtx: StopEvalContext = {\n iteration,\n maxIterations,\n totalTokens,\n hardTokenLimit: 0,\n loopDetected: false,\n };\n void _evalCtx; // consumed by analytics middleware in full integration\n\n // ── Tool execution ────────────────────────────────────────────\n const toolResults = await this.ctx.executeTools(toolCalls, iterCtx);\n\n // ── Post-tool: loop detection ─────────────────────────────────\n const loopReason = this.ctx.detectLoop(toolCalls);\n if (loopReason) {\n const condition: StopConditionResult = {\n priority: StopPriority.LOOP_DETECTED,\n reason: loopReason,\n reasonCode: 'loop_detected',\n };\n this.ctx.onStop?.(condition, iterCtx);\n this.ctx.onIterationEnd?.(iterCtx, true);\n const result = await this.ctx.buildResult(loopReason, iterCtx, 'loop_detected');\n return { outcome: 'complete', result };\n }\n\n // ── Post-tool: escalation check ───────────────────────────────\n const escalation = this.ctx.evaluateEscalation(iterCtx);\n if (escalation?.shouldEscalate) {\n this.ctx.onIterationEnd?.(iterCtx, true);\n return { outcome: 'escalate', reason: escalation.reason };\n }\n\n // ── Budget extension (must happen before isLastIteration check) ─\n const newBudget = this.ctx.extendBudget(iterCtx);\n if (newBudget > maxIterations) {\n maxIterations = newBudget;\n }\n\n // ── Post-tool: max iterations on last iteration ───────────────\n // On the last iteration, after tool execution (and possible budget extension),\n // stop the loop. (agent.ts: isLastIteration → forceSynthesisFromHistory)\n // Recompute isLastIteration since maxIterations may have been extended.\n if (iteration >= maxIterations) {\n const condition: StopConditionResult = {\n priority: StopPriority.MAX_ITERATIONS,\n reason: `Maximum iterations (${maxIterations}) reached`,\n reasonCode: 'max_iterations',\n };\n this.ctx.onStop?.(condition, iterCtx);\n this.ctx.onIterationEnd?.(iterCtx, true);\n const result = await this.ctx.buildResult(response.content, iterCtx, 'max_iterations');\n return { outcome: 'complete', result };\n }\n\n this.ctx.onIterationEnd?.(iterCtx, true);\n\n // Suppress unused variable warning (toolResults consumed by agent via callbacks)\n void toolResults;\n } catch (error) {\n // Errors in iteration don't escape — return failure result\n const msg = error instanceof Error ? error.message : String(error);\n const result = await this.ctx.buildResult(\n `Error in iteration ${iteration}: ${msg}`,\n { ...iterCtx, isLastIteration: true },\n 'iteration_error',\n );\n return { outcome: 'complete', result };\n }\n }\n\n // Exhausted all iterations\n const finalCtx: IterationContext = {\n iteration: maxIterations,\n maxIterations,\n totalTokens,\n isLastIteration: true,\n };\n const result = await this.ctx.buildResult(\n `Max iterations (${maxIterations}) reached without completion`,\n finalCtx,\n 'max_iterations_exhausted',\n );\n return { outcome: 'complete', result };\n }\n}\n","/**\n * LinearExecutionLoop — SDK-native implementation of ExecutionLoop.\n *\n * Implements the agent-sdk ExecutionLoop interface:\n * run(ctx: LoopContext): Promise<LoopResult>\n *\n * LoopContext (from agent-sdk) provides only infrastructure primitives:\n * - run: RunContext — shared run state\n * - appendMessage() — only way to mutate message history\n * - callLLM() — LLM call with middleware pipeline applied\n * - executeTools() — tool execution with guards + processors applied\n *\n * All business logic (stop detection, report extraction, loop detection)\n * lives here — not in LoopContext. This keeps the contract minimal.\n *\n * Stop priority order (lower number = higher priority):\n * 0 ABORT — abortSignal fired\n * 1 REPORT — agent called the report tool\n * 2 HARD_BUDGET — token hard limit (via BudgetMiddleware metadata)\n * 3 MAX_ITER — hit maxIterations\n * 4 LOOP — same 3 tool calls repeated twice\n * 5 NO_TOOLS — LLM returned no tool calls (natural completion)\n *\n * Returns LoopOutput — AgentRunner builds the full TaskResult from it.\n */\n\nimport type { IterationSnapshot } from '@kb-labs/agent-contracts';\nimport type { ExecutionLoop, LoopContext, LoopResult, LoopOutput, LLMCallResult, ToolCallInput } from '@kb-labs/agent-sdk';\n\n// ─── Canonical JSON serialization ────────────────────────────────────────────\n// JSON.stringify has non-deterministic key order across JS engines.\n// canonicalJson sorts object keys recursively for stable loop-detection signatures.\n\nfunction canonicalJson(value: unknown): string {\n if (value === null || typeof value !== 'object') {return JSON.stringify(value);}\n if (Array.isArray(value)) {return '[' + value.map(canonicalJson).join(',') + ']';}\n const keys = Object.keys(value as object).sort();\n return '{' + keys.map(k => JSON.stringify(k) + ':' + canonicalJson((value as Record<string, unknown>)[k])).join(',') + '}';\n}\n\n// ─── Internal stop priorities ─────────────────────────────────────────────────\n\nconst PRIORITY = {\n ABORT: 0,\n REPORT: 1,\n HARD_BUDGET: 2,\n MAX_ITER: 3,\n LOOP: 4,\n NO_TOOLS: 5,\n} as const;\n\ninterface StopResult {\n priority: number;\n reasonCode: string;\n reason: string;\n answer?: string;\n metadata?: Record<string, unknown>;\n}\n\n// ─── Loop detection helper ────────────────────────────────────────────────────\n\nclass LoopDetector {\n private readonly history: string[] = [];\n private readonly windowSize: number;\n\n constructor(windowSize = 6) {\n this.windowSize = windowSize;\n }\n\n /** Record tool calls and return true if a repeat pattern is detected. */\n check(calls: ToolCallInput[]): boolean {\n // Normalize pagination params so that repeated scans with different offsets are detected\n const sig = calls.map(c => {\n const normalized = { ...c.input as Record<string, unknown> };\n delete normalized['offset'];\n delete normalized['limit'];\n return `${c.name}:${canonicalJson(normalized)}`;\n }).join('|');\n this.history.push(sig);\n if (this.history.length > this.windowSize) {\n this.history.shift();\n }\n\n if (this.history.length < this.windowSize) {return false;}\n\n const half = this.windowSize / 2;\n const last = this.history.slice(-half).join('>>>');\n const prev = this.history.slice(-this.windowSize, -half).join('>>>');\n return last === prev;\n }\n}\n\n// ─── LinearExecutionLoop ──────────────────────────────────────────────────────\n\nexport class LinearExecutionLoop implements ExecutionLoop {\n async run(ctx: LoopContext): Promise<LoopResult> {\n const { run } = ctx;\n const loopDetector = new LoopDetector();\n let totalTokens = 0;\n\n for (let i = 0; i < run.maxIterations; i++) {\n run.iteration = i + 1;\n\n // ── Abort check ──────────────────────────────────────────────────────────\n if (run.abortSignal.aborted || run.aborted) {\n return complete({\n priority: PRIORITY.ABORT,\n reasonCode: 'abort_signal',\n reason: 'Execution aborted',\n });\n }\n\n // ── Middleware beforeIteration ──────────────────────────────────────────\n const action = await ctx.beforeIteration();\n if (action === 'stop') {\n return complete({\n priority: PRIORITY.HARD_BUDGET,\n reasonCode: 'middleware_stop',\n reason: 'Middleware requested stop',\n });\n }\n if (action === 'escalate') {\n return { outcome: 'escalate', reason: 'Middleware requested tier escalation' };\n }\n\n // ── Hard budget (set by BudgetMiddleware via meta) ───────────────────────\n if (run.meta.get<boolean>('budget', 'exhausted')) {\n return complete({\n priority: PRIORITY.HARD_BUDGET,\n reasonCode: 'hard_budget',\n reason: run.meta.get<string>('budget', 'exhaustedReason') ?? 'Token budget exhausted',\n });\n }\n\n // ── LLM call ──────────────────────────────────────────────────────────────\n let response: LLMCallResult;\n try {\n response = await ctx.callLLM();\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return failure(`LLM call failed: ${msg}`);\n }\n\n // Track tokens (BudgetMiddleware reads RunContext.meta independently)\n if (response.usage) {\n totalTokens += response.usage.promptTokens + response.usage.completionTokens;\n run.meta.set('loop', 'totalTokens', totalTokens);\n }\n\n const toolCalls = response.toolCalls ?? [];\n\n // ── Report tool (priority 1 — always wins post-LLM) ─────────────────────\n const reportStop = extractReport(response);\n if (reportStop) {\n // Execute the report tool through middleware so tool:start/tool:end events\n // are emitted — plan-mode-handler and session tracing depend on them.\n const reportCall = response.toolCalls?.find(tc => tc.name === 'report');\n if (reportCall) {\n const reportInput: ToolCallInput = {\n id: reportCall.id,\n name: reportCall.name,\n input: reportCall.input,\n };\n let reportBlocked = false;\n let reportMetadata: Record<string, unknown> | undefined;\n try {\n const toolResults = await ctx.executeTools([reportInput]);\n // If report tool returned success=false (e.g. plan_validate gate),\n // do NOT complete — let the agent see the error and continue.\n const reportResult = toolResults?.find(r => r.toolCallId === reportCall.id);\n if (reportResult && reportResult.success === false) {\n reportBlocked = true;\n }\n reportMetadata = reportResult?.metadata;\n } catch {\n // fail-open: report tool execution error should not prevent completion\n }\n if (reportBlocked) {\n await ctx.afterIteration();\n continue;\n }\n await ctx.afterIteration();\n return complete({\n ...reportStop,\n metadata: reportMetadata,\n });\n }\n await ctx.afterIteration();\n return complete(reportStop);\n }\n\n // ── No tool calls → force report if there's content ─────────────────────\n if (toolCalls.length === 0) {\n if (response.content && response.content.trim().length > 0) {\n // LLM responded with text instead of calling report.\n // Nudge it once with tool_choice=required forcing a report call.\n let nudgedResponse: LLMCallResult | null = null;\n try {\n // Inject a reminder message and re-call with forced tool choice\n ctx.appendMessage({\n role: 'system',\n content: 'You must call the `report` tool with your answer. Do NOT respond with plain text.',\n });\n nudgedResponse = await ctx.callLLM();\n } catch {\n // fail-open: nudge failed, fall through to no_tool_calls\n }\n\n if (nudgedResponse) {\n const nudgedReport = extractReport(nudgedResponse);\n if (nudgedReport) {\n const reportCall = nudgedResponse.toolCalls?.find(tc => tc.name === 'report');\n if (reportCall) {\n let reportBlocked = false;\n let reportMetadata: Record<string, unknown> | undefined;\n try {\n const toolResults = await ctx.executeTools([{ id: reportCall.id, name: reportCall.name, input: reportCall.input }]);\n const reportResult = toolResults?.find(r => r.toolCallId === reportCall.id);\n if (reportResult && reportResult.success === false) {\n reportBlocked = true;\n }\n reportMetadata = reportResult?.metadata;\n } catch { /* fail-open */ }\n if (reportBlocked) {\n await ctx.afterIteration();\n continue;\n }\n await ctx.afterIteration();\n return complete({\n ...nudgedReport,\n metadata: reportMetadata,\n });\n }\n await ctx.afterIteration();\n return complete(nudgedReport);\n }\n // Nudge didn't produce report either — fall through with nudged content or original\n await ctx.afterIteration();\n return complete({\n priority: PRIORITY.NO_TOOLS,\n reasonCode: 'no_tool_calls',\n reason: 'LLM produced no tool calls after nudge',\n answer: nudgedResponse.content || response.content,\n });\n }\n }\n\n await ctx.afterIteration();\n return complete({\n priority: PRIORITY.NO_TOOLS,\n reasonCode: 'no_tool_calls',\n reason: 'LLM produced no tool calls',\n answer: response.content,\n });\n }\n\n // ── Tool execution ────────────────────────────────────────────────────────\n const inputs: ToolCallInput[] = toolCalls.map(tc => ({\n id: tc.id,\n name: tc.name,\n input: tc.input,\n }));\n\n try {\n await ctx.executeTools(inputs);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n await ctx.afterIteration();\n return failure(`Tool execution failed: ${msg}`);\n }\n\n // Build compact per-iteration recap so the next LLM call does not \"forget\"\n // what already happened in this run.\n const reads = run.meta.get<string[]>('files', 'read') ?? [];\n const modified = run.meta.get<string[]>('files', 'modified') ?? [];\n const created = run.meta.get<string[]>('files', 'created') ?? [];\n const evidenceCount = reads.length + modified.length + created.length;\n const prevEvidenceCount = run.meta.get<number>('loop', 'lastEvidenceCount') ?? 0;\n\n const newEvidence = evidenceCount > prevEvidenceCount;\n\n // Keep offset in signature: chunk-reads of a large file (same path, different offsets)\n // must be treated as distinct calls, not repeats. Only strip limit (size hint, not identity).\n const toolSignature = inputs.map((t) => {\n const normalized = { ...t.input as Record<string, unknown> };\n delete normalized['limit'];\n return `${t.name}:${canonicalJson(normalized)}`;\n }).join('|');\n const lastToolSignature = run.meta.get<string>('loop', 'lastToolSignature') ?? '';\n let repeatsWithoutEvidence = run.meta.get<number>('loop', 'repeatsWithoutEvidence') ?? 0;\n let repeatNoEvidenceCount = run.meta.get<number>('loop', 'repeatNoEvidenceCount') ?? 0;\n if (!newEvidence && toolSignature === lastToolSignature) {\n repeatsWithoutEvidence += 1;\n repeatNoEvidenceCount += 1;\n } else {\n repeatsWithoutEvidence = 0;\n }\n\n run.meta.set('loop', 'lastEvidenceCount', evidenceCount);\n run.meta.set('loop', 'lastToolSignature', toolSignature);\n run.meta.set('loop', 'repeatsWithoutEvidence', repeatsWithoutEvidence);\n run.meta.set('loop', 'repeatNoEvidenceCount', repeatNoEvidenceCount);\n run.meta.set(\n 'loop',\n 'lastIterationSummary',\n `Iteration ${run.iteration}: tools=${inputs.map((t) => t.name).join(', ')}; ` +\n `evidence=${newEvidence ? 'new' : 'none'}; files(read=${reads.length}, modified=${modified.length}, created=${created.length})`,\n );\n\n const snapshot: IterationSnapshot = {\n iteration: run.iteration,\n maxIterations: run.maxIterations,\n toolNames: inputs.map((t) => t.name),\n toolSignature,\n totalTokens,\n evidenceCount,\n evidenceDelta: Math.max(0, evidenceCount - prevEvidenceCount),\n filesReadCount: reads.length,\n filesModifiedCount: modified.length,\n filesCreatedCount: created.length,\n newEvidence,\n repeatsWithoutEvidence,\n repeatNoEvidenceCount,\n lastIterationSummary: run.meta.get<string>('loop', 'lastIterationSummary'),\n };\n const evaluation = await ctx.evaluateRun(snapshot);\n if (evaluation) {\n run.meta.set('evaluation', 'lastRecommendation', evaluation.recommendation);\n run.meta.set('evaluation', 'lastReadinessScore', evaluation.readinessScore);\n run.meta.set('evaluation', 'lastEvidenceGain', evaluation.evidenceGain);\n run.meta.set('evaluation', 'lastRationale', evaluation.rationale);\n }\n\n await ctx.afterIteration();\n\n if (evaluation?.recommendation === 'narrow') {\n const narrowNudgeSent = run.meta.get<boolean>('evaluation', 'narrowNudgeSent') ?? false;\n if (!narrowNudgeSent) {\n run.meta.set('evaluation', 'narrowNudgeSent', true);\n ctx.appendMessage({\n role: 'system',\n content:\n 'Recent steps are not adding enough new evidence. Narrow the search to the most important unresolved gaps before continuing.',\n });\n }\n }\n\n if (evaluation?.recommendation === 'synthesize') {\n const synthesisNudgeSent = run.meta.get<boolean>('evaluation', 'synthesisNudgeSent') ?? false;\n if (!synthesisNudgeSent) {\n run.meta.set('evaluation', 'synthesisNudgeSent', true);\n ctx.appendMessage({\n role: 'system',\n content:\n 'You now have enough evidence to produce the best bounded answer available. Prefer synthesizing from verified evidence instead of starting new exploration.',\n });\n continue;\n }\n }\n\n if (repeatsWithoutEvidence >= 2) {\n return complete({\n priority: PRIORITY.LOOP,\n reasonCode: 'repeated_without_progress',\n reason: 'Repeated tool intent without new evidence',\n answer: 'Agent is repeating similar actions without collecting new evidence. Returning partial result to avoid wasted iterations.',\n });\n }\n\n // ── Loop detection → complete with partial result (no forced escalation) ─\n if (loopDetector.check(inputs)) {\n return complete({\n priority: PRIORITY.LOOP,\n reasonCode: 'loop_detected',\n reason: 'Agent detected repeated tool-call pattern',\n answer: 'Agent detected a repeated tool-call loop. Returning partial result; refine scope or constraints to continue.',\n });\n }\n\n // ── Max iterations → complete with partial result (no forced escalation) ─\n if (i + 1 >= run.maxIterations) {\n return complete({\n priority: PRIORITY.MAX_ITER,\n reasonCode: 'max_iterations',\n reason: `Maximum iterations reached (${run.maxIterations})`,\n answer: `Maximum iterations reached (${run.maxIterations}). Returning partial result with collected evidence.`,\n });\n }\n }\n\n // maxIterations = 0 edge case\n return failure('No iterations executed (maxIterations = 0)');\n }\n}\n\n// ─── Module-level helpers (pure functions, no this) ──────────────────────────\n\nfunction extractReport(response: LLMCallResult): StopResult | null {\n const reportCall = response.toolCalls?.find(tc => tc.name === 'report');\n if (!reportCall) {return null;}\n\n const answer =\n typeof reportCall.input?.['answer'] === 'string'\n ? reportCall.input['answer']\n : response.content;\n\n return {\n priority: PRIORITY.REPORT,\n reasonCode: 'report_complete',\n reason: 'Agent called report tool',\n answer,\n };\n}\n\nfunction complete(stop: StopResult): LoopResult {\n const successfulStops = new Set(['report_complete', 'no_tool_calls']);\n const result: LoopOutput = {\n answer: stop.answer ?? stop.reason,\n reasonCode: stop.reasonCode,\n success: successfulStops.has(stop.reasonCode),\n metadata: { stopPriority: stop.priority, ...(stop.metadata ?? {}) },\n };\n return { outcome: 'complete', result };\n}\n\nfunction failure(reason: string): LoopResult {\n const result: LoopOutput = {\n answer: reason,\n reasonCode: 'error',\n success: false,\n metadata: { stopPriority: -1 },\n };\n return { outcome: 'complete', result };\n}\n","/**\n * Builds the system prompt for the agent LLM call.\n *\n * Architecture inspired by Claude Code:\n * - Static sections (core rules, workflow) — stable across sessions, cacheable\n * - Semi-static sections (working dir, delegation) — stable within session\n * - Dynamic sections (memory, facts, workspace) — change per iteration\n *\n * Tool descriptions are NOT in the system prompt — they go via API `tools:` parameter.\n * Project instructions (AGENTS.md) loaded conditionally based on task scope.\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { AgentMemory } from '@kb-labs/agent-contracts';\nimport type { WorkspaceDiscoveryResult } from '../execution/workspace-discovery.js';\n\nconst MAX_INSTRUCTIONS_CHARS = 4_000; // reduced from 12K — AGENTS.md was 6.5K\nconst INSTRUCTION_FILE_NAMES = ['AGENT.md', 'KB_AGENT.md', '.agent.md', 'CLAUDE.md'];\n\nexport interface SystemPromptInput {\n workingDir: string;\n responseMode: 'auto' | 'brief' | 'deep';\n isSubAgent: boolean;\n sessionId?: string;\n sessionRootDir?: string;\n currentTask?: string;\n memory?: AgentMemory;\n workspaceDiscovery?: WorkspaceDiscoveryResult | null;\n factSheetContent?: string;\n archiveSummaryHint?: string;\n}\n\n// ═════════════════════════════════════════════════════════════════════════════\n// Section cache — static sections computed once per process, reused across calls\n// ═════════════════════════════════════════════════════════════════════════════\n\nlet _cachedStaticPrompt: string | null = null;\n\nexport function clearSystemPromptCache(): void {\n _cachedStaticPrompt = null;\n}\n\n// ═════════════════════════════════════════════════════════════════════════════\n// Builder\n// ═════════════════════════════════════════════════════════════════════════════\n\nexport class SystemPromptBuilder {\n async build(input: SystemPromptInput): Promise<string> {\n const sections: string[] = [];\n\n // ── STATIC: core rules + workflow (cacheable, ~4K chars) ──\n sections.push(getStaticPrompt());\n\n // ── SEMI-STATIC: per-session context ──\n sections.push(buildSessionContext(input));\n\n // ── DYNAMIC: per-iteration context ──\n const dynamic = await buildDynamicContext(input);\n if (dynamic) { sections.push(dynamic); }\n\n return sections.join('\\n\\n');\n }\n}\n\n// ═════════════════════════════════════════════════════════════════════════════\n// STATIC SECTION — stable across sessions, computed once\n// ═════════════════════════════════════════════════════════════════════════════\n\nfunction getStaticPrompt(): string {\n if (_cachedStaticPrompt) { return _cachedStaticPrompt; }\n _cachedStaticPrompt = buildStaticPrompt();\n return _cachedStaticPrompt;\n}\n\nfunction buildStaticPrompt(): string {\n return `You are an autonomous software engineering agent. You execute tasks end-to-end: research, implement, verify.\n\n# Core rules\n\n- NEVER answer from memory as primary evidence. Memory is for continuity; files/tools are evidence.\n- Read files before editing. Understand existing code before modifying.\n- Verify your work. After editing, read the file back to confirm changes applied correctly.\n- ALWAYS prefer fs_replace for modifying existing files — it sends only the diff, not the whole file. Use the smallest match text that uniquely identifies the target (2-4 lines). Only use fs_write for creating NEW files. Never rewrite an entire existing file with fs_write when you can make targeted fs_replace edits.\n- When stuck, try a different approach. Don't repeat the same failed action.\n- If the task specifies a target directory or working path, use it as the base for ALL file operations.\n- Iteration contract: each iteration must either (a) produce new evidence, (b) make one concrete narrowing step, or (c) report partial/final result.\n\n# Workflow\n\n## For research tasks:\n1. Search (find_definition/grep_search) → 2. Read files → 3. Analyze → 4. report()\n\n## For edit tasks:\n1. Read target file → 2. Plan changes → 3. Edit (fs_replace preferred, fs_patch for large blocks) → 4. Read back to verify → 5. shell_exec to test → 6. report()\n\n## Verification contract (non-trivial edits)\nWhen modifying 3+ files or making API/infrastructure changes:\n- Run relevant tests or build after editing\n- Check imports resolve in consuming files\n- Report what verification you performed\n\n## When stuck:\n- Try different search approach, read surrounding files\n- If blocked, report partial findings — partial answer beats infinite loop\n\n# Communication\n- Write 1-3 sentences of reasoning BEFORE each tool call — explain what and why.\n- Match the user's language. Russian → answer in Russian.\n- ALWAYS call \\`report\\` as your final action — no exceptions.`;\n}\n\n// ═════════════════════════════════════════════════════════════════════════════\n// SEMI-STATIC SECTION — per-session, changes rarely\n// ═════════════════════════════════════════════════════════════════════════════\n\nfunction buildSessionContext(input: SystemPromptInput): string {\n const parts: string[] = [];\n\n // Working directory\n parts.push(`# Working directory\\n\\`${input.workingDir}\\``);\n\n // Delegation (only for top-level agents)\n if (!input.isSubAgent) {\n parts.push(`# Delegation\n- **task_submit** — start a sub-agent in background. Returns task ID immediately.\n- **task_status** — check progress without blocking.\n- **task_collect** — wait for task to complete and get result.\nFor complex multi-part tasks, delegate independent subtasks to run concurrently.`);\n }\n\n // Project instructions — conditionally loaded, truncated to 4K\n const instructions = loadProjectInstructions(input.workingDir);\n if (instructions) {\n const truncated = instructions.length > MAX_INSTRUCTIONS_CHARS\n ? instructions.slice(0, MAX_INSTRUCTIONS_CHARS) + '\\n\\n[...truncated — use fs_read to see full file...]'\n : instructions;\n parts.push(`# Project Instructions\\n${truncated}`);\n }\n\n // Session continuity hint\n if (input.sessionId) {\n parts.push('# Session continuity\\nUse conversation history as primary context. Do not restate long history from memory when already in messages.');\n }\n\n return parts.join('\\n\\n');\n}\n\n// ═════════════════════════════════════════════════════════════════════════════\n// DYNAMIC SECTION — per-iteration, changes each LLM call\n// ═════════════════════════════════════════════════════════════════════════════\n\nasync function buildDynamicContext(input: SystemPromptInput): Promise<string | null> {\n const parts: string[] = [];\n\n // Memory context\n if (input.memory) {\n const memCtx = await getMemoryContext(input.memory);\n if (memCtx.trim()) {\n parts.push(`# Memory Context\\n${memCtx}`);\n }\n const taskCtx = await getOriginalTaskContext(input.memory, input.currentTask);\n if (taskCtx) { parts.push(taskCtx); }\n }\n\n // Fact Sheet (Tier 1: Hot Memory)\n if (input.factSheetContent) {\n parts.push(`# Accumulated Knowledge\\n${input.factSheetContent}`);\n }\n\n // Archive hint (Tier 2: Cold Storage) — one line, not full content\n if (input.archiveSummaryHint) {\n parts.push(input.archiveSummaryHint);\n }\n\n // Workspace topology — compact format, only if discovered\n const wsPrompt = buildWorkspaceDiscoveryPrompt(input.workspaceDiscovery);\n if (wsPrompt) {\n parts.push(wsPrompt);\n }\n\n return parts.length > 0 ? parts.join('\\n\\n') : null;\n}\n\n// ═════════════════════════════════════════════════════════════════════════════\n// Helpers (unchanged logic, just organized)\n// ═════════════════════════════════════════════════════════════════════════════\n\nexport function loadProjectInstructions(workingDir: string): string | null {\n for (const fileName of INSTRUCTION_FILE_NAMES) {\n const filePath = path.join(workingDir, fileName);\n if (fs.existsSync(filePath)) {\n try {\n const content = fs.readFileSync(filePath, 'utf-8').trim();\n if (content.length > 0) { return content; }\n } catch {\n continue;\n }\n }\n }\n return null;\n}\n\nasync function getMemoryContext(memory: AgentMemory): Promise<string> {\n try {\n if ('getStructuredContext' in memory && typeof memory.getStructuredContext === 'function') {\n const structured = await memory.getStructuredContext(1500);\n if (structured && typeof structured === 'string' && structured.trim().length > 0) {\n return structured;\n }\n }\n\n if ('getContext' in memory && typeof memory.getContext === 'function') {\n const context = await memory.getContext(2000);\n if (context && typeof context === 'string' && context.trim().length > 0) {\n return context;\n }\n }\n } catch {\n // Memory retrieval errors are non-fatal\n }\n return '';\n}\n\nasync function getOriginalTaskContext(\n memory: AgentMemory,\n currentTask?: string\n): Promise<string | null> {\n try {\n if (!('getContext' in memory) || typeof memory.getContext !== 'function') {\n return null;\n }\n\n const context = await memory.getContext(2000);\n if (!context || typeof context !== 'string') {\n return null;\n }\n\n // Check for target directory constraints\n const dirMatch = context.match(/target\\s*(?:dir|directory|path)\\s*[:=]\\s*(.+)/i);\n const requirements = context.match(/requirements?\\s*[:=]\\s*(.+)/i);\n\n if (!dirMatch && !requirements) {\n return null;\n }\n\n let ctx = '\\n\\n**⚠️ IMPORTANT CONTEXT — Original User Task:**\\n';\n if (dirMatch) {\n ctx += `- Target directory: ${dirMatch[1]?.trim()}\\n`;\n }\n if (requirements) {\n ctx += `- Requirements: ${requirements[1]?.trim()}\\n`;\n }\n if (currentTask) {\n ctx += `- Current subtask: ${currentTask}\\n`;\n }\n\n return ctx;\n } catch {\n return null;\n }\n}\n\nfunction buildWorkspaceDiscoveryPrompt(\n discovery: WorkspaceDiscoveryResult | null | undefined\n): string | null {\n if (!discovery?.repos?.length) { return null; }\n\n // Compact format — just repo names and paths, not full descriptions\n const repos = discovery.repos.slice(0, 24);\n const lines = repos.map(r => {\n const pkgCount = r.packages?.length ?? 0;\n return ` ${r.name}: ${r.path}${pkgCount > 0 ? ` (${pkgCount} packages)` : ''}`;\n });\n\n return `# Workspace (${repos.length} repos)\\n${lines.join('\\n')}`;\n}\n","/**\n * Run Metrics Emitter\n *\n * Fires analytics events for run KPIs, tool outcomes, tier escalations,\n * and detects quality regressions using EMA baselines.\n */\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface KpiBaseline {\n driftRateEma: number;\n evidenceDensityEma: number;\n toolErrorRateEma: number;\n samples: number;\n tokenHistory: number[];\n iterationUtilizationHistory: number[];\n qualityScoreHistory: number[];\n}\n\nexport interface TierEscalation {\n from: string;\n to: string;\n reason: string;\n iteration: number;\n}\n\nexport interface RegressionMetrics {\n driftRate: number;\n evidenceDensity: number;\n toolErrorRate: number;\n tokensUsed: number;\n iterationsUsed: number;\n iterationBudget: number;\n iterationUtilization: number;\n qualityScore: number;\n qualityGateStatus: string;\n}\n\nexport interface RunKpiPayload {\n sessionId?: string;\n agentId: string;\n task: string;\n success: boolean;\n error?: string;\n summaryPreview: string;\n iterationsUsed: number;\n iterationBudget: number;\n tokenBudget?: number;\n tokenUtilization?: number;\n startTier: string;\n finalTier: string;\n durationMs: number;\n tokensUsed: number;\n toolCallsTotal: number;\n toolSuccessCount: number;\n toolErrorCount: number;\n todoToolCalls: number;\n filesReadCount: number;\n filesModifiedCount: number;\n filesCreatedCount: number;\n driftDomainCount: number;\n driftDomains: string[];\n executionPhase: string;\n phaseDurationsMs: Record<string, number>;\n phaseTransitionCount: number;\n phaseTransitions: unknown[];\n ledger: { failedSteps: number; pendingSteps: number };\n qualityGate: { status: string; score: number; reasons: string[] } | null;\n /** Fraction of iterations that repeated intent without new evidence. */\n repeatNoEvidenceRate?: number;\n}\n\nexport interface ToolOutcomeInput {\n toolName: string;\n success: boolean;\n durationMs: number;\n errorCode?: string;\n retryable?: boolean;\n}\n\nexport interface KpiBaselinePersister {\n getKpiBaseline(sessionId: string): Promise<KpiBaseline | null>;\n updateKpiBaseline(\n sessionId: string,\n fn: () => {\n version: number;\n updatedAt: string;\n driftRateEma: number;\n evidenceDensityEma: number;\n toolErrorRateEma: number;\n samples: number;\n tokenHistory: number[];\n iterationUtilizationHistory: number[];\n qualityScoreHistory: number[];\n },\n ): Promise<void>;\n}\n\nexport interface EmitContext {\n analytics: { track(event: string, payload: unknown): Promise<void> } | null;\n sessionId?: string;\n persister?: KpiBaselinePersister;\n baselineKey: string;\n log: (msg: string) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Process-level KPI baseline (module scope — one per process, like the old static)\n// ---------------------------------------------------------------------------\n\nconst PROCESS_KPI_BASELINES = new Map<string, KpiBaseline>();\n\n/** For testing: clear the process-level baseline map */\nexport function clearProcessKpiBaselines(): void {\n PROCESS_KPI_BASELINES.clear();\n}\n\n// ---------------------------------------------------------------------------\n// RunMetricsEmitter\n// ---------------------------------------------------------------------------\n\nexport class RunMetricsEmitter {\n readonly tierEscalations: TierEscalation[] = [];\n\n // ── Tier escalation ────────────────────────────────────────────────────\n\n async recordTierEscalation(\n from: string,\n to: string,\n reason: string,\n iteration: number,\n ctx: {\n analytics: EmitContext['analytics'];\n sessionId?: string;\n agentId: string;\n task: string;\n tierEscalatedEvent: string;\n log: (msg: string) => void;\n },\n ): Promise<void> {\n this.tierEscalations.push({ from, to, reason, iteration });\n\n if (!ctx.analytics) {\n return;\n }\n\n await ctx.analytics\n .track(ctx.tierEscalatedEvent, {\n sessionId: ctx.sessionId,\n agentId: ctx.agentId,\n task: ctx.task,\n fromTier: from,\n toTier: to,\n reason,\n iteration,\n escalationCount: this.tierEscalations.length,\n })\n .catch((err) => {\n ctx.log(`[Agent] Failed to emit tier escalation analytics: ${err}`);\n });\n }\n\n // ── Tool outcome ───────────────────────────────────────────────────────\n\n trackToolOutcome(\n input: ToolOutcomeInput,\n ctx: {\n analytics: EmitContext['analytics'];\n toolCalledEvent: string;\n log: (msg: string) => void;\n },\n ): void {\n if (!ctx.analytics) {\n return;\n }\n\n void ctx.analytics\n .track(ctx.toolCalledEvent, {\n toolName: input.toolName,\n success: input.success,\n durationMs: input.durationMs,\n errorCode: input.errorCode,\n retryable: input.retryable,\n })\n .catch((err) => {\n ctx.log(`[Agent] Failed to emit tool analytics: ${String(err)}`);\n });\n }\n\n // ── Run KPIs ───────────────────────────────────────────────────────────\n\n async emitRunKpis(payload: RunKpiPayload, ctx: EmitContext): Promise<void> {\n if (!ctx.analytics) {\n return;\n }\n const qualityGateStatus = payload.qualityGate?.status ?? (payload.success ? 'pass' : 'partial');\n const qualityScore = payload.qualityGate?.score ?? (payload.success ? 1 : 0);\n const qualityReasons = payload.qualityGate?.reasons ?? [];\n\n const toolCallsTotal = payload.toolCallsTotal;\n const driftRate =\n toolCallsTotal > 0\n ? Math.max(0, payload.driftDomainCount - 1) / toolCallsTotal\n : 0;\n const evidenceCount =\n payload.filesReadCount + payload.filesModifiedCount + payload.filesCreatedCount;\n const evidenceDensity =\n payload.iterationsUsed > 0\n ? evidenceCount / payload.iterationsUsed\n : evidenceCount;\n const toolErrorRate =\n toolCallsTotal > 0 ? payload.toolErrorCount / toolCallsTotal : 0;\n const iterationUtilization =\n payload.iterationBudget > 0\n ? payload.iterationsUsed / payload.iterationBudget\n : 1;\n\n const fullPayload = {\n ...payload,\n qualityGate: {\n status: qualityGateStatus,\n score: qualityScore,\n reasons: qualityReasons,\n },\n escalated: this.tierEscalations.length > 0,\n escalationCount: this.tierEscalations.length,\n escalationReasons: this.tierEscalations.map((e) => e.reason),\n escalationPath: this.tierEscalations.map((e) => `${e.from}->${e.to}`),\n toolErrorRate,\n todoUsed: payload.todoToolCalls > 0,\n evidenceDensity,\n driftRate,\n iterationUtilization,\n };\n\n const regressionMetrics: RegressionMetrics = {\n driftRate,\n evidenceDensity,\n toolErrorRate,\n tokensUsed: payload.tokensUsed,\n iterationsUsed: payload.iterationsUsed,\n iterationBudget: payload.iterationBudget,\n iterationUtilization,\n qualityScore,\n qualityGateStatus,\n };\n\n await this.emitQualityRegressionEvent(regressionMetrics, ctx);\n\n await ctx.analytics.track('agent.kpi.run_completed', fullPayload).catch((err) => {\n ctx.log(`[Agent] Failed to emit KPI analytics: ${err}`);\n });\n }\n\n // ── Quality regression detection ───────────────────────────────────────\n\n private async emitQualityRegressionEvent(\n metrics: RegressionMetrics,\n ctx: EmitContext,\n ): Promise<void> {\n if (!ctx.analytics) {\n return;\n }\n\n let baseline: KpiBaseline = {\n driftRateEma: metrics.driftRate,\n evidenceDensityEma: metrics.evidenceDensity,\n toolErrorRateEma: metrics.toolErrorRate,\n samples: 0,\n tokenHistory: [],\n iterationUtilizationHistory: [],\n qualityScoreHistory: [],\n };\n\n if (ctx.sessionId && ctx.persister) {\n try {\n const persisted = await ctx.persister.getKpiBaseline(ctx.sessionId);\n if (persisted) {\n baseline = persisted;\n }\n } catch (err) {\n ctx.log(`[Agent] Failed to read persisted KPI baseline: ${err}`);\n }\n } else {\n baseline = PROCESS_KPI_BASELINES.get(ctx.baselineKey) ?? baseline;\n }\n\n const verdict = detectQualityRegression(metrics, baseline);\n\n if (verdict.regressed) {\n await ctx.analytics\n .track('agent.kpi.quality_regression', {\n sessionId: ctx.sessionId,\n reasons: verdict.reasons,\n metrics,\n baseline: {\n driftRateEma: baseline.driftRateEma,\n evidenceDensityEma: baseline.evidenceDensityEma,\n toolErrorRateEma: baseline.toolErrorRateEma,\n samples: baseline.samples,\n },\n })\n .catch((err) => {\n ctx.log(`[Agent] Failed to emit quality regression analytics: ${err}`);\n });\n }\n\n const updated = updateKpiBaseline(baseline, metrics);\n\n if (ctx.persister && ctx.sessionId) {\n await ctx.persister\n .updateKpiBaseline(ctx.sessionId, () => ({\n version: 1,\n updatedAt: new Date().toISOString(),\n ...updated,\n }))\n .catch((err) => {\n ctx.log(`[Agent] Failed to persist KPI baseline: ${err}`);\n });\n return;\n }\n\n PROCESS_KPI_BASELINES.set(ctx.baselineKey, updated);\n }\n\n // ── Reset ──────────────────────────────────────────────────────────────\n\n reset(): void {\n this.tierEscalations.length = 0;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Pure standalone functions\n// ---------------------------------------------------------------------------\n\nexport function getKpiBaselineKey(\n sessionRootDir: string,\n workingDir: string,\n): string {\n return `${sessionRootDir || workingDir || 'workspace'}::agent`;\n}\n\nexport function detectQualityRegression(\n metrics: RegressionMetrics,\n baseline: KpiBaseline,\n): { regressed: boolean; reasons: string[] } {\n const enoughHistory = baseline.samples >= 3;\n const driftRegressed =\n enoughHistory && metrics.driftRate > baseline.driftRateEma + 0.08;\n const evidenceRegressed =\n enoughHistory && metrics.evidenceDensity < baseline.evidenceDensityEma - 0.2;\n const errorRegressed =\n enoughHistory && metrics.toolErrorRate > baseline.toolErrorRateEma + 0.15;\n const overBudget =\n metrics.iterationBudget > 0\n && metrics.iterationsUsed / metrics.iterationBudget > 0.9;\n const partialGate = metrics.qualityGateStatus === 'partial';\n\n const regressed =\n driftRegressed || evidenceRegressed || errorRegressed || (partialGate && overBudget);\n\n const reasons: string[] = [];\n if (driftRegressed) { reasons.push('drift_rate_regressed'); }\n if (evidenceRegressed) { reasons.push('evidence_density_regressed'); }\n if (errorRegressed) { reasons.push('tool_error_rate_regressed'); }\n if (partialGate && overBudget) { reasons.push('partial_quality_near_budget_limit'); }\n\n return { regressed, reasons };\n}\n\nexport function updateKpiBaseline(\n baseline: KpiBaseline,\n metrics: RegressionMetrics,\n alpha = 0.25,\n): KpiBaseline {\n return {\n driftRateEma:\n baseline.samples === 0\n ? metrics.driftRate\n : baseline.driftRateEma * (1 - alpha) + metrics.driftRate * alpha,\n evidenceDensityEma:\n baseline.samples === 0\n ? metrics.evidenceDensity\n : baseline.evidenceDensityEma * (1 - alpha) + metrics.evidenceDensity * alpha,\n toolErrorRateEma:\n baseline.samples === 0\n ? metrics.toolErrorRate\n : baseline.toolErrorRateEma * (1 - alpha) + metrics.toolErrorRate * alpha,\n samples: baseline.samples + 1,\n tokenHistory: [...baseline.tokenHistory, metrics.tokensUsed].slice(-50),\n iterationUtilizationHistory: [\n ...baseline.iterationUtilizationHistory,\n metrics.iterationUtilization,\n ].slice(-50),\n qualityScoreHistory: [...baseline.qualityScoreHistory, metrics.qualityScore].slice(\n -50,\n ),\n };\n}\n\nexport function extractToolErrorCode(result: {\n success: boolean;\n error?: string;\n errorDetails?: { code?: string; retryable?: boolean };\n metadata?: Record<string, unknown>;\n}): string | null {\n if (result.errorDetails?.code) {\n return result.errorDetails.code;\n }\n if (\n result.metadata\n && typeof result.metadata.errorCode === 'string'\n && (result.metadata.errorCode as string).trim()\n ) {\n return result.metadata.errorCode as string;\n }\n const errorText = result.error || '';\n const prefixed = errorText.match(/^([A-Z0-9_]{3,}):/);\n return prefixed?.[1] || null;\n}\n","/**\n * MiddlewarePipeline — orchestrates middleware execution with error handling.\n *\n * Features:\n * - Runs before-hooks ascending (lower order = first), after-hooks descending\n * - Per-middleware failure policy: fail-open (log + skip) or fail-closed (stop)\n * - Per-hook timeout enforcement (0 = no timeout)\n */\n\nimport type { FeatureFlags } from '@kb-labs/agent-contracts';\nimport type {\n AgentMiddleware,\n ControlAction,\n RunContext,\n LLMCtx,\n LLMCallPatch,\n LLMCallResult,\n ToolExecCtx,\n ToolOutput,\n} from '@kb-labs/agent-sdk';\n\nconst DEFAULT_TIMEOUT_MS = 5000;\n\nexport interface PipelineOptions {\n featureFlags: FeatureFlags;\n onError?: (middlewareName: string, hookName: string, error: unknown) => void;\n}\n\nexport class MiddlewarePipeline {\n private readonly asc: AgentMiddleware[];\n private readonly desc: AgentMiddleware[];\n private readonly options: PipelineOptions;\n\n constructor(middlewares: AgentMiddleware[], options: PipelineOptions) {\n const sorted = [...middlewares].sort((a, b) => a.order - b.order);\n this.asc = sorted;\n this.desc = [...sorted].reverse();\n this.options = options;\n }\n\n private getActive(list: AgentMiddleware[]): AgentMiddleware[] {\n return list.filter((m) => !m.enabled || m.enabled());\n }\n\n private async runHook<T>(\n middleware: AgentMiddleware,\n hookName: string,\n fn: () => Promise<T> | T,\n fallback: T,\n ): Promise<{ value: T; failed: boolean }> {\n const timeoutMs = middleware.config?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n try {\n const result = timeoutMs > 0\n ? await Promise.race([\n Promise.resolve(fn()),\n new Promise<never>((_, reject) => {\n setTimeout(\n () => reject(new Error(`Middleware \"${middleware.name}.${hookName}\" timed out after ${timeoutMs}ms`)),\n timeoutMs,\n );\n }),\n ])\n : await Promise.resolve(fn());\n\n return { value: result, failed: false };\n } catch (error) {\n this.options.onError?.(middleware.name, hookName, error);\n if (middleware.config?.failPolicy === 'fail-closed') {throw error;}\n return { value: fallback, failed: true };\n }\n }\n\n async onStart(ctx: RunContext): Promise<void> {\n for (const m of this.getActive(this.asc)) {\n if (!m.onStart) {continue;}\n await this.runHook(m, 'onStart', () => m.onStart!(ctx), undefined);\n }\n }\n\n async onStop(ctx: RunContext, reason: string): Promise<void> {\n for (const m of this.getActive(this.desc)) {\n if (!m.onStop) {continue;}\n await this.runHook(m, 'onStop', () => m.onStop!(ctx, reason), undefined);\n }\n }\n\n async onComplete(ctx: RunContext): Promise<void> {\n for (const m of this.getActive(this.desc)) {\n if (!m.onComplete) {continue;}\n await this.runHook(m, 'onComplete', () => m.onComplete!(ctx), undefined);\n }\n }\n\n async beforeIteration(ctx: RunContext): Promise<ControlAction> {\n for (const m of this.getActive(this.asc)) {\n if (!m.beforeIteration) {continue;}\n const { value } = await this.runHook(m, 'beforeIteration', () => m.beforeIteration!(ctx), 'continue' as ControlAction);\n if (value !== 'continue') {return value;}\n }\n return 'continue';\n }\n\n async afterIteration(ctx: RunContext): Promise<void> {\n for (const m of this.getActive(this.desc)) {\n if (!m.afterIteration) {continue;}\n await this.runHook(m, 'afterIteration', () => m.afterIteration!(ctx), undefined);\n }\n }\n\n /** Merges patches from all middlewares in order (last wins per field) */\n async beforeLLMCall(ctx: LLMCtx): Promise<LLMCallPatch> {\n let patch: LLMCallPatch = {};\n for (const m of this.getActive(this.asc)) {\n if (!m.beforeLLMCall) {continue;}\n const { value } = await this.runHook(m, 'beforeLLMCall', () => m.beforeLLMCall!(ctx), undefined);\n if (value) {patch = { ...patch, ...value };}\n }\n return patch;\n }\n\n async afterLLMCall(ctx: LLMCtx, result: LLMCallResult): Promise<void> {\n for (const m of this.getActive(this.desc)) {\n if (!m.afterLLMCall) {continue;}\n await this.runHook(m, 'afterLLMCall', () => m.afterLLMCall!(ctx, result), undefined);\n }\n }\n\n /** Returns 'skip' if ANY middleware votes skip */\n async beforeToolExec(ctx: ToolExecCtx): Promise<'execute' | 'skip'> {\n for (const m of this.getActive(this.asc)) {\n if (!m.beforeToolExec) {continue;}\n const { value } = await this.runHook(m, 'beforeToolExec', () => m.beforeToolExec!(ctx), 'execute' as const);\n if (value === 'skip') {return 'skip';}\n }\n return 'execute';\n }\n\n async afterToolExec(ctx: ToolExecCtx, result: ToolOutput): Promise<void> {\n for (const m of this.getActive(this.desc)) {\n if (!m.afterToolExec) {continue;}\n await this.runHook(m, 'afterToolExec', () => m.afterToolExec!(ctx, result), undefined);\n }\n }\n}\n","/**\n * ObservabilityMiddleware — bridges AgentMiddleware hooks to AgentEvent stream.\n *\n * Architecture (bus pattern):\n * - Lifecycle hooks (beforeLLMCall, afterLLMCall, beforeToolExec, afterToolExec)\n * emit into ctx.run.eventBus — infrastructure-level events.\n * - onStart subscribes to eventBus and translates to UI AgentEvent stream\n * via the onEvent callback (CLI, WebSocket, NDJSON trace).\n * - onStart/onStop emit agent:start / agent:end directly to onEvent\n * (lifecycle events don't go through the bus — they are one-per-run).\n *\n * Design:\n * - order = 5 (runs before all other middlewares so events fire first)\n * - failPolicy = 'fail-open' (observability NEVER breaks execution)\n *\n * File tracking (via run.meta):\n * - 'files' namespace, keys: 'read', 'modified', 'created'\n * - Populated by afterToolExec based on tool name + input\n * - SDKAgentRunner reads these at the end to build TaskResult\n */\n\nimport type {\n RunContext,\n LLMCtx,\n LLMCallResult,\n ToolExecCtx,\n ToolOutput,\n ContextMeta,\n} from '@kb-labs/agent-sdk';\nimport type {\n AgentEvent,\n AgentEventCallback,\n AgentStartEvent,\n AgentEndEvent,\n LLMStartEvent,\n IterationStartEvent,\n IterationEndEvent,\n} from '@kb-labs/agent-contracts';\n\n// ── File-tracking tool name → operation mapping ────────────────────────────\n\nconst FILE_READ_TOOLS = new Set(['fs_read', 'fs_list']);\nconst FILE_WRITE_TOOLS = new Set(['fs_write', 'fs_patch']);\nconst FILE_CREATE_TOOLS = new Set(['fs_write']); // fs_write creates if not exists\n\n// ── Helpers ────────────────────────────────────────────────────────────────\n\nfunction now(): string {\n return new Date().toISOString();\n}\n\nfunction makeBase(\n type: AgentEvent['type'],\n agentId: string,\n parentAgentId: string | undefined,\n sessionId: string | undefined,\n) {\n return { type, timestamp: now(), agentId, parentAgentId, sessionId };\n}\n\nfunction addToMeta(meta: ContextMeta, key: 'read' | 'modified' | 'created', filePath: string): void {\n const existing = meta.get<string[]>('files', key) ?? [];\n if (!existing.includes(filePath)) {\n meta.set('files', key, [...existing, filePath]);\n }\n}\n\nfunction trackFilesInMeta(ctx: ToolExecCtx, result: ToolOutput): void {\n if (!result.success) {return;}\n\n const meta = ctx.run.meta;\n const toolName = ctx.toolName;\n const input = ctx.input;\n\n // Extract file path from common input shapes\n const filePath =\n typeof input['path'] === 'string' ? input['path'] :\n typeof input['file_path'] === 'string' ? input['file_path'] :\n typeof input['filePath'] === 'string' ? input['filePath'] :\n null;\n\n if (!filePath) {return;}\n\n if (FILE_READ_TOOLS.has(toolName)) {\n addToMeta(meta, 'read', filePath);\n }\n\n if (FILE_WRITE_TOOLS.has(toolName)) {\n const outputLower = result.output.toLowerCase();\n if (FILE_CREATE_TOOLS.has(toolName) && outputLower.includes('created')) {\n addToMeta(meta, 'created', filePath);\n } else {\n addToMeta(meta, 'modified', filePath);\n }\n }\n}\n\n// ── ObservabilityMiddleware ────────────────────────────────────────────────\n\nexport class ObservabilityMiddleware {\n readonly name = 'observability';\n readonly order = 5;\n readonly config = { failPolicy: 'fail-open' as const };\n\n private _startedAt = 0;\n private _llmStartedAt = 0;\n private _toolStartedAt = new Map<string, number>();\n private _lastIteration = 0;\n private _totalTokens = 0;\n private _pendingDebug: { systemPrompt: string; messages: ReadonlyArray<{ role: string; content: unknown }> } | null = null;\n\n /** Extra metadata injected before onStart — set by runner after workspace discovery. */\n startMeta?: {\n budget?: { maxTokens: number; softLimitRatio: number; hardLimitRatio: number };\n workspaceTopology?: string[];\n workingDir?: string;\n };\n\n constructor(\n private readonly agentId: string,\n private readonly parentAgentId: string | undefined,\n private readonly sessionId: string | undefined,\n private readonly onEvent: AgentEventCallback | undefined,\n ) {}\n\n // ── Lifecycle ──────────────────────────────────────────────────────────\n\n onStart(ctx: RunContext): void {\n this._startedAt = Date.now();\n\n // Subscribe to bus — translate infrastructure events to UI AgentEvent stream\n ctx.eventBus.on('llm:end', (d) => {\n this._totalTokens += d.promptTokens + d.completionTokens;\n this._emit({\n ...makeBase('llm:end', this.agentId, this.parentAgentId, this.sessionId),\n data: {\n tokensUsed: d.promptTokens + d.completionTokens,\n promptTokens: d.promptTokens,\n completionTokens: d.completionTokens,\n durationMs: d.durationMs,\n hasToolCalls: d.hasToolCalls,\n toolCallCount: d.toolCallCount ?? 0,\n stopReason: d.stopReason,\n content: typeof d.content === 'string' ? d.content.slice(0, 500) : undefined,\n },\n } as AgentEvent);\n });\n\n ctx.eventBus.on('tool:end', (d) => {\n this._emit({\n ...makeBase('tool:end', this.agentId, this.parentAgentId, this.sessionId),\n data: {\n toolName: d.toolName,\n success: d.success,\n durationMs: d.durationMs,\n outputLength: d.outputLength,\n output: d.output,\n metadata: d.metadata,\n },\n } as AgentEvent);\n });\n\n ctx.eventBus.on('middleware:event', (d) => {\n this._emit({\n ...makeBase('middleware:decision' as AgentEvent['type'], this.agentId, this.parentAgentId, this.sessionId),\n data: {\n middleware: d.name,\n decision: d.event,\n details: d.data,\n },\n } as AgentEvent);\n });\n\n ctx.eventBus.on('llm:debug', (d) => {\n this._emit({\n ...makeBase('llm:debug' as AgentEvent['type'], this.agentId, this.parentAgentId, this.sessionId),\n data: d,\n } as AgentEvent);\n });\n\n // agent:start goes directly to onEvent (lifecycle — not via bus)\n const event: AgentStartEvent = {\n ...makeBase('agent:start', this.agentId, this.parentAgentId, this.sessionId),\n data: {\n task: (ctx as unknown as { task?: string }).task ?? '',\n tier: ctx.tier,\n maxIterations: ctx.maxIterations,\n toolCount: ctx.tools.length,\n budget: this.startMeta?.budget,\n workspaceTopology: this.startMeta?.workspaceTopology,\n workingDir: this.startMeta?.workingDir,\n },\n } as AgentStartEvent;\n this._emit(event);\n }\n\n onStop(ctx: RunContext, reason: string): void {\n const filesCreated = ctx.meta.get<string[]>('files', 'created') ?? [];\n const filesModified = ctx.meta.get<string[]>('files', 'modified') ?? [];\n const finalAnswer = ctx.meta.get<string>('agent', 'finalAnswer') ?? '';\n const success = reason === 'report_complete' || reason === 'no_tool_calls';\n const event: AgentEndEvent = {\n ...makeBase('agent:end', this.agentId, this.parentAgentId, this.sessionId),\n data: {\n success,\n summary: finalAnswer,\n iterations: this._lastIteration,\n tokensUsed: this._totalTokens,\n durationMs: Date.now() - this._startedAt,\n filesCreated,\n filesModified,\n stopReason: reason,\n },\n } as AgentEndEvent;\n this._emit(event);\n }\n\n // ── Iteration hooks ────────────────────────────────────────────────────\n\n beforeIteration(ctx: RunContext): 'continue' {\n const event: IterationStartEvent = {\n ...makeBase('iteration:start', this.agentId, this.parentAgentId, this.sessionId),\n data: {\n iteration: ctx.iteration,\n maxIterations: ctx.maxIterations,\n },\n } as IterationStartEvent;\n this._emit(event);\n return 'continue';\n }\n\n afterIteration(ctx: RunContext): void {\n this._lastIteration = ctx.iteration;\n const event: IterationEndEvent = {\n ...makeBase('iteration:end', this.agentId, this.parentAgentId, this.sessionId),\n data: {\n iteration: ctx.iteration,\n hadToolCalls: false,\n toolCallCount: 0,\n cumulativeTokens: this._totalTokens,\n },\n } as IterationEndEvent;\n this._emit(event);\n }\n\n // ── LLM hooks — emit to bus; also emit llm:start directly for CLI ──────\n\n beforeLLMCall(ctx: LLMCtx): undefined {\n this._llmStartedAt = Date.now();\n const sysMsg = ctx.messages.find(m => m.role === 'system');\n const systemPromptChars = typeof sysMsg?.content === 'string' ? sysMsg.content.length : 0;\n\n ctx.run.eventBus.emit('llm:start', {\n iteration: ctx.run.iteration,\n messageCount: ctx.messages.length,\n toolCount: ctx.tools.length,\n systemPromptChars,\n });\n\n // Always capture for tracing — emitted to eventBus unconditionally\n this._pendingDebug = {\n systemPrompt: typeof sysMsg?.content === 'string' ? sysMsg.content : '',\n messages: ctx.messages,\n };\n\n // Also emit llm:start directly to onEvent for CLI spinner\n const event: LLMStartEvent = {\n ...makeBase('llm:start', this.agentId, this.parentAgentId, this.sessionId),\n data: {\n tier: ctx.run.tier,\n iteration: ctx.run.iteration,\n messageCount: ctx.messages.length,\n toolCount: ctx.tools.length,\n systemPromptChars,\n },\n } as LLMStartEvent;\n this._emit(event);\n\n return undefined;\n }\n\n afterLLMCall(ctx: LLMCtx, result: LLMCallResult): void {\n const durationMs = Date.now() - this._llmStartedAt;\n ctx.run.eventBus.emit('llm:end', {\n iteration: ctx.run.iteration,\n promptTokens: result.usage?.promptTokens ?? 0,\n completionTokens: result.usage?.completionTokens ?? 0,\n stopReason: result.stopReason ?? 'unknown',\n hasToolCalls: (result.toolCalls?.length ?? 0) > 0,\n toolCallCount: result.toolCalls?.length ?? 0,\n durationMs,\n content: result.content,\n });\n\n if (this._pendingDebug) {\n // Always emit to eventBus (persisted to NDJSON trace)\n ctx.run.eventBus.emit('llm:debug', {\n iteration: ctx.run.iteration,\n systemPrompt: this._pendingDebug.systemPrompt,\n messages: this._pendingDebug.messages.map(m => ({\n role: m.role,\n content: typeof m.content === 'string' ? m.content : JSON.stringify(m.content),\n })),\n responseContent: result.content,\n });\n this._pendingDebug = null;\n }\n }\n\n // ── Tool hooks — emit to bus; also emit tool:start directly for CLI ────\n\n beforeToolExec(ctx: ToolExecCtx): 'execute' {\n this._toolStartedAt.set(ctx.toolName, Date.now());\n\n ctx.run.eventBus.emit('tool:start', {\n iteration: ctx.run.iteration,\n toolName: ctx.toolName,\n input: ctx.input,\n });\n\n // Also emit tool:start directly to onEvent for CLI rendering\n this._emit({\n ...makeBase('tool:start', this.agentId, this.parentAgentId, this.sessionId),\n data: {\n toolName: ctx.toolName,\n input: ctx.input,\n },\n } as AgentEvent);\n\n return 'execute';\n }\n\n afterToolExec(ctx: ToolExecCtx, result: ToolOutput): void {\n // Track file operations in meta\n trackFilesInMeta(ctx, result);\n\n const durationMs = Date.now() - (this._toolStartedAt.get(ctx.toolName) ?? Date.now());\n this._toolStartedAt.delete(ctx.toolName);\n\n ctx.run.eventBus.emit('tool:end', {\n iteration: ctx.run.iteration,\n toolName: ctx.toolName,\n success: result.success,\n durationMs,\n outputLength: result.output.length,\n output: result.output,\n metadata: result.metadata as Record<string, unknown> | undefined,\n });\n // tool:end UI event is delivered via bus subscription in onStart\n }\n\n // ── Private ────────────────────────────────────────────────────────────\n\n private _emit(event: AgentEvent): void {\n try {\n this.onEvent?.(event);\n } catch {\n // fail-open: swallow errors from event callback\n }\n }\n}\n","/**\n * ChangeTrackingMiddleware — captures file change snapshots via the SDK pipeline.\n *\n * Design:\n * - order = 8 (after Observability=5, before Budget=10)\n * - failPolicy = 'fail-open': tracking errors never break execution\n * - Intercepts afterToolExec for fs_write / fs_patch / fs_delete\n * - Tools must include before/after content in result.metadata (see filesystem.ts)\n * - Persists FileChange snapshots via ChangeStore\n * - Writes FileChangeSummary[] to RunContext.meta('changes', 'summaries') per run\n * - SDKAgentRunner reads meta at end to populate TaskResult.fileChanges\n *\n * Data flow:\n * fs_write/fs_patch/fs_delete\n * → result.metadata.changeSnapshot: { operation, beforeContent?, afterContent, ...opMeta }\n * → ChangeTrackingMiddleware.afterToolExec\n * → ChangeStore.save()\n * → meta('changes', 'summaries') += FileChangeSummary\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { ChangeStore, toSummary } from '@kb-labs/agent-history';\nimport type { FileChangeSummary, StorageConfig } from '@kb-labs/agent-history';\nimport type { RunContext, ToolExecCtx, ToolOutput } from '@kb-labs/agent-sdk';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Shape of metadata that filesystem tools embed in ToolOutput.metadata\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface ChangeSnapshot {\n operation: 'write' | 'patch' | 'delete';\n /** File content before the operation (undefined = new file) */\n beforeContent?: string;\n /** File content after the operation */\n afterContent: string;\n // Optional operation-specific fields\n isOverwrite?: boolean;\n startLine?: number;\n endLine?: number;\n linesAdded?: number;\n linesRemoved?: number;\n wasDeleted?: boolean;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Meta keys\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst NS = 'changes';\nconst KEY_SUMMARIES = 'summaries';\n\n// Tools whose output may contain a changeSnapshot\nconst TRACKED_TOOLS = new Set(['fs_write', 'fs_patch', 'fs_delete']);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// ChangeTrackingMiddleware\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface ChangeTrackingConfig {\n agentId: string;\n sessionId: string | undefined;\n workingDir: string;\n storageConfig?: Partial<StorageConfig>;\n}\n\nexport class ChangeTrackingMiddleware {\n readonly name = 'change-tracking';\n readonly order = 8;\n readonly config = { failPolicy: 'fail-open' as const };\n\n private readonly store: ChangeStore;\n private readonly agentId: string;\n private readonly sessionId: string | undefined;\n /** Current run ID — set on onStart, used to tag all changes in this run */\n private runId = '';\n\n constructor(cfg: ChangeTrackingConfig) {\n this.agentId = cfg.agentId;\n this.sessionId = cfg.sessionId;\n this.store = new ChangeStore(cfg.workingDir, cfg.storageConfig);\n }\n\n onStart(ctx: RunContext): void {\n this.runId = ctx.requestId;\n }\n\n async afterToolExec(ctx: ToolExecCtx, result: ToolOutput): Promise<void> {\n if (!result.success) {return;}\n if (!TRACKED_TOOLS.has(ctx.toolName)) {return;}\n\n const sessionId = ctx.run.sessionId ?? this.sessionId;\n if (!sessionId) {return;}\n\n const snap = result.metadata?.['changeSnapshot'] as ChangeSnapshot | undefined;\n if (!snap) {return;}\n\n // filePath comes from tool input\n const filePath = ctx.input['path'] as string | undefined;\n if (!filePath) {return;}\n\n const change = await this.store.save({\n sessionId,\n agentId: this.agentId,\n runId: this.runId,\n filePath,\n operation: snap.operation,\n beforeContent: snap.beforeContent,\n afterContent: snap.afterContent,\n metadata: {\n isOverwrite: snap.isOverwrite,\n startLine: snap.startLine,\n endLine: snap.endLine,\n linesAdded: snap.linesAdded,\n linesRemoved: snap.linesRemoved,\n wasDeleted: snap.wasDeleted,\n },\n });\n\n // Accumulate summaries in meta so runner can read them\n const existing = ctx.run.meta.get<FileChangeSummary[]>(NS, KEY_SUMMARIES) ?? [];\n ctx.run.meta.set(NS, KEY_SUMMARIES, [...existing, toSummary(change)]);\n }\n\n /** Rollback all changes captured in the current run — useful for undo-run */\n async rollbackRun(sessionId: string, workingDir: string): Promise<{ rolledBack: number; errors: string[] }> {\n const changes = await this.store.listRun(sessionId, this.runId);\n // Process in reverse chronological order\n const ordered = [...changes].sort(\n (a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime(),\n );\n\n let rolledBack = 0;\n const errors: string[] = [];\n\n for (const change of ordered) {\n const fullPath = path.join(workingDir, change.filePath);\n try {\n if (change.operation === 'delete') {\n // Restore deleted file\n if (change.before) {\n await fs.promises.mkdir(path.dirname(fullPath), { recursive: true });\n await fs.promises.writeFile(fullPath, change.before.content, 'utf-8');\n rolledBack++;\n }\n } else if (change.before) {\n // Restore previous content\n await fs.promises.mkdir(path.dirname(fullPath), { recursive: true });\n await fs.promises.writeFile(fullPath, change.before.content, 'utf-8');\n rolledBack++;\n } else {\n // New file created by agent — delete it\n await fs.promises.unlink(fullPath).catch((e: NodeJS.ErrnoException) => {\n if (e.code !== 'ENOENT') {throw e;}\n });\n rolledBack++;\n }\n } catch (e) {\n errors.push(`${change.filePath}: ${String(e)}`);\n }\n }\n\n return { rolledBack, errors };\n }\n\n /** Expose store for external queries (CLI, REST handlers) */\n get changeStore(): ChangeStore {\n return this.store;\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Meta accessor helpers — used by SDKAgentRunner to read results\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function getFileChangeSummaries(ctx: RunContext): FileChangeSummary[] {\n return ctx.meta.get<FileChangeSummary[]>(NS, KEY_SUMMARIES) ?? [];\n}\n","/**\n * BudgetMiddleware — token budget enforcement and convergence nudging.\n *\n * Hook points:\n * - beforeIteration: check hard limit → return 'stop' if exceeded\n * - beforeLLMCall: inject convergence nudge at soft limit via LLMCallPatch\n *\n * Token counter is injected via a simple getter — the runner owns totalTokens\n * and passes a closure. Everything else (policy, nudge state) lives here.\n */\n\nimport type { RunContext, LLMCtx, LLMCallPatch, ControlAction } from '@kb-labs/agent-sdk';\n\nexport interface BudgetPolicy {\n active: boolean;\n maxTokens: number;\n softLimitRatio: number;\n hardLimitRatio: number;\n hardStop: boolean;\n forceSynthesisOnHardLimit: boolean;\n}\n\n/**\n * Diminishing returns detection thresholds.\n * If N consecutive iterations each consume fewer than DELTA_THRESHOLD tokens,\n * the agent is spinning without meaningful work — inject convergence nudge.\n */\nconst DIMINISHING_RETURNS_WINDOW = 3;\nconst DIMINISHING_DELTA_THRESHOLD = 500;\n\nexport class BudgetMiddleware {\n readonly name = 'budget';\n readonly order = 10;\n readonly config = { failPolicy: 'fail-closed' as const, timeoutMs: 2000 };\n\n private readonly policy: BudgetPolicy;\n private readonly getTokensUsed: () => number;\n private _convergenceNudgeSent = false;\n /** Token deltas per iteration for diminishing returns detection */\n private _iterationDeltas: number[] = [];\n private _lastIterTokens = 0;\n private _diminishingNudgeSent = false;\n\n constructor(policy: BudgetPolicy, getTokensUsed: () => number) {\n this.policy = policy;\n this.getTokensUsed = getTokensUsed;\n }\n\n get convergenceNudgeSent(): boolean {\n return this._convergenceNudgeSent;\n }\n\n beforeIteration(ctx: RunContext): ControlAction {\n if (!this.policy.active || this.policy.maxTokens <= 0) {return 'continue';}\n\n const used = this.getTokensUsed();\n const hardLimit = this.policy.maxTokens * this.policy.hardLimitRatio;\n\n // ── Diminishing returns tracking ──\n // Track how many tokens each iteration consumes.\n // If several consecutive iterations produce tiny deltas, agent is spinning.\n const delta = used - this._lastIterTokens;\n this._lastIterTokens = used;\n if (ctx.iteration > 1) {\n this._iterationDeltas.push(delta);\n if (this._iterationDeltas.length > DIMINISHING_RETURNS_WINDOW) {\n this._iterationDeltas.shift();\n }\n }\n\n // Expose budget state for Status Block\n ctx.meta.set('budget', 'tokensUsed', used);\n ctx.meta.set('budget', 'maxTokens', this.policy.maxTokens);\n\n if (used >= hardLimit) {\n ctx.meta.set('budget', 'exhausted', true);\n ctx.meta.set('budget', 'exhaustedReason', `Token hard limit: ${used}/${hardLimit}`);\n\n if (this.policy.hardStop || this.policy.forceSynthesisOnHardLimit) {\n ctx.meta.set('budget', 'forceSynthesis', this.policy.forceSynthesisOnHardLimit);\n ctx.eventBus.emit('middleware:event', {\n name: 'budget',\n event: 'hard_stop',\n data: { tokensUsed: used, maxTokens: hardLimit },\n });\n return 'stop';\n }\n }\n\n return 'continue';\n }\n\n beforeLLMCall(ctx: LLMCtx): LLMCallPatch | undefined {\n if (!this.policy.active || this.policy.maxTokens <= 0) {return undefined;}\n if (this._convergenceNudgeSent) {return undefined;}\n\n const used = this.getTokensUsed();\n const softLimit = this.policy.maxTokens * this.policy.softLimitRatio;\n\n if (used >= softLimit) {\n this._convergenceNudgeSent = true;\n ctx.run.meta.set('budget', 'convergenceNudgeSent', true);\n\n const utilPct = Math.round((used / this.policy.maxTokens) * 100);\n ctx.run.eventBus.emit('middleware:event', {\n name: 'budget',\n event: 'soft_warning',\n data: { tokensUsed: used, maxTokens: this.policy.maxTokens, ratio: utilPct },\n });\n return {\n messages: [\n ...ctx.messages,\n {\n role: 'user' as const,\n content:\n `⚠️ TOKEN BUDGET: ${utilPct}% consumed (${used.toLocaleString()}/${this.policy.maxTokens.toLocaleString()} tokens). ` +\n `You are approaching the limit. Call \\`report\\` NOW with whatever you have — a partial answer is better than hitting the hard limit with nothing. Do not start new research.`,\n },\n ],\n };\n }\n\n // ── Diminishing returns detection ──\n // If last N iterations each consumed < threshold tokens, agent is spinning.\n // Send one nudge (separate from soft limit nudge).\n if (\n !this._diminishingNudgeSent &&\n this._iterationDeltas.length >= DIMINISHING_RETURNS_WINDOW &&\n this._iterationDeltas.every(d => d < DIMINISHING_DELTA_THRESHOLD)\n ) {\n this._diminishingNudgeSent = true;\n ctx.run.eventBus.emit('middleware:event', {\n name: 'budget',\n event: 'diminishing_returns',\n data: {\n recentDeltas: [...this._iterationDeltas],\n threshold: DIMINISHING_DELTA_THRESHOLD,\n window: DIMINISHING_RETURNS_WINDOW,\n },\n });\n return {\n messages: [\n ...ctx.messages,\n {\n role: 'user' as const,\n content:\n `⚠️ DIMINISHING RETURNS: Your last ${DIMINISHING_RETURNS_WINDOW} iterations each consumed fewer than ${DIMINISHING_DELTA_THRESHOLD} tokens — you are not making meaningful progress. Either call \\`report\\` with what you have, try a completely different approach, or call \\`ask_user\\` for guidance.`,\n },\n ],\n };\n }\n\n return undefined;\n }\n\n reset(): void {\n this._convergenceNudgeSent = false;\n this._iterationDeltas = [];\n this._lastIterTokens = 0;\n this._diminishingNudgeSent = false;\n }\n}\n","/**\n * ProgressMiddleware — stuck detection and loop detection.\n *\n * Hook points:\n * - beforeIteration: detect stuck state (too many iterations without progress)\n * - afterToolExec: reset counter on successful tool, detect repeated call loops\n *\n * All state lives here. Callbacks are optional observers (for logging/telemetry).\n * fail-open: progress tracking errors never break execution.\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { RunContext, LLMCtx, LLMCallPatch, ToolExecCtx, ToolOutput, ControlAction } from '@kb-labs/agent-sdk';\n\nexport interface ProgressCallbacks {\n onProgress?: (iteration: number) => void;\n onStuck?: (iteration: number, iterationsSinceProgress: number) => void;\n onLoop?: (iteration: number, repeatedCalls: string[]) => void;\n}\n\nexport class ProgressMiddleware {\n readonly name = 'progress';\n readonly order = 50;\n readonly config = { failPolicy: 'fail-open' as const, timeoutMs: 2000 };\n\n private readonly stuckThreshold: number;\n private readonly callbacks: ProgressCallbacks;\n private _iterationsSinceProgress = 0;\n private _recentToolCalls: string[] = [];\n private _lastIterNudgeSent = false;\n /** Tracks which stuck nudge level was last sent (0 = none) */\n private _stuckNudgeLevel = 0;\n /** Tool calls since last plan_write (plan mode checkpoint tracking) */\n private _toolCallsSincePlanWrite = 0;\n /** Whether plan checkpoint nudge was injected for current LLM call */\n private _planCheckpointPending = false;\n\n constructor(stuckThreshold = 4, callbacks: ProgressCallbacks = {}) {\n this.stuckThreshold = stuckThreshold;\n this.callbacks = callbacks;\n }\n\n get iterationsSinceProgress(): number {\n return this._iterationsSinceProgress;\n }\n\n get isStuck(): boolean {\n return this._iterationsSinceProgress >= this.stuckThreshold;\n }\n\n beforeIteration(ctx: RunContext): ControlAction {\n this._iterationsSinceProgress++;\n\n if (this.isStuck) {\n ctx.meta.set('progress', 'isStuck', true);\n ctx.meta.set('progress', 'iterationsSinceProgress', this._iterationsSinceProgress);\n this.callbacks.onStuck?.(ctx.iteration, this._iterationsSinceProgress);\n ctx.eventBus.emit('middleware:event', {\n name: 'progress',\n event: 'stuck',\n data: { iteration: ctx.iteration, iterationsSinceProgress: this._iterationsSinceProgress },\n });\n }\n\n return 'continue';\n }\n\n beforeLLMCall(ctx: LLMCtx): LLMCallPatch | undefined {\n if (this._lastIterNudgeSent) {return undefined;}\n\n const { iteration, maxIterations } = ctx.run;\n // Fire on the last iteration (agent has no more turns after this)\n if (iteration >= maxIterations) {\n this._lastIterNudgeSent = true;\n ctx.run.eventBus.emit('middleware:event', {\n name: 'progress',\n event: 'last_iteration_nudge',\n data: { iteration, maxIterations },\n });\n return {\n messages: [\n ...ctx.messages,\n {\n role: 'system' as const,\n content:\n `⚠️ FINAL ITERATION (${iteration}/${maxIterations}): You MUST call the \\`report\\` tool now with your complete final answer. No other tool calls are allowed.`,\n },\n ],\n toolChoice: { type: 'function' as const, function: { name: 'report' } },\n };\n }\n\n // ── Graduated stuck recovery nudges ──────────────────────────────\n // Level 1: gentle suggestion at stuckThreshold (default 4)\n // Level 2: stronger guidance at stuckThreshold + 2\n // Level 3: forced convergence at stuckThreshold + 4\n const sinceProgress = this._iterationsSinceProgress;\n\n if (sinceProgress >= this.stuckThreshold && this._stuckNudgeLevel < 3) {\n const level3Threshold = this.stuckThreshold + 4;\n const level2Threshold = this.stuckThreshold + 2;\n\n if (sinceProgress >= level3Threshold && this._stuckNudgeLevel < 3) {\n this._stuckNudgeLevel = 3;\n ctx.run.eventBus.emit('middleware:event', {\n name: 'progress',\n event: 'stuck_nudge',\n data: { level: 3, iteration, sinceProgress },\n });\n return {\n messages: [\n ...ctx.messages,\n {\n role: 'user' as const,\n content:\n `⚠️ STUCK (${sinceProgress} iterations without progress): You MUST either call \\`report\\` with whatever findings you have, or call \\`ask_user\\` for help. Do not continue your current approach — it is not working.`,\n },\n ],\n toolChoice: { type: 'function' as const, function: { name: 'report' } },\n };\n }\n\n if (sinceProgress >= level2Threshold && this._stuckNudgeLevel < 2) {\n this._stuckNudgeLevel = 2;\n ctx.run.eventBus.emit('middleware:event', {\n name: 'progress',\n event: 'stuck_nudge',\n data: { level: 2, iteration, sinceProgress },\n });\n return {\n messages: [\n ...ctx.messages,\n {\n role: 'user' as const,\n content:\n `⚠️ Still stuck (${sinceProgress} iterations without new evidence). Consider: (1) call \\`report\\` with partial results, (2) call \\`ask_user\\` for clarification, (3) narrow your scope and try a simpler approach.`,\n },\n ],\n };\n }\n\n if (this._stuckNudgeLevel < 1) {\n this._stuckNudgeLevel = 1;\n ctx.run.eventBus.emit('middleware:event', {\n name: 'progress',\n event: 'stuck_nudge',\n data: { level: 1, iteration, sinceProgress },\n });\n return {\n messages: [\n ...ctx.messages,\n {\n role: 'user' as const,\n content:\n `⚠️ No progress in ${sinceProgress} iterations. Try a different approach: use different search terms, explore different files, or simplify your goal.`,\n },\n ],\n };\n }\n }\n\n // ── Plan mode checkpoint nudge ────────────────────────────────────\n // After 5+ tool calls without plan_write, remind the agent to save progress.\n // Inspired by Claude Code sparse reminders (every 5 turns).\n if (this._planCheckpointPending) {\n this._planCheckpointPending = false;\n const isPlanMode = ctx.run.meta.get<boolean>('mode', 'isPlanMode')\n ?? ctx.messages.some(m => typeof m.content === 'string' && m.content.includes('PLAN MODE'));\n if (isPlanMode) {\n // Read current plan file to show agent what it already wrote\n const currentPlan = this._readPlanFile(ctx);\n const planContext = currentPlan\n ? `\\n\\nYour current plan file contains:\\n\\`\\`\\`\\n${currentPlan.slice(0, 2000)}\\n\\`\\`\\`\\n\\nUpdate it with new findings using plan_write(content=\"<full updated plan>\").`\n : '\\n\\nPlan file is empty. Call plan_write(content=\"# Plan\\\\n\\\\n## Findings\\\\n...\") to start building it.';\n\n ctx.run.eventBus.emit('middleware:event', {\n name: 'progress',\n event: 'plan_checkpoint_nudge',\n data: { toolCallsSincePlanWrite: this._toolCallsSincePlanWrite },\n });\n return {\n messages: [\n ...ctx.messages,\n {\n role: 'user' as const,\n content:\n `⚠️ PLAN CHECKPOINT: You've made ${this._toolCallsSincePlanWrite} tool calls without updating the plan file. ` +\n `Call \\`plan_write\\` NOW to save what you've learned so far.${planContext}`,\n },\n ],\n };\n }\n }\n\n // ── Loop detection nudge ─────────────────────────────────────────\n const loopDetected = ctx.run.meta.get<boolean>('progress', 'loopDetected');\n if (loopDetected) {\n // Clear the flag so we don't re-nudge every iteration\n ctx.run.meta.set('progress', 'loopDetected', false);\n return {\n messages: [\n ...ctx.messages,\n {\n role: 'user' as const,\n content:\n '⚠️ Loop detected: you are repeating the same tool calls. Stop and try a completely different strategy, or call `report` with your current findings.',\n },\n ],\n };\n }\n\n return undefined;\n }\n\n afterToolExec(ctx: ToolExecCtx, result: ToolOutput): void {\n // ── Plan mode checkpoint tracking ──\n if (ctx.toolName === 'plan_write') {\n this._toolCallsSincePlanWrite = 0;\n } else if (ctx.toolName !== 'report' && ctx.toolName !== 'plan_validate') {\n this._toolCallsSincePlanWrite++;\n // After 5 non-plan tool calls, flag for checkpoint nudge\n if (this._toolCallsSincePlanWrite >= 5) {\n this._planCheckpointPending = true;\n }\n }\n\n const sig = `${ctx.toolName}:${JSON.stringify(ctx.input)}`;\n this._recentToolCalls.push(sig);\n if (this._recentToolCalls.length > 6) {\n this._recentToolCalls.shift();\n }\n\n // Loop detection: same 3 calls repeated twice\n if (this._recentToolCalls.length >= 6) {\n const last3 = this._recentToolCalls.slice(-3).join('|');\n const prev3 = this._recentToolCalls.slice(-6, -3).join('|');\n if (last3 === prev3) {\n const repeatedCalls = this._recentToolCalls.slice(-3).map((s) => s.split(':')[0] ?? s);\n ctx.run.meta.set('progress', 'loopDetected', true);\n ctx.run.meta.set('progress', 'repeatedCalls', repeatedCalls);\n this.callbacks.onLoop?.(ctx.iteration, repeatedCalls);\n ctx.run.eventBus.emit('middleware:event', {\n name: 'progress',\n event: 'loop_detected',\n data: { iteration: ctx.iteration, repeatedCalls },\n });\n }\n }\n\n // Progress: successful tool with output resets the stuck counter\n if (result.success && result.output && result.output.length > 0) {\n this._iterationsSinceProgress = 0;\n this._stuckNudgeLevel = 0;\n this.callbacks.onProgress?.(ctx.iteration);\n }\n }\n\n /**\n * Read current plan.md from session directory.\n * Returns null if no plan file exists or session info unavailable.\n */\n private _readPlanFile(ctx: LLMCtx): string | null {\n try {\n const sessionId = ctx.run.meta.get<string>('session', 'id')\n ?? ctx.run.requestId; // fallback\n const workingDir = ctx.run.meta.get<string>('session', 'workingDir')\n ?? process.cwd();\n const planPath = path.join(workingDir, '.kb', 'agents', 'sessions', sessionId, 'plan.md');\n if (fs.existsSync(planPath)) {\n return fs.readFileSync(planPath, 'utf-8');\n }\n } catch {\n // Never break execution for plan file read failure\n }\n return null;\n }\n\n reset(): void {\n this._iterationsSinceProgress = 0;\n this._recentToolCalls = [];\n this._lastIterNudgeSent = false;\n this._stuckNudgeLevel = 0;\n this._toolCallsSincePlanWrite = 0;\n this._planCheckpointPending = false;\n }\n}\n","/**\n * AnalyticsMiddleware — pure observer for metrics and tool outcome tracking.\n *\n * Hook points:\n * - onStart: record start time\n * - afterLLMCall: record token usage\n * - afterToolExec: track tool outcomes\n * - onStop: emit run metrics\n *\n * fail-open: analytics should NEVER break execution.\n */\n\nimport type { RunContext, LLMCtx, LLMCallResult, ToolExecCtx, ToolOutput } from '@kb-labs/agent-sdk';\n\nexport interface ToolOutcome {\n toolName: string;\n success: boolean;\n durationMs?: number;\n errorCode?: string;\n}\n\nexport interface RunMetrics {\n startedAt: number;\n endedAt: number;\n durationMs: number;\n totalIterations: number;\n toolOutcomes: ToolOutcome[];\n toolSuccessCount: number;\n toolErrorCount: number;\n stopReason?: string;\n}\n\nexport interface AnalyticsCallbacks {\n onRunComplete?: (metrics: RunMetrics) => void;\n onToolOutcome?: (outcome: ToolOutcome) => void;\n}\n\nexport class AnalyticsMiddleware {\n readonly name = 'analytics';\n readonly order = 90;\n readonly config = { failPolicy: 'fail-open' as const, timeoutMs: 3000 };\n\n private readonly callbacks: AnalyticsCallbacks;\n private _startedAt = 0;\n private _toolOutcomes: ToolOutcome[] = [];\n private _toolSuccessCount = 0;\n private _toolErrorCount = 0;\n private _lastIteration = 0;\n\n constructor(callbacks: AnalyticsCallbacks = {}) {\n this.callbacks = callbacks;\n }\n\n get toolSuccessCount(): number { return this._toolSuccessCount; }\n get toolErrorCount(): number { return this._toolErrorCount; }\n get toolOutcomes(): ReadonlyArray<ToolOutcome> { return this._toolOutcomes; }\n\n onStart(_ctx: RunContext): void {\n this._startedAt = Date.now();\n this._toolOutcomes = [];\n this._toolSuccessCount = 0;\n this._toolErrorCount = 0;\n }\n\n afterLLMCall(ctx: LLMCtx, result: LLMCallResult): void {\n this._lastIteration = ctx.run.iteration;\n if (result.usage) {\n ctx.run.meta.set('analytics', 'lastLLMTokens', result.usage.promptTokens + result.usage.completionTokens);\n }\n }\n\n afterToolExec(_ctx: ToolExecCtx, result: ToolOutput): void {\n const outcome: ToolOutcome = {\n toolName: _ctx.toolName,\n success: result.success,\n errorCode: result.success ? undefined : 'TOOL_ERROR',\n };\n\n this._toolOutcomes.push(outcome);\n if (!result.success) {\n this._toolErrorCount++;\n } else {\n this._toolSuccessCount++;\n }\n\n this.callbacks.onToolOutcome?.(outcome);\n }\n\n onStop(_ctx: RunContext, reason: string): void {\n const metrics: RunMetrics = {\n startedAt: this._startedAt,\n endedAt: Date.now(),\n durationMs: Date.now() - this._startedAt,\n totalIterations: this._lastIteration + 1,\n toolOutcomes: this._toolOutcomes,\n toolSuccessCount: this._toolSuccessCount,\n toolErrorCount: this._toolErrorCount,\n stopReason: reason,\n };\n\n this.callbacks.onRunComplete?.(metrics);\n }\n\n reset(): void {\n this._startedAt = 0;\n this._toolOutcomes = [];\n this._toolSuccessCount = 0;\n this._toolErrorCount = 0;\n this._lastIteration = 0;\n }\n}\n","/**\n * ContextFilterMiddleware — sliding window + output truncation + optional compaction.\n *\n * Hook points:\n * - afterToolExec: (intentionally empty — rounds extracted from ctx.messages in beforeLLMCall)\n * - beforeLLMCall: return LLMCallPatch with filtered message window\n *\n * Design:\n * - order = 15 (after budget=10, so budget's convergence nudge is already appended)\n * - failPolicy = 'fail-open' (never breaks execution)\n * - The middleware slices the last N iterations on each LLM call.\n * - System messages and the initial user task are ALWAYS preserved.\n * - Tool outputs longer than maxOutputLength are truncated.\n * - When enableCompaction is true, dropped rounds are summarized by a small-tier LLM\n * instead of being silently removed.\n */\n\nimport type { LLMCtx, LLMCallPatch, ToolExecCtx, ToolOutput } from '@kb-labs/agent-sdk';\nimport { useLLM, type ILLM, type LLMMessage } from '@kb-labs/sdk';\n\nexport interface ContextFilterMwConfig {\n /** Max characters for tool output before truncation (default: 8000) */\n maxOutputLength?: number;\n /** Number of most-recent assistant+tool-result \"rounds\" to keep (default: 10) */\n slidingWindowSize?: number;\n /** When true, dropped rounds are summarized by LLM instead of silently removed (default: false) */\n enableCompaction?: boolean;\n}\n\nexport class ContextFilterMiddleware {\n readonly name = 'context-filter';\n readonly order = 15;\n readonly config: { failPolicy: 'fail-open'; timeoutMs: number };\n\n private readonly maxOutputLength: number;\n private readonly slidingWindowSize: number;\n private readonly enableCompaction: boolean;\n\n // Accumulated assistant + tool messages from all iterations.\n // We do NOT store system/user prefix here — that comes from ctx.messages.\n private readonly rounds: Array<LLMMessage[]> = [];\n\n // Compaction cache: avoid re-summarizing on every LLM call when the dropped\n // set hasn't changed.\n private compactionCache: { boundary: number; summary: string } | null = null;\n private llm: ILLM | null = null;\n\n constructor(config: ContextFilterMwConfig = {}) {\n this.maxOutputLength = config.maxOutputLength ?? 8000;\n this.slidingWindowSize = config.slidingWindowSize ?? 10;\n this.enableCompaction = config.enableCompaction ?? false;\n\n // LLM calls for compaction need more time than simple array slicing.\n this.config = {\n failPolicy: 'fail-open',\n timeoutMs: this.enableCompaction ? 15_000 : 1000,\n };\n }\n\n // ── afterToolExec: intentionally empty ──────────────────────────────────────\n\n afterToolExec(ctx: ToolExecCtx, result: ToolOutput): void {\n void ctx;\n void result;\n }\n\n // ── beforeLLMCall: apply sliding window + truncation + optional compaction ──\n\n async beforeLLMCall(ctx: LLMCtx): Promise<LLMCallPatch | undefined> {\n const msgs = ctx.messages;\n\n // Find the boundary between \"prefix\" (system+task) and \"conversation rounds\"\n const prefixEnd = findPrefixEnd(msgs);\n\n if (prefixEnd >= msgs.length) {\n return undefined;\n }\n\n const prefix = msgs.slice(0, prefixEnd);\n const rounds = splitIntoRounds(msgs.slice(prefixEnd));\n\n // If we're within window — just truncate outputs, no messages removed\n if (rounds.length <= this.slidingWindowSize) {\n const truncated = rounds.flatMap((r) => r.map((m) => this.truncate(m)));\n if (!hasAnyTruncation(truncated, msgs.slice(prefixEnd))) {\n return undefined;\n }\n return { messages: [...prefix, ...truncated] };\n }\n\n // Rounds exceed window — need to drop older ones\n const kept = rounds.slice(-this.slidingWindowSize);\n // Microcompact: clear old tool outputs in kept rounds, preserve recent ones full\n const microcompacted = this.microcompact(kept);\n const truncated = microcompacted.flatMap((r) => r.map((m) => this.truncate(m)));\n const droppedRounds = rounds.slice(0, rounds.length - this.slidingWindowSize);\n const droppedCount = droppedRounds.length;\n\n ctx.run.eventBus.emit('middleware:event', {\n name: 'context-filter',\n event: 'trimmed',\n data: { droppedRounds: droppedCount, keptRounds: this.slidingWindowSize },\n });\n\n // Build summary of dropped rounds (compaction or simple note)\n const summaryContent = await this.buildDropSummary(droppedRounds, droppedCount);\n const summaryMsg: LLMMessage = { role: 'system', content: summaryContent };\n\n return { messages: [...prefix, summaryMsg, ...truncated] };\n }\n\n // ── compaction ─────────────────────────────────────────────────────────────\n\n /**\n * Build a summary for dropped rounds.\n * With compaction enabled: LLM summarization (cached).\n * Without compaction: simple \"[N earlier iterations removed]\" note.\n */\n private async buildDropSummary(\n droppedRounds: LLMMessage[][],\n droppedCount: number,\n ): Promise<string> {\n if (!this.enableCompaction) {\n return `[Context filter: ${droppedCount} earlier iteration(s) removed to stay within context window]`;\n }\n\n // Check cache: if boundary hasn't changed, reuse previous summary\n if (this.compactionCache && this.compactionCache.boundary === droppedCount) {\n return this.compactionCache.summary;\n }\n\n try {\n const summary = await this.summarizeRounds(droppedRounds);\n this.compactionCache = { boundary: droppedCount, summary };\n return summary;\n } catch {\n // Fallback on LLM error — never break execution\n return `[Context filter: ${droppedCount} earlier iteration(s) removed to stay within context window]`;\n }\n }\n\n /**\n * Call small-tier LLM to summarize dropped rounds into a compact block.\n */\n private async summarizeRounds(rounds: LLMMessage[][]): Promise<string> {\n if (!this.llm) {\n this.llm = useLLM({ tier: 'small' }) ?? null;\n }\n if (!this.llm?.complete) {\n throw new Error('No LLM available for compaction');\n }\n\n // Flatten rounds into a readable transcript, truncating each message\n const transcript = rounds\n .map((round, i) => {\n const lines = round.map((m) => {\n const content = typeof m.content === 'string'\n ? m.content.slice(0, 2000)\n : JSON.stringify(m.content ?? '').slice(0, 2000);\n return `[${m.role}] ${content}`;\n });\n return `--- Round ${i + 1} ---\\n${lines.join('\\n')}`;\n })\n .join('\\n\\n');\n\n // Cap total input to avoid blowing context on the summarization call itself\n const cappedTranscript = transcript.slice(0, 12_000);\n\n const prompt = [\n 'CRITICAL: Respond with TEXT ONLY. Do NOT call any tools.',\n '',\n 'Summarize the following agent conversation rounds into a structured recap.',\n 'You MUST preserve the following information (do not omit any section):',\n '',\n '1. **Primary request and intent** — What was the user\\'s original task? What is the goal?',\n '2. **Key technical concepts** — Important types, functions, patterns mentioned.',\n '3. **Files and code sections** — Every file read or modified, with brief description of what was found/changed. Include file paths.',\n '4. **Errors and fixes** — Any errors encountered and how they were resolved (or not).',\n '5. **Decisions made** — Approach chosen, alternatives considered and rejected.',\n '6. **Current work** — What was the agent working on in the most recent rounds?',\n '7. **Pending tasks** — What remains to be done?',\n '',\n 'Output a compact summary (max 600 words). Use bullet points within each section.',\n 'Do NOT include raw tool outputs or full file contents — only summarize key information.',\n 'PRESERVE ALL FILE PATHS mentioned — these are critical for the agent to continue working.',\n '',\n cappedTranscript,\n ].join('\\n');\n\n const response = await this.llm.complete(prompt, {\n maxTokens: 800,\n temperature: 0.1,\n });\n\n const text = typeof response === 'string' ? response : response?.content ?? '';\n\n return `[Compacted summary of ${rounds.length} earlier iteration(s)]\\n\\n${text.trim()}`;\n }\n\n // ── microcompact: clear old tool outputs, keep reasoning ───────────────────\n\n /**\n * Microcompact: for rounds being kept (not dropped), clear tool result content\n * from old rounds while keeping assistant text. This reduces context size\n * without losing the agent's reasoning chain.\n *\n * Only applied to rounds older than `keepFullRounds` from the end.\n * The most recent rounds keep full tool outputs for immediate context.\n */\n private microcompact(rounds: LLMMessage[][], keepFullRounds = 3): LLMMessage[][] {\n if (rounds.length <= keepFullRounds) { return rounds; }\n\n const compactedCount = rounds.length - keepFullRounds;\n return rounds.map((round, i) => {\n if (i >= compactedCount) { return round; } // keep recent rounds full\n\n return round.map((msg) => {\n if (msg.role !== 'tool') { return msg; }\n // Replace tool output with compact marker\n const content = typeof msg.content === 'string' ? msg.content : '';\n const firstLine = content.split('\\n')[0]?.slice(0, 120) ?? '';\n return {\n ...msg,\n content: `[Tool output cleared — first line: ${firstLine}...]`,\n };\n });\n });\n }\n\n // ── helpers ─────────────────────────────────────────────────────────────────\n\n private truncate(msg: LLMMessage): LLMMessage {\n if (msg.role !== 'tool') { return msg; }\n\n const content = typeof msg.content === 'string' ? msg.content : '';\n if (content.length <= this.maxOutputLength) { return msg; }\n\n const truncated = content.slice(0, this.maxOutputLength);\n const remaining = content.length - this.maxOutputLength;\n return {\n ...msg,\n content: `${truncated}\\n\\n[TRUNCATED: ${remaining} more characters not shown — tool output was cut at ${this.maxOutputLength} chars. If the relevant content may be in the truncated part, use a more specific query or request a smaller range.]`,\n };\n }\n}\n\n// ── module-level helpers ─────────────────────────────────────────────────────\n\n/**\n * Returns the index of the first message that belongs to a conversation round\n * (i.e., the first 'assistant' message). Everything before that is the prefix.\n */\nfunction findPrefixEnd(msgs: readonly LLMMessage[]): number {\n for (let i = 0; i < msgs.length; i++) {\n if (msgs[i]?.role === 'assistant') { return i; }\n }\n return msgs.length;\n}\n\n/**\n * Split messages into \"rounds\". Each round starts with an assistant message\n * (possibly with tool calls) followed by zero or more tool result messages.\n */\nfunction splitIntoRounds(msgs: readonly LLMMessage[]): LLMMessage[][] {\n const rounds: LLMMessage[][] = [];\n let current: LLMMessage[] = [];\n\n for (const msg of msgs) {\n if (msg.role === 'assistant') {\n if (current.length > 0) {\n rounds.push(current);\n }\n current = [msg];\n } else {\n current.push(msg);\n }\n }\n\n if (current.length > 0) {\n rounds.push(current);\n }\n\n return rounds;\n}\n\n/**\n * Quick check: did truncation actually change any message content?\n */\nfunction hasAnyTruncation(after: LLMMessage[], before: readonly LLMMessage[]): boolean {\n if (after.length !== before.length) { return true; }\n for (let i = 0; i < after.length; i++) {\n if (after[i]?.content !== before[i]?.content) { return true; }\n }\n return false;\n}\n","// Core middlewares\nexport { ObservabilityMiddleware } from './observability-middleware.js';\nexport {\n ChangeTrackingMiddleware,\n getFileChangeSummaries,\n type ChangeTrackingConfig,\n type ChangeSnapshot,\n} from './change-tracking-middleware.js';\nexport { BudgetMiddleware, type BudgetPolicy } from './budget-middleware.js';\nexport { ProgressMiddleware, type ProgressCallbacks } from './progress-middleware.js';\nexport { AnalyticsMiddleware, type ToolOutcome, type RunMetrics, type AnalyticsCallbacks } from './analytics-middleware.js';\nexport { ContextFilterMiddleware, type ContextFilterMwConfig } from './context-filter-middleware.js';\nexport { TaskMiddleware, type TaskMiddlewareConfig, type SpawnFn } from './task-middleware.js';\n\n// Experimental middlewares (feature-flagged)\nexport { SearchSignalMiddleware, type SearchSignalMwState, type SearchSignalCallbacks } from './search-signal-middleware.js';\nexport { TodoSyncMiddleware, type TodoSyncCallbacks } from './todo-sync-middleware.js';\nexport { ReflectionMiddleware, type ReflectionCallbacks } from './reflection-middleware.js';\nexport { TaskClassifierMiddleware, type TaskIntent, type TaskClassification, type TaskClassifierCallbacks } from './task-classifier-middleware.js';\n","/**\n * SearchSignalMiddleware — search quality tracking and early conclusion.\n *\n * Feature-flagged: enabled when FeatureFlags.searchSignal is true.\n */\n\nimport type { FeatureFlags } from '@kb-labs/agent-contracts';\nimport type { ToolExecCtx, ToolOutput } from '@kb-labs/agent-sdk';\n\nconst SEARCH_TOOL_NAMES = new Set(['grep_search', 'glob_search', 'find_definition', 'fs_read']);\n\nexport interface SearchSignalMwState {\n searchSignalHits: number;\n lastSignalIteration: number;\n noResultStreak: number;\n}\n\nexport interface SearchSignalCallbacks {\n onSignalHit?: (toolName: string, iteration: number) => void;\n onNoResultStreak?: (streak: number, iteration: number) => void;\n}\n\nexport class SearchSignalMiddleware {\n readonly name = 'search-signal';\n readonly order = 60;\n readonly config = { failPolicy: 'fail-open' as const, timeoutMs: 2000 };\n\n private readonly callbacks: SearchSignalCallbacks;\n private _hits = 0;\n private _lastSignalIteration = -1;\n private _noResultStreak = 0;\n private _featureFlags?: FeatureFlags;\n\n constructor(callbacks: SearchSignalCallbacks = {}) {\n this.callbacks = callbacks;\n }\n\n enabled(): boolean {\n return this._featureFlags?.searchSignal ?? false;\n }\n\n withFeatureFlags(flags: FeatureFlags): this {\n this._featureFlags = flags;\n return this;\n }\n\n get state(): SearchSignalMwState {\n return {\n searchSignalHits: this._hits,\n lastSignalIteration: this._lastSignalIteration,\n noResultStreak: this._noResultStreak,\n };\n }\n\n afterToolExec(ctx: ToolExecCtx, result: ToolOutput): void {\n if (!SEARCH_TOOL_NAMES.has(ctx.toolName)) {return;}\n\n const hasResults = result.output && result.output.length > 50 && result.success;\n\n if (hasResults) {\n this._hits++;\n this._lastSignalIteration = ctx.iteration;\n this._noResultStreak = 0;\n this.callbacks.onSignalHit?.(ctx.toolName, ctx.iteration);\n } else {\n this._noResultStreak++;\n this.callbacks.onNoResultStreak?.(this._noResultStreak, ctx.iteration);\n }\n\n ctx.run.meta.set('search', 'signalHits', this._hits);\n ctx.run.meta.set('search', 'lastSignalIteration', this._lastSignalIteration);\n }\n\n onStop(): void {\n this.reset();\n }\n\n reset(): void {\n this._hits = 0;\n this._lastSignalIteration = -1;\n this._noResultStreak = 0;\n }\n}\n","/**\n * TodoSyncMiddleware — todo list coordination and phase syncing.\n *\n * Feature-flagged: enabled when FeatureFlags.todoSync is true.\n */\n\nimport type { FeatureFlags } from '@kb-labs/agent-contracts';\nimport type { RunContext, LLMCtx, LLMCallPatch, ControlAction } from '@kb-labs/agent-sdk';\n\nexport interface TodoSyncCallbacks {\n onNudge?: (iteration: number) => void;\n onFinalize?: (success: boolean) => void;\n}\n\nexport class TodoSyncMiddleware {\n readonly name = 'todo-sync';\n readonly order = 40;\n readonly config = { failPolicy: 'fail-open' as const, timeoutMs: 3000 };\n\n private readonly callbacks: TodoSyncCallbacks;\n private _nudgeSent = false;\n private _featureFlags?: FeatureFlags;\n\n constructor(callbacks: TodoSyncCallbacks = {}) {\n this.callbacks = callbacks;\n }\n\n enabled(): boolean {\n return this._featureFlags?.todoSync ?? false;\n }\n\n withFeatureFlags(flags: FeatureFlags): this {\n this._featureFlags = flags;\n return this;\n }\n\n get nudgeSent(): boolean {\n return this._nudgeSent;\n }\n\n beforeIteration(_ctx: RunContext): ControlAction {\n return 'continue';\n }\n\n beforeLLMCall(ctx: LLMCtx): LLMCallPatch | undefined {\n if (!this._nudgeSent && ctx.run.iteration >= 2) {\n this._nudgeSent = true;\n this.callbacks.onNudge?.(ctx.run.iteration);\n\n return {\n messages: [\n ...ctx.messages,\n {\n role: 'system' as const,\n content:\n 'This appears to be a multi-step task. Consider creating a short todo checklist ' +\n 'to track your progress and ensure all steps are completed.',\n },\n ],\n };\n }\n\n return undefined;\n }\n\n onStop(_ctx: RunContext, reason: string): void {\n const success = reason === 'report_complete';\n this.callbacks.onFinalize?.(success);\n }\n\n reset(): void {\n this._nudgeSent = false;\n }\n}\n","/**\n * ReflectionMiddleware — adaptive LLM-driven operational reflection.\n *\n * Feature-flagged: enabled when FeatureFlags.reflection is true.\n */\n\nimport type { FeatureFlags } from '@kb-labs/agent-contracts';\nimport type { ToolExecCtx, ToolOutput } from '@kb-labs/agent-sdk';\n\nexport interface ReflectionCallbacks {\n onReflectionNeeded?: (trigger: string, iteration: number) => void;\n}\n\nexport class ReflectionMiddleware {\n readonly name = 'reflection';\n readonly order = 70;\n readonly config = { failPolicy: 'fail-open' as const, timeoutMs: 5000 };\n\n private readonly callbacks: ReflectionCallbacks;\n private _toolCallsSinceReflection = 0;\n private _failedToolsSinceReflection = 0;\n private readonly reflectionInterval: number;\n private _featureFlags?: FeatureFlags;\n\n constructor(callbacks: ReflectionCallbacks = {}, reflectionInterval = 5) {\n this.callbacks = callbacks;\n this.reflectionInterval = reflectionInterval;\n }\n\n enabled(): boolean {\n return this._featureFlags?.reflection ?? false;\n }\n\n withFeatureFlags(flags: FeatureFlags): this {\n this._featureFlags = flags;\n return this;\n }\n\n afterToolExec(ctx: ToolExecCtx, result: ToolOutput): void {\n this._toolCallsSinceReflection++;\n if (!result.success) {\n this._failedToolsSinceReflection++;\n }\n\n const shouldReflect =\n this._toolCallsSinceReflection >= this.reflectionInterval ||\n (this._failedToolsSinceReflection >= 3 && this._toolCallsSinceReflection >= 3);\n\n if (shouldReflect) {\n const trigger = this._failedToolsSinceReflection >= 3 ? 'high_failure_rate' : 'periodic';\n ctx.run.meta.set('reflection', 'needed', true);\n ctx.run.meta.set('reflection', 'trigger', trigger);\n this.callbacks.onReflectionNeeded?.(trigger, ctx.iteration);\n this._toolCallsSinceReflection = 0;\n this._failedToolsSinceReflection = 0;\n }\n }\n\n onStop(): void {\n this.reset();\n }\n\n reset(): void {\n this._toolCallsSinceReflection = 0;\n this._failedToolsSinceReflection = 0;\n }\n}\n","/**\n * TaskClassifierMiddleware — intent inference and scope extraction.\n *\n * Feature-flagged: enabled when FeatureFlags.taskClassifier is true.\n * Runs first (order=5) — classification informs other middlewares.\n *\n * Classification strategy:\n * 1. LLM tool calling (preferred) — language-agnostic, semantic, uses classify_task tool\n * 2. Heuristic regex fallback — instant, no LLM cost, English/Russian keywords\n */\n\nimport type { FeatureFlags } from '@kb-labs/agent-contracts';\nimport type { RunContext } from '@kb-labs/agent-sdk';\nimport { useLLM, type LLMTool } from '@kb-labs/sdk';\n\nexport type TaskIntent = 'action' | 'discovery' | 'analysis';\n\nexport interface TaskClassification {\n intent: TaskIntent;\n scope?: string;\n confidence: number;\n}\n\n// ─── Tool definition for LLM-based classification ────────────────────────────\n\nconst CLASSIFY_TASK_TOOL: LLMTool = {\n name: 'classify_task',\n description: 'Classify the user task intent and extract scope.',\n inputSchema: {\n type: 'object',\n properties: {\n intent: {\n type: 'string',\n enum: ['action', 'discovery', 'analysis'],\n description: '\"action\" = create/modify/fix something; \"discovery\" = find/explain/show something; \"analysis\" = evaluate/audit/compare something',\n },\n scope: {\n type: 'string',\n description: 'Optional: main subject/target of the task (e.g. \"authentication system\", \"src/index.ts\")',\n },\n confidence: {\n type: 'number',\n minimum: 0,\n maximum: 1,\n description: 'Confidence in this classification 0.0-1.0',\n },\n },\n required: ['intent', 'confidence'],\n },\n};\n\n// ─── Regex fallback (English + Russian keywords) ──────────────────────────────\n\nconst ACTION_PATTERNS = /\\b(create|add|fix|update|delete|remove|implement|write|modify|change|refactor|rename|создай|добавь|исправь|удали|реализуй|измени|переименуй)\\b/i;\nconst DISCOVERY_PATTERNS = /\\b(find|search|locate|where|what|show|list|explain|describe|how does|найди|где|что|покажи|объясни|опиши|как работает)\\b/i;\nconst ANALYSIS_PATTERNS = /\\b(analyze|review|audit|check|compare|evaluate|assess|benchmark|profile|проанализируй|проверь|сравни|оцени|изучи)\\b/i;\n\nfunction classifyHeuristic(task: string): TaskClassification {\n const hasAction = ACTION_PATTERNS.test(task);\n const hasDiscovery = DISCOVERY_PATTERNS.test(task);\n const hasAnalysis = ANALYSIS_PATTERNS.test(task);\n\n let intent: TaskIntent;\n let confidence: number;\n\n if (hasAction && !hasDiscovery && !hasAnalysis) {\n intent = 'action'; confidence = 0.8;\n } else if (hasAnalysis && !hasAction) {\n intent = 'analysis'; confidence = 0.8;\n } else if (hasDiscovery && !hasAction && !hasAnalysis) {\n intent = 'discovery'; confidence = 0.8;\n } else if (hasAction && (hasDiscovery || hasAnalysis)) {\n intent = 'action'; confidence = 0.5;\n } else {\n intent = 'action'; confidence = 0.3;\n }\n\n return { intent, confidence };\n}\n\n// ─── Middleware ───────────────────────────────────────────────────────────────\n\nexport interface TaskClassifierCallbacks {\n onClassified?: (classification: TaskClassification) => void;\n}\n\nexport class TaskClassifierMiddleware {\n readonly name = 'task-classifier';\n readonly order = 5;\n readonly config = { failPolicy: 'fail-open' as const, timeoutMs: 5000 };\n\n private readonly callbacks: TaskClassifierCallbacks;\n private _classification: TaskClassification | null = null;\n private _featureFlags?: FeatureFlags;\n\n constructor(callbacks: TaskClassifierCallbacks = {}) {\n this.callbacks = callbacks;\n }\n\n enabled(): boolean {\n return this._featureFlags?.taskClassifier ?? false;\n }\n\n withFeatureFlags(flags: FeatureFlags): this {\n this._featureFlags = flags;\n return this;\n }\n\n get classification(): TaskClassification | null {\n return this._classification;\n }\n\n async onStart(ctx: RunContext): Promise<void> {\n const classification = await this.classify(ctx.task);\n this._classification = classification;\n ctx.meta.set('classifier', 'intent', classification.intent);\n ctx.meta.set('classifier', 'confidence', classification.confidence);\n if (classification.scope) {\n ctx.meta.set('classifier', 'scope', classification.scope);\n }\n this.callbacks.onClassified?.(classification);\n }\n\n private async classify(task: string): Promise<TaskClassification> {\n // Try LLM tool calling first — language-agnostic, semantic classification\n const llm = useLLM({ tier: 'small' });\n if (llm?.chatWithTools) {\n try {\n const response = await llm.chatWithTools(\n [\n {\n role: 'system',\n content: 'Classify the user task. Call classify_task with the intent, optional scope, and confidence.',\n },\n { role: 'user', content: task },\n ],\n {\n tools: [CLASSIFY_TASK_TOOL],\n toolChoice: { type: 'function', function: { name: 'classify_task' } },\n temperature: 0,\n maxTokens: 100,\n },\n );\n\n const call = response.toolCalls?.find(tc => tc.name === 'classify_task');\n if (call?.input) {\n const data = call.input as { intent?: string; scope?: string; confidence?: number };\n if (data.intent === 'action' || data.intent === 'discovery' || data.intent === 'analysis') {\n return {\n intent: data.intent,\n scope: data.scope,\n confidence: Math.min(1.0, Math.max(0.0, data.confidence ?? 0.7)),\n };\n }\n }\n } catch {\n // fall through to heuristic fallback\n }\n }\n\n // Fallback: fast heuristic regex (no LLM cost)\n return classifyHeuristic(task);\n }\n\n reset(): void {\n this._classification = null;\n }\n}\n","/**\n * @kb-labs/agent-core\n *\n * Core agent implementation and orchestration\n */\n\n// Planning\nexport * from './planning/index.js';\n\n// Modes\nexport * from './modes/index.js';\n\n// Execution primitives\nexport * from './execution/index.js';\n\n// Prompt construction\nexport * from './prompt/index.js';\n\n// Analytics and run metrics\nexport * from './analytics/index.js';\n\n// Middleware pipeline\nexport * from './middleware/index.js';\n\n// Tool management\nexport * from './tools/index.js';\n\n// Sub-agent system\nexport * from './agents/index.js';\n\n// SDK-native agent runner\nexport * from './core/index.js';\n\n// New runtime foundation\nexport { SessionArtifactStore } from '@kb-labs/agent-store';\nexport {\n createKernelState,\n ingestUserTurn,\n completePendingActions,\n isCorrectionPendingAction,\n recordCorrection,\n recordDecision,\n recordToolArtifact,\n projectKernelPrompt,\n} from '@kb-labs/agent-kernel';\nexport { createSessionMemoryBridge } from './core/session-memory-bridge.js';\n","/**\n * AgentRegistry — typed catalogue of agent presets.\n *\n * Each preset specifies:\n * - toolPacks: which ToolPacks the agent gets (namespaces, not concrete classes)\n * - featureFlags overrides (vs DEFAULT_FEATURE_FLAGS)\n * - systemPrompt suffix (appended after the base prompt)\n * - maxIterations default\n * - readOnly: prevents write tools being registered\n *\n * Presets ship with the platform; consumers can add custom types via register().\n *\n * Design: registry is purely a data store (no Agent instantiation here).\n * The Orchestrator reads registry to configure child agents.\n */\n\nimport type { FeatureFlags } from '@kb-labs/agent-contracts';\nimport { DEFAULT_FEATURE_FLAGS } from '@kb-labs/agent-contracts';\n\n// ═══════════════════════════════════════════════════════════════════════\n// Types\n// ═══════════════════════════════════════════════════════════════════════\n\n/**\n * Which tool packs an agent is allowed to load.\n * 'core' — read-only file system, search, memory tools\n * 'coder' — full FS (write, patch), shell execution\n * 'kb-labs' — kb-labs specific tools (mind-rag, workflow, etc.)\n */\nexport type ToolPackRef = 'core' | 'coder' | 'kb-labs' | string;\n\n/**\n * A registered agent type definition.\n */\nexport interface AgentTypeDefinition {\n /** Unique identifier, used when spawning: `registry.get('researcher')` */\n readonly id: string;\n /** Human-readable label */\n readonly label: string;\n /** Brief description shown in UIs and prompts */\n readonly description: string;\n /** Tool packs this agent is allowed to use */\n readonly toolPacks: ToolPackRef[];\n /** Feature flag overrides (merged on top of DEFAULT_FEATURE_FLAGS) */\n readonly featureFlags?: Partial<FeatureFlags>;\n /** Suffix appended to the base system prompt */\n readonly systemPromptSuffix?: string;\n /** Default max iterations (can be overridden at spawn time) */\n readonly maxIterations: number;\n /** If true, write/patch/exec tools are stripped from registered packs */\n readonly readOnly: boolean;\n /** Max spawn depth: 0 = cannot spawn children */\n readonly maxDepth: number;\n}\n\n// ═══════════════════════════════════════════════════════════════════════\n// Built-in presets\n// ═══════════════════════════════════════════════════════════════════════\n\nconst PRESETS: readonly AgentTypeDefinition[] = [\n {\n id: 'researcher',\n label: 'Researcher',\n description:\n 'Read-only agent specialised in codebase exploration and evidence gathering. Cannot modify files.',\n toolPacks: ['core', 'kb-labs'],\n featureFlags: {\n searchSignal: true,\n taskClassifier: true,\n },\n systemPromptSuffix:\n 'You are a researcher. Your goal is to gather evidence and report findings. Do NOT create or modify files.',\n maxIterations: 15,\n readOnly: true,\n maxDepth: 0,\n },\n {\n id: 'coder',\n label: 'Coder',\n description:\n 'Full-access agent for code generation, refactoring, and fixes. Has write and shell access.',\n toolPacks: ['core', 'coder', 'kb-labs'],\n featureFlags: {\n todoSync: true,\n reflection: true,\n },\n systemPromptSuffix:\n 'You are a coder. Your goal is to implement changes correctly and efficiently.',\n maxIterations: 20,\n readOnly: false,\n maxDepth: 1,\n },\n {\n id: 'reviewer',\n label: 'Reviewer',\n description:\n 'Read-only agent for code review, analysis, and quality assessment.',\n toolPacks: ['core'],\n featureFlags: {\n searchSignal: true,\n taskClassifier: true,\n reflection: true,\n },\n systemPromptSuffix:\n 'You are a code reviewer. Analyse code quality, identify bugs, and suggest improvements. Do NOT modify files.',\n maxIterations: 10,\n readOnly: true,\n maxDepth: 0,\n },\n {\n id: 'orchestrator',\n label: 'Orchestrator',\n description:\n 'Meta-agent that decomposes complex tasks and delegates to specialised sub-agents.',\n toolPacks: ['core', 'kb-labs'],\n featureFlags: {\n tierEscalation: true,\n taskClassifier: true,\n },\n systemPromptSuffix:\n 'You are an orchestrator. Break complex tasks into subtasks and delegate them to specialised agents.',\n maxIterations: 10,\n readOnly: true,\n maxDepth: 3,\n },\n];\n\n// ═══════════════════════════════════════════════════════════════════════\n// AgentRegistry\n// ═══════════════════════════════════════════════════════════════════════\n\nexport class AgentRegistry {\n private readonly definitions = new Map<string, AgentTypeDefinition>();\n\n constructor() {\n // Register built-in presets\n for (const preset of PRESETS) {\n this.definitions.set(preset.id, preset);\n }\n }\n\n /**\n * Register a custom agent type or override a preset.\n * Throws if id is empty.\n */\n register(definition: AgentTypeDefinition): void {\n if (!definition.id.trim()) {\n throw new Error('AgentTypeDefinition.id must be non-empty');\n }\n this.definitions.set(definition.id, definition);\n }\n\n /**\n * Get an agent type definition by id.\n * Returns undefined if not found (callers should handle missing types).\n */\n get(id: string): AgentTypeDefinition | undefined {\n return this.definitions.get(id);\n }\n\n /**\n * Get an agent type definition, throwing if not found.\n */\n getOrThrow(id: string): AgentTypeDefinition {\n const def = this.definitions.get(id);\n if (!def) {\n throw new Error(\n `Agent type '${id}' not found in registry. Available: ${this.listIds().join(', ')}`,\n );\n }\n return def;\n }\n\n /**\n * List all registered agent type ids.\n */\n listIds(): string[] {\n return Array.from(this.definitions.keys());\n }\n\n /**\n * List all registered agent type definitions.\n */\n list(): AgentTypeDefinition[] {\n return Array.from(this.definitions.values());\n }\n\n /**\n * Merge feature flags: DEFAULT + preset overrides.\n */\n resolveFeatureFlags(id: string): FeatureFlags {\n const def = this.get(id);\n return {\n ...DEFAULT_FEATURE_FLAGS,\n ...(def?.featureFlags ?? {}),\n };\n }\n\n /**\n * Check whether a definition exists.\n */\n has(id: string): boolean {\n return this.definitions.has(id);\n }\n}\n\n/**\n * Singleton registry for the process (can be replaced in tests).\n */\nexport const globalAgentRegistry = new AgentRegistry();\n","/**\n * ParallelExecutor — resource-governed parallel sub-agent execution.\n *\n * Features:\n * - Concurrency cap: at most `maxConcurrent` agents run simultaneously\n * - Cancel tree: parent AbortController propagates to all children\n * - Budget partition: parent token budget split across children (equal | weighted)\n * - Dedupe key: identical tasks share one execution\n * - Backpressure: queue size cap, reject or wait when queue is full\n * - Join timeout: collect results up to `joinTimeoutMs`, return partial on timeout\n * - MaxDepth: prevents runaway recursion\n *\n * The executor is generic: it calls a `runner` function you provide,\n * so it has no direct dependency on the Agent class (testable in isolation).\n */\n\n// ═══════════════════════════════════════════════════════════════════════\n// Types\n// ═══════════════════════════════════════════════════════════════════════\n\nexport interface SubAgentRequest {\n /** Unique task description */\n task: string;\n /** Agent type from registry (default: 'researcher') */\n agentType?: string;\n /** Override max iterations for this specific spawn */\n maxIterations?: number;\n /** Working directory (relative to project root) */\n workingDir?: string;\n /**\n * Dedup key — if another pending/running task has the same key,\n * this request joins that result instead of spawning a new agent.\n * Default: task string itself.\n */\n dedupeKey?: string;\n /** Weight for budget partition (1 = equal share). Default: 1 */\n weight?: number;\n}\n\nexport interface SubAgentResult {\n task: string;\n agentType: string;\n success: boolean;\n result: string;\n iterations: number;\n tokensUsed: number;\n /** True if this result came from a deduped execution */\n deduped?: boolean;\n /** Error message if success=false */\n error?: string;\n /** Whether the result was collected before timeout */\n timedOut?: boolean;\n}\n\nexport type TokenPartitionStrategy = 'equal' | 'weighted';\n\nexport interface ParallelExecutorConfig {\n /** Maximum simultaneously running agents. Default: 5 */\n maxConcurrent: number;\n /** Maximum queue size (pending, not running). Reject beyond this. Default: 20 */\n maxQueueSize: number;\n /** Maximum nesting depth. 0 = cannot spawn. Default: 3 */\n maxDepth: number;\n /** Maximum time to wait for all agents to complete (ms). Default: 120_000 */\n joinTimeoutMs: number;\n /** How to split token budget across children. Default: 'equal' */\n tokenPartition: TokenPartitionStrategy;\n /** Total token budget available to share (0 = unlimited). Default: 0 */\n parentTokenBudget: number;\n}\n\nconst DEFAULT_CONFIG: ParallelExecutorConfig = {\n maxConcurrent: 5,\n maxQueueSize: 20,\n maxDepth: 3,\n joinTimeoutMs: 120_000,\n tokenPartition: 'equal',\n parentTokenBudget: 0,\n};\n\n/**\n * Function signature for actually running a sub-agent.\n * Injected by the caller (Agent or test stub).\n */\nexport type AgentRunner = (\n request: SubAgentRequest,\n tokenBudget: number,\n signal: AbortSignal,\n) => Promise<SubAgentResult>;\n\n// ═══════════════════════════════════════════════════════════════════════\n// ParallelExecutor\n// ═══════════════════════════════════════════════════════════════════════\n\nexport class ParallelExecutor {\n private readonly config: ParallelExecutorConfig;\n private readonly runner: AgentRunner;\n private readonly parentSignal: AbortSignal;\n\n /** Currently running slot count */\n private running = 0;\n /** Pending tasks waiting for a slot */\n private readonly queue: Array<() => void> = [];\n /** Dedup map: key → shared promise */\n private readonly dedupeMap = new Map<string, Promise<SubAgentResult>>();\n\n constructor(\n runner: AgentRunner,\n parentSignal: AbortSignal,\n config: Partial<ParallelExecutorConfig> = {},\n ) {\n this.runner = runner;\n this.parentSignal = parentSignal;\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Submit a batch of requests and collect results.\n * Returns when all finish or joinTimeoutMs elapses (whichever comes first).\n * Timed-out tasks have `timedOut: true` in their result.\n */\n async executeAll(requests: SubAgentRequest[], depth = 0): Promise<SubAgentResult[]> {\n if (depth > this.config.maxDepth) {\n return requests.map((r) => ({\n task: r.task,\n agentType: r.agentType ?? 'researcher',\n success: false,\n result: '',\n iterations: 0,\n tokensUsed: 0,\n error: `MaxDepth (${this.config.maxDepth}) exceeded at depth ${depth}`,\n }));\n }\n\n if (this.parentSignal.aborted) {\n return requests.map((r) => ({\n task: r.task,\n agentType: r.agentType ?? 'researcher',\n success: false,\n result: '',\n iterations: 0,\n tokensUsed: 0,\n error: 'Parent agent aborted',\n }));\n }\n\n const tokenBudgets = this.partitionBudget(requests);\n\n const promises = requests.map((req, i) =>\n this.submit(req, tokenBudgets[i]!, depth),\n );\n\n return this.joinWithTimeout(promises, this.config.joinTimeoutMs);\n }\n\n /**\n * Submit a single request.\n * Handles dedup, backpressure, and concurrency limit.\n */\n async submit(req: SubAgentRequest, tokenBudget: number, depth = 0): Promise<SubAgentResult> {\n const key = req.dedupeKey ?? req.task;\n\n // Dedup: share existing execution\n const existing = this.dedupeMap.get(key);\n if (existing) {\n return existing.then((r) => ({ ...r, deduped: true }));\n }\n\n // Backpressure: reject if queue is full\n if (this.queue.length >= this.config.maxQueueSize) {\n return {\n task: req.task,\n agentType: req.agentType ?? 'researcher',\n success: false,\n result: '',\n iterations: 0,\n tokensUsed: 0,\n error: `Executor queue full (maxQueueSize: ${this.config.maxQueueSize})`,\n };\n }\n\n const promise = this.enqueue(req, tokenBudget, depth);\n this.dedupeMap.set(key, promise);\n\n // Clean up dedup entry when done\n promise.finally(() => {\n this.dedupeMap.delete(key);\n });\n\n return promise;\n }\n\n // ── Private helpers ─────────────────────────────────────────────────\n\n private enqueue(req: SubAgentRequest, tokenBudget: number, depth: number): Promise<SubAgentResult> {\n return new Promise((resolve) => {\n const attempt = () => {\n if (this.running < this.config.maxConcurrent) {\n this.running++;\n this.runOne(req, tokenBudget, depth)\n .then(resolve)\n .finally(() => {\n this.running--;\n this.drainQueue();\n });\n } else {\n // Park in queue\n this.queue.push(attempt);\n }\n };\n attempt();\n });\n }\n\n private drainQueue(): void {\n while (this.queue.length > 0 && this.running < this.config.maxConcurrent) {\n const next = this.queue.shift()!;\n next();\n }\n }\n\n private async runOne(\n req: SubAgentRequest,\n tokenBudget: number,\n depth: number,\n ): Promise<SubAgentResult> {\n if (this.parentSignal.aborted) {\n return {\n task: req.task,\n agentType: req.agentType ?? 'researcher',\n success: false,\n result: '',\n iterations: 0,\n tokensUsed: 0,\n error: 'Parent agent aborted before execution',\n };\n }\n\n // Per-child AbortController linked to parent signal\n const childController = new AbortController();\n const onParentAbort = () => childController.abort();\n this.parentSignal.addEventListener('abort', onParentAbort, { once: true });\n\n try {\n return await this.runner(req, tokenBudget, childController.signal);\n } catch (error) {\n return {\n task: req.task,\n agentType: req.agentType ?? 'researcher',\n success: false,\n result: '',\n iterations: 0,\n tokensUsed: 0,\n error: error instanceof Error ? error.message : String(error),\n };\n } finally {\n this.parentSignal.removeEventListener('abort', onParentAbort);\n }\n }\n\n private partitionBudget(requests: SubAgentRequest[]): number[] {\n const total = this.config.parentTokenBudget;\n if (total === 0 || requests.length === 0) {\n return requests.map(() => 0);\n }\n\n if (this.config.tokenPartition === 'equal') {\n const share = Math.floor(total / requests.length);\n return requests.map(() => share);\n }\n\n // Weighted partition\n const weights = requests.map((r) => r.weight ?? 1);\n const totalWeight = weights.reduce((s, w) => s + w, 0);\n return weights.map((w) => Math.floor((w / totalWeight) * total));\n }\n\n private async joinWithTimeout(\n promises: Promise<SubAgentResult>[],\n timeoutMs: number,\n ): Promise<SubAgentResult[]> {\n if (promises.length === 0) {return [];}\n\n const timedOut = new Set<number>();\n const results: SubAgentResult[] = new Array(promises.length);\n\n // Wrap each promise with a timeout marker\n const raced = promises.map((p, i) => {\n const timer = new Promise<SubAgentResult>((resolve) => {\n setTimeout(() => {\n timedOut.add(i);\n resolve({\n task: '',\n agentType: '',\n success: false,\n result: '',\n iterations: 0,\n tokensUsed: 0,\n timedOut: true,\n error: `Timed out after ${timeoutMs}ms`,\n });\n }, timeoutMs);\n });\n return Promise.race([p, timer]).then((r) => {\n results[i] = r;\n });\n });\n\n await Promise.all(raced);\n return results;\n }\n\n /** Return current running/queue stats for monitoring. */\n stats(): { running: number; queued: number; deduped: number } {\n return {\n running: this.running,\n queued: this.queue.length,\n deduped: this.dedupeMap.size,\n };\n }\n}\n","/**\n * SubAgentOrchestrator — delegation strategy and spawn lifecycle.\n *\n * Strategies:\n * - 'auto' — LLM decides whether/how to decompose (future: use LLM call)\n * - 'sequential' — spawn sub-agents one at a time in order\n * - 'parallel' — spawn all sub-agents concurrently (via ParallelExecutor)\n *\n * The orchestrator composes AgentRegistry + ParallelExecutor and provides\n * the spawn function used by TaskMiddleware for async sub-agent delegation.\n */\n\nimport type { AgentRegistry} from './agent-registry.js';\nimport { globalAgentRegistry } from './agent-registry.js';\nimport { ParallelExecutor } from './parallel-executor.js';\nimport type {\n SubAgentRequest,\n SubAgentResult,\n AgentRunner,\n ParallelExecutorConfig,\n} from './parallel-executor.js';\n\n// ═══════════════════════════════════════════════════════════════════════\n// Types\n// ═══════════════════════════════════════════════════════════════════════\n\nexport type DelegationStrategy = 'auto' | 'sequential' | 'parallel';\n\nexport interface OrchestratorConfig {\n /** Strategy for delegating subtasks. Default: 'sequential' */\n strategy: DelegationStrategy;\n /** ParallelExecutor config (used for 'parallel' and 'auto' strategies) */\n executor: Partial<ParallelExecutorConfig>;\n /** Agent registry (default: globalAgentRegistry) */\n registry?: AgentRegistry;\n /** Current depth (incremented for each level of nesting) */\n depth: number;\n}\n\n/**\n * A single spawn request from the tool layer.\n * Used by TaskMiddleware's spawnFn to create sub-agents.\n */\nexport interface LegacySpawnRequest {\n task: string;\n maxIterations?: number;\n workingDir?: string;\n}\n\n/**\n * Result returned to the tool layer.\n */\nexport interface LegacySpawnResult {\n success: boolean;\n result: string;\n iterations: number;\n tokensUsed: number;\n}\n\nconst DEFAULT_CONFIG: OrchestratorConfig = {\n strategy: 'sequential',\n executor: {},\n depth: 0,\n};\n\n// ═══════════════════════════════════════════════════════════════════════\n// SubAgentOrchestrator\n// ═══════════════════════════════════════════════════════════════════════\n\nexport class SubAgentOrchestrator {\n private readonly config: OrchestratorConfig;\n private readonly registry: AgentRegistry;\n private readonly executor: ParallelExecutor;\n\n constructor(\n runner: AgentRunner,\n parentSignal: AbortSignal,\n config: Partial<OrchestratorConfig> = {},\n ) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.registry = config.registry ?? globalAgentRegistry;\n this.executor = new ParallelExecutor(runner, parentSignal, this.config.executor);\n }\n\n /**\n * Spawn a single sub-agent.\n */\n async spawnOne(req: LegacySpawnRequest): Promise<LegacySpawnResult> {\n const subReq: SubAgentRequest = {\n task: req.task,\n agentType: 'researcher', // default type\n maxIterations: req.maxIterations,\n workingDir: req.workingDir,\n };\n\n const result = await this.executor.submit(subReq, 0, this.config.depth);\n return this.toLegacyResult(result);\n }\n\n /**\n * Spawn multiple sub-agents using the configured strategy.\n */\n async spawnMany(\n requests: SubAgentRequest[],\n strategy?: DelegationStrategy,\n ): Promise<SubAgentResult[]> {\n const strat = strategy ?? this.config.strategy;\n\n if (strat === 'parallel') {\n return this.executor.executeAll(requests, this.config.depth);\n }\n\n // sequential / auto fallback\n const results: SubAgentResult[] = [];\n for (const req of requests) {\n const result = await this.executor.submit(req, 0, this.config.depth);\n results.push(result);\n // Early exit if parent was aborted\n if (result.error?.includes('aborted')) {break;}\n }\n return results;\n }\n\n /**\n * Resolve an agent type definition from the registry.\n * Returns undefined if agentType is not registered.\n */\n resolveAgentType(agentType: string) {\n return this.registry.get(agentType);\n }\n\n /**\n * Return executor stats for monitoring.\n */\n stats() {\n return this.executor.stats();\n }\n\n // ── Private helpers ─────────────────────────────────────────────────\n\n private toLegacyResult(r: SubAgentResult): LegacySpawnResult {\n return {\n success: r.success,\n result: r.error ? `Error: ${r.error}` : r.result,\n iterations: r.iterations,\n tokensUsed: r.tokensUsed,\n };\n }\n}\n","import type { IterationSnapshot, RunEvaluation } from '@kb-labs/agent-contracts';\nimport type { RunEvaluator, RunContext } from '@kb-labs/agent-sdk';\n\nconst MIN_SYNTHESIS_READINESS = 0.62;\nconst LOW_GAIN_THRESHOLD = 0.2;\n\nexport function createDefaultRunEvaluator(): RunEvaluator {\n return {\n id: 'default-run-evaluator',\n evaluate(input: { run: RunContext; snapshot: IterationSnapshot }): RunEvaluation {\n const { run, snapshot } = input;\n\n const progressRatio = snapshot.maxIterations > 0\n ? snapshot.iteration / snapshot.maxIterations\n : 0;\n const evidenceGain = clamp01(\n (snapshot.evidenceDelta >= 2 ? 0.7 : snapshot.evidenceDelta > 0 ? 0.45 : 0)\n + (snapshot.filesReadCount > 0 ? 0.15 : 0)\n + (snapshot.filesModifiedCount > 0 || snapshot.filesCreatedCount > 0 ? 0.1 : 0),\n );\n const evidenceCoverage = clamp01(snapshot.evidenceCount / 6);\n const readinessScore = clamp01(\n (evidenceCoverage * 0.6)\n + (progressRatio * 0.2)\n + (snapshot.newEvidence ? 0.1 : 0)\n + (snapshot.repeatsWithoutEvidence > 0 ? 0.1 : 0),\n );\n const repeatedStrategy = snapshot.repeatsWithoutEvidence > 0;\n const previousRecommendation = run.meta.get<string>('evaluation', 'lastRecommendation');\n\n let recommendation: RunEvaluation['recommendation'] = 'continue';\n let rationale = 'Recent iterations are still adding useful evidence.';\n\n if (!snapshot.newEvidence && repeatedStrategy && readinessScore < MIN_SYNTHESIS_READINESS) {\n recommendation = 'narrow';\n rationale = 'Recent iterations are repeating without adding evidence; narrow the search to unresolved gaps.';\n }\n\n if (\n !snapshot.newEvidence\n && readinessScore >= MIN_SYNTHESIS_READINESS\n && (\n repeatedStrategy\n || evidenceGain <= LOW_GAIN_THRESHOLD\n || previousRecommendation === 'narrow'\n )\n ) {\n recommendation = 'synthesize';\n rationale = 'Evidence gain has flattened and the run has enough support to synthesize a bounded answer.';\n }\n\n return {\n evidenceGain,\n readinessScore,\n repeatedStrategy,\n recommendation,\n rationale,\n };\n },\n };\n}\n\nfunction clamp01(value: number): number {\n if (value <= 0) {\n return 0;\n }\n if (value >= 1) {\n return 1;\n }\n return Math.round(value * 100) / 100;\n}\n","/**\n * SDKAgentRunner — clean agent implementation via AgentSDK.\n *\n * Composition:\n * AgentSDK state → SDKAgentRunner → ObservabilityMiddleware (events + file tracking)\n * → BudgetMiddleware (token budget enforcement)\n * → ContextFilterMiddleware (sliding window + truncation)\n * → FactSheetMiddleware (structured working memory)\n * → ProgressMiddleware (stuck/loop detection)\n * → TodoSyncMiddleware (feature-flagged)\n * → SearchSignalMiddleware (feature-flagged)\n * → ReflectionMiddleware (feature-flagged)\n * → TaskClassifierMiddleware (feature-flagged)\n * → MiddlewarePipeline\n * → ToolManager (ToolPacks)\n * → ToolExecutor (guards + processors)\n * → LoopContextImpl\n * → ExecutionLoop (LinearExecutionLoop)\n * → SubAgentOrchestrator (child agents)\n *\n * Tier escalation:\n * - Runner iterates small → medium → large\n * - If LoopResult.outcome === 'escalate', move to next tier\n * - If LoopResult.outcome === 'complete', build TaskResult and return\n *\n * Mode routing:\n * - mode === 'execute' → run the loop directly\n * - any other mode → delegate to getModeHandler() (plan/edit/debug)\n * getModeHandler still needs a ToolRegistry for legacy mode handlers.\n * We bridge via a thin ToolRegistry adapter wrapping ToolManager.\n *\n * Observability (from AgentConfig):\n * - onEvent → forwarded via ObservabilityMiddleware (agent:start/end, llm:*, tool:*, etc.)\n * - memory → context injected into system prompt via SystemPromptBuilder\n * - conversationHistory → injected into messages before first user turn\n * - filesRead/Modified/Created → tracked by ObservabilityMiddleware in run.meta\n * - workingDir → WorkspaceDiscovery enriches system prompt with repo map\n */\n\nimport { randomUUID } from 'node:crypto';\nimport {\n useLLM,\n useAnalytics,\n useLogger,\n type LLMMessage,\n type LLMTool,\n} from '@kb-labs/sdk';\nimport { AGENT_ANALYTICS_EVENTS } from '@kb-labs/agent-contracts';\nimport type { AgentConfig, LLMTier, TaskResult, SpawnAgentRequest, SpawnAgentResult, SubAgentPreset } from '@kb-labs/agent-contracts';\nimport type { Turn } from '@kb-labs/agent-contracts';\nimport type { AgentSDK, IAgentRunner } from '@kb-labs/agent-sdk';\nimport { RuntimeEngine } from '@kb-labs/agent-runtime';\nimport { SessionArtifactStore } from '@kb-labs/agent-store';\nimport { LinearExecutionLoop } from '../execution/linear-execution-loop.js';\nimport { createDefaultRunEvaluator } from '../execution/default-run-evaluator.js';\nimport { MiddlewarePipeline } from '../middleware/pipeline.js';\nimport { ToolManager } from '../tools/tool-manager.js';\nimport { SystemPromptBuilder } from '../prompt/system-prompt-builder.js';\n\nimport { createRunContext } from './run-context.js';\nimport { ToolExecutor } from './tool-executor.js';\nimport { LoopContextImpl } from './loop-context.js';\nimport { ObservabilityMiddleware } from '../middleware/builtin/observability-middleware.js';\nimport { ContextFilterMiddleware } from '../middleware/builtin/context-filter-middleware.js';\nimport { BudgetMiddleware } from '../middleware/builtin/budget-middleware.js';\nimport { ProgressMiddleware } from '../middleware/builtin/progress-middleware.js';\nimport { FactSheetMiddleware } from '../middleware/builtin/factsheet-middleware.js';\nimport { AnalyticsMiddleware } from '../middleware/builtin/analytics-middleware.js';\nimport { ChangeTrackingMiddleware, getFileChangeSummaries } from '../middleware/builtin/change-tracking-middleware.js';\nimport { TaskMiddleware } from '../middleware/builtin/task-middleware.js';\nimport { discoverWorkspace } from '../execution/workspace-discovery.js';\nimport { ToolInputNormalizer } from '../tools/tool-input-normalizer.js';\nimport { createAsyncTaskToolPack } from '../tools/async-task-pack.js';\nimport { SessionManager } from '../planning/session-manager.js';\nimport { RunMetricsEmitter, getKpiBaselineKey } from '../analytics/index.js';\nimport type { RunKpiPayload } from '../analytics/index.js';\nimport { createSessionMemoryBridge } from './session-memory-bridge.js';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Tier escalation order\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst TIER_ORDER: LLMTier[] = ['small', 'medium', 'large'];\n\nfunction nextTier(current: LLMTier): LLMTier | undefined {\n const idx = TIER_ORDER.indexOf(current);\n return idx >= 0 && idx < TIER_ORDER.length - 1 ? TIER_ORDER[idx + 1] : undefined;\n}\n\ntype TierMetrics = {\n durationMs: number;\n toolCallsTotal: number;\n toolSuccessCount: number;\n toolErrorCount: number;\n};\n\ntype TierResult = TaskResult & {\n _escalated?: boolean;\n _escalationReason?: string;\n _metrics: TierMetrics;\n};\n\ntype QualityGateResult = {\n status: 'pass' | 'partial' | 'fail';\n score: number;\n reasons: string[];\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// SDKAgentRunner\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport class SDKAgentRunner implements IAgentRunner {\n readonly agentId: string;\n\n private readonly abortController: AbortController;\n private readonly injectedMessages: LLMMessage[] = [];\n private readonly runMetricsEmitter = new RunMetricsEmitter();\n /** Accumulated token count for the current execution. Promoted to class field for budget cap access by spawnChildAgent. */\n private totalTokens = 0;\n\n constructor(\n private readonly config: AgentConfig,\n private readonly sdk: AgentSDK,\n ) {\n this.agentId = config.agentId ?? randomUUID();\n this.abortController = new AbortController();\n\n // Honor parent abort signal\n if (config.abortSignal) {\n config.abortSignal.addEventListener('abort', () => this.abortController.abort());\n }\n }\n\n // ── IAgentRunner API ────────────────────────────────────────────────────────\n\n async execute(task: string): Promise<TaskResult> {\n const mode = this.config.mode?.mode ?? 'execute';\n\n // Non-execute modes delegate to ModeHandler — each handler owns its lifecycle.\n if (mode !== 'execute') {\n return this.runWithModeHandler(task);\n }\n\n // Execute mode: if there's an approved plan for this session, route through\n // ExecuteModeHandler so it can inject the plan and track lifecycle status.\n if (this.config.sessionId && this.config.workingDir) {\n const { SessionManager } = await import('../planning/session-manager.js');\n const { promises: fs } = await import('node:fs');\n try {\n const sessionManager = new SessionManager(this.config.workingDir);\n const planPath = sessionManager.getSessionPlanPath(this.config.sessionId);\n const raw = await fs.readFile(planPath, 'utf-8');\n const plan = JSON.parse(raw);\n if (plan.status === 'approved' || plan.status === 'draft') {\n return this.runWithModeHandler(task);\n }\n } catch {\n // No plan found — proceed with direct execution\n }\n }\n\n return this.runExecuteMode(task);\n }\n\n requestStop(): void {\n this.abortController.abort();\n }\n\n injectUserContext(message: string): void {\n this.injectedMessages.push({ role: 'user', content: message });\n }\n\n // ── Execute mode: tier escalation loop ─────────────────────────────────────\n\n private async runExecuteMode(task: string): Promise<TaskResult> {\n this.runMetricsEmitter.reset();\n const startTier: LLMTier = this.config.tier ?? 'medium';\n let currentTier = startTier;\n let tiersUsed = 0;\n let aggregateDurationMs = 0;\n let aggregateToolCalls = 0;\n let aggregateToolSuccesses = 0;\n let aggregateToolErrors = 0;\n let aggregateTokens = 0;\n let aggregateIterations = 0;\n const filesRead = new Set<string>();\n const filesModified = new Set<string>();\n const filesCreated = new Set<string>();\n\n while (true) {\n const result = await this.executeWithTier(task, currentTier);\n tiersUsed += 1;\n aggregateDurationMs += result._metrics.durationMs;\n aggregateToolCalls += result._metrics.toolCallsTotal;\n aggregateToolSuccesses += result._metrics.toolSuccessCount;\n aggregateToolErrors += result._metrics.toolErrorCount;\n aggregateTokens += result.tokensUsed;\n aggregateIterations += result.iterations;\n for (const path of result.filesRead) {filesRead.add(path);}\n for (const path of result.filesModified) {filesModified.add(path);}\n for (const path of result.filesCreated) {filesCreated.add(path);}\n\n if (result._escalated) {\n const next = nextTier(currentTier);\n if (next) {\n const logger = useLogger();\n logger.info(`[SDKAgentRunner] Escalating: ${currentTier} → ${next}`);\n await this.recordTierEscalation(\n currentTier,\n next,\n result._escalationReason ?? result.summary,\n result.iterations,\n task,\n );\n this.config.onEvent?.({\n type: 'status:change',\n timestamp: new Date().toISOString(),\n agentId: this.agentId,\n data: { status: 'escalating', message: `Tier escalation: ${currentTier} → ${next}` },\n } as any);\n currentTier = next;\n continue;\n }\n // Already at highest tier — return whatever we got\n const { _escalated: _, _escalationReason: __, _metrics: ___, ...taskResult } = result;\n const finalResult: TaskResult = {\n ...taskResult,\n iterations: aggregateIterations,\n tokensUsed: aggregateTokens,\n filesRead: [...filesRead],\n filesModified: [...filesModified],\n filesCreated: [...filesCreated],\n };\n await this.emitRunKpis(task, startTier, currentTier, tiersUsed, finalResult, {\n durationMs: aggregateDurationMs,\n toolCallsTotal: aggregateToolCalls,\n toolSuccessCount: aggregateToolSuccesses,\n toolErrorCount: aggregateToolErrors,\n });\n return finalResult;\n }\n\n const { _escalated: _, _escalationReason: __, _metrics: ___, ...taskResult } = result;\n const finalResult: TaskResult = {\n ...taskResult,\n iterations: aggregateIterations,\n tokensUsed: aggregateTokens,\n filesRead: [...filesRead],\n filesModified: [...filesModified],\n filesCreated: [...filesCreated],\n };\n await this.emitRunKpis(task, startTier, currentTier, tiersUsed, finalResult, {\n durationMs: aggregateDurationMs,\n toolCallsTotal: aggregateToolCalls,\n toolSuccessCount: aggregateToolSuccesses,\n toolErrorCount: aggregateToolErrors,\n });\n return finalResult;\n }\n }\n\n // ── Single-tier execution ───────────────────────────────────────────────────\n\n private async executeWithTier(\n task: string,\n tier: LLMTier,\n ): Promise<TierResult> {\n const logger = useLogger();\n const tierStartedAt = Date.now();\n let toolSuccessCount = 0;\n let toolErrorCount = 0;\n let toolCallsTotal = 0;\n let runDurationMs = 0;\n const runtimeStore = this.config.sessionId\n ? new SessionArtifactStore(this.config.workingDir)\n : null;\n const runtimeEngine = this.config.sessionId && runtimeStore\n ? new RuntimeEngine(this.sdk, runtimeStore)\n : null;\n\n // ── 1. LLM ───────────────────────────────────────────────────────────────\n const llm = useLLM({ tier });\n if (!llm?.chatWithTools) {\n return this.withMetrics(\n this.failResult(`LLM tier \"${tier}\" not available or doesn't support tool calling`, 0),\n { durationMs: Date.now() - tierStartedAt, toolCallsTotal: 0, toolSuccessCount: 0, toolErrorCount: 0 },\n );\n }\n\n // ── 2. ToolManager ───────────────────────────────────────────────────────\n const toolManager = new ToolManager({\n onAudit: (toolName, packId, input) => {\n logger?.debug?.(`[audit] pack=${packId} tool=${toolName} input=${JSON.stringify(input)}`);\n },\n });\n\n for (const pack of this.sdk.packs) {\n toolManager.register(pack);\n }\n\n // Register async task tools (only for parent agents that can spawn sub-agents)\n const taskMw = new TaskMiddleware({ maxConcurrent: 5 });\n if (!this.config.parentAgentId) {\n taskMw.setSpawnFn((req) => this.spawnChildAgent(req));\n toolManager.register(createAsyncTaskToolPack(taskMw));\n }\n\n await toolManager.initializeAll();\n\n // Apply tool allowlist for sub-agents (preset-based filtering)\n if (this.config.allowedTools && this.config.allowedTools.length > 0) {\n toolManager.applyAllowlist(this.config.allowedTools);\n }\n\n // ── 3. ToolExecutor (normalizers + guards + processors) ───────────────────\n const coreNormalizer = new ToolInputNormalizer({\n workingDir: this.config.workingDir,\n });\n const toolExecutor = new ToolExecutor(\n toolManager,\n this.sdk.guards,\n this.sdk.outputProcessors,\n [coreNormalizer, ...this.sdk.inputNormalizers],\n );\n\n // ── 4. Core middlewares ───────────────────────────────────────────────────\n\n // Reset token counter for this tier attempt (class field for budget cap access)\n this.totalTokens = 0;\n\n // ObservabilityMiddleware — events + file tracking (order=5)\n const runtimeAwareOnEvent: AgentConfig['onEvent'] = (event) => {\n if (runtimeEngine && this.config.sessionId) {\n void runtimeEngine.recordEvent({ ...event, sessionId: event.sessionId || this.config.sessionId });\n }\n void this.config.onEvent?.(event);\n };\n\n const observabilityMw = new ObservabilityMiddleware(\n this.agentId,\n this.config.parentAgentId,\n this.config.sessionId,\n runtimeAwareOnEvent,\n );\n\n // BudgetMiddleware — token enforcement (order=10)\n // Default: 1M tokens per run. Token budget is the primary execution control;\n // maxIterations is only a safety net.\n const budgetCfg = this.config.tokenBudget;\n const defaultMaxTokens = 1_000_000;\n const budgetMw = new BudgetMiddleware(\n {\n active: true,\n maxTokens: budgetCfg?.maxTokens ?? defaultMaxTokens,\n softLimitRatio: budgetCfg?.softLimitRatio ?? 0.8,\n hardLimitRatio: budgetCfg?.hardLimitRatio ?? 1.0,\n hardStop: budgetCfg?.hardStop ?? false,\n forceSynthesisOnHardLimit: budgetCfg?.forceSynthesisOnHardLimit ?? true,\n },\n () => this.totalTokens,\n );\n\n // ContextFilterMiddleware — sliding window + output truncation + compaction (order=15)\n const contextFilterMw = new ContextFilterMiddleware({\n maxOutputLength: 8000,\n slidingWindowSize: 10,\n enableCompaction: true,\n });\n\n // FactSheetMiddleware — structured working memory (order=20)\n const factSheetMw = new FactSheetMiddleware({\n persistDir: this.config.sessionId\n ? `${this.config.workingDir}/.kb/memory/sessions/${this.config.sessionId}`\n : undefined,\n summarizationInterval: 5,\n });\n\n // ChangeTrackingMiddleware — file snapshot capture + rollback support (order=8)\n const changeTrackingMw = new ChangeTrackingMiddleware({\n agentId: this.agentId,\n sessionId: this.config.sessionId,\n workingDir: this.config.workingDir,\n });\n\n // ProgressMiddleware — stuck/loop detection (order=50)\n const progressMw = new ProgressMiddleware(4, {\n onStuck: (iteration, iters) => {\n logger?.warn?.(`[progress] stuck at iteration ${iteration} (${iters} iters without progress)`);\n },\n onLoop: (iteration, calls) => {\n logger?.warn?.(`[progress] loop detected at iteration ${iteration}: ${calls.join(', ')}`);\n },\n });\n const analytics = this.getAnalytics();\n const analyticsMw = new AnalyticsMiddleware({\n onToolOutcome: (outcome) => {\n toolCallsTotal += 1;\n if (outcome.success) {\n toolSuccessCount += 1;\n } else {\n toolErrorCount += 1;\n }\n this.runMetricsEmitter.trackToolOutcome(\n {\n toolName: outcome.toolName,\n success: outcome.success,\n durationMs: outcome.durationMs ?? 0,\n errorCode: outcome.errorCode,\n },\n {\n analytics,\n toolCalledEvent: AGENT_ANALYTICS_EVENTS.TOOL_CALLED,\n log: (msg: string) => logger?.warn?.(msg),\n },\n );\n },\n onRunComplete: (metrics) => {\n runDurationMs = metrics.durationMs;\n },\n });\n\n // ── 5. MiddlewarePipeline ────────────────────────────────────────────────\n // sdk.middlewares = optional extras registered by the caller (TodoSync, Reflection, etc.)\n const featureFlags = {\n twoTierMemory: true, todoSync: true, searchSignal: true,\n reflection: true, taskClassifier: true, smartSummarizer: true,\n tierEscalation: true,\n };\n const pipeline = new MiddlewarePipeline(\n [observabilityMw, changeTrackingMw, budgetMw, contextFilterMw, factSheetMw, taskMw, progressMw, analyticsMw, ...this.sdk.middlewares],\n {\n featureFlags,\n onError: (middlewareName, hookName, error) => {\n const msg = error instanceof Error ? error.message : String(error);\n logger?.warn?.(`[middleware] ${middlewareName}.${hookName} failed (fail-open): ${msg}`);\n },\n },\n );\n\n // ── 8. RunContext ──────────────────────────────────────────────────────\n const requestId = randomUUID();\n const tools = this.buildLLMTools(toolManager);\n\n const { run, messages } = createRunContext({\n config: this.config,\n tier,\n tools,\n abortController: this.abortController,\n requestId,\n });\n (run as { task: string }).task = task;\n\n // ── 10. System prompt (memory + workspace discovery) ──────────────────────\n const workspaceDiscovery = await discoverWorkspace(this.config.workingDir).catch(() => null);\n const sessionManager = this.config.sessionId\n ? new SessionManager(this.config.workingDir)\n : null;\n if (runtimeEngine && this.config.sessionId) {\n await runtimeEngine.loadOrCreateKernel({\n sessionId: this.config.sessionId,\n workingDir: this.config.workingDir,\n mode: this.config.mode?.mode,\n task,\n });\n }\n const directAnswer = runtimeEngine\n ? await runtimeEngine.tryResolveDirectAnswer([])\n : null;\n if (runtimeEngine && directAnswer && this.config.sessionId) {\n await runtimeEngine.completeRun({\n sessionId: this.config.sessionId,\n mode: this.config.mode?.mode,\n summary: directAnswer.answer,\n filesRead: directAnswer.filesRead,\n });\n const directResult: TaskResult = {\n success: true,\n summary: directAnswer.answer,\n filesCreated: [],\n filesModified: [],\n filesRead: directAnswer.filesRead,\n iterations: 1,\n tokensUsed: 0,\n sessionId: this.config.sessionId,\n };\n return this.withMetrics(directResult, {\n durationMs: Date.now() - tierStartedAt,\n toolCallsTotal: 0,\n toolSuccessCount: 0,\n toolErrorCount: 0,\n });\n }\n const continuityEnabled = !!this.config.sessionId;\n const traceArtifactsContext = continuityEnabled && this.config.sessionId && sessionManager\n ? await sessionManager.getTraceArtifactsContext(this.config.sessionId).catch(() => '')\n : '';\n const sessionFactsHint = this.config.sessionId && sessionManager && this.shouldInjectSessionFacts(task)\n ? await this.getSessionFactsHint(sessionManager, this.config.sessionId)\n : '';\n const runtimePromptContext = runtimeEngine\n ? await runtimeEngine.projectPrompt([])\n : '';\n\n const promptBuilder = new SystemPromptBuilder();\n const systemPrompt = await promptBuilder.build({\n workingDir: this.config.workingDir,\n responseMode: 'auto',\n isSubAgent: !!this.config.parentAgentId,\n sessionId: this.config.sessionId,\n currentTask: task,\n workspaceDiscovery: workspaceDiscovery ?? undefined,\n archiveSummaryHint: [runtimePromptContext, sessionFactsHint, traceArtifactsContext]\n .filter(Boolean)\n .join('\\n\\n') || undefined,\n });\n\n // ── 11. Initial messages: system + task ──────────────────────────────────\n messages.push({ role: 'system', content: systemPrompt });\n\n const historyMessages = continuityEnabled ? await this.loadConversationMessages(task) : [];\n messages.push(...historyMessages);\n\n messages.push({ role: 'user', content: task });\n\n // Inject any queued user context (from injectUserContext() calls)\n for (const msg of this.injectedMessages) {\n messages.push(msg);\n }\n\n // ── 12. Loop ──────────────────────────────────────────────────────────────\n const loop = this.sdk.loop ?? new LinearExecutionLoop();\n\n const loopCtx = new LoopContextImpl(\n run,\n messages,\n llm,\n pipeline,\n toolExecutor,\n (delta) => { this.totalTokens += delta; },\n async (activeRun, snapshot) => {\n const runtimeProfileEvaluators = runtimeEngine?.getActiveProfile()?.runEvaluators ?? [];\n const evaluators = [\n ...runtimeProfileEvaluators,\n ...this.sdk.runEvaluators,\n createDefaultRunEvaluator(),\n ];\n let best: Awaited<ReturnType<typeof evaluators[number]['evaluate']>> = null;\n for (const evaluator of evaluators) {\n const result = await evaluator.evaluate({ run: activeRun, snapshot });\n if (!result) {\n continue;\n }\n if (!best || result.readinessScore >= best.readinessScore) {\n best = result;\n }\n }\n return best;\n },\n );\n\n // Enrich observability with budget + workspace for agent:start trace event\n observabilityMw.startMeta = {\n budget: {\n maxTokens: budgetMw['policy'].maxTokens,\n softLimitRatio: budgetMw['policy'].softLimitRatio,\n hardLimitRatio: budgetMw['policy'].hardLimitRatio,\n },\n workspaceTopology: workspaceDiscovery?.repos.map(r => {\n const rel = r.path.replace(this.config.workingDir + '/', '') || '.';\n return `${rel} (${r.reasons.join(', ')})`;\n }),\n workingDir: this.config.workingDir,\n };\n\n await pipeline.onStart(run);\n\n const loopResult = await loop.run(loopCtx);\n\n // ── 11. Handle escalation ─────────────────────────────────────────────────\n if (loopResult.outcome === 'escalate') {\n await pipeline.onStop(run, 'escalate');\n return this.withMetrics({\n ...this.failResult(`Escalating to next tier: ${loopResult.reason}`, run.iteration),\n _escalated: true,\n _escalationReason: loopResult.reason,\n }, {\n durationMs: runDurationMs || (Date.now() - tierStartedAt),\n toolCallsTotal,\n toolSuccessCount,\n toolErrorCount,\n });\n }\n\n // ── 12. Build TaskResult ──────────────────────────────────────────────────\n // Handle handoff (treat as a failed run — handoff routing not implemented here)\n if (loopResult.outcome === 'handoff') {\n await pipeline.onStop(run, 'handoff');\n await toolManager.disposeAll();\n return this.withMetrics(this.failResult(\n `Agent requested handoff to \"${loopResult.toAgent}\" (not supported in SDKAgentRunner)`,\n run.iteration,\n ), {\n durationMs: runDurationMs || (Date.now() - tierStartedAt),\n toolCallsTotal,\n toolSuccessCount,\n toolErrorCount,\n });\n }\n\n const output = loopResult.result;\n\n // Store final answer in meta so ObservabilityMiddleware can include it in agent:end\n if (output.answer) {\n run.meta.set('agent', 'finalAnswer', output.answer);\n }\n\n await pipeline.onStop(run, output.reasonCode);\n if (output.success) {\n await pipeline.onComplete(run);\n }\n\n await toolManager.disposeAll();\n\n // Read file tracking from run.meta (populated by ObservabilityMiddleware)\n const filesRead = run.meta.get<string[]>('files', 'read') ?? [];\n const filesModified = run.meta.get<string[]>('files', 'modified') ?? [];\n const filesCreated = run.meta.get<string[]>('files', 'created') ?? [];\n\n // Read file change summaries from run.meta (populated by ChangeTrackingMiddleware)\n const fileChanges = getFileChangeSummaries(run);\n\n const completionMetadata = { ...(output.metadata ?? {}) } as Record<string, unknown>;\n const runtimeProfileResultMappers = runtimeEngine?.getActiveProfile()?.resultMappers ?? [];\n\n let taskResult: TaskResult = {\n success: output.success,\n summary: output.answer,\n filesCreated,\n filesModified,\n filesRead,\n iterations: run.iteration,\n tokensUsed: this.totalTokens,\n sessionId: this.config.sessionId,\n fileChanges: fileChanges.length > 0 ? fileChanges : undefined,\n metrics: {\n stopReasonCode: output.reasonCode,\n repeatNoEvidenceCount: run.meta.get<number>('loop', 'repeatNoEvidenceCount') ?? 0,\n repeatNoEvidenceRate:\n run.iteration > 0\n ? (run.meta.get<number>('loop', 'repeatNoEvidenceCount') ?? 0) / run.iteration\n : 0,\n convergenceRecommendation: run.meta.get<string>('evaluation', 'lastRecommendation') ?? 'continue',\n convergenceReadinessScore: run.meta.get<number>('evaluation', 'lastReadinessScore') ?? 0,\n convergenceEvidenceGain: run.meta.get<number>('evaluation', 'lastEvidenceGain') ?? 0,\n },\n };\n\n for (const mapper of runtimeProfileResultMappers) {\n const mapped = await mapper.map({\n state: runtimeEngine?.getKernel() ?? null,\n answer: taskResult.summary,\n mode: this.config.mode?.mode === 'execute'\n ? 'autonomous'\n : 'assistant',\n task,\n sessionId: this.config.sessionId,\n workingDir: this.config.workingDir,\n metadata: completionMetadata,\n });\n if (!mapped) {\n continue;\n }\n if (mapped.summary) {\n taskResult.summary = mapped.summary;\n }\n if (mapped.taskResult) {\n taskResult = {\n ...taskResult,\n ...mapped.taskResult,\n metrics: {\n ...(taskResult.metrics ?? {}),\n ...((mapped.taskResult.metrics as Record<string, unknown> | undefined) ?? {}),\n },\n };\n }\n if (mapped.runtimeMetadata) {\n Object.assign(completionMetadata, mapped.runtimeMetadata);\n }\n }\n\n if (runtimeEngine && this.config.sessionId) {\n const completion = await runtimeEngine.completeRun({\n sessionId: this.config.sessionId,\n runId: requestId,\n mode: this.config.mode?.mode,\n summary: taskResult.summary,\n filesRead,\n filesModified,\n filesCreated,\n metadata: Object.keys(completionMetadata).length > 0 ? completionMetadata : undefined,\n });\n taskResult = {\n ...taskResult,\n success: taskResult.success && !completion.blockedByPolicy,\n summary: completion.blockedByPolicy\n ? `Final output failed runtime profile validation: ${completion.validationResults.find((result) => result.verdict === 'block')?.rationale ?? 'blocked by completion policy'}`\n : taskResult.summary,\n metrics: {\n ...(taskResult.metrics ?? {}),\n runtimeCompletion: completion,\n },\n };\n }\n\n return this.withMetrics(taskResult, {\n durationMs: runDurationMs || (Date.now() - tierStartedAt),\n toolCallsTotal,\n toolSuccessCount,\n toolErrorCount,\n });\n }\n\n // ── Helpers ────────────────────────────────────────────────────────────────\n\n private extractTurnText(turn: Turn, role: 'user' | 'assistant'): string | undefined {\n const parts = turn.steps\n .filter((step): step is Extract<Turn['steps'][number], { type: 'text' }> =>\n step.type === 'text' && step.role === role\n )\n .map((step) => step.content?.trim())\n .filter((value): value is string => Boolean(value));\n if (parts.length === 0) {\n return undefined;\n }\n return parts.join('\\n\\n');\n }\n\n private async loadConversationMessages(currentTask: string): Promise<LLMMessage[]> {\n if (!this.config.sessionId || this.config.parentAgentId) {\n return [];\n }\n try {\n const manager = new SessionManager(this.config.workingDir);\n const turns = await manager.getTurns(this.config.sessionId);\n const sorted = [...turns].sort((a, b) => a.sequence - b.sequence).slice(-16);\n const messages: LLMMessage[] = [];\n\n for (const turn of sorted) {\n if (turn.type === 'user') {\n const text = this.extractTurnText(turn, 'user');\n if (text) {\n messages.push({ role: 'user', content: text });\n }\n continue;\n }\n if (turn.type === 'assistant') {\n const text = this.extractTurnText(turn, 'assistant');\n if (text) {\n messages.push({ role: 'assistant', content: text });\n }\n }\n }\n\n // If CLI already pre-created a user turn for current task, avoid duplicate.\n while (messages.length > 0) {\n const tail = messages[messages.length - 1];\n if (tail?.role === 'user' && tail.content.trim() === currentTask.trim()) {\n messages.pop();\n continue;\n }\n break;\n }\n\n return messages;\n } catch {\n return [];\n }\n }\n\n private buildLLMTools(toolManager: ToolManager): LLMTool[] {\n return toolManager.getDefinitions().map((def) => ({\n name: def.function.name,\n description: def.function.description,\n inputSchema: def.function.parameters,\n }));\n }\n\n /**\n * Spawn a child agent with budget cap, tool filtering, and structured results.\n *\n * Budget cap: childBudget = parentRemainingBudget × request.budgetFraction.\n * If parent has no budget (maxTokens=0), child also runs without budget.\n *\n * Tool filtering: request.allowedTools → childConfig.allowedTools → child's\n * ToolContext.allowedTools, which gates tool registration in createToolRegistry().\n */\n private async spawnChildAgent(request: SpawnAgentRequest): Promise<SpawnAgentResult> {\n const startedAt = Date.now();\n\n // Budget cap: compute child token budget from parent's remaining budget\n const parentBudget = this.config.tokenBudget;\n const parentMaxTokens = parentBudget?.maxTokens ?? 0;\n const parentRemaining = parentMaxTokens > 0 ? Math.max(0, parentMaxTokens - this.totalTokens) : 0;\n const budgetFraction = request.budgetFraction ?? 0.5;\n const childMaxTokens = parentMaxTokens > 0 ? Math.floor(parentRemaining * budgetFraction) : 0;\n\n const childConfig: AgentConfig = {\n ...this.config,\n agentId: randomUUID(),\n parentAgentId: this.agentId,\n maxIterations: request.maxIterations ?? 100,\n workingDir: request.workingDir ?? this.config.workingDir,\n abortSignal: this.abortController.signal,\n allowedTools: request.allowedTools,\n // Child budget: capped at fraction of parent's remaining budget\n tokenBudget: childMaxTokens > 0\n ? {\n enabled: true,\n maxTokens: childMaxTokens,\n softLimitRatio: parentBudget?.softLimitRatio ?? 0.7,\n hardLimitRatio: parentBudget?.hardLimitRatio ?? 1.0,\n hardStop: parentBudget?.hardStop ?? false,\n forceSynthesisOnHardLimit: parentBudget?.forceSynthesisOnHardLimit ?? true,\n }\n : this.config.tokenBudget,\n };\n\n const childSDK = this.sdk.extend();\n const childRunner = new SDKAgentRunner(childConfig, childSDK);\n const preset: SubAgentPreset = request.preset ?? 'research';\n\n try {\n const result = await childRunner.execute(request.task);\n return {\n success: result.success,\n summary: result.summary,\n filesRead: result.filesRead,\n filesModified: result.filesModified,\n filesCreated: result.filesCreated,\n iterations: result.iterations,\n tokensUsed: result.tokensUsed,\n durationMs: Date.now() - startedAt,\n error: result.error,\n preset,\n };\n } catch (error) {\n return {\n success: false,\n summary: '',\n filesRead: [],\n filesModified: [],\n filesCreated: [],\n iterations: 0,\n tokensUsed: 0,\n durationMs: Date.now() - startedAt,\n error: error instanceof Error ? error.message : String(error),\n preset,\n };\n }\n }\n\n private async runWithModeHandler(task: string): Promise<TaskResult> {\n const { getModeHandler } = await import('../modes/mode-handler.js');\n const { createToolRegistry } = await import('@kb-labs/agent-tools');\n\n const toolRegistry = createToolRegistry({\n workingDir: this.config.workingDir,\n sessionId: this.config.sessionId,\n verbose: false,\n sessionMemory: createSessionMemoryBridge(this.config.workingDir, this.config.sessionId),\n });\n\n const handler = await getModeHandler(this.config.mode);\n return handler.execute(task, this.config, toolRegistry);\n }\n\n private withMetrics(\n result: TaskResult & { _escalated?: boolean; _escalationReason?: string },\n metrics: TierMetrics,\n ): TierResult {\n return {\n ...result,\n _escalated: result._escalated,\n _escalationReason: result._escalationReason,\n _metrics: metrics,\n };\n }\n\n private makeEmitContext() {\n const analytics = this.getAnalytics();\n const sessionId = this.config.sessionId;\n const logger = useLogger();\n\n if (!sessionId) {\n return {\n analytics,\n baselineKey: getKpiBaselineKey('', this.config.workingDir || ''),\n log: (msg: string) => logger?.warn?.(msg),\n };\n }\n\n const sessionManager = new SessionManager(this.config.workingDir);\n return {\n analytics,\n sessionId,\n persister: {\n getKpiBaseline: async (sid: string) => sessionManager.getKpiBaseline(sid),\n updateKpiBaseline: async (\n sid: string,\n updater: () => {\n version: number;\n updatedAt: string;\n driftRateEma: number;\n evidenceDensityEma: number;\n toolErrorRateEma: number;\n samples: number;\n tokenHistory: number[];\n iterationUtilizationHistory: number[];\n qualityScoreHistory: number[];\n },\n ) => sessionManager.updateKpiBaseline(sid, () => updater()),\n },\n baselineKey: getKpiBaselineKey('', this.config.workingDir || ''),\n log: (msg: string) => logger?.warn?.(msg),\n };\n }\n\n private async recordTierEscalation(\n from: LLMTier,\n to: LLMTier,\n reason: string,\n iteration: number,\n task: string,\n ): Promise<void> {\n await this.runMetricsEmitter.recordTierEscalation(from, to, reason, iteration, {\n analytics: this.getAnalytics(),\n sessionId: this.config.sessionId,\n agentId: this.agentId,\n task,\n tierEscalatedEvent: AGENT_ANALYTICS_EVENTS.TIER_ESCALATED,\n log: (msg: string) => useLogger()?.warn?.(msg),\n });\n }\n\n private async emitRunKpis(\n task: string,\n startTier: LLMTier,\n finalTier: LLMTier,\n tiersUsed: number,\n result: TaskResult,\n aggregate: TierMetrics,\n ): Promise<void> {\n const iterationBudget = Math.max(1, (this.config.maxIterations || 0) * Math.max(1, tiersUsed));\n const tokenBudget = this.config.tokenBudget?.enabled ? this.config.tokenBudget.maxTokens : undefined;\n const driftDomains = this.deriveDriftDomains(result);\n const qualityGate = this.evaluateQualityGate(result, aggregate, driftDomains.length);\n\n const payload: RunKpiPayload = {\n sessionId: this.config.sessionId,\n agentId: this.agentId,\n task,\n success: result.success,\n error: result.error,\n summaryPreview: (result.summary || '').slice(0, 300),\n iterationsUsed: result.iterations,\n iterationBudget,\n tokenBudget,\n tokenUtilization: tokenBudget && tokenBudget > 0 ? result.tokensUsed / tokenBudget : undefined,\n startTier,\n finalTier,\n durationMs: aggregate.durationMs,\n tokensUsed: result.tokensUsed,\n toolCallsTotal: aggregate.toolCallsTotal,\n toolSuccessCount: aggregate.toolSuccessCount,\n toolErrorCount: aggregate.toolErrorCount,\n todoToolCalls: 0,\n filesReadCount: result.filesRead.length,\n filesModifiedCount: result.filesModified.length,\n filesCreatedCount: result.filesCreated.length,\n driftDomainCount: driftDomains.length,\n driftDomains,\n executionPhase: result.success ? 'complete' : 'failed',\n phaseDurationsMs: {},\n phaseTransitionCount: 0,\n phaseTransitions: [],\n ledger: { failedSteps: aggregate.toolErrorCount, pendingSteps: 0 },\n qualityGate,\n repeatNoEvidenceRate: typeof result.metrics?.['repeatNoEvidenceRate'] === 'number'\n ? Number(result.metrics['repeatNoEvidenceRate'])\n : undefined,\n };\n\n await this.runMetricsEmitter.emitRunKpis(payload, this.makeEmitContext());\n }\n\n private getAnalytics() {\n return this.config.analytics ?? useAnalytics() ?? null;\n }\n\n private failResult(message: string, iterations: number): TaskResult {\n return {\n success: false,\n summary: message,\n filesCreated: [],\n filesModified: [],\n filesRead: [],\n iterations,\n tokensUsed: 0,\n error: message,\n sessionId: this.config.sessionId,\n };\n }\n\n private async getSessionFactsHint(sessionManager: SessionManager, sessionId: string): Promise<string> {\n const turns = await sessionManager.getTurns(sessionId).catch(() => []);\n if (turns.length === 0) {\n return '';\n }\n const completedUserTurns = turns.filter((t) => t.type === 'user' && t.status === 'completed').length;\n const completedAssistantTurns = turns.filter((t) => t.type === 'assistant' && t.status === 'completed').length;\n const lines = [\n '# Session Facts',\n `Completed user turns in this session: ${completedUserTurns}`,\n `Completed assistant turns in this session: ${completedAssistantTurns}`,\n ];\n lines.push('For meta-session questions (previous message/count in this session), prefer these facts before file search.');\n return lines.join('\\n');\n }\n\n private shouldInjectSessionFacts(task: string): boolean {\n const lower = task.toLowerCase();\n const hints = [\n 'предыдущ',\n 'сообщен',\n 'в этом бенче',\n 'в этой сессии',\n 'previous',\n 'message',\n 'session',\n 'in this bench',\n 'in this session',\n ];\n return hints.some((h) => lower.includes(h));\n }\n\n private deriveDriftDomains(result: TaskResult): string[] {\n const domains = new Set<string>();\n const files = [...result.filesRead, ...result.filesModified, ...result.filesCreated];\n for (const file of files) {\n const normalized = file.replace(/\\\\/g, '/');\n const rel = normalized.startsWith(this.config.workingDir.replace(/\\\\/g, '/'))\n ? normalized.slice(this.config.workingDir.length).replace(/^\\/+/, '')\n : normalized;\n const first = rel.split('/').find((part) => part.length > 0);\n domains.add(first ?? '.');\n }\n return [...domains];\n }\n\n private evaluateQualityGate(\n result: TaskResult,\n aggregate: TierMetrics,\n driftDomainCount: number,\n ): QualityGateResult {\n const reasons: string[] = [];\n const evidenceCount = result.filesRead.length + result.filesModified.length + result.filesCreated.length;\n const evidenceDensity = result.iterations > 0 ? evidenceCount / result.iterations : evidenceCount;\n const toolReliability = aggregate.toolCallsTotal > 0\n ? aggregate.toolSuccessCount / aggregate.toolCallsTotal\n : (result.success ? 1 : 0);\n\n const completionScore = result.success ? 1 : 0.35;\n const evidenceScore = Math.min(1, evidenceDensity / 1.5);\n const reliabilityScore = Math.min(1, Math.max(0, toolReliability));\n const repeatNoEvidenceRate = typeof result.metrics?.['repeatNoEvidenceRate'] === 'number'\n ? Number(result.metrics['repeatNoEvidenceRate'])\n : 0;\n const forgetfulnessPenalty = repeatNoEvidenceRate > 0.2\n ? Math.min(0.15, repeatNoEvidenceRate * 0.3)\n : 0;\n const driftPenalty = driftDomainCount > 2 ? 0.08 : 0;\n\n let score =\n (completionScore * 0.45) +\n (evidenceScore * 0.25) +\n (reliabilityScore * 0.30) -\n driftPenalty -\n forgetfulnessPenalty;\n score = Math.max(0, Math.min(1, score));\n\n if (!result.success) {\n reasons.push('task_not_completed');\n }\n if (aggregate.toolErrorCount > 0) {\n reasons.push('tool_errors_present');\n }\n if (evidenceCount === 0) {\n reasons.push('no_evidence_collected');\n }\n if (driftDomainCount > 2) {\n reasons.push('scope_drift_detected');\n }\n if (repeatNoEvidenceRate > 0.2) {\n reasons.push('repeated_without_new_evidence');\n }\n\n const stopReason = typeof result.metrics?.['stopReasonCode'] === 'string'\n ? String(result.metrics?.['stopReasonCode'])\n : '';\n if ((stopReason === 'max_iterations' || stopReason === 'loop_detected') && evidenceCount > 0) {\n reasons.push('partial_due_to_iteration_limit');\n score = Math.max(score, 0.35);\n }\n\n if (score >= 0.55 && result.success) {\n return { status: 'pass', score, reasons };\n }\n if (score >= 0.3) {\n return { status: 'partial', score, reasons };\n }\n return { status: 'fail', score, reasons };\n }\n}\n","/**\n * EventBusImpl — simple in-process implementation of AgentEventBus.\n *\n * Design:\n * - Synchronous emit: handlers run inline, no async queuing\n * - Error isolation: one handler throwing does not affect others\n * - No recursion guard needed (sync + in-process only)\n * - drain() is a no-op since emit is synchronous\n */\n\nimport type { AgentEventBus, AgentEvents, Unsubscribe } from '@kb-labs/agent-sdk';\n\ntype Handler<T> = (data: T) => void;\n\nexport class EventBusImpl implements AgentEventBus {\n private readonly _handlers = new Map<string, Set<Handler<unknown>>>();\n\n emit<K extends keyof AgentEvents>(event: K, data: AgentEvents[K]): void {\n const handlers = this._handlers.get(event as string);\n if (!handlers) {return;}\n for (const handler of handlers) {\n try {\n handler(data);\n } catch {\n // Error isolation: handler failure does not propagate\n }\n }\n }\n\n on<K extends keyof AgentEvents>(\n event: K,\n handler: (data: AgentEvents[K]) => void,\n ): Unsubscribe {\n let set = this._handlers.get(event as string);\n if (!set) {\n set = new Set();\n this._handlers.set(event as string, set);\n }\n set.add(handler as Handler<unknown>);\n return () => {\n this._handlers.get(event as string)?.delete(handler as Handler<unknown>);\n };\n }\n\n onAsync<K extends keyof AgentEvents>(\n event: K,\n handler: (data: AgentEvents[K]) => Promise<void>,\n ): Unsubscribe {\n // Wrap async handler — fire-and-forget, errors swallowed\n return this.on(event, (data) => {\n handler(data).catch(() => {});\n });\n }\n\n async drain(): Promise<void> {\n // No-op: emit is synchronous, nothing pending\n }\n\n clear(): void {\n this._handlers.clear();\n }\n}\n\nexport function createEventBus(): AgentEventBus {\n return new EventBusImpl();\n}\n","/**\n * RunContext factory + ContextMeta implementation.\n *\n * RunContext is the top-level context shared across an entire agent run.\n * It is created once per tier attempt by SDKAgentRunner.\n *\n * Key invariant: messages is a readonly view of a mutable backing array.\n * The only legal mutation path is LoopContextImpl.appendMessage().\n */\n\nimport { randomUUID } from 'node:crypto';\nimport type { LLMMessage, LLMTool } from '@kb-labs/sdk';\nimport type { AgentConfig, LLMTier } from '@kb-labs/agent-contracts';\nimport type { AgentEventBus, ContextMeta, RunContext } from '@kb-labs/agent-sdk';\nimport { createEventBus } from '../execution/event-bus-impl.js';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// ContextMetaImpl\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport class ContextMetaImpl implements ContextMeta {\n private readonly store = new Map<string, Map<string, unknown>>();\n\n get<T>(namespace: string, key: string): T | undefined {\n return this.store.get(namespace)?.get(key) as T | undefined;\n }\n\n set<T>(namespace: string, key: string, value: T): void {\n let ns = this.store.get(namespace);\n if (!ns) {\n ns = new Map();\n this.store.set(namespace, ns);\n }\n ns.set(key, value);\n }\n\n getNamespace(namespace: string): Record<string, unknown> {\n const ns = this.store.get(namespace);\n if (!ns) {return {};}\n return Object.fromEntries(ns.entries());\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// RunContextImpl — mutable backing, readonly external view\n// ─────────────────────────────────────────────────────────────────────────────\n\nclass RunContextImpl implements RunContext {\n task: string;\n tier: LLMTier;\n tools: LLMTool[];\n iteration: number = 0;\n maxIterations: number;\n aborted: boolean = false;\n abortSignal: AbortSignal;\n requestId: string;\n deadlineMs?: number;\n sessionId?: string;\n meta: ContextMeta;\n eventBus: AgentEventBus;\n debug: boolean;\n\n /** Mutable backing array — only LoopContextImpl may push to this. */\n readonly _messages: LLMMessage[] = [];\n\n get messages(): ReadonlyArray<LLMMessage> {\n return this._messages;\n }\n\n constructor(\n task: string,\n tier: LLMTier,\n tools: LLMTool[],\n maxIterations: number,\n abortSignal: AbortSignal,\n requestId: string,\n sessionId: string | undefined,\n meta: ContextMeta,\n eventBus: AgentEventBus,\n debug: boolean,\n ) {\n this.task = task;\n this.tier = tier;\n this.tools = tools;\n this.maxIterations = maxIterations;\n this.abortSignal = abortSignal;\n this.requestId = requestId;\n this.sessionId = sessionId;\n this.meta = meta;\n this.eventBus = eventBus;\n this.debug = debug;\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Factory\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface CreateRunContextOptions {\n config: AgentConfig;\n tier: LLMTier;\n tools: LLMTool[];\n abortController: AbortController;\n requestId?: string;\n}\n\n/**\n * Creates a fresh RunContext for one tier attempt.\n * Returns the context AND the mutable backing array for LoopContextImpl.\n */\nexport function createRunContext(options: CreateRunContextOptions): {\n run: RunContext;\n messages: LLMMessage[];\n} {\n const { config, tier, tools, abortController, requestId } = options;\n\n const meta = new ContextMetaImpl();\n const requestId_ = requestId ?? randomUUID();\n const eventBus = createEventBus();\n\n const impl = new RunContextImpl(\n /* task */ '', // set by SDKAgentRunner before loop starts\n /* tier */ tier,\n /* tools */ tools,\n /* maxIter */ config.maxIterations,\n /* abortSignal */ abortController.signal,\n /* requestId */ requestId_,\n /* sessionId */ config.sessionId,\n /* meta */ meta,\n /* eventBus */ eventBus,\n /* debug */ (config as { debug?: boolean }).debug ?? false,\n );\n\n // Wire abort so impl.aborted is kept in sync\n abortController.signal.addEventListener('abort', () => {\n impl.aborted = true;\n });\n\n return {\n run: impl,\n messages: impl._messages,\n };\n}\n","/**\n * ToolExecutor — normalizers + guards + output processors pipeline around ToolManager.\n *\n * Execution order per tool call:\n * 1. Build ToolExecCtx\n * 2. normalize() — each InputNormalizer in order; transforms input\n * 3. validateInput() — each guard in order; 'reject' → error output, stop chain\n * 4. toolManager.execute(name, input)\n * 5. validateOutput() — each guard in order; 'sanitize' → replace output\n * 6. process() — each output processor in order\n * 7. Return ToolOutput\n */\n\nimport type { ToolCallInput, ToolOutput, ToolExecCtx, ToolGuard, OutputProcessor, InputNormalizer, RunContext } from '@kb-labs/agent-sdk';\nimport type { ToolManager } from '../tools/tool-manager.js';\n\nexport class ToolExecutor {\n constructor(\n private readonly toolManager: ToolManager,\n private readonly guards: ReadonlyArray<ToolGuard>,\n private readonly processors: ReadonlyArray<OutputProcessor>,\n private readonly normalizers: ReadonlyArray<InputNormalizer> = [],\n ) {}\n\n getToolManager(): ToolManager {\n return this.toolManager;\n }\n\n async execute(calls: ToolCallInput[], run: RunContext): Promise<ToolOutput[]> {\n return Promise.all(calls.map((call) => this.executeSingle(call, run)));\n }\n\n private async executeSingle(call: ToolCallInput, run: RunContext): Promise<ToolOutput> {\n let input = call.input;\n\n // ── 0. Input normalization ─────────────────────────────────────────────────\n const ctx: ToolExecCtx = {\n run,\n toolName: call.name,\n input,\n iteration: run.iteration,\n abortSignal: run.abortSignal,\n requestId: run.requestId,\n };\n\n for (const normalizer of this.normalizers) {\n try {\n input = await normalizer.normalize(call.name, input, ctx);\n // Keep ctx.input in sync so downstream normalizers see latest\n (ctx as { input: Record<string, unknown> }).input = input;\n } catch {\n // Normalizers should never throw, but if they do — skip and continue\n }\n }\n\n // ── 1. Input validation ───────────────────────────────────────────────────\n for (const guard of this.guards) {\n if (!guard.validateInput) {continue;}\n const result = await guard.validateInput(call.name, input, ctx);\n if (!result.ok && result.action === 'reject') {\n return {\n toolCallId: call.id,\n output: `[guard:${guard.name}] Input rejected: ${result.reason}`,\n success: false,\n error: result.reason,\n };\n }\n }\n\n // ── 2. Execute tool ───────────────────────────────────────────────────────\n let rawOutput: string;\n let success: boolean;\n let error: string | undefined;\n let metadata: Record<string, unknown> | undefined;\n\n try {\n const toolResult = await this.toolManager.execute(call.name, input);\n success = toolResult.success;\n rawOutput = toolResult.output ?? toolResult.error ?? '';\n error = toolResult.error;\n metadata = toolResult.metadata;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return {\n toolCallId: call.id,\n output: `Tool execution error: ${msg}`,\n success: false,\n error: msg,\n };\n }\n\n // ── 3. Output validation ──────────────────────────────────────────────────\n for (const guard of this.guards) {\n if (!guard.validateOutput) {continue;}\n const result = await guard.validateOutput(call.name, rawOutput, ctx);\n if (!result.ok) {\n if (result.action === 'sanitize') {\n rawOutput = result.sanitized;\n } else if (result.action === 'reject') {\n return {\n toolCallId: call.id,\n output: `[guard:${guard.name}] Output rejected: ${result.reason}`,\n success: false,\n error: result.reason,\n };\n }\n }\n }\n\n // ── 4. Output processing ──────────────────────────────────────────────────\n for (const processor of this.processors) {\n rawOutput = await processor.process(rawOutput, ctx);\n }\n\n return {\n toolCallId: call.id,\n output: rawOutput,\n success,\n error,\n metadata,\n };\n }\n}\n","/**\n * LoopContextImpl — implements LoopContext from @kb-labs/agent-sdk.\n *\n * Provides the infrastructure primitives that LinearExecutionLoop calls:\n * - appendMessage() — the only way to mutate message history\n * - callLLM() — LLM call with beforeLLMCall/afterLLMCall middleware\n * - executeTools() — tool execution with beforeToolExec/afterToolExec middleware\n *\n * All business logic lives in the ExecutionLoop (LinearExecutionLoop).\n * LoopContextImpl is intentionally stateless between calls.\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { IterationSnapshot, RunEvaluation } from '@kb-labs/agent-contracts';\nimport type { LLMMessage } from '@kb-labs/sdk';\nimport type {\n LoopContext,\n LLMCallResult,\n ToolCallInput,\n ToolOutput,\n RunContext,\n LLMCtx,\n ToolExecCtx,\n ControlAction,\n} from '@kb-labs/agent-sdk';\nimport type { ILLM } from '@kb-labs/sdk';\nimport type { MiddlewarePipeline } from '../middleware/pipeline.js';\nimport type { ToolExecutor } from './tool-executor.js';\n\nexport class LoopContextImpl implements LoopContext {\n readonly run: RunContext;\n\n constructor(\n run: RunContext,\n private readonly messages: LLMMessage[], // mutable backing array\n private readonly llm: ILLM,\n private readonly pipeline: MiddlewarePipeline,\n private readonly executor: ToolExecutor,\n private readonly onTokensConsumed: (delta: number) => void,\n private readonly runEvaluator: (run: RunContext, snapshot: IterationSnapshot) => Promise<RunEvaluation | null>,\n ) {\n this.run = run;\n }\n\n // ── LoopContext API ────────────────────────────────────────────────────────\n\n appendMessage(message: LLMMessage): void {\n this.messages.push(message);\n }\n\n async beforeIteration(): Promise<ControlAction> {\n return this.pipeline.beforeIteration(this.run);\n }\n\n async afterIteration(): Promise<void> {\n await this.pipeline.afterIteration(this.run);\n }\n\n async callLLM(): Promise<LLMCallResult> {\n const llmCtx: LLMCtx = {\n run: this.run,\n messages: [...this.messages],\n tools: this.run.tools,\n };\n\n // Apply beforeLLMCall middleware patch\n const patch = await this.pipeline.beforeLLMCall(llmCtx);\n\n const messages = patch.messages ?? llmCtx.messages;\n const tools = patch.tools ?? llmCtx.tools;\n const temperature = patch.temperature;\n const toolChoice = patch.toolChoice;\n\n // Call LLM\n let rawResponse: Awaited<ReturnType<NonNullable<ILLM['chatWithTools']>>>;\n try {\n rawResponse = await this.llm.chatWithTools!(messages, {\n tools,\n ...(temperature !== undefined ? { temperature } : {}),\n ...(toolChoice !== undefined ? { toolChoice } : {}),\n });\n } catch (err) {\n throw err;\n }\n\n // Convert to LLMCallResult (SDK shape)\n const result: LLMCallResult = {\n content: rawResponse.content,\n toolCalls: (rawResponse.toolCalls ?? []).map((tc) => ({\n id: tc.id,\n name: tc.name,\n input: tc.input as Record<string, unknown>,\n })),\n usage: rawResponse.usage\n ? {\n promptTokens: rawResponse.usage.promptTokens,\n completionTokens: rawResponse.usage.completionTokens,\n }\n : undefined,\n // stopReason: top-level field (if adapter exposes it) OR from providerUsage\n stopReason:\n (rawResponse as { stopReason?: string }).stopReason ??\n (rawResponse.usage?.providerUsage as { stopReason?: string } | undefined)?.stopReason,\n };\n\n // Notify token tracking\n if (result.usage) {\n this.onTokensConsumed(result.usage.promptTokens + result.usage.completionTokens);\n }\n\n // Append assistant message to history\n const assistantMessage: LLMMessage = {\n role: 'assistant',\n content: rawResponse.content,\n toolCalls: rawResponse.toolCalls,\n };\n this.messages.push(assistantMessage);\n\n // Run afterLLMCall middleware\n await this.pipeline.afterLLMCall(llmCtx, result);\n\n return result;\n }\n\n async executeTools(calls: ToolCallInput[]): Promise<ToolOutput[]> {\n // Partition into concurrent-safe and sequential groups.\n // Concurrent-safe tools run in parallel via Promise.all,\n // sequential tools run one-by-one after them.\n // Results are emitted in original call order regardless of execution order.\n const concurrentCalls: ToolCallInput[] = [];\n const sequentialCalls: ToolCallInput[] = [];\n\n for (const call of calls) {\n const resolved = this.executor.getToolManager().getTool(call.name);\n if (resolved?.concurrencySafe && calls.length > 1) {\n concurrentCalls.push(call);\n } else {\n sequentialCalls.push(call);\n }\n }\n\n // Map to collect results by toolCallId for ordered emission\n const outputMap = new Map<string, ToolOutput>();\n\n // Execute concurrent-safe tools in parallel\n if (concurrentCalls.length > 0) {\n const concurrentResults = await Promise.all(\n concurrentCalls.map(call => this._executeSingleTool(call)),\n );\n for (const output of concurrentResults) {\n outputMap.set(output.toolCallId, output);\n }\n }\n\n // Execute sequential tools one-by-one\n for (const call of sequentialCalls) {\n const output = await this._executeSingleTool(call);\n outputMap.set(output.toolCallId, output);\n }\n\n // Emit results in original call order\n const outputs: ToolOutput[] = [];\n for (const call of calls) {\n const output = outputMap.get(call.id);\n if (output) {outputs.push(output);}\n }\n\n // Append tool result messages to history.\n // Large outputs are persisted to disk — LLM sees a preview + file path.\n for (const out of outputs) {\n this.messages.push({\n role: 'tool',\n content: this._maybePersistOutput(out),\n toolCallId: out.toolCallId,\n });\n }\n\n return outputs;\n }\n\n /** Execute a single tool call with middleware hooks. */\n private async _executeSingleTool(call: ToolCallInput): Promise<ToolOutput> {\n const toolCtx: ToolExecCtx = {\n run: this.run,\n toolName: call.name,\n input: call.input,\n iteration: this.run.iteration,\n abortSignal: this.run.abortSignal,\n requestId: this.run.requestId,\n };\n\n // Check if middleware wants to skip this tool call\n const decision = await this.pipeline.beforeToolExec(toolCtx);\n if (decision === 'skip') {\n return {\n toolCallId: call.id,\n output: '[skipped by middleware]',\n success: true,\n };\n }\n\n // Execute through ToolExecutor (guards + processors)\n const results = await this.executor.execute([call], this.run);\n const output = results[0] ?? {\n toolCallId: call.id,\n output: 'Tool execution returned no result',\n success: false,\n };\n\n // Run afterToolExec middleware\n await this.pipeline.afterToolExec(toolCtx, output);\n\n return output;\n }\n\n // ── Tool output persistence ──────────────────────────────────────────────\n // Large tool outputs are saved to disk. LLM sees a preview + file path.\n // Inspired by Claude Code maxResultSizeChars + disk persistence.\n\n private static readonly OUTPUT_PERSIST_THRESHOLD = 30_000; // chars — only very large outputs\n private static readonly OUTPUT_PREVIEW_LENGTH = 8_000; // chars shown to LLM\n /**\n * Tools whose output is NEVER persisted to disk — agent needs full content.\n * Inspired by Claude Code: Read tool has maxResultSizeChars=Infinity.\n * Size control for these tools happens at tool level (trimOutput, maxOutputChars),\n * not at loop level.\n */\n private static readonly PERSIST_EXEMPT_TOOLS = new Set([\n 'fs_read', 'fs_list', 'fs_write', 'fs_patch', 'fs_replace',\n 'plan_write', 'plan_validate', 'report',\n 'memory_get', 'archive_recall',\n 'todo_create', 'todo_update', 'todo_get',\n ]);\n\n /**\n * If output exceeds threshold, persist to disk and return preview + path.\n * Otherwise return output as-is.\n */\n private _maybePersistOutput(out: ToolOutput): string {\n const output = out.output;\n if (!output || output.length <= LoopContextImpl.OUTPUT_PERSIST_THRESHOLD) {\n return output;\n }\n\n // Some tools need full output in context — never persist them\n const toolName = (out as { toolName?: string }).toolName\n ?? out.toolCallId?.split('_')[0]\n ?? '';\n if (LoopContextImpl.PERSIST_EXEMPT_TOOLS.has(toolName)) {\n return output;\n }\n\n // Persist to session directory\n const sessionId = this.run.meta.get<string>('session', 'id') ?? this.run.requestId;\n const workingDir = this.run.meta.get<string>('session', 'workingDir') ?? process.cwd();\n const outputDir = path.join(workingDir, '.kb', 'agents', 'sessions', sessionId, 'tool-outputs');\n\n try {\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n\n const filename = `${out.toolCallId || Date.now()}.txt`;\n const filePath = path.join(outputDir, filename);\n fs.writeFileSync(filePath, output, 'utf-8');\n\n const preview = output.slice(0, LoopContextImpl.OUTPUT_PREVIEW_LENGTH);\n const remaining = output.length - LoopContextImpl.OUTPUT_PREVIEW_LENGTH;\n\n return `${preview}\\n\\n[OUTPUT PERSISTED: ${remaining} more chars saved to ${filePath} — use fs_read if you need the full content]`;\n } catch {\n // Fallback: truncate without persisting (never break execution)\n return output.slice(0, LoopContextImpl.OUTPUT_PERSIST_THRESHOLD) +\n `\\n\\n[TRUNCATED: ${output.length - LoopContextImpl.OUTPUT_PERSIST_THRESHOLD} more chars not shown]`;\n }\n }\n\n async evaluateRun(snapshot: IterationSnapshot): Promise<RunEvaluation | null> {\n return this.runEvaluator(this.run, snapshot);\n }\n}\n","/**\n * FactSheet — structured working memory for agent runs.\n *\n * Pure data structure: no middleware coupling, no LLM calls, no I/O.\n * FactSheetMiddleware wires it into the agent lifecycle.\n *\n * Features:\n * - Categorized facts with priority-based rendering\n * - Deduplication via word overlap (60% threshold)\n * - Token budget + entry count eviction (never evicts corrections/blockers)\n * - Compact markdown render for system prompt injection\n * - Serializable (toJSON / fromJSON) for cross-session persistence\n */\n\nimport type { FactCategory, FactSheetEntry } from '@kb-labs/agent-contracts';\n\n// ─── Config ──────────────────────────────────────────────────────────────────\n\nexport interface FactSheetConfig {\n /** Max estimated tokens for rendered output (~4 chars/token). Default: 5000 */\n maxTokens?: number;\n /** Max number of facts before eviction. Default: 60 */\n maxEntries?: number;\n /** Min confidence for auto-extracted facts. Default: 0.5 */\n minConfidence?: number;\n}\n\nconst DEFAULTS = {\n maxTokens: 5_000,\n maxEntries: 60,\n minConfidence: 0.5,\n} as const;\n\n// ─── Priority order (lower index = higher priority) ──────────────────────────\n\nconst CATEGORY_PRIORITY: FactCategory[] = [\n 'correction',\n 'blocker',\n 'decision',\n 'finding',\n 'file_content',\n 'architecture',\n 'tool_result',\n 'environment',\n];\n\nconst CATEGORY_HEADERS: Record<FactCategory, string> = {\n correction: 'Corrections',\n blocker: 'Blockers',\n decision: 'Decisions',\n finding: 'Findings',\n file_content: 'Files Read',\n architecture: 'Architecture',\n tool_result: 'Tool Results',\n environment: 'Environment',\n};\n\n/** Categories that are never evicted */\nconst PROTECTED: ReadonlySet<FactCategory> = new Set(['correction', 'blocker']);\n\n/** Categories where dedup uses file path instead of word overlap */\nconst PATH_DEDUP: ReadonlySet<FactCategory> = new Set(['file_content']);\n\nconst DEDUP_THRESHOLD = 0.6;\n\n// ─── FactSheet ───────────────────────────────────────────────────────────────\n\nexport class FactSheet {\n private facts = new Map<string, FactSheetEntry>();\n private nextId = 1;\n private readonly maxTokens: number;\n private readonly maxEntries: number;\n readonly minConfidence: number;\n\n constructor(config: FactSheetConfig = {}) {\n this.maxTokens = config.maxTokens ?? DEFAULTS.maxTokens;\n this.maxEntries = config.maxEntries ?? DEFAULTS.maxEntries;\n this.minConfidence = config.minConfidence ?? DEFAULTS.minConfidence;\n }\n\n // ── Write ──────────────────────────────────────────────────────────────────\n\n /**\n * Add or merge a fact. Returns the entry and whether it was merged.\n * Skips facts below minConfidence.\n */\n add(params: {\n category: FactCategory;\n fact: string;\n confidence: number;\n source: string;\n iteration: number;\n supersedes?: string;\n }): { entry: FactSheetEntry; merged: boolean } | null {\n if (params.confidence < this.minConfidence) {return null;}\n\n // Supersede: remove the old fact\n if (params.supersedes) {this.facts.delete(params.supersedes);}\n\n // Dedup: merge if similar fact exists\n const similar = this.findSimilar(params.category, params.fact);\n if (similar) {\n similar.fact = params.fact.length > similar.fact.length ? params.fact : similar.fact;\n similar.confidence = Math.min(1.0, Math.max(similar.confidence, params.confidence));\n similar.confirmations += 1;\n similar.iteration = params.iteration;\n similar.updatedAt = new Date().toISOString();\n similar.source = params.source;\n this.enforceLimit();\n return { entry: similar, merged: true };\n }\n\n // New fact\n const id = `fact_${this.nextId++}`;\n const entry: FactSheetEntry = {\n id,\n iteration: params.iteration,\n category: params.category,\n fact: params.fact,\n confidence: params.confidence,\n source: params.source,\n updatedAt: new Date().toISOString(),\n confirmations: 1,\n supersedes: params.supersedes,\n };\n\n this.facts.set(id, entry);\n this.enforceLimit();\n return { entry, merged: false };\n }\n\n remove(id: string): boolean {\n return this.facts.delete(id);\n }\n\n // ── Read ───────────────────────────────────────────────────────────────────\n\n getAll(): FactSheetEntry[] {\n return [...this.facts.values()].sort((a, b) => {\n const pa = CATEGORY_PRIORITY.indexOf(a.category);\n const pb = CATEGORY_PRIORITY.indexOf(b.category);\n if (pa !== pb) {return pa - pb;}\n return b.iteration - a.iteration;\n });\n }\n\n get size(): number {\n return this.facts.size;\n }\n\n // ── Render ─────────────────────────────────────────────────────────────────\n\n /**\n * Compact markdown for system prompt injection.\n * Returns empty string if no facts.\n */\n render(): string {\n if (this.facts.size === 0) {return '';}\n\n const sorted = this.getAll();\n const lines: string[] = [];\n let currentCategory: FactCategory | null = null;\n\n for (const fact of sorted) {\n if (fact.category !== currentCategory) {\n currentCategory = fact.category;\n lines.push(`\\n## ${CATEGORY_HEADERS[currentCategory] ?? currentCategory}`);\n }\n const conf = fact.confidence >= 0.8 ? '' : ` [conf:${fact.confidence.toFixed(1)}]`;\n lines.push(`- ${fact.fact}${conf}`);\n }\n\n return lines.join('\\n');\n }\n\n // ── Stats ──────────────────────────────────────────────────────────────────\n\n getStats(): { totalFacts: number; estimatedTokens: number; byCategory: Record<string, number> } {\n const byCategory: Record<string, number> = {};\n for (const f of this.facts.values()) {\n byCategory[f.category] = (byCategory[f.category] || 0) + 1;\n }\n return {\n totalFacts: this.facts.size,\n estimatedTokens: Math.ceil(this.render().length / 4),\n byCategory,\n };\n }\n\n // ── Serialization ──────────────────────────────────────────────────────────\n\n toJSON(): { facts: Array<[string, FactSheetEntry]>; nextId: number } {\n return { facts: [...this.facts.entries()], nextId: this.nextId };\n }\n\n static fromJSON(\n data: { facts: Array<[string, FactSheetEntry]>; nextId: number },\n config?: FactSheetConfig,\n ): FactSheet {\n const sheet = new FactSheet(config);\n for (const [key, value] of data.facts) {\n sheet.facts.set(key, value);\n }\n sheet.nextId = data.nextId;\n return sheet;\n }\n\n // ── Private ────────────────────────────────────────────────────────────────\n\n private findSimilar(category: FactCategory, text: string): FactSheetEntry | undefined {\n if (PATH_DEDUP.has(category)) {\n const inputPath = extractFilePath(text);\n if (!inputPath) {return undefined;}\n for (const f of this.facts.values()) {\n if (f.category !== category) {continue;}\n if (extractFilePath(f.fact) === inputPath) {return f;}\n }\n return undefined;\n }\n\n const inputWords = words(text);\n if (inputWords.size === 0) {return undefined;}\n\n for (const f of this.facts.values()) {\n if (f.category !== category) {continue;}\n const fw = words(f.fact);\n if (fw.size === 0) {continue;}\n if (overlap(inputWords, fw) >= DEDUP_THRESHOLD) {return f;}\n }\n return undefined;\n }\n\n private enforceLimit(): void {\n while (this.facts.size > this.maxEntries) {this.evictOne();}\n\n while (this.facts.size > 0) {\n const tokens = Math.ceil(this.render().length / 4);\n if (tokens <= this.maxTokens) {break;}\n this.evictOne();\n }\n }\n\n private evictOne(): void {\n let candidate: FactSheetEntry | null = null;\n\n for (const f of this.facts.values()) {\n if (PROTECTED.has(f.category)) {continue;}\n if (!candidate) { candidate = f; continue; }\n\n // Lowest confidence → fewest confirmations → oldest iteration\n if (\n f.confidence < candidate.confidence\n || (f.confidence === candidate.confidence && f.confirmations < candidate.confirmations)\n || (f.confidence === candidate.confidence && f.confirmations === candidate.confirmations && f.iteration < candidate.iteration)\n ) {\n candidate = f;\n }\n }\n\n if (candidate) {this.facts.delete(candidate.id);}\n }\n}\n\n// ─── Pure helpers ────────────────────────────────────────────────────────────\n\nfunction extractFilePath(text: string): string | null {\n return text.match(/^Read\\s+(\\S+)\\s*\\(/i)?.[1] ?? null;\n}\n\nfunction words(text: string): Set<string> {\n return new Set(\n text.toLowerCase().replace(/[^a-z0-9\\s]/g, ' ').split(/\\s+/).filter(w => w.length > 2),\n );\n}\n\nfunction overlap(a: Set<string>, b: Set<string>): number {\n let count = 0;\n for (const w of a) {if (b.has(w)) {count++;}}\n const min = Math.min(a.size, b.size);\n return min === 0 ? 0 : count / min;\n}\n","/**\n * FactSheetMiddleware — structured working memory via SDK middleware hooks.\n *\n * Replaces 15 integration points in legacy Agent with 4 clean hooks:\n *\n * afterToolExec → heuristic fact extraction (instant, no LLM)\n * afterIteration → trigger LLM summarization every N iterations\n * beforeLLMCall → inject FactSheet into system message\n * onStop → persist to disk (non-critical)\n *\n * order = 20 (after Budget=10, ContextFilter=15; before Progress=50)\n *\n * Heuristic extraction runs after every tool call — zero latency, zero cost.\n * LLM extraction runs every N iterations — uses a separate small-tier LLM call\n * to extract structured facts from recent agent reasoning and tool results.\n */\n\nimport { useLLM, type ILLM, type LLMMessage, type LLMTool } from '@kb-labs/sdk';\nimport type {\n AgentMiddleware,\n RunContext,\n LLMCtx,\n LLMCallPatch,\n ToolExecCtx,\n ToolOutput,\n} from '@kb-labs/agent-sdk';\nimport type { FactCategory } from '@kb-labs/agent-contracts';\nimport { FactSheet, type FactSheetConfig } from '../../memory/fact-sheet.js';\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\n// ─── Config ──────────────────────────────────────────────────────────────────\n\nexport interface FactSheetMiddlewareConfig {\n /** FactSheet config (maxTokens, maxEntries, minConfidence) */\n factSheet?: FactSheetConfig;\n /** LLM summarization every N iterations. 0 = disabled. Default: 5 */\n summarizationInterval?: number;\n /** Max tokens for LLM summary response. Default: 800 */\n maxSummaryTokens?: number;\n /** Directory for cross-session persistence. undefined = no persistence */\n persistDir?: string;\n}\n\nconst DEFAULT_INTERVAL = 5;\nconst DEFAULT_MAX_SUMMARY_TOKENS = 800;\n\n// ─── Extracted fact type ─────────────────────────────────────────────────────\n\ninterface ExtractedFact {\n category: FactCategory;\n fact: string;\n confidence: number;\n source: string;\n}\n\n// ─── FactSheetMiddleware ─────────────────────────────────────────────────────\n\nexport class FactSheetMiddleware implements AgentMiddleware {\n readonly name = 'factsheet';\n readonly order = 20;\n readonly config = { failPolicy: 'fail-open' as const };\n\n private sheet: FactSheet;\n private readonly factSheetConfig: FactSheetConfig;\n private readonly interval: number;\n private readonly maxSummaryTokens: number;\n private readonly persistDir?: string;\n private llm: ILLM | null = null;\n private pendingSummarization: Promise<void> | null = null;\n\n constructor(cfg: FactSheetMiddlewareConfig = {}) {\n this.factSheetConfig = cfg.factSheet ?? {};\n this.sheet = new FactSheet(this.factSheetConfig);\n this.interval = cfg.summarizationInterval ?? DEFAULT_INTERVAL;\n this.maxSummaryTokens = cfg.maxSummaryTokens ?? DEFAULT_MAX_SUMMARY_TOKENS;\n this.persistDir = cfg.persistDir;\n }\n\n // ── Lifecycle ──────────────────────────────────────────────────────────────\n\n async onStart(ctx: RunContext): Promise<void> {\n // Load persisted facts from prior session\n if (this.persistDir) {\n this.sheet = await this.loadFromDisk(this.persistDir);\n }\n\n // Acquire small-tier LLM for summarization\n if (this.interval > 0) {\n this.llm = useLLM({ tier: 'small' }) ?? null;\n }\n\n // Expose sheet stats via meta for other middlewares / tracing\n ctx.meta.set('factsheet', 'enabled', true);\n }\n\n async onStop(ctx: RunContext, _reason: string): Promise<void> {\n // Wait for any in-flight summarization\n if (this.pendingSummarization) {\n try { await this.pendingSummarization; } catch { /* non-critical */ }\n }\n\n // Persist facts to disk\n if (this.persistDir) {\n await this.saveToDisk(this.persistDir);\n }\n\n // Final stats for tracing\n ctx.meta.set('factsheet', 'finalStats', this.sheet.getStats());\n }\n\n // ── beforeLLMCall: inject FactSheet into context ───────────────────────────\n\n beforeLLMCall(ctx: LLMCtx): LLMCallPatch | undefined {\n const rendered = this.sheet.render();\n const runMemoryBlock = buildRunMemoryBlock(ctx.run);\n if (!rendered && !runMemoryBlock) {return undefined;}\n\n // Find system message and append FactSheet\n const messages = [...ctx.messages];\n const sysIdx = messages.findIndex(m => m.role === 'system');\n const sections: string[] = [];\n if (rendered) {\n sections.push(`# Working Memory (${this.sheet.size} facts)\\n${rendered}`);\n }\n if (runMemoryBlock) {\n sections.push(runMemoryBlock);\n }\n const addition = sections.join('\\n\\n');\n\n if (sysIdx >= 0) {\n const sys = messages[sysIdx]!;\n messages[sysIdx] = {\n ...sys,\n content: sys.content + `\\n\\n${addition}`,\n };\n } else {\n // No system message — prepend one\n messages.unshift({\n role: 'system',\n content: addition,\n });\n }\n\n return { messages };\n }\n\n // ── afterToolExec: heuristic fact extraction ───────────────────────────────\n\n afterToolExec(ctx: ToolExecCtx, result: ToolOutput): void {\n if (!result.success) {return;}\n\n // Extract todo summary from todo tool metadata for Status Block\n const structured = result.metadata?.structured as Record<string, unknown> | undefined;\n if ((ctx.toolName === 'todo_create' || ctx.toolName === 'todo_update' || ctx.toolName === 'todo_get')\n && structured?.todoList) {\n const todoList = structured.todoList as { items?: Array<{ status: string }> };\n if (Array.isArray(todoList.items)) {\n const items = todoList.items;\n ctx.run.meta.set('todo', 'summary', {\n completed: items.filter(i => i.status === 'completed').length,\n inProgress: items.filter(i => i.status === 'in-progress').length,\n pending: items.filter(i => i.status === 'pending').length,\n blocked: items.filter(i => i.status === 'blocked').length,\n total: items.length,\n });\n }\n }\n\n const facts = extractHeuristicFacts(ctx.toolName, ctx.input, result.output);\n for (const f of facts) {\n this.sheet.add({\n ...f,\n iteration: ctx.iteration,\n });\n }\n }\n\n // ── afterIteration: trigger LLM summarization ─────────────────────────────\n\n async afterIteration(ctx: RunContext): Promise<void> {\n if (this.interval <= 0 || !this.llm) {return;}\n if (ctx.iteration % this.interval !== 0) {return;}\n\n // Non-blocking: fire and track\n this.pendingSummarization = this.runSummarization(ctx).catch(() => { /* fail-open */ });\n }\n\n // ── LLM Summarization ─────────────────────────────────────────────────────\n\n private async runSummarization(ctx: RunContext): Promise<void> {\n if (!this.llm) {return;}\n\n // Build compressed context from recent messages\n const recentMessages = ctx.messages.slice(-this.interval * 4); // ~4 messages per iteration\n const compressed = compressMessages(recentMessages as LLMMessage[]);\n if (!compressed) {return;}\n\n const systemPrompt = buildExtractionSystemPrompt(ctx.iteration - this.interval, ctx.iteration);\n const messages: LLMMessage[] = [\n { role: 'system', content: systemPrompt },\n { role: 'user', content: compressed },\n ];\n\n let facts: ExtractedFact[] = [];\n\n // Prefer tool calling for structured output — more reliable than text JSON parsing\n if (this.llm.chatWithTools) {\n try {\n const response = await this.llm.chatWithTools(messages, {\n tools: [EXTRACT_FACTS_TOOL],\n toolChoice: { type: 'function', function: { name: 'extract_facts' } },\n temperature: 0.1,\n maxTokens: this.maxSummaryTokens,\n });\n const call = response.toolCalls?.find(tc => tc.name === 'extract_facts');\n if (call?.input) {\n facts = parseExtractedFactsFromToolInput(call.input);\n }\n } catch {\n // fall through to text completion fallback\n }\n }\n\n // Fallback: text completion with JSON parsing (when chatWithTools unavailable or failed)\n if (facts.length === 0 && this.llm.complete) {\n const prompt = buildExtractionPromptFallback(compressed, ctx.iteration - this.interval, ctx.iteration);\n const response = await this.llm.complete(prompt, {\n temperature: 0.1,\n maxTokens: this.maxSummaryTokens,\n });\n facts = parseExtractedFactsFromText((response.content || '').trim());\n }\n\n for (const f of facts) {\n this.sheet.add({\n ...f,\n iteration: ctx.iteration,\n });\n }\n\n ctx.meta.set('factsheet', 'lastSummarization', {\n iteration: ctx.iteration,\n factsExtracted: facts.length,\n stats: this.sheet.getStats(),\n });\n\n if (facts.length > 0) {\n ctx.eventBus.emit('middleware:event', {\n name: 'factsheet',\n event: 'summarized',\n data: { factsAdded: facts.length, totalFacts: this.sheet.size, iteration: ctx.iteration },\n });\n }\n }\n\n // ── Persistence ────────────────────────────────────────────────────────────\n\n private async loadFromDisk(dir: string): Promise<FactSheet> {\n const filePath = path.join(dir, 'fact-sheet.json');\n try {\n if (!fs.existsSync(filePath)) {return this.sheet;}\n const raw = fs.readFileSync(filePath, 'utf-8');\n const data = JSON.parse(raw);\n return FactSheet.fromJSON(data, this.factSheetConfig);\n } catch {\n return this.sheet;\n }\n }\n\n private async saveToDisk(dir: string): Promise<void> {\n try {\n fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(\n path.join(dir, 'fact-sheet.json'),\n JSON.stringify(this.sheet.toJSON()),\n 'utf-8',\n );\n } catch { /* non-critical */ }\n }\n}\n\nfunction buildRunMemoryBlock(run: RunContext): string | null {\n const lastSummary = run.meta.get<string>('loop', 'lastIterationSummary');\n const repeatsWithoutEvidence = run.meta.get<number>('loop', 'repeatsWithoutEvidence') ?? 0;\n const repeatNoEvidenceCount = run.meta.get<number>('loop', 'repeatNoEvidenceCount') ?? 0;\n const lastEvidenceCount = run.meta.get<number>('loop', 'lastEvidenceCount') ?? 0;\n const lastRecommendation = run.meta.get<string>('evaluation', 'lastRecommendation');\n const lastReadinessScore = run.meta.get<number>('evaluation', 'lastReadinessScore');\n const lastEvidenceGain = run.meta.get<number>('evaluation', 'lastEvidenceGain');\n\n // Always emit status block after iteration 1 (even if no evidence yet)\n if (run.iteration <= 1 && !lastSummary && repeatNoEvidenceCount === 0 && lastEvidenceCount === 0) {\n return null;\n }\n\n const task = (run as unknown as { task?: string }).task ?? '';\n\n // ── Iteration progress ────────────────────────────────────────────\n const iterPct = Math.round((run.iteration / run.maxIterations) * 100);\n\n // ── Budget ────────────────────────────────────────────────────────\n const tokensUsed = run.meta.get<number>('budget', 'tokensUsed') ?? 0;\n const maxTokens = run.meta.get<number>('budget', 'maxTokens') ?? 0;\n let budgetLine = '';\n if (maxTokens > 0) {\n const budgetPct = Math.round((tokensUsed / maxTokens) * 100);\n const indicator = budgetPct >= 90 ? '[CRITICAL]'\n : budgetPct >= 70 ? '[WARNING]'\n : budgetPct >= 50 ? '[CAUTION]'\n : '[OK]';\n budgetLine = `Budget: ${tokensUsed.toLocaleString()}/${maxTokens.toLocaleString()} tokens (${budgetPct}%) ${indicator}`;\n }\n\n // ── Progress status ───────────────────────────────────────────────\n const isStuck = run.meta.get<boolean>('progress', 'isStuck') ?? false;\n const itersSinceProgress = run.meta.get<number>('progress', 'iterationsSinceProgress') ?? 0;\n const progressStatus = isStuck\n ? `STUCK (${itersSinceProgress} iterations without progress)`\n : itersSinceProgress > 0\n ? `active (${itersSinceProgress} iterations since last progress)`\n : 'active';\n\n // ── Files ─────────────────────────────────────────────────────────\n const filesRead = run.meta.get<string[]>('files', 'read') ?? [];\n const filesModified = run.meta.get<string[]>('files', 'modified') ?? [];\n const filesCreated = run.meta.get<string[]>('files', 'created') ?? [];\n\n // ── Todos ──────────────────────────────────────────────────────────\n const todoSummary = run.meta.get<{ completed: number; inProgress: number; pending: number; blocked: number; total: number }>('todo', 'summary');\n\n // ── Build status block ────────────────────────────────────────────\n const lines: string[] = [\n '# Status Block',\n `Task: ${task || '(not set)'}`,\n `Iteration: ${run.iteration}/${run.maxIterations} (${iterPct}%)`,\n ];\n if (budgetLine) {\n lines.push(budgetLine);\n }\n lines.push(`Progress: ${progressStatus}`);\n lines.push(`Files: read=${filesRead.length}, modified=${filesModified.length}, created=${filesCreated.length}`);\n if (todoSummary) {\n const parts = [`${todoSummary.completed}/${todoSummary.total} completed`];\n if (todoSummary.inProgress > 0) {parts.push(`${todoSummary.inProgress} in-progress`);}\n if (todoSummary.blocked > 0) {parts.push(`${todoSummary.blocked} blocked`);}\n lines.push(`Todos: ${parts.join(', ')}`);\n }\n lines.push(`Evidence: ${lastEvidenceCount} facts collected`);\n if (lastSummary) {\n lines.push(`Last: ${lastSummary}`);\n }\n if (repeatsWithoutEvidence > 0) {\n lines.push(`Repeated intent streak: ${repeatsWithoutEvidence}`);\n }\n if (repeatNoEvidenceCount > 0) {\n lines.push(`Total repeat-without-evidence events: ${repeatNoEvidenceCount}`);\n }\n if (lastRecommendation) {\n const readiness = typeof lastReadinessScore === 'number' ? `, readiness=${lastReadinessScore}` : '';\n const gain = typeof lastEvidenceGain === 'number' ? `, gain=${lastEvidenceGain}` : '';\n lines.push(`Convergence: ${lastRecommendation}${readiness}${gain}`);\n }\n lines.push('Rule: if no new evidence appears for repeated actions, change strategy or report partial result.');\n\n return lines.join('\\n');\n}\n\n// ─── Heuristic fact extraction (no LLM) ──────────────────────────────────────\n\nfunction extractHeuristicFacts(\n toolName: string,\n input: Record<string, unknown>,\n output: string,\n): ExtractedFact[] {\n const facts: ExtractedFact[] = [];\n\n switch (toolName) {\n case 'fs_read': {\n const filePath = input.path as string;\n const lines = (output.match(/\\n/g) || []).length + 1;\n const firstLine = output.split('\\n').find(l => l.trim().length > 0) || '';\n facts.push({\n category: 'file_content',\n fact: `Read ${filePath} (${lines} lines). Starts with: ${firstLine.slice(0, 80)}`,\n confidence: 0.9,\n source: toolName,\n });\n break;\n }\n\n case 'grep_search': {\n const pattern = input.pattern as string;\n const matchCount = (output.match(/\\n/g) || []).length;\n facts.push({\n category: 'tool_result',\n fact: `grep '${pattern}' found ~${matchCount} matches`,\n confidence: 0.8,\n source: toolName,\n });\n break;\n }\n\n case 'glob_search': {\n const globPattern = input.pattern as string;\n const fileCount = (output.match(/\\n/g) || []).length;\n facts.push({\n category: 'tool_result',\n fact: `glob '${globPattern}' found ~${fileCount} files`,\n confidence: 0.8,\n source: toolName,\n });\n break;\n }\n\n case 'find_definition': {\n const name = input.name as string;\n const preview = output.slice(0, 120).replace(/\\n/g, ' ');\n facts.push({\n category: 'finding',\n fact: `Definition of '${name}': ${preview}`,\n confidence: 0.85,\n source: toolName,\n });\n break;\n }\n\n case 'shell_exec': {\n const cmd = (input.command as string || '').slice(0, 60);\n const preview = output.slice(0, 100).replace(/\\n/g, ' ');\n facts.push({\n category: 'tool_result',\n fact: `shell '${cmd}': succeeded. Output: ${preview}`,\n confidence: 0.7,\n source: toolName,\n });\n break;\n }\n }\n\n return facts;\n}\n\n// ─── LLM summarization helpers ───────────────────────────────────────────────\n\nfunction compressMessages(messages: LLMMessage[]): string | null {\n const lines = messages\n .map(msg => {\n if (msg.role === 'tool') {\n const content = msg.content || '';\n const preview = content.slice(0, 2000);\n return `Tool result: ${preview}${content.length > 2000 ? '...' : ''}`;\n }\n if (msg.role === 'assistant') {\n const parts: string[] = [];\n if (msg.content?.trim()) {\n parts.push(`Agent: ${msg.content.slice(0, 600)}${(msg.content.length > 600) ? '...' : ''}`);\n }\n if (msg.toolCalls?.length) {\n parts.push(`Calls: ${msg.toolCalls.map(tc => tc.name ?? (tc as any).function?.name).join(', ')}`);\n }\n return parts.length > 0 ? parts.join('\\n') : null;\n }\n return null;\n })\n .filter((l): l is string => l !== null);\n\n return lines.length > 0 ? lines.join('\\n\\n') : null;\n}\n\n// ─── Tool definition for structured fact extraction ───────────────────────────\n\nconst EXTRACT_FACTS_TOOL: LLMTool = {\n name: 'extract_facts',\n description: 'Extract concrete, specific facts discovered during agent work iterations.',\n inputSchema: {\n type: 'object',\n properties: {\n facts: {\n type: 'array',\n description: 'List of concrete facts extracted from the agent context',\n items: {\n type: 'object',\n properties: {\n category: {\n type: 'string',\n enum: ['file_content', 'architecture', 'finding', 'decision', 'blocker', 'correction', 'tool_result', 'environment'],\n description: 'Semantic category of the fact',\n },\n fact: {\n type: 'string',\n description: 'Concrete, specific fact. Good: \"src/index.ts exports Agent class\". Bad: \"Agent searched for files\"',\n },\n confidence: {\n type: 'number',\n minimum: 0,\n maximum: 1,\n description: 'Confidence score 0.0-1.0',\n },\n source: {\n type: 'string',\n description: 'Source of this fact: \"agent_reasoning\" or tool name (e.g. \"fs_read\")',\n },\n },\n required: ['category', 'fact', 'confidence', 'source'],\n },\n },\n },\n required: ['facts'],\n },\n};\n\nfunction buildExtractionSystemPrompt(fromIter: number, toIter: number): string {\n return `You extract concrete FACTS from agent work during iterations ${fromIter} to ${toIter}.\n\nCall extract_facts with facts discovered. Only include specific, verifiable facts:\nGOOD: \"src/index.ts exports Agent, FileMemory, FactSheet\" [file_content]\nGOOD: \"Agent uses StateMachine for lifecycle\" [architecture]\nBAD: \"Agent searched for files\", \"Tool was called\"`;\n}\n\n// Fallback prompt for when chatWithTools is unavailable\nfunction buildExtractionPromptFallback(context: string, fromIter: number, toIter: number): string {\n return `Extract concrete FACTS from agent work during iterations ${fromIter} to ${toIter}.\n\n${context}\n\nOutput a JSON array of facts. Each fact:\n- category: \"file_content\" | \"architecture\" | \"finding\" | \"decision\" | \"blocker\" | \"correction\" | \"tool_result\" | \"environment\"\n- fact: concrete, specific fact (not vague descriptions)\n- confidence: 0.0-1.0\n- source: \"agent_reasoning\" or tool name\n\nGOOD: \"src/index.ts exports Agent, FileMemory, FactSheet\" [file_content]\nGOOD: \"Agent uses StateMachine for lifecycle\" [architecture]\nBAD: \"Agent searched for files\", \"Tool was called\"\n\nOutput ONLY the JSON array:`;\n}\n\n// Parse facts from tool call input (structured, no regex needed)\nfunction parseExtractedFactsFromToolInput(input: unknown): ExtractedFact[] {\n try {\n const data = input as { facts?: Array<{ category?: string; fact?: string; confidence?: number; source?: string }> };\n if (!Array.isArray(data?.facts)) {return [];}\n return data.facts\n .filter(f => f.category && f.fact)\n .map(f => ({\n category: (f.category as FactCategory) || 'finding',\n fact: f.fact!,\n confidence: Math.min(1.0, Math.max(0.0, f.confidence ?? 0.5)),\n source: f.source || 'llm_extraction',\n }));\n } catch {\n return [];\n }\n}\n\n// Fallback: parse facts from raw LLM text response (last JSON array wins)\nfunction parseExtractedFactsFromText(raw: string): ExtractedFact[] {\n try {\n // Find the last '[' that starts a valid JSON array — LLM often prefixes with explanation\n let startIdx = raw.lastIndexOf('[');\n while (startIdx >= 0) {\n const slice = raw.slice(startIdx);\n let depth = 0;\n let endIdx = -1;\n for (let i = 0; i < slice.length; i++) {\n if (slice[i] === '[') {depth++;}\n else if (slice[i] === ']') {\n depth--;\n if (depth === 0) { endIdx = i; break; }\n }\n }\n if (endIdx >= 0) {\n try {\n const parsed = JSON.parse(slice.slice(0, endIdx + 1)) as Array<{\n category?: string; fact?: string; confidence?: number; source?: string;\n }>;\n if (Array.isArray(parsed) && parsed.length > 0) {\n return parsed\n .filter(f => f.category && f.fact)\n .map(f => ({\n category: (f.category as FactCategory) || 'finding',\n fact: f.fact!,\n confidence: Math.min(1.0, Math.max(0.0, f.confidence ?? 0.5)),\n source: f.source || 'llm_extraction',\n }));\n }\n } catch { /* try earlier '[' */ }\n }\n startIdx = raw.lastIndexOf('[', startIdx - 1);\n }\n return [];\n } catch {\n return [];\n }\n}\n","/**\n * ToolInputNormalizer — SDK InputNormalizer implementation.\n *\n * Normalizes tool inputs before guards and execution:\n * - Path resolution: .bak/.backup/.orig/.tmp → source file, .js → .ts/.tsx\n * - Glob expansion: bare filename → `**\\/*name*`\n * - Adaptive read limits per tier\n * - Directory field normalization for search tools\n * - Shell cwd defaulting\n * - Secondary artifact blocking (dist/, build/, .map, .min.js)\n *\n * Stateful: tracks per-file read attempts for adaptive limits.\n * Create one instance per agent run.\n */\n\nimport * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport type { InputNormalizer, ToolExecCtx } from '@kb-labs/agent-sdk';\n\n// ─── Config ──────────────────────────────────────────────────────────────────\n\nexport interface ToolInputNormalizerConfig {\n workingDir: string;\n}\n\n// ─── Tier-based read limits ──────────────────────────────────────────────────\n\nconst TIER_BASELINES = {\n small: 180,\n medium: 300,\n large: 500,\n} as const;\n\nconst TIER_BASELINES_LARGE_FILE = {\n small: 280,\n medium: 650,\n large: 1000,\n} as const;\n\nconst TIER_BASELINES_MED_FILE = {\n small: 240,\n medium: 500,\n large: 900,\n} as const;\n\nconst MAX_READ_LIMIT = 1000;\nconst SMALL_FILE_THRESHOLD = 500;\n\n// ─── ToolInputNormalizer ─────────────────────────────────────────────────────\n\nexport class ToolInputNormalizer implements InputNormalizer {\n readonly name = 'tool-input';\n\n private readonly workingDir: string;\n private readonly fileReadAttempts = new Map<string, number>();\n\n constructor(config: ToolInputNormalizerConfig) {\n this.workingDir = config.workingDir;\n }\n\n normalize(\n toolName: string,\n input: Record<string, unknown>,\n ctx: ToolExecCtx,\n ): Record<string, unknown> {\n const normalized = { ...input };\n\n // Directory normalization for search tools\n if (\n toolName === 'glob_search'\n || toolName === 'grep_search'\n || toolName === 'find_definition'\n || toolName === 'code_stats'\n ) {\n this.normalizeDirectoryField(normalized);\n }\n\n // Glob pattern expansion\n if (toolName === 'glob_search') {\n this.normalizeGlobPattern(normalized);\n }\n\n // File read: path resolution + adaptive limits\n if (toolName === 'fs_read' && typeof normalized.path === 'string') {\n this.normalizeFileRead(normalized, ctx);\n }\n\n // Shell cwd defaulting\n if (toolName === 'shell_exec') {\n const rawCwd = typeof normalized.cwd === 'string' ? normalized.cwd.trim() : '';\n if (!rawCwd) {\n normalized.cwd = '.';\n }\n }\n\n return normalized;\n }\n\n // ── Glob pattern normalization ─────────────────────────────────────────────\n\n private normalizeGlobPattern(input: Record<string, unknown>): void {\n // If query is provided but not pattern, use query as pattern\n const pattern =\n typeof input.pattern === 'string'\n ? input.pattern\n : typeof input.query === 'string'\n ? input.query\n : '';\n\n if (pattern && typeof input.pattern !== 'string') {\n input.pattern = pattern;\n }\n\n if (typeof input.pattern === 'string') {\n const trimmed = input.pattern.trim();\n const hasGlobMeta = /[*?[\\]{}]/.test(trimmed);\n // Bare filename without glob chars → wrap in glob pattern\n if (trimmed && !hasGlobMeta) {\n input.pattern = `**/*${trimmed}*`;\n }\n }\n }\n\n // ── File read normalization ────────────────────────────────────────────────\n\n private normalizeFileRead(input: Record<string, unknown>, ctx: ToolExecCtx): void {\n const filePath = (input.path as string).trim();\n\n // Path resolution: .bak → source, .js → .ts\n const resolvedPath = this.resolveSourcePath(filePath);\n if (resolvedPath) {\n input.path = resolvedPath;\n }\n\n // Block secondary artifacts (dist/, build/, .map, .min.js)\n const finalPath = String(input.path);\n if (isSecondaryArtifact(finalPath)) {\n // Don't block — just log via meta. Guards can enforce if needed.\n ctx.run.meta.set('normalizer', 'blocked_artifact', finalPath);\n }\n\n // Offset normalization\n const currentOffset = Number(input.offset);\n const safeOffset = Number.isFinite(currentOffset) && currentOffset > 0\n ? Math.floor(currentOffset)\n : 1;\n input.offset = safeOffset;\n\n // Adaptive read limit\n const requestedLimit = Number(input.limit);\n const adaptiveLimit = this.computeAdaptiveLimit(\n finalPath,\n Number.isFinite(requestedLimit) && requestedLimit > 0\n ? Math.floor(requestedLimit)\n : undefined,\n ctx.run.tier,\n );\n if (adaptiveLimit > 0) {\n input.limit = adaptiveLimit;\n }\n }\n\n // ── Path resolution ────────────────────────────────────────────────────────\n\n private resolveSourcePath(filePath: string): string | null {\n const normalized = filePath.replace(/\\\\/g, '/');\n\n // Try removing backup suffixes (.bak, .backup, .orig, .tmp)\n const backupResult = this.tryResolvePrimarySource(normalized);\n if (backupResult) {return backupResult;}\n\n // Try .js → .ts/.tsx\n const tsResult = this.tryResolveTsSource(normalized);\n if (tsResult) {return tsResult;}\n\n return null;\n }\n\n private tryResolvePrimarySource(filePath: string): string | null {\n const lower = filePath.toLowerCase();\n const suffixes = ['.backup', '.bak', '.orig', '.tmp'];\n const matched = suffixes.find(s => lower.endsWith(s));\n if (!matched) {return null;}\n\n const candidate = filePath.slice(0, filePath.length - matched.length);\n const abs = path.isAbsolute(candidate) ? candidate : path.join(this.workingDir, candidate);\n\n if (!existsSafe(abs)) {return null;}\n return path.isAbsolute(filePath) ? abs : candidate;\n }\n\n private tryResolveTsSource(filePath: string): string | null {\n if (!filePath.endsWith('.js')) {return null;}\n\n const base = filePath.slice(0, -3);\n for (const ext of ['.ts', '.tsx']) {\n const candidate = base + ext;\n const abs = path.isAbsolute(candidate) ? candidate : path.join(this.workingDir, candidate);\n if (existsSafe(abs)) {\n return path.isAbsolute(filePath) ? abs : candidate;\n }\n }\n return null;\n }\n\n // ── Adaptive read limits ───────────────────────────────────────────────────\n\n private computeAdaptiveLimit(\n filePath: string,\n requestedLimit: number | undefined,\n tier: string,\n ): number {\n const attempts = (this.fileReadAttempts.get(filePath) ?? 0) + 1;\n this.fileReadAttempts.set(filePath, attempts);\n\n // If user explicitly requested a large limit, respect it (capped)\n if (requestedLimit && requestedLimit >= 120) {\n return Math.min(MAX_READ_LIMIT, requestedLimit);\n }\n\n // Get file size for adaptive baseline\n const fileLines = this.getFileLineCount(filePath);\n let baseline: number = TIER_BASELINES[tier as keyof typeof TIER_BASELINES] ?? TIER_BASELINES.medium;\n\n if (fileLines !== null) {\n if (fileLines <= SMALL_FILE_THRESHOLD) {\n // Small file — read it all\n baseline = Math.min(MAX_READ_LIMIT, fileLines);\n } else if (fileLines >= 3000) {\n baseline = TIER_BASELINES_LARGE_FILE[tier as keyof typeof TIER_BASELINES_LARGE_FILE] ?? TIER_BASELINES_LARGE_FILE.medium;\n } else if (fileLines >= 1500) {\n baseline = TIER_BASELINES_MED_FILE[tier as keyof typeof TIER_BASELINES_MED_FILE] ?? TIER_BASELINES_MED_FILE.medium;\n }\n }\n\n // Scale up for repeated reads (agent is clearly interested in this file)\n if (attempts >= 5) {\n baseline = Math.min(MAX_READ_LIMIT, Math.round(baseline * 1.6));\n } else if (attempts >= 3) {\n baseline = Math.min(MAX_READ_LIMIT, Math.round(baseline * 1.4));\n }\n\n // If user requested a small limit, use at least the baseline\n if (requestedLimit && requestedLimit > 0) {\n return Math.min(MAX_READ_LIMIT, Math.max(requestedLimit, baseline));\n }\n\n return Math.min(MAX_READ_LIMIT, baseline);\n }\n\n private getFileLineCount(filePath: string): number | null {\n try {\n const abs = path.isAbsolute(filePath) ? filePath : path.join(this.workingDir, filePath);\n const stat = fs.statSync(abs);\n if (!stat.isFile()) {return null;}\n // Estimate: ~40 chars per line average for source code\n return Math.ceil(stat.size / 40);\n } catch {\n return null;\n }\n }\n\n // ── Directory normalization ────────────────────────────────────────────────\n\n private normalizeDirectoryField(input: Record<string, unknown>): void {\n if (typeof input.directory !== 'string') {return;}\n\n const raw = input.directory.trim();\n if (!raw || raw === '.') {return;}\n\n const abs = path.isAbsolute(raw) ? raw : path.resolve(this.workingDir, raw);\n\n if (existsSafe(abs)) {\n try {\n const stat = fs.statSync(abs);\n if (stat.isFile()) {\n // Directory field points to a file — use its parent\n const rel = path.relative(this.workingDir, path.dirname(abs));\n input.directory = (!rel || rel === '.') ? '.' : (rel.startsWith('..') ? '.' : rel);\n }\n } catch { /* keep original */ }\n return;\n }\n\n // Path doesn't exist but looks like a file (has extension) — use parent\n if (/\\.[a-z0-9]+$/i.test(raw)) {\n const parentDir = path.dirname(abs);\n if (existsSafe(parentDir)) {\n try {\n if (fs.statSync(parentDir).isDirectory()) {\n const rel = path.relative(this.workingDir, parentDir);\n input.directory = (!rel || rel === '.') ? '.' : (rel.startsWith('..') ? '.' : rel);\n }\n } catch { /* keep original */ }\n }\n }\n }\n}\n\n// ─── Pure helpers ────────────────────────────────────────────────────────────\n\nfunction existsSafe(p: string): boolean {\n try {\n fs.accessSync(p);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function isSecondaryArtifact(filePath: string): boolean {\n const normalized = filePath.replace(/\\\\/g, '/').toLowerCase();\n return (\n normalized.includes('/dist/')\n || normalized.includes('/build/')\n || normalized.endsWith('.map')\n || normalized.endsWith('.min.js')\n || normalized.includes('.backup')\n || normalized.endsWith('.bak')\n || normalized.endsWith('.orig')\n || normalized.endsWith('.tmp')\n );\n}\n","/**\n * bootstrapAgentSDK — registers SDKAgentRunner as the RunnerFactory.\n *\n * Call this exactly once at application startup, before any sdk.createRunner() call.\n * Typically called at the top of the CLI entry point (agent:run command).\n *\n * @example\n * import { bootstrapAgentSDK } from '@kb-labs/agent-core';\n * bootstrapAgentSDK();\n * const runner = new AgentSDK().register(pack).createRunner(config);\n */\n\nimport { AgentSDK } from '@kb-labs/agent-sdk';\nimport { SDKAgentRunner } from './runner.js';\n\nexport function bootstrapAgentSDK(): void {\n AgentSDK.setRunnerFactory((config, sdk) => new SDKAgentRunner(config, sdk));\n}\n"]}
|