@promptev/context-engine 0.0.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.
Files changed (68) hide show
  1. package/LICENSE.md +202 -0
  2. package/NOTICE +17 -0
  3. package/README.md +112 -0
  4. package/dist/cli.js +11998 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/config-Bl9U789m.d.cts +174 -0
  7. package/dist/config-Bt9bUQqU.d.ts +174 -0
  8. package/dist/embeddings-B-jZ42mk.d.cts +67 -0
  9. package/dist/embeddings-DaSdAZN3.d.ts +67 -0
  10. package/dist/express.cjs +3173 -0
  11. package/dist/express.cjs.map +1 -0
  12. package/dist/express.d.cts +24 -0
  13. package/dist/express.d.ts +24 -0
  14. package/dist/express.js +3170 -0
  15. package/dist/express.js.map +1 -0
  16. package/dist/fastify.cjs +3184 -0
  17. package/dist/fastify.cjs.map +1 -0
  18. package/dist/fastify.d.cts +16 -0
  19. package/dist/fastify.d.ts +16 -0
  20. package/dist/fastify.js +3181 -0
  21. package/dist/fastify.js.map +1 -0
  22. package/dist/governance-BDkcv4qZ.d.cts +79 -0
  23. package/dist/governance-XIScatRO.d.ts +79 -0
  24. package/dist/graph/index.cjs +1428 -0
  25. package/dist/graph/index.cjs.map +1 -0
  26. package/dist/graph/index.d.cts +104 -0
  27. package/dist/graph/index.d.ts +104 -0
  28. package/dist/graph/index.js +1413 -0
  29. package/dist/graph/index.js.map +1 -0
  30. package/dist/hono.cjs +3183 -0
  31. package/dist/hono.cjs.map +1 -0
  32. package/dist/hono.d.cts +39 -0
  33. package/dist/hono.d.ts +39 -0
  34. package/dist/hono.js +3179 -0
  35. package/dist/hono.js.map +1 -0
  36. package/dist/index.cjs +11731 -0
  37. package/dist/index.cjs.map +1 -0
  38. package/dist/index.d.cts +851 -0
  39. package/dist/index.d.ts +851 -0
  40. package/dist/index.js +11676 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/mcp.cjs +181 -0
  43. package/dist/mcp.cjs.map +1 -0
  44. package/dist/mcp.d.cts +26 -0
  45. package/dist/mcp.d.ts +26 -0
  46. package/dist/mcp.js +179 -0
  47. package/dist/mcp.js.map +1 -0
  48. package/dist/migrations/sql/0001.sql +119 -0
  49. package/dist/migrations/sql/0002_graph.sql +48 -0
  50. package/dist/migrations/sql/0003_tools.sql +61 -0
  51. package/dist/migrations/sql/0004_acl_indexes.sql +4 -0
  52. package/dist/redaction-BmDSWJ7h.d.cts +98 -0
  53. package/dist/redaction-BmDSWJ7h.d.ts +98 -0
  54. package/dist/redaction-presidio.cjs +79 -0
  55. package/dist/redaction-presidio.cjs.map +1 -0
  56. package/dist/redaction-presidio.d.cts +22 -0
  57. package/dist/redaction-presidio.d.ts +22 -0
  58. package/dist/redaction-presidio.js +73 -0
  59. package/dist/redaction-presidio.js.map +1 -0
  60. package/dist/router-CrxZ2y_Z.d.ts +82 -0
  61. package/dist/router-OPgSoYAB.d.cts +82 -0
  62. package/dist/skills/context-engine/SKILL.md +160 -0
  63. package/package.json +184 -0
  64. package/src/migrations/sql/0001.sql +119 -0
  65. package/src/migrations/sql/0002_graph.sql +48 -0
  66. package/src/migrations/sql/0003_tools.sql +61 -0
  67. package/src/migrations/sql/0004_acl_indexes.sql +4 -0
  68. package/src/skills/context-engine/SKILL.md +160 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/text.ts","../src/errors.ts","../src/hooks.ts","../src/providers/llm.ts","../src/extraction/json.ts","../src/extraction/files.ts","../src/extras.ts","../src/extraction/pdf-structure.ts","../src/extraction/ocr.ts","../src/extraction/pdf.ts","../src/extraction/vision.ts","../src/extraction/index.ts","../src/usage.ts","../src/tools/executors/db.ts","../src/graph/communities.ts","../src/graph/entities.ts","../src/graph/schema.ts","../src/graph/neo4j-client.ts","../src/graph/retrieval.ts","../src/graph/stage.ts","../src/graph/index.ts","../src/chunkers.ts","../src/actions.ts","../src/crypto.ts","../src/redaction.ts","../src/sandbox.ts","../src/structured.ts","../src/ingest.ts","../src/providers/batch.ts","../src/config.ts","../src/db.ts","../src/engine.ts","../src/providers/embeddings.ts","../src/compression.ts","../src/search.ts","../src/fusion.ts","../src/providers/reranker.ts","../src/sentinels.ts","../src/storage.ts","../src/tools/executors/function.ts","../src/tools/governance.ts","../src/tools/acl.ts","../src/tools/approval.ts","../src/tools/audit.ts","../src/tools/config.ts","../src/tools/executors/http.ts","../src/version.ts","../src/tools/executors/mcp-client.ts","../src/tools/registry.ts","../src/index.ts","../src/mcp.ts","../src/tools/mcp-tools.ts","../src/providers/index.ts","../src/runner.ts"],"names":["francAll","EngineActionError","DocumentNotFoundError","GraphLegUnavailable","ApprovalNotPending","ApprovalExpired","CodeExecutionError","CodeExecutionTimeout","ExtraMissingError","log","LLMClient","cfg","OpenAI","jsonrepair","load","JSZip","mammoth","ExcelJS","parseCsv","PostalMime","median","stats","getDocumentProxy","extractText","Extracted","renderPageAsImage","extractImages","extract","require","createRequire","mulberry32","callLlm","randomUUID","safeJsonParse","createHash","SCOPE","buildGraphRanked","runGraphStage","GraphStore","openSync","readSync","closeSync","randomBytes","createCipheriv","createDecipheriv","createHmac","TIMEOUT_MS","DOCX_MIMES","dot","readFileSync","basename","mime","graphUnits","UUID_RE","SHEET_MARKER_RE","z","dirname","fileURLToPath","join","OPENAI_FAMILY","postJson","getEncoding","count","method","quality","vectorLiteral","visible","rows","contentType","msg","note","testConnection","buildGraphStore","handler"],"mappings":"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AAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK,IAAA;AAAA,MACL,GAAA,EAAK;AAAA,KACP;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACxeaC,oCAQAC,sCAAA,CAAA,CAOAC,oCAAA,CAAA,CAOAC,mCAAA,CAAA,CAOAC,gCAAA,CAAA,CAOAC,qCAOAC,qCAAA,CAAA,CAOAC;AArDb,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,eAAA,GAAA;AAGO,IAAMP,yBAAA,GAAN,cAAgC,KAAA,CAAM;AAAA,MAC3C,YAAY,OAAA,EAAiB;AAC3B,QAAA,KAAA,CAAM,OAAO,CAAA;AACb,QAAA,IAAA,CAAK,IAAA,GAAO,mBAAA;AAAA,MACd;AAAA,KACF;AAGO,IAAMC,6BAAA,GAAN,cAAoC,KAAA,CAAM;AAAA,MAC/C,YAAY,UAAA,EAAoB;AAC9B,QAAA,KAAA,CAAM,CAAA,oBAAA,EAAuB,UAAU,CAAA,CAAE,CAAA;AACzC,QAAA,IAAA,CAAK,IAAA,GAAO,uBAAA;AAAA,MACd;AAAA,KACF;AAEO,IAAMC,2BAAA,GAAN,cAAkC,KAAA,CAAM;AAAA,MAC7C,WAAA,CAAY,UAAU,oCAAA,EAAsC;AAC1D,QAAA,KAAA,CAAM,OAAO,CAAA;AACb,QAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AAAA,MACd;AAAA,KACF;AAEO,IAAMC,0BAAA,GAAN,cAAiC,KAAA,CAAM;AAAA,MAC5C,WAAA,CAAY,UAAU,yBAAA,EAA2B;AAC/C,QAAA,KAAA,CAAM,OAAO,CAAA;AACb,QAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AAAA,MACd;AAAA,KACF;AAEO,IAAMC,uBAAA,GAAN,cAA8B,KAAA,CAAM;AAAA,MACzC,WAAA,CAAY,UAAU,sBAAA,EAAwB;AAC5C,QAAA,KAAA,CAAM,OAAO,CAAA;AACb,QAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,MACd;AAAA,KACF;AAEO,IAAMC,0BAAA,GAAN,cAAiC,KAAA,CAAM;AAAA,MAC5C,YAAY,OAAA,EAAiB;AAC3B,QAAA,KAAA,CAAM,OAAO,CAAA;AACb,QAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AAAA,MACd;AAAA,KACF;AAEO,IAAMC,4BAAA,GAAN,cAAmC,KAAA,CAAM;AAAA,MAC9C,WAAA,CAAY,UAAU,0BAAA,EAA4B;AAChD,QAAA,KAAA,CAAM,OAAO,CAAA;AACb,QAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AAAA,MACd;AAAA,KACF;AAEO,IAAMC,yBAAA,GAAN,cAAgC,KAAA,CAAM;AAAA,MAC3C,WAAA,CAAY,KAAA,EAAe,GAAA,EAAa,IAAA,EAAc;AACpD,QAAA,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,eAAA,EAAkB,GAAG,8BAA8B,KAAK,CAAA,eAAA,EAAkB,GAAG,CAAA,CAAE,CAAA;AAC5F,QAAA,IAAA,CAAK,IAAA,GAAO,mBAAA;AAAA,MACd;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC7CO,SAAS,SAAA,CAAU,OAAiC,KAAA,EAAyB;AAClF,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACrB,EAAA,IAAI;AACF,IAAA,KAAA,CAAM,QAAQ,KAAK,CAAA;AAAA,EACrB,CAAA,CAAA,MAAQ;AACN,IAAAC,IAAAA,CAAI,KAAK,qCAAqC,CAAA;AAAA,EAChD;AACF;AAEO,SAAS,SAAA,CAAU,KAAA,EAAiC,GAAA,EAAc,GAAA,EAAoC;AAC3G,EAAAA,IAAAA,CAAI,KAAA,CAAM,uBAAA,EAAyB,GAAA,EAAK,UAAU,GAAG,CAAA;AACrD,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACrB,EAAA,IAAI;AACF,IAAA,KAAA,CAAM,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA,EACxB,CAAA,CAAA,MAAQ;AACN,IAAAA,IAAAA,CAAI,KAAK,qCAAqC,CAAA;AAAA,EAChD;AACF;AAEO,SAAS,YAAA,CAAa,OAAiC,KAAA,EAAsC;AAClG,EAAA,IAAI,CAAC,OAAO,UAAA,EAAY;AACxB,EAAA,IAAI;AACF,IAAA,KAAA,CAAM,WAAW,KAAK,CAAA;AAAA,EACxB,CAAA,CAAA,MAAQ;AACN,IAAAA,IAAAA,CAAI,KAAK,wCAAwC,CAAA;AAAA,EACnD;AACF;AAvCA,IAEMA,IAAAA;AAFN,IAAA,UAAA,GAAA,KAAA,CAAA;AAAA,EAAA,cAAA,GAAA;AAEA,IAAMA,IAAAA,GAAM;AAAA,MACV,MAAM,CAAA,GAAI,IAAA,KAAoB,QAAQ,IAAA,CAAK,kBAAA,EAAoB,GAAG,IAAI,CAAA;AAAA,MACtE,OAAO,CAAA,GAAI,IAAA,KAAoB,QAAQ,KAAA,CAAM,kBAAA,EAAoB,GAAG,IAAI;AAAA,KAC1E;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACLA,IAAA,WAAA,GAAA,EAAA;AAAA,QAAA,CAAA,WAAA,EAAA;AAAA,EAAA,SAAA,EAAA,MAAAC,iBAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,qBAAA,EAAA,MAAA,qBAAA;AAAA,EAAA,OAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAuEA,SAAS,SAAS,KAAA,EAA2B;AAC3C,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,SAAS,QAAQ,CAAA;AAC7C;AAEA,eAAe,QAAA,CACb,SAAA,EACA,GAAA,EACA,IAAA,EACA,OAAA,EACc;AACd,EAAA,MAAM,IAAA,GAAO,MAAM,SAAA,CAAU,GAAA,EAAK;AAAA,IAChC,MAAA,EAAQ,MAAA;AAAA,IACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAoB,GAAG,OAAA,EAAQ;AAAA,IAC1D,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,IACzB,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,UAAU;AAAA,GACvC,CAAA;AACD,EAAA,IAAI,CAAC,KAAK,EAAA,EAAI;AACZ,IAAA,MAAM,OAAO,MAAM,IAAA,CAAK,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAC7C,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,IAAA,CAAK,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,UAAU,CAAA,EAAG,IAAA,GAAO,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,GAAK,EAAE,CAAA,CAAE,CAAA;AAAA,EACpF;AACA,EAAA,OAAO,KAAK,IAAA,EAAK;AACnB;AAEO,SAAS,sBAAsBC,IAAAA,EAAwB;AAC5D,EAAA,OAAO,IAAIC,uBAAA,CAAO;AAAA,IAChB,MAAA,EAAQD,KAAI,MAAA,IAAU,MAAA;AAAA,IACtB,OAAA,EAASA,KAAI,OAAA,IAAW,MAAA;AAAA,IACxB,OAAA,EAAS,UAAA;AAAA,IACT,UAAA,EAAY;AAAA,GACb,CAAA;AACH;AAuMA,eAAe,qBAAqB,MAAA,EAA8D;AAChG,EAAA,MAAM,SAAA,GAAY,eAAA;AAClB,EAAA,IAAI,GAAA;AAIJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAO,MAAM,OAAO,SAAA,CAAA;AAAA,EACtB,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAIH,yBAAA,CAAkB,QAAA,EAAU,SAAA,EAAW,YAAY,CAAA;AAAA,EAC/D;AACA,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,WAAA,IAAe,GAAA,CAAI,MAAA;AACpC,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,MAAM,IAAIA,yBAAA,CAAkB,QAAA,EAAU,SAAA,EAAW,YAAY,CAAA;AAAA,EAC/D;AACA,EAAA,OAAO,IAAI,IAAA,CAAK,EAAE,MAAA,EAAQ,MAAA,IAAU,MAAM,CAAA;AAC5C;AAEA,eAAe,cAAA,GAQZ;AACD,EAAA,MAAM,SAAA,GAAY,iCAAA;AAClB,EAAA,IAAI;AACF,IAAA,OAAQ,MAAM,OAAO,SAAA,CAAA;AAAA,EACvB,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAIA,yBAAA,CAAkB,SAAA,EAAW,SAAA,EAAW,aAAa,CAAA;AAAA,EACjE;AACF;AAEO,SAAS,cAAA,CAAeG,MAAgB,IAAA,EAAiC;AAC9E,EAAA,IAAI,IAAA,EAAM,MAAA,IAAU,IAAA,EAAM,KAAA,IAAS,MAAM,SAAA,EAAW;AAClD,IAAA,OAAO,IAAID,iBAAA,CAAUC,IAAAA,EAAK,IAAI,CAAA;AAAA,EAChC;AACA,EAAA,IAAIA,IAAAA,CAAI,aAAa,WAAA,EAAa;AAChC,IAAA,OAAO,IAAID,iBAAA,CAAUC,IAAAA,EAAK,EAAE,KAAA,EAAO,UAAA,CAAW,OAAO,CAAA;AAAA,EACvD;AACA,EAAA,IAAI,aAAA,CAAc,GAAA,CAAIA,IAAAA,CAAI,QAAQ,CAAA,EAAG;AACnC,IAAA,OAAO,IAAID,kBAAUC,IAAAA,EAAK,EAAE,QAAQ,qBAAA,CAAsBA,IAAG,GAAG,CAAA;AAAA,EAClE;AACA,EAAA,IAAIA,IAAAA,CAAI,QAAA,KAAa,QAAA,IAAYA,IAAAA,CAAI,aAAa,SAAA,EAAW;AAC3D,IAAA,OAAO,IAAID,kBAAUC,IAAG,CAAA;AAAA,EAC1B;AACA,EAAA,MAAM,IAAI,MAAM,CAAA,sBAAA,EAAyB,IAAA,CAAK,UAAUA,IAAAA,CAAI,QAAQ,CAAC,CAAA,CAAE,CAAA;AACzE;AASA,eAAsB,OAAA,CACpBA,MACA,IAAA,EAC+B;AAC/B,EAAA,MAAM,EAAE,MAAA,EAAQ,GAAG,QAAA,EAAS,GAAI,IAAA;AAChC,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,OAAO,MAAA,CAAO,KAAK,QAAQ,CAAA;AAAA,EAC7B;AACA,EAAA,MAAM,KAAA,GAAQ,eAAeA,IAAG,CAAA;AAChC,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA;AAAA,EAClC,CAAA,SAAE;AACA,IAAA,MAAM,MAAM,MAAA,EAAO;AAAA,EACrB;AACF;AApXA,IAea,UAAA,CAAA,CACP,iBAAA,CAAA,CACA,oBAAA,CAAA,CAEA,aAAA,CAAA,CAoFOD;AAvGb,IAAA,QAAA,GAAA,KAAA,CAAA;AAAA,EAAA,sBAAA,GAAA;AAYA,IAAA,WAAA,EAAA;AAGO,IAAM,UAAA,GAAa,GAAA;AAC1B,IAAM,iBAAA,GAAoB,YAAA;AAC1B,IAAM,oBAAA,GAAuB,IAAA;AAE7B,IAAM,gCAAgB,IAAI,GAAA,CAAI,CAAC,QAAA,EAAU,cAAA,EAAgB,QAAQ,CAAC,CAAA;AAoF3D,IAAMA,oBAAN,MAAgB;AAAA,MACrB,GAAA;AAAA,MACA,QAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,MACQ,WAAA,GAAuC,IAAA;AAAA,MAE/C,WAAA,CAAYC,IAAAA,EAAgB,IAAA,GAAsB,EAAC,EAAG;AACpD,QAAA,IAAA,CAAK,GAAA,GAAMA,IAAAA;AACX,QAAA,IAAA,CAAK,WAAWA,IAAAA,CAAI,QAAA;AACpB,QAAA,IAAA,CAAK,QAAQA,IAAAA,CAAI,KAAA;AACjB,QAAA,IAAA,CAAK,MAAA,GAAS,KAAK,MAAA,IAAU,IAAA;AAC7B,QAAA,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,SAAA,IAAa,IAAA;AAAA,MACnD;AAAA,MAEA,MAAM,MAAA,GAAwB;AAC5B,QAAA,MAAM,MAAA,GAAS,KAAK,MAAA,EAAQ,KAAA;AAC5B,QAAA,IAAI,OAAO,WAAW,UAAA,EAAY;AAChC,UAAA,MAAM,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAAA,QAC/B;AAAA,MACF;AAAA,MAEA,OAAO,MAAA,CAAO,YAAY,CAAA,GAAmB;AAC3C,QAAA,MAAM,KAAK,MAAA,EAAO;AAAA,MACpB;AAAA,MAEA,MAAM,KAAK,IAAA,EAAkD;AAC3D,QAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,WAAW,KAAA,EAAO,MAAA,GAAS,MAAK,GAAI,IAAA;AAC1D,QAAA,IAAI,IAAA,CAAK,aAAa,WAAA,EAAa;AACjC,UAAA,OAAO,IAAA,CAAK,aAAA,CAAc,MAAA,EAAQ,IAAA,EAAM,UAAU,MAAM,CAAA;AAAA,QAC1D;AACA,QAAA,IAAI,aAAA,CAAc,GAAA,CAAI,IAAA,CAAK,QAAQ,CAAA,EAAG;AACpC,UAAA,OAAO,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,IAAA,EAAM,UAAU,MAAM,CAAA;AAAA,QACvD;AACA,QAAA,IAAI,IAAA,CAAK,aAAa,QAAA,EAAU;AAC9B,UAAA,OAAO,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,IAAA,EAAM,UAAU,MAAM,CAAA;AAAA,QACvD;AACA,QAAA,IAAI,IAAA,CAAK,aAAa,SAAA,EAAW;AAC/B,UAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,IAAA,EAAM,UAAU,MAAM,CAAA;AAAA,QACxD;AACA,QAAA,MAAM,IAAI,MAAM,CAAA,sBAAA,EAAyB,IAAA,CAAK,UAAU,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,MAC1E;AAAA,MAEA,MAAc,aAAA,CACZ,MAAA,EACA,IAAA,EACA,UACA,MAAA,EAC+B;AAC/B,QAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,UAAA,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAAA,QACpE;AACA,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,MAAA,GAAS,GAAG,MAAM;;AAAA,6BAAA,CAAA;AAAA,QACpB;AACA,QAAA,MAAM,UAA0C,EAAC;AACjD,QAAA,KAAA,MAAW,KAAA,IAAS,MAAA,IAAU,EAAC,EAAG;AAChC,UAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,YACX,IAAA,EAAM,OAAA;AAAA,YACN,MAAA,EAAQ;AAAA,cACN,IAAA,EAAM,QAAA;AAAA,cACN,UAAA,EAAY,WAAA;AAAA,cACZ,IAAA,EAAM,SAAS,KAAK;AAAA;AACtB,WACD,CAAA;AAAA,QACH;AACA,QAAA,OAAA,CAAQ,KAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,MAAM,CAAA;AAEzC,QAAA,MAAM,OAAO,MAAM,QAAA;AAAA,UACjB,IAAA,CAAK,SAAA;AAAA,UACL,uCAAA;AAAA,UACA;AAAA,YACE,OAAO,IAAA,CAAK,KAAA;AAAA,YACZ,UAAA,EAAY,oBAAA;AAAA,YACZ,MAAA;AAAA,YACA,UAAU,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAS;AAAA,WACtC;AAAA,UACA;AAAA,YACE,WAAA,EAAa,IAAA,CAAK,GAAA,CAAI,MAAA,IAAU,EAAA;AAAA,YAChC,mBAAA,EAAqB,iBAAA;AAAA,YACrB,cAAA,EAAgB;AAAA;AAClB,SACF;AACA,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAA;AAC7B,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,IAAS,EAAC;AAC7B,QAAA,OAAO,CAAC,IAAA,EAAM,EAAE,KAAA,EAAO,KAAA,CAAM,YAAA,IAAgB,CAAA,EAAG,MAAA,EAAQ,KAAA,CAAM,aAAA,IAAiB,CAAA,EAAG,CAAA;AAAA,MACpF;AAAA,MAEA,MAAc,UAAA,CACZ,MAAA,EACA,IAAA,EACA,UACA,MAAA,EAC+B;AAC/B,QAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,UAAA,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAAA,QAC1D;AACA,QAAA,MAAM,UAA0C,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,MAAM,CAAA;AAC7E,QAAA,KAAA,MAAW,KAAA,IAAS,MAAA,IAAU,EAAC,EAAG;AAChC,UAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,YACX,IAAA,EAAM,WAAA;AAAA,YACN,WAAW,EAAE,GAAA,EAAK,yBAAyB,QAAA,CAAS,KAAK,CAAC,CAAA,CAAA;AAAG,WAC9D,CAAA;AAAA,QACH;AACA,QAAA,MAAM,IAAA,GAIF;AAAA,UACF,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,QAAA,EAAU;AAAA,YACR,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,MAAA,EAAO;AAAA,YAClC,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA;AAAQ;AAC1B,SACF;AACA,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,IAAA,CAAK,eAAA,GAAkB,EAAE,IAAA,EAAM,aAAA,EAAc;AAAA,QAC/C;AACA,QAAA,MAAM,OAAO,MAAM,IAAA,CAAK,OAAO,IAAA,CAAK,WAAA,CAAY,OAAO,IAAI,CAAA;AAC3D,QAAA,MAAM,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,EAAG,SAAS,OAAA,IAAW,EAAA;AAClD,QAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,QAAA,OAAO,CAAC,IAAA,EAAM,EAAE,KAAA,EAAO,KAAA,EAAO,aAAA,IAAiB,CAAA,EAAG,MAAA,EAAQ,KAAA,EAAO,iBAAA,IAAqB,CAAA,EAAG,CAAA;AAAA,MAC3F;AAAA,MAEA,MAAc,UAAA,CACZ,MAAA,EACA,IAAA,EACA,UACA,MAAA,EAC+B;AAC/B,QAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,UAAA,IAAA,CAAK,WAAA,GAAc,MAAM,oBAAA,CAAqB,IAAA,CAAK,IAAI,MAAM,CAAA;AAAA,QAC/D;AACA,QAAA,MAAM,QAAmB,EAAC;AAC1B,QAAA,KAAA,MAAW,GAAA,IAAO,MAAA,IAAU,EAAC,EAAG;AAC9B,UAAA,KAAA,CAAM,IAAA,CAAK,EAAE,UAAA,EAAY,EAAE,QAAA,EAAU,WAAA,EAAa,IAAA,EAAM,QAAA,CAAS,GAAG,CAAA,EAAE,EAAG,CAAA;AAAA,QAC3E;AACA,QAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,IAAA,EAAM,CAAA;AAEzB,QAAA,MAAM,MAAA,GAAkC,EAAE,iBAAA,EAAmB,MAAA,EAAO;AACpE,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,MAAA,CAAO,gBAAA,GAAmB,kBAAA;AAAA,QAC5B;AAEA,QAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,WAAA,CAAY,OAAO,eAAA,CAAgB;AAAA,UACzD,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,QAAA,EAAU,KAAA;AAAA,UACV;AAAA,SACD,CAAA;AACD,QAAA,MAAM,IAAA,GAAO,KAAK,IAAA,IAAQ,EAAA;AAC1B,QAAA,MAAM,YAAY,IAAA,CAAK,aAAA;AACvB,QAAA,MAAM,WAAA,GAAc,SAAA,EAAW,gBAAA,IAAoB,SAAA,EAAW,kBAAA,IAAsB,CAAA;AACpF,QAAA,MAAM,YAAA,GAAe,SAAA,EAAW,oBAAA,IAAwB,SAAA,EAAW,sBAAA,IAA0B,CAAA;AAC7F,QAAA,OAAO,CAAC,MAAM,EAAE,KAAA,EAAO,eAAe,CAAA,EAAG,MAAA,EAAQ,YAAA,IAAgB,CAAA,EAAG,CAAA;AAAA,MACtE;AAAA,MAEA,MAAc,WAAA,CACZ,MAAA,EACA,IAAA,EACA,UACA,MAAA,EAC+B;AAC/B,QAAA,MAAM,EAAE,oBAAA,EAAsB,eAAA,EAAgB,GAAI,MAAM,cAAA,EAAe;AACvE,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,MAAA,GAAS,GAAG,MAAM;;AAAA,6BAAA,CAAA;AAAA,QACpB;AACA,QAAA,MAAM,UAA0C,EAAC;AACjD,QAAA,KAAA,MAAW,KAAA,IAAS,MAAA,IAAU,EAAC,EAAG;AAChC,UAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,KAAA,EAAO,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,EAAE,KAAA,EAAO,KAAA,EAAM,EAAE,EAAG,CAAA;AAAA,QACrE;AACA,QAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,IAAA,EAAM,IAAA,EAAM,CAAA;AAE3B,QAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB;AAAA,UACvC,WAAA,EAAa,CAAA;AAAA,UACb,cAAA,EAAgB;AAAA,YACd,cAAA,EAAgB,UAAA;AAAA,YAChB,iBAAA,EAAmB;AAAA;AACrB,SACD,CAAA;AACD,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAU,MAAM,OAAA,CAAQ,IAAA;AAAA,YAC5B,IAAI,eAAA,CAAgB;AAAA,cAClB,SAAS,IAAA,CAAK,KAAA;AAAA,cACd,MAAA,EAAQ,CAAC,EAAE,IAAA,EAAM,QAAQ,CAAA;AAAA,cACzB,UAAU,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAS;AAAA,aACrC;AAAA,WACH;AACA,UAAA,MAAM,OAAO,MAAA,CAAO,MAAA,EAAQ,SAAS,OAAA,GAAU,CAAC,GAAG,IAAA,IAAQ,EAAA;AAC3D,UAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,IAAS,EAAC;AAC/B,UAAA,OAAO,CAAC,IAAA,EAAM,EAAE,KAAA,EAAO,KAAA,CAAM,WAAA,IAAe,CAAA,EAAG,MAAA,EAAQ,KAAA,CAAM,YAAA,IAAgB,CAAA,EAAG,CAAA;AAAA,QAClF,CAAA,SAAE;AACA,UAAA,OAAA,CAAQ,OAAA,IAAU;AAAA,QACpB;AAAA,MACF;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;AChSA,SAAS,YAAY,IAAA,EAAsB;AACzC,EAAA,IAAI,CAAA,GAAI,KAAK,IAAA,EAAK;AAClB,EAAA,MAAM,MAAA,GAAS,oCAAA,CAAqC,IAAA,CAAK,CAAC,CAAA;AAC1D,EAAA,IAAI,SAAS,CAAC,CAAA,MAAO,MAAA,CAAO,CAAC,EAAE,IAAA,EAAK;AACpC,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,UAAA,CAAW,OAAgB,YAAA,EAAqC;AACvE,EAAA,IAAI,YAAA,KAAiB,OAAA,EAAS,OAAO,KAAA,CAAM,QAAQ,KAAK,CAAA;AACxD,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AAOO,SAAS,aAAA,CAAc,IAAA,EAAc,YAAA,GAA6B,QAAA,EAAmB;AAC1F,EAAA,MAAM,QAAA,GAAW,YAAY,IAAI,CAAA;AAEjC,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAC3C,IAAA,IAAI,UAAA,CAAW,MAAA,EAAQ,YAAY,CAAA,EAAG,OAAO,MAAA;AAAA,EAC/C,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI;AACF,IAAA,QAAA,GAAW,IAAA,CAAK,KAAA,CAAME,qBAAA,CAAW,QAAQ,CAAC,CAAA;AAAA,EAC5C,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,WAAA,CAAY,CAAA,SAAA,EAAY,YAAY,CAAA,4BAAA,CAA8B,CAAA;AAAA,EAC9E;AACA,EAAA,IAAI,UAAA,CAAW,QAAA,EAAU,YAAY,CAAA,EAAG;AACtC,IAAA,OAAA,CAAQ,IAAA,CAAK,yBAAyB,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,OAAA,GAAU,QAAQ,CAAA,CAAE,CAAA;AACpF,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAI,WAAA;AAAA,IACR,CAAA,SAAA,EAAY,YAAY,CAAA,MAAA,EAAS,KAAA,CAAM,QAAQ,QAAQ,CAAA,GAAI,OAAA,GAAU,OAAO,QAAQ,CAAA;AAAA,GACtF;AACF;AAlDA,IAAA,SAAA,GAAA,KAAA,CAAA;AAAA,EAAA,wBAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;AC4CO,SAAS,iBAAiB,QAAA,EAA6C;AAC5E,EAAA,IAAI,CAAC,QAAA,EAAU,QAAA,CAAS,GAAG,GAAG,OAAO,EAAA;AACrC,EAAA,OAAO,SAAS,KAAA,CAAM,QAAA,CAAS,YAAY,GAAG,CAAC,EAAE,WAAA,EAAY;AAC/D;AAMO,SAAS,oBAAA,CACd,UACA,IAAA,EACS;AACT,EAAA,MAAM,CAAA,GAAA,CAAK,IAAA,IAAQ,EAAA,EAAI,WAAA,EAAY;AACnC,EAAA,IAAI,CAAA,CAAE,WAAW,QAAQ,CAAA,IAAK,EAAE,UAAA,CAAW,QAAQ,GAAG,OAAO,IAAA;AAC7D,EAAA,OAAO,yBAAA,CAA0B,GAAA,CAAI,gBAAA,CAAiB,QAAQ,CAAC,CAAA;AACjE;AAEA,SAAS,MAAM,OAAA,EAA0B;AACvC,EAAA,OAAO,OAAA,CAAQ,UAAU,CAAA,IAAK,OAAA,CAAQ,SAAS,CAAA,EAAG,CAAC,CAAA,CAAE,MAAA,CAAO,SAAS,CAAA;AACvE;AAEA,SAAS,kBAAkB,CAAA,EAAmB;AAC5C,EAAA,OAAO,EACJ,OAAA,CAAQ,OAAA,EAAS,GAAG,CAAA,CACpB,OAAA,CAAQ,SAAS,GAAG,CAAA,CACpB,QAAQ,SAAA,EAAW,GAAG,EACtB,OAAA,CAAQ,SAAA,EAAW,GAAG,CAAA,CACtB,OAAA,CAAQ,UAAU,GAAG,CAAA;AAC1B;AAEA,SAAS,cAAA,CAAe,KAAa,GAAA,EAAuB;AAC1D,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,MAAM,EAAA,GAAK,IAAI,MAAA,CAAO,CAAA,CAAA,EAAI,GAAG,CAAA,uBAAA,EAA0B,GAAG,KAAK,GAAG,CAAA;AAClE,EAAA,KAAA,MAAW,CAAA,IAAK,GAAA,CAAI,QAAA,CAAS,EAAE,CAAA,EAAG;AAChC,IAAA,MAAM,IAAI,iBAAA,CAAkB,CAAA,CAAE,CAAC,CAAA,IAAK,EAAE,EAAE,IAAA,EAAK;AAC7C,IAAA,IAAI,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA;AAAA,EACnB;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,WAAA,CAAY,IAAA,EAAc,WAAA,GAAc,EAAA,EAAY;AAC3D,EAAA,IAAI;AACF,IAAA,MAAM,CAAA,GAAIC,aAAK,IAAI,CAAA;AACnB,IAAA,CAAA,CAAE,CAAA,mBAAA,EAAsB,cAAc,CAAA,EAAA,EAAK,WAAW,KAAK,EAAE,CAAA,CAAE,EAAE,MAAA,EAAO;AACxE,IAAA,CAAA,CAAE,IAAI,CAAA,CAAE,WAAA,CAAY,IAAI,CAAA;AACxB,IAAA,CAAA,CAAE,oDAAoD,CAAA,CAAE,IAAA,CAAK,CAAC,GAAG,EAAA,KAAO;AACtE,MAAA,CAAA,CAAE,EAAE,CAAA,CAAE,OAAA,CAAQ,IAAI,CAAA;AAAA,IACpB,CAAC,CAAA;AACD,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA,EAAK,CAClB,IAAA,GACA,KAAA,CAAM,IAAI,CAAA,CACV,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAA,CACnB,OAAO,OAAO,CAAA;AACjB,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,kBAAkB,IAAA,EAAsB;AAC/C,EAAA,MAAM,CAAA,GAAIA,aAAK,IAAI,CAAA;AACnB,EAAA,CAAA,CAAE,OAAO,CAAA,CAAE,IAAA,CAAK,CAAC,GAAG,KAAA,KAAU;AAC5B,IAAA,MAAM,OAAiB,EAAC;AACxB,IAAA,CAAA,CAAE,KAAK,EACJ,IAAA,CAAK,IAAI,EACT,IAAA,CAAK,CAAC,IAAI,EAAA,KAAO;AAChB,MAAA,MAAM,KAAA,GAAQ,EAAE,EAAE,CAAA,CACf,KAAK,QAAQ,CAAA,CACb,GAAA,CAAI,CAAC,GAAA,EAAK,EAAA,KAAO,EAAE,EAAE,CAAA,CAAE,MAAK,CAAE,IAAA,EAAM,CAAA,CACpC,GAAA,EAAI,CACJ,MAAA,CAAO,OAAO,CAAA;AACjB,MAAA,IAAI,MAAM,MAAA,EAAQ,IAAA,CAAK,KAAK,KAAA,CAAM,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,IAC/C,CAAC,CAAA;AACH,IAAA,CAAA,CAAE,KAAK,CAAA,CAAE,WAAA,CAAY,GAAG,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC;AAAA,CAAI,CAAA;AAAA,EAC7C,CAAC,CAAA;AACD,EAAA,CAAA,CAAE,IAAI,CAAA,CAAE,WAAA,CAAY,IAAI,CAAA;AACxB,EAAA,CAAA,CAAE,oCAAoC,CAAA,CAAE,IAAA,CAAK,CAAC,GAAG,EAAA,KAAO;AACtD,IAAA,CAAA,CAAE,EAAE,CAAA,CAAE,OAAA,CAAQ,IAAI,CAAA;AAAA,EACpB,CAAC,CAAA;AACD,EAAA,MAAM,QAAQ,CAAA,CAAE,IAAA,EAAK,CAClB,IAAA,GACA,KAAA,CAAM,IAAI,CAAA,CACV,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAA,CACnB,OAAO,OAAO,CAAA;AACjB,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEA,eAAe,qBAAqB,OAAA,EAAoC;AACtE,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAMC,sBAAA,CAAM,SAAA,CAAU,OAAO,CAAA;AACzC,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,kCAAA,CAAmC,IAAA,CAAK,CAAC,CAAC,CAAA;AAC7F,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,MAAM,MAAM,GAAA,CAAI,MAAM,IAAI,CAAA,CAAG,MAAM,QAAQ,CAAA;AACjD,MAAA,KAAA,CAAM,IAAA,CAAK,GAAG,cAAA,CAAe,GAAA,EAAK,KAAK,CAAC,CAAA;AAAA,IAC1C;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAEA,eAAsB,gBAAgB,OAAA,EAAkC;AACtE,EAAA,IAAI,CAAC,KAAA,CAAM,OAAO,CAAA,EAAG;AACnB,IAAA,OAAA,CAAQ,KAAK,4DAA4D,CAAA;AACzE,IAAA,OAAO,OAAA,CAAQ,SAAS,MAAM,CAAA;AAAA,EAChC;AACA,EAAA,MAAM,EAAE,OAAM,GAAI,MAAMC,yBAAQ,aAAA,CAAc,EAAE,MAAA,EAAQ,OAAA,EAAS,CAAA;AACjE,EAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,KAAA,IAAS,EAAE,CAAA;AAC1C,EAAA,MAAM,MAAA,GAAS,MAAM,oBAAA,CAAqB,OAAO,CAAA;AACjD,EAAA,MAAM,KAAA,GAAQ,CAAC,IAAA,EAAM,GAAG,MAAM,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA;AACtD,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEA,eAAsB,eAAe,OAAA,EAAkC;AACrE,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,OAAM,GAAI,MAAMA,yBAAQ,cAAA,CAAe,EAAE,MAAA,EAAQ,OAAA,EAAS,CAAA;AAClE,IAAA,MAAM,SAAA,GAAA,CAAa,KAAA,IAAS,EAAA,EAAI,IAAA,EAAK,GAAA,CAAK,KAAA,IAAS,EAAA,EAAI,IAAA,EAAK,CAAE,KAAA,CAAM,KAAK,CAAA,CAAE,MAAA,GAAS,CAAA;AACpF,IAAA,OAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,SAAA,GAAY,GAAG,CAAC,CAAA;AAAA,EAChD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,CAAA;AAAA,EACT;AACF;AAEA,SAAS,WAAW,KAAA,EAAwB;AAC1C,EAAA,IAAI,KAAA,IAAS,MAAM,OAAO,EAAA;AAC1B,EAAA,IAAI,KAAA,YAAiB,IAAA,EAAM,OAAO,KAAA,CAAM,WAAA,EAAY;AACpD,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,GAAA,GAAM,KAAA;AACZ,IAAA,IAAI,QAAA,IAAY,GAAA,EAAK,OAAO,UAAA,CAAW,IAAI,MAAM,CAAA;AACjD,IAAA,IAAI,MAAM,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA,SAAU,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,IAAA,IAAQ,EAAE,CAAA,CAAE,KAAK,EAAE,CAAA;AACrF,IAAA,IAAI,OAAO,GAAA,CAAI,IAAA,KAAS,QAAA,SAAiB,GAAA,CAAI,IAAA;AAAA,EAC/C;AACA,EAAA,OAAO,OAAO,KAAK,CAAA;AACrB;AAEA,eAAsB,gBAAgB,OAAA,EAAkC;AACtE,EAAA,IAAI,CAAC,KAAA,CAAM,OAAO,CAAA,EAAG;AACnB,IAAA,OAAA,CAAQ,KAAK,4DAA4D,CAAA;AACzE,IAAA,OAAO,OAAA,CAAQ,SAAS,MAAM,CAAA;AAAA,EAChC;AACA,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,IAAIC,wBAAA,CAAQ,QAAA,EAAS;AACnC,IAAA,MAAM,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,OAAiC,CAAA;AACvD,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAoB;AACxC,IAAA,KAAA,MAAW,EAAA,IAAM,MAAM,UAAA,EAAY;AACjC,MAAA,MAAM,SAAmB,EAAC;AAC1B,MAAA,IAAI,CAAA,GAAI,CAAA;AACR,MAAA,EAAA,CAAG,QAAQ,EAAE,YAAA,EAAc,IAAA,EAAK,EAAG,CAAC,GAAA,KAAQ;AAC1C,QAAA,IAAI,MAAM,CAAA,EAAG;AACX,UAAA,CAAA,IAAK,CAAA;AACL,UAAA;AAAA,QACF;AACA,QAAA,IAAI,IAAI,EAAA,EAAI;AACZ,QAAA,CAAA,IAAK,CAAA;AACL,QAAA,MAAM,MAAA,GAAU,GAAA,CAAI,MAAA,IAAwB,EAAC;AAC7C,QAAA,IAAI,QAAA,GAAW,CAAA;AACf,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,UAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,UAAA,IAAI,KAAK,IAAA,IAAQ,UAAA,CAAW,CAAC,CAAA,CAAE,IAAA,IAAQ,QAAA,GAAW,CAAA;AAAA,QACpD;AACA,QAAA,IAAI,QAAA,GAAW,CAAA,EAAG,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AAAA,MACxC,CAAC,CAAA;AACD,MAAA,OAAA,CAAQ,GAAA,CAAI,EAAA,CAAG,IAAA,EAAM,MAAA,CAAO,MAAA,GAAS,KAAK,GAAA,CAAI,GAAG,MAAM,CAAA,GAAI,EAAE,CAAA;AAAA,IAC/D;AAEA,IAAA,MAAM,EAAA,GAAK,IAAIA,wBAAA,CAAQ,QAAA,EAAS;AAChC,IAAA,MAAM,EAAA,CAAG,IAAA,CAAK,IAAA,CAAK,OAAiC,CAAA;AACpD,IAAA,MAAM,MAAgB,EAAC;AACvB,IAAA,KAAA,MAAW,EAAA,IAAM,GAAG,UAAA,EAAY;AAC9B,MAAA,GAAA,CAAI,IAAA,CAAK,CAAA,QAAA,EAAW,EAAA,CAAG,IAAI,CAAA,CAAA,CAAG,CAAA;AAC9B,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,CAAI,EAAA,CAAG,IAAI,CAAA,IAAK,EAAA;AACpC,MAAA,EAAA,CAAG,QAAQ,EAAE,YAAA,EAAc,IAAA,EAAK,EAAG,CAAC,GAAA,KAAQ;AAC1C,QAAA,MAAM,MAAA,GAAU,GAAA,CAAI,MAAA,IAAwB,EAAC;AAC7C,QAAA,MAAM,UAAoB,EAAC;AAC3B,QAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,MAAA,GAAS,GAAG,GAAG,CAAA;AAC5C,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,IAAA,EAAM,CAAA,EAAA,EAAK,OAAA,CAAQ,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA;AAClE,QAAA,OAAO,OAAA,CAAQ,MAAA,IAAU,CAAC,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA,CAAG,IAAA,EAAK,EAAG,OAAA,CAAQ,GAAA,EAAI;AAC3E,QAAA,IAAI,QAAQ,MAAA,EAAQ,GAAA,CAAI,KAAK,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,MACjD,CAAC,CAAA;AAAA,IACH;AACA,IAAA,OAAO,GAAA,CAAI,KAAK,IAAI,CAAA;AAAA,EACtB,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,IAAA,IAAI,uBAAuB,IAAA,CAAK,GAAG,GAAG,OAAO,OAAA,CAAQ,SAAS,MAAM,CAAA;AACpE,IAAA,MAAM,GAAA;AAAA,EACR;AACF;AAEA,SAAS,cAAc,MAAA,EAA0B;AAC/C,EAAA,MAAM,OAAiB,EAAC;AACxB,EAAA,KAAA,MAAW,EAAA,IAAM,MAAA,CAAO,QAAA,CAAS,0BAA0B,CAAA,EAAG;AAC5D,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,KAAA,MAAW,MAAM,EAAA,CAAG,CAAC,CAAA,CAAG,QAAA,CAAS,0BAA0B,CAAA,EAAG;AAC5D,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,EAAA,CAAG,CAAC,GAAI,KAAK,CAAA;AAC1C,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,GAAG,EAAE,IAAA,EAAK;AACpC,MAAA,IAAI,MAAA,EAAQ,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA;AAAA,IAC/B;AACA,IAAA,IAAI,MAAM,MAAA,EAAQ,IAAA,CAAK,KAAK,KAAA,CAAM,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,EAC/C;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,cAAc,GAAA,EAAuB;AAC5C,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,aAAA,GAAgB,GAAA,CAAI,OAAA,CAAQ,4BAAA,EAA8B,CAAC,GAAA,KAAQ;AACvE,IAAA,KAAA,CAAM,IAAA,CAAK,GAAG,aAAA,CAAc,GAAG,CAAC,CAAA;AAChC,IAAA,OAAO,EAAA;AAAA,EACT,CAAC,CAAA;AACD,EAAA,KAAA,CAAM,IAAA,CAAK,GAAG,cAAA,CAAe,aAAA,EAAe,KAAK,CAAC,CAAA;AAClD,EAAA,OAAO,KAAA,CAAM,OAAO,OAAO,CAAA;AAC7B;AAEA,SAAS,UAAU,GAAA,EAAkC;AACnD,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAoB;AACpC,EAAA,MAAM,EAAA,GAAK,sEAAA;AACX,EAAA,KAAA,MAAW,CAAA,IAAK,GAAA,CAAI,QAAA,CAAS,EAAE,CAAA,EAAG;AAChC,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAC,CAAA,IAAK,EAAE,CAAC,CAAA;AACtB,IAAA,MAAM,MAAA,GAAS,CAAA,CAAE,CAAC,CAAA,IAAK,EAAE,CAAC,CAAA;AAC1B,IAAA,IAAI,EAAA,IAAM,MAAA,EAAQ,GAAA,CAAI,GAAA,CAAI,IAAI,MAAM,CAAA;AAAA,EACtC;AACA,EAAA,OAAO,GAAA;AACT;AAEA,eAAe,eAAe,GAAA,EAA+B;AAC3D,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,IAAA,CAAK,sBAAsB,CAAA;AAC5C,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,IAAA,CAAK,iCAAiC,CAAA;AACvD,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,EAAM;AAClB,IAAA,OAAO,OAAO,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,CACzB,OAAO,CAAC,CAAA,KAAM,8BAAA,CAA+B,IAAA,CAAK,CAAC,CAAC,CAAA,CACpD,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AACd,MAAA,MAAM,EAAA,GAAK,OAAO,YAAA,CAAa,IAAA,CAAK,CAAC,CAAA,GAAI,CAAC,KAAK,CAAC,CAAA;AAChD,MAAA,MAAM,EAAA,GAAK,OAAO,YAAA,CAAa,IAAA,CAAK,CAAC,CAAA,GAAI,CAAC,KAAK,CAAC,CAAA;AAChD,MAAA,OAAO,EAAA,GAAK,EAAA;AAAA,IACd,CAAC,CAAA;AAAA,EACL;AACA,EAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AACzC,EAAA,MAAM,UAAU,SAAA,CAAU,MAAM,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAC,CAAA;AACpD,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,KAAA,MAAW,CAAA,IAAK,OAAA,CAAQ,QAAA,CAAS,gCAAgC,CAAA,EAAG;AAClE,IAAA,GAAA,CAAI,IAAA,CAAK,CAAA,CAAE,CAAC,CAAE,CAAA;AAAA,EAChB;AACA,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AAC7B,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA;AACvC,IAAA,KAAA,CAAM,IAAA,CAAK,KAAK,UAAA,CAAW,MAAM,IAAI,IAAA,GAAO,CAAA,IAAA,EAAO,IAAI,CAAA,CAAE,CAAA;AAAA,EAC3D;AACA,EAAA,OAAO,KAAA;AACT;AAEA,eAAsB,gBAAgB,OAAA,EAAkC;AACtE,EAAA,IAAI,CAAC,KAAA,CAAM,OAAO,CAAA,EAAG;AACnB,IAAA,OAAA,CAAQ,KAAK,4DAA4D,CAAA;AACzE,IAAA,OAAO,OAAA,CAAQ,SAAS,MAAM,CAAA;AAAA,EAChC;AACA,EAAA,MAAM,GAAA,GAAM,MAAMF,sBAAA,CAAM,SAAA,CAAU,OAAO,CAAA;AACzC,EAAA,MAAM,UAAA,GAAa,MAAM,cAAA,CAAe,GAAG,CAAA;AAC3C,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,CAAW,QAAQ,CAAA,EAAA,EAAK;AAC1C,IAAA,MAAM,IAAA,GAAO,WAAW,CAAC,CAAA;AACzB,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA;AAC1B,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,CAAA,GAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AAC7B,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AACrC,IAAA,KAAA,CAAM,IAAA,CAAK,GAAG,aAAA,CAAc,GAAG,CAAC,CAAA;AAChC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,0BAAA,EAA4B,sBAAsB,CAAA;AAChF,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,IAAA,CAAK,QAAQ,CAAA;AAClC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,KAAA,CAAM,QAAQ,CAAA;AAC7C,MAAA,MAAM,WAAA,GAAc,CAAC,GAAG,OAAA,CAAQ,QAAA,CAAS,mCAAmC,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,CAAC,CAAA;AACrF,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,MAAM,SAAA,GAAY,YAAY,UAAA,CAAW,GAAG,IACxC,WAAA,CAAY,KAAA,CAAM,CAAC,CAAA,GACnB,IAAA,CAAK,QAAQ,wBAAA,EAA0B,EAAE,IACzC,WAAA,CAAY,OAAA,CAAQ,WAAW,EAAE,CAAA,CAAE,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA;AAC1D,QAAA,MAAM,SAAA,GAAY,GAAA,CAAI,IAAA,CAAK,SAAS,CAAA,IAAK,GAAA,CAAI,IAAA,CAAK,CAAA,IAAA,EAAO,WAAA,CAAY,OAAA,CAAQ,YAAA,EAAc,EAAE,CAAC,CAAA,CAAE,CAAA;AAChG,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,MAAM,QAAA,GAAW,MAAM,SAAA,CAAU,KAAA,CAAM,QAAQ,CAAA;AAC/C,UAAA,MAAM,KAAA,GAAQ,eAAe,QAAA,EAAU,KAAK,EAAE,IAAA,CAAK,GAAG,EAAE,IAAA,EAAK;AAC7D,UAAA,IAAI,KAAA,EAAO,KAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,KAAK,CAAA,CAAE,CAAA;AAAA,QAC1C;AAAA,MACF;AAAA,IACF;AACA,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACf;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEA,eAAsB,gBAAgB,OAAA,EAAkC;AACtE,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAMA,sBAAA,CAAM,SAAA,CAAU,OAAO,CAAA;AACzC,IAAA,MAAM,CAAA,GAAA,CAAK,MAAM,cAAA,CAAe,GAAG,CAAA,EAAG,MAAA;AACtC,IAAA,OAAO,CAAA,IAAK,CAAA;AAAA,EACd,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,CAAA;AAAA,EACT;AACF;AAEO,SAAS,cAAA,CAAe,OAAA,EAAiB,SAAA,GAAY,GAAA,EAAa;AACvE,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA;AACnC,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAOG,SAAAA,CAAS,GAAA,EAAK,SAAS,CAAA;AACpC,IAAA,MAAM,MAAgB,EAAC;AACvB,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,OAAA,GAAU,CAAC,GAAG,GAAG,CAAA;AACvB,MAAA,OAAO,OAAA,CAAQ,MAAA,IAAU,CAAC,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAC,CAAA,CAAE,IAAA,EAAK,UAAW,GAAA,EAAI;AAClF,MAAA,IAAI,OAAA,CAAQ,MAAA,EAAQ,GAAA,CAAI,IAAA,CAAK,QAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,MAAA,CAAO,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IACvE;AACA,IAAA,OAAO,GAAA,CAAI,KAAK,IAAI,CAAA;AAAA,EACtB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,GAAA;AAAA,EACT;AACF;AAEA,SAASA,SAAAA,CAAS,MAAc,SAAA,EAA+B;AAC7D,EAAA,MAAM,OAAmB,EAAC;AAC1B,EAAA,IAAI,MAAgB,EAAC;AACrB,EAAA,IAAI,IAAA,GAAO,EAAA;AACX,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,OAAO,CAAA,GAAI,KAAK,MAAA,EAAQ;AACtB,IAAA,MAAM,EAAA,GAAK,KAAK,CAAC,CAAA;AACjB,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAI,OAAO,GAAA,EAAK;AACd,QAAA,IAAI,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,KAAM,GAAA,EAAK;AACvB,UAAA,IAAA,IAAQ,GAAA;AACR,UAAA,CAAA,IAAK,CAAA;AACL,UAAA;AAAA,QACF;AACA,QAAA,QAAA,GAAW,KAAA;AACX,QAAA,CAAA,IAAK,CAAA;AACL,QAAA;AAAA,MACF;AACA,MAAA,IAAA,IAAQ,EAAA;AACR,MAAA,CAAA,IAAK,CAAA;AACL,MAAA;AAAA,IACF;AACA,IAAA,IAAI,OAAO,GAAA,EAAK;AACd,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,CAAA,IAAK,CAAA;AACL,MAAA;AAAA,IACF;AACA,IAAA,IAAI,OAAO,SAAA,EAAW;AACpB,MAAA,GAAA,CAAI,KAAK,IAAI,CAAA;AACb,MAAA,IAAA,GAAO,EAAA;AACP,MAAA,CAAA,IAAK,CAAA;AACL,MAAA;AAAA,IACF;AACA,IAAA,IAAI,OAAO,IAAA,EAAM;AACf,MAAA,CAAA,IAAK,CAAA;AACL,MAAA;AAAA,IACF;AACA,IAAA,IAAI,OAAO,IAAA,EAAM;AACf,MAAA,GAAA,CAAI,KAAK,IAAI,CAAA;AACb,MAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AACb,MAAA,GAAA,GAAM,EAAC;AACP,MAAA,IAAA,GAAO,EAAA;AACP,MAAA,CAAA,IAAK,CAAA;AACL,MAAA;AAAA,IACF;AACA,IAAA,IAAA,IAAQ,EAAA;AACR,IAAA,CAAA,IAAK,CAAA;AAAA,EACP;AACA,EAAA,IAAI,IAAA,CAAK,MAAA,IAAU,GAAA,CAAI,MAAA,EAAQ;AAC7B,IAAA,GAAA,CAAI,KAAK,IAAI,CAAA;AACb,IAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,EACf;AACA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,gBAAgB,OAAA,EAAyB;AACvD,EAAA,IAAI;AACF,IAAA,OAAO,WAAA,CAAY,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAC,CAAA;AAAA,EAC7C,SAAS,GAAA,EAAK;AACZ,IAAA,OAAA,CAAQ,KAAA,CAAM,2BAA2B,GAAG,CAAA;AAC5C,IAAA,OAAO,OAAA,CAAQ,SAAS,MAAM,CAAA;AAAA,EAChC;AACF;AAEA,SAAS,cACP,IAAA,EAIQ;AACR,EAAA,IAAI,CAAC,MAAM,OAAO,EAAA;AAClB,EAAA,MAAM,MAAM,CAAC,CAAA,KACX,CAAA,CAAE,IAAA,IAAQ,CAAC,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,OAAO,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,IAAK,EAAA;AAC7D,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,KAAK,GAAA,CAAI,GAAG,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,GAAI,IAAI,IAAI,CAAA;AAClF;AAEA,eAAsB,eAAe,OAAA,EAAkC;AACrE,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAMC,2BAAA,CAAW,KAAA,CAAM,OAAO,CAAA;AAC1C,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,MAAM,IAAA,GAAO,aAAA,CAAc,GAAA,CAAI,IAAI,CAAA;AACnC,IAAA,MAAM,EAAA,GAAK,aAAA,CAAc,GAAA,CAAI,EAAE,CAAA;AAC/B,IAAA,IAAI,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,CAAA,MAAA,EAAS,IAAI,CAAA,CAAE,CAAA;AACpC,IAAA,IAAI,EAAA,EAAI,KAAA,CAAM,IAAA,CAAK,CAAA,IAAA,EAAO,EAAE,CAAA,CAAE,CAAA;AAC9B,IAAA,IAAI,IAAI,OAAA,EAAS,KAAA,CAAM,KAAK,CAAA,SAAA,EAAY,GAAA,CAAI,OAAO,CAAA,CAAE,CAAA;AACrD,IAAA,MAAM,OAAQ,GAAA,CAA0B,IAAA;AACxC,IAAA,IAAI,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,CAAA,MAAA,EAAS,IAAI,CAAA,CAAE,CAAA;AACpC,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,IAAI,IAAI,IAAA,EAAM;AACZ,MAAA,KAAA,CAAM,IAAA,CAAK,IAAI,IAAI,CAAA;AAAA,IACrB,CAAA,MAAA,IAAW,IAAI,IAAA,EAAM;AACnB,MAAA,KAAA,CAAM,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,IAC1C;AACA,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB,SAAS,GAAA,EAAK;AACZ,IAAA,OAAA,CAAQ,KAAA,CAAM,0BAA0B,GAAG,CAAA;AAC3C,IAAA,OAAO,OAAA,CAAQ,SAAS,MAAM,CAAA;AAAA,EAChC;AACF;AA5cA,IAcM,SAAA,EAEO,yBAAA,EAwBA,SAAA,EACA,SAAA,EACA,SAAA;AA1Cb,IAAA,UAAA,GAAA,KAAA,CAAA;AAAA,EAAA,yBAAA,GAAA;AAcA,IAAM,SAAA,GAAY,OAAO,IAAA,CAAK,CAAC,IAAM,EAAA,EAAM,CAAA,EAAM,CAAI,CAAC,CAAA;AAE/C,IAAM,yBAAA,uBAAgC,GAAA,CAAI;AAAA,MAC/C,MAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AAEM,IAAM,SAAA,GAAY,yEAAA;AAClB,IAAM,SAAA,GAAY,2EAAA;AAClB,IAAM,SAAA,GAAY,mEAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACxCzB,eAAsB,UAAuB,SAAA,EAAsC;AACjF,EAAA,IAAI;AACF,IAAA,OAAQ,MAAM,OAAO,SAAA,CAAA;AAAA,EACvB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,eAAsB,YAAA,CAA0B,SAAA,EAAmB,KAAA,EAAe,IAAA,EAA0B;AAC1G,EAAA,IAAI;AACF,IAAA,OAAQ,MAAM,OAAO,SAAA,CAAA;AAAA,EACvB,SAAS,IAAA,EAAM;AACb,IAAA,MAAM,IAAIX,yBAAA,CAAkB,KAAA,EAAO,SAAA,EAAW,IAAI,CAAA;AAAA,EACpD;AACF;AAhBA,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,eAAA,GAAA;AAAA,IAAA,WAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC+BA,eAAe,SAAA,GAAyC;AACtD,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAA,GAAS,IAAA;AACT,IAAA,WAAA,GACG,MAAM,SAAA,CAAuB,iCAAiC,KAC9D,MAAM,SAAA,CAAuB,YAAY,CAAA,IAC1C,IAAA;AACF,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,OAAA,CAAQ,KAAA;AAAA,QACN;AAAA,OACF;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,WAAA;AACT;AAuBA,SAAS,gBAAgB,GAAA,EAAyB;AAChD,EAAA,MAAM,QAAQ,GAAA,CAAI,MAAA,CAAO,CAAC,EAAA,KAAO,GAAG,GAAG,CAAA;AACvC,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,EAAQ,OAAO,EAAA;AAC1B,EAAA,MAAM,UAAU,KAAA,CACb,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,CACd,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA,CACnB,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AACvB,EAAA,MAAMY,OAAAA,GAAS,QAAQ,IAAA,CAAK,KAAA,CAAM,QAAQ,MAAA,GAAS,CAAC,CAAC,CAAA,IAAK,EAAA;AAC1D,EAAA,MAAM,OAAOA,OAAAA,GAAS,IAAA;AAEtB,EAAA,MAAM,SAAS,CAAC,GAAG,KAAK,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA,IAAK,CAAA,CAAE,CAAA,GAAI,EAAE,CAAC,CAAA;AAC/D,EAAA,MAAM,QAAsB,EAAC;AAC7B,EAAA,KAAA,MAAW,MAAM,MAAA,EAAQ;AACvB,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AACnC,IAAA,IAAI,IAAA,GAAO,CAAC,CAAA,IAAK,IAAA,CAAK,IAAI,IAAA,CAAK,CAAC,CAAA,CAAE,CAAA,GAAI,GAAG,CAAC,CAAA,GAAI,IAAA,EAAM,IAAA,CAAK,KAAK,EAAE,CAAA;AAAA,SAC3D,KAAA,CAAM,IAAA,CAAK,CAAC,EAAE,CAAC,CAAA;AAAA,EACtB;AACA,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,EAAO,IAAA,CAAK,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AAEvD,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,EAAG,CAAC,CAAA;AAChD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AAC1D,IAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AACnB,IAAA,MAAM,OAAiB,EAAC;AACxB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA;AACvB,MAAA,IAAA,CAAK,IAAA,CAAK,KAAK,CAAC,CAAA,CAAG,KAAK,IAAA,CAAK,CAAA,GAAI,KAAK,CAAA,CAAE,CAAA;AAAA,IAC1C;AACA,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,IAAU,CAAA,IAAK,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,GAAIA,OAAAA,GAAS,GAAG,CAAA,CAAE,MAAA,IAAU,CAAA;AACrF,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,UAAU,IAAA,GAAO,CAAA,EAAA,EAAK,KAAA,CAAM,IAAA,CAAK,KAAK,CAAC,CAAA,EAAA,CAAA;AAAA,SACtC,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AAC1B,IAAA,IAAI,IAAA,GAAOA,OAAAA,GAAS,GAAA,EAAK,GAAA,CAAI,IAAA,CAAK,CAAA,EAAA,EAAK,IAAA,CAAK,OAAA,CAAQ,aAAA,EAAe,EAAE,CAAC,CAAA,CAAE,CAAA;AAAA,SAAA,IAC/D,IAAA,GAAOA,OAAAA,GAAS,IAAA,EAAM,GAAA,CAAI,IAAA,CAAK,CAAA,GAAA,EAAM,IAAA,CAAK,OAAA,CAAQ,aAAA,EAAe,EAAE,CAAC,CAAA,CAAE,CAAA;AAAA,SAC1E,GAAA,CAAI,KAAK,IAAI,CAAA;AAAA,EACpB;AACA,EAAA,OAAO,GAAA,CAAI,KAAK,IAAI,CAAA;AACtB;AAEA,eAAe,SAAA,CACb,KACA,UAAA,EACqB;AACrB,EAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,OAAA,CAAQ,UAAU,CAAA;AACzC,EAAA,MAAM,EAAA,GAAK,MAAM,IAAA,CAAK,cAAA,EAAe;AACrC,EAAA,MAAM,OAAmB,EAAC;AAC1B,EAAA,KAAA,MAAW,EAAA,IAAM,GAAG,KAAA,EAAO;AACzB,IAAA,MAAM,EAAA,GAAK,GAAG,SAAA,IAAa,CAAC,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAC5C,IAAA,IAAA,CAAK,IAAA,CAAK;AAAA,MACR,GAAA,EAAK,GAAG,GAAA,IAAO,EAAA;AAAA,MACf,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,IAAK,CAAA;AAAA,MACZ,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,IAAK,CAAA;AAAA,MACZ,CAAA,EAAG,GAAG,KAAA,IAAS,CAAA;AAAA,MACf,CAAA,EAAG,GAAG,MAAA,IAAU,IAAA,CAAK,IAAI,EAAA,CAAG,CAAC,KAAK,CAAC;AAAA,KACpC,CAAA;AAAA,EACH;AACA,EAAA,OAAO,IAAA;AACT;AAuCA,eAAsB,gBAAgB,OAAA,EAA2C;AAC/E,EAAA,MAAM,GAAA,GAAM,MAAM,SAAA,EAAU;AAC5B,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAM,GAAA,CAAI,WAAA,CAAY;AAAA,MAChC,IAAA,EAAM,IAAI,UAAA,CAAW,OAAO,CAAA;AAAA,MAC5B,aAAA,EAAe,IAAA;AAAA,MACf,eAAA,EAAiB;AAAA,KAClB,CAAA,CAAE,OAAA;AACH,IAAA,IAAI;AACF,MAAA,MAAM,QAAkB,EAAC;AACzB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,GAAA,CAAI,UAAU,CAAA,EAAA,EAAK;AACtC,QAAA,IAAI;AACF,UAAA,KAAA,CAAM,KAAK,eAAA,CAAgB,MAAM,UAAU,GAAA,EAAK,CAAC,CAAC,CAAC,CAAA;AAAA,QACrD,CAAA,CAAA,MAAQ;AACN,UAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,QACf;AAAA,MACF;AACA,MAAA,OAAO,KAAA;AAAA,IACT,CAAA,SAAE;AACA,MAAA,MAAM,IAAI,OAAA,IAAU;AAAA,IACtB;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,OAAA,CAAQ,KAAA,CAAM,sDAAsD,GAAG,CAAA;AACvE,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AA/LA,IA4BI,WAAA,EACA,MAAA;AA7BJ,IAAA,kBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,iCAAA,GAAA;AAMA,IAAA,WAAA,EAAA;AAsBA,IAAI,WAAA,GAAkC,IAAA;AACtC,IAAI,MAAA,GAAS,KAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC7Bb,IAAA,WAAA,GAAA,EAAA;AAAA,QAAA,CAAA,WAAA,EAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,mBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAsIA,eAAe,gBAAA,GAAwC;AACrD,EAAA,IAAI,SAAS,OAAO,OAAA;AACpB,EAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAsB,cAAc,CAAA;AACzD,EAAA,IAAI,CAAC,QAAQ,YAAA,EAAc;AACzB,IAAA,MAAM,IAAIZ,yBAAA,CAAkB,KAAA,EAAO,cAAA,EAAgB,KAAK,CAAA;AAAA,EAC1D;AACA,EAAA,OAAA,GAAU,MAAA;AACV,EAAA,OAAO,MAAA;AACT;AAoBA,eAAe,SAAA,GAAiD;AAC9D,EAAA,MAAM,GAAA,GAAM,MAAM,SAAA,CAA0C,OAAO,CAAA;AACnE,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,EAAA,IAAI,OAAO,GAAA,KAAQ,UAAA,EAAY,OAAO,GAAA;AACtC,EAAA,OAAQ,IAAiB,OAAA,IAAW,IAAA;AACtC;AAEA,SAAS,cAAc,IAAA,EAAuB;AAC5C,EAAA,IAAI,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AAC5B,EAAA,IAAI,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,IAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,IAAI,EAAE,MAAA,CAAO,CAAC,CAAA,KAAM,IAAA,MAAA,CAAC,UAAM,GAAC,CAAA,CAAC,IAAA,CAAK,CAAC,CAAC,CAAA,CAAE,MAAA;AACxD,EAAA,IAAI,KAAA,GAAQ,KAAK,GAAA,CAAI,IAAA,CAAK,QAAQ,CAAC,CAAA,GAAI,KAAK,OAAO,IAAA;AACnD,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,IAAI,EAAE,MAAA,CAAO,CAAC,CAAA,KAAM,IAAA,MAAA,CAAC,QAAA,EAAM,GAAC,CAAA,CAAC,IAAA,CAAK,CAAC,CAAC,CAAA;AACtD,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,EAAQ,OAAO,KAAA;AAC1B,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,IAAA,MAAA,CAAC,mBAAA,EAAiB,GAAC,CAAA,CAAC,IAAA,CAAK,CAAC,CAAC,CAAA;AAC7D,EAAA,IAAI,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,MAAA,GAAS,KAAK,OAAO,KAAA;AAC9C,EAAA,IAAI,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,KAAA;AAC5B,EAAA,MAAM,QAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,CAAA;AAC9C,EAAA,IAAI,KAAA,CAAM,UAAU,CAAA,EAAG;AACrB,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,CAAC,MAAM,OAAA,CAAQ,QAAA,CAAS,CAAC,CAAC,CAAA,CAAE,MAAA;AACxD,IAAA,IAAI,MAAA,GAAS,KAAA,CAAM,MAAA,GAAS,GAAA,EAAK,OAAO,IAAA;AAAA,EAC1C;AACA,EAAA,OAAO,KAAA;AACT;AAEA,eAAe,YAAA,CAAa,QAAoB,KAAA,EAAuC;AACrF,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AACrC,IAAA,OAAA,CAAQ,IAAI,IAAA,EAAM,MAAA,IAAU,IAAI,IAAA,EAAK,CAAE,aAAY,IAAK,IAAA;AAAA,EAC1D,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,kBAAA,CAAmB,UAAkB,MAAA,EAAiC;AAC7E,EAAA,IAAI,aAAa,MAAA,EAAQ;AACvB,IAAA,OAAO,CAAC,aAAA,CAAc,QAAQ,CAAA,IAAK,QAAQ,CAAA;AAAA,EAC7C;AACA,EAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,CAAC,OAAO,SAAS,CAAA;AACrC,EAAA,OAAO,oBAAA,CAAqB,MAAM,CAAA,IAAK,CAAC,KAAK,CAAA;AAC/C;AASA,eAAe,iBAAA,CAAkB,QAAoB,KAAA,EAA0C;AAC7F,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,MAAA,CAAO,SAAA,CAAU,KAAA,EAAO,EAAC,EAAG,EAAE,MAAA,EAAQ,IAAA,EAAM,CAAA;AACnE,IAAA,MAAM,KAAA,uBAAY,GAAA,EAAsB;AACxC,IAAA,MAAM,cAAwB,EAAC;AAC/B,IAAA,IAAI,YAAA,GAAe,CAAA;AACnB,IAAA,IAAI,UAAA,GAAa,CAAA;AACjB,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,MAAA,IAAU,EAAC,EAAG;AACrC,MAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,KAAA,IAAS,EAAC,EAAG;AACpC,QAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,IAAS,EAAC,EAAG;AACnC,UAAA,MAAM,CAAA,GAAA,CAAK,IAAA,CAAK,IAAA,IAAQ,EAAA,EAAI,IAAA,EAAK;AACjC,UAAA,IAAI,CAAC,CAAA,EAAG;AACR,UAAA,UAAA,IAAc,CAAA;AACd,UAAA,MAAM,MAAA,GAAS,KAAA,CAAM,GAAA,CAAI,OAAO,KAAK,EAAC;AACtC,UAAA,MAAA,CAAO,KAAK,CAAC,CAAA;AACb,UAAA,KAAA,CAAM,GAAA,CAAI,SAAS,MAAM,CAAA;AACzB,UAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AACnC,UAAA,IAAI,MAAA,CAAO,SAAS,IAAI,CAAA,IAAK,SAAS,CAAA,CAAA,EAAI,WAAA,CAAY,KAAK,IAAI,CAAA;AAC/D,UAAA,IAAI,aAAA,CAAc,CAAC,CAAA,EAAG,YAAA,IAAgB,CAAA;AAAA,QACxC;AACA,QAAA,OAAA,IAAW,CAAA;AAAA,MACb;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GACJ,IAAA,CAAK,IAAA,EAAM,IAAA,MACX,CAAC,GAAG,KAAA,CAAM,IAAA,EAAM,CAAA,CACb,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA,CACpB,GAAA,CAAI,CAAC,CAAA,KAAA,CAAO,KAAA,CAAM,IAAI,CAAC,CAAA,IAAK,EAAC,EAAG,IAAA,CAAK,GAAG,CAAC,CAAA,CACzC,KAAK,IAAI,CAAA;AACd,IAAA,MAAM,GAAA,GAAM,WAAA,CAAY,MAAA,GACpB,WAAA,CAAY,OAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA,GAAI,WAAA,CAAY,MAAA,GACpD,KAAK,UAAA,IAAc,CAAA;AACxB,IAAA,MAAM,YAAA,GAAe,UAAA,GAAa,CAAA,GAAI,YAAA,GAAe,UAAA,GAAa,CAAA;AAClE,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,UAAA,EAAY,GAAA;AAAA,MACZ,SAAA,EAAW,cAAc,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,MAAA;AAAA,MAC3D;AAAA,KACF;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,eAAe,iBAAA,CACb,KAAA,EACA,YAAA,EACA,OAAA,EACiB;AACjB,EAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AACrB,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,KAAK,EAAE,QAAA,EAAS;AAC3C,IAAA,MAAM,CAAA,GAAI,KAAK,KAAA,IAAS,CAAA;AACxB,IAAA,MAAM,CAAA,GAAI,KAAK,MAAA,IAAU,CAAA;AACzB,IAAA,IAAI,CAAC,CAAA,IAAK,CAAC,CAAA,IAAK,IAAA,CAAK,IAAI,CAAA,EAAG,CAAC,CAAA,IAAK,YAAA,EAAc,OAAO,KAAA;AACvD,IAAA,OAAO,MAAM,OAAA,CAAQ,KAAK,CAAA,CACvB,MAAA,CAAO,EAAE,KAAA,EAAO,YAAA,EAAc,MAAA,EAAQ,YAAA,EAAc,KAAK,QAAA,EAAU,CAAA,CACnE,GAAA,GACA,QAAA,EAAS;AAAA,EACd,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEA,eAAe,kBAAA,CACb,KAAA,EACA,KAAA,EACA,YAAA,EACiB;AACjB,EAAA,IAAI,KAAA,KAAU,kBAAA,CAAmB,IAAA,EAAM,OAAO,KAAA;AAC9C,EAAA,MAAM,OAAA,GAAU,MAAM,SAAA,EAAU;AAChC,EAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AACrB,EAAA,IAAI;AACF,IAAA,IAAI,GAAA,GAAM,OAAA,CAAQ,MAAM,iBAAA,CAAkB,KAAA,EAAO,YAAA,EAAc,OAAO,CAAC,CAAA,CACpE,SAAA,EAAU,CACV,SAAA,EAAU;AACb,IAAA,IAAI,KAAA,KAAU,mBAAmB,KAAA,EAAO,OAAO,MAAM,GAAA,CAAI,GAAA,GAAM,QAAA,EAAS;AACxE,IAAA,GAAA,GAAM,GAAA,CAAI,OAAO,CAAC,CAAA,CAAE,QAAQ,EAAE,KAAA,EAAO,GAAG,CAAA;AACxC,IAAA,IAAI,KAAA,KAAU,mBAAmB,QAAA,EAAU,OAAO,MAAM,GAAA,CAAI,GAAA,GAAM,QAAA,EAAS;AAC3E,IAAA,GAAA,GAAM,GAAA,CAAI,UAAU,GAAG,CAAA;AACvB,IAAA,OAAO,MAAM,GAAA,CAAI,GAAA,EAAI,CAAE,QAAA,EAAS;AAAA,EAClC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEA,SAAS,aAAA,CAAc,UAAA,EAAoB,YAAA,EAAsB,SAAA,EAA+B;AAC9F,EAAA,IAAI,cAAc,EAAA,IAAM,YAAA,GAAe,OAAO,SAAA,IAAa,CAAA,SAAU,UAAA,CAAW,SAAA;AAChF,EAAA,IAAI,UAAA,IAAc,EAAA,IAAM,YAAA,GAAe,GAAA,SAAY,UAAA,CAAW,IAAA;AAC9D,EAAA,IAAI,UAAA,IAAc,EAAA,IAAM,YAAA,GAAe,IAAA,SAAa,UAAA,CAAW,UAAA;AAC/D,EAAA,OAAO,UAAA,CAAW,IAAA;AACpB;AAEA,SAAS,eAAe,MAAA,EAA4B;AAClD,EAAA,OAAO,MAAA,CAAO,UAAA,GAAa,EAAA,IAAM,MAAA,CAAO,SAAA,GAAY,EAAA,IAAM,MAAA,CAAO,MAAA,CAAO,QAAA,CAAS,YAAA,IAAgB,CAAC,CAAA,GAAI,IAAA;AACxG;AAEA,eAAe,qBAAqB,UAAA,EAAqC;AACvE,EAAA,MAAM,OAAA,GAAU,MAAM,SAAA,EAAU;AAChC,EAAA,IAAI,CAAC,SAAS,OAAO,GAAA;AACrB,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,UAAU,EAAE,QAAA,EAAS;AAChD,IAAA,MAAMa,SAAQ,MAAM,OAAA,CAAQ,UAAU,CAAA,CAAE,SAAA,GAAY,KAAA,EAAM;AAC1D,IAAA,MAAM,EAAA,GAAKA,MAAAA,CAAM,QAAA,GAAW,CAAC,CAAA;AAC7B,IAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,IAAS,CAAA;AAC3B,IAAA,MAAM,UAAU,EAAA,EAAI,GAAA,IAAO,CAAA,KAAM,EAAA,EAAI,OAAO,CAAA,CAAA,IAAM,GAAA;AAClD,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,EAAE,CAAA;AAC5C,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,KAAA,IAAS,CAAA,EAAG,IAAA,CAAK,MAAA,IAAU,CAAC,IAAI,GAAI,CAAA;AACtF,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,EAAE,CAAA;AACxC,IAAA,OAAO,YAAY,IAAA,GAAO,aAAA,GAAgB,GAAA,GAAM,KAAA,GAAQ,MAAM,eAAA,GAAkB,IAAA;AAAA,EAClF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,GAAA;AAAA,EACT;AACF;AAEA,eAAe,UAAA,CACb,UAAA,EACA,MAAA,EAEA,qBAAA,EACoB;AACpB,EAAA,MAAM,IAAA,GAAO,MAAM,gBAAA,EAAiB;AACpC,EAAA,MAAM,kBAAA,GAAqB,qBAAA,IAAyB,MAAA,CAAO,aAAA,IAAiB,kBAAA,CAAmB,QAAA;AAC/F,EAAA,MAAM,QAAQ,MAAM,kBAAA,CAAmB,YAAY,kBAAA,EAAoB,MAAA,CAAO,qBAAqB,GAAI,CAAA;AACvG,EAAA,MAAM,GAAA,GAAM,OAAO,GAAA,IAAO,CAAA;AAC1B,EAAA,MAAM,GAAA,GAAM,OAAO,GAAA,IAAO,MAAA;AAC1B,EAAA,MAAM,QAAA,GAAW,OAAO,QAAA,IAAY,OAAA;AAEpC,EAAA,IAAI,MAAA,GAA4B,IAAA;AAChC,EAAA,IAAI;AACF,IAAA,MAAM,cAAc,QAAA,KAAa,MAAA,GAAS,KAAA,GAAS,aAAA,CAAc,QAAQ,CAAA,IAAK,QAAA;AAC9E,IAAA,MAAA,GAAS,MAAM,IAAA,CAAK,YAAA,CAAa,WAAA,EAAa,GAAG,CAAA;AACjD,IAAA,MAAM,OAAO,aAAA,CAAc,EAAE,uBAAuB,MAAA,CAAO,GAAG,GAAG,CAAA;AAEjE,IAAA,MAAM,SAAS,QAAA,KAAa,MAAA,GAAS,MAAM,YAAA,CAAa,MAAA,EAAQ,KAAK,CAAA,GAAI,IAAA;AACzE,IAAA,MAAM,UAAA,GAAa,kBAAA,CAAmB,QAAA,EAAU,MAAM,CAAA;AAEtD,IAAA,IAAI,IAAA,GAAyB,IAAA;AAC7B,IAAA,KAAA,MAAW,YAAY,UAAA,EAAY;AACjC,MAAA,IAAI,aAAa,WAAA,EAAa;AAC5B,QAAA,MAAM,OAAO,SAAA,EAAU;AACvB,QAAA,MAAA,GAAS,MAAM,IAAA,CAAK,YAAA,CAAa,QAAA,EAAU,GAAG,CAAA;AAC9C,QAAA,MAAM,OAAO,aAAA,CAAc,EAAE,uBAAuB,MAAA,CAAO,GAAG,GAAG,CAAA;AAAA,MACnE;AACA,MAAA,MAAM,MAAA,GAAS,MAAM,iBAAA,CAAkB,MAAA,EAAQ,KAAK,CAAA;AACpD,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,IAAI,CAAC,IAAA,IAAQ,MAAA,CAAO,UAAA,GAAa,IAAA,CAAK,YAAY,IAAA,GAAO,MAAA;AACzD,MAAA,IAAI,IAAA,CAAK,cAAc,2BAAA,EAA6B;AAAA,IACtD;AAEA,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,EAAA;AAAA,QACN,UAAA,EAAY,CAAA;AAAA,QACZ,SAAS,UAAA,CAAW,IAAA;AAAA,QACpB,SAAA,EAAW,CAAA;AAAA,QACX,gBAAA,EAAkB,IAAA;AAAA,QAClB,oBAAA,EAAsB,kBAAA;AAAA,QACtB,UAAU,EAAC;AAAA,QACX,QAAA,EAAU,EAAE,YAAA,EAAc,CAAA;AAAE,OAC9B;AAAA,IACF;AAEA,IAAA,IAAI,gBAAA,GAAkC,IAAA;AACtC,IAAA,IAAI,IAAA,CAAK,IAAA,CAAK,IAAA,EAAK,EAAG;AACpB,MAAA,IAAI;AACF,QAAA,gBAAA,GAAmB,cAAA,CAAe,IAAA,CAAK,IAAA,EAAM,EAAE,CAAA;AAAA,MACjD,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,SAAS,aAAA,CAAc,IAAA,CAAK,YAAY,IAAA,CAAK,YAAA,EAAc,KAAK,SAAS,CAAA;AAAA,MACzE,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,gBAAA;AAAA,MACA,oBAAA,EAAsB,kBAAA;AAAA,MACtB,UAAU,EAAC;AAAA,MACX,QAAA,EAAU,EAAE,YAAA,EAAc,IAAA,CAAK,YAAA;AAAa,KAC9C;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,EAAA;AAAA,MACN,UAAA,EAAY,CAAA;AAAA,MACZ,SAAS,UAAA,CAAW,IAAA;AAAA,MACpB,SAAA,EAAW,CAAA;AAAA,MACX,gBAAA,EAAkB,IAAA;AAAA,MAClB,oBAAA,EAAsB,kBAAA;AAAA,MACtB,QAAA,EAAU,CAAC,CAAA,YAAA,EAAe,GAAG,CAAA,CAAE,CAAA;AAAA,MAC/B,QAAA,EAAU,EAAE,KAAA,EAAO,MAAA,CAAO,GAAG,CAAA;AAAE,KACjC;AAAA,EACF,CAAA,SAAE;AACA,IAAA,IAAI;AACF,MAAA,MAAM,QAAQ,SAAA,EAAU;AAAA,IAC1B,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACF;AAEA,eAAsB,mBAAA,CACpB,UAAA,EACA,MAAA,GAA2B,IAAA,EACP;AACpB,EAAA,MAAM,gBAAA,EAAiB;AACvB,EAAA,MAAMV,IAAAA,GAKF;AAAA,IACF,QAAA,EAAU,OAAA;AAAA,IACV,eAAe,kBAAA,CAAmB,QAAA;AAAA,IAClC,UAAA,EAAY,CAAA;AAAA,IACZ,iBAAA,EAAmB,GAAA;AAAA,IACnB,GAAG;AAAA,GACL;AAEA,EAAA,MAAM,YAAA,GAAe,MAAM,oBAAA,CAAqB,UAAU,CAAA;AAC1D,EAAA,MAAM,YAAA,GACJA,IAAAA,CAAI,aAAA,KAAkB,kBAAA,CAAmB,IAAA,GACrC,YAAA,GAAe,GAAA,GACb,kBAAA,CAAmB,KAAA,GACnB,kBAAA,CAAmB,QAAA,GACrBA,IAAAA,CAAI,aAAA;AAEV,EAAA,IAAI,MAAA,GAAS,MAAM,UAAA,CAAW,UAAA,EAAYA,MAAK,YAAY,CAAA;AAC3D,EAAA,MAAA,CAAO,SAAS,YAAA,GAAe,YAAA;AAC/B,EAAA,MAAA,CAAO,SAAS,UAAA,GAAa,CAAA;AAE7B,EAAA,IAAI,cAAA,CAAe,MAAM,CAAA,IAAKA,IAAAA,CAAI,aAAa,CAAA,EAAG;AAChD,IAAA,MAAA,GAAS,MAAM,UAAA,CAAW,UAAA,EAAYA,IAAAA,EAAK,mBAAmB,UAAU,CAAA;AACxE,IAAA,MAAA,CAAO,SAAS,SAAA,GAAY,IAAA;AAC5B,IAAA,MAAA,CAAO,SAAS,UAAA,GAAa,CAAA;AAC7B,IAAA,MAAA,CAAO,SAAS,YAAA,GAAe,YAAA;AAAA,EACjC;AACA,EAAA,OAAO,MAAA;AACT;AAncA,IAUa,UAAA,EAQA,kBAAA,EA6BA,aAAA,EAmBA,aAAA,EAEA,sBAqCP,2BAAA,EA2BF,OAAA;AApIJ,IAAA,QAAA,GAAA,KAAA,CAAA;AAAA,EAAA,uBAAA,GAAA;AAMA,IAAA,WAAA,EAAA;AACA,IAAA,WAAA,EAAA;AACA,IAAA,SAAA,EAAA;AAEO,IAAM,UAAA,GAAa;AAAA,MACxB,SAAA,EAAW,WAAA;AAAA,MACX,IAAA,EAAM,MAAA;AAAA,MACN,UAAA,EAAY,YAAA;AAAA,MACZ,IAAA,EAAM;AAAA,KACR;AAGO,IAAM,kBAAA,GAAqB;AAAA,MAChC,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,OAAA;AAAA,MACP,QAAA,EAAU,UAAA;AAAA,MACV,UAAA,EAAY;AAAA,KACd;AAwBO,IAAM,aAAA,GAAwC;AAAA,MACnD,EAAA,EAAI,KAAA;AAAA,MACJ,EAAA,EAAI,KAAA;AAAA,MACJ,KAAA,EAAO,SAAA;AAAA,MACP,EAAA,EAAI,KAAA;AAAA,MACJ,EAAA,EAAI,KAAA;AAAA,MACJ,EAAA,EAAI,KAAA;AAAA,MACJ,EAAA,EAAI,KAAA;AAAA,MACJ,EAAA,EAAI,KAAA;AAAA,MACJ,EAAA,EAAI,KAAA;AAAA,MACJ,EAAA,EAAI,KAAA;AAAA,MACJ,EAAA,EAAI,KAAA;AAAA,MACJ,EAAA,EAAI,SAAA;AAAA,MACJ,EAAA,EAAI,KAAA;AAAA,MACJ,EAAA,EAAI,KAAA;AAAA,MACJ,EAAA,EAAI,KAAA;AAAA,MACJ,EAAA,EAAI;AAAA,KACN;AAEO,IAAM,aAAA,mBAAgB,IAAI,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,OAAO,CAAC,CAAA;AAE9E,IAAM,oBAAA,GAAiD;AAAA,MAC5D,MAAA,EAAQ,CAAC,SAAA,EAAW,KAAA,EAAO,KAAK,CAAA;AAAA,MAChC,KAAA,EAAO,CAAC,KAAK,CAAA;AAAA,MACb,QAAA,EAAU,CAAC,KAAA,EAAO,KAAA,EAAO,KAAK,CAAA;AAAA,MAC9B,UAAA,EAAY,CAAC,KAAA,EAAO,KAAA,EAAO,OAAO,KAAK,CAAA;AAAA,MACvC,GAAA,EAAK,CAAC,SAAA,EAAW,SAAA,EAAW,KAAK,CAAA;AAAA,MACjC,QAAA,EAAU,CAAC,KAAK,CAAA;AAAA,MAChB,QAAA,EAAU,CAAC,KAAK,CAAA;AAAA,MAChB,QAAA,EAAU,CAAC,KAAK,CAAA;AAAA,MAChB,MAAA,EAAQ,CAAC,KAAK,CAAA;AAAA,MACd,MAAA,EAAQ,CAAC,KAAA,EAAO,KAAK,CAAA;AAAA,MACrB,KAAA,EAAO,CAAC,KAAA,EAAO,KAAK,CAAA;AAAA,MACpB,IAAA,EAAM,CAAC,KAAK,CAAA;AAAA,MACZ,GAAA,EAAK,CAAC,KAAK,CAAA;AAAA,MACX,KAAA,EAAO,CAAC,KAAK,CAAA;AAAA,MACb,OAAA,EAAS,CAAC,KAAK,CAAA;AAAA,MACf,OAAA,EAAS,CAAC,KAAK,CAAA;AAAA,MACf,OAAA,EAAS,CAAC,KAAK,CAAA;AAAA,MACf,MAAA,EAAQ,CAAC,KAAK,CAAA;AAAA,MACd,OAAA,EAAS,CAAC,KAAA,EAAO,KAAK,CAAA;AAAA,MACtB,KAAA,EAAO,CAAC,KAAK,CAAA;AAAA,MACb,MAAA,EAAQ,CAAC,KAAK,CAAA;AAAA,MACd,OAAA,EAAS,CAAC,KAAK,CAAA;AAAA,MACf,SAAA,EAAW,CAAC,KAAK,CAAA;AAAA,MACjB,QAAA,EAAU,CAAC,KAAK,CAAA;AAAA,MAChB,QAAA,EAAU,CAAC,KAAK,CAAA;AAAA,MAChB,KAAA,EAAO,CAAC,KAAK,CAAA;AAAA,MACb,QAAA,EAAU,CAAC,KAAK,CAAA;AAAA,MAChB,QAAA,EAAU,CAAC,KAAK,CAAA;AAAA,MAChB,QAAA,EAAU,CAAC,KAAA,EAAO,KAAK,CAAA;AAAA,MACvB,MAAA,EAAQ,CAAC,KAAK,CAAA;AAAA,MACd,UAAA,EAAY,CAAC,KAAK,CAAA;AAAA,MAClB,OAAA,EAAS,CAAC,KAAA,EAAO,KAAK,CAAA;AAAA,MACtB,QAAA,EAAU,CAAC,KAAK,CAAA;AAAA,MAChB,mBAAA,EAAqB,CAAC,KAAK;AAAA,KAC7B;AAEA,IAAM,2BAAA,GAA8B,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACzGpC,IAAA,WAAA,GAAA,EAAA;AAAA,QAAA,CAAA,WAAA,EAAA;AAAA,EAAA,qBAAA,EAAA,MAAA,qBAAA;AAAA,EAAA,mBAAA,EAAA,MAAA,mBAAA;AAAA,EAAA,OAAA,EAAA,MAAA,OAAA;AAAA,EAAA,UAAA,EAAA,MAAA,OAAA;AAAA,EAAA,SAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAcA,SAAS,YAAY,EAAA,EAAqB;AACxC,EAAA,IAAI,OAAO,IAAA,IAAQ,EAAA,KAAO,IAAA,IAAQ,EAAA,KAAO,KAAM,OAAO,KAAA;AACtD,EAAA,MAAM,EAAA,GAAK,EAAA,CAAG,WAAA,CAAY,CAAC,CAAA;AAC3B,EAAA,IAAI,EAAA,IAAM,MAAM,OAAO,KAAA;AACvB,EAAA,OAAO,EAAA,IAAM,EAAA,IAAS,EAAA,IAAM,GAAA,IAAQ,EAAA,IAAM,GAAA;AAC5C;AAGO,SAAS,sBAAsB,IAAA,EAAuB;AAC3D,EAAA,IAAI,CAAC,IAAA,EAAM,IAAA,EAAK,EAAG,OAAO,KAAA;AAC1B,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,kBAAkB,CAAA;AAE/C,EAAA,MAAM,eAAe,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA,CAAE,MAAA,GAAS,KAAK,UAAA,CAAW,MAAA;AACvE,EAAA,IAAI,WAAA,GAAc,MAAA,CAAO,MAAA,GAAS,IAAA,EAAM,OAAO,IAAA;AAE/C,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,KAAA,MAAW,MAAM,MAAA,EAAQ;AACvB,IAAA,IAAI,WAAA,CAAY,EAAE,CAAA,EAAG,OAAA,IAAW,CAAA;AAAA,EAClC;AACA,EAAA,IAAI,OAAA,GAAU,MAAA,CAAO,MAAA,GAAS,IAAA,EAAM,OAAO,IAAA;AAE3C,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,KAAA,CAAM,QAAQ,EAAE,MAAA,GAAS,CAAA;AACpD,EAAA,IAAI,WAAA,GAAc,MAAA,CAAO,MAAA,GAAS,IAAA,EAAM,OAAO,IAAA;AAE/C,EAAA,OAAO,KAAA;AACT;AAEA,eAAsB,UAAU,OAAA,EAAkC;AAChE,EAAA,MAAM,MAAM,MAAMW,sBAAA,CAAiB,IAAI,UAAA,CAAW,OAAO,CAAC,CAAA;AAC1D,EAAA,OAAO,GAAA,CAAI,QAAA;AACb;AAEA,eAAsB,oBAAoB,OAAA,EAAoC;AAC5E,EAAA,MAAM,EAAE,UAAA,EAAY,IAAA,EAAK,GAAI,MAAMC,iBAAA,CAAY,IAAI,UAAA,CAAW,OAAO,CAAA,EAAG,EAAE,UAAA,EAAY,OAAO,CAAA;AAC7F,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,OAAO,CAAC,MAAA,CAAO,IAAA,IAAQ,EAAE,CAAC,CAAA;AAC9D,EAAA,OAAO,KAAA,CAAM,MAAA,GAAS,UAAA,EAAY,KAAA,CAAM,KAAK,EAAE,CAAA;AAC/C,EAAA,OAAO,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,UAAU,CAAA;AAClC;AAQA,eAAe,cAAc,OAAA,EAAoE;AAC/F,EAAA,MAAM,KAAA,GAAQ,MAAM,SAAA,CAAU,OAAO,CAAA;AACrC,EAAA,MAAM,aAAA,GAAgB,MAAM,eAAA,CAAgB,OAAO,CAAA;AACnD,EAAA,MAAM,QAAA,GAAW,aAAA,IAAkB,MAAM,mBAAA,CAAoB,OAAO,CAAA;AACpE,EAAA,MAAM,aAAa,aAAA,IAAiB,IAAA;AAEpC,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAoB;AACtC,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,IAAA,MAAM,OAAO,CAAA,GAAI,QAAA,CAAS,SAAU,QAAA,CAAS,CAAC,KAAK,EAAA,GAAM,EAAA;AACzD,IAAA,IAAI,IAAA,CAAK,MAAK,CAAE,MAAA,IAAU,uBAAuB,CAAC,qBAAA,CAAsB,IAAI,CAAA,EAAG;AAC7E,MAAA,KAAA,CAAM,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAA,EAAM,CAAA;AAAA,IAC1B,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,IACjB;AAAA,EACF;AACA,EAAA,OAAO,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,EAAO,QAAA,EAAS,EAAG,UAAA,EAAY,UAAA,IAAc,KAAA,CAAM,IAAA,GAAO,CAAA,EAAE;AACvF;AAEA,eAAsB,OAAA,CACpB,SACA,IAAA,EACoB;AACpB,EAAA,MAAM,EAAE,SAAA,EAAAC,UAAAA,EAAU,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,eAAA,EAAA,EAAA,kBAAA,CAAA,CAAA;AAC5B,EAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAY,oBAAmB,GAAI,MAAM,cAAc,OAAO,CAAA;AAC7E,EAAA,MAAM,iBAAyC,EAAC;AAChD,EAAA,IAAI,cAAA,GAAiB,KAAA;AAErB,EAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AACzB,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,IAAI;AACF,QAAA,MAAM,SAAS,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,WAAA,EAAA,EAAA,cAAA,CAAA,CAAA;AACrB,QAAA,MAAM,CAAC,aAAa,MAAM,CAAA,GAAI,MAAM,MAAA,CAAO,eAAA,CAAgB,OAAA,EAAS,KAAA,CAAM,QAAA,EAAU;AAAA,UAClF,WAAW,IAAA,CAAK;AAAA,SACjB,CAAA;AACD,QAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,EAAG;AACrD,UAAA,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,MAAA,CAAO,GAAG,GAAG,IAAI,CAAA;AAAA,QACnC;AACA,QAAA,cAAA,GAAiB,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,CAAE,MAAA,GAAS,CAAA;AACnD,QAAA,KAAA,MAAW,CAAC,GAAA,EAAK,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AAC/C,UAAA,cAAA,CAAe,GAAG,CAAA,GAAA,CAAK,cAAA,CAAe,GAAG,KAAK,CAAA,IAAK,GAAA;AAAA,QACrD;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,SAAA,CAAU,IAAA,CAAK,OAAO,GAAA,EAAK,EAAE,OAAO,YAAA,EAAc,KAAA,EAAO,KAAA,CAAM,QAAA,EAAU,CAAA;AAAA,MAC3E;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAI;AACF,QAAA,MAAM,MAAM,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,QAAA,EAAA,EAAA,WAAA,CAAA,CAAA;AAClB,QAAA,MAAM,SAAS,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,WAAA,EAAA,EAAA,cAAA,CAAA,CAAA;AACrB,QAAA,MAAM,WAAW,MAAM,MAAA,CAAO,sBAAA,CAAuB,OAAA,EAAS,MAAM,QAAQ,CAAA;AAC5E,QAAA,KAAA,MAAW,CAAC,GAAA,EAAK,QAAQ,CAAA,IAAK,QAAA,EAAU;AACtC,UAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,mBAAA,CAAoB,QAAQ,CAAA;AACrD,UAAA,IAAI,MAAA,CAAO,IAAA,CAAK,IAAA,EAAK,EAAG,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,MAAA,CAAO,IAAA,CAAK,IAAA,EAAM,CAAA;AAAA,QACjE;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,IAAI,eAAehB,yBAAA,EAAmB;AACpC,UAAA,OAAA,CAAQ,MAAM,kEAAkE,CAAA;AAAA,QAClF,CAAA,MAAO;AACL,UAAA,SAAA,CAAU,IAAA,CAAK,OAAO,GAAA,EAAK,EAAE,OAAO,SAAA,EAAW,KAAA,EAAO,KAAA,CAAM,QAAA,EAAU,CAAA;AAAA,QACxE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,YAAsB,EAAC;AAC7B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,OAAO,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA;AAC3B,IAAA,IAAI,CAAA,EAAG,SAAA,CAAU,IAAA,CAAK,CAAA,SAAA,EAAY,IAAI,CAAC,CAAA;AAAA,EAAS,CAAC,CAAA,CAAE,CAAA;AAAA,EACrD;AAEA,EAAA,OAAO,IAAIgB,UAAAA,CAAU;AAAA,IACnB,IAAA,EAAM,SAAA,CAAU,IAAA,CAAK,MAAM,CAAA;AAAA,IAC3B,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,MAAA,EAAQ,IAAA;AAAA,IACR,SAAA,EAAW,KAAA;AAAA,IACX,cAAA;AAAA,IACA,YAAY,cAAA,IAAkB;AAAA,GAC/B,CAAA;AACH;AAzIA,IAWM,kBAAA,EACA,mBAAA;AAZN,IAAA,QAAA,GAAA,KAAA,CAAA;AAAA,EAAA,uBAAA,GAAA;AAMA,IAAA,WAAA,EAAA;AACA,IAAA,UAAA,EAAA;AAEA,IAAA,kBAAA,EAAA;AAEA,IAAM,kBAAA,GAAqB,GAAA;AAC3B,IAAM,mBAAA,GAAsB,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACZ5B,IAAA,cAAA,GAAA,EAAA;AAAA,QAAA,CAAA,cAAA,EAAA;AAAA,EAAA,sBAAA,EAAA,MAAA,sBAAA;AAAA,EAAA,qBAAA,EAAA,MAAA,qBAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,iBAAA,EAAA,MAAA,iBAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,iBAAA,EAAA,MAAA,iBAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,iBAAA,EAAA,MAAA,iBAAA;AAAA,EAAA,qBAAA,EAAA,MAAA,qBAAA;AAAA,EAAA,sBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAkCA,SAAS,YAAY,OAAA,EAAyB;AAC5C,EAAA,OACE,GAAG,cAAc;;AAAA;AAAA,eAAA,EAEC,OAAO,+BAA+B,OAAO,CAAA,uFAAA,CAAA;AAGnE;AAEO,SAAS,kBACd,MAAA,EACkE;AAClE,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAClE,IAAA,IAAA,GAAO,MAAA;AACP,IAAA,QAAA,GAAY,MAAM,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,GAAI,IAAA,CAAK,QAAQ,EAAC;AAAA,EACxD,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAChC,IAAA,IAAA,GAAO,EAAC;AACR,IAAA,QAAA,GAAW,MAAA;AAAA,EACb,CAAA,MAAO;AACL,IAAA,OAAO,CAAC,EAAC,EAAG,EAAE,CAAA;AAAA,EAChB;AACA,EAAA,MAAM,QAA+C,EAAC;AACtD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,IAAA,MAAM,KAAA,GAAQ,SAAS,CAAC,CAAA;AACxB,IAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC/D,MAAA,MAAM,GAAA,GAAM,KAAA;AACZ,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,MAAM,OAAO,GAAA,CAAI,SAAS,QAAA,GAAW,GAAA,CAAI,OAAO,CAAA,GAAI,CAAA;AAAA,QACpD,MAAM,OAAO,GAAA,CAAI,IAAA,KAAS,QAAA,GAAW,IAAI,IAAA,GAAO;AAAA,OACjD,CAAA;AAAA,IACH,CAAA,MAAA,IAAW,OAAO,KAAA,KAAU,QAAA,EAAU;AACpC,MAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,IAAI,CAAA,EAAG,IAAA,EAAM,OAAO,CAAA;AAAA,IACzC;AAAA,EACF;AACA,EAAA,OAAO,CAAC,MAAM,KAAK,CAAA;AACrB;AAEO,SAAS,gBAAA,CACd,OACA,OAAA,EACwB;AACxB,EAAA,MAAM,WAAmC,EAAC;AAC1C,EAAA,IAAI,KAAA,CAAM,WAAW,OAAA,EAAS;AAC5B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ,CAAA,EAAA,EAAK,QAAA,CAAS,CAAC,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,CAAG,IAAA;AAC/D,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,IAAI,MAAA,CAAO,SAAA,CAAU,CAAA,CAAE,IAAI,CAAA,IAAK,EAAE,IAAA,IAAQ,CAAA,IAAK,CAAA,CAAE,IAAA,IAAQ,OAAA,EAAS;AAChE,MAAA,QAAA,CAAS,CAAA,CAAE,IAAA,GAAO,CAAC,CAAA,GAAI,CAAA,CAAE,IAAA;AAAA,IAC3B;AAAA,EACF;AACA,EAAA,OAAO,QAAA;AACT;AAEA,SAAS,mBACP,OAAA,EACkE;AAClE,EAAA,IAAI;AACF,IAAA,OAAO,iBAAA,CAAkB,aAAA,CAAc,OAAA,EAAS,QAAQ,CAAC,CAAA;AAAA,EAC3D,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,iBAAA,CAAkB,aAAA,CAAc,OAAA,EAAS,OAAO,CAAC,CAAA;AAAA,EAC1D;AACF;AAEA,SAAS,MAAM,EAAA,EAA2B;AACxC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,MAAM,UAAA,CAAW,CAAA,EAAG,EAAE,CAAC,CAAA;AAC7C;AAsBA,eAAsB,qBAAA,CACpB,QACA,IAAA,EAC6C;AAC7C,EAAA,IAAI,CAAC,OAAO,MAAA,EAAQ,OAAO,CAAC,EAAC,EAAG,EAAE,CAAA;AAElC,EAAA,MAAM,aAAA,GAAgB,KAAK,aAAA,IAAiB,CAAA;AAC5C,EAAA,MAAM,UAAsB,EAAC;AAC7B,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,MAAA,EAAQ,KAAK,sBAAA,EAAwB;AAC9D,IAAA,OAAA,CAAQ,KAAK,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,CAAA,GAAI,sBAAsB,CAAC,CAAA;AAAA,EAC1D;AACA,EAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,EAAE,QAAQ,MAAA,CAAO,MAAA,EAAO,EAAG,MAAM,EAAE,CAAA;AAC9D,EAAA,MAAM,WAAA,GAAc,EAAE,KAAA,EAAO,CAAA,EAAG,QAAQ,CAAA,EAAE;AAC1C,EAAA,MAAM,SAAA,GAAY,IAAI,SAAA,CAAU,aAAa,CAAA;AAC7C,EAAA,IAAI,IAAA,GAAsB,QAAQ,OAAA,EAAQ;AAC1C,EAAA,MAAM,QAAA,GAAW,OAAO,EAAA,KAAmB;AACzC,IAAA,MAAM,IAAA,GAAO,IAAA;AACb,IAAA,IAAI,OAAA;AACJ,IAAA,IAAA,GAAO,IAAI,OAAA,CAAc,CAAC,CAAA,KAAM;AAC9B,MAAA,OAAA,GAAU,CAAA;AAAA,IACZ,CAAC,CAAA;AACD,IAAA,MAAM,IAAA;AACN,IAAA,IAAI;AACF,MAAA,EAAA,EAAG;AAAA,IACL,CAAA,SAAE;AACA,MAAA,OAAA,EAAQ;AAAA,IACV;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,IAAA,CAAK,SAAS,CAAA;AAE5C,EAAA,MAAM,YAAA,GAAe,OAAO,QAAA,EAAkB,WAAA,KAA0B;AACtE,IAAA,MAAM,UAAU,OAAA,EAAQ;AACxB,IAAA,IAAI;AACF,MAAA,MAAM,UAAU,WAAA,CAAY,MAAA;AAC5B,MAAA,MAAM,MAAA,GAAS,YAAY,OAAO,CAAA;AAClC,MAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,qBAAA,EAAuB,OAAA,EAAA,EAAW;AACjE,QAAA,IAAI;AACF,UAAA,MAAM,CAAC,OAAA,EAAS,KAAK,IAAI,MAAM,OAAA,CAAQ,KAAK,SAAA,EAAW;AAAA,YACrD,MAAA,EAAQ,oBAAA;AAAA,YACR,IAAA,EAAM,MAAA;AAAA,YACN,QAAA,EAAU,IAAA;AAAA,YACV,MAAA,EAAQ,WAAA;AAAA,YACR;AAAA,WACD,CAAA;AACD,UAAA,IAAI,CAAC,OAAA,EAAS,IAAA,IAAQ,MAAM,IAAI,MAAM,uBAAuB,CAAA;AAC7D,UAAA,MAAM,GAAG,KAAK,CAAA,GAAI,mBAAmB,OAAO,CAAA;AAC5C,UAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,KAAA,EAAO,OAAO,CAAA;AAChD,UAAA,MAAM,SAAS,MAAM;AACnB,YAAA,KAAA,MAAW,CAAC,QAAA,EAAU,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC3D,cAAA,MAAM,SAAA,GAAY,QAAA,GAAW,sBAAA,GAAyB,MAAA,CAAO,QAAQ,CAAA;AACrE,cAAA,IAAI,aAAa,CAAA,IAAK,SAAA,GAAY,QAAQ,MAAA,EAAQ,OAAA,CAAQ,SAAS,CAAA,GAAI,QAAA;AAAA,YACzE;AACA,YAAA,WAAA,CAAY,KAAA,IAAS,MAAM,KAAA,IAAS,CAAA;AACpC,YAAA,WAAA,CAAY,MAAA,IAAU,MAAM,MAAA,IAAU,CAAA;AAAA,UACxC,CAAC,CAAA;AACD,UAAA;AAAA,QACF,SAAS,GAAA,EAAK;AACZ,UAAA,IAAI,UAAU,qBAAA,EAAuB;AACnC,YAAA,OAAA,CAAQ,KAAK,CAAA,eAAA,EAAkB,QAAQ,YAAY,OAAO,CAAA,SAAA,EAAY,GAAG,CAAA,gBAAA,CAAa,CAAA;AACtF,YAAA,MAAM,KAAA,CAAM,MAAO,OAAO,CAAA;AAAA,UAC5B,CAAA,MAAO;AACL,YAAA,OAAA,CAAQ,KAAA;AAAA,cACN,CAAA,eAAA,EAAkB,QAAQ,CAAA,cAAA,EAAiB,qBAAqB,cAAc,GAAG,CAAA;AAAA,aACnF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA,SAAE;AACA,MAAA,SAAA,CAAU,OAAA,EAAQ;AAAA,IACpB;AAAA,EACF,CAAA;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,YAAA,CAAa,CAAA,EAAG,CAAC,CAAC,CAAC,CAAA;AAAA,EAC7D,CAAA,SAAE;AACA,IAAA,MAAM,OAAO,MAAA,EAAO;AAAA,EACtB;AACA,EAAA,OAAO,CAAC,SAAS,WAAW,CAAA;AAC9B;AAEA,eAAsB,eAAA,CACpB,OAAA,EACA,WAAA,EACA,IAAA,EAC2D;AAC3D,EAAA,MAAM,QAAA,GAAW,MAAM,sBAAA,CAAuB,OAAA,EAAS,WAAW,CAAA;AAClE,EAAA,MAAM,MAAA,GAAS,SAAS,GAAA,CAAI,CAAC,GAAG,GAAG,MAAM,GAAG,CAAA;AAC5C,EAAA,MAAM,CAAC,KAAA,EAAO,MAAM,CAAA,GAAI,MAAM,qBAAA,CAAsB,MAAA,EAAQ,EAAE,SAAA,EAAW,IAAA,CAAK,SAAA,EAAW,CAAA;AACzF,EAAA,MAAM,YAAoC,EAAC;AAC3C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,IAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,IAAA,IAAI,IAAA,EAAM,MAAK,EAAG,SAAA,CAAU,SAAS,CAAC,CAAA,CAAG,CAAC,CAAC,CAAA,GAAI,IAAA;AAAA,EACjD;AACA,EAAA,OAAO,CAAC,WAAW,MAAM,CAAA;AAC3B;AAEA,eAAsB,sBAAA,CACpB,OAAA,EACA,WAAA,EACA,GAAA,GAAM,GAAA,EAC4B;AAClC,EAAA,MAAM,QAAQ,GAAA,GAAM,EAAA;AACpB,EAAA,MAAM,IAAA,GAAO,IAAI,UAAA,CAAW,OAAO,CAAA;AACnC,EAAA,MAAM,GAAA,GAAM,MAAMF,sBAAAA,CAAiB,IAAI,CAAA;AACvC,EAAA,MAAM,UAAmC,EAAC;AAC1C,EAAA,MAAM,YAAA,GAAe,MAAM,SAAA,CAAmB,iBAAiB,CAAA;AAC/D,EAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC7B,IAAA,IAAI,GAAA,GAAM,CAAA,IAAK,GAAA,IAAO,GAAA,CAAI,QAAA,EAAU;AACpC,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAMG,uBAAA,CAAkB,GAAA,EAAK,MAAM,CAAA,EAAG;AAAA,QAChD,YAAA,EAAc,YAAA,GAAe,YAAY,YAAA,GAAwB,KAAA,CAAA;AAAA,QACjE;AAAA,OACD,CAAA;AACD,MAAA,MAAM,KAAA,GAAQ,eAAe,WAAA,GAAc,IAAI,WAAW,GAAG,CAAA,GAAI,IAAI,UAAA,CAAW,GAAiB,CAAA;AACjG,MAAA,OAAA,CAAQ,KAAK,CAAC,GAAA,EAAK,OAAO,IAAA,CAAK,KAAK,CAAC,CAAC,CAAA;AAAA,IACxC,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,mCAAA,EAAsC,GAAG,CAAA,CAAA,CAAA,EAAK,GAAG,CAAA;AAAA,IAChE;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;AAEA,eAAsB,qBAAqB,OAAA,EAAoC;AAC7E,EAAA,MAAM,aAAA,GAAgB,MAAM,mBAAA,CAAoB,OAAO,CAAA;AACvD,EAAA,MAAM,MAAM,MAAMH,sBAAAA,CAAiB,IAAI,UAAA,CAAW,OAAO,CAAC,CAAA;AAC1D,EAAA,MAAM,cAAwB,EAAC;AAC/B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,UAAU,CAAA,EAAA,EAAK;AACrC,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAMI,mBAAA,CAAc,GAAA,EAAK,IAAI,CAAC,CAAA;AAC3C,MAAA,OAAA,GAAU,IAAA,CAAK,MAAA;AAAA,IACjB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAA,GAAU,CAAA;AAAA,IACZ;AACA,IAAA,MAAM,QAAA,GAAA,CAAY,aAAA,CAAc,CAAC,CAAA,IAAK,IAAI,IAAA,EAAK;AAC/C,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,MAAA,GAAS,EAAA,IAAM,sBAAsB,QAAQ,CAAA;AACtE,IAAA,IAAI,OAAA,GAAU,CAAA,IAAK,OAAA,EAAS,WAAA,CAAY,KAAK,CAAC,CAAA;AAAA,EAChD;AACA,EAAA,OAAO,WAAA;AACT;AAEA,eAAsB,kBACpB,OAAA,EAC4E;AAC5E,EAAA,MAAM,GAAA,GAAM,MAAMX,sBAAAA,CAAM,SAAA,CAAU,OAAO,CAAA;AACzC,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,IAAA,CAAK,8BAA8B,CAAA;AACpD,EAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAC;AACnB,EAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AACrC,EAAA,MAAM,SAA4E,EAAC;AACnF,EAAA,MAAM,EAAA,GAAK,2FAAA;AACX,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,KAAA,MAAW,CAAA,IAAK,GAAA,CAAI,QAAA,CAAS,EAAE,CAAA,EAAG;AAChC,IAAA,MAAM,MAAA,GAAS,CAAA,CAAE,CAAC,CAAA,IAAK,EAAE,CAAC,CAAA;AAC1B,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,IAAA,GAAO,OAAO,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,CAAE,OAAA,CAAQ,SAAS,EAAE,CAAA;AAC1D,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAE,CAAA,IAAK,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA;AACtD,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,MAAA,CAAO,IAAA,CAAK,MAAM,IAAA,CAAK,KAAA,CAAM,YAAY,CAAC,CAAA;AACtD,MAAA,MAAM,GAAA,GAAM,KAAK,KAAA,CAAM,GAAG,EAAE,GAAA,EAAI,EAAG,aAAY,IAAK,KAAA;AACpD,MAAA,MAAM,WAAA,GACJ,QAAQ,KAAA,IAAS,GAAA,KAAQ,SAAS,YAAA,GAAe,GAAA,KAAQ,QAAQ,WAAA,GAAc,WAAA;AACjF,MAAA,MAAA,CAAO,KAAK,EAAE,KAAA,EAAO,KAAK,UAAA,EAAY,GAAA,EAAK,aAAa,CAAA;AACxD,MAAA,GAAA,IAAO,CAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,IAAA,CAAK,0CAA0C,GAAG,CAAA;AAAA,IAC5D;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,eAAsB,kBACpB,OAAA,EAC4E;AAC5E,EAAA,MAAM,GAAA,GAAM,MAAMA,sBAAAA,CAAM,SAAA,CAAU,OAAO,CAAA;AACzC,EAAA,MAAM,aAAa,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,KAAK,EACrC,MAAA,CAAO,CAAC,CAAA,KAAM,8BAAA,CAA+B,KAAK,CAAC,CAAC,EACpD,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AACd,IAAA,MAAM,EAAA,GAAK,OAAO,YAAA,CAAa,IAAA,CAAK,CAAC,CAAA,GAAI,CAAC,KAAK,CAAC,CAAA;AAChD,IAAA,MAAM,EAAA,GAAK,OAAO,YAAA,CAAa,IAAA,CAAK,CAAC,CAAA,GAAI,CAAC,KAAK,CAAC,CAAA;AAChD,IAAA,OAAO,EAAA,GAAK,EAAA;AAAA,EACd,CAAC,CAAA;AACH,EAAA,MAAM,SAA4E,EAAC;AACnF,EAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,IAAA,MAAM,QAAA,GAAW,OAAO,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA,GAAI,CAAC,KAAK,CAAC,CAAA;AACzD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,0BAAA,EAA4B,sBAAsB,CAAA;AAChF,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,IAAA,CAAK,QAAQ,CAAA;AAClC,IAAA,IAAI,CAAC,QAAA,EAAU;AACf,IAAA,MAAM,GAAA,GAAM,MAAM,QAAA,CAAS,KAAA,CAAM,QAAQ,CAAA;AACzC,IAAA,MAAM,EAAA,GAAK,2FAAA;AACX,IAAA,KAAA,MAAW,CAAA,IAAK,GAAA,CAAI,QAAA,CAAS,EAAE,CAAA,EAAG;AAChC,MAAA,MAAM,MAAA,GAAS,CAAA,CAAE,CAAC,CAAA,IAAK,EAAE,CAAC,CAAA;AAC1B,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,MAAM,IAAA,GAAO,OAAO,OAAA,CAAQ,SAAA,EAAW,MAAM,CAAA,CAAE,OAAA,CAAQ,SAAS,EAAE,CAAA;AAClE,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,IAAK,GAAA,CAAI,IAAA,CAAK,CAAA,IAAA,EAAO,MAAA,CAAO,OAAA,CAAQ,YAAA,EAAc,EAAE,CAAC,CAAA,CAAE,CAAA;AACjF,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,IAAI;AACF,QAAA,MAAM,MAAM,MAAA,CAAO,IAAA,CAAK,MAAM,IAAA,CAAK,KAAA,CAAM,YAAY,CAAC,CAAA;AACtD,QAAA,MAAM,GAAA,GAAM,KAAK,KAAA,CAAM,GAAG,EAAE,GAAA,EAAI,EAAG,aAAY,IAAK,KAAA;AACpD,QAAA,MAAM,WAAA,GACJ,QAAQ,KAAA,IAAS,GAAA,KAAQ,SAAS,YAAA,GAAe,GAAA,KAAQ,QAAQ,WAAA,GAAc,WAAA;AACjF,QAAA,MAAA,CAAO,KAAK,EAAE,KAAA,EAAO,UAAU,UAAA,EAAY,GAAA,EAAK,aAAa,CAAA;AAAA,MAC/D,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,eAAsB,YAAA,CAAa,SAAiB,IAAA,EAAoD;AACtG,EAAA,MAAM,EAAE,SAAA,EAAAS,UAAAA,EAAU,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,eAAA,EAAA,EAAA,kBAAA,CAAA,CAAA;AAC5B,EAAA,MAAM,CAAC,OAAA,EAAS,KAAK,IAAI,MAAM,OAAA,CAAQ,KAAK,SAAA,EAAW;AAAA,IACrD,MAAA,EAAQ,oBAAA;AAAA,IACR,IAAA,EAAM,GAAG,cAAc;;AAAA,uDAAA,CAAA;AAAA,IACvB,MAAA,EAAQ,CAAC,OAAO;AAAA,GACjB,CAAA;AACD,EAAA,MAAM,IAAA,GAAA,CAAQ,OAAA,IAAW,EAAA,EAAI,IAAA,EAAK;AAClC,EAAA,OAAO,IAAIA,UAAAA,CAAU;AAAA,IACnB,IAAA;AAAA,IACA,KAAA,EAAO,IAAA;AAAA,IACP,MAAA,EAAQ,IAAA;AAAA,IACR,WAAW,CAAC,IAAA;AAAA,IACZ,cAAA,EAAgB,SAAS,EAAC;AAAA,IAC1B,UAAA,EAAY,QAAQ,IAAI;AAAA,GACzB,CAAA;AACH;AA/VA,IAea,sBAAA,EACA,qBAAA,EAEP,oBAAA,EAKA,cAAA,EAiFA,SAAA;AAxGN,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,0BAAA,GAAA;AASA,IAAA,WAAA,EAAA;AACA,IAAA,QAAA,EAAA;AAEA,IAAA,SAAA,EAAA;AACA,IAAA,QAAA,EAAA;AAEO,IAAM,sBAAA,GAAyB,CAAA;AAC/B,IAAM,qBAAA,GAAwB,CAAA;AAErC,IAAM,oBAAA,GACJ,2OAAA;AAIF,IAAM,cAAA,GACJ,oqBAAA;AAgFF,IAAM,YAAN,MAAgB;AAAA,MACN,CAAA;AAAA,MACS,UAA6B,EAAC;AAAA,MAC/C,YAAY,GAAA,EAAa;AACvB,QAAA,IAAA,CAAK,CAAA,GAAI,GAAA;AAAA,MACX;AAAA,MACA,MAAM,OAAA,GAAyB;AAC7B,QAAA,IAAI,IAAA,CAAK,IAAI,CAAA,EAAG;AACd,UAAA,IAAA,CAAK,CAAA,IAAK,CAAA;AACV,UAAA;AAAA,QACF;AACA,QAAA,MAAM,IAAI,QAAc,CAAC,OAAA,KAAY,KAAK,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,MACjE;AAAA,MACA,OAAA,GAAgB;AACd,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAM;AAChC,QAAA,IAAI,MAAM,IAAA,EAAK;AAAA,kBACL,CAAA,IAAK,CAAA;AAAA,MACjB;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC1HA,IAAA,kBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,kBAAA,EAAA;AAAA,EAAA,SAAA,EAAA,MAAAA,iBAAA;AAAA,EAAA,OAAA,EAAA,MAAAG;AAAA,CAAA,CAAA;AAwCA,SAAS,KAAA,CAAM,KAAa,IAAA,EAAuB;AACjD,EAAA,OAAO,GAAA,KAAQ,UAAU,IAAA,KAAS,iBAAA;AACpC;AAEA,SAAS,OAAA,CAAQ,KAAa,IAAA,EAAuB;AACnD,EAAA,OAAO,KAAK,UAAA,CAAW,QAAQ,CAAA,IAAK,UAAA,CAAW,IAAI,GAAG,CAAA;AACxD;AAEA,eAAe,yBAAA,CACb,MAAA,EACA,SAAA,EACA,KAAA,EAC6C;AAC7C,EAAA,IAAI,CAAC,OAAO,MAAA,EAAQ,OAAO,CAAC,EAAC,EAAG,EAAE,CAAA;AAClC,EAAA,IAAI;AACF,IAAA,MAAM,SAAS,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,WAAA,EAAA,EAAA,cAAA,CAAA,CAAA;AACrB,IAAA,OAAO,MAAM,MAAA,CAAO,qBAAA;AAAA,MAClB,MAAA,CAAO,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAI,UAAU,CAAA;AAAA,MAClC,EAAE,SAAA;AAAU,KACd;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,SAAA,CAAU,KAAA,EAAO,GAAA,EAAK,EAAE,KAAA,EAAO,yBAAyB,CAAA;AACxD,IAAA,OAAO,CAAC,EAAC,EAAG,EAAE,CAAA;AAAA,EAChB;AACF;AAMA,eAAsBA,QAAAA,CACpB,OAAA,EACA,QAAA,EACA,IAAA,EACA,IAAA,EACoB;AACpB,EAAA,MAAM,IAAI,IAAA,IAAQ,EAAA;AAClB,EAAA,MAAM,GAAA,GAAY,iBAAiB,QAAQ,CAAA;AAC3C,EAAA,MAAM,SAAA,GAAY,KAAK,SAAA,IAAa,IAAA;AACpC,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AAEnB,EAAA,IAAI;AACF,IAAA,IAAU,oBAAA,CAAqB,QAAA,EAAU,CAAC,CAAA,EAAG;AAC3C,MAAA,OAAO,IAAIH,iBAAA,CAAU,EAAE,MAAM,EAAA,EAAI,SAAA,EAAW,MAAM,CAAA;AAAA,IACpD;AAEA,IAAA,IAAI,KAAA,CAAM,GAAA,EAAK,CAAC,CAAA,EAAG;AACjB,MAAA,MAAM,MAAM,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,QAAA,EAAA,EAAA,WAAA,CAAA,CAAA;AAClB,MAAA,OAAO,MAAM,GAAA,CAAI,OAAA,CAAQ,SAAS,EAAE,SAAA,EAAW,OAAO,CAAA;AAAA,IACxD;AAEA,IAAA,IAAI,OAAA,CAAQ,GAAA,EAAK,CAAC,CAAA,EAAG;AACnB,MAAA,IAAI,CAAC,SAAA,EAAW,OAAO,IAAIA,iBAAA,CAAU,EAAE,IAAA,EAAM,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,CAAA;AAClE,MAAA,IAAI;AACF,QAAA,MAAM,SAAS,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,WAAA,EAAA,EAAA,cAAA,CAAA,CAAA;AACrB,QAAA,OAAO,MAAM,MAAA,CAAO,YAAA,CAAa,OAAA,EAAS,EAAE,WAAW,CAAA;AAAA,MACzD,SAAS,GAAA,EAAK;AACZ,QAAA,SAAA,CAAU,OAAO,GAAA,EAAK,EAAE,KAAA,EAAO,cAAA,EAAgB,UAAU,CAAA;AACzD,QAAA,OAAO,IAAIA,iBAAA,CAAU,EAAE,MAAM,EAAA,EAAI,SAAA,EAAW,MAAM,CAAA;AAAA,MACpD;AAAA,IACF;AAEA,IAAA,IAAI,GAAA,KAAQ,OAAA,IAAW,CAAA,KAAY,SAAA,EAAW;AAC5C,MAAA,MAAM,IAAA,GAAO,MAAY,eAAA,CAAgB,OAAO,CAAA;AAChD,MAAA,IAAI,iBAAyC,EAAC;AAC9C,MAAA,IAAI,WAAA,GAAc,CAAA;AAClB,MAAA,IAAI,QAAA,GAAW,IAAA;AACf,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,MAAM,SAAS,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,WAAA,EAAA,EAAA,cAAA,CAAA,CAAA;AACrB,QAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,iBAAA,CAAkB,OAAO,CAAA;AACrD,QAAA,MAAM,CAAC,OAAO,MAAM,CAAA,GAAI,MAAM,yBAAA,CAA0B,MAAA,EAAQ,WAAW,KAAK,CAAA;AAChF,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,UAAA,MAAM,OAAA,GAAU,MAAM,CAAC,CAAA;AACvB,UAAA,IAAI,OAAA,EAAS;AACX,YAAA,QAAA,IAAY;AAAA,OAAA,EAAY,IAAI,CAAC,CAAA;AAAA,EAAM,OAAO,CAAA,CAAA;AAC1C,YAAA,WAAA,IAAe,CAAA;AAAA,UACjB;AAAA,QACF;AACA,QAAA,cAAA,GAAiB,MAAA;AAAA,MACnB;AACA,MAAA,OAAO,IAAIA,iBAAA,CAAU;AAAA,QACnB,IAAA,EAAM,QAAA;AAAA,QACN,KAAA,EAAO,MAAY,cAAA,CAAe,OAAO,CAAA;AAAA,QACzC,cAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,GAAA,KAAQ,OAAA,IAAW,CAAA,KAAY,SAAA,EAAW;AAC5C,MAAA,MAAM,IAAA,GAAO,MAAY,eAAA,CAAgB,OAAO,CAAA;AAChD,MAAA,IAAI,iBAAyC,EAAC;AAC9C,MAAA,IAAI,WAAA,GAAc,CAAA;AAClB,MAAA,IAAI,QAAA,GAAW,IAAA;AACf,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,MAAM,SAAS,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,WAAA,EAAA,EAAA,cAAA,CAAA,CAAA;AACrB,QAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,iBAAA,CAAkB,OAAO,CAAA;AACrD,QAAA,MAAM,CAAC,OAAO,MAAM,CAAA,GAAI,MAAM,yBAAA,CAA0B,MAAA,EAAQ,WAAW,KAAK,CAAA;AAChF,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,UAAA,MAAM,OAAA,GAAU,MAAM,CAAC,CAAA;AACvB,UAAA,IAAI,OAAA,EAAS;AACX,YAAA,MAAM,QAAA,GAAW,MAAA,CAAO,CAAC,CAAA,EAAG,SAAS,CAAA,GAAI,CAAA;AACzC,YAAA,QAAA,IAAY;AAAA,OAAA,EAAY,QAAQ,CAAA;AAAA,EAAY,OAAO,CAAA,CAAA;AACnD,YAAA,WAAA,IAAe,CAAA;AAAA,UACjB;AAAA,QACF;AACA,QAAA,cAAA,GAAiB,MAAA;AAAA,MACnB;AACA,MAAA,OAAO,IAAIA,iBAAA,CAAU;AAAA,QACnB,IAAA,EAAM,QAAA;AAAA,QACN,MAAA,EAAQ,MAAY,eAAA,CAAgB,OAAO,CAAA;AAAA,QAC3C,cAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,GAAA,KAAQ,OAAA,IAAW,CAAA,KAAY,SAAA,EAAW;AAC5C,MAAA,OAAO,IAAIA,kBAAU,EAAE,IAAA,EAAM,MAAY,eAAA,CAAgB,OAAO,GAAG,CAAA;AAAA,IACrE;AAEA,IAAA,IAAI,GAAA,KAAQ,MAAA,IAAU,CAAA,KAAM,2BAAA,EAA6B;AACvD,MAAA,OAAO,IAAIA,kBAAU,EAAE,IAAA,EAAY,eAAe,OAAA,EAAS,GAAI,GAAG,CAAA;AAAA,IACpE;AAEA,IAAA,IAAI,GAAA,KAAQ,MAAA,IAAU,CAAA,KAAM,UAAA,EAAY;AACtC,MAAA,OAAO,IAAIA,iBAAA,CAAU,EAAE,MAAY,cAAA,CAAe,OAAO,GAAG,CAAA;AAAA,IAC9D;AAEA,IAAA,IAAI,GAAA,KAAQ,OAAA,IAAW,GAAA,KAAQ,MAAA,IAAU,MAAM,WAAA,EAAa;AAC1D,MAAA,OAAO,IAAIA,iBAAA,CAAU,EAAE,MAAY,eAAA,CAAgB,OAAO,GAAG,CAAA;AAAA,IAC/D;AAEA,IAAA,IAAI,GAAA,KAAQ,MAAA,IAAU,CAAA,KAAM,gBAAA,EAAkB;AAC5C,MAAA,OAAO,IAAIA,kBAAU,EAAE,IAAA,EAAM,MAAY,cAAA,CAAe,OAAO,GAAG,CAAA;AAAA,IACpE;AAEA,IAAA,OAAO,IAAIA,kBAAU,EAAE,IAAA,EAAM,QAAQ,QAAA,CAAS,MAAM,GAAG,CAAA;AAAA,EACzD,SAAS,GAAA,EAAK;AACZ,IAAA,SAAA,CAAU,OAAO,GAAA,EAAK,EAAE,KAAA,EAAO,SAAA,EAAW,UAAU,CAAA;AACpD,IAAA,OAAO,IAAIA,kBAAU,EAAE,IAAA,EAAM,QAAQ,QAAA,CAAS,MAAM,GAAG,CAAA;AAAA,EACzD;AACF;AApLA,IAUM,UAAA,CAAA,CAEOA;AAZb,IAAA,eAAA,GAAA,KAAA,CAAA;AAAA,EAAA,yBAAA,GAAA;AAOA,IAAA,UAAA,EAAA;AACA,IAAA,UAAA,EAAA;AAEA,IAAM,UAAA,mBAAa,IAAI,GAAA,CAAI,CAAC,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,OAAO,CAAC,CAAA;AAEvF,IAAMA,oBAAN,MAAgB;AAAA,MACrB,IAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,MACA,cAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA;AAAA,MAEA,YAAY,IAAA,EAQT;AACD,QAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,QAAA,IAAA,CAAK,KAAA,GAAQ,KAAK,KAAA,IAAS,IAAA;AAC3B,QAAA,IAAA,CAAK,MAAA,GAAS,KAAK,MAAA,IAAU,IAAA;AAC7B,QAAA,IAAA,CAAK,SAAA,GAAY,KAAK,SAAA,IAAa,KAAA;AACnC,QAAA,IAAA,CAAK,cAAA,GAAiB,IAAA,CAAK,cAAA,IAAkB,EAAC;AAC9C,QAAA,IAAA,CAAK,WAAA,GAAc,KAAK,WAAA,IAAe,CAAA;AACvC,QAAA,IAAA,CAAK,UAAA,GAAa,KAAK,UAAA,IAAc,KAAA;AAAA,MACvC;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACIO,SAAS,YAAA,CACd,MACA,IAAA,EACQ;AACR,EAAA,MAAM,IAAI,IAAA,IAAQ,EAAA;AAClB,EAAA,IAAI,CAAA,KAAM,mBAAmB,OAAO,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,SAAS,CAAC,CAAA;AAC/D,EAAA,IAAI,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,EAAG,OAAO,KAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,MAAA,IAAU,CAAC,CAAA;AAC1D,EAAA,IAAI,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,EAAG,OAAO,KAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAA,IAAS,CAAC,CAAA;AACzD,EAAA,IAAI,CAAA,CAAE,UAAA,CAAW,QAAQ,CAAA,EAAG,OAAO,CAAA;AACnC,EAAA,OAAO,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,KAAK,IAAA,CAAK,SAAA,IAAa,IAAA,GAAO,IAAA,CAAK,CAAC,CAAA;AAC9D;AAEO,SAAS,UAAA,CAAW,YAAoB,qBAAA,EAAuC;AACpF,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,UAAA,GAAa,CAAC,CAAA,GAAI,qBAAA;AACrC;AAxDA,IAiCM,UAAA,EAIA,UAAA;AArCN,IAAA,UAAA,GAAA,KAAA,CAAA;AAAA,EAAA,cAAA,GAAA;AAiCA,IAAM,UAAA,uBAAiB,GAAA,CAAI;AAAA,MACzB,2EAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAM,UAAA,uBAAiB,GAAA,CAAI;AAAA,MACzB,yEAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACxCD,IAAA,UAAA,GAAA,EAAA;AAAA,QAAA,CAAA,UAAA,EAAA;AAAA,EAAA,QAAA,EAAA,MAAA,QAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,SAAA,EAAA,MAAA,SAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,WAAA,EAAA,MAAA,WAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,cAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAiBO,SAAS,cAAc,GAAA,EAAqB;AACjD,EAAA,OAAO,GAAA,CAAI,QAAQ,YAAA,EAAc,CAAC,MAAM,GAAA,CAAI,MAAA,CAAO,CAAA,CAAE,MAAM,CAAC,CAAA;AAC9D;AAEA,SAAS,UAAA,CAAW,UAAkB,OAAA,EAA0B;AAC9D,EAAA,OAAO,IAAI,MAAA,CAAO,CAAA,GAAA,EAAM,OAAO,CAAA,GAAA,CAAK,CAAA,CAAE,KAAK,QAAQ,CAAA;AACrD;AAEO,SAAS,mBAAmB,MAAA,EAAyC;AAC1E,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,MAAA,IAAU,YAAY,CAAA;AACnD,EAAA,IAAI,WAAW,QAAA,EAAU,OAAO,CAAA,UAAA,EAAa,MAAA,CAAO,YAAY,EAAE,CAAA,CAAA;AAElE,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,IAAA,IAAQ,WAAW,CAAA;AAC9C,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,IAAA,IAAQ,IAAI,CAAA;AACvC,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,MAAA,CAAO,QAAA,IAAY,EAAE,CAAA;AAC7C,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,MAAA,CAAO,QAAA,IAAY,EAAE,CAAA;AAC7C,EAAA,MAAM,WAAW,kBAAA,CAAmB,MAAA,CAAO,MAAA,CAAO,QAAA,IAAY,EAAE,CAAC,CAAA;AAEjE,EAAA,IAAI,WAAW,QAAA,EAAU;AACvB,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,MAAA,CAAO,YAAA,IAAgB,QAAQ,CAAA;AAC1D,IAAA,OAAO,CAAA,SAAA,EAAY,QAAQ,CAAA,CAAA,EAAI,QAAQ,IAAI,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,eAAA,EAAkB,WAAW,CAAA,CAAA;AAAA,EACtF;AACA,EAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,MAAA,CAAO,WAAA,IAAe,QAAQ,CAAA;AACxD,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,SAAA,IAAa,EAAE,CAAA;AAC/C,IAAA,IAAI,GAAA,GAAM,CAAA,YAAA,EAAe,QAAQ,CAAA,CAAA,EAAI,QAAQ,IAAI,IAAI,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA;AAC/E,IAAA,IAAI,SAAA,EAAW,GAAA,IAAO,CAAA,WAAA,EAAc,SAAS,CAAA,CAAA;AAC7C,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,IAAI,WAAW,YAAA,EAAc;AAC3B,IAAA,MAAM,SAAS,CAAC,IAAA,EAAM,MAAM,GAAG,CAAA,CAAE,SAAS,IAAI,CAAA;AAC9C,IAAA,OAAO,CAAA,aAAA,EAAgB,QAAQ,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,QAAQ,CAAA,EAAG,MAAA,GAAS,iBAAiB,EAAE,CAAA,CAAA;AAAA,EACxG;AACA,EAAA,IAAI,MAAA,KAAW,OAAA,IAAW,MAAA,KAAW,SAAA,EAAW;AAC9C,IAAA,OAAO,CAAA,QAAA,EAAW,QAAQ,CAAA,CAAA,EAAI,QAAQ,IAAI,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAAA,EACpE;AACA,EAAA,IAAI,WAAW,OAAA,EAAS;AACtB,IAAA,OAAO,CAAA,QAAA,EAAW,QAAQ,CAAA,CAAA,EAAI,QAAQ,IAAI,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAAA,EACpE;AACA,EAAA,OAAO,CAAA,aAAA,EAAgB,QAAQ,CAAA,CAAA,EAAI,QAAQ,IAAI,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AACzE;AAEA,SAAS,WAAW,IAAA,EAA8C;AAChE,EAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,OAAO,EAAA;AACzB,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,CAAC,CAAE,CAAA;AACpC,EAAA,MAAM,KAAA,GAAQ,CAAC,OAAA,CAAQ,IAAA,CAAK,GAAI,CAAC,CAAA;AACjC,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,QAAQ,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA,IAAK,EAAE,CAAC,CAAA,CAAE,IAAA,CAAK,GAAI,CAAC,CAAA;AAAA,EACpE;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAQA,eAAe,aAAA,CACb,MAAA,EACA,GAAA,EACA,OAAA,EACA,WAAW,KAAA,EACW;AACtB,EAAA,IAAI,EAAA;AACJ,EAAA,IAAI;AACF,IAAA,EAAA,GAAKI,SAAQ,IAAI,CAAA;AAAA,EACnB,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAIpB,yBAAA,CAAkB,UAAA,EAAY,IAAA,EAAM,wBAAwB,CAAA;AAAA,EACxE;AACA,EAAA,MAAM,MAAM,kBAAA,CAAmB,EAAE,GAAG,MAAA,EAAQ,MAAA,EAAQ,cAAc,CAAA;AAClE,EAAA,MAAM,MAAA,GAAS,IAAI,EAAA,CAAG,MAAA,CAAO;AAAA,IAC3B,gBAAA,EAAkB,GAAA;AAAA,IAClB,yBAAyB,eAAA,GAAkB,GAAA;AAAA,IAC3C,iBAAA,EAAmB;AAAA,GACpB,CAAA;AACD,EAAA,MAAM,OAAO,OAAA,EAAQ;AACrB,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,CAAO,MAAM,OAAO,CAAA;AAC1B,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,CAAO,MAAM,2BAA2B,CAAA;AAAA,MAChD,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,MAAA,CAAO,MAAM,UAAU,CAAA;AAC7B,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,kJAAA;AAAA,UAEA;AAAA,SACF;AACA,QAAA,MAAM,MAAA,CAAO,MAAM,OAAO,CAAA;AAAA,MAC5B;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AACrC,IAAA,MAAM,MAAA,CAAO,MAAM,QAAQ,CAAA;AAC3B,IAAA,MAAM,OAAA,GAAU,OAAO,MAAA,EAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,KAAM,MAAA,CAAO,KAAK,CAAC,CAAA,GAAI,OAAO,IAAA,CAAK,MAAA,CAAO,KAAK,CAAC,CAAC,IAAI,EAAC,CAAA;AACtG,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,GAAG,GAAE,CAAE,CAAA;AAChE,IAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,UAAU,MAAA,CAAO,QAAA,IAAY,KAAK,MAAA,EAAO;AAAA,EACnE,SAAS,CAAA,EAAG;AACV,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,CAAO,MAAM,UAAU,CAAA;AAAA,IAC/B,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,MAAM,CAAA;AAAA,EACR,CAAA,SAAE;AACA,IAAA,MAAM,OAAO,GAAA,EAAI;AAAA,EACnB;AACF;AAEA,eAAe,UAAA,CACb,MAAA,EACA,GAAA,EACA,OAAA,EACsB;AACtB,EAAA,IAAI,KAAA;AAMJ,EAAA,IAAI;AACF,IAAA,KAAA,GAAQoB,SAAQ,gBAAgB,CAAA;AAAA,EAClC,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAIpB,yBAAA,CAAkB,OAAA,EAAS,QAAA,EAAU,6BAA6B,CAAA;AAAA,EAC9E;AACA,EAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM,gBAAA,CAAiB;AAAA,IACxC,IAAA,EAAM,OAAO,IAAA,IAAQ,WAAA;AAAA,IACrB,IAAA,EAAM,MAAA,CAAO,MAAA,CAAO,IAAA,IAAQ,IAAI,CAAA;AAAA,IAChC,IAAA,EAAM,OAAO,QAAA,IAAY,EAAA;AAAA,IACzB,QAAA,EAAU,OAAO,QAAA,IAAY,EAAA;AAAA,IAC7B,QAAA,EAAU,OAAO,QAAA,IAAY,EAAA;AAAA,IAC7B,gBAAgB,eAAA,GAAkB;AAAA,GACnC,CAAA;AACD,EAAA,IAAI;AACF,IAAA,MAAM,CAAC,IAAA,EAAM,MAAM,IAAI,MAAM,IAAA,CAAK,MAAM,GAAG,CAAA;AAC3C,IAAA,MAAM,OAAO,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAK,OAA0C,EAAC;AAC/E,IAAA,MAAM,OAAA,GAAA,CAAW,UAAU,EAAC,EAAG,IAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAChD,IAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,GAAG,OAAO,CAAA,EAAG,QAAA,EAAU,IAAA,CAAK,MAAA,EAAO;AAAA,EACxE,CAAA,SAAE;AACA,IAAA,MAAM,KAAK,GAAA,EAAI;AAAA,EACjB;AACF;AAEA,eAAe,UAAA,CACb,MAAA,EACA,GAAA,EACA,OAAA,EACA,WAAW,KAAA,EACW;AACtB,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,MAAA,IAAU,YAAY,CAAA;AACnD,EAAA,IAAI,WAAW,YAAA,EAAc,OAAO,cAAc,MAAA,EAAQ,GAAA,EAAK,SAAS,QAAQ,CAAA;AAChF,EAAA,IAAI,MAAA,KAAW,WAAW,MAAA,KAAW,SAAA,SAAkB,UAAA,CAAW,MAAA,EAAQ,KAAK,OAAO,CAAA;AACtF,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,CAAA,oBAAA,EAAuB,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA,wEAAA;AAAA,GAE/C;AACF;AAEO,SAAS,aACd,MAAA,EACA,GAAA,EACA,OAAA,GAAkB,QAAA,EAClB,aAAqB,UAAA,EACa;AAClC,EAAA,OAAO,iBAAA,CAAkB,MAAA,EAAQ,GAAA,EAAK,OAAA,EAAS,UAAU,CAAA;AAC3D;AAEA,eAAe,iBAAA,CACb,MAAA,EACA,GAAA,EACA,OAAA,EACA,aAAA,EACkC;AAClC,EAAA,MAAM,aAAc,aAAA,IAAiB,UAAA;AACrC,EAAA,IAAI,CAAE,oBAAA,CAA2C,QAAA,CAAS,UAAU,CAAA,EAAG;AACrE,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,uBAAuB,IAAA,CAAK,SAAA,CAAU,aAAa,CAAC,oBAAoB,oBAAoB,CAAA;AAAA,KAC9F;AAAA,EACF;AAEA,EAAA,MAAM,WAAW,aAAA,CAAc,GAAG,CAAA,CAAE,IAAA,GAAO,WAAA,EAAY;AAEvD,EAAA,KAAA,MAAW,WAAW,cAAA,EAAgB;AACpC,IAAA,IAAI,UAAA,CAAW,QAAA,EAAU,OAAO,CAAA,EAAG;AACjC,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,CAAA,EAAG,OAAO,CAAA,wBAAA,CAAA,EAA2B;AAAA,IACvE;AAAA,EACF;AAEA,EAAA,IAAI,eAAe,UAAA,EAAY;AAC7B,IAAA,IAAI,CAAC,SAAS,UAAA,CAAW,QAAQ,KAAK,CAAC,QAAA,CAAS,UAAA,CAAW,MAAM,CAAA,EAAG;AAClE,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,mDAAA,EAAoD;AAAA,IACtF;AACA,IAAA,KAAA,MAAW,WAAW,gBAAA,EAAkB;AACtC,MAAA,IAAI,UAAA,CAAW,QAAA,EAAU,OAAO,CAAA,EAAG;AACjC,QAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,CAAA,EAAG,OAAO,CAAA,0CAAA,CAAA,EAA6C;AAAA,MACzF;AAAA,IACF;AAAA,EACF,CAAA,MAAA,IAAW,eAAe,WAAA,EAAa;AACrC,IAAA,KAAA,MAAW,WAAW,iBAAA,EAAmB;AACvC,MAAA,IAAI,UAAA,CAAW,QAAA,EAAU,OAAO,CAAA,EAAG;AACjC,QAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,CAAA,EAAG,OAAO,CAAA,2CAAA,CAAA,EAA8C;AAAA,MAC1F;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,SAAS,MAAM,UAAA,CAAW,QAAQ,GAAA,EAAK,OAAA,EAAS,eAAe,UAAU,CAAA;AAE/E,IAAA,IAAI,CAAC,SAAS,UAAA,CAAW,QAAQ,KAAK,CAAC,QAAA,CAAS,UAAA,CAAW,MAAM,CAAA,EAAG;AAClE,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,SAAS,EAAC;AAAA,QACV,MAAM,EAAC;AAAA,QACP,WAAW,MAAA,CAAO,QAAA;AAAA,QAClB,eAAe,MAAA,CAAO,QAAA;AAAA,QACtB,SAAA,EAAW;AAAA,OACb;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,SAAA,EAAW,OAAO,IAAA,CAAK,MAAA;AAAA,MACvB,SAAA,EAAW,MAAA,CAAO,IAAA,CAAK,MAAA,IAAU,OAAA;AAAA,MACjC,IAAA,EAAM,UAAA,CAAW,MAAA,CAAO,IAAI;AAAA,KAC9B;AAAA,EACF,SAAS,CAAA,EAAG;AACV,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAA,CAAO,CAAC,CAAA,EAAE;AAAA,EAC5C;AACF;AAEA,eAAsB,SAAA,CACpB,QACA,GAAA,EACkC;AAClC,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,MAAA,CAAO,QAAA,IAAY,QAAQ,CAAA;AAClD,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,MAAA,CAAO,WAAA,IAAe,UAAU,CAAA;AAC1D,EAAA,OAAO,iBAAA,CAAkB,MAAA,EAAQ,GAAA,EAAK,OAAA,EAAS,UAAU,CAAA;AAC3D;AAEA,eAAsB,eAAe,MAAA,EAAmE;AACtG,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,MAAA,CAAO,MAAA,IAAU,YAAY,CAAA;AACvD,EAAA,MAAM,cAAA,GAAyC;AAAA,IAC7C,UAAA,EAAY,kBAAA;AAAA,IACZ,KAAA,EAAO,kBAAA;AAAA,IACP,OAAA,EAAS,kBAAA;AAAA,IACT,KAAA,EAAO,kBAAA;AAAA,IACP,MAAA,EAAQ,yBAAA;AAAA,IACR,MAAA,EAAQ,+CAAA;AAAA,IACR,UAAA,EAAY,kBAAA;AAAA,IACZ,SAAA,EAAW;AAAA,GACb;AACA,EAAA,MAAM,CAAA,GAAI,cAAA,CAAe,UAAU,CAAA,IAAK,kBAAA;AACxC,EAAA,MAAM,SAAS,MAAM,iBAAA,CAAkB,MAAA,EAAQ,CAAA,EAAG,GAAG,UAAU,CAAA;AAC/D,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAA,CAAO,KAAA,EAAM;AAClE,EAAA,MAAM,OAAA,GAAW,MAAA,CAAO,IAAA,GAA0C,CAAC,CAAA,GAC/D,MAAA,CAAO,MAAA,CAAQ,MAAA,CAAO,IAAA,CAAwC,CAAC,CAAE,CAAA,CAAE,CAAC,CAAA,GACpE,IAAA;AACJ,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,OAAA,EAAS,OAAO,OAAO,CAAA;AAAA,IACvB,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,MAAA,EAAQ;AAAA,GACV;AACF;AAEA,eAAsB,WAAA,CACpB,QACA,cAAA,EACkC;AAClC,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,MAAA,IAAU,YAAY,CAAA;AACnD,EAAA,IAAI,WAAW,YAAA,EAAc;AAC3B,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,CAAA,wDAAA,EAA2D,MAAM,CAAA,CAAA,CAAA,EAAI;AAAA,EACvG;AACA,EAAA,IAAI,EAAA;AACJ,EAAA,IAAI;AACF,IAAA,EAAA,GAAKoB,SAAQ,IAAI,CAAA;AAAA,EACnB,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAIpB,yBAAA,CAAkB,UAAA,EAAY,IAAA,EAAM,wBAAwB,CAAA;AAAA,EACxE;AACA,EAAA,MAAM,MAAA,GAAS,IAAI,EAAA,CAAG,MAAA,CAAO,EAAE,gBAAA,EAAkB,kBAAA,CAAmB,MAAM,CAAA,EAAG,CAAA;AAC7E,EAAA,MAAM,OAAO,OAAA,EAAQ;AACrB,EAAA,IAAI;AACF,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,MAAA,CAAO,WAAA,IAAe,QAAQ,CAAA;AACxD,IAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,KAAA;AAAA,MAC7B,CAAA,oFAAA,CAAA;AAAA,MACA,CAAC,UAAU;AAAA,KACb;AACA,IAAA,IAAI,KAAA,GAAQ,SAAA,CAAU,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACrC,IAAA,EAAM,MAAA,CAAO,CAAA,CAAE,UAAU,CAAA;AAAA,MACzB,IAAA,EAAM,MAAA,CAAO,CAAA,CAAE,UAAU,CAAA,CAAE,aAAY,CAAE,QAAA,CAAS,MAAM,CAAA,GAAI,MAAA,GAAS;AAAA,KACvE,CAAE,CAAA;AACF,IAAA,IAAI,gBAAgB,MAAA,EAAQ;AAC1B,MAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,cAAc,CAAA;AACvC,MAAA,KAAA,GAAQ,KAAA,CAAM,OAAO,CAAC,CAAA,KAAM,SAAS,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,IAClD;AACA,IAAA,MAAM,SAAS,EAAC;AAChB,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,KAAA;AAAA,QACxB,CAAA;AAAA,8EAAA,CAAA;AAAA,QAEA,CAAC,UAAA,EAAY,IAAA,CAAK,IAAI;AAAA,OACxB;AACA,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,OAAA,EAAS,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,UAC7B,MAAM,CAAA,CAAE,WAAA;AAAA,UACR,MAAM,CAAA,CAAE,SAAA;AAAA,UACR,QAAA,EAAU,EAAE,WAAA,KAAgB;AAAA,SAC9B,CAAE,CAAA;AAAA,QACF,SAAA,EAAW;AAAA,OACZ,CAAA;AAAA,IACH;AACA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,MAAA,EAAQ,UAAA;AAAA,MACR,MAAA;AAAA,MACA,aAAa,MAAA,CAAO,MAAA;AAAA,MACpB,YAAY,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI;AAAA,KACrC;AAAA,EACF,CAAA,SAAE;AACA,IAAA,MAAM,OAAO,GAAA,EAAI;AAAA,EACnB;AACF;AAEA,eAAsB,aAAA,CACpB,QACA,cAAA,EACiB;AACjB,EAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,MAAA,EAAQ,cAAc,CAAA;AACvD,EAAA,MAAM,aAA6C,EAAC;AACpD,EAAA,KAAA,MAAW,KAAA,IAAU,MAAA,CAAO,MAAA,IAAyD,EAAC,EAAG;AACvF,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,IAAQ,OAAA;AAC3B,IAAA,KAAA,MAAW,CAAA,IAAM,KAAA,CAAM,OAAA,IAA8C,EAAC,EAAG;AACvE,MAAA,UAAA,CAAW,IAAA,CAAK;AAAA,QACd,OAAO,KAAA,CAAM,IAAA;AAAA,QACb,UAAA,EAAY,IAAA;AAAA,QACZ,QAAQ,CAAA,CAAE,IAAA;AAAA,QACV,IAAA,EAAM,MAAA,CAAO,CAAA,CAAE,IAAI,EAAE,WAAA,EAAY;AAAA,QACjC,EAAA,EAAI,EAAE,EAAA,IAAM,KAAA;AAAA,QACZ,EAAA,EAAI,EAAE,EAAA,IAAM,EAAA;AAAA,QACZ,MAAM,KAAA,CAAM;AAAA,OACb,CAAA;AAAA,IACH;AAAA,EACF;AACA,EAAA,OAAO,WAAW,UAAU,CAAA;AAC9B;AA/WA,IAGMoB,UAEO,QAAA,EACP,eAAA,EACA,kBAEA,cAAA,EACA,gBAAA,EACA,mBACA,oBAAA,EAGA,YAAA;AAfN,IAAA,OAAA,GAAA,KAAA,CAAA;AAAA,EAAA,2BAAA,GAAA;AACA,IAAA,WAAA,EAAA;AAEA,IAAMA,QAAAA,GAAUC,sBAAA,CAAc,2PAAe,CAAA;AAEtC,IAAM,QAAA,GAAW,GAAA;AACxB,IAAM,eAAA,GAAkB,EAAA;AACxB,IAAM,gBAAA,GAAmB,GAAA;AAEzB,IAAM,cAAA,GAAiB,CAAC,OAAA,EAAS,QAAQ,CAAA;AACzC,IAAM,gBAAA,GAAmB,CAAC,QAAA,EAAU,QAAA,EAAU,UAAU,MAAA,EAAQ,OAAA,EAAS,UAAU,UAAU,CAAA;AAC7F,IAAM,iBAAA,GAAoB,CAAC,QAAA,EAAU,MAAA,EAAQ,UAAU,CAAA;AACvD,IAAM,oBAAA,GAAuB,CAAC,UAAA,EAAY,WAAA,EAAa,MAAM,CAAA;AAG7D,IAAM,YAAA,GAAe,yEAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACDrB,SAASC,YAAW,IAAA,EAA4B;AAC9C,EAAA,IAAI,IAAI,IAAA,KAAS,CAAA;AACjB,EAAA,OAAO,MAAM;AACX,IAAA,CAAA,IAAK,CAAA;AACL,IAAA,CAAA,GAAK,IAAI,UAAA,GAAc,CAAA;AACvB,IAAA,IAAI,IAAI,IAAA,CAAK,IAAA,CAAK,IAAK,CAAA,KAAM,EAAA,EAAK,IAAI,CAAC,CAAA;AACvC,IAAA,CAAA,GAAK,CAAA,GAAI,KAAK,IAAA,CAAK,CAAA,GAAK,MAAM,CAAA,EAAI,EAAA,GAAK,CAAC,CAAA,GAAK,CAAA;AAC7C,IAAA,OAAA,CAAA,CAAS,CAAA,GAAK,CAAA,KAAM,EAAA,MAAS,CAAA,IAAK,UAAA;AAAA,EACpC,CAAA;AACF;AAUO,SAAS,cAAA,CACd,CAAA,EACA,OAAA,EACA,IAAA,GAAgE,EAAC,EACpB;AAC7C,EAAA,MAAM,SAAA,GAAY,KAAK,SAAA,IAAa,oBAAA;AACpC,EAAA,MAAM,OAAA,GAAU,KAAK,OAAA,IAAW,kBAAA;AAChC,EAAA,MAAM,IAAA,GAAO,KAAK,IAAA,IAAQ,YAAA;AAC1B,EAAA,MAAM,cAA2D,EAAC;AAClE,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,SAAA,EAAW,KAAA,EAAA,EAAS;AAC9C,IAAA,MAAM,UAAA,GAAa,KAAO,KAAA,GAAQ,CAAA,CAAA;AAClC,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,CAAA,EAAG,EAAE,UAAA,EAAY,KAAKA,WAAAA,CAAW,IAAA,GAAO,KAAK,CAAA,EAAG,CAAA;AAC3E,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAsB;AAC1C,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AACpD,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,GAAA,CAAI,GAAG,KAAK,EAAC;AAClC,MAAA,IAAA,CAAK,KAAK,IAAI,CAAA;AACd,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,IAAI,CAAA;AAAA,IACvB;AACA,IAAA,MAAM,IAAA,GAAO,CAAC,GAAG,OAAA,CAAQ,QAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,OAAO,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,CAAC,GAAG,CAAC,CAAA,CAAE,IAAA,EAAM,CAAA;AAC9F,IAAA,MAAM,MAAM,IAAA,CAAK,SAAA,CAAU,CAAC,GAAG,IAAI,EAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,GAAG,CAAC,CAAA,CAAE,MAAM,CAAA,CAAE,MAAM,CAAA;AACrE,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AACnB,IAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,IAAA,KAAA,MAAW,WAAW,IAAA,EAAM,WAAA,CAAY,KAAK,EAAE,KAAA,EAAO,SAAS,CAAA;AAAA,EACjE;AACA,EAAA,OAAO,WAAA;AACT;AAEA,eAAe,WAAA,GAA2E;AACxF,EAAA,MAAM,MAAM,MAAM,YAAA;AAAA,IAChB,gCAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,EAAA,GAAK,IAAI,OAAA,IAAW,GAAA;AAC1B,EAAA,OAAO,EAAA;AACT;AAEA,eAAe,iBAAiB,IAAA,EAAqE;AACnG,EAAA,MAAM,QAAA,GAAA,CAAY,MAAM,IAAA,CAAK,KAAA,CAAM,wCAAwC,CAAA,EAAG,IAAA;AAC9E,EAAA,IAAI,QAAA,CAAS,MAAA,GAAS,kBAAA,EAAoB,OAAO,EAAC;AAClD,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAoB;AAC1C,EAAA,MAAM,YAAsB,EAAC;AAC7B,EAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AACzB,IAAA,SAAA,CAAU,GAAA,CAAI,MAAA,CAAO,CAAA,CAAE,EAAE,GAAG,CAAC,CAAA;AAC7B,IAAA,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,CAAA,CAAE,EAAE,CAAC,CAAA;AAAA,EAC7B,CAAC,CAAA;AACD,EAAA,MAAM,aAAA,GAAA,CACJ,MAAM,IAAA,CAAK,KAAA,CAAM,oFAAoF,CAAA,EACrG,IAAA;AAEF,EAAA,MAAM,aAAa,MAAM,YAAA;AAAA,IACvB,YAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,QAAQ,UAAA,CAAW,OAAA;AACzB,EAAA,IAAI,CAAC,KAAA,EAAO,MAAM,IAAI,MAAM,uCAAuC,CAAA;AACnE,EAAA,MAAM,OAAA,GAAU,MAAM,WAAA,EAAY;AAElC,EAAA,MAAM,IAAI,IAAI,KAAA,CAAM,EAAE,IAAA,EAAM,cAAc,CAAA;AAC1C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,MAAA,EAAQ,KAAK,CAAA,CAAE,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAC,CAAA;AAC7D,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,KAAA,MAAW,OAAO,aAAA,EAAe;AAC/B,IAAA,MAAM,MAAM,SAAA,CAAU,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,gBAAgB,CAAC,CAAA;AACtD,IAAA,MAAM,MAAM,SAAA,CAAU,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,gBAAgB,CAAC,CAAA;AACtD,IAAA,IAAI,GAAA,IAAO,IAAA,IAAQ,GAAA,IAAO,IAAA,IAAQ,QAAQ,GAAA,EAAK;AAC7C,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,MAAM,CAAA,GAAI,OAAO,GAAG,CAAA;AACpB,MAAA,MAAM,CAAA,GAAI,OAAO,GAAG,CAAA;AACpB,MAAA,IAAI,CAAA,CAAE,OAAA,CAAQ,CAAA,EAAG,CAAC,CAAA,EAAG;AACnB,QAAA,MAAM,CAAA,GAAI,OAAO,CAAA,CAAE,gBAAA,CAAiB,GAAG,CAAA,EAAG,QAAQ,KAAK,CAAC,CAAA;AACxD,QAAA,CAAA,CAAE,gBAAA,CAAiB,CAAA,EAAG,CAAA,EAAG,QAAA,EAAU,IAAI,CAAC,CAAA;AAAA,MAC1C,CAAA,MAAO;AACL,QAAA,CAAA,CAAE,QAAQ,CAAA,EAAG,CAAA,EAAG,EAAE,MAAA,EAAQ,GAAG,CAAA;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AACA,EAAA,IAAI,CAAC,OAAA,EAAS,OAAO,EAAC;AACtB,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,CAAA,EAAY,OAAO,CAAA;AACrD,EAAA,OAAO,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IAC5B,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,UAAA,EAAY,CAAA,CAAE,OAAA,CAAQ,GAAA,CAAI,CAAC,QAAQ,SAAA,CAAU,MAAA,CAAO,GAAG,CAAC,CAAE;AAAA,GAC5D,CAAE,CAAA;AACJ;AAEA,eAAe,oBAAA,CACb,SACA,MAAA,EAC+B;AAC/B,EAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,IAAU,CAAC,MAAA,CAAO,KAAA,CAAM,aAAA,EAAe,OAAO,OAAA,CAAQ,GAAA,CAAI,MAAM,IAAI,CAAA;AACjF,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,CAAC,IAAI,GAAA,KAAQ;AACtC,IAAA,MAAM,cAAe,EAAA,CAAG,QAAA,IAA+C,EAAC,EAAG,KAAA,CAAM,GAAG,oBAAoB,CAAA;AACxG,IAAA,MAAM,WAAA,GAAc,UAAA,CAAW,GAAA,CAAI,CAAC,MAAM,CAAA,IAAA,EAAO,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,CAAA,CAAE,IAAI,CAAA,YAAA,EAAe,CAAA,CAAE,SAAS,CAAA,EAAA,CAAI,CAAA;AAChG,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,WAAA,CAAY,UAAA,CAAW,IAAI,CAAC,CAAA,KAAM,CAAC,MAAA,CAAO,EAAE,EAAE,CAAA,EAAG,CAAA,CAAE,IAAI,CAAC,CAAC,CAAA;AACjF,IAAA,MAAM,QAAA,GAAA,CAAa,EAAA,CAAG,aAAA,IAAoD,EAAC,EAAG,GAAA;AAAA,MAC5E,CAAC,MACC,CAAA,IAAA,EAAO,QAAA,CAAS,OAAO,CAAA,CAAE,gBAAgB,CAAC,CAAA,IAAK,GAAG,OAAO,CAAA,CAAE,KAAK,OAAO,QAAA,CAAS,MAAA,CAAO,EAAE,gBAAgB,CAAC,KAAK,GAAG,CAAA;AAAA,KACtH;AACA,IAAA,OACE,aAAa,GAAG,CAAA;AAAA,UAAA,EAAgB,WAAW,MAAM,CAAA;AAAA,CAAA,GACjD,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA,GACrB;AAAA,eAAA,EAAoB,SAAS,MAAM,CAAA;AAAA,CAAA,IAClC,QAAA,CAAS,MAAA,GAAS,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,GAAI,QAAA,CAAA;AAAA,EAE7C,CAAC,CAAA;AACD,EAAA,MAAM,MAAA,GACJ,sDAAA,GACA,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,GAClB,uIAAA;AACF,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,OAAA,EAAAC,QAAAA,EAAQ,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,QAAA,EAAA,EAAA,WAAA,CAAA,CAAA;AAC1B,IAAA,MAAM,GAAA,GAAM,MAAMA,QAAAA,CAAQ,MAAA,CAAO,MAAM,aAAA,EAAe;AAAA,MACpD,MAAA,EAAQ,cAAA;AAAA,MACR,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,GAAM,GAAA,CAA0B,IAAA,IAAQ,MAAA,CAAO,GAAG,CAAA;AACxF,IAAA,IAAI,YAAuB,EAAC;AAC5B,IAAA,IAAI;AACF,MAAA,SAAA,GAAY,KAAK,KAAA,CAAMlB,qBAAAA,CAAW,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA;AAAA,IAChD,CAAA,CAAA,MAAQ;AACN,MAAA,SAAA,GAAY,EAAC;AAAA,IACf;AACA,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,cAAe,EAAC;AAC5C,IAAA,OAAO,UAAU,MAAA,GAAS,OAAA,CAAQ,MAAA,EAAQ,SAAA,CAAU,KAAK,IAAI,CAAA;AAC7D,IAAA,OAAO,UAAU,KAAA,CAAM,CAAA,EAAG,OAAA,CAAQ,MAAM,EAAE,GAAA,CAAI,CAAC,CAAA,KAAO,OAAO,MAAM,QAAA,IAAY,CAAA,CAAE,IAAA,EAAK,GAAI,IAAI,IAAK,CAAA;AAAA,EACrG,SAAS,GAAA,EAAK;AACZ,IAAA,OAAA,CAAQ,IAAA,CAAK,mCAAmC,GAAG,CAAA;AACnD,IAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,MAAM,IAAI,CAAA;AAAA,EAC/B;AACF;AAEA,eAAsB,kBAAkB,IAAA,EAKH;AACnC,EAAA,MAAMQ,SAAQ,EAAE,oBAAA,EAAsB,GAAG,sBAAA,EAAwB,CAAA,EAAG,qBAAqB,CAAA,EAAE;AAC3F,EAAA,MAAM,WAAA,GAAc,MAAM,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAA;AACpD,EAAAA,MAAAA,CAAM,uBAAuB,WAAA,CAAY,MAAA;AACzC,EAAA,MAAM,UAA0C,EAAC;AACjD,EAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,IAAA,MAAM,YAAY,IAAA,CAAK,UAAA;AACvB,IAAA,IAAI,SAAA,CAAU,SAAS,kBAAA,EAAoB;AAC3C,IAAA,MAAM,QAAA,GAAA,CACJ,MAAM,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA,gEAAA,CAAA,EAAoE,CAAC,SAAS,CAAC,CAAA,EACrG,IAAA;AACF,IAAA,IAAI,QAAA,CAAS,SAAS,kBAAA,EAAoB;AAC1C,IAAA,MAAM,IAAA,GAAA,CACJ,MAAM,IAAA,CAAK,IAAA,CAAK,KAAA;AAAA,MACd,CAAA;AAAA;AAAA,iBAAA,CAAA;AAAA,MAGA,CAAC,SAAS;AAAA,KACZ,EACA,IAAA;AACF,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,QAAA;AAAA,MACA,UAAA,EAAY,SAAA;AAAA,MACZ,cAAc,SAAA,CAAU,MAAA;AAAA,MACxB,WAAW,IAAA,CAAK,MAAA;AAAA,MAChB,aAAA,EAAe,IAAA;AAAA,MACf,KAAA,EAAO,KAAK,KAAA,IAAS;AAAA,KACtB,CAAA;AAAA,EACH;AACA,EAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,EAAQ,OAAOA,MAAAA;AAC5B,EAAA,MAAM,SAAA,GAAY,MAAM,oBAAA,CAAqB,OAAA,EAAS,KAAK,MAAM,CAAA;AACjE,EAAA,MAAM,UAAA,GAAqC,SAAA,CAAU,GAAA,CAAI,MAAM,IAAI,CAAA;AACnE,EAAA,MAAM,UAAU,SAAA,CACb,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,CAAC,CAAA,EAAG,CAAC,CAAU,CAAA,CAC7B,OAAO,CAAC,CAAA,KAAsC,QAAQ,CAAA,CAAE,CAAC,CAAC,CAAC,CAAA;AAC9D,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,QAAA,CAAS,KAAA;AAAA,QACjC,QAAQ,GAAA,CAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;AAAA,QACxB,EAAE,MAAM,UAAA;AAAW,OACrB;AACA,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,GAC/B,OAAO,CAAC,CAAA,GACP,MAAA,CAAoC,OAAA,IAAW,EAAC;AACtD,MAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAC,CAAC,GAAG,GAAA,KAAQ;AAC5B,QAAA,UAAA,CAAW,CAAC,CAAA,GAAI,OAAA,CAAQ,GAAG,CAAA,GAAI,CAAC,GAAG,OAAA,CAAQ,GAAG,CAAE,CAAA,GAAI,IAAA;AAAA,MACtD,CAAC,CAAA;AAAA,IACH,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,IAAA,CAAK,OAAO,SAAA,CAAU,IAAA,CAAK,OAAO,GAAA,EAAK,EAAE,KAAA,EAAO,qBAAA,EAAuB,CAAA;AAAA,WACtE,OAAA,CAAQ,IAAA,CAAK,6BAAA,EAA+B,GAAG,CAAA;AAAA,IACtD;AAAA,EACF;AAEA,EAAA,MAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,CAAA,sCAAA,CAAwC,CAAA;AAC9D,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,IAAA,MAAM,EAAA,GAAK,QAAQ,CAAC,CAAA;AACpB,IAAA,MAAM,SAAA,GAAY,WAAW,CAAC,CAAA;AAC9B,IAAA,MAAM,KAAK,IAAA,CAAK,KAAA;AAAA,MACd,CAAA;AAAA;AAAA,yDAAA,CAAA;AAAA,MAGA;AAAA,QACEW,iBAAAA,EAAW;AAAA,QACX,EAAA,CAAG,KAAA;AAAA,QACH,KAAK,SAAA,CAAW,EAAA,CAAG,UAAA,CAAwB,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,QACtD,EAAA,CAAG,YAAA;AAAA,QACH,EAAA,CAAG,SAAA;AAAA,QACH,UAAU,CAAC,CAAA;AAAA,QACX,YAAY,CAAA,CAAA,EAAI,SAAA,CAAU,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA,GAAM;AAAA;AAC3C,KACF;AACA,IAAA,IAAI,EAAA,CAAG,KAAA,KAAU,CAAA,EAAG,OAAA,IAAW,CAAA;AAAA,EACjC;AACA,EAAAX,MAAAA,CAAM,yBAAyB,OAAA,CAAQ,MAAA;AACvC,EAAAA,OAAM,mBAAA,GAAsB,OAAA;AAC5B,EAAA,OAAOA,MAAAA;AACT;AAxPA,IAQa,oBAAA,EACA,kBAAA,EACA,oBAAA,EACA,YAAA,EACP,cAAA;AAZN,IAAA,gBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,0BAAA,GAAA;AAIA,IAAA,WAAA,EAAA;AACA,IAAA,UAAA,EAAA;AAGO,IAAM,oBAAA,GAAuB,CAAA;AAC7B,IAAM,kBAAA,GAAqB,CAAA;AAC3B,IAAM,oBAAA,GAAuB,EAAA;AAC7B,IAAM,YAAA,GAAe,EAAA;AAC5B,IAAM,cAAA,GAAiB,gDAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACoBhB,SAAS,oBAAoB,IAAA,EAAsB;AACxD,EAAA,OAAA,CAAQ,IAAA,IAAQ,IAAI,WAAA,EAAY,CAAE,MAAK,CAAE,OAAA,CAAQ,SAAS,GAAG,CAAA;AAC/D;AAEA,SAAS,uBAAA,CAAwB,CAAA,EAAW,CAAA,EAAW,MAAA,GAAS,CAAA,EAAY;AAC1E,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,CAAA,CAAE,KAAA,CAAM,KAAK,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,IAAU,MAAM,CAAC,CAAA;AACxE,EAAA,MAAM,OAAA,GAAU,CAAA,CAAE,KAAA,CAAM,KAAK,CAAA,CAAE,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,IAAU,MAAM,CAAA;AAC/D,EAAA,OAAO,QAAQ,IAAA,CAAK,CAAC,MAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAC,CAAA;AAC3C;AAEA,SAAS,YAAY,QAAA,EAA0B;AAC7C,EAAA,OAAO,CAAA;;AAAA;AAAA,EAGP,QAAQ;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAwBV;AAEA,SAASY,cAAAA,CAAc,MAAc,QAAA,EAAuC;AAC1E,EAAA,MAAM,QAAA,GAAW,KAAK,IAAA,EAAK;AAC3B,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAClC,IAAA,IAAI,QAAA,KAAa,YAAY,MAAA,IAAU,OAAO,WAAW,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA;AACxF,MAAA,OAAO,MAAA;AACT,IAAA,IAAI,aAAa,OAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,MAAM,GAAG;AAAO,EAC5D,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAMpB,qBAAAA,CAAW,QAAQ,CAAC,CAAA;AAChD,EAAA,OAAO,QAAA;AACT;AAIA,eAAsB,aAAA,CACpB,EAAA,EACA,KAAA,EACA,cAAA,EACA,UAAA,EACyC;AACzC,EAAA,MAAM,KAAA,GAAQ,MAAM,EAAA,CAAG,KAAA,CAAM,CAAA,wEAAA,CAAA,EAA4E;AAAA,IACvG;AAAA,GACD,CAAA;AACD,EAAA,IAAI,MAAM,IAAA,CAAK,CAAC,GAAG,OAAO,KAAA,CAAM,KAAK,CAAC,CAAA;AAEtC,EAAA,MAAM,OAAA,GAAU,MAAM,EAAA,CAAG,KAAA;AAAA,IACvB,CAAA;AAAA;AAAA,0DAAA,CAAA;AAAA,IAGA,CAAC,cAAc;AAAA,GACjB;AACA,EAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG;AACnB,IAAA,MAAM,GAAA,GAAM,MAAM,EAAA,CAAG,KAAA,CAAM,CAAA,mDAAA,CAAA,EAAuD,CAAC,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,CAAE,EAAE,CAAC,CAAA;AACtG,IAAA,OAAO,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA;AAAA,EACxB;AAEA,EAAA,MAAM,KAAA,GAAQ,MAAM,EAAA,CAAG,KAAA;AAAA,IACrB,CAAA;AAAA;AAAA,0DAAA,CAAA;AAAA,IAGA,CAAC,gBAAgB,UAAU;AAAA,GAC7B;AACA,EAAA,KAAA,MAAW,GAAA,IAAO,MAAM,IAAA,EAAM;AAC5B,IAAA,IAAI,wBAAwB,cAAA,EAAgB,MAAA,CAAO,GAAA,CAAI,eAAe,CAAC,CAAA,EAAG;AACxE,MAAA,MAAM,IAAA,GAAO,MAAM,EAAA,CAAG,KAAA,CAAM,uDAAuD,CAAC,GAAA,CAAI,EAAE,CAAC,CAAA;AAC3F,MAAA,OAAO,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA;AAAA,IACzB;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEA,eAAe,eAAA,CACb,UACA,MAAA,EAKC;AACD,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,OAAO,KAAA,CAAM,aAAA;AACzB,IAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAE,QAAA,EAAU,EAAC,EAAG,aAAA,EAAe,EAAC,EAAG,MAAA,EAAQ,EAAC,EAAE;AAC/D,IAAA,MAAM,EAAE,OAAA,EAAAkB,QAAAA,EAAQ,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,QAAA,EAAA,EAAA,WAAA,CAAA,CAAA;AAC1B,IAAA,MAAM,GAAA,GAAM,MAAMA,QAAAA,CAAQ,GAAA,EAAK;AAAA,MAC7B,MAAA,EAAQ,iBAAA;AAAA,MACR,IAAA,EAAM,YAAY,QAAQ,CAAA;AAAA,MAC1B,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,GAAM,GAAA,CAA0B,IAAA,IAAQ,MAAA,CAAO,GAAG,CAAA;AACxF,IAAA,MAAM,MAAA,GAAA,CAAU,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,GAAI,IAAI,CAAC,CAAA,GAAK,GAAA,CAA4C,MAAA,KAAW,EAAC;AACvG,IAAA,IAAI,SAAkC,EAAC;AACvC,IAAA,IAAI;AACF,MAAA,MAAA,GAAUE,eAAc,MAAA,CAAO,GAAG,CAAA,EAAG,QAAQ,KAAiC,EAAC;AAAA,IACjF,CAAA,CAAA,MAAQ;AACN,MAAA,MAAA,GAAS,EAAC;AAAA,IACZ;AACA,IAAA,MAAM,QAAA,GAAA,CAAa,MAAA,CAAO,QAAA,IAA0B,EAAC,EAAG,MAAA;AAAA,MAAO,CAAC,CAAA,KAC9D,OAAA,CAAQ,CAAA,IAAK,OAAO,MAAM,QAAA,IAAa,CAAA,CAAyB,IAAA,IAAS,CAAA,CAAyB,IAAI;AAAA,KACxG;AACA,IAAA,MAAM,aAAA,GAAA,CAAkB,MAAA,CAAO,aAAA,IAA+B,EAAC,EAAG,MAAA;AAAA,MAChE,CAAC,CAAA,KACC,OAAA;AAAA,QACE,KACE,OAAO,CAAA,KAAM,QAAA,IACZ,CAAA,CAA2B,UAC3B,CAAA,CAA2B;AAAA;AAChC,KACJ;AACA,IAAA,OAAO,EAAE,QAAA,EAAU,aAAA,EAAe,MAAA,EAAyC;AAAA,EAC7E,SAAS,GAAA,EAAK;AACZ,IAAA,OAAA,CAAQ,KAAA,CAAM,sCAAsC,GAAG,CAAA;AACvD,IAAA,OAAO,EAAE,UAAU,EAAC,EAAG,eAAe,EAAC,EAAG,MAAA,EAAQ,EAAC,EAAE;AAAA,EACvD;AACF;AAEA,eAAe,kBAAA,CAAmB,MAAY,UAAA,EAA6D;AACzG,EAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,KAAA;AAAA,IACxB,CAAA,yGAAA,CAAA;AAAA,IACA,CAAC,UAAU;AAAA,GACb;AACA,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IAC7B,IAAI,CAAA,CAAE,EAAA;AAAA,IACN,IAAA,EAAM,EAAE,IAAA,IAAQ,EAAA;AAAA,IAChB,YAAY,MAAA,CAAO,CAAA,CAAE,IAAA,IAAQ,EAAE,EAAE,WAAA,EAAY;AAAA,IAC7C,GAAA,EAAK,EAAE,GAAA,IAAO,CAAA;AAAA,IACd,WAAW,CAAA,CAAE,SAAA;AAAA,IACb,WAAA,EACG,CAAA,CAAE,SAAA,EAA+C,WAAA,IAClD,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,CAAA,CAAE,IAAA,IAAQ,EAAE,CAAA,CAAE,MAAA,GAAS,CAAC;AAAA,GAC9C,CAAE,CAAA;AACJ;AAEA,eAAe,iBAAA,CACb,IAAA,EACA,UAAA,EACA,SAAA,EAC8F;AAC9F,EAAA,MAAMZ,SAAQ,EAAE,gBAAA,EAAkB,GAAG,cAAA,EAAgB,CAAA,EAAG,uBAAuB,CAAA,EAAE;AACjF,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAqC;AACxD,EAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,EAAQ;AAClC,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,CAAO,MAAM,OAAO,CAAA;AAC1B,IAAA,KAAA,MAAW,UAAA,IAAc,UAAU,QAAA,EAAU;AAC3C,MAAA,MAAM,UAAA,GAAa,mBAAA,CAAoB,MAAA,CAAO,UAAA,CAAW,IAAI,CAAC,CAAA;AAC9D,MAAA,IAAI,CAAC,UAAA,EAAY;AACjB,MAAA,MAAM,UAAA,GAAa,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AACzC,MAAA,IAAI,MAAA,GAAS,MAAM,aAAA,CAAc,MAAA,EAAQ,OAAO,UAAA,CAAW,IAAI,CAAA,EAAG,UAAA,EAAY,UAAU,CAAA;AACxF,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,MAAA,CAAO,KAAA;AAAA,UACX,CAAA;AAAA;AAAA,wBAAA,CAAA;AAAA,UAGA,CAAC,MAAA,CAAO,EAAA,EAAI,UAAA,CAAW,IAAI;AAAA,SAC7B;AACA,QAAA,MAAA,GAAA,CAAU,MAAM,MAAA,CAAO,KAAA,CAAM,CAAA,mDAAA,CAAA,EAAuD,CAAC,OAAO,EAAE,CAAC,CAAA,EAC5F,IAAA,CAAK,CAAC,CAAA;AAAA,MACX,CAAA,MAAO;AACL,QAAA,MAAM,KAAKW,iBAAAA,EAAW;AACtB,QAAA,MAAM,MAAA,CAAO,KAAA;AAAA,UACX,CAAA;AAAA,qCAAA,CAAA;AAAA,UAEA,CAAC,EAAA,EAAI,UAAA,CAAW,IAAA,EAAM,YAAY,UAAU;AAAA,SAC9C;AACA,QAAA,MAAA,GAAA,CAAU,MAAM,OAAO,KAAA,CAAM,CAAA,mDAAA,CAAA,EAAuD,CAAC,EAAE,CAAC,CAAA,EAAG,IAAA,CAAK,CAAC,CAAA;AACjG,QAAAX,OAAM,gBAAA,IAAoB,CAAA;AAAA,MAC5B;AACA,MAAA,MAAA,CAAO,GAAA,CAAI,YAAY,MAAO,CAAA;AAC9B,MAAA,MAAA,CAAO,GAAA,CAAI,MAAA,CAAO,MAAA,CAAQ,eAAe,GAAG,MAAO,CAAA;AACnD,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,UAAA,CAAW,IAAI,EAAE,WAAA,EAAY;AACtD,MAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,QAAA,IAAI,aAAa,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAAE,QAAA,CAAS,SAAS,CAAA,EAAG;AAC5D,UAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,KAAA;AAAA,YAC1B,CAAA,kFAAA,CAAA;AAAA,YACA,CAAC,IAAA,CAAK,EAAA,EAAI,MAAA,CAAQ,EAAE;AAAA,WACtB;AACA,UAAA,IAAI,CAAC,MAAA,CAAO,IAAA,CAAK,MAAA,EAAQ;AACvB,YAAA,MAAM,MAAA,CAAO,KAAA;AAAA,cACX,CAAA,+EAAA,CAAA;AAAA,cACA,CAAC,IAAA,CAAK,EAAA,EAAI,MAAA,CAAQ,EAAE;AAAA,aACtB;AACA,YAAAA,OAAM,cAAA,IAAkB,CAAA;AAAA,UAC1B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,IAAA,KAAA,MAAW,GAAA,IAAO,UAAU,aAAA,EAAe;AACzC,MAAA,MAAM,aAAa,mBAAA,CAAoB,MAAA,CAAO,GAAA,CAAI,MAAA,IAAU,EAAE,CAAC,CAAA;AAC/D,MAAA,MAAM,aAAa,mBAAA,CAAoB,MAAA,CAAO,GAAA,CAAI,MAAA,IAAU,EAAE,CAAC,CAAA;AAC/D,MAAA,MAAM,WAAW,MAAA,CAAO,GAAA,CAAI,QAAA,IAAY,EAAE,EAAE,WAAA,EAAY;AACxD,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,KAAA,IAAS,EAAE,CAAA;AACpC,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,GAAA,CAAI,QAAA,IAAY,EAAE,CAAA;AAC1C,MAAA,IAAI,CAAC,uBAAA,CAAwB,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC5C,MAAA,IAAI,GAAA,GAAM,MAAA,CAAO,GAAA,CAAI,UAAU,CAAA;AAC/B,MAAA,IAAI,GAAA,GAAM,MAAA,CAAO,GAAA,CAAI,UAAU,CAAA;AAC/B,MAAA,IAAI,CAAC,GAAA,EAAK;AACR,QAAA,GAAA,GAAA,CACE,MAAM,OAAO,KAAA,CAAM,CAAA,gEAAA,CAAA,EAAoE,CAAC,UAAU,CAAC,CAAA,EACnG,IAAA,CAAK,CAAC,CAAA;AAAA,MACV;AACA,MAAA,IAAI,CAAC,GAAA,EAAK;AACR,QAAA,GAAA,GAAA,CACE,MAAM,OAAO,KAAA,CAAM,CAAA,gEAAA,CAAA,EAAoE,CAAC,UAAU,CAAC,CAAA,EACnG,IAAA,CAAK,CAAC,CAAA;AAAA,MACV;AACA,MAAA,IAAI,CAAC,GAAA,IAAO,CAAC,GAAA,EAAK;AAClB,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,KAAA;AAAA,QAC1B,CAAA;AAAA,+FAAA,CAAA;AAAA,QAEA,CAAC,GAAA,CAAI,EAAA,EAAI,GAAA,CAAI,EAAA,EAAI,UAAU,KAAK;AAAA,OAClC;AACA,MAAA,IAAI,CAAC,MAAA,CAAO,IAAA,CAAK,MAAA,EAAQ;AACvB,QAAA,MAAM,MAAA,CAAO,KAAA;AAAA,UACX,CAAA;AAAA;AAAA,0CAAA,CAAA;AAAA,UAGA,CAACW,iBAAAA,EAAW,EAAG,GAAA,CAAI,EAAA,EAAI,GAAA,CAAI,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC;AAAA,SACxE;AACA,QAAAX,OAAM,qBAAA,IAAyB,CAAA;AAAA,MACjC;AAAA,IACF;AACA,IAAA,MAAM,MAAA,CAAO,MAAM,QAAQ,CAAA;AAAA,EAC7B,SAAS,CAAA,EAAG;AACV,IAAA,MAAM,MAAA,CAAO,MAAM,UAAU,CAAA;AAC7B,IAAA,MAAM,CAAA;AAAA,EACR,CAAA,SAAE;AACA,IAAA,MAAA,CAAO,OAAA,EAAQ;AAAA,EACjB;AACA,EAAA,OAAOA,MAAAA;AACT;AAEA,eAAe,WAAA,CACb,IAAA,EACA,UAAA,EACA,UAAA,EACA,UAAA,EACe;AACf,EAAA,MAAM,SAAA,GAAY,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACvC,EAAA,EAAI,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA;AAAA,IACf,WAAA,EAAa,OAAO,UAAU,CAAA;AAAA,IAC9B,WAAW,CAAA,CAAE,SAAA;AAAA,IACb,cAAc,MAAA,CAAO,CAAA,CAAE,IAAI,CAAA,CAAE,KAAA,CAAM,GAAG,GAAG,CAAA;AAAA,IACzC,UAAU,CAAA,CAAE,GAAA;AAAA,IACZ,aAAa,CAAA,CAAE;AAAA,GACjB,CAAE,CAAA;AACF,EAAA,IAAI;AACF,IAAA,MAAM,WAAW,OAAA,EAAQ;AACzB,IAAA,MAAM,QAAA,GAAA,CAAY,MAAM,IAAA,CAAK,KAAA,CAAM,uCAAuC,CAAA,EAAG,IAAA;AAC7E,IAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,QAAA,CAAS,IAAI,CAAC,CAAA,KAAM,CAAC,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA,EAAG,CAAC,CAAC,CAAC,CAAA;AACjE,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACtC,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,iBAAiB,CAAA,CAAE,eAAA;AAAA,MACnB,aAAa,CAAA,CAAE;AAAA,KACjB,CAAE,CAAA;AACF,IAAA,MAAM,MAAM,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AACtC,IAAA,MAAM,QAAQ,GAAA,CAAI,MAAA,GAAA,CAEZ,MAAM,IAAA,CAAK,MAAM,CAAA,4EAAA,CAAA,EAAgF;AAAA,MAC/F;AAAA,KACD,CAAA,EACD,IAAA,GACF,EAAC;AACL,IAAA,MAAM,WAAA,GAAc,KAAA,CACjB,MAAA,CAAO,CAAC,MAAM,UAAA,CAAW,GAAA,CAAI,MAAA,CAAO,CAAA,CAAE,SAAS,CAAC,CAAC,CAAA,CACjD,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACX,QAAA,EAAU,MAAA,CAAO,CAAA,CAAE,QAAQ,CAAA;AAAA,MAC3B,aAAa,UAAA,CAAW,GAAA,CAAI,OAAO,CAAA,CAAE,SAAS,CAAC,CAAA,CAAG;AAAA,KACpD,CAAE,CAAA;AACJ,IAAA,MAAM,IAAA,GAAA,CAAQ,MAAM,IAAA,CAAK,KAAA,CAAM,mDAAmD,CAAA,EAAG,IAAA;AACrF,IAAA,MAAM,UAAU,EAAC;AACjB,IAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,MAAA,MAAM,MAAM,UAAA,CAAW,GAAA,CAAI,MAAA,CAAO,CAAA,CAAE,gBAAgB,CAAC,CAAA;AACrD,MAAA,MAAM,MAAM,UAAA,CAAW,GAAA,CAAI,MAAA,CAAO,CAAA,CAAE,gBAAgB,CAAC,CAAA;AACrD,MAAA,IAAI,OAAO,GAAA,EAAK;AACd,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,aAAa,GAAA,CAAI,eAAA;AAAA,UACjB,aAAa,GAAA,CAAI,eAAA;AAAA,UACjB,UAAU,CAAA,CAAE,QAAA;AAAA,UACZ,OAAO,CAAA,CAAE,KAAA;AAAA,UACT,UAAU,CAAA,CAAE,QAAA;AAAA,UACZ,UAAU,CAAA,CAAE,QAAA,GAAW,MAAA,CAAO,CAAA,CAAE,QAAQ,CAAA,GAAI;AAAA,SAC7C,CAAA;AAAA,MACH;AAAA,IACF;AACA,IAAA,MAAM,UAAA,CAAW,kBAAkB,SAAS,CAAA;AAC5C,IAAA,MAAM,UAAA,CAAW,oBAAA,CAAqB,MAAA,CAAO,UAAU,CAAC,CAAA;AACxD,IAAA,MAAM,UAAA,CAAW,oBAAoB,UAAU,CAAA;AAC/C,IAAA,MAAM,UAAA,CAAW,0BAA0B,WAAW,CAAA;AACtD,IAAA,MAAM,UAAA,CAAW,+BAA+B,OAAO,CAAA;AAAA,EACzD,SAAS,GAAA,EAAK;AACZ,IAAA,OAAA,CAAQ,IAAA,CAAK,gDAAgD,GAAG,CAAA;AAAA,EAClE;AACF;AAEA,eAAsB,0BAAA,CACpB,YACA,IAAA,EAMkC;AAClC,EAAA,MAAM,UAAA,GAAa,MAAM,kBAAA,CAAmB,IAAA,CAAK,MAAM,UAAU,CAAA;AACjE,EAAA,MAAMA,MAAAA,GAAiC;AAAA,IACrC,aAAa,UAAA,CAAW,MAAA;AAAA,IACxB,gBAAA,EAAkB,CAAA;AAAA,IAClB,cAAA,EAAgB,CAAA;AAAA,IAChB,qBAAA,EAAuB,CAAA;AAAA,IACvB,iBAAiB;AAAC,GACpB;AACA,EAAA,IAAI,CAAC,UAAA,CAAW,MAAA,EAAQ,OAAOA,MAAAA;AAE/B,EAAA,MAAM,UAAU,EAAC;AACjB,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,UAAA,CAAW,MAAA,EAAQ,KAAK,gBAAA,EAAkB;AAC5D,IAAA,OAAA,CAAQ,KAAK,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,CAAA,GAAI,gBAAgB,CAAC,CAAA;AAAA,EACxD;AACA,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,MAAA,CAAO,CAAA,CAAE,IAAI,CAAC,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA;AAC7D,IAAA,MAAM,SAAA,GAAY,MAAM,eAAA,CAAgB,QAAA,EAAU,KAAK,MAAM,CAAA;AAC7D,IAAA,QAAA,IAAY,MAAA,CAAO,SAAA,CAAU,MAAA,CAAO,KAAA,IAAS,CAAC,CAAA;AAC9C,IAAA,SAAA,IAAa,MAAA,CAAO,SAAA,CAAU,MAAA,CAAO,MAAA,IAAU,CAAC,CAAA;AAChD,IAAA,MAAM,YAAY,MAAM,iBAAA,CAAkB,IAAA,CAAK,IAAA,EAAM,OAAO,SAAS,CAAA;AACrE,IAAAA,OAAM,gBAAA,GAAmB,MAAA,CAAOA,MAAAA,CAAM,gBAAgB,IAAI,SAAA,CAAU,gBAAA;AACpE,IAAAA,OAAM,cAAA,GAAiB,MAAA,CAAOA,MAAAA,CAAM,cAAc,IAAI,SAAA,CAAU,cAAA;AAChE,IAAAA,OAAM,qBAAA,GAAwB,MAAA,CAAOA,MAAAA,CAAM,qBAAqB,IAAI,SAAA,CAAU,qBAAA;AAAA,EAChF;AACA,EAAA,MAAM,SAASA,MAAAA,CAAM,eAAA;AACrB,EAAA,IAAI,QAAA,SAAiB,eAAA,GAAkB,QAAA;AACvC,EAAA,IAAI,SAAA,SAAkB,gBAAA,GAAmB,SAAA;AACzC,EAAA,IAAI,IAAA,CAAK,YAAY,MAAM,WAAA,CAAY,KAAK,IAAA,EAAM,UAAA,EAAY,UAAA,EAAY,IAAA,CAAK,UAAU,CAAA;AACzF,EAAA,OAAOA,MAAAA;AACT;AAnYA,IAMa,YAAA,EAWA,yBAWA,gBAAA,EAEP,iBAAA;AA9BN,IAAA,aAAA,GAAA,KAAA,CAAA;AAAA,EAAA,uBAAA,GAAA;AAMO,IAAM,YAAA,GAAe;AAAA,MAC1B,QAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAA;AAAA,MACA,UAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACF;AAGO,IAAM,uBAAA,uBAA8B,GAAA,CAAI;AAAA,MAC7C,cAAA;AAAA,MACA,YAAA;AAAA,MACA,UAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA;AAAA,MACA,WAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,KACD,CAAA;AAEM,IAAM,gBAAA,GAAmB,EAAA;AAEhC,IAAM,iBAAA,GAAoB,kEAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACnB1B,eAAsB,YAAA,CACpB,QAOA,QAAA,EACe;AACf,EAAA,MAAM,OAAA,GACJ,OAMA,OAAA,CAAQ;AAAA,IACR;AAAA,GACD,CAAA;AACD,EAAA,IAAI;AACF,IAAA,KAAA,MAAW,QAAQ,CAAC,GAAG,WAAA,EAAa,GAAG,OAAO,CAAA,EAAG;AAC/C,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,CAAQ,IAAI,IAAI,CAAA;AAAA,MACxB,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,KAAA,CAAM,kCAAkC,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,GAAG,GAAG,CAAA;AAAA,MACzE;AAAA,IACF;AAAA,EACF,CAAA,SAAE;AACA,IAAA,MAAM,QAAQ,KAAA,EAAM;AAAA,EACtB;AACF;AA1CA,IAAM,WAAA,EAKA,OAAA;AALN,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,qBAAA,GAAA;AAAA,IAAM,WAAA,GAAc;AAAA,MAClB,sFAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAM,OAAA,GAAU;AAAA,MACd,0EAAA;AAAA,MACA,+EAAA;AAAA,MACA;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACTA,IAAA,oBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,oBAAA,EAAA;AAAA,EAAA,UAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IAMM,iBACA,aAAA,EAcO,UAAA;AArBb,IAAA,iBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,2BAAA,GAAA;AAEA,IAAA,WAAA,EAAA;AACA,IAAA,UAAA,EAAA;AACA,IAAA,WAAA,EAAA;AAEA,IAAM,eAAA,GAAkB,GAAA;AACxB,IAAM,aAAA,GAAgB,GAAA;AAcf,IAAM,aAAN,MAAiB;AAAA,MACtB,GAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA,GAA6B,IAAA;AAAA,MACrB,WAAA,GAAc,KAAA;AAAA,MACd,KAAA,uBAAY,GAAA,EAAmD;AAAA,MAC/D,UAAA,GAAa,CAAA;AAAA,MAErB,WAAA,CAAYV,IAAAA,EAAkB,IAAA,GAAiC,EAAC,EAAG;AACjE,QAAA,IAAA,CAAK,GAAA,GAAMA,IAAAA;AACX,QAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAClB,QAAA,IAAA,CAAK,WAAWA,IAAAA,CAAI,aAAA;AAAA,MACtB;AAAA,MAEA,MAAM,OAAA,GAAyB;AAC7B,QAAA,IAAI,KAAK,MAAA,EAAQ;AACjB,QAAA,MAAM,KAAA,GAAQ,MAAM,YAAA,CAOjB,cAAA,EAAgB,SAAS,gBAAgB,CAAA;AAC5C,QAAA,MAAM,EAAA,GAAK,MAAM,OAAA,IAAW,KAAA;AAC5B,QAAA,MAAM,WAAW,EAAA,CAAG,MAAA;AACpB,QAAA,MAAM,OAAO,EAAA,CAAG,IAAA;AAChB,QAAA,IAAI,CAAC,QAAA,IAAY,CAAC,MAAM,MAAM,IAAI,MAAM,yCAAyC,CAAA;AACjF,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,CAAK,GAAA,CAAI,QAAA,EAAW,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,aAAc,CAAC,CAAA;AACnG,QAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,QAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,UAAA,MAAM,YAAA,CAAa,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AACxC,UAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,QACrB;AAAA,MACF;AAAA,MAEA,MAAM,KAAA,GAAuB;AAC3B,QAAA,IAAI,KAAK,MAAA,EAAQ;AACf,UAAA,MAAM,IAAA,CAAK,OAAO,KAAA,EAAM;AACxB,UAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,UAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AAAA,QACrB;AAAA,MACF;AAAA,MAEA,MAAM,IAAA,CAAK,OAAA,GAAU,GAAA,EAAwB;AAC3C,QAAA,IAAI;AACF,UAAA,MAAM,KAAK,OAAA,EAAQ;AACnB,UAAA,MAAM,QAAQ,IAAA,CAAK;AAAA,YACjB,KAAK,YAAA,EAAa;AAAA,YAClB,IAAI,OAAA,CAAQ,CAAC,CAAA,EAAG,WAAW,UAAA,CAAW,MAAM,MAAA,CAAO,IAAI,KAAA,CAAM,SAAS,CAAC,CAAA,EAAG,OAAO,CAAC;AAAA,WACnF,CAAA;AACD,UAAA,OAAO,IAAA;AAAA,QACT,SAAS,GAAA,EAAK;AACZ,UAAA,IAAA,CAAK,OAAO,GAAA,EAAK,EAAE,SAAS,OAAA,EAAS,SAAA,EAAW,QAAQ,CAAA;AACxD,UAAA,OAAO,KAAA;AAAA,QACT;AAAA,MACF;AAAA,MAEA,MAAc,YAAA,GAA8B;AAC1C,QAAA,MAAM,OAAA,GAAU,KAAK,MAAA,CAAQ,OAAA,CAAQ,EAAE,QAAA,EAAU,IAAA,CAAK,UAAU,CAAA;AAChE,QAAA,IAAI;AACF,UAAA,MAAM,OAAA,CAAQ,IAAI,kBAAkB,CAAA;AAAA,QACtC,CAAA,SAAE;AACA,UAAA,MAAM,QAAQ,KAAA,EAAM;AAAA,QACtB;AAAA,MACF;AAAA,MAEQ,MAAA,CAAO,KAAc,GAAA,EAAoC;AAC/D,QAAA,IAAI,KAAK,KAAA,EAAO,SAAA,CAAU,IAAA,CAAK,KAAA,EAAO,KAAK,GAAG,CAAA;AAAA,aACzC,OAAA,CAAQ,KAAA,CAAM,cAAA,EAAgB,GAAA,EAAK,UAAU,GAAG,CAAA;AAAA,MACvD;AAAA,MAEQ,SAAS,GAAA,EAAsB;AACrC,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAChC,QAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,QAAA,IAAI,MAAM,SAAA,GAAY,IAAA,CAAK,KAAI,GAAI,GAAA,SAAa,KAAA,CAAM,KAAA;AACtD,QAAA,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA;AACrB,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,MAEQ,QAAA,CAAS,GAAA,EAAa,KAAA,EAAgB,GAAA,GAAM,KAAA,EAAa;AAC/D,QAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,EAAE,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,GAAI,GAAA,GAAO,GAAA,EAAK,KAAA,EAAO,CAAA;AAAA,MACnE;AAAA,MAEA,MAAM,kBAAkB,IAAA,EAAuD;AAC7E,QAAA,MAAM,KAAA,GAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA;AAUd,QAAA,OAAO,IAAA,CAAK,UAAA,CAAW,KAAA,EAAO,IAAI,CAAA;AAAA,MACpC;AAAA,MAEA,MAAM,oBAAoB,IAAA,EAAuD;AAC/E,QAAA,MAAM,KAAA,GAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA;AAQd,QAAA,OAAO,IAAA,CAAK,UAAA,CAAW,KAAA,EAAO,IAAI,CAAA;AAAA,MACpC;AAAA,MAEA,MAAM,0BAA0B,IAAA,EAAuD;AACrF,QAAA,MAAM,KAAA,GAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA;AAMd,QAAA,OAAO,IAAA,CAAK,UAAA,CAAW,KAAA,EAAO,IAAI,CAAA;AAAA,MACpC;AAAA,MAEA,MAAM,+BAA+B,IAAA,EAAuD;AAC1F,QAAA,MAAM,KAAA,GAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA;AASd,QAAA,OAAO,IAAA,CAAK,UAAA,CAAW,KAAA,EAAO,IAAI,CAAA;AAAA,MACpC;AAAA,MAEA,MAAM,qBAAqB,UAAA,EAAmC;AAC5D,QAAA,MAAM,KAAA,GAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA;AAQd,QAAA,MAAM,KAAK,OAAA,EAAQ;AACnB,QAAA,MAAM,OAAA,GAAU,KAAK,MAAA,CAAQ,OAAA,CAAQ,EAAE,QAAA,EAAU,IAAA,CAAK,UAAU,CAAA;AAChE,QAAA,IAAI;AACF,UAAA,MAAM,OAAA,CAAQ,IAAI,KAAA,EAAO,EAAE,aAAa,MAAA,CAAO,UAAU,GAAG,CAAA;AAAA,QAC9D,CAAA,SAAE;AACA,UAAA,MAAM,QAAQ,KAAA,EAAM;AAAA,QACtB;AACA,QAAA,IAAA,CAAK,UAAA,IAAc,CAAA;AAAA,MACrB;AAAA,MAEA,MAAc,UAAA,CAAW,KAAA,EAAe,IAAA,EAAuD;AAC7F,QAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,OAAO,CAAA;AACzB,QAAA,MAAM,KAAK,OAAA,EAAQ;AACnB,QAAA,IAAI,IAAA,GAAO,CAAA;AACX,QAAA,MAAM,OAAA,GAAU,KAAK,MAAA,CAAQ,OAAA,CAAQ,EAAE,QAAA,EAAU,IAAA,CAAK,UAAU,CAAA;AAChE,QAAA,IAAI;AACF,UAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,EAAQ,KAAK,eAAA,EAAiB;AACrD,YAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,IAAI,eAAe,CAAA;AAC/C,YAAA,MAAM,QAAQ,GAAA,CAAI,KAAA,EAAO,EAAE,IAAA,EAAM,OAAO,CAAA;AACxC,YAAA,IAAA,IAAQ,KAAA,CAAM,MAAA;AAAA,UAChB;AAAA,QACF,CAAA,SAAE;AACA,UAAA,MAAM,QAAQ,KAAA,EAAM;AAAA,QACtB;AACA,QAAA,IAAA,CAAK,UAAA,IAAc,CAAA;AACnB,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,MAEA,MAAM,iBAAiB,QAAA,EAAuD;AAC5E,QAAA,MAAM,KAAK,OAAA,EAAQ;AACnB,QAAA,MAAM,OAAA,GAAU,KAAK,MAAA,CAAQ,OAAA,CAAQ,EAAE,QAAA,EAAU,IAAA,CAAK,UAAU,CAAA;AAChE,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,GAAA;AAAA,YAC3B,8EAAA;AAAA,YACA,EAAE,SAAA,EAAW,MAAA,CAAO,QAAQ,CAAA;AAAE,WAChC;AACA,UAAA,MAAM,OAAA,GAAU,OAAO,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,EAAG,GAAA,CAAI,GAAG,CAAA,IAAK,CAAC,CAAA;AACvD,UAAA,IAAA,CAAK,UAAA,IAAc,CAAA;AACnB,UAAA,OAAO,EAAE,gBAAgB,OAAA,EAAQ;AAAA,QACnC,CAAA,SAAE;AACA,UAAA,MAAM,QAAQ,KAAA,EAAM;AAAA,QACtB;AAAA,MACF;AAAA,MAEQ,iBAAA,CAAkB,aAAA,EAAyB,QAAA,EAAkB,QAAA,EAA4B;AAC/F,QAAA,MAAM,cAAcuB,iBAAAA,CAAW,KAAK,CAAA,CACjC,MAAA,CAAO,CAAC,GAAG,QAAQ,CAAA,CAAE,IAAA,GAAO,IAAA,CAAK,GAAG,CAAC,CAAA,CACrC,OAAO,KAAK,CAAA;AACf,QAAA,MAAM,aAAa,CAAA,CAAA,EAAI,IAAA,CAAK,UAAU,CAAA,CAAA,EAAI,KAAK,SAAA,CAAU,CAAC,GAAG,aAAa,EAAE,IAAA,EAAM,CAAC,CAAA,CAAA,EAAI,QAAQ,IAAI,WAAW,CAAA,CAAA;AAC9G,QAAA,OAAO,CAAA,UAAA,EAAaA,kBAAW,KAAK,CAAA,CAAE,OAAO,UAAU,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,MACxE;AAAA,MAEA,MAAM,cAAA,CAAe,QAAA,EAAoB,aAAA,EAAyB,WAAW,CAAA,EAAsB;AACjG,QAAA,IAAI,CAAC,QAAA,CAAS,MAAA,EAAQ,OAAO,EAAC;AAC9B,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,EAAG,CAAC,CAAC,CAAA;AAC3D,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,iBAAA,CAAkB,aAAA,EAAe,OAAO,QAAQ,CAAA;AACtE,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA;AACrC,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG,OAAO,MAAA;AAElC,QAAA,MAAM,KAAA,GAAQ;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yCAAA,EAeyB,KAAK,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA;AAU5C,QAAA,MAAM,KAAK,OAAA,EAAQ;AACnB,QAAA,MAAM,OAAA,GAAU,KAAK,MAAA,CAAQ,OAAA,CAAQ,EAAE,QAAA,EAAU,IAAA,CAAK,UAAU,CAAA;AAChE,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,GAAA,CAAI,KAAA,EAAO;AAAA,YACtC,SAAA,EAAW,QAAA;AAAA,YACX,cAAA,EAAgB,aAAA;AAAA,YAChB,WAAA,EAAa;AAAA,WACd,CAAA;AACD,UAAA,MAAM,WAAW,MAAA,CAAO,OAAA,CACrB,IAAI,CAAC,CAAA,KAAM,EAAE,GAAA,CAAI,UAAU,CAAC,CAAA,CAC5B,OAAO,CAAC,CAAA,KAAM,KAAK,IAAI,CAAA,CACvB,IAAI,MAAM,CAAA;AACb,UAAA,IAAI,QAAA,CAAS,MAAA,EAAQ,IAAA,CAAK,QAAA,CAAS,UAAU,QAAQ,CAAA;AACrD,UAAA,OAAO,QAAA;AAAA,QACT,CAAA,SAAE;AACA,UAAA,MAAM,QAAQ,KAAA,EAAM;AAAA,QACtB;AAAA,MACF;AAAA,MAEA,MAAM,2BAA2B,QAAA,EAAqD;AACpF,QAAA,IAAI,CAAC,QAAA,CAAS,MAAA,EAAQ,OAAO,EAAC;AAC9B,QAAA,MAAM,KAAA,GAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA;AAYd,QAAA,MAAM,KAAK,OAAA,EAAQ;AACnB,QAAA,MAAM,OAAA,GAAU,KAAK,MAAA,CAAQ,OAAA,CAAQ,EAAE,QAAA,EAAU,IAAA,CAAK,UAAU,CAAA;AAChE,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,GAAA,CAAI,OAAO,EAAE,SAAA,EAAW,UAAU,CAAA;AAC/D,UAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,YACzC,EAAA,EAAI,MAAA,CAAO,CAAA,CAAE,GAAA,CAAI,IAAI,CAAC,CAAA;AAAA,YACtB,iBAAA,EAAmB,MAAA,CAAO,CAAA,CAAE,GAAA,CAAI,mBAAmB,CAAC;AAAA,WACtD,CAAE,CAAA;AACF,UAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,EAAQ,OAAO,EAAC;AAC7B,UAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,GAAA,CAAI,GAAG,OAAA,CAAQ,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,iBAAiB,CAAC,CAAA;AAC1E,UAAA,IAAI,mBAAmB,CAAA,EAAG;AACxB,YAAA,OAAO,MAAA,CAAO,WAAA,CAAY,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,EAAA,EAAI,GAAG,CAAC,CAAC,CAAA;AAAA,UAC3D;AACA,UAAA,OAAO,MAAA,CAAO,WAAA;AAAA,YACZ,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAK,CAAA,CAAE,iBAAA,GAAoB,cAAc,CAAC,CAAC;AAAA,WAChF;AAAA,QACF,CAAA,SAAE;AACA,UAAA,MAAM,QAAQ,KAAA,EAAM;AAAA,QACtB;AAAA,MACF;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC7SA,IAAA,iBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,iBAAA,EAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,2BAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAuBA,SAAS,WAAW,MAAA,EAA0B;AAC5C,EAAA,OAAO,CAAA,CAAA,EAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,MAAA,CAAO,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AACnD;AAEA,eAAsB,kBAAA,CAAmB,MAAY,SAAA,EAA8C;AACjG,EAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,KAAA;AAAA,IACxB,CAAA;AAAA,kGAAA,CAAA;AAAA,IAEA,CAAC,SAAS;AAAA,GACZ;AACA,EAAA,OAAO,CAAC,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,OAAA;AAC1B;AAEA,eAAsB,2BAAA,CACpB,MACA,IAAA,EACkB;AAClB,EAAA,IAAI,IAAA,CAAK,UAAA,IAAc,IAAA,EAAM,OAAO,IAAA;AACpC,EAAA,OAAO,kBAAA,CAAmB,IAAA,EAAM,IAAA,CAAK,SAAS,CAAA;AAChD;AAEA,eAAe,mBAAA,CACb,IAAA,EACA,QAAA,EACA,IAAA,EACyC;AACzC,EAAA,IAAI,CAAC,QAAA,CAAS,MAAA,EAAQ,OAAO,EAAC;AAC9B,EAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,KAAA;AAAA,IACxB,CAAA;AAAA;AAAA;AAAA;AAAA,yCAAA,EAIuCC,MAAK;AAAA;AAAA,gCAAA,CAAA;AAAA,IAG5C,CAAC,QAAA,EAAU,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,YAAY,YAAY;AAAA,GAC1D;AACA,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IAC7B,iBAAiB,CAAA,CAAE,eAAA;AAAA,IACnB,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,MAAM,CAAA,CAAE;AAAA,GACV,CAAE,CAAA;AACJ;AAEA,eAAe,mBAAA,CACb,IAAA,EACA,QAAA,EACA,MAAA,EACiC;AACjC,EAAA,IAAI,CAAC,QAAA,CAAS,MAAA,IAAU,CAAC,MAAA,SAAe,EAAC;AACzC,EAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,KAAA;AAAA,IACxB,CAAA;AAAA;AAAA,6DAAA,CAAA;AAAA,IAGA,CAAC,QAAA,EAAU,UAAA,CAAW,MAAM,CAAC;AAAA,GAC/B;AACA,EAAA,IAAI,SAAS,MAAA,CAAO,WAAA,CAAY,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA,EAAG,MAAA,CAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAA;AACrF,EAAA,MAAM,EAAA,GAAK,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA;AAC/B,EAAA,IAAI,GAAG,MAAA,EAAQ;AACb,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAG,EAAE,CAAA;AACzB,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAG,EAAE,CAAA;AACzB,IAAA,IAAI,EAAA,GAAK,EAAA;AACP,MAAA,MAAA,GAAS,OAAO,WAAA,CAAY,MAAA,CAAO,QAAQ,MAAM,CAAA,CAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA,KAAM,CAAC,CAAA,EAAA,CAAI,CAAA,GAAI,OAAO,EAAA,GAAK,EAAA,CAAG,CAAC,CAAC,CAAA;AAAA,EACjG;AACA,EAAA,OAAO,MAAA;AACT;AAEA,eAAe,yBAAA,CACb,IAAA,EACA,QAAA,EACA,gBAAA,EACiC;AACjC,EAAA,IAAI,CAAC,QAAA,CAAS,MAAA,IAAU,CAAC,gBAAA,CAAiB,MAAA,SAAe,EAAC;AAC1D,EAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,KAAA;AAAA,IACxB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAA,CAAA;AAAA,IAOA,CAAC,UAAU,gBAAgB;AAAA,GAC7B;AACA,EAAA,MAAM,SAAS,MAAA,CAAO,WAAA,CAAY,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,MAAA,CAAO,CAAA,CAAE,QAAQ,CAAA,EAAG,MAAA,CAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;AAC3F,EAAA,IAAI,CAAC,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,MAAA,SAAe,EAAC;AACzC,EAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,GAAG,MAAA,CAAO,MAAA,CAAO,MAAM,CAAC,CAAA;AAC5C,EAAA,OAAO,EAAA,GAAK,OAAO,WAAA,CAAY,MAAA,CAAO,QAAQ,MAAM,CAAA,CAAE,IAAI,CAAC,CAAC,KAAK,CAAC,CAAA,KAAM,CAAC,GAAA,EAAK,CAAA,GAAI,EAAE,CAAC,CAAC,IAAI,EAAC;AAC7F;AAEA,eAAe,sBAAA,CACb,IAAA,EACA,QAAA,EACA,MAAA,EACA,IAAA,EACiC;AACjC,EAAA,IAAI,CAAC,KAAK,YAAA,IAAgB,CAAC,SAAS,MAAA,IAAU,CAAC,MAAA,EAAQ,OAAO,EAAC;AAC/D,EAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,KAAA;AAAA,IAC1B,CAAA;AAAA;AAAA,sDAAA,CAAA;AAAA,IAGA,CAAC,UAAA,CAAW,MAAM,CAAC;AAAA,GACrB;AACA,EAAA,IAAI,CAAC,QAAA,CAAS,IAAA,CAAK,MAAA,SAAe,EAAC;AACnC,EAAA,MAAM,cAAsC,EAAC;AAC7C,EAAA,KAAA,MAAW,GAAA,IAAO,SAAS,IAAA,EAAM;AAC/B,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA;AAC1B,IAAA,IAAI,MAAM,IAAA,EAAM;AAChB,IAAA,KAAA,MAAW,GAAA,IAAO,GAAA,CAAI,UAAA,IAAc,EAAC,EAAG;AACtC,MAAA,WAAA,CAAY,MAAA,CAAO,GAAG,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,WAAA,CAAY,MAAA,CAAO,GAAG,CAAC,CAAA,IAAK,CAAA,EAAG,GAAG,CAAA;AAAA,IACxE;AAAA,EACF;AACA,EAAA,IAAI,CAAC,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,CAAE,MAAA,SAAe,EAAC;AAC9C,EAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,KAAA;AAAA,IACxB,CAAA;AAAA;AAAA;AAAA,4EAAA,EAG0EA,MAAK,CAAA,CAAA;AAAA,IAC/E,CAAC,UAAU,IAAA,CAAK,SAAA,EAAW,KAAK,UAAA,EAAY,MAAA,CAAO,IAAA,CAAK,WAAW,CAAC;AAAA,GACtE;AACA,EAAA,MAAM,cAAsC,EAAC;AAC7C,EAAA,KAAA,MAAW,GAAA,IAAO,OAAO,IAAA,EAAM;AAC7B,IAAA,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA,GAAI,IAAA,CAAK,IAAI,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA,IAAK,CAAA,EAAG,WAAA,CAAY,GAAA,CAAI,SAAS,KAAK,CAAC,CAAA;AAAA,EACtG;AACA,EAAA,OAAO,WAAA;AACT;AAEA,eAAe,aAAA,CACb,IAAA,EACA,MAAA,EACA,IAAA,EACmB;AACnB,EAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,KAAA;AAAA,IACxB,CAAA;AAAA,mCAAA,EACiCA,MAAK;AAAA,yDAAA,CAAA;AAAA,IAEtC,CAAC,WAAW,MAAM,CAAA,EAAG,KAAK,SAAA,EAAW,IAAA,CAAK,YAAY,UAAU;AAAA,GAClE;AACA,EAAA,OAAO,MAAA,CAAO,KAAK,GAAA,CAAI,CAAC,MAAM,MAAA,CAAO,CAAA,CAAE,EAAE,CAAC,CAAA;AAC5C;AAEA,eAAsB,gBAAA,CACpB,OACA,IAAA,EAUmB;AACnB,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,CAAC,KAAK,CAAA,EAAG,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA;AACnE,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,GAC/B,OAAO,CAAC,CAAA,GACP,MAAA,CAAoC,OAAA,IAAW,EAAC;AACtD,IAAA,MAAM,MAAA,GAAS,QAAQ,CAAC,CAAA,GAAI,CAAC,GAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAI,IAAA;AAC9C,IAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,EAAC;AACrB,IAAA,MAAM,SAAA,GAAY,KAAK,SAAA,IAAa,IAAA;AACpC,IAAA,MAAM,UAAA,GAAa,KAAK,UAAA,IAAc,IAAA;AACtC,IAAA,MAAM,KAAA,GAAQ,MAAM,aAAA,CAAc,IAAA,CAAK,MAAM,MAAA,EAAQ,EAAE,SAAA,EAAW,UAAA,EAAY,CAAA;AAC9E,IAAA,IAAI,CAAC,KAAA,CAAM,MAAA,EAAQ,OAAO,EAAC;AAC3B,IAAA,MAAM,aAAA,GAAgB,MAAM,mBAAA,CAAoB,IAAA,CAAK,MAAM,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,sBAAsB,CAAA,EAAG;AAAA,MACjG,SAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,MAAM,WAAA,GAAc,cAAc,GAAA,CAAI,CAAC,MAAM,MAAA,CAAO,CAAA,CAAE,eAAe,CAAC,CAAA;AAEtE,IAAA,IAAI,QAAA,GAAqB,KAAA;AACzB,IAAA,IAAI,eAAuC,EAAC;AAC5C,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,WAAW,OAAA,EAAQ;AAC9B,MAAA,QAAA,GAAW,MAAM,KAAK,UAAA,CAAW,cAAA,CAAe,OAAO,WAAA,EAAa,IAAA,CAAK,YAAY,CAAC,CAAA;AACtF,MAAA,YAAA,GAAe,MAAM,IAAA,CAAK,UAAA,CAAW,2BAA2B,QAAA,CAAS,MAAA,GAAS,WAAW,KAAK,CAAA;AAAA,IACpG,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,IAAA,CAAK,OAAO,SAAA,CAAU,IAAA,CAAK,OAAO,GAAA,EAAK,EAAE,KAAA,EAAO,cAAA,EAAgB,CAAA;AAAA,WAC/D,OAAA,CAAQ,IAAA,CAAK,8BAAA,EAAgC,GAAG,CAAA;AACrD,MAAA,QAAA,GAAW,KAAA;AACX,MAAA,YAAA,GAAe,EAAC;AAAA,IAClB;AACA,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,MAAA,GAAS,QAAA,GAAW,KAAA;AAC5C,IAAA,MAAM,YAAA,GAAe,MAAM,2BAAA,CAA4B,IAAA,CAAK,MAAM,EAAE,SAAA,EAAW,YAAY,CAAA;AAC3F,IAAA,MAAM,YAAY,MAAM,mBAAA,CAAoB,IAAA,CAAK,IAAA,EAAM,QAAQ,MAAM,CAAA;AACrE,IAAA,MAAM,YAAY,MAAM,yBAAA,CAA0B,IAAA,CAAK,IAAA,EAAM,QAAQ,WAAW,CAAA;AAChF,IAAA,MAAM,aAAa,MAAM,sBAAA,CAAuB,IAAA,CAAK,IAAA,EAAM,QAAQ,MAAA,EAAQ;AAAA,MACzE,SAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,KAAA;AAAA,MAC/B,CAAA,oGAAA,CAAA;AAAA,MACA,CAAC,MAAM;AAAA,KACT;AACA,IAAA,MAAM,QAAQ,MAAA,CAAO,WAAA,CAAY,SAAS,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA,EAAG,MAAA,CAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;AACtF,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,GAAG,eAAA;AAAA,MACH,GACE,KAAK,MAAA,CAAO,KAAA,CAIZ,iBACC,IAAA,CAAK,MAAA,CAAO,KAAA,CAAsD,cAAA,IACnE;AAAC,KACL;AACA,IAAA,MAAM,aAAA,GAAgB,IAAI,GAAA,CAAI,WAAW,CAAA;AACzC,IAAA,MAAM,SAAkC,EAAC;AACzC,IAAA,KAAA,MAAW,UAAU,MAAA,EAAQ;AAC3B,MAAA,MAAM,GAAA,GAAM,OAAO,MAAM,CAAA;AACzB,MAAA,IAAI,EAAE,OAAO,KAAA,CAAA,EAAQ;AACrB,MAAA,MAAM,CAAA,GAAI,SAAA,CAAU,GAAG,CAAA,IAAK,GAAA;AAC5B,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,GAAG,CAAA,IAAK,EAAA;AAChC,MAAA,MAAM,OAAA,GAAU,CAAC,GAAG,aAAa,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,IAAK,SAAA,CAAU,QAAA,CAAS,CAAC,CAAC,CAAA,CAAE,MAAA;AAC7E,MAAA,MAAM,CAAA,GAAI,aAAA,CAAc,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAK,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,aAAA,CAAc,IAAI,CAAC,CAAA,GAAI,CAAA;AAC1F,MAAA,MAAM,CAAA,GAAI,SAAA,CAAU,GAAG,CAAA,IAAK,CAAA;AAC5B,MAAA,MAAM,EAAA,GAAK,UAAA,CAAW,GAAG,CAAA,IAAK,CAAA;AAC9B,MAAA,MAAM,EAAA,GAAK,YAAA,CAAa,GAAG,CAAA,IAAK,GAAA;AAChC,MAAA,MAAM,KAAA,GACJ,CAAA,GAAI,OAAA,CAAQ,YAAA,GACZ,IAAI,OAAA,CAAQ,YAAA,GACZ,CAAA,GAAI,OAAA,CAAQ,sBAAA,GACZ,EAAA,GAAK,OAAA,CAAQ,eAAA,GACb,KAAK,OAAA,CAAQ,kBAAA;AACf,MAAA,MAAA,CAAO,IAAA,CAAK,CAAC,GAAA,EAAK,KAAK,CAAC,CAAA;AAAA,IAC1B;AACA,IAAA,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAC,CAAA;AACjC,IAAA,OAAO,OAAO,GAAA,CAAI,CAAC,CAAC,GAAG,MAAM,GAAG,CAAA;AAAA,EAClC,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,IAAA,CAAK,OAAO,SAAA,CAAU,IAAA,CAAK,OAAO,GAAA,EAAK,EAAE,KAAA,EAAO,mBAAA,EAAqB,CAAA;AAAA,SACpE,OAAA,CAAQ,IAAA,CAAK,gCAAA,EAAkC,GAAG,CAAA;AACvD,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAjQA,IAMM,eAAA,EAQA,UAAA,EACA,YAAA,EACA,sBAAA,EAEAA,MAAAA;AAlBN,IAAA,cAAA,GAAA,KAAA,CAAA;AAAA,EAAA,wBAAA,GAAA;AAEA,IAAA,UAAA,EAAA;AAIA,IAAM,eAAA,GAAkB;AAAA,MACtB,YAAA,EAAc,GAAA;AAAA,MACd,YAAA,EAAc,GAAA;AAAA,MACd,sBAAA,EAAwB,GAAA;AAAA,MACxB,eAAA,EAAiB,GAAA;AAAA,MACjB,kBAAA,EAAoB;AAAA,KACtB;AAEA,IAAM,UAAA,GAAa,GAAA;AACnB,IAAM,YAAA,GAAe,EAAA;AACrB,IAAM,sBAAA,GAAyB,EAAA;AAE/B,IAAMA,MAAAA,GAAQ;AAAA;AAAA;AAAA,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AClBd,IAAA,aAAA,GAAA,EAAA;AAAA,QAAA,CAAA,aAAA,EAAA;AAAA,EAAA,aAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AASA,eAAsB,cAAc,IAAA,EAQhB;AAClB,EAAA,MAAM,QAAA,GAAW,MAAM,0BAAA,CAA2B,IAAA,CAAK,UAAA,EAAY;AAAA,IACjE,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,OAAO,IAAA,CAAK;AAAA,GACb,CAAA;AACD,EAAA,MAAM,SAAA,GAAY,MAAM,iBAAA,CAAkB;AAAA,IACxC,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,OAAO,IAAA,CAAK;AAAA,GACb,CAAA;AACD,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,QAAA,CAAS,WAAA,IAAe,CAAC,CAAA;AACnD,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,SAAA,CAAU,mBAAA,IAAuB,CAAC,CAAA;AACzD,EAAA,OAAO,UAAA,CAAW,YAAY,OAAO,CAAA;AACvC;AAjCA,IAAA,UAAA,GAAA,KAAA,CAAA;AAAA,EAAA,oBAAA,GAAA;AAIA,IAAA,UAAA,EAAA;AACA,IAAA,gBAAA,EAAA;AACA,IAAA,aAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACNA,IAAA,aAAA,GAAA,EAAA;AAAA,QAAA,CAAA,aAAA,EAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,gBAAA,EAAA,MAAAC,iBAAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,iBAAA,EAAA,MAAA,iBAAA;AAAA,EAAA,mBAAA,EAAA,MAAA,mBAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,aAAA,EAAA,MAAAC,cAAAA;AAAA,EAAA,2BAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAKA,eAAsB,YAAA,GAA8B;AAClD,EAAA,MAAM,YAAA,CAAa,cAAA,EAAgB,OAAA,EAAS,gBAAgB,CAAA;AAC9D;AAIA,eAAsB,eAAA,CACpB1B,IAAAA,EACA,IAAA,GAAiC,EAAC,EACb;AACrB,EAAA,MAAM,YAAA,EAAa;AACnB,EAAA,MAAM,EAAE,UAAA,EAAA2B,WAAAA,EAAW,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,iBAAA,EAAA,EAAA,oBAAA,CAAA,CAAA;AAC7B,EAAA,OAAO,IAAIA,WAAAA,CAAW3B,IAAAA,EAAK,IAAI,CAAA;AACjC;AAEA,eAAsB0B,kBACjB,IAAA,EACc;AACjB,EAAA,MAAM,YAAA,EAAa;AACnB,EAAA,MAAM,EAAE,aAAA,EAAe,IAAA,EAAK,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,UAAA,EAAA,EAAA,aAAA,CAAA,CAAA;AACtC,EAAA,OAAO,IAAA,CAAK,GAAG,IAAI,CAAA;AACrB;AAEA,eAAsBD,qBACjB,IAAA,EACgB;AACnB,EAAA,MAAM,YAAA,EAAa;AACnB,EAAA,MAAM,EAAE,gBAAA,EAAkB,IAAA,EAAK,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,cAAA,EAAA,EAAA,iBAAA,CAAA,CAAA;AACzC,EAAA,OAAO,IAAA,CAAK,GAAG,IAAI,CAAA;AACrB;AAlCA,IASa,aAAA;AATb,IAAA,UAAA,GAAA,KAAA,CAAA;AAAA,EAAA,oBAAA,GAAA;AACA,IAAA,WAAA,EAAA;AAmCA,IAAA,gBAAA,EAAA;AACA,IAAA,aAAA,EAAA;AACA,IAAA,iBAAA,EAAA;AACA,IAAA,cAAA,EAAA;AA9BO,IAAM,aAAA,GAAgB,YAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACP7B,SAAA,EAAA;AAIO,IAAM,eAAA,GAAkB,GAAA;AAE/B,IAAM,cAAA,GAAiB,8BAAA;AACvB,IAAM,oBAAA,GAAuB,4BAAA;AAC7B,IAAM,eAAA,GAAkB,yBAAA;AACxB,IAAM,oBAAA,GAAuB,0BAAA;AAE7B,IAAM,YAAY,IAAI,GAAA;AAAA,EACpB;AACF,CAAA;AAEA,IAAM,GAAA,GAAM;AAAA,EACV,MAAM,CAAA,GAAI,IAAA,KAAoB,QAAQ,IAAA,CAAK,kBAAA,EAAoB,GAAG,IAAI,CAAA;AAAA,EACtE,OAAO,CAAA,GAAI,IAAA,KAAoB,QAAQ,KAAA,CAAM,kBAAA,EAAoB,GAAG,IAAI;AAC1E,CAAA;AAEO,SAAS,cAAc,CAAA,EAAsC;AAClE,EAAA,OAAA,CAAQ,CAAA,IAAK,EAAA,EACV,KAAA,CAAM,KAAK,CAAA,CACX,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA,CAC1B,KAAK,GAAG,CAAA;AACb;AAEO,SAAS,YAAY,CAAA,EAAmB;AAC7C,EAAA,OAAOF,iBAAA,CAAW,QAAQ,CAAA,CAAE,MAAA,CAAO,cAAc,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,MAAA,EAAO;AACtE;AAEO,SAAS,oBAAA,CACd,IAAA,GAAyF,EAAC,EAC3E;AACf,EAAA,MAAM,EAAE,QAAA,GAAW,IAAA,EAAM,WAAW,IAAA,EAAM,QAAA,GAAW,MAAK,GAAI,IAAA;AAC9D,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,CAAA,GAAIA,kBAAW,KAAK,CAAA;AAC1B,IAAA,MAAM,EAAA,GAAKK,WAAA,CAAS,QAAA,EAAU,GAAG,CAAA;AACjC,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAC7B,MAAA,IAAI,IAAIC,WAAA,CAAS,EAAA,EAAI,GAAA,EAAK,CAAA,EAAG,MAAM,IAAI,CAAA;AACvC,MAAA,OAAO,IAAI,CAAA,EAAG;AACZ,QAAA,CAAA,CAAE,MAAA,CAAO,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,CAAC,CAAC,CAAA;AAC3B,QAAA,CAAA,GAAIA,WAAA,CAAS,EAAA,EAAI,GAAA,EAAK,CAAA,EAAG,MAAM,IAAI,CAAA;AAAA,MACrC;AAAA,IACF,CAAA,SAAE;AACA,MAAAC,YAAA,CAAU,EAAE,CAAA;AAAA,IACd;AACA,IAAA,OAAO,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,EACvB;AACA,EAAA,IAAI,QAAA,SAAiBP,iBAAA,CAAW,KAAK,EAAE,MAAA,CAAO,QAAQ,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AACpE,EAAA,IAAI,QAAA,EAAU,OAAOA,iBAAA,CAAW,KAAK,CAAA,CAAE,OAAO,QAAA,EAAU,MAAM,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AAC5E,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,aAAa,IAAA,EAAsB;AACjD,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,IAAA,GAAO,IAAA,CAAK,UAAA,CAAW,IAAA,EAAQ,EAAE,CAAA;AACjC,EAAA,MAAM,iCAAiB,IAAI,GAAA,CAAI,CAAC,IAAA,EAAM,IAAA,EAAM,GAAI,CAAC,CAAA;AACjD,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,IAAA,IAAI,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,IAAK,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA,CAAE,WAAA,CAAY,CAAC,CAAA,IAAM,IAAI,GAAA,IAAO,CAAA;AAAA,EACnF;AACA,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,SAAS,CAAA,EAAmB;AAC1C,EAAA,CAAA,GAAA,CAAK,KAAK,EAAA,EAAI,OAAA,CAAQ,MAAA,EAAQ,GAAG,EAAE,IAAA,EAAK;AACxC,EAAA,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,UAAA,EAAY,IAAI,CAAA;AAC9B,EAAA,OAAO,CAAA;AACT;AAEO,SAAS,UAAA,CAAW,IAAA,EAAc,MAAA,GAAS,EAAA,EAAY;AAC5D,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,KAAA,MAAW,GAAA,IAAA,CAAQ,IAAA,IAAQ,EAAA,EAAI,KAAA,CAAM,YAAY,CAAA,EAAG;AAClD,IAAA,MAAM,IAAA,GAAO,SAAS,GAAG,CAAA;AACzB,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAQ;AACzB,MAAA,MAAM,CAAA,GAAIA,kBAAW,MAAM,CAAA,CAAE,OAAO,IAAA,EAAM,MAAM,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AAC9D,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG;AACjB,MAAA,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IACZ;AACA,IAAA,GAAA,CAAI,KAAK,IAAI,CAAA;AAAA,EACf;AACA,EAAA,OAAO,GAAA,CAAI,KAAK,IAAI,CAAA;AACtB;AAEO,SAAS,uBAAuB,KAAA,EAAwB;AAC7D,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,SAAA,CACd,SACA,QAAA,EACe;AACf,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,EAAA,GAAK,SAAS,WAAA,EAAY;AAChC,IAAA,IAAI,EAAA,CAAG,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,UAAA;AAChC,IAAA,IAAI,EAAA,CAAG,QAAA,CAAS,OAAO,CAAA,EAAG,OAAO,kBAAA;AACjC,IAAA,IAAI,EAAA,CAAG,SAAS,KAAK,CAAA,IAAK,GAAG,QAAA,CAAS,WAAW,GAAG,OAAO,eAAA;AAC3D,IAAA,IAAI,GAAG,QAAA,CAAS,OAAO,KAAK,EAAA,CAAG,QAAA,CAAS,MAAM,CAAA,EAAG;AAC/C,MAAA,OAAO,mEAAA;AAAA,IACT;AACA,IAAA,IAAI,EAAA,CAAG,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,oBAAA;AAChC,IAAA,IAAI,EAAA,CAAG,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,iBAAA;AAChC,IAAA,IAAI,EAAA,CAAG,SAAS,OAAO,CAAA,IAAK,GAAG,QAAA,CAAS,MAAM,GAAG,OAAO,WAAA;AACxD,IAAA,IAAI,EAAA,CAAG,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,+BAAA;AAChC,IAAA,IAAI,EAAA,CAAG,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,gBAAA;AAChC,IAAA,IAAI,EAAA,CAAG,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,4BAAA;AAChC,IAAA,IAAI,EAAA,CAAG,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,yCAAA;AAChC,IAAA,IAAI,EAAA,CAAG,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,gDAAA;AAChC,IAAA,IAAI,EAAA,CAAG,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,iDAAA;AAChC,IAAA,IAAI,EAAA,CAAG,QAAA,CAAS,OAAO,CAAA,EAAG,OAAO,sBAAA;AAAA,EACnC;AAEA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,MAAM,UAAU,OAAA,CAAQ,SAAA,EAAU,CAAE,KAAA,CAAM,GAAG,GAAG,CAAA;AAEhD,IAAA,IAAI,QAAQ,UAAA,CAAW,GAAG,KAAK,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AACtD,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,MAAM,OAAO,CAAA;AAClB,QAAA,OAAO,kBAAA;AAAA,MACT,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,IACE,QAAQ,UAAA,CAAW,GAAG,KACtB,OAAA,CAAQ,KAAA,CAAM,GAAG,GAAI,CAAA,CAAE,SAAS,OAAO,CAAA,IACvC,QAAQ,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,CAAE,QAAA,CAAS,MAAM,CAAA,EACrC;AACA,MAAA,OAAO,eAAA;AAAA,IACT;AAEA,IAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,CAAE,KAAA,CAAM,GAAG,CAAC,CAAA;AAC5C,IAAA,IAAI,KAAA,CAAM,UAAU,CAAA,EAAG;AACrB,MAAA,MAAM,cAAc,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,MAAM,CAAA,CAAE,GAAA,CAAI,CAAC,UAAU,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,IAAK,IAAI,MAAM,CAAA;AACrG,MAAA,IAAI,WAAA,CAAY,MAAA,IAAU,CAAA,IAAK,IAAI,GAAA,CAAI,WAAW,CAAA,CAAE,IAAA,KAAS,CAAA,IAAK,WAAA,CAAY,CAAC,CAAA,IAAM,CAAA,EAAG;AACtF,QAAA,OAAO,UAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,cAAc,IAAA,EAA0C;AACtE,EAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,EAAA,MAAM,CAAA,GAAI,KAAK,WAAA,EAAY;AAC3B,EAAA,OAAO,CAAC,KAAA,EAAO,OAAA,EAAS,OAAA,EAAS,eAAA,EAAiB,eAAe,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA;AAC9F;AAEO,SAAS,eAAe,IAAA,EAA0C;AACvE,EAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,EAAA,MAAM,CAAA,GAAI,KAAK,WAAA,EAAY;AAC3B,EAAA,OAAO,CAAA,CAAE,QAAA,CAAS,UAAU,CAAA,IAAK,CAAA,KAAM,SAAA;AACzC;AAEO,SAAS,WAAW,IAAA,EAA0C;AACnE,EAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,EAAA,OAAO,IAAA,CAAK,WAAA,EAAY,CAAE,QAAA,CAAS,MAAM,CAAA;AAC3C;AAEA,SAAS,cAAc,KAAA,EAAwB;AAC7C,EAAA,OAAO,UAAA,CAAW,KAAK,KAAK,CAAA;AAC9B;AAEA,SAAS,eAAe,KAAA,EAAuB;AAC7C,EAAA,IAAI,aAAA,CAAc,KAAK,CAAA,EAAG,OAAO,IAAI,KAAA,CAAM,UAAA,CAAW,GAAA,EAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAChE,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,SAAS,IAAA,EAA0B;AAC1C,EAAA,OAAO,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAC,QAAQ,GAAA,CAAI,GAAA,CAAI,cAAc,CAAA,CAAE,KAAK,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,CAAA;AAC7E;AAEA,SAAS,SAAS,IAAA,EAA0B;AAC1C,EAAA,MAAM,OAAmB,EAAC;AAC1B,EAAA,IAAI,MAAgB,EAAC;AACrB,EAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,OAAO,CAAA,GAAI,KAAK,MAAA,EAAQ;AACtB,IAAA,MAAM,EAAA,GAAK,KAAK,CAAC,CAAA;AACjB,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAI,OAAO,GAAA,EAAK;AACd,QAAA,IAAI,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,KAAM,GAAA,EAAK;AACvB,UAAA,KAAA,IAAS,GAAA;AACT,UAAA,CAAA,IAAK,CAAA;AACL,UAAA;AAAA,QACF;AACA,QAAA,QAAA,GAAW,KAAA;AACX,QAAA,CAAA,IAAK,CAAA;AACL,QAAA;AAAA,MACF;AACA,MAAA,KAAA,IAAS,EAAA;AACT,MAAA,CAAA,IAAK,CAAA;AACL,MAAA;AAAA,IACF;AACA,IAAA,IAAI,OAAO,GAAA,EAAK;AACd,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,CAAA,IAAK,CAAA;AACL,MAAA;AAAA,IACF;AACA,IAAA,IAAI,OAAO,GAAA,EAAK;AACd,MAAA,GAAA,CAAI,KAAK,KAAK,CAAA;AACd,MAAA,KAAA,GAAQ,EAAA;AACR,MAAA,CAAA,IAAK,CAAA;AACL,MAAA;AAAA,IACF;AACA,IAAA,IAAI,OAAO,IAAA,EAAM;AACf,MAAA,CAAA,IAAK,CAAA;AACL,MAAA;AAAA,IACF;AACA,IAAA,IAAI,OAAO,IAAA,EAAM;AACf,MAAA,GAAA,CAAI,KAAK,KAAK,CAAA;AACd,MAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AACb,MAAA,GAAA,GAAM,EAAC;AACP,MAAA,KAAA,GAAQ,EAAA;AACR,MAAA,CAAA,IAAK,CAAA;AACL,MAAA;AAAA,IACF;AACA,IAAA,KAAA,IAAS,EAAA;AACT,IAAA,CAAA,IAAK,CAAA;AAAA,EACP;AACA,EAAA,IAAI,YAAY,KAAA,CAAM,MAAA,GAAS,CAAA,IAAK,GAAA,CAAI,SAAS,CAAA,EAAG;AAClD,IAAA,GAAA,CAAI,KAAK,KAAK,CAAA;AACd,IAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,EACf;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,UAAU,KAAA,EAAwB;AACzC,EAAA,OAAO,IAAA,CAAK,UAAU,KAAA,EAAO,IAAA,EAAM,CAAC,CAAA,CAAE,OAAA,CAAQ,kBAAA,EAAoB,CAAC,EAAA,KAAO;AACxE,IAAA,OAAO,CAAA,GAAA,EAAM,EAAA,CAAG,UAAA,CAAW,CAAC,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAAA,EAC7D,CAAC,CAAA;AACH;AAIA,SAAS,iBAAiB,OAAA,EAAmD;AAC3E,EAAA,MAAM,KAAA,GAAA,CAAS,OAAA,IAAW,EAAA,EAAI,KAAA,CAAM,YAAY,CAAA;AAChD,EAAA,MAAM,SAA2C,EAAC;AAClD,EAAA,IAAI,YAAA,GAA8B,IAAA;AAClC,EAAA,IAAI,eAAyB,EAAC;AAE9B,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,CAAA,GAAI,eAAA,CAAgB,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAC1C,IAAA,eAAA,CAAgB,SAAA,GAAY,CAAA;AAC5B,IAAA,IAAI,CAAA,EAAG;AACL,MAAA,IAAI,aAAa,MAAA,EAAQ;AACvB,QAAA,MAAA,CAAO,IAAA,CAAK,CAAC,YAAA,EAAc,YAAY,CAAC,CAAA;AACxC,QAAA,YAAA,GAAe,EAAC;AAAA,MAClB;AACA,MAAA,YAAA,GAAe,CAAA,CAAE,CAAC,CAAA,CAAG,IAAA,EAAK;AAC1B,MAAA;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,IAAA,EAAK,EAAG,YAAA,CAAa,KAAK,IAAI,CAAA;AAAA,EACzC;AAEA,EAAA,IAAI,aAAa,MAAA,EAAQ,MAAA,CAAO,KAAK,CAAC,YAAA,EAAc,YAAY,CAAC,CAAA;AACjE,EAAA,IAAI,CAAC,MAAA,CAAO,MAAA,IAAU,KAAA,CAAM,MAAA,EAAQ;AAClC,IAAA,OAAO,CAAC,CAAC,IAAA,EAAM,KAAA,CAAM,MAAA,CAAO,CAAC,EAAA,KAAO,EAAA,CAAG,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,EACjD;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,YAAA,CAAa,IAAA,EAAc,YAAA,GAAe,EAAA,EAA4C;AACpG,EAAA,IAAI;AACF,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,MAAM,aAA0B,EAAC;AAEjC,IAAA,KAAA,MAAW,CAAC,UAAA,EAAY,UAAU,CAAA,IAAK,gBAAA,CAAiB,IAAI,CAAA,EAAG;AAC7D,MAAA,IAAI,CAAC,WAAW,MAAA,EAAQ;AAExB,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC,CAAA;AAE3C,MAAA,IAAI,IAAA,CAAK,UAAU,CAAA,EAAG;AACpB,QAAA,IAAI,SAAA,GAAY,UAAA,CAAW,IAAA,CAAK,IAAI,EAAE,IAAA,EAAK;AAC3C,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,IAAI,UAAA,EAAY,SAAA,GAAY,CAAA,QAAA,EAAW,UAAU,CAAA;AAAA,EAAM,SAAS,CAAA,CAAA;AAChE,UAAA,MAAA,CAAO,KAAK,SAAS,CAAA;AACrB,UAAA,MAAM,IAAA,GAAkB,EAAE,UAAA,EAAY,KAAA,EAAM;AAC5C,UAAA,IAAI,UAAA,OAAiB,WAAA,GAAc,UAAA;AACnC,UAAA,UAAA,CAAW,KAAK,IAAI,CAAA;AAAA,QACtB;AACA,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAS,KAAK,CAAC,CAAA;AACrB,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AAE7B,MAAA,IAAI,qBAAA,GAAwB,YAAA;AAC5B,MAAA,MAAM,UAAU,MAAA,CAAO,MAAA;AACvB,MAAA,IAAI,OAAA,GAAU,KAAK,qBAAA,GAAwB,CAAA;AAAA,WAAA,IAClC,OAAA,GAAU,IAAI,qBAAA,GAAwB,EAAA;AAAA,WAAA,IACtC,OAAA,GAAU,IAAI,qBAAA,GAAwB,EAAA;AAE/C,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,MAAA,EAAQ,KAAK,qBAAA,EAAuB;AAC/D,QAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,IAAI,qBAAqB,CAAA;AACzD,QAAA,IAAI,SAAA,GAAY,SAAS,CAAC,MAAA,EAAQ,GAAG,KAAK,CAAC,EAAE,IAAA,EAAK;AAClD,QAAA,IAAI,UAAA,IAAc,SAAA,EAAW,SAAA,GAAY,CAAA,QAAA,EAAW,UAAU,CAAA;AAAA,EAAM,SAAS,CAAA,CAAA;AAE7E,QAAA,IAAI,SAAA,CAAU,MAAA,GAAS,eAAA,IAAmB,KAAA,CAAM,SAAS,CAAA,EAAG;AAC1D,UAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,SAAS,CAAC,CAAA;AACxC,UAAA,MAAM,UAAA,GAA0C;AAAA,YAC9C,CAAC,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,IAAI,GAAG,CAAC,CAAA;AAAA,YACxB,CAAC,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA,EAAG,IAAI,IAAI;AAAA,WAC9B;AACA,UAAA,KAAA,MAAW,CAAC,QAAA,EAAU,QAAQ,CAAA,IAAK,UAAA,EAAY;AAC7C,YAAA,IAAI,QAAA,GAAW,SAAS,CAAC,MAAA,EAAQ,GAAG,QAAQ,CAAC,EAAE,IAAA,EAAK;AACpD,YAAA,IAAI,UAAA,IAAc,QAAA,EAAU,QAAA,GAAW,CAAA,QAAA,EAAW,UAAU,CAAA;AAAA,EAAM,QAAQ,CAAA,CAAA;AAC1E,YAAA,IAAI,QAAA,EAAU;AACZ,cAAA,MAAA,CAAO,KAAK,QAAQ,CAAA;AACpB,cAAA,MAAM,IAAA,GAAkB;AAAA,gBACtB,UAAA,EAAY,GAAG,QAAA,GAAW,CAAC,IAAI,QAAA,GAAW,QAAA,CAAS,SAAS,CAAC,CAAA,CAAA;AAAA,gBAC7D,YAAY,QAAA,CAAS;AAAA,eACvB;AACA,cAAA,IAAI,UAAA,OAAiB,WAAA,GAAc,UAAA;AACnC,cAAA,UAAA,CAAW,KAAK,IAAI,CAAA;AAAA,YACtB;AAAA,UACF;AAAA,QACF,WAAW,SAAA,EAAW;AACpB,UAAA,MAAA,CAAO,KAAK,SAAS,CAAA;AACrB,UAAA,MAAM,IAAA,GAAkB;AAAA,YACtB,UAAA,EAAY,GAAG,CAAA,GAAI,CAAC,IAAI,CAAA,GAAI,KAAA,CAAM,SAAS,CAAC,CAAA,CAAA;AAAA,YAC5C,YAAY,QAAA,CAAS;AAAA,WACvB;AACA,UAAA,IAAI,UAAA,OAAiB,WAAA,GAAc,UAAA;AACnC,UAAA,UAAA,CAAW,KAAK,IAAI,CAAA;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,MAAA,CAAO,MAAA,GAAS,CAAC,MAAA,EAAQ,UAAU,CAAA,GAAI,CAAC,CAAC,IAAI,GAAG,CAAC,EAAE,UAAA,EAAY,KAAA,EAAO,CAAC,CAAA;AAAA,EAChF,SAAS,GAAA,EAAK;AACZ,IAAA,GAAA,CAAI,IAAA,CAAK,wDAAwD,GAAG,CAAA;AACpE,IAAA,OAAO,CAAC,MAAM,IAAI,CAAA;AAAA,EACpB;AACF;AAEO,SAAS,cAAc,IAAA,EAAsD;AAClF,EAAA,IAAI,CAAC,MAAM,IAAA,EAAK,SAAU,CAAC,EAAC,EAAG,EAAE,CAAA;AAEjC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAE7B,EAAA,IAAI,QAAA,GAA0B,IAAA;AAC9B,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,IAAA,CAAK,WAAW,IAAI,CAAA,IAAK,CAAC,IAAA,CAAK,UAAA,CAAW,KAAK,CAAA,EAAG;AACpD,MAAA,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,EAAK;AAC9B,MAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,aAA0B,EAAC;AACjC,EAAA,IAAI,oBAA8B,EAAC;AACnC,EAAA,IAAI,SAAA,GAA2B,IAAA;AAC/B,EAAA,IAAI,aAAA,GAAgB,KAAA;AAEpB,EAAA,MAAM,YAAA,GAAe,CAAC,eAAA,KAA4B;AAChD,IAAA,IAAI,CAAC,kBAAkB,MAAA,EAAQ;AAC/B,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,IAAI,QAAA,EAAU,MAAA,GAAS,CAAA,EAAA,EAAK,QAAQ;AAAA,CAAA;AACpC,IAAA,IAAI,SAAA,EAAW,MAAA,IAAU,CAAA,GAAA,EAAM,SAAS;AAAA,CAAA;AACxC,IAAA,MAAM,YAAY,MAAA,GAAS,iBAAA,CAAkB,IAAA,CAAK,IAAI,EAAE,IAAA,EAAK;AAE7D,IAAA,IAAI,SAAA,CAAU,SAAS,eAAA,EAAiB;AACtC,MAAA,MAAM,SAAA,GAAY,gBAAgB,SAAS,CAAA;AAC3C,MAAA,KAAA,MAAW,MAAM,SAAA,EAAW;AAC1B,QAAA,MAAA,CAAO,KAAK,EAAE,CAAA;AACd,QAAA,UAAA,CAAW,KAAK,EAAE,aAAA,EAAe,SAAA,IAAa,QAAA,IAAY,iBAAiB,CAAA;AAAA,MAC7E;AAAA,IACF,CAAA,MAAA,IAAW,SAAA,CAAU,IAAA,EAAK,EAAG;AAC3B,MAAA,MAAA,CAAO,KAAK,SAAS,CAAA;AACrB,MAAA,UAAA,CAAW,KAAK,EAAE,aAAA,EAAe,SAAA,IAAa,QAAA,IAAY,iBAAiB,CAAA;AAAA,IAC7E;AAAA,EACF,CAAA;AAEA,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,CAAC,aAAA,IAAiB,QAAA,KAAa,IAAA,IAAQ,KAAK,UAAA,CAAW,IAAI,CAAA,IAAK,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,OAAW,QAAA,EAAU;AACrG,MAAA,aAAA,GAAgB,IAAA;AAChB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,KAAK,CAAA,EAAG;AAC1B,MAAA,YAAA,CAAa,OAAO,CAAA;AACpB,MAAA,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,EAAK;AAC/B,MAAA,iBAAA,GAAoB,EAAC;AAAA,IACvB,CAAA,MAAO;AACL,MAAA,iBAAA,CAAkB,KAAK,IAAI,CAAA;AAAA,IAC7B;AAAA,EACF;AAEA,EAAA,YAAA,CAAa,OAAO,CAAA;AAEpB,EAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,CAAC,SAAS,IAAA,CAAK,UAAA,CAAW,KAAK,CAAC,CAAA;AAClE,EAAA,IAAI,CAAC,kBAAkB,MAAA,CAAO,MAAA,KAAW,GAAG,OAAO,CAAC,MAAM,IAAI,CAAA;AAC9D,EAAA,OAAO,CAAC,QAAQ,UAAU,CAAA;AAC5B;AAEO,SAAS,SAAA,CAAU,IAAA,EAAc,aAAA,GAAgB,EAAA,EAA4C;AAClG,EAAA,IAAI;AACF,IAAA,IAAI,KAAK,UAAA,CAAW,QAAQ,GAAG,IAAA,GAAO,IAAA,CAAK,MAAM,CAAC,CAAA;AAClD,IAAA,MAAM,IAAA,GAAgB,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAErC,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,MAAA,IAAI,IAAA,CAAK,UAAU,aAAA,EAAe;AAChC,QAAA,OAAO,CAAC,CAAC,IAAI,CAAA,EAAG,CAAC,EAAE,SAAA,EAAW,KAAA,EAAO,UAAA,EAAY,IAAA,CAAK,MAAA,EAAQ,CAAC,CAAA;AAAA,MACjE;AAEA,MAAA,MAAM,SAAmB,EAAC;AAC1B,MAAA,MAAM,aAA0B,EAAC;AACjC,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,EAAQ,KAAK,aAAA,EAAe;AACnD,QAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,IAAI,aAAa,CAAA;AAC3C,QAAA,IAAI,SAAA,GAAY,UAAU,KAAK,CAAA;AAC/B,QAAA,IAAI,SAAA,GAAY,IAAI,KAAA,CAAM,MAAA;AAE1B,QAAA,IAAI,SAAA,CAAU,MAAA,GAAS,eAAA,IAAmB,KAAA,CAAM,SAAS,CAAA,EAAG;AAC1D,UAAA,IAAI,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,SAAS,CAAC,CAAA;AAC7C,UAAA,OAAO,cAAc,CAAA,EAAG;AACtB,YAAA,MAAM,YAAA,GAAe,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,WAAW,CAAA;AAC/C,YAAA,SAAA,GAAY,UAAU,YAAY,CAAA;AAClC,YAAA,IAAI,SAAA,CAAU,UAAU,eAAA,EAAiB;AACvC,cAAA,KAAA,GAAQ,YAAA;AACR,cAAA,SAAA,GAAY,IAAI,KAAA,CAAM,MAAA;AACtB,cAAA;AAAA,YACF;AACA,YAAA,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,WAAA,GAAc,CAAC,CAAA;AAAA,UAC1C;AAAA,QACF;AAEA,QAAA,SAAA,GAAY,WAAW,CAAA,GAAI,CAAC,IAAI,SAAS,CAAA,IAAA,EAAO,KAAK,MAAM;AAAA,EAAK,SAAS,CAAA,CAAA;AACzE,QAAA,MAAA,CAAO,KAAK,SAAS,CAAA;AACrB,QAAA,UAAA,CAAW,IAAA,CAAK;AAAA,UACd,SAAA,EAAW,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,CAAA;AAAA,UAC7B,WAAA,EAAa,CAAA,EAAG,CAAA,GAAI,CAAC,IAAI,SAAS,CAAA;AAAA,SACnC,CAAA;AAAA,MACH;AACA,MAAA,OAAO,CAAC,QAAQ,UAAU,CAAA;AAAA,IAC5B;AAEA,IAAA,IAAI,IAAA,KAAS,QAAQ,OAAO,IAAA,KAAS,YAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACrE,MAAA,MAAM,GAAA,GAAM,IAAA;AACZ,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AAC5B,MAAA,IAAI,IAAA,CAAK,UAAU,CAAA,EAAG;AACpB,QAAA,OAAO,CAAC,CAAC,IAAI,CAAA,EAAG,CAAC,EAAE,SAAA,EAAW,KAAA,EAAO,SAAA,EAAW,IAAA,CAAK,MAAA,EAAQ,CAAC,CAAA;AAAA,MAChE;AAEA,MAAA,MAAM,SAAmB,EAAC;AAC1B,MAAA,MAAM,aAA0B,EAAC;AACjC,MAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,QAAA,MAAM,KAAA,GAAQ,IAAI,GAAG,CAAA;AACrB,QAAA,IAAI,YAAY,SAAA,CAAU,EAAE,CAAC,GAAG,GAAG,OAAO,CAAA;AAC1C,QAAA,IAAI,SAAA,CAAU,SAAS,eAAA,EAAiB;AACtC,UAAA,SAAA,GAAY,UAAU,GAAG,CAAA;AAAA,EAAiB,UAAU,KAAK,CAAA,CAAE,MAAM,CAAA,EAAG,eAAA,GAAkB,GAAG,CAAC,CAAA,GAAA,CAAA;AAAA,QAC5F;AACA,QAAA,MAAA,CAAO,KAAK,SAAS,CAAA;AACrB,QAAA,UAAA,CAAW,IAAA,CAAK,EAAE,SAAA,EAAW,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,aAAA,EAAe,KAAK,CAAA;AAAA,MAC9D;AACA,MAAA,OAAO,CAAC,QAAQ,UAAU,CAAA;AAAA,IAC5B;AAEA,IAAA,OAAO,CAAC,CAAC,IAAI,CAAA,EAAG,CAAC,EAAE,SAAA,EAAW,EAAA,EAAI,CAAC,CAAA;AAAA,EACrC,SAAS,GAAA,EAAK;AACZ,IAAA,GAAA,CAAI,KAAA,CAAM,yDAAyD,GAAG,CAAA;AACtE,IAAA,OAAO,CAAC,MAAM,IAAI,CAAA;AAAA,EACpB;AACF;AAEO,SAAS,iBAAA,CAAkB,IAAA,EAAc,MAAA,EAAkB,UAAA,EAA+B;AAC/F,EAAA,MAAM,UAAmC,EAAC;AAC1C,EAAA,MAAM,EAAA,GAAK,IAAI,MAAA,CAAO,cAAA,CAAe,QAAQ,IAAI,CAAA;AACjD,EAAA,KAAA,MAAW,CAAA,IAAA,CAAM,IAAA,IAAQ,EAAA,EAAI,QAAA,CAAS,EAAE,CAAA,EAAG;AACzC,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,CAAE,KAAA,EAAO,OAAO,CAAA,CAAE,CAAC,CAAC,CAAC,CAAC,CAAA;AAAA,EACtC;AACA,EAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,IAAU,CAAC,OAAO,MAAA,EAAQ;AAEvC,EAAA,MAAM,UAAA,GAAa,4BAAA;AAEnB,EAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,MAAA,CAAO,QAAQ,GAAA,EAAA,EAAO;AAC5C,IAAA,MAAM,SAAA,GAAY,OAAO,GAAG,CAAA;AAC5B,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,KAAA,MAAW,IAAA,IAAQ,SAAA,CAAU,KAAA,CAAM,IAAI,CAAA,EAAG;AACxC,MAAA,MAAM,QAAA,GAAW,KAAK,IAAA,EAAK;AAC3B,MAAA,IAAI,QAAA,IAAY,CAAC,UAAA,CAAW,IAAA,CAAK,QAAQ,CAAA,IAAK,QAAA,CAAS,SAAS,EAAA,EAAI;AAClE,QAAA,MAAA,GAAS,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAC7B,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,CAAC,QAAQ,MAAA,GAAS,SAAA,CAAU,MAAK,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AAClD,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AAC/B,IAAA,IAAI,MAAM,CAAA,EAAG;AAEb,IAAA,IAAI,EAAA,GAAK,CAAA;AACT,IAAA,IAAI,EAAA,GAAK,QAAQ,MAAA,GAAS,CAAA;AAC1B,IAAA,IAAI,IAAA,GAAsB,IAAA;AAC1B,IAAA,OAAO,MAAM,EAAA,EAAI;AACf,MAAA,MAAM,GAAA,GAAO,KAAK,EAAA,IAAO,CAAA;AACzB,MAAA,IAAI,OAAA,CAAQ,GAAG,CAAA,CAAG,CAAC,KAAK,GAAA,EAAK;AAC3B,QAAA,IAAA,GAAO,OAAA,CAAQ,GAAG,CAAA,CAAG,CAAC,CAAA;AACtB,QAAA,EAAA,GAAK,GAAA,GAAM,CAAA;AAAA,MACb,CAAA,MAAO;AACL,QAAA,EAAA,GAAK,GAAA,GAAM,CAAA;AAAA,MACb;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,GAAA,GAAM,UAAA,CAAW,MAAA,EAAQ;AAC5C,MAAA,UAAA,CAAW,GAAG,EAAG,IAAA,GAAO,IAAA;AAAA,IAC1B;AAAA,EACF;AACF;AAEO,SAAS,eACd,IAAA,EACA,IAAA,EACA,KAAA,EACA,IAAA,GAAiC,EAAC,EACM;AACxC,EAAA,MAAM,UAAA,GAAa,KAAK,UAAA,IAAc,KAAA;AACtC,EAAA,MAAM,aAAA,GAAgB,IAAA,IAAQ,SAAA,CAAU,IAAA,EAAM,KAAK,CAAA;AAEnD,EAAA,IAAI,MAAA,GAA0B,IAAA;AAC9B,EAAA,IAAI,UAAA,GAAiC,IAAA;AAErC,EAAA,IAAI,aAAA,CAAc,aAAa,CAAA,EAAG;AAChC,IAAA,CAAC,MAAA,EAAQ,UAAU,CAAA,GAAI,YAAA,CAAa,IAAI,CAAA;AAAA,EAC1C,CAAA,MAAA,IAAW,UAAA,CAAW,aAAa,CAAA,EAAG;AACpC,IAAA,CAAC,MAAA,EAAQ,UAAU,CAAA,GAAI,SAAA,CAAU,IAAI,CAAA;AAAA,EACvC,CAAA,MAAA,IAAW,UAAA,IAAc,cAAA,CAAe,aAAa,CAAA,EAAG;AACtD,IAAA,CAAC,MAAA,EAAQ,UAAU,CAAA,GAAI,aAAA,CAAc,IAAI,CAAA;AAAA,EAC3C;AAEA,EAAA,IAAI,MAAA,KAAW,IAAA,IAAQ,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AAC1C,IAAA,MAAA,GAAS,gBAAgB,IAAI,CAAA;AAC7B,IAAA,UAAA,GAAa,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,OAAO,MAAA,EAAO,EAAG,OAAO,EAAC,CAAE,CAAA;AAAA,EAC/D;AACA,EAAA,UAAA,GAAa,cAAc,EAAC;AAE5B,EAAA,iBAAA,CAAkB,IAAA,EAAM,QAAQ,UAAU,CAAA;AAE1C,EAAA,MAAA,GAAS,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,oBAAA,EAAsB,EAAE,CAAA,CAAE,IAAA,EAAM,CAAA;AACrE,EAAA,MAAM,MAAA,GAAS,OAAO,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM,CAAC,GAAG,UAAA,CAAY,CAAC,CAAE,CAAwB,CAAA,CAAE,OAAO,CAAC,CAAC,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAA;AACzG,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,MAAA,GAAS,OAAO,GAAA,CAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;AAC9B,IAAA,UAAA,GAAa,OAAO,GAAA,CAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;AAAA,EACtC,CAAA,MAAO;AACL,IAAA,MAAA,GAAS,EAAC;AACV,IAAA,UAAA,GAAa,EAAC;AAAA,EAChB;AAEA,EAAA,OAAO,CAAC,MAAA,EAAQ,aAAA,EAAe,UAAU,CAAA;AAC3C;AAEO,SAAS,YAAY,IAAA,EAAyC;AACnE,EAAA,IAAI,aAAA,CAAc,IAAI,CAAA,EAAG,OAAO,SAAA;AAChC,EAAA,IAAI,UAAA,CAAW,IAAI,CAAA,EAAG,OAAO,MAAA;AAC7B,EAAA,IAAI,cAAA,CAAe,IAAI,CAAA,EAAG,OAAO,UAAA;AACjC,EAAA,OAAO,SAAA;AACT;AAIA,SAAS,cAAc,QAAA,EAA8B;AACnD,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,IAAA,MAAM,CAAC,GAAA,EAAK,KAAK,CAAA,GAAI,SAAS,CAAC,CAAA;AAC/B,IAAA,IAAI,CAAA,GAAI,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AACzB,IAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAAA,EAClB;AACA,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA,CAAE,IAAA,EAAK;AAC7B;AAEA,SAAS,gBAAgB,CAAA,EAAmB;AAC1C,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,KAAA,MAAW,CAAA,IAAK,GAAG,CAAA,IAAK,CAAA;AACxB,EAAA,OAAO,CAAA;AACT;AAEO,SAAS,eAAA,CAAgB,IAAA,EAAc,QAAA,GAAW,GAAA,EAAK,UAAU,EAAA,EAAc;AACpF,EAAA,MAAM,QAAoB,EAAC;AAC3B,EAAA,IAAI,YAAA,GAAe,KAAA;AACnB,EAAA,KAAA,MAAW,EAAA,IAAA,CAAO,IAAA,IAAQ,EAAA,EAAI,KAAA,CAAM,YAAY,CAAA,EAAG;AACjD,IAAA,MAAM,QAAA,GAAW,GAAG,IAAA,EAAK;AACzB,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,YAAA,GAAe,MAAM,MAAA,GAAS,CAAA;AAC9B,MAAA;AAAA,IACF;AACA,IAAA,MAAM,OAAA,GAAU,eAAe,MAAA,GAAS,IAAA;AACxC,IAAA,YAAA,GAAe,KAAA;AACf,IAAA,IAAI,qBAAqB,IAAA,CAAK,EAAE,CAAA,IAAK,QAAA,CAAS,UAAU,GAAA,EAAK;AAC3D,MAAA,KAAA,CAAM,IAAA,CAAK,CAAC,OAAA,EAAS,QAAA,EAAU,SAAS,QAAQ,CAAA,CAAE,MAAM,CAAC,CAAA;AAAA,IAC3D,CAAA,MAAO;AACL,MAAA,IAAI,KAAA,GAAQ,IAAA;AACZ,MAAA,KAAA,MAAW,IAAA,IAAQ,cAAA,CAAe,EAAE,CAAA,EAAG;AACrC,QAAA,MAAM,CAAA,GAAI,KAAK,IAAA,EAAK;AACpB,QAAA,IAAI,CAAA,EAAG;AACL,UAAA,KAAA,CAAM,IAAA,CAAK,CAAC,KAAA,GAAQ,OAAA,GAAU,GAAA,EAAK,GAAG,QAAA,CAAS,CAAC,CAAA,CAAE,MAAM,CAAC,CAAA;AACzD,UAAA,KAAA,GAAQ,KAAA;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,kBAA8B,EAAC;AACrC,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAA,EAAO,OAAO,KAAK,KAAA,EAAO;AAC1C,IAAA,IAAI,WAAW,QAAA,EAAU;AACvB,MAAA,eAAA,CAAgB,IAAA,CAAK,CAAC,IAAA,EAAM,KAAA,EAAO,OAAO,CAAC,CAAA;AAC3C,MAAA;AAAA,IACF;AACA,IAAA,MAAM,cAAc,QAAA,GAAW,CAAA;AAC/B,IAAA,MAAM,MAAA,GAAS,CAAC,GAAG,KAAK,CAAA;AACxB,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,IAAI,QAAA,GAAW,IAAA;AACf,IAAA,OAAO,GAAA,GAAM,OAAO,MAAA,EAAQ;AAC1B,MAAA,IAAI,UAAA,GAAa,MAAA,CAAO,KAAA,CAAM,GAAA,EAAK,MAAM,WAAW,CAAA;AACpD,MAAA,IAAI,KAAA,GAAQ,UAAA,CAAW,IAAA,CAAK,EAAE,CAAA;AAC9B,MAAA,IAAI,GAAA,GAAM,WAAA,GAAc,MAAA,CAAO,MAAA,EAAQ;AACrC,QAAA,MAAM,EAAA,GAAK,KAAA,CAAM,WAAA,CAAY,GAAG,CAAA;AAChC,QAAA,IAAI,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,WAAA,GAAc,CAAC,CAAA,EAAG;AACpC,UAAA,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AACzB,UAAA,UAAA,GAAa,CAAC,GAAG,KAAK,CAAA;AAAA,QACxB;AAAA,MACF;AACA,MAAA,IAAI,WAAA,GAAc,SAAS,KAAK,CAAA;AAChC,MAAA,IAAI,WAAA,CAAY,SAAS,QAAA,EAAU;AACjC,QAAA,KAAA,GAAQ,WAAW,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA,CAAE,KAAK,EAAE,CAAA;AAC7C,QAAA,WAAA,GAAc,SAAS,KAAK,CAAA;AAAA,MAC9B;AACA,MAAA,eAAA,CAAgB,KAAK,CAAC,QAAA,EAAU,KAAA,EAAO,WAAA,CAAY,MAAM,CAAC,CAAA;AAC1D,MAAA,GAAA,IAAO,gBAAgB,KAAK,CAAA;AAC5B,MAAA,QAAA,GAAW,EAAA;AAAA,IACb;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,eAAA,CAAgB,IAAA,CAAK,CAAC,KAAK,CAAC,CAAA,KAAM,CAAC,CAAA,EAAG,OAAO,EAAC;AAEnD,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,IAAI,QAAA,GAA0B,IAAA;AAC9B,EAAA,IAAI,MAAkB,EAAC;AACvB,EAAA,IAAI,SAAA,GAAY,CAAA;AAEhB,EAAA,MAAM,QAAQ,MAAM;AAClB,IAAA,MAAM,KAAA,GAAQ,cAAc,GAAG,CAAA;AAC/B,IAAA,IAAI,UAAU,QAAA,KAAa,IAAA,IAAQ,WAAW,KAAA,EAAO,QAAQ,IAAI,IAAA,CAAA,EAAO;AACtE,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AACjB,MAAA,QAAA,GAAW,KAAA;AAAA,IACb;AACA,IAAA,MAAM,UAAsB,EAAC;AAC7B,IAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,IAAA,KAAA,IAAS,IAAI,GAAA,CAAI,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACxC,MAAA,MAAM,IAAA,GAAO,IAAI,CAAC,CAAA;AAClB,MAAA,IAAI,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,IAAK,gBAAgB,IAAA,CAAK,CAAC,IAAI,OAAA,EAAS;AACxD,MAAA,OAAA,CAAQ,QAAQ,IAAI,CAAA;AACpB,MAAA,aAAA,IAAiB,KAAK,CAAC,CAAA;AAAA,IACzB;AACA,IAAA,GAAA,GAAM,OAAA;AACN,IAAA,SAAA,GAAY,aAAA;AAAA,EACd,CAAA;AAEA,EAAA,KAAA,MAAW,QAAQ,eAAA,EAAiB;AAClC,IAAA,IAAI,IAAI,MAAA,IAAU,SAAA,GAAY,KAAK,CAAC,CAAA,GAAI,UAAU,KAAA,EAAM;AACxD,IAAA,GAAA,CAAI,KAAK,IAAI,CAAA;AACb,IAAA,SAAA,IAAa,KAAK,CAAC,CAAA;AAAA,EACrB;AAEA,EAAA,IAAI,IAAI,MAAA,EAAQ;AACd,IAAA,MAAM,KAAA,GAAQ,cAAc,GAAG,CAAA;AAC/B,IAAA,IAAI,UAAU,QAAA,KAAa,IAAA,IAAQ,WAAW,KAAA,EAAO,QAAQ,IAAI,IAAA,CAAA,EAAO;AACtE,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,IACnB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;;;ACrpBA,WAAA,EAAA;AACA,UAAA,EAAA;AAEA,QAAA,EAAA;ACbO,SAAS,WAAA,CAAY,MAA+B,GAAA,EAAqB;AAC9E,EAAA,MAAM,KAAA,GAAQQ,mBAAY,EAAE,CAAA;AAC5B,EAAA,MAAM,MAAA,GAASC,qBAAA,CAAe,aAAA,EAAe,GAAA,EAAK,KAAK,CAAA;AACvD,EAAA,MAAM,YAAY,MAAA,CAAO,IAAA,CAAK,KAAK,SAAA,CAAU,IAAI,GAAG,MAAM,CAAA;AAC1D,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,MAAA,CAAO,CAAC,MAAA,CAAO,MAAA,CAAO,SAAS,CAAA,EAAG,MAAA,CAAO,KAAA,EAAO,CAAC,CAAA;AAC3E,EAAA,MAAM,GAAA,GAAM,OAAO,UAAA,EAAW;AAC9B,EAAA,OAAO,MAAA,CAAO,OAAO,CAAC,KAAA,EAAO,YAAY,GAAG,CAAC,CAAA,CAAE,QAAA,CAAS,QAAQ,CAAA;AAClE;AAEO,SAAS,WAAA,CAAY,OAAe,GAAA,EAAsC;AAC/E,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,IAAA,CAAK,KAAA,EAAO,QAAQ,CAAA;AACvC,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,EAAE,CAAA;AAChC,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,SAAS,EAAE,CAAA;AACxC,EAAA,MAAM,aAAa,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,GAAA,CAAI,SAAS,EAAE,CAAA;AACnD,EAAA,MAAM,QAAA,GAAWC,uBAAA,CAAiB,aAAA,EAAe,GAAA,EAAK,KAAK,CAAA;AAC3D,EAAA,QAAA,CAAS,WAAW,GAAG,CAAA;AACvB,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,CAAC,QAAA,CAAS,MAAA,CAAO,UAAU,CAAA,EAAG,QAAA,CAAS,KAAA,EAAO,CAAC,CAAA;AAC/E,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,QAAA,CAAS,MAAM,CAAC,CAAA;AAC9C;AAEO,SAAS,aAAa,MAAA,EAA+C;AAC1E,EAAA,MAAM,YAAY,MAAA,CAAO,SAAA;AACzB,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAGF;AAAA,EACF;AACA,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,SAAA,EAAW,WAAW,CAAA;AAC3C;AAEO,SAAS,aAAA,CAAc,KAAsB,KAAA,EAAuB;AACzE,EAAA,MAAM,IAAI,OAAO,GAAA,KAAQ,WAAW,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,GAAI,GAAA;AACvD,EAAA,OAAOC,iBAAA,CAAW,UAAU,CAAC,CAAA,CAAE,OAAO,KAAA,EAAO,MAAM,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AACnE;;;AC1CA,UAAA,EAAA;AAQO,IAAM,sBAAA,mBAAyB,IAAI,GAAA,CAAI,CAAC,OAAA,EAAS,SAAS,KAAA,EAAO,aAAA,EAAe,MAAA,EAAQ,SAAS,CAAC,CAAA;AAalG,IAAM,gBAAN,MAAoB;AAAA,EACzB,IAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACQ,QAAA,GAA0B,IAAA;AAAA,EAElC,YAAY,IAAA,EAAyB;AACnC,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,QAAA,GAAW,KAAK,QAAA,IAAY,IAAA;AACjC,IAAA,IAAA,CAAK,OAAA,GAAU,KAAK,OAAA,IAAW,IAAA;AAC/B,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAK,KAAA,IAAS,IAAA;AAC3B,IAAA,IAAA,CAAK,MAAA,GAAS,KAAK,MAAA,IAAU,MAAA;AAC7B,IAAA,IAAA,CAAK,WAAA,GAAc,KAAK,WAAA,IAAe,IAAA;AACvC,IAAA,IAAA,CAAK,OAAA,GAAU,KAAK,OAAA,IAAW,QAAA;AAC/B,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,IAAU,EAAC;AAC9B,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA,EAEQ,QAAA,GAAiB;AACvB,IAAA,IAAI,IAAA,CAAK,UAAU,IAAA,EAAM;AACvB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,MAAA,EAAS,KAAK,IAAI,CAAA,gFAAA;AAAA,OACpB;AAAA,IACF;AACA,IAAA,MAAM,OAAA,GAAU,CAAC,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,OAAO,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,IAAI,CAAA;AACtE,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,MAAA,EAAS,IAAA,CAAK,IAAI,CAAA,8CAAA,CAAgD,CAAA;AAAA,IACpF;AACA,IAAA,IAAI,IAAA,CAAK,YAAY,IAAA,EAAM;AACzB,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,QAAA,GAAW,IAAI,MAAA,CAAO,IAAA,CAAK,SAAS,GAAG,CAAA;AAAA,MAC9C,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,MAAA,EAAS,KAAK,IAAI,CAAA,kBAAA,EAAqB,GAAG,CAAA,CAAE,CAAA;AAAA,MAC9D;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,IAAU,IAAA,CAAK,YAAY,QAAA,EAAU;AACnD,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,MAAA,EAAS,KAAK,IAAI,CAAA,2EAAA;AAAA,OACpB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,SAAA,GAA2B;AACzB,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA,EAEA,oBAAA,GAA+B;AAC7B,IAAA,OAAO,KAAK,WAAA,IAAe,CAAA,CAAA,EAAI,IAAA,CAAK,IAAA,CAAK,aAAa,CAAA,CAAA,CAAA;AAAA,EACxD;AACF;AAOO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,KAAA;AAAA,EACA,eAAA;AAAA,EAEA,WAAA,CAAY,IAAA,GAA4B,EAAC,EAAG;AAC1C,IAAA,IAAA,CAAK,KAAA,GAAA,CAAS,IAAA,CAAK,KAAA,IAAS,IAAI,GAAA,CAAI,CAAC,CAAA,KAAO,CAAA,YAAa,aAAA,GAAgB,CAAA,GAAI,IAAI,aAAA,CAAc,CAAC,CAAE,CAAA;AAClG,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA,CAAK,eAAA,IAAmB,EAAC;AAChD,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,KAAA,EAAO;AAC7B,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,IAAA,CAAK,IAAI,CAAA,CAAA,CAAG,CAAA;AAC9E,MAAA,IAAA,CAAK,GAAA,CAAI,KAAK,IAAI,CAAA;AAClB,MAAA,IAAI,IAAA,CAAK,aAAa,IAAA,EAAM;AAC1B,QAAA,MAAM,KAAA,GAAQ,uBAAuB,GAAA,CAAI,IAAA,CAAK,QAAQ,CAAA,IAAK,IAAA,CAAK,YAAY,IAAA,CAAK,eAAA;AACjF,QAAA,IAAI,CAAC,KAAA,EAAO;AACV,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,CAAA,MAAA,EAAS,IAAA,CAAK,IAAI,CAAA,qBAAA,EAAwB,KAAK,QAAQ,CAAA,2CAAA;AAAA,WACzD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAA,GAAmB;AACjB,IAAA,OAAO,IAAA,CAAK,MAAM,MAAA,KAAW,CAAA;AAAA,EAC/B;AACF;AAEA,IAAM,QAAA,GAAW,iDAAA;AACjB,IAAM,QAAA,GAAW,sBAAA;AACjB,IAAM,MAAA,GAAS,iCAAA;AACf,IAAM,OAAA,GAAU,oCAAA;AAChB,IAAM,OAAA,GAAU,8DAAA;AAChB,IAAM,aAAA,GAAgB,kBAAA;AACtB,IAAM,oBAAoB,IAAI,MAAA;AAAA,EAC5B,CAAA,KAAA,EAAQ,aAAa,CAAA,wIAAA,EAA2I,aAAa,CAAA,EAAA,CAAA;AAAA,EAC7K;AACF,CAAA;AACA,IAAM,qBAAqB,IAAI,MAAA;AAAA,EAC7B,CAAA,KAAA,EAAQ,aAAa,CAAA,GAAA,EAAM,aAAa,aAAa,aAAa,CAAA,EAAA,CAAA;AAAA,EAClE;AACF,CAAA;AACA,IAAM,OAAA,GAAU,+EAAA;AAEhB,SAAS,SAAA,CAAU,IAAY,IAAA,EAAsB;AACnD,EAAA,MAAM,MAAc,EAAC;AACrB,EAAA,EAAA,CAAG,SAAA,GAAY,CAAA;AACf,EAAA,IAAI,CAAA,GAAI,EAAA,CAAG,IAAA,CAAK,IAAI,CAAA;AACpB,EAAA,OAAO,MAAM,IAAA,EAAM;AACjB,IAAA,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,QAAQ,CAAA,CAAE,CAAC,CAAA,CAAE,MAAM,CAAC,CAAA;AACzC,IAAA,IAAI,CAAA,CAAE,CAAC,CAAA,CAAE,MAAA,KAAW,GAAG,EAAA,CAAG,SAAA,EAAA;AAC1B,IAAA,CAAA,GAAI,EAAA,CAAG,KAAK,IAAI,CAAA;AAAA,EAClB;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,OAAO,MAAA,EAAyB;AACvC,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,MAAM,GAAA,GAAM,CAAC,GAAG,MAAM,EAAE,OAAA,EAAQ;AAChC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACnC,IAAA,IAAI,CAAA,GAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAC,CAAA;AACrB,IAAA,IAAI,CAAA,GAAI,MAAM,CAAA,EAAG;AACf,MAAA,CAAA,IAAK,CAAA;AACL,MAAA,IAAI,CAAA,GAAI,GAAG,CAAA,IAAK,CAAA;AAAA,IAClB;AACA,IAAA,KAAA,IAAS,CAAA;AAAA,EACX;AACA,EAAA,OAAO,QAAQ,EAAA,KAAO,CAAA;AACxB;AAEA,SAAS,iBAAiB,IAAA,EAAsB;AAC9C,EAAA,MAAM,QAAgB,EAAC;AACvB,EAAA,KAAA,MAAW,CAAC,KAAA,EAAO,GAAG,KAAK,SAAA,CAAU,OAAA,EAAS,IAAI,CAAA,EAAG;AACnD,IAAA,MAAM,MAAA,GAAS,KAAK,KAAA,CAAM,KAAA,EAAO,GAAG,CAAA,CAAE,OAAA,CAAQ,SAAS,EAAE,CAAA;AACzD,IAAA,IAAI,MAAA,CAAO,UAAU,EAAA,IAAM,MAAA,CAAO,UAAU,EAAA,IAAM,MAAA,CAAO,MAAM,CAAA,EAAG;AAChE,MAAA,KAAA,CAAM,IAAA,CAAK,CAAC,KAAA,EAAO,GAAG,CAAC,CAAA;AAAA,IACzB;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,uBAAuB,KAAA,EAAwB;AACtD,EAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,EAAG,OAAO,KAAA;AAChC,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,IAAI,CAAA,IAAK,GAAA,IAAO,CAAA,IAAK,GAAA,EAAK,QAAA,GAAW,IAAA;AAAA,SAAA,IAC5B,CAAA,IAAK,GAAA,IAAO,CAAA,IAAK,GAAA,EAAK,QAAA,GAAW,IAAA;AAAA,SAAA,IACjC,CAAA,IAAK,GAAA,IAAO,CAAA,IAAK,GAAA,EAAK,QAAA,GAAW,IAAA;AAAA,EAC5C;AACA,EAAA,OAAO,YAAY,QAAA,IAAY,QAAA;AACjC;AAEA,SAAS,aAAa,IAAA,EAAsB;AAC1C,EAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,iBAAA,EAAmB,IAAI,CAAA;AAC/C,EAAA,KAAA,MAAW,CAAC,KAAA,EAAO,GAAG,KAAK,SAAA,CAAU,kBAAA,EAAoB,IAAI,CAAA,EAAG;AAC9D,IAAA,IAAI,KAAA,CAAM,IAAA,CAAK,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,KAAA,GAAQ,CAAA,IAAK,CAAA,GAAI,GAAG,CAAA,EAAG;AAClD,IAAA,IAAI,sBAAA,CAAuB,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,GAAG,CAAC,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,CAAC,KAAA,EAAO,GAAG,CAAC,CAAA;AAAA,EAC7E;AACA,EAAA,OAAO,KAAA;AACT;AAEA,IAAM,OAAA,GAAsC;AAAA,EAC1C,KAAA,EAAO,CAAC,CAAA,KAAM,SAAA,CAAU,UAAU,CAAC,CAAA;AAAA,EACnC,KAAA,EAAO,CAAC,CAAA,KAAM,SAAA,CAAU,UAAU,CAAC,CAAA;AAAA,EACnC,GAAA,EAAK,CAAC,CAAA,KAAM,SAAA,CAAU,QAAQ,CAAC,CAAA;AAAA,EAC/B,WAAA,EAAa,gBAAA;AAAA,EACb,IAAA,EAAM,CAAC,CAAA,KAAM,SAAA,CAAU,SAAS,CAAC,CAAA;AAAA,EACjC,OAAA,EAAS;AACX,CAAA;AAEO,SAAS,aAAA,CAAc,MAAc,IAAA,EAAsB;AAChE,EAAA,MAAM,QAAA,GAAW,QAAQ,IAAI,CAAA;AAC7B,EAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,IAAI,CAAA,CAAE,CAAA;AACnE,EAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAC;AACnB,EAAA,OAAO,QAAA,CAAS,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAC,CAAA;AAClD;AAEO,SAAS,WAAA,CACd,MACA,IAAA,EACS;AACT,EAAA,IAAI,KAAK,OAAA,KAAY,MAAA,IAAU,KAAK,OAAA,KAAY,IAAA,CAAK,OAAO,OAAO,KAAA;AACnE,EAAA,IAAI,IAAA,CAAK,KAAA,KAAU,QAAA,EAAU,OAAO,IAAA;AACpC,EAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,OAAO,IAAA;AAChC,EAAA,IAAI,IAAA,CAAK,UAAA,KAAe,IAAA,EAAM,OAAO,KAAA;AACrC,EAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAA,CAAK,UAAU,CAAA;AACpC,EAAA,OAAO,CAAC,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,IAAA,CAAK,GAAA,CAAI,CAAC,CAAC,CAAA;AAC7C;AAEA,SAAS,YAAA,CAAa,IAAA,EAAqB,IAAA,EAAc,MAAA,EAAiC;AACxF,EAAA,IAAI,IAAA,CAAK,YAAY,IAAA,EAAM;AACzB,IAAA,MAAM,EAAA,GAAK,KAAK,SAAA,EAAU,IAAK,IAAI,MAAA,CAAO,IAAA,CAAK,SAAS,GAAG,CAAA;AAC3D,IAAA,OAAO,SAAA,CAAU,IAAI,IAAI,CAAA;AAAA,EAC3B;AACA,EAAA,IAAI,IAAA,CAAK,aAAa,IAAA,EAAM;AAC1B,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,eAAA,CAAgB,IAAA,CAAK,QAAQ,CAAA;AACnD,IAAA,IAAI,QAAQ,OAAO,CAAC,GAAG,MAAA,CAAO,IAAI,CAAC,CAAA;AACnC,IAAA,OAAO,aAAA,CAAc,IAAA,CAAK,QAAA,EAAU,IAAI,CAAA;AAAA,EAC1C;AACA,EAAA,OAAO,EAAC;AACV;AAEA,IAAM,gBAAA,GAAmB,EAAA;AAEzB,SAAS,SAAA,CAAU,OAAe,SAAA,EAAuD;AACvF,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,QAAA,CAAS,SAAS,CAAA,GAAI,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,SAAA,IAAa,EAAE,CAAC,CAAA;AACxF,EAAA,OAAO,cAAc,GAAA,EAAK,KAAK,CAAA,CAAE,KAAA,CAAM,GAAG,gBAAgB,CAAA;AAC5D;AAQO,SAAS,cAAA,CACd,IAAA,EACA,MAAA,EACA,IAAA,EAMyB;AACzB,EAAA,IAAI,CAAC,QAAQ,MAAA,CAAO,OAAA,IAAW,OAAO,CAAC,IAAA,EAAM,EAAE,CAAA;AAC/C,EAAA,MAAM,UAAA,GAAa,KAAK,UAAA,IAAc,IAAA;AACtC,EAAA,MAAM,YAAoD,EAAC;AAC3D,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,KAAA,EAAO;AAC/B,IAAA,IAAI,CAAC,YAAY,IAAA,EAAM,EAAE,OAAO,IAAA,CAAK,KAAA,EAAO,UAAA,EAAY,CAAA,EAAG;AAC3D,IAAA,IAAI,IAAA,CAAK,MAAA,KAAW,MAAA,IAAU,CAAC,KAAK,SAAA,EAAW;AAC7C,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,MAAA,EAAS,KAAK,IAAI,CAAA,4GAAA;AAAA,OAEpB;AAAA,IACF;AACA,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,YAAA,CAAa,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA;AAC3C,MAAA,MAAM,YAAoB,EAAC;AAC3B,MAAA,IAAI,OAAA,GAAU,KAAA;AACd,MAAA,KAAA,MAAW,QAAQ,GAAA,EAAK;AACtB,QAAA,MAAM,KAAA,GAAQ,OAAO,CAAC,CAAA;AACtB,QAAA,MAAM,GAAA,GAAM,OAAO,CAAC,CAAA;AACpB,QAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,QAAQ,QAAA,EAAU;AACxD,UAAA,OAAA,GAAU,IAAA;AACV,UAAA;AAAA,QACF;AACA,QAAA,IAAI,EAAE,KAAA,IAAS,CAAA,IAAK,QAAQ,GAAA,IAAO,GAAA,IAAO,KAAK,MAAA,CAAA,EAAS;AACtD,UAAA,OAAA,GAAU,IAAA;AACV,UAAA;AAAA,QACF;AACA,QAAA,SAAA,CAAU,IAAA,CAAK,CAAC,KAAA,EAAO,GAAG,CAAC,CAAA;AAAA,MAC7B;AACA,MAAA,IAAI,OAAA,EAAS,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA;AAClC,MAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,SAAA,EAAW,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,EAAG,IAAI,CAAC,CAAA;AAAA,IAC7D,SAAS,GAAA,EAAK;AACZ,MAAA,MAAA,CAAO,IAAA,CAAK,KAAK,IAAI,CAAA;AACrB,MAAA,IAAI,IAAA,CAAK,KAAA,EAAO,SAAA,CAAU,IAAA,CAAK,KAAA,EAAO,GAAA,EAAK,EAAE,KAAA,EAAO,WAAA,EAAa,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,CAAA;AAAA,IACpF;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,UAAU,MAAA,EAAQ;AACrB,IAAA,IAAI,MAAA,CAAO,MAAA,EAAQ,OAAO,CAAC,IAAA,EAAM,EAAE,WAAA,EAAa,EAAC,EAAG,KAAA,EAAO,CAAA,EAAG,YAAA,EAAc,QAAQ,CAAA;AACpF,IAAA,OAAO,CAAC,IAAA,EAAM,EAAE,CAAA;AAAA,EAClB;AAEA,EAAA,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,CAAC,CAAA,GAAI,EAAE,CAAC,CAAA,IAAK,EAAE,CAAC,CAAA,GAAI,EAAE,CAAC,CAAA,IAAK,EAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,CAAE,CAAA;AACnE,EAAA,MAAM,SAAiD,EAAC;AACxD,EAAA,KAAA,MAAW,CAAC,KAAA,EAAO,GAAA,EAAK,IAAI,KAAK,SAAA,EAAW;AAC1C,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AACrC,IAAA,IAAI,IAAA,IAAQ,KAAA,GAAQ,IAAA,CAAK,CAAC,CAAA,EAAG;AAC3B,MAAA,IAAI,MAAM,IAAA,CAAK,CAAC,CAAA,EAAG,IAAA,CAAK,CAAC,CAAA,GAAI,GAAA;AAC7B,MAAA;AAAA,IACF;AACA,IAAA,MAAA,CAAO,IAAA,CAAK,CAAC,KAAA,EAAO,GAAA,EAAK,IAAI,CAAC,CAAA;AAAA,EAChC;AAEA,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,KAAA,MAAW,CAAC,KAAA,EAAO,GAAA,EAAK,IAAI,KAAK,MAAA,EAAQ;AACvC,IAAA,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,KAAK,CAAC,CAAA;AAClC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,GAAG,CAAA;AACtC,IAAA,IAAI,KAAK,MAAA,KAAW,MAAA,MAAY,IAAA,CAAK,IAAA,CAAK,sBAAsB,CAAA;AAAA,SAAA,IACvD,IAAA,CAAK,WAAW,MAAA,EAAQ;AAC/B,MAAA,GAAA,CAAI,IAAA,CAAK,CAAA,CAAA,EAAI,IAAA,CAAK,IAAA,CAAK,WAAA,EAAa,CAAA,CAAA,EAAI,SAAA,CAAU,QAAA,EAAU,IAAA,CAAK,SAAS,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,IAChF;AACA,IAAA,IAAI,CAAC,MAAM,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA;AACpD,IAAA,MAAA,GAAS,GAAA;AAAA,EACX;AACA,EAAA,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,MAAM,CAAC,CAAA;AAE3B,EAAA,MAAM,OAAsB,EAAE,WAAA,EAAa,KAAA,EAAO,KAAA,EAAO,OAAO,MAAA,EAAO;AACvE,EAAA,IAAI,MAAA,CAAO,MAAA,EAAQ,IAAA,CAAK,YAAA,GAAe,MAAA;AACvC,EAAA,OAAO,CAAC,GAAA,CAAI,IAAA,CAAK,EAAE,GAAG,IAAI,CAAA;AAC5B;;;ACxSA,WAAA,EAAA;AAiBO,IAAM,eAAA,GAAkB,EAAA;AACxB,IAAM,WAAA,GAAc,GAAA;AACpB,IAAM,yBAAA,GAA4B,GAAA;AAClC,IAAM,iBAAA,GAAoB,GAAA;AAEjC,IAAM,mBAAA,GACJ,iRAAA;AAEF,IAAM,MAAA,GAAS,6CAAA;AAWf,eAAsB,sBAAA,GAA8C;AAClE,EAAA,MAAM,SAAA,GAAY,aAAA;AAClB,EAAA,IAAI;AACF,IAAA,OAAQ,MAAM,OAAO,SAAA,CAAA;AAAA,EACvB,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAIrC,yBAAA,CAAkB,SAAA,EAAW,aAAA,EAAe,qBAAqB,CAAA;AAAA,EAC7E;AACF;AAGO,SAAS,WAAW,IAAA,EAAiC;AAC1D,EAAA,IAAI,CAAC,IAAA,EAAM,IAAA,IAAQ,OAAO,CAAC,OAAO,YAAY,CAAA;AAC9C,EAAA,IAAI,mBAAA,CAAoB,IAAA,CAAK,IAAI,CAAA,EAAG;AAClC,IAAA,OAAO,CAAC,OAAO,2EAAsE,CAAA;AAAA,EACvF;AACA,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,EAAG;AACrB,IAAA,OAAO,CAAC,OAAO,sDAAsD,CAAA;AAAA,EACvE;AACA,EAAA,IAAI,8BAA8B,IAAA,CAAK,IAAI,KAAK,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA,EAAG;AACvE,IAAA,OAAO,CAAC,OAAO,iDAAiD,CAAA;AAAA,EAClE;AACA,EAAA,OAAO,CAAC,MAAM,EAAE,CAAA;AAClB;AAiBA,eAAsB,gBACpB,IAAA,EACA,OAAA,GAAmC,EAAC,EACpC,gBAAyE,eAAA,EACjD;AACxB,EAAA,MAAM,aACJ,OAAO,aAAA,KAAkB,QAAA,GAAW,aAAA,GAAiB,cAAc,OAAA,IAAW,eAAA;AAChF,EAAA,MAAM,kBACJ,OAAO,aAAA,KAAkB,QAAA,GACrB,yBAAA,GACC,cAAc,eAAA,IAAmB,yBAAA;AACxC,EAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,UAAA,EAAY,WAAW,CAAC,CAAA;AAE7D,EAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,EAAe,aAAA,GAAgB,CAAA,MAAsB;AAAA,IAClE,OAAA,EAAS,KAAA;AAAA,IACT,MAAA,EAAQ,IAAA;AAAA,IACR,MAAA,EAAQ,EAAA;AAAA,IACR,MAAA,EAAQ,EAAA;AAAA,IACR,aAAA;AAAA,IACA;AAAA,GACF,CAAA;AAEA,EAAA,MAAM,CAAC,EAAA,EAAI,GAAG,CAAA,GAAI,WAAW,IAAI,CAAA;AACjC,EAAA,IAAI,CAAC,EAAA,EAAI;AACP,IAAA,OAAA,CAAQ,IAAA,CAAK,sCAAsC,GAAG,CAAA;AACtD,IAAA,OAAO,KAAA,CAAM,CAAA,wBAAA,EAA2B,GAAG,CAAA,CAAE,CAAA;AAAA,EAC/C;AAEA,EAAA,MAAM,GAAA,GAAM,MAAM,sBAAA,EAAuB;AACzC,EAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AACzB,EAAA,MAAM,UAAU,IAAI,GAAA,CAAI,QAAQ,EAAE,WAAA,EAAa,mBAAmB,CAAA;AAClE,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,aAAA,EAAc;AACzC,IAAA,MAAM,aAAa,IAAA,CAAK,MAAA;AACxB,IAAA,MAAM,UAAA,CAAW,GAAA,CAAI,QAAA,EAAU,UAAA,CAAW,WAAW,CAAA;AAIrD,IAAA,IAAI,WAAA;AACJ,IAAA,IAAI;AACF,MAAA,WAAA,GAAc,IAAA,CAAK,SAAA,CAAU,OAAA,IAAW,EAAE,CAAA;AAAA,IAC5C,SAAS,GAAA,EAAK;AACZ,MAAA,OAAO,KAAA,CAAM,CAAA,kCAAA,EAAqC,MAAA,CAAO,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,IACjE;AAEA,IAAA,MAAM,IAAA,CAAK,IAAA;AAAA,MACT,iBAAiB,WAAW,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAA;AAAA,KAU9B;AAEA,IAAA,MAAM,OAAA,GAAU,CAAA;AAAA;AAAA,EAElB,IAAI;AAAA,iEAAA,CAAA;AAGF,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,aAAA,CAAc,OAAO,CAAA;AAClD,IAAA,MAAM,GAAA,GAAO,MAAM,MAAA,CAAO,GAAA,CAAI,IAAA,EAAM;AAAA,MAClC,SAAS,OAAA,GAAU,GAAA;AAAA,MACnB,IAAA,EAAM;AAAA,KACP,CAAA;AAED,IAAA,MAAM,aAAA,GAAA,CAAiB,IAAA,CAAK,GAAA,EAAI,GAAI,OAAA,IAAW,GAAA;AAC/C,IAAA,IAAI,MAAA,GAAS,KAAK,MAAA,IAAU,IAAA;AAC5B,IAAA,IAAI,SAAS,OAAO,GAAA,EAAK,MAAA,KAAW,QAAA,GAAW,IAAI,MAAA,GAAS,EAAA;AAC5D,IAAA,IAAI,OAAO,MAAA,GAAS,eAAA,WAA0B,MAAA,CAAO,KAAA,CAAM,GAAG,eAAe,CAAA;AAC7E,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AACxC,MAAA,IAAI,UAAA,IAAc,UAAA,CAAW,MAAA,GAAS,eAAA,EAAiB;AACrD,QAAA,MAAA,GAAS,EAAE,UAAA,EAAY,IAAA,EAAM,cAAA,EAAgB,WAAW,MAAA,EAAO;AAAA,MACjE;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,MAAA,GAAS,MAAA,CAAO,MAAM,CAAA,CAAE,KAAA,CAAM,GAAG,eAAe,CAAA;AAAA,IAClD;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,MAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA,EAAQ,EAAA;AAAA,MACR,aAAA;AAAA,MACA,KAAA,EAAO;AAAA,KACT;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,aAAA,GAAA,CAAiB,IAAA,CAAK,GAAA,EAAI,GAAI,OAAA,IAAW,GAAA;AAC/C,IAAA,MAAM,GAAA,GAAM,OAAO,GAAG,CAAA;AACtB,IAAA,IAAI,oBAAA,CAAqB,IAAA,CAAK,GAAG,CAAA,EAAG;AAClC,MAAA,OAAO,KAAA,CAAM,CAAA,6BAAA,EAAgC,OAAO,CAAA,QAAA,CAAA,EAAY,aAAa,CAAA;AAAA,IAC/E;AACA,IAAA,OAAO,KAAA,CAAM,KAAK,aAAa,CAAA;AAAA,EACjC,CAAA,SAAE;AACA,IAAA,OAAA,CAAQ,OAAA,EAAQ;AAAA,EAClB;AACF;;;ACnLA,SAAA,EAAA;AAEA,QAAA,EAAA;AACA,SAAA,EAAA;AAEO,IAAM,cAAA,GAAiB,GAAA;AACvB,IAAM,gBAAA,GAAmB,GAAA;AACzB,IAAM,kBAAA,GAAqB,EAAA;AAG3B,IAAM,kBAAA,GAAqB;AAG3B,IAAM,oBAAA,GAAuB,IAAA;AAS7B,IAAM,iCAAA,GAAoC,IAAA;AAajD,IAAM,wBAAA,GAA2B,CAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAAA;AAqBjC,SAAS,qBAAA,CACP,UAAA,EACA,OAAA,GAAU,CAAA,EACF;AACR,EAAA,IAAI,MAAA,GAAS,wBAAA;AACb,EAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,MAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACvC,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,IAAO,IAAA,CAAK,IAAA;AAC7B,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,IAAA;AACtC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,MAAA,CAAO,GAAG,CAAC,CAAA,EAAG,IAAA,GAAO,CAAA,EAAA,EAAK,MAAA,CAAO,IAAI,CAAC,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,CAAE,CAAA;AAAA,IAClE;AACA,IAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,MAAA,MAAA,IACE,oJAAA,GAGA,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAAA,IACnB;AAAA,EACF;AACA,EAAA,IAAI,UAAU,CAAA,EAAG;AACf,IAAA,MAAA,IACE,wHAAA;AAAA,EAEJ;AACA,EAAA,OAAO,MAAA;AACT;AAaA,eAAsB,qBAAA,CACpB,MACA,IAAA,EAM2B;AAC3B,EAAA,IAAI,CAAC,IAAA,EAAM,IAAA,EAAK,EAAG;AACjB,IAAA,OAAO;AAAA,MACL,YAAA,EAAc,IAAA;AAAA,MACd,mBAAmB,EAAC;AAAA,MACpB,gBAAgB,EAAC;AAAA,MACjB,SAAS,EAAC;AAAA,MACV,gBAAgB,EAAC;AAAA,MACjB,OAAA,EAAS,QAAA;AAAA,MACT,KAAA,EAAO,qBAAA;AAAA,MACP,gBAAgB;AAAC,KACnB;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,KAAK,QAAA,IAAY,oBAAA;AAClC,EAAA,MAAM,IAAA,GAAO,KAAK,MAAA,IAAU,QAAA,GAAW,OAAO,IAAA,CAAK,KAAA,CAAM,GAAG,QAAQ,CAAA;AACpE,EAAA,MAAM,UAAA,GAAa,KAAK,UAAA,IAAc,CAAA;AACtC,EAAA,IAAI,SAAA,GAA2B,IAAA;AAC/B,EAAA,IAAI,gBAAA,GAAmB,CAAA;AACvB,EAAA,IAAI,iBAAA,GAAoB,CAAA;AAExB,EAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,UAAA,EAAY,OAAA,EAAA,EAAW;AACtD,IAAA,MAAM,MAAA,GAAS,qBAAA,CAAsB,IAAA,CAAK,UAAA,EAAY,OAAO,CAAA;AAC7D,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,CAAC,KAAK,MAAM,CAAA,GAAI,MAAM,OAAA,CAAQ,KAAK,MAAA,EAAQ;AAAA,QACzC,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM,CAAA;;AAAA,EAAqB,IAAI,CAAA,CAAA;AAAA,QAC/B,QAAA,EAAU;AAAA,OACX,CAAA;AAAA,IACH,SAAS,GAAA,EAAK;AACZ,MAAA,SAAA,GAAY,OAAO,GAAG,CAAA;AACtB,MAAA,OAAA,CAAQ,IAAA,CAAK,sDAAA,EAAwD,OAAA,EAAS,GAAG,CAAA;AACjF,MAAA;AAAA,IACF;AAEA,IAAA,gBAAA,IAAoB,QAAQ,KAAA,IAAS,CAAA;AACrC,IAAA,iBAAA,IAAqB,QAAQ,MAAA,IAAU,CAAA;AAEvC,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,aAAA,CAAc,KAAK,QAAQ,CAAA;AAAA,IACtC,SAAS,GAAA,EAAK;AACZ,MAAA,SAAA,GAAY,OAAO,GAAG,CAAA;AACtB,MAAA,OAAA,CAAQ,IAAA,CAAK,4DAAA,EAA8D,OAAA,EAAS,GAAG,CAAA;AACvF,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAW,OAAO,aAAA,IAA4B,SAAA;AACpD,IAAA,IAAI,UAAU,MAAA,CAAO,mBAAA;AACrB,IAAA,IAAI,CAAC,OAAA,IAAW,OAAO,OAAA,KAAY,QAAA,IAAY,MAAM,OAAA,CAAQ,OAAO,CAAA,EAAG,OAAA,GAAU,EAAC;AAClF,IAAA,MAAM,cAAc,MAAA,CAAO,kBAAA;AAC3B,IAAA,MAAM,WAAA,GACJ,WAAA,IAAe,OAAO,WAAA,KAAgB,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,GACvE,WAAA,CAAyC,WAAA,GAC1C,MAAA;AACN,IAAA,MAAM,UACJ,WAAA,KAAgB,MAAA,IAAU,gBAAgB,QAAA,IAAY,WAAA,KAAgB,QAAQ,WAAA,GAAc,QAAA;AAE9F,IAAA,MAAM,UAAA,GAAa,qBAAqB,OAAkC,CAAA;AAE1E,IAAA,OAAO;AAAA,MACL,YAAA,EAAc,OAAA;AAAA,MACd,iBAAA,EAAmB,OAAA;AAAA,MACnB,cAAA,EAAgB,UAAA;AAAA,MAChB,OAAA,EAAS,MAAA,CAAO,IAAA,CAAK,OAAkC,CAAA;AAAA,MACvD,cAAA,EAAgB,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAAA,MACtC,OAAA;AAAA,MACA,KAAA,EAAO,IAAA;AAAA,MACP,cAAA,EAAgB,EAAE,SAAA,EAAW,gBAAA,EAAkB,YAAY,iBAAA;AAAkB,KAC/E;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,YAAA,EAAc,IAAA;AAAA,IACd,mBAAmB,EAAC;AAAA,IACpB,gBAAgB,EAAC;AAAA,IACjB,SAAS,EAAC;AAAA,IACV,gBAAgB,EAAC;AAAA,IACjB,OAAA,EAAS,QAAA;AAAA,IACT,OAAO,SAAA,IAAa,mBAAA;AAAA,IACpB,cAAA,EAAgB,EAAE,SAAA,EAAW,gBAAA,EAAkB,YAAY,iBAAA;AAAkB,GAC/E;AACF;AAWA,SAAS,UAAU,EAAA,EAAqB;AACtC,EAAA,OAAO,OAAA,CAAQ,WAAW,EAAE,CAAC,KAAK,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA,IAAK,EAAA,KAAO,GAAA;AAC7D;AASO,SAAS,aAAa,GAAA,EAAsB;AACjD,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,UAAU,OAAO,EAAA;AAE5C,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,WAAA,EAAY,CAAE,MAAM,GAAG,CAAA;AAC5C,EAAA,MAAM,YAAsB,EAAC;AAC7B,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,IAAA,IAAI,OAAA,GAAU,EAAA;AACd,IAAA,KAAA,MAAW,MAAM,GAAA,EAAK,OAAA,IAAW,SAAA,CAAU,EAAE,IAAI,EAAA,GAAK,GAAA;AACtD,IAAA,OAAA,GAAU,QAAQ,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,CAAE,OAAA,CAAQ,UAAU,EAAE,CAAA;AAC1D,IAAA,IAAI,OAAA,EAAS,SAAA,CAAU,IAAA,CAAK,OAAO,CAAA;AAAA,EACrC;AACA,EAAA,IAAI,UAAA,GAAa,SAAA,CAAU,IAAA,CAAK,GAAG,CAAA;AACnC,EAAA,IAAI,WAAW,MAAA,GAAS,cAAA,eAA6B,UAAA,CAAW,KAAA,CAAM,GAAG,cAAc,CAAA;AACvF,EAAA,OAAO,UAAA;AACT;AAGO,SAAS,aAAA,CAAc,KAAa,KAAA,EAAwB;AACjE,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,EAAU,OAAO,QAAA;AAEpC,EAAA,MAAM,QAAA,GAAW,IAAI,WAAA,EAAY;AACjC,EAAA,IAAI,QAAA,CAAS,SAAS,MAAM,CAAA,IAAK,SAAS,QAAA,CAAS,SAAS,GAAG,OAAO,QAAA;AACtE,EAAA,IAAI,QAAA,CAAS,SAAS,OAAO,CAAA,IAAK,SAAS,QAAA,CAAS,WAAW,GAAG,OAAO,MAAA;AACzE,EAAA,IAAI,QAAA,CAAS,SAAS,OAAO,CAAA,IAAK,SAAS,QAAA,CAAS,UAAU,GAAG,OAAO,MAAA;AAExE,EAAA,IAAI,KAAA,IAAS,MAAM,OAAO,QAAA;AAC1B,EAAA,IAAI,OAAO,KAAA,KAAU,SAAA,EAAW,OAAO,MAAA;AACvC,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,WAAA,EAAY,CAAE,IAAA,EAAK;AAC5C,IAAA,IAAI,CAAC,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAO,IAAA,EAAM,GAAA,EAAK,GAAG,CAAA,CAAE,QAAA,CAAS,UAAU,CAAA,EAAG,OAAO,MAAA;AAC1E,IAAA,IAAI;AACF,MAAA,MAAM,IAAI,IAAI,IAAA,CAAK,MAAM,OAAA,CAAQ,GAAA,EAAK,QAAQ,CAAC,CAAA;AAC/C,MAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,CAAA,CAAE,OAAA,EAAS,CAAA,IAAK,mBAAA,CAAoB,IAAA,CAAK,KAAK,CAAA,EAAG,OAAO,MAAA;AAAA,IAC5E,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,IAAI,KAAA,KAAU,MAAM,CAAC,MAAA,CAAO,MAAM,MAAA,CAAO,KAAK,CAAC,CAAA,EAAG,OAAO,QAAA;AAAA,EAC3D;AACA,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,QAAA;AACtC,EAAA,IAAI,KAAA,YAAiB,MAAM,OAAO,MAAA;AAClC,EAAA,OAAO,QAAA;AACT;AAMO,SAAS,qBAAqB,OAAA,EAA2D;AAC9F,EAAA,IAAI,CAAC,WAAW,OAAO,OAAA,KAAY,YAAY,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AACrE,IAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,EAC9C;AAEA,EAAA,MAAM,aAAsC,EAAC;AAE7C,EAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AACxD,IAAA,IAAI,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,EAAU;AAC5C,MAAA,OAAA,CAAQ,IAAA,CAAK,0CAA0C,MAAM,CAAA;AAC7D,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,aAAa,MAAM,CAAA;AACnC,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,MAAM,QAAA,GAAW,aAAA,CAAc,OAAA,EAAS,QAAQ,CAAA;AAEhD,IAAA,IAAI;AACF,MAAA,IAAI,aAAa,QAAA,EAAU;AACzB,QAAA,IAAI,QAAA,IAAY,IAAA,IAAQ,QAAA,KAAa,EAAA,EAAI;AACvC,UAAA,UAAA,CAAW,OAAO,CAAA,GAAI,IAAA;AAAA,QACxB,CAAA,MAAO;AACL,UAAA,MAAM,KAAA,GAAQ,OAAO,QAAQ,CAAA;AAC7B,UAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA,EAAG;AACxB,YAAA,UAAA,CAAW,OAAO,CAAA,GAAI,KAAA;AAAA,UACxB,CAAA,MAAO;AACL,YAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAQ,CAAA,CAAE,MAAM,qBAAqB,CAAA;AAC1D,YAAA,IAAI,KAAA,EAAO;AACT,cAAA,MAAM,CAAA,GAAI,OAAO,KAAA,CAAM,CAAC,EAAE,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAC,CAAA;AAC3C,cAAA,UAAA,CAAW,OAAO,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,CAAC,IAAI,IAAA,GAAO,CAAA;AAAA,YACjD,CAAA,MAAO;AACL,cAAA,UAAA,CAAW,OAAO,CAAA,GAAI,IAAA;AAAA,YACxB;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAA,MAAA,IAAW,aAAa,MAAA,EAAQ;AAC9B,QAAA,IAAI,QAAA,IAAY,IAAA,IAAQ,QAAA,KAAa,EAAA,EAAI;AACvC,UAAA,UAAA,CAAW,OAAO,CAAA,GAAI,IAAA;AAAA,QACxB,CAAA,MAAA,IAAW,oBAAoB,IAAA,EAAM;AACnC,UAAA,UAAA,CAAW,OAAO,CAAA,GAAI,QAAA,CAAS,WAAA,EAAY;AAAA,QAC7C,CAAA,MAAO;AACL,UAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,CAAE,OAAA,CAAQ,GAAA,EAAK,QAAQ,CAAC,CAAA;AAC1D,UAAA,UAAA,CAAW,OAAO,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,CAAA,CAAE,OAAA,EAAS,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,GAAI,CAAA,CAAE,WAAA,EAAY;AAAA,QACrF;AAAA,MACF,CAAA,MAAA,IAAW,aAAa,MAAA,EAAQ;AAC9B,QAAA,IAAI,QAAA,IAAY,IAAA,IAAQ,QAAA,KAAa,EAAA,EAAI;AACvC,UAAA,UAAA,CAAW,OAAO,CAAA,GAAI,IAAA;AAAA,QACxB,CAAA,MAAA,IAAW,OAAO,QAAA,KAAa,SAAA,EAAW;AACxC,UAAA,UAAA,CAAW,OAAO,CAAA,GAAI,QAAA;AAAA,QACxB,CAAA,MAAO;AACL,UAAA,MAAM,WAAW,MAAA,CAAO,QAAQ,CAAA,CAAE,WAAA,GAAc,IAAA,EAAK;AACrD,UAAA,IAAI,CAAC,MAAA,EAAQ,KAAA,EAAO,GAAG,CAAA,CAAE,SAAS,QAAQ,CAAA,EAAG,UAAA,CAAW,OAAO,CAAA,GAAI,IAAA;AAAA,eAAA,IAC1D,CAAC,OAAA,EAAS,IAAA,EAAM,GAAG,CAAA,CAAE,SAAS,QAAQ,CAAA,EAAG,UAAA,CAAW,OAAO,CAAA,GAAI,KAAA;AAAA,eACnE,UAAA,CAAW,OAAO,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA;AAAA,QAC5C;AAAA,MACF,CAAA,MAAO;AACL,QAAA,IAAI,YAAY,IAAA,EAAM;AACpB,UAAA,UAAA,CAAW,OAAO,CAAA,GAAI,IAAA;AAAA,QACxB,CAAA,MAAO;AACL,UAAA,IAAI,QAAA,GAAW,OAAO,QAAQ,CAAA;AAC9B,UAAA,IAAI,SAAS,MAAA,GAAS,gBAAA,aAA6B,QAAA,CAAS,KAAA,CAAM,GAAG,gBAAgB,CAAA;AACrF,UAAA,UAAA,CAAW,OAAO,CAAA,GAAI,QAAA;AAAA,QACxB;AAAA,MACF;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,iCAAA,EAAmC,MAAA,EAAQ,GAAG,CAAA;AAC5D,MAAA,UAAA,CAAW,OAAO,CAAA,GAAI,QAAA,IAAY,IAAA,GAAO,MAAA,CAAO,QAAQ,CAAA,GAAI,IAAA;AAAA,IAC9D;AAAA,EACF;AAEA,EAAA,OAAO,UAAA;AACT;AAGO,SAAS,eAAA,CAAgB,SAAmB,QAAA,EAA8C;AAC/F,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,QAAA,CAAS,MAAA,EAAQ;AACtC,IAAA,OAAA,CAAQ,KAAA,CAAM,iDAAA,EAAmD,OAAA,CAAQ,MAAA,EAAQ,SAAS,MAAM,CAAA;AAChG,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,aAAuC,EAAC;AAE9C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,IAAA,MAAM,MAAA,GAAS,QAAQ,CAAC,CAAA;AACxB,IAAA,MAAM,OAAA,GAAU,SAAS,CAAC,CAAA;AAC1B,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,UAAA,CAAW,OAAO,MAAM,EAAC;AACzB,IAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AAEjC,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,QAAA,CAAS,IAAI,MAAM,CAAA;AACnB,MAAA,QAAA,CAAS,GAAA,CAAI,MAAA,CAAO,WAAA,EAAa,CAAA;AACjC,MAAA,QAAA,CAAS,GAAA,CAAI,MAAA,CAAO,WAAA,EAAa,CAAA;AACjC,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AACzC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,QAAA,CAAS,GAAA,CAAI,MAAM,CAAC,CAAA,CAAG,aAAY,GAAI,KAAA,CAAM,KAAA,CAAM,CAAC,CAAC,CAAA;AACrD,QAAA,QAAA,CAAS,GAAA,CAAI,MAAM,CAAC,CAAA,CAAG,aAAY,GAAI,KAAA,CAAM,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,MACvD;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,IAAI,OAAO,CAAA;AACpB,IAAA,QAAA,CAAS,GAAA,CAAI,OAAA,CAAQ,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAC,CAAA;AACtC,IAAA,QAAA,CAAS,GAAA,CAAI,OAAA,CAAQ,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAC,CAAA;AACvC,IAAA,QAAA,CAAS,GAAA,CAAI,OAAA,CAAQ,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAC,CAAA;AACxC,IAAA,QAAA,CAAS,GAAA,CAAI,OAAA,CAAQ,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAC,CAAA;AACvC,IAAA,QAAA,CAAS,GAAA,CAAI,OAAA,CAAQ,WAAA,EAAa,CAAA;AAClC,IAAA,QAAA,CAAS,GAAA;AAAA,MACP,OAAA,CACG,MAAM,GAAG,CAAA,CACT,IAAI,CAAC,CAAA,KAAO,IAAI,CAAA,CAAE,CAAC,EAAG,WAAA,EAAY,GAAI,EAAE,KAAA,CAAM,CAAC,IAAI,CAAE,CAAA,CACrD,KAAK,GAAG;AAAA,KACb;AAEA,IAAA,QAAA,CAAS,OAAO,EAAE,CAAA;AAClB,IAAA,QAAA,CAAS,OAAO,OAAO,CAAA;AAEvB,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,KAAA,MAAW,GAAA,IAAO,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAA,CAAE,IAAA,EAAK,EAAG,GAAG,UAAA,CAAW,OAAO,CAAE,CAAA,EAAG;AACpE,MAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AAClB,QAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,QAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,MACjB;AAAA,IACF;AACA,IAAA,UAAA,CAAW,OAAO,CAAA,GAAI,MAAA;AAAA,EACxB;AAEA,EAAA,OAAO,UAAA;AACT;AAEA,SAAS,aAAA,CAAc,SAAiB,QAAA,EAAqC;AAC3E,EAAA,OAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,QAAA,CAAS,KAAK,GAAG,CAAC,GAAG,IAAA,EAAK;AACjD;AAEA,SAAS,cAAc,MAAA,EAAmC;AACxD,EAAA,OAAO,CAAA,CAAA,EAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,MAAA,CAAO,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AACnD;AAqBA,eAAsB,eAAe,IAAA,EAQjB;AAClB,EAAA,IAAI,CAAC,IAAA,CAAK,cAAA,IAAkB,CAAC,IAAA,CAAK,SAAS,OAAO,CAAA;AAElD,EAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,IAAA,CAAK,OAAA,EAAS,KAAK,cAAc,CAAA;AACrE,EAAA,MAAM,UAAmC,EAAC;AAE1C,EAAA,KAAA,MAAW,CAAC,SAAS,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,cAAc,CAAA,EAAG;AAClE,IAAA,MAAM,QAAA,GAAW,aAAA,CAAc,OAAA,EAAS,KAAK,CAAA;AAC7C,IAAA,MAAM,YAAA,GAAe,SAAS,IAAA,GAAO,IAAA,GAAO,OAAO,KAAK,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AACtE,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,GAAG,IAAI,GAAA,CAAA,CAAK,WAAA,CAAY,OAAO,KAAK,EAAC,EAAG,GAAA,CAAI,CAAC,MAAM,YAAA,CAAa,CAAC,CAAC,CAAA,CAAE,MAAA,CAAO,OAAO,CAAC;AAAA,MACnF,IAAA,EAAK;AAEP,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,KAAA;AAAA,MAC/B,CAAA;AAAA;AAAA;AAAA;AAAA,cAAA,CAAA;AAAA,MAKA,CAAC,IAAA,CAAK,OAAA,EAAS,OAAA,EAAS,KAAK,QAAQ;AAAA,KACvC;AAEA,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI,cAAA,GAAiB,KAAA;AACrB,IAAA,IAAI,gBAAA,GAA6B,WAAA;AAEjC,IAAA,IAAI,CAAC,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,EAAG;AACrB,MAAA,KAAA,GAAQwB,iBAAA,EAAW;AACnB,MAAA,MAAM,KAAK,IAAA,CAAK,KAAA;AAAA,QACd,CAAA;AAAA;AAAA,wCAAA,CAAA;AAAA,QAGA;AAAA,UACE,KAAA;AAAA,UACA,IAAA,CAAK,QAAA;AAAA,UACL,IAAA,CAAK,OAAA;AAAA,UACL,OAAA;AAAA,UACA,QAAA;AAAA,UACA,WAAA;AAAA,UACA,YAAA,GAAe,CAAC,YAAY,CAAA,GAAI;AAAC;AACnC,OACF;AACA,MAAA,cAAA,GAAiB,IAAA;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA;AAC3B,MAAA,KAAA,GAAQ,GAAA,CAAI,EAAA;AACZ,MAAA,MAAM,IAAA,GAAA,CAAQ,GAAA,CAAI,SAAA,IAAa,CAAA,IAAK,CAAA;AACpC,MAAA,IAAI,gBAAgB,CAAC,GAAI,GAAA,CAAI,cAAA,IAAkB,EAAG,CAAA;AAClD,MAAA,IAAI,YAAA,IAAgB,CAAC,aAAA,CAAc,QAAA,CAAS,YAAY,CAAA,EAAG;AACzD,QAAA,aAAA,GAAgB,CAAC,GAAG,aAAA,CAAc,KAAA,CAAM,GAAG,kBAAA,GAAqB,CAAC,GAAG,YAAY,CAAA;AAAA,MAClF;AACA,MAAA,MAAM,UAAA,GAAa,CAAC,GAAI,GAAA,CAAI,YAAY,EAAG,EAAE,IAAA,EAAK;AAClD,MAAA,IAAI,MAAA,GAAS,UAAA;AACb,MAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,QAAA,MAAA,GAAS,CAAC,mBAAG,IAAI,GAAA,CAAI,CAAC,GAAG,UAAA,EAAY,GAAG,WAAW,CAAC,CAAC,CAAA,CAAE,IAAA,EAAK;AAC5D,QAAA,IAAI,MAAA,CAAO,KAAK,IAAI,CAAA,KAAM,WAAW,IAAA,CAAK,IAAI,GAAG,cAAA,GAAiB,IAAA;AAAA,MACpE;AACA,MAAA,IAAI,GAAA,CAAI,SAAA,IAAa,IAAA,EAAM,cAAA,GAAiB,IAAA;AAC5C,MAAA,gBAAA,GAAmB,MAAA;AACnB,MAAA,MAAM,KAAK,IAAA,CAAK,KAAA;AAAA,QACd,CAAA;AAAA;AAAA,sBAAA,CAAA;AAAA,QAGA,CAAC,IAAA,EAAM,aAAA,EAAe,MAAA,EAAQ,KAAK;AAAA,OACrC;AAAA,IACF;AAEA,IAAA,IAAI,cAAA,UAAwB,IAAA,CAAK,CAAC,OAAO,aAAA,CAAc,OAAA,EAAS,gBAAgB,CAAC,CAAC,CAAA;AAAA,EACpF;AAEA,EAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,EAAQ,OAAO,CAAA;AAE5B,EAAA,MAAM,CAAC,OAAA,EAAS,MAAM,CAAA,GAAI,MAAM,KAAK,QAAA,CAAS,KAAA;AAAA,IAC5C,QAAQ,GAAA,CAAI,CAAC,GAAG,IAAI,MAAM,IAAI,CAAA;AAAA,IAC9B,EAAE,MAAM,UAAA;AAAW,GACrB;AACA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,IAAA,MAAM,GAAA,GAAM,QAAQ,CAAC,CAAA;AACrB,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,MAAM,KAAK,IAAA,CAAK,KAAA;AAAA,MACd,CAAA,kGAAA,CAAA;AAAA,MACA,CAAC,cAAc,GAAG,CAAA,EAAG,QAAQ,CAAC,CAAA,CAAG,CAAC,CAAC;AAAA,KACrC;AAAA,EACF;AACA,EAAA,OAAO,MAAA,IAAU,CAAA;AACnB;AAeA,eAAsB,aAAA,CACpB,YACA,IAAA,EAMiC;AACjC,EAAA,MAAM,kBAA0C,EAAC;AACjD,EAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,IAAA,MAAM,CAAA,GAAI,aAAa,CAAC,CAAA;AACxB,IAAA,IAAI,CAAA,EAAG,eAAA,CAAgB,CAAC,CAAA,GAAI,CAAA;AAAA,EAC9B;AACA,EAAA,IAAI,CAAC,MAAA,CAAO,IAAA,CAAK,eAAe,CAAA,CAAE,MAAA,SAAe,EAAC;AAElD,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,KAAK,IAAA,CAAK,KAAA;AAAA,IAK/B,CAAA;AAAA;AAAA;AAAA,8CAAA,CAAA;AAAA,IAIA,CAAC,IAAA,CAAK,SAAA,IAAa,IAAA,EAAM,IAAA,CAAK,WAAW,IAAI;AAAA,GAC/C;AAEA,EAAA,MAAM,WAAmC,EAAC;AAC1C,EAAA,MAAM,aAAsC,EAAC;AAC7C,EAAA,KAAA,MAAW,CAAC,SAAA,EAAW,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,eAAe,CAAA,EAAG;AAC/D,IAAA,MAAM,QAAQ,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,IAAI,CAAA;AAClD,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,QAAA,CAAS,SAAS,IAAI,KAAA,CAAM,QAAA;AAC5B,MAAA;AAAA,IACF;AACA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,QAAA,IAAY,EAAC,EAAG,QAAA,CAAS,IAAI,CAAC,CAAA;AACrE,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,QAAA,CAAS,SAAS,IAAI,UAAA,CAAW,QAAA;AACjC,MAAA;AAAA,IACF;AACA,IAAA,UAAA,CAAW,IAAA,CAAK,CAAC,SAAA,EAAW,IAAI,CAAC,CAAA;AAAA,EACnC;AAEA,EAAA,IAAI,UAAA,CAAW,UAAU,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,IAAa,IAAI,CAAA,EAAG;AAC9D,IAAA,IAAI,UAAsB,EAAC;AAC3B,IAAA,IAAI;AACF,MAAA,CAAC,OAAO,CAAA,GAAI,MAAM,IAAA,CAAK,QAAA,CAAS,KAAA;AAAA,QAC9B,WAAW,GAAA,CAAI,CAAC,GAAG,IAAI,MAAM,IAAI,CAAA;AAAA,QACjC,EAAE,MAAM,OAAA;AAAQ,OAClB;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,IAAA,CAAK,6CAA6C,GAAG,CAAA;AAC7D,MAAA,OAAA,GAAU,EAAC;AAAA,IACb;AAEA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,CAAW,QAAQ,CAAA,EAAA,EAAK;AAC1C,MAAA,MAAM,GAAA,GAAM,QAAQ,CAAC,CAAA;AACrB,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,MAAM,KAAA,GAAQ,MAAM,YAAA,CAAa,IAAA,CAAK,IAAA,EAAM,GAAA,EAAK,IAAA,CAAK,SAAA,IAAa,IAAA,EAAM,IAAA,CAAK,OAAA,IAAW,IAAI,CAAA;AAC7F,MAAA,IAAI,OAAO,QAAA,CAAS,UAAA,CAAW,CAAC,CAAA,CAAG,CAAC,CAAC,CAAA,GAAI,KAAA;AAAA,IAC3C;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT;AAEA,eAAe,YAAA,CACb,IAAA,EACA,MAAA,EACA,SAAA,EACA,OAAA,EACwB;AACxB,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,IAAA,CAAK,KAAA;AAAA,IAC1B,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAA,CAAA;AAAA,IAOA,CAAC,aAAA,CAAc,MAAM,CAAA,EAAG,WAAW,OAAO;AAAA,GAC5C;AACA,EAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,EAAA,MAAM,UAAA,GAAa,CAAA,GAAM,MAAA,CAAO,GAAA,CAAI,QAAQ,CAAA;AAC5C,EAAA,IAAI,UAAA,GAAa,mCAAmC,OAAO,IAAA;AAC3D,EAAA,OAAO,MAAA,CAAO,IAAI,QAAQ,CAAA;AAC5B;AC/kBA,eAAA,EAAA;AACA,UAAA,EAAA;AChCO,IAAMc,WAAAA,GAAa,GAAA;AAE1B,IAAM,kCAAkB,IAAI,GAAA,CAAI,CAAC,QAAA,EAAU,cAAc,CAAC,CAAA;AAE1D,IAAM,0CAA0B,IAAI,GAAA,CAAI,CAAC,QAAA,EAAU,SAAA,EAAW,WAAW,CAAC,CAAA;AAoB1E,SAAS,cAAcnC,IAAAA,EAA4B;AACjD,EAAA,IAAI,CAAC,eAAA,CAAgB,GAAA,CAAIA,IAAAA,CAAI,QAAQ,CAAA,EAAG;AACtC,IAAA,MAAM,IAAI,MAAM,CAAA,iCAAA,EAAoC,IAAA,CAAK,UAAUA,IAAAA,CAAI,QAAQ,CAAC,CAAA,uBAAA,CAAoB,CAAA;AAAA,EACtG;AACF;AAGO,SAAS,aAAaA,IAAAA,EAA8B;AACzD,EAAA,OAAO,IAAIC,uBAAAA,CAAO;AAAA,IAChB,MAAA,EAAQD,KAAI,MAAA,IAAU,MAAA;AAAA,IACtB,OAAA,EAASA,KAAI,OAAA,IAAW,MAAA;AAAA,IACxB,OAAA,EAASmC,WAAAA;AAAA,IACT,UAAA,EAAY;AAAA,GACb,CAAA;AACH;AAMA,eAAsB,oBAAA,CACpBnC,IAAAA,EACA,KAAA,EACA,IAAA,GAA2C,EAAC,EAC3B;AACjB,EAAA,aAAA,CAAcA,IAAG,CAAA;AACjB,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,IAAU,YAAA,CAAaA,IAAG,CAAA;AAE9C,EAAA,MAAM,QAAQ,KAAA,CAAM,GAAA;AAAA,IAAI,CAAC,IAAA,EAAM,CAAA,KAC7B,IAAA,CAAK,SAAA,CAAU;AAAA,MACb,SAAA,EAAW,OAAO,CAAC,CAAA;AAAA,MACnB,MAAA,EAAQ,MAAA;AAAA,MACR,GAAA,EAAK,gBAAA;AAAA,MACL,MAAM,EAAE,KAAA,EAAOA,IAAAA,CAAI,KAAA,EAAO,OAAO,IAAA;AAAK,KACvC;AAAA,GACH;AACA,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC;AAAA,CAAA,EAAM,OAAO,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA;AAE/F,EAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO;AAAA,IACxC,MAAM,IAAI,IAAA,CAAK,CAAC,KAAK,GAAG,mBAAmB,CAAA;AAAA,IAC3C,OAAA,EAAS;AAAA,GACV,CAAA;AACD,EAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO;AAAA,IACxC,eAAe,OAAA,CAAQ,EAAA;AAAA,IACvB,QAAA,EAAU,gBAAA;AAAA,IACV,iBAAA,EAAmB;AAAA,GACpB,CAAA;AACD,EAAA,OAAO,KAAA,CAAM,EAAA;AACf;AAEA,eAAe,aAAa,OAAA,EAAmC;AAC7D,EAAA,IAAI,OAAA,IAAW,OAAO,OAAA,KAAY,QAAA,EAAU;AAC1C,IAAA,MAAM,CAAA,GAAI,OAAA;AACV,IAAA,IAAI,OAAO,CAAA,CAAE,IAAA,KAAS,UAAA,EAAY;AAChC,MAAA,OAAO,MAAO,EAAE,IAAA,EAA+B;AAAA,IACjD;AACA,IAAA,IAAI,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA,SAAiB,CAAA,CAAE,IAAA;AAAA,EAC3C;AACA,EAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AACjD;AAUA,eAAsB,kBAAA,CACpBA,IAAAA,EACA,OAAA,EACA,IAAA,GAA2C,EAAC,EAChB;AAC5B,EAAA,aAAA,CAAcA,IAAG,CAAA;AACjB,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,IAAU,YAAA,CAAaA,IAAG,CAAA;AAE9C,EAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,OAAA,CAAQ,SAAS,OAAO,CAAA;AACnD,EAAA,IAAI,uBAAA,CAAwB,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA,EAAG;AAC7C,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,OAAO,CAAA,mBAAA,EAAsB,KAAK,SAAA,CAAU,KAAA,CAAM,MAAM,CAAC,CAAA,CAAE,CAAA;AAAA,EAChG;AACA,EAAA,IAAI,KAAA,CAAM,WAAW,WAAA,EAAa;AAChC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,MAAM,cAAA,EAAgB;AACzB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,OAAO,CAAA,sCAAA,CAAwC,CAAA;AAAA,EACpF;AAEA,EAAA,MAAM,UAAU,MAAM,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,MAAM,cAAc,CAAA;AAC/D,EAAA,MAAM,GAAA,GAAM,MAAM,YAAA,CAAa,OAAO,CAAA;AAEtC,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAsB;AAC1C,EAAA,KAAA,MAAW,IAAA,IAAQ,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,EAAG;AAClC,IAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAK9B,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,QAAA,CAAS,GAAA,CAAI,WAAW,EAAE,CAAA;AAClD,IAAA,IAAI,IAAI,KAAA,EAAO;AACb,MAAA,MAAM,OAAA,GAAU,OAAO,GAAA,CAAI,KAAA,KAAU,QAAA,GAAW,IAAI,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA;AACpF,MAAA,MAAM,IAAI,MAAM,CAAA,gBAAA,EAAmB,OAAO,SAAS,QAAQ,CAAA,SAAA,EAAY,OAAO,CAAA,CAAE,CAAA;AAAA,IAClF;AACA,IAAA,MAAM,YAAY,GAAA,CAAI,QAAA,EAAU,IAAA,EAAM,IAAA,GAAO,CAAC,CAAA,EAAG,SAAA;AACjD,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,OAAO,CAAA,MAAA,EAAS,QAAQ,CAAA,0BAAA,CAA4B,CAAA;AAAA,IACzF;AACA,IAAA,OAAA,CAAQ,GAAA,CAAI,UAAU,SAAS,CAAA;AAAA,EACjC;AAEA,EAAA,OAAO,CAAC,GAAG,OAAA,CAAQ,MAAM,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,GAAI,CAAC,EAAE,GAAA,CAAI,CAAC,MAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAE,CAAA;AAC7E;;;AD/FA,UAAA,EAAA;AAKO,IAAM,SAAA,GAAoC,EAAE,MAAA,EAAQ,CAAA,EAAG,OAAO,CAAA,EAAE;AAEhE,IAAM,WAAA,GAAc,GAAA;AACpB,IAAM,mBAAA,GAAsB,IAAA;AAC5B,IAAM,YAAA,GAAe,YAAA;AAE5B,IAAMoC,WAAAA,uBAAiB,GAAA,CAAI;AAAA,EACzB,yEAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,IAAM,eAAA,GAA0C;AAAA,EAC9C,MAAA,EAAQ,iBAAA;AAAA,EACR,OAAA,EAAS,yEAAA;AAAA,EACT,OAAA,EAAS,2EAAA;AAAA,EACT,MAAA,EAAQ,WAAA;AAAA,EACR,MAAA,EAAQ,YAAA;AAAA,EACR,OAAA,EAAS,YAAA;AAAA,EACT,MAAA,EAAQ,WAAA;AAAA,EACR,MAAA,EAAQ,WAAA;AAAA,EACR,MAAA,EAAQ,YAAA;AAAA,EACR,OAAA,EAAS,YAAA;AAAA,EACT,OAAA,EAAS,YAAA;AAAA,EACT,MAAA,EAAQ,YAAA;AAAA,EACR,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,WAAA,GAAsC,EAAE,GAAG,eAAA,EAAgB;AA2DjE,SAAS,kBAAkB,GAAA,EAAuB;AAChD,EAAA,OACE,OAAO,QAAQ,QAAA,IAAY,GAAA,KAAQ,QAAQ,MAAA,IAAU,GAAA,IAAQ,IAA0B,IAAA,KAAS,OAAA;AAEpG;AAEO,SAAS,gBAAgB,QAAA,EAAoD;AAClF,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,EAAA,MAAM,QAAA,GAAW,SAAA,CAAU,IAAA,EAAM,QAAQ,CAAA;AACzC,EAAA,IAAI,UAAU,OAAO,QAAA;AACrB,EAAA,MAAMC,IAAAA,GAAM,QAAA,CAAS,WAAA,CAAY,GAAG,CAAA;AACpC,EAAA,MAAM,GAAA,GAAMA,QAAO,CAAA,GAAI,QAAA,CAAS,MAAMA,IAAG,CAAA,CAAE,aAAY,GAAI,EAAA;AAC3D,EAAA,IAAI,OAAO,WAAA,CAAY,GAAG,CAAA,EAAG,OAAO,YAAY,GAAG,CAAA;AACnD,EAAA,OAAO,IAAA;AACT;AAQO,SAAS,cAAc,IAAA,EAKoB;AAChD,EAAA,MAAM,QAAA,GACJ;AAAA,IACE,CAAC,MAAA,EAAQ,IAAA,CAAK,IAAI,CAAA;AAAA,IAClB,CAAC,SAAA,EAAW,IAAA,CAAK,OAAO,CAAA;AAAA,IACxB,CAAC,MAAA,EAAQ,IAAA,CAAK,IAAI;AAAA,GACpB,CACA,OAAO,CAAC,GAAG,CAAC,CAAA,KAAM,KAAK,IAAI,CAAA;AAC7B,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,+DAAA,EACW,QAAA,CAAS,GAAA,CAAI,CAAC,CAAC,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,IAAK,MAAM,CAAA,CAAA;AAAA,KAC1D;AAAA,EACF;AAEA,EAAA,IAAI,IAAA,CAAK,IAAA,IAAQ,IAAA,EAAM,OAAO,CAAC,MAAM,IAAA,CAAK,QAAA,IAAY,IAAA,EAAM,IAAA,CAAK,IAAI,CAAA;AACrE,EAAA,IAAI,IAAA,CAAK,WAAW,IAAA,EAAM;AACxB,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,OAAO,CAAA,GAAI,IAAA,CAAK,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA;AACnF,IAAA,OAAO,CAAC,GAAA,EAAK,IAAA,CAAK,QAAA,IAAY,MAAM,IAAI,CAAA;AAAA,EAC1C;AAEA,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,IAAA,MAAM,IAAA,GAAOC,gBAAa,IAAI,CAAA;AAC9B,IAAA,OAAO,CAAC,IAAA,EAAM,IAAA,CAAK,YAAYC,aAAA,CAAS,IAAI,GAAG,IAAI,CAAA;AAAA,EACrD;AACA,EAAA,IACE,IAAA,IACA,OAAO,IAAA,KAAS,QAAA,IAChB,QAAA,IAAa,QACb,MAAA,CAAO,QAAA,CAAU,IAAA,CAA4B,MAAM,CAAA,EACnD;AACA,IAAA,MAAM,CAAA,GAAI,IAAA;AACV,IAAA,OAAO,CAAC,CAAA,CAAE,MAAA,EAAQ,IAAA,CAAK,QAAA,IAAY,EAAE,YAAA,IAAgB,CAAA,CAAE,IAAA,IAAQ,IAAA,EAAM,IAAI,CAAA;AAAA,EAC3E;AACA,EAAA,IAAI,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,EAAG,OAAO,CAAC,IAAA,EAAM,IAAA,CAAK,QAAA,IAAY,IAAA,EAAM,IAAI,CAAA;AACpE,EAAA,IAAI,QAAQ,OAAO,IAAA,KAAS,YAAY,OAAQ,IAAA,CAA4B,SAAS,UAAA,EAAY;AAC/F,IAAA,MAAM,IAAA,GAAQ,KAAsD,IAAA,EAAK;AACzE,IAAA,MAAM,GAAA,GAAM,OAAO,IAAA,KAAS,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,IAAA,EAAM,MAAM,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AACnF,IAAA,MAAM,aAAc,IAAA,CAA4B,IAAA;AAChD,IAAA,MAAM,WAAW,OAAO,UAAA,KAAe,QAAA,GAAWA,aAAA,CAAS,UAAU,CAAA,GAAI,IAAA;AACzE,IAAA,OAAO,CAAC,GAAA,EAAK,IAAA,CAAK,QAAA,IAAY,UAAU,IAAI,CAAA;AAAA,EAC9C;AACA,EAAA,MAAM,IAAI,MAAM,yDAAyD,CAAA;AAC3E;AAGA,eAAsB,QAAQ,IAAA,EAOR;AACpB,EAAA,IAAI,IAAA,CAAK,QAAQ,IAAA,EAAM;AACrB,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA,IAAK,EAAA;AACzC,IAAA,MAAMC,QAAO,SAAA,CAAU,KAAA,EAAO,KAAK,QAAA,IAAY,IAAA,CAAK,IAAI,CAAA,IAAK,YAAA;AAC7D,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,KAAA;AAAA,MACN,IAAA,EAAAA,KAAAA;AAAA,MACA,KAAA,EAAO,IAAA;AAAA,MACP,MAAA,EAAQ,IAAA;AAAA,MACR,SAAA,EAAW,MAAA,CAAO,UAAA,CAAW,KAAA,EAAO,MAAM,CAAA;AAAA,MAC1C,WAAA,EAAa,CAAA;AAAA,MACb,SAAA,EAAW,KAAA;AAAA,MACX,gBAAgB,EAAC;AAAA,MACjB,WAAA,EAAa,oBAAA,CAAqB,EAAE,QAAA,EAAU,OAAO,CAAA;AAAA,MACrD,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAEA,EAAA,MAAM,UAAU,IAAA,CAAK,OAAA;AACrB,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,IAAA,IAAQ,EAAA;AAC5C,EAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,KAAK,CAAA,IAAK,EAAA;AACvC,EAAA,MAAM,YAAY,MAAMxB,QAAAA,CAAQ,OAAA,EAAS,KAAA,EAAO,QAAQ,IAAA,EAAM;AAAA,IAC5D,SAAA,EAAW,KAAK,MAAA,CAAO,SAAA;AAAA,IACvB,OAAO,IAAA,CAAK;AAAA,GACb,CAAA;AAED,EAAA,IAAI,IAAA,GAAO,YAAA,CAAa,SAAA,CAAU,IAAA,IAAQ,EAAE,CAAA,IAAK,EAAA;AACjD,EAAA,MAAM,aAAA,GAAgB,IAAA,IAAQ,SAAA,CAAU,IAAA,EAAM,KAAK,CAAA,IAAK,YAAA;AACxD,EAAA,IAAI,aAAA,KAAkB,iBAAA,IAAqB,IAAA,EAAM,IAAA,GAAO,WAAW,IAAI,CAAA;AAEvE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,IAAA;AAAA,IACN,IAAA,EAAM,aAAA;AAAA,IACN,KAAA,EAAO,UAAU,KAAA,IAAS,IAAA;AAAA,IAC1B,MAAA,EAAQ,UAAU,MAAA,IAAU,IAAA;AAAA,IAC5B,WAAW,OAAA,CAAQ,MAAA;AAAA,IACnB,WAAA,EAAa,UAAU,WAAA,IAAe,CAAA;AAAA,IACtC,SAAA,EAAW,OAAA,CAAQ,SAAA,CAAU,SAAS,CAAA;AAAA,IACtC,gBAAgB,EAAE,GAAI,SAAA,CAAU,cAAA,IAAkB,EAAC,EAAG;AAAA,IACtD,WAAA,EAAa,oBAAA,CAAqB,EAAE,QAAA,EAAU,SAAS,CAAA;AAAA,IACvD,UAAA,EAAY,OAAA,CAAQ,SAAA,CAAU,UAAU;AAAA,GAC1C;AACF;AAEO,SAAS,aAAa,QAAA,EAA4B;AACvD,EAAA,IAAI,KAAA,GAAQ,YAAA,CAAa,QAAA,CAAS,IAAA,EAAM;AAAA,IACtC,OAAO,QAAA,CAAS,KAAA;AAAA,IAChB,QAAQ,QAAA,CAAS,MAAA;AAAA,IACjB,WAAW,QAAA,CAAS;AAAA,GACrB,CAAA;AACD,EAAA,IAAIoB,WAAAA,CAAW,IAAI,QAAA,CAAS,IAAI,KAAK,CAAC,QAAA,CAAS,KAAA,IAAS,QAAA,CAAS,IAAA,EAAM;AACrE,IAAA,KAAA,GAAQ,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,KAAK,QAAA,CAAS,IAAA,CAAK,MAAA,GAAS,mBAAmB,CAAC,CAAA;AAAA,EAC3E;AACA,EAAA,OAAO,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,SAAS,WAAW,CAAA;AACjD;AAEA,SAAS,WAAA,CAAY,QAAqC,IAAA,EAAyC;AACjG,EAAA,IAAI,CAAC,MAAA,EAAQ;AACb,EAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,YAAA,IAAgB,EAAC,EAAG;AAC1C,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,EAAG,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,EAC9C;AACF;AAeO,SAAS,kBAAA,CACd,IAAA,EACA,MAAA,EACA,SAAA,EACA,OACA,MAAA,EACQ;AACR,EAAA,IAAI,MAAA,IAAU,IAAA,IAAQ,MAAA,CAAO,OAAA,IAAW,OAAO,IAAA;AAC/C,EAAA,MAAM,CAAC,QAAA,EAAU,IAAI,CAAA,GAAI,cAAA,CAAe,MAAM,MAAA,EAAQ;AAAA,IACpD,KAAA,EAAO,QAAA;AAAA,IACP,SAAA;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAA,WAAA,CAAY,QAAQ,IAAI,CAAA;AACxB,EAAA,OAAO,QAAA;AACT;AAUO,SAAS,eAAA,CACd,IAAA,EACA,MAAA,EACA,SAAA,EACA,OACA,MAAA,EACyB;AACzB,EAAA,IAAI,MAAA,IAAU,IAAA,IAAQ,MAAA,CAAO,OAAA,IAAW,OAAO,IAAA;AAC/C,EAAA,MAAM,WAAoC,EAAC;AAC3C,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC/C,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,MAAM,CAAC,EAAA,EAAI,IAAI,CAAA,GAAI,cAAA,CAAe,KAAA,EAAO,MAAA,EAAQ,EAAE,KAAA,EAAO,QAAA,EAAU,SAAA,EAAW,KAAA,EAAO,CAAA;AACtF,MAAA,WAAA,CAAY,QAAQ,IAAI,CAAA;AACxB,MAAA,QAAA,CAAS,GAAG,CAAA,GAAI,EAAA;AAAA,IAClB,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,GAAG,CAAA,GAAI,KAAA;AAAA,IAClB;AAAA,EACF;AACA,EAAA,OAAO,QAAA;AACT;AAUO,SAAS,WAAA,CACd,QAAA,EACA,IAAA,EACA,IAAA,GAKI,EAAC,EACiB;AACtB,EAAA,MAAM,CAAC,MAAA,EAAQ,aAAA,EAAe,UAAU,CAAA,GAAI,eAAe,QAAA,CAAS,IAAA,EAAM,QAAA,CAAS,IAAA,EAAM,IAAA,EAAM;AAAA,IAC7F,YAAY,QAAA,CAAS;AAAA,GACtB,CAAA;AACD,EAAA,IAAI,IAAA,GAAO,YAAY,aAAa,CAAA;AACpC,EAAA,IAAI,QAAA,CAAS,UAAA,IAAc,IAAA,KAAS,SAAA,EAAW,IAAA,GAAO,UAAA;AAEtD,EAAA,MAAM,OAAmB,EAAC;AAC1B,EAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,MAAA,CAAO,QAAQ,GAAA,EAAA,EAAO;AAC5C,IAAA,IAAI,KAAA,GAAQ,YAAA,CAAa,MAAA,CAAO,GAAG,CAAE,CAAA;AACrC,IAAA,IAAI,KAAK,MAAA,IAAU,IAAA,IAAQ,CAAC,IAAA,CAAK,MAAA,CAAO,SAAQ,EAAG;AACjD,MAAA,MAAM,CAAC,QAAA,EAAU,IAAI,IAAI,cAAA,CAAe,KAAA,EAAO,KAAK,MAAA,EAAQ;AAAA,QAC1D,KAAA,EAAO,QAAA;AAAA,QACP,WAAW,IAAA,CAAK,SAAA;AAAA,QAChB,OAAO,IAAA,CAAK;AAAA,OACb,CAAA;AACD,MAAA,WAAA,CAAY,IAAA,CAAK,QAAQ,IAAI,CAAA;AAC7B,MAAA,KAAA,GAAQ,QAAA;AAAA,IACV;AACA,IAAA,IAAI,CAAC,KAAA,EAAO,IAAA,EAAK,EAAG;AACpB,IAAA,MAAM,IAAA,GAAgC,EAAE,OAAA,EAAS,IAAA,EAAK;AACtD,IAAA,IAAI,GAAA,GAAM,UAAA,CAAW,MAAA,IAAU,UAAA,CAAW,GAAG,CAAA,IAAK,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,GAAG,CAAE,CAAA,CAAE,MAAA,EAAQ;AACtF,MAAA,MAAA,CAAO,MAAA;AAAA,QACL,IAAA;AAAA,QACA,eAAA,CAAgB,UAAA,CAAW,GAAG,CAAA,EAAI,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,SAAA,IAAa,IAAA,EAAM,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,MAAM;AAAA,OAChG;AAAA,IACF;AACA,IAAA,IAAA,CAAK,IAAA,CAAK,EAAE,GAAA,EAAK,IAAA,CAAK,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,cAAA,CAAe,KAAK,CAAA,EAAG,IAAA,EAAM,CAAA;AAAA,EAChF;AACA,EAAA,OAAO,CAAC,IAAA,EAAM,aAAA,IAAiB,QAAA,CAAS,QAAQ,YAAY,CAAA;AAC9D;AAGA,eAAsB,WAAA,CAAY,UAAoB,IAAA,EAAmC;AACvF,EAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,OAAO,CAAA;AACzB,EAAA,IAAI,WAAA,GAAc,CAAA;AAClB,EAAA,KAAA,IAAS,QAAQ,CAAA,EAAG,KAAA,GAAQ,IAAA,CAAK,MAAA,EAAQ,SAAS,WAAA,EAAa;AAC7D,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,QAAQ,WAAW,CAAA;AACnD,IAAA,MAAM,CAAC,OAAA,EAAS,MAAM,CAAA,GAAI,MAAM,QAAA,CAAS,KAAA;AAAA,MACvC,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAAA,MACvB,EAAE,MAAM,UAAA;AAAW,KACrB;AACA,IAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,KAAA,CAAM,MAAA,EAAQ;AACnC,MAAA,MAAM,IAAI,MAAM,CAAA,4BAAA,EAA+B,OAAA,CAAQ,MAAM,CAAA,aAAA,EAAgB,KAAA,CAAM,MAAM,CAAA,OAAA,CAAS,CAAA;AAAA,IACpG;AACA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK,KAAA,CAAM,CAAC,CAAA,CAAG,SAAA,GAAY,CAAC,GAAG,OAAA,CAAQ,CAAC,CAAE,CAAA;AAC5E,IAAA,WAAA,IAAe,MAAA,IAAU,CAAA;AAAA,EAC3B;AACA,EAAA,OAAO,WAAA;AACT;AAGA,eAAsB,kBAAA,CAAmB,MAAY,MAAA,EAA4C;AAC/F,EAAA,MAAM,QAAA,GAAW,OAAO,SAAA,CAAU,QAAA;AAClC,EAAA,MAAM,KAAA,GAAQ,OAAO,SAAA,CAAU,KAAA;AAC/B,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,IAAA,CAAK,KAAA;AAAA,IAC1B,CAAA,+FAAA;AAAA,GACF;AACA,EAAA,IAAI,GAAA,GAAM,KAAK,CAAC,CAAA;AAChB,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAA,CAAK,MAAM,CAAA,2EAAA,CAA6E,CAAA;AAC9F,IAAA,GAAA,GAAM,EAAE,kBAAA,EAAoB,IAAA,EAAM,eAAA,EAAiB,IAAA,EAAM,eAAe,IAAA,EAAK;AAAA,EAC/E;AACA,EAAA,IAAI,GAAA,CAAI,eAAA,IAAmB,IAAA,IAAQ,GAAA,CAAI,sBAAsB,IAAA,EAAM;AACjE,IAAA,MAAM,IAAA,CAAK,KAAA;AAAA,MACT,CAAA;AAAA;AAAA;AAAA,mBAAA,CAAA;AAAA,MAIA,CAAC,QAAA,EAAU,KAAA,EAAO,MAAA,CAAO,SAAA,CAAU,OAAO,IAAI;AAAA,KAChD;AACA,IAAA;AAAA,EACF;AACA,EAAA,IAAI,GAAA,CAAI,eAAA,KAAoB,KAAA,IAAS,GAAA,CAAI,uBAAuB,QAAA,EAAU;AACxE,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,mEAAA,EACc,KAAK,SAAA,CAAU,GAAA,CAAI,kBAAkB,CAAC,CAAA,OAAA,EAAU,KAAK,SAAA,CAAU,GAAA,CAAI,eAAe,CAAC,CAAA,6CAAA,EAChE,KAAK,SAAA,CAAU,QAAQ,CAAC,CAAA,OAAA,EAAU,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA,kHAAA;AAAA,KAE1F;AAAA,EACF;AACF;AAGA,eAAsB,kBAAA,CAAmB,MAAY,GAAA,EAA+C;AAClG,EAAA,IAAI,OAAO,IAAA,EAAM;AACjB,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,IAAA,CAAK,MAAM,CAAA,0DAAA,CAA4D,CAAA;AAC9F,EAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,EAAA,IAAI,CAAC,GAAA,EAAK;AACV,EAAA,IAAI,GAAA,CAAI,iBAAiB,IAAA,EAAM;AAC7B,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,CAAA,8DAAA,CAAA,EAAkE,CAAC,GAAG,CAAC,CAAA;AAAA,EAC1F,CAAA,MAAA,IAAW,MAAA,CAAO,GAAA,CAAI,aAAa,MAAM,GAAA,EAAK;AAC5C,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,iEAAA,EAAoE,GAAA,CAAI,aAAa,CAAA,6FAAA,EAEhF,GAAG,CAAA,qBAAA;AAAA,KACV;AAAA,EACF;AACF;AAEA,eAAe,YAAA,CACb,MACA,IAAA,EAMyC;AACzC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,IAAY,IAAA,GAAO,CAAA,iBAAA,CAAA,GAAsB,CAAA,cAAA,CAAA;AAC5D,EAAA,MAAM,MAAA,GAAoB,KAAK,QAAA,IAAY,IAAA,GAAO,EAAC,GAAI,CAAC,KAAK,QAAQ,CAAA;AACrE,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,IAAA,CAAK,cAAc,IAAA,EAAM;AAC3B,IAAA,MAAA,CAAO,IAAA,CAAK,KAAK,UAAU,CAAA;AAC3B,IAAA,KAAA,GAAQ,CAAA,eAAA,EAAkB,OAAO,MAAM,CAAA,CAAA;AAAA,EACzC,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,IAAQ,IAAA,EAAM;AAC5B,IAAA,MAAA,CAAO,IAAA,CAAK,KAAK,IAAI,CAAA;AACrB,IAAA,KAAA,GAAQ,CAAA,QAAA,EAAW,OAAO,MAAM,CAAA,CAAA;AAAA,EAClC,CAAA,MAAO;AACL,IAAA,MAAA,CAAO,IAAA,CAAK,KAAK,UAAU,CAAA;AAC3B,IAAA,KAAA,GAAQ,CAAA,eAAA,EAAkB,OAAO,MAAM,CAAA,CAAA;AAAA,EACzC;AACA,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,IAAA,CAAK,KAAA;AAAA,IAC1B,CAAA,6CAAA,EAAgD,KAAK,CAAA,KAAA,EAAQ,KAAK,CAAA,gCAAA,CAAA;AAAA,IAClE;AAAA,GACF;AACA,EAAA,OAAO,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA;AACpB;AAYA,eAAsB,MAAA,CACpB,MACA,IAAA,EAKmB;AACnB,EAAA,IAAI,IAAA,CAAK,aAAa,IAAA,EAAM,OAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,YAAY,IAAA,EAAK;AACzE,EAAA,IAAI,IAAA,CAAK,QAAA,KAAa,SAAA,IAAa,IAAA,CAAK,OAAA,CAAQ,cAAc,IAAA,IAAQ,IAAA,CAAK,OAAA,CAAQ,IAAA,IAAQ,IAAA,EAAM;AAC/F,IAAA,OAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,UAAA,EAAY,IAAA,EAAK;AAAA,EAC/C;AAEA,EAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,IAAA,EAAM;AAAA,IACxC,QAAA,EAAU,IAAA,CAAK,OAAA,CAAQ,QAAA,IAAY,IAAA;AAAA,IACnC,UAAA,EAAY,IAAA,CAAK,OAAA,CAAQ,UAAA,IAAc,IAAA;AAAA,IACvC,IAAA,EAAM,IAAA,CAAK,OAAA,CAAQ,IAAA,IAAQ,IAAA;AAAA,IAC3B,UAAA,EACE,IAAA,CAAK,QAAA,KAAa,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,SAAS,CAAA,GAAI,IAAA,CAAK,SAAA,GAAY,MAAA,CAAO,MAAM,CAAC;AAAA,GAClG,CAAA;AACD,EAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,YAAY,IAAA,EAAK;AAE5D,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AACrC,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,WAAA,IAAe,QAAA,CAAS,WAAW,SAAA,EAAW;AACpE,IAAA,OAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,UAAA,EAAY,UAAA,EAAW;AAAA,EACrD;AAEA,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI,IAAA,CAAK,aAAa,QAAA,EAAU;AAC9B,IAAA,MAAA,GAAS,SAAS,WAAA,IAAe,IAAA,GAAO,OAAO,IAAA,CAAK,QAAA,CAAS,WAAqB,CAAA,GAAI,IAAA;AACtF,IAAA,QAAA,GAAW,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,SAAS,CAAA,GAAI,KAAK,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,SAAmB,CAAA;AAAA,EACpG,CAAA,MAAO;AACL,IAAA,MAAA,GAAU,SAAS,SAAA,EAA8C,YAAA;AACjE,IAAA,QAAA,GAAW,IAAA,CAAK,SAAA;AAAA,EAClB;AAEA,EAAA,MAAM,OACJ,MAAA,IAAU,IAAA,IACV,YAAY,IAAA,KACX,MAAA,CAAO,SAAS,MAAM,CAAA,IAAK,OAAO,QAAA,CAAS,QAAQ,IAChD,MAAA,CAAO,OAAA,CAAQ,QAAQ,QAAQ,CAAA,KAAM,IACrC,MAAA,KAAW,QAAA,CAAA;AAEjB,EAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,YAAY,UAAA,EAAW;AAC9D,EAAA,IAAI,QAAA,CAAS,WAAW,SAAA,EAAW,OAAO,EAAE,MAAA,EAAQ,MAAA,EAAQ,YAAY,UAAA,EAAW;AACnF,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,IAAA,IAAQ,QAAA;AACrC,EAAA,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA,IAAK,CAAA,MAAO,UAAW,QAAA,CAAS,IAAA,IAAmB,QAAQ,CAAA,IAAK,CAAA,CAAA,EAAI;AACxF,IAAA,OAAO,EAAE,MAAA,EAAQ,MAAA,EAAQ,UAAA,EAAY,UAAA,EAAW;AAAA,EAClD;AACA,EAAA,OAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,UAAA,EAAY,UAAA,EAAW;AACrD;AAYA,eAAsB,aAAA,CACpB,MACA,IAAA,EACiB;AACjB,EAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,EAAQ;AAClC,EAAA,IAAI;AACF,IAAA,IAAI,KAAK,IAAA,CAAK,UAAA;AACd,IAAA,MAAM,MAAM,IAAA,CAAK,OAAA;AACjB,IAAA,IAAI,EAAA,EAAI;AACN,MAAA,MAAM,EAAE,MAAK,GAAI,MAAM,OAAO,KAAA,CAAM,CAAA,qDAAA,CAAA,EAAyD,CAAC,EAAE,CAAC,CAAA;AACjG,MAAA,IAAI,CAAC,IAAA,CAAK,CAAC,CAAA,EAAG,EAAA,GAAK,IAAA;AAAA,IACrB;AACA,IAAA,IAAI,CAAC,EAAA,EAAI;AACP,MAAA,EAAA,GAAKf,iBAAAA,EAAW;AAChB,MAAA,MAAM,MAAA,CAAO,KAAA;AAAA,QACX,CAAA;AAAA;AAAA,2DAAA,CAAA;AAAA,QAGA;AAAA,UACE,EAAA;AAAA,UACA,IAAI,QAAA,IAAY,IAAA;AAAA,UAChB,IAAI,UAAA,IAAc,IAAA;AAAA,UAClB,IAAI,IAAA,IAAQ,IAAA;AAAA,UACZ,IAAI,WAAA,IAAe,IAAA;AAAA,UACnB,IAAI,GAAA,IAAO;AAAA;AACb,OACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,MAAA,CAAO,KAAA;AAAA,QACX,CAAA;AAAA;AAAA;AAAA,oBAAA,CAAA;AAAA,QAIA;AAAA,UACE,IAAI,QAAA,IAAY,IAAA;AAAA,UAChB,IAAI,UAAA,IAAc,IAAA;AAAA,UAClB,IAAI,IAAA,IAAQ,IAAA;AAAA,UACZ,IAAI,WAAA,IAAe,IAAA;AAAA,UACnB,IAAI,GAAA,IAAO,IAAA;AAAA,UACX;AAAA;AACF,OACF;AAAA,IACF;AACA,IAAA,MAAM,MAAA,CAAO,KAAA;AAAA,MACX,CAAA,uGAAA,CAAA;AAAA,MACA,CAAC,EAAE;AAAA,KACL;AACA,IAAA,OAAO,EAAA;AAAA,EACT,CAAA,SAAE;AACA,IAAA,MAAA,CAAO,OAAA,EAAQ;AAAA,EACjB;AACF;AAEA,eAAsB,gBAAA,CACpB,IAAA,EACA,UAAA,EACA,IAAA,EACe;AACf,EAAA,IAAI,KAAK,OAAA,EAAS;AAChB,IAAA,MAAM,IAAI,IAAA,CAAK,OAAA;AACf,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,IAAA,CAAK,MAAM,CAAA,4DAAA,CAAA,EAAgE;AAAA,MAChG;AAAA,KACD,CAAA;AACD,IAAA,IAAI,CAAC,IAAA,CAAK,CAAC,CAAA,EAAG;AACd,IAAA,MAAM,IAAA,GAAO,EAAE,GAAK,IAAA,CAAK,CAAC,CAAA,CAAE,SAAA,IAAyC,EAAC,EAAI,GAAG,CAAA,CAAE,WAAA,EAAY;AAC3F,IAAA,MAAM,IAAA,CAAK,KAAA;AAAA,MACT,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAA,CAAA;AAAA,MASA;AAAA,QACE,CAAA,CAAE,IAAA;AAAA,QACF,CAAA,CAAE,IAAA;AAAA,QACF,CAAA,CAAE,IAAA;AAAA,QACF,CAAA,CAAE,UAAA;AAAA,QACF,CAAA,CAAE,IAAA;AAAA,QACF,IAAA,CAAK,UAAU,IAAI,CAAA;AAAA,QACnB,EAAE,YAAA,IAAgB,IAAA;AAAA,QAClB,EAAE,cAAA,IAAkB,IAAA,GAAO,KAAK,SAAA,CAAU,CAAA,CAAE,cAAc,CAAA,GAAI,IAAA;AAAA,QAC9D,EAAE,cAAA,IAAkB,IAAA;AAAA,QACpB,EAAE,iBAAA,IAAqB,IAAA,GAAO,KAAK,SAAA,CAAU,CAAA,CAAE,iBAAiB,CAAA,GAAI,IAAA;AAAA,QACpE,EAAE,iBAAA,IAAqB,IAAA;AAAA,QACvB,IAAA,CAAK,MAAA;AAAA,QACL,KAAK,KAAA,IAAS,IAAA;AAAA,QACd;AAAA;AACF,KACF;AACA,IAAA;AAAA,EACF;AACA,EAAA,MAAM,IAAA,CAAK,KAAA;AAAA,IACT,CAAA,yGAAA,CAAA;AAAA,IACA,CAAC,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,KAAA,IAAS,MAAM,UAAU;AAAA,GAC9C;AACF;AAEA,eAAsB,kBAAA,CACpB,IAAA,EACA,UAAA,EACA,WAAA,EACe;AACf,EAAA,IAAI,CAAC,WAAA,IAAe,CAAC,UAAA,EAAY;AACjC,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,IAAA,CAAK,MAAM,CAAA,4DAAA,CAAA,EAAgE;AAAA,IAChG;AAAA,GACD,CAAA;AACD,EAAA,IAAI,CAAC,IAAA,CAAK,CAAC,CAAA,EAAG;AACd,EAAA,MAAM,IAAA,GAAO,EAAE,GAAK,IAAA,CAAK,CAAC,CAAA,CAAE,SAAA,IAAyC,EAAC,EAAG;AACzE,EAAA,IAAI,IAAA,CAAK,iBAAiB,WAAA,EAAa;AACvC,EAAA,IAAA,CAAK,YAAA,GAAe,WAAA;AACpB,EAAA,MAAM,IAAA,CAAK,MAAM,CAAA,qFAAA,CAAA,EAAyF;AAAA,IACxG,IAAA,CAAK,UAAU,IAAI,CAAA;AAAA,IACnB;AAAA,GACD,CAAA;AACH;AAcA,eAAsB,qBAAA,CACpB,IAAA,EACA,UAAA,EACA,OAAA,EACmB;AACnB,EAAA,MAAM,EAAE,MAAK,GAAI,MAAM,KAAK,KAAA,CAAM,CAAA,oDAAA,CAAA,EAAwD,CAAC,UAAU,CAAC,CAAA;AACtG,EAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,GAAA,GAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,KAAK,SAAA,CAAU,UAAU,CAAC,CAAA,CAAE,CAAA;AACzE,IAAA,GAAA,CAAI,IAAA,GAAO,UAAA;AACX,IAAA,MAAM,GAAA;AAAA,EACR;AAEA,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,MAAM,OAAiB,EAAC;AACxB,EAAA,MAAM,OAAkB,EAAC;AACzB,EAAA,IAAI,CAAA,GAAI,CAAA;AAER,EAAA,IAAI,SAAS,OAAA,EAAS;AACpB,IAAA,MAAM,SAAA,GAAY,IAAI,GAAA,IAAO,IAAA,GAAO,CAAC,GAAI,GAAA,CAAI,GAAgB,CAAA,GAAI,IAAA;AACjE,IAAA,MAAM,OAAO,OAAA,CAAQ,GAAA;AACrB,IAAA,MAAM,IAAA,GACJ,cAAc,IAAA,IACb,KAAA,CAAM,QAAQ,SAAS,CAAA,IACtB,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,IAClB,UAAU,MAAA,KAAW,IAAA,CAAK,MAAA,IAC1B,SAAA,CAAU,KAAA,CAAM,CAAC,GAAG,GAAA,KAAQ,CAAA,KAAM,IAAA,CAAK,GAAG,CAAC,CAAA;AAC/C,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,IAAA,CAAK,IAAA,CAAK,CAAA,OAAA,EAAU,CAAA,EAAG,CAAA,CAAE,CAAA;AACzB,MAAA,IAAA,CAAK,KAAK,IAAI,CAAA;AACd,MAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,IACpB;AAAA,EACF;AACA,EAAA,KAAA,MAAW,KAAA,IAAS,CAAC,MAAA,EAAQ,aAAa,CAAA,EAAY;AACpD,IAAA,IAAI,SAAS,OAAA,IAAW,GAAA,CAAI,KAAK,CAAA,KAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACrD,MAAA,IAAA,CAAK,IAAA,CAAK,CAAA,EAAG,KAAK,CAAA,IAAA,EAAO,GAAG,CAAA,CAAE,CAAA;AAC9B,MAAA,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAC,CAAA;AACxB,MAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,IACpB;AAAA,EACF;AACA,EAAA,MAAM,UAAA,GAAc,OAAA,CAAQ,SAAA,IAAa,OAAA,CAAQ,QAAA;AACjD,EAAA,IAAI,UAAA,IAAc,OAAO,UAAA,KAAe,QAAA,EAAU;AAChD,IAAA,MAAM,OAAO,EAAE,GAAK,GAAA,CAAI,SAAA,IAAyC,EAAC,EAAG;AACrE,IAAA,MAAM,MAAA,GAAS,EAAE,GAAG,IAAA,EAAM,GAAG,UAAA,EAAW;AACxC,IAAA,IAAI,KAAK,SAAA,CAAU,MAAM,MAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,EAAG;AACnD,MAAA,IAAA,CAAK,IAAA,CAAK,CAAA,aAAA,EAAgB,CAAA,EAAG,CAAA,OAAA,CAAS,CAAA;AACtC,MAAA,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AAChC,MAAA,OAAA,CAAQ,KAAK,WAAW,CAAA;AAAA,IAC1B;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,EAAQ,OAAO,EAAC;AAC7B,EAAA,IAAA,CAAK,KAAK,oBAAoB,CAAA;AAC9B,EAAA,IAAA,CAAK,KAAK,UAAU,CAAA;AACpB,EAAA,MAAM,IAAA,CAAK,KAAA,CAAM,CAAA,oCAAA,EAAuC,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA,aAAA,EAAgB,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA;AAChG,EAAA,OAAO,OAAA;AACT;AAgBA,eAAsB,yBAAA,CACpB,IAAA,EACA,UAAA,EACA,OAAA,EACmB;AACnB,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,qBAAA,CAAsB,IAAA,EAAM,UAAA,EAAY;AAAA,MACnD,GAAA,EAAK,QAAQ,GAAA,IAAO,IAAA;AAAA,MACpB,IAAA,EAAM,QAAQ,IAAA,IAAQ,IAAA;AAAA,MACtB,WAAA,EAAa,QAAQ,WAAA,IAAe,IAAA;AAAA,MACpC,SAAA,EAAW,QAAQ,QAAA,IAAY;AAAA,KAChC,CAAA;AAAA,EACH,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,eAAe,KAAA,IAAS,GAAA,CAAI,IAAA,KAAS,UAAA,SAAmB,EAAC;AAC7D,IAAA,MAAM,GAAA;AAAA,EACR;AACF;AAEA,eAAe,4BAAA,CACb,SACA,IAAA,EAOe;AACf,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,KAAK,IAAA,CAAK,KAAA;AAAA,IAC/B,CAAA,mFAAA,CAAA;AAAA,IACA,CAAC,KAAK,UAAU;AAAA,GAClB;AACA,EAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,EAAA,IAAI,CAAC,GAAA,EAAK;AACV,EAAA,IAAI,GAAA,CAAI,eAAA,IAAmB,IAAA,IAAQ,CAAC,GAAA,CAAI,IAAA,IAAQ,CAAC,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA,CAAE,IAAA,EAAK,EAAG;AAE1E,EAAA,MAAM,aAAa,MAAM,qBAAA,CAAsB,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA,EAAG;AAAA,IAC/D,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,YAAY,OAAA,CAAQ;AAAA,GACrB,CAAA;AAED,EAAA,MAAM,iBAAyC,EAAC;AAChD,EAAA,IAAI,WAAW,cAAA,CAAe,SAAA;AAC5B,IAAA,cAAA,CAAe,oBAAA,GAAuB,WAAW,cAAA,CAAe,SAAA;AAClE,EAAA,IAAI,WAAW,cAAA,CAAe,UAAA;AAC5B,IAAA,cAAA,CAAe,qBAAA,GAAwB,WAAW,cAAA,CAAe,UAAA;AAEnE,EAAA,IAAI,UAAA,CAAW,gBAAgB,IAAA,EAAM;AACnC,IAAA,IAAI,WAAA,GAAc,CAAA;AAClB,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,cAAc,EAAE,MAAA,EAAQ;AACjD,MAAA,IAAI;AACF,QAAA,WAAA,GAAc,MAAM,cAAA,CAAe;AAAA,UACjC,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,QAAA,EAAU,IAAI,SAAA,IAAa,IAAA;AAAA,UAC3B,SAAS,UAAA,CAAW,YAAA;AAAA,UACpB,gBAAgB,UAAA,CAAW,cAAA;AAAA,UAC3B,SAAS,UAAA,CAAW,OAAA;AAAA,UACpB,gBAAgB,UAAA,CAAW;AAAA,SAC5B,CAAA;AAAA,MACH,SAAS,GAAA,EAAK;AACZ,QAAA,SAAA,CAAU,IAAA,CAAK,OAAO,GAAA,EAAK,EAAE,OAAO,8BAAA,EAAgC,WAAA,EAAa,IAAA,CAAK,UAAA,EAAY,CAAA;AAClG,QAAA,WAAA,GAAc,CAAA;AAAA,MAChB;AAAA,IACF;AACA,IAAA,IAAI,WAAA,iBAA4B,2BAAA,GAA8B,WAAA;AAC9D,IAAA,MAAM,KAAK,IAAA,CAAK,KAAA;AAAA,MACd,CAAA;AAAA;AAAA;AAAA,kBAAA,CAAA;AAAA,MAIA;AAAA,QACE,UAAA,CAAW,YAAA;AAAA,QACX,IAAA,CAAK,SAAA,CAAU,UAAA,CAAW,cAAc,CAAA;AAAA,QACxC,UAAA,CAAW,cAAA;AAAA,QACX,KAAK,SAAA,CAAU,EAAE,OAAA,EAAS,UAAA,CAAW,SAAS,CAAA;AAAA,QAC9C,kBAAA;AAAA,QACA,IAAA,CAAK;AAAA;AACP,KACF;AAAA,EACF,CAAA,MAAA,IAAW,WAAW,KAAA,EAAO;AAC3B,IAAA,SAAA,CAAU,KAAK,KAAA,EAAO,IAAI,KAAA,CAAM,UAAA,CAAW,KAAK,CAAA,EAAG;AAAA,MACjD,KAAA,EAAO,gCAAA;AAAA,MACP,aAAa,IAAA,CAAK;AAAA,KACnB,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,cAAc,CAAA,CAAE,MAAA,EAAQ;AACtC,IAAA,SAAA,CAAU,KAAK,KAAA,EAAO;AAAA,MACpB,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,CAAA;AAAA,MACP,QAAQ,EAAE,WAAA,EAAa,IAAA,CAAK,UAAA,EAAY,UAAU,uBAAA,EAAwB;AAAA,MAC1E;AAAA,KACoB,CAAA;AAAA,EACxB;AACF;AAaA,eAAsB,aAAA,CACpB,SACA,IAAA,EAQmB;AACnB,EAAA,IAAI,CAAC,IAAA,CAAK,UAAA,EAAY,OAAO,EAAC;AAC9B,EAAA,MAAM,UAAU,MAAM,yBAAA,CAA0B,KAAK,IAAA,EAAM,IAAA,CAAK,YAAY,OAAO,CAAA;AACnF,EAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,EAAG;AAC3B,IAAA,MAAM,KAAK,OAAA,CAAQ,cAAA,CAAe,KAAK,UAAA,EAAY,OAAA,CAAQ,OAAO,IAAI,CAAA;AAAA,EACxE;AACA,EAAA,IAAI,OAAA,CAAQ,iBAAA,IAAqB,IAAA,CAAK,MAAA,CAAO,OAAO,IAAA,EAAM;AACxD,IAAA,MAAM,6BAA6B,OAAA,EAAS;AAAA,MAC1C,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,MAAA,EAAQ,KAAK,MAAA,CAAO,GAAA;AAAA,MACpB,YAAY,IAAA,CAAK;AAAA,KAClB,CAAA;AAAA,EACH;AACA,EAAA,OAAO,OAAA;AACT;AAEA,eAAe,WAAA,CAAY,IAAA,EAAY,UAAA,EAAoB,IAAA,EAA+B;AACxF,EAAA,MAAM,IAAA,CAAK,MAAM,CAAA,yEAAA,CAAA,EAA6E;AAAA,IAC5F,IAAA;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,IAAA,CAAK,KAAA;AAAA,IAC1B,CAAA,yEAAA,CAAA;AAAA,IACA,CAAC,UAAU;AAAA,GACb;AACA,EAAA,OAAO,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,IAAK,CAAA;AACvB;AAEA,SAAS,aAAA,CAAc,UAAA,EAA2B,IAAA,EAAc,KAAA,GAAuB,IAAA,EAAsB;AAC3G,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,MAAA,CAAO,UAAA,IAAc,EAAE,CAAA;AAAA,IACnC,IAAA;AAAA,IACA,MAAA,EAAQ,SAAA;AAAA,IACR,KAAA;AAAA,IACA,MAAA,EAAQ,CAAA;AAAA,IACR,KAAA,EAAO,CAAA;AAAA,IACP,UAAA,EAAY,CAAA;AAAA,IACZ,gBAAgB,EAAC;AAAA,IACjB,KAAA,EAAO,IAAA;AAAA,IACP,iBAAiB;AAAC,GACpB;AACF;AAEA,SAAS,aAAa,GAAA,EAAmC;AACvD,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,CAAC,GAAG,CAAA;AAAA,IACf,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO,CAAA;AAAA,MACP,MAAA,EAAQ,GAAA,CAAI,MAAA,KAAW,QAAA,GAAW,CAAA,GAAI,CAAA;AAAA,MACtC,KAAA,EAAO,GAAA,CAAI,KAAA,GAAQ,GAAA,CAAI,UAAA;AAAA,MACvB,YAAY,GAAA,CAAI;AAAA;AAClB,GACF;AACF;AAEA,eAAe,WAAW,KAAA,EAAkD;AAC1E,EAAA,OAAO,KAAA;AACT;AAEA,eAAe,cAAA,CACb,SACA,IAAA,EAUuB;AACvB,EAAA,MAAM,cAAc,OAAA,EAAS;AAAA,IAC3B,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,OAAO,IAAA,CAAK;AAAA,GACb,CAAA;AAED,EAAA,IAAIoB,WAAAA,GAAa,CAAA;AACjB,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,IAAI;AACF,IAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,OAAA,IAAW,IAAA,CAAK,UAAA,EAAY;AAC/C,MAAAA,WAAAA,GAAa,MAAA;AAAA,QACV,MAAM,UAAA;AAAA,UACL,KAAK,UAAA,CAAW;AAAA,YACd,YAAY,IAAA,CAAK,UAAA;AAAA,YACjB,MAAA,EAAQ,IAAA;AAAA,YACR,QAAQ,IAAA,CAAK,MAAA;AAAA,YACb,OAAO,IAAA,CAAK;AAAA,WACb;AAAA,SACH,IAAM;AAAA,OACR;AAAA,IACF;AACA,IAAA,UAAA,GAAa,MAAM,YAAY,IAAA,CAAK,IAAA,EAAM,KAAK,UAAA,EAAY,OAAA,CAAQ,QAAQ,QAAQ,CAAA;AAAA,EACrF,SAAS,GAAA,EAAK;AACZ,IAAA,SAAA,CAAU,IAAA,CAAK,OAAO,GAAA,EAAK,EAAE,OAAO,cAAA,EAAgB,QAAA,EAAU,IAAA,CAAK,WAAA,EAAa,CAAA;AAChF,IAAA,OAAO,YAAA,CAAa;AAAA,MAClB,UAAA,EAAY,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAAA,MAClC,MAAM,IAAA,CAAK,WAAA;AAAA,MACX,MAAA,EAAQ,QAAA;AAAA,MACR,KAAA,EAAO,IAAA;AAAA,MACP,MAAA,EAAQ,CAAA;AAAA,MACR,KAAA,EAAO,CAAA;AAAA,MACP,UAAA,EAAY,CAAA;AAAA,MACZ,gBAAgB,EAAC;AAAA,MACjB,KAAA,EAAO,OAAO,GAAG,CAAA;AAAA,MACjB,iBAAiB;AAAC,KACnB,CAAA;AAAA,EACH;AAEA,EAAA,IAAIA,WAAAA,EAAY;AACd,IAAA,SAAA,CAAU,KAAK,KAAA,EAAO;AAAA,MACpB,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAOA,WAAAA;AAAA,MACP,MAAA,EAAQ;AAAA,QACN,WAAA,EAAa,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAAA,QACnC,MAAM,IAAA,CAAK,WAAA;AAAA,QACX,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,OAAA,EAAS,IAAA;AAAA,QACT,MAAA,EAAQ,UAAA;AAAA,QACR,WAAA,EAAaA;AAAA;AACf,KACoB,CAAA;AAAA,EACxB;AAEA,EAAA,OAAO,YAAA,CAAa;AAAA,IAClB,UAAA,EAAY,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAAA,IAClC,MAAM,IAAA,CAAK,WAAA;AAAA,IACX,MAAA,EAAQ,UAAA;AAAA,IACR,KAAA,EAAO,IAAA;AAAA,IACP,MAAA,EAAQ,UAAA;AAAA,IACR,KAAA,EAAO,CAAA;AAAA,IACP,UAAA,EAAAA,WAAAA;AAAA,IACA,gBAAgB,EAAC;AAAA,IACjB,KAAA,EAAO,IAAA;AAAA,IACP,iBAAiB;AAAC,GACnB,CAAA;AACH;AASA,eAAsB,SAAA,CACpB,SACA,IAAA,EASuB;AACvB,EAAA,MAAM,CAAC,OAAA,EAAS,QAAA,EAAU,IAAI,CAAA,GAAI,KAAK,aAAA,IAAiB;AAAA,IACtD,QAAQ,OAAA,IAAW,IAAA;AAAA,IACnB,QAAQ,QAAA,IAAY,IAAA;AAAA,IACpB,QAAQ,IAAA,IAAQ;AAAA,GAClB;AACA,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,IAAA,IAAQ,QAAA,IAAY,QAAQ,UAAA,IAAc,WAAA;AACtE,EAAA,MAAM,IAAA,GAAa,OAAA,CAAQ,IAAA,IAAQ,IAAA,CAAK,MAAA,CAAO,WAAA;AAE/C,EAAA,MAAM,kBAAA,CAAmB,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA;AAE/C,EAAA,IAAI,WAAW,IAAA,EAAM;AACnB,IAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,IAAA,CAAK,IAAA,EAAM;AAAA,MAClC,OAAA,EAAS,EAAE,GAAG,OAAA,EAAS,IAAA,EAAK;AAAA,MAC5B,QAAA,EAAU,SAAA;AAAA,MACV,SAAA,EAAW,oBAAA,CAAqB,EAAE,QAAA,EAAU,SAAS;AAAA,KACtD,CAAA;AACD,IAAA,IAAI,GAAA,CAAI,WAAW,MAAA,EAAQ;AACzB,MAAA,MAAM,aAAA;AAAA,QACJ,EAAE,GAAG,OAAA,EAAS,IAAA,EAAK;AAAA,QACnB;AAAA,UACE,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,SAAS,IAAA,CAAK,OAAA;AAAA,UACd,YAAY,GAAA,CAAI,UAAA;AAAA,UAChB,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,OAAO,IAAA,CAAK;AAAA;AACd,OACF;AACA,MAAA,OAAO,YAAA,CAAa,aAAA,CAAc,GAAA,CAAI,UAAA,EAAY,WAAW,CAAC,CAAA;AAAA,IAChE;AACA,IAAA,IAAI,GAAA,CAAI,WAAW,SAAA,EAAW;AAC5B,MAAA,OAAO,cAAA;AAAA,QACL,EAAE,GAAG,OAAA,EAAS,IAAA,EAAK;AAAA,QACnB;AAAA,UACE,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,SAAS,IAAA,CAAK,OAAA;AAAA,UACd,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,YAAY,IAAA,CAAK,UAAA;AAAA,UACjB,YAAY,GAAA,CAAI,UAAA;AAAA,UAChB;AAAA;AACF,OACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ;AAAA,IAC7B,OAAA;AAAA,IACA,QAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA,EAAM,QAAQ,IAAA,IAAQ,IAAA;AAAA,IACtB,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,OAAO,IAAA,CAAK;AAAA,GACb,CAAA;AAED,EAAA,MAAM,UAAA,GAAa,WAAA,CAAY,QAAA,CAAS,IAAA,IAAQ,EAAE,CAAA;AAClD,EAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA,CAAK,IAAA,EAAM;AAAA,IACvC,OAAA,EAAS,EAAE,GAAG,OAAA,EAAS,IAAA,EAAK;AAAA,IAC5B,QAAA,EAAU,QAAA;AAAA,IACV,SAAA,EAAW;AAAA,GACZ,CAAA;AAED,EAAA,IAAI,QAAA,CAAS,WAAW,MAAA,EAAQ;AAC9B,IAAA,MAAM,mBAAmB,IAAA,CAAK,IAAA,EAAM,QAAA,CAAS,UAAA,EAAY,SAAS,WAAW,CAAA;AAC7E,IAAA,MAAM,aAAA;AAAA,MACJ,EAAE,GAAG,OAAA,EAAS,IAAA,EAAK;AAAA,MACnB;AAAA,QACE,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,YAAY,QAAA,CAAS,UAAA;AAAA,QACrB,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,OAAO,IAAA,CAAK;AAAA;AACd,KACF;AACA,IAAA,OAAO,aAAa,aAAA,CAAc,QAAA,CAAS,YAAY,WAAA,EAAa,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,EACrF;AAEA,EAAA,IAAI,QAAA,CAAS,WAAW,SAAA,EAAW;AACjC,IAAA,OAAO,cAAA;AAAA,MACL,EAAE,GAAG,OAAA,EAAS,IAAA,EAAK;AAAA,MACnB;AAAA,QACE,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,YAAY,IAAA,CAAK,UAAA;AAAA,QACjB,YAAY,QAAA,CAAS,UAAA;AAAA,QACrB;AAAA;AACF,KACF;AAAA,EACF;AAEA,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI;AACF,IAAA,UAAA,GAAa,MAAM,aAAA,CAAc,IAAA,CAAK,IAAA,EAAM;AAAA,MAC1C,OAAA,EAAS,EAAE,GAAG,OAAA,EAAS,IAAA,EAAK;AAAA,MAC5B,YAAY,QAAA,CAAS;AAAA,KACtB,CAAA;AAAA,EACH,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,CAAC,iBAAA,CAAkB,GAAG,CAAA,EAAG,MAAM,GAAA;AACnC,IAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,IAAA,CAAK,IAAA,EAAM;AAAA,MACpC,OAAA,EAAS,EAAE,GAAG,OAAA,EAAS,IAAA,EAAK;AAAA,MAC5B,QAAA,EAAU,QAAA;AAAA,MACV,SAAA,EAAW;AAAA,KACZ,CAAA;AACD,IAAA,IAAI,KAAA,CAAM,WAAW,MAAA,EAAQ;AAC3B,MAAA,MAAM,aAAA;AAAA,QACJ,EAAE,GAAG,OAAA,EAAS,IAAA,EAAK;AAAA,QACnB;AAAA,UACE,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,SAAS,IAAA,CAAK,OAAA;AAAA,UACd,YAAY,KAAA,CAAM,UAAA;AAAA,UAClB,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,OAAO,IAAA,CAAK;AAAA;AACd,OACF;AACA,MAAA,OAAO,aAAa,aAAA,CAAc,KAAA,CAAM,YAAY,WAAA,EAAa,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,IAClF;AACA,IAAA,IAAI,KAAA,CAAM,WAAW,SAAA,EAAW;AAC9B,MAAA,OAAO,cAAA;AAAA,QACL,EAAE,GAAG,OAAA,EAAS,IAAA,EAAK;AAAA,QACnB;AAAA,UACE,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,SAAS,IAAA,CAAK,OAAA;AAAA,UACd,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,YAAY,IAAA,CAAK,UAAA;AAAA,UACjB,YAAY,KAAA,CAAM,UAAA;AAAA,UAClB;AAAA;AACF,OACF;AAAA,IACF;AACA,IAAA,UAAA,GAAa,MAAM,aAAA,CAAc,IAAA,CAAK,IAAA,EAAM;AAAA,MAC1C,OAAA,EAAS,EAAE,GAAG,OAAA,EAAS,IAAA,EAAK;AAAA,MAC5B,YAAY,KAAA,CAAM;AAAA,KACnB,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,cAAuC,EAAE,GAAI,OAAA,CAAQ,QAAA,IAAY,EAAC,EAAG;AAC3E,EAAA,WAAA,CAAY,YAAY,QAAA,CAAS,IAAA;AACjC,EAAA,IAAI,QAAA,CAAS,WAAA,EAAa,WAAA,CAAY,YAAA,GAAe,QAAA,CAAS,WAAA;AAE9D,EAAA,MAAM,kBAA4B,EAAC;AACnC,EAAA,IAAI,YAAA;AACJ,EAAA,IAAI;AACF,IAAA,YAAA,GAAe,kBAAA;AAAA,MACb,QAAA,CAAS,IAAA;AAAA,MACT,KAAK,MAAA,CAAO,SAAA;AAAA,MACZ,KAAK,MAAA,CAAO,SAAA;AAAA,MACZ,IAAA,CAAK,KAAA;AAAA,MACL;AAAA,KACF;AAAA,EACF,SAAS,GAAA,EAAK;AAMZ,IAAA,MAAM,gBAAA,CAAiB,IAAA,CAAK,IAAA,EAAM,UAAA,EAAY,EAAE,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAO,MAAA,CAAO,GAAG,CAAA,EAAG,CAAA;AACtF,IAAA,MAAM,GAAA;AAAA,EACR;AAEA,EAAA,IAAI,CAAC,QAAA,CAAS,IAAA,CAAK,IAAA,EAAK,IAAK,SAAS,SAAA,IAAa,sBAAA,CAAuB,QAAA,CAAS,IAAI,CAAA,EAAG;AACxF,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,SAAA,GAAY,kCAAA,GAAqC,qBAAA;AACzE,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,UAAA,EAAY,OAAA,CAAQ,QAAA,IAAY,IAAA,EAAM,OAAA,CAAQ,GAAA,IAAO,IAAA,EAAM,EAAE,CAAA;AAC7F,IAAA,MAAM,gBAAA,CAAiB,IAAA,CAAK,IAAA,EAAM,UAAA,EAAY;AAAA,MAC5C,MAAA,EAAQ,SAAA;AAAA,MACR,KAAA,EAAO,MAAA;AAAA,MACP,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,YAAA;AAAA,QACN,MAAM,QAAA,CAAS,IAAA;AAAA,QACf,IAAA,EAAM,IAAA;AAAA,QACN,UAAA;AAAA,QACA,IAAA;AAAA,QACA;AAAA;AACF,KACD,CAAA;AACD,IAAA,OAAO,YAAA,CAAa;AAAA,MAClB,UAAA,EAAY,OAAO,UAAU,CAAA;AAAA,MAC7B,IAAA,EAAM,WAAA;AAAA,MACN,MAAA,EAAQ,SAAA;AAAA,MACR,OAAO,QAAA,CAAS,KAAA;AAAA,MAChB,MAAA,EAAQ,CAAA;AAAA,MACR,KAAA,EAAO,CAAA;AAAA,MACP,UAAA,EAAY,CAAA;AAAA,MACZ,gBAAgB,EAAC;AAAA,MACjB,KAAA,EAAO,MAAA;AAAA,MACP;AAAA,KACD,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,KAAA,GAAQ,aAAa,QAAQ,CAAA;AACnC,EAAA,MAAM,iBAAyC,EAAC;AAChD,EAAA,IAAI,SAAS,cAAA,CAAe,KAAA,EAAO,cAAA,CAAe,SAAA,GAAY,SAAS,cAAA,CAAe,KAAA;AACtF,EAAA,IAAI,SAAS,cAAA,CAAe,MAAA,EAAQ,cAAA,CAAe,UAAA,GAAa,SAAS,cAAA,CAAe,MAAA;AAExF,EAAA,IAAI,OAAmB,EAAC;AACxB,EAAA,IAAI,gBAAgB,QAAA,CAAS,IAAA;AAC7B,EAAA,IAAI;AACF,IAAA,CAAC,MAAM,aAAa,CAAA,GAAI,WAAA,CAAY,QAAA,EAAU,QAAQ,IAAA,EAAM;AAAA,MAC1D,MAAA,EAAQ,KAAK,MAAA,CAAO,SAAA;AAAA,MACpB,SAAA,EAAW,KAAK,MAAA,CAAO,SAAA;AAAA,MACvB,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,UAAA,EAAY,OAAA,CAAQ,YAAY,IAAA,EAAM,OAAA,CAAQ,GAAA,IAAO,IAAA,EAAM,IAAI,CAAA;AAC/F,MAAA,MAAM,UAAU,MAAM,oBAAA;AAAA,QACpB,KAAK,MAAA,CAAO,SAAA;AAAA,QACZ,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI;AAAA,OACxB;AACA,MAAA,WAAA,CAAY,SAAA,GAAY,aAAA;AACxB,MAAA,WAAA,CAAY,KAAA,GAAQ;AAAA,QAClB,EAAA,EAAI,OAAA;AAAA,QACJ,KAAA;AAAA,QACA,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,IAAA;AAAA,QACA,eAAA,EAAiB;AAAA,OACnB;AACA,MAAA,MAAM,gBAAA,CAAiB,IAAA,CAAK,IAAA,EAAM,UAAA,EAAY;AAAA,QAC5C,MAAA,EAAQ,eAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,IAAA,EAAM,YAAA;AAAA,UACN,IAAA,EAAM,aAAA;AAAA,UACN,IAAA,EAAM,eAAe,YAAY,CAAA;AAAA,UACjC,UAAA;AAAA,UACA,IAAA;AAAA,UACA;AAAA;AACF,OACD,CAAA;AACD,MAAA,OAAO,YAAA,CAAa;AAAA,QAClB,UAAA,EAAY,OAAO,UAAU,CAAA;AAAA,QAC7B,IAAA,EAAM,WAAA;AAAA,QACN,MAAA,EAAQ,eAAA;AAAA,QACR,OAAO,QAAA,CAAS,KAAA;AAAA,QAChB,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,KAAA,EAAO,CAAA;AAAA,QACP,UAAA,EAAY,CAAA;AAAA,QACZ,cAAA;AAAA,QACA,KAAA,EAAO,IAAA;AAAA,QACP;AAAA,OACD,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,eAAA,GAAkB,MAAM,WAAA,CAAY,IAAA,CAAK,UAAU,IAAI,CAAA;AAC7D,IAAA,IAAI,eAAA,iBAAgC,gBAAA,GAAmB,eAAA;AACvD,IAAA,MAAM,kBAAA,CAAmB,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,SAAS,GAAG,CAAA;AAErD,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,UAAA,EAAY,OAAA,CAAQ,YAAY,IAAA,EAAM,OAAA,CAAQ,GAAA,IAAO,IAAA,EAAM,IAAI,CAAA;AAE/F,IAAA,MAAM,eAAwC,EAAC;AAC/C,IAAA,IAAI,OAAA,CAAQ,iBAAA,IAAqB,IAAA,CAAK,MAAA,CAAO,GAAA,EAAK;AAChD,MAAA,MAAM,UAAA,GAAa,MAAM,qBAAA,CAAsB,YAAA,EAAc;AAAA,QAC3D,MAAA,EAAQ,KAAK,MAAA,CAAO,GAAA;AAAA,QACpB,YAAY,OAAA,CAAQ;AAAA,OACrB,CAAA;AACD,MAAA,IAAI,UAAA,CAAW,eAAe,SAAA,EAAW;AACvC,QAAA,cAAA,CAAe,oBAAA,GAAuB,WAAW,cAAA,CAAe,SAAA;AAAA,MAClE;AACA,MAAA,IAAI,UAAA,CAAW,eAAe,UAAA,EAAY;AACxC,QAAA,cAAA,CAAe,qBAAA,GAAwB,WAAW,cAAA,CAAe,UAAA;AAAA,MACnE;AACA,MAAA,IAAI,UAAA,CAAW,gBAAgB,IAAA,EAAM;AACnC,QAAA,IAAI,WAAA,GAAc,CAAA;AAClB,QAAA,IAAI,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,cAAc,EAAE,MAAA,EAAQ;AACjD,UAAA,IAAI;AACF,YAAA,WAAA,GAAc,MAAM,cAAA,CAAe;AAAA,cACjC,MAAM,IAAA,CAAK,IAAA;AAAA,cACX,UAAU,IAAA,CAAK,QAAA;AAAA,cACf,QAAA,EAAU,QAAQ,QAAA,IAAY,IAAA;AAAA,cAC9B,SAAS,UAAA,CAAW,YAAA;AAAA,cACpB,gBAAgB,UAAA,CAAW,cAAA;AAAA,cAC3B,SAAS,UAAA,CAAW,OAAA;AAAA,cACpB,gBAAgB,UAAA,CAAW;AAAA,aAC5B,CAAA;AAAA,UACH,SAAS,GAAA,EAAK;AACZ,YAAA,SAAA,CAAU,IAAA,CAAK,OAAO,GAAA,EAAK,EAAE,OAAO,qBAAA,EAAuB,QAAA,EAAU,aAAa,CAAA;AAClF,YAAA,WAAA,GAAc,CAAA;AAAA,UAChB;AAAA,QACF;AACA,QAAA,YAAA,CAAa,eAAe,UAAA,CAAW,YAAA;AACvC,QAAA,YAAA,CAAa,iBAAiB,UAAA,CAAW,cAAA;AACzC,QAAA,YAAA,CAAa,iBAAiB,UAAA,CAAW,cAAA;AACzC,QAAA,YAAA,CAAa,iBAAA,GAAoB,EAAE,OAAA,EAAS,UAAA,CAAW,OAAA,EAAQ;AAC/D,QAAA,YAAA,CAAa,iBAAA,GAAoB,kBAAA;AACjC,QAAA,IAAI,WAAA,iBAA4B,2BAAA,GAA8B,WAAA;AAAA,MAChE,CAAA,MAAA,IAAW,WAAW,KAAA,EAAO;AAC3B,QAAA,SAAA,CAAU,KAAK,KAAA,EAAO,IAAI,KAAA,CAAM,UAAA,CAAW,KAAK,CAAA,EAAG;AAAA,UACjD,KAAA,EAAO,uBAAA;AAAA,UACP,QAAA,EAAU;AAAA,SACX,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,IAAIA,WAAAA,GAAa,CAAA;AACjB,IAAA,IAAI,IAAA,KAAS,OAAA,IAAW,IAAA,CAAK,UAAA,EAAY;AACvC,MAAAA,WAAAA,GAAa,MAAA;AAAA,QACV,MAAM,UAAA;AAAA,UACL,KAAK,UAAA,CAAW;AAAA,YACd,UAAA;AAAA,YACA,MAAA,EAAQ,IAAA;AAAA,YACR,QAAQ,IAAA,CAAK,MAAA;AAAA,YACb,OAAO,IAAA,CAAK;AAAA,WACb;AAAA,SACH,IAAM;AAAA,OACR;AAAA,IACF;AAEA,IAAA,WAAA,CAAY,SAAA,GAAY,aAAA;AACxB,IAAA,MAAM,gBAAA,CAAiB,IAAA,CAAK,IAAA,EAAM,UAAA,EAAY;AAAA,MAC5C,MAAA,EAAQ,WAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,YAAA;AAAA,QACN,IAAA,EAAM,aAAA;AAAA,QACN,IAAA,EAAM,eAAe,YAAY,CAAA;AAAA,QACjC,UAAA;AAAA,QACA,IAAA;AAAA,QACA,WAAA;AAAA,QACA,GAAG;AAAA;AACL,KACD,CAAA;AAED,IAAA,SAAA,CAAU,KAAK,KAAA,EAAO;AAAA,MACpB,IAAA,EAAM,QAAA;AAAA,MACN,OAAO,KAAA,GAAQA,WAAAA;AAAA,MACf,MAAA,EAAQ;AAAA,QACN,WAAA,EAAa,OAAO,UAAU,CAAA;AAAA,QAC9B,IAAA,EAAM,WAAA;AAAA,QACN,IAAA,EAAM,aAAA;AAAA,QACN,IAAA;AAAA,QACA,OAAO,QAAA,CAAS,KAAA;AAAA,QAChB,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,WAAA,EAAaA;AAAA,OACf;AAAA,MACA;AAAA,KACoB,CAAA;AAEtB,IAAA,OAAO,YAAA,CAAa;AAAA,MAClB,UAAA,EAAY,OAAO,UAAU,CAAA;AAAA,MAC7B,IAAA,EAAM,WAAA;AAAA,MACN,MAAA,EAAQ,WAAA;AAAA,MACR,OAAO,QAAA,CAAS,KAAA;AAAA,MAChB,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,KAAA;AAAA,MACA,UAAA,EAAAA,WAAAA;AAAA,MACA,cAAA;AAAA,MACA,KAAA,EAAO,IAAA;AAAA,MACP;AAAA,KACD,CAAA;AAAA,EACH,SAAS,GAAA,EAAK;AACZ,IAAA,SAAA,CAAU,IAAA,CAAK,OAAO,GAAA,EAAK,EAAE,OAAO,QAAA,EAAU,QAAA,EAAU,aAAa,CAAA;AACrE,IAAA,MAAM,gBAAA,CAAiB,IAAA,CAAK,IAAA,EAAM,UAAA,EAAY,EAAE,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAO,MAAA,CAAO,GAAG,CAAA,EAAG,CAAA;AACtF,IAAA,OAAO,YAAA,CAAa;AAAA,MAClB,UAAA,EAAY,OAAO,UAAU,CAAA;AAAA,MAC7B,IAAA,EAAM,WAAA;AAAA,MACN,MAAA,EAAQ,QAAA;AAAA,MACR,OAAO,QAAA,CAAS,KAAA;AAAA,MAChB,MAAA,EAAQ,CAAA;AAAA,MACR,KAAA,EAAO,CAAA;AAAA,MACP,UAAA,EAAY,CAAA;AAAA,MACZ,cAAA;AAAA,MACA,KAAA,EAAO,OAAO,GAAG,CAAA;AAAA,MACjB;AAAA,KACD,CAAA;AAAA,EACH;AACF;;;ALp3CO,IAAM,cAAA,GAAiB,GAAA;AACvB,IAAM,sBAAA,GAAyB,GAAA;AAC/B,IAAM,uBAAA,GAA0B,EAAA;AAChC,IAAM,qBAAA,GAAwB,EAAA;AAErC,IAAM,wBAAwB,CAAC,OAAA,EAAS,SAAA,EAAW,SAAA,EAAW,mBAAmB,iBAAiB,CAAA;AAElG,IAAMC,QAAAA,GAAU,iEAAA;AAEhB,IAAM,OAAA,GAAU,aAAA;AAEhB,IAAM,SAAA,uBAAgB,GAAA,CAAI;AAAA,EACxB,KAAA;AAAA,EACA,GAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,IAAMC,gBAAAA,GAAkB,yBAAA;AACxB,IAAM,aAAA,GAAgB,kDAAA;AAEtB,IAAM,qBAAA,GAAwB,CAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,4FAAA,CAAA;AAY9B,SAAS,gBAAgB,UAAA,EAA6B;AACpD,EAAA,MAAM,GAAA,GAAM,OAAO,UAAA,IAAc,EAAE,EAChC,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA,CACtB,IAAA,EAAK;AACR,EAAA,IAAI,CAACD,QAAAA,CAAQ,IAAA,CAAK,GAAG,CAAA,EAAG;AACtB,IAAA,MAAM,IAAIpD,yBAAA,CAAkB,CAAA,qBAAA,EAAwB,KAAK,SAAA,CAAU,UAAU,CAAC,CAAA,CAAE,CAAA;AAAA,EAClF;AACA,EAAA,OAAO,GAAA;AACT;AAaO,SAAS,OAAA,CAAQ,KAAkC,UAAA,EAAsC;AAC9F,EAAA,IAAI,UAAA,KAAe,MAAM,OAAO,IAAA;AAChC,EAAA,IAAI,GAAA,IAAO,MAAM,OAAO,IAAA;AACxB,EAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,UAAU,CAAA;AAC/B,EAAA,OAAO,IAAI,IAAA,CAAK,CAAC,MAAM,IAAA,CAAK,GAAA,CAAI,CAAC,CAAC,CAAA;AACpC;AASA,SAAS,QAAA,CACP,SAAA,EACA,UAAA,EACA,MAAA,EACQ;AACR,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,aAAa,IAAA,EAAM;AACrB,IAAA,MAAA,CAAO,KAAK,SAAS,CAAA;AACrB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,iBAAA,EAAoB,MAAA,CAAO,MAAM,CAAA,SAAA,CAAW,CAAA;AAAA,EACzD;AACA,EAAA,IAAI,cAAc,IAAA,EAAM;AAKtB,IAAA,MAAA,CAAO,KAAK,UAAU,CAAA;AACtB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,wBAAA,EAA2B,MAAA,CAAO,MAAM,CAAA,SAAA,CAAW,CAAA;AAAA,EAChE;AACA,EAAA,OAAO,MAAM,MAAA,GAAS,CAAA,MAAA,EAAS,MAAM,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,GAAK,EAAA;AACzD;AAEA,SAAS,YAAY,WAAA,EAAsD;AACzE,EAAA,IAAI,WAAA,IAAe,MAAM,OAAO,IAAA;AAChC,EAAA,IAAI,OAAO,WAAA,KAAgB,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,EAAG;AAClE,IAAA,OAAO,WAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAO,gBAAgB,QAAA,EAAU;AACnC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,WAAW,CAAA;AAC9C,MAAA,IAAI,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAClE,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACA,EAAA,OAAA,CAAQ,IAAA,CAAK,kDAAkD,WAAW,CAAA;AAC1E,EAAA,OAAO,IAAA;AACT;AAWO,SAAS,oBAAA,CACd,KAAA,EACA,MAAA,EACA,IAAA,EACS;AACT,EAAA,IAAI,MAAA,IAAU,IAAA,IAAQ,MAAA,CAAO,OAAA,IAAW,OAAO,KAAA;AAE/C,EAAA,MAAM,IAAA,GAAO,CAAC,IAAA,KAA2B;AACvC,IAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,MAAA,OAAO,cAAA,CAAe,MAAM,MAAA,EAAQ;AAAA,QAClC,KAAA,EAAO,QAAA;AAAA,QACP,YAAY,IAAA,CAAK,UAAA;AAAA,QACjB,WAAW,IAAA,CAAK,SAAA;AAAA,QAChB,OAAO,IAAA,CAAK;AAAA,OACb,EAAE,CAAC,CAAA;AAAA,IACN;AACA,IAAA,IAAI,MAAM,OAAA,CAAQ,IAAI,GAAG,OAAO,IAAA,CAAK,IAAI,IAAI,CAAA;AAC7C,IAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACpC,MAAA,OAAO,MAAA,CAAO,WAAA;AAAA,QACZ,MAAA,CAAO,OAAA,CAAQ,IAA+B,CAAA,CAAE,IAAI,CAAC,CAAC,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA,EAAG,IAAA,CAAK,CAAC,CAAC,CAAC;AAAA,OAC9E;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AACA,EAAA,OAAO,KAAK,KAAK,CAAA;AACnB;AAEA,eAAsB,cAAA,CACpB,IAAA,EACA,UAAA,EACA,UAAA,EACe;AACf,EAAA,MAAM,EAAA,GAAK,gBAAgB,UAAU,CAAA;AACrC,EAAA,MAAM,EAAE,MAAK,GAAI,MAAM,KAAK,KAAA,CAAM,CAAA,sDAAA,CAAA,EAA0D,CAAC,EAAE,CAAC,CAAA;AAChG,EAAA,IAAI,CAAC,IAAA,CAAK,CAAC,CAAA,IAAK,CAAC,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,CAAE,GAAA,EAAK,UAAU,CAAA,EAAG;AACjD,IAAA,MAAM,IAAIC,8BAAsB,EAAE,CAAA;AAAA,EACpC;AACF;AAEA,eAAsB,cAAA,CACpB,IAAA,EACA,UAAA,EACA,UAAA,EACkC;AAClC,EAAA,MAAM,EAAA,GAAK,gBAAgB,UAAU,CAAA;AACrC,EAAA,MAAM,EAAE,MAAK,GAAI,MAAM,KAAK,KAAA,CAAM,CAAA,oDAAA,CAAA,EAAwD,CAAC,EAAE,CAAC,CAAA;AAC9F,EAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,EAAA,IAAI,CAAC,GAAA,IAAO,CAAC,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,UAAU,CAAA,EAAG,MAAM,IAAIA,6BAAA,CAAsB,EAAE,CAAA;AAC7E,EAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,KAAA;AAAA,IACvB,CAAA,2EAAA,CAAA;AAAA,IACA,CAAC,EAAE;AAAA,GACL;AACA,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAAA,IACjB,UAAU,GAAA,CAAI,SAAA;AAAA,IACd,YAAY,GAAA,CAAI,WAAA;AAAA,IAChB,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,aAAa,GAAA,CAAI,WAAA;AAAA,IACjB,QAAA,EAAU,GAAA,CAAI,SAAA,IAAa,EAAC;AAAA;AAAA;AAAA,IAG5B,GAAA,EAAK,IAAI,GAAA,IAAO,IAAA,GAAO,CAAC,GAAG,GAAA,CAAI,GAAG,CAAA,GAAI,IAAA;AAAA,IACtC,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,UAAU,GAAA,CAAI,SAAA;AAAA,IACd,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,QAAQ,GAAA,CAAI,MAAA;AAAA,IACZ,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,MAAA,EAAQ,KAAA,CAAM,IAAA,CAAK,CAAC,GAAG,CAAA,IAAK,CAAA;AAAA,IAC5B,cAAc,GAAA,CAAI,aAAA;AAAA,IAClB,gBAAgB,GAAA,CAAI,eAAA;AAAA,IACpB,WAAW,GAAA,CAAI,UAAA;AAAA,IACf,WAAW,GAAA,CAAI,UAAA;AAAA,IACf,WAAW,GAAA,CAAI,UAAA;AAAA,IACf,aAAa,GAAA,CAAI;AAAA,GACnB;AACF;AAEA,eAAsB,KAAA,CAAM,MAAY,QAAA,EAA2D;AACjG,EAAA,MAAM,KAAA,GAAQ,QAAA,IAAY,IAAA,GAAO,sBAAA,GAAyB,EAAA;AAC1D,EAAA,MAAM,SAAS,QAAA,IAAY,IAAA,GAAO,CAAC,QAAQ,IAAI,EAAC;AAChD,EAAA,MAAM,OAAO,MAAM,IAAA,CAAK,MAAM,CAAA,wDAAA,EAA2D,KAAK,IAAI,MAAM,CAAA;AACxG,EAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,KAAA;AAAA,IACxB,CAAA,qDAAA,EAAwD,QAAA,IAAY,IAAA,GAAO,sBAAA,GAAyB,EAAE,CAAA,CAAA;AAAA,IACtG;AAAA,GACF;AACA,EAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,KAAA;AAAA,IAC1B,mEAAmE,KAAK,CAAA,gBAAA,CAAA;AAAA,IACxE;AAAA,GACF;AACA,EAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,KAAA;AAAA,IACtB,CAAA,+FAAA;AAAA,GACF;AACA,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA;AACrB,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,SAAA,EAAW,IAAA,CAAK,IAAA,CAAK,CAAC,GAAG,CAAA,IAAK,CAAA;AAAA,IAC9B,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,CAAC,GAAG,CAAA,IAAK,CAAA;AAAA,IAC7B,QAAA,EAAU,MAAA,CAAO,WAAA,CAAY,QAAA,CAAS,KAAK,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,CAAC,CAAC,CAAC,CAAA;AAAA,IACtE,SAAA,EAAW;AAAA,MACT,QAAA,EAAU,GAAG,kBAAA,IAAsB,IAAA;AAAA,MACnC,KAAA,EAAO,GAAG,eAAA,IAAmB,IAAA;AAAA,MAC7B,GAAA,EAAK,GAAG,aAAA,IAAiB;AAAA;AAC3B,GACF;AACF;AAgBA,eAAsB,eAAA,CACpB,YACA,IAAA,EAOiB;AACjB,EAAA,MAAM,UAAA,GAAa,KAAK,UAAA,IAAc,IAAA;AACtC,EAAA,MAAM,MAAM,MAAM,cAAA,CAAe,IAAA,CAAK,IAAA,EAAM,YAAY,UAAU,CAAA;AAClE,EAAA,OAAO,qBAAqB,MAAA,CAAO,GAAA,CAAI,QAAQ,EAAE,CAAA,EAAG,KAAK,SAAA,EAAW;AAAA,IAClE,UAAA;AAAA,IACA,SAAA,EAAW,KAAK,SAAA,IAAa,IAAA;AAAA,IAC7B,OAAO,IAAA,CAAK;AAAA,GACb,CAAA;AACH;AAUA,eAAsB,cAAc,IAAA,EASC;AACnC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAA,IAAS,EAAE,CAAA,EAAG,cAAc,CAAC,CAAA;AAChF,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,IAAA,CAAK,MAAM,CAAA;AAC5C,EAAA,MAAM,YAAY,IAAA,CAAK,QAAA,IAAY,OAAO,CAAC,IAAA,CAAK,QAAQ,CAAA,GAAI,IAAA;AAC5D,EAAA,MAAM,UAAA,GAAa,KAAK,UAAA,IAAc,IAAA;AAEtC,EAAA,MAAM,SAAoB,EAAC;AAC3B,EAAA,IAAI,KAAA,GAAQ,QAAA,CAAS,SAAA,EAAW,UAAA,EAAY,MAAM,CAAA;AAClD,EAAA,MAAM,UAAA,GAAa,YAAA,EAAc,IAAA,IAAQ,YAAA,EAAc,UAAA;AACvD,EAAA,MAAM,WAAW,YAAA,EAAc,EAAA;AAC/B,EAAA,IAAI,cAAc,QAAA,IAAYmD,QAAAA,CAAQ,KAAK,MAAA,CAAO,QAAQ,CAAC,CAAA,EAAG;AAC5D,IAAA,MAAA,CAAO,IAAA,CAAK,YAAY,QAAQ,CAAA;AAChC,IAAA,MAAM,KAAA,GAAQ,CAAA,eAAA,EAAkB,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA,mBAAA,EAAsB,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA,WAAA,EAAc,MAAA,CAAO,MAAM,CAAA,QAAA,CAAA;AACnH,IAAA,KAAA,GAAQ,QAAQ,CAAA,EAAG,KAAK,QAAQ,KAAK,CAAA,CAAA,GAAK,SAAS,KAAK,CAAA,CAAA;AAAA,EAC1D;AACA,EAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAC,CAAA;AACrB,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,KAAK,IAAA,CAAK,KAAA;AAAA,IAC/B,CAAA;AAAA;AAAA;AAAA,KAAA,EAGG,KAAK;AAAA;AAAA,YAAA,EAEE,OAAO,MAAM,CAAA,CAAA;AAAA,IACvB;AAAA,GACF;AAEA,EAAA,MAAM,OAAA,GAAU,KAAK,MAAA,GAAS,KAAA;AAC9B,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AAChC,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,IACnC,EAAA,EAAI,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAAA,IACjB,UAAU,GAAA,CAAI,SAAA;AAAA,IACd,YAAY,GAAA,CAAI,WAAA;AAAA,IAChB,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,aAAa,GAAA,CAAI,WAAA;AAAA,IACjB,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,UAAU,GAAA,CAAI,SAAA;AAAA,IACd,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,QAAQ,GAAA,CAAI,MAAA;AAAA,IACZ,YAAA,EAAc,oBAAA,CAAqB,GAAA,CAAI,aAAA,EAAe,KAAK,SAAA,EAAW;AAAA,MACpE,UAAA;AAAA,MACA,SAAA,EAAW,KAAK,SAAA,IAAa,IAAA;AAAA,MAC7B,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AAAA,IACD,SAAA,EAAW,IAAI,UAAA,YAAsB,IAAA,GAAO,IAAI,UAAA,CAAW,WAAA,KAAgB,GAAA,CAAI,UAAA;AAAA,IAC/E,SAAA,EAAW,IAAI,UAAA,YAAsB,IAAA,GAAO,IAAI,UAAA,CAAW,WAAA,KAAgB,GAAA,CAAI;AAAA,GACjF,CAAE,CAAA;AAEF,EAAA,MAAM,MAAA,GAAkC;AAAA,IACtC,SAAA;AAAA,IACA,OAAO,SAAA,CAAU,MAAA;AAAA,IACjB;AAAA,GACF;AACA,EAAA,IAAI,OAAA,IAAW,KAAK,MAAA,EAAQ;AAC1B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA;AACjC,IAAA,MAAA,CAAO,UAAA,GAAa;AAAA,MAClB,IAAA,EAAM,KAAK,UAAA,YAAsB,IAAA,GAAO,KAAK,UAAA,CAAW,WAAA,KAAgB,IAAA,CAAK,UAAA;AAAA,MAC7E,EAAA,EAAI,MAAA,CAAO,IAAA,CAAK,EAAE;AAAA,KACpB;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,qBAAqB,QAAA,EAA4B;AACxD,EAAA,MAAM,aAAuB,EAAC;AAC9B,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAE7B,EAAA,MAAM,KAAA,GAAQ,aAAa,QAAQ,CAAA;AACnC,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,UAAA,CAAW,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,CAAA;AAC/B,IAAA,IAAA,CAAK,IAAI,KAAK,CAAA;AAAA,EAChB;AAEA,EAAA,KAAA,MAAW,KAAA,IAAS,QAAA,CAAS,QAAA,CAAS,OAAO,CAAA,EAAG;AAC9C,IAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,IAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACrB,IAAA,MAAM,IAAA,GAAO,aAAa,IAAI,CAAA;AAC9B,IAAA,IAAI,CAAC,QAAQ,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,IAAK,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA,EAAG;AACpD,IAAA,IAAA,CAAK,IAAI,IAAI,CAAA;AACb,IAAA,UAAA,CAAW,KAAK,IAAI,CAAA;AAAA,EACtB;AACA,EAAA,OAAO,UAAA;AACT;AAeA,eAAsB,eAAA,CACpB,UACA,IAAA,EAWkC;AAClC,EAAA,IAAI,CAAC,QAAA,EAAU,IAAA,IAAQ,MAAM,IAAIpD,0BAAkB,4BAA4B,CAAA;AAE/E,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAA,IAAS,EAAE,CAAA,EAAG,cAAc,CAAC,CAAA;AAChF,EAAA,MAAM,UAAA,GAAa,KAAK,UAAA,IAAc,IAAA;AACtC,EAAA,MAAM,UAAA,GAAa,qBAAqB,QAAQ,CAAA;AAChD,EAAA,MAAM,QAAA,GAAW,MAAM,aAAA,CAAc,UAAA,EAAY;AAAA,IAC/C,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,SAAA,EAAW,KAAK,SAAA,IAAa,IAAA;AAAA,IAC7B,OAAA,EAAS,KAAK,OAAA,IAAW;AAAA,GAC1B,CAAA;AACD,EAAA,MAAM,aAAA,GAAgB,CAAC,GAAG,IAAI,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,QAAQ,CAAC,CAAC,CAAA,CAAE,IAAA,EAAK;AAEjE,EAAA,IAAI,CAAC,cAAc,MAAA,EAAQ;AACzB,IAAA,OAAO,EAAE,UAAU,cAAA,EAAgB,QAAA,EAAU,WAAW,EAAC,EAAG,OAAO,CAAA,EAAE;AAAA,EACvE;AAEA,EAAA,MAAM,SAAoB,EAAC;AAC3B,EAAA,IAAI,QAAQ,QAAA,CAAS,IAAA,CAAK,SAAA,IAAa,IAAA,EAAM,YAAY,MAAM,CAAA;AAC/D,EAAA,MAAM,MAAA,GAAS,CAAC,CAAA,2BAAA,CAA6B,CAAA;AAC7C,EAAA,IAAI,IAAA,CAAK,WAAW,IAAA,EAAM;AACxB,IAAA,MAAA,CAAO,IAAA,CAAK,KAAK,OAAO,CAAA;AACxB,IAAA,MAAA,CAAO,IAAA,CAAK,CAAA,iBAAA,EAAoB,MAAA,CAAO,MAAM,CAAA,CAAE,CAAA;AAAA,EACjD;AACA,EAAA,MAAA,CAAO,KAAK,aAAa,CAAA;AACzB,EAAA,MAAA,CAAO,IAAA,CAAK,CAAA,oBAAA,EAAuB,MAAA,CAAO,MAAM,CAAA,QAAA,CAAU,CAAA;AAC1D,EAAA,KAAA,GAAQ,KAAA,GAAQ,CAAA,EAAG,KAAK,CAAA,KAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,GAAK,CAAA,MAAA,EAAS,MAAA,CAAO,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA;AACtF,EAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAEjB,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,KAAK,IAAA,CAAK,KAAA;AAAA,IAC/B,CAAA;AAAA;AAAA,KAAA,EAEG,KAAK;AAAA;AAAA,YAAA,EAEE,OAAO,MAAM,CAAA,CAAA;AAAA,IACvB;AAAA,GACF;AAEA,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,IACnC,EAAA,EAAI,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAAA,IACjB,UAAU,GAAA,CAAI,SAAA;AAAA,IACd,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,YAAA,EAAc,oBAAA,CAAqB,GAAA,CAAI,aAAA,EAAe,KAAK,SAAA,EAAW;AAAA,MACpE,UAAA;AAAA,MACA,SAAA,EAAW,KAAK,SAAA,IAAa,IAAA;AAAA,MAC7B,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AAAA,IACD,gBAAgB,oBAAA,CAAqB,GAAA,CAAI,mBAAmB,EAAC,EAAG,KAAK,SAAA,EAAW;AAAA,MAC9E,UAAA;AAAA,MACA,SAAA,EAAW,KAAK,SAAA,IAAa,IAAA;AAAA,MAC7B,OAAO,IAAA,CAAK;AAAA,KACb;AAAA,GACH,CAAE,CAAA;AAEF,EAAA,OAAO,EAAE,QAAA,EAAU,cAAA,EAAgB,UAAU,SAAA,EAAW,KAAA,EAAO,UAAU,MAAA,EAAO;AAClF;AAEA,SAAS,gBAAgB,IAAA,EAAsB;AAC7C,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,aAAA,EAAe,EAAE,EAAE,IAAA,EAAK;AAC9C;AAMA,eAAe,YAAA,GAAkC;AAC/C,EAAA,MAAM,SAAA,GAAY,cAAA;AAClB,EAAA,IAAI;AACF,IAAA,OAAQ,MAAM,OAAO,SAAA,CAAA;AAAA,EACvB,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAIO,yBAAA,CAAkB,SAAA,EAAW,cAAA,EAAgB,sBAAsB,CAAA;AAAA,EAC/E;AACF;AAMA,SAAS,oBAAA,CACP,KACA,IAAA,EAC2C;AAC3C,EAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAC;AACnB,EAAA,MAAM,SAAmC,EAAC;AAC1C,EAAA,IAAI,OAAA,GAAU,QAAA;AACd,EAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,IAAI,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,IAAI,CAAA,CAAE,KAAA,CAAM,IAAI,CAAA,EAAG;AAC/E,IAAA,MAAM,CAAA,GAAI8C,gBAAAA,CAAgB,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAC1C,IAAA,IAAI,CAAA,EAAG;AACL,MAAA,OAAA,GAAU,CAAA,CAAE,CAAC,CAAA,CAAG,IAAA,EAAK,IAAK,OAAA;AAC1B,MAAA,MAAA,CAAO,OAAO,MAAM,EAAC;AACrB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,MAAA,GAAS,OAAO,OAAO,CAAA;AAC3B,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAA,GAAS,EAAC;AACV,MAAA,MAAA,CAAO,OAAO,CAAA,GAAI,MAAA;AAAA,IACpB;AACA,IAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,EAClB;AAEA,EAAA,MAAM,MAAiD,EAAC;AACxD,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AAClD,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,IAAI,EAAE,IAAA,EAAK;AACnC,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA;AAC3B,MAAA,MAAM,IAAA,GAAA,CAAQ,EAAA,CAAG,OAAA,IAAW,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,KAAM,MAAA,CAAO,CAAC,CAAA,CAAE,IAAA,EAAM,CAAA;AAC3D,MAAA,IAAI,CAAC,EAAA,CAAG,KAAA,IAAS,EAAA,CAAG,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA,IAAK,EAAA,CAAG,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA,EAAG;AACvD,MAAA,MAAM,OAAkC,EAAC;AACzC,MAAA,KAAA,MAAW,IAAA,IAAQ,GAAG,MAAA,EAAuB;AAC3C,QAAA,MAAM,MAA+B,EAAC;AACtC,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,EAAQ,CAAA,EAAA,EAAK,GAAA,CAAI,IAAA,CAAK,CAAC,CAAE,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA;AAC5D,QAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,MACf;AACA,MAAA,IAAI,IAAA,CAAK,MAAA,EAAQ,GAAA,CAAI,IAAI,CAAA,GAAI,IAAA;AAAA,IAC/B,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,IAAA,CAAK,8CAAA,EAAgD,IAAA,EAAM,GAAG,CAAA;AAAA,IACxE;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAiBA,eAAsB,OAAA,CACpB,aACA,IAAA,EAUkC;AAClC,EAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,mBAAA,EAAqB;AACpC,IAAA,MAAM,IAAIrD,yBAAA;AAAA,MACR;AAAA,KAGF;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,MAAA,CAAO,GAAA;AAC5C,EAAA,IAAI,UAAU,IAAA,EAAM;AAClB,IAAA,MAAM,IAAI,MAAM,gFAAgF,CAAA;AAAA,EAClG;AACA,EAAA,IAAI,CAAC,WAAA,EAAa,IAAA,EAAK,EAAG;AACxB,IAAA,MAAM,IAAIA,0BAAkB,+BAA+B,CAAA;AAAA,EAC7D;AAEA,EAAA,MAAM,GAAA,GAAM,MAAM,YAAA,EAAa;AAC/B,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,OAAA,IAAW,uBAAuB,CAAA,EAAG,GAAG,CAAC,CAAA;AAC9F,EAAA,MAAM,UAAA,GAAa,KAAK,UAAA,IAAc,IAAA;AAEtC,EAAA,MAAM,SAAoB,EAAC;AAC3B,EAAA,IAAI,QAAQ,QAAA,CAAS,IAAA,CAAK,SAAA,IAAa,IAAA,EAAM,YAAY,MAAM,CAAA;AAC/D,EAAA,MAAM,UAAA,GAAa,qBAAA,CAAsB,GAAA,CAAI,CAAC,CAAA,KAAM;AAClD,IAAA,MAAA,CAAO,KAAK,CAAC,CAAA;AACb,IAAA,OAAO,CAAA,iBAAA,EAAoB,OAAO,MAAM,CAAA,CAAA;AAAA,EAC1C,CAAC,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA;AACd,EAAA,KAAA,GAAQ,QAAQ,CAAA,EAAG,KAAK,SAAS,UAAU,CAAA,CAAA,CAAA,GAAM,UAAU,UAAU,CAAA,CAAA,CAAA;AACrE,EAAA,IAAI,IAAA,CAAK,QAAQ,MAAA,EAAQ;AACvB,IAAA,MAAM,YAAsB,EAAC;AAC7B,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,MAAA,EAAQ;AAC7B,MAAA,IAAI;AACF,QAAA,SAAA,CAAU,IAAA,CAAK,eAAA,CAAgB,GAAG,CAAC,CAAA;AAAA,MACrC,CAAA,CAAA,MAAQ;AACN,QAAA,OAAA,CAAQ,IAAA,CAAK,uCAAuC,GAAG,CAAA;AAAA,MACzD;AAAA,IACF;AACA,IAAA,IAAI,CAAC,UAAU,MAAA,EAAQ;AACrB,MAAA,MAAM,IAAIA,0BAAkB,kEAAkE,CAAA;AAAA,IAChG;AACA,IAAA,MAAA,CAAO,KAAK,SAAS,CAAA;AACrB,IAAA,KAAA,IAAS,CAAA,eAAA,EAAkB,OAAO,MAAM,CAAA,SAAA,CAAA;AAAA,EAC1C;AACA,EAAA,MAAA,CAAO,IAAA,CAAK,wBAAwB,CAAC,CAAA;AACrC,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,KAAK,IAAA,CAAK,KAAA;AAAA,IAC/B,CAAA;AAAA;AAAA,KAAA,EAEG,KAAK;AAAA;AAAA,YAAA,EAEE,OAAO,MAAM,CAAA,CAAA;AAAA,IACvB;AAAA,GACF;AACA,EAAA,MAAM,OAAA,GAAU,KAAK,MAAA,CAAO,CAAC,MAAM,aAAA,CAAc,CAAA,CAAE,SAAS,CAAC,CAAA;AAC7D,EAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACnB,IAAA,MAAM,IAAIA,0BAAkB,kEAAkE,CAAA;AAAA,EAChG;AACA,EAAA,IAAI,OAAA,CAAQ,SAAS,qBAAA,EAAuB;AAC1C,IAAA,MAAM,IAAIA,yBAAA;AAAA,MACR,aAAa,qBAAqB,CAAA,gGAAA;AAAA,KAEpC;AAAA,EACF;AAEA,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,MAAA,CAAO,CAAA,CAAE,IAAA,IAAQ,EAAE,CAAA,CAAE,QAAQ,CAAC,CAAA;AAC9E,EAAA,IAAI,aAAa,sBAAA,EAAwB;AACvC,IAAA,MAAM,IAAIA,yBAAA;AAAA,MACR,CAAA,6CAAA,EAAgD,UAAU,CAAA,SAAA,EACrD,sBAAsB,CAAA,wDAAA;AAAA,KAC7B;AAAA,EACF;AAEA,EAAA,MAAM,MAAiD,EAAC;AACxD,EAAA,MAAM,QAAA,GAAW,QAAQ,MAAA,GAAS,CAAA;AAClC,EAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,IAAA,MAAM,aAAa,oBAAA,CAAqB,GAAA,CAAI,IAAA,EAAM,IAAA,CAAK,OAAO,SAAA,EAAW;AAAA,MACvE,UAAA;AAAA,MACA,SAAA,EAAW,KAAK,MAAA,CAAO,SAAA;AAAA,MACvB,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AACD,IAAA,MAAM,MAAA,GAAS,oBAAA,CAAqB,GAAA,EAAK,UAAU,CAAA;AACnD,IAAA,KAAA,MAAW,CAAC,SAAA,EAAW,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACvD,MAAA,MAAM,MAAM,QAAA,GAAW,CAAA,EAAG,IAAI,IAAI,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,GAAK,SAAA;AACpD,MAAA,GAAA,CAAI,GAAG,CAAA,GAAI,KAAA;AAAA,IACb;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,IACtC,EAAA,EAAI,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAAA,IACjB,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,UAAU,GAAA,CAAI;AAAA,GAChB,CAAE,CAAA;AAEF,EAAA,IAAI,CAAC,MAAA,CAAO,IAAA,CAAK,GAAG,EAAE,MAAA,EAAQ;AAC5B,IAAA,MAAM,IAAIA,0BAAkB,4DAA4D,CAAA;AAAA,EAC1F;AAEA,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,CAAE,GAAA;AAAA,IACtC,CAAC,CAAC,IAAA,EAAM,KAAK,MACX,CAAA,EAAA,EAAK,IAAI,aAAa,IAAA,CAAK,SAAA,CAAU,OAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,IAAK,EAAE,CAAC,CAAC,CAAA,OAAA,EAAU,KAAA,CAAM,MAAM,CAAA;AAAA,GAC3F;AACA,EAAA,MAAM,UAAA,GAAa,gBAAgB,WAAW;;AAAA;AAAA,EAA8B,WAAA,CAAY,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAElG,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,CAAC,OAAA,EAAS,MAAM,CAAA,GAAI,MAAM,QAAQ,MAAA,EAAQ;AAAA,MACxC,MAAA,EAAQ,qBAAA;AAAA,MACR,IAAA,EAAM,UAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH,SAAS,GAAA,EAAK;AACZ,IAAA,SAAA,CAAU,IAAA,CAAK,KAAA,EAAO,GAAA,EAAK,EAAE,KAAA,EAAO,iBAAA,EAAmB,WAAA,EAAa,WAAA,CAAY,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA;AAC/F,IAAA,MAAM,GAAA;AAAA,EACR;AAEA,EAAA,MAAM,IAAA,GAAO,gBAAgB,OAAO,CAAA;AACpC,EAAA,MAAM,UAAA,GAAa,MAAM,eAAA,CAAgB,IAAA,EAAM,EAAE,KAAK,SAAA,EAAU,EAAG,EAAE,OAAA,EAAS,CAAA;AAC9E,EAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,IAAA,IAAI,UAAA;AACJ,IAAA,IAAI;AACF,MAAA,UAAA,GAAa,oBAAA,CAAqB,KAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,EAAG,IAAA,CAAK,OAAO,SAAA,EAAW;AAAA,QAC3E,UAAA;AAAA,QACA,SAAA,EAAW,KAAK,MAAA,CAAO,SAAA;AAAA,QACvB,OAAO,IAAA,CAAK;AAAA,OACb,CAAA;AAAA,IACH,CAAA,CAAA,MAAQ;AACN,MAAA,UAAA,GAAa,kCAAA;AAAA,IACf;AACA,IAAA,SAAA,CAAU,KAAK,KAAA,EAAO,IAAI,MAAM,UAAA,CAAW,KAAA,IAAS,0BAA0B,CAAA,EAAG;AAAA,MAC/E,KAAA,EAAO,cAAA;AAAA,MACP,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,MAAA,GAAkC;AAAA,IACtC,SAAS,UAAA,CAAW,OAAA;AAAA,IACpB,QAAQ,UAAA,CAAW,MAAA;AAAA,IACnB,IAAA;AAAA,IACA,MAAA,EAAQ,WAAW,MAAA,IAAU,EAAA;AAAA,IAC7B,OAAO,UAAA,CAAW,KAAA;AAAA,IAClB,eAAe,UAAA,CAAW,aAAA;AAAA,IAC1B,eAAe,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AAAA,IACxC,cAAA,EAAgB;AAAA,MACd,SAAA,EAAW,QAAQ,KAAA,IAAS,CAAA;AAAA,MAC5B,UAAA,EAAY,QAAQ,MAAA,IAAU;AAAA;AAChC,GACF;AACA,EAAA,OAAO,oBAAA,CAAqB,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW;AAAA,IACzD,UAAA;AAAA,IACA,SAAA,EAAW,KAAK,MAAA,CAAO,SAAA;AAAA,IACvB,OAAO,IAAA,CAAK;AAAA,GACb,CAAA;AACH;AO9vBA,IAAM,eAAA,GAAkBsD,MAAE,MAAA,CAAO;AAAA,EAC/B,QAAA,EAAUA,KAAA,CAAE,IAAA,CAAK,CAAC,QAAA,EAAU,gBAAgB,QAAA,EAAU,QAAA,EAAU,QAAA,EAAU,QAAQ,CAAC,CAAA;AAAA,EACnF,KAAA,EAAOA,MAAE,MAAA,EAAO;AAAA,EAChB,GAAA,EAAKA,KAAA,CAAE,MAAA,EAAO,CAAE,GAAA,EAAI,CAAE,QAAA,EAAS,CAAE,QAAA,EAAS,CAAE,QAAA,EAAS,CAAE,QAAQ,IAAI,CAAA;AAAA,EACnE,MAAA,EAAQA,MAAE,MAAA,EAAO,CAAE,UAAS,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,IAAI,CAAA;AAAA,EACrD,OAAA,EAASA,MAAE,MAAA,EAAO,CAAE,UAAS,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,IAAI;AACxD,CAAC,CAAA;AAED,IAAM,SAAA,GAAYA,MAAE,MAAA,CAAO;AAAA,EACzB,QAAA,EAAUA,KAAA,CAAE,IAAA,CAAK,CAAC,WAAA,EAAa,UAAU,cAAA,EAAgB,QAAA,EAAU,SAAA,EAAW,QAAQ,CAAC,CAAA;AAAA,EACvF,KAAA,EAAOA,MAAE,MAAA,EAAO;AAAA,EAChB,MAAA,EAAQA,MAAE,MAAA,EAAO,CAAE,UAAS,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,IAAI,CAAA;AAAA,EACrD,OAAA,EAASA,MAAE,MAAA,EAAO,CAAE,UAAS,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,IAAI;AACxD,CAAC,CAAA;AAED,IAAM,WAAA,GAAcA,MAAE,MAAA,CAAO;AAAA,EAC3B,OAAA,EAASA,KAAA,CAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK,CAAA;AAAA,EAClC,QAAA,EAAUA,MAAE,MAAA,EAAO,CAAE,UAAS,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,IAAI,CAAA;AAAA,EACvD,SAAA,EAAWA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAQ,OAAO,CAAA;AAAA,EACrC,aAAA,EAAeA,MAAE,MAAA,EAAO,CAAE,UAAS,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,IAAI,CAAA;AAAA,EAC5D,aAAA,EAAeA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAQ,OAAO,CAAA;AAAA,EACzC,eAAe,SAAA,CAAU,QAAA,GAAW,QAAA,EAAS,CAAE,QAAQ,IAAI;AAC7D,CAAC,CAAA;AAED,IAAM,cAAA,GAAiBA,MAAE,MAAA,CAAO;AAAA,EAC9B,OAAA,EAASA,KAAA,CAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK,CAAA;AAAA,EAClC,QAAA,EAAUA,KAAA,CAAE,IAAA,CAAK,CAAC,UAAU,QAAA,EAAU,MAAA,EAAQ,QAAQ,CAAC,EAAE,QAAA,EAAS,CAAE,QAAA,EAAS,CAAE,QAAQ,IAAI,CAAA;AAAA,EAC3F,KAAA,EAAOA,MAAE,MAAA,EAAO,CAAE,UAAS,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,IAAI,CAAA;AAAA,EACpD,MAAA,EAAQA,MAAE,MAAA,EAAO,CAAE,UAAS,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,IAAI,CAAA;AAAA,EACrD,OAAA,EAASA,MAAE,MAAA,EAAO,CAAE,UAAS,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,IAAI,CAAA;AAAA,EACtD,UAAA,EAAYA,MAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,EAAE;AACpD,CAAC,CAAA;AAED,IAAM,YAAA,GAAeA,MAAE,MAAA,CAAO;AAAA,EAC5B,QAAQA,KAAA,CAAE,OAAA,CAAQ,KAAK,CAAA,CAAE,QAAQ,KAAK,CAAA;AAAA,EACtC,CAAA,EAAGA,MAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,EAAE,CAAA;AAAA,EACzC,OAAA,EAASA,MAAE,MAAA,CAAOA,KAAA,CAAE,QAAO,EAAGA,KAAA,CAAE,QAAQ,CAAA,CAAE,QAAQ,EAAE,GAAA,EAAK,GAAK,IAAA,EAAM,GAAA,EAAK,KAAK,CAAA,EAAK,KAAA,EAAO,GAAK;AACjG,CAAC,CAAA;AAED,IAAM,aAAA,GAAgBA,MAAE,MAAA,CAAO;AAAA,EAC7B,SAASA,KAAA,CAAE,OAAA,CAAQ,UAAU,CAAA,CAAE,QAAQ,UAAU,CAAA;AAAA,EACjD,iBAAA,EAAmBA,MAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,GAAM;AAC/D,CAAC,CAAA;AA0BM,IAAM,mBAAA,GAAN,MAAM,oBAAA,CAAoB;AAAA,EAC/B,WAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,mBAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EAEA,YAAY,IAAA,EAA+B;AACzC,IAAA,IAAA,CAAK,cAAc,IAAA,CAAK,WAAA;AACxB,IAAA,IAAA,CAAK,UAAU,aAAA,CAAc,KAAA,CAAM,IAAA,CAAK,OAAA,IAAW,EAAE,CAAA;AACrD,IAAA,IAAA,CAAK,WAAA,GAAc,KAAK,WAAA,IAAe,QAAA;AACvC,IAAA,IAAA,CAAK,SAAA,GAAY,eAAA,CAAgB,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA;AACrD,IAAA,IAAA,CAAK,MAAM,IAAA,CAAK,GAAA,GAAM,UAAU,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,GAAI,IAAA;AAClD,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK,SAAA,GAAY,UAAU,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA,GAAI,IAAA;AACpE,IAAA,IAAA,CAAK,QAAQ,WAAA,CAAY,KAAA,CAAM,IAAA,CAAK,KAAA,IAAS,EAAE,CAAA;AAC/C,IAAA,IAAA,CAAK,WAAW,cAAA,CAAe,KAAA,CAAM,IAAA,CAAK,QAAA,IAAY,EAAE,CAAA;AACxD,IAAA,IAAA,CAAK,SAAS,YAAA,CAAa,KAAA,CAAM,IAAA,CAAK,MAAA,IAAU,EAAE,CAAA;AAClD,IAAA,IAAA,CAAK,mBAAA,GAAsB,KAAK,mBAAA,IAAuB,KAAA;AACvD,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,SAAA,IAAa,IAAA;AACnC,IAAA,IAAA,CAAK,SAAA,GACH,IAAA,CAAK,SAAA,YAAqB,eAAA,GAAkB,IAAA,CAAK,SAAA,GAAY,IAAI,eAAA,CAAgB,IAAA,CAAK,SAAA,IAAa,EAAE,CAAA;AACvG,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA,EAEQ,QAAA,GAAiB;AACvB,IAAA,IACE,IAAA,CAAK,KAAA,CAAM,OAAA,IACX,EAAE,IAAA,CAAK,KAAA,CAAM,QAAA,IAAY,IAAA,CAAK,KAAA,CAAM,aAAA,IAAiB,IAAA,CAAK,KAAA,CAAM,aAAA,CAAA,EAChE;AACA,MAAA,MAAM,IAAI,MAAM,gEAAgE,CAAA;AAAA,IAClF;AACA,IAAA,IAAI,IAAA,CAAK,SAAS,OAAA,IAAW,EAAE,KAAK,QAAA,CAAS,QAAA,IAAY,IAAA,CAAK,QAAA,CAAS,MAAA,CAAA,EAAS;AAC9E,MAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,IAChE;AACA,IAAA,IAAI,KAAK,WAAA,KAAgB,OAAA,IAAW,CAAC,IAAA,CAAK,MAAM,OAAA,EAAS;AACvD,MAAA,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAAA,IACrE;AACA,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO;AACvC,MAAA,IAAI,IAAA,CAAK,MAAA,KAAW,MAAA,IAAU,CAAC,KAAK,SAAA,EAAW;AAC7C,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,gBAAA,EAAmB,KAAK,IAAI,CAAA,iEAAA;AAAA,SAC9B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,OAAA,CACL,SAAA,GAAgF,EAAC,EAC5D;AACrB,IAAA,MAAM,MAAM,SAAA,EAAU;AACtB,IAAA,MAAM,MAAA,GAAS,SAAA,CAAU,GAAA,EAAK,SAAoC,CAAA;AAClE,IAAA,IAAI,CAAC,MAAA,CAAO,WAAA,IAAe,CAAC,OAAO,SAAA,EAAW;AAC5C,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,OAAO,IAAI,qBAAoB,MAA4C,CAAA;AAAA,EAC7E;AACF;AAEA,SAAS,SAAS,GAAA,EAAqB;AACrC,EAAA,OAAO,GAAA,CAAI,WAAA,EAAY,CAAE,OAAA,CAAQ,WAAA,EAAa,CAAC,CAAA,EAAG,CAAA,KAAc,CAAA,CAAE,WAAA,EAAa,CAAA;AACjF;AAGO,SAAS,SAAA,GAAqC;AACnD,EAAA,MAAM,OAAgC,EAAC;AACvC,EAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA,EAAG;AACtD,IAAA,IAAI,CAAC,GAAA,CAAI,UAAA,CAAW,KAAK,CAAA,IAAK,UAAU,MAAA,EAAW;AACnD,IAAA,MAAM,IAAA,GAAO,IAAI,KAAA,CAAM,CAAC,EAAE,KAAA,CAAM,IAAI,CAAA,CAAE,GAAA,CAAI,QAAQ,CAAA;AAClD,IAAA,IAAI,GAAA,GAA+B,IAAA;AACnC,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AACxC,MAAA,MAAM,CAAA,GAAI,KAAK,CAAC,CAAA;AAChB,MAAA,MAAM,IAAA,GAAO,IAAI,CAAC,CAAA;AAClB,MAAA,IAAI,OAAO,SAAS,QAAA,IAAY,IAAA,KAAS,MAAM,GAAA,CAAI,CAAC,IAAI,EAAC;AACzD,MAAA,GAAA,GAAM,IAAI,CAAC,CAAA;AAAA,IACb;AACA,IAAA,GAAA,CAAI,KAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAE,CAAA,GAAI,UAAU,KAAK,CAAA;AAAA,EAC/C;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,UAAU,KAAA,EAAwB;AACzC,EAAA,IAAI,KAAA,KAAU,QAAQ,OAAO,IAAA;AAC7B,EAAA,IAAI,KAAA,KAAU,SAAS,OAAO,KAAA;AAC9B,EAAA,IAAI,UAAU,IAAA,CAAK,KAAK,CAAA,EAAG,OAAO,OAAO,KAAK,CAAA;AAC9C,EAAA,IAAI,eAAe,IAAA,CAAK,KAAK,CAAA,EAAG,OAAO,OAAO,KAAK,CAAA;AACnD,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,SAAA,CAAU,GAA4B,CAAA,EAAqD;AAClG,EAAA,MAAM,GAAA,GAAM,EAAE,GAAG,CAAA,EAAE;AACnB,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,EAAG;AACtC,IAAA,IAAI,MAAM,MAAA,EAAW;AACrB,IAAA,MAAM,QAAA,GAAW,IAAI,CAAC,CAAA;AACtB,IAAA,IACE,KACA,OAAO,CAAA,KAAM,QAAA,IACb,CAAC,MAAM,OAAA,CAAQ,CAAC,CAAA,IAChB,QAAA,IACA,OAAO,QAAA,KAAa,QAAA,IACpB,CAAC,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EACvB;AACA,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,SAAA,CAAU,QAAA,EAAqC,CAA4B,CAAA;AAAA,IACtF,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA;AAAA,IACX;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;;;ACvLA,WAAA,EAAA;AAEO,IAAM,aAAA,GAAgB,gCAAA;AAI7B,IAAM,UAAA,GAAa,CAAC,MAAA,EAAQ,YAAA,EAAc,kBAAkB,CAAA;AAC5D,IAAM,WAAA,GAAc,CAAC,GAAG,UAAA,EAAY,YAAY,CAAA;AAEhD,IAAM,KAAA,GAAgC;AAAA,EACpC,MAAA,EAAQ,UAAA;AAAA,EACR,YAAA,EAAc,gBAAA;AAAA,EACd,kBAAA,EAAoB,sBAAA;AAAA,EACpB,YAAA,EAAc;AAChB,CAAA;AAEA,SAAS,MAAA,GAAiB;AAExB,EAAA,MAAM,IAAA,GAAOC,YAAA,CAAQC,iBAAA,CAAc,2PAAe,CAAC,CAAA;AACnD,EAAA,OAAOC,SAAA,CAAK,IAAA,EAAM,YAAA,EAAc,KAAK,CAAA;AACvC;AAEA,SAAS,OAAA,CAAQ,KAAa,GAAA,EAAqB;AACjD,EAAA,MAAM,GAAA,GAAMT,gBAAaS,SAAA,CAAK,MAAA,IAAU,KAAA,CAAM,GAAG,CAAE,CAAA,EAAG,MAAM,CAAA;AAC5D,EAAA,OAAO,GAAA,CAAI,UAAA,CAAW,SAAA,EAAW,MAAA,CAAO,GAAG,CAAC,CAAA;AAC9C;AAEA,eAAe,SAAA,GAA0C;AACvD,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,OAAO,IAAI,CAAA;AAAA,EAC1B,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAIlD,yBAAA,CAAkB,UAAA,EAAY,IAAA,EAAM,iBAAiB,CAAA;AAAA,EACjE;AACF;AAEA,eAAsB,UAAA,CAAW,WAAA,EAAqB,KAAA,GAAiC,EAAC,EAAkB;AACxG,EAAA,MAAM,EAAA,GAAK,MAAM,SAAA,EAAU;AAC3B,EAAA,OAAO,IAAI,GAAG,IAAA,CAAK,EAAE,kBAAkB,WAAA,EAAa,GAAG,OAAO,CAAA;AAChE;AAEA,eAAe,YAAY,MAAA,EAA4C;AACrE,EAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,KAAA,CAAM,gDAAgD,CAAA;AAClF,EAAA,IAAI,CAAC,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,GAAG,OAAO,IAAA;AAC/B,EAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,KAAA,CAAM,4DAA4D,CAAA;AAC3F,EAAA,OAAO,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,EAAG,aAAA,IAAiB,IAAA;AACvC;AAEA,eAAe,gBAAgB,MAAA,EAA4C;AACzE,EAAA,MAAM,SAAS,MAAM,MAAA,CAAO,KAAA,CAAM,CAAA,oBAAA,EAAuB,aAAa,CAAA,OAAA,CAAS,CAAA;AAC/E,EAAA,IAAI,CAAC,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,GAAG,OAAO,IAAA;AAC/B,EAAA,MAAM,MAAM,MAAM,MAAA,CAAO,KAAA,CAAM,CAAA,wBAAA,EAA2B,aAAa,CAAA,QAAA,CAAU,CAAA;AACjF,EAAA,OAAO,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,EAAG,WAAA,IAAe,IAAA;AACrC;AAEA,SAAS,WAAW,OAAA,EAAqC;AACvD,EAAA,IAAI,CAAC,OAAA,EAAS,uBAAO,IAAI,GAAA,EAAI;AAC7B,EAAA,MAAM,GAAA,GAAM,CAAC,GAAG,WAAW,CAAA;AAC3B,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,OAA+B,CAAA;AACvD,EAAA,IAAI,GAAA,GAAM,CAAA,EAAG,uBAAO,IAAI,GAAA,EAAI;AAC5B,EAAA,OAAO,IAAI,GAAA,CAAI,GAAA,CAAI,MAAM,CAAA,EAAG,GAAA,GAAM,CAAC,CAAC,CAAA;AACtC;AAEA,eAAsB,UAAA,CACpB,WAAA,EACA,IAAA,GAA0C,EAAC,EAC5B;AACf,EAAA,MAAM,GAAA,GAAM,KAAK,GAAA,IAAO,IAAA;AACxB,EAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,IAAS,KAAA;AAC5B,EAAA,MAAM,IAAA,GAAO,MAAM,UAAA,CAAW,WAAW,CAAA;AACzC,EAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,EAAQ;AAClC,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,WAAA,CAAY,MAAM,CAAA;AACzC,IAAA,IAAI,QAAA,KAAa,IAAA,IAAQ,QAAA,KAAa,GAAA,EAAK;AACzC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,6CAAA,EAAgD,QAAQ,CAAA,kCAAA,EACnC,GAAG,CAAA,4LAAA;AAAA,OAG1B;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,CAAO,MAAM,OAAO,CAAA;AAC1B,IAAA,MAAM,OAAO,KAAA,CAAM;AAAA,iCAAA,EACY,aAAa,CAAA;AAAA;AAAA,mBAAA,EAE3B,aAAa,CAAA;AAAA;AAAA,IAAA,CAE7B,CAAA;AACD,IAAA,IAAI,QAAA,GAAW,MAAM,eAAA,CAAgB,MAAM,CAAA;AAC3C,IAAA,MAAM,IAAA,GAAO,WAAW,QAAQ,CAAA;AAChC,IAAA,MAAM,KAAA,GAAQ,QAAQ,WAAA,GAAc,UAAA;AACpC,IAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACvB,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AACnB,MAAA,MAAM,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAC,CAAA;AACpC,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,OAAO,KAAA,CAAM,CAAA,OAAA,EAAU,aAAa,CAAA,qBAAA,CAAA,EAAyB,CAAC,GAAG,CAAC,CAAA;AAAA,MAC1E,CAAA,MAAO;AACL,QAAA,MAAM,OAAO,KAAA,CAAM,CAAA,YAAA,EAAe,aAAa,CAAA,0BAAA,CAAA,EAA8B,CAAC,GAAG,CAAC,CAAA;AAAA,MACpF;AACA,MAAA,QAAA,GAAW,GAAA;AACX,MAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AAAA,IACd;AACA,IAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,KAAA,CAAM,4DAA4D,CAAA;AAC5F,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ;AACrB,MAAA,MAAM,MAAA,CAAO,KAAA,CAAM,oEAAA,EAAsE,CAAC,GAAG,CAAC,CAAA;AAAA,IAChG,WAAW,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,CAAE,iBAAiB,IAAA,EAAM;AAC7C,MAAA,MAAM,MAAA,CAAO,KAAA,CAAM,gEAAA,EAAkE,CAAC,GAAG,CAAC,CAAA;AAAA,IAC5F;AACA,IAAA,MAAM,MAAA,CAAO,MAAM,QAAQ,CAAA;AAAA,EAC7B,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,CAAO,MAAM,UAAU,CAAA;AAAA,IAC/B,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,MAAM,GAAA;AAAA,EACR,CAAA,SAAE;AACA,IAAA,MAAA,CAAO,OAAA,EAAQ;AACf,IAAA,MAAM,KAAK,GAAA,EAAI;AAAA,EACjB;AACF;;;AC5GA,WAAA,EAAA;AAEA,UAAA,EAAA;;;ACLA,WAAA,EAAA;AACA,SAAA,EAAA;AAEO,IAAMsC,WAAAA,GAAa,GAAA;AAE1B,IAAMa,iCAAgB,IAAI,GAAA,CAAI,CAAC,QAAA,EAAU,cAAA,EAAgB,QAAQ,CAAC,CAAA;AAgClE,SAAS,gBAAgB,KAAA,EAAyB;AAChD,EAAA,OAAO,KAAA,CAAM,OAAO,CAAC,CAAA,EAAG,MAAM,CAAA,GAAI,UAAA,CAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AACpD;AAEA,eAAeC,SAAAA,CACb,SAAA,EACA,GAAA,EACA,IAAA,EACA,OAAA,EACc;AACd,EAAA,MAAM,IAAA,GAAO,MAAM,SAAA,CAAU,GAAA,EAAK;AAAA,IAChC,MAAA,EAAQ,MAAA;AAAA,IACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAoB,GAAG,OAAA,EAAQ;AAAA,IAC1D,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,IACzB,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQd,WAAU;AAAA,GACvC,CAAA;AACD,EAAA,IAAI,CAAC,KAAK,EAAA,EAAI;AACZ,IAAA,MAAM,OAAO,MAAM,IAAA,CAAK,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAC7C,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,IAAA,CAAK,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,UAAU,CAAA,EAAG,IAAA,GAAO,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,GAAK,EAAE,CAAA,CAAE,CAAA;AAAA,EACpF;AACA,EAAA,OAAO,KAAK,IAAA,EAAK;AACnB;AAEO,SAAS,kBAAkBnC,IAAAA,EAA8B;AAC9D,EAAA,OAAO,IAAIC,uBAAAA,CAAO;AAAA,IAChB,MAAA,EAAQD,KAAI,MAAA,IAAU,MAAA;AAAA,IACtB,OAAA,EAASA,KAAI,OAAA,IAAW,MAAA;AAAA,IACxB,OAAA,EAASmC,WAAAA;AAAA,IACT,UAAA,EAAY;AAAA,GACb,CAAA;AACH;AAEO,IAAM,WAAN,MAAe;AAAA,EACpB,GAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACQ,WAAA,GAAwC,IAAA;AAAA,EAEhD,WAAA,CAAYnC,IAAAA,EAAsB,IAAA,GAAqB,EAAC,EAAG;AACzD,IAAA,IAAA,CAAK,GAAA,GAAMA,IAAAA;AACX,IAAA,IAAA,CAAK,WAAWA,IAAAA,CAAI,QAAA;AACpB,IAAA,IAAA,CAAK,QAAQA,IAAAA,CAAI,KAAA;AACjB,IAAA,IAAA,CAAK,GAAA,GAAMA,KAAI,GAAA,IAAO,IAAA;AACtB,IAAA,IAAA,CAAK,MAAA,GAAS,KAAK,MAAA,IAAU,IAAA;AAC7B,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,SAAA,IAAa,IAAA;AAAA,EACnD;AAAA,EAEA,MAAM,MAAA,GAAwB;AAC5B,IAAA,MAAM,MAAA,GAAS,KAAK,MAAA,EAAQ,KAAA;AAC5B,IAAA,IAAI,OAAO,WAAW,UAAA,EAAY;AAChC,MAAA,MAAM,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,OAAO,MAAA,CAAO,YAAY,CAAA,GAAmB;AAC3C,IAAA,MAAM,KAAK,MAAA,EAAO;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KAAA,CAAM,KAAA,EAAiB,IAAA,GAA6B,EAAC,EAAkC;AAC3F,IAAA,MAAM,IAAA,GAAO,KAAK,IAAA,IAAQ,UAAA;AAC1B,IAAA,MAAM,CAAC,SAAS,MAAM,CAAA,GAAI,MAAM,IAAA,CAAK,QAAA,CAAS,OAAO,IAAI,CAAA;AACzD,IAAA,MAAM,WAAA,GAAc,QAAQ,CAAC,CAAA,KAAM,SAAY,OAAA,CAAQ,CAAC,EAAE,MAAA,GAAS,MAAA;AACnE,IAAA,IAAI,gBAAgB,MAAA,EAAW;AAC7B,MAAA,IAAI,IAAA,CAAK,QAAQ,IAAA,EAAM;AACrB,QAAA,IAAA,CAAK,GAAA,GAAM,WAAA;AAAA,MACb,CAAA,MAAA,IAAW,WAAA,KAAgB,IAAA,CAAK,GAAA,EAAK;AACnC,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,6CAA6C,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,QAAQ,CAAC,CAAA,OAAA,EAC/D,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,KAAK,CAAC,CAAA,iBAAA,EAAoB,IAAA,CAAK,GAAG,2BACtC,WAAW,CAAA;AAAA,SACxC;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,CAAC,SAAS,MAAM,CAAA;AAAA,EACzB;AAAA;AAAA,EAGA,MAAM,QAAA,CAAS,KAAA,EAAiB,IAAA,GAAkB,UAAA,EAA2C;AAC3F,IAAA,IAAIgD,cAAAA,CAAc,IAAI,IAAA,CAAK,QAAQ,GAAG,OAAO,IAAA,CAAK,YAAY,KAAK,CAAA;AACnE,IAAA,IAAI,KAAK,QAAA,KAAa,QAAA,EAAU,OAAO,IAAA,CAAK,YAAY,KAAK,CAAA;AAC7D,IAAA,IAAI,KAAK,QAAA,KAAa,QAAA,SAAiB,IAAA,CAAK,WAAA,CAAY,OAAO,IAAI,CAAA;AACnE,IAAA,IAAI,KAAK,QAAA,KAAa,QAAA,SAAiB,IAAA,CAAK,WAAA,CAAY,OAAO,IAAI,CAAA;AACnE,IAAA,MAAM,IAAI,MAAM,CAAA,4BAAA,EAA+B,IAAA,CAAK,UAAU,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,EAChF;AAAA,EAEA,MAAc,YAAY,KAAA,EAAgD;AACxE,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAAA,IACxD;AACA,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,MAAA,CAAO,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,CAAA;AACpF,IAAA,MAAM,UAAU,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA,KAAM,EAAE,SAAS,CAAA;AAChD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,EAAO,YAAA,IAAgB,gBAAgB,KAAK,CAAA;AAChE,IAAA,OAAO,CAAC,SAAS,MAAM,CAAA;AAAA,EACzB;AAAA,EAEA,MAAc,YAAY,KAAA,EAAgD;AACxE,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,IAAA,CAAK,WAAA,GAAc,MAAM,qBAAA,CAAsB,IAAA,CAAK,IAAI,MAAM,CAAA;AAAA,IAChE;AACA,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,WAAA,CAAY,OAAO,YAAA,CAAa;AAAA,MACtD,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,UAAA,IAAc,EAAC;AACvC,IAAA,MAAM,OAAA,GAAU,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAM,KAAA,CAAM,IAAA,CAAK,CAAA,CAAE,MAAA,IAAU,EAAE,CAAC,CAAA;AAChE,IAAA,OAAO,CAAC,OAAA,EAAS,eAAA,CAAgB,KAAK,CAAC,CAAA;AAAA,EACzC;AAAA,EAEA,MAAc,WAAA,CAAY,KAAA,EAAiB,IAAA,EAAgD;AACzF,IAAA,MAAM,SAAA,GAAY,KAAK,YAAA,EAAa;AACpC,IAAA,MAAM,SAAA,GAAY,IAAA,KAAS,OAAA,GAAU,OAAA,GAAU,UAAA;AAC/C,IAAA,MAAM,OAAO,MAAMC,SAAAA;AAAA,MACjB,SAAA;AAAA,MACA,wCAAA;AAAA,MACA,EAAE,KAAA,EAAO,IAAA,CAAK,OAAO,KAAA,EAAO,KAAA,EAAO,YAAY,SAAA,EAAU;AAAA,MACzD,EAAE,aAAA,EAAe,CAAA,OAAA,EAAU,KAAK,GAAA,CAAI,MAAA,IAAU,EAAE,CAAA,CAAA;AAAG,KACrD;AACA,IAAA,MAAM,UAAW,IAAA,CAAK,IAAA,CAAwC,IAAI,CAAC,IAAA,KAAS,KAAK,SAAS,CAAA;AAC1F,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,EAAO,YAAA,IAAgB,gBAAgB,KAAK,CAAA;AAChE,IAAA,OAAO,CAAC,SAAS,MAAM,CAAA;AAAA,EACzB;AAAA,EAEA,MAAc,WAAA,CAAY,KAAA,EAAiB,IAAA,EAAgD;AACzF,IAAA,MAAM,SAAA,GAAY,KAAK,YAAA,EAAa;AACpC,IAAA,MAAM,SAAA,GAAY,IAAA,KAAS,OAAA,GAAU,cAAA,GAAiB,iBAAA;AACtD,IAAA,MAAM,OAAO,MAAMA,SAAAA;AAAA,MACjB,SAAA;AAAA,MACA,iCAAA;AAAA,MACA;AAAA,QACE,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,KAAA;AAAA,QACA,UAAA,EAAY,SAAA;AAAA,QACZ,eAAA,EAAiB,CAAC,OAAO;AAAA,OAC3B;AAAA,MACA,EAAE,aAAA,EAAe,CAAA,OAAA,EAAU,KAAK,GAAA,CAAI,MAAA,IAAU,EAAE,CAAA,CAAA;AAAG,KACrD;AACA,IAAA,MAAM,OAAA,GAAU,KAAK,UAAA,CAAW,KAAA;AAChC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,IAAA,EAAM,YAAA,EAAc,YAAA;AACxC,IAAA,MAAM,MAAA,GAAS,MAAA,IAAU,IAAA,GAAO,MAAA,GAAS,gBAAgB,KAAK,CAAA;AAC9D,IAAA,OAAO,CAAC,SAAS,MAAM,CAAA;AAAA,EACzB;AAAA,EAEQ,YAAA,GAA0B;AAChC,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,QAAQ,CAAA,qCAAA,CAAuC,CAAA;AAAA,IACzE;AACA,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AACF;AAEA,eAAe,sBAAsB,MAAA,EAA+D;AAClG,EAAA,MAAM,SAAA,GAAY,eAAA;AAClB,EAAA,IAAI,GAAA;AAIJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAO,MAAM,OAAO,SAAA,CAAA;AAAA,EACtB,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAIpD,yBAAA,CAAkB,QAAA,EAAU,SAAA,EAAW,mBAAmB,CAAA;AAAA,EACtE;AACA,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,WAAA,IAAe,GAAA,CAAI,MAAA;AACpC,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,MAAM,IAAIA,yBAAA,CAAkB,QAAA,EAAU,SAAA,EAAW,mBAAmB,CAAA;AAAA,EACtE;AACA,EAAA,OAAO,IAAI,IAAA,CAAK,EAAE,MAAA,EAAQ,MAAA,IAAU,MAAM,CAAA;AAC5C;AAEO,SAAS,aAAA,CAAcG,MAAsB,IAAA,EAA+B;AACjF,EAAA,IAAI,IAAA,EAAM,MAAA,IAAU,IAAA,EAAM,KAAA,IAAS,MAAM,SAAA,EAAW;AAClD,IAAA,OAAO,IAAI,QAAA,CAASA,IAAAA,EAAK,IAAI,CAAA;AAAA,EAC/B;AACA,EAAA,IAAIgD,cAAAA,CAAc,GAAA,CAAIhD,IAAAA,CAAI,QAAQ,CAAA,EAAG;AACnC,IAAA,OAAO,IAAI,SAASA,IAAAA,EAAK,EAAE,QAAQ,iBAAA,CAAkBA,IAAG,GAAG,CAAA;AAAA,EAC7D;AACA,EAAA,IAAIA,IAAAA,CAAI,QAAA,KAAa,QAAA,IAAYA,IAAAA,CAAI,aAAa,QAAA,EAAU;AAC1D,IAAA,OAAO,IAAI,QAAA,CAASA,IAAAA,EAAK,EAAE,KAAA,EAAO,UAAA,CAAW,OAAO,CAAA;AAAA,EACtD;AACA,EAAA,IAAIA,IAAAA,CAAI,aAAa,QAAA,EAAU;AAC7B,IAAA,OAAO,IAAI,SAASA,IAAG,CAAA;AAAA,EACzB;AACA,EAAA,MAAM,IAAI,MAAM,CAAA,4BAAA,EAA+B,IAAA,CAAK,UAAUA,IAAAA,CAAI,QAAQ,CAAC,CAAA,CAAE,CAAA;AAC/E;;;AC9OA,SAAA,EAAA;AAEO,IAAM,eAAA,GAAkB,IAAA;AAExB,IAAM,2BAAA,GAA8B,GAAA;AAE3C,IAAMF,IAAAA,GAAM;AAAA,EACV,MAAM,CAAA,GAAI,IAAA,KAAoB,QAAQ,KAAA,CAAM,kBAAA,EAAoB,GAAG,IAAI,CAAA;AAAA,EACvE,MAAM,CAAA,GAAI,IAAA,KAAoB,QAAQ,IAAA,CAAK,kBAAA,EAAoB,GAAG,IAAI,CAAA;AAAA,EACtE,OAAO,CAAA,GAAI,IAAA,KAAoB,QAAQ,KAAA,CAAM,kBAAA,EAAoB,GAAG,IAAI,CAAA;AAAA,EACxE,OAAO,CAAA,GAAI,IAAA,KAAoB,QAAQ,KAAA,CAAM,kBAAA,EAAoB,GAAG,IAAI;AAC1E,CAAA;AA4CA,IAAI,OAAA,GAAkC,IAAA;AAEtC,SAAS,kBAAA,GAAqC;AAC5C,EAAA,IAAI,OAAA,KAAY,OAAO,OAAO,IAAA;AAC9B,EAAA,IAAI,SAAS,OAAO,OAAA;AACpB,EAAA,IAAI;AACF,IAAA,OAAA,GAAUoD,uBAAY,aAAa,CAAA;AACnC,IAAA,OAAO,OAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAApD,IAAAA,CAAI,KAAK,+DAA+D,CAAA;AACxE,IAAA,OAAA,GAAU,KAAA;AACV,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAIO,SAAS,oBAAA,CAAqB,IAAA,EAAc,YAAA,GAAe,KAAA,EAAkC;AAClG,EAAA,IAAI,CAAC,IAAA,EAAM,OAAO,eAAe,CAAC,CAAA,EAAG,OAAO,CAAA,GAAI,CAAA;AAEhD,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,kBAAA,EAAmB;AAC/B,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAMqD,MAAAA,GAAQ,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,CAAE,MAAA;AAC/B,MAAA,OAAO,YAAA,GAAe,CAACA,MAAAA,EAAO,sBAAsB,CAAA,GAAIA,MAAAA;AAAA,IAC1D;AAAA,EACF,SAAS,CAAA,EAAG;AACV,IAAArD,IAAAA,CAAI,IAAA,CAAK,CAAA,8BAAA,EAAiC,CAAC,CAAA,CAAE,CAAA;AAAA,EAC/C;AAEA,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAS,eAAe,CAAA;AACtD,EAAA,OAAO,YAAA,GAAe,CAAC,KAAA,EAAO,qBAAqB,CAAA,GAAI,KAAA;AACzD;AAMA,IAAM,aAAA,GAAgB,uFAAA;AAEf,SAAS,kBAAA,CAAmB,IAAA,EAAc,UAAA,GAAa,GAAA,EAAa;AACzE,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAA,GAAS,IAAI,OAAO,UAAA;AAEtC,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,GAAI,CAAA;AAEjC,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,IAAI,CAAC,iBAAA,CAAkB,IAAA,CAAK,CAAC,CAAA,IAAK,CAAC,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,QAAA,IAAY,CAAA;AAAA,EAClE;AACA,EAAA,MAAM,aAAa,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAO,MAAM,CAAA;AAEvD,EAAA,MAAM,OAAA,GAAU,aAAA,CAAc,IAAA,CAAK,MAAM,CAAA;AAEzC,EAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,MAAM,MAAA,GAAS,WAAW,CAAC,CAAA;AAC3B,IAAA,IAAI,MAAA,IAAU,MAAA,KAAW,OAAA,EAAS,aAAA,IAAiB,CAAA;AAAA,EACrD;AACA,EAAA,MAAM,WAAW,aAAA,GAAgB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAO,MAAM,CAAA;AAE1D,EAAA,IAAI,MAAA,GAAS,UAAA;AAEb,EAAA,IAAI,UAAA,GAAa,OAAO,OAAA,EAAS;AAC/B,IAAA,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,GAAG,CAAA;AAC7B,IAAAA,IAAAA,CAAI,KAAA;AAAA,MACF,CAAA,oDAAA,EAAuD,WAAW,OAAA,CAAQ,CAAC,CAAC,CAAA,OAAA,EAAU,OAAO,YAAY,MAAM,CAAA,QAAA;AAAA,KACjH;AAAA,EACF;AAEA,EAAA,IAAI,WAAW,IAAA,EAAM;AACnB,IAAA,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,IAAI,CAAA;AAC9B,IAAAA,IAAAA,CAAI,KAAA;AAAA,MACF,mDAAmD,QAAA,GAAW,GAAA,EAAK,QAAQ,CAAC,CAAC,aAAa,MAAM,CAAA,QAAA;AAAA,KAClG;AAAA,EACF;AAEA,EAAA,IAAI,aAAa,GAAA,EAAK;AACpB,IAAA,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,IAAI,CAAA;AAC9B,IAAAA,IAAAA,CAAI,KAAA;AAAA,MACF,sDAAsD,UAAA,CAAW,OAAA,CAAQ,CAAC,CAAC,YAAY,MAAM,CAAA,QAAA;AAAA,KAC/F;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,oBAAA,CACd,OACA,gBAAA,EACQ;AACR,EAAA,IAAI,CAAC,OAAO,OAAO,CAAA;AACnB,EAAA,IAAI,CAAC,gBAAA,CAAiB,MAAA,EAAQ,OAAO,CAAA;AAErC,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AACnC,EAAA,KAAA,MAAW,CAAA,IAAK,QAAA,CAAS,KAAK,CAAA,EAAG;AAC/B,IAAA,IAAI,CAAA,CAAE,MAAA,IAAU,CAAA,IAAM,CAAA,CAAE,MAAA,IAAU,KAAK,eAAA,CAAgB,CAAA,CAAE,CAAC,CAAE,CAAA,EAAI;AAC9D,MAAA,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,WAAA,EAAa,CAAA;AAAA,IAChC;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,UAAA,CAAW,IAAA,EAAM,OAAO,CAAA;AAE7B,EAAA,MAAM,cAAA,GAAiB,gBAAA,CACpB,GAAA,CAAI,CAAC,CAAA,KAAO,CAAA,CAAE,IAAA,IAAQ,EAAa,CAAA,CACnC,IAAA,CAAK,GAAG,CAAA,CACR,WAAA,EAAY;AACf,EAAA,MAAM,eAAA,GAAkB,IAAI,GAAA,CAAI,QAAA,CAAS,cAAc,CAAC,CAAA;AAExD,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,KAAA,MAAW,KAAK,UAAA,EAAY,IAAI,gBAAgB,GAAA,CAAI,CAAC,GAAG,OAAA,IAAW,CAAA;AACnE,EAAA,OAAO,UAAU,UAAA,CAAW,IAAA;AAC9B;AAEA,SAAS,OAAO,CAAA,EAAqB;AACnC,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,KAAA,MAAW,CAAA,IAAK,CAAA,EAAG,CAAA,IAAK,CAAA,GAAI,CAAA;AAC5B,EAAA,OAAO,IAAA,CAAK,KAAK,CAAC,CAAA;AACpB;AAEA,SAAS,aAAa,CAAA,EAA8B;AAClD,EAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,EAAA,IAAI,CAAA,GAAI,OAAO,OAAO,IAAA;AACtB,EAAA,OAAO,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,IAAI,CAAC,CAAA;AAC3B;AAEA,SAAS,GAAA,CAAI,GAAa,CAAA,EAAqB;AAC7C,EAAA,MAAM,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,MAAA,EAAQ,EAAE,MAAM,CAAA;AACrC,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,OAAU,CAAA,CAAE,CAAC,CAAA,GAAK,CAAA,CAAE,CAAC,CAAA;AAC5C,EAAA,OAAO,CAAA;AACT;AAEO,SAAS,aAAa,KAAA,EAAkC;AAC7D,EAAA,MAAM,IAAI,KAAA,CAAM,SAAA;AAChB,EAAA,OAAO,KAAK,IAAA,IAAQ,KAAA,CAAM,QAAQ,CAAC,CAAA,IAAK,EAAE,MAAA,GAAS,CAAA;AACrD;AAEO,SAAS,4BAAA,CACd,cAAA,EACA,gBAAA,EACA,IAAA,GAAO,CAAA,EACC;AACR,EAAA,IAAI,cAAA,IAAkB,IAAA,IAAQ,cAAA,CAAe,MAAA,KAAW,GAAG,OAAO,CAAA;AAClE,EAAA,IAAI,CAAC,gBAAA,CAAiB,MAAA,EAAQ,OAAO,CAAA;AAErC,EAAA,MAAM,oBAAA,GAAuB,gBAAA,CAAiB,MAAA,CAAO,YAAY,CAAA;AACjE,EAAA,IAAI,CAAC,oBAAA,CAAqB,MAAA,EAAQ,OAAO,CAAA;AAEzC,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,aAAa,cAAc,CAAA;AACxC,IAAA,IAAI,CAAC,MAAM,OAAO,CAAA;AAElB,IAAA,MAAM,eAAyB,EAAC;AAChC,IAAA,KAAA,MAAW,SAAS,oBAAA,EAAsB;AACxC,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,YAAA,CAAa,KAAA,CAAM,SAAqB,CAAA;AACrD,QAAA,IAAI,CAAC,IAAA,EAAM;AACX,QAAA,YAAA,CAAa,IAAA,CAAK,KAAK,GAAA,CAAI,CAAA,EAAK,IAAI,IAAA,EAAM,IAAI,CAAC,CAAC,CAAA;AAAA,MAClD,CAAA,CAAA,MAAQ;AAAA,MAAC;AAAA,IACX;AAEA,IAAA,IAAI,CAAC,YAAA,CAAa,MAAA,EAAQ,OAAO,CAAA;AACjC,IAAA,YAAA,CAAa,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AACjC,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,aAAa,MAAM,CAAA;AAC5C,IAAA,MAAM,QAAA,GAAW,YAAA,CAAa,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,GAAI,CAAA;AACvE,IAAA,OAAO,KAAK,GAAA,CAAI,CAAA,EAAK,KAAK,GAAA,CAAI,CAAA,EAAK,QAAQ,CAAC,CAAA;AAAA,EAC9C,SAAS,CAAA,EAAG;AACV,IAAAA,IAAAA,CAAI,IAAA,CAAK,CAAA,uCAAA,EAA0C,CAAC,CAAA,CAAE,CAAA;AACtD,IAAA,OAAO,CAAA;AAAA,EACT;AACF;AAEO,SAAS,4BAAA,CACd,gBACA,gBAAA,EACQ;AACR,EAAA,IAAI,CAAC,cAAA,CAAe,MAAA,EAAQ,OAAO,CAAA;AACnC,EAAA,IAAI,CAAC,gBAAA,CAAiB,MAAA,EAAQ,OAAO,CAAA;AAErC,EAAA,MAAM,YAAY,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,KAAO,CAAA,CAAE,SAAS,CAAY,CAAA;AACpE,EAAA,MAAM,aAAa,gBAAA,CAAiB,GAAA,CAAI,CAAC,CAAA,KAAO,CAAA,CAAE,SAAS,CAAY,CAAA;AACvE,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,GAAI,SAAA,CAAU,MAAA;AAChE,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,GAAI,UAAA,CAAW,MAAA;AACnE,EAAA,IAAI,MAAA,KAAW,GAAG,OAAO,CAAA;AACzB,EAAA,OAAO,OAAA,GAAU,MAAA;AACnB;AAEO,SAAS,iBAAiB,KAAA,EAAiC;AAChE,EAAA,IAAI,QAAQ,KAAA,IAAS,KAAA,CAAM,OAAO,IAAA,IAAQ,KAAA,CAAM,OAAO,MAAA,EAAW;AAChE,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,KAAA,CAAM,EAAE,EAAE,IAAA,EAAK;AACzC,IAAA,IAAI,UAAA,KAAe,IAAI,OAAO,UAAA;AAAA,EAChC;AACA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR;AAAA,GAEF;AACF;AAEA,IAAM,eAAA,GAAkB;AAAA,EACtB,qBAAA;AAAA,EACA,aAAA;AAAA,EACA,mBAAA;AAAA,EACA,UAAA;AAAA,EACA,kCAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA;AAEO,SAAS,mBAAmB,IAAA,EAAuB;AACxD,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAK,CAAE,MAAA,IAAU,IAAI,OAAO,KAAA;AAC9C,EAAA,IAAA,GAAO,KAAK,IAAA,EAAK;AACjB,EAAA,KAAA,MAAW,WAAW,eAAA,EAAiB;AACrC,IAAA,OAAA,CAAQ,SAAA,GAAY,CAAA;AACpB,IAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,IAAA;AAAA,EACjC;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,0BAA0B,MAAA,EAAyC;AACjF,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AACnC,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,IAAI,EAAE,UAAA,EAAY,UAAA,CAAW,IAAI,MAAA,CAAO,CAAA,CAAE,UAAU,CAAC,CAAA;AAAA,EACvD;AACA,EAAA,IAAI,UAAA,CAAW,IAAA,GAAO,CAAA,EAAG,2BAAW,GAAA,EAAI;AAExC,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAyB;AACnD,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,GAAA,GAAA,CAAQ,KAAA,CAAM,IAAA,IAAQ,EAAA,EAAe,IAAA,EAAK;AAChD,IAAA,MAAM,SAAS,KAAA,CAAM,UAAA;AACrB,IAAA,IAAI,CAAC,GAAA,IAAO,CAAC,MAAA,EAAQ;AACrB,IAAA,IAAI,GAAA,CAAI,SAAS,2BAAA,EAA6B;AAC9C,IAAA,MAAM,UAAA,GAAa,IAAI,WAAA,EAAY;AACnC,IAAA,IAAI,OAAA,GAAU,aAAA,CAAc,GAAA,CAAI,UAAU,CAAA;AAC1C,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAA,uBAAc,GAAA,EAAI;AAClB,MAAA,aAAA,CAAc,GAAA,CAAI,YAAY,OAAO,CAAA;AAAA,IACvC;AACA,IAAA,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA,EAC5B;AAEA,EAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,UAAA,CAAW,OAAO,GAAG,CAAA;AACnD,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAY;AACpC,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,OAAO,CAAA,IAAK,aAAA,EAAe;AAC3C,IAAA,IAAI,OAAA,CAAQ,IAAA,IAAQ,SAAA,EAAW,WAAA,CAAY,IAAI,IAAI,CAAA;AAAA,EACrD;AAEA,EAAA,IAAI,YAAY,IAAA,EAAM;AACpB,IAAAA,IAAAA,CAAI,IAAA;AAAA,MACF,CAAA,mCAAA,EAAsC,WAAA,CAAY,IAAI,CAAA,2CAAA,EACtC,SAAA,CAAU,QAAQ,CAAC,CAAC,CAAA,CAAA,EAAI,UAAA,CAAW,IAAI,CAAA,MAAA;AAAA,KACzD;AAAA,EACF;AACA,EAAA,OAAO,WAAA;AACT;AAEA,IAAM,oBAAA,GAAuB;AAAA,EAC3B,YAAA;AAAA,EACA,mBAAA;AAAA,EACA,iBAAA;AAAA,EACA,cAAA;AAAA,EACA,sBAAA;AAAA,EACA,eAAA;AAAA,EACA,SAAA;AAAA,EACA,qBAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA;AAEO,SAAS,YAAA,CACd,KAAA,EACA,mBAAA,GAA0C,IAAA,EACjC;AACT,EAAA,MAAM,IAAA,GAAA,CAAS,KAAA,CAAM,IAAA,IAAQ,EAAA,EAAe,IAAA,EAAK;AACjD,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,IAAI,KAAK,MAAA,GAAS,EAAA,IAAM,kBAAA,CAAmB,IAAI,GAAG,OAAO,KAAA;AACzD,EAAA,IAAI,IAAA,CAAK,MAAA,GAAS,EAAA,EAAI,OAAO,IAAA;AAE7B,EAAA,IAAI,mBAAA,IAAuB,IAAA,CAAK,MAAA,IAAU,2BAAA,EAA6B;AACrE,IAAA,IAAI,oBAAoB,GAAA,CAAI,IAAA,CAAK,WAAA,EAAa,GAAG,OAAO,IAAA;AAAA,EAC1D;AAEA,EAAA,MAAM,SAAA,GAAY,KAAK,WAAA,EAAY;AACnC,EAAA,KAAA,MAAW,WAAW,oBAAA,EAAsB;AAC1C,IAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA,EAAG,OAAO,IAAA;AAAA,EACtC;AAEA,EAAA,IAAI,YAAA,GAAe,CAAA;AACnB,EAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,IAAA,IAAI,CAAC,iBAAA,CAAkB,IAAA,CAAK,CAAC,CAAA,IAAK,CAAC,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,YAAA,IAAgB,CAAA;AAAA,EACtE;AACA,EAAA,IAAI,KAAK,MAAA,GAAS,CAAA,IAAK,eAAe,IAAA,CAAK,MAAA,GAAS,KAAK,OAAO,IAAA;AAEhE,EAAA,MAAM,MAAA,GAAS,SAAS,IAAI,CAAA;AAC5B,EAAA,IAAI,MAAA,CAAO,UAAU,CAAA,EAAG;AACtB,IAAA,MAAM,WAAA,uBAAkB,GAAA,EAAoB;AAC5C,IAAA,KAAA,MAAW,CAAA,IAAK,MAAA,EAAQ,WAAA,CAAY,GAAA,CAAI,CAAA,EAAA,CAAI,YAAY,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA,IAAK,CAAC,CAAA;AACxE,IAAA,IAAI,eAAA,GAAkB,CAAA;AACtB,IAAA,KAAA,MAAW,KAAK,WAAA,CAAY,MAAA,IAAU,IAAI,CAAA,GAAI,iBAAiB,eAAA,GAAkB,CAAA;AACjF,IAAA,IAAI,eAAA,GAAkB,MAAA,CAAO,MAAA,GAAS,GAAA,EAAK,OAAO,IAAA;AAAA,EACpD;AAEA,EAAA,MAAM,KAAA,GAAS,MAAM,KAAA,IAAS,CAAA;AAC9B,EAAA,IAAI,IAAA,CAAK,MAAA,GAAS,EAAA,IAAM,KAAA,GAAQ,KAAK,OAAO,IAAA;AAC5C,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,WAAW,IAAA,EAA4B;AAC9C,EAAA,IAAI,IAAI,IAAA,KAAS,CAAA;AACjB,EAAA,OAAO,MAAM;AACX,IAAA,CAAA,GAAK,IAAI,UAAA,GAAc,CAAA;AACvB,IAAA,IAAI,IAAI,IAAA,CAAK,IAAA,CAAK,IAAK,CAAA,KAAM,EAAA,EAAK,IAAI,CAAC,CAAA;AACvC,IAAA,CAAA,GAAK,CAAA,GAAI,KAAK,IAAA,CAAK,CAAA,GAAK,MAAM,CAAA,EAAI,EAAA,GAAK,CAAC,CAAA,GAAK,CAAA;AAC7C,IAAA,OAAA,CAAA,CAAS,CAAA,GAAK,CAAA,KAAM,EAAA,MAAS,CAAA,IAAK,UAAA;AAAA,EACpC,CAAA;AACF;AAEA,SAAS,OAAA,CAAQ,GAAa,CAAA,EAAqB;AACjD,EAAA,MAAM,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,MAAA,EAAQ,EAAE,MAAM,CAAA;AACrC,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAK,EAAE,CAAC,CAAA;AACrB,IAAA,CAAA,IAAK,CAAA,GAAI,CAAA;AAAA,EACX;AACA,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,QAAQ,IAAA,EAAkB,SAAA,EAAmB,IAAA,GAAO,EAAA,EAAI,UAAU,EAAA,EAAc;AACvF,EAAA,MAAM,IAAI,IAAA,CAAK,MAAA;AACf,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,CAAC,CAAA,CAAG,MAAA;AACrB,EAAA,MAAM,GAAA,GAAM,WAAW,IAAI,CAAA;AAC3B,EAAA,MAAM,YAAwB,EAAC;AAC/B,EAAA,SAAA,CAAU,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,GAAA,KAAQ,CAAC,CAAC,CAAA,CAAG,KAAA,EAAO,CAAA;AAEnD,EAAA,OAAO,SAAA,CAAU,SAAS,SAAA,EAAW;AACnC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM;AAC5B,MAAA,IAAI,GAAA,GAAM,QAAA;AACV,MAAA,KAAA,MAAW,CAAA,IAAK,WAAW,GAAA,GAAM,IAAA,CAAK,IAAI,GAAA,EAAK,OAAA,CAAQ,CAAA,EAAG,CAAC,CAAC,CAAA;AAC5D,MAAA,OAAO,GAAA;AAAA,IACT,CAAC,CAAA;AACD,IAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AAC3C,IAAA,IAAI,IAAA,GAAO,GAAA,EAAI,IAAK,GAAA,IAAO,CAAA,CAAA;AAC3B,IAAA,IAAI,MAAM,CAAA,GAAI,CAAA;AACd,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,MAAA,IAAA,IAAQ,MAAM,CAAC,CAAA;AACf,MAAA,IAAI,QAAQ,CAAA,EAAG;AACb,QAAA,GAAA,GAAM,CAAA;AACN,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,SAAA,CAAU,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,CAAG,OAAO,CAAA;AAAA,EACnC;AAEA,EAAA,MAAM,SAAS,IAAI,KAAA,CAAc,CAAC,CAAA,CAAE,KAAK,CAAC,CAAA;AAC1C,EAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,OAAA,EAAS,IAAA,EAAA,EAAQ;AACzC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,MAAA,IAAI,IAAA,GAAO,CAAA;AACX,MAAA,IAAI,KAAA,GAAQ,QAAA;AACZ,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,EAAW,CAAA,EAAA,EAAK;AAClC,QAAA,MAAM,IAAI,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAI,SAAA,CAAU,CAAC,CAAE,CAAA;AACzC,QAAA,IAAI,IAAI,KAAA,EAAO;AACb,UAAA,KAAA,GAAQ,CAAA;AACR,UAAA,IAAA,GAAO,CAAA;AAAA,QACT;AAAA,MACF;AACA,MAAA,MAAA,CAAO,CAAC,CAAA,GAAI,IAAA;AAAA,IACd;AACA,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,EAAE,QAAQ,SAAA,EAAU,EAAG,MAAM,IAAI,KAAA,CAAc,GAAG,CAAA,CAAE,IAAA,CAAK,CAAC,CAAC,CAAA;AACnF,IAAA,MAAM,SAAS,IAAI,KAAA,CAAc,SAAS,CAAA,CAAE,KAAK,CAAC,CAAA;AAClD,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,MAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,MAAA,MAAA,CAAO,CAAC,CAAA,IAAM,CAAA;AACd,MAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,MAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,MAAA,KAAA,IAAS,CAAA,GAAI,GAAG,CAAA,GAAI,GAAA,EAAK,KAAK,GAAA,CAAI,CAAC,CAAA,IAAM,GAAA,CAAI,CAAC,CAAA;AAAA,IAChD;AACA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,EAAW,CAAA,EAAA,EAAK;AAClC,MAAA,IAAI,CAAC,MAAA,CAAO,CAAC,CAAA,EAAG;AAChB,MAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,MAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,MAAA,SAAA,CAAU,CAAC,CAAA,GAAI,GAAA,CAAI,IAAI,CAAC,CAAA,KAAM,IAAI,CAAC,CAAA;AAAA,IACrC;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,wBAAwB,MAAA,EAAoD;AAC1F,EAAA,MAAM,CAAC,MAAM,CAAA,GAAI,+BAAA,CAAgC,MAAM,CAAA;AACvD,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,gCACd,MAAA,EAC0C;AAC1C,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,IAAA,CAAK,YAAY,CAAA;AAE9C,EAAA,IAAI,CAAC,MAAA,CAAO,MAAA,IAAU,CAAC,aAAA,EAAe;AACpC,IAAA,OAAO;AAAA,MACL,EAAC;AAAA,MACD;AAAA,QACE,SAAA,EAAW,KAAA;AAAA,QACX,MAAA,EAAQ,MAAA,CAAO,MAAA,GAAS,eAAA,GAAkB,WAAA;AAAA,QAC1C,YAAA,EAAc,CAAA;AAAA,QACd,UAAA,EAAY;AAAA;AACd,KACF;AAAA,EACF;AAEA,EAAA,MAAM,aAAyB,EAAC;AAChC,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,IAAI,CAAC,YAAA,CAAa,CAAC,CAAA,EAAG;AACtB,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,CAAA,CAAE,SAAqB,CAAA;AACnD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,IAAI;AACF,MAAA,QAAA,CAAS,IAAA,CAAK,gBAAA,CAAiB,CAAC,CAAC,CAAA;AACjC,MAAA,UAAA,CAAW,KAAK,MAAM,CAAA;AAAA,IACxB,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX;AAEA,EAAA,MAAM,cAAc,UAAA,CAAW,MAAA;AAC/B,EAAA,IAAI,cAAc,CAAA,EAAG;AACnB,IAAA,OAAO,CAAC,EAAC,EAAG,EAAE,SAAA,EAAW,KAAA,EAAO,MAAA,EAAQ,oBAAA,EAAsB,YAAA,EAAc,WAAA,EAAa,UAAA,EAAY,CAAA,EAAG,CAAA;AAAA,EAC1G;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,WAAA,GAAc,EAAE,CAAC,CAAC,CAAA;AACvE,IAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,UAAA,EAAY,SAAA,EAAW,EAAE,CAAA;AACvD,IAAA,MAAM,aAAqC,EAAC;AAC5C,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,MAAA,UAAA,CAAW,QAAA,CAAS,CAAC,CAAE,CAAA,GAAI,cAAc,CAAC,CAAA;AAAA,IAC5C;AACA,IAAA,OAAO;AAAA,MACL,UAAA;AAAA,MACA,EAAE,WAAW,IAAA,EAAM,MAAA,EAAQ,WAAW,YAAA,EAAc,WAAA,EAAa,YAAY,SAAA;AAAU,KACzF;AAAA,EACF,SAAS,CAAA,EAAG;AACV,IAAAA,IAAAA,CAAI,IAAA,CAAK,CAAA,iCAAA,EAAoC,CAAC,CAAA,CAAE,CAAA;AAChD,IAAA,OAAO;AAAA,MACL,EAAC;AAAA,MACD;AAAA,QACE,SAAA,EAAW,KAAA;AAAA,QACX,MAAA,EAAQ,qBAAqB,MAAA,CAAO,CAAC,EAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AAAA,QACnD,YAAA,EAAc,WAAA;AAAA,QACd,UAAA,EAAY;AAAA;AACd,KACF;AAAA,EACF;AACF;AAEO,SAAS,6BAAA,CACd,QACA,aAAA,EACQ;AACR,EAAA,IAAI,CAAC,aAAA,IAAiB,CAAC,MAAA,CAAO,IAAA,CAAK,aAAa,CAAA,CAAE,MAAA,IAAU,CAAC,MAAA,CAAO,MAAA,EAAQ,OAAO,CAAA;AAEnF,EAAA,IAAI;AACF,IAAA,MAAM,WAAqB,EAAC;AAC5B,IAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,iBAAiB,CAAC,CAAA;AAClC,QAAA,IAAI,WAAW,aAAA,EAAe,QAAA,CAAS,IAAA,CAAK,aAAA,CAAc,OAAO,CAAE,CAAA;AAAA,MACrE,CAAA,CAAA,MAAQ;AAAA,MAAC;AAAA,IACX;AACA,IAAA,IAAI,CAAC,QAAA,CAAS,MAAA,EAAQ,OAAO,CAAA;AAE7B,IAAA,MAAM,aAAA,uBAAoB,GAAA,EAAoB;AAC9C,IAAA,KAAA,MAAW,EAAA,IAAM,QAAA,EAAU,aAAA,CAAc,GAAA,CAAI,EAAA,EAAA,CAAK,cAAc,GAAA,CAAI,EAAE,CAAA,IAAK,CAAA,IAAK,CAAC,CAAA;AACjF,IAAA,MAAM,YAAY,aAAA,CAAc,IAAA;AAChC,IAAA,MAAM,QAAQ,QAAA,CAAS,MAAA;AACvB,IAAA,IAAI,SAAA,IAAa,GAAG,OAAO,CAAA;AAE3B,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,KAAA,MAAW,KAAA,IAAS,aAAA,CAAc,MAAA,EAAO,EAAG;AAC1C,MAAA,MAAM,IAAI,KAAA,GAAQ,KAAA;AAClB,MAAA,OAAA,IAAW,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,CAAA,GAAI,KAAK,CAAA;AAAA,IACpC;AACA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA;AACtC,IAAA,MAAM,UAAA,GAAa,UAAA,GAAa,CAAA,GAAI,OAAA,GAAU,UAAA,GAAa,CAAA;AAC3D,IAAA,OAAO,UAAA;AAAA,EACT,SAAS,CAAA,EAAG;AACV,IAAAA,IAAAA,CAAI,IAAA,CAAK,CAAA,gCAAA,EAAmC,CAAC,CAAA,CAAE,CAAA;AAC/C,IAAA,OAAO,CAAA;AAAA,EACT;AACF;AAEO,SAAS,aAAA,CAAc,QAA4B,aAAA,EAA+C;AACvG,EAAA,IAAI,CAAC,iBAAiB,CAAC,MAAA,CAAO,KAAK,aAAa,CAAA,CAAE,QAAQ,OAAO,CAAA;AACjE,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AACnC,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,iBAAiB,CAAC,CAAA;AAClC,MAAA,IAAI,WAAW,aAAA,EAAe,UAAA,CAAW,GAAA,CAAI,aAAA,CAAc,OAAO,CAAE,CAAA;AAAA,IACtE,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX;AACA,EAAA,OAAO,UAAA,CAAW,IAAA;AACpB;AAEO,SAAS,wBAAA,CACd,cAAA,EACA,gBAAA,EACA,aAAA,EACQ;AACR,EAAA,IAAI,CAAC,iBAAiB,CAAC,MAAA,CAAO,KAAK,aAAa,CAAA,CAAE,QAAQ,OAAO,CAAA;AACjE,EAAA,MAAM,SAAA,GAAY,aAAA,CAAc,cAAA,EAAgB,aAAa,CAAA;AAC7D,EAAA,MAAM,WAAA,GAAc,aAAA,CAAc,gBAAA,EAAkB,aAAa,CAAA;AACjE,EAAA,IAAI,SAAA,KAAc,GAAG,OAAO,CAAA;AAC5B,EAAA,OAAO,WAAA,GAAc,SAAA;AACvB;AAEA,SAAS,SAAS,CAAA,EAA+C;AAC/D,EAAA,OAAO,CAAC,EAAE,CAAA,CAAE,KAAA,IAAS,CAAA,CAAA,EAAc,MAAA,CAAO,CAAA,CAAE,UAAA,IAAc,EAAE,CAAA,EAAG,gBAAA,CAAiB,CAAC,CAAC,CAAA;AACpF;AAEA,SAAS,WAAA,CAAY,GAAqB,CAAA,EAA6B;AACrE,EAAA,MAAM,EAAA,GAAK,SAAS,CAAC,CAAA;AACrB,EAAA,MAAM,EAAA,GAAK,SAAS,CAAC,CAAA;AACrB,EAAA,IAAI,EAAA,CAAG,CAAC,CAAA,KAAM,EAAA,CAAG,CAAC,CAAA,EAAG,OAAO,EAAA,CAAG,CAAC,CAAA,GAAI,EAAA,CAAG,CAAC,CAAA;AACxC,EAAA,IAAI,GAAG,CAAC,CAAA,GAAI,EAAA,CAAG,CAAC,GAAG,OAAO,EAAA;AAC1B,EAAA,IAAI,GAAG,CAAC,CAAA,GAAI,EAAA,CAAG,CAAC,GAAG,OAAO,CAAA;AAC1B,EAAA,IAAI,GAAG,CAAC,CAAA,GAAI,EAAA,CAAG,CAAC,GAAG,OAAO,EAAA;AAC1B,EAAA,IAAI,GAAG,CAAC,CAAA,GAAI,EAAA,CAAG,CAAC,GAAG,OAAO,CAAA;AAC1B,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,OAAO,EAAA,EAAsB;AACpC,EAAA,IAAI,CAAC,EAAA,CAAG,MAAA,EAAQ,OAAO,GAAA;AACvB,EAAA,MAAM,CAAA,GAAI,CAAC,GAAG,EAAE,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AACtC,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,SAAS,CAAC,CAAA;AACnC,EAAA,IAAI,CAAA,CAAE,MAAA,GAAS,CAAA,EAAG,OAAO,EAAE,GAAG,CAAA;AAC9B,EAAA,OAAA,CAAQ,EAAE,GAAA,GAAM,CAAC,CAAA,GAAK,CAAA,CAAE,GAAG,CAAA,IAAM,CAAA;AACnC;AAEA,SAAS,GAAA,CAAO,MAAA,EAAiC,GAAA,EAAa,QAAA,EAAgB;AAC5E,EAAA,OAAO,GAAA,IAAO,MAAA,GAAU,MAAA,CAAO,GAAG,CAAA,GAAU,QAAA;AAC9C;AAIO,IAAM,yBAAA,GAAN,MAAM,0BAAA,CAA0B;AAAA,EAiBrC,aAAa,iBACX,MAAA,EACA,YAAA,EACA,mBACA,KAAA,EACA,YAAA,GAAe,OACf,cAAA,EACyF;AACzF,IAAA,MAAM,MAAA,GAAS,qBAAqB,EAAC;AAErC,IAAA,IAAI,CAAC,GAAA,CAAI,MAAA,EAAQ,SAAA,EAAW,IAAI,CAAA,EAAG;AACjC,MAAAA,IAAAA,CAAI,KAAK,kCAAkC,CAAA;AAC3C,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,OAAO,EAAE,QAAQ,MAAA,EAAQ,EAAE,qBAAqB,KAAA,EAAO,MAAA,EAAQ,sBAAqB,EAAE;AAAA,MACxF;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,IAAI,CAAC,OAAO,MAAA,EAAQ;AAClB,MAAAA,IAAAA,CAAI,KAAK,qCAAqC,CAAA;AAC9C,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,OAAO,EAAE,QAAQ,MAAA,EAAQ,EAAE,qBAAqB,KAAA,EAAO,MAAA,EAAQ,aAAY,EAAE;AAAA,MAC/E;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,4BAA4B,MAAA,CAAO,MAAA;AACzC,IAAA,IAAI,aAAA,GAAgB,CAAA;AAEpB,IAAA,IAAI,GAAA,CAAI,MAAA,EAAQ,cAAA,EAAgB,IAAI,CAAA,EAAG;AACrC,MAAA,MAAM,cAAA,GAAiB,0BAA0B,MAAM,CAAA;AACvD,MAAA,MAAA,GAAS,MAAA,CAAO,OAAO,CAAC,CAAA,KAAM,CAAC,YAAA,CAAa,CAAA,EAAG,cAAc,CAAC,CAAA;AAC9D,MAAA,aAAA,GAAgB,4BAA4B,MAAA,CAAO,MAAA;AACnD,MAAA,IAAI,gBAAgB,CAAA,EAAG;AACrB,QAAAA,IAAAA,CAAI,IAAA;AAAA,UACF,CAAA,kCAAA,EAAqC,aAAa,CAAA,CAAA,EAAI,yBAAyB,CAAA,aAAA;AAAA,SACjF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,OAAO,MAAA,EAAQ;AAClB,MAAAA,IAAAA,CAAI,KAAK,4CAA4C,CAAA;AACrD,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,OAAO;AAAA,UACL,MAAA;AAAA,UACA,QAAQ,EAAE,mBAAA,EAAqB,MAAM,MAAA,EAAQ,WAAA,EAAa,gBAAgB,aAAA;AAAc,SAC1F;AAAA,MACF;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,2BAA2B,MAAA,CAAO,MAAA;AAExC,IAAA,MAAM,mBAA6B,EAAC;AACpC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,MAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,MAAA,MAAM,KAAA,GAAQ,IAAA,IAAQ,CAAA,IAAK,CAAA,CAAE,OAAO,IAAA,IAAQ,CAAA,CAAE,EAAA,KAAO,MAAA,IAAa,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA,CAAE,MAAK,KAAM,EAAA;AAC1F,MAAA,IAAI,CAAC,KAAA,EAAO,gBAAA,CAAiB,IAAA,CAAK,CAAC,CAAA;AAAA,IACrC;AACA,IAAA,IAAI,iBAAiB,MAAA,EAAQ;AAC3B,MAAA,MAAM,QAAA,GACJ,CAAA,iEAAA,EACsB,gBAAA,CAAiB,MAAM,IAAI,MAAA,CAAO,MAAM,CAAA,kBAAA,EAAqB,gBAAA,CAAiB,MAAM,CAAA,EAAG,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,sFAAA,CAAA;AAE3H,MAAAA,IAAAA,CAAI,KAAA,CAAM,CAAA,cAAA,EAAiB,QAAQ,CAAA,CAAE,CAAA;AACrC,MAAA,MAAM,IAAI,MAAM,QAAQ,CAAA;AAAA,IAC1B;AAEA,IAAA,MAAM,+BAAe,IAAI,GAAA,CAAI,CAAC,sBAAA,EAAwB,qBAAA,EAAuB,OAAO,CAAC,CAAA;AACrF,IAAA,MAAA,GAAS,OAAO,GAAA,CAAI,CAAC,OAAO,EAAE,GAAG,GAAE,CAAE,CAAA;AACrC,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,gBAAgB,KAAA,CAAM,kBAAA;AAC5B,MAAA,IAAI,EAAE,aAAA,IAAiB,KAAA,CAAA,IAAU,CAAC,YAAA,CAAa,GAAA,CAAI,aAAuB,CAAA,EAAG;AAC3E,QAAA,MAAM,CAAC,OAAOsD,OAAM,CAAA,GAAI,qBAAsB,KAAA,CAAM,IAAA,IAAQ,IAAe,IAAI,CAAA;AAC/E,QAAA,KAAA,CAAM,WAAA,GAAc,KAAA;AACpB,QAAA,KAAA,CAAM,kBAAA,GAAqBA,OAAAA;AAAA,MAC7B;AAAA,IACF;AAEA,IAAA,MAAM,aAAA,GAAgB,OAAO,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAK,CAAA,CAAE,WAAA,EAAwB,CAAC,CAAA;AAC9E,IAAA,MAAM,gBAAgB,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,uBAAuB,qBAAqB,CAAA;AAEvF,IAAA,MAAM,aAAa,MAAA,CAChB,KAAA,CAAM,GAAG,CAAC,CAAA,CACV,IAAI,CAAC,CAAA,KAAA,CAAQ,CAAA,CAAE,IAAA,IAAQ,IAAe,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,CACnD,KAAK,GAAG,CAAA;AACX,IAAA,IAAI,UAAA,GAAa,GAAA,CAAI,MAAA,EAAQ,eAAA,EAAiB,GAAG,CAAA;AAEjD,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,GAAG,CAAA;AACrC,MAAAtD,IAAAA,CAAI,KAAK,uFAAuF,CAAA;AAAA,IAClG;AAEA,IAAA,MAAM,YAAA,GAAe,kBAAA,CAAmB,UAAA,EAAY,UAAU,CAAA;AAC9D,IAAA,MAAM,eAAA,GAAkB,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,YAAA,GAAe,YAAY,CAAC,CAAA;AAE3E,IAAAA,IAAAA,CAAI,IAAA;AAAA,MACF,CAAA,6BAAA,EAAgC,aAAa,OAAA,CAAQ,CAAC,CAAC,CAAA,UAAA,EAC1C,YAAY,sBAAsB,eAAe,CAAA,CAAA;AAAA,KAChE;AAEA,IAAA,IAAI,iBAAiB,eAAA,EAAiB;AACpC,MAAAA,IAAAA,CAAI,IAAA;AAAA,QACF,6BAA6B,aAAa,CAAA,CAAA,EAAI,eAAe,CAAA,SAAA,EAAY,OAAO,MAAM,CAAA,QAAA;AAAA,OACxF;AACA,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,OAAO;AAAA,UACL,MAAA;AAAA,UACA,MAAA,EAAQ;AAAA,YACN,mBAAA,EAAqB,KAAA;AAAA,YACrB,MAAA,EAAQ,eAAA;AAAA,YACR,mCAAA,EAAqC,yBAAA;AAAA,YACrC,uBAAuB,yBAAA,GAA4B,wBAAA;AAAA,YACnD,eAAA,EAAiB,wBAAA;AAAA,YACjB,eAAA,EAAiB,aAAA;AAAA,YACjB,aAAA,EAAe,YAAA;AAAA,YACf,gBAAA,EAAkB,eAAA;AAAA,YAClB,aAAA,EAAe;AAAA;AACjB,SACF;AAAA,MACF;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAAA,IAAAA,CAAI,IAAA;AAAA,MACF,CAAA,sBAAA,EAAyB,aAAa,CAAA,QAAA,EAAM,eAAe,CAAA,SAAA,EACrD,MAAA,CAAO,MAAM,CAAA,SAAA,EAAA,CAAa,aAAA,GAAgB,eAAA,EAAiB,OAAA,CAAQ,CAAC,CAAC,CAAA,OAAA;AAAA,KAC7E;AAEA,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,EAAQ,QAAA,EAAU,MAAM,CAAA;AAC3C,IAAA,IAAI,MAAA;AAEJ,IAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,MAAA,MAAA,GAAS,MAAM,0BAAA,CAA0B,YAAA;AAAA,QACvC,MAAA;AAAA,QACA,eAAA;AAAA,QACA,MAAA;AAAA,QACA,KAAA,IAAS,IAAA;AAAA,QACT,YAAA;AAAA,QACA,cAAA,IAAkB,IAAA;AAAA,QAClB,yBAAA;AAAA,QACA,wBAAA;AAAA,QACA,YAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAA,MAAA,IAAW,WAAW,SAAA,EAAW;AAC/B,MAAA,MAAM,CAAC,aAAA,EAAe,cAAc,CAAA,GAAI,gCAAgC,MAAM,CAAA;AAC9E,MAAA,MAAM,UAAA,GAAa,0BAAA,CAA0B,gBAAA,CAAiB,MAAA,EAAQ,iBAAiB,aAAa,CAAA;AACpG,MAAA,MAAA,GAAS,eACL,0BAAA,CAA0B,WAAA;AAAA,QACxB,UAAA;AAAA,QACA,MAAA;AAAA,QACA,aAAA;AAAA,QACA,SAAA;AAAA,QACA,KAAA,IAAS,IAAA;AAAA,QACT,YAAA;AAAA,QACA,yBAAA;AAAA,QACA,wBAAA;AAAA,QACA,cAAA,IAAkB,IAAA;AAAA,QAClB,YAAA;AAAA,QACA;AAAA,OACF,GACA,UAAA;AAAA,IACN,CAAA,MAAA,IAAW,WAAW,OAAA,EAAS;AAC7B,MAAA,MAAM,CAAC,aAAA,EAAe,cAAc,CAAA,GAAI,gCAAgC,MAAM,CAAA;AAC9E,MAAA,MAAM,UAAA,GAAa,MAAM,0BAAA,CAA0B,mBAAA;AAAA,QACjD,MAAA;AAAA,QACA,eAAA;AAAA,QACA,GAAA,CAAI,MAAA,EAAQ,sBAAA,EAAwB,IAAI;AAAA,OAC1C;AACA,MAAA,MAAA,GAAS,eACL,0BAAA,CAA0B,WAAA;AAAA,QACxB,UAAA;AAAA,QACA,MAAA;AAAA,QACA,aAAA;AAAA,QACA,OAAA;AAAA,QACA,KAAA,IAAS,IAAA;AAAA,QACT,YAAA;AAAA,QACA,yBAAA;AAAA,QACA,wBAAA;AAAA,QACA,cAAA,IAAkB,IAAA;AAAA,QAClB,YAAA;AAAA,QACA;AAAA,OACF,GACA,UAAA;AAAA,IACN,CAAA,MAAO;AACL,MAAAA,IAAAA,CAAI,IAAA,CAAK,CAAA,8BAAA,EAAiC,MAAM,CAAA,gBAAA,CAAkB,CAAA;AAClE,MAAA,MAAM,CAAC,aAAA,EAAe,cAAc,CAAA,GAAI,gCAAgC,MAAM,CAAA;AAC9E,MAAA,MAAM,UAAA,GAAa,0BAAA,CAA0B,gBAAA,CAAiB,MAAA,EAAQ,iBAAiB,aAAa,CAAA;AACpG,MAAA,MAAA,GAAS,eACL,0BAAA,CAA0B,WAAA;AAAA,QACxB,UAAA;AAAA,QACA,MAAA;AAAA,QACA,aAAA;AAAA,QACA,kBAAA;AAAA,QACA,KAAA,IAAS,IAAA;AAAA,QACT,YAAA;AAAA,QACA,yBAAA;AAAA,QACA,wBAAA;AAAA,QACA,cAAA,IAAkB,IAAA;AAAA,QAClB,YAAA;AAAA,QACA;AAAA,OACF,GACA,UAAA;AAAA,IACN;AAEA,IAAA,IAAI,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,IAAY,CAAC,MAAM,OAAA,CAAQ,MAAM,CAAA,IAAK,QAAA,IAAY,MAAA,EAAQ;AACxF,MAAA,MAAA,CAAO,SAAS,0BAAA,CAA0B,sBAAA;AAAA,QACxC,MAAA,CAAO,MAAA;AAAA,QACP,MAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAA,GAAS,0BAAA,CAA0B,sBAAA;AAAA,QACjC,MAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,aAAa,YAAA,CACX,MAAA,EACA,eAAA,EACA,MAAA,EACA,OACA,YAAA,GAAe,KAAA,EACf,cAAA,GAAkC,IAAA,EAClC,4BAA4B,CAAA,EAC5B,wBAAA,GAA2B,GAC3B,YAAA,GAAe,CAAA,EACf,eAAe,GAAA,EAC0E;AACzF,IAAA,IAAI,yBAAA,KAA8B,CAAA,EAAG,yBAAA,GAA4B,MAAA,CAAO,MAAA;AACxE,IAAA,IAAI,wBAAA,KAA6B,CAAA,EAAG,wBAAA,GAA2B,MAAA,CAAO,MAAA;AACtE,IAAA,IAAI,YAAA,KAAiB,GAAG,YAAA,GAAe,eAAA;AAEvC,IAAA,MAAM,CAAC,aAAA,EAAe,cAAc,CAAA,GAAI,gCAAgC,MAAM,CAAA;AAC9E,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,aAAa,CAAA,CAAE,MAAA,EAAQ;AACrC,MAAAA,IAAAA,CAAI,IAAA;AAAA,QACF,CAAA,yBAAA,EAA4B,cAAA,CAAe,UAAU,CAAA,wBAAA,EAC3C,eAAe,YAAY,CAAA,WAAA;AAAA,OACvC;AAAA,IACF,CAAA,MAAO;AACL,MAAAA,IAAAA,CAAI,IAAA,CAAK,CAAA,sCAAA,EAAyC,cAAA,CAAe,MAAM,CAAA,CAAE,CAAA;AAAA,IAC3E;AAEA,IAAA,MAAM,MAAA,GAAS,0BAAA,CAA0B,gBAAA,CAAiB,MAAA,EAAQ,iBAAiB,aAAa,CAAA;AAChG,IAAA,MAAM,YAAA,GAAe,OAAO,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAK,CAAA,CAAE,WAAA,EAAwB,CAAC,CAAA;AAI7E,IAAA,IAAI,MAAA,CAAO,MAAA,KAAW,MAAA,CAAO,MAAA,EAAQ;AACnC,MAAAA,IAAAA,CAAI,IAAA;AAAA,QACF,mCAAmC,MAAA,CAAO,MAAM,IAAI,MAAA,CAAO,MAAM,iBAAiB,YAAY,CAAA,OAAA;AAAA,OAChG;AACA,MAAA,MAAMuD,WAAU,0BAAA,CAA0B,eAAA;AAAA,QACxC,MAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA;AAAA,QACA,KAAA;AAAA,QACA,eAAA;AAAA,QACA,aAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,OAAO,0BAAA,CAA0B,WAAA;AAAA,UAC/BA,QAAAA;AAAA,UACA,MAAA;AAAA,UACA,aAAA;AAAA,UACA,SAAA;AAAA,UACA,KAAA;AAAA,UACA,YAAA;AAAA,UACA,yBAAA;AAAA,UACA,wBAAA;AAAA,UACA,cAAA;AAAA,UACA,YAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AACA,MAAA,OAAOA,QAAAA;AAAA,IACT;AAEA,IAAAvD,IAAAA,CAAI,KAAK,6DAA6D,CAAA;AACtE,IAAA,MAAM,OAAA,GAAU,MAAM,0BAAA,CAA0B,yBAAA;AAAA,MAC9C,MAAA;AAAA,MACA,eAAA;AAAA,MACA,GAAA,CAAI,MAAA,EAAQ,sBAAA,EAAwB,IAAI;AAAA,KAC1C;AACA,IAAA,MAAM,aAAA,GAAgB,QAAQ,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAK,CAAA,CAAE,WAAA,EAAwB,CAAC,CAAA;AAC/E,IAAAA,IAAAA,CAAI,IAAA;AAAA,MACF,iCAAiC,OAAA,CAAQ,MAAM,IAAI,MAAA,CAAO,MAAM,iBAAiB,aAAa,CAAA,OAAA;AAAA,KAChG;AACA,IAAA,MAAM,UAAU,0BAAA,CAA0B,eAAA;AAAA,MACxC,OAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,KAAA;AAAA,MACA,eAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,OAAO,0BAAA,CAA0B,WAAA;AAAA,QAC/B,OAAA;AAAA,QACA,MAAA;AAAA,QACA,aAAA;AAAA,QACA,OAAA;AAAA,QACA,KAAA;AAAA,QACA,YAAA;AAAA,QACA,yBAAA;AAAA,QACA,wBAAA;AAAA,QACA,cAAA;AAAA,QACA,YAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,OAAO,gBAAA,CACL,MAAA,EACA,YAAA,EACA,gBAA+C,IAAA,EAC3B;AACpB,IAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAQ,OAAO,EAAC;AAC5B,IAAA,IAAI,aAAA,IAAiB,MAAA,CAAO,IAAA,CAAK,aAAa,EAAE,MAAA,EAAQ;AACtD,MAAA,OAAO,0BAAA,CAA0B,mBAAA,CAAoB,MAAA,EAAQ,YAAA,EAAc,aAAa,CAAA;AAAA,IAC1F;AACA,IAAA,OAAO,0BAAA,CAA0B,eAAA,CAAgB,MAAA,EAAQ,YAAY,CAAA;AAAA,EACvE;AAAA,EAEA,OAAO,eAAA,CAAgB,MAAA,EAA4B,YAAA,EAA0C;AAC3F,IAAA,MAAM,eAAe,CAAC,GAAG,MAAM,CAAA,CAAE,KAAK,WAAW,CAAA;AACjD,IAAA,MAAM,WAA+B,EAAC;AACtC,IAAA,IAAI,eAAA,GAAkB,YAAA;AACtB,IAAA,IAAI,cAAA,GAAgC,IAAA;AAEpC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,YAAA,CAAa,QAAQ,CAAA,EAAA,EAAK;AAC5C,MAAA,MAAM,KAAA,GAAQ,aAAa,CAAC,CAAA;AAC5B,MAAA,MAAM,WAAA,GAAe,MAAM,WAAA,IAAe,CAAA;AAC1C,MAAA,IAAI,mBAAmB,WAAA,EAAa;AAClC,QAAA,QAAA,CAAS,KAAK,KAAK,CAAA;AACnB,QAAA,eAAA,IAAmB,WAAA;AAAA,MACrB,CAAA,MAAO;AACL,QAAA,cAAA,GAAiB,CAAA;AACjB,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,cAAA,KAAmB,IAAA,IAAQ,eAAA,GAAkB,CAAA,EAAG;AAClD,MAAA,MAAM,eAAA,GAAkB,YAAA,CAAa,KAAA,CAAM,cAAc,CAAA;AACzD,MAAA,eAAA,CAAgB,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AAC7B,QAAA,MAAM,EAAA,GAAM,EAAE,WAAA,IAAe,CAAA;AAC7B,QAAA,MAAM,EAAA,GAAM,EAAE,WAAA,IAAe,CAAA;AAC7B,QAAA,IAAI,EAAA,KAAO,EAAA,EAAI,OAAO,EAAA,GAAK,EAAA;AAC3B,QAAA,OAAO,EAAG,CAAA,CAAE,KAAA,IAAS,CAAA,CAAA,IAAkB,EAAE,KAAA,IAAS,CAAA,CAAA;AAAA,MACpD,CAAC,CAAA;AACD,MAAA,KAAA,MAAW,SAAS,eAAA,EAAiB;AACnC,QAAA,MAAM,WAAA,GAAe,MAAM,WAAA,IAAe,CAAA;AAC1C,QAAA,IAAI,mBAAmB,WAAA,EAAa;AAClC,UAAA,QAAA,CAAS,KAAK,KAAK,CAAA;AACnB,UAAA,eAAA,IAAmB,WAAA;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,CAAA,IAAM,CAAA,CAAE,WAAA,IAAe,CAAA,CAAA,EAAe,CAAC,CAAA;AACrF,IAAAA,IAAAA,CAAI,IAAA;AAAA,MACF,CAAA,oBAAA,EAAuB,SAAS,MAAM,CAAA,CAAA,EAAI,OAAO,MAAM,CAAA,SAAA,EAAY,WAAW,CAAA,CAAA,EAAI,YAAY,CAAA,OAAA;AAAA,KAChG;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,OAAO,mBAAA,CACL,MAAA,EACA,YAAA,EACA,aAAA,EACoB;AACpB,IAAA,MAAM,QAAA,uBAAe,GAAA,EAAgC;AAErD,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,iBAAiB,KAAK,CAAA;AACtC,QAAA,MAAM,SAAA,GAAY,aAAA,CAAc,OAAO,CAAA,IAAK,CAAA,CAAA;AAC5C,QAAA,IAAI,IAAA,GAAO,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AACjC,QAAA,IAAI,CAAC,IAAA,EAAM;AACT,UAAA,IAAA,GAAO,EAAC;AACR,UAAA,QAAA,CAAS,GAAA,CAAI,WAAW,IAAI,CAAA;AAAA,QAC9B;AACA,QAAA,IAAA,CAAK,KAAK,KAAK,CAAA;AAAA,MACjB,CAAA,CAAA,MAAQ;AACN,QAAAA,IAAAA,CAAI,KAAA;AAAA,UACF,0FACqB,KAAA,CAAM,IAAA,IAAQ,IAAe,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,SAChE;AACA,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SAEF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,QAAQ,QAAA,CAAS,MAAA,EAAO,EAAG,IAAA,CAAK,KAAK,WAAW,CAAA;AAE3D,IAAA,MAAM,WAA+B,EAAC;AACtC,IAAA,IAAI,WAAA,GAAc,CAAA;AAClB,IAAA,MAAM,UAAA,GAAa,CAAC,GAAG,QAAA,CAAS,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACrD,MAAA,MAAM,GAAA,GAAM,CAAA,KAAM,EAAA,GAAK,CAAA,GAAI,CAAA;AAC3B,MAAA,MAAM,GAAA,GAAM,CAAA,KAAM,EAAA,GAAK,CAAA,GAAI,CAAA;AAC3B,MAAA,OAAO,GAAA,GAAM,OAAO,CAAA,GAAI,CAAA;AAAA,IAC1B,CAAC,CAAA;AACD,IAAA,MAAM,cAAA,GAAiB,IAAI,GAAA,CAAoB,UAAA,CAAW,GAAA,CAAI,CAAC,EAAA,KAAO,CAAC,EAAA,EAAI,CAAC,CAAC,CAAC,CAAA;AAC9E,IAAA,MAAM,gBAAA,uBAAuB,GAAA,EAAY;AAEzC,IAAA,OAAO,cAAc,YAAA,EAAc;AACjC,MAAA,IAAI,QAAA,GAAW,KAAA;AACf,MAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,QAAA,IAAI,GAAA,GAAM,cAAA,CAAe,GAAA,CAAI,SAAS,CAAA;AACtC,QAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AAC5C,QAAA,IAAI,GAAA,IAAO,cAAc,MAAA,EAAQ;AAEjC,QAAA,IAAI,QAAA,GAAW,KAAA;AACf,QAAA,OAAO,GAAA,GAAM,cAAc,MAAA,EAAQ;AACjC,UAAA,MAAM,KAAA,GAAQ,cAAc,GAAG,CAAA;AAC/B,UAAA,MAAM,WAAA,GAAe,MAAM,WAAA,IAAe,CAAA;AAC1C,UAAA,IAAI,WAAA,GAAc,eAAe,YAAA,EAAc;AAC7C,YAAA,QAAA,CAAS,KAAK,KAAK,CAAA;AACnB,YAAA,WAAA,IAAe,WAAA;AACf,YAAA,cAAA,CAAe,GAAA,CAAI,SAAA,EAAW,GAAA,GAAM,CAAC,CAAA;AACrC,YAAA,gBAAA,CAAiB,IAAI,SAAS,CAAA;AAC9B,YAAA,QAAA,GAAW,IAAA;AACX,YAAA,QAAA,GAAW,IAAA;AACX,YAAA;AAAA,UACF;AACA,UAAA,GAAA,IAAO,CAAA;AAAA,QACT;AACA,QAAA,IAAI,CAAC,QAAA,EAAU,cAAA,CAAe,GAAA,CAAI,WAAW,GAAG,CAAA;AAAA,MAClD;AACA,MAAA,IAAI,CAAC,QAAA,EAAU;AAAA,IACjB;AAEA,IAAAA,IAAAA,CAAI,IAAA;AAAA,MACF,CAAA,8BAAA,EAAiC,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,MAAA,CAAO,MAAM,CAAA,SAAA,EAC5D,WAAW,CAAA,CAAA,EAAI,YAAY,CAAA,SAAA,EAAY,gBAAA,CAAiB,IAAI,CAAA,qBAAA;AAAA,KACnE;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,aAAa,mBAAA,CACX,MAAA,EACA,YAAA,EACA,sBAAsB,IAAA,EACO;AAC7B,IAAA,IAAI,CAAC,MAAA,CAAO,IAAA,CAAK,YAAY,CAAA,EAAG;AAC9B,MAAAA,IAAAA,CAAI,KAAK,qEAAqE,CAAA;AAC9E,MAAA,OAAO,0BAAA,CAA0B,gBAAA,CAAiB,MAAA,EAAQ,YAAY,CAAA;AAAA,IACxE;AACA,IAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAQ,OAAO,EAAC;AAE5B,IAAA,MAAM,YAAA,GAAe,CAAC,GAAG,MAAM,EAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAA,CAAQ,CAAA,CAAE,KAAA,IAAS,CAAA,KAAkB,CAAA,CAAE,SAAS,CAAA,CAAa,CAAA;AACvG,IAAA,IAAI,cAAA,GAAiB,YAAA,CAAa,MAAA,CAAO,YAAY,CAAA;AACrD,IAAA,MAAM,iBAAA,GAAoB,aAAa,MAAA,CAAO,CAAC,MAAM,CAAC,YAAA,CAAa,CAAC,CAAC,CAAA;AAErE,IAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,MAAAA,IAAAA,CAAI,IAAA,CAAK,CAAA,yBAAA,EAA4B,cAAA,CAAe,MAAM,CAAA,uCAAA,CAAyC,CAAA;AACnG,MAAA,OAAO,0BAAA,CAA0B,gBAAA,CAAiB,YAAA,EAAc,YAAY,CAAA;AAAA,IAC9E;AAEA,IAAA,MAAM,aAAgE,EAAC;AACvE,IAAA,KAAA,MAAW,KAAK,cAAA,EAAgB;AAC9B,MAAA,MAAM,GAAA,GAAM,YAAA,CAAa,CAAA,CAAE,SAAqB,CAAA;AAChD,MAAA,IAAI,KAAK,UAAA,CAAW,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,EAAG,KAAK,CAAA;AAAA,IAC5C;AACA,IAAA,IAAI,CAAC,WAAW,MAAA,EAAQ;AACtB,MAAAA,IAAAA,CAAI,KAAK,mEAAmE,CAAA;AAC5E,MAAA,OAAO,0BAAA,CAA0B,gBAAA,CAAiB,YAAA,EAAc,YAAY,CAAA;AAAA,IAC9E;AACA,IAAA,cAAA,GAAiB,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AAC9C,IAAA,MAAM,OAAO,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,GAAG,CAAA;AAExC,IAAA,MAAM,eAAmC,EAAC;AAC1C,IAAA,MAAM,WAAA,uBAAkB,GAAA,EAAY;AACpC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,cAAA,CAAe,QAAQ,CAAA,EAAA,EAAK;AAC9C,MAAA,IAAI,WAAA,GAAc,KAAA;AAClB,MAAA,KAAA,MAAW,KAAK,WAAA,EAAa;AAC3B,QAAA,IAAI,GAAA,CAAI,KAAK,CAAC,CAAA,EAAI,KAAK,CAAC,CAAE,IAAI,mBAAA,EAAqB;AACjD,UAAA,WAAA,GAAc,IAAA;AACd,UAAA;AAAA,QACF;AAAA,MACF;AACA,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,YAAA,CAAa,IAAA,CAAK,cAAA,CAAe,CAAC,CAAE,CAAA;AACpC,QAAA,WAAA,CAAY,IAAI,CAAC,CAAA;AAAA,MACnB;AAAA,IACF;AAEA,IAAA,MAAM,uBAAA,GAA0B,EAAA;AAChC,IAAA,MAAM,0BAA0B,CAAC,GAAG,iBAAiB,CAAA,CAClD,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAA,CAAQ,CAAA,CAAE,KAAA,IAAS,MAAkB,CAAA,CAAE,KAAA,IAAS,EAAa,CAAA,CACtE,KAAA,CAAM,GAAG,uBAAuB,CAAA;AACnC,IAAA,MAAM,UAAA,GAAa,CAAC,GAAG,YAAA,EAAc,GAAG,uBAAuB,CAAA;AAE/D,IAAA,MAAM,YAAA,GAAe,cAAA,CAAe,MAAA,GAAS,YAAA,CAAa,MAAA;AAC1D,IAAA,MAAM,YAAY,uBAAA,CAAwB,MAAA;AAC1C,IAAA,MAAM,YAAA,GAAe,kBAAkB,MAAA,GAAS,SAAA;AAChD,IAAAA,IAAAA,CAAI,IAAA;AAAA,MACF,CAAA,oBAAA,EAAuB,YAAA,CAAa,MAAM,CAAA,CAAA,EAAI,eAAe,MAAM,CAAA,iCAAA,EACrD,YAAY,CAAA,cAAA,EAAiB,SAAS,CAAA,CAAA,EAAI,iBAAA,CAAkB,MAAM,sCACzC,YAAY,CAAA,CAAA;AAAA,KACrD;AAEA,IAAA,MAAM,aAAA,GAAgB,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,CAAA,IAAM,CAAA,CAAE,WAAA,IAAe,CAAA,CAAA,EAAe,CAAC,CAAA;AACzF,IAAA,IAAI,gBAAgB,YAAA,EAAc;AAChC,MAAAA,KAAI,IAAA,CAAK,CAAA,uCAAA,EAA0C,aAAa,CAAA,CAAA,EAAI,YAAY,CAAA,mBAAA,CAAqB,CAAA;AACrG,MAAA,MAAM,aAAA,GAAgB,wBAAwB,UAAU,CAAA;AACxD,MAAA,OAAO,0BAAA,CAA0B,gBAAA,CAAiB,UAAA,EAAY,YAAA,EAAc,aAAa,CAAA;AAAA,IAC3F;AACA,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEA,aAAa,yBAAA,CACX,MAAA,EACA,YAAA,EACA,sBAAsB,IAAA,EACO;AAC7B,IAAA,IAAI,CAAC,MAAA,CAAO,IAAA,CAAK,YAAY,CAAA,EAAG;AAC9B,MAAAA,IAAAA,CAAI,KAAK,4EAA4E,CAAA;AACrF,MAAA,MAAM,aAAA,GAAgB,wBAAwB,MAAM,CAAA;AACpD,MAAA,OAAO,0BAAA,CAA0B,gBAAA,CAAiB,MAAA,EAAQ,YAAA,EAAc,aAAa,CAAA;AAAA,IACvF;AACA,IAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAQ,OAAO,EAAC;AAE5B,IAAA,MAAM,eAAe,CAAC,GAAG,MAAM,CAAA,CAAE,KAAK,WAAW,CAAA;AACjD,IAAA,MAAM,YAAY,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAO,CAAA,CAAE,SAAS,CAAY,CAAA;AAC5D,IAAA,MAAM,cAAA,GAAiB,OAAO,SAAS,CAAA;AAEvC,IAAA,MAAM,aAAiC,EAAC;AACxC,IAAA,MAAM,iBAA6B,EAAC;AAEpC,IAAA,KAAA,MAAW,SAAS,YAAA,EAAc;AAChC,MAAA,IAAI;AACF,QAAA,MAAM,MAAM,KAAA,CAAM,SAAA;AAClB,QAAA,IAAI,GAAA,IAAO,IAAA,IAAQ,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,qBAAqB,CAAA;AAC7E,QAAA,MAAM,cAAA,GAAiB,aAAa,GAAG,CAAA;AACvC,QAAA,IAAI,CAAC,cAAA,EAAgB,MAAM,IAAI,MAAM,qBAAqB,CAAA;AAE1D,QAAA,IAAI,WAAA,GAAc,KAAA;AAClB,QAAA,KAAA,MAAW,WAAW,cAAA,EAAgB;AACpC,UAAA,IAAI,GAAA,CAAI,cAAA,EAAgB,OAAO,CAAA,GAAI,mBAAA,EAAqB;AACtD,YAAA,WAAA,GAAc,IAAA;AACd,YAAA;AAAA,UACF;AAAA,QACF;AACA,QAAA,IAAI,CAAC,WAAA,EAAa;AAChB,UAAA,UAAA,CAAW,KAAK,KAAK,CAAA;AACrB,UAAA,cAAA,CAAe,KAAK,cAAc,CAAA;AAAA,QACpC;AAAA,MACF,CAAA,CAAA,MAAQ;AACN,QAAA,IAAI,YAAA,CAAa,KAAK,CAAA,EAAG;AACvB,UAAAA,IAAAA,CAAI,MAAM,mEAAmE,CAAA;AAC7E,UAAA;AAAA,QACF;AACA,QAAA,MAAM,UAAA,GAAc,MAAM,KAAA,IAAS,CAAA;AACnC,QAAA,MAAM,SAAA,GAAa,MAAM,IAAA,IAAQ,EAAA;AACjC,QAAA,MAAM,aAAA,GAAgB,mBAAmB,SAAS,CAAA;AAClD,QAAA,IAAI,UAAA,IAAc,kBAAkB,aAAA,EAAe;AACjD,UAAA,UAAA,CAAW,KAAK,KAAK,CAAA;AACrB,UAAA,MAAM,MAAA,GAAS,UAAA,IAAc,cAAA,GAAiB,OAAA,GAAU,cAAA;AACxD,UAAA,IAAI,OAAA,GAAU,SAAA;AACd,UAAA,IAAI;AACF,YAAA,OAAA,GAAU,iBAAiB,KAAK,CAAA;AAAA,UAClC,CAAA,CAAA,MAAQ;AAAA,UAER;AACA,UAAAA,IAAAA,CAAI,KAAA;AAAA,YACF,CAAA,4DAAA,EAA+D,MAAM,CAAA,QAAA,EAAW,UAAA,CAAW,QAAQ,CAAC,CAAC,MAAM,OAAO,CAAA;AAAA,WACpH;AAAA,QACF,CAAA,MAAO;AACL,UAAAA,IAAAA,CAAI,KAAA;AAAA,YACF,CAAA,mEAAA,EACY,WAAW,OAAA,CAAQ,CAAC,CAAC,CAAA,aAAA,EAAgB,cAAA,CAAe,OAAA,CAAQ,CAAC,CAAC,CAAA,QAAA;AAAA,WAC5E;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,MAAA,GAAS,UAAA,CAAW,MAAA;AAChD,IAAAA,IAAAA,CAAI,IAAA;AAAA,MACF,8BAA8B,UAAA,CAAW,MAAM,IAAI,MAAA,CAAO,MAAM,2BAA2B,YAAY,CAAA,YAAA;AAAA,KACzG;AAEA,IAAA,MAAM,aAAA,GAAgB,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,CAAA,IAAM,CAAA,CAAE,WAAA,IAAe,CAAA,CAAA,EAAe,CAAC,CAAA;AACzF,IAAA,IAAI,gBAAgB,YAAA,EAAc;AAChC,MAAAA,IAAAA,CAAI,IAAA;AAAA,QACF,CAAA,8CAAA,EAAiD,aAAa,CAAA,CAAA,EAAI,YAAY,CAAA,mBAAA;AAAA,OAChF;AACA,MAAA,MAAM,aAAA,GAAgB,wBAAwB,UAAU,CAAA;AACxD,MAAA,OAAO,0BAAA,CAA0B,gBAAA,CAAiB,UAAA,EAAY,YAAA,EAAc,aAAa,CAAA;AAAA,IAC3F;AACA,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEA,OAAO,WAAA,CACL,gBAAA,EACA,cAAA,EACA,eACA,MAAA,EACA,KAAA,EACA,YAAA,EACA,8BAAA,EACA,+BACA,cAAA,GAAkC,IAAA,EAClC,YAAA,GAAe,CAAA,EACf,iBAAwC,IAAA,EACmB;AAC3D,IAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,CAAA,IAAM,CAAA,CAAE,WAAA,IAAe,CAAA,CAAA,EAAe,CAAC,CAAA;AAC9F,IAAA,MAAM,gBAAA,GAAmB,gBAAA,CAAiB,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,CAAA,IAAM,CAAA,CAAE,WAAA,IAAe,CAAA,CAAA,EAAe,CAAC,CAAA;AAElG,IAAA,MAAM,QAAA,GAAW,oBAAA,CAAqB,KAAA,EAAO,gBAAgB,CAAA;AAC7D,IAAA,MAAM,gBAAA,GAAmB,4BAAA,CAA6B,cAAA,EAAgB,gBAAgB,CAAA;AACtF,IAAA,MAAM,SAAA,GAAY,4BAAA,CAA6B,cAAA,EAAgB,gBAAgB,CAAA;AAE/E,IAAA,IAAI,cAAA,GAAiB,CAAA;AACrB,IAAA,IAAI,mBAAA,GAAsB,CAAA;AAC1B,IAAA,IAAI,iBAAA,GAAoB,CAAA;AACxB,IAAA,IAAI,mBAAA,GAAsB,CAAA;AAE1B,IAAA,IAAI,aAAA,IAAiB,MAAA,CAAO,IAAA,CAAK,aAAa,EAAE,MAAA,EAAQ;AACtD,MAAA,cAAA,GAAiB,6BAAA,CAA8B,kBAAkB,aAAa,CAAA;AAC9E,MAAA,mBAAA,GAAsB,wBAAA,CAAyB,cAAA,EAAgB,gBAAA,EAAkB,aAAa,CAAA;AAC9F,MAAA,iBAAA,GAAoB,aAAA,CAAc,gBAAgB,aAAa,CAAA;AAC/D,MAAA,mBAAA,GAAsB,aAAA,CAAc,kBAAkB,aAAa,CAAA;AAAA,IACrE;AAEA,IAAA,MAAM,kBAAkB,YAAA,GAAe,CAAA,GAAI,KAAK,KAAA,CAAM,YAAA,GAAe,YAAY,CAAA,GAAI,YAAA;AAErF,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,gBAAA;AAAA,MACR,MAAA,EAAQ;AAAA,QACN,mBAAA,EAAqB,IAAA;AAAA,QACrB,MAAA;AAAA,QACA,mCAAA,EAAqC,8BAAA;AAAA,QACrC,uBAAuB,8BAAA,GAAiC,6BAAA;AAAA,QACxD,kCAAA,EAAoC,6BAAA;AAAA,QACpC,eAAA,EAAiB,6BAAA;AAAA,QACjB,mBAAmB,gBAAA,CAAiB,MAAA;AAAA,QACpC,cAAA,EAAgB,gCAAgC,gBAAA,CAAiB,MAAA;AAAA,QACjE,eAAA,EAAiB,cAAA;AAAA,QACjB,iBAAA,EAAmB,gBAAA;AAAA,QACnB,aAAA,EAAe,YAAA;AAAA,QACf,gBAAA,EAAkB,eAAA;AAAA,QAClB,aAAA,EAAe,YAAA;AAAA,QACf,iBAAA,EAAmB,cAAA,GAAiB,CAAA,GAAI,gBAAA,GAAmB,cAAA,GAAiB,CAAA;AAAA,QAC5E,eAAe,gBAAA,IAAoB,eAAA;AAAA,QACnC,eAAA,EAAiB;AAAA,UACf,QAAA;AAAA,UACA,iBAAA,EAAmB,gBAAA;AAAA,UACnB,sBAAA,EAAwB,SAAA;AAAA,UACxB,kBAAA,EAAoB,cAAA;AAAA,UACpB,oBAAA,EAAsB,mBAAA;AAAA,UACtB,iBAAA,EAAmB,iBAAA;AAAA,UACnB,mBAAA,EAAqB;AAAA,SACvB;AAAA,QACA,YAAY,cAAA,IAAkB;AAAA,UAC5B,SAAA,EAAW,KAAA;AAAA,UACX,MAAA,EAAQ,uBAAA;AAAA,UACR,YAAA,EAAc,CAAA;AAAA,UACd,UAAA,EAAY;AAAA;AACd;AACF,KACF;AAAA,EACF;AAAA,EAEA,OAAO,sBAAA,CACL,gBAAA,EACA,cAAA,EACA,QACA,YAAA,EACoB;AACpB,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,MAAA,EAAQ,YAAA,EAAc,CAAC,CAAA;AAC7C,IAAA,MAAM,eAAA,GAAkB,GAAA,CAAI,MAAA,EAAQ,mBAAA,EAAqB,CAAC,CAAA;AAE1D,IAAA,IAAI,aAAA,GAA+C,IAAA;AACnD,IAAA,IAAI,eAAA,GAAkB,CAAA,EAAG,aAAA,GAAgB,uBAAA,CAAwB,cAAc,CAAA;AAE/E,IAAA,MAAM,WAAA,uBAAkB,GAAA,EAAY;AACpC,IAAA,KAAA,MAAW,KAAK,gBAAA,EAAkB;AAChC,MAAA,IAAI;AACF,QAAA,WAAA,CAAY,GAAA,CAAI,gBAAA,CAAiB,CAAC,CAAC,CAAA;AAAA,MACrC,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,IAAI,SAAA,GAAY,CAAA,IAAK,gBAAA,CAAiB,MAAA,GAAS,SAAA,EAAW;AACxD,MAAA,MAAM,YAAA,GAAe,YAAY,gBAAA,CAAiB,MAAA;AAClD,MAAAA,IAAAA,CAAI,IAAA;AAAA,QACF,kCAAkC,gBAAA,CAAiB,MAAM,CAAA,oBAAA,EACzC,SAAS,iBAAiB,YAAY,CAAA,QAAA;AAAA,OACxD;AAEA,MAAA,MAAM,aAAA,uBAAoB,GAAA,EAAY;AACtC,MAAA,KAAA,MAAW,KAAK,gBAAA,EAAkB;AAChC,QAAA,IAAI;AACF,UAAA,aAAA,CAAc,GAAA,CAAI,gBAAA,CAAiB,CAAC,CAAC,CAAA;AAAA,QACvC,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAEA,MAAA,MAAM,gBAAoC,EAAC;AAC3C,MAAA,KAAA,MAAW,KAAK,cAAA,EAAgB;AAC9B,QAAA,IAAI;AACF,UAAA,IAAI,CAAC,cAAc,GAAA,CAAI,gBAAA,CAAiB,CAAC,CAAC,CAAA,EAAG,aAAA,CAAc,IAAA,CAAK,CAAC,CAAA;AAAA,QACnE,CAAA,CAAA,MAAQ;AAAA,QAAC;AAAA,MACX;AACA,MAAA,aAAA,CAAc,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAA,CAAQ,EAAE,KAAA,IAAS,CAAA,KAAkB,CAAA,CAAE,KAAA,IAAS,CAAA,CAAa,CAAA;AACpF,MAAA,MAAM,WAAA,GAAc,aAAA,CAAc,KAAA,CAAM,CAAA,EAAG,YAAY,CAAA;AACvD,MAAA,gBAAA,GAAmB,CAAC,GAAG,gBAAA,EAAkB,GAAG,WAAW,CAAA;AACvD,MAAA,KAAA,MAAW,KAAK,WAAA,EAAa;AAC3B,QAAA,IAAI;AACF,UAAA,WAAA,CAAY,GAAA,CAAI,gBAAA,CAAiB,CAAC,CAAC,CAAA;AAAA,QACrC,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,eAAA,GAAkB,KAAK,aAAA,EAAe;AACxC,MAAA,MAAM,SAAA,GAAY,aAAA,CAAc,gBAAA,EAAkB,aAAa,CAAA;AAC/D,MAAA,IAAI,YAAY,eAAA,EAAiB;AAC/B,QAAAA,IAAAA,CAAI,IAAA;AAAA,UACF,CAAA,+BAAA,EAAkC,SAAS,CAAA,kCAAA,EAC3B,eAAe,CAAA,6CAAA;AAAA,SACjC;AAEA,QAAA,MAAM,oBAAA,uBAA2B,GAAA,EAAY;AAC7C,QAAA,KAAA,MAAW,KAAK,gBAAA,EAAkB;AAChC,UAAA,IAAI;AACF,YAAA,MAAM,GAAA,GAAM,iBAAiB,CAAC,CAAA;AAC9B,YAAA,IAAI,OAAO,aAAA,EAAe,oBAAA,CAAqB,GAAA,CAAI,aAAA,CAAc,GAAG,CAAE,CAAA;AAAA,UACxE,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AAEA,QAAA,MAAM,mBAAA,uBAA0B,GAAA,EAAY;AAC5C,QAAA,KAAA,MAAW,KAAK,cAAA,EAAgB;AAC9B,UAAA,IAAI;AACF,YAAA,MAAM,GAAA,GAAM,iBAAiB,CAAC,CAAA;AAC9B,YAAA,IAAI,OAAO,aAAA,EAAe,mBAAA,CAAoB,GAAA,CAAI,aAAA,CAAc,GAAG,CAAE,CAAA;AAAA,UACvE,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AAEA,QAAA,MAAM,eAAA,GAAkB,CAAC,GAAG,mBAAmB,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,oBAAA,CAAqB,GAAA,CAAI,CAAC,CAAC,CAAA;AAC3F,QAAA,KAAA,MAAW,kBAAkB,eAAA,EAAiB;AAC5C,UAAA,MAAM,aAAiC,EAAC;AACxC,UAAA,KAAA,MAAW,KAAK,cAAA,EAAgB;AAC9B,YAAA,IAAI;AACF,cAAA,MAAM,OAAA,GAAU,iBAAiB,CAAC,CAAA;AAClC,cAAA,IAAI,cAAc,OAAO,CAAA,KAAM,cAAA,EAAgB,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,YAClE,CAAA,CAAA,MAAQ;AAAA,YAAC;AAAA,UACX;AACA,UAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,YAAA,MAAM,YAAY,UAAA,CAAW,MAAA;AAAA,cAAO,CAAC,MAAM,CAAA,KAAA,CACvC,CAAA,CAAE,SAAS,CAAA,KAAkB,IAAA,CAAK,KAAA,IAAS,CAAA,CAAA,GAAgB,CAAA,GAAI;AAAA,aACnE;AACA,YAAA,gBAAA,CAAiB,KAAK,SAAS,CAAA;AAC/B,YAAA,IAAI;AACF,cAAA,WAAA,CAAY,GAAA,CAAI,gBAAA,CAAiB,SAAS,CAAC,CAAA;AAAA,YAC7C,CAAA,CAAA,MAAQ;AAAA,YAER;AACA,YAAA,oBAAA,CAAqB,IAAI,cAAc,CAAA;AAAA,UACzC;AACA,UAAA,IAAI,oBAAA,CAAqB,QAAQ,eAAA,EAAiB;AAAA,QACpD;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,GAAc,gBAAA,CAAiB,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,CAAA,IAAM,CAAA,CAAE,WAAA,IAAe,CAAA,CAAA,EAAe,CAAC,CAAA;AAC7F,IAAA,IAAI,cAAc,YAAA,EAAc;AAC9B,MAAAA,IAAAA,CAAI,IAAA;AAAA,QACF,CAAA,qEAAA,EACM,WAAW,CAAA,CAAA,EAAI,YAAY,CAAA,gDAAA;AAAA,OACnC;AAEA,MAAA,MAAM,iBAAqC,EAAC;AAC5C,MAAA,MAAM,iBAAqC,EAAC;AAC5C,MAAA,KAAA,MAAW,KAAK,gBAAA,EAAkB;AAChC,QAAA,IAAI;AACF,UAAA,MAAM,OAAA,GAAU,iBAAiB,CAAC,CAAA;AAClC,UAAA,IAAI,YAAY,GAAA,CAAI,OAAO,CAAA,EAAG,cAAA,CAAe,KAAK,CAAC,CAAA;AAAA,eAC9C,cAAA,CAAe,KAAK,CAAC,CAAA;AAAA,QAC5B,CAAA,CAAA,MAAQ;AACN,UAAA,cAAA,CAAe,KAAK,CAAC,CAAA;AAAA,QACvB;AAAA,MACF;AAEA,MAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,CAAA,IAAM,CAAA,CAAE,WAAA,IAAe,CAAA,CAAA,EAAe,CAAC,CAAA;AAC9F,MAAA,MAAM,kBAAkB,YAAA,GAAe,cAAA;AAEvC,MAAA,IAAI,iBAAiB,YAAA,EAAc;AACjC,QAAAA,IAAAA,CAAI,KAAA;AAAA,UACF,CAAA,4CAAA,EAA+C,cAAc,CAAA,wBAAA,EACzC,YAAY,CAAA,4CAAA;AAAA,SAClC;AACA,QAAA,cAAA,CAAe,KAAK,WAAW,CAAA;AAC/B,QAAA,MAAM,iBAAqC,EAAC;AAC5C,QAAA,IAAI,UAAA,GAAa,CAAA;AACjB,QAAA,KAAA,MAAW,SAAS,cAAA,EAAgB;AAClC,UAAA,MAAM,WAAA,GAAe,MAAM,WAAA,IAAe,CAAA;AAC1C,UAAA,IAAI,UAAA,GAAa,eAAe,YAAA,EAAc;AAC5C,YAAA,cAAA,CAAe,KAAK,KAAK,CAAA;AACzB,YAAA,UAAA,IAAc,WAAA;AAAA,UAChB;AAAA,QACF;AACA,QAAA,gBAAA,GAAmB,cAAA;AACnB,QAAAA,IAAAA,CAAI,IAAA;AAAA,UACF,kCAAkC,cAAA,CAAe,MAAM,IAAI,cAAA,CAAe,MAAM,oCAC3C,UAAU,CAAA,QAAA;AAAA,SACjD;AAAA,MACF,CAAA,MAAA,IAAW,eAAA,GAAkB,CAAA,IAAK,cAAA,CAAe,MAAA,EAAQ;AACvD,QAAA,cAAA,CAAe,KAAK,WAAW,CAAA;AAC/B,QAAA,MAAM,eAAmC,EAAC;AAC1C,QAAA,IAAI,cAAA,GAAiB,CAAA;AACrB,QAAA,KAAA,MAAW,SAAS,cAAA,EAAgB;AAClC,UAAA,MAAM,WAAA,GAAe,MAAM,WAAA,IAAe,CAAA;AAC1C,UAAA,IAAI,cAAA,GAAiB,eAAe,eAAA,EAAiB;AACnD,YAAA,YAAA,CAAa,KAAK,KAAK,CAAA;AACvB,YAAA,cAAA,IAAkB,WAAA;AAAA,UACpB;AAAA,QACF;AACA,QAAA,gBAAA,GAAmB,CAAC,GAAG,cAAA,EAAgB,GAAG,YAAY,CAAA;AAAA,MACxD,CAAA,MAAO;AACL,QAAA,gBAAA,GAAmB,cAAA;AAAA,MACrB;AAEA,MAAA,MAAM,gBAAA,GAAmB,gBAAA,CAAiB,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,CAAA,IAAM,CAAA,CAAE,WAAA,IAAe,CAAA,CAAA,EAAe,CAAC,CAAA;AAClG,MAAAA,IAAAA,CAAI,IAAA;AAAA,QACF,+CAA+C,gBAAA,CAAiB,MAAM,CAAA,SAAA,EACjE,gBAAgB,IAAI,YAAY,CAAA,OAAA;AAAA,OACvC;AAAA,IACF;AAEA,IAAA,OAAO,gBAAA;AAAA,EACT;AAAA,EAEA,OAAO,eAAA,CACL,gBAAA,EACA,cAAA,EACA,MAAA,EACA,OACA,aAAA,EACA,aAAA,GAA+C,IAAA,EAC/C,cAAA,GAAkC,IAAA,EACd;AACpB,IAAA,MAAM,iBAAA,GAAoB,GAAA,CAAI,MAAA,EAAQ,oBAAA,EAAsB,EAAE,CAAA;AAC9D,IAAA,IAAI,CAAC,qBAAqB,CAAC,MAAA,CAAO,KAAK,iBAAiB,CAAA,CAAE,QAAQ,OAAO,gBAAA;AAEzE,IAAA,MAAM,QAAA,GAAW,oBAAA,CAAqB,KAAA,EAAO,gBAAgB,CAAA;AAC7D,IAAA,MAAM,gBAAA,GAAmB,4BAAA,CAA6B,cAAA,EAAgB,gBAAgB,CAAA;AACtF,IAAA,MAAM,SAAA,GAAY,4BAAA,CAA6B,cAAA,EAAgB,gBAAgB,CAAA;AAE/E,IAAA,IAAI,cAAA,GAAiB,CAAA;AACrB,IAAA,IAAI,mBAAA,GAAsB,CAAA;AAC1B,IAAA,IAAI,iBAAA,GAAoB,CAAA;AACxB,IAAA,IAAI,mBAAA,GAAsB,CAAA;AAE1B,IAAA,IAAI,aAAA,IAAiB,MAAA,CAAO,IAAA,CAAK,aAAa,EAAE,MAAA,EAAQ;AACtD,MAAA,cAAA,GAAiB,6BAAA,CAA8B,kBAAkB,aAAa,CAAA;AAC9E,MAAA,mBAAA,GAAsB,wBAAA,CAAyB,cAAA,EAAgB,gBAAA,EAAkB,aAAa,CAAA;AAC9F,MAAA,iBAAA,GAAoB,aAAA,CAAc,gBAAgB,aAAa,CAAA;AAC/D,MAAA,mBAAA,GAAsB,aAAA,CAAc,kBAAkB,aAAa,CAAA;AACnE,MAAAA,IAAAA,CAAI,IAAA;AAAA,QACF,CAAA,+BAAA,EAAkC,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAC,CAAA,oBAAA,EAAuB,gBAAA,CAAiB,OAAA,CAAQ,CAAC,CAAC,CAAA,YAAA,EAAe,SAAA,CAAU,OAAA,CAAQ,CAAC,CAAC,CAAA,YAAA,EAC3H,cAAA,CAAe,OAAA,CAAQ,CAAC,CAAC,CAAA,uBAAA,EAA0B,mBAAA,CAAoB,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,EAC1F,mBAAmB,CAAA,CAAA,EAAI,iBAAiB,CAAA,UAAA;AAAA,OAChD;AAAA,IACF,CAAA,MAAO;AACL,MAAAA,IAAAA,CAAI,IAAA;AAAA,QACF,CAAA,+BAAA,EAAkC,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAC,CAAA,oBAAA,EAAuB,gBAAA,CAAiB,OAAA,CAAQ,CAAC,CAAC,CAAA,YAAA,EAAe,SAAA,CAAU,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,OAC5I;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,GAAc,kBAAkB,YAAA,IAAgB,CAAA;AACtD,IAAA,MAAM,mBAAA,GAAsB,kBAAkB,qBAAA,IAAyB,CAAA;AACvE,IAAA,MAAM,YAAA,GAAe,kBAAkB,aAAA,IAAiB,CAAA;AACxD,IAAA,MAAM,oBAAA,GAAuB,kBAAkB,sBAAA,IAA0B,CAAA;AAEzE,IAAA,IAAI,oBAAA,GAAuB,KAAK,EAAE,aAAA,IAAiB,OAAO,IAAA,CAAK,aAAa,EAAE,MAAA,CAAA,EAAS;AACrF,MAAAA,IAAAA,CAAI,IAAA;AAAA,QACF,CAAA,2CAAA,EAA8C,oBAAA,CAAqB,OAAA,CAAQ,CAAC,CAAC,CAAA,iUAAA;AAAA,OAM/E;AACA,MAAA,OAAO,gBAAA;AAAA,IACT;AAEA,IAAA,IAAI,WAAA,GAAc,CAAA,IAAK,QAAA,GAAW,WAAA,EAAa;AAC7C,MAAAA,IAAAA,CAAI,IAAA;AAAA,QACF,CAAA,+BAAA,EAAkC,SAAS,OAAA,CAAQ,CAAC,CAAC,CAAA,iBAAA,EAAoB,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAC,CAAA,sBAAA;AAAA,OACjG;AACA,MAAA,OAAO,gBAAA;AAAA,IACT;AACA,IAAA,IAAI,mBAAA,GAAsB,CAAA,IAAK,gBAAA,GAAmB,mBAAA,EAAqB;AACrE,MAAAA,IAAAA,CAAI,IAAA;AAAA,QACF,CAAA,gCAAA,EAAmC,iBAAiB,OAAA,CAAQ,CAAC,CAAC,CAAA,iBAAA,EAAoB,mBAAA,CAAoB,OAAA,CAAQ,CAAC,CAAC,CAAA,sBAAA;AAAA,OAClH;AACA,MAAA,OAAO,gBAAA;AAAA,IACT;AACA,IAAA,IAAI,YAAA,GAAe,CAAA,IAAK,SAAA,GAAY,YAAA,EAAc;AAChD,MAAAA,IAAAA,CAAI,IAAA;AAAA,QACF,CAAA,wBAAA,EAA2B,UAAU,OAAA,CAAQ,CAAC,CAAC,CAAA,iBAAA,EAAoB,YAAA,CAAa,OAAA,CAAQ,CAAC,CAAC,CAAA,sBAAA;AAAA,OAC5F;AACA,MAAA,OAAO,gBAAA;AAAA,IACT;AACA,IAAA,IAAI,oBAAA,GAAuB,CAAA,IAAK,cAAA,GAAiB,oBAAA,EAAsB;AACrE,MAAAA,IAAAA,CAAI,IAAA;AAAA,QACF,CAAA,iCAAA,EAAoC,cAAA,CAAe,OAAA,CAAQ,CAAC,CAAC,CAAA,iBAAA,EAAoB,oBAAA,CAAqB,OAAA,CAAQ,CAAC,CAAC,CAAA,6CAAA,EAChE,mBAAA,CAAoB,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AAAA,OAChF;AACA,MAAA,OAAO,gBAAA;AAAA,IACT;AACA,IAAA,OAAO,gBAAA;AAAA,EACT;AACF,CAAA;;;ACj/CA,WAAA,EAAA;;;AC7BO,IAAM,kBAAA,GAAqB;AAO3B,SAAS,OAAA,CACd,aACA,IAAA,EACyB;AACzB,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AACvC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,EAAG;AACpD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA,IAAK,kBAAA;AACpC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,KAAA,MAAW,WAAW,GAAA,EAAK;AACzB,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA,EAAG;AACvB,MAAA,IAAA,CAAK,IAAI,OAAO,CAAA;AAChB,MAAA,IAAA,IAAQ,CAAA;AACR,MAAA,MAAA,CAAO,GAAA,CAAI,OAAA,EAAA,CAAU,MAAA,CAAO,GAAA,CAAI,OAAO,KAAK,CAAA,IAAK,MAAA,IAAU,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAA;AAAA,IAC3E;AAAA,EACF;AACA,EAAA,OAAO,CAAC,GAAG,MAAA,CAAO,OAAA,EAAS,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,CAAC,IAAI,CAAA,CAAE,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,EAAA,GAAK,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,IAAI,CAAA,CAAE,CAAA;AACrG;;;ADMA,UAAA,EAAA;;;AElBO,IAAMqC,WAAAA,GAAa,GAAA;AAE1B,eAAec,UACb,SAAA,EACA,GAAA,EACA,IAAA,EACA,OAAA,GAAkC,EAAC,EACrB;AACd,EAAA,MAAM,IAAA,GAAO,MAAM,SAAA,CAAU,GAAA,EAAK;AAAA,IAChC,MAAA,EAAQ,MAAA;AAAA,IACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAoB,GAAG,OAAA,EAAQ;AAAA,IAC1D,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,IACzB,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQd,WAAU;AAAA,GACvC,CAAA;AACD,EAAA,IAAI,CAAC,KAAK,EAAA,EAAI;AACZ,IAAA,MAAM,OAAO,MAAM,IAAA,CAAK,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAC7C,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,IAAA,CAAK,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,UAAU,CAAA,EAAG,IAAA,GAAO,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,GAAK,EAAE,CAAA,CAAE,CAAA;AAAA,EACpF;AACA,EAAA,OAAO,KAAK,IAAA,EAAK;AACnB;AAEA,SAAS,cAAc,MAAA,EAA2C;AAChE,EAAA,OAAO,OACJ,KAAA,EAAM,CACN,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,CAAC,IAAK,CAAA,CAAE,CAAC,CAAE,CAAA,CAC5B,GAAA,CAAI,CAAC,CAAC,GAAG,MAAM,GAAG,CAAA;AACvB;AAEA,eAAe,YAAA,CACbnC,IAAAA,EACA,KAAA,EACA,IAAA,EACA,SAAA,EACmB;AACnB,EAAA,MAAM,OAAO,MAAMiD,SAAAA;AAAA,IACjB,SAAA;AAAA,IACA,kCAAA;AAAA,IACA,EAAE,KAAA,EAAOjD,IAAAA,CAAI,KAAA,EAAO,KAAA,EAAO,WAAW,IAAA,EAAK;AAAA,IAC3C,EAAE,aAAA,EAAe,CAAA,OAAA,EAAUA,IAAAA,CAAI,MAAA,IAAU,EAAE,CAAA,CAAA;AAAG,GAChD;AACA,EAAA,MAAM,MAAA,GACJ,IAAA,CAAK,OAAA,CACL,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,eAAe,CAAC,CAAA;AACzC,EAAA,OAAO,cAAc,MAAM,CAAA;AAC7B;AAEA,eAAe,YAAA,CACbA,IAAAA,EACA,KAAA,EACA,IAAA,EACA,SAAA,EACmB;AACnB,EAAA,MAAM,OAAO,MAAMiD,SAAAA;AAAA,IACjB,SAAA;AAAA,IACA,oCAAA;AAAA,IACA,EAAE,KAAA,EAAOjD,IAAAA,CAAI,KAAA,EAAO,KAAA,EAAO,WAAW,IAAA,EAAK;AAAA,IAC3C,EAAE,aAAA,EAAe,CAAA,OAAA,EAAUA,IAAAA,CAAI,MAAA,IAAU,EAAE,CAAA,CAAA;AAAG,GAChD;AACA,EAAA,MAAM,MAAA,GACJ,IAAA,CAAK,IAAA,CACL,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,eAAe,CAAC,CAAA;AACzC,EAAA,OAAO,cAAc,MAAM,CAAA;AAC7B;AAEA,eAAe,UAAA,CACbA,IAAAA,EACA,KAAA,EACA,IAAA,EACA,SAAA,EACmB;AACnB,EAAA,MAAM,OAAO,MAAMiD,SAAAA;AAAA,IACjB,SAAA;AAAA,IACA,+BAAA;AAAA,IACA,EAAE,KAAA,EAAOjD,IAAAA,CAAI,KAAA,EAAO,KAAA,EAAO,WAAW,IAAA,EAAK;AAAA,IAC3C,EAAE,aAAA,EAAe,CAAA,OAAA,EAAUA,IAAAA,CAAI,MAAA,IAAU,EAAE,CAAA,CAAA;AAAG,GAChD;AACA,EAAA,MAAM,MAAA,GACJ,IAAA,CAAK,OAAA,CACL,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,eAAe,CAAC,CAAA;AACzC,EAAA,OAAO,cAAc,MAAM,CAAA;AAC7B;AAEA,eAAe,YAAA,CACbA,IAAAA,EACA,KAAA,EACA,IAAA,EACA,SAAA,EACmB;AACnB,EAAA,MAAM,WAAWA,IAAAA,CAAI,OAAA,IAAW,EAAA,EAAI,OAAA,CAAQ,QAAQ,EAAE,CAAA;AACtD,EAAA,MAAM,IAAA,GAAO,MAAMiD,SAAAA,CAAS,SAAA,EAAW,CAAA,EAAG,OAAO,CAAA,OAAA,CAAA,EAAW,EAAE,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,CAAA;AAClF,EAAA,MAAM,MAAA,GAAmC,IAAA,CAAiD,GAAA,CAAI,CAAC,CAAA,KAAM;AAAA,IACnG,CAAA,CAAE,KAAA;AAAA,IACF,CAAA,CAAE;AAAA,GACH,CAAA;AACD,EAAA,OAAO,cAAc,MAAM,CAAA;AAC7B;AAMA,eAAsB,OACpBjD,IAAAA,EACA,KAAA,EACA,IAAA,EACA,IAAA,GAAmE,EAAC,EACjD;AACnB,EAAA,IAAI,CAACA,KAAI,OAAA,EAAS;AAChB,IAAA,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAAA,EACxC;AACA,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,aAAa,UAAA,CAAW,KAAA;AAC7D,EAAA,IAAIA,IAAAA,CAAI,aAAa,QAAA,EAAU,OAAO,aAAaA,IAAAA,EAAK,KAAA,EAAO,MAAM,SAAS,CAAA;AAC9E,EAAA,IAAIA,IAAAA,CAAI,aAAa,QAAA,EAAU,OAAO,aAAaA,IAAAA,EAAK,KAAA,EAAO,MAAM,SAAS,CAAA;AAC9E,EAAA,IAAIA,IAAAA,CAAI,aAAa,MAAA,EAAQ,OAAO,WAAWA,IAAAA,EAAK,KAAA,EAAO,MAAM,SAAS,CAAA;AAC1E,EAAA,IAAIA,IAAAA,CAAI,aAAa,QAAA,EAAU,OAAO,aAAaA,IAAAA,EAAK,KAAA,EAAO,MAAM,SAAS,CAAA;AAC9E,EAAA,MAAM,IAAI,MAAM,CAAA,2BAAA,EAA8B,IAAA,CAAK,UAAUA,IAAAA,CAAI,QAAQ,CAAC,CAAA,CAAE,CAAA;AAC9E;;;AFxFO,IAAM,kBAAA,GAAqB,EAAA;AAE3B,IAAM,kBAAA,GAAqB,GAAA;AAG3B,IAAM,sBAAA,GAAyB,CAAA;AAE/B,IAAM,qBAAA,GAAwB,CAAA;AAErC,IAAM0C,QAAAA,GAAU,iEAAA;AA+ChB,SAAS,QAAA,CAAS,MAAc,MAAA,EAAqC;AACnE,EAAA,IAAI,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,kBAAA,EAAoB,OAAO,EAAE,CAAA;AACnD,EAAA,IAAI,MAAA,CAAO,SAAS,OAAA,EAAS,MAAA,GAAS,KAAK,GAAA,CAAI,MAAA,EAAQ,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA;AACjF,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,kBAAkB,CAAA;AAC5C;AAMA,SAAS,WAAA,CACP,IAAA,EACA,MAAA,EACA,IAAA,EAOkB;AAClB,EAAA,MAAM,CAAC,QAAA,EAAU,IAAI,CAAA,GAAI,cAAA,CAAe,MAAM,MAAA,EAAQ;AAAA,IACpD,KAAA,EAAO,QAAA;AAAA,IACP,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,OAAO,IAAA,CAAK;AAAA,GACb,CAAA;AACD,EAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAa,MAAA,IAAU,CAAC,IAAA,CAAK,YAAA,EAAc,MAAA,EAAQ,OAAO,CAAC,QAAA,EAAU,CAAC,CAAA;AAChF,EAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,WAAA,IAAe,EAAC,EAAG;AACzC,IAAA,IAAI,CAAC,KAAK,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAAA,EACtD;AACA,EAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,YAAA,IAAgB,EAAC,EAAG;AAC1C,IAAA,IAAI,CAAC,KAAK,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAAA,EACxD;AACA,EAAA,OAAO,CAAC,QAAA,EAAU,IAAA,CAAK,KAAA,IAAS,CAAC,CAAA;AACnC;AA8CO,SAAS,UAAA,CACd,IAAA,EACA,MAAA,EACA,IAAA,EACkC;AAClC,EAAA,IAAI,MAAA,CAAO,OAAA,EAAQ,IAAK,CAAC,IAAA,CAAK,QAAQ,OAAO,CAAC,IAAA,EAAM,EAAE,CAAA;AAEtD,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,MAAM,MAAa,EAAC;AACpB,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,IAAS,EAAC;AAE7B,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAM,CAAC,IAAA,EAAM,KAAK,IAAI,WAAA,CAAY,GAAA,CAAI,WAAW,MAAA,EAAQ;AAAA,MACvD,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,KAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,UAAA,IAAc,KAAA;AAEd,IAAA,IAAI,OAAO,GAAA,CAAI,IAAA;AACf,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAM,UAAmC,EAAC;AAC1C,MAAA,IAAI,OAAA,GAAU,KAAA;AACd,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC/C,QAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,UAAA,MAAM,CAAC,QAAA,EAAU,SAAS,CAAA,GAAI,WAAA,CAAY,OAAO,MAAA,EAAQ;AAAA,YACvD,YAAY,IAAA,CAAK,UAAA;AAAA,YACjB,WAAW,IAAA,CAAK,SAAA;AAAA,YAChB,KAAA;AAAA,YACA,KAAA;AAAA,YACA;AAAA,WACD,CAAA;AACD,UAAA,UAAA,IAAc,SAAA;AACd,UAAA,IAAI,QAAA,KAAa,OAAO,OAAA,GAAU,IAAA;AAClC,UAAA,OAAA,CAAQ,GAAG,CAAA,GAAI,QAAA;AAAA,QACjB,CAAA,MAAO;AACL,UAAA,OAAA,CAAQ,GAAG,CAAA,GAAI,KAAA;AAAA,QACjB;AAAA,MACF;AACA,MAAA,IAAI,SAAS,IAAA,GAAO,OAAA;AAAA,IACtB;AAEA,IAAA,GAAA,CAAI,KAAK,EAAE,GAAG,KAAK,SAAA,EAAW,IAAA,EAAM,MAAM,CAAA;AAAA,EAC5C;AAEA,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,IAAU,CAAC,MAAA,CAAO,QAAQ,OAAO,CAAC,GAAA,EAAK,EAAE,CAAA;AACpD,EAAA,MAAM,IAAA,GAAgC,EAAE,WAAA,EAAa,KAAA,EAAO,OAAO,UAAA,EAAW;AAC9E,EAAA,IAAI,MAAA,CAAO,MAAA,EAAQ,IAAA,CAAK,YAAA,GAAe,MAAA;AACvC,EAAA,OAAO,CAAC,KAAK,IAAI,CAAA;AACnB;AAGA,eAAe,UAAA,CACb,OACA,IAAA,EACoC;AACpC,EAAA,IAAI;AACF,IAAA,MAAM,CAAC,OAAA,EAAS,MAAM,CAAA,GAAI,MAAM,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,CAAC,KAAK,CAAA,EAAG,EAAE,IAAA,EAAM,SAAS,CAAA;AAC9E,IAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,EAAQ,OAAO,CAAC,MAAM,CAAC,CAAA;AACpC,IAAA,OAAO,CAAC,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAE,CAAA,EAAG,MAAA,CAAO,MAAA,IAAU,CAAC,CAAC,CAAA;AAAA,EACtD,SAAS,GAAA,EAAK;AACZ,IAAA,SAAA,CAAU,IAAA,CAAK,OAAO,GAAA,EAAK,EAAE,OAAO,aAAA,EAAe,WAAA,EAAa,KAAA,CAAM,MAAA,EAAQ,CAAA;AAC9E,IAAA,OAAO,CAAC,MAAM,CAAC,CAAA;AAAA,EACjB;AACF;AASA,eAAe,OAAA,CACb,OACA,IAAA,EACmC;AACnC,EAAA,MAAM,UAA8C,EAAC;AACrD,EAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAa,OAAA,CAAQ,KAAK,CAAC,KAAA,EAAO,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,KAAA,EAAO,IAAA,CAAK,KAAK,CAAC,CAAC,CAAA;AAC7F,EAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,YAAA,EAAc,OAAA,CAAQ,KAAK,CAAC,MAAA,EAAQ,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,KAAA,EAAO,IAAA,CAAK,KAAK,CAAC,CAAC,CAAA;AAChG,EAAA,IAAI,IAAA,CAAK,MAAA,IAAU,IAAA,IAAQ,IAAA,CAAK,QAAQ,WAAA,EAAa;AACnD,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,KAAA,EAAO,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,KAAK,CAAC,CAAC,CAAA;AAAA,EACvE;AACA,EAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,EAAQ,OAAO,EAAC;AAE7B,EAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,UAAA,CAAW,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAG,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AACnE,EAAA,MAAM,SAAmC,EAAC;AAC1C,EAAA,MAAM,WAAsB,EAAC;AAC7B,EAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,OAAA,EAAS,CAAA,KAAM;AAC/B,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,CAAC,CAAA,CAAG,CAAC,CAAA;AACzB,IAAA,IAAI,OAAA,CAAQ,WAAW,WAAA,EAAa;AAClC,MAAA,MAAA,CAAO,GAAG,IAAI,OAAA,CAAQ,KAAA;AAAA,IACxB,CAAA,MAAO;AACL,MAAA,SAAA,CAAU,IAAA,CAAK,OAAO,OAAA,CAAQ,MAAA,EAAQ,EAAE,KAAA,EAAO,YAAA,EAAc,KAAK,CAAA;AAClE,MAAA,QAAA,CAAS,IAAA,CAAK,QAAQ,MAAM,CAAA;AAAA,IAC9B;AAAA,EACF,CAAC,CAAA;AACD,EAAA,IAAI,SAAS,MAAA,IAAU,CAAC,OAAO,IAAA,CAAK,MAAM,EAAE,MAAA,EAAQ;AAGlD,IAAA,MAAM,SAAS,CAAC,CAAA;AAAA,EAClB;AACA,EAAA,OAAO,MAAA;AACT;AAGA,eAAe,OAAA,CAAQ,MAAY,QAAA,EAAmE;AACpG,EAAA,MAAM,MAAA,GAAS,SAAS,MAAA,CAAO,CAAC,OAAOA,QAAAA,CAAQ,IAAA,CAAK,EAAE,CAAC,CAAA;AACvD,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,QAAA,CAAS,MAAA,EAAQ;AACrC,IAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,MAAA,IAAI,CAACA,QAAAA,CAAQ,IAAA,CAAK,GAAG,CAAA,EAAG;AACtB,QAAA,OAAA,CAAQ,IAAA,CAAK,6CAA6C,GAAG,CAAA;AAAA,MAC/D;AAAA,IACF;AAAA,EACF;AACA,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAqC;AACrD,EAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAQ,OAAO,GAAA;AAC3B,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,IAAA,CAAK,KAAA;AAAA,IAC1B,CAAA;AAAA;AAAA;AAAA;AAAA,iCAAA,CAAA;AAAA,IAKA,CAAC,MAAM;AAAA,GACT;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,MAAM,GAAA,CAAI,GAAA,CAAI,OAAO,CAAA,CAAE,QAAQ,GAAG,CAA4B,CAAA;AAC9E,EAAA,OAAO,GAAA;AACT;AAQA,eAAe,WAAA,CACb,KAAA,EACA,IAAA,EACA,IAAA,EAC2B;AAC3B,EAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,OAAA,IAAW,CAAC,IAAA,CAAK,MAAA,EAAQ,OAAO,CAAC,IAAA,EAAM,KAAK,CAAA;AAEtE,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,UAAU,CAAC,CAAA;AAC7E,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,MAAM,CAAA;AACzC,EAAA,IAAI;AACF,IAAA,MAAM,QAAQ,MAAM,MAAA;AAAA,MAClB,KAAK,MAAA,CAAO,QAAA;AAAA,MACZ,KAAA;AAAA,MACA,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,SAAS;AAAA,KACnC;AAIA,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,IAAA,MAAM,YAAmB,EAAC;AAC1B,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,IAAI,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA,IAAK,CAAA,IAAK,CAAA,IAAK,CAAA,GAAI,UAAA,CAAW,MAAA,IAAU,CAAC,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG;AAC1E,QAAA,IAAA,CAAK,IAAI,CAAC,CAAA;AACV,QAAA,SAAA,CAAU,IAAA,CAAK,UAAA,CAAW,CAAC,CAAE,CAAA;AAAA,MAC/B;AAAA,IACF;AACA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,CAAW,QAAQ,CAAA,EAAA,EAAK;AAC1C,MAAA,IAAI,CAAC,KAAK,GAAA,CAAI,CAAC,GAAG,SAAA,CAAU,IAAA,CAAK,UAAA,CAAW,CAAC,CAAE,CAAA;AAAA,IACjD;AACA,IAAA,OAAO,CAAC,SAAA,CAAU,MAAA,CAAO,IAAI,GAAG,IAAI,CAAA;AAAA,EACtC,SAAS,GAAA,EAAK;AACZ,IAAA,SAAA,CAAU,IAAA,CAAK,OAAO,GAAA,EAAK,EAAE,OAAO,QAAA,EAAU,UAAA,EAAY,UAAA,CAAW,MAAA,EAAQ,CAAA;AAC7E,IAAA,OAAO,CAAC,MAAM,KAAK,CAAA;AAAA,EACrB;AACF;AAQA,eAAe,aAAA,CACb,KAAA,EACA,IAAA,EACA,IAAA,EAC2B;AAC3B,EAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,OAAO,CAAC,MAAM,KAAK,CAAA;AAErC,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IAC/B,EAAA,EAAI,EAAE,OAAA,IAAW,CAAA,EAAG,EAAE,UAAU,CAAA,CAAA,EAAI,EAAE,GAAG,CAAA,CAAA;AAAA,IACzC,MAAM,CAAA,CAAE,SAAA;AAAA,IACR,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,YAAY,CAAA,CAAE;AAAA,GAChB,CAAE,CAAA;AACF,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAM,yBAAA,CAA0B,gBAAA;AAAA,MAC3C,OAAA;AAAA,MACA,IAAA,CAAK,YAAA;AAAA,MACL,IAAA;AAAA,MACA,KAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA,CAAK;AAAA,KACP;AACA,IAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,IAAA,CAAK,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AAC7C,IAAA,MAAM,UAAA,GAAa,QAChB,GAAA,CAAI,CAAC,GAAG,CAAA,KAAO,OAAA,CAAQ,IAAI,CAAA,CAAE,EAAE,IAAI,IAAA,CAAK,CAAC,IAAK,IAAK,CAAA,CACnD,OAAO,CAAC,CAAA,KAAgB,KAAK,IAAI,CAAA;AACpC,IAAA,OAAO,CAAC,UAAA,EAAY,UAAA,CAAW,MAAA,KAAW,KAAK,MAAM,CAAA;AAAA,EACvD,SAAS,GAAA,EAAK;AACZ,IAAA,SAAA,CAAU,IAAA,CAAK,OAAO,GAAA,EAAK,EAAE,OAAO,UAAA,EAAY,aAAA,EAAe,IAAA,CAAK,YAAA,EAAc,CAAA;AAClF,IAAA,OAAO,CAAC,MAAM,KAAK,CAAA;AAAA,EACrB;AACF;AAEA,SAAS,UAAA,CAAW,GAAA,EAAa,KAAA,EAAe,GAAA,EAAmC;AACjF,EAAA,MAAM,OAAO,GAAA,CAAI,SAAA;AACjB,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,MAAA,CAAO,GAAA,CAAI,WAAW,CAAA;AAAA,IAClC,YAAA,EAAe,IAAI,IAAA,IAA0B,IAAA;AAAA,IAC7C,WAAA,EAAc,IAAI,WAAA,IAAiC,IAAA;AAAA,IACnD,QAAA,EAAW,IAAI,SAAA,IAA+B,IAAA;AAAA,IAC9C,SAAA,EAAW,MAAA,CAAO,GAAA,CAAI,IAAA,IAAQ,EAAE,CAAA;AAAA,IAChC,GAAA,EAAM,IAAI,GAAA,IAAyB,IAAA;AAAA,IACnC,IAAA,EAAO,IAAI,IAAA,IAA0B,IAAA;AAAA,IACrC,KAAA;AAAA,IACA,OAAA,EAAS,GAAA;AAAA,IACT,IAAA,EAAM,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAK,IAAA,GAAmC;AAAC,GACxG;AACF;AAmBA,eAAsB,SAAA,CAAU,OAAe,IAAA,EAA4C;AACzF,EAAA,IAAI,CAAC,KAAA,EAAO,IAAA,IAAQ,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAC7D,EAAA,MAAM,IAAA,GAAa,KAAK,IAAA,IAAQ,QAAA;AAChC,EAAA,IAAI,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,OAAA,EAAS;AACzC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,KAAK,SAAA,CAAU,IAAI,CAAC,CAAA,+BAAA,CAAiC,CAAA;AAAA,EAC/F;AACA,EAAA,IAAI,SAAS,OAAA,IAAW,CAAC,IAAA,CAAK,MAAA,CAAO,MAAM,OAAA,EAAS;AAClD,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAEF;AAAA,EACF;AACA,EAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,IAAA,CAAK,IAAA,IAAQ,EAAE,CAAC,CAAA;AAEpD,EAAA,MAAM,KAAA,GAAqB;AAAA,IACzB,SAAA,EAAW,KAAK,SAAA,IAAa,IAAA,GAAO,CAAC,GAAG,IAAA,CAAK,SAAS,CAAA,GAAI,IAAA;AAAA,IAC1D,UAAA,EAAY,KAAK,UAAA,IAAc,IAAA,GAAO,CAAC,GAAG,IAAA,CAAK,UAAU,CAAA,GAAI,IAAA;AAAA,IAC7D,KAAA,EAAO,QAAA,CAAS,IAAA,EAAM,IAAA,CAAK,MAAM;AAAA,GACnC;AAEA,EAAA,MAAM,CAAC,MAAA,EAAQ,eAAe,CAAA,GAAI,MAAM,WAAW,KAAA,EAAO;AAAA,IACxD,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,OAAO,IAAA,CAAK;AAAA,GACb,CAAA;AACD,EAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,KAAA,EAAO;AAAA,IAClC,MAAA;AAAA,IACA,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,KAAA;AAAA,IACA,OAAO,IAAA,CAAK;AAAA,GACb,CAAA;AAED,EAAA,IAAI,IAAA,CAAK,aAAa,MAAA,EAAQ;AAM5B,IAAA,MAAA,CAAO,KAAA,GAAQ,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,CAAC,GAAG,IAAA,CAAK,WAAW,CAAA,EAAG,KAAK,CAAA;AAAA,EAC1E;AAEA,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,MAAA,CAAO,KAAA,EAAO,MAAM,CAAA;AAC7C,EAAA,IAAI,QAAA,GAA0B,IAAA;AAC9B,EAAA,IAAI,IAAA,KAAS,OAAA,IAAW,CAAC,QAAA,EAAU;AACjC,IAAA,QAAA,GAAW,uBAAA;AACX,IAAA,SAAA;AAAA,MACE,IAAA,CAAK,KAAA;AAAA,MACL,IAAIlD,2BAAA;AAAA,QACF;AAAA,OAGF;AAAA,MACA,EAAE,KAAA,EAAO,WAAA,EAAa,IAAA,EAAM,QAAA;AAAS,KACvC;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,MAAA,EAAQ,EAAE,GAAG,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,CAAA,EAAG,OAAA,EAAS,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,SAAS,CAAA;AAI9F,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA,GAAI,IAAA;AAChG,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA;AACvC,EAAA,MAAM,WAAW,MAAM,OAAA;AAAA,IACrB,IAAA,CAAK,IAAA;AAAA,IACL,UAAU,GAAA,CAAI,CAAC,CAAC,GAAG,MAAM,GAAG;AAAA,GAC9B;AAEA,EAAA,IAAI,OAAc,EAAC;AACnB,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,SAAA,EAAW;AACpC,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AAC5B,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,GAAA,EAAK,KAAA,EAAO,GAAG,CAAC,CAAA;AAAA,EACvC;AAQA,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,MAAA,CAAO,SAAA;AAC7C,EAAA,MAAM,CAAC,QAAA,EAAU,aAAa,CAAA,GAAI,UAAA,CAAW,MAAM,MAAA,EAAQ;AAAA,IACzD,UAAA,EAAY,KAAK,UAAA,IAAc,IAAA;AAAA,IAC/B,SAAA,EAAW,KAAK,MAAA,CAAO,SAAA;AAAA,IACvB,OAAO,IAAA,CAAK;AAAA,GACb,CAAA;AACD,EAAA,IAAA,GAAO,QAAA;AAEP,EAAA,MAAM,CAAC,YAAA,EAAc,QAAQ,IAAI,MAAM,WAAA,CAAY,OAAO,IAAA,EAAM;AAAA,IAC9D,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,OAAO,IAAA,CAAK;AAAA,GACb,CAAA;AACD,EAAA,IAAA,GAAO,YAAA,CAAa,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA;AAEjC,EAAA,IAAI,UAAA,GAAa,KAAA;AACjB,EAAA,IAAI,IAAA,CAAK,oBAAoB,IAAA,EAAM;AACjC,IAAA,CAAC,MAAM,UAAU,CAAA,GAAI,MAAM,aAAA,CAAc,OAAO,IAAA,EAAM;AAAA,MACpD,cAAc,IAAA,CAAK,gBAAA;AAAA,MACnB,WAAA,EAAa,MAAA;AAAA,MACb,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AAAA,EACH;AAIA,EAAA,MAAM,SAAS,KAAA,CAAM,SAAA,EAAW,MAAA,GAAS,KAAA,CAAM,UAAU,MAAA,GAAS,CAAA;AAClE,EAAA,MAAM,KAAA,GAAQ,MAAA,IAAU,QAAA,GAAW,qBAAA,GAAwB,sBAAA,CAAA;AAE3D,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,MAAM,EAAE,IAAA,EAAK;AACtC,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,WAAA,CAAY,IAAA,CAAK,IAAI,CAAC,GAAA,KAAQ,CAAC,GAAA,EAAK,MAAA,CAAO,GAAG,CAAA,CAAG,MAAM,CAAC,CAAC,CAAA;AAChF,EAAA,MAAM,KAAA,GAAiC;AAAA,IACrC,IAAA,EAAM,QAAA;AAAA,IACN,KAAA;AAAA,IACA,IAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,IAAA;AAAA,IACA,OAAA;AAAA,IACA,YAAY,KAAA,CAAM,MAAA;AAAA,IAClB,UAAU,IAAA,CAAK,MAAA;AAAA,IACf,QAAA;AAAA,IACA,UAAA;AAAA,IACA,cAAA,EAAgB,EAAE,gBAAA,EAAkB,eAAA;AAAgB,GACtD;AACA,EAAA,IAAI,OAAO,IAAA,CAAK,aAAa,CAAA,CAAE,MAAA,QAAc,SAAA,GAAY,aAAA;AAEzD,EAAA,MAAM,MAAA,GAAkC;AAAA,IACtC,IAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,IAAA;AAAA,IACA,OAAA;AAAA,IACA,YAAY,KAAA,CAAM,MAAA;AAAA,IAClB,UAAU,IAAA,CAAK;AAAA,GACjB;AACA,EAAA,IAAI,OAAO,IAAA,CAAK,aAAa,CAAA,CAAE,MAAA,SAAe,SAAA,GAAY,aAAA;AAE1D,EAAA,SAAA,CAAU,KAAK,KAAA,EAAO;AAAA,IACpB,IAAA,EAAM,QAAA;AAAA,IACN,KAAA;AAAA,IACA,MAAA;AAAA,IACA,cAAA,EAAgB,EAAE,gBAAA,EAAkB,eAAA;AAAgB,GAChC,CAAA;AAEtB,EAAA,OAAO,EAAE,MAAM,KAAA,EAAM;AACvB;;;AGnjBO,IAAM,KAAA,mBAAuB,MAAA,CAAO,GAAA,CAAI,sBAAsB;AAGrE,IAAM,kBAAN,MAAsB;AAAA,EACpB,CAAU,MAAA,CAAO,WAAW,IAAI,SAAA;AAAA,EAChC,QAAA,GAAmB;AACjB,IAAA,OAAO,SAAA;AAAA,EACT;AAAA,EACA,OAAA,GAAmB;AACjB,IAAA,OAAO,IAAA;AAAA,EACT;AACF,CAAA;AAEO,IAAM,OAAA,GAA2B,MAAA,CAAO,MAAA,CAAO,IAAI,iBAAiB;AAKpE,SAAS,iBAAA,CAAkB,OAAmB,MAAA,EAAiC;AACpF,EAAA,IAAI,KAAA,KAAU,SAAS,OAAO,IAAA;AAC9B,EAAA,IAAI,KAAA,KAAU,QAAW,OAAO,IAAA;AAChC,EAAA,IAAI,UAAU,IAAA,EAAM;AAClB,IAAA,OAAA,CAAQ,WAAA;AAAA,MACN,GAAG,MAAM,CAAA,kVAAA,CAAA;AAAA,MAKT;AAAA,KACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,IAAA;AACxC;;;AC5BA,SAAA,EAAA;AAGA,IAAM,0BAAA,GAA6B,CAAC,CAAA,EAAG,CAAC,CAAA;AAExC,IAAM,iBAAA,GAAoB,EAAA;AAC1B,IAAM,iBAAA,GAAoB,GAAA;AAC1B,IAAM,iBAAA,GAAoB,GAAA;AAC1B,IAAM,gBAAA,GAAmB,GAAA;AACzB,IAAM,mBAAA,GAAsB,GAAA;AAC5B,IAAM,mBAAA,GAAsB,GAAA;AAC5B,IAAM,uBAAA,GAA0B,CAAA;AAChC,IAAM,mBAAA,GAAsB,GAAA;AAmC5B,SAAS,iBAAiB,KAAA,EAAwB;AAChD,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,MAAW,MAAM,KAAA,EAAO;AACtB,IAAA,IAAI,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA,EAAG;AACpB,IAAA,KAAA,IAAS,CAAA;AACT,IAAA,IAAI,eAAA,CAAgB,EAAE,CAAA,EAAG,SAAA,IAAa,CAAA;AAAA,EACxC;AACA,EAAA,OAAO,KAAA,GAAQ,CAAA,IAAK,SAAA,GAAY,KAAA,GAAQ,GAAA;AAC1C;AAGO,SAAS,iBAAiB,KAAA,EAAuB;AACtD,EAAA,IAAI,gBAAA,CAAiB,KAAK,CAAA,EAAG;AAC3B,IAAA,IAAI,SAAA,GAAY,CAAA;AAChB,IAAA,KAAA,MAAW,MAAM,KAAA,EAAO;AACtB,MAAA,IAAI,CAAC,KAAA,CAAM,IAAA,CAAK,EAAE,GAAG,SAAA,IAAa,CAAA;AAAA,IACpC;AACA,IAAA,IAAI,SAAA,IAAa,GAAG,OAAO,IAAA;AAC3B,IAAA,IAAI,SAAA,IAAa,IAAI,OAAO,GAAA;AAC5B,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAA,GAAS,WAAW,KAAK,CAAA;AAC/B,EAAA,IAAI,MAAA,IAAU,GAAG,OAAO,GAAA;AACxB,EAAA,IAAI,MAAA,IAAU,GAAG,OAAO,IAAA;AACxB,EAAA,OAAO,IAAA;AACT;AAEA,IAAM,KAAA,GAAQ;AAAA;AAAA;AAAA,CAAA;AAKd,IAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,EAKZ,KAAK;AAAA;AAAA;AAAA,CAAA;AAKT,IAAM,QAAA,GAAW;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,EAKb,KAAK;AAAA;AAAA;AAAA,CAAA;AAKT,IAAM,kBAAA,GAAqB;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,EAKrB,KAAK;AAAA;AAAA;AAAA,CAAA;AAKX,IAAM,cAAA,GAAiB;AAAA;AAAA;AAAA;AAAA,EAAA,EAInB,KAAK;AAAA,CAAA;AAGT,IAAMkD,QAAAA,GAAU,iEAAA;AAGT,SAASY,eAAc,MAAA,EAAmC;AAC/D,EAAA,MAAM,KAAA,GAAQ,MAAA,CACX,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,IAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,IAAA,IAAI,CAAC,OAAO,QAAA,CAAS,CAAC,GAAG,MAAM,IAAI,UAAU,6BAA6B,CAAA;AAC1E,IAAA,OAAO,OAAO,CAAC,CAAA;AAAA,EACjB,CAAC,CAAA,CACA,IAAA,CAAK,GAAG,CAAA;AACX,EAAA,OAAO,KAAK,KAAK,CAAA,UAAA,CAAA;AACnB;AAEA,SAAS,OAAO,GAAA,EAAqB;AACnC,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA,EAAA,EAIL,KAAK;AAAA,yBAAA,EACkB,GAAG;AAAA;AAAA,CAAA;AAG9B;AAEA,SAAS,YAAY,GAAA,EAAqB;AACxC,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,EAKH,KAAK;AAAA;AAAA;AAAA,uBAAA,EAGc,GAAG;AAAA;AAAA,CAAA;AAG5B;AAEA,SAAS,MAAM,IAAA,EAAwC;AACrD,EAAA,OAAO,KAAK,GAAA,CAAI,CAAC,MAAM,MAAA,CAAO,CAAA,CAAE,EAAE,CAAC,CAAA;AACrC;AAEO,IAAM,kBAAN,MAAgD;AAAA,EACrD,WAAA,GAAc,IAAA;AAAA,EACd,YAAA,GAAe,IAAA;AAAA,EACf,WAAA,GAAc,IAAA;AAAA,EAEG,IAAA;AAAA,EACA,sBAAA;AAAA;AAAA,EAET,aAAA,GAAgC,IAAA;AAAA,EAExC,WAAA,CAAY,MAAY,cAAA,EAAgC;AACtD,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,yBAAyB,cAAA,IAAkB,IAAA;AAAA,EAClD;AAAA,EAEA,IAAY,cAAA,GAAyB;AACnC,IAAA,OAAO,KAAK,sBAAA,IAA0B,mBAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,YAAY,KAAA,EAAgE;AAClF,IAAA,OAAO;AAAA,MACL,MAAM,SAAA,IAAa,IAAA,GAAO,CAAC,GAAG,KAAA,CAAM,SAAS,CAAA,GAAI,IAAA;AAAA,MACjD,MAAM,UAAA,IAAc,IAAA,GAAO,CAAC,GAAG,KAAA,CAAM,UAAU,CAAA,GAAI,IAAA;AAAA,MACnD,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,MAAM,KAAA,CAAM,KAAA,IAAS,EAAE,CAAC;AAAA,KAC3C;AAAA,EACF;AAAA,EAEA,MAAM,YAAA,CACJ,UAAA,EACA,QAAA,EACA,KACA,MAAA,EACiB;AACjB,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,EAAQ;AACvC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,CAAO,MAAM,OAAO,CAAA;AAC1B,MAAA,MAAM,MAAA,CAAO,KAAA,CAAM,0DAAA,EAA4D,CAAC,UAAU,CAAC,CAAA;AAC3F,MAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,QAAA,MAAM,MAAM,CAAA,CAAE,SAAA,IAAa,OAAOA,cAAAA,CAAc,CAAA,CAAE,SAAS,CAAA,GAAI,MAAA;AAC/D,QAAA,MAAM,MAAA,CAAO,KAAA;AAAA,UACX,CAAA;AAAA;AAAA,+CAAA,EAEuC,GAAG,CAAA,YAAA,CAAA;AAAA,UAC1C;AAAA,YACEjC,iBAAAA,EAAW;AAAA,YACX,UAAA;AAAA,YACA,QAAA;AAAA,YACA,GAAA;AAAA,YACA,CAAA,CAAE,GAAA;AAAA,YACF,CAAA,CAAE,IAAA;AAAA,YACF,EAAE,IAAA,IAAQ,IAAA;AAAA,YACV,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,IAAA,IAAQ,EAAE;AAAA;AAC7B,SACF;AAAA,MACF;AACA,MAAA,MAAM,MAAA,CAAO,MAAM,QAAQ,CAAA;AAAA,IAC7B,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,CAAO,MAAM,UAAU,CAAA;AAAA,MAC/B,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,MAAM,GAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,MAAA,CAAO,OAAA,EAAQ;AAAA,IACjB;AACA,IAAA,OAAO,MAAA,CAAO,MAAA;AAAA,EAChB;AAAA,EAEA,MAAM,aAAa,UAAA,EAAmC;AACpD,IAAA,MAAM,KAAK,IAAA,CAAK,KAAA,CAAM,0DAAA,EAA4D,CAAC,UAAU,CAAC,CAAA;AAAA,EAChG;AAAA,EAEA,MAAM,qBAAA,CAAsB,UAAA,EAAoB,OAAA,EAA+C;AAC7F,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,EAAQ;AACvC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,CAAO,MAAM,OAAO,CAAA;AAC1B,MAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,MAAA,CAAO,KAAA;AAAA,QAC5B,CAAA,wEAAA,CAAA;AAAA,QACA,CAAC,UAAU;AAAA,OACb;AACA,MAAA,IAAI,IAAA,CAAK,MAAA,KAAW,OAAA,CAAQ,MAAA,EAAQ;AAClC,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,+CAA+C,UAAU,CAAA,EAAA,EAAK,KAAK,MAAM,CAAA,gBAAA,EAAmB,QAAQ,MAAM,CAAA,iBAAA;AAAA,SAC5G;AAAA,MACF;AACA,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,QAAA,MAAM,MAAA,CAAO,KAAA;AAAA,UACX,CAAA,6CAAA,EAAgDiC,cAAAA,CAAc,OAAA,CAAQ,CAAC,CAAE,CAAC,CAAA,cAAA,CAAA;AAAA,UAC1E,CAAC,IAAA,CAAK,CAAC,CAAA,CAAG,EAAE;AAAA,SACd;AAAA,MACF;AACA,MAAA,MAAM,MAAA,CAAO,MAAM,QAAQ,CAAA;AAC3B,MAAA,OAAO,IAAA,CAAK,MAAA;AAAA,IACd,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,CAAO,MAAM,UAAU,CAAA;AAAA,MAC/B,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,MAAM,GAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,MAAA,CAAO,OAAA,EAAQ;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,MAAM,cAAA,CAAe,UAAA,EAAoB,GAAA,EAAuC;AAC9E,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA,gEAAA,CAAA,EAAoE;AAAA,MACpG,GAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,OAAO,IAAI,QAAA,IAAY,CAAA;AAAA,EACzB;AAAA,EAEA,MAAM,SAAA,CAAU,QAAA,EAA6B,KAAA,EAAuC;AAClF,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,MAAA,IAAI;AACF,QAAA,IAAIZ,QAAAA,CAAQ,IAAA,CAAK,MAAA,CAAO,GAAG,CAAC,GAAG,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,MACxD,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AACA,IAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAQ,OAAO,EAAC;AAC5B,IAAA,MAAM,CAAC,GAAA,EAAK,UAAU,CAAA,GAAI,IAAA,CAAK,YAAY,KAAK,CAAA;AAChD,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,cAAA,EAAgB,CAAC,GAAA,EAAK,UAAA,EAAY,MAAM,CAAC,CAAA;AAChF,IAAA,MAAMa,QAAAA,GAAU,IAAI,GAAA,CAAI,KAAA,CAAM,IAAI,CAAC,CAAA;AACnC,IAAA,OAAO,QAAA,CAAS,MAAA,CAAO,CAAC,GAAA,KAAQA,QAAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AAAA,EACtE;AAAA,EAEA,MAAM,SAAA,CAAU,KAAA,EAAe,KAAA,EAAuC;AACpE,IAAA,MAAM,CAAC,GAAA,EAAK,UAAA,EAAY,GAAG,CAAA,GAAI,IAAA,CAAK,YAAY,KAAK,CAAA;AACrD,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,OAAA,EAAS,CAAC,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,GAAG,CAAC,CAAA;AAC7E,IAAA,OAAO,MAAM,IAAI,CAAA;AAAA,EACnB;AAAA,EAEA,MAAM,UAAA,CAAW,KAAA,EAAe,KAAA,EAAuC;AACrE,IAAA,MAAM,SAAA,GAAY,iBAAiB,KAAK,CAAA;AACxC,IAAA,MAAM,CAAC,GAAA,EAAK,UAAA,EAAY,GAAG,CAAA,GAAI,IAAA,CAAK,YAAY,KAAK,CAAA;AACrD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,EAAQ;AACvC,IAAA,IAAI,QAAA,GAA0B,IAAA;AAC9B,IAAA,IAAI,YAAA,GAAe,KAAA;AACnB,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,CAAO,MAAM,OAAO,CAAA;AAC1B,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,kBAAA,CAAmB,QAAQ,SAAS,CAAA;AAC/D,MAAA,QAAA,GAAW,OAAA,CAAQ,QAAA;AACnB,MAAA,YAAA,GAAe,OAAA,CAAQ,YAAA;AACvB,MAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,MAAA,CAAO,KAAA,CAAM,QAAA,EAAU,CAAC,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,GAAG,CAAC,CAAA;AAC3E,MAAA,IAAI,YAAA,EAAc,MAAM,IAAA,CAAK,gBAAA,CAAiB,QAAQ,QAAQ,CAAA;AAC9D,MAAA,MAAM,MAAA,CAAO,MAAM,QAAQ,CAAA;AAC3B,MAAA,OAAO,MAAM,IAAI,CAAA;AAAA,IACnB,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,CAAO,MAAM,UAAU,CAAA;AAC7B,QAAA,IAAI,YAAA,EAAc,MAAM,IAAA,CAAK,gBAAA,CAAiB,QAAQ,QAAQ,CAAA;AAAA,MAChE,CAAA,CAAA,MAAQ;AACN,QAAA,OAAA,CAAQ,KAAK,2CAA2C,CAAA;AAAA,MAC1D;AACA,MAAA,MAAM,GAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,MAAA,CAAO,OAAA,EAAQ;AAAA,IACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,MAAc,kBAAA,CACZ,MAAA,EACA,SAAA,EAC6D;AAC7D,IAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,KAAA,CAAM,4BAA4B,CAAA;AAC7D,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,EAAG,GAAA,IAAO,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,CAAE,GAAG,CAAA,GAAI,IAAA;AAC1E,IAAA,MAAM,MAAA,CAAO,KAAA,CAAM,sBAAA,EAAwB,CAAC,SAAS,CAAC,CAAA;AACtD,IAAA,OAAO,EAAE,QAAA,EAAU,YAAA,EAAc,IAAA,EAAK;AAAA,EACxC;AAAA,EAEA,MAAc,gBAAA,CAAiB,MAAA,EAAoB,QAAA,EAAwC;AACzF,IAAA,IAAI,YAAY,IAAA,EAAM;AACtB,IAAA,MAAM,MAAA,CAAO,KAAA,CAAM,sBAAA,EAAwB,CAAC,QAAQ,CAAC,CAAA;AAAA,EACvD;AAAA,EAEA,MAAM,SAAA,CAAU,MAAA,EAA2B,KAAA,EAAuC;AAChF,IAAA,MAAM,OAAA,GAAUD,eAAc,MAAM,CAAA;AACpC,IAAA,MAAM,CAAC,GAAA,EAAK,UAAA,EAAY,GAAG,CAAA,GAAI,IAAA,CAAK,YAAY,KAAK,CAAA;AACrD,IAAA,MAAM,MAAA,GAAS,GAAA,KAAQ,IAAA,IAAQ,UAAA,KAAe,IAAA;AAC9C,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,EAAQ;AACvC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,CAAO,MAAM,OAAO,CAAA;AAC1B,MAAA,IAAI,UAAW,MAAM,IAAA,CAAK,gBAAgB,MAAA,EAAQ,GAAA,EAAK,UAAU,CAAA,EAAI;AACnE,QAAA,MAAM,EAAE,IAAA,EAAAE,KAAAA,EAAK,GAAI,MAAM,MAAA,CAAO,KAAA,CAAM,WAAA,CAAY,OAAO,CAAA,EAAG,CAAC,GAAA,EAAK,UAAA,EAAY,GAAG,CAAC,CAAA;AAChF,QAAA,MAAM,MAAA,CAAO,MAAM,QAAQ,CAAA;AAC3B,QAAA,OAAO,MAAMA,KAAI,CAAA;AAAA,MACnB;AACA,MAAA,MAAM,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,GAAA,EAAK,MAAM,CAAA;AAC1C,MAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,OAAO,CAAA,EAAG,CAAC,GAAA,EAAK,UAAA,EAAY,GAAG,CAAC,CAAA;AAC3E,MAAA,MAAM,MAAA,CAAO,MAAM,QAAQ,CAAA;AAC3B,MAAA,OAAO,MAAM,IAAI,CAAA;AAAA,IACnB,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,CAAO,MAAM,UAAU,CAAA;AAAA,MAC/B,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,MAAM,GAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,MAAA,CAAO,OAAA,EAAQ;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,MAAc,eAAA,CACZ,MAAA,EACA,GAAA,EACA,UAAA,EACkB;AAClB,IAAA,MAAM,GAAA,GAAM,KAAK,cAAA,GAAiB,CAAA;AAClC,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,MAAA,CAAO,KAAA,CAAM,kBAAA,EAAoB,CAAC,GAAA,EAAK,UAAA,EAAY,GAAG,CAAC,CAAA;AAC9E,IAAA,OAAO,OAAO,IAAA,CAAK,CAAC,GAAG,KAAA,IAAS,CAAC,KAAK,IAAA,CAAK,cAAA;AAAA,EAC7C;AAAA,EAEA,MAAc,WAAA,CAAY,MAAA,EAAoB,KAAA,EAAe,MAAA,EAAgC;AAC3F,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,GAAI,CAAA,EAAG,iBAAiB,CAAA,EAAG,iBAAiB,CAAA;AAC/F,IAAA,MAAM,MAAA,CAAO,KAAA,CAAM,CAAA,2BAAA,EAA8B,QAAQ,CAAA,CAAE,CAAA;AAC3D,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,IAAI,CAAE,MAAM,IAAA,CAAK,mBAAA,CAAoB,MAAM,CAAA,EAAI;AAC/C,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,UAAA,CAAW,QAAQ,KAAK,CAAA;AAClD,IAAA,MAAM,MAAA,CAAO,KAAA,CAAM,CAAA,iCAAA,EAAoC,MAAM,CAAA,CAAE,CAAA;AAC/D,IAAA,MAAM,MAAA,CAAO,KAAA,CAAM,CAAA,qCAAA,EAAwC,uBAAuB,CAAA,CAAE,CAAA;AAAA,EACtF;AAAA,EAEA,MAAc,UAAA,CAAW,MAAA,EAAoB,KAAA,EAAgC;AAC3E,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,MAAA,CAAO,KAAA;AAAA,MAC5B,CAAA,yFAAA;AAAA,KACF;AACA,IAAA,IAAI,IAAI,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,KAAK,CAAC,CAAA;AAC9B,IAAA,IAAI,CAAA,IAAK,GAAG,CAAA,GAAI,mBAAA;AAChB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,iBAAiB,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,GAAI,gBAAgB,CAAA;AAC/F,IAAA,OAAO,IAAA,CAAK,IAAI,IAAA,CAAK,GAAA,CAAI,QAAQ,mBAAA,GAAsB,CAAC,GAAG,mBAAmB,CAAA;AAAA,EAChF;AAAA,EAEA,MAAc,oBAAoB,MAAA,EAAsC;AACtE,IAAA,IAAI,IAAA,CAAK,kBAAkB,IAAA,EAAM;AAC/B,MAAA,IAAA,CAAK,aAAA,GAAgB,MAAM,IAAA,CAAK,qBAAA,CAAsB,MAAM,CAAA;AAC5D,MAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACvB,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,CAAA,oBAAA,EAAuB,0BAAA,CAA2B,IAAA,CAAK,GAAG,CAAC,CAAA,kGAAA;AAAA,SAE7D;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,KAAK,aAAA,EAAe;AACtB,MAAA,MAAM,MAAA,CAAO,MAAM,+CAA+C,CAAA;AAAA,IACpE;AACA,IAAA,OAAO,OAAA,CAAQ,KAAK,aAAa,CAAA;AAAA,EACnC;AAAA,EAEA,MAAc,sBAAsB,MAAA,EAAsC;AACxE,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,MAAA,CAAO,MAAM,CAAA,4DAAA,CAA8D,CAAA;AAClG,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,CAAC,CAAA,EAAG,UAAA;AACrB,IAAA,IAAI,CAAC,KAAK,OAAO,KAAA;AACjB,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,GAAG,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,EAAG;AACtD,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AACtC,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA,IAC3B;AACA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,0BAAA,CAA2B,QAAQ,CAAA,EAAA,EAAK;AAC1D,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA;AACtB,MAAA,MAAM,CAAA,GAAI,2BAA2B,CAAC,CAAA;AACtC,MAAA,IAAI,CAAA,GAAI,GAAG,OAAO,IAAA;AAClB,MAAA,IAAI,CAAA,GAAI,GAAG,OAAO,KAAA;AAAA,IACpB;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;ACjdA,SAAS,WAAW,EAAA,EAA6C;AAC/D,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,SAAA,CAAU,QAAA,CAAS,KAAK,EAAE,CAAA;AAC/C,EAAA,MAAM,KAAA,GACJ,GAAA,CAAI,KAAA,CAAM,2DAA2D,CAAA,IACrE,GAAA,CAAI,KAAA,CAAM,gCAAgC,CAAA,IAC1C,GAAA,CAAI,KAAA,CAAM,qCAAqC,CAAA;AACjD,EAAA,MAAM,GAAA,GAAA,CAAO,KAAA,GAAQ,CAAC,CAAA,IAAK,IAAI,IAAA,EAAK;AACpC,EAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAC;AAClB,EAAA,OAAO,GAAA,CACJ,KAAA,CAAM,GAAG,CAAA,CACT,GAAA;AAAA,IACC,CAAC,CAAA,KACC,CAAA,CACG,IAAA,GACA,OAAA,CAAQ,mBAAA,EAAqB,EAAE,CAAA,CAC/B,QAAQ,SAAA,EAAW,EAAE,CAAA,CACrB,IAAA,GACA,OAAA,CAAQ,eAAA,EAAiB,EAAE,CAAA,CAC3B,QAAQ,cAAA,EAAgB,EAAE,CAAA,CAC1B,OAAA,CAAQ,iBAAiB,EAAE,CAAA,CAC3B,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA,CACpB,KAAA,CAAM,KAAK,CAAA,CACX,KAAI,IAAK;AAAA,IAEf,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,iBAAA,EAAmB,EAAE,CAAC,CAAA,CAC3C,OAAO,CAAC,CAAA,KAAM,KAAK,CAAA,KAAM,MAAA,IAAU,MAAM,KAAK,CAAA;AACnD;AAOO,SAAS,aAAa,EAAA,EAAkD;AAC7E,EAAA,MAAM,IAAA,GAAO,GAAG,IAAA,IAAQ,WAAA;AACxB,EAAA,MAAM,KAAA,GAAQ,WAAW,EAAE,CAAA;AAC3B,EAAA,MAAM,gBAAgB,EAAA,CAAG,MAAA;AACzB,EAAA,MAAM,aAAsC,EAAC;AAC7C,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,KAAA,IAAS,CAAA,GAAI,GAAG,CAAA,GAAI,IAAA,CAAK,IAAI,KAAA,CAAM,MAAA,EAAQ,aAAa,CAAA,EAAG,CAAA,EAAA,EAAK;AAC9D,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,CAAC,CAAA,IAAK,MAAM,CAAC,CAAA,CAAA;AAC/B,IAAA,UAAA,CAAW,GAAG,CAAA,GAAI,EAAE,IAAA,EAAM,QAAA,EAAS;AACnC,IAAA,IAAI,CAAA,GAAI,aAAA,EAAe,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA;AAAA,EAC1C;AACA,EAAA,MAAM,WAAA,GAAA,CACH,OAAO,EAAA,KAAO,UAAA,IAAc,KAAA,IAAS,KAAK,MAAA,CAAQ,EAAA,CAAwB,GAAG,CAAA,GAAI,EAAA,KAAO,IAAA;AAE3F,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,IAAA;AAAA,IACJ,IAAA,EAAM,UAAA;AAAA,IACN,QAAA,EAAU,MAAM,IAAI,CAAA,CAAA;AAAA,IACpB,WAAA,EAAa,IAAA;AAAA,IACb,WAAA;AAAA,IACA,YAAA,EAAc,EAAE,IAAA,EAAM,QAAA,EAAU,YAAY,QAAA,EAAS;AAAA,IACrD,gBAAA,EAAkB,KAAA;AAAA,IAClB,gBAAgB,EAAC;AAAA,IACjB,QAAA,EAAU,IAAA;AAAA,IACV,GAAA,EAAK,IAAA;AAAA,IACL,GAAA,EAAK,EAAE,QAAA,EAAU,EAAA;AAAG,GACtB;AACF;;;AC3DA,WAAA,EAAA;AACA,UAAA,EAAA;;;ACJO,SAAS,UAAA,CACd,KACA,UAAA,EACS;AACT,EAAA,IAAI,UAAA,KAAe,MAAM,OAAO,IAAA;AAChC,EAAA,IAAI,GAAA,IAAO,MAAM,OAAO,IAAA;AACxB,EAAA,IAAI,CAAC,GAAA,CAAI,MAAA,EAAQ,OAAO,KAAA;AACxB,EAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,UAAA,IAAc,EAAE,CAAA;AACrC,EAAA,OAAO,IAAI,IAAA,CAAK,CAAC,MAAM,IAAA,CAAK,GAAA,CAAI,CAAC,CAAC,CAAA;AACpC;;;ACRA,WAAA,EAAA;AAMO,IAAM,uBAAA,GAA0B,EAAA;AAIvC,IAAM,YAAA,GAAe,oFAAA;AAyBrB,SAAS,YAAY,GAAA,EAAsB;AACzC,EAAA,MAAM,OAAA,GAAU,IAAI,IAAA,EAAK;AACzB,EAAA,IACE,QAAQ,MAAA,IAAU,CAAA,IAClB,QAAQ,CAAC,CAAA,KAAM,QAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA,KACxC,QAAQ,CAAC,CAAA,KAAM,OAAO,OAAA,CAAQ,CAAC,MAAM,GAAA,CAAA,EACtC;AACA,IAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,EAC5B;AACA,EAAA,IAAI,SAAA,CAAU,KAAK,OAAO,CAAA,SAAU,MAAA,CAAO,QAAA,CAAS,SAAS,EAAE,CAAA;AAC/D,EAAA,IAAI,eAAe,IAAA,CAAK,OAAO,GAAG,OAAO,MAAA,CAAO,WAAW,OAAO,CAAA;AAClE,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,iBAAA,CAAkB,WAAoB,IAAA,EAAwC;AACrF,EAAA,IAAI,OAAO,SAAA,KAAc,QAAA,EAAU,OAAO,IAAA;AAC1C,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,IAAA,CAAK,SAAS,CAAA;AACzC,EAAA,IAAI,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAO,IAAA;AAC3B,EAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,KAAA;AAC/B,EAAA,MAAM,EAAA,GAAK,MAAM,MAAA,CAAO,EAAA;AACxB,EAAA,IAAI,EAAE,SAAA,IAAa,IAAA,CAAA,EAAO,OAAO,IAAA;AACjC,EAAA,MAAM,IAAA,GAAO,KAAK,SAAS,CAAA;AAC3B,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,KAAA,CAAM,MAAA,CAAO,KAAM,CAAA;AAC7C,EAAA,IAAI;AACF,IAAA,QAAQ,EAAA;AAAI,MACV,KAAK,GAAA;AACH,QAAA,OAAQ,IAAA,GAAmB,KAAA;AAAA,MAC7B,KAAK,IAAA;AACH,QAAA,OAAQ,IAAA,IAAoB,KAAA;AAAA,MAC9B,KAAK,GAAA;AACH,QAAA,OAAQ,IAAA,GAAmB,KAAA;AAAA,MAC7B,KAAK,IAAA;AACH,QAAA,OAAQ,IAAA,IAAoB,KAAA;AAAA,MAC9B,KAAK,IAAA;AACH,QAAA,OAAO,IAAA,KAAS,KAAA;AAAA,MAClB,KAAK,IAAA;AACH,QAAA,OAAO,IAAA,KAAS,KAAA;AAAA,MAClB;AACE,QAAA,OAAO,IAAA;AAAA;AACX,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEO,SAAS,qBAAA,CACd,IACA,IAAA,EACS;AACT,EAAA,IAAI,EAAA,CAAG,kBAAkB,OAAO,IAAA;AAChC,EAAA,MAAM,MAAA,GAAS,EAAA,CAAG,cAAA,IAAkB,EAAC;AACrC,EAAA,MAAM,YAAY,MAAA,CAAO,SAAA;AACzB,EAAA,IAAI,CAAC,WAAW,OAAO,KAAA;AACvB,EAAA,OAAO,iBAAA,CAAkB,SAAA,EAAW,IAAA,IAAQ,EAAE,CAAA;AAChD;AAEA,SAAS,YAAY,GAAA,EAA8C;AACjE,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAAA,IACjB,QAAA,EAAU,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA;AAAA,IAC9B,cAAA,EAAiB,GAAA,CAAI,gBAAA,IAAgD,EAAC;AAAA,IACtE,QAAA,EAAW,IAAI,SAAA,IAA+B,IAAA;AAAA,IAC9C,YAAY,GAAA,CAAI,UAAA;AAAA,IAChB,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA;AAAA,IACzB,QAAA,EAAW,IAAI,QAAA,IAA8B,IAAA;AAAA,IAC7C,YAAA,EAAe,IAAI,aAAA,IAAoD,IAAA;AAAA,IACvE,SAAA,EAAW,IAAI,UAAA,GAAa,IAAI,KAAK,MAAA,CAAO,GAAA,CAAI,UAAU,CAAC,CAAA,GAAI,IAAA;AAAA,IAC/D,UAAA,EAAY,IAAI,WAAA,GAAc,IAAI,KAAK,MAAA,CAAO,GAAA,CAAI,WAAW,CAAC,CAAA,GAAI,IAAA;AAAA,IAClE,SAAA,EAAW,IAAI,UAAA,GAAa,IAAI,KAAK,MAAA,CAAO,GAAA,CAAI,UAAU,CAAC,CAAA,GAAI;AAAA,GACjE;AACF;AAEA,SAAS,aAAA,CAAc,YAA6B,UAAA,EAAwD;AAC1G,EAAA,IAAI,UAAA,KAAe,MAAM,OAAO,EAAE,KAAK,MAAA,EAAQ,MAAA,EAAQ,EAAC,EAAE;AAC1D,EAAA,IAAI,CAAC,WAAW,MAAA,EAAQ;AACtB,IAAA,OAAO,EAAE,GAAA,EAAK,CAAA,kDAAA,CAAA,EAAsD,MAAA,EAAQ,EAAC,EAAE;AAAA,EACjF;AACA,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,uEAAuE,UAAU,CAAA,SAAA,CAAA;AAAA,IACtF,MAAA,EAAQ,CAAC,UAAU;AAAA,GACrB;AACF;AAEA,eAAsB,aAAA,CACpB,QACA,IAAA,EAQyB;AACzB,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,IAAU,EAAC;AAC/B,EAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA;AACxC,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,oBAAO,IAAI,IAAA,EAAK;AACvC,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,MAAA,CAAO,eAAA,IAAmB,uBAAuB,CAAA;AACxE,EAAA,MAAM,YAAY,IAAI,IAAA,CAAK,UAAU,OAAA,EAAQ,GAAI,UAAU,GAAM,CAAA;AACjE,EAAA,MAAM,KAAKnC,iBAAAA,EAAW;AACtB,EAAA,MAAM,OAAO,IAAA,CAAK,KAAA;AAAA,IAChB,CAAA;AAAA;AAAA,0DAAA,CAAA;AAAA,IAGA;AAAA,MACE,EAAA;AAAA,MACA,IAAA,CAAK,QAAA;AAAA,MACL,IAAA,CAAK,UAAU,MAAM,CAAA;AAAA,MACrB,KAAK,QAAA,IAAY,IAAA;AAAA,MACjB,KAAK,UAAA,KAAe,MAAA,GAAY,OAAO,IAAA,CAAK,SAAA,CAAU,KAAK,UAAU,CAAA;AAAA,MACrE,SAAA;AAAA,MACA;AAAA;AACF,GACF;AACA,EAAA,OAAO;AAAA,IACL,EAAA;AAAA,IACA,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,cAAA,EAAgB,MAAA;AAAA,IAChB,QAAA,EAAU,KAAK,QAAA,IAAY,IAAA;AAAA,IAC3B,UAAA,EAAY,KAAK,UAAA,IAAc,IAAA;AAAA,IAC/B,MAAA,EAAQ,SAAA;AAAA,IACR,QAAA,EAAU,IAAA;AAAA,IACV,YAAA,EAAc,IAAA;AAAA,IACd,SAAA;AAAA,IACA,UAAA,EAAY,IAAA;AAAA,IACZ;AAAA,GACF;AACF;AAEA,eAAsB,eAAA,CACpB,QACA,UAAA,EACA,QAAA,EACA,UACA,IAAA,GAAuC,IAAA,EACvC,IAAA,GAAyC,EAAC,EACjB;AACzB,EAAA,IAAI,QAAA,KAAa,UAAA,IAAc,QAAA,KAAa,UAAA,EAAY;AACtD,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,KAAK,SAAA,CAAU,QAAQ,CAAC,CAAA,oCAAA,CAAsC,CAAA;AAAA,EACrG;AACA,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,UAAA,KAAe,MAAA,GAAY,OAAO,IAAA,CAAK,UAAA;AAC/D,EAAA,MAAM,GAAA,GAAM,aAAA,CAAc,UAAA,EAAY,CAAC,CAAA;AACvC,EAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,IAAA,CAAK,KAAA;AAAA,IAC/B,CAAA;AAAA;AAAA;AAAA;AAAA,WAAA,EAIS,IAAI,GAAG;AAAA,gBAAA,CAAA;AAAA,IAEhB,CAAC,QAAA,EAAU,QAAA,EAAU,IAAA,CAAK,SAAA,CAAU,IAAA,IAAQ,EAAE,CAAA,EAAG,UAAA,EAAY,GAAG,GAAA,CAAI,MAAM;AAAA,GAC5E;AACA,EAAA,IAAI,MAAA,CAAO,aAAa,CAAA,EAAG,OAAO,YAAY,MAAA,CAAO,IAAA,CAAK,CAAC,CAAE,CAAA;AAE7D,EAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,yDAAA,CAAA,EAA6D;AAAA,IACpG;AAAA,GACD,CAAA;AACD,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA;AAC3B,EAAA,MAAM,aAAA,GACJ,KAAK,UAAA,IAAc,IAAA,IAAQ,IAAI,UAAA,KAAe,IAAA,GAAO,OAAQ,GAAA,CAAI,UAAA;AACnE,EAAA,IAAI,CAAC,GAAA,IAAO,CAAC,UAAA,CAAW,KAAA,CAAM,OAAA,CAAQ,aAAa,CAAA,GAAI,aAAA,GAAgB,IAAA,EAAM,UAAU,CAAA,EAAG;AACxF,IAAA,MAAM,IAAI5B,2BAAmB,WAAW,CAAA;AAAA,EAC1C;AACA,EAAA,IAAI,GAAA,CAAI,WAAW,SAAA,EAAW;AAC5B,IAAA,MAAM,OAAO,IAAA,CAAK,KAAA;AAAA,MAChB,CAAA,gGAAA,CAAA;AAAA,MACA,CAAC,UAAU;AAAA,KACb;AACA,IAAA,MAAM,IAAIC,uBAAA,EAAgB;AAAA,EAC5B;AACA,EAAA,MAAM,IAAID,0BAAA,CAAmB,MAAA,CAAO,GAAA,CAAI,MAAM,CAAC,CAAA;AACjD;;;AC7MA,UAAA,EAAA;AAEO,IAAM,eAAA,GAAkB,GAAA;AACxB,IAAM,sBAAA,GAAyB,GAAA;AAO/B,IAAM,gBAAN,MAAoB;AAAA,EACjB,OAAA,GAAyB,IAAA;AAAA,EACzB,KAAA,GAAuB,IAAA;AAAA,EAE/B,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU,KAAK,GAAA,EAAI;AACxB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,IAAA,GAAa;AACX,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAK,GAAA,EAAI;AACtB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,IAAI,UAAA,GAA4B;AAC9B,IAAA,IAAI,KAAK,OAAA,IAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,IAAS,MAAM,OAAO,IAAA;AACvD,IAAA,OAAO,IAAA,CAAK,QAAQ,IAAA,CAAK,OAAA;AAAA,EAC3B;AACF,CAAA;AAEA,SAAS,SAAS,GAAA,EAAuB;AACvC,EAAA,IAAI,GAAA,IAAO,MAAM,OAAO,GAAA;AACxB,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,EAAA,EAAI,CAAA,KAAO,OAAO,MAAM,QAAA,GAAW,MAAA,CAAO,CAAC,CAAA,GAAI,CAAE,CAAC,CAAA;AAAA,EAC3F,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,IAAA,EAAM,MAAA,CAAO,GAAG,CAAA,EAAE;AAAA,EAC7B;AACF;AAEA,SAAS,eAAe,YAAA,EAA2C;AACjE,EAAA,IAAI,YAAA,IAAgB,IAAA,EAAM,OAAO,CAAC,MAAM,KAAK,CAAA;AAC7C,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI;AACF,IAAA,UAAA,GAAa,IAAA,CAAK,UAAU,YAAY,CAAA;AAAA,EAC1C,CAAA,CAAA,MAAQ;AACN,IAAA,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,YAAY,CAAC,CAAA;AAAA,EAClD;AACA,EAAA,IAAI,UAAA,CAAW,UAAU,eAAA,EAAiB;AACxC,IAAA,IAAI;AACF,MAAA,OAAO,CAAC,IAAA,CAAK,KAAA,CAAM,UAAU,GAAG,KAAK,CAAA;AAAA,IACvC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,CAAC,cAAc,KAAK,CAAA;AAAA,IAC7B;AAAA,EACF;AACA,EAAA,OAAO,CAAC,EAAE,UAAA,EAAY,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,eAAe,CAAA,EAAG,cAAA,EAAgB,UAAA,CAAW,MAAA,EAAO,EAAG,IAAI,CAAA;AACvG;AAEA,SAAS,aAAa,KAAA,EAA+B;AACnD,EAAA,IAAI,KAAA,IAAS,MAAM,OAAO,IAAA;AAC1B,EAAA,MAAM,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAClE,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,sBAAsB,CAAA;AAC7C;AAEA,eAAsB,WAAA,CACpB,QACA,GAAA,EAee;AACf,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,SAAS,GAAA,CAAI,MAAA,IAAU,OAAO,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA,GAAI,IAAA;AAAA,IACnD,WAAW,GAAA,CAAI,QAAA;AAAA,IACf,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,UAAA,EAAY,IAAI,SAAA,IAAa,IAAA;AAAA,IAC7B,UAAU,GAAA,CAAI,OAAA,IAAW,OAAO,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA,GAAI,IAAA;AAAA,IACtD,MAAA,EAAQ,IAAI,MAAA,IAAU,IAAA;AAAA,IACtB,UAAA,EAAY,GAAA,CAAI,SAAA,IAAa,EAAC;AAAA,IAC9B,eAAe,GAAA,CAAI,YAAA;AAAA,IACnB,OAAA,EAAS,IAAI,OAAA,IAAW,IAAA;AAAA,IACxB,OAAO,GAAA,CAAI,KAAA,IAAS,OAAO,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA,GAAI,IAAA;AAAA,IAC/C,WAAA,EAAa,IAAI,UAAA,IAAc,IAAA;AAAA,IAC/B,KAAA,EAAO,IAAI,KAAA,IAAS,IAAA;AAAA,IACpB,WAAA,EAAa,IAAI,UAAA,IAAc;AAAA,GACjC;AACA,EAAA,IAAI;AACF,IAAA,YAAA,CAAa,MAAA,CAAO,OAAO,KAAK,CAAA;AAAA,EAClC,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,IAAI;AACF,IAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,cAAA,CAAe,IAAI,YAAY,CAAA;AAC3D,IAAA,MAAM,OAAO,QAAA,CAAS,GAAA,CAAI,aAAa,EAAE,KAAK,EAAC;AAC/C,IAAA,MAAM,OAAO,IAAA,CAAK,KAAA;AAAA,MAChB,CAAA;AAAA;AAAA;AAAA,gFAAA,CAAA;AAAA,MAIA;AAAA,QACE4B,iBAAAA,EAAW;AAAA,QACX,IAAI,MAAA,IAAU,IAAA;AAAA,QACd,GAAA,CAAI,QAAA;AAAA,QACJ,GAAA,CAAI,IAAA;AAAA,QACJ,IAAI,SAAA,IAAa,IAAA;AAAA,QACjB,IAAI,OAAA,IAAW,IAAA,GAAO,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA,GAAI,IAAA;AAAA,QAC5C,IAAI,MAAA,IAAU,KAAA;AAAA,QACd,IAAA,CAAK,UAAU,IAAI,CAAA;AAAA,QACnB,IAAA,CAAK,UAAU,MAAM,CAAA;AAAA,QACrB,SAAA;AAAA,QACA,IAAI,OAAA,IAAW,IAAA;AAAA,QACf,YAAA,CAAa,IAAI,KAAK,CAAA;AAAA,QACtB,IAAI,UAAA,IAAc,IAAA;AAAA,QAClB,IAAI,KAAA,IAAS,CAAA;AAAA,QACb,IAAI,UAAA,IAAc;AAAA;AACpB,KACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;;;ACjIA,IAAM,KAAA,GAA6B,CAAC,MAAA,EAAQ,IAAA,EAAM,OAAO,UAAU,CAAA;AAsB5D,IAAM,UAAA,GAAN,MAAM,WAAA,CAAW;AAAA,EACtB,EAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAA;AAAA,EACA,gBAAA;AAAA,EACA,cAAA;AAAA,EACA,OAAA;AAAA,EAEA,YAAY,IAAA,EAAsB;AAChC,IAAA,IAAA,CAAK,EAAA,GAAK,KAAK,EAAA,IAAM,IAAA;AACrB,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,WAAA,GAAc,KAAK,WAAA,IAAe,EAAA;AACvC,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,IAAU,EAAC;AAC9B,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,SAAA,IAAa,IAAA;AACnD,IAAA,IAAA,CAAK,GAAA,GAAM,KAAK,GAAA,IAAO,IAAA;AACvB,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA,CAAK,gBAAA,IAAoB,IAAA,CAAK,iBAAA,IAAqB,KAAA;AAC3E,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA,CAAK,cAAA,IAAkB,IAAA,CAAK,mBAAmB,EAAC;AACtE,IAAA,IAAA,CAAK,OAAA,GAAU,KAAK,OAAA,IAAW,IAAA;AAAA,EACjC;AAAA,EAEA,OAAO,YAAY,IAAA,EAA2B;AAC5C,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA,KAAS,YAAY,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC5D,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACjD;AACA,IAAA,MAAM,CAAA,GAAI,IAAA;AACV,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,CAAA,CAAE,IAAA,IAAQ,EAAE,CAAA;AAChC,IAAA,IAAI,CAAC,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA,EAAG;AACzB,MAAA,MAAM,IAAI,MAAM,CAAA,0CAAA,EAA6C,IAAA,CAAK,UAAU,CAAA,CAAE,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IACvF;AACA,IAAA,MAAM,OAAO,MAAA,CAAO,CAAA,CAAE,IAAA,IAAQ,EAAE,EAAE,IAAA,EAAK;AACvC,IAAA,IAAI,CAAC,IAAA,EAAM,MAAM,IAAI,MAAM,kBAAkB,CAAA;AAC7C,IAAA,OAAO,IAAI,WAAA,CAAW;AAAA,MACpB,IAAI,CAAA,CAAE,EAAA,IAAM,OAAO,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA,GAAI,IAAA;AAAA,MAClC,IAAA;AAAA,MACA,IAAA;AAAA,MACA,aAAa,CAAA,CAAE,WAAA,IAAe,OAAO,MAAA,CAAO,CAAA,CAAE,WAAW,CAAA,GAAI,EAAA;AAAA,MAC7D,MAAA,EAAS,CAAA,CAAE,MAAA,IAAkD,EAAC;AAAA,MAC9D,QAAA,EAAW,CAAA,CAAE,QAAA,IAAY,CAAA,CAAE,SAAA;AAAA,MAC3B,GAAA,EAAM,EAAE,GAAA,IAAuC,IAAA;AAAA,MAC/C,kBAAkB,OAAA,CAAQ,CAAA,CAAE,gBAAA,IAAoB,CAAA,CAAE,qBAAqB,KAAK,CAAA;AAAA,MAC5E,cAAA,EAAiB,CAAA,CAAE,cAAA,IAAkB,CAAA,CAAE,mBAAmB,EAAC;AAAA,MAC3D,SAAS,CAAA,CAAE,OAAA,KAAY,SAAY,IAAA,GAAO,OAAA,CAAQ,EAAE,OAAO;AAAA,KAC5D,CAAA;AAAA,EACH;AACF;AAEA,IAAM,OAAA,GAAqD;AAAA,EACzD,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,GAAA,EAAK,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,yCAAA,EAA0C;AAAA,MAC9E,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,MAAM,CAAC,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,SAAS,QAAQ,CAAA;AAAA,QAC9C,OAAA,EAAS;AAAA,OACX;AAAA,MACA,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,QAAA;AAAA,QACN,oBAAA,EAAsB,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QACvC,SAAA,EAAW;AAAA,OACb;AAAA,MACA,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,aAAA,EAAe;AAAA,QACb,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,kBAAA,EAAoB;AAAA,QAClB,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA;AACf,KACF;AAAA,IACA,QAAA,EAAU,CAAC,KAAA,EAAO,QAAQ;AAAA,GAC5B;AAAA,EACA,EAAA,EAAI;AAAA,IACF,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,CAAC,YAAA,EAAc,OAAA,EAAS,WAAW,OAAA,EAAS,QAAA,EAAU,QAAA,EAAU,YAAA,EAAc,WAAW;AAAA,OACjG;AAAA,MACA,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACvB,IAAA,EAAM,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,MACxB,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MAC3B,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MAC3B,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAU,WAAW,IAAA,EAAK;AAAA,MAC5C,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,CAAC,UAAA,EAAY,WAAA,EAAa,MAAM,CAAA;AAAA,QACtC,OAAA,EAAS;AAAA,OACX;AAAA,MACA,QAAA,EAAU,EAAE,IAAA,EAAM,SAAA,EAAW,SAAS,GAAA,EAAK;AAAA,MAC3C,eAAA,EAAiB,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,EAAE,IAAA,EAAM,UAAS;AAAE,KAC9D;AAAA,IACA,QAAA,EAAU,CAAC,QAAA,EAAU,UAAU;AAAA,GACjC;AAAA,EACA,GAAA,EAAK;AAAA,IACH,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,GAAA,EAAK,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACtB,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAU,MAAM,CAAC,KAAA,EAAO,MAAA,EAAQ,WAAW,CAAA,EAAE;AAAA,MAChE,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa,iCAAA;AAAA,QACb,SAAA,EAAW;AAAA,OACb;AAAA,MACA,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,QAAA;AAAA,QACN,oBAAA,EAAsB,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QACvC,SAAA,EAAW;AAAA;AACb,KACF;AAAA,IACA,QAAA,EAAU,CAAC,KAAA,EAAO,WAAW;AAAA,GAC/B;AAAA,EACA,QAAA,EAAU;AAAA,IACR,IAAA,EAAM,QAAA;AAAA,IACN,YAAY;AAAC;AAEjB,CAAA;AAEO,SAAS,aAAa,IAAA,EAAyC;AACpE,EAAA,MAAM,MAAA,GAAS,QAAQ,IAAI,CAAA;AAC3B,EAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,KAAA,CAAM,sBAAsB,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA,CAAE,CAAA;AACzE,EAAA,OAAO,MAAA;AACT;;;AJ/IA,OAAA,EAAA;;;AKZA,IAAMc,WAAAA,GAAa,GAAA;AAEnB,IAAM,0BAAA,uBAAiC,GAAA,CAAI;AAAA,EACzC,YAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AAAA,EACA,oBAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,SAAS,cAAc,KAAA,EAAuB;AAC5C,EAAA,OAAO,kBAAA,CAAmB,KAAK,CAAA,CAAE,OAAA;AAAA,IAC/B,UAAA;AAAA,IACA,CAAC,CAAA,KAAM,CAAA,CAAA,EAAI,CAAA,CAAE,UAAA,CAAW,CAAC,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,WAAA,EAAa,CAAA;AAAA,GACvD;AACF;AAEA,SAASnB,QAAAA,CACP,QACA,IAAA,EACyB;AACzB,EAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,EAAC;AACrB,EAAA,MAAM,UAAA,GAAc,MAAA,CAAO,UAAA,IAAsD,EAAC;AAClF,EAAA,MAAM,QAAA,GAAY,MAAA,CAAO,QAAA,IAAsC,EAAC;AAChE,EAAA,MAAM,SAAkC,EAAC;AACzC,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,EAAG;AACzC,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAG,CAAA;AACtB,IAAA,IAAI,QAAA,CAAS,SAAS,GAAG,CAAA,KAAM,UAAU,MAAA,IAAa,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,EAAA,CAAA,EAAK;AACrF,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gCAAA,EAAmC,GAAG,CAAA,CAAE,CAAA;AAAA,IAC1D;AACA,IAAA,IAAI,UAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA,EAC3D;AACA,EAAA,OAAO,MAAA;AACT;AAkBA,SAAS,SAAA,CAAU,KAAa,MAAA,EAAyC;AACvE,EAAA,MAAM,GAAA,GAAM,IAAI,eAAA,EAAgB;AAChC,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AAC3C,IAAA,IAAI,CAAA,KAAM,MAAA,IAAa,CAAA,KAAM,IAAA,EAAM;AACnC,IAAA,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,EACtB;AACA,EAAA,MAAM,CAAA,GAAI,IAAI,QAAA,EAAS;AACvB,EAAA,IAAI,CAAC,GAAG,OAAO,GAAA;AACf,EAAA,OAAO,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,GAAI,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,GAAK,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA;AACxD;AAEA,eAAe,eAAe,IAAA,EAY3B;AACD,EAAA,IAAI,MAAM,IAAA,CAAK,GAAA;AACf,EAAA,IAAI,KAAK,MAAA,EAAQ,GAAA,GAAM,SAAA,CAAU,GAAA,EAAK,KAAK,MAAM,CAAA;AACjD,EAAA,MAAM,UAAkC,EAAE,GAAI,IAAA,CAAK,OAAA,IAAW,EAAC,EAAG;AAClE,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAW;AAC3B,IAAA,OAAA,CAAQ,cAAc,CAAA,GAAI,OAAA,CAAQ,cAAc,CAAA,IAAK,OAAA,CAAQ,cAAc,CAAA,IAAK,kBAAA;AAChF,IAAA,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AAAA,EACjC,CAAA,MAAA,IAAW,IAAA,CAAK,OAAA,KAAY,MAAA,EAAW;AACrC,IAAA,IAAA,GAAO,IAAA,CAAK,OAAA;AAAA,EACd;AACA,EAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,IAC5B,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,OAAA;AAAA,IACA,IAAA;AAAA,IACA,QAAA,EAAU,QAAA;AAAA,IACV,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQmB,WAAU;AAAA,GACvC,CAAA;AACD,EAAA,MAAM,cAAsC,EAAC;AAC7C,EAAA,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AAC7B,IAAA,WAAA,CAAY,CAAC,CAAA,GAAI,CAAA;AAAA,EACnB,CAAC,CAAA;AACD,EAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,EAAK;AAC7B,EAAA,OAAO;AAAA,IACL,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,OAAA,EAAS,WAAA;AAAA,IACT,MAAM,IAAA,GAAO;AACX,MAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,IACxB,CAAA;AAAA,IACA,MAAM,IAAA,GAAO;AACX,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,GACF;AACF;AAEA,eAAsB,WAAA,CACpB,MAAA,EACA,IAAA,EACA,IAAA,GAA2C,EAAC,EACV;AAClC,EAAA,MAAM,SAAS,MAAA,CAAO,MAAA,CAAO,MAAA,IAAU,KAAK,EAAE,WAAA,EAAY;AAC1D,EAAA,IAAI,MAAM,MAAA,CAAO,GAAA;AACjB,EAAA,MAAM,UAAU,EAAE,GAAK,MAAA,CAAO,OAAA,IAAkD,EAAC,EAAG;AACpF,EAAA,MAAM,eAAe,EAAE,GAAK,MAAA,CAAO,UAAA,IAAsD,EAAC,EAAG;AAC7F,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,EAAA,MAAM,WAAA,GAAc,QAAQ,EAAC;AAE7B,EAAA,MAAM,WAAA,GAAcnB,QAAAA,CAAQ,MAAA,CAAO,kBAAA,EAA2D,WAAW,CAAA;AACzG,EAAA,MAAM,UAAA,GAAaA,QAAAA,CAAQ,MAAA,CAAO,aAAA,EAAsD,WAAW,CAAA;AAEnG,EAAA,IAAI,GAAA,EAAK,QAAA,CAAS,IAAI,CAAA,EAAG;AACvB,IAAA,KAAA,MAAW,MAAA,IAAU,CAAC,WAAA,EAAa,UAAU,CAAA,EAAG;AAC9C,MAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAG;AACrC,QAAA,MAAM,WAAA,GAAc,KAAK,GAAG,CAAA,EAAA,CAAA;AAC5B,QAAA,IAAI,GAAA,CAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAC7B,UAAA,GAAA,GAAM,GAAA,CAAI,WAAW,WAAA,EAAa,aAAA,CAAc,OAAO,MAAA,CAAO,GAAG,CAAC,CAAC,CAAC,CAAA;AACpE,UAAA,OAAO,OAAO,GAAG,CAAA;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,WAAA,GAAwD;AAAA,IAC5D,MAAA;AAAA,IACA,KAAK,GAAA,IAAO,EAAA;AAAA,IACZ;AAAA,GACF;AAEA,EAAA,IAAI,MAAA,KAAW,KAAA,IAAS,MAAA,KAAW,QAAA,EAAU;AAC3C,IAAA,MAAM,QAAQ,EAAE,GAAG,cAAc,GAAG,WAAA,EAAa,GAAG,UAAA,EAAW;AAC/D,IAAA,IAAI,OAAO,IAAA,CAAK,KAAK,CAAA,CAAE,MAAA,cAAoB,MAAA,GAAS,KAAA;AAAA,EACtD,CAAA,MAAO;AACL,IAAA,MAAM,KAAA,GAAQ,EAAE,GAAG,YAAA,EAAc,GAAG,WAAA,EAAY;AAChD,IAAA,IAAI,OAAO,IAAA,CAAK,KAAK,CAAA,CAAE,MAAA,cAAoB,MAAA,GAAS,KAAA;AAEpD,IAAA,IAAI,WAAoC,EAAC;AACzC,IAAA,IAAI,IAAA,KAAS,MAAA,IAAa,IAAA,KAAS,IAAA,EAAM;AACvC,MAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACpD,QAAA,QAAA,GAAW,EAAE,GAAI,IAAA,EAAiC;AAAA,MACpD,CAAA,MAAA,IAAW,OAAO,IAAA,KAAS,QAAA,EAAU;AACnC,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC9B,UAAA,IAAI,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAClE,YAAA,QAAA,GAAW,MAAA;AAAA,UACb;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AACA,IAAA,MAAA,CAAO,MAAA,CAAO,UAAU,UAAU,CAAA;AAClC,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,CAAE,MAAA,EAAQ;AAChC,MAAA,WAAA,CAAY,IAAA,GAAO,QAAA;AAAA,IACrB,CAAA,MAAA,IAAW,IAAA,KAAS,MAAA,IAAa,IAAA,KAAS,IAAA,EAAM;AAC9C,MAAA,MAAMyC,eAAc,OAAA,CAAQ,cAAc,CAAA,IAAK,OAAA,CAAQ,cAAc,CAAA,IAAK,EAAA;AAC1E,MAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,CAACA,YAAAA,CAAY,QAAA,CAAS,kBAAkB,CAAA,EAAG;AACzE,QAAA,WAAA,CAAY,OAAA,GAAU,IAAA;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,EAAA,MAAM,IAAA,GAAO,SAAS,MAAM,MAAA,CAAO,QAAQ,WAAW,CAAA,GAAI,MAAM,cAAA,CAAe,WAAW,CAAA;AAC1F,EAAA,MAAM,WAAA,GAAc,KAAK,OAAA,CAAQ,cAAc,KAAK,IAAA,CAAK,OAAA,CAAQ,cAAc,CAAA,IAAK,EAAA;AACpF,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI;AACF,IAAA,IAAA,GAAO,WAAA,CAAY,QAAA,CAAS,kBAAkB,CAAA,GAAI,MAAM,KAAK,IAAA,EAAK,GAAI,MAAM,IAAA,CAAK,IAAA,EAAK;AAAA,EACxF,CAAA,CAAA,MAAQ;AACN,IAAA,IAAA,GAAO,MAAM,KAAK,IAAA,EAAK;AAAA,EACzB;AAEA,EAAA,MAAM,cAAsC,EAAC;AAC7C,EAAA,KAAA,MAAW,CAAC,GAAG,CAAC,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,EAAG;AACjD,IAAA,IAAI,CAAC,2BAA2B,GAAA,CAAI,CAAA,CAAE,aAAa,CAAA,EAAG,WAAA,CAAY,CAAC,CAAA,GAAI,CAAA;AAAA,EACzE;AAEA,EAAA,OAAO;AAAA,IACL,aAAa,IAAA,CAAK,MAAA;AAAA,IAClB,OAAA,EAAS,WAAA;AAAA,IACT;AAAA,GACF;AACF;;;AClMO,IAAM,WAAA,GAAc;;;ACCpB,IAAM,QAAA,GAAN,MAAM,SAAA,SAAiB,KAAA,CAAM;AAAA,EAClC,IAAA;AAAA,EACA,IAAA;AAAA,EACA,WAAA,CAAY,IAAA,EAAc,OAAA,EAAiB,IAAA,GAAgB,IAAA,EAAM;AAC/D,IAAA,KAAA,CAAM,CAAA,CAAA,EAAI,IAAI,CAAA,EAAA,EAAK,OAAO,CAAA,CAAE,CAAA;AAC5B,IAAA,IAAA,CAAK,IAAA,GAAO,UAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AAAA,EACA,OAAO,YAAY,GAAA,EAAwC;AACzD,IAAA,OAAO,IAAI,SAAA,CAAS,MAAA,CAAO,GAAA,CAAI,IAAA,IAAQ,KAAM,CAAA,EAAG,MAAA,CAAO,GAAA,CAAI,OAAA,IAAW,WAAW,CAAA,EAAG,IAAI,IAAI,CAAA;AAAA,EAC9F;AACF,CAAA;AAWA,SAAS,eAAe,GAAA,EAA6C;AACnE,EAAA,MAAM,SAAA,GAAY,IACf,KAAA,CAAM,IAAI,EACV,MAAA,CAAO,CAAC,OAAO,EAAA,CAAG,UAAA,CAAW,OAAO,CAAC,CAAA,CACrC,IAAI,CAAC,EAAA,KAAO,GAAG,KAAA,CAAM,CAAC,CAAA,CAAE,SAAA,EAAW,CAAA;AACtC,EAAA,IAAI,CAAC,SAAA,CAAU,MAAA,EAAQ,OAAO,IAAA;AAC9B,EAAA,IAAI;AACF,IAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,IAAA,CAAK,IAAI,CAAC,CAAA;AAC/C,IAAA,IAAI,WAAW,OAAO,OAAA,KAAY,aAAa,QAAA,IAAY,OAAA,IAAW,WAAW,OAAA,CAAA,EAAU;AACzF,MAAA,OAAO,OAAA;AAAA,IACT;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,IAAA;AACT;AAEA,IAAM,gBAAN,MAAyC;AAAA,EACvC,IAAA,GAAO,MAAA;AAAA,EACP,GAAA;AAAA,EACQ,WAAA;AAAA,EACA,SAAA,GAA2B,IAAA;AAAA,EAEnC,WAAA,CAAY,KAAa,OAAA,EAAiC;AACxD,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,IAAA,IAAA,CAAK,WAAA,GAAc;AAAA,MACjB,GAAG,OAAA;AAAA,MACH,cAAA,EAAgB,kBAAA;AAAA,MAChB,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AAAA,EAEA,MAAM,OAAA,GAAyB;AAAA,EAE/B;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,EACnB;AAAA,EAEQ,YAAA,GAAuC;AAC7C,IAAA,MAAM,IAAA,GAAO,EAAE,GAAG,IAAA,CAAK,WAAA,EAAY;AACnC,IAAA,IAAI,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,gBAAgB,IAAI,IAAA,CAAK,SAAA;AAClD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,QAAQ,GAAA,EAAgE;AAC5E,IAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM,IAAA,CAAK,GAAA,EAAK;AAAA,MACjC,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,KAAK,YAAA,EAAa;AAAA,MAC3B,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,GAAG;AAAA,KACzB,CAAA;AACD,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,gBAAgB,CAAA;AAC7C,IAAA,IAAI,GAAA,OAAU,SAAA,GAAY,GAAA;AAC1B,IAAA,IAAI,IAAA,CAAK,UAAU,GAAA,EAAK;AACtB,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,EAAK;AAC7B,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,iBAAA,EAAoB,IAAA,CAAK,MAAM,CAAA,MAAA,EAAS,IAAA,CAAK,GAAG,CAAA,EAAA,EAAK,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,CAAA;AACvF,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,IAAA,CAAK,MAAM,CAAA,EAAA,EAAK,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,IAC9D;AACA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,IAAK,EAAA;AACxD,IAAA,IAAI,WAAA,CAAY,QAAA,CAAS,mBAAmB,CAAA,EAAG;AAC7C,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,EAAK;AAC7B,MAAA,IAAI,SAAkC,EAAC;AACvC,MAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,KAAA,CAAM,YAAY,CAAA,EAAG;AAC5C,QAAA,MAAM,MAAA,GAAS,eAAe,KAAK,CAAA;AACnC,QAAA,IAAI,QAAQ,MAAA,GAAS,MAAA;AAAA,MACvB;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,OAAQ,MAAM,KAAK,IAAA,EAAK;AAAA,EAC1B;AAAA,EAEA,MAAM,KAAK,GAAA,EAA6C;AACtD,IAAA,MAAM,IAAA,CAAK,QAAQ,GAAG,CAAA;AAAA,EACxB;AAAA,EAEA,MAAM,IAAA,GAAyC;AAC7C,IAAA,OAAO,EAAC;AAAA,EACV;AAAA,EAEA,cAAA,GAAyC;AACvC,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,WAAA,EAAY;AAAA,EAC/B;AACF,CAAA;AAEA,IAAM,eAAN,MAAwC;AAAA,EACtC,IAAA,GAAO,KAAA;AAAA,EACP,SAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACQ,OAAA,GAAyB,IAAA;AAAA,EACzB,QAAwC,EAAC;AAAA,EACzC,UAAuD,EAAC;AAAA,EACxD,KAAA,GAAgC,IAAA;AAAA,EAExC,WAAA,CAAY,KAAa,OAAA,EAAiC;AACxD,IAAA,IAAA,CAAK,SAAA,GAAY,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AACtC,IAAA,IAAI,GAAA,CAAI,SAAS,SAAS,CAAA,OAAQ,OAAA,GAAU,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,SAAA,IAClD,GAAA,CAAI,SAAS,MAAM,CAAA,OAAQ,OAAA,GAAU,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,SACxD,IAAA,CAAK,OAAA,GAAU,GAAA,CAAI,OAAA,CAAQ,OAAO,EAAE,CAAA;AACzC,IAAA,IAAA,CAAK,OAAA,GAAU,EAAE,GAAG,OAAA,EAAQ;AAAA,EAC9B;AAAA,EAEQ,QAAQ,GAAA,EAAoC;AAClD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAM;AAClC,IAAA,IAAI,MAAA,SAAe,GAAG,CAAA;AAAA,SACjB,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AAAA,EAC1B;AAAA,EAEA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,eAAA,EAAgB;AACjC,IAAA,KAAK,KAAK,MAAA,EAAO;AAAA,EACnB;AAAA,EAEA,MAAc,MAAA,GAAwB;AACpC,IAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM,IAAA,CAAK,SAAA,EAAW;AAAA,MACvC,SAAS,EAAE,GAAG,IAAA,CAAK,OAAA,EAAS,QAAQ,mBAAA,EAAoB;AAAA,MACxD,MAAA,EAAQ,KAAK,KAAA,EAAO;AAAA,KACrB,CAAA;AACD,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,IAAA,EAAO,IAAA,CAAK,MAAM,CAAA,CAAE,CAAA;AAClD,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAM,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAC1D,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,SAAA,EAAU;AACnC,IAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,IAAA,IAAI,GAAA,GAAM,EAAA;AACV,IAAA,IAAI,SAAA,GAA2B,IAAA;AAC/B,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,MAAA,IAAI,IAAA,EAAM;AACV,MAAA,GAAA,IAAO,QAAQ,MAAA,CAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AAC7C,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAC5B,MAAA,GAAA,GAAM,KAAA,CAAM,KAAI,IAAK,EAAA;AACrB,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,IAAI,IAAA,KAAS,EAAA,IAAM,IAAA,KAAS,IAAA,EAAM;AAChC,UAAA,IAAA,CAAK,aAAA,CAAc,OAAO,SAAS,CAAA;AACnC,UAAA,KAAA,CAAM,MAAA,GAAS,CAAA;AACf,UAAA,SAAA,GAAY,IAAA;AACZ,UAAA;AAAA,QACF;AACA,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AACvC,QAAA,IAAI,QAAA,CAAS,WAAW,QAAQ,CAAA,cAAe,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,EAAK;AACtE,QAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,aAAA,CAAc,KAAe,SAAA,EAAgC;AACnE,IAAA,MAAM,YAAY,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,OAAO,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAC,CAAA,CAAE,WAAW,CAAA;AAC5F,IAAA,IAAI,CAAC,UAAU,MAAA,EAAQ;AACvB,IAAA,MAAM,OAAA,GAAU,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AACnC,IAAA,IAAI,cAAc,UAAA,EAAY;AAC5B,MAAA,MAAM,QAAA,GAAW,QAAQ,IAAA,EAAK;AAC9B,MAAA,IAAA,CAAK,OAAA,GAAU,QAAA,CAAS,UAAA,CAAW,GAAG,CAAA,GAAI,GAAG,IAAA,CAAK,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,GAAK,QAAA;AACzE,MAAA;AAAA,IACF;AACA,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,OAAO,CAA4B,CAAA;AAAA,IAC7D,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAAA,EACpB;AAAA,EAEA,MAAM,KAAK,GAAA,EAA6C;AACtD,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC3B,QAAA,IAAI,KAAK,OAAA,EAAS;AAClB,QAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,MAAM,UAAA,CAAW,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,MAC7C;AAAA,IACF;AACA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,OAAA;AACrC,IAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM,OAAA,EAAS;AAAA,MAChC,MAAA,EAAQ,MAAA;AAAA,MACR,SAAS,EAAE,GAAG,IAAA,CAAK,OAAA,EAAS,gBAAgB,kBAAA,EAAmB;AAAA,MAC/D,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,GAAG;AAAA,KACzB,CAAA;AACD,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,SAAA,EAAY,IAAA,CAAK,MAAM,CAAA,CAAE,CAAA;AACvD,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAQ,MAAM,IAAA,CAAK,IAAA,EAAK;AAC9B,MAAA,IAAI,QAAQ,OAAO,IAAA,KAAS,aAAa,QAAA,IAAY,IAAA,IAAQ,WAAW,IAAA,CAAA,EAAO;AAC7E,QAAA,IAAA,CAAK,QAAQ,IAAI,CAAA;AAAA,MACnB;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEA,MAAM,IAAA,GAAyC;AAC7C,IAAA,IAAI,KAAK,KAAA,CAAM,MAAA,EAAQ,OAAO,IAAA,CAAK,MAAM,KAAA,EAAM;AAC/C,IAAA,OAAO,IAAI,QAAQ,CAAC,OAAA,KAAY,KAAK,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,EAC5D;AACF,CAAA;AAEA,IAAM,cAAN,MAAuC;AAAA,EACrC,IAAA,GAAO,WAAA;AAAA,EACP,GAAA;AAAA,EACA,OAAA;AAAA,EACQ,EAAA,GAAuB,IAAA;AAAA,EACvB,QAAwC,EAAC;AAAA,EACzC,UAAuD,EAAC;AAAA,EAEhE,WAAA,CAAY,KAAa,OAAA,EAAiC;AACxD,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA,EAEA,MAAM,OAAA,GAAyB;AAC7B,IAAA,MAAM,KAAK,UAAA,CAAW,SAAA;AACtB,IAAA,IAAI,CAAC,EAAA,EAAI,MAAM,IAAI,MAAM,4CAA4C,CAAA;AACrE,IAAA,IAAA,CAAK,EAAA,GAAK,IAAI,EAAA,CAAG,IAAA,CAAK,GAAG,CAAA;AACzB,IAAA,IAAA,CAAK,EAAA,CAAG,gBAAA,CAAiB,SAAA,EAAW,CAAC,EAAA,KAAO;AAC1C,MAAA,IAAI;AACF,QAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAM,MAAA,CAAQ,EAAA,CAAoB,IAAI,CAAC,CAAA;AACzD,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAM;AAClC,QAAA,IAAI,MAAA,SAAe,IAAI,CAAA;AAAA,aAClB,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAAA,MAC3B,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF,CAAC,CAAA;AACD,IAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,MAAA,IAAA,CAAK,EAAA,CAAI,gBAAA,CAAiB,MAAA,EAAQ,MAAM,SAAS,CAAA;AACjD,MAAA,IAAA,CAAK,EAAA,CAAI,iBAAiB,OAAA,EAAS,MAAM,OAAO,IAAI,KAAA,CAAM,iBAAiB,CAAC,CAAC,CAAA;AAAA,IAC/E,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAA,CAAK,IAAI,KAAA,EAAM;AACf,IAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AAAA,EACZ;AAAA,EAEA,MAAM,KAAK,GAAA,EAA6C;AACtD,IAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,MAAM,IAAI,MAAM,eAAe,CAAA;AAC7C,IAAA,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA;AAAA,EAClC;AAAA,EAEA,MAAM,IAAA,GAAyC;AAC7C,IAAA,IAAI,KAAK,KAAA,CAAM,MAAA,EAAQ,OAAO,IAAA,CAAK,MAAM,KAAA,EAAM;AAC/C,IAAA,OAAO,IAAI,QAAQ,CAAC,OAAA,KAAY,KAAK,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,EAC5D;AACF,CAAA;AAEO,IAAM,SAAA,GAAN,MAAM,UAAA,CAAU;AAAA,EACrB,GAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACJ,EAAA,GAAK,CAAA;AAAA,EACL,OAAA,uBAAc,GAAA,EAGpB;AAAA,EACF,eAAwC,EAAC;AAAA,EACzC,QAAwC,EAAC;AAAA,EACzC,YAA4C,EAAC;AAAA,EACrC,OAAA;AAAA,EAER,WAAA,CAAY,GAAA,EAAa,OAAA,GAAyC,IAAA,EAAM;AACtE,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,IAAA,IAAA,CAAK,OAAA,GAAU,WAAW,EAAC;AAC3B,IAAA,IAAA,CAAK,SAAA,GAAY,UAAA,CAAU,eAAA,CAAgB,GAAA,EAAK,KAAK,OAAO,CAAA;AAAA,EAC9D;AAAA,EAEA,OAAO,eAAA,CAAgB,GAAA,EAAa,OAAA,EAA4C;AAC9E,IAAA,IAAI,GAAA,CAAI,UAAA,CAAW,QAAQ,CAAA,IAAK,QAAQ,OAAA,EAAS;AAC/C,MAAA,MAAM,IAAI,MAAM,iFAAiF,CAAA;AAAA,IACnG;AACA,IAAA,IAAI,GAAA,CAAI,UAAA,CAAW,OAAO,CAAA,IAAK,GAAA,CAAI,UAAA,CAAW,QAAQ,CAAA,EAAG,OAAO,IAAI,WAAA,CAAY,GAAA,EAAK,OAAO,CAAA;AAC5F,IAAA,IACE,GAAA,CAAI,UAAA,CAAW,aAAa,CAAA,IAC5B,IAAI,UAAA,CAAW,cAAc,CAAA,IAC7B,GAAA,CAAI,SAAS,SAAS,CAAA,IACtB,GAAA,CAAI,QAAA,CAAS,MAAM,CAAA,EACnB;AACA,MAAA,MAAM,KAAA,GAAQ,IAAI,OAAA,CAAQ,aAAA,EAAe,SAAS,CAAA,CAAE,OAAA,CAAQ,gBAAgB,UAAU,CAAA;AACtF,MAAA,OAAO,IAAI,YAAA,CAAa,KAAA,EAAO,OAAO,CAAA;AAAA,IACxC;AACA,IAAA,IAAI,GAAA,CAAI,UAAA,CAAW,SAAS,CAAA,IAAK,GAAA,CAAI,UAAA,CAAW,UAAU,CAAA,EAAG,OAAO,IAAI,aAAA,CAAc,GAAA,EAAK,OAAO,CAAA;AAClG,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,GAAG,CAAA,uCAAA,CAAyC,CAAA;AAAA,EAClF;AAAA,EAEQ,MAAA,GAAiB;AACvB,IAAA,IAAA,CAAK,EAAA,IAAM,CAAA;AACX,IAAA,OAAO,MAAA,CAAO,KAAK,EAAE,CAAA;AAAA,EACvB;AAAA,EAEA,MAAc,QAAA,GAA0B;AACtC,IAAA,OAAO,KAAK,SAAA,EAAW;AACrB,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,IAAA,EAAK;AACtC,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,MAAM,MAAM,GAAA,CAAI,EAAA,IAAM,OAAO,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA,GAAI,IAAA;AAC9C,MAAA,IAAI,GAAA,KAAQ,QAAA,IAAY,GAAA,IAAO,OAAA,IAAW,GAAA,CAAA,EAAM;AAC9C,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAChC,QAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,GAAG,CAAA;AACvB,QAAA,GAAA,EAAK,QAAQ,GAAG,CAAA;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,GAAA,CACZ,MAAA,EACA,MAAA,GAAyC,IAAA,EACzC,UAAU,GAAA,EACQ;AAClB,IAAA,MAAM,GAAA,GAAM,KAAK,MAAA,EAAO;AACxB,IAAA,MAAM,OAAA,GAAU,EAAE,OAAA,EAAS,KAAA,EAAO,EAAA,EAAI,KAAK,MAAA,EAAQ,MAAA,EAAQ,MAAA,IAAU,EAAC,EAAE;AACxE,IAAA,IAAI,IAAA,CAAK,qBAAqB,aAAA,EAAe;AAC3C,MAAA,MAAMC,IAAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,QAAQ,OAAO,CAAA;AAChD,MAAA,IAAIA,KAAI,KAAA,EAAO,MAAM,QAAA,CAAS,WAAA,CAAYA,KAAI,KAAgC,CAAA;AAC9E,MAAA,OAAOA,IAAAA,CAAI,UAAU,EAAC;AAAA,IACxB;AACA,IAAA,MAAM,MAAM,MAAM,IAAI,OAAA,CAAiC,CAAC,SAAS,MAAA,KAAW;AAC1E,MAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,QAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,GAAG,CAAA;AACvB,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,SAAA,EAAY,MAAM,CAAA,kBAAA,EAAqB,OAAO,IAAI,CAAC,CAAA;AAAA,MACtE,GAAG,OAAO,CAAA;AACV,MAAA,IAAA,CAAK,OAAA,CAAQ,IAAI,GAAA,EAAK;AAAA,QACpB,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,UAAA,YAAA,CAAa,KAAK,CAAA;AAClB,UAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,QACX,CAAA;AAAA,QACA;AAAA,OACD,CAAA;AACD,MAAA,KAAK,KAAK,SAAA,CAAU,IAAA,CAAK,OAAO,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,KAAM;AAC7C,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,GAAG,CAAA;AACvB,QAAA,MAAA,CAAO,CAAC,CAAA;AAAA,MACV,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AACD,IAAA,IAAI,IAAI,KAAA,EAAO,MAAM,QAAA,CAAS,WAAA,CAAY,IAAI,KAAgC,CAAA;AAC9E,IAAA,OAAO,GAAA,CAAI,UAAU,EAAC;AAAA,EACxB;AAAA,EAEA,MAAc,MAAA,CAAO,MAAA,EAAgB,MAAA,GAAyC,IAAA,EAAqB;AACjG,IAAA,MAAM,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,EAAE,OAAA,EAAS,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,MAAA,IAAU,EAAC,EAAG,CAAA;AAAA,EAC5E;AAAA,EAEA,MAAM,OAAA,GAAyB;AAC7B,IAAA,MAAM,IAAA,CAAK,UAAU,OAAA,EAAQ;AAC7B,IAAA,IAAI,EAAE,IAAA,CAAK,SAAA,YAAqB,aAAA,CAAA,EAAgB;AAC9C,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,MAAA,KAAK,KAAK,QAAA,EAAS;AAAA,IACrB;AACA,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAQ,MAAM,IAAA,CAAK,GAAA,CAAI,YAAA,EAAc;AAAA,QACzC,eAAA,EAAiB,YAAA;AAAA,QACjB,YAAA,EAAc,EAAE,KAAA,EAAO,EAAE,aAAa,IAAA,EAAK,EAAG,QAAA,EAAU,EAAC,EAAE;AAAA,QAC3D,UAAA,EAAY,EAAE,IAAA,EAAM,gBAAA,EAAkB,SAAS,WAAA;AAAY,OAC5D,CAAA;AACD,MAAA,IAAA,CAAK,YAAA,GAAgB,IAAA,CAAK,YAAA,IAA4C,EAAC;AACvE,MAAA,MAAM,IAAA,CAAK,OAAO,2BAA2B,CAAA;AAC7C,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,IACnB,SAAS,CAAA,EAAG;AACV,MAAA,MAAM,KAAK,KAAA,EAAM;AACjB,MAAA,MAAM,CAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,IAAA,KAAA,MAAW,GAAG,GAAG,CAAA,IAAK,IAAA,CAAK,OAAA,EAAS,GAAA,CAAI,MAAA,CAAO,IAAI,KAAA,CAAM,QAAQ,CAAC,CAAA;AAClE,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AACnB,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,UAAU,KAAA,EAAM;AAAA,IAC7B,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEA,MAAM,SAAA,GAAqD;AACzD,IAAA,MAAM,GAAA,GAAO,MAAM,IAAA,CAAK,GAAA,CAAI,YAAY,CAAA;AACxC,IAAA,IAAA,CAAK,KAAA,GAAS,GAAA,CAAI,KAAA,IAA4C,EAAC;AAC/D,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,MAAM,aAAA,GAAyD;AAC7D,IAAA,IAAI;AACF,MAAA,MAAM,MAAO,MAAM,IAAA,CAAK,GAAA,CAAI,gBAAA,EAAkB,MAAM,GAAM,CAAA;AAC1D,MAAA,IAAA,CAAK,SAAA,GAAa,GAAA,CAAI,SAAA,IAAgD,EAAC;AAAA,IACzE,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,CAAK,YAAY,EAAC;AAAA,IACpB;AACA,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA,EAEA,MAAM,QAAA,CAAS,QAAA,EAAkB,UAAA,EAAqC,UAAU,IAAA,EAA2B;AACzG,IAAA,OAAO,IAAA,CAAK,IAAI,YAAA,EAAc,EAAE,MAAM,QAAA,EAAU,SAAA,EAAW,UAAA,EAAW,EAAG,OAAO,CAAA;AAAA,EAClF;AAAA,EAEA,MAAM,IAAA,GAAyB;AAC7B,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,IAAI,GAAM,CAAA;AACjC,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,qBAAA,CACJ,QAAA,EACA,UAAA,EACA,UAAU,IAAA,EACQ;AAClB,IAAA,IAAI;AACF,MAAA,IAAI,CAAC,IAAA,CAAK,SAAA,EAAW,MAAM,IAAI,MAAM,eAAe,CAAA;AACpD,MAAA,OAAO,MAAM,IAAA,CAAK,QAAA,CAAS,QAAA,EAAU,YAAY,OAAO,CAAA;AAAA,IAC1D,SAAS,CAAA,EAAG;AACV,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,wCAAA,EAA2C,QAAQ,CAAA,gBAAA,CAAA,EAAoB,CAAC,CAAA;AACrF,MAAA,IAAI;AACF,QAAA,MAAM,KAAK,SAAA,EAAU;AACrB,QAAA,OAAO,MAAM,IAAA,CAAK,QAAA,CAAS,QAAA,EAAU,YAAY,OAAO,CAAA;AAAA,MAC1D,SAAS,QAAA,EAAU;AACjB,QAAA,MAAM,IAAI,MAAM,CAAA,kBAAA,EAAqB,QAAQ,IAAI,EAAE,KAAA,EAAO,GAAG,CAAA;AAAA,MAC/D;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,SAAA,GAA2B;AAC/B,IAAA,MAAM,MAAM,IAAA,CAAK,GAAA;AACjB,IAAA,IAAI,UAAkC,EAAC;AACvC,IAAA,IAAI,IAAA,CAAK,qBAAqB,aAAA,EAAe;AAC3C,MAAA,OAAA,GAAU,IAAA,CAAK,UAAU,cAAA,EAAe;AACxC,MAAA,OAAO,QAAQ,cAAc,CAAA;AAC7B,MAAA,OAAO,OAAA,CAAQ,MAAA;AAAA,IACjB,WAAW,IAAA,CAAK,SAAA,YAAqB,YAAA,IAAgB,IAAA,CAAK,qBAAqB,WAAA,EAAa;AAC1F,MAAA,OAAA,GAAU,EAAE,GAAG,IAAA,CAAK,SAAA,CAAU,OAAA,EAAQ;AAAA,IACxC;AACA,IAAA,IAAI;AACF,MAAA,MAAM,KAAK,KAAA,EAAM;AAAA,IACnB,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA;AACV,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AACnB,IAAA,IAAA,CAAK,SAAA,GAAY,UAAA,CAAU,eAAA,CAAgB,GAAA,EAAK,OAAO,CAAA;AACvD,IAAA,MAAM,KAAK,OAAA,EAAQ;AACnB,IAAA,MAAM,KAAK,SAAA,EAAU;AAAA,EACvB;AACF,CAAA;AAEO,IAAM,cAAN,MAAkB;AAAA,EACf,OAAA,uBAAc,GAAA,EAAuB;AAAA,EACrC,UAAA,GAAoD,IAAA;AAAA,EAE5D,MAAM,OAAA,CACJ,IAAA,EACA,KACA,OAAA,GAAyC,IAAA,EACzC,QAAuB,IAAA,EACR;AACf,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,IAAI,CAAA;AACxB,IAAA,MAAM,IAAA,GAAO,EAAE,GAAI,OAAA,IAAW,EAAC,EAAG;AAClC,IAAA,IAAI,OAAO,IAAA,CAAK,aAAA,GAAgB,IAAA,CAAK,aAAA,IAAiB,UAAU,KAAK,CAAA,CAAA;AACrE,IAAA,MAAM,MAAA,GAAS,IAAI,SAAA,CAAU,GAAA,EAAK,IAAI,CAAA;AACtC,IAAA,MAAM,OAAO,OAAA,EAAQ;AACrB,IAAA,MAAM,OAAO,SAAA,EAAU;AACvB,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAA,EAAM,MAAM,CAAA;AAC7B,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACpB,MAAA,IAAA,CAAK,aAAa,WAAA,CAAY,MAAM,KAAK,IAAA,CAAK,cAAA,IAAkB,GAAM,CAAA;AAAA,IACxE;AAAA,EACF;AAAA,EAEA,MAAc,cAAA,GAAgC;AAC5C,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,MAAM,CAAA,IAAK,CAAC,GAAG,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,CAAA,EAAG;AACxD,MAAA,IAAI,CAAC,OAAO,SAAA,EAAW;AACvB,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,IAAA,EAAK;AAChC,QAAA,IAAI,CAAC,KAAA,EAAO,MAAM,MAAA,CAAO,SAAA,EAAU;AAAA,MACrC,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,aAAA,EAAgB,IAAI,CAAA,oBAAA,CAAA,EAAwB,CAAC,CAAA;AAC1D,QAAA,IAAI;AACF,UAAA,MAAM,OAAO,SAAA,EAAU;AAAA,QACzB,CAAA,CAAA,MAAQ;AACN,UAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,IAAI,CAAA;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,IAAI,IAAA,EAAyB;AAC3B,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAC/B,IAAA,IAAI,CAAC,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,IAAI,CAAA,CAAA,CAAG,CAAA;AACvD,IAAA,OAAO,CAAA;AAAA,EACT;AAAA,EAEA,IAAI,IAAA,EAAuB;AACzB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAAA,EAC9B;AAAA,EAEA,MAAM,WAAW,IAAA,EAA6B;AAC5C,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAC/B,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,IAAI,CAAA;AACxB,IAAA,IAAI,CAAA,EAAG;AACL,MAAA,IAAI;AACF,QAAA,MAAM,EAAE,KAAA,EAAM;AAAA,MAChB,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,QAAA,GAA0B;AAC9B,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,aAAA,CAAc,KAAK,UAAU,CAAA;AAC7B,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAAA,IACpB;AACA,IAAA,KAAA,MAAW,IAAA,IAAQ,CAAC,GAAG,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,CAAA,EAAG,MAAM,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA;AAAA,EACzE;AACF,CAAA;AAEO,IAAM,cAAN,MAAkB;AAAA,EACvB,OAAA,GAAU,IAAI,WAAA,EAAY;AAAA,EAE1B,MAAM,SAAA,CACJ,IAAA,EACA,GAAA,EACA,IAAA,GAA2E,EAAC,EAC7D;AACf,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,IAAA,EAAM,GAAA,EAAK,KAAK,OAAA,IAAW,IAAA,EAAM,IAAA,CAAK,KAAA,IAAS,IAAI,CAAA;AAAA,EAChF;AAAA,EAEA,MAAM,QAAA,GAA0B;AAC9B,IAAA,MAAM,IAAA,CAAK,QAAQ,QAAA,EAAS;AAAA,EAC9B;AACF,CAAA;;;ACvhBA,SAAS,iBAAiB,MAAA,EAA0D;AAClF,EAAA,MAAM,aAAsC,EAAC;AAC7C,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,KAAA,MAAW,GAAA,IAAO,CAAC,eAAA,EAAiB,oBAAoB,CAAA,EAAG;AACzD,IAAA,MAAM,GAAA,GAAO,MAAA,CAAO,GAAG,CAAA,IAA6C,EAAC;AACrE,IAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EAAU;AACrC,IAAA,MAAA,CAAO,MAAA,CAAO,UAAA,EAAa,GAAA,CAAI,UAAA,IAAsD,EAAE,CAAA;AACvF,IAAA,MAAM,MAAM,GAAA,CAAI,QAAA;AAChB,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG,QAAA,CAAS,KAAK,GAAG,GAAA,CAAI,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,EAC1D;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,UAAA,EAAY,QAAA,EAAS;AAChD;AAEA,SAAS,eAAe,EAAA,EAAiC;AACvD,EAAA,MAAM,MAAA,GAAS,EAAA,CAAG,MAAA,IAAU,EAAC;AAC7B,EAAA,MAAM,UAAA,GAAc,MAAA,CAAO,gBAAA,IAAmE,EAAC;AAC/F,EAAA,IAAI,CAAC,WAAW,MAAA,EAAQ;AACtB,IAAA,OAAO;AAAA,MACL;AAAA,QACE,EAAA,EAAI,GAAG,EAAA,IAAM,IAAA;AAAA,QACb,IAAA,EAAM,KAAA;AAAA,QACN,QAAA,EAAU,CAAA,IAAA,EAAO,EAAA,CAAG,IAAI,CAAA,CAAA;AAAA,QACxB,aAAa,EAAA,CAAG,IAAA;AAAA,QAChB,WAAA,EAAa,GAAG,WAAA,IAAe,UAAA;AAAA,QAC/B,YAAA,EAAc,EAAE,IAAA,EAAM,QAAA,EAAU,YAAY,EAAC,EAAG,QAAA,EAAU,EAAC,EAAE;AAAA,QAC7D,kBAAkB,EAAA,CAAG,gBAAA;AAAA,QACrB,gBAAgB,EAAA,CAAG,cAAA;AAAA,QACnB,UAAU,EAAA,CAAG,QAAA;AAAA,QACb,KAAK,EAAA,CAAG,GAAA;AAAA,QACR,GAAA,EAAK;AAAA;AACP,KACF;AAAA,EACF;AACA,EAAA,MAAM,QAAyB,EAAC;AAChC,EAAA,KAAA,MAAW,MAAM,UAAA,EAAY;AAC3B,IAAA,IAAI,EAAA,CAAG,YAAY,KAAA,EAAO;AAC1B,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,EAAA,CAAG,IAAA,IAAQ,SAAS,CAAA;AACxC,IAAA,MAAM,MAAA,GAAU,EAAA,CAAG,WAAA,IAChB,EAAA,CAAG,YAAA,IAAwD;AAAA,MAC1D,IAAA,EAAM,QAAA;AAAA,MACN,YAAY,EAAC;AAAA,MACb,UAAU;AAAC,KACb;AACF,IAAA,MAAM,eAAe,EAAA,CAAG,iBAAA;AACxB,IAAA,MAAM,qBAAqB,EAAA,CAAG,eAAA;AAC9B,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,EAAA,EAAI,GAAG,EAAA,IAAM,IAAA;AAAA,MACb,IAAA,EAAM,KAAA;AAAA,MACN,QAAA,EAAU,OAAO,IAAI,CAAA,CAAA;AAAA,MACrB,WAAA,EAAa,IAAA;AAAA,MACb,aAAa,MAAA,CAAO,EAAA,CAAG,WAAA,IAAe,CAAA,UAAA,EAAa,IAAI,CAAA,CAAE,CAAA;AAAA,MACzD,YAAA,EAAc,MAAA;AAAA,MACd,kBAAkB,YAAA,KAAiB,MAAA,GAAY,OAAA,CAAQ,YAAY,IAAI,EAAA,CAAG,gBAAA;AAAA,MAC1E,cAAA,EAAgB,sBAAsB,EAAA,CAAG,cAAA;AAAA,MACzC,UAAU,EAAA,CAAG,QAAA;AAAA,MACb,KAAK,EAAA,CAAG,GAAA;AAAA,MACR,GAAA,EAAK,EAAE,GAAG,MAAA,EAAQ,WAAW,IAAA;AAAK,KACnC,CAAA;AAAA,EACH;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,oBAAoB,EAAA,EAAiC;AACnE,EAAA,IAAI,EAAA,CAAG,SAAS,MAAA,EAAQ;AACtB,IAAA,OAAO;AAAA,MACL;AAAA,QACE,EAAA,EAAI,GAAG,EAAA,IAAM,IAAA;AAAA,QACb,IAAA,EAAM,MAAA;AAAA,QACN,QAAA,EAAU,CAAA,KAAA,EAAQ,EAAA,CAAG,IAAI,CAAA,CAAA;AAAA,QACzB,aAAa,EAAA,CAAG,IAAA;AAAA,QAChB,WAAA,EAAa,EAAA,CAAG,WAAA,IAAe,CAAA,sBAAA,EAAyB,GAAG,IAAI,CAAA,CAAA;AAAA,QAC/D,YAAA,EAAc,gBAAA,CAAiB,EAAA,CAAG,MAAA,IAAU,EAAE,CAAA;AAAA,QAC9C,kBAAkB,EAAA,CAAG,gBAAA;AAAA,QACrB,gBAAgB,EAAA,CAAG,cAAA;AAAA,QACnB,UAAU,EAAA,CAAG,QAAA;AAAA,QACb,KAAK,EAAA,CAAG,GAAA;AAAA,QACR,GAAA,EAAK,EAAA,CAAG,MAAA,IAAU;AAAC;AACrB,KACF;AAAA,EACF;AACA,EAAA,IAAI,EAAA,CAAG,SAAS,IAAA,EAAM;AACpB,IAAA,OAAO;AAAA,MACL;AAAA,QACE,EAAA,EAAI,GAAG,EAAA,IAAM,IAAA;AAAA,QACb,IAAA,EAAM,IAAA;AAAA,QACN,QAAA,EAAU,CAAA,GAAA,EAAM,EAAA,CAAG,IAAI,CAAA,CAAA;AAAA,QACvB,aAAa,EAAA,CAAG,IAAA;AAAA,QAChB,WAAA,EAAa,EAAA,CAAG,WAAA,IAAe,CAAA,gBAAA,EAAmB,GAAG,IAAI,CAAA,CAAA;AAAA,QACzD,YAAA,EAAc;AAAA,UACZ,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY;AAAA,YACV,KAAA,EAAO;AAAA,cACL,IAAA,EAAM,QAAA;AAAA,cACN,WAAA,EAAa;AAAA;AACf,WACF;AAAA,UACA,QAAA,EAAU,CAAC,OAAO;AAAA,SACpB;AAAA,QACA,kBAAkB,EAAA,CAAG,gBAAA;AAAA,QACrB,gBAAgB,EAAA,CAAG,cAAA;AAAA,QACnB,UAAU,EAAA,CAAG,QAAA;AAAA,QACb,KAAK,EAAA,CAAG,GAAA;AAAA,QACR,GAAA,EAAK,EAAA,CAAG,MAAA,IAAU;AAAC;AACrB,KACF;AAAA,EACF;AACA,EAAA,IAAI,EAAA,CAAG,IAAA,KAAS,KAAA,EAAO,OAAO,eAAe,EAAE,CAAA;AAC/C,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,CAAA,0CAAA,EAA6C,IAAA,CAAK,SAAA,CAAU,EAAA,CAAG,IAAI,CAAC,CAAA,4FAAA;AAAA,GAEtE;AACF;AAEO,SAAS,QAAA,CAAS,OAAwB,QAAA,EAA6C;AAC5F,EAAA,OAAO,MAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,QAAQ,CAAA;AAClD;;;ARlHO,IAAM,gBAAA,GAAmB,GAAA;AACzB,IAAM,eAAA,GAAkB,GAAA;AAE/B,IAAM,iBAAA,uBAAwB,GAAA,CAAI;AAAA,EAChC,MAAA;AAAA,EACA,MAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,KAAA;AAAA,EACA,kBAAA;AAAA,EACA,mBAAA;AAAA,EACA,gBAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACF,CAAC,CAAA;AAUM,SAAS,WAAA,CAAY,IAAmB,UAAA,EAAkD;AAC/F,EAAA,OAAO,UAAA,CAAW,EAAA,CAAG,GAAA,EAAK,UAAU,CAAA;AACtC;AAEO,SAAS,oBACd,IAAA,EACyB;AACzB,EAAA,MAAM,MAA+B,EAAC;AACtC,EAAA,KAAA,MAAW,CAAC,GAAG,CAAC,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,IAAQ,EAAE,CAAA,EAAG;AAC/C,IAAA,IAAI,CAAC,OAAO,CAAC,CAAA,CAAE,WAAW,GAAG,CAAA,EAAG,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA;AAAA,EAC3C;AACA,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,WAAA,CACd,MAAA,EACA,IAAA,GAAgD,EAAC,EAC7B;AACpB,EAAA,MAAM,QAAA,GAAW,KAAK,QAAA,IAAY,gBAAA;AAClC,EAAA,MAAM,OAAA,GAAU,KAAK,OAAA,IAAW,eAAA;AAChC,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,IAAI,MAAA,GAAS,MAAA;AAEb,EAAA,IACE,MAAA,IACA,OAAO,MAAA,KAAW,QAAA,IAClB,KAAA,CAAM,OAAA,CAAS,MAAA,CAA8B,IAAI,CAAA,IAChD,MAAA,CAA+B,IAAA,CAAK,MAAA,GAAS,OAAA,EAC9C;AACA,IAAA,MAAM,OAAQ,MAAA,CAA+B,IAAA;AAC7C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA;AAClC,IAAA,MAAA,GAAS;AAAA,MACP,GAAI,MAAA;AAAA,MACJ,IAAA,EAAM,IAAA;AAAA,MACN,eAAA,EAAiB,EAAE,aAAA,EAAe,IAAA,CAAK,QAAQ,YAAA,EAAc,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA;AAAO,KACzF;AACA,IAAA,SAAA,GAAY,IAAA;AAAA,EACd;AAEA,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI;AACF,IAAA,UAAA,GAAa,IAAA,CAAK,UAAU,MAAM,CAAA;AAAA,EACpC,CAAA,CAAA,MAAQ;AACN,IAAA,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA,EAC5C;AACA,EAAA,IAAI,UAAA,CAAW,SAAS,QAAA,EAAU;AAChC,IAAA,OAAO;AAAA,MACL;AAAA,QACE,UAAA,EAAY,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA;AAAA,QACxC,gBAAgB,UAAA,CAAW,MAAA;AAAA,QAC3B,KAAA,EAAO;AAAA,OACT;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,CAAC,QAAQ,SAAS,CAAA;AAC3B;AAEO,SAAS,gBAAA,CACd,MAAA,EACA,MAAA,EACA,IAAA,EAKoC;AACpC,EAAA,IAAI,OAAO,OAAA,EAAQ,SAAU,CAAC,MAAA,EAAQ,EAAE,CAAA;AACxC,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,EAAA,MAAM,IAAA,GAAO,CAAC,IAAA,KAA2B;AACvC,IAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,MAAA,MAAM,CAAC,IAAA,EAAMC,KAAI,CAAA,GAAI,cAAA,CAAe,MAAM,MAAA,EAAQ;AAAA,QAChD,KAAA,EAAO,QAAA;AAAA,QACP,UAAA,EAAY,KAAK,UAAA,IAAc,IAAA;AAAA,QAC/B,WAAW,IAAA,CAAK,SAAA;AAAA,QAChB,OAAO,IAAA,CAAK;AAAA,OACb,CAAA;AACD,MAAA,IAAIA,KAAAA,IAAQ,MAAA,CAAO,IAAA,CAAKA,KAAI,EAAE,MAAA,EAAQ;AACpC,QAAA,KAAA,IAASA,MAAK,KAAA,IAAS,CAAA;AACvB,QAAA,KAAA,MAAW,IAAA,IAAQA,KAAAA,CAAK,WAAA,IAAe,EAAC,EAAG;AACzC,UAAA,IAAI,CAAC,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA,EAAG,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,QAC5C;AACA,QAAA,KAAA,MAAW,IAAA,IAAQA,KAAAA,CAAK,YAAA,IAAgB,EAAC,EAAG;AAC1C,UAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,EAAG,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,QAC9C;AAAA,MACF;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACpC,MAAA,IAAI,MAAM,OAAA,CAAQ,IAAI,GAAG,OAAO,IAAA,CAAK,IAAI,IAAI,CAAA;AAC7C,MAAA,MAAM,MAA+B,EAAC;AACtC,MAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,MAAA,CAAO,OAAA,CAAQ,IAA+B,CAAA,EAAG,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA;AACrF,MAAA,OAAO,GAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,QAAA,GAAW,KAAK,MAAM,CAAA;AAC5B,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,IAAU,CAAC,MAAA,CAAO,QAAQ,OAAO,CAAC,QAAA,EAAU,EAAE,CAAA;AACzD,EAAA,MAAM,IAAA,GAAgC,EAAE,WAAA,EAAa,KAAA,EAAO,OAAO,KAAA,EAAM;AACzE,EAAA,IAAI,MAAA,CAAO,MAAA,EAAQ,IAAA,CAAK,YAAA,GAAe,MAAA;AACvC,EAAA,OAAO,CAAC,UAAU,IAAI,CAAA;AACxB;AAEA,SAAS,eAAA,CAAgB,KAA8B,MAAA,EAAgC;AACrF,EAAA,IAAI,SAAkC,EAAC;AACvC,EAAA,IAAI,IAAI,gBAAA,EAAkB;AACxB,IAAA,MAAA,GAAS,WAAA,CAAY,OAAO,GAAA,CAAI,gBAAgB,GAAG,YAAA,CAAa,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA,EAChF;AACA,EAAA,OAAO,IAAI,UAAA,CAAW;AAAA,IACpB,EAAA,EAAI,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAAA,IACjB,IAAA,EAAM,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA;AAAA,IACrB,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,WAAA,EAAa,MAAA,CAAO,GAAA,CAAI,WAAA,IAAe,EAAE,CAAA;AAAA,IACzC,MAAA;AAAA,IACA,QAAA,EAAW,IAAI,SAAA,IAA+B,IAAA;AAAA,IAC9C,GAAA,EAAK,IAAI,GAAA,IAAO,IAAA,GAAO,CAAC,GAAI,GAAA,CAAI,GAAgB,CAAA,GAAI,IAAA;AAAA,IACpD,gBAAA,EAAkB,OAAA,CAAQ,GAAA,CAAI,iBAAiB,CAAA;AAAA,IAC/C,cAAA,EAAiB,GAAA,CAAI,eAAA,IAA+C,EAAC;AAAA,IACrE,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,OAAO;AAAA,GAC7B,CAAA;AACH;AAEA,eAAe,uBAAA,CACb,QACA,QAAA,EAC0B;AAC1B,EAAA,MAAM,SAAoB,EAAC;AAC3B,EAAA,IAAI,GAAA,GAAM,CAAA,wDAAA,CAAA;AACV,EAAA,IAAI,YAAY,IAAA,EAAM;AACpB,IAAA,MAAA,CAAO,KAAK,QAAQ,CAAA;AACpB,IAAA,GAAA,IAAO,CAAA,mBAAA,CAAA;AAAA,EACT;AACA,EAAA,MAAM,SAAS,MAAM,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,KAAK,MAAM,CAAA;AAClD,EAAA,MAAM,aAA8B,EAAC;AACrC,EAAA,KAAA,MAAW,GAAA,IAAO,OAAO,IAAA,EAAM;AAC7B,IAAA,UAAA,CAAW,KAAK,GAAG,mBAAA,CAAoB,gBAAgB,GAAA,EAAK,MAAM,CAAC,CAAC,CAAA;AAAA,EACtE;AACA,EAAA,OAAO,UAAA;AACT;AAEA,eAAe,WAAA,CAAY,QAAoB,QAAA,EAAmD;AAChG,EAAA,MAAM,SAAA,GAAY,MAAM,uBAAA,CAAwB,MAAA,EAAQ,QAAQ,CAAA;AAChE,EAAA,MAAM,YAAY,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,cAAA,IAAkB,EAAE,CAAA;AAC3D,EAAA,OAAO,CAAC,GAAG,SAAA,EAAW,GAAG,SAAS,CAAA;AACpC;AAEA,SAAS,kBAAkB,EAAA,EAA4C;AACrE,EAAA,OAAO;AAAA,IACL,MAAM,EAAA,CAAG,QAAA;AAAA,IACT,MAAM,EAAA,CAAG,IAAA;AAAA,IACT,aAAa,EAAA,CAAG,WAAA;AAAA,IAChB,eAAe,EAAA,CAAG;AAAA,GACpB;AACF;AAEA,eAAsB,YAAA,CAAa,QAAoB,EAAA,EAAiC;AACtF,EAAA,mBAAA,CAAoB,EAAE,CAAA;AACtB,EAAA,MAAM,MAAA,GAAS,EAAA,CAAG,MAAA,IAAU,EAAC;AAC7B,EAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,MAAA,GACxC,WAAA,CAAY,MAAA,EAAQ,YAAA,CAAa,MAAA,CAAO,MAAM,CAAC,CAAA,GAC/C,IAAA;AACJ,EAAA,MAAM,KAAKtC,iBAAAA,EAAW;AACtB,EAAA,MAAM,OAAO,IAAA,CAAK,KAAA;AAAA,IAChB,CAAA;AAAA;AAAA;AAAA,4DAAA,CAAA;AAAA,IAIA;AAAA,MACE,EAAA;AAAA,MACA,EAAA,CAAG,IAAA;AAAA,MACH,EAAA,CAAG,IAAA;AAAA,MACH,GAAG,WAAA,IAAe,EAAA;AAAA,MAClB,EAAA,CAAG,QAAA;AAAA,MACH,EAAA,CAAG,GAAA;AAAA,MACH,eAAA;AAAA,MACA,EAAA,CAAG,gBAAA;AAAA,MACH,IAAA,CAAK,SAAA,CAAU,EAAA,CAAG,cAAA,IAAkB,EAAE,CAAA;AAAA,MACtC,EAAA,CAAG;AAAA;AACL,GACF;AACA,EAAA,OAAO,EAAA;AACT;AAEA,eAAsB,UAAA,CACpB,MAAA,EACA,EAAA,EACA,IAAA,EACqB;AACrB,EAAA,MAAM,EAAE,UAAA,GAAa,IAAA,EAAM,GAAG,QAAO,GAAI,IAAA;AACzC,EAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,gDAAA,CAAA,EAAoD,CAAC,EAAE,CAAC,CAAA;AACjG,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA;AAC3B,EAAA,IAAI,CAAC,GAAA,IAAO,CAAC,UAAA,CAAW,IAAI,GAAA,IAAO,IAAA,GAAO,CAAC,GAAG,GAAA,CAAI,GAAG,CAAA,GAAI,IAAA,EAAM,UAAU,CAAA,EAAG;AAC1E,IAAA,MAAM,IAAI/B,yBAAA,CAAkB,CAAA,gBAAA,EAAmB,EAAE,CAAA,CAAE,CAAA;AAAA,EACrD;AACA,EAAA,MAAM,OAAiB,EAAC;AACxB,EAAA,MAAM,SAAoB,EAAC;AAC3B,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,IAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,MAAA,IAAA,CAAK,IAAA,CAAK,CAAA,oBAAA,EAAuB,CAAA,EAAG,CAAA,CAAE,CAAA;AACtC,MAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,WAAA,CAAY,KAAA,EAAkC,aAAa,MAAA,CAAO,MAAM,CAAC,CAAA,GAAI,IAAI,CAAA;AAAA,IACvG,CAAA,MAAA,IAAW,iBAAA,CAAkB,GAAA,CAAI,GAAG,CAAA,EAAG;AACrC,MAAA,MAAM,GAAA,GACJ,QAAQ,UAAA,GACJ,WAAA,GACA,QAAQ,kBAAA,GACN,mBAAA,GACA,GAAA,KAAQ,gBAAA,GACN,iBAAA,GACA,GAAA;AACV,MAAA,IAAA,CAAK,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,IAAA,EAAO,GAAG,CAAA,CAAE,CAAA;AAC5B,MAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,iBAAA,GAAoB,IAAA,CAAK,UAAU,KAAA,IAAS,EAAE,CAAA,GAAI,KAAK,CAAA;AAAA,IAC7E;AAAA,EACF;AACA,EAAA,IAAA,CAAK,KAAK,CAAA,kBAAA,CAAoB,CAAA;AAC9B,EAAA,MAAA,CAAO,KAAK,EAAE,CAAA;AACd,EAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,IAAA,CAAK,KAAA;AAAA,IAChC,mCAAmC,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,gBAAgB,CAAC,CAAA,YAAA,CAAA;AAAA,IACnE;AAAA,GACF;AACA,EAAA,OAAO,eAAA,CAAgB,OAAA,CAAQ,IAAA,CAAK,CAAC,GAAG,MAAM,CAAA;AAChD;AAEA,eAAsB,UAAA,CACpB,MAAA,EACA,EAAA,EACA,IAAA,GAAyC,EAAC,EAC3B;AACf,EAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,gDAAA,CAAA,EAAoD,CAAC,EAAE,CAAC,CAAA;AACjG,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA;AAC3B,EAAA,IAAI,CAAC,GAAA,IAAO,CAAC,UAAA,CAAW,GAAA,CAAI,OAAO,IAAA,GAAO,CAAC,GAAG,GAAA,CAAI,GAAG,CAAA,GAAI,IAAA,EAAM,IAAA,CAAK,UAAA,IAAc,IAAI,CAAA,EAAG;AACvF,IAAA,MAAM,IAAIA,yBAAA,CAAkB,CAAA,gBAAA,EAAmB,EAAE,CAAA,CAAE,CAAA;AAAA,EACrD;AACA,EAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAM,CAAA,8CAAA,CAAA,EAAkD,CAAC,EAAE,CAAC,CAAA;AAChF;AAEA,eAAsB,SAAA,CACpB,MAAA,EACA,IAAA,GAAmE,EAAC,EAC3B;AACzC,EAAA,MAAM,QAAQ,MAAM,WAAA,CAAY,MAAA,EAAQ,IAAA,CAAK,YAAY,IAAI,CAAA;AAC7D,EAAA,OAAO,KAAA,CAAM,MAAA,CAAO,CAAC,EAAA,KAAO,WAAA,CAAY,EAAA,EAAI,IAAA,CAAK,UAAA,IAAc,IAAI,CAAC,CAAA,CAAE,GAAA,CAAI,iBAAiB,CAAA;AAC7F;AAEA,eAAsB,WAAA,CACpB,MAAA,EACA,KAAA,EACA,IAAA,GAAmF,EAAC,EAC3C;AACzC,EAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,MAAA,EAAQ,EAAE,QAAA,EAAU,IAAA,CAAK,QAAA,EAAU,UAAA,EAAY,IAAA,CAAK,UAAA,EAAY,CAAA;AAC/F,EAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,IAAS,EAAA;AAC5B,EAAA,MAAM,UAAA,GAAA,CAAc,KAAA,IAAS,EAAA,EAAI,WAAA,GAAc,IAAA,EAAK;AACpD,EAAA,IAAI,CAAC,UAAA,EAAY,OAAO,MAAA,CAAO,KAAA,CAAM,GAAG,KAAK,CAAA;AAC7C,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,KAAK,CAAA;AACpC,EAAA,MAAM,SAAmD,EAAC;AAC1D,EAAA,KAAA,MAAW,QAAQ,MAAA,EAAQ;AACzB,IAAA,MAAM,QAAA,GAAW,GAAG,IAAA,CAAK,IAAI,IAAI,IAAA,CAAK,WAAW,GAAG,WAAA,EAAY;AAChE,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,EAAG,IAAA,KAAS,CAAA,IAAK,QAAA,CAAS,QAAA,CAAS,IAAI,CAAA,GAAI,CAAA,GAAI,IAAI,CAAC,CAAA;AAChF,IAAA,IAAI,QAAQ,CAAA,EAAG,MAAA,CAAO,KAAK,CAAC,KAAA,EAAO,IAAI,CAAC,CAAA;AAAA,EAC1C;AACA,EAAA,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAC,CAAA;AACjC,EAAA,OAAO,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,CAAE,GAAA,CAAI,CAAC,GAAG,CAAC,CAAA,KAAM,CAAC,CAAA;AAChD;AAEA,IAAM,UAAA,GAAa;AAAA,EACjB,uBAAA;AAAA,EACA,QAAA;AAAA,EACA,mBAAA;AAAA,EACA,eAAA;AAAA,EACA,UAAA;AAAA,EACA,cAAA;AAAA,EACA,WAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA;AACA,IAAM,iBAAA,GAAoB;AAAA,EACxB,oBAAA;AAAA,EACA,mBAAA;AAAA,EACA,2BAAA;AAAA,EACA,uBAAA;AAAA,EACA,kBAAA;AAAA,EACA,wBAAA;AAAA,EACA,sCAAA;AAAA,EACA,aAAA;AAAA,EACA,kBAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA;AACA,IAAM,aAAA,GAAgB,CAAC,WAAA,EAAa,SAAA,EAAW,SAAS,CAAA;AACxD,IAAM,mBAAA,GAAsB;AAAA,EAC1B,gBAAA;AAAA,EACA,SAAA;AAAA,EACA,kBAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAA;AAEA,SAAS,mBAAmB,GAAA,EAAsB;AAChD,EAAA,IAAI,GAAA,YAAe,YAAA,IAAgB,GAAA,CAAI,IAAA,KAAS,gBAAgB,OAAO,SAAA;AACvE,EAAA,MAAM,IAAA,GAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,IAAA,GAAO,EAAA;AAC/C,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA,EAAG,OAAO,SAAA;AACrC,EAAA,IAAI,CAAC,cAAA,EAAgB,iBAAA,EAAmB,cAAA,EAAgB,WAAW,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG;AAClG,IAAA,IAAI,IAAA,KAAS,WAAA,IAAe,CAAC,MAAA,CAAO,GAAG,EAAE,WAAA,EAAY,CAAE,QAAA,CAAS,OAAO,CAAA,EAAG,CAE1E,MAAA,IAAW,IAAA,KAAS,WAAA,EAAa,OAAO,aAAA;AAAA,EAC1C;AACA,EAAA,IAAI,CAAC,MAAA,EAAQ,YAAA,EAAc,WAAA,EAAa,cAAc,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,GAAG,OAAO,aAAA;AAC9F,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,GAAG,CAAA,CAAE,WAAA,EAAY;AACrC,EAAA,IAAI,aAAA,CAAc,KAAK,CAAC,CAAA,KAAM,KAAK,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG,OAAO,SAAA;AACxD,EAAA,IAAI,UAAA,CAAW,KAAK,CAAC,CAAA,KAAM,KAAK,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG,OAAO,aAAA;AACrD,EAAA,IAAI,iBAAA,CAAkB,KAAK,CAAC,CAAA,KAAM,KAAK,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG,OAAO,aAAA;AAC5D,EAAA,IAAI,mBAAA,CAAoB,KAAK,CAAC,CAAA,KAAM,KAAK,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG,OAAO,eAAA;AAC9D,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,YAAA,CAAa,KAAc,IAAA,EAAuC;AACzE,EAAA,MAAM,QAAA,GAAW,mBAAmB,GAAG,CAAA;AACvC,EAAA,OAAA,CAAQ,KAAK,CAAA,eAAA,EAAkB,IAAI,CAAA,SAAA,CAAA,EAAa,GAAA,EAAK,MAAM,QAAQ,CAAA;AACnE,EAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,QAAA,EAAS;AACtC;AAEA,eAAsB,QAAA,CAAS,SAAqB,EAAA,EAAkD;AACpG,EAAA,MAAM,OAAO,EAAA,CAAG,IAAA;AAChB,EAAA,MAAM,MAAA,GAAS,EAAA,CAAG,MAAA,IAAU,EAAC;AAC7B,EAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,IAAA,MAAM,MAAM,MAAA,CAAO,GAAA;AACnB,IAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,2BAAA,EAA4B;AACjE,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,QAC5B,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAU,MAAA,CAAO,OAAA,IAAsC,EAAC;AAAA,QACxD,QAAA,EAAU,QAAA;AAAA,QACV,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,GAAM;AAAA,OACnC,CAAA;AACD,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,CAAK,SAAS,GAAA,EAAK,WAAA,EAAa,KAAK,MAAA,EAAO;AAAA,IAC3D,SAAS,GAAA,EAAK;AACZ,MAAA,OAAO,YAAA,CAAa,KAAK,MAAM,CAAA;AAAA,IACjC;AAAA,EACF;AACA,EAAA,IAAI,SAAS,IAAA,EAAM;AACjB,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,cAAA,EAAAsE,eAAAA,EAAe,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,OAAA,EAAA,EAAA,UAAA,CAAA,CAAA;AACjC,MAAA,MAAM,MAAA,GAAS,MAAMA,eAAAA,CAAe,MAAM,CAAA;AAC1C,MAAA,OAAO,EAAE,IAAI,OAAA,CAAQ,MAAA,CAAO,WAAW,MAAA,CAAO,EAAE,CAAA,EAAG,GAAG,MAAA,EAAO;AAAA,IAC/D,SAAS,GAAA,EAAK;AACZ,MAAA,OAAO,YAAA,CAAa,KAAK,IAAI,CAAA;AAAA,IAC/B;AAAA,EACF;AACA,EAAA,IAAI,SAAS,KAAA,EAAO;AAClB,IAAA,MAAM,MAAM,MAAA,CAAO,GAAA;AACnB,IAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,0BAAA,EAA2B;AAChE,IAAA,MAAM,KAAA,GAAS,MAAA,CAAO,WAAA,IAAe,MAAA,CAAO,UAAU,MAAA,CAAO,YAAA;AAC7D,IAAA,MAAM,GAAA,GAAM,IAAI,WAAA,EAAY;AAC5B,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,CAAI,UAAU,EAAA,CAAG,IAAA,EAAM,KAAK,EAAE,KAAA,EAAO,KAAA,IAAS,IAAA,EAAM,CAAA;AAC1D,MAAA,MAAM,MAAA,GAAS,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,GAAG,IAAI,CAAA;AACtC,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,EAAE;AAAA,IAC5D,SAAS,GAAA,EAAK;AACZ,MAAA,OAAO,YAAA,CAAa,KAAK,KAAK,CAAA;AAAA,IAChC,CAAA,SAAE;AACA,MAAA,MAAM,IAAI,QAAA,EAAS;AAAA,IACrB;AAAA,EACF;AACA,EAAA,OAAO,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,mCAAmC,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA,CAAA,EAAG;AACvF;AAEA,eAAe,oBAAA,CACb,MAAA,EACA,QAAA,EACA,IAAA,EACA,QAAA,EACwB;AACxB,EAAA,MAAM,SAAA,uBAAgB,IAAA,EAAK;AAC3B,EAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,IAAA,CAAK,KAAA;AAAA,IACnC,CAAA,wFAAA,CAAA;AAAA,IACA,CAAC,QAAQ;AAAA,GACX;AACA,EAAA,KAAA,MAAW,GAAA,IAAO,WAAW,IAAA,EAAM;AACjC,IAAA,IAAA,CAAK,GAAA,CAAI,SAAA,IAAa,IAAA,OAAW,QAAA,IAAY,IAAA,CAAA,EAAO;AACpD,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,gBAAA,IAAoB,EAAC;AACxC,IAAA,IAAI,KAAK,SAAA,CAAU,MAAM,MAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,EAAG;AACrD,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,IAAA,CAAK,KAAA;AAAA,MAC/B,CAAA;AAAA;AAAA;AAAA,mBAAA,CAAA;AAAA,MAIA,CAAC,SAAA,EAAW,GAAA,CAAI,EAAE;AAAA,KACpB;AACA,IAAA,IAAI,OAAO,QAAA,KAAa,CAAA,EAAG,OAAO,MAAA,CAAO,IAAI,EAAE,CAAA;AAAA,EACjD;AACA,EAAA,OAAO,IAAA;AACT;AAEA,eAAe,WAAA,CACb,EAAA,EACA,MAAA,EACA,IAAA,EACkB;AAClB,EAAA,MAAM,MAAM,MAAA,CAAO,GAAA;AACnB,EAAA,IAAI,CAAC,KAAK,MAAM,IAAItE,0BAAkB,CAAA,SAAA,EAAY,EAAA,CAAG,QAAQ,CAAA,qBAAA,CAAuB,CAAA;AACpF,EAAA,MAAM,UAAU,EAAE,GAAK,MAAA,CAAO,OAAA,IAAsC,EAAC,EAAG;AACxE,EAAA,MAAM,KAAA,GAAS,MAAA,CAAO,WAAA,IAAe,MAAA,CAAO,UAAU,MAAA,CAAO,YAAA;AAC7D,EAAA,MAAM,SAAS,MAAA,CAAO,OAAA;AACtB,EAAA,IAAI,KAAA,EAAO,OAAA,CAAQ,aAAA,GAAgB,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA;AAAA,OAAA,IACzC,MAAA,EAAQ,OAAA,CAAQ,aAAA,GAAgB,CAAA,OAAA,EAAU,MAAM,CAAA,CAAA;AACzD,EAAA,MAAM,WAAW,MAAA,CAAO,EAAA,CAAG,GAAA,EAAK,SAAA,IAAa,GAAG,WAAW,CAAA;AAC3D,EAAA,MAAM,GAAA,GAAM,IAAI,WAAA,EAAY;AAC5B,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,CAAI,SAAA,CAAU,EAAA,CAAG,QAAA,EAAU,KAAK,EAAE,OAAA,EAAS,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,MAAA,GAAS,OAAA,GAAU,MAAM,CAAA;AAC/F,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,GAAG,QAAQ,CAAA;AAC1C,IAAA,OAAO,MAAM,MAAA,CAAO,qBAAA,CAAsB,QAAA,EAAU,IAAI,CAAA;AAAA,EAC1D,CAAA,SAAE;AACA,IAAA,MAAM,IAAI,QAAA,EAAS;AAAA,EACrB;AACF;AAEA,eAAe,QAAA,CACb,MAAA,EACA,EAAA,EACA,MAAA,EACA,IAAA,EACkB;AAClB,EAAA,IAAI,EAAA,CAAG,SAAS,MAAA,EAAQ;AACtB,IAAA,OAAO,WAAA,CAAY,QAAQ,IAAA,EAAM,EAAE,QAAQ,MAAA,CAAO,eAAA,IAAmB,MAAM,CAAA;AAAA,EAC7E;AACA,EAAA,IAAI,EAAA,CAAG,SAAS,IAAA,EAAM;AACpB,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,KAAA,IAAS,EAAE,CAAA;AACrC,IAAA,IAAI,MAAM,IAAA,EAAK,CAAE,aAAY,CAAE,UAAA,CAAW,WAAW,CAAA,EAAG;AACtD,MAAA,MAAM,MAAA,GAAS,MACZ,KAAA,CAAM,KAAA,CAAM,QAAQ,GAAG,CAAA,GAAI,CAAC,CAAA,CAC5B,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAA,CACnB,OAAO,OAAO,CAAA;AACjB,MAAA,MAAM,aAAa,MAAM,aAAA,CAAc,QAAQ,MAAA,CAAO,MAAA,GAAS,SAAS,IAAI,CAAA;AAC5E,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,UAAA,EAAW;AAAA,IAC7C;AACA,IAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,MAAA,EAAQ,KAAK,CAAA;AAC5C,IAAA,IAAI,UAAU,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,CAAO,YAAY,KAAA,EAAO;AACpE,MAAA,MAAM,IAAIA,yBAAA,CAAkB,MAAA,CAAO,MAAA,CAAO,KAAA,IAAS,uBAAuB,CAAC,CAAA;AAAA,IAC7E;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI,GAAG,IAAA,KAAS,KAAA,SAAc,WAAA,CAAY,EAAA,EAAI,QAAQ,IAAI,CAAA;AAC1D,EAAA,IAAI,EAAA,CAAG,SAAS,UAAA,EAAY;AAC1B,IAAA,MAAM,EAAA,GAAK,GAAG,GAAA,EAAK,QAAA;AACnB,IAAA,IAAI,CAAC,IAAI,MAAM,IAAIA,0BAAkB,CAAA,cAAA,EAAiB,EAAA,CAAG,QAAQ,CAAA,gBAAA,CAAkB,CAAA;AACnF,IAAA,OAAO,MAAM,EAAA,CAAG,GAAG,SAAA,CAAU,EAAA,EAAI,IAAI,CAAC,CAAA;AAAA,EACxC;AACA,EAAA,MAAM,IAAIA,0BAAkB,CAAA,uBAAA,EAA0B,IAAA,CAAK,UAAU,EAAA,CAAG,IAAI,CAAC,CAAA,CAAE,CAAA;AACjF;AAEA,SAAS,SAAA,CAAU,IAAkC,IAAA,EAA0C;AAC7F,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,SAAA,CAAU,QAAA,CAAS,KAAK,EAAE,CAAA;AAC/C,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,aAAa,CAAA;AACrC,EAAA,MAAM,KAAA,GAAA,CAAS,QAAQ,CAAC,CAAA,IAAK,IAC1B,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAA,EAAK,CAAE,KAAA,CAAM,MAAM,CAAA,CAAE,CAAC,GAAG,IAAA,EAAM,CAAA,CAC5C,MAAA,CAAO,OAAO,CAAA;AACjB,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,EAAQ,OAAO,MAAA,CAAO,OAAO,IAAI,CAAA;AAC5C,EAAA,OAAO,MAAM,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,CAAE,CAAC,CAAA;AAClC;AAEA,eAAe,eAAA,CAAgB,QAAoB,MAAA,EAAkD;AACnG,EAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,+DAAA,CAAA,EAAmE;AAAA,IACxG;AAAA,GACD,CAAA;AACD,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA;AACzB,EAAA,IAAI,CAAC,GAAA,EAAK,gBAAA,EAAkB,OAAO,EAAC;AACpC,EAAA,OAAO,WAAA,CAAY,OAAO,GAAA,CAAI,gBAAgB,GAAG,YAAA,CAAa,MAAA,CAAO,MAAM,CAAC,CAAA;AAC9E;AAEA,eAAsB,YACpB,MAAA,EACA,QAAA,EACA,IAAA,EACA,IAAA,GAKI,EAAC,EAC6B;AAClC,EAAA,MAAM,WAAA,GAAc,QAAQ,EAAC;AAC7B,EAAA,MAAM,EAAA,GAAK,SAAS,MAAM,WAAA,CAAY,QAAQ,IAAA,CAAK,QAAA,IAAY,IAAI,CAAA,EAAG,QAAQ,CAAA;AAC9E,EAAA,IAAI,CAAC,EAAA,EAAI,MAAM,IAAIA,yBAAA,CAAkB,CAAA,gBAAA,EAAmB,QAAQ,CAAA,CAAE,CAAA;AAClE,EAAA,IAAI,CAAC,WAAA,CAAY,EAAA,EAAI,IAAA,CAAK,UAAA,IAAc,IAAI,CAAA,EAAG;AAC7C,IAAA,MAAM,IAAIA,yBAAA,CAAkB,CAAA,gBAAA,EAAmB,QAAQ,CAAA,CAAE,CAAA;AAAA,EAC3D;AAEA,EAAA,MAAM,UAAA,GAAa,oBAAoB,WAAW,CAAA;AAClD,EAAA,IAAI,UAAA,GAA4B,IAAA;AAChC,EAAA,IAAI,qBAAA,CAAsB,EAAA,EAAI,UAAU,CAAA,EAAG;AACzC,IAAA,UAAA,GAAa,MAAM,qBAAqB,MAAA,EAAQ,EAAA,CAAG,UAAU,UAAA,EAAY,IAAA,CAAK,YAAY,IAAI,CAAA;AAC9F,IAAA,IAAI,cAAc,IAAA,EAAM;AACtB,MAAA,MAAM,MAAA,GAAS,MAAM,aAAA,CAAc,MAAA,EAAQ;AAAA,QACzC,UAAU,EAAA,CAAG,QAAA;AAAA,QACb,IAAA,EAAM,UAAA;AAAA,QACN,QAAA,EAAU,KAAK,QAAA,IAAY,IAAA;AAAA,QAC3B,UAAA,EAAY,KAAK,UAAA,IAAc,IAAA;AAAA,QAC/B,MAAA,EAAQ,EAAA,CAAG,cAAA,IAAkB;AAAC,OAC/B,CAAA;AACD,MAAA,MAAM,SAAS,EAAA,CAAG,gBAAA,GACd,2BACA,CAAA,+BAAA,EAAkC,EAAA,CAAG,gBAAgB,SAAS,CAAA,CAAA;AAClE,MAAA,OAAO;AAAA,QACL,iBAAA,EAAmB;AAAA,UACjB,WAAA,EAAa,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA;AAAA,UAC7B,WAAW,EAAA,CAAG,QAAA;AAAA,UACd,IAAA,EAAM,UAAA;AAAA,UACN;AAAA;AACF,OACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,SAAkC,EAAC;AACvC,EAAA,IAAI,EAAA,CAAG,IAAA,KAAS,UAAA,IAAc,EAAA,CAAG,MAAM,IAAA,EAAM;AAC3C,IAAA,MAAA,GAAS,MAAM,eAAA,CAAgB,MAAA,EAAQ,EAAA,CAAG,EAAE,CAAA;AAAA,EAC9C;AAEA,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,EAAO,IAAA,IAAQ,IAAA;AACtC,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,EAAO,EAAA,IAAM,IAAA;AAClC,EAAA,IAAI,SAAA,GAAqB,IAAA;AACzB,EAAA,IAAI,GAAA,GAAe,IAAA;AACnB,EAAA,MAAM,KAAA,GAAQ,IAAI,aAAA,EAAc,CAAE,KAAA,EAAM;AACxC,EAAA,IAAI;AACF,IAAA,SAAA,GAAY,MAAM,QAAA,CAAS,MAAA,EAAQ,EAAA,EAAI,QAAQ,UAAU,CAAA;AAAA,EAC3D,SAAS,CAAA,EAAG;AACV,IAAA,GAAA,GAAM,CAAA;AAAA,EACR;AACA,EAAA,KAAA,CAAM,IAAA,EAAK;AAEX,EAAA,IAAI,UAAU,GAAA,IAAO,IAAA;AACrB,EAAA,IAAI,MAAA,GAAkB,IAAA;AACtB,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,IAAI;AACF,MAAA,MAAM,CAAC,QAAQ,CAAA,GAAI,iBAAiB,SAAA,EAAW,MAAA,CAAO,OAAO,SAAA,EAAW;AAAA,QACtE,UAAA,EAAY,KAAK,UAAA,IAAc,IAAA;AAAA,QAC/B,SAAA,EAAW,OAAO,MAAA,CAAO,SAAA;AAAA,QACzB,OAAO,MAAA,CAAO;AAAA,OACf,CAAA;AACD,MAAA,SAAA,GAAY,QAAA;AACZ,MAAA,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,WAAA,CAAY,SAAS,CAAA;AAAA,IAC7C,SAAS,CAAA,EAAG;AACV,MAAA,GAAA,GAAM,CAAA;AACN,MAAA,OAAA,GAAU,KAAA;AAAA,IACZ;AAAA,EACF;AAEA,EAAA,MAAM,YAAY,MAAA,EAAQ;AAAA,IACxB,QAAQ,EAAA,CAAG,EAAA;AAAA,IACX,UAAU,EAAA,CAAG,QAAA;AAAA,IACb,MAAM,EAAA,CAAG,IAAA;AAAA,IACT,SAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA,EAAQ,KAAK,MAAA,IAAU,KAAA;AAAA,IACvB,SAAA,EAAW,UAAA;AAAA,IACX,YAAA,EAAc,UAAU,SAAA,GAAY,IAAA;AAAA,IACpC,OAAA;AAAA,IACA,KAAA,EAAO,GAAA;AAAA,IACP,YAAY,KAAA,CAAM,UAAA;AAAA,IAClB,KAAA,EAAO,UAAU,CAAA,GAAI,CAAA;AAAA,IACrB;AAAA,GACD,CAAA;AAED,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAIA,yBAAA,CAAkB,CAAA,uBAAA,EAA0B,GAAG,QAAQ,CAAA,EAAA,EAAK,GAAG,CAAA,CAAE,CAAA;AAAA,EAC7E;AAEA,EAAA,MAAM,KAAA,GAAoB;AAAA,IACxB,IAAA,EAAM,MAAA;AAAA,IACN,KAAA,EAAO,CAAA;AAAA,IACP,MAAA,EAAQ,EAAE,SAAA,EAAW,EAAA,CAAG,UAAU,IAAA,EAAM,EAAA,CAAG,MAAM,SAAA;AAAU,GAC7D;AACA,EAAA,SAAA,CAAU,MAAA,CAAO,OAAO,KAAK,CAAA;AAE7B,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,MAAA;AAAA,IACR,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,MAAM,MAAA,EAAQ,SAAA,EAAW,EAAA,CAAG,QAAA,EAAU,SAAA;AAAU,GACrE;AACF;;;AT9jBA,SAAS,oBAAA,CACP,GAAA,EACA,MAAA,EACA,IAAA,EACyB;AACzB,EAAA,IAAI,MAAA,CAAO,OAAA,EAAQ,EAAG,OAAO,GAAA;AAE7B,EAAA,MAAM,SAAA,GAAY,CAAC,KAAA,KACjB,cAAA,CAAe,OAAO,MAAA,EAAQ;AAAA,IAC5B,KAAA,EAAO,QAAA;AAAA,IACP,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,OAAO,IAAA,CAAK;AAAA,GACb,EAAE,CAAC,CAAA;AAEN,EAAA,MAAM,IAAA,GAAO,CAAC,IAAA,KAA2B;AACvC,IAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,OAAO,UAAU,IAAI,CAAA;AACnD,IAAA,IAAI,MAAM,OAAA,CAAQ,IAAI,GAAG,OAAO,IAAA,CAAK,IAAI,IAAI,CAAA;AAC7C,IAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACpC,MAAA,OAAO,MAAA,CAAO,WAAA;AAAA,QACZ,MAAA,CAAO,OAAA,CAAQ,IAA+B,CAAA,CAAE,IAAI,CAAC,CAAC,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA,EAAG,IAAA,CAAK,CAAC,CAAC,CAAC;AAAA,OAC9E;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,GAAA,GAAM,EAAE,GAAG,GAAA,EAAI;AACrB,EAAA,IAAI,OAAO,IAAI,IAAA,KAAS,QAAA,MAAc,IAAA,GAAO,SAAA,CAAU,IAAI,IAAI,CAAA;AAC/D,EAAA,IAAI,OAAO,IAAI,YAAA,KAAiB,QAAA,MAAc,YAAA,GAAe,SAAA,CAAU,IAAI,YAAY,CAAA;AACvF,EAAA,IAAI,OAAO,IAAI,KAAA,KAAU,QAAA,MAAc,KAAA,GAAQ,SAAA,CAAU,IAAI,KAAK,CAAA;AAClE,EAAA,IAAI,IAAI,cAAA,IAAkB,IAAA,MAAU,cAAA,GAAiB,IAAA,CAAK,IAAI,cAAc,CAAA;AAC5E,EAAA,OAAO,GAAA;AACT;AAeA,SAAS,kBAAA,CACP,MAAA,EACA,MAAA,EACA,IAAA,EACc;AACd,EAAA,IAAI,MAAA,CAAO,OAAA,EAAQ,EAAG,OAAO,MAAA;AAC7B,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,MAAM,SAAA,GAA8B,MAAA,CAAO,SAAA,CAAU,GAAA,CAAI,CAAC,GAAA,KAAQ;AAChE,IAAA,IAAI,OAAO,GAAA,CAAI,KAAA,KAAU,QAAA,EAAU,OAAO,GAAA;AAC1C,IAAA,MAAM,CAAC,MAAM,CAAA,GAAI,cAAA,CAAe,GAAA,CAAI,OAAO,MAAA,EAAQ;AAAA,MACjD,KAAA,EAAO,QAAA;AAAA,MACP,UAAA,EAAY,IAAA;AAAA,MACZ,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AACD,IAAA,IAAI,MAAA,KAAW,GAAA,CAAI,KAAA,EAAO,OAAO,GAAA;AACjC,IAAA,OAAA,GAAU,IAAA;AACV,IAAA,OAAO,EAAE,GAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAO;AAAA,EACjC,CAAC,CAAA;AACD,EAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AACrB,EAAA,OAAO,EAAE,GAAG,MAAA,EAAQ,SAAA,EAAU;AAChC;AAEO,IAAM,gBAAN,MAA0C;AAAA,EAC/C,MAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA,GAAiC,IAAA;AAAA;AAAA,EAEjC,iBAAgD,EAAC;AAAA,EACjD,eAAA,GAAyC,IAAA;AAAA,EACjC,KAAA,GAAqB,IAAA;AAAA,EACrB,SAAA,GAA6B,IAAA;AAAA;AAAA,EAE7B,WAAA,GAAiC,IAAA;AAAA,EAEzC,WAAA,CACE,MAAA,EACA,IAAA,GAGI,EAAC,EACL;AACA,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,OAAA,EAAS,IAAA,CAAK,WAAW,IAAA,EAAM,OAAA,EAAS,IAAA,CAAK,OAAA,IAAW,IAAA,EAAK;AAAA,EAC9E;AAAA,EAEA,MAAc,UAAA,GAA4B;AACxC,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,MAAA,IAAA,CAAK,KAAA,GAAQ,MAAM,UAAA,CAAW,IAAA,CAAK,OAAO,WAAW,CAAA;AACrD,MAAA,IAAA,CAAK,OAAO,IAAA,CAAK,KAAA;AAAA,IACnB;AACA,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,IAAA,CAAK,OAAA,GAAU,IAAI,eAAA,CAAgB,IAAA,CAAK,OAAO,IAAA,CAAK,MAAA,CAAO,QAAQ,iBAAiB,CAAA;AAAA,IACtF;AACA,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,QAAA,GAAqB;AACvB,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW,IAAA,CAAK,YAAY,aAAA,CAAc,IAAA,CAAK,OAAO,SAAS,CAAA;AACzE,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA,EAEA,MAAc,aAAA,GAAqC;AACjD,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,MAAM,EAAE,eAAA,EAAAuE,gBAAAA,EAAgB,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,UAAA,EAAA,EAAA,aAAA,CAAA,CAAA;AAClC,MAAA,IAAA,CAAK,WAAA,GAAc,MAAMA,gBAAAA,CAAgB,IAAA,CAAK,MAAA,CAAO,OAAO,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,CAAA;AAAA,IACnF;AACA,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA,EAEA,MAAc,cAAc,IAAA,EAAuC;AACjE,IAAA,MAAM,EAAE,aAAA,EAAAnC,cAAAA,EAAc,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,UAAA,EAAA,EAAA,aAAA,CAAA,CAAA;AAChC,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,UAAA,EAAW;AACnC,IAAA,OAAOA,cAAAA,CAAc;AAAA,MACnB,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,IAAA;AAAA,MACA,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,UAAA,EAAY,MAAM,IAAA,CAAK,aAAA;AAAc,KACtC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,MAAA,GAAwB;AAC5B,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,MAAM,IAAA,CAAK,UAAU,MAAA,EAAO;AAC5B,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,IACnB;AACA,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,MAAM,QAAQ,IAAA,CAAK,WAAA;AACnB,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,MAAA,MAAM,MAAA,GAAS,MAAM,KAAA,IAAQ;AAC7B,MAAA,IAAI,MAAA,IAAU,OAAQ,MAAA,CAAyB,IAAA,KAAS,YAAY,MAAM,MAAA;AAAA,IAC5E;AACA,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,MAAM,IAAA,CAAK,MAAM,GAAA,EAAI;AACrB,MAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AAAA,IACf;AAAA,EACF;AAAA,EAEA,OAAO,MAAA,CAAO,YAAY,CAAA,GAAmB;AAC3C,IAAA,MAAM,KAAK,MAAA,EAAO;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,MAAA,CACJ,IAAA,GAKI,EAAC,EACkB;AACvB,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,UAAA,EAAW;AACnC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,MAAA,CAAO,WAAA;AACtC,IAAA,IAAI,SAAS,OAAA,IAAW,CAAC,IAAA,CAAK,MAAA,CAAO,MAAM,OAAA,EAAS;AAClD,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OAEF;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,KAAA,IAAS,CAAC,CAAC,QAAA,EAAU,cAAc,CAAA,CAAE,QAAA,CAAS,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,QAAQ,CAAA,EAAG;AACtF,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,oCAAoC,IAAA,CAAK,SAAA,CAAU,KAAK,MAAA,CAAO,SAAA,CAAU,QAAQ,CAAC,CAAA,uBAAA;AAAA,OACpF;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,iBAAA,IAAqB,CAAC,IAAA,CAAK,OAAO,GAAA,EAAK;AAC9C,MAAA,MAAM,IAAI,MAAM,0EAA0E,CAAA;AAAA,IAC5F;AACA,IAAA,IAAI,IAAA,CAAK,UAAA,IAAc,CAAC,IAAA,CAAK,iBAAA,EAAmB;AAC9C,MAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,IAC9D;AAEA,IAAA,MAAM,WAAW,aAAA,CAAc;AAAA,MAC7B,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,MAAM,IAAA,CAAK;AAAA,KACZ,CAAA;AACD,IAAA,MAAM,OAAA,GAAyB;AAAA,MAC7B,OAAA,EAAS,SAAS,CAAC,CAAA;AAAA,MACnB,QAAA,EAAU,SAAS,CAAC,CAAA;AAAA,MACpB,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,MAChB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,IAAA;AAAA,MACA,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,mBAAmB,IAAA,CAAK,iBAAA;AAAA,MACxB,YAAY,IAAA,CAAK;AAAA,KACnB;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,OAAA,EAAS;AAAA,MACtC,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,IAAA;AAAA,MACA,UAAA,EAAY,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,OAAA,GAAU,CAAC,IAAA,KAAS,IAAA,CAAK,aAAA,CAAc,IAAI,CAAA,GAAI,IAAA;AAAA,MAC7E,aAAA,EAAe;AAAA,KAChB,CAAA;AACD,IAAA,OAAO,kBAAA,CAAmB,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW;AAAA,MACvD,SAAA,EAAW,KAAK,MAAA,CAAO,SAAA;AAAA,MACvB,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,aAAA,GAAiC;AACrC,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,UAAA,EAAW;AACnC,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,IAAA,CAAK,KAAA;AAAA,MAC1B,CAAA,iFAAA;AAAA,KACF;AACA,IAAA,IAAI,SAAA,GAAY,CAAA;AAChB,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,SAAA,GAAa,IAAI,SAAA,EAA8C,KAAA;AAGrE,MAAA,MAAM,UAAU,SAAA,EAAW,EAAA;AAC3B,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,MAAM,UAAU,MAAM,kBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,WAAW,OAAO,CAAA;AACvE,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,MAAM,IAAA,CAAK,OAAA,CAAS,qBAAA,CAAsB,GAAA,CAAI,IAAI,OAAO,CAAA;AACzD,MAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,CAAC,CAAA,EAAG,MAAA,IAAU,IAAA;AAC1C,MAAA,MAAM,kBAAA,CAAmB,MAAM,WAAW,CAAA;AAC1C,MAAA,MAAM,IAAA,CAAK,KAAA;AAAA,QACT,CAAA,wGAAA,CAAA;AAAA,QACA,CAAC,IAAI,EAAE;AAAA,OACT;AACA,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,SAAA,EAAW,KAAA,IAAS,CAAC,CAAA;AAC1C,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,SAAA,CAAU,KAAK,KAAA,EAAO;AAAA,UACpB,IAAA,EAAM,QAAA;AAAA,UACN,KAAA;AAAA,UACA,MAAA,EAAQ;AAAA,YACN,WAAA,EAAa,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAAA,YAC1B,QAAA,EAAU,OAAA;AAAA,YACV,MAAM,SAAA,EAAW,IAAA;AAAA,YACjB,MAAA,EAAQ,SAAA,EAAW,MAAA,IAAU,OAAA,CAAQ;AAAA,WACvC;AAAA,UACA,cAAA,EAAiB,SAAA,EAAW,eAAA,IAA8C;AAAC,SACvD,CAAA;AAAA,MACxB;AACA,MAAA,SAAA,IAAa,CAAA;AAAA,IACf;AACA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,MAAA,CACJ,KAAA,EACA,IAAA,GAOI,EAAC,EACkB;AACvB,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,UAAA,EAAW;AACnC,IAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,IAAA,CAAK,UAAA,EAAY,QAAQ,CAAA;AAC9D,IAAA,IAAI,WAAA,GAA+B,IAAA;AACnC,IAAA,IAAA,CAAK,KAAK,IAAA,IAAQ,QAAA,MAAc,WAAW,IAAA,CAAK,MAAA,CAAO,MAAM,OAAA,EAAS;AACpE,MAAA,MAAM,EAAE,gBAAA,EAAAD,iBAAAA,EAAiB,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,UAAA,EAAA,EAAA,aAAA,CAAA,CAAA;AACnC,MAAA,WAAA,GAAc,MAAMA,kBAAiB,KAAA,EAAO;AAAA,QAC1C,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,IAAA;AAAA,QACA,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,UAAA,EAAY,MAAM,IAAA,CAAK,aAAA,EAAc;AAAA,QACrC,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,SAAA,EAAW,KAAK,SAAA,IAAa,IAAA;AAAA,QAC7B;AAAA,OACD,CAAA;AAAA,IACH;AACA,IAAA,OAAO,UAAU,KAAA,EAAO;AAAA,MACtB,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,IAAA;AAAA,MACA,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,UAAA;AAAA,MACA,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,kBAAkB,IAAA,CAAK,gBAAA;AAAA,MACvB,WAAA;AAAA,MACA,WAAW,IAAA,CAAK;AAAA,KACjB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,WAAA,CACJ,UAAA,EACA,IAAA,GAAoC,EAAC,EACH;AAClC,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,UAAA,EAAW;AACnC,IAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,IAAA,CAAK,UAAA,EAAY,aAAa,CAAA;AACnE,IAAA,MAAM,GAAA,GAAM,MAAc,cAAA,CAAe,IAAA,EAAM,YAAY,UAAU,CAAA;AACrE,IAAA,OAAO,oBAAA,CAAqB,GAAA,EAAK,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW;AAAA,MACtD,UAAA;AAAA,MACA,SAAA,EAAW,KAAK,MAAA,CAAO,SAAA;AAAA,MACvB,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,cAAA,CAAe,UAAA,EAAoB,IAAA,GAAoC,EAAC,EAAkB;AAC9F,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,UAAA,EAAW;AACnC,IAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,IAAA,CAAK,UAAA,EAAY,gBAAgB,CAAA;AACtE,IAAA,MAAc,cAAA,CAAe,IAAA,EAAM,UAAA,EAAY,UAAU,CAAA;AACzD,IAAA,MAAM,IAAA,CAAK,OAAA,CAAS,YAAA,CAAa,UAAU,CAAA;AAC3C,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,CAAA,kDAAA,CAAA,EAAsD,CAAC,UAAU,CAAC,CAAA;AAAA,EACrF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,cAAA,CACJ,UAAA,EACA,IAAA,GAMI,EAAC,EACc;AACnB,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,UAAA,EAAW;AACnC,IAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,IAAA,CAAK,UAAA,EAAY,gBAAgB,CAAA;AACtE,IAAA,MAAc,cAAA,CAAe,IAAA,EAAM,UAAA,EAAY,UAAU,CAAA;AAEzD,IAAA,MAAM,UAAmC,EAAC;AAC1C,IAAA,IAAI,IAAA,CAAK,QAAQ,MAAA,IAAa,IAAA,CAAK,QAAQ,KAAA,EAAO,OAAA,CAAQ,MAAM,IAAA,CAAK,GAAA;AACrE,IAAA,IAAI,IAAA,CAAK,SAAS,MAAA,IAAa,IAAA,CAAK,SAAS,KAAA,EAAO,OAAA,CAAQ,OAAO,IAAA,CAAK,IAAA;AACxE,IAAA,IAAI,IAAA,CAAK,gBAAgB,MAAA,IAAa,IAAA,CAAK,gBAAgB,KAAA,EAAO,OAAA,CAAQ,cAAc,IAAA,CAAK,WAAA;AAC7F,IAAA,IAAI,IAAA,CAAK,aAAa,MAAA,IAAa,IAAA,CAAK,aAAa,KAAA,EAAO,OAAA,CAAQ,YAAY,IAAA,CAAK,QAAA;AACrF,IAAA,IAAI,CAAC,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,MAAA,SAAe,EAAC;AAE1C,IAAA,MAAM,OAAA,GAAU,MAAM,qBAAA,CAAsB,IAAA,EAAM,YAAY,OAAO,CAAA;AACrE,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,MAAM,IAAA,CAAK,OAAA,CAAS,cAAA,CAAe,UAAA,EAAY,QAAQ,GAAsB,CAAA;AAAA,IAC/E;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,MAAM,QAAA,EAA4D;AACtE,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,UAAA,EAAW;AACnC,IAAA,OAAe,KAAA,CAAM,IAAA,EAAM,QAAA,IAAY,IAAI,CAAA;AAAA,EAC7C;AAAA,EAEA,MAAM,eAAA,CAAgB,UAAA,EAAoB,IAAA,GAAoC,EAAC,EAAoB;AACjG,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,UAAA,EAAW;AACnC,IAAA,OAAe,gBAAgB,UAAA,EAAY;AAAA,MACzC,IAAA;AAAA,MACA,UAAA,EAAY,iBAAA,CAAkB,IAAA,CAAK,UAAA,EAAY,iBAAiB,CAAA;AAAA,MAChE,SAAA,EAAW,KAAK,MAAA,CAAO,SAAA;AAAA,MACvB,SAAA,EAAW,KAAK,MAAA,CAAO,SAAA;AAAA,MACvB,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,aAAA,CACJ,IAAA,GAAgG,EAAC,EAC/D;AAClC,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,UAAA,EAAW;AACnC,IAAA,OAAe,aAAA,CAAc;AAAA,MAC3B,IAAA;AAAA,MACA,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,UAAA,EAAY,iBAAA,CAAkB,IAAA,CAAK,UAAA,EAAY,eAAe,CAAA;AAAA,MAC9D,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,SAAA,EAAW,KAAK,MAAA,CAAO,SAAA;AAAA,MACvB,SAAA,EAAW,KAAK,MAAA,CAAO,SAAA;AAAA,MACvB,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,eAAA,CACJ,QAAA,EACA,IAAA,GAKI,EAAC,EAC6B;AAClC,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,UAAA,EAAW;AACnC,IAAA,OAAe,gBAAgB,QAAA,EAAU;AAAA,MACvC,IAAA;AAAA,MACA,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,UAAA,EAAY,iBAAA,CAAkB,IAAA,CAAK,UAAA,EAAY,iBAAiB,CAAA;AAAA,MAChE,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,SAAA,EAAW,KAAK,MAAA,CAAO,SAAA;AAAA,MACvB,SAAA,EAAW,KAAK,MAAA,CAAO,SAAA;AAAA,MACvB,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,OAAA,CACJ,WAAA,EACA,IAAA,GAMI,EAAC,EAC6B;AAClC,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,UAAA,EAAW;AACnC,IAAA,OAAe,QAAQ,WAAA,EAAa;AAAA,MAClC,IAAA;AAAA,MACA,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,UAAA,EAAY,iBAAA,CAAkB,IAAA,CAAK,UAAA,EAAY,SAAS,CAAA;AAAA,MACxD,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,SAAS,IAAA,CAAK;AAAA,KACf,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,aAAa,EAAA,EAAiC;AAClD,IAAA,MAAM,KAAK,UAAA,EAAW;AACtB,IAAA,OAAkB,YAAA,CAAa,MAAM,EAAE,CAAA;AAAA,EACzC;AAAA,EAEA,qBAAqB,EAAA,EAA2C;AAC9D,IAAA,MAAM,IAAA,GAAO,aAAa,EAAE,CAAA;AAC5B,IAAA,IAAA,CAAK,cAAA,CAAe,IAAA,CAAK,QAAQ,CAAA,GAAI,IAAA;AACrC,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA,EAEA,MAAM,UAAA,CACJ,EAAA,EACA,IAAA,GAA8D,EAAC,EAC1C;AACrB,IAAA,MAAM,KAAK,UAAA,EAAW;AACtB,IAAA,MAAM,EAAE,UAAA,EAAY,GAAG,MAAA,EAAO,GAAI,IAAA;AAClC,IAAA,OAAkB,UAAA,CAAW,MAAM,EAAA,EAAI;AAAA,MACrC,GAAG,MAAA;AAAA,MACH,UAAA,EAAY,iBAAA,CAAkB,UAAA,EAAY,YAAY;AAAA,KACvD,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,UAAA,CAAW,EAAA,EAAY,IAAA,GAAoC,EAAC,EAAkB;AAClF,IAAA,MAAM,KAAK,UAAA,EAAW;AACtB,IAAA,OAAkB,UAAA,CAAW,MAAM,EAAA,EAAI;AAAA,MACrC,UAAA,EAAY,iBAAA,CAAkB,IAAA,CAAK,UAAA,EAAY,YAAY;AAAA,KAC5D,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,SAAA,CACJ,IAAA,GAA8D,EAAC,EAC3B;AACpC,IAAA,MAAM,KAAK,UAAA,EAAW;AACtB,IAAA,OAAkB,UAAU,IAAA,EAAM;AAAA,MAChC,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,UAAA,EAAY,iBAAA,CAAkB,IAAA,CAAK,UAAA,EAAY,WAAW;AAAA,KAC3D,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,WAAA,CACJ,KAAA,EACA,IAAA,GAA8E,EAAC,EAC3C;AACpC,IAAA,MAAM,KAAK,UAAA,EAAW;AACtB,IAAA,OAAkB,WAAA,CAAY,MAAM,KAAA,EAAO;AAAA,MACzC,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,UAAA,EAAY,iBAAA,CAAkB,IAAA,CAAK,UAAA,EAAY,aAAa,CAAA;AAAA,MAC5D,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,SAAS,EAAA,EAAkD;AAC/D,IAAA,MAAM,KAAK,UAAA,EAAW;AACtB,IAAA,OAAkB,QAAA,CAAS,MAAM,EAAE,CAAA;AAAA,EACrC;AAAA,EAEA,MAAM,WAAA,CACJ,QAAA,EACA,IAAA,EACA,IAAA,GAKI,EAAC,EAC6B;AAClC,IAAA,MAAM,KAAK,UAAA,EAAW;AACtB,IAAA,OAAkB,WAAA,CAAY,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM;AAAA,MAClD,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,UAAA,EAAY,iBAAA,CAAkB,IAAA,CAAK,UAAA,EAAY,aAAa,CAAA;AAAA,MAC5D,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,MAAA,EAAQ,KAAK,MAAA,IAAU;AAAA,KACxB,CAAA;AAAA,EACH;AACF;;;AkBjlBA,WAAA,EAAA;AAUA,eAAA,EAAA;AAGA,UAAA,EAAA;;;AC3BA,WAAA,EAAA;AACA,WAAA,EAAA;;;ACCO,IAAM,UAAA,GACX,wLAAA;AAIF,eAAsB,oBAAoB,UAAA,EAAoD;AAC5F,EAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,OAAA,CAAQ,YAAY,CAAA;AACjD,EAAA,OAAO,MAAA;AACT;AAWO,SAAS,mBAAA,CACd,GAAA,EACA,MAAA,EAQA,UAAA,EACM;AACN,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,cAAA;AAAA,IACA,iPAAA,GAIE,UAAA;AAAA,IACF,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,IAAY,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS,EAAE;AAAA,IACvD,UAAU,GAAA,KAAiB;AACzB,MAAA,MAAM,IAAA,GAAQ,GAAA,CAAI,CAAC,CAAA,IAAK,EAAC;AACzB,MAAA,MAAM,gBAAA,GAAmB,MAAM,mBAAA,CAAoB,UAAU,CAAA;AAC7D,MAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,WAAA,CAAY,OAAO,IAAA,CAAK,KAAA,IAAS,EAAE,CAAA,EAAG;AAAA,QAC/D,UAAA,EAAY,gBAAA;AAAA,QACZ,KAAA,EAAO,KAAK,KAAA,IAAS;AAAA,OACtB,CAAA;AACD,MAAA,OAAO,EAAE,KAAA,EAAM;AAAA,IACjB;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,cAAA;AAAA,IACA,iTAAA,GAKE,UAAA;AAAA,IACF,EAAE,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,IAAY,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS,EAAE;AAAA,IACrD,UAAU,GAAA,KAAiB;AACzB,MAAA,MAAM,IAAA,GAAQ,GAAA,CAAI,CAAC,CAAA,IAAK,EAAC;AACzB,MAAA,MAAM,gBAAA,GAAmB,MAAM,mBAAA,CAAoB,UAAU,CAAA;AAC7D,MAAA,OAAO,MAAA,CAAO,YAAY,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,QAAQ,IAAA,EAAM;AAAA,QAC9D,UAAA,EAAY,gBAAA;AAAA,QACZ,MAAA,EAAQ;AAAA,OACT,CAAA;AAAA,IACH;AAAA,GACF;AACF;;;AD9CA,SAAS,YAAY,IAAA,EAAmE;AACtF,EAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,EAAG,CAAA,EAAE;AACnE;AAEA,eAAsB,YAAA,CACpB,QACA,IAAA,EAKA;AACA,EAAA,IAAI,CAAC,MAAM,UAAA,EAAY;AACrB,IAAA,MAAM,IAAI,UAAU,kCAAkC,CAAA;AAAA,EACxD;AAEA,EAAA,IAAI,SAAA;AAOJ,EAAA,IAAI,6BAAA;AAKJ,EAAA,IAAI;AACF,IAAA,MAAM,YAAY,MAAM,YAAA;AAAA,MACtB,yCAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,MAAM,OAAA,GAAU,MAAM,YAAA,CAEnB,oDAAA,EAAsD,OAAO,YAAY,CAAA;AAC5E,IAAA,SAAA,GAAY,SAAA,CAAU,SAAA;AACtB,IAAA,6BAAA,GAAgC,OAAA,CAAQ,6BAAA;AAAA,EAC1C,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,GAAA,YAAe5B,2BAAmB,MAAM,GAAA;AAC5C,IAAA,MAAM,IAAIA,yBAAA,CAAkB,KAAA,EAAO,2BAAA,EAA6B,YAAY,CAAA;AAAA,EAC9E;AAEA,EAAA,MAAM,GAAA,GAAM,IAAI,SAAA,CAAU,EAAE,MAAM,gBAAA,EAAkB,OAAA,EAAS,aAAa,CAAA;AAE1E,EAAA,MAAM,IAAA,GAAO,CACX,IAAA,EACA,WAAA,EACA,QACAiE,QAAAA,KACG;AACH,IAAA,GAAA,CAAI,IAAA;AAAA,MAAK,IAAA;AAAA,MAAM,WAAA;AAAA,MAAa,MAAA;AAAA,MAAQ,OAAO,IAAA,KACzC,WAAA,CAAY,MAAMA,QAAAA,CAAQ,IAAI,CAAC;AAAA,KACjC;AAAA,EACF,CAAA;AAEA,EAAA,IAAA;AAAA,IACE,uBAAA;AAAA,IACA,gJAAgJ,UAAU,CAAA,CAAA;AAAA,IAC1J;AAAA,MACE,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACxB,UAAA,EAAY,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,EAAE,IAAA,EAAM,UAAS,EAAE;AAAA,MACvD,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACxB,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,MAAM,CAAC,QAAA,EAAU,OAAO,CAAA;AAAE,KACpD;AAAA,IACA,OAAO,IAAA,KAAS;AACd,MAAA,MAAM,gBAAA,GAAmB,MAAM,mBAAA,CAAoB,IAAA,CAAK,UAAU,CAAA;AAClE,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,MAAA,CAAO,OAAO,IAAA,CAAK,KAAA,IAAS,EAAE,CAAA,EAAG;AAAA,QAC3D,WAAW,IAAA,CAAK,UAAA;AAAA,QAChB,UAAA,EAAY,gBAAA;AAAA,QACZ,IAAA,EAAM,KAAK,KAAA,IAAS,EAAA;AAAA,QACpB,IAAA,EAAM,KAAK,IAAA,IAAQ;AAAA,OACpB,CAAA;AACD,MAAA,OAAO;AAAA,QACL,OAAO,MAAA,CAAO,IAAA,IAAQ,EAAC,EAAG,GAAA,CAAI,CAAC,GAAA,KAAQ;AACrC,UAAA,MAAM,CAAA,GAAI,GAAA;AACV,UAAA,OAAO;AAAA,YACL,aAAA,EAAe,CAAA,CAAE,aAAA,IAAiB,CAAA,CAAE,YAAA;AAAA,YACpC,UAAA,EAAY,CAAA,CAAE,UAAA,IAAc,CAAA,CAAE,SAAA;AAAA,YAC9B,OAAO,CAAA,CAAE,KAAA;AAAA,YACT,SAAA,EAAW,CAAA,CAAE,SAAA,IAAa,CAAA,CAAE;AAAA,WAC9B;AAAA,QACF,CAAC,CAAA;AAAA,QACD,OAAO,MAAA,CAAO;AAAA,OAChB;AAAA,IACF;AAAA,GACF;AAEA,EAAA,IAAA;AAAA,IACE,cAAA;AAAA,IACA,qDAAqD,UAAU,CAAA,CAAA;AAAA,IAC/D,EAAE,WAAA,EAAa,EAAE,IAAA,EAAM,UAAS,EAAE;AAAA,IAClC,OAAO,IAAA,KAAS;AACd,MAAA,MAAM,gBAAA,GAAmB,MAAM,mBAAA,CAAoB,IAAA,CAAK,UAAU,CAAA;AAClE,MAAA,OAAO,MAAA,CAAO,YAAY,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,EAAG,EAAE,UAAA,EAAY,gBAAA,EAAkB,CAAA;AAAA,IACtF;AAAA,GACF;AAEA,EAAA,IAAI,MAAA,CAAO,MAAA,CAAO,GAAA,IAAO,IAAA,EAAM;AAC7B,IAAA,IAAA;AAAA,MACE,kBAAA;AAAA,MACA,uHAAuH,UAAU,CAAA,CAAA;AAAA,MACjI,EAAE,QAAA,EAAU,EAAE,IAAA,EAAM,UAAS,EAAG,UAAA,EAAY,EAAE,IAAA,EAAM,SAAS,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,IAAW,EAAE;AAAA,MACzF,OAAO,IAAA,KAAS;AACd,QAAA,MAAM,gBAAA,GAAmB,MAAM,mBAAA,CAAoB,IAAA,CAAK,UAAU,CAAA;AAClE,QAAA,IAAI,CAAC,MAAA,CAAO,eAAA,EAAiB,MAAM,IAAI,MAAM,iDAAiD,CAAA;AAC9F,QAAA,OAAO,MAAA,CAAO,eAAA,CAAgB,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,EAAG;AAAA,UACnD,WAAW,IAAA,CAAK,UAAA;AAAA,UAChB,UAAA,EAAY;AAAA,SACb,CAAA;AAAA,MACH;AAAA,KACF;AACA,IAAA,IAAI,MAAA,CAAO,OAAO,mBAAA,EAAqB;AACrC,MAAA,IAAA;AAAA,QACE,SAAA;AAAA,QACA,kGAAkG,UAAU,CAAA,CAAA;AAAA,QAC5G,EAAE,WAAA,EAAa,EAAE,IAAA,EAAM,UAAS,EAAG,UAAA,EAAY,EAAE,IAAA,EAAM,SAAS,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,IAAW,EAAE;AAAA,QAC5F,OAAO,IAAA,KAAS;AACd,UAAA,MAAM,gBAAA,GAAmB,MAAM,mBAAA,CAAoB,IAAA,CAAK,UAAU,CAAA;AAClE,UAAA,IAAI,CAAC,MAAA,CAAO,OAAA,EAAS,MAAM,IAAI,MAAM,yCAAyC,CAAA;AAC9E,UAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,EAAG;AAAA,YAC9C,WAAW,IAAA,CAAK,UAAA;AAAA,YAChB,UAAA,EAAY;AAAA,WACb,CAAA;AAAA,QACH;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,mBAAA;AAAA,IACE;AAAA,MACE,IAAA,EAAM,CAAC,IAAA,EAAM,WAAA,EAAa,QAAQA,QAAAA,KAAY;AAC5C,QAAA,IAAA,CAAK,MAAM,WAAA,EAAa,MAAA,EAAQ,OAAO,IAAA,KAASA,QAAAA,CAAQ,IAAa,CAAC,CAAA;AAAA,MACxE;AAAA,KACF;AAAA,IACA,MAAA;AAAA,IACA,IAAA,CAAK;AAAA,GACP;AAEA,EAAA,MAAM,OAAA,IAAW,OACf,GAAA,EACA,GAAA,KACG;AACH,IAAA,MAAM,YAAY,IAAI,6BAAA,CAA8B,EAAE,kBAAA,EAAoB,QAAW,CAAA;AACrF,IAAA,MAAM,GAAA,CAAI,QAAQ,SAAS,CAAA;AAC3B,IAAA,MAAM,SAAA,CAAU,aAAA,CAAc,GAAA,EAAK,GAAG,CAAA;AAAA,EACxC,CAAA,CAAA;AAIA,EAAA,OAAA,CAAQ,GAAA,GAAM,GAAA;AACd,EAAA,OAAO,OAAA;AACT;;;AE7KA,QAAA,EAAA;ACqBO,IAAM,kBAAN,MAA4C;AAAA,EAChC,QAAA,uBAAe,GAAA,EAAwB;AAAA;AAAA,EAEvC,KAAA,uBAAY,GAAA,EAA2B;AAAA,EAExD,OAAO,OAAA,EAAyC;AAC9C,IAAA,MAAM,KAAKzC,iBAAAA,EAAW;AACtB,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAA,EAAI,EAAE,KAAA,EAAO,WAAW,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,CAAA;AACrE,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,OAAA,EAAQ,CAC1B,IAAA,CAAK,MAAM,OAAA,EAAS,CAAA,CACpB,IAAA,CAAK,CAAC,MAAA,KAAW;AAChB,MAAA,IAAA,CAAK,QAAA,CAAS,IAAI,EAAA,EAAI,EAAE,OAAO,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,CAAA;AAAA,IAC9D,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,MAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAA,EAAI,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,MAAA,CAAO,GAAG,CAAA,EAAG,MAAA,EAAQ,IAAA,EAAM,CAAA;AAAA,IAC7E,CAAC,CAAA;AACH,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,EAAA,EAAI,IAAI,CAAA;AACvB,IAAA,OAAO,EAAA;AAAA,EACT;AAAA,EAEA,OAAO,EAAA,EAAwB;AAC7B,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAChC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,GAAA,GAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,KAAK,SAAA,CAAU,EAAE,CAAC,CAAA,CAAE,CAAA;AAC9D,MAAA,GAAA,CAAI,IAAA,GAAO,UAAA;AACX,MAAA,MAAM,GAAA;AAAA,IACR;AACA,IAAA,OAAO,EAAE,GAAG,GAAA,EAAI;AAAA,EAClB;AACF;AAOO,IAAM,eAAN,MAAyC;AAAA,EAC9C,SAAA;AAAA,EACA,QAAA;AAAA,EAEA,WAAA,CAAY,WAAoB,QAAA,EAAkB;AAChD,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,EAClB;AAAA,EAEA,OAAO,QAAA,EAA2C;AAChD,IAAA,MAAM,MAAM,IAAI,KAAA;AAAA,MACd;AAAA,KAEF;AACA,IAAA,GAAA,CAAI,IAAA,GAAO,qBAAA;AACX,IAAA,MAAM,GAAA;AAAA,EACR;AAAA,EAEA,OAAO,GAAA,EAA0B;AAC/B,IAAA,MAAM,MAAM,IAAI,KAAA;AAAA,MACd;AAAA,KAEF;AACA,IAAA,GAAA,CAAI,IAAA,GAAO,qBAAA;AACX,IAAA,MAAM,GAAA;AAAA,EACR;AACF;;;AJtCA,UAAA,EAAA","file":"index.cjs","sourcesContent":["import { francAll } from \"franc\";\n\n// Unicode name first-word table — same logic as unicodedata.name().split()[0].\n// COMBINING marks use the second word, matching Python's _char_script.\n\nconst UNICODE_NAME_WORDS: string[] = [\n \"acute\",\n \"acute-grave-acute\",\n \"acute-macron\",\n \"adlam\",\n \"ahom\",\n \"alef\",\n \"almost\",\n \"anatolian\",\n \"angstrom\",\n \"annuity\",\n \"anticlockwise\",\n \"arabic\",\n \"armenian\",\n \"asterisk\",\n \"avestan\",\n \"balinese\",\n \"bamum\",\n \"bassa\",\n \"batak\",\n \"bengali\",\n \"bet\",\n \"bhaiksuki\",\n \"bindu\",\n \"black-letter\",\n \"bopomofo\",\n \"brahmi\",\n \"breve\",\n \"breve-macron\",\n \"bridge\",\n \"buginese\",\n \"buhid\",\n \"canadian\",\n \"candrabindu\",\n \"carian\",\n \"caron\",\n \"caucasian\",\n \"cedilla\",\n \"chakma\",\n \"cham\",\n \"cherokee\",\n \"chorasmian\",\n \"circumflex\",\n \"cjk\",\n \"clockwise\",\n \"comma\",\n \"conjoining\",\n \"coptic\",\n \"cuneiform\",\n \"cypriot\",\n \"cypro-minoan\",\n \"cyrillic\",\n \"dalet\",\n \"deletion\",\n \"deseret\",\n \"devanagari\",\n \"diaeresis\",\n \"diaeresis-ring\",\n \"dives\",\n \"dogra\",\n \"dot\",\n \"dotted\",\n \"double\",\n \"double-struck\",\n \"doubled\",\n \"down\",\n \"downwards\",\n \"duployan\",\n \"egyptian\",\n \"elbasan\",\n \"elymaic\",\n \"enclosing\",\n \"equals\",\n \"ethiopic\",\n \"euler\",\n \"feminine\",\n \"fermata\",\n \"four\",\n \"fullwidth\",\n \"georgian\",\n \"gimel\",\n \"glagolitic\",\n \"gothic\",\n \"grantha\",\n \"grapheme\",\n \"grave\",\n \"grave-acute-grave\",\n \"grave-macron\",\n \"greek\",\n \"gujarati\",\n \"gunjala\",\n \"gurmukhi\",\n \"halfwidth\",\n \"hangul\",\n \"hanifi\",\n \"hanunoo\",\n \"hatran\",\n \"hebrew\",\n \"hentaigana\",\n \"hiragana\",\n \"homothetic\",\n \"hook\",\n \"horn\",\n \"ideographic\",\n \"imperial\",\n \"infinity\",\n \"information\",\n \"inscriptional\",\n \"inverted\",\n \"is\",\n \"javanese\",\n \"kaithi\",\n \"kannada\",\n \"katakana\",\n \"katakana-hiragana\",\n \"kavyka\",\n \"kawi\",\n \"kayah\",\n \"kelvin\",\n \"kharoshthi\",\n \"khitan\",\n \"khmer\",\n \"khojki\",\n \"khudawadi\",\n \"lao\",\n \"latin\",\n \"left\",\n \"leftwards\",\n \"lepcha\",\n \"ligature\",\n \"light\",\n \"limbu\",\n \"linear\",\n \"lisu\",\n \"long\",\n \"low\",\n \"lycian\",\n \"lydian\",\n \"macron\",\n \"macron-acute\",\n \"macron-breve\",\n \"macron-grave\",\n \"mahajani\",\n \"makasar\",\n \"malayalam\",\n \"mandaic\",\n \"manichaean\",\n \"marchen\",\n \"masaram\",\n \"masculine\",\n \"masu\",\n \"mathematical\",\n \"medefaidrin\",\n \"meetei\",\n \"mende\",\n \"meroitic\",\n \"miao\",\n \"micro\",\n \"minus\",\n \"modi\",\n \"modifier\",\n \"mongolian\",\n \"mro\",\n \"multani\",\n \"musical\",\n \"myanmar\",\n \"nabataean\",\n \"nag\",\n \"nandinagari\",\n \"new\",\n \"newa\",\n \"nko\",\n \"not\",\n \"number\",\n \"nushu\",\n \"nyiakeng\",\n \"ogham\",\n \"ogonek\",\n \"ohm\",\n \"ol\",\n \"old\",\n \"open\",\n \"oriya\",\n \"osage\",\n \"osmanya\",\n \"overline\",\n \"pahawh\",\n \"palatalized\",\n \"palmyrene\",\n \"parentheses\",\n \"pau\",\n \"phags-pa\",\n \"phaistos\",\n \"phoenician\",\n \"planck\",\n \"plus\",\n \"psalter\",\n \"rejang\",\n \"retroflex\",\n \"reverse\",\n \"reversed\",\n \"right\",\n \"rightwards\",\n \"ring\",\n \"roman\",\n \"runic\",\n \"samaritan\",\n \"saurashtra\",\n \"script\",\n \"seagull\",\n \"sharada\",\n \"shavian\",\n \"short\",\n \"siddham\",\n \"signwriting\",\n \"sinhala\",\n \"snake\",\n \"sogdian\",\n \"sora\",\n \"soyombo\",\n \"square\",\n \"strong\",\n \"sundanese\",\n \"superscript\",\n \"suspension\",\n \"syloti\",\n \"syriac\",\n \"tagalog\",\n \"tagbanwa\",\n \"tai\",\n \"takri\",\n \"tamil\",\n \"tangsa\",\n \"tangut\",\n \"telugu\",\n \"thaana\",\n \"thai\",\n \"three\",\n \"tibetan\",\n \"tifinagh\",\n \"tilde\",\n \"tirhuta\",\n \"toto\",\n \"triple\",\n \"turned\",\n \"ugaritic\",\n \"up\",\n \"upwards\",\n \"ur\",\n \"us\",\n \"vai\",\n \"variation\",\n \"vedic\",\n \"vertical\",\n \"vietnamese\",\n \"vithkuqi\",\n \"wancho\",\n \"warang\",\n \"wide\",\n \"wiggly\",\n \"x\",\n \"x-x\",\n \"yezidi\",\n \"yi\",\n \"zanabazar\",\n \"zigzag\",\n \"znamenny\",\n];\n\nconst UNICODE_NAME_RANGES = `41,5a,124;61,7a,124;aa,aa,74;b5,b5,156;ba,ba,148;c0,d6,124;d8,f6,124;f8,2af,124;2b0,2c1,159;2c6,2c6,159;2c7,2c7,34;2c8,2d1,159;2e0,2e4,159;2ec,2ec,159;2ee,2ee,159;300,300,84;301,301,0;302,302,41;303,303,239;304,304,137;305,305,184;306,306,26;307,307,59;308,308,55;309,309,100;30a,30a,202;30b,30b,61;30c,30c,34;30d,30d,252;30e,30f,61;310,310,32;311,311,107;312,312,243;313,313,44;314,314,199;315,315,44;316,316,84;317,317,0;318,318,125;319,319,200;31a,31a,125;31b,31b,101;31c,31c,125;31d,31d,245;31e,31e,64;31f,31f,194;320,320,157;321,321,186;322,322,197;323,323,59;324,324,55;325,325,202;326,326,44;327,327,36;328,328,176;329,329,252;32a,32a,28;32b,32b,107;32c,32c,34;32d,32d,41;32e,32e,26;32f,32f,107;330,330,239;331,331,137;332,332,134;333,333,61;334,334,239;335,335,211;336,336,133;337,337,211;338,338,133;339,339,200;33a,33a,107;33b,33b,219;33c,33c,208;33d,33d,259;33e,33e,252;33f,33f,61;340,340,84;341,341,0;342,345,87;346,346,28;347,347,71;348,348,61;349,349,125;34a,34a,171;34b,34b,99;34c,34c,6;34d,34d,125;34e,34e,246;34f,34f,83;350,350,200;351,351,125;352,352,75;353,353,259;354,354,125;355,357,200;358,358,59;359,359,13;35a,35a,61;35b,35b,264;35c,362,61;363,36f,124;370,374,87;376,377,87;37a,37d,87;37f,37f,87;386,386,87;388,38a,87;38c,38c,87;38e,3a1,87;3a3,3e1,87;3e2,3ef,46;3f0,3f5,87;3f7,3ff,87;400,481,50;483,52f,50;531,556,12;559,559,12;560,588,12;591,5bd,96;5bf,5bf,96;5c1,5c2,96;5c4,5c5,96;5c7,5c7,96;5d0,5ea,96;5ef,5f2,96;610,61a,11;620,65f,11;66e,6d3,11;6d5,6dc,11;6df,6e8,11;6ea,6ef,11;6fa,6fc,11;6ff,6ff,11;710,74a,225;74d,74f,225;750,77f,11;780,7b1,234;7ca,7f5,170;7fa,7fa,170;7fd,7fd,170;800,82d,205;840,85b,144;860,86a,225;870,887,11;889,88e,11;898,8e1,11;8e3,8ff,11;900,963,54;971,97f,54;980,983,19;985,98c,19;98f,990,19;993,9a8,19;9aa,9b0,19;9b2,9b2,19;9b6,9b9,19;9bc,9c4,19;9c7,9c8,19;9cb,9ce,19;9d7,9d7,19;9dc,9dd,19;9df,9e3,19;9f0,9f1,19;9fc,9fc,19;9fe,9fe,19;a01,a03,90;a05,a0a,90;a0f,a10,90;a13,a28,90;a2a,a30,90;a32,a33,90;a35,a36,90;a38,a39,90;a3c,a3c,90;a3e,a42,90;a47,a48,90;a4b,a4d,90;a51,a51,90;a59,a5c,90;a5e,a5e,90;a70,a75,90;a81,a83,88;a85,a8d,88;a8f,a91,88;a93,aa8,88;aaa,ab0,88;ab2,ab3,88;ab5,ab9,88;abc,ac5,88;ac7,ac9,88;acb,acd,88;ad0,ad0,88;ae0,ae3,88;af9,aff,88;b01,b03,181;b05,b0c,181;b0f,b10,181;b13,b28,181;b2a,b30,181;b32,b33,181;b35,b39,181;b3c,b44,181;b47,b48,181;b4b,b4d,181;b55,b57,181;b5c,b5d,181;b5f,b63,181;b71,b71,181;b82,b83,230;b85,b8a,230;b8e,b90,230;b92,b95,230;b99,b9a,230;b9c,b9c,230;b9e,b9f,230;ba3,ba4,230;ba8,baa,230;bae,bb9,230;bbe,bc2,230;bc6,bc8,230;bca,bcd,230;bd0,bd0,230;bd7,bd7,230;c00,c0c,233;c0e,c10,233;c12,c28,233;c2a,c39,233;c3c,c44,233;c46,c48,233;c4a,c4d,233;c55,c56,233;c58,c5a,233;c5d,c5d,233;c60,c63,233;c80,c83,111;c85,c8c,111;c8e,c90,111;c92,ca8,111;caa,cb3,111;cb5,cb9,111;cbc,cc4,111;cc6,cc8,111;cca,ccd,111;cd5,cd6,111;cdd,cde,111;ce0,ce3,111;cf1,cf3,111;d00,d0c,143;d0e,d10,143;d12,d44,143;d46,d48,143;d4a,d4e,143;d54,d57,143;d5f,d63,143;d7a,d7f,143;d81,d83,214;d85,d96,214;d9a,db1,214;db3,dbb,214;dbd,dbd,214;dc0,dc6,214;dca,dca,214;dcf,dd4,214;dd6,dd6,214;dd8,ddf,214;df2,df3,214;e01,e3a,235;e40,e4e,235;e81,e82,123;e84,e84,123;e86,e8a,123;e8c,ea3,123;ea5,ea5,123;ea7,ebd,123;ec0,ec4,123;ec6,ec6,123;ec8,ece,123;edc,edf,123;f00,f00,237;f18,f19,237;f35,f35,237;f37,f37,237;f39,f39,237;f3e,f47,237;f49,f6c,237;f71,f84,237;f86,f97,237;f99,fbc,237;fc6,fc6,237;1000,103f,164;1050,108f,164;109a,109d,164;10a0,10c5,78;10c7,10c7,78;10cd,10cd,78;10d0,10fa,78;10fc,10fc,159;10fd,10ff,78;1100,11ff,92;1200,1248,72;124a,124d,72;1250,1256,72;1258,1258,72;125a,125d,72;1260,1288,72;128a,128d,72;1290,12b0,72;12b2,12b5,72;12b8,12be,72;12c0,12c0,72;12c2,12c5,72;12c8,12d6,72;12d8,1310,72;1312,1315,72;1318,135a,72;135d,135f,72;1380,138f,72;13a0,13f5,39;13f8,13fd,39;1401,166c,31;166f,167f,31;1681,169a,175;16a0,16ea,204;16f1,16f8,204;1700,1715,226;171f,171f,226;1720,1734,94;1740,1753,30;1760,176c,227;176e,1770,227;1772,1773,227;1780,17d3,120;17d7,17d7,120;17dc,17dd,120;180b,180d,160;180f,180f,160;1820,1878,160;1880,18aa,160;18b0,18f5,31;1900,191e,130;1920,192b,130;1930,193b,130;1950,196d,228;1970,1974,228;1980,19ab,168;19b0,19c9,168;1a00,1a1b,29;1a20,1a5e,228;1a60,1a7c,228;1a7f,1a7f,228;1aa7,1aa7,228;1ab0,1ab0,63;1ab1,1ab1,56;1ab2,1ab2,104;1ab3,1ab3,65;1ab4,1ab4,242;1ab5,1ab5,260;1ab6,1ab6,258;1ab7,1ab7,180;1ab8,1ab8,61;1ab9,1ab9,129;1aba,1aba,220;1abb,1abb,188;1abc,1abc,61;1abd,1abe,188;1abf,1ac0,124;1ac1,1ac1,125;1ac2,1ac2,200;1ac3,1ac3,125;1ac4,1ac4,200;1ac5,1ac5,219;1ac6,1ac6,172;1ac7,1ac7,107;1ac8,1ac8,194;1ac9,1aca,61;1acb,1acb,242;1acc,1ace,124;1b00,1b4c,15;1b6b,1b73,15;1b80,1baf,221;1bba,1bbf,221;1bc0,1bf3,18;1c00,1c37,127;1c4d,1c4f,127;1c5a,1c7d,178;1c80,1c88,50;1c90,1cba,78;1cbd,1cbf,78;1cd0,1cd2,251;1cd4,1cfa,251;1d00,1d25,124;1d26,1d2a,87;1d2b,1d2b,50;1d2c,1d61,159;1d62,1d65,124;1d66,1d6a,87;1d6b,1d77,124;1d78,1d78,159;1d79,1d9a,124;1d9b,1dbf,159;1dc0,1dc1,60;1dc2,1dc2,215;1dc3,1dc3,223;1dc4,1dc4,138;1dc5,1dc5,86;1dc6,1dc6,140;1dc7,1dc7,2;1dc8,1dc8,85;1dc9,1dc9,1;1dca,1dca,124;1dcb,1dcb,27;1dcc,1dcc,139;1dcd,1dcd,61;1dce,1dce,176;1dcf,1dcf,264;1dd0,1dd0,108;1dd1,1dd1,247;1dd2,1dd2,248;1dd3,1df4,124;1df5,1df5,245;1df6,1df7,114;1df8,1df8,59;1df9,1df9,257;1dfa,1dfa,59;1dfb,1dfb,52;1dfc,1dfc,61;1dfd,1dfd,6;1dfe,1dfe,125;1dff,1dff,200;1e00,1eff,124;1f00,1f15,87;1f18,1f1d,87;1f20,1f45,87;1f48,1f4d,87;1f50,1f57,87;1f59,1f59,87;1f5b,1f5b,87;1f5d,1f5d,87;1f5f,1f7d,87;1f80,1fb4,87;1fb6,1fbc,87;1fbe,1fbe,87;1fc2,1fc4,87;1fc6,1fcc,87;1fd0,1fd3,87;1fd6,1fdb,87;1fe0,1fec,87;1ff2,1ff4,87;1ff6,1ffc,87;2071,2071,222;207f,207f,222;2090,209c,124;20d0,20d0,125;20d1,20d1,200;20d2,20d2,133;20d3,20d3,211;20d4,20d4,10;20d5,20d5,43;20d6,20d6,125;20d7,20d7,200;20d8,20d8,202;20d9,20d9,43;20da,20da,10;20db,20db,236;20dc,20dc,76;20dd,20e0,70;20e1,20e1,125;20e2,20e4,70;20e5,20e5,198;20e6,20e6,61;20e7,20e7,9;20e8,20e8,242;20e9,20e9,257;20ea,20ea,126;20eb,20eb,133;20ec,20ec,201;20ed,20ed,126;20ee,20ee,125;20ef,20ef,200;20f0,20f0,13;2102,2102,62;2107,2107,73;210a,210b,207;210c,210c,23;210d,210d,62;210e,210f,193;2110,2110,207;2111,2111,23;2112,2113,207;2115,2115,62;2119,211a,62;211b,211b,207;211c,211c,23;211d,211d,62;2124,2124,62;2126,2126,177;2128,2128,23;212a,212a,117;212b,212b,8;212c,212c,207;212d,212d,23;212f,2131,207;2132,2132,243;2133,2134,207;2135,2135,5;2136,2136,20;2137,2137,79;2138,2138,51;2139,2139,105;213c,213f,62;2145,2149,62;214e,214e,243;2183,2183,203;2184,2184,124;2c00,2c5f,80;2c60,2c7c,124;2c7d,2c7d,159;2c7e,2c7f,124;2c80,2ce4,46;2ceb,2cf3,46;2d00,2d25,78;2d27,2d27,78;2d2d,2d2d,78;2d30,2d67,238;2d6f,2d6f,238;2d7f,2d7f,238;2d80,2d96,72;2da0,2da6,72;2da8,2dae,72;2db0,2db6,72;2db8,2dbe,72;2dc0,2dc6,72;2dc8,2dce,72;2dd0,2dd6,72;2dd8,2dde,72;2de0,2dff,50;2e2f,2e2f,252;3005,3006,102;302a,302d,102;302e,302f,92;3031,3035,252;303b,303b,252;303c,303c,149;3041,3096,98;3099,309a,113;309d,309f,98;30a1,30fa,112;30fc,30fc,113;30fd,30ff,112;3105,312f,24;3131,318e,92;31a0,31bf,24;31f0,31ff,112;3400,4dbf,42;4e00,9fff,42;a000,a48c,262;a4d0,a4fd,132;a500,a60c,249;a610,a61f,249;a62a,a62b,249;a640,a672,50;a674,a67d,50;a67f,a69b,50;a69c,a69d,159;a69e,a69f,50;a6a0,a6e5,16;a6f0,a6f1,16;a717,a71f,159;a722,a76f,124;a770,a770,159;a771,a787,124;a788,a788,159;a78b,a7ca,124;a7d0,a7d1,124;a7d3,a7d3,124;a7d5,a7d9,124;a7f2,a7f4,159;a7f5,a7f7,124;a7f8,a7f9,159;a7fa,a7ff,124;a800,a827,224;a82c,a82c,224;a840,a873,190;a880,a8c5,206;a8e0,a8f7,54;a8fb,a8fb,54;a8fd,a8ff,54;a90a,a92d,116;a930,a953,196;a960,a97c,92;a980,a9c0,109;a9cf,a9cf,109;a9e0,a9ef,164;a9fa,a9fe,164;aa00,aa36,38;aa40,aa4d,38;aa60,aa76,164;aa7a,aa7f,164;aa80,aac2,228;aadb,aadd,228;aae0,aaef,152;aaf2,aaf6,152;ab01,ab06,72;ab09,ab0e,72;ab11,ab16,72;ab20,ab26,72;ab28,ab2e,72;ab30,ab5a,124;ab5c,ab5f,159;ab60,ab64,124;ab65,ab65,87;ab66,ab68,124;ab69,ab69,159;ab70,abbf,39;abc0,abea,152;abec,abed,152;ac00,d7a3,92;d7b0,d7c6,92;d7cb,d7fb,92;f900,fa6d,42;fa70,fad9,42;fb00,fb06,124;fb13,fb17,12;fb1d,fb28,96;fb2a,fb36,96;fb38,fb3c,96;fb3e,fb3e,96;fb40,fb41,96;fb43,fb44,96;fb46,fb4f,96;fb50,fbb1,11;fbd3,fd3d,11;fd50,fd8f,11;fd92,fdc7,11;fdf0,fdfb,11;fe00,fe0f,250;fe20,fe21,128;fe22,fe23,61;fe24,fe25,137;fe26,fe26,45;fe27,fe28,128;fe29,fe2a,239;fe2b,fe2c,137;fe2d,fe2d,45;fe2e,fe2f,50;fe70,fe74,11;fe76,fefc,11;ff21,ff3a,77;ff41,ff5a,77;ff66,ffbe,91;ffc2,ffc7,91;ffca,ffcf,91;ffd2,ffd7,91;ffda,ffdc,91;10000,1000b,131;1000d,10026,131;10028,1003a,131;1003c,1003d,131;1003f,1004d,131;10050,1005d,131;10080,100fa,131;101fd,101fd,191;10280,1029c,135;102a0,102d0,33;102e0,102e0,46;10300,1031f,179;1032d,1032f,179;10330,10340,81;10342,10349,81;10350,1037a,179;10380,1039d,244;103a0,103c3,179;103c8,103cf,179;10400,1044f,53;10450,1047f,210;10480,1049d,183;104b0,104d3,182;104d8,104fb,182;10500,10527,68;10530,10563,35;10570,1057a,254;1057c,1058a,254;1058c,10592,254;10594,10595,254;10597,105a1,254;105a3,105b1,254;105b3,105b9,254;105bb,105bc,254;10600,10736,131;10740,10755,131;10760,10767,131;10780,10785,159;10787,107b0,159;107b2,107ba,159;10800,10805,48;10808,10808,48;1080a,10835,48;10837,10838,48;1083c,1083c,48;1083f,1083f,48;10840,10855,103;10860,10876,187;10880,1089e,165;108e0,108f2,95;108f4,108f5,95;10900,10915,192;10920,10939,136;10980,109b7,154;109be,109bf,154;10a00,10a03,118;10a05,10a06,118;10a0c,10a13,118;10a15,10a17,118;10a19,10a35,118;10a38,10a3a,118;10a3f,10a3f,118;10a60,10a7c,179;10a80,10a9c,179;10ac0,10ac7,145;10ac9,10ae6,145;10b00,10b35,14;10b40,10b55,106;10b60,10b72,106;10b80,10b91,195;10c00,10c48,179;10c80,10cb2,179;10cc0,10cf2,179;10d00,10d27,93;10e80,10ea9,261;10eab,10eac,261;10eb0,10eb1,261;10efd,10eff,11;10f00,10f1c,179;10f27,10f27,179;10f30,10f50,216;10f70,10f85,179;10fb0,10fc4,40;10fe0,10ff6,69;11000,11046,25;11070,11075,25;1107f,1107f,25;11080,110ba,110;110c2,110c2,110;110d0,110e8,217;11100,11134,37;11144,11147,37;11150,11173,141;11176,11176,141;11180,111c4,209;111c9,111cc,209;111ce,111cf,209;111da,111da,209;111dc,111dc,209;11200,11211,121;11213,11237,121;1123e,11241,121;11280,11286,162;11288,11288,162;1128a,1128d,162;1128f,1129d,162;1129f,112a8,162;112b0,112ea,122;11300,11303,82;11305,1130c,82;1130f,11310,82;11313,11328,82;1132a,11330,82;11332,11333,82;11335,11339,82;1133b,1133b,22;1133c,11344,82;11347,11348,82;1134b,1134d,82;11350,11350,82;11357,11357,82;1135d,11363,82;11366,1136c,82;11370,11374,82;11400,1144a,169;1145e,11461,169;11480,114c5,240;114c7,114c7,240;11580,115b5,212;115b8,115c0,212;115d8,115dd,212;11600,11640,158;11644,11644,158;11680,116b8,229;11700,1171a,4;1171d,1172b,4;11740,11746,4;11800,1183a,58;118a0,118df,256;118ff,118ff,256;11900,11906,57;11909,11909,57;1190c,11913,57;11915,11916,57;11918,11935,57;11937,11938,57;1193b,11943,57;119a0,119a7,167;119aa,119d7,167;119da,119e1,167;119e3,119e4,167;11a00,11a3e,263;11a47,11a47,263;11a50,11a99,218;11a9d,11a9d,218;11ab0,11abf,31;11ac0,11af8,189;11c00,11c08,21;11c0a,11c36,21;11c38,11c40,21;11c72,11c8f,146;11c92,11ca7,146;11ca9,11cb6,146;11d00,11d06,147;11d08,11d09,147;11d0b,11d36,147;11d3a,11d3a,147;11d3c,11d3d,147;11d3f,11d47,147;11d60,11d65,89;11d67,11d68,89;11d6a,11d8e,89;11d90,11d91,89;11d93,11d98,89;11ee0,11ef6,142;11f00,11f10,115;11f12,11f3a,115;11f3e,11f42,115;11fb0,11fb0,132;12000,12399,47;12480,12543,47;12f90,12ff0,49;13000,1342f,67;13440,13455,67;14400,14646,7;16800,16a38,16;16a40,16a5e,161;16a70,16abe,231;16ad0,16aed,17;16af0,16af4,17;16b00,16b36,185;16b40,16b43,185;16b63,16b77,185;16b7d,16b8f,185;16e40,16e7f,151;16f00,16f4a,155;16f4f,16f87,155;16f8f,16f9f,155;16fe0,16fe0,232;16fe1,16fe1,173;16fe3,16fe3,179;16fe4,16fe4,119;16ff0,16ff1,253;18800,18aff,232;18b00,18cd5,119;1aff0,1aff3,112;1aff5,1affb,112;1affd,1affe,112;1b000,1b000,112;1b001,1b001,98;1b002,1b11e,97;1b11f,1b11f,98;1b120,1b122,112;1b132,1b132,98;1b150,1b152,98;1b155,1b155,112;1b164,1b167,112;1b170,1b2fb,173;1bc00,1bc6a,66;1bc70,1bc7c,66;1bc80,1bc88,66;1bc90,1bc99,66;1bc9d,1bc9e,66;1cf00,1cf2d,265;1cf30,1cf46,265;1d165,1d169,163;1d16d,1d172,163;1d17b,1d182,163;1d185,1d18b,163;1d1aa,1d1ad,163;1d242,1d244,87;1d400,1d454,150;1d456,1d49c,150;1d49e,1d49f,150;1d4a2,1d4a2,150;1d4a5,1d4a6,150;1d4a9,1d4ac,150;1d4ae,1d4b9,150;1d4bb,1d4bb,150;1d4bd,1d4c3,150;1d4c5,1d505,150;1d507,1d50a,150;1d50d,1d514,150;1d516,1d51c,150;1d51e,1d539,150;1d53b,1d53e,150;1d540,1d544,150;1d546,1d546,150;1d54a,1d550,150;1d552,1d6a5,150;1d6a8,1d6c0,150;1d6c2,1d6da,150;1d6dc,1d6fa,150;1d6fc,1d714,150;1d716,1d734,150;1d736,1d74e,150;1d750,1d76e,150;1d770,1d788,150;1d78a,1d7a8,150;1d7aa,1d7c2,150;1d7c4,1d7cb,150;1da00,1da36,213;1da3b,1da6c,213;1da75,1da75,213;1da84,1da84,213;1da9b,1da9f,213;1daa1,1daaf,213;1df00,1df1e,124;1df25,1df2a,124;1e000,1e006,80;1e008,1e018,80;1e01b,1e021,80;1e023,1e024,80;1e026,1e02a,80;1e030,1e050,159;1e051,1e06a,50;1e06b,1e06d,159;1e08f,1e08f,50;1e100,1e12c,174;1e130,1e13d,174;1e14e,1e14e,174;1e290,1e2ae,241;1e2c0,1e2ef,255;1e4d0,1e4ef,166;1e7e0,1e7e6,72;1e7e8,1e7eb,72;1e7ed,1e7ee,72;1e7f0,1e7fe,72;1e800,1e8c4,153;1e8d0,1e8d6,153;1e900,1e94b,3;1ee00,1ee03,11;1ee05,1ee1f,11;1ee21,1ee22,11;1ee24,1ee24,11;1ee27,1ee27,11;1ee29,1ee32,11;1ee34,1ee37,11;1ee39,1ee39,11;1ee3b,1ee3b,11;1ee42,1ee42,11;1ee47,1ee47,11;1ee49,1ee49,11;1ee4b,1ee4b,11;1ee4d,1ee4f,11;1ee51,1ee52,11;1ee54,1ee54,11;1ee57,1ee57,11;1ee59,1ee59,11;1ee5b,1ee5b,11;1ee5d,1ee5d,11;1ee5f,1ee5f,11;1ee61,1ee62,11;1ee64,1ee64,11;1ee67,1ee6a,11;1ee6c,1ee72,11;1ee74,1ee77,11;1ee79,1ee7c,11;1ee7e,1ee7e,11;1ee80,1ee89,11;1ee8b,1ee9b,11;1eea1,1eea3,11;1eea5,1eea9,11;1eeab,1eebb,11;20000,2a6df,42;2a700,2b739,42;2b740,2b81d,42;2b820,2cea1,42;2ceb0,2ebe0,42;2ebf0,2ee5d,42;2f800,2fa1d,42;30000,3134a,42;31350,323af,42;e0100,e01ef,250`;\n\ntype NameRange = { start: number; end: number; word: number };\n\nconst NAME_RANGE_TABLE: NameRange[] = UNICODE_NAME_RANGES.split(\";\").map((entry) => {\n const [start, end, word] = entry.split(\",\");\n return { start: Number.parseInt(start!, 16), end: Number.parseInt(end!, 16), word: Number(word) };\n});\n\nconst SCRIPT_CACHE = new Map<string, string>();\nconst SCRIPT_CACHE_MAX = 4096;\n\nfunction lookupNamePrefix(cp: number): string {\n let lo = 0;\n let hi = NAME_RANGE_TABLE.length - 1;\n while (lo <= hi) {\n const mid = (lo + hi) >> 1;\n const range = NAME_RANGE_TABLE[mid]!;\n if (cp < range.start) hi = mid - 1;\n else if (cp > range.end) lo = mid + 1;\n else return UNICODE_NAME_WORDS[range.word] ?? \"\";\n }\n return \"\";\n}\n\nexport const SPACELESS_SCRIPTS = new Set([\n \"cjk\",\n \"hiragana\",\n \"katakana\",\n \"thai\",\n \"lao\",\n \"khmer\",\n \"myanmar\",\n \"tibetan\",\n \"yi\",\n]);\n\nexport const SENTENCE_TERMINALS = new Set([\n \".\",\n \"!\",\n \"?\",\n \"。\",\n \"!\",\n \"?\",\n \"؟\",\n \"।\",\n \"॥\",\n \"։\",\n \"።\",\n \"။\",\n \"៕\",\n \"᙮\",\n \"⁇\",\n \"⁈\",\n \"⁉\",\n \"꓿\",\n \"᜵\",\n \"᜶\",\n]);\n\n// Audit T1: drop U+003B (ASCII semicolon) — Greek's question mark IS that\n// codepoint, and U+037E NFC-normalizes to it, so including U+003B classified\n// every query with a plain semicolon as a question. Keep U+037E for explicitly\n// encoded Greek question marks.\nexport const QUESTION_MARKS = new Set([\"?\", \"؟\", \"?\", \"\\u037E\", \"⁇\", \"⁈\"]);\n\nexport const SCRIPT_TO_ISO: Record<string, string> = {\n thai: \"th\",\n bengali: \"bn\",\n tamil: \"ta\",\n telugu: \"te\",\n kannada: \"kn\",\n malayalam: \"ml\",\n gujarati: \"gu\",\n gurmukhi: \"pa\",\n sinhala: \"si\",\n lao: \"lo\",\n myanmar: \"my\",\n khmer: \"km\",\n georgian: \"ka\",\n armenian: \"hy\",\n ethiopic: \"am\",\n tibetan: \"bo\",\n greek: \"el\",\n hangul: \"ko\",\n thaana: \"dv\",\n devanagari: \"hi\",\n oriya: \"or\",\n};\n\nexport const AMBIGUOUS_SCRIPTS = new Set([\"latin\", \"cyrillic\", \"arabic\", \"cjk\"]);\n\nconst JA_SCRIPTS = new Set([\"hiragana\", \"katakana\", \"cjk\"]);\n\nconst AMBIGUOUS_TERMINALS = new Set([\".\", \"!\", \"?\"]);\n\nconst ISO_639_3_TO_1: Record<string, string> = {\n afr: \"af\",\n amh: \"am\",\n ara: \"ar\",\n arb: \"ar\",\n arz: \"ar\",\n apc: \"ar\",\n aze: \"az\",\n azj: \"az\",\n bel: \"be\",\n ben: \"bn\",\n bod: \"bo\",\n bos: \"bs\",\n bul: \"bg\",\n cat: \"ca\",\n ces: \"cs\",\n cmn: \"zh\",\n cym: \"cy\",\n dan: \"da\",\n deu: \"de\",\n ell: \"el\",\n eng: \"en\",\n epo: \"eo\",\n est: \"et\",\n ekk: \"et\",\n eus: \"eu\",\n fas: \"fa\",\n pes: \"fa\",\n prs: \"fa\",\n fin: \"fi\",\n fra: \"fr\",\n fry: \"fy\",\n gla: \"gd\",\n gle: \"ga\",\n glg: \"gl\",\n guj: \"gu\",\n hat: \"ht\",\n hau: \"ha\",\n heb: \"he\",\n hin: \"hi\",\n hrv: \"hr\",\n hun: \"hu\",\n hye: \"hy\",\n ibo: \"ig\",\n ind: \"id\",\n isl: \"is\",\n ita: \"it\",\n jav: \"jv\",\n jpn: \"ja\",\n kan: \"kn\",\n kat: \"ka\",\n kaz: \"kk\",\n khm: \"km\",\n khk: \"mn\",\n kin: \"rw\",\n kir: \"ky\",\n kor: \"ko\",\n kur: \"ku\",\n kmr: \"ku\",\n lao: \"lo\",\n lat: \"la\",\n lav: \"lv\",\n lvs: \"lv\",\n lit: \"lt\",\n ltz: \"lb\",\n mal: \"ml\",\n mar: \"mr\",\n mkd: \"mk\",\n mlg: \"mg\",\n plt: \"mg\",\n mlt: \"mt\",\n mon: \"mn\",\n msa: \"ms\",\n zlm: \"ms\",\n mya: \"my\",\n nep: \"ne\",\n nld: \"nl\",\n nno: \"nn\",\n nob: \"nb\",\n nor: \"no\",\n nya: \"ny\",\n ori: \"or\",\n pan: \"pa\",\n pol: \"pl\",\n por: \"pt\",\n pus: \"ps\",\n pbu: \"ps\",\n que: \"qu\",\n qug: \"qu\",\n ron: \"ro\",\n rus: \"ru\",\n sin: \"si\",\n slk: \"sk\",\n slv: \"sl\",\n sna: \"sn\",\n som: \"so\",\n spa: \"es\",\n sqi: \"sq\",\n srp: \"sr\",\n sun: \"su\",\n swa: \"sw\",\n swh: \"sw\",\n swe: \"sv\",\n tam: \"ta\",\n tel: \"te\",\n tgk: \"tg\",\n tgl: \"tl\",\n tha: \"th\",\n tir: \"ti\",\n tuk: \"tk\",\n tur: \"tr\",\n uig: \"ug\",\n ukr: \"uk\",\n urd: \"ur\",\n uzb: \"uz\",\n uzn: \"uz\",\n vie: \"vi\",\n yid: \"yi\",\n yor: \"yo\",\n zho: \"zh\",\n zul: \"zu\",\n};\n\nfunction francToIso6391(code: string): string | null {\n if (!code || code === \"und\") return null;\n if (code.length === 2) return code.toLowerCase();\n return ISO_639_3_TO_1[code] ?? null;\n}\n\n/**\n * Extract script from Unicode character names — same logic as\n * unicodedata.name(ch).split()[0].lower(), with COMBINING → second word.\n * Letters (L) and marks (M) only; everything else returns \"\".\n */\nexport function charScript(ch: string): string {\n const cached = SCRIPT_CACHE.get(ch);\n if (cached !== undefined) return cached;\n let result = \"\";\n if (ch) {\n const cp = ch.codePointAt(0);\n if (cp !== undefined) {\n const letter = String.fromCodePoint(cp);\n if (/^\\p{L}$/u.test(letter) || /^\\p{M}$/u.test(letter)) {\n result = lookupNamePrefix(cp);\n }\n }\n }\n if (SCRIPT_CACHE.size >= SCRIPT_CACHE_MAX) {\n const first = SCRIPT_CACHE.keys().next().value;\n if (first !== undefined) SCRIPT_CACHE.delete(first);\n }\n SCRIPT_CACHE.set(ch, result);\n return result;\n}\n\nfunction mostCommonScripts(scripts: Map<string, number>, n: number): Array<[string, number]> {\n return [...scripts.entries()].sort((a, b) => b[1] - a[1]).slice(0, n);\n}\n\nfunction sliceCodePoints(text: string, max: number): string {\n if (text.length <= max) return text;\n let n = 0;\n let end = 0;\n for (const ch of text) {\n if (n >= max) break;\n end += ch.length;\n n += 1;\n }\n return text.slice(0, end);\n}\n\nfunction scriptOnly(text: string, targetScript: string): string {\n let out = \"\";\n for (const ch of text) {\n if (/^\\s$/u.test(ch)) out += \" \";\n else if (charScript(ch) === targetScript) out += ch;\n }\n return out;\n}\n\nfunction statisticalDetect(sample: string, dominantScript: string, scripts: Map<string, number>): string {\n if (dominantScript === \"hiragana\" || dominantScript === \"katakana\") return \"ja\";\n if (dominantScript === \"cjk\") {\n const totalChars = [...scripts.values()].reduce((a, b) => a + b, 0) || 1;\n const kana = (scripts.get(\"hiragana\") ?? 0) + (scripts.get(\"katakana\") ?? 0);\n if (kana / totalChars >= 0.02) return \"ja\";\n return \"zh\";\n }\n\n try {\n const clean = scriptOnly(sample, dominantScript);\n if (clean.trim().length < 20) return dominantScript;\n const ranked = francAll(clean, { minLength: 10 });\n // franc ranks 639-3 codes; skip ones with no 639-1 mapping (e.g. `sco`\n // outranking `eng` on short English) just as Lingua falls back when\n // iso_code_639_1 is missing — then take the next confident 639-1 hit.\n for (const [code, conf] of ranked) {\n if (conf < 0.5) break;\n const iso = francToIso6391(code);\n if (iso) return iso;\n }\n } catch {\n // franc failed — fall through to script name\n }\n return dominantScript;\n}\n\nexport function detectLanguage(txt: unknown, _minChars = 30): string | null {\n if (!txt) return null;\n let text: string;\n if (typeof txt === \"string\") text = txt;\n else {\n try {\n text = String(txt);\n } catch {\n return null;\n }\n }\n text = text.trim();\n if (!text) return null;\n\n const sample = text.length > 1500 ? sliceCodePoints(text, 1500) : text;\n\n const scripts = new Map<string, number>();\n for (const ch of sample) {\n const s = charScript(ch);\n if (s) scripts.set(s, (scripts.get(s) ?? 0) + 1);\n }\n\n const total = [...scripts.values()].reduce((a, b) => a + b, 0);\n if (total < 20) return null;\n\n const topScripts = mostCommonScripts(scripts, 5).map(\n ([script, count]) => [script, count / total] as [string, number],\n );\n if (!topScripts.length) return null;\n\n const [dominantScript, dominantRatio] = topScripts[0]!;\n const secondRatio = topScripts[1]?.[1] ?? 0.0;\n\n let jaCount = 0;\n for (const [s, c] of scripts) {\n if (JA_SCRIPTS.has(s)) jaCount += c;\n }\n const jaRatio = jaCount / total;\n const kanaRatio = ((scripts.get(\"hiragana\") ?? 0) + (scripts.get(\"katakana\") ?? 0)) / total;\n if (jaRatio >= 0.8 && kanaRatio >= 0.02) return \"ja\";\n\n if (dominantRatio >= 0.2 && secondRatio >= 0.2) return \"mixed\";\n\n if (dominantRatio >= 0.6) {\n const lang = SCRIPT_TO_ISO[dominantScript];\n if (lang) return lang;\n return statisticalDetect(sample, dominantScript, scripts);\n }\n\n return null;\n}\n\nexport function isSpacelessChar(ch: string): boolean {\n return SPACELESS_SCRIPTS.has(charScript(ch));\n}\n\nfunction isCombiningMark(ch: string): boolean {\n return /^\\p{M}$/u.test(ch);\n}\n\nexport function tokenize(text: string): string[] {\n const tokens: string[] = [];\n const currentWord: string[] = [];\n\n for (const ch of text) {\n if (/^\\s$/u.test(ch)) {\n if (currentWord.length) {\n tokens.push(currentWord.join(\"\"));\n currentWord.length = 0;\n }\n continue;\n }\n\n if (isCombiningMark(ch)) {\n if (tokens.length && !currentWord.length) {\n tokens[tokens.length - 1] = tokens[tokens.length - 1]! + ch;\n } else {\n currentWord.push(ch);\n }\n continue;\n }\n\n if (isSpacelessChar(ch)) {\n if (currentWord.length) {\n tokens.push(currentWord.join(\"\"));\n currentWord.length = 0;\n }\n tokens.push(ch);\n } else {\n currentWord.push(ch);\n }\n }\n\n if (currentWord.length) tokens.push(currentWord.join(\"\"));\n return tokens;\n}\n\nexport function tokenCount(text: string): number {\n return tokenize(text || \"\").length;\n}\n\nfunction isSentenceTerminal(ch: string): boolean {\n return SENTENCE_TERMINALS.has(ch);\n}\n\nfunction lstrip(chars: string[]): string[] {\n let i = 0;\n while (i < chars.length && /^\\s$/u.test(chars[i]!)) i += 1;\n return chars.slice(i);\n}\n\nexport function splitSentences(text: string): string[] {\n text = (text || \"\").trim();\n if (!text) return [];\n\n const chars = [...text];\n const parts: string[] = [];\n const current: string[] = [];\n\n for (let i = 0; i < chars.length; i++) {\n const ch = chars[i]!;\n current.push(ch);\n\n if (isSentenceTerminal(ch)) {\n const rest = chars.slice(i + 1);\n const stripped = lstrip(rest);\n\n if (!stripped.length) break;\n\n if (!AMBIGUOUS_TERMINALS.has(ch)) {\n parts.push(current.join(\"\").trim());\n current.length = 0;\n continue;\n }\n\n if (rest.length && /^\\s$/u.test(rest[0]!)) {\n parts.push(current.join(\"\").trim());\n current.length = 0;\n } else if (stripped.length) {\n const currentScript = charScript(ch) || \"\";\n const nextScript = charScript(stripped[0]!) || \"\";\n if (currentScript && nextScript && currentScript !== nextScript) {\n parts.push(current.join(\"\").trim());\n current.length = 0;\n }\n }\n }\n }\n\n if (current.length) {\n const last = current.join(\"\").trim();\n if (last) parts.push(last);\n }\n\n if (parts.length <= 2) return [text];\n return parts;\n}\n\nexport function jaccardSim(a: string, b: string): number {\n const A = new Set(tokenize(a));\n const B = new Set(tokenize(b));\n if (!A.size || !B.size) return 0.0;\n let inter = 0;\n for (const t of A) if (B.has(t)) inter += 1;\n return inter / (A.size + B.size - inter);\n}\n\nexport function isQuestionMark(ch: string): boolean {\n return QUESTION_MARKS.has(ch);\n}\n","/** Action-surface errors — user-facing / data-dependent failures (not found, ACL, bad input).\n * Config/programming errors stay as TypeError / RangeError / Error.\n */\nexport class EngineActionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"EngineActionError\";\n }\n}\n\n/** Missing vs forbidden document: identical message so callers cannot distinguish. */\nexport class DocumentNotFoundError extends Error {\n constructor(documentId: string) {\n super(`document not found: ${documentId}`);\n this.name = \"DocumentNotFoundError\";\n }\n}\n\nexport class GraphLegUnavailable extends Error {\n constructor(message = \"graph ranked list was not supplied\") {\n super(message);\n this.name = \"GraphLegUnavailable\";\n }\n}\n\nexport class ApprovalNotPending extends Error {\n constructor(message = \"approval is not pending\") {\n super(message);\n this.name = \"ApprovalNotPending\";\n }\n}\n\nexport class ApprovalExpired extends Error {\n constructor(message = \"approval has expired\") {\n super(message);\n this.name = \"ApprovalExpired\";\n }\n}\n\nexport class CodeExecutionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"CodeExecutionError\";\n }\n}\n\nexport class CodeExecutionTimeout extends Error {\n constructor(message = \"code execution timed out\") {\n super(message);\n this.name = \"CodeExecutionTimeout\";\n }\n}\n\nexport class ExtraMissingError extends Error {\n constructor(extra: string, pkg: string, what: string) {\n super(`${what} requires the '${pkg}' package (optional extra: ${extra}): npm install ${pkg}`);\n this.name = \"ExtraMissingError\";\n }\n}\n","import type { UsageEvent } from \"./usage.js\";\n\nconst log = {\n warn: (...args: unknown[]) => console.warn(\"[context-engine]\", ...args),\n error: (...args: unknown[]) => console.error(\"[context-engine]\", ...args),\n};\n\nexport interface Hooks {\n onUsage?: ((event: UsageEvent) => void) | null;\n onError?: ((exc: unknown, ctx: Record<string, unknown>) => void) | null;\n onToolCall?: ((event: Record<string, unknown>) => void) | null;\n}\n\nexport function emitUsage(hooks: Hooks | null | undefined, event: UsageEvent): void {\n if (!hooks?.onUsage) return;\n try {\n hooks.onUsage(event);\n } catch {\n log.warn(\"onUsage callback raised; swallowing\");\n }\n}\n\nexport function emitError(hooks: Hooks | null | undefined, exc: unknown, ctx: Record<string, unknown>): void {\n log.error(\"context_engine error:\", exc, \"| ctx=\", ctx);\n if (!hooks?.onError) return;\n try {\n hooks.onError(exc, ctx);\n } catch {\n log.warn(\"onError callback raised; swallowing\");\n }\n}\n\nexport function emitToolCall(hooks: Hooks | null | undefined, event: Record<string, unknown>): void {\n if (!hooks?.onToolCall) return;\n try {\n hooks.onToolCall(event);\n } catch {\n log.warn(\"onToolCall callback raised; swallowing\");\n }\n}\n","/**\n * Pluggable LLM provider.\n *\n * `callLlm(cfg, { system, user, jsonMode, images, client })` is the single entry\n * point. Returns `[text, { input, output }]`.\n *\n * Images are always PNG. 30s timeout, no retries. Injectable `client` / `fetch`.\n * `callLlm` owns and closes the client it builds unless one is passed in.\n */\n\nimport OpenAI from \"openai\";\nimport type { LLMConfig } from \"../config.js\";\nimport { ExtraMissingError } from \"../errors.js\";\nimport type { FetchImpl } from \"./embeddings.js\";\n\nexport const TIMEOUT_MS = 30_000;\nconst ANTHROPIC_VERSION = \"2023-06-01\";\nconst ANTHROPIC_MAX_TOKENS = 4096;\n\nconst OPENAI_FAMILY = new Set([\"openai\", \"azure_openai\", \"custom\"]);\n\nexport type TokenUsage = { input: number; output: number };\n\nexport type ImageBytes = Uint8Array;\n\nexport type ChatClient = {\n chat: {\n completions: {\n create(body: { model: string; messages: unknown[]; response_format?: { type: string } }): Promise<{\n choices: Array<{ message?: { content?: string | null } }>;\n usage?: { prompt_tokens?: number; completion_tokens?: number } | null;\n }>;\n };\n };\n close?: () => void | Promise<void>;\n timeout?: number;\n baseURL?: string;\n};\n\nexport type LlmCallOpts = {\n system: string;\n user: string;\n jsonMode?: boolean;\n images?: ImageBytes[] | null;\n};\n\nexport type LLMClientOpts = {\n client?: ChatClient | null;\n fetch?: FetchImpl | null;\n fetchImpl?: FetchImpl | null;\n};\n\ntype GeminiChatClient = {\n models: {\n generateContent(args: { model: string; contents: unknown; config?: Record<string, unknown> }): Promise<{\n text?: string;\n usageMetadata?: {\n promptTokenCount?: number;\n candidatesTokenCount?: number;\n prompt_token_count?: number;\n candidates_token_count?: number;\n };\n }>;\n };\n};\n\ntype BedrockConverseResult = {\n output?: { message?: { content?: Array<{ text?: string }> } };\n usage?: { inputTokens?: number; outputTokens?: number };\n};\n\nfunction toBase64(bytes: Uint8Array): string {\n return Buffer.from(bytes).toString(\"base64\");\n}\n\nasync function postJson(\n fetchImpl: FetchImpl,\n url: string,\n body: unknown,\n headers: Record<string, string>,\n): Promise<any> {\n const resp = await fetchImpl(url, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", ...headers },\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(TIMEOUT_MS),\n });\n if (!resp.ok) {\n const text = await resp.text().catch(() => \"\");\n throw new Error(`HTTP ${resp.status} ${resp.statusText}${text ? `: ${text}` : \"\"}`);\n }\n return resp.json();\n}\n\nexport function buildOpenAIChatClient(cfg: LLMConfig): OpenAI {\n return new OpenAI({\n apiKey: cfg.apiKey ?? undefined,\n baseURL: cfg.baseUrl ?? undefined,\n timeout: TIMEOUT_MS,\n maxRetries: 0,\n });\n}\n\nexport class LLMClient {\n cfg: LLMConfig;\n provider: LLMConfig[\"provider\"];\n model: string;\n client: ChatClient | null;\n fetchImpl: FetchImpl | null;\n private genaiClient: GeminiChatClient | null = null;\n\n constructor(cfg: LLMConfig, opts: LLMClientOpts = {}) {\n this.cfg = cfg;\n this.provider = cfg.provider;\n this.model = cfg.model;\n this.client = opts.client ?? null;\n this.fetchImpl = opts.fetch ?? opts.fetchImpl ?? null;\n }\n\n async aclose(): Promise<void> {\n const closer = this.client?.close;\n if (typeof closer === \"function\") {\n await closer.call(this.client);\n }\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.aclose();\n }\n\n async call(opts: LlmCallOpts): Promise<[string, TokenUsage]> {\n const { system, user, jsonMode = false, images = null } = opts;\n if (this.provider === \"anthropic\") {\n return this.callAnthropic(system, user, jsonMode, images);\n }\n if (OPENAI_FAMILY.has(this.provider)) {\n return this.callOpenAI(system, user, jsonMode, images);\n }\n if (this.provider === \"gemini\") {\n return this.callGemini(system, user, jsonMode, images);\n }\n if (this.provider === \"bedrock\") {\n return this.callBedrock(system, user, jsonMode, images);\n }\n throw new Error(`unknown llm provider: ${JSON.stringify(this.provider)}`);\n }\n\n private async callAnthropic(\n system: string,\n user: string,\n jsonMode: boolean,\n images: ImageBytes[] | null,\n ): Promise<[string, TokenUsage]> {\n if (!this.fetchImpl) {\n throw new Error(\"anthropic llm client has no fetch implementation\");\n }\n if (jsonMode) {\n system = `${system}\\n\\nRespond with valid JSON only.`;\n }\n const content: Array<Record<string, unknown>> = [];\n for (const image of images ?? []) {\n content.push({\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: \"image/png\",\n data: toBase64(image),\n },\n });\n }\n content.push({ type: \"text\", text: user });\n\n const data = await postJson(\n this.fetchImpl,\n \"https://api.anthropic.com/v1/messages\",\n {\n model: this.model,\n max_tokens: ANTHROPIC_MAX_TOKENS,\n system,\n messages: [{ role: \"user\", content }],\n },\n {\n \"x-api-key\": this.cfg.apiKey ?? \"\",\n \"anthropic-version\": ANTHROPIC_VERSION,\n \"content-type\": \"application/json\",\n },\n );\n const text = data.content[0].text as string;\n const usage = data.usage ?? {};\n return [text, { input: usage.input_tokens ?? 0, output: usage.output_tokens ?? 0 }];\n }\n\n private async callOpenAI(\n system: string,\n user: string,\n jsonMode: boolean,\n images: ImageBytes[] | null,\n ): Promise<[string, TokenUsage]> {\n if (!this.client) {\n throw new Error(\"openai-family llm client has no client\");\n }\n const content: Array<Record<string, unknown>> = [{ type: \"text\", text: user }];\n for (const image of images ?? []) {\n content.push({\n type: \"image_url\",\n image_url: { url: `data:image/png;base64,${toBase64(image)}` },\n });\n }\n const body: {\n model: string;\n messages: unknown[];\n response_format?: { type: string };\n } = {\n model: this.model,\n messages: [\n { role: \"system\", content: system },\n { role: \"user\", content },\n ],\n };\n if (jsonMode) {\n body.response_format = { type: \"json_object\" };\n }\n const resp = await this.client.chat.completions.create(body);\n const text = resp.choices[0]?.message?.content ?? \"\";\n const usage = resp.usage;\n return [text, { input: usage?.prompt_tokens ?? 0, output: usage?.completion_tokens ?? 0 }];\n }\n\n private async callGemini(\n system: string,\n user: string,\n jsonMode: boolean,\n images: ImageBytes[] | null,\n ): Promise<[string, TokenUsage]> {\n if (!this.genaiClient) {\n this.genaiClient = await loadGeminiChatClient(this.cfg.apiKey);\n }\n const parts: unknown[] = [];\n for (const img of images ?? []) {\n parts.push({ inlineData: { mimeType: \"image/png\", data: toBase64(img) } });\n }\n parts.push({ text: user });\n\n const config: Record<string, unknown> = { systemInstruction: system };\n if (jsonMode) {\n config.responseMimeType = \"application/json\";\n }\n\n const resp = await this.genaiClient.models.generateContent({\n model: this.model,\n contents: parts,\n config,\n });\n const text = resp.text ?? \"\";\n const usageMeta = resp.usageMetadata;\n const inputTokens = usageMeta?.promptTokenCount ?? usageMeta?.prompt_token_count ?? 0;\n const outputTokens = usageMeta?.candidatesTokenCount ?? usageMeta?.candidates_token_count ?? 0;\n return [text, { input: inputTokens || 0, output: outputTokens || 0 }];\n }\n\n private async callBedrock(\n system: string,\n user: string,\n jsonMode: boolean,\n images: ImageBytes[] | null,\n ): Promise<[string, TokenUsage]> {\n const { BedrockRuntimeClient, ConverseCommand } = await loadBedrockSdk();\n if (jsonMode) {\n system = `${system}\\n\\nRespond with valid JSON only.`;\n }\n const content: Array<Record<string, unknown>> = [];\n for (const image of images ?? []) {\n content.push({ image: { format: \"png\", source: { bytes: image } } });\n }\n content.push({ text: user });\n\n const runtime = new BedrockRuntimeClient({\n maxAttempts: 1,\n requestHandler: {\n requestTimeout: TIMEOUT_MS,\n connectionTimeout: TIMEOUT_MS,\n },\n });\n try {\n const result = (await runtime.send(\n new ConverseCommand({\n modelId: this.model,\n system: [{ text: system }],\n messages: [{ role: \"user\", content }],\n }),\n )) as BedrockConverseResult;\n const text = result.output?.message?.content?.[0]?.text ?? \"\";\n const usage = result.usage ?? {};\n return [text, { input: usage.inputTokens ?? 0, output: usage.outputTokens ?? 0 }];\n } finally {\n runtime.destroy?.();\n }\n }\n}\n\nasync function loadGeminiChatClient(apiKey: string | null | undefined): Promise<GeminiChatClient> {\n const specifier = \"@google/genai\";\n let mod: {\n GoogleGenAI?: new (opts: { apiKey?: string | null }) => GeminiChatClient;\n Client?: new (opts: { apiKey?: string | null }) => GeminiChatClient;\n };\n try {\n mod = (await import(specifier)) as typeof mod;\n } catch {\n throw new ExtraMissingError(\"gemini\", specifier, \"gemini llm\");\n }\n const Ctor = mod.GoogleGenAI ?? mod.Client;\n if (!Ctor) {\n throw new ExtraMissingError(\"gemini\", specifier, \"gemini llm\");\n }\n return new Ctor({ apiKey: apiKey ?? null });\n}\n\nasync function loadBedrockSdk(): Promise<{\n BedrockRuntimeClient: new (\n cfg: Record<string, unknown>,\n ) => {\n send(cmd: unknown): Promise<unknown>;\n destroy?: () => void;\n };\n ConverseCommand: new (input: Record<string, unknown>) => unknown;\n}> {\n const specifier = \"@aws-sdk/client-bedrock-runtime\";\n try {\n return (await import(specifier)) as Awaited<ReturnType<typeof loadBedrockSdk>>;\n } catch {\n throw new ExtraMissingError(\"bedrock\", specifier, \"bedrock llm\");\n }\n}\n\nexport function buildLlmClient(cfg: LLMConfig, opts?: LLMClientOpts): LLMClient {\n if (opts?.client || opts?.fetch || opts?.fetchImpl) {\n return new LLMClient(cfg, opts);\n }\n if (cfg.provider === \"anthropic\") {\n return new LLMClient(cfg, { fetch: globalThis.fetch });\n }\n if (OPENAI_FAMILY.has(cfg.provider)) {\n return new LLMClient(cfg, { client: buildOpenAIChatClient(cfg) });\n }\n if (cfg.provider === \"gemini\" || cfg.provider === \"bedrock\") {\n return new LLMClient(cfg);\n }\n throw new Error(`unknown llm provider: ${JSON.stringify(cfg.provider)}`);\n}\n\n/**\n * Call the LLM configured by `cfg`. Returns `[text, tokenUsage]`.\n *\n * With no `client`, one is built for this call and CLOSED afterwards,\n * success or failure. Pass `client` to reuse a connection across many calls;\n * the caller then owns `aclose()`.\n */\nexport async function callLlm(\n cfg: LLMConfig,\n opts: LlmCallOpts & { client?: LLMClient | null },\n): Promise<[string, TokenUsage]> {\n const { client, ...callOpts } = opts;\n if (client) {\n return client.call(callOpts);\n }\n const owned = buildLlmClient(cfg);\n try {\n return await owned.call(callOpts);\n } finally {\n await owned.aclose();\n }\n}\n","/**\n * Unified JSON parsing with jsonrepair fallback for LLM output.\n *\n * Handles markdown fences, truncated output, trailing commas, unclosed\n * strings/brackets, and other common LLM JSON errors.\n */\nimport { jsonrepair } from \"jsonrepair\";\n\nexport type JsonExpected = \"object\" | \"array\";\n\nfunction stripFences(text: string): string {\n let t = text.trim();\n const fenced = /^```(?:json)?\\s*([\\s\\S]*?)\\s*```$/i.exec(t);\n if (fenced?.[1]) t = fenced[1].trim();\n return t;\n}\n\nfunction isExpected(value: unknown, expectedType: JsonExpected): boolean {\n if (expectedType === \"array\") return Array.isArray(value);\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/**\n * Parse JSON with automatic repair fallback for LLM output.\n *\n * @throws {SyntaxError} If parsing and repair both fail to produce `expectedType`.\n */\nexport function safeJsonParse(text: string, expectedType: JsonExpected = \"object\"): unknown {\n const stripped = stripFences(text);\n\n try {\n const result: unknown = JSON.parse(stripped);\n if (isExpected(result, expectedType)) return result;\n } catch {\n /* fall through to repair */\n }\n\n let repaired: unknown;\n try {\n repaired = JSON.parse(jsonrepair(stripped));\n } catch {\n throw new SyntaxError(`Expected ${expectedType}, jsonrepair could not parse`);\n }\n if (isExpected(repaired, expectedType)) {\n console.info(`json_repair recovered ${Array.isArray(repaired) ? \"array\" : \"object\"}`);\n return repaired;\n }\n throw new SyntaxError(\n `Expected ${expectedType}, got ${Array.isArray(repaired) ? \"array\" : typeof repaired}`,\n );\n}\n","/**\n * File-format text extraction — dispatch helpers + concrete extractors for\n * the mainstream office/text formats (docx/pptx/xlsx/csv/html/eml).\n *\n * Legacy binary formats (.doc/.ppt/.xls/.msg/.odt/...) are not parsed here:\n * `extract()` falls through to a raw utf-8 decode, matching the Python\n * package's worst-case behavior.\n */\nimport { load } from \"cheerio\";\nimport ExcelJS from \"exceljs\";\nimport JSZip from \"jszip\";\nimport mammoth from \"mammoth\";\nimport PostalMime from \"postal-mime\";\n\nconst ZIP_MAGIC = Buffer.from([0x50, 0x4b, 0x03, 0x04]);\n\nexport const NON_INGESTIBLE_MEDIA_EXTS = new Set([\n \".ogg\",\n \".oga\",\n \".opus\",\n \".mp3\",\n \".wav\",\n \".m4a\",\n \".aac\",\n \".flac\",\n \".wma\",\n \".amr\",\n \".mp4\",\n \".m4v\",\n \".mov\",\n \".avi\",\n \".mkv\",\n \".webm\",\n \".wmv\",\n \".flv\",\n \".3gp\",\n \".mpg\",\n \".mpeg\",\n]);\n\nexport const DOCX_MIME = \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\";\nexport const PPTX_MIME = \"application/vnd.openxmlformats-officedocument.presentationml.presentation\";\nexport const XLSX_MIME = \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\";\n\nexport function getFileExtension(filename: string | null | undefined): string {\n if (!filename?.includes(\".\")) return \"\";\n return filename.slice(filename.lastIndexOf(\".\")).toLowerCase();\n}\n\n/**\n * True for audio/video files, which must never be treated as text-bearing.\n * Bare `application/octet-stream` does NOT match.\n */\nexport function isNonIngestibleMedia(\n filename: string | null | undefined,\n mime: string | null | undefined,\n): boolean {\n const m = (mime || \"\").toLowerCase();\n if (m.startsWith(\"audio/\") || m.startsWith(\"video/\")) return true;\n return NON_INGESTIBLE_MEDIA_EXTS.has(getFileExtension(filename));\n}\n\nfunction isZip(content: Buffer): boolean {\n return content.length >= 4 && content.subarray(0, 4).equals(ZIP_MAGIC);\n}\n\nfunction decodeXmlEntities(s: string): string {\n return s\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\")\n .replace(/&quot;/g, '\"')\n .replace(/&apos;/g, \"'\")\n .replace(/&amp;/g, \"&\");\n}\n\nfunction collectTagText(xml: string, tag: string): string[] {\n const out: string[] = [];\n const re = new RegExp(`<${tag}(?:\\\\s[^>]*)?>([^<]*)</${tag}>`, \"g\");\n for (const m of xml.matchAll(re)) {\n const t = decodeXmlEntities(m[1] ?? \"\").trim();\n if (t) out.push(t);\n }\n return out;\n}\n\nfunction htmlToPlain(html: string, extraRemove = \"\"): string {\n try {\n const $ = load(html);\n $(`script, style, head${extraRemove ? `, ${extraRemove}` : \"\"}`).remove();\n $(\"br\").replaceWith(\"\\n\");\n $(\"p, div, h1, h2, h3, h4, h5, h6, tr, li, blockquote\").each((_, el) => {\n $(el).prepend(\"\\n\");\n });\n const lines = $.root()\n .text()\n .split(/\\n/)\n .map((l) => l.trim())\n .filter(Boolean);\n return lines.join(\"\\n\");\n } catch {\n return html;\n }\n}\n\nfunction mammothHtmlToText(html: string): string {\n const $ = load(html);\n $(\"table\").each((_, table) => {\n const rows: string[] = [];\n $(table)\n .find(\"tr\")\n .each((__, tr) => {\n const cells = $(tr)\n .find(\"th, td\")\n .map((___, td) => $(td).text().trim())\n .get()\n .filter(Boolean);\n if (cells.length) rows.push(cells.join(\" | \"));\n });\n $(table).replaceWith(`${rows.join(\"\\n\")}\\n`);\n });\n $(\"br\").replaceWith(\"\\n\");\n $(\"p, div, h1, h2, h3, h4, h5, h6, li\").each((_, el) => {\n $(el).prepend(\"\\n\");\n });\n const lines = $.root()\n .text()\n .split(/\\n/)\n .map((l) => l.trim())\n .filter(Boolean);\n return lines.join(\"\\n\");\n}\n\nasync function docxHeaderFooterText(content: Buffer): Promise<string[]> {\n try {\n const zip = await JSZip.loadAsync(content);\n const parts: string[] = [];\n const names = Object.keys(zip.files).filter((n) => /^word\\/(header|footer)\\d*\\.xml$/i.test(n));\n for (const name of names) {\n const xml = await zip.files[name]!.async(\"string\");\n parts.push(...collectTagText(xml, \"w:t\"));\n }\n return parts;\n } catch {\n return [];\n }\n}\n\nexport async function extractDocxText(content: Buffer): Promise<string> {\n if (!isZip(content)) {\n console.warn(\"extractDocxText: not a ZIP archive, decoding as plain text\");\n return content.toString(\"utf8\");\n }\n const { value } = await mammoth.convertToHtml({ buffer: content });\n const body = mammothHtmlToText(value || \"\");\n const extras = await docxHeaderFooterText(content);\n const parts = [body, ...extras].filter((p) => p.trim());\n return parts.join(\"\\n\");\n}\n\nexport async function countDocxPages(content: Buffer): Promise<number> {\n try {\n const { value } = await mammoth.extractRawText({ buffer: content });\n const wordCount = (value || \"\").trim() ? (value || \"\").trim().split(/\\s+/).length : 0;\n return Math.max(1, Math.round(wordCount / 250));\n } catch {\n return 1;\n }\n}\n\nfunction cellString(value: unknown): string {\n if (value == null) return \"\";\n if (value instanceof Date) return value.toISOString();\n if (typeof value === \"object\") {\n const rec = value as { result?: unknown; text?: unknown; richText?: Array<{ text?: string }> };\n if (\"result\" in rec) return cellString(rec.result);\n if (Array.isArray(rec.richText)) return rec.richText.map((t) => t.text ?? \"\").join(\"\");\n if (typeof rec.text === \"string\") return rec.text;\n }\n return String(value);\n}\n\nexport async function extractXlsxText(content: Buffer): Promise<string> {\n if (!isZip(content)) {\n console.warn(\"extractXlsxText: not a ZIP archive, decoding as plain text\");\n return content.toString(\"utf8\");\n }\n try {\n const probe = new ExcelJS.Workbook();\n await probe.xlsx.load(content as unknown as ArrayBuffer);\n const colCaps = new Map<string, number>();\n for (const ws of probe.worksheets) {\n const widths: number[] = [];\n let i = 0;\n ws.eachRow({ includeEmpty: true }, (row) => {\n if (i === 0) {\n i += 1;\n return;\n }\n if (i > 20) return;\n i += 1;\n const values = (row.values as unknown[]) ?? [];\n let lastData = 0;\n for (let j = 1; j < values.length; j++) {\n const v = values[j];\n if (v != null && cellString(v).trim()) lastData = j;\n }\n if (lastData > 0) widths.push(lastData);\n });\n colCaps.set(ws.name, widths.length ? Math.max(...widths) : 50);\n }\n\n const wb = new ExcelJS.Workbook();\n await wb.xlsx.load(content as unknown as ArrayBuffer);\n const out: string[] = [];\n for (const ws of wb.worksheets) {\n out.push(`[Sheet: ${ws.name}]`);\n const cap = colCaps.get(ws.name) ?? 50;\n ws.eachRow({ includeEmpty: true }, (row) => {\n const values = (row.values as unknown[]) ?? [];\n const trimmed: string[] = [];\n const last = Math.min(values.length - 1, cap);\n for (let j = 1; j <= last; j++) trimmed.push(cellString(values[j]));\n while (trimmed.length && !trimmed[trimmed.length - 1]!.trim()) trimmed.pop();\n if (trimmed.length) out.push(trimmed.join(\", \"));\n });\n }\n return out.join(\"\\n\");\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (/zip|corrupt|invalid/i.test(msg)) return content.toString(\"utf8\");\n throw err;\n }\n}\n\nfunction pptxTableRows(tblXml: string): string[] {\n const rows: string[] = [];\n for (const tr of tblXml.matchAll(/<a:tr\\b[\\s\\S]*?<\\/a:tr>/g)) {\n const cells: string[] = [];\n for (const tc of tr[0]!.matchAll(/<a:tc\\b[\\s\\S]*?<\\/a:tc>/g)) {\n const texts = collectTagText(tc[0]!, \"a:t\");\n const joined = texts.join(\" \").trim();\n if (joined) cells.push(joined);\n }\n if (cells.length) rows.push(cells.join(\" | \"));\n }\n return rows;\n}\n\nfunction pptxSlideBody(xml: string): string[] {\n const parts: string[] = [];\n const withoutTables = xml.replace(/<a:tbl\\b[\\s\\S]*?<\\/a:tbl>/g, (tbl) => {\n parts.push(...pptxTableRows(tbl));\n return \"\";\n });\n parts.push(...collectTagText(withoutTables, \"a:t\"));\n return parts.filter(Boolean);\n}\n\nfunction parseRels(xml: string): Map<string, string> {\n const map = new Map<string, string>();\n const re = /Id=\"([^\"]+)\"[^>]*Target=\"([^\"]+)\"|Target=\"([^\"]+)\"[^>]*Id=\"([^\"]+)\"/g;\n for (const m of xml.matchAll(re)) {\n const id = m[1] || m[4];\n const target = m[2] || m[3];\n if (id && target) map.set(id, target);\n }\n return map;\n}\n\nasync function pptxSlideOrder(zip: JSZip): Promise<string[]> {\n const pres = zip.file(\"ppt/presentation.xml\");\n const rels = zip.file(\"ppt/_rels/presentation.xml.rels\");\n if (!pres || !rels) {\n return Object.keys(zip.files)\n .filter((n) => /^ppt\\/slides\\/slide\\d+\\.xml$/.test(n))\n .sort((a, b) => {\n const na = Number(/slide(\\d+)/.exec(a)?.[1] ?? 0);\n const nb = Number(/slide(\\d+)/.exec(b)?.[1] ?? 0);\n return na - nb;\n });\n }\n const presXml = await pres.async(\"string\");\n const relsMap = parseRels(await rels.async(\"string\"));\n const ids: string[] = [];\n for (const m of presXml.matchAll(/<p:sldId\\b[^>]*r:id=\"([^\"]+)\"/g)) {\n ids.push(m[1]!);\n }\n const names: string[] = [];\n for (const id of ids) {\n const target = relsMap.get(id);\n if (!target) continue;\n const path = target.replace(/^\\.\\//, \"\");\n names.push(path.startsWith(\"ppt/\") ? path : `ppt/${path}`);\n }\n return names;\n}\n\nexport async function extractPptxText(content: Buffer): Promise<string> {\n if (!isZip(content)) {\n console.warn(\"extractPptxText: not a ZIP archive, decoding as plain text\");\n return content.toString(\"utf8\");\n }\n const zip = await JSZip.loadAsync(content);\n const slideFiles = await pptxSlideOrder(zip);\n const parts: string[] = [];\n for (let i = 0; i < slideFiles.length; i++) {\n const name = slideFiles[i]!;\n const file = zip.file(name);\n if (!file) continue;\n parts.push(`[Slide ${i + 1}]`);\n const xml = await file.async(\"string\");\n parts.push(...pptxSlideBody(xml));\n const relsName = name.replace(/slides\\/(slide\\d+\\.xml)$/, \"slides/_rels/$1.rels\");\n const relsFile = zip.file(relsName);\n if (relsFile) {\n const relsXml = await relsFile.async(\"string\");\n const notesTarget = [...relsXml.matchAll(/Target=\"([^\"]*notesSlide[^\"]*)\"/gi)][0]?.[1];\n if (notesTarget) {\n const notesPath = notesTarget.startsWith(\"/\")\n ? notesTarget.slice(1)\n : name.replace(/slides\\/slide\\d+\\.xml$/, \"\") +\n notesTarget.replace(/^\\.\\.\\//, \"\").replace(/^\\.\\//, \"\");\n const notesFile = zip.file(notesPath) ?? zip.file(`ppt/${notesTarget.replace(/^(\\.\\.\\/)+/, \"\")}`);\n if (notesFile) {\n const notesXml = await notesFile.async(\"string\");\n const notes = collectTagText(notesXml, \"a:t\").join(\" \").trim();\n if (notes) parts.push(`[Notes] ${notes}`);\n }\n }\n }\n parts.push(\"\");\n }\n return parts.join(\"\\n\");\n}\n\nexport async function countPptxSlides(content: Buffer): Promise<number> {\n try {\n const zip = await JSZip.loadAsync(content);\n const n = (await pptxSlideOrder(zip)).length;\n return n || 1;\n } catch {\n return 1;\n }\n}\n\nexport function extractCsvText(content: Buffer, delimiter = \",\"): string {\n const txt = content.toString(\"utf8\");\n try {\n const rows = parseCsv(txt, delimiter);\n const out: string[] = [];\n for (const row of rows) {\n const trimmed = [...row];\n while (trimmed.length && !String(trimmed[trimmed.length - 1]).trim()) trimmed.pop();\n if (trimmed.length) out.push(trimmed.map((c) => String(c)).join(\", \"));\n }\n return out.join(\"\\n\");\n } catch {\n return txt;\n }\n}\n\nfunction parseCsv(text: string, delimiter: string): string[][] {\n const rows: string[][] = [];\n let row: string[] = [];\n let cell = \"\";\n let i = 0;\n let inQuotes = false;\n while (i < text.length) {\n const ch = text[i]!;\n if (inQuotes) {\n if (ch === '\"') {\n if (text[i + 1] === '\"') {\n cell += '\"';\n i += 2;\n continue;\n }\n inQuotes = false;\n i += 1;\n continue;\n }\n cell += ch;\n i += 1;\n continue;\n }\n if (ch === '\"') {\n inQuotes = true;\n i += 1;\n continue;\n }\n if (ch === delimiter) {\n row.push(cell);\n cell = \"\";\n i += 1;\n continue;\n }\n if (ch === \"\\r\") {\n i += 1;\n continue;\n }\n if (ch === \"\\n\") {\n row.push(cell);\n rows.push(row);\n row = [];\n cell = \"\";\n i += 1;\n continue;\n }\n cell += ch;\n i += 1;\n }\n if (cell.length || row.length) {\n row.push(cell);\n rows.push(row);\n }\n return rows;\n}\n\nexport function extractHtmlText(content: Buffer): string {\n try {\n return htmlToPlain(content.toString(\"utf8\"));\n } catch (exc) {\n console.debug(\"HTML extraction failed:\", exc);\n return content.toString(\"utf8\");\n }\n}\n\nfunction formatAddress(\n addr:\n | { name?: string; address?: string; text?: string }\n | Array<{ name?: string; address?: string; text?: string }>\n | undefined,\n): string {\n if (!addr) return \"\";\n const one = (a: { name?: string; address?: string; text?: string }) =>\n a.text || [a.name, a.address].filter(Boolean).join(\" \") || \"\";\n return Array.isArray(addr) ? addr.map(one).filter(Boolean).join(\", \") : one(addr);\n}\n\nexport async function extractEmlText(content: Buffer): Promise<string> {\n try {\n const msg = await PostalMime.parse(content);\n const parts: string[] = [];\n const from = formatAddress(msg.from);\n const to = formatAddress(msg.to);\n if (from) parts.push(`From: ${from}`);\n if (to) parts.push(`To: ${to}`);\n if (msg.subject) parts.push(`Subject: ${msg.subject}`);\n const date = (msg as { date?: string }).date;\n if (date) parts.push(`Date: ${date}`);\n parts.push(\"\");\n if (msg.text) {\n parts.push(msg.text);\n } else if (msg.html) {\n parts.push(htmlToPlain(msg.html, \"head\"));\n }\n return parts.join(\"\\n\");\n } catch (exc) {\n console.debug(\"EML extraction failed:\", exc);\n return content.toString(\"utf8\");\n }\n}\n","import { ExtraMissingError } from \"./errors.js\";\n\nexport async function tryImport<T = unknown>(specifier: string): Promise<T | null> {\n try {\n return (await import(specifier)) as T;\n } catch {\n return null;\n }\n}\n\nexport async function requireExtra<T = unknown>(specifier: string, extra: string, what: string): Promise<T> {\n try {\n return (await import(specifier)) as T;\n } catch (_err) {\n throw new ExtraMissingError(extra, specifier, what);\n }\n}\n","/**\n * Structure-preserving PDF text extraction via the optional `pdfjs-dist` extra.\n *\n * Never throws: every entry point answers `null` when the extra is absent or\n * the PDF can't be parsed, so `pdf.ts` falls straight back to unpdf text.\n */\nimport { tryImport } from \"../extras.js\";\n\ntype PdfJsModule = {\n getDocument: (src: { data: Uint8Array; disableWorker?: boolean; isEvalSupported?: boolean }) => {\n promise: Promise<{\n numPages: number;\n getPage: (n: number) => Promise<{\n getTextContent: () => Promise<{\n items: Array<{\n str?: string;\n transform?: number[];\n width?: number;\n height?: number;\n hasEOL?: boolean;\n }>;\n }>;\n }>;\n destroy?: () => Promise<void>;\n }>;\n };\n};\n\nlet pdfjsModule: PdfJsModule | null = null;\nlet probed = false;\n\nasync function loadPdfjs(): Promise<PdfJsModule | null> {\n if (!probed) {\n probed = true;\n pdfjsModule =\n (await tryImport<PdfJsModule>(\"pdfjs-dist/legacy/build/pdf.mjs\")) ??\n (await tryImport<PdfJsModule>(\"pdfjs-dist\")) ??\n null;\n if (!pdfjsModule) {\n console.debug(\n \"pdfjs-dist not installed; PDF text layers extract as unstructured text (npm install pdfjs-dist)\",\n );\n }\n }\n return pdfjsModule;\n}\n\n/** True when the optional pdfjs-dist extra is importable. */\nexport async function available(): Promise<boolean> {\n return (await loadPdfjs()) !== null;\n}\n\nexport interface PdfVerdict {\n textBased: boolean;\n confidence: number;\n pageCount: number;\n /** 0-indexed, matching `pdf.classifyPages`. */\n pagesNeedingOcr: number[];\n}\n\ninterface LaidItem {\n str: string;\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nfunction itemsToMarkdown(raw: LaidItem[]): string {\n const items = raw.filter((it) => it.str);\n if (!items.length) return \"\";\n const heights = items\n .map((i) => i.h)\n .filter((h) => h > 0)\n .sort((a, b) => a - b);\n const median = heights[Math.floor(heights.length / 2)] ?? 12;\n const yTol = median * 0.35;\n\n const sorted = [...items].sort((a, b) => b.y - a.y || a.x - b.x);\n const lines: LaidItem[][] = [];\n for (const it of sorted) {\n const last = lines[lines.length - 1];\n if (last?.[0] && Math.abs(last[0].y - it.y) < yTol) last.push(it);\n else lines.push([it]);\n }\n for (const line of lines) line.sort((a, b) => a.x - b.x);\n\n const out: string[] = [];\n for (const line of lines) {\n const maxH = Math.max(...line.map((i) => i.h), 0);\n const cells = line.map((i) => i.str.trim()).filter(Boolean);\n if (!cells.length) continue;\n const gaps: number[] = [];\n for (let i = 1; i < line.length; i++) {\n const prev = line[i - 1]!;\n gaps.push(line[i]!.x - (prev.x + prev.w));\n }\n const tableRow = cells.length >= 3 && gaps.filter((g) => g > median * 0.8).length >= 2;\n let text: string;\n if (tableRow) text = `| ${cells.join(\" | \")} |`;\n else text = cells.join(\" \");\n if (maxH > median * 1.6) out.push(`# ${text.replace(/^\\| |\\s\\|$/g, \"\")}`);\n else if (maxH > median * 1.25) out.push(`## ${text.replace(/^\\| |\\s\\|$/g, \"\")}`);\n else out.push(text);\n }\n return out.join(\"\\n\");\n}\n\nasync function pageItems(\n doc: Awaited<ReturnType<PdfJsModule[\"getDocument\"]>[\"promise\"]>,\n pageNumber: number,\n): Promise<LaidItem[]> {\n const page = await doc.getPage(pageNumber);\n const tc = await page.getTextContent();\n const laid: LaidItem[] = [];\n for (const it of tc.items) {\n const tr = it.transform ?? [1, 0, 0, 1, 0, 0];\n laid.push({\n str: it.str ?? \"\",\n x: tr[4] ?? 0,\n y: tr[5] ?? 0,\n w: it.width ?? 0,\n h: it.height ?? Math.abs(tr[3] ?? 0),\n });\n }\n return laid;\n}\n\n/** Classify a PDF, or `null` if unavailable/unparseable. Never throws. */\nexport async function classify(content: Buffer): Promise<PdfVerdict | null> {\n const mod = await loadPdfjs();\n if (!mod) return null;\n try {\n const doc = await mod.getDocument({\n data: new Uint8Array(content),\n disableWorker: true,\n isEvalSupported: false,\n }).promise;\n try {\n const pagesNeedingOcr: number[] = [];\n for (let i = 1; i <= doc.numPages; i++) {\n const items = await pageItems(doc, i);\n const text = items\n .map((it) => it.str)\n .join(\"\")\n .trim();\n if (text.length < 50) pagesNeedingOcr.push(i - 1);\n }\n const pageCount = doc.numPages;\n const textBased = pagesNeedingOcr.length === 0;\n const confidence = pageCount > 0 ? 1 - pagesNeedingOcr.length / pageCount : 0;\n return { textBased, confidence, pageCount, pagesNeedingOcr };\n } finally {\n await doc.destroy?.();\n }\n } catch (exc) {\n console.debug(\"pdfjs-dist could not classify this PDF:\", exc);\n return null;\n }\n}\n\n/**\n * Per-page Markdown for the text layer, or `null` if unavailable.\n * Index `i` is page `i` (empty string when a page has no text layer).\n */\nexport async function pagesAsMarkdown(content: Buffer): Promise<string[] | null> {\n const mod = await loadPdfjs();\n if (!mod) return null;\n try {\n const doc = await mod.getDocument({\n data: new Uint8Array(content),\n disableWorker: true,\n isEvalSupported: false,\n }).promise;\n try {\n const pages: string[] = [];\n for (let i = 1; i <= doc.numPages; i++) {\n try {\n pages.push(itemsToMarkdown(await pageItems(doc, i)));\n } catch {\n pages.push(\"\");\n }\n }\n return pages;\n } finally {\n await doc.destroy?.();\n }\n } catch (exc) {\n console.debug(\"pdfjs-dist could not convert this PDF to Markdown:\", exc);\n return null;\n }\n}\n","/**\n * Tesseract OCR — optional `ocr` extra (`tesseract.js`).\n *\n * Imported lazily so this module loads without the extra; calling into it\n * without tesseract.js raises ExtraMissingError.\n */\nimport { ExtraMissingError } from \"../errors.js\";\nimport { tryImport } from \"../extras.js\";\nimport { detectLanguage } from \"../text.js\";\n\nexport const OCRQuality = {\n EXCELLENT: \"excellent\",\n GOOD: \"good\",\n ACCEPTABLE: \"acceptable\",\n POOR: \"poor\",\n} as const;\nexport type OCRQuality = (typeof OCRQuality)[keyof typeof OCRQuality];\n\nexport const PreprocessingLevel = {\n NONE: \"none\",\n BASIC: \"basic\",\n STANDARD: \"standard\",\n AGGRESSIVE: \"aggressive\",\n} as const;\nexport type PreprocessingLevel = (typeof PreprocessingLevel)[keyof typeof PreprocessingLevel];\n\nexport interface OCRConfig {\n language?: string;\n preprocessing?: PreprocessingLevel;\n provider?: string;\n maxRetries?: number;\n psm?: number | null;\n oem?: number | null;\n maxImageDimension?: number;\n}\n\nexport interface OCRResult {\n text: string;\n confidence: number;\n quality: OCRQuality;\n wordCount: number;\n languageDetected: string | null;\n preprocessingApplied: PreprocessingLevel;\n warnings: string[];\n metadata: Record<string, unknown>;\n}\n\nexport const LANG_CODE_MAP: Record<string, string> = {\n ar: \"ara\",\n en: \"eng\",\n mixed: \"ara+eng\",\n he: \"heb\",\n fa: \"fas\",\n de: \"deu\",\n es: \"spa\",\n fr: \"fra\",\n it: \"ita\",\n pt: \"por\",\n ru: \"rus\",\n zh: \"chi_sim\",\n ja: \"jpn\",\n ko: \"kor\",\n hi: \"hin\",\n ur: \"urd\",\n};\n\nexport const RTL_LANGUAGES = new Set([\"ar\", \"ara\", \"he\", \"heb\", \"fa\", \"fas\", \"mixed\"]);\n\nexport const SCRIPT_SIBLING_LANGS: Record<string, string[]> = {\n arabic: [\"ara+eng\", \"urd\", \"fas\"],\n latin: [\"eng\"],\n cyrillic: [\"rus\", \"ukr\", \"srp\"],\n devanagari: [\"hin\", \"mar\", \"nep\", \"san\"],\n han: [\"chi_sim\", \"chi_tra\", \"jpn\"],\n hiragana: [\"jpn\"],\n katakana: [\"jpn\"],\n japanese: [\"jpn\"],\n hangul: [\"kor\"],\n hebrew: [\"heb\", \"yid\"],\n greek: [\"ell\", \"grc\"],\n thai: [\"tha\"],\n lao: [\"lao\"],\n khmer: [\"khm\"],\n myanmar: [\"mya\"],\n sinhala: [\"sin\"],\n tibetan: [\"bod\"],\n thaana: [\"div\"],\n bengali: [\"ben\", \"asm\"],\n tamil: [\"tam\"],\n telugu: [\"tel\"],\n kannada: [\"kan\"],\n malayalam: [\"mal\"],\n gujarati: [\"guj\"],\n gurmukhi: [\"pan\"],\n oriya: [\"ori\"],\n georgian: [\"kat\"],\n armenian: [\"hye\"],\n ethiopic: [\"amh\", \"tir\"],\n syriac: [\"syr\"],\n vietnamese: [\"vie\"],\n fraktur: [\"frk\", \"deu\"],\n cherokee: [\"chr\"],\n canadian_aboriginal: [\"iku\"],\n};\n\nconst TRIAL_EARLY_EXIT_CONFIDENCE = 80;\n\ntype TessWorker = {\n recognize: (\n image: Buffer,\n opts?: Record<string, unknown>,\n output?: Record<string, boolean>,\n ) => Promise<{\n data: {\n text?: string;\n confidence?: number;\n blocks?: Array<{\n lines?: Array<{\n words?: Array<{ text?: string; confidence?: number }>;\n }>;\n }>;\n };\n }>;\n detect: (image: Buffer) => Promise<{ data?: { script?: string } }>;\n setParameters: (p: Record<string, string>) => Promise<void>;\n terminate: () => Promise<void>;\n};\n\ntype TessModule = {\n createWorker: (lang?: string, oem?: number, opts?: Record<string, unknown>) => Promise<TessWorker>;\n};\n\nlet tessMod: TessModule | null | undefined;\n\nasync function requireTesseract(): Promise<TessModule> {\n if (tessMod) return tessMod;\n const loaded = await tryImport<TessModule>(\"tesseract.js\");\n if (!loaded?.createWorker) {\n throw new ExtraMissingError(\"ocr\", \"tesseract.js\", \"OCR\");\n }\n tessMod = loaded;\n return loaded;\n}\n\ntype SharpMod = {\n default: (input: Buffer) => SharpInstance;\n};\n\ntype SharpInstance = {\n metadata: () => Promise<{ width?: number; height?: number }>;\n stats: () => Promise<{ channels?: Array<{ stdev?: number; mean?: number; min?: number; max?: number }> }>;\n greyscale: () => SharpInstance;\n normalize: () => SharpInstance;\n median: (n: number) => SharpInstance;\n sharpen: (opts?: { sigma?: number }) => SharpInstance;\n threshold: (n: number) => SharpInstance;\n resize: (opts: { width: number; height: number; fit: string }) => SharpInstance;\n rotate: (angle: number, opts?: { background?: string }) => SharpInstance;\n png: () => SharpInstance;\n toBuffer: () => Promise<Buffer>;\n};\n\nasync function loadSharp(): Promise<SharpMod[\"default\"] | null> {\n const mod = await tryImport<SharpMod | SharpMod[\"default\"]>(\"sharp\");\n if (!mod) return null;\n if (typeof mod === \"function\") return mod;\n return (mod as SharpMod).default ?? null;\n}\n\nfunction isGarbageWord(text: string): boolean {\n if (text.length < 2) return false;\n if (/[\\p{Cc}\\p{Cf}]/u.test(text)) return true;\n const punct = [...text].filter((c) => /\\p{P}/u.test(c)).length;\n if (punct / Math.max(text.length, 1) > 0.5) return true;\n const alpha = [...text].filter((c) => /\\p{L}/u.test(c));\n if (!alpha.length) return false;\n const latin = alpha.filter((c) => /\\p{Script=Latin}/u.test(c));\n if (latin.length / alpha.length < 0.8) return false;\n if (/\\d/.test(text)) return false;\n const chars = latin.map((c) => c.toLowerCase());\n if (chars.length >= 4) {\n const vowels = chars.filter((c) => \"aeiou\".includes(c)).length;\n if (vowels / chars.length < 0.1) return true;\n }\n return false;\n}\n\nasync function detectScript(worker: TessWorker, image: Buffer): Promise<string | null> {\n try {\n const osd = await worker.detect(image);\n return (osd.data?.script || \"\").trim().toLowerCase() || null;\n } catch {\n return null;\n }\n}\n\nfunction languageCandidates(language: string, script: string | null): string[] {\n if (language !== \"auto\") {\n return [LANG_CODE_MAP[language] ?? language];\n }\n if (!script) return [\"eng\", \"ara+eng\"];\n return SCRIPT_SIBLING_LANGS[script] ?? [\"eng\"];\n}\n\ninterface RunResult {\n text: string;\n confidence: number;\n wordCount: number;\n garbageRatio: number;\n}\n\nasync function runSingleLanguage(worker: TessWorker, image: Buffer): Promise<RunResult | null> {\n try {\n const { data } = await worker.recognize(image, {}, { blocks: true });\n const lines = new Map<number, string[]>();\n const confidences: number[] = [];\n let garbageCount = 0;\n let totalWords = 0;\n let lineIdx = 0;\n for (const block of data.blocks ?? []) {\n for (const line of block.lines ?? []) {\n for (const word of line.words ?? []) {\n const w = (word.text ?? \"\").trim();\n if (!w) continue;\n totalWords += 1;\n const bucket = lines.get(lineIdx) ?? [];\n bucket.push(w);\n lines.set(lineIdx, bucket);\n const conf = Number(word.confidence);\n if (Number.isFinite(conf) && conf !== -1) confidences.push(conf);\n if (isGarbageWord(w)) garbageCount += 1;\n }\n lineIdx += 1;\n }\n }\n const text =\n data.text?.trim() ||\n [...lines.keys()]\n .sort((a, b) => a - b)\n .map((n) => (lines.get(n) ?? []).join(\" \"))\n .join(\"\\n\");\n const avg = confidences.length\n ? confidences.reduce((a, b) => a + b, 0) / confidences.length\n : (data.confidence ?? 0);\n const garbageRatio = totalWords > 0 ? garbageCount / totalWords : 0;\n return {\n text,\n confidence: avg,\n wordCount: totalWords || text.split(/\\s+/).filter(Boolean).length,\n garbageRatio,\n };\n } catch {\n return null;\n }\n}\n\nasync function downscaleIfNeeded(\n image: Buffer,\n maxDimension: number,\n sharpFn: SharpMod[\"default\"] | null,\n): Promise<Buffer> {\n if (!sharpFn) return image;\n try {\n const meta = await sharpFn(image).metadata();\n const w = meta.width ?? 0;\n const h = meta.height ?? 0;\n if (!w || !h || Math.max(w, h) <= maxDimension) return image;\n return await sharpFn(image)\n .resize({ width: maxDimension, height: maxDimension, fit: \"inside\" })\n .png()\n .toBuffer();\n } catch {\n return image;\n }\n}\n\nasync function applyPreprocessing(\n image: Buffer,\n level: PreprocessingLevel,\n maxDimension: number,\n): Promise<Buffer> {\n if (level === PreprocessingLevel.NONE) return image;\n const sharpFn = await loadSharp();\n if (!sharpFn) return image;\n try {\n let img = sharpFn(await downscaleIfNeeded(image, maxDimension, sharpFn))\n .greyscale()\n .normalize();\n if (level === PreprocessingLevel.BASIC) return await img.png().toBuffer();\n img = img.median(3).sharpen({ sigma: 1 });\n if (level === PreprocessingLevel.STANDARD) return await img.png().toBuffer();\n img = img.threshold(128);\n return await img.png().toBuffer();\n } catch {\n return image;\n }\n}\n\nfunction deriveQuality(confidence: number, garbageRatio: number, wordCount: number): OCRQuality {\n if (confidence >= 85 && garbageRatio < 0.1 && wordCount >= 5) return OCRQuality.EXCELLENT;\n if (confidence >= 70 && garbageRatio < 0.2) return OCRQuality.GOOD;\n if (confidence >= 50 && garbageRatio < 0.35) return OCRQuality.ACCEPTABLE;\n return OCRQuality.POOR;\n}\n\nfunction shouldEscalate(result: OCRResult): boolean {\n return result.confidence < 55 || result.wordCount < 10 || Number(result.metadata.garbageRatio ?? 0) > 0.35;\n}\n\nasync function estimateImageQuality(imageBytes: Buffer): Promise<number> {\n const sharpFn = await loadSharp();\n if (!sharpFn) return 0.5;\n try {\n const meta = await sharpFn(imageBytes).metadata();\n const stats = await sharpFn(imageBytes).greyscale().stats();\n const ch = stats.channels?.[0];\n const stdev = ch?.stdev ?? 0;\n const range = ((ch?.max ?? 0) - (ch?.min ?? 0)) / 255;\n const contrastScore = Math.min(1, stdev / 80);\n const resolutionScore = Math.min(1, Math.min(meta.width ?? 0, meta.height ?? 0) / 1000);\n const blurScore = Math.min(1, stdev / 40);\n return blurScore * 0.35 + contrastScore * 0.3 + range * 0.2 + resolutionScore * 0.15;\n } catch {\n return 0.5;\n }\n}\n\nasync function performOcr(\n imageBytes: Buffer,\n config: Required<Pick<OCRConfig, \"language\" | \"preprocessing\" | \"maxRetries\" | \"maxImageDimension\">> &\n OCRConfig,\n preprocessingOverride?: PreprocessingLevel,\n): Promise<OCRResult> {\n const tess = await requireTesseract();\n const preprocessingLevel = preprocessingOverride ?? config.preprocessing ?? PreprocessingLevel.STANDARD;\n const image = await applyPreprocessing(imageBytes, preprocessingLevel, config.maxImageDimension ?? 3000);\n const psm = config.psm ?? 3;\n const oem = config.oem ?? undefined;\n const language = config.language ?? \"mixed\";\n\n let worker: TessWorker | null = null;\n try {\n const initialLang = language === \"auto\" ? \"eng\" : (LANG_CODE_MAP[language] ?? language);\n worker = await tess.createWorker(initialLang, oem);\n await worker.setParameters({ tessedit_pageseg_mode: String(psm) });\n\n const script = language === \"auto\" ? await detectScript(worker, image) : null;\n const candidates = languageCandidates(language, script);\n\n let best: RunResult | null = null;\n for (const langCode of candidates) {\n if (langCode !== initialLang) {\n await worker.terminate();\n worker = await tess.createWorker(langCode, oem);\n await worker.setParameters({ tessedit_pageseg_mode: String(psm) });\n }\n const result = await runSingleLanguage(worker, image);\n if (!result) continue;\n if (!best || result.confidence > best.confidence) best = result;\n if (best.confidence >= TRIAL_EARLY_EXIT_CONFIDENCE) break;\n }\n\n if (!best) {\n return {\n text: \"\",\n confidence: 0,\n quality: OCRQuality.POOR,\n wordCount: 0,\n languageDetected: null,\n preprocessingApplied: preprocessingLevel,\n warnings: [],\n metadata: { garbageRatio: 1 },\n };\n }\n\n let languageDetected: string | null = null;\n if (best.text.trim()) {\n try {\n languageDetected = detectLanguage(best.text, 30);\n } catch {\n /* ignore */\n }\n }\n\n return {\n text: best.text,\n confidence: best.confidence,\n quality: deriveQuality(best.confidence, best.garbageRatio, best.wordCount),\n wordCount: best.wordCount,\n languageDetected,\n preprocessingApplied: preprocessingLevel,\n warnings: [],\n metadata: { garbageRatio: best.garbageRatio },\n };\n } catch (exc) {\n return {\n text: \"\",\n confidence: 0,\n quality: OCRQuality.POOR,\n wordCount: 0,\n languageDetected: null,\n preprocessingApplied: preprocessingLevel,\n warnings: [`OCR failed: ${exc}`],\n metadata: { error: String(exc) },\n };\n } finally {\n try {\n await worker?.terminate();\n } catch {\n /* ignore */\n }\n }\n}\n\nexport async function extractImageTextOcr(\n imageBytes: Buffer,\n config: OCRConfig | null = null,\n): Promise<OCRResult> {\n await requireTesseract();\n const cfg: OCRConfig & {\n language: string;\n preprocessing: PreprocessingLevel;\n maxRetries: number;\n maxImageDimension: number;\n } = {\n language: \"mixed\",\n preprocessing: PreprocessingLevel.STANDARD,\n maxRetries: 1,\n maxImageDimension: 3000,\n ...config,\n };\n\n const qualityScore = await estimateImageQuality(imageBytes);\n const initialLevel =\n cfg.preprocessing !== PreprocessingLevel.NONE\n ? qualityScore > 0.7\n ? PreprocessingLevel.BASIC\n : PreprocessingLevel.STANDARD\n : cfg.preprocessing;\n\n let result = await performOcr(imageBytes, cfg, initialLevel);\n result.metadata.qualityScore = qualityScore;\n result.metadata.retryCount = 0;\n\n if (shouldEscalate(result) && cfg.maxRetries > 0) {\n result = await performOcr(imageBytes, cfg, PreprocessingLevel.AGGRESSIVE);\n result.metadata.escalated = true;\n result.metadata.retryCount = 1;\n result.metadata.qualityScore = qualityScore;\n }\n return result;\n}\n","/**\n * PDF extraction — unpdf for the embedded text layer + page count,\n * then vision or OCR for pages without usable text.\n */\nimport { extractText, getDocumentProxy } from \"unpdf\";\nimport type { LLMConfig } from \"../config.js\";\nimport { ExtraMissingError } from \"../errors.js\";\nimport { emitError, type Hooks } from \"../hooks.js\";\nimport type { Extracted } from \"./index.js\";\nimport { pagesAsMarkdown } from \"./pdf-structure.js\";\n\nconst GARBAGE_SCAN_LIMIT = 20_000;\nconst MIN_USABLE_TEXT_LEN = 50;\n\nfunction isCcControl(ch: string): boolean {\n if (ch === \"\\n\" || ch === \"\\r\" || ch === \"\\t\") return false;\n const cp = ch.codePointAt(0);\n if (cp == null) return false;\n return cp <= 0x1f || (cp >= 0x7f && cp <= 0x9f);\n}\n\n/** True when a PDF text layer is unusable glyph junk rather than real text. */\nexport function embeddedTextIsGarbage(text: string): boolean {\n if (!text?.trim()) return false;\n const sample = text.slice(0, GARBAGE_SCAN_LIMIT);\n\n const notdefChars = (sample.split(\"/.notdef\").length - 1) * \"/.notdef\".length;\n if (notdefChars / sample.length > 0.05) return true;\n\n let control = 0;\n for (const ch of sample) {\n if (isCcControl(ch)) control += 1;\n }\n if (control / sample.length > 0.15) return true;\n\n const replacement = sample.split(\"\\uFFFD\").length - 1;\n if (replacement / sample.length > 0.15) return true;\n\n return false;\n}\n\nexport async function pageCount(content: Buffer): Promise<number> {\n const pdf = await getDocumentProxy(new Uint8Array(content));\n return pdf.numPages;\n}\n\nexport async function embeddedTextPerPage(content: Buffer): Promise<string[]> {\n const { totalPages, text } = await extractText(new Uint8Array(content), { mergePages: false });\n const pages = Array.isArray(text) ? text : [String(text ?? \"\")];\n while (pages.length < totalPages) pages.push(\"\");\n return pages.slice(0, totalPages);\n}\n\ninterface PdfPages {\n total: number;\n texts: Map<number, string>;\n needsOcr: number[];\n}\n\nasync function classifyPages(content: Buffer): Promise<{ pages: PdfPages; structured: boolean }> {\n const total = await pageCount(content);\n const markdownPages = await pagesAsMarkdown(content);\n const rawTexts = markdownPages ?? (await embeddedTextPerPage(content));\n const structured = markdownPages != null;\n\n const texts = new Map<number, string>();\n const needsOcr: number[] = [];\n for (let i = 0; i < total; i++) {\n const text = i < rawTexts.length ? (rawTexts[i] ?? \"\") : \"\";\n if (text.trim().length >= MIN_USABLE_TEXT_LEN && !embeddedTextIsGarbage(text)) {\n texts.set(i, text.trim());\n } else {\n needsOcr.push(i);\n }\n }\n return { pages: { total, texts, needsOcr }, structured: structured && texts.size > 0 };\n}\n\nexport async function extract(\n content: Buffer,\n opts: { visionLlm?: LLMConfig | null; hooks: Hooks },\n): Promise<Extracted> {\n const { Extracted } = await import(\"./index.js\");\n const { pages, structured: structuredMarkdown } = await classifyPages(content);\n const providerTokens: Record<string, number> = {};\n let visionMarkdown = false;\n\n if (pages.needsOcr.length) {\n if (opts.visionLlm) {\n try {\n const vision = await import(\"./vision.js\");\n const [visionTexts, tokens] = await vision.extractPdfPages(content, pages.needsOcr, {\n visionLlm: opts.visionLlm,\n });\n for (const [idx, text] of Object.entries(visionTexts)) {\n pages.texts.set(Number(idx), text);\n }\n visionMarkdown = Object.keys(visionTexts).length > 0;\n for (const [key, val] of Object.entries(tokens)) {\n providerTokens[key] = (providerTokens[key] ?? 0) + val;\n }\n } catch (exc) {\n emitError(opts.hooks, exc, { stage: \"pdf_vision\", pages: pages.needsOcr });\n }\n } else {\n try {\n const ocr = await import(\"./ocr.js\");\n const vision = await import(\"./vision.js\");\n const rendered = await vision.renderPdfPagesAsImages(content, pages.needsOcr);\n for (const [idx, pngBytes] of rendered) {\n const result = await ocr.extractImageTextOcr(pngBytes);\n if (result.text.trim()) pages.texts.set(idx, result.text.trim());\n }\n } catch (exc) {\n if (exc instanceof ExtraMissingError) {\n console.debug(\"OCR extra not installed; skipping OCR fallback for scanned pages\");\n } else {\n emitError(opts.hooks, exc, { stage: \"pdf_ocr\", pages: pages.needsOcr });\n }\n }\n }\n }\n\n const textParts: string[] = [];\n for (let i = 0; i < pages.total; i++) {\n const t = pages.texts.get(i);\n if (t) textParts.push(`--- Page ${i + 1} ---\\n${t}`);\n }\n\n return new Extracted({\n text: textParts.join(\"\\n\\n\"),\n pages: pages.total,\n slides: null,\n mediaOnly: false,\n providerTokens,\n isMarkdown: visionMarkdown || structuredMarkdown,\n });\n}\n\nexport { extract as extractPdf };\n","/**\n * Vision-LLM extraction — images/scanned pages, via `callLlm`.\n *\n * Page rasterization uses unpdf's `renderPageAsImage` (optional canvas).\n * One LLM client is built for the whole document and shared by every batch.\n */\nimport JSZip from \"jszip\";\nimport { extractImages, getDocumentProxy, renderPageAsImage } from \"unpdf\";\nimport type { LLMConfig } from \"../config.js\";\nimport { tryImport } from \"../extras.js\";\nimport { buildLlmClient, callLlm } from \"../providers/llm.js\";\nimport type { Extracted } from \"./index.js\";\nimport { safeJsonParse } from \"./json.js\";\nimport { embeddedTextIsGarbage, embeddedTextPerPage } from \"./pdf.js\";\n\nexport const PAGES_PER_VISION_BATCH = 5;\nexport const VISION_BATCH_ATTEMPTS = 3;\n\nconst VISION_SYSTEM_PROMPT =\n \"You are a precise document transcription engine. You transcribe page images into \" +\n \"clean GitHub-flavored Markdown that preserves tables, headings, and reading order — \" +\n \"verbatim, never summarizing, translating, or inventing content.\";\n\nconst MARKDOWN_RULES =\n \"Transcribe into clean Markdown that PRESERVES structure:\\n\" +\n \"- TABLES: reproduce as GitHub-flavored Markdown tables — one row per line, real column \" +\n \"separators, keep EVERY cell (empty cell for blanks; put a spanning cell's value in its \" +\n \"top-left position). NEVER flatten a table into a sentence.\\n\" +\n \"- HEADINGS/TITLES: mark with #/##/### by visual hierarchy.\\n\" +\n \"- LISTS: use - or 1. as printed.\\n\" +\n \"- FIGURES/CHARTS: add a short italic caption line, e.g. *Figure: bar chart of ...*.\\n\" +\n \"- Follow natural reading order (multi-column pages: finish the left column, then the right).\\n\" +\n \"- Transcribe VERBATIM — every word, number, label, caption. Do not summarize, translate, or invent.\";\n\nfunction pagesPrompt(nImages: number): string {\n return (\n `${MARKDOWN_RULES}\\n\\n` +\n 'Return JSON: {\"pages\": [{\"page\": 1, \"text\": \"<markdown for this page>\"}]}\\n' +\n `Return exactly ${nImages} page entries numbered 1 to ${nImages} ` +\n \"in the order the images are given — IGNORE any page numbers printed on the pages.\"\n );\n}\n\nexport function coercePagesResult(\n parsed: unknown,\n): [Record<string, unknown>, Array<{ page: number; text: string }>] {\n let base: Record<string, unknown>;\n let rawPages: unknown[];\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n base = parsed as Record<string, unknown>;\n rawPages = (Array.isArray(base.pages) ? base.pages : []) as unknown[];\n } else if (Array.isArray(parsed)) {\n base = {};\n rawPages = parsed;\n } else {\n return [{}, []];\n }\n const pages: Array<{ page: number; text: string }> = [];\n for (let i = 0; i < rawPages.length; i++) {\n const entry = rawPages[i];\n if (entry && typeof entry === \"object\" && !Array.isArray(entry)) {\n const rec = entry as { page?: unknown; text?: unknown };\n pages.push({\n page: typeof rec.page === \"number\" ? rec.page : i + 1,\n text: typeof rec.text === \"string\" ? rec.text : \"\",\n });\n } else if (typeof entry === \"string\") {\n pages.push({ page: i + 1, text: entry });\n }\n }\n return [base, pages];\n}\n\nexport function assignBatchPages(\n pages: Array<{ page: number; text: string }>,\n nImages: number,\n): Record<number, string> {\n const assigned: Record<number, string> = {};\n if (pages.length === nImages) {\n for (let i = 0; i < pages.length; i++) assigned[i] = pages[i]!.text;\n return assigned;\n }\n for (const p of pages) {\n if (Number.isInteger(p.page) && p.page >= 1 && p.page <= nImages) {\n assigned[p.page - 1] = p.text;\n }\n }\n return assigned;\n}\n\nfunction parsePagesResponse(\n rawText: string,\n): [Record<string, unknown>, Array<{ page: number; text: string }>] {\n try {\n return coercePagesResult(safeJsonParse(rawText, \"object\"));\n } catch {\n return coercePagesResult(safeJsonParse(rawText, \"array\"));\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nclass Semaphore {\n private n: number;\n private readonly waiters: Array<() => void> = [];\n constructor(max: number) {\n this.n = max;\n }\n async acquire(): Promise<void> {\n if (this.n > 0) {\n this.n -= 1;\n return;\n }\n await new Promise<void>((resolve) => this.waiters.push(resolve));\n }\n release(): void {\n const next = this.waiters.shift();\n if (next) next();\n else this.n += 1;\n }\n}\n\nexport async function extractTextFromImages(\n images: Buffer[],\n opts: { visionLlm: LLMConfig; maxConcurrent?: number },\n): Promise<[string[], Record<string, number>]> {\n if (!images.length) return [[], {}];\n\n const maxConcurrent = opts.maxConcurrent ?? 8;\n const batches: Buffer[][] = [];\n for (let i = 0; i < images.length; i += PAGES_PER_VISION_BATCH) {\n batches.push(images.slice(i, i + PAGES_PER_VISION_BATCH));\n }\n const results = Array.from({ length: images.length }, () => \"\");\n const tokensTotal = { input: 0, output: 0 };\n const semaphore = new Semaphore(maxConcurrent);\n let lock: Promise<void> = Promise.resolve();\n const withLock = async (fn: () => void) => {\n const prev = lock;\n let release!: () => void;\n lock = new Promise<void>((r) => {\n release = r;\n });\n await prev;\n try {\n fn();\n } finally {\n release();\n }\n };\n\n const client = buildLlmClient(opts.visionLlm);\n\n const processBatch = async (batchIdx: number, batchImages: Buffer[]) => {\n await semaphore.acquire();\n try {\n const nImages = batchImages.length;\n const prompt = pagesPrompt(nImages);\n for (let attempt = 1; attempt <= VISION_BATCH_ATTEMPTS; attempt++) {\n try {\n const [rawText, usage] = await callLlm(opts.visionLlm, {\n system: VISION_SYSTEM_PROMPT,\n user: prompt,\n jsonMode: true,\n images: batchImages,\n client,\n });\n if (!rawText?.trim()) throw new Error(\"empty vision response\");\n const [, pages] = parsePagesResponse(rawText);\n const assigned = assignBatchPages(pages, nImages);\n await withLock(() => {\n for (const [localIdx, pageText] of Object.entries(assigned)) {\n const globalIdx = batchIdx * PAGES_PER_VISION_BATCH + Number(localIdx);\n if (globalIdx >= 0 && globalIdx < results.length) results[globalIdx] = pageText;\n }\n tokensTotal.input += usage.input ?? 0;\n tokensTotal.output += usage.output ?? 0;\n });\n return;\n } catch (exc) {\n if (attempt < VISION_BATCH_ATTEMPTS) {\n console.warn(`[vision] batch ${batchIdx} attempt ${attempt} failed: ${exc} — retrying`);\n await sleep(2000 * attempt);\n } else {\n console.error(\n `[vision] batch ${batchIdx} failed after ${VISION_BATCH_ATTEMPTS} attempts: ${exc}`,\n );\n }\n }\n }\n } finally {\n semaphore.release();\n }\n };\n\n try {\n await Promise.all(batches.map((b, i) => processBatch(i, b)));\n } finally {\n await client.aclose();\n }\n return [results, tokensTotal];\n}\n\nexport async function extractPdfPages(\n content: Buffer,\n pageIndices: number[],\n opts: { visionLlm: LLMConfig },\n): Promise<[Record<number, string>, Record<string, number>]> {\n const rendered = await renderPdfPagesAsImages(content, pageIndices);\n const images = rendered.map(([, png]) => png);\n const [texts, tokens] = await extractTextFromImages(images, { visionLlm: opts.visionLlm });\n const pageTexts: Record<number, string> = {};\n for (let i = 0; i < rendered.length; i++) {\n const text = texts[i];\n if (text?.trim()) pageTexts[rendered[i]![0]] = text;\n }\n return [pageTexts, tokens];\n}\n\nexport async function renderPdfPagesAsImages(\n content: Buffer,\n pageIndices: number[],\n dpi = 150,\n): Promise<Array<[number, Buffer]>> {\n const scale = dpi / 72;\n const data = new Uint8Array(content);\n const pdf = await getDocumentProxy(data);\n const results: Array<[number, Buffer]> = [];\n const canvasImport = await tryImport<unknown>(\"@napi-rs/canvas\");\n for (const idx of pageIndices) {\n if (idx < 0 || idx >= pdf.numPages) continue;\n try {\n const buf = await renderPageAsImage(pdf, idx + 1, {\n canvasImport: canvasImport ? async () => canvasImport as never : undefined,\n scale,\n });\n const bytes = buf instanceof ArrayBuffer ? new Uint8Array(buf) : new Uint8Array(buf as Uint8Array);\n results.push([idx, Buffer.from(bytes)]);\n } catch (exc) {\n console.warn(`[vision] failed to render PDF page ${idx}:`, exc);\n }\n }\n return results;\n}\n\nexport async function detectPdfVisionPages(content: Buffer): Promise<number[]> {\n const embeddedTexts = await embeddedTextPerPage(content);\n const pdf = await getDocumentProxy(new Uint8Array(content));\n const visionPages: number[] = [];\n for (let i = 0; i < pdf.numPages; i++) {\n let nImages = 0;\n try {\n const imgs = await extractImages(pdf, i + 1);\n nImages = imgs.length;\n } catch {\n nImages = 0;\n }\n const embedded = (embeddedTexts[i] ?? \"\").trim();\n const lowText = embedded.length < 50 || embeddedTextIsGarbage(embedded);\n if (nImages > 0 || lowText) visionPages.push(i);\n }\n return visionPages;\n}\n\nexport async function extractDocxImages(\n content: Buffer,\n): Promise<Array<{ index: number; imageBytes: Buffer; contentType: string }>> {\n const zip = await JSZip.loadAsync(content);\n const rels = zip.file(\"word/_rels/document.xml.rels\");\n if (!rels) return [];\n const xml = await rels.async(\"string\");\n const images: Array<{ index: number; imageBytes: Buffer; contentType: string }> = [];\n const re = /Type=\"[^\"]*image[^\"]*\"[^>]*Target=\"([^\"]+)\"|Target=\"([^\"]+)\"[^>]*Type=\"[^\"]*image[^\"]*\"/gi;\n let idx = 0;\n for (const m of xml.matchAll(re)) {\n const target = m[1] || m[2];\n if (!target) continue;\n const path = target.replace(/^\\//, \"\").replace(/^\\.\\//, \"\");\n const file = zip.file(`word/${path}`) ?? zip.file(path);\n if (!file) continue;\n try {\n const buf = Buffer.from(await file.async(\"uint8array\"));\n const ext = path.split(\".\").pop()?.toLowerCase() ?? \"png\";\n const contentType =\n ext === \"jpg\" || ext === \"jpeg\" ? \"image/jpeg\" : ext === \"gif\" ? \"image/gif\" : \"image/png\";\n images.push({ index: idx, imageBytes: buf, contentType });\n idx += 1;\n } catch (exc) {\n console.warn(\"[vision] failed to extract DOCX image:\", exc);\n }\n }\n return images;\n}\n\nexport async function extractPptxImages(\n content: Buffer,\n): Promise<Array<{ slide: number; imageBytes: Buffer; contentType: string }>> {\n const zip = await JSZip.loadAsync(content);\n const slideNames = Object.keys(zip.files)\n .filter((n) => /^ppt\\/slides\\/slide\\d+\\.xml$/.test(n))\n .sort((a, b) => {\n const na = Number(/slide(\\d+)/.exec(a)?.[1] ?? 0);\n const nb = Number(/slide(\\d+)/.exec(b)?.[1] ?? 0);\n return na - nb;\n });\n const images: Array<{ slide: number; imageBytes: Buffer; contentType: string }> = [];\n for (const name of slideNames) {\n const slideNum = Number(/slide(\\d+)/.exec(name)?.[1] ?? 0);\n const relsName = name.replace(/slides\\/(slide\\d+\\.xml)$/, \"slides/_rels/$1.rels\");\n const relsFile = zip.file(relsName);\n if (!relsFile) continue;\n const xml = await relsFile.async(\"string\");\n const re = /Type=\"[^\"]*image[^\"]*\"[^>]*Target=\"([^\"]+)\"|Target=\"([^\"]+)\"[^>]*Type=\"[^\"]*image[^\"]*\"/gi;\n for (const m of xml.matchAll(re)) {\n const target = m[1] || m[2];\n if (!target) continue;\n const path = target.replace(/^\\.\\.\\//, \"ppt/\").replace(/^\\.\\//, \"\");\n const file = zip.file(path) ?? zip.file(`ppt/${target.replace(/^(\\.\\.\\/)+/, \"\")}`);\n if (!file) continue;\n try {\n const buf = Buffer.from(await file.async(\"uint8array\"));\n const ext = path.split(\".\").pop()?.toLowerCase() ?? \"png\";\n const contentType =\n ext === \"jpg\" || ext === \"jpeg\" ? \"image/jpeg\" : ext === \"gif\" ? \"image/gif\" : \"image/png\";\n images.push({ slide: slideNum, imageBytes: buf, contentType });\n } catch {\n /* PICTURE-typed shape with no embedded blob */\n }\n }\n }\n return images;\n}\n\nexport async function extractImage(content: Buffer, opts: { visionLlm: LLMConfig }): Promise<Extracted> {\n const { Extracted } = await import(\"./index.js\");\n const [rawText, usage] = await callLlm(opts.visionLlm, {\n system: VISION_SYSTEM_PROMPT,\n user: `${MARKDOWN_RULES}\\n\\nTranscribe this single image. Return the Markdown only.`,\n images: [content],\n });\n const text = (rawText || \"\").trim();\n return new Extracted({\n text,\n pages: null,\n slides: null,\n mediaOnly: !text,\n providerTokens: usage ?? {},\n isMarkdown: Boolean(text),\n });\n}\n","/**\n * File -> text extraction. `extract()` is the single public entry point.\n *\n * Never throws for extraction failures internal to a single file — those are\n * reported via `hooks.onError` and degrade to whatever partial text was recovered.\n */\nimport type { LLMConfig } from \"../config.js\";\nimport { emitError, type Hooks } from \"../hooks.js\";\nimport * as files from \"./files.js\";\n\nconst IMAGE_EXTS = new Set([\".png\", \".jpg\", \".jpeg\", \".gif\", \".bmp\", \".tiff\", \".tif\", \".webp\"]);\n\nexport class Extracted {\n text: string;\n pages: number | null;\n slides: number | null;\n mediaOnly: boolean;\n providerTokens: Record<string, number>;\n llmPictures: number;\n isMarkdown: boolean;\n\n constructor(init: {\n text: string;\n pages?: number | null;\n slides?: number | null;\n mediaOnly?: boolean;\n providerTokens?: Record<string, number>;\n llmPictures?: number;\n isMarkdown?: boolean;\n }) {\n this.text = init.text;\n this.pages = init.pages ?? null;\n this.slides = init.slides ?? null;\n this.mediaOnly = init.mediaOnly ?? false;\n this.providerTokens = init.providerTokens ?? {};\n this.llmPictures = init.llmPictures ?? 0;\n this.isMarkdown = init.isMarkdown ?? false;\n }\n}\n\nfunction isPdf(ext: string, mime: string): boolean {\n return ext === \".pdf\" || mime === \"application/pdf\";\n}\n\nfunction isImage(ext: string, mime: string): boolean {\n return mime.startsWith(\"image/\") || IMAGE_EXTS.has(ext);\n}\n\nasync function extractEmbeddedImagesText(\n images: Array<{ imageBytes: Buffer }>,\n visionLlm: LLMConfig,\n hooks: Hooks,\n): Promise<[string[], Record<string, number>]> {\n if (!images.length) return [[], {}];\n try {\n const vision = await import(\"./vision.js\");\n return await vision.extractTextFromImages(\n images.map((img) => img.imageBytes),\n { visionLlm },\n );\n } catch (exc) {\n emitError(hooks, exc, { stage: \"embedded_image_vision\" });\n return [[], {}];\n }\n}\n\n/**\n * Extract text from `content` (raw file bytes). Never throws for per-file\n * extraction failures — those go through `hooks.onError` and degrade.\n */\nexport async function extract(\n content: Buffer,\n filename: string,\n mime: string | null,\n opts: { visionLlm?: LLMConfig | null; hooks: Hooks },\n): Promise<Extracted> {\n const m = mime || \"\";\n const ext = files.getFileExtension(filename);\n const visionLlm = opts.visionLlm ?? null;\n const hooks = opts.hooks;\n\n try {\n if (files.isNonIngestibleMedia(filename, m)) {\n return new Extracted({ text: \"\", mediaOnly: true });\n }\n\n if (isPdf(ext, m)) {\n const pdf = await import(\"./pdf.js\");\n return await pdf.extract(content, { visionLlm, hooks });\n }\n\n if (isImage(ext, m)) {\n if (!visionLlm) return new Extracted({ text: \"\", mediaOnly: true });\n try {\n const vision = await import(\"./vision.js\");\n return await vision.extractImage(content, { visionLlm });\n } catch (exc) {\n emitError(hooks, exc, { stage: \"image_vision\", filename });\n return new Extracted({ text: \"\", mediaOnly: true });\n }\n }\n\n if (ext === \".docx\" || m === files.DOCX_MIME) {\n const text = await files.extractDocxText(content);\n let providerTokens: Record<string, number> = {};\n let llmPictures = 0;\n let combined = text;\n if (visionLlm) {\n const vision = await import(\"./vision.js\");\n const images = await vision.extractDocxImages(content);\n const [texts, tokens] = await extractEmbeddedImagesText(images, visionLlm, hooks);\n for (let i = 0; i < texts.length; i++) {\n const imgText = texts[i];\n if (imgText) {\n combined += `\\n[Image ${i + 1}]\\n${imgText}`;\n llmPictures += 1;\n }\n }\n providerTokens = tokens;\n }\n return new Extracted({\n text: combined,\n pages: await files.countDocxPages(content),\n providerTokens,\n llmPictures,\n });\n }\n\n if (ext === \".pptx\" || m === files.PPTX_MIME) {\n const text = await files.extractPptxText(content);\n let providerTokens: Record<string, number> = {};\n let llmPictures = 0;\n let combined = text;\n if (visionLlm) {\n const vision = await import(\"./vision.js\");\n const images = await vision.extractPptxImages(content);\n const [texts, tokens] = await extractEmbeddedImagesText(images, visionLlm, hooks);\n for (let i = 0; i < texts.length; i++) {\n const imgText = texts[i];\n if (imgText) {\n const slideNum = images[i]?.slide ?? i + 1;\n combined += `\\n[Slide ${slideNum} Image]\\n${imgText}`;\n llmPictures += 1;\n }\n }\n providerTokens = tokens;\n }\n return new Extracted({\n text: combined,\n slides: await files.countPptxSlides(content),\n providerTokens,\n llmPictures,\n });\n }\n\n if (ext === \".xlsx\" || m === files.XLSX_MIME) {\n return new Extracted({ text: await files.extractXlsxText(content) });\n }\n\n if (ext === \".tsv\" || m === \"text/tab-separated-values\") {\n return new Extracted({ text: files.extractCsvText(content, \"\\t\") });\n }\n\n if (ext === \".csv\" || m === \"text/csv\") {\n return new Extracted({ text: files.extractCsvText(content) });\n }\n\n if (ext === \".html\" || ext === \".htm\" || m === \"text/html\") {\n return new Extracted({ text: files.extractHtmlText(content) });\n }\n\n if (ext === \".eml\" || m === \"message/rfc822\") {\n return new Extracted({ text: await files.extractEmlText(content) });\n }\n\n return new Extracted({ text: content.toString(\"utf8\") });\n } catch (exc) {\n emitError(hooks, exc, { stage: \"extract\", filename });\n return new Extracted({ text: content.toString(\"utf8\") });\n }\n}\n","export type UsageKind = \"ingest\" | \"search\" | \"tool\";\n\nexport interface UsageEvent {\n kind: UsageKind;\n units: number;\n detail?: Record<string, unknown>;\n providerTokens?: Record<string, number>;\n}\n\nexport interface DocumentReport {\n documentId: string;\n name: string;\n status: string;\n pages: number | null;\n chunks: number;\n units: number;\n graphUnits: number;\n providerTokens: Record<string, number>;\n error: string | null;\n redactionFailed: string[];\n}\n\nexport interface IngestReport {\n documents: DocumentReport[];\n totals: {\n files: number;\n failed: number;\n units: number;\n graphUnits: number;\n [key: string]: number;\n };\n}\n\nconst PPTX_MIMES = new Set([\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n \"application/vnd.ms-powerpoint\",\n]);\nconst DOCX_MIMES = new Set([\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n \"application/msword\",\n]);\n\nexport function unitsForFile(\n mime: string,\n opts: { pages: number | null; slides: number | null; sizeBytes: number },\n): number {\n const m = mime || \"\";\n if (m === \"application/pdf\") return Math.max(1, opts.pages ?? 0);\n if (PPTX_MIMES.has(m)) return Math.max(1, opts.slides ?? 0);\n if (DOCX_MIMES.has(m)) return Math.max(1, opts.pages ?? 0);\n if (m.startsWith(\"image/\")) return 1;\n return Math.max(1, Math.ceil(opts.sizeBytes / (1024 * 1024)));\n}\n\nexport function graphUnits(chunkCount: number, primaryCommunityCount: number): number {\n return Math.ceil(chunkCount / 8) + primaryCommunityCount;\n}\n","import { createRequire } from \"node:module\";\nimport { ExtraMissingError } from \"../../errors.js\";\n\nconst require = createRequire(import.meta.url);\n\nexport const MAX_ROWS = 1000;\nconst CONNECT_TIMEOUT = 10;\nconst QUERY_TIMEOUT_MS = 30_000;\n\nconst ALWAYS_BLOCKED = [\"GRANT\", \"REVOKE\"] as const;\nconst READONLY_BLOCKED = [\"INSERT\", \"UPDATE\", \"DELETE\", \"DROP\", \"ALTER\", \"CREATE\", \"TRUNCATE\"] as const;\nconst READWRITE_BLOCKED = [\"DELETE\", \"DROP\", \"TRUNCATE\"] as const;\nconst ALLOWED_ACCESS_MODES = [\"readonly\", \"readwrite\", \"full\"] as const;\ntype AccessMode = (typeof ALLOWED_ACCESS_MODES)[number];\n\nconst SQL_NOISE_RE = /'(?:[^']|'')*'|\\$([A-Za-z_]\\w*)?\\$.*?\\$\\1?\\$|--[^\\n]*|\\/\\*[\\s\\S]*?\\*\\//g;\n\nexport function stripSqlNoise(sql: string): string {\n return sql.replace(SQL_NOISE_RE, (m) => \" \".repeat(m.length));\n}\n\nfunction hasKeyword(sqlUpper: string, keyword: string): boolean {\n return new RegExp(`\\\\b${keyword}\\\\b`).test(sqlUpper);\n}\n\nexport function buildConnectionUrl(config: Record<string, unknown>): string {\n const engine = String(config.engine ?? \"postgresql\");\n if (engine === \"sqlite\") return `sqlite:///${config.database ?? \"\"}`;\n\n const host = String(config.host ?? \"localhost\");\n const port = Number(config.port ?? 5432);\n const database = String(config.database ?? \"\");\n const username = String(config.username ?? \"\");\n const password = encodeURIComponent(String(config.password ?? \"\"));\n\n if (engine === \"oracle\") {\n const serviceName = String(config.service_name ?? database);\n return `oracle://${username}:${password}@${host}:${port}/?service_name=${serviceName}`;\n }\n if (engine === \"snowflake\") {\n const schemaName = String(config.schema_name ?? \"PUBLIC\");\n const warehouse = String(config.warehouse ?? \"\");\n let url = `snowflake://${username}:${password}@${host}/${database}/${schemaName}`;\n if (warehouse) url += `?warehouse=${warehouse}`;\n return url;\n }\n if (engine === \"clickhouse\") {\n const secure = [9440, 8443, 443].includes(port);\n return `clickhouse://${username}:${password}@${host}:${port}/${database}${secure ? \"?secure=True\" : \"\"}`;\n }\n if (engine === \"mysql\" || engine === \"mariadb\") {\n return `mysql://${username}:${password}@${host}:${port}/${database}`;\n }\n if (engine === \"mssql\") {\n return `mssql://${username}:${password}@${host}:${port}/${database}`;\n }\n return `postgresql://${username}:${password}@${host}:${port}/${database}`;\n}\n\nfunction rowsToText(rows: Array<Record<string, unknown>>): string {\n if (!rows.length) return \"\";\n const columns = Object.keys(rows[0]!);\n const lines = [columns.join(\"\\t\")];\n for (const row of rows) {\n lines.push(columns.map((col) => String(row[col] ?? \"\")).join(\"\\t\"));\n }\n return lines.join(\"\\n\");\n}\n\ntype QueryResult = {\n columns: string[];\n rows: Array<Record<string, unknown>>;\n rowCount: number;\n};\n\nasync function runOnPostgres(\n config: Record<string, unknown>,\n sql: string,\n maxRows: number,\n readOnly = false,\n): Promise<QueryResult> {\n let pg: typeof import(\"pg\");\n try {\n pg = require(\"pg\") as typeof import(\"pg\");\n } catch {\n throw new ExtraMissingError(\"postgres\", \"pg\", \"database tool executor\");\n }\n const url = buildConnectionUrl({ ...config, engine: \"postgresql\" });\n const client = new pg.Client({\n connectionString: url,\n connectionTimeoutMillis: CONNECT_TIMEOUT * 1000,\n statement_timeout: QUERY_TIMEOUT_MS,\n });\n await client.connect();\n try {\n await client.query(\"BEGIN\");\n if (readOnly) {\n try {\n await client.query(\"SET TRANSACTION READ ONLY\");\n } catch (exc) {\n await client.query(\"ROLLBACK\");\n console.warn(\n \"[context-engine] db executor: engine rejected SET TRANSACTION READ ONLY; \" +\n \"read-only mode is enforced by statement inspection alone for this query\",\n exc,\n );\n await client.query(\"BEGIN\");\n }\n }\n const result = await client.query(sql);\n await client.query(\"COMMIT\");\n const columns = result.fields?.map((f) => f.name) ?? (result.rows[0] ? Object.keys(result.rows[0]) : []);\n const rows = result.rows.slice(0, maxRows).map((r) => ({ ...r }));\n return { columns, rows, rowCount: result.rowCount ?? rows.length };\n } catch (e) {\n try {\n await client.query(\"ROLLBACK\");\n } catch {\n /* ignore */\n }\n throw e;\n } finally {\n await client.end();\n }\n}\n\nasync function runOnMysql(\n config: Record<string, unknown>,\n sql: string,\n maxRows: number,\n): Promise<QueryResult> {\n let mysql: {\n createConnection: (opts: Record<string, unknown>) => Promise<{\n query: (sql: string) => Promise<[unknown[], { name: string }[]]>;\n end: () => Promise<void>;\n }>;\n };\n try {\n mysql = require(\"mysql2/promise\");\n } catch {\n throw new ExtraMissingError(\"mysql\", \"mysql2\", \"MySQL/MariaDB tool executor\");\n }\n const conn = await mysql.createConnection({\n host: config.host ?? \"localhost\",\n port: Number(config.port ?? 3306),\n user: config.username ?? \"\",\n password: config.password ?? \"\",\n database: config.database ?? \"\",\n connectTimeout: CONNECT_TIMEOUT * 1000,\n });\n try {\n const [rows, fields] = await conn.query(sql);\n const list = Array.isArray(rows) ? (rows as Array<Record<string, unknown>>) : [];\n const columns = (fields ?? []).map((f) => f.name);\n return { columns, rows: list.slice(0, maxRows), rowCount: list.length };\n } finally {\n await conn.end();\n }\n}\n\nasync function executeRaw(\n config: Record<string, unknown>,\n sql: string,\n maxRows: number,\n readOnly = false,\n): Promise<QueryResult> {\n const engine = String(config.engine ?? \"postgresql\");\n if (engine === \"postgresql\") return runOnPostgres(config, sql, maxRows, readOnly);\n if (engine === \"mysql\" || engine === \"mariadb\") return runOnMysql(config, sql, maxRows);\n throw new Error(\n `db executor: engine ${JSON.stringify(engine)} is not supported in the JS port ` +\n `(supported: postgresql, mysql, mariadb)`,\n );\n}\n\nexport function executeQuery(\n config: Record<string, unknown>,\n sql: string,\n maxRows: number = MAX_ROWS,\n accessMode: string = \"readonly\",\n): Promise<Record<string, unknown>> {\n return executeQueryAsync(config, sql, maxRows, accessMode);\n}\n\nasync function executeQueryAsync(\n config: Record<string, unknown>,\n sql: string,\n maxRows: number,\n accessModeRaw: string,\n): Promise<Record<string, unknown>> {\n const accessMode = (accessModeRaw || \"readonly\") as AccessMode;\n if (!(ALLOWED_ACCESS_MODES as readonly string[]).includes(accessMode)) {\n throw new Error(\n `Invalid access_mode ${JSON.stringify(accessModeRaw)}; must be one of ${ALLOWED_ACCESS_MODES}`,\n );\n }\n\n const sqlUpper = stripSqlNoise(sql).trim().toUpperCase();\n\n for (const keyword of ALWAYS_BLOCKED) {\n if (hasKeyword(sqlUpper, keyword)) {\n return { success: false, error: `${keyword} queries are not allowed` };\n }\n }\n\n if (accessMode === \"readonly\") {\n if (!sqlUpper.startsWith(\"SELECT\") && !sqlUpper.startsWith(\"WITH\")) {\n return { success: false, error: \"Only SELECT queries are allowed in read-only mode\" };\n }\n for (const keyword of READONLY_BLOCKED) {\n if (hasKeyword(sqlUpper, keyword)) {\n return { success: false, error: `${keyword} queries are not allowed in read-only mode` };\n }\n }\n } else if (accessMode === \"readwrite\") {\n for (const keyword of READWRITE_BLOCKED) {\n if (hasKeyword(sqlUpper, keyword)) {\n return { success: false, error: `${keyword} queries are not allowed in read-write mode` };\n }\n }\n }\n\n try {\n const result = await executeRaw(config, sql, maxRows, accessMode === \"readonly\");\n\n if (!sqlUpper.startsWith(\"SELECT\") && !sqlUpper.startsWith(\"WITH\")) {\n return {\n success: true,\n columns: [],\n rows: [],\n row_count: result.rowCount,\n affected_rows: result.rowCount,\n truncated: false,\n };\n }\n\n return {\n success: true,\n columns: result.columns,\n rows: result.rows,\n row_count: result.rows.length,\n truncated: result.rows.length >= maxRows,\n text: rowsToText(result.rows),\n };\n } catch (e) {\n return { success: false, error: String(e) };\n }\n}\n\nexport async function executeDb(\n config: Record<string, unknown>,\n sql: string,\n): Promise<Record<string, unknown>> {\n const maxRows = Number(config.max_rows ?? MAX_ROWS);\n const accessMode = String(config.access_mode ?? \"readonly\");\n return executeQueryAsync(config, sql, maxRows, accessMode);\n}\n\nexport async function testConnection(config: Record<string, unknown>): Promise<Record<string, unknown>> {\n const engineType = String(config.engine ?? \"postgresql\");\n const versionQueries: Record<string, string> = {\n postgresql: \"SELECT version()\",\n mysql: \"SELECT version()\",\n mariadb: \"SELECT version()\",\n mssql: \"SELECT @@VERSION\",\n sqlite: \"SELECT sqlite_version()\",\n oracle: \"SELECT banner FROM v$version WHERE ROWNUM = 1\",\n clickhouse: \"SELECT version()\",\n snowflake: \"SELECT CURRENT_VERSION()\",\n };\n const q = versionQueries[engineType] ?? \"SELECT version()\";\n const result = await executeQueryAsync(config, q, 1, \"readonly\");\n if (!result.success) return { success: false, error: result.error };\n const version = (result.rows as Array<Record<string, unknown>>)?.[0]\n ? Object.values((result.rows as Array<Record<string, unknown>>)[0]!)[0]\n : null;\n return {\n success: true,\n version: String(version),\n host: config.host,\n database: config.database,\n engine: engineType,\n };\n}\n\nexport async function fetchSchema(\n config: Record<string, unknown>,\n selectedTables?: string[] | null,\n): Promise<Record<string, unknown>> {\n const engine = String(config.engine ?? \"postgresql\");\n if (engine !== \"postgresql\") {\n return { success: false, error: `schema introspection is implemented for postgresql (got ${engine})` };\n }\n let pg: typeof import(\"pg\");\n try {\n pg = require(\"pg\") as typeof import(\"pg\");\n } catch {\n throw new ExtraMissingError(\"postgres\", \"pg\", \"database tool executor\");\n }\n const client = new pg.Client({ connectionString: buildConnectionUrl(config) });\n await client.connect();\n try {\n const schemaName = String(config.schema_name ?? \"public\");\n const tablesRes = await client.query(\n `SELECT table_name, table_type FROM information_schema.tables WHERE table_schema = $1`,\n [schemaName],\n );\n let items = tablesRes.rows.map((r) => ({\n name: String(r.table_name),\n type: String(r.table_type).toLowerCase().includes(\"view\") ? \"view\" : \"table\",\n }));\n if (selectedTables?.length) {\n const selected = new Set(selectedTables);\n items = items.filter((i) => selected.has(i.name));\n }\n const tables = [];\n for (const item of items) {\n const cols = await client.query(\n `SELECT column_name, data_type, is_nullable FROM information_schema.columns\n WHERE table_schema = $1 AND table_name = $2 ORDER BY ordinal_position`,\n [schemaName, item.name],\n );\n tables.push({\n name: item.name,\n type: item.type,\n columns: cols.rows.map((c) => ({\n name: c.column_name,\n type: c.data_type,\n nullable: c.is_nullable === \"YES\",\n })),\n row_count: 0,\n });\n }\n return {\n success: true,\n database: config.database,\n schema: schemaName,\n tables,\n table_count: tables.length,\n all_tables: items.map((i) => i.name),\n };\n } finally {\n await client.end();\n }\n}\n\nexport async function getSchemaText(\n config: Record<string, unknown>,\n selectedTables?: string[] | null,\n): Promise<string> {\n const schema = await fetchSchema(config, selectedTables);\n const schemaRows: Array<Record<string, unknown>> = [];\n for (const table of (schema.tables as Array<Record<string, unknown>> | undefined) ?? []) {\n const kind = table.type ?? \"table\";\n for (const c of (table.columns as Array<Record<string, unknown>>) ?? []) {\n schemaRows.push({\n table: table.name,\n table_type: kind,\n column: c.name,\n type: String(c.type).toUpperCase(),\n pk: c.pk ?? false,\n fk: c.fk ?? \"\",\n rows: table.row_count,\n });\n }\n }\n return rowsToText(schemaRows);\n}\n","import { randomUUID } from \"node:crypto\";\nimport { jsonrepair } from \"jsonrepair\";\nimport type { Pool } from \"pg\";\nimport type { ContextEngineConfig } from \"../config.js\";\nimport { requireExtra } from \"../extras.js\";\nimport { emitError, type Hooks } from \"../hooks.js\";\nimport type { Embedder } from \"../providers/embeddings.js\";\n\nexport const MAX_HIERARCHY_LEVELS = 3;\nexport const MIN_COMMUNITY_SIZE = 3;\nexport const MAX_SUMMARY_ENTITIES = 30;\nexport const LOUVAIN_SEED = 42;\nconst SUMMARY_SYSTEM = \"You are a knowledge graph analyst. Be factual.\";\n\nfunction mulberry32(seed: number): () => number {\n let a = seed >>> 0;\n return () => {\n a |= 0;\n a = (a + 0x6d2b79f5) | 0;\n let t = Math.imul(a ^ (a >>> 15), 1 | a);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\ntype GraphLike = {\n addNode: (n: string) => void;\n addEdge: (a: string, b: string, attrs?: Record<string, unknown>) => void;\n hasEdge: (a: string, b: string) => boolean;\n getEdgeAttribute: (a: string, b: string, k: string) => unknown;\n setEdgeAttribute: (a: string, b: string, k: string, v: unknown) => void;\n};\n\nexport function partitionGraph(\n G: GraphLike,\n louvain: (g: unknown, o: { resolution?: number; rng?: () => number }) => Record<string, number>,\n opts: { maxLevels?: number; minSize?: number; seed?: number } = {},\n): Array<{ level: number; members: string[] }> {\n const maxLevels = opts.maxLevels ?? MAX_HIERARCHY_LEVELS;\n const minSize = opts.minSize ?? MIN_COMMUNITY_SIZE;\n const seed = opts.seed ?? LOUVAIN_SEED;\n const communities: Array<{ level: number; members: string[] }> = [];\n const seen = new Set<string>();\n for (let level = 0; level < maxLevels; level++) {\n const resolution = 1.0 / (level + 1);\n const assignment = louvain(G, { resolution, rng: mulberry32(seed + level) });\n const buckets = new Map<number, string[]>();\n for (const [node, cid] of Object.entries(assignment)) {\n const list = buckets.get(cid) ?? [];\n list.push(node);\n buckets.set(cid, list);\n }\n const kept = [...buckets.values()].filter((m) => m.length >= minSize).map((m) => [...m].sort());\n const key = JSON.stringify([...kept].map((m) => [...m].sort()).sort());\n if (seen.has(key)) continue;\n seen.add(key);\n for (const members of kept) communities.push({ level, members });\n }\n return communities;\n}\n\nasync function loadLouvain(): Promise<(g: unknown, o: unknown) => Record<string, number>> {\n const mod = await requireExtra<{ default?: unknown }>(\n \"graphology-communities-louvain\",\n \"graph\",\n \"community detection\",\n );\n const fn = mod.default ?? mod;\n return fn as (g: unknown, o: unknown) => Record<string, number>;\n}\n\nasync function detectWithPython(pool: Pool): Promise<Array<{ level: number; entity_ids: string[] }>> {\n const entities = (await pool.query(`SELECT id FROM context_engine_entities`)).rows;\n if (entities.length < MIN_COMMUNITY_SIZE) return [];\n const entityMap = new Map<string, number>();\n const entityIds: string[] = [];\n entities.forEach((e, i) => {\n entityMap.set(String(e.id), i);\n entityIds.push(String(e.id));\n });\n const relationships = (\n await pool.query(`SELECT source_entity_id, target_entity_id FROM context_engine_entity_relationships`)\n ).rows;\n\n const graphology = await requireExtra<{ default?: new (o: { type: string }) => GraphLike }>(\n \"graphology\",\n \"graph\",\n \"community detection\",\n );\n const Graph = graphology.default;\n if (!Graph) throw new Error(\"graphology export shape is unexpected\");\n const louvain = await loadLouvain();\n\n const G = new Graph({ type: \"undirected\" });\n for (let i = 0; i < entities.length; i++) G.addNode(String(i));\n let hasEdge = false;\n for (const rel of relationships) {\n const src = entityMap.get(String(rel.source_entity_id));\n const tgt = entityMap.get(String(rel.target_entity_id));\n if (src != null && tgt != null && src !== tgt) {\n hasEdge = true;\n const a = String(src);\n const b = String(tgt);\n if (G.hasEdge(a, b)) {\n const w = Number(G.getEdgeAttribute(a, b, \"weight\") ?? 1);\n G.setEdgeAttribute(a, b, \"weight\", w + 1);\n } else {\n G.addEdge(a, b, { weight: 1 });\n }\n }\n }\n if (!hasEdge) return [];\n const partitions = partitionGraph(G as never, louvain);\n return partitions.map((p) => ({\n level: p.level,\n entity_ids: p.members.map((idx) => entityIds[Number(idx)]!),\n }));\n}\n\nasync function summarizeCommunities(\n pending: Array<Record<string, unknown>>,\n config: ContextEngineConfig,\n): Promise<Array<string | null>> {\n if (!pending.length || !config.graph.extractionLlm) return pending.map(() => null);\n const blocks = pending.map((pc, idx) => {\n const entityList = ((pc.entities as Array<Record<string, unknown>>) ?? []).slice(0, MAX_SUMMARY_ENTITIES);\n const entityLines = entityList.map((e) => ` - ${e.name} (${e.type}, mentioned ${e.frequency}x)`);\n const idToName = Object.fromEntries(entityList.map((e) => [String(e.id), e.name]));\n const relLines = ((pc.relationships as Array<Record<string, unknown>>) ?? []).map(\n (r) =>\n ` - ${idToName[String(r.source_entity_id)] ?? \"?\"} -> ${r.label} -> ${idToName[String(r.target_entity_id)] ?? \"?\"}`,\n );\n return (\n `COMMUNITY ${idx}:\\nEntities (${entityList.length}):\\n` +\n entityLines.join(\"\\n\") +\n `\\nRelationships (${relLines.length}):\\n` +\n (relLines.length ? relLines.join(\"\\n\") : \" None\")\n );\n });\n const prompt =\n \"Summarize each community below in 2-4 sentences.\\n\\n\" +\n blocks.join(\"\\n\\n\") +\n '\\n\\nReturn a JSON array with one summary string per community, in order: [\"summary 0\", \"summary 1\", ...]. Return ONLY the JSON array.';\n try {\n const { callLlm } = await import(\"../providers/llm.js\");\n const out = await callLlm(config.graph.extractionLlm, {\n system: SUMMARY_SYSTEM,\n user: prompt,\n jsonMode: true,\n });\n const raw = Array.isArray(out) ? out[0] : ((out as { text?: string }).text ?? String(out));\n let summaries: unknown[] = [];\n try {\n summaries = JSON.parse(jsonrepair(String(raw)));\n } catch {\n summaries = [];\n }\n if (!Array.isArray(summaries)) summaries = [];\n while (summaries.length < pending.length) summaries.push(null);\n return summaries.slice(0, pending.length).map((s) => (typeof s === \"string\" && s.trim() ? s : null));\n } catch (exc) {\n console.warn(\"community summarization failed:\", exc);\n return pending.map(() => null);\n }\n}\n\nexport async function detectCommunities(opts: {\n config: ContextEngineConfig;\n pool: Pool;\n embedder: Embedder;\n hooks?: Hooks | null;\n}): Promise<Record<string, unknown>> {\n const stats = { communities_detected: 0, communities_summarized: 0, primary_communities: 0 };\n const communities = await detectWithPython(opts.pool);\n stats.communities_detected = communities.length;\n const pending: Array<Record<string, unknown>> = [];\n for (const comm of communities) {\n const entityIds = comm.entity_ids;\n if (entityIds.length < MIN_COMMUNITY_SIZE) continue;\n const entities = (\n await opts.pool.query(`SELECT * FROM context_engine_entities WHERE id = ANY($1::uuid[])`, [entityIds])\n ).rows;\n if (entities.length < MIN_COMMUNITY_SIZE) continue;\n const rels = (\n await opts.pool.query(\n `SELECT * FROM context_engine_entity_relationships\n WHERE source_entity_id = ANY($1::uuid[]) AND target_entity_id = ANY($1::uuid[])\n LIMIT 50`,\n [entityIds],\n )\n ).rows;\n pending.push({\n entities,\n entity_ids: entityIds,\n entity_count: entityIds.length,\n rel_count: rels.length,\n relationships: rels,\n level: comm.level ?? 0,\n });\n }\n if (!pending.length) return stats;\n const summaries = await summarizeCommunities(pending, opts.config);\n const embeddings: Array<number[] | null> = summaries.map(() => null);\n const toEmbed = summaries\n .map((s, i) => [i, s] as const)\n .filter((x): x is readonly [number, string] => Boolean(x[1]));\n if (toEmbed.length) {\n try {\n const result = await opts.embedder.embed(\n toEmbed.map(([, s]) => s),\n { kind: \"document\" },\n );\n const vectors = Array.isArray(result)\n ? (result[0] as number[][])\n : ((result as { vectors?: number[][] }).vectors ?? []);\n toEmbed.forEach(([i], idx) => {\n embeddings[i] = vectors[idx] ? [...vectors[idx]!] : null;\n });\n } catch (exc) {\n if (opts.hooks) emitError(opts.hooks, exc, { stage: \"community_embedding\" });\n else console.warn(\"community embedding failed:\", exc);\n }\n }\n\n await opts.pool.query(`DELETE FROM context_engine_communities`);\n let primary = 0;\n for (let i = 0; i < pending.length; i++) {\n const pc = pending[i]!;\n const embedding = embeddings[i];\n await opts.pool.query(\n `INSERT INTO context_engine_communities\n (id, level, entity_ids, entity_count, relationship_count, summary, embedding)\n VALUES ($1, $2, $3::jsonb, $4, $5, $6, $7::vector)`,\n [\n randomUUID(),\n pc.level,\n JSON.stringify((pc.entity_ids as string[]).map(String)),\n pc.entity_count,\n pc.rel_count,\n summaries[i],\n embedding ? `[${embedding.join(\",\")}]` : null,\n ],\n );\n if (pc.level === 0) primary += 1;\n }\n stats.communities_summarized = pending.length;\n stats.primary_communities = primary;\n return stats;\n}\n","import { randomUUID } from \"node:crypto\";\nimport { jsonrepair } from \"jsonrepair\";\nimport type { Pool } from \"pg\";\nimport type { ContextEngineConfig } from \"../config.js\";\nimport type { GraphStore } from \"./neo4j-client.js\";\n\nexport const ENTITY_TYPES = [\n \"PERSON\",\n \"ORG\",\n \"PRODUCT\",\n \"LOCATION\",\n \"REFERENCE\",\n \"TEMPORAL\",\n \"CONCEPT\",\n] as const;\nexport type EntityType = (typeof ENTITY_TYPES)[number];\n\nexport const RELATIONSHIP_CATEGORIES = new Set([\n \"HIERARCHICAL\",\n \"MEMBERSHIP\",\n \"CREATION\",\n \"TEMPORAL\",\n \"SPATIAL\",\n \"REFERENCE\",\n \"FUNCTIONAL\",\n \"QUANTITATIVE\",\n]);\n\nexport const CHUNKS_PER_BATCH = 11;\n\nconst EXTRACTION_SYSTEM = \"You are a STRICT JSON entity and relationship extraction engine.\";\n\nexport function normalizeEntityName(name: string): string {\n return (name || \"\").toLowerCase().trim().replace(/ {2}/g, \" \");\n}\n\nfunction sharedSignificantTokens(a: string, b: string, minLen = 4): boolean {\n const tokensA = new Set(a.split(/\\s+/).filter((t) => t.length >= minLen));\n const tokensB = b.split(/\\s+/).filter((t) => t.length >= minLen);\n return tokensB.some((t) => tokensA.has(t));\n}\n\nfunction buildPrompt(fullText: string): string {\n return `Extract ALL entities and relationships from the following document text.\n\nDOCUMENT TEXT:\n${fullText}\n\nENTITY TYPES: PERSON, ORG, PRODUCT, LOCATION, REFERENCE, TEMPORAL, CONCEPT\n\nRELATIONSHIP CATEGORIES: HIERARCHICAL, MEMBERSHIP, CREATION, TEMPORAL, SPATIAL, REFERENCE, FUNCTIONAL, QUANTITATIVE\n\nOUTPUT FORMAT (STRICT JSON):\n{\n \"entities\": [\n {\"name\": \"exact text\", \"type\": \"PERSON|ORG|PRODUCT|LOCATION|REFERENCE|TEMPORAL|CONCEPT\"}\n ],\n \"relationships\": [\n {\"source\": \"entity name\", \"target\": \"entity name\", \"category\": \"CATEGORY\", \"label\": \"verb\", \"evidence\": \"brief quote\"}\n ]\n}\n\nRULES:\n- Extract EVERY meaningful entity (people, organizations, products, locations, codes, dates, concepts)\n- Choose the MOST SPECIFIC type; only use CONCEPT when no other type fits\n- Be exhaustive but do NOT invent entities not present in the text\n- Deduplicate: each entity appears once\n- Relationships: source/target MUST be entities you extracted; category MUST be one of the 8\n- Return ONLY the JSON object\n`;\n}\n\nfunction safeJsonParse(text: string, expected: \"object\" | \"array\"): unknown {\n const stripped = text.trim();\n try {\n const result = JSON.parse(stripped);\n if (expected === \"object\" && result && typeof result === \"object\" && !Array.isArray(result))\n return result;\n if (expected === \"array\" && Array.isArray(result)) return result;\n } catch {\n /* repair */\n }\n const repaired = JSON.parse(jsonrepair(stripped));\n return repaired;\n}\n\ntype Querier = { query: Pool[\"query\"] };\n\nexport async function resolveEntity(\n db: Querier,\n _name: string,\n normalizedName: string,\n entityType: string,\n): Promise<Record<string, unknown> | null> {\n const exact = await db.query(`SELECT * FROM context_engine_entities WHERE normalized_name = $1 LIMIT 1`, [\n normalizedName,\n ]);\n if (exact.rows[0]) return exact.rows[0];\n\n const trigram = await db.query(\n `SELECT id FROM context_engine_entities\n WHERE similarity(normalized_name, $1) > 0.75\n ORDER BY similarity(normalized_name, $1) DESC LIMIT 1`,\n [normalizedName],\n );\n if (trigram.rows[0]) {\n const row = await db.query(`SELECT * FROM context_engine_entities WHERE id = $1`, [trigram.rows[0].id]);\n return row.rows[0] ?? null;\n }\n\n const typed = await db.query(\n `SELECT id, normalized_name FROM context_engine_entities\n WHERE type = $2 AND similarity(normalized_name, $1) > 0.45\n ORDER BY similarity(normalized_name, $1) DESC LIMIT 5`,\n [normalizedName, entityType],\n );\n for (const row of typed.rows) {\n if (sharedSignificantTokens(normalizedName, String(row.normalized_name))) {\n const full = await db.query(`SELECT * FROM context_engine_entities WHERE id = $1`, [row.id]);\n return full.rows[0] ?? null;\n }\n }\n return null;\n}\n\nasync function extractFromText(\n fullText: string,\n config: ContextEngineConfig,\n): Promise<{\n entities: Array<Record<string, unknown>>;\n relationships: Array<Record<string, unknown>>;\n tokens: Record<string, number>;\n}> {\n try {\n const llm = config.graph.extractionLlm;\n if (!llm) return { entities: [], relationships: [], tokens: {} };\n const { callLlm } = await import(\"../providers/llm.js\");\n const out = await callLlm(llm, {\n system: EXTRACTION_SYSTEM,\n user: buildPrompt(fullText),\n jsonMode: true,\n });\n const raw = Array.isArray(out) ? out[0] : ((out as { text?: string }).text ?? String(out));\n const tokens = (Array.isArray(out) ? out[1] : (out as { tokens?: Record<string, number> }).tokens) ?? {};\n let result: Record<string, unknown> = {};\n try {\n result = (safeJsonParse(String(raw), \"object\") as Record<string, unknown>) ?? {};\n } catch {\n result = {};\n }\n const entities = ((result.entities as unknown[]) ?? []).filter((e): e is Record<string, unknown> =>\n Boolean(e && typeof e === \"object\" && (e as { name?: unknown }).name && (e as { type?: unknown }).type),\n );\n const relationships = ((result.relationships as unknown[]) ?? []).filter(\n (r): r is Record<string, unknown> =>\n Boolean(\n r &&\n typeof r === \"object\" &&\n (r as { source?: unknown }).source &&\n (r as { target?: unknown }).target,\n ),\n );\n return { entities, relationships, tokens: tokens as Record<string, number> };\n } catch (exc) {\n console.error(\"entity extraction LLM call failed:\", exc);\n return { entities: [], relationships: [], tokens: {} };\n }\n}\n\nasync function loadDocumentChunks(pool: Pool, documentId: string): Promise<Array<Record<string, unknown>>> {\n const result = await pool.query(\n `SELECT id, text, idx, source_id, meta_data FROM context_engine_chunks WHERE document_id = $1 ORDER BY idx`,\n [documentId],\n );\n return result.rows.map((c) => ({\n id: c.id,\n text: c.text || \"\",\n text_lower: String(c.text || \"\").toLowerCase(),\n idx: c.idx || 0,\n source_id: c.source_id,\n token_count:\n (c.meta_data as { token_count?: number } | null)?.token_count ??\n Math.floor(String(c.text || \"\").length / 4),\n }));\n}\n\nasync function persistExtraction(\n pool: Pool,\n chunkSnaps: Array<Record<string, unknown>>,\n extracted: { entities: Array<Record<string, unknown>>; relationships: Array<Record<string, unknown>> },\n): Promise<{ entities_created: number; entities_found: number; relationships_created: number }> {\n const stats = { entities_created: 0, entities_found: 0, relationships_created: 0 };\n const byNorm = new Map<string, Record<string, unknown>>();\n const client = await pool.connect();\n try {\n await client.query(\"BEGIN\");\n for (const entityData of extracted.entities) {\n const normalized = normalizeEntityName(String(entityData.name));\n if (!normalized) continue;\n const entityType = String(entityData.type);\n let entity = await resolveEntity(client, String(entityData.name), normalized, entityType);\n if (entity) {\n await client.query(\n `UPDATE context_engine_entities SET frequency = COALESCE(frequency, 1) + 1,\n name = CASE WHEN length($2) > length(name) THEN $2 ELSE name END, updated_at = now()\n WHERE id = $1`,\n [entity.id, entityData.name],\n );\n entity = (await client.query(`SELECT * FROM context_engine_entities WHERE id = $1`, [entity.id]))\n .rows[0];\n } else {\n const id = randomUUID();\n await client.query(\n `INSERT INTO context_engine_entities (id, name, normalized_name, type, frequency)\n VALUES ($1, $2, $3, $4, 1)`,\n [id, entityData.name, normalized, entityType],\n );\n entity = (await client.query(`SELECT * FROM context_engine_entities WHERE id = $1`, [id])).rows[0];\n stats.entities_created += 1;\n }\n byNorm.set(normalized, entity!);\n byNorm.set(String(entity!.normalized_name), entity!);\n const nameLower = String(entityData.name).toLowerCase();\n for (const snap of chunkSnaps) {\n if (nameLower && String(snap.text_lower).includes(nameLower)) {\n const exists = await client.query(\n `SELECT 1 FROM context_engine_chunk_entities WHERE chunk_id = $1 AND entity_id = $2`,\n [snap.id, entity!.id],\n );\n if (!exists.rows.length) {\n await client.query(\n `INSERT INTO context_engine_chunk_entities (chunk_id, entity_id) VALUES ($1, $2)`,\n [snap.id, entity!.id],\n );\n stats.entities_found += 1;\n }\n }\n }\n }\n for (const rel of extracted.relationships) {\n const sourceNorm = normalizeEntityName(String(rel.source ?? \"\"));\n const targetNorm = normalizeEntityName(String(rel.target ?? \"\"));\n const category = String(rel.category ?? \"\").toUpperCase();\n const label = String(rel.label ?? \"\");\n const evidence = String(rel.evidence ?? \"\");\n if (!RELATIONSHIP_CATEGORIES.has(category)) continue;\n let src = byNorm.get(sourceNorm);\n let tgt = byNorm.get(targetNorm);\n if (!src) {\n src = (\n await client.query(`SELECT * FROM context_engine_entities WHERE normalized_name = $1`, [sourceNorm])\n ).rows[0];\n }\n if (!tgt) {\n tgt = (\n await client.query(`SELECT * FROM context_engine_entities WHERE normalized_name = $1`, [targetNorm])\n ).rows[0];\n }\n if (!src || !tgt) continue;\n const exists = await client.query(\n `SELECT 1 FROM context_engine_entity_relationships\n WHERE source_entity_id = $1 AND target_entity_id = $2 AND category = $3 AND label = $4`,\n [src.id, tgt.id, category, label],\n );\n if (!exists.rows.length) {\n await client.query(\n `INSERT INTO context_engine_entity_relationships\n (id, source_entity_id, target_entity_id, category, label, evidence)\n VALUES ($1, $2, $3, $4, $5, $6)`,\n [randomUUID(), src.id, tgt.id, category, label, evidence.slice(0, 200)],\n );\n stats.relationships_created += 1;\n }\n }\n await client.query(\"COMMIT\");\n } catch (e) {\n await client.query(\"ROLLBACK\");\n throw e;\n } finally {\n client.release();\n }\n return stats;\n}\n\nasync function syncToNeo4j(\n pool: Pool,\n documentId: string,\n chunkSnaps: Array<Record<string, unknown>>,\n graphStore: GraphStore,\n): Promise<void> {\n const chunkRows = chunkSnaps.map((s) => ({\n id: String(s.id),\n document_id: String(documentId),\n source_id: s.source_id,\n text_preview: String(s.text).slice(0, 200),\n position: s.idx,\n token_count: s.token_count,\n }));\n try {\n await graphStore.connect();\n const entities = (await pool.query(`SELECT * FROM context_engine_entities`)).rows;\n const entityById = new Map(entities.map((e) => [String(e.id), e]));\n const entityRows = entities.map((e) => ({\n name: e.name,\n normalized_name: e.normalized_name,\n entity_type: e.type,\n }));\n const ids = chunkSnaps.map((s) => s.id);\n const links = ids.length\n ? (\n await pool.query(`SELECT * FROM context_engine_chunk_entities WHERE chunk_id = ANY($1::uuid[])`, [\n ids,\n ])\n ).rows\n : [];\n const mentionRows = links\n .filter((l) => entityById.has(String(l.entity_id)))\n .map((l) => ({\n chunk_id: String(l.chunk_id),\n entity_name: entityById.get(String(l.entity_id))!.normalized_name,\n }));\n const rels = (await pool.query(`SELECT * FROM context_engine_entity_relationships`)).rows;\n const relRows = [];\n for (const r of rels) {\n const src = entityById.get(String(r.source_entity_id));\n const tgt = entityById.get(String(r.target_entity_id));\n if (src && tgt) {\n relRows.push({\n source_name: src.normalized_name,\n target_name: tgt.normalized_name,\n category: r.category,\n label: r.label,\n evidence: r.evidence,\n chunk_id: r.chunk_id ? String(r.chunk_id) : null,\n });\n }\n }\n await graphStore.upsertChunksBatch(chunkRows);\n await graphStore.linkSequentialChunks(String(documentId));\n await graphStore.upsertEntitiesBatch(entityRows);\n await graphStore.linkChunksToEntitiesBatch(mentionRows);\n await graphStore.upsertEntityRelationshipsBatch(relRows);\n } catch (exc) {\n console.warn(\"Neo4j sync failed (continuing on PG mirror):\", exc);\n }\n}\n\nexport async function extractEntitiesForDocument(\n documentId: string,\n opts: {\n config: ContextEngineConfig;\n pool: Pool;\n graphStore?: GraphStore | null;\n hooks?: unknown;\n },\n): Promise<Record<string, unknown>> {\n const chunkSnaps = await loadDocumentChunks(opts.pool, documentId);\n const stats: Record<string, unknown> = {\n chunk_count: chunkSnaps.length,\n entities_created: 0,\n entities_found: 0,\n relationships_created: 0,\n provider_tokens: {},\n };\n if (!chunkSnaps.length) return stats;\n\n const batches = [];\n for (let i = 0; i < chunkSnaps.length; i += CHUNKS_PER_BATCH) {\n batches.push(chunkSnaps.slice(i, i + CHUNKS_PER_BATCH));\n }\n let llmInput = 0;\n let llmOutput = 0;\n for (const batch of batches) {\n const fullText = batch.map((s) => String(s.text)).join(\"\\n\\n\");\n const extracted = await extractFromText(fullText, opts.config);\n llmInput += Number(extracted.tokens.input ?? 0);\n llmOutput += Number(extracted.tokens.output ?? 0);\n const persisted = await persistExtraction(opts.pool, batch, extracted);\n stats.entities_created = Number(stats.entities_created) + persisted.entities_created;\n stats.entities_found = Number(stats.entities_found) + persisted.entities_found;\n stats.relationships_created = Number(stats.relationships_created) + persisted.relationships_created;\n }\n const tokens = stats.provider_tokens as Record<string, number>;\n if (llmInput) tokens.graph_llm_input = llmInput;\n if (llmOutput) tokens.graph_llm_output = llmOutput;\n if (opts.graphStore) await syncToNeo4j(opts.pool, documentId, chunkSnaps, opts.graphStore);\n return stats;\n}\n","const CONSTRAINTS = [\n \"CREATE CONSTRAINT ce_chunk_unique IF NOT EXISTS FOR (c:Chunk) REQUIRE c.id IS UNIQUE\",\n \"CREATE CONSTRAINT ce_entity_unique IF NOT EXISTS FOR (e:Entity) REQUIRE e.normalized_name IS UNIQUE\",\n];\n\nconst INDEXES = [\n \"CREATE INDEX ce_entity_type_idx IF NOT EXISTS FOR (e:Entity) ON (e.type)\",\n \"CREATE INDEX ce_chunk_source_idx IF NOT EXISTS FOR (c:Chunk) ON (c.source_id)\",\n \"CREATE INDEX ce_chunk_docid_idx IF NOT EXISTS FOR (c:Chunk) ON (c.document_id)\",\n];\n\nexport async function ensureSchema(\n driver: {\n session: (opts: { database: string }) => {\n executeWrite?: unknown;\n run?: unknown;\n close: () => Promise<void>;\n };\n },\n database: string,\n): Promise<void> {\n const session = (\n driver as {\n session: (o: { database: string }) => {\n run: (q: string) => Promise<unknown>;\n close: () => Promise<void>;\n };\n }\n ).session({\n database,\n });\n try {\n for (const stmt of [...CONSTRAINTS, ...INDEXES]) {\n try {\n await session.run(stmt);\n } catch (exc) {\n console.error(\"Neo4j schema statement FAILED:\", stmt.split(\" \")[2], exc);\n }\n }\n } finally {\n await session.close();\n }\n}\n","import { createHash } from \"node:crypto\";\nimport type { GraphConfig } from \"../config.js\";\nimport { requireExtra } from \"../extras.js\";\nimport { emitError, type Hooks } from \"../hooks.js\";\nimport { ensureSchema } from \"./schema.js\";\n\nconst SYNC_BATCH_ROWS = 1000;\nconst MAX_EXPANSION = 500;\n\ntype Neo4jDriver = {\n session: (opts: { database: string }) => Neo4jSession;\n close: () => Promise<void>;\n};\ntype Neo4jSession = {\n run: (\n query: string,\n params?: Record<string, unknown>,\n ) => Promise<{ records: Array<{ get: (k: string) => unknown }>; values?: () => Promise<unknown[][]> }>;\n close: () => Promise<void>;\n};\n\nexport class GraphStore {\n cfg: GraphConfig;\n hooks: Hooks | null | undefined;\n database: string;\n driver: Neo4jDriver | null = null;\n private schemaReady = false;\n private cache = new Map<string, { expiresAt: number; value: unknown }>();\n private generation = 0;\n\n constructor(cfg: GraphConfig, opts: { hooks?: Hooks | null } = {}) {\n this.cfg = cfg;\n this.hooks = opts.hooks;\n this.database = cfg.neo4jDatabase;\n }\n\n async connect(): Promise<void> {\n if (this.driver) return;\n const neo4j = await requireExtra<{\n default?: {\n driver: (uri: string, auth: unknown) => Neo4jDriver;\n auth: { basic: (u: string, p: string) => unknown };\n };\n driver?: (uri: string, auth: unknown) => Neo4jDriver;\n auth?: { basic: (u: string, p: string) => unknown };\n }>(\"neo4j-driver\", \"graph\", \"graph features\");\n const ns = neo4j.default ?? neo4j;\n const driverFn = ns.driver;\n const auth = ns.auth;\n if (!driverFn || !auth) throw new Error(\"neo4j-driver export shape is unexpected\");\n const driver = driverFn(this.cfg.neo4jUri!, auth.basic(this.cfg.neo4jUser, this.cfg.neo4jPassword!));\n this.driver = driver;\n if (!this.schemaReady) {\n await ensureSchema(driver, this.database);\n this.schemaReady = true;\n }\n }\n\n async close(): Promise<void> {\n if (this.driver) {\n await this.driver.close();\n this.driver = null;\n this.schemaReady = false;\n }\n }\n\n async ping(timeout = 2000): Promise<boolean> {\n try {\n await this.connect();\n await Promise.race([\n this.pingInternal(),\n new Promise((_, reject) => setTimeout(() => reject(new Error(\"timeout\")), timeout)),\n ]);\n return true;\n } catch (exc) {\n this.report(exc, { service: \"neo4j\", operation: \"ping\" });\n return false;\n }\n }\n\n private async pingInternal(): Promise<void> {\n const session = this.driver!.session({ database: this.database });\n try {\n await session.run(\"RETURN 1 AS ping\");\n } finally {\n await session.close();\n }\n }\n\n private report(exc: unknown, ctx: Record<string, unknown>): void {\n if (this.hooks) emitError(this.hooks, exc, ctx);\n else console.error(\"neo4j error:\", exc, \"| ctx=\", ctx);\n }\n\n private cacheGet(key: string): unknown {\n const entry = this.cache.get(key);\n if (!entry) return null;\n if (entry.expiresAt > Date.now() / 1000) return entry.value;\n this.cache.delete(key);\n return null;\n }\n\n private cacheSet(key: string, value: unknown, ttl = 86400): void {\n this.cache.set(key, { expiresAt: Date.now() / 1000 + ttl, value });\n }\n\n async upsertChunksBatch(rows: Array<Record<string, unknown>>): Promise<number> {\n const query = `\n UNWIND $rows AS row\n MERGE (c:Chunk {id: row.id})\n SET c.document_id = row.document_id,\n c.source_id = row.source_id,\n c.text_preview = row.text_preview,\n c.position = row.position,\n c.token_count = row.token_count,\n c.updated_at = datetime()\n `;\n return this.runBatched(query, rows);\n }\n\n async upsertEntitiesBatch(rows: Array<Record<string, unknown>>): Promise<number> {\n const query = `\n UNWIND $rows AS row\n MERGE (e:Entity {normalized_name: row.normalized_name})\n SET e.name = row.name,\n e.type = row.entity_type,\n e.created_at = coalesce(e.created_at, datetime()),\n e.updated_at = datetime()\n `;\n return this.runBatched(query, rows);\n }\n\n async linkChunksToEntitiesBatch(rows: Array<Record<string, unknown>>): Promise<number> {\n const query = `\n UNWIND $rows AS row\n MATCH (c:Chunk {id: row.chunk_id})\n MATCH (e:Entity {normalized_name: row.entity_name})\n MERGE (c)-[:MENTIONS]->(e)\n `;\n return this.runBatched(query, rows);\n }\n\n async upsertEntityRelationshipsBatch(rows: Array<Record<string, unknown>>): Promise<number> {\n const query = `\n UNWIND $rows AS row\n MATCH (src:Entity {normalized_name: row.source_name})\n MATCH (tgt:Entity {normalized_name: row.target_name})\n MERGE (src)-[r:RELATES_TO {category: row.category, label: row.label}]->(tgt)\n SET r.evidence = row.evidence,\n r.chunk_id = row.chunk_id,\n r.updated_at = datetime()\n `;\n return this.runBatched(query, rows);\n }\n\n async linkSequentialChunks(documentId: string): Promise<void> {\n const query = `\n MATCH (c:Chunk {document_id: $document_id})\n WITH c ORDER BY c.position\n WITH COLLECT(c) AS chunks\n UNWIND RANGE(0, SIZE(chunks)-2) AS i\n WITH chunks[i] AS curr, chunks[i+1] AS next\n MERGE (curr)-[:NEXT]->(next)\n `;\n await this.connect();\n const session = this.driver!.session({ database: this.database });\n try {\n await session.run(query, { document_id: String(documentId) });\n } finally {\n await session.close();\n }\n this.generation += 1;\n }\n\n private async runBatched(query: string, rows: Array<Record<string, unknown>>): Promise<number> {\n if (!rows.length) return 0;\n await this.connect();\n let done = 0;\n const session = this.driver!.session({ database: this.database });\n try {\n for (let i = 0; i < rows.length; i += SYNC_BATCH_ROWS) {\n const batch = rows.slice(i, i + SYNC_BATCH_ROWS);\n await session.run(query, { rows: batch });\n done += batch.length;\n }\n } finally {\n await session.close();\n }\n this.generation += 1;\n return done;\n }\n\n async deleteSourceData(sourceId: string): Promise<{ chunks_deleted: number }> {\n await this.connect();\n const session = this.driver!.session({ database: this.database });\n try {\n const result = await session.run(\n \"MATCH (c:Chunk {source_id: $source_id}) DETACH DELETE c RETURN count(c) AS n\",\n { source_id: String(sourceId) },\n );\n const deleted = Number(result.records[0]?.get(\"n\") ?? 0);\n this.generation += 1;\n return { chunks_deleted: deleted };\n } finally {\n await session.close();\n }\n }\n\n private expansionCacheKey(queryEntities: string[], maxDepth: number, chunkIds: string[]): string {\n const chunkDigest = createHash(\"md5\")\n .update([...chunkIds].sort().join(\",\"))\n .digest(\"hex\");\n const keyContent = `g${this.generation}:${JSON.stringify([...queryEntities].sort())}:${maxDepth}:${chunkDigest}`;\n return `expansion:${createHash(\"md5\").update(keyContent).digest(\"hex\")}`;\n }\n\n async expandChunkSet(chunkIds: string[], queryEntities: string[], maxDepth = 2): Promise<string[]> {\n if (!chunkIds.length) return [];\n const depth = Math.max(1, Math.min(Math.trunc(maxDepth), 5));\n const cacheKey = this.expansionCacheKey(queryEntities, depth, chunkIds);\n const cached = this.cacheGet(cacheKey);\n if (Array.isArray(cached)) return cached as string[];\n\n const query = `\n MATCH (c:Chunk)\n WHERE c.id IN $chunk_ids\n WITH COLLECT(DISTINCT c) AS seeds\n\n CALL {\n WITH seeds\n UNWIND seeds AS c\n OPTIONAL MATCH (c)-[:MENTIONS]->(e:Entity)<-[:MENTIONS]-(related:Chunk)\n WHERE e.normalized_name IN $query_entities\n RETURN COLLECT(DISTINCT related.id) AS related_ids\n }\n CALL {\n WITH seeds\n UNWIND seeds AS c\n OPTIONAL MATCH (c)-[:NEXT*1..${depth}]-(sequential:Chunk)\n RETURN COLLECT(DISTINCT sequential.id) AS sequential_ids\n }\n\n WITH [s IN seeds | s.id] + related_ids + sequential_ids AS all_ids\n UNWIND all_ids AS chunk_id\n WITH chunk_id WHERE chunk_id IS NOT NULL\n RETURN DISTINCT chunk_id\n LIMIT $max_results\n `;\n await this.connect();\n const session = this.driver!.session({ database: this.database });\n try {\n const result = await session.run(query, {\n chunk_ids: chunkIds,\n query_entities: queryEntities,\n max_results: MAX_EXPANSION,\n });\n const expanded = result.records\n .map((r) => r.get(\"chunk_id\"))\n .filter((v) => v != null)\n .map(String);\n if (expanded.length) this.cacheSet(cacheKey, expanded);\n return expanded;\n } finally {\n await session.close();\n }\n }\n\n async getChunkConnectivityScores(chunkIds: string[]): Promise<Record<string, number>> {\n if (!chunkIds.length) return {};\n const query = `\n UNWIND $chunk_ids AS chunk_id\n MATCH (c:Chunk {id: chunk_id})\n OPTIONAL MATCH (c)-[out_next:NEXT]->()\n OPTIONAL MATCH (c)-[out_mentions:MENTIONS]->()\n OPTIONAL MATCH (c)<-[in_next:NEXT]-()\n OPTIONAL MATCH (c)<-[in_mentions:MENTIONS]-()\n WITH c.id AS id,\n count(DISTINCT out_next) + count(DISTINCT out_mentions) AS outgoing,\n count(DISTINCT in_next) + count(DISTINCT in_mentions) AS incoming\n RETURN id, (outgoing + incoming) AS total_connections\n `;\n await this.connect();\n const session = this.driver!.session({ database: this.database });\n try {\n const result = await session.run(query, { chunk_ids: chunkIds });\n const records = result.records.map((r) => ({\n id: String(r.get(\"id\")),\n total_connections: Number(r.get(\"total_connections\")),\n }));\n if (!records.length) return {};\n const maxConnections = Math.max(...records.map((r) => r.total_connections));\n if (maxConnections === 0) {\n return Object.fromEntries(records.map((r) => [r.id, 0.5]));\n }\n return Object.fromEntries(\n records.map((r) => [r.id, Math.min(1.0, r.total_connections / maxConnections)]),\n );\n } finally {\n await session.close();\n }\n }\n}\n","import type { Pool } from \"pg\";\nimport type { ContextEngineConfig } from \"../config.js\";\nimport { emitError, type Hooks } from \"../hooks.js\";\nimport type { Embedder } from \"../providers/embeddings.js\";\nimport type { GraphStore } from \"./neo4j-client.js\";\n\nconst DEFAULT_WEIGHTS = {\n vector_score: 0.3,\n entity_match: 0.3,\n relationship_relevance: 0.2,\n community_match: 0.1,\n graph_connectivity: 0.1,\n};\n\nconst SEED_LIMIT = 200;\nconst ENTITY_LIMIT = 30;\nconst TOP_SEEDS_FOR_ENTITIES = 20;\n\nconst SCOPE = `\n AND ($2::text[] IS NULL OR c.source_id = ANY($2::text[]))\n AND ($3::text[] IS NULL OR c.acl IS NULL OR c.acl && $3::text[])\n`;\n\nfunction vecLiteral(vector: number[]): string {\n return `[${vector.map((x) => Number(x)).join(\",\")}]`;\n}\n\nexport async function corpusIsAclUniform(pool: Pool, sourceIds: string[] | null): Promise<boolean> {\n const result = await pool.query(\n `SELECT EXISTS(SELECT 1 FROM context_engine_chunks c\n WHERE c.acl IS NOT NULL AND ($1::text[] IS NULL OR c.source_id = ANY($1::text[]))) AS has_acl`,\n [sourceIds],\n );\n return !result.rows[0]?.has_acl;\n}\n\nexport async function shouldUseCommunitySummaries(\n pool: Pool,\n opts: { sourceIds: string[] | null; principals: string[] | null },\n): Promise<boolean> {\n if (opts.principals == null) return true;\n return corpusIsAclUniform(pool, opts.sourceIds);\n}\n\nasync function deriveQueryEntities(\n pool: Pool,\n chunkIds: string[],\n opts: { sourceIds: string[] | null; principals: string[] | null },\n): Promise<Array<Record<string, unknown>>> {\n if (!chunkIds.length) return [];\n const result = await pool.query(\n `SELECT e.normalized_name, e.name, e.type, COUNT(*) AS freq\n FROM context_engine_chunk_entities ce\n JOIN context_engine_entities e ON e.id = ce.entity_id\n JOIN context_engine_chunks c ON c.id = ce.chunk_id\n WHERE ce.chunk_id = ANY($1::uuid[]) ${SCOPE}\n GROUP BY e.normalized_name, e.name, e.type\n ORDER BY freq DESC LIMIT $4`,\n [chunkIds, opts.sourceIds, opts.principals, ENTITY_LIMIT],\n );\n return result.rows.map((r) => ({\n normalized_name: r.normalized_name,\n name: r.name,\n type: r.type,\n }));\n}\n\nasync function computeVectorScores(\n pool: Pool,\n chunkIds: string[],\n vector: number[],\n): Promise<Record<string, number>> {\n if (!chunkIds.length || !vector) return {};\n const result = await pool.query(\n `SELECT c.id::text, 1 - (c.embedding <=> CAST($2 AS vector))::float AS sim\n FROM context_engine_chunks c\n WHERE c.id = ANY($1::uuid[]) AND c.embedding IS NOT NULL`,\n [chunkIds, vecLiteral(vector)],\n );\n let scores = Object.fromEntries(result.rows.map((r) => [String(r.id), Number(r.sim)]));\n const vs = Object.values(scores);\n if (vs.length) {\n const lo = Math.min(...vs);\n const hi = Math.max(...vs);\n if (hi > lo)\n scores = Object.fromEntries(Object.entries(scores).map(([k, v]) => [k, (v - lo) / (hi - lo)]));\n }\n return scores;\n}\n\nasync function computeRelationshipScores(\n pool: Pool,\n chunkIds: string[],\n queryEntityNames: string[],\n): Promise<Record<string, number>> {\n if (!chunkIds.length || !queryEntityNames.length) return {};\n const result = await pool.query(\n `SELECT r.chunk_id::text, COUNT(*) AS n\n FROM context_engine_entity_relationships r\n JOIN context_engine_entities se ON se.id = r.source_entity_id\n JOIN context_engine_entities te ON te.id = r.target_entity_id\n WHERE r.chunk_id = ANY($1::uuid[])\n AND (se.normalized_name = ANY($2::text[]) OR te.normalized_name = ANY($2::text[]))\n GROUP BY r.chunk_id`,\n [chunkIds, queryEntityNames],\n );\n const counts = Object.fromEntries(result.rows.map((r) => [String(r.chunk_id), Number(r.n)]));\n if (!Object.keys(counts).length) return {};\n const mx = Math.max(...Object.values(counts));\n return mx ? Object.fromEntries(Object.entries(counts).map(([cid, n]) => [cid, n / mx])) : {};\n}\n\nasync function computeCommunityScores(\n pool: Pool,\n chunkIds: string[],\n vector: number[],\n opts: { sourceIds: string[] | null; principals: string[] | null; useSummaries: boolean },\n): Promise<Record<string, number>> {\n if (!opts.useSummaries || !chunkIds.length || !vector) return {};\n const commRows = await pool.query(\n `SELECT entity_ids, 1 - (embedding <=> CAST($1 AS vector))::float AS sim\n FROM context_engine_communities WHERE embedding IS NOT NULL\n ORDER BY embedding <=> CAST($1 AS vector) LIMIT 5`,\n [vecLiteral(vector)],\n );\n if (!commRows.rows.length) return {};\n const entityScore: Record<string, number> = {};\n for (const row of commRows.rows) {\n const sim = Number(row.sim);\n if (sim < 0.15) continue;\n for (const eid of row.entity_ids ?? []) {\n entityScore[String(eid)] = Math.max(entityScore[String(eid)] ?? 0, sim);\n }\n }\n if (!Object.keys(entityScore).length) return {};\n const result = await pool.query(\n `SELECT ce.chunk_id::text, ce.entity_id::text\n FROM context_engine_chunk_entities ce\n JOIN context_engine_chunks c ON c.id = ce.chunk_id\n WHERE ce.chunk_id = ANY($1::uuid[]) AND ce.entity_id = ANY($4::uuid[]) ${SCOPE}`,\n [chunkIds, opts.sourceIds, opts.principals, Object.keys(entityScore)],\n );\n const chunkScores: Record<string, number> = {};\n for (const row of result.rows) {\n chunkScores[row.chunk_id] = Math.max(chunkScores[row.chunk_id] ?? 0, entityScore[row.entity_id] ?? 0);\n }\n return chunkScores;\n}\n\nasync function vectorSeedIds(\n pool: Pool,\n vector: number[],\n opts: { sourceIds: string[] | null; principals: string[] | null },\n): Promise<string[]> {\n const result = await pool.query(\n `SELECT c.id::text FROM context_engine_chunks c\n WHERE c.embedding IS NOT NULL ${SCOPE}\n ORDER BY c.embedding <=> CAST($1 AS vector) LIMIT $4`,\n [vecLiteral(vector), opts.sourceIds, opts.principals, SEED_LIMIT],\n );\n return result.rows.map((r) => String(r.id));\n}\n\nexport async function buildGraphRanked(\n query: string,\n opts: {\n config: ContextEngineConfig;\n pool: Pool;\n embedder: Embedder;\n graphStore: GraphStore;\n hooks?: Hooks | null;\n sourceIds?: string[] | null;\n principals?: string[] | null;\n maxDepth?: number;\n },\n): Promise<string[]> {\n try {\n const result = await opts.embedder.embed([query], { kind: \"query\" });\n const vectors = Array.isArray(result)\n ? (result[0] as number[][])\n : ((result as { vectors?: number[][] }).vectors ?? []);\n const vector = vectors[0] ? [...vectors[0]] : null;\n if (!vector) return [];\n const sourceIds = opts.sourceIds ?? null;\n const principals = opts.principals ?? null;\n const seeds = await vectorSeedIds(opts.pool, vector, { sourceIds, principals });\n if (!seeds.length) return [];\n const queryEntities = await deriveQueryEntities(opts.pool, seeds.slice(0, TOP_SEEDS_FOR_ENTITIES), {\n sourceIds,\n principals,\n });\n const entityNorms = queryEntities.map((e) => String(e.normalized_name));\n\n let expanded: string[] = seeds;\n let connectivity: Record<string, number> = {};\n try {\n await opts.graphStore.connect();\n expanded = await opts.graphStore.expandChunkSet(seeds, entityNorms, opts.maxDepth ?? 2);\n connectivity = await opts.graphStore.getChunkConnectivityScores(expanded.length ? expanded : seeds);\n } catch (exc) {\n if (opts.hooks) emitError(opts.hooks, exc, { stage: \"graph_expand\" });\n else console.warn(\"graph leg: expansion failed:\", exc);\n expanded = seeds;\n connectivity = {};\n }\n const allIds = expanded.length ? expanded : seeds;\n const useSummaries = await shouldUseCommunitySummaries(opts.pool, { sourceIds, principals });\n const vecScores = await computeVectorScores(opts.pool, allIds, vector);\n const relScores = await computeRelationshipScores(opts.pool, allIds, entityNorms);\n const commScores = await computeCommunityScores(opts.pool, allIds, vector, {\n sourceIds,\n principals,\n useSummaries,\n });\n const textRows = await opts.pool.query(\n `SELECT id::text, lower(coalesce(text,'')) AS t FROM context_engine_chunks WHERE id = ANY($1::uuid[])`,\n [allIds],\n );\n const texts = Object.fromEntries(textRows.rows.map((r) => [String(r.id), String(r.t)]));\n const weights = {\n ...DEFAULT_WEIGHTS,\n ...((\n opts.config.graph as {\n rerankWeights?: Record<string, number>;\n rerank_weights?: Record<string, number>;\n }\n ).rerankWeights ??\n (opts.config.graph as { rerank_weights?: Record<string, number> }).rerank_weights ??\n {}),\n };\n const entityNameSet = new Set(entityNorms);\n const scored: Array<[string, number]> = [];\n for (const cidRaw of allIds) {\n const cid = String(cidRaw);\n if (!(cid in texts)) continue;\n const v = vecScores[cid] ?? 0.5;\n const chunkText = texts[cid] ?? \"\";\n const matches = [...entityNameSet].filter((n) => n && chunkText.includes(n)).length;\n const e = entityNameSet.size ? Math.min(1.0, matches / Math.max(1, entityNameSet.size)) : 0;\n const r = relScores[cid] ?? 0;\n const cm = commScores[cid] ?? 0;\n const gc = connectivity[cid] ?? 0.5;\n const final =\n v * weights.vector_score +\n e * weights.entity_match +\n r * weights.relationship_relevance +\n cm * weights.community_match +\n gc * weights.graph_connectivity;\n scored.push([cid, final]);\n }\n scored.sort((a, b) => b[1] - a[1]);\n return scored.map(([cid]) => cid);\n } catch (exc) {\n if (opts.hooks) emitError(opts.hooks, exc, { stage: \"graph_embed_query\" });\n else console.warn(\"graph leg: query embed failed:\", exc);\n return [];\n }\n}\n","import type { Pool } from \"pg\";\nimport type { ContextEngineConfig } from \"../config.js\";\nimport type { Hooks } from \"../hooks.js\";\nimport type { Embedder } from \"../providers/embeddings.js\";\nimport { graphUnits } from \"../usage.js\";\nimport { detectCommunities } from \"./communities.js\";\nimport { extractEntitiesForDocument } from \"./entities.js\";\nimport type { GraphStore } from \"./neo4j-client.js\";\n\nexport async function runGraphStage(opts: {\n documentId: string;\n config: ContextEngineConfig;\n hooks?: Hooks | null;\n pool: Pool;\n embedder: Embedder;\n graphStore: GraphStore;\n chunks?: unknown;\n}): Promise<number> {\n const entStats = await extractEntitiesForDocument(opts.documentId, {\n config: opts.config,\n pool: opts.pool,\n graphStore: opts.graphStore,\n hooks: opts.hooks,\n });\n const commStats = await detectCommunities({\n config: opts.config,\n pool: opts.pool,\n embedder: opts.embedder,\n hooks: opts.hooks,\n });\n const chunkCount = Number(entStats.chunk_count ?? 0);\n const primary = Number(commStats.primary_communities ?? 0);\n return graphUnits(chunkCount, primary);\n}\n","import type { GraphConfig } from \"../config.js\";\nimport { requireExtra } from \"../extras.js\";\nimport type { Hooks } from \"../hooks.js\";\nimport type { GraphStore } from \"./neo4j-client.js\";\n\nexport async function requireGraph(): Promise<void> {\n await requireExtra(\"neo4j-driver\", \"graph\", \"graph features\");\n}\n\nexport const _requireGraph = requireGraph;\n\nexport async function buildGraphStore(\n cfg: GraphConfig,\n opts: { hooks?: Hooks | null } = {},\n): Promise<GraphStore> {\n await requireGraph();\n const { GraphStore } = await import(\"./neo4j-client.js\");\n return new GraphStore(cfg, opts);\n}\n\nexport async function runGraphStage(\n ...args: Parameters<typeof import(\"./stage.js\").runGraphStage>\n): Promise<number> {\n await requireGraph();\n const { runGraphStage: impl } = await import(\"./stage.js\");\n return impl(...args);\n}\n\nexport async function buildGraphRanked(\n ...args: Parameters<typeof import(\"./retrieval.js\").buildGraphRanked>\n): Promise<string[]> {\n await requireGraph();\n const { buildGraphRanked: impl } = await import(\"./retrieval.js\");\n return impl(...args);\n}\n\nexport { detectCommunities, MAX_HIERARCHY_LEVELS } from \"./communities.js\";\nexport { CHUNKS_PER_BATCH, ENTITY_TYPES, normalizeEntityName, resolveEntity } from \"./entities.js\";\nexport { GraphStore } from \"./neo4j-client.js\";\nexport { corpusIsAclUniform, shouldUseCommunitySummaries } from \"./retrieval.js\";\n","import { createHash } from \"node:crypto\";\nimport { closeSync, openSync, readSync } from \"node:fs\";\nimport { detectLanguage, jaccardSim, splitSentences, tokenize } from \"./text.js\";\n\nexport { detectLanguage };\n\nexport const MAX_CHUNK_CHARS = 6000;\n\nconst PAGE_MARKER_RE = /^---\\s*Page\\s+(\\d+)\\s*---$/gm;\nconst PAGE_MARKER_STRIP_RE = /---\\s*Page\\s+\\d+\\s*---\\n?/g;\nconst SHEET_MARKER_RE = /^\\[Sheet:\\s*(.+?)\\]\\s*$/;\nconst HEADING_OR_BULLET_RE = /^\\s*([#*\\-•]|\\d+[.)])\\s+/;\n\nconst PRINTABLE = new Set(\n \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!\\\"#$%&'()*+,-./:;<=>?@[\\\\]^_`{|}~ \\t\\n\\r\\v\\f\",\n);\n\nconst log = {\n warn: (...args: unknown[]) => console.warn(\"[context-engine]\", ...args),\n debug: (...args: unknown[]) => console.debug(\"[context-engine]\", ...args),\n};\n\nexport function normalizeText(s: string | null | undefined): string {\n return (s ?? \"\")\n .split(/\\s+/)\n .filter((p) => p.length > 0)\n .join(\" \");\n}\n\nexport function sha256Bytes(s: string): Buffer {\n return createHash(\"sha256\").update(normalizeText(s), \"utf8\").digest();\n}\n\nexport function calculateContentHash(\n opts: { docBytes?: Buffer | null; fullText?: string | null; filePath?: string | null } = {},\n): string | null {\n const { docBytes = null, fullText = null, filePath = null } = opts;\n if (filePath) {\n const h = createHash(\"md5\");\n const fd = openSync(filePath, \"r\");\n try {\n const buf = Buffer.alloc(8192);\n let n = readSync(fd, buf, 0, 8192, null);\n while (n > 0) {\n h.update(buf.subarray(0, n));\n n = readSync(fd, buf, 0, 8192, null);\n }\n } finally {\n closeSync(fd);\n }\n return h.digest(\"hex\");\n }\n if (docBytes) return createHash(\"md5\").update(docBytes).digest(\"hex\");\n if (fullText) return createHash(\"md5\").update(fullText, \"utf8\").digest(\"hex\");\n return null;\n}\n\nexport function sanitizeText(text: string): string {\n if (!text) return text;\n text = text.replaceAll(\"\\x00\", \"\");\n const allowedControl = new Set([\"\\n\", \"\\r\", \"\\t\"]);\n let out = \"\";\n for (const c of text) {\n if (allowedControl.has(c) || PRINTABLE.has(c) || c.codePointAt(0)! >= 32) out += c;\n }\n return out;\n}\n\nexport function normLine(s: string): string {\n s = (s || \"\").replace(/\\s+/g, \" \").trim();\n s = s.replace(/\\s*,\\s*/g, \", \");\n return s;\n}\n\nexport function dedupLines(text: string, minLen = 24): string {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const raw of (text || \"\").split(/\\r\\n|\\n|\\r/)) {\n const line = normLine(raw);\n if (!line) continue;\n if (line.length >= minLen) {\n const h = createHash(\"sha1\").update(line, \"utf8\").digest(\"hex\");\n if (seen.has(h)) continue;\n seen.add(h);\n }\n out.push(line);\n }\n return out.join(\"\\n\");\n}\n\nexport function looksMostlyBoilerplate(_text: string): boolean {\n return false;\n}\n\nexport function inferMime(\n content: string | null | undefined,\n filename: string | null | undefined,\n): string | null {\n if (filename) {\n const fn = filename.toLowerCase();\n if (fn.endsWith(\".csv\")) return \"text/csv\";\n if (fn.endsWith(\".json\")) return \"application/json\";\n if (fn.endsWith(\".md\") || fn.endsWith(\".markdown\")) return \"text/markdown\";\n if (fn.endsWith(\".xlsx\") || fn.endsWith(\".xls\")) {\n return \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\";\n }\n if (fn.endsWith(\".doc\")) return \"application/msword\";\n if (fn.endsWith(\".rtf\")) return \"application/rtf\";\n if (fn.endsWith(\".html\") || fn.endsWith(\".htm\")) return \"text/html\";\n if (fn.endsWith(\".ppt\")) return \"application/vnd.ms-powerpoint\";\n if (fn.endsWith(\".eml\")) return \"message/rfc822\";\n if (fn.endsWith(\".msg\")) return \"application/vnd.ms-outlook\";\n if (fn.endsWith(\".odt\")) return \"application/vnd.oasis.opendocument.text\";\n if (fn.endsWith(\".ods\")) return \"application/vnd.oasis.opendocument.spreadsheet\";\n if (fn.endsWith(\".odp\")) return \"application/vnd.oasis.opendocument.presentation\";\n if (fn.endsWith(\".epub\")) return \"application/epub+zip\";\n }\n\n if (content) {\n const trimmed = content.trimStart().slice(0, 500);\n\n if (trimmed.startsWith(\"{\") || trimmed.startsWith(\"[\")) {\n try {\n JSON.parse(content);\n return \"application/json\";\n } catch {\n // not valid JSON\n }\n }\n\n if (\n trimmed.startsWith(\"#\") ||\n trimmed.slice(0, 1000).includes(\"\\n## \") ||\n trimmed.slice(0, 500).includes(\"\\n# \")\n ) {\n return \"text/markdown\";\n }\n\n const lines = trimmed.split(\"\\n\").slice(0, 5);\n if (lines.length >= 2) {\n const commaCounts = lines.filter((line) => line.trim()).map((line) => (line.match(/,/g) || []).length);\n if (commaCounts.length >= 2 && new Set(commaCounts).size === 1 && commaCounts[0]! >= 2) {\n return \"text/csv\";\n }\n }\n }\n\n return null;\n}\n\nexport function isTabularMime(mime: string | null | undefined): boolean {\n if (!mime) return false;\n const m = mime.toLowerCase();\n return [\"csv\", \"sheet\", \"excel\", \"spreadsheetml\", \"tab-separated\"].some((k) => m.includes(k));\n}\n\nexport function isMarkdownMime(mime: string | null | undefined): boolean {\n if (!mime) return false;\n const m = mime.toLowerCase();\n return m.includes(\"markdown\") || m === \"text/md\";\n}\n\nexport function isJsonMime(mime: string | null | undefined): boolean {\n if (!mime) return false;\n return mime.toLowerCase().includes(\"json\");\n}\n\nfunction csvNeedsQuote(field: string): boolean {\n return /[\",\\r\\n]/.test(field);\n}\n\nfunction csvEscapeField(field: string): string {\n if (csvNeedsQuote(field)) return `\"${field.replaceAll('\"', '\"\"')}\"`;\n return field;\n}\n\nfunction csvWrite(rows: string[][]): string {\n return `${rows.map((row) => row.map(csvEscapeField).join(\",\")).join(\"\\r\\n\")}\\r\\n`;\n}\n\nfunction parseCsv(text: string): string[][] {\n const rows: string[][] = [];\n let row: string[] = [];\n let field = \"\";\n let i = 0;\n let inQuotes = false;\n while (i < text.length) {\n const ch = text[i]!;\n if (inQuotes) {\n if (ch === '\"') {\n if (text[i + 1] === '\"') {\n field += '\"';\n i += 2;\n continue;\n }\n inQuotes = false;\n i += 1;\n continue;\n }\n field += ch;\n i += 1;\n continue;\n }\n if (ch === '\"') {\n inQuotes = true;\n i += 1;\n continue;\n }\n if (ch === \",\") {\n row.push(field);\n field = \"\";\n i += 1;\n continue;\n }\n if (ch === \"\\r\") {\n i += 1;\n continue;\n }\n if (ch === \"\\n\") {\n row.push(field);\n rows.push(row);\n row = [];\n field = \"\";\n i += 1;\n continue;\n }\n field += ch;\n i += 1;\n }\n if (inQuotes || field.length > 0 || row.length > 0) {\n row.push(field);\n rows.push(row);\n }\n return rows;\n}\n\nfunction jsonDumps(value: unknown): string {\n return JSON.stringify(value, null, 2).replace(/[\\u007f-\\uffff]/g, (ch) => {\n return `\\\\u${ch.charCodeAt(0).toString(16).padStart(4, \"0\")}`;\n });\n}\n\nexport type ChunkMeta = Record<string, unknown>;\n\nfunction splitSheetBlocks(rawText: string): Array<[string | null, string[]]> {\n const lines = (rawText || \"\").split(/\\r\\n|\\n|\\r/);\n const blocks: Array<[string | null, string[]]> = [];\n let currentTitle: string | null = null;\n let currentLines: string[] = [];\n\n for (const line of lines) {\n const m = SHEET_MARKER_RE.exec(line.trim());\n SHEET_MARKER_RE.lastIndex = 0;\n if (m) {\n if (currentLines.length) {\n blocks.push([currentTitle, currentLines]);\n currentLines = [];\n }\n currentTitle = m[1]!.trim();\n continue;\n }\n if (line.trim()) currentLines.push(line);\n }\n\n if (currentLines.length) blocks.push([currentTitle, currentLines]);\n if (!blocks.length && lines.length) {\n return [[null, lines.filter((ln) => ln.trim())]];\n }\n return blocks;\n}\n\nexport function chunkTabular(text: string, rowsPerChunk = 25): [string[], ChunkMeta[]] | [null, null] {\n try {\n const chunks: string[] = [];\n const chunkMetas: ChunkMeta[] = [];\n\n for (const [sheetTitle, sheetLines] of splitSheetBlocks(text)) {\n if (!sheetLines.length) continue;\n\n const rows = parseCsv(sheetLines.join(\"\\n\"));\n\n if (rows.length <= 1) {\n let chunkText = sheetLines.join(\"\\n\").trim();\n if (chunkText) {\n if (sheetTitle) chunkText = `[Sheet: ${sheetTitle}]\\n${chunkText}`;\n chunks.push(chunkText);\n const meta: ChunkMeta = { rows_range: \"all\" };\n if (sheetTitle) meta.sheet_title = sheetTitle;\n chunkMetas.push(meta);\n }\n continue;\n }\n\n const header = rows[0]!;\n const dataRows = rows.slice(1);\n\n let effectiveRowsPerChunk = rowsPerChunk;\n const numCols = header.length;\n if (numCols > 100) effectiveRowsPerChunk = 5;\n else if (numCols > 40) effectiveRowsPerChunk = 10;\n else if (numCols > 20) effectiveRowsPerChunk = 15;\n\n for (let i = 0; i < dataRows.length; i += effectiveRowsPerChunk) {\n const batch = dataRows.slice(i, i + effectiveRowsPerChunk);\n let chunkText = csvWrite([header, ...batch]).trim();\n if (sheetTitle && chunkText) chunkText = `[Sheet: ${sheetTitle}]\\n${chunkText}`;\n\n if (chunkText.length > MAX_CHUNK_CHARS && batch.length > 1) {\n const half = Math.floor(batch.length / 2);\n const subBatches: Array<[string[][], number]> = [\n [batch.slice(0, half), i],\n [batch.slice(half), i + half],\n ];\n for (const [subBatch, subStart] of subBatches) {\n let subChunk = csvWrite([header, ...subBatch]).trim();\n if (sheetTitle && subChunk) subChunk = `[Sheet: ${sheetTitle}]\\n${subChunk}`;\n if (subChunk) {\n chunks.push(subChunk);\n const meta: ChunkMeta = {\n rows_range: `${subStart + 2}-${subStart + subBatch.length + 1}`,\n total_rows: dataRows.length,\n };\n if (sheetTitle) meta.sheet_title = sheetTitle;\n chunkMetas.push(meta);\n }\n }\n } else if (chunkText) {\n chunks.push(chunkText);\n const meta: ChunkMeta = {\n rows_range: `${i + 2}-${i + batch.length + 1}`,\n total_rows: dataRows.length,\n };\n if (sheetTitle) meta.sheet_title = sheetTitle;\n chunkMetas.push(meta);\n }\n }\n }\n\n return chunks.length ? [chunks, chunkMetas] : [[text], [{ rows_range: \"all\" }]];\n } catch (exc) {\n log.warn(\"CSV parsing failed, falling back to generic chunker:\", exc);\n return [null, null];\n }\n}\n\nexport function chunkMarkdown(text: string): [string[], ChunkMeta[]] | [null, null] {\n if (!text?.trim()) return [[], []];\n\n const lines = text.split(\"\\n\");\n\n let docTitle: string | null = null;\n for (const line of lines) {\n if (line.startsWith(\"# \") && !line.startsWith(\"## \")) {\n docTitle = line.slice(2).trim();\n break;\n }\n }\n\n const chunks: string[] = [];\n const chunkMetas: ChunkMeta[] = [];\n let currentChunkLines: string[] = [];\n let currentH2: string | null = null;\n let titleConsumed = false;\n\n const flushSection = (sectionFallback: string) => {\n if (!currentChunkLines.length) return;\n let prefix = \"\";\n if (docTitle) prefix = `# ${docTitle}\\n`;\n if (currentH2) prefix += `## ${currentH2}\\n`;\n const chunkText = prefix + currentChunkLines.join(\"\\n\").trim();\n\n if (chunkText.length > MAX_CHUNK_CHARS) {\n const subChunks = splitIntoChunks(chunkText);\n for (const sc of subChunks) {\n chunks.push(sc);\n chunkMetas.push({ section_title: currentH2 || docTitle || sectionFallback });\n }\n } else if (chunkText.trim()) {\n chunks.push(chunkText);\n chunkMetas.push({ section_title: currentH2 || docTitle || sectionFallback });\n }\n };\n\n for (const line of lines) {\n if (!titleConsumed && docTitle !== null && line.startsWith(\"# \") && line.slice(2).trim() === docTitle) {\n titleConsumed = true;\n continue;\n }\n if (line.startsWith(\"## \")) {\n flushSection(\"intro\");\n currentH2 = line.slice(3).trim();\n currentChunkLines = [];\n } else {\n currentChunkLines.push(line);\n }\n }\n\n flushSection(\"final\");\n\n const foundH2Headers = lines.some((line) => line.startsWith(\"## \"));\n if (!foundH2Headers || chunks.length === 0) return [null, null];\n return [chunks, chunkMetas];\n}\n\nexport function chunkJson(text: string, itemsPerChunk = 30): [string[], ChunkMeta[]] | [null, null] {\n try {\n if (text.startsWith(\"\\uFEFF\")) text = text.slice(1);\n const data: unknown = JSON.parse(text);\n\n if (Array.isArray(data)) {\n if (data.length <= itemsPerChunk) {\n return [[text], [{ json_path: \"[*]\", item_count: data.length }]];\n }\n\n const chunks: string[] = [];\n const chunkMetas: ChunkMeta[] = [];\n for (let i = 0; i < data.length; i += itemsPerChunk) {\n let batch = data.slice(i, i + itemsPerChunk);\n let chunkText = jsonDumps(batch);\n let actualEnd = i + batch.length;\n\n if (chunkText.length > MAX_CHUNK_CHARS && batch.length > 1) {\n let reducedSize = Math.floor(batch.length / 2);\n while (reducedSize > 0) {\n const smallerBatch = batch.slice(0, reducedSize);\n chunkText = jsonDumps(smallerBatch);\n if (chunkText.length <= MAX_CHUNK_CHARS) {\n batch = smallerBatch;\n actualEnd = i + batch.length;\n break;\n }\n reducedSize = Math.floor(reducedSize / 2);\n }\n }\n\n chunkText = `# Items ${i + 1}-${actualEnd} of ${data.length}\\n${chunkText}`;\n chunks.push(chunkText);\n chunkMetas.push({\n json_path: `[${i}:${actualEnd}]`,\n items_range: `${i + 1}-${actualEnd}`,\n });\n }\n return [chunks, chunkMetas];\n }\n\n if (data !== null && typeof data === \"object\" && !Array.isArray(data)) {\n const obj = data as Record<string, unknown>;\n const keys = Object.keys(obj);\n if (keys.length <= 5) {\n return [[text], [{ json_path: \"{*}\", key_count: keys.length }]];\n }\n\n const chunks: string[] = [];\n const chunkMetas: ChunkMeta[] = [];\n for (const key of keys) {\n const value = obj[key];\n let chunkText = jsonDumps({ [key]: value });\n if (chunkText.length > MAX_CHUNK_CHARS) {\n chunkText = `# Key: ${key} (truncated)\\n${jsonDumps(value).slice(0, MAX_CHUNK_CHARS - 100)}...`;\n }\n chunks.push(chunkText);\n chunkMetas.push({ json_path: `.${key}`, top_level_key: key });\n }\n return [chunks, chunkMetas];\n }\n\n return [[text], [{ json_path: \"\" }]];\n } catch (exc) {\n log.debug(\"JSON parsing failed, falling back to generic chunker:\", exc);\n return [null, null];\n }\n}\n\nexport function assignPageNumbers(text: string, chunks: string[], chunkMetas: ChunkMeta[]): void {\n const pageMap: Array<[number, number]> = [];\n const re = new RegExp(PAGE_MARKER_RE.source, \"gm\");\n for (const m of (text || \"\").matchAll(re)) {\n pageMap.push([m.index, Number(m[1])]);\n }\n if (!pageMap.length || !chunks.length) return;\n\n const lineMarker = /^---\\s*Page\\s+(\\d+)\\s*---$/;\n\n for (let idx = 0; idx < chunks.length; idx++) {\n const chunkText = chunks[idx]!;\n let anchor = \"\";\n for (const line of chunkText.split(\"\\n\")) {\n const stripped = line.trim();\n if (stripped && !lineMarker.test(stripped) && stripped.length > 10) {\n anchor = stripped.slice(0, 60);\n break;\n }\n }\n if (!anchor) anchor = chunkText.trim().slice(0, 60);\n if (!anchor) continue;\n\n const pos = text.indexOf(anchor);\n if (pos < 0) continue;\n\n let lo = 0;\n let hi = pageMap.length - 1;\n let page: number | null = null;\n while (lo <= hi) {\n const mid = (lo + hi) >> 1;\n if (pageMap[mid]![0] <= pos) {\n page = pageMap[mid]![1];\n lo = mid + 1;\n } else {\n hi = mid - 1;\n }\n }\n\n if (page !== null && idx < chunkMetas.length) {\n chunkMetas[idx]!.page = page;\n }\n }\n}\n\nexport function routeToChunker(\n text: string,\n mime: string | null | undefined,\n title: string | null | undefined,\n opts: { isMarkdown?: boolean } = {},\n): [string[], string | null, ChunkMeta[]] {\n const isMarkdown = opts.isMarkdown ?? false;\n const effectiveMime = mime || inferMime(text, title);\n\n let chunks: string[] | null = null;\n let chunkMetas: ChunkMeta[] | null = null;\n\n if (isTabularMime(effectiveMime)) {\n [chunks, chunkMetas] = chunkTabular(text);\n } else if (isJsonMime(effectiveMime)) {\n [chunks, chunkMetas] = chunkJson(text);\n } else if (isMarkdown || isMarkdownMime(effectiveMime)) {\n [chunks, chunkMetas] = chunkMarkdown(text);\n }\n\n if (chunks === null || chunks.length === 0) {\n chunks = splitIntoChunks(text);\n chunkMetas = Array.from({ length: chunks.length }, () => ({}));\n }\n chunkMetas = chunkMetas ?? [];\n\n assignPageNumbers(text, chunks, chunkMetas);\n\n chunks = chunks.map((c) => c.replace(PAGE_MARKER_STRIP_RE, \"\").trim());\n const paired = chunks.map((c, i) => [c, chunkMetas![i]!] as [string, ChunkMeta]).filter(([c]) => c.trim());\n if (paired.length) {\n chunks = paired.map(([c]) => c);\n chunkMetas = paired.map(([, m]) => m);\n } else {\n chunks = [];\n chunkMetas = [];\n }\n\n return [chunks, effectiveMime, chunkMetas];\n}\n\nexport function chunkerName(mime: string | null | undefined): string {\n if (isTabularMime(mime)) return \"tabular\";\n if (isJsonMime(mime)) return \"json\";\n if (isMarkdownMime(mime)) return \"markdown\";\n return \"generic\";\n}\n\ntype TextUnit = [sep: string, text: string, tokens: number];\n\nfunction assembleUnits(unitList: TextUnit[]): string {\n const parts: string[] = [];\n for (let i = 0; i < unitList.length; i++) {\n const [sep, uText] = unitList[i]!;\n if (i > 0) parts.push(sep);\n parts.push(uText);\n }\n return parts.join(\"\").trim();\n}\n\nfunction codePointLength(s: string): number {\n let n = 0;\n for (const _ of s) n += 1;\n return n;\n}\n\nexport function splitIntoChunks(text: string, maxWords = 180, overlap = 18): string[] {\n const units: TextUnit[] = [];\n let pendingBlank = false;\n for (const ln of (text || \"\").split(/\\r\\n|\\n|\\r/)) {\n const stripped = ln.trim();\n if (!stripped) {\n pendingBlank = units.length > 0;\n continue;\n }\n const lineSep = pendingBlank ? \"\\n\\n\" : \"\\n\";\n pendingBlank = false;\n if (HEADING_OR_BULLET_RE.test(ln) || stripped.length <= 120) {\n units.push([lineSep, stripped, tokenize(stripped).length]);\n } else {\n let first = true;\n for (const sent of splitSentences(ln)) {\n const s = sent.trim();\n if (s) {\n units.push([first ? lineSep : \" \", s, tokenize(s).length]);\n first = false;\n }\n }\n }\n }\n\n const normalizedUnits: TextUnit[] = [];\n for (const [uSep, uText, uTokens] of units) {\n if (uTokens <= maxWords) {\n normalizedUnits.push([uSep, uText, uTokens]);\n continue;\n }\n const windowChars = maxWords * 4;\n const uChars = [...uText];\n let pos = 0;\n let pieceSep = uSep;\n while (pos < uChars.length) {\n let pieceChars = uChars.slice(pos, pos + windowChars);\n let piece = pieceChars.join(\"\");\n if (pos + windowChars < uChars.length) {\n const ws = piece.lastIndexOf(\" \");\n if (ws > Math.floor(windowChars / 2)) {\n piece = piece.slice(0, ws);\n pieceChars = [...piece];\n }\n }\n let pieceTokens = tokenize(piece);\n if (pieceTokens.length > maxWords) {\n piece = pieceChars.slice(0, maxWords).join(\"\");\n pieceTokens = tokenize(piece);\n }\n normalizedUnits.push([pieceSep, piece, pieceTokens.length]);\n pos += codePointLength(piece);\n pieceSep = \"\";\n }\n }\n\n if (!normalizedUnits.some(([, , t]) => t)) return [];\n\n const chunks: string[] = [];\n let lastKept: string | null = null;\n let cur: TextUnit[] = [];\n let curTokens = 0;\n\n const flush = () => {\n const chunk = assembleUnits(cur);\n if (chunk && (lastKept === null || jaccardSim(chunk, lastKept) < 0.92)) {\n chunks.push(chunk);\n lastKept = chunk;\n }\n const carried: TextUnit[] = [];\n let carriedTokens = 0;\n for (let i = cur.length - 1; i >= 0; i--) {\n const prev = cur[i]!;\n if (prev[2] === 0 || carriedTokens + prev[2] > overlap) break;\n carried.unshift(prev);\n carriedTokens += prev[2];\n }\n cur = carried;\n curTokens = carriedTokens;\n };\n\n for (const unit of normalizedUnits) {\n if (cur.length && curTokens + unit[2] > maxWords) flush();\n cur.push(unit);\n curTokens += unit[2];\n }\n\n if (cur.length) {\n const chunk = assembleUnits(cur);\n if (chunk && (lastKept === null || jaccardSim(chunk, lastKept) < 0.92)) {\n chunks.push(chunk);\n }\n }\n\n return chunks;\n}\n","/**\n * CPSE action surface — document access, structured query, compute.\n *\n * **ACL/source scoping.** Every read here goes through `scopeDocumentsSql`,\n * the Document-table equivalent of storage's chunk-table predicate:\n * `sourceIds=null` means the whole corpus, a list scopes to it;\n * `principals=null` means a trusted internal caller (no ACL filtering),\n * `principals=[]` means an anonymous caller and matches only `acl IS NULL`\n * documents. Same non-interchangeable pair as `search()` — see that\n * module's docstring.\n *\n * Missing vs forbidden documents raise `DocumentNotFoundError` with the\n * identical message `document not found: ${id}` so a caller can never\n * distinguish \"doesn't exist\" from \"exists but you can't see it\".\n */\nimport type { Pool } from \"pg\";\nimport { isTabularMime } from \"./chunkers.js\";\nimport type { ContextEngineConfig, LLMConfig } from \"./config.js\";\nimport { DocumentNotFoundError, EngineActionError, ExtraMissingError } from \"./errors.js\";\nimport { emitError, type Hooks } from \"./hooks.js\";\nimport type { Embedder } from \"./providers/embeddings.js\";\nimport { callLlm } from \"./providers/llm.js\";\nimport { applyRedaction, type RedactionPolicy } from \"./redaction.js\";\nimport { executeSafeCode } from \"./sandbox.js\";\nimport { normalizeKey, resolveFields } from \"./structured.js\";\n\nexport const MAX_LIST_LIMIT = 200;\nexport const MAX_COMPUTE_TEXT_CHARS = 2_000_000;\nexport const DEFAULT_COMPUTE_TIMEOUT = 30;\nexport const MAX_COMPUTE_DOCUMENTS = 50;\n\nconst TABULAR_MIME_PATTERNS = [\"%csv%\", \"%sheet%\", \"%excel%\", \"%spreadsheetml%\", \"%tab-separated%\"];\n\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nconst WORD_RE = /[^\\W\\d_]+/gu;\n\nconst STOPWORDS = new Set([\n \"the\",\n \"a\",\n \"an\",\n \"is\",\n \"are\",\n \"was\",\n \"were\",\n \"am\",\n \"be\",\n \"been\",\n \"being\",\n \"what\",\n \"whats\",\n \"who\",\n \"whom\",\n \"which\",\n \"how\",\n \"when\",\n \"where\",\n \"why\",\n \"this\",\n \"that\",\n \"these\",\n \"those\",\n \"there\",\n \"here\",\n \"of\",\n \"in\",\n \"on\",\n \"at\",\n \"to\",\n \"for\",\n \"with\",\n \"and\",\n \"or\",\n \"but\",\n \"not\",\n \"do\",\n \"does\",\n \"did\",\n \"done\",\n \"has\",\n \"have\",\n \"had\",\n \"having\",\n \"can\",\n \"could\",\n \"will\",\n \"would\",\n \"shall\",\n \"should\",\n \"may\",\n \"might\",\n \"must\",\n \"its\",\n \"your\",\n \"you\",\n \"about\",\n \"all\",\n \"any\",\n \"some\",\n \"like\",\n]);\n\nconst SHEET_MARKER_RE = /^\\[Sheet:\\s*(.+?)\\]\\s*$/;\nconst CODE_FENCE_RE = /^```(?:javascript|js|python)?\\s*\\n?|\\n?```\\s*$/gm;\n\nconst COMPUTE_SYSTEM_PROMPT = `You are a data analyst. Write JavaScript code that computes the answer to the user's instruction over the provided tables.\n\nAvailable in your code:\n- \\`dfs\\`: an object mapping sheet/document name to an array of row objects (one object per row, keys are column names)\n- \\`documents\\`: an array of objects (\\`id\\`, \\`name\\`, \\`sourceId\\`) — the source documents \\`dfs\\` was built from\n- Language: JSON, Math, Date, Array, Object, Number, String, Boolean, parseInt, parseFloat, isFinite, isNaN, console.log\n\nRules:\n1. Set a variable named \\`result\\` to the final answer (a number, string, array, or object).\n2. No file I/O, no network calls, no imports, no require, no process.\n3. Return ONLY the JavaScript code — no markdown fences, no explanation, no commentary.`;\n\nfunction parseDocumentId(documentId: unknown): string {\n const raw = String(documentId ?? \"\")\n .replace(/[ \\n\\t]/g, \"\")\n .trim();\n if (!UUID_RE.test(raw)) {\n throw new EngineActionError(`invalid document id: ${JSON.stringify(documentId)}`);\n }\n return raw;\n}\n\n/**\n * ACL visibility for one document row.\n *\n * - `principals=null` — trusted internal caller; every document is visible.\n * - `principals=[]` — anonymous; only rows whose `acl IS NULL` (unrestricted).\n * - a non-empty list — unrestricted rows plus those whose ACL overlaps.\n *\n * `[]` and `null` are NOT interchangeable. An empty ACL array on the row\n * (distinct from NULL) overlaps nothing, so it is invisible to anonymous\n * and named callers alike — only a trusted caller sees it.\n */\nexport function visible(acl: string[] | null | undefined, principals: string[] | null): boolean {\n if (principals === null) return true;\n if (acl == null) return true;\n const held = new Set(principals);\n return acl.some((p) => held.has(p));\n}\n\n/** Python-named alias used by engine/tests that expect `_visible`. */\nexport const _visible = visible;\n\nexport function aclVisible(acl: string[] | null | undefined, principals: string[] | null): boolean {\n return visible(acl, principals);\n}\n\nfunction scopeSql(\n sourceIds: string[] | null | undefined,\n principals: string[] | null | undefined,\n params: unknown[],\n): string {\n const where: string[] = [];\n if (sourceIds != null) {\n params.push(sourceIds);\n where.push(`source_id = ANY($${params.length}::text[])`);\n }\n if (principals != null) {\n // `acl && $principals` — overlap-of-empty-array is FALSE for every\n // non-empty acl, which is exactly the `principals=[]` (anonymous\n // caller) semantics this package uses everywhere. NULL acl still\n // matches via `acl IS NULL`.\n params.push(principals);\n where.push(`(acl IS NULL OR acl && $${params.length}::text[])`);\n }\n return where.length ? `WHERE ${where.join(\" AND \")}` : \"\";\n}\n\nfunction parseCursor(cursorValue: unknown): Record<string, unknown> | null {\n if (cursorValue == null) return null;\n if (typeof cursorValue === \"object\" && !Array.isArray(cursorValue)) {\n return cursorValue as Record<string, unknown>;\n }\n if (typeof cursorValue === \"string\") {\n try {\n const parsed: unknown = JSON.parse(cursorValue);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n } catch {\n /* fall through */\n }\n }\n console.warn(\"listDocuments: could not parse cursor value %s\", cursorValue);\n return null;\n}\n\n/**\n * Redact every string leaf of `value` — a bare string, or a JSON-ish\n * dict/list structure, walked recursively. Dict KEYS are never redacted\n * (they are field names; rewriting them would silently change the\n * result's schema).\n *\n * `policy=null` or an empty policy is an exact no-op — `value` is returned\n * unchanged, not even copied.\n */\nexport function redactValueRecursive(\n value: unknown,\n policy: RedactionPolicy | null | undefined,\n opts: { principals: string[] | null; secretKey: string | Buffer | null; hooks?: Hooks | null },\n): unknown {\n if (policy == null || policy.isEmpty()) return value;\n\n const walk = (node: unknown): unknown => {\n if (typeof node === \"string\") {\n return applyRedaction(node, policy, {\n phase: \"output\",\n principals: opts.principals,\n secretKey: opts.secretKey,\n hooks: opts.hooks,\n })[0];\n }\n if (Array.isArray(node)) return node.map(walk);\n if (node && typeof node === \"object\") {\n return Object.fromEntries(\n Object.entries(node as Record<string, unknown>).map(([k, v]) => [k, walk(v)]),\n );\n }\n return node;\n };\n return walk(value);\n}\n\nexport async function requireVisible(\n pool: Pool,\n documentId: string,\n principals: string[] | null,\n): Promise<void> {\n const id = parseDocumentId(documentId);\n const { rows } = await pool.query(`SELECT acl FROM context_engine_documents WHERE id = $1`, [id]);\n if (!rows[0] || !visible(rows[0].acl, principals)) {\n throw new DocumentNotFoundError(id);\n }\n}\n\nexport async function getDocumentRow(\n pool: Pool,\n documentId: string,\n principals: string[] | null,\n): Promise<Record<string, unknown>> {\n const id = parseDocumentId(documentId);\n const { rows } = await pool.query(`SELECT * FROM context_engine_documents WHERE id = $1`, [id]);\n const doc = rows[0];\n if (!doc || !visible(doc.acl, principals)) throw new DocumentNotFoundError(id);\n const count = await pool.query(\n `SELECT count(*)::int AS n FROM context_engine_chunks WHERE document_id = $1`,\n [id],\n );\n return {\n id: String(doc.id),\n sourceId: doc.source_id,\n externalId: doc.external_id,\n name: doc.name,\n description: doc.description,\n metaData: doc.meta_data ?? {},\n // `[]` (an explicitly empty principal list) is NOT the same as\n // NULL (unrestricted) — never collapse one into the other.\n acl: doc.acl != null ? [...doc.acl] : null,\n mode: doc.mode,\n mimeType: doc.mime_type,\n lang: doc.lang,\n text: doc.text,\n status: doc.status,\n error: doc.error,\n chunks: count.rows[0]?.n ?? 0,\n documentType: doc.document_type,\n structuredData: doc.structured_data,\n createdAt: doc.created_at,\n updatedAt: doc.updated_at,\n startedAt: doc.started_at,\n completedAt: doc.completed_at,\n };\n}\n\nexport async function stats(pool: Pool, sourceId: string | null): Promise<Record<string, unknown>> {\n const where = sourceId != null ? \"WHERE source_id = $1\" : \"\";\n const params = sourceId != null ? [sourceId] : [];\n const docs = await pool.query(`SELECT count(*)::int AS n FROM context_engine_documents ${where}`, params);\n const chunks = await pool.query(\n `SELECT count(*)::int AS n FROM context_engine_chunks ${sourceId != null ? \"WHERE source_id = $1\" : \"\"}`,\n params,\n );\n const statuses = await pool.query(\n `SELECT status, count(*)::int AS n FROM context_engine_documents ${where} GROUP BY status`,\n params,\n );\n const meta = await pool.query(\n `SELECT embedding_provider, embedding_model, embedding_dim FROM context_engine_meta WHERE id = 1`,\n );\n const m = meta.rows[0];\n return {\n sourceId,\n documents: docs.rows[0]?.n ?? 0,\n chunks: chunks.rows[0]?.n ?? 0,\n byStatus: Object.fromEntries(statuses.rows.map((r) => [r.status, r.n])),\n embedding: {\n provider: m?.embedding_provider ?? null,\n model: m?.embedding_model ?? null,\n dim: m?.embedding_dim ?? null,\n },\n };\n}\n\n/**\n * Return one document's full text, ACL-checked.\n *\n * Unlike an LLM-tool payload helper, this returns the WHOLE text\n * untruncated — token-budget policy belongs to whatever calls this.\n *\n * Raises `EngineActionError` for an unparseable id and\n * `DocumentNotFoundError` for a missing document or one the caller's\n * `principals` can't see — the same message for the last two, deliberately.\n *\n * `redaction` (an `apply_at=\"output\"` policy) masks the fetched text\n * before it is returned. This is the ONLY protection for a corpus ingested\n * WITHOUT an `apply_at=\"ingest\"` policy.\n */\nexport async function getDocumentText(\n documentId: string,\n opts: {\n pool: Pool;\n principals?: string[] | null;\n redaction?: RedactionPolicy | null;\n secretKey?: string | Buffer | null;\n hooks?: Hooks;\n },\n): Promise<string> {\n const principals = opts.principals ?? null;\n const doc = await getDocumentRow(opts.pool, documentId, principals);\n return redactValueRecursive(String(doc.text ?? \"\"), opts.redaction, {\n principals,\n secretKey: opts.secretKey ?? null,\n hooks: opts.hooks,\n }) as string;\n}\n\n/**\n * Page through documents in scope, newest first.\n *\n * `redaction` masks `documentType` — unconstrained free text an LLM wrote\n * after reading the document body. `name`/`description` remain\n * intentionally unmasked: both are CALLER-set at ingest time, not text the\n * pipeline derived from the document body.\n */\nexport async function listDocuments(opts: {\n pool: Pool;\n sourceId?: string | null;\n principals?: string[] | null;\n cursor?: unknown;\n limit?: number;\n redaction?: RedactionPolicy | null;\n secretKey?: string | Buffer | null;\n hooks?: Hooks;\n}): Promise<Record<string, unknown>> {\n const limit = Math.max(1, Math.min(Math.trunc(opts.limit || 50), MAX_LIST_LIMIT));\n const parsedCursor = parseCursor(opts.cursor);\n const sourceIds = opts.sourceId != null ? [opts.sourceId] : null;\n const principals = opts.principals ?? null;\n\n const params: unknown[] = [];\n let where = scopeSql(sourceIds, principals, params);\n const cursorTime = parsedCursor?.time ?? parsedCursor?.created_at;\n const cursorId = parsedCursor?.id;\n if (cursorTime && cursorId && UUID_RE.test(String(cursorId))) {\n params.push(cursorTime, cursorId);\n const extra = `(created_at < $${params.length - 1} OR (created_at = $${params.length - 1} AND id < $${params.length}::uuid))`;\n where = where ? `${where} AND ${extra}` : `WHERE ${extra}`;\n }\n params.push(limit + 1);\n const { rows } = await opts.pool.query(\n `SELECT id, source_id, external_id, name, description, mode, mime_type, lang, status,\n document_type, created_at, updated_at, acl\n FROM context_engine_documents\n ${where}\n ORDER BY created_at DESC, id DESC\n LIMIT $${params.length}`,\n params,\n );\n\n const hasMore = rows.length > limit;\n const page = rows.slice(0, limit);\n const documents = page.map((doc) => ({\n id: String(doc.id),\n sourceId: doc.source_id,\n externalId: doc.external_id,\n name: doc.name,\n description: doc.description,\n mode: doc.mode,\n mimeType: doc.mime_type,\n lang: doc.lang,\n status: doc.status,\n documentType: redactValueRecursive(doc.document_type, opts.redaction, {\n principals,\n secretKey: opts.secretKey ?? null,\n hooks: opts.hooks,\n }),\n createdAt: doc.created_at instanceof Date ? doc.created_at.toISOString() : doc.created_at,\n updatedAt: doc.updated_at instanceof Date ? doc.updated_at.toISOString() : doc.updated_at,\n }));\n\n const result: Record<string, unknown> = {\n documents,\n count: documents.length,\n hasMore,\n };\n if (hasMore && page.length) {\n const last = page[page.length - 1]!;\n result.nextCursor = {\n time: last.created_at instanceof Date ? last.created_at.toISOString() : last.created_at,\n id: String(last.id),\n };\n }\n return result;\n}\n\nfunction candidateFieldTokens(question: string): string[] {\n const candidates: string[] = [];\n const seen = new Set<string>();\n\n const whole = normalizeKey(question);\n if (whole) {\n candidates.push(question.trim());\n seen.add(whole);\n }\n\n for (const match of question.matchAll(WORD_RE)) {\n const word = match[0]!;\n if (word.length < 3) continue;\n const norm = normalizeKey(word);\n if (!norm || seen.has(norm) || STOPWORDS.has(norm)) continue;\n seen.add(norm);\n candidates.push(word);\n }\n return candidates;\n}\n\n/**\n * Answer a natural-language question against documents' `structuredData`.\n *\n * When NOTHING resolves — every candidate fell below the similarity floor\n * and had no exact/synonym match either — this returns ZERO documents, not\n * the whole in-scope corpus. An off-topic question has no business getting\n * an invoice back just because the invoice happens to have SOME structured\n * fields.\n *\n * `redaction` masks each result's `documentType` and the STRING VALUES of\n * `structuredData`. KEYS are left unredacted — they are the canonical\n * field names this function's `resolveFields` matching keys off of.\n */\nexport async function queryStructured(\n question: string,\n opts: {\n pool: Pool;\n embedder: Embedder;\n sourceIds?: string[] | null;\n principals?: string[] | null;\n docType?: string | null;\n limit?: number;\n redaction?: RedactionPolicy | null;\n secretKey?: string | Buffer | null;\n hooks?: Hooks;\n },\n): Promise<Record<string, unknown>> {\n if (!question?.trim()) throw new EngineActionError(\"question must not be empty\");\n\n const limit = Math.max(1, Math.min(Math.trunc(opts.limit || 20), MAX_LIST_LIMIT));\n const principals = opts.principals ?? null;\n const candidates = candidateFieldTokens(question);\n const resolved = await resolveFields(candidates, {\n pool: opts.pool,\n embedder: opts.embedder,\n sourceIds: opts.sourceIds ?? null,\n docType: opts.docType ?? null,\n });\n const canonicalKeys = [...new Set(Object.values(resolved))].sort();\n\n if (!canonicalKeys.length) {\n return { question, resolvedFields: resolved, documents: [], count: 0 };\n }\n\n const params: unknown[] = [];\n let where = scopeSql(opts.sourceIds ?? null, principals, params);\n const extras = [`structured_data IS NOT NULL`];\n if (opts.docType != null) {\n params.push(opts.docType);\n extras.push(`document_type = $${params.length}`);\n }\n params.push(canonicalKeys);\n extras.push(`structured_data ?| $${params.length}::text[]`);\n where = where ? `${where} AND ${extras.join(\" AND \")}` : `WHERE ${extras.join(\" AND \")}`;\n params.push(limit);\n\n const { rows } = await opts.pool.query(\n `SELECT id, source_id, name, document_type, structured_data\n FROM context_engine_documents\n ${where}\n ORDER BY created_at DESC, id DESC\n LIMIT $${params.length}`,\n params,\n );\n\n const documents = rows.map((doc) => ({\n id: String(doc.id),\n sourceId: doc.source_id,\n name: doc.name,\n documentType: redactValueRecursive(doc.document_type, opts.redaction, {\n principals,\n secretKey: opts.secretKey ?? null,\n hooks: opts.hooks,\n }),\n structuredData: redactValueRecursive(doc.structured_data ?? {}, opts.redaction, {\n principals,\n secretKey: opts.secretKey ?? null,\n hooks: opts.hooks,\n }),\n }));\n\n return { question, resolvedFields: resolved, documents, count: documents.length };\n}\n\nfunction stripCodeFences(text: string): string {\n return text.replace(CODE_FENCE_RE, \"\").trim();\n}\n\ntype DanfoMod = {\n readCSV: (input: string) => { columns: string[]; shape: [number, number]; values: unknown[][] };\n};\n\nasync function requireDanfo(): Promise<DanfoMod> {\n const specifier = \"danfojs-node\";\n try {\n return (await import(specifier)) as DanfoMod;\n } catch {\n throw new ExtraMissingError(\"compute\", \"danfojs-node\", \"compute() dataframes\");\n }\n}\n\n/**\n * Parse `[Sheet: name]`-delimited (or bare) CSV text into `{sheet: rows[]}`.\n * Unparseable sheets are skipped, never fatal.\n */\nfunction parseSpreadsheetText(\n dfd: { readCSV: (input: string) => { columns: string[]; shape: [number, number]; values: unknown[][] } },\n text: string | null | undefined,\n): Record<string, Record<string, unknown>[]> {\n if (!text) return {};\n const sheets: Record<string, string[]> = {};\n let current = \"sheet1\";\n for (const line of text.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\").split(\"\\n\")) {\n const m = SHEET_MARKER_RE.exec(line.trim());\n if (m) {\n current = m[1]!.trim() || current;\n sheets[current] ??= [];\n continue;\n }\n let bucket = sheets[current];\n if (!bucket) {\n bucket = [];\n sheets[current] = bucket;\n }\n bucket.push(line);\n }\n\n const out: Record<string, Record<string, unknown>[]> = {};\n for (const [name, lines] of Object.entries(sheets)) {\n const body = lines.join(\"\\n\").trim();\n if (!body) continue;\n try {\n const df = dfd.readCSV(body);\n const cols = (df.columns ?? []).map((c) => String(c).trim());\n if (!df.shape || df.shape[0] <= 0 || df.shape[1] <= 0) continue;\n const rows: Record<string, unknown>[] = [];\n for (const vals of df.values as unknown[][]) {\n const row: Record<string, unknown> = {};\n for (let i = 0; i < cols.length; i++) row[cols[i]!] = vals[i];\n rows.push(row);\n }\n if (rows.length) out[name] = rows;\n } catch (exc) {\n console.warn(\"compute: sheet '%s' not parseable as CSV: %s\", name, exc);\n }\n }\n return out;\n}\n\n/**\n * Compute an answer to `instruction` over in-scope spreadsheet documents.\n *\n * **Disabled by default** (`config.enableCodeExecution`): this executes\n * LLM-GENERATED code. Raises `EngineActionError` before ANY work — no LLM\n * call, no sandbox run — when the flag is `false`. That flag, not the\n * isolate, is the actual security boundary.\n *\n * `config.redaction` is applied TWICE:\n * 1. Each document's raw `.text` is masked BEFORE it is parsed into a\n * table, so the data the LLM-authored code runs against is built from\n * masked cells.\n * 2. The final returned dict is swept whole through `redactValueRecursive`\n * — including `code`.\n */\nexport async function compute(\n instruction: string,\n opts: {\n pool: Pool;\n config: ContextEngineConfig;\n hooks: Hooks;\n sourceIds?: string[] | null;\n principals?: string[] | null;\n docIds?: string[] | null;\n modelCfg?: LLMConfig | null;\n timeout?: number;\n },\n): Promise<Record<string, unknown>> {\n if (!opts.config.enableCodeExecution) {\n throw new EngineActionError(\n \"compute() executes generated code and is disabled by default; set \" +\n \"enableCodeExecution=true only in a deployment with out-of-process/\" +\n \"container isolation.\",\n );\n }\n\n const llmCfg = opts.modelCfg ?? opts.config.llm;\n if (llmCfg == null) {\n throw new Error(\"compute() requires an LLM: pass modelCfg= or configure ContextEngineConfig.llm\");\n }\n if (!instruction?.trim()) {\n throw new EngineActionError(\"instruction must not be empty\");\n }\n\n const dfd = await requireDanfo();\n const timeout = Math.max(1, Math.min(Math.trunc(opts.timeout || DEFAULT_COMPUTE_TIMEOUT), 300));\n const principals = opts.principals ?? null;\n\n const params: unknown[] = [];\n let where = scopeSql(opts.sourceIds ?? null, principals, params);\n const mimeClause = TABULAR_MIME_PATTERNS.map((p) => {\n params.push(p);\n return `mime_type ILIKE $${params.length}`;\n }).join(\" OR \");\n where = where ? `${where} AND (${mimeClause})` : `WHERE (${mimeClause})`;\n if (opts.docIds?.length) {\n const parsedIds: string[] = [];\n for (const did of opts.docIds) {\n try {\n parsedIds.push(parseDocumentId(did));\n } catch {\n console.warn(\"compute: skipping invalid doc_id %s\", did);\n }\n }\n if (!parsedIds.length) {\n throw new EngineActionError(\"no tabular (CSV/TSV/XLSX) documents found in scope for compute()\");\n }\n params.push(parsedIds);\n where += ` AND id = ANY($${params.length}::uuid[])`;\n }\n params.push(MAX_COMPUTE_DOCUMENTS + 1);\n const { rows } = await opts.pool.query(\n `SELECT id, name, source_id, mime_type, text\n FROM context_engine_documents\n ${where}\n ORDER BY created_at DESC, id DESC\n LIMIT $${params.length}`,\n params,\n );\n const tabular = rows.filter((d) => isTabularMime(d.mime_type));\n if (!tabular.length) {\n throw new EngineActionError(\"no tabular (CSV/TSV/XLSX) documents found in scope for compute()\");\n }\n if (tabular.length > MAX_COMPUTE_DOCUMENTS) {\n throw new EngineActionError(\n `more than ${MAX_COMPUTE_DOCUMENTS} tabular documents are in scope for compute() — ` +\n \"narrow the request with docIds or sourceIds\",\n );\n }\n\n const totalChars = tabular.reduce((n, d) => n + String(d.text ?? \"\").length, 0);\n if (totalChars > MAX_COMPUTE_TEXT_CHARS) {\n throw new EngineActionError(\n `in-scope spreadsheet text too large to load (${totalChars} chars > ` +\n `${MAX_COMPUTE_TEXT_CHARS} cap) — narrow the request with docIds or sourceIds`,\n );\n }\n\n const dfs: Record<string, Record<string, unknown>[]> = {};\n const multiDoc = tabular.length > 1;\n for (const doc of tabular) {\n const maskedText = redactValueRecursive(doc.text, opts.config.redaction, {\n principals,\n secretKey: opts.config.secretKey,\n hooks: opts.hooks,\n }) as string | null;\n const parsed = parseSpreadsheetText(dfd, maskedText);\n for (const [sheetName, table] of Object.entries(parsed)) {\n const key = multiDoc ? `${doc.name}:${sheetName}` : sheetName;\n dfs[key] = table;\n }\n }\n\n const documents = tabular.map((doc) => ({\n id: String(doc.id),\n name: doc.name,\n sourceId: doc.source_id,\n }));\n\n if (!Object.keys(dfs).length) {\n throw new EngineActionError(\"in-scope documents did not parse into any usable dataframe\");\n }\n\n const schemaLines = Object.entries(dfs).map(\n ([name, table]) =>\n `- ${name}: columns=${JSON.stringify(Object.keys(table[0] ?? {}))}, rows=${table.length}`,\n );\n const userPrompt = `Instruction: ${instruction}\\n\\nAvailable dataframes:\\n${schemaLines.join(\"\\n\")}`;\n\n let rawCode: string;\n let tokens: { input: number; output: number };\n try {\n [rawCode, tokens] = await callLlm(llmCfg, {\n system: COMPUTE_SYSTEM_PROMPT,\n user: userPrompt,\n jsonMode: false,\n });\n } catch (exc) {\n emitError(opts.hooks, exc, { stage: \"compute_codegen\", instruction: instruction.slice(0, 200) });\n throw exc;\n }\n\n const code = stripCodeFences(rawCode);\n const execResult = await executeSafeCode(code, { dfs, documents }, { timeout });\n if (!execResult.success) {\n let maskedCode: string;\n try {\n maskedCode = redactValueRecursive(code.slice(0, 500), opts.config.redaction, {\n principals,\n secretKey: opts.config.secretKey,\n hooks: opts.hooks,\n }) as string;\n } catch {\n maskedCode = \"<redaction failed: code omitted>\";\n }\n emitError(opts.hooks, new Error(execResult.error || \"compute execution failed\"), {\n stage: \"compute_exec\",\n code: maskedCode,\n });\n }\n\n const result: Record<string, unknown> = {\n success: execResult.success,\n result: execResult.result,\n code,\n stdout: execResult.stdout ?? \"\",\n error: execResult.error,\n executionTime: execResult.executionTime,\n documentsUsed: documents.map((d) => d.id),\n providerTokens: {\n llm_input: tokens?.input ?? 0,\n llm_output: tokens?.output ?? 0,\n },\n };\n return redactValueRecursive(result, opts.config.redaction, {\n principals,\n secretKey: opts.config.secretKey,\n hooks: opts.hooks,\n }) as Record<string, unknown>;\n}\n\nexport { applyAttributeUpdates } from \"./ingest.js\";\n\nexport function requirePandas(): never {\n throw new ExtraMissingError(\"compute\", \"danfojs-node\", \"compute() dataframes\");\n}\n","import { createCipheriv, createDecipheriv, createHmac, randomBytes } from \"node:crypto\";\n\n/**\n * AES-256-GCM crypto seam. Wire format is a compatibility promise with the\n * Python library and promptev-connectors:\n * base64(nonce[12] || AES-256-GCM ciphertext+tag)\n */\n\nexport function encryptDict(data: Record<string, unknown>, key: Buffer): string {\n const nonce = randomBytes(12);\n const cipher = createCipheriv(\"aes-256-gcm\", key, nonce);\n const plaintext = Buffer.from(JSON.stringify(data), \"utf8\");\n const ciphertext = Buffer.concat([cipher.update(plaintext), cipher.final()]);\n const tag = cipher.getAuthTag();\n return Buffer.concat([nonce, ciphertext, tag]).toString(\"base64\");\n}\n\nexport function decryptDict(token: string, key: Buffer): Record<string, unknown> {\n const raw = Buffer.from(token, \"base64\");\n const nonce = raw.subarray(0, 12);\n const tag = raw.subarray(raw.length - 16);\n const ciphertext = raw.subarray(12, raw.length - 16);\n const decipher = createDecipheriv(\"aes-256-gcm\", key, nonce);\n decipher.setAuthTag(tag);\n const plaintext = Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n return JSON.parse(plaintext.toString(\"utf8\")) as Record<string, unknown>;\n}\n\nexport function getSecretKey(config: { secretKey?: string | null }): Buffer {\n const secretKey = config.secretKey;\n if (!secretKey) {\n throw new Error(\n \"ContextEngineConfig.secretKey (env CE_SECRET_KEY) is not configured — \" +\n \"a base64url-encoded 32-byte AES key is required to encrypt/decrypt \" +\n \"tool configs that hold secrets.\",\n );\n }\n return Buffer.from(secretKey, \"base64url\");\n}\n\nexport function hmacSha256Hex(key: string | Buffer, value: string): string {\n const k = typeof key === \"string\" ? Buffer.from(key) : key;\n return createHmac(\"sha256\", k).update(value, \"utf8\").digest(\"hex\");\n}\n","import { hmacSha256Hex } from \"./crypto.js\";\nimport { emitError, type Hooks } from \"./hooks.js\";\n\nexport type Span = [number, number];\nexport type DetectorFn = (text: string) => Span[];\nexport type RedactionAction = \"mask\" | \"hash\" | \"remove\";\nexport type ApplyAt = \"ingest\" | \"output\" | \"both\";\nexport type RedactionPhase = \"ingest\" | \"output\";\n\nexport const BUILTIN_DETECTOR_NAMES = new Set([\"email\", \"phone\", \"ssn\", \"credit_card\", \"iban\", \"api_key\"]);\n\nexport interface RedactionRuleInit {\n name: string;\n detector?: string | null;\n pattern?: string | null;\n field?: string | null;\n action?: RedactionAction;\n placeholder?: string | null;\n applyAt?: ApplyAt;\n unless?: string[];\n}\n\nexport class RedactionRule {\n name: string;\n detector: string | null;\n pattern: string | null;\n field: string | null;\n action: RedactionAction;\n placeholder: string | null;\n applyAt: ApplyAt;\n unless: string[];\n private compiled: RegExp | null = null;\n\n constructor(init: RedactionRuleInit) {\n this.name = init.name;\n this.detector = init.detector ?? null;\n this.pattern = init.pattern ?? null;\n this.field = init.field ?? null;\n this.action = init.action ?? \"mask\";\n this.placeholder = init.placeholder ?? null;\n this.applyAt = init.applyAt ?? \"output\";\n this.unless = init.unless ?? [];\n this.validate();\n }\n\n private validate(): void {\n if (this.field !== null) {\n throw new Error(\n `rule '${this.name}': field-targeted rules are not implemented yet; use detector or pattern instead`,\n );\n }\n const targets = [this.detector, this.pattern].filter((t) => t !== null);\n if (targets.length !== 1) {\n throw new Error(`rule '${this.name}': exactly one of detector/pattern must be set`);\n }\n if (this.pattern !== null) {\n try {\n this.compiled = new RegExp(this.pattern, \"g\");\n } catch (exc) {\n throw new Error(`rule '${this.name}': invalid regex: ${exc}`);\n }\n }\n if (this.unless.length && this.applyAt === \"ingest\") {\n throw new Error(\n `rule '${this.name}': unless is output-time only and cannot be set on an applyAt='ingest' rule`,\n );\n }\n }\n\n patternRe(): RegExp | null {\n return this.compiled;\n }\n\n effectivePlaceholder(): string {\n return this.placeholder || `[${this.name.toUpperCase()}]`;\n }\n}\n\nexport interface RedactionPolicyInit {\n rules?: RedactionRule[] | RedactionRuleInit[];\n customDetectors?: Record<string, DetectorFn>;\n}\n\nexport class RedactionPolicy {\n rules: RedactionRule[];\n customDetectors: Record<string, DetectorFn>;\n\n constructor(init: RedactionPolicyInit = {}) {\n this.rules = (init.rules ?? []).map((r) => (r instanceof RedactionRule ? r : new RedactionRule(r)));\n this.customDetectors = init.customDetectors ?? {};\n const seen = new Set<string>();\n for (const rule of this.rules) {\n if (seen.has(rule.name)) throw new Error(`duplicate rule name: '${rule.name}'`);\n seen.add(rule.name);\n if (rule.detector !== null) {\n const known = BUILTIN_DETECTOR_NAMES.has(rule.detector) || rule.detector in this.customDetectors;\n if (!known) {\n throw new Error(\n `rule '${rule.name}': unknown detector '${rule.detector}' (not built-in and not in customDetectors)`,\n );\n }\n }\n }\n }\n\n isEmpty(): boolean {\n return this.rules.length === 0;\n }\n}\n\nconst EMAIL_RE = /[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}/g;\nconst PHONE_RE = /\\+\\d[\\d\\s-]{7,17}\\d/g;\nconst SSN_RE = /(?<!\\d)\\d{3}-\\d{2}-\\d{4}(?!\\d)/g;\nconst CARD_RE = /(?<!\\d)(?:\\d[ -]?){12,18}\\d(?!\\d)/g;\nconst IBAN_RE = /(?<![A-Za-z0-9])[A-Z]{2}\\d{2}[A-Z0-9]{10,30}(?![A-Za-z0-9])/g;\nconst API_KEY_ALNUM = \"A-Za-z0-9_\\\\-+/=\";\nconst API_KEY_PREFIX_RE = new RegExp(\n `(?<![${API_KEY_ALNUM}])(?:(?:AKIA|ASIA)[0-9A-Z]{16}|sk-[A-Za-z0-9]{20,}|gh[opsu]_[A-Za-z0-9]{20,}|xox[baprs]-[A-Za-z0-9\\\\-]{10,}|AIza[0-9A-Za-z_\\\\-]{35})(?![${API_KEY_ALNUM}])`,\n \"g\",\n);\nconst API_KEY_GENERIC_RE = new RegExp(\n `(?<![${API_KEY_ALNUM}])[${API_KEY_ALNUM}]{24,}(?![${API_KEY_ALNUM}])`,\n \"g\",\n);\nconst UUID_RE = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;\n\nfunction spansFrom(re: RegExp, text: string): Span[] {\n const out: Span[] = [];\n re.lastIndex = 0;\n let m = re.exec(text);\n while (m !== null) {\n out.push([m.index, m.index + m[0].length]);\n if (m[0].length === 0) re.lastIndex++;\n m = re.exec(text);\n }\n return out;\n}\n\nfunction luhnOk(digits: string): boolean {\n let total = 0;\n const rev = [...digits].reverse();\n for (let i = 0; i < rev.length; i++) {\n let d = Number(rev[i]);\n if (i % 2 === 1) {\n d *= 2;\n if (d > 9) d -= 9;\n }\n total += d;\n }\n return total % 10 === 0;\n}\n\nfunction detectCreditCard(text: string): Span[] {\n const spans: Span[] = [];\n for (const [start, end] of spansFrom(CARD_RE, text)) {\n const digits = text.slice(start, end).replace(/[ -]/g, \"\");\n if (digits.length >= 13 && digits.length <= 19 && luhnOk(digits)) {\n spans.push([start, end]);\n }\n }\n return spans;\n}\n\nfunction looksLikeGenericSecret(token: string): boolean {\n if (UUID_RE.test(token)) return false;\n let hasUpper = false;\n let hasLower = false;\n let hasDigit = false;\n for (const c of token) {\n if (c >= \"A\" && c <= \"Z\") hasUpper = true;\n else if (c >= \"a\" && c <= \"z\") hasLower = true;\n else if (c >= \"0\" && c <= \"9\") hasDigit = true;\n }\n return hasUpper && hasLower && hasDigit;\n}\n\nfunction detectApiKey(text: string): Span[] {\n const spans = spansFrom(API_KEY_PREFIX_RE, text);\n for (const [start, end] of spansFrom(API_KEY_GENERIC_RE, text)) {\n if (spans.some(([s, e]) => start < e && s < end)) continue;\n if (looksLikeGenericSecret(text.slice(start, end))) spans.push([start, end]);\n }\n return spans;\n}\n\nconst BUILTIN: Record<string, DetectorFn> = {\n email: (t) => spansFrom(EMAIL_RE, t),\n phone: (t) => spansFrom(PHONE_RE, t),\n ssn: (t) => spansFrom(SSN_RE, t),\n credit_card: detectCreditCard,\n iban: (t) => spansFrom(IBAN_RE, t),\n api_key: detectApiKey,\n};\n\nexport function detectBuiltin(name: string, text: string): Span[] {\n const detector = BUILTIN[name];\n if (!detector) throw new Error(`unknown built-in detector: ${name}`);\n if (!text) return [];\n return detector(text).sort((a, b) => a[0] - b[0]);\n}\n\nexport function ruleApplies(\n rule: RedactionRule,\n opts: { phase: RedactionPhase; principals: readonly string[] | null },\n): boolean {\n if (rule.applyAt !== \"both\" && rule.applyAt !== opts.phase) return false;\n if (opts.phase === \"ingest\") return true;\n if (!rule.unless.length) return true;\n if (opts.principals === null) return false;\n const held = new Set(opts.principals);\n return !rule.unless.some((p) => held.has(p));\n}\n\nfunction spansForRule(rule: RedactionRule, text: string, policy: RedactionPolicy): Span[] {\n if (rule.pattern !== null) {\n const re = rule.patternRe() ?? new RegExp(rule.pattern, \"g\");\n return spansFrom(re, text);\n }\n if (rule.detector !== null) {\n const custom = policy.customDetectors[rule.detector];\n if (custom) return [...custom(text)];\n return detectBuiltin(rule.detector, text);\n }\n return [];\n}\n\nconst HASH_TOKEN_CHARS = 16;\n\nfunction hashToken(value: string, secretKey: string | Buffer | null | undefined): string {\n const key = Buffer.isBuffer(secretKey) ? secretKey : Buffer.from(String(secretKey ?? \"\"));\n return hmacSha256Hex(key, value).slice(0, HASH_TOKEN_CHARS);\n}\n\nexport interface RedactionNote {\n rules_fired?: string[];\n spans?: number;\n rules_failed?: string[];\n}\n\nexport function applyRedaction(\n text: string,\n policy: RedactionPolicy,\n opts: {\n phase: RedactionPhase;\n principals?: readonly string[] | null;\n secretKey?: string | Buffer | null;\n hooks?: Hooks | null;\n },\n): [string, RedactionNote] {\n if (!text || policy.isEmpty()) return [text, {}];\n const principals = opts.principals ?? null;\n const collected: Array<[number, number, RedactionRule]> = [];\n const fired: string[] = [];\n const failed: string[] = [];\n\n for (const rule of policy.rules) {\n if (!ruleApplies(rule, { phase: opts.phase, principals })) continue;\n if (rule.action === \"hash\" && !opts.secretKey) {\n throw new Error(\n `rule '${rule.name}': action='hash' requires a non-empty secretKey ` +\n `(an unkeyed HMAC is a reversible pseudonym, not a redaction)`,\n );\n }\n try {\n const raw = spansForRule(rule, text, policy);\n const ruleSpans: Span[] = [];\n let invalid = false;\n for (const item of raw) {\n const start = item?.[0];\n const end = item?.[1];\n if (typeof start !== \"number\" || typeof end !== \"number\") {\n invalid = true;\n continue;\n }\n if (!(start >= 0 && start < end && end <= text.length)) {\n invalid = true;\n continue;\n }\n ruleSpans.push([start, end]);\n }\n if (invalid) failed.push(rule.name);\n for (const [s, e] of ruleSpans) collected.push([s, e, rule]);\n } catch (exc) {\n failed.push(rule.name);\n if (opts.hooks) emitError(opts.hooks, exc, { stage: \"redaction\", rule: rule.name });\n }\n }\n\n if (!collected.length) {\n if (failed.length) return [text, { rules_fired: [], spans: 0, rules_failed: failed }];\n return [text, {}];\n }\n\n collected.sort((a, b) => a[0] - b[0] || b[1] - b[0] - (a[1] - a[0]));\n const merged: Array<[number, number, RedactionRule]> = [];\n for (const [start, end, rule] of collected) {\n const last = merged[merged.length - 1];\n if (last && start < last[1]) {\n if (end > last[1]) last[1] = end;\n continue;\n }\n merged.push([start, end, rule]);\n }\n\n const out: string[] = [];\n let cursor = 0;\n for (const [start, end, rule] of merged) {\n out.push(text.slice(cursor, start));\n const original = text.slice(start, end);\n if (rule.action === \"mask\") out.push(rule.effectivePlaceholder());\n else if (rule.action === \"hash\") {\n out.push(`[${rule.name.toUpperCase()}:${hashToken(original, opts.secretKey)}]`);\n }\n if (!fired.includes(rule.name)) fired.push(rule.name);\n cursor = end;\n }\n out.push(text.slice(cursor));\n\n const note: RedactionNote = { rules_fired: fired, spans: merged.length };\n if (failed.length) note.rules_failed = failed;\n return [out.join(\"\"), note];\n}\n","/**\n * Isolated-vm JavaScript sandbox — the compute-tool's execution engine.\n *\n * THIS IS BEST-EFFORT, NOT A SECURITY BOUNDARY — read before relying on it.\n *\n * `actions.compute()` (the only caller of this module) is **disabled by\n * default** (`ContextEngineConfig.enableCodeExecution`, default `false`).\n * That flag, not anything in this file, is the actual security boundary:\n * no deployment ships reachable code execution unless an operator\n * explicitly turns it on, and the only responsible reason to turn it on is\n * having put REAL isolation around the process that calls `compute()` — a\n * subprocess with dropped privileges, a container, gVisor, a WASM runtime.\n * Everything below raises the cost of an escape; none of it is a substitute\n * for that.\n *\n * The isolate has:\n * - a wall-clock timeout (`script.run({ timeout })`)\n * - no Node `fs` / `net` / `child_process` / `process` (the isolate does\n * not receive them; user code that names them is rejected up front)\n * - a whitelist of language builtins (JSON, Math, Date, Array, …)\n *\n * Returns `{ result, stdout? }` plus success/error/executionTime so a\n * failed run is a data result, not an thrown exception — matching the\n * Python sandbox's contract that `compute()` inspects `success`.\n */\nimport { CodeExecutionError, ExtraMissingError } from \"./errors.js\";\n\ntype IsolatedVm = {\n Isolate: new (opts: {\n memoryLimit: number;\n }) => {\n createContext(): Promise<{\n global: { set(k: string, v: unknown): Promise<void>; derefInto(): unknown };\n eval(code: string): Promise<unknown>;\n }>;\n compileScript(code: string): Promise<{\n run(ctx: unknown, opts: { timeout: number; copy: boolean }): Promise<unknown>;\n }>;\n dispose(): void;\n };\n};\n\nexport const DEFAULT_TIMEOUT = 30;\nexport const MAX_TIMEOUT = 300;\nexport const DEFAULT_MAX_OUTPUT_LENGTH = 50_000;\nexport const ISOLATE_MEMORY_MB = 128;\n\nconst BLOCKED_IDENTIFIERS =\n /\\b(process|require|module|exports|globalThis|global|Buffer|__dirname|__filename|child_process|worker_threads|fs|net|http|https|dgram|dns|tls|cluster|os|vm|v8|crypto|fetch|WebAssembly|Function|eval|importScripts|SharedArrayBuffer|Atomics|XMLHttpRequest|WebSocket|Worker)\\b/;\n\nconst DUNDER = /__proto__|constructor\\s*\\[|constructor\\s*\\./;\n\nexport interface SandboxResult {\n success: boolean;\n result: unknown;\n stdout?: string;\n stderr?: string;\n executionTime: number;\n error: string | null;\n}\n\nexport async function ensureSandboxAvailable(): Promise<IsolatedVm> {\n const specifier = \"isolated-vm\";\n try {\n return (await import(specifier)) as IsolatedVm;\n } catch {\n throw new ExtraMissingError(\"compute\", \"isolated-vm\", \"sandboxed compute()\");\n }\n}\n\n/** Static reject of blocked identifiers. Returns `[ok, error]`. */\nexport function isSafeCode(code: string): [boolean, string] {\n if (!code?.trim()) return [false, \"empty code\"];\n if (BLOCKED_IDENTIFIERS.test(code)) {\n return [false, \"code references a blocked identifier (fs/net/process/require/eval/…)\"];\n }\n if (DUNDER.test(code)) {\n return [false, \"code references a blocked constructor/prototype path\"];\n }\n if (/\\bimport\\s*\\(|^\\s*import\\s/m.test(code) || /\\bexport\\s/.test(code)) {\n return [false, \"ESM import/export is not allowed in the sandbox\"];\n }\n return [true, \"\"];\n}\n\nexport function validateCodeOnly(code: string): void {\n const [ok, err] = isSafeCode(code);\n if (!ok) throw new CodeExecutionError(err);\n}\n\n/**\n * Execute JavaScript in an isolated-vm isolate.\n *\n * `context` values are copied in (plain JSON-able data only). The isolate\n * does not receive Node's `fs`/`net`/`process`. A `result` binding is\n * expected; `console.log` is captured into `stdout`.\n *\n * Timeout is milliseconds of isolate CPU, clamped to 1–300 seconds.\n * Does not throw on user-code failure — returns `success: false`.\n */\nexport async function executeSafeCode(\n code: string,\n context: Record<string, unknown> = {},\n timeoutOrOpts: number | { timeout?: number; maxOutputLength?: number } = DEFAULT_TIMEOUT,\n): Promise<SandboxResult> {\n const timeoutSec =\n typeof timeoutOrOpts === \"number\" ? timeoutOrOpts : (timeoutOrOpts.timeout ?? DEFAULT_TIMEOUT);\n const maxOutputLength =\n typeof timeoutOrOpts === \"number\"\n ? DEFAULT_MAX_OUTPUT_LENGTH\n : (timeoutOrOpts.maxOutputLength ?? DEFAULT_MAX_OUTPUT_LENGTH);\n const timeout = Math.max(1, Math.min(timeoutSec, MAX_TIMEOUT));\n\n const empty = (error: string, executionTime = 0): SandboxResult => ({\n success: false,\n result: null,\n stdout: \"\",\n stderr: \"\",\n executionTime,\n error,\n });\n\n const [ok, err] = isSafeCode(code);\n if (!ok) {\n console.warn(\"[sandbox] Unsafe code detected: %s\", err);\n return empty(`Code validation failed: ${err}`);\n }\n\n const ivm = await ensureSandboxAvailable();\n const started = Date.now();\n const isolate = new ivm.Isolate({ memoryLimit: ISOLATE_MEMORY_MB });\n try {\n const jail = await isolate.createContext();\n const jailGlobal = jail.global;\n await jailGlobal.set(\"global\", jailGlobal.derefInto());\n\n // Whitelist: language builtins already exist inside the isolate.\n // Do NOT copy Node's process/require/fs. Copy caller context as JSON.\n let contextJson: string;\n try {\n contextJson = JSON.stringify(context ?? {});\n } catch (exc) {\n return empty(`context is not JSON-serializable: ${String(exc)}`);\n }\n\n await jail.eval(\n `const __ctx = ${contextJson};\n for (const k of Object.keys(__ctx)) { global[k] = __ctx[k]; }\n global.__stdout = [];\n global.console = {\n log: (...args) => { global.__stdout.push(args.map(String).join(\" \")); },\n info: (...args) => { global.__stdout.push(args.map(String).join(\" \")); },\n warn: (...args) => { global.__stdout.push(args.map(String).join(\" \")); },\n error: (...args) => { global.__stdout.push(args.map(String).join(\" \")); },\n };\n void 0;`,\n );\n\n const wrapped = `\"use strict\";\nvar result = null;\n${code}\n({ result: result, stdout: (global.__stdout || []).join(\"\\\\n\") })`;\n\n const script = await isolate.compileScript(wrapped);\n const out = (await script.run(jail, {\n timeout: timeout * 1000,\n copy: true,\n })) as { result?: unknown; stdout?: string } | null;\n\n const executionTime = (Date.now() - started) / 1000;\n let result = out?.result ?? null;\n let stdout = typeof out?.stdout === \"string\" ? out.stdout : \"\";\n if (stdout.length > maxOutputLength) stdout = stdout.slice(0, maxOutputLength);\n try {\n const serialized = JSON.stringify(result);\n if (serialized && serialized.length > maxOutputLength) {\n result = { _truncated: true, _original_size: serialized.length };\n }\n } catch {\n result = String(result).slice(0, maxOutputLength);\n }\n\n return {\n success: true,\n result,\n stdout,\n stderr: \"\",\n executionTime,\n error: null,\n };\n } catch (exc) {\n const executionTime = (Date.now() - started) / 1000;\n const msg = String(exc);\n if (/timed out|timeout/i.test(msg)) {\n return empty(`Code execution timeout after ${timeout} seconds`, executionTime);\n }\n return empty(msg, executionTime);\n } finally {\n isolate.dispose();\n }\n}\n","/**\n * Structured data extraction, key normalization, and field resolution.\n *\n * extract — extractStructuredData() — one LLM call for type + fields\n * normalize— normalizeKey / inferDataType / validateAndNormalize / extractSynonyms\n * register — upsertRegistry() — the learned field-name registry, with embeddings\n * resolve — resolveFields() — question wording to canonical field name\n *\n * extractStructuredData never special-cases a provider: by the time ingest\n * calls it, extraction has already turned the document into text, so this\n * always runs on that text through callLlm. It never throws — an LLM\n * failure or unparseable response comes back as quality=\"failed\".\n *\n * resolveFields: exact key_norm match → synonym-array match → nearest\n * registry embedding by cosine distance, gated by\n * FIELD_RESOLUTION_SIMILARITY_FLOOR (0.55). Unresolved candidates are\n * simply absent from the returned mapping.\n */\nimport { randomUUID } from \"node:crypto\";\nimport type { Pool } from \"pg\";\nimport type { LLMConfig } from \"./config.js\";\nimport { safeJsonParse } from \"./extraction/json.js\";\nimport type { Embedder } from \"./providers/embeddings.js\";\nimport { callLlm } from \"./providers/llm.js\";\nimport { charScript } from \"./text.js\";\n\nexport const MAX_KEY_LENGTH = 100;\nexport const MAX_VALUE_LENGTH = 500;\nexport const MAX_EXAMPLE_VALUES = 10;\n\n/** Extraction schema version stamped on `documents.extraction_version`. */\nexport const EXTRACTION_VERSION = \"ce-structured-v1\";\n\n/** Cap on how much document text is sent to the LLM for one extraction call. */\nexport const MAX_EXTRACTION_CHARS = 120_000;\n\n/**\n * Cosine-similarity floor for the embedding fallback leg: below this,\n * \"nearest\" does not mean \"related\" — with no floor at all, EVERY candidate\n * resolved to SOME field once the registry had at least one embedded row.\n * Similarity = 1 - cosine distance (pgvector's `<=>`). 0.55 is deliberately\n * conservative for short-label vs short-label comparison.\n */\nexport const FIELD_RESOLUTION_SIMILARITY_FLOOR = 0.55;\n\nexport interface ExtractionResult {\n documentType: string | null;\n structuredDataRaw: Record<string, unknown>;\n structuredData: Record<string, unknown>;\n keysRaw: string[];\n keysNormalized: string[];\n quality: \"high\" | \"medium\" | \"low\" | \"failed\" | string;\n error: string | null;\n providerTokens: Record<string, number>;\n}\n\nconst EXTRACTION_SYSTEM_PROMPT = `You are an extraction engine. Analyze the document text you are given and return ONLY valid JSON (no markdown, no commentary, no backticks).\n\nGOALS:\nA) Extract structured information as FLAT KEY-VALUE pairs (industry-agnostic).\nB) Identify document_type and provide a brief quality observation.\n\nHARD RULES:\n1) Output MUST be STRICT JSON matching the schema below (no extra top-level keys).\n2) structured_data_raw MUST be a flat key-value object — no nested objects or arrays.\n If the source has lists/tables, flatten with indexed dot keys: items.0.description, items.0.value, items.1.description, ...\n3) Unknown/unreadable values MUST be null (never guess).\n4) Numeric fields: only use a number when you can read it from the text; store the raw string too if it needs disambiguation.\n5) Always include document_type (a short descriptive type, or \"unknown\").\n\nRETURN JSON SCHEMA (EXACT):\n{\n \"document_type\": \"<descriptive_type | unknown>\",\n \"structured_data_raw\": {\"<key>\": \"<value or null>\"},\n \"structured_quality\": {\"readability\": \"<low|medium|high>\"}\n}`;\n\nfunction buildExtractionPrompt(\n fieldHints: Record<string, unknown>[] | null | undefined,\n attempt = 0,\n): string {\n let prompt = EXTRACTION_SYSTEM_PROMPT;\n if (fieldHints?.length) {\n const lines: string[] = [];\n for (const hint of fieldHints) {\n if (!hint || typeof hint !== \"object\") continue;\n const key = hint.key ?? hint.name;\n if (!key) continue;\n const desc = hint.description ?? hint.type;\n lines.push(`- ${String(key)}${desc ? ` (${String(desc)})` : \"\"}`);\n }\n if (lines.length) {\n prompt +=\n \"\\n\\nPRIORITIZE extracting these fields if present (use these exact \" +\n \"names as keys in structured_data_raw), in addition to anything else \" +\n \"you find:\\n\" +\n lines.join(\"\\n\");\n }\n }\n if (attempt > 0) {\n prompt +=\n \"\\n\\nIMPORTANT: The previous attempt was not valid JSON. Double-check \" +\n \"escaping of quotes/newlines and return JSON only.\";\n }\n return prompt;\n}\n\n/**\n * Extract structured key/value data from already-extracted document text.\n *\n * Never throws — an LLM failure or unparseable response comes back as\n * `ExtractionResult(quality=\"failed\", error=...)` so ingest can complete\n * the rest of ingestion instead of losing already-computed chunks.\n *\n * Tokens are tracked CUMULATIVELY across every attempt whose `callLlm`\n * actually completed, even one whose response then failed to parse —\n * that attempt still consumed real, billable provider tokens.\n */\nexport async function extractStructuredData(\n text: string,\n opts: {\n llmCfg: LLMConfig;\n fieldHints?: Record<string, unknown>[] | null;\n maxChars?: number;\n maxRetries?: number;\n },\n): Promise<ExtractionResult> {\n if (!text?.trim()) {\n return {\n documentType: null,\n structuredDataRaw: {},\n structuredData: {},\n keysRaw: [],\n keysNormalized: [],\n quality: \"failed\",\n error: \"empty document text\",\n providerTokens: {},\n };\n }\n\n const maxChars = opts.maxChars ?? MAX_EXTRACTION_CHARS;\n const body = text.length <= maxChars ? text : text.slice(0, maxChars);\n const maxRetries = opts.maxRetries ?? 1;\n let lastError: string | null = null;\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n const prompt = buildExtractionPrompt(opts.fieldHints, attempt);\n let raw: string;\n let tokens: { input: number; output: number };\n try {\n [raw, tokens] = await callLlm(opts.llmCfg, {\n system: prompt,\n user: `Document text:\\n\\n${body}`,\n jsonMode: true,\n });\n } catch (exc) {\n lastError = String(exc);\n console.warn(\"structured extraction attempt %d: callLlm failed: %s\", attempt, exc);\n continue;\n }\n\n totalInputTokens += tokens?.input ?? 0;\n totalOutputTokens += tokens?.output ?? 0;\n\n let parsed: Record<string, unknown>;\n try {\n parsed = safeJsonParse(raw, \"object\") as Record<string, unknown>;\n } catch (exc) {\n lastError = String(exc);\n console.warn(\"structured extraction attempt %d: unparseable response: %s\", attempt, exc);\n continue;\n }\n\n const docType = (parsed.document_type as string) || \"unknown\";\n let rawData = parsed.structured_data_raw;\n if (!rawData || typeof rawData !== \"object\" || Array.isArray(rawData)) rawData = {};\n const qualityInfo = parsed.structured_quality;\n const readability =\n qualityInfo && typeof qualityInfo === \"object\" && !Array.isArray(qualityInfo)\n ? (qualityInfo as { readability?: string }).readability\n : undefined;\n const quality =\n readability === \"high\" || readability === \"medium\" || readability === \"low\" ? readability : \"medium\";\n\n const normalized = validateAndNormalize(rawData as Record<string, unknown>);\n\n return {\n documentType: docType,\n structuredDataRaw: rawData as Record<string, unknown>,\n structuredData: normalized,\n keysRaw: Object.keys(rawData as Record<string, unknown>),\n keysNormalized: Object.keys(normalized),\n quality,\n error: null,\n providerTokens: { llm_input: totalInputTokens, llm_output: totalOutputTokens },\n };\n }\n\n return {\n documentType: null,\n structuredDataRaw: {},\n structuredData: {},\n keysRaw: [],\n keysNormalized: [],\n quality: \"failed\",\n error: lastError || \"extraction failed\",\n providerTokens: { llm_input: totalInputTokens, llm_output: totalOutputTokens },\n };\n}\n\n/**\n * True if `ch` should be KEPT verbatim by `normalizeKey`.\n *\n * Unicode-aware: an ASCII `[^a-z0-9_]` class silently DROPPED every\n * non-Latin field name — \"税额\"/\"مبلغ الضريبة\"/\"Сумма\" all normalized to\n * `\"\"` and got skipped entirely. `charScript` reads a character's Unicode\n * category (letters AND combining marks, any script) instead of a\n * hardcoded Latin range. `/\\d/u` is Unicode-aware on its own.\n */\nfunction isKeyChar(ch: string): boolean {\n return Boolean(charScript(ch)) || /\\d/u.test(ch) || ch === \"_\";\n}\n\n/**\n * Normalize a metadata key: lowercase, non-key-chars -> `_`, dot-paths\n * kept, collapsed/stripped underscores, truncated to `MAX_KEY_LENGTH`.\n *\n * Unicode letters/digits in ANY script are preserved verbatim (only\n * separators/punctuation become `_`) — see `isKeyChar`.\n */\nexport function normalizeKey(key: unknown): string {\n if (!key || typeof key !== \"string\") return \"\";\n\n const segments = key.toLowerCase().split(\".\");\n const processed: string[] = [];\n for (const raw of segments) {\n let segment = \"\";\n for (const ch of raw) segment += isKeyChar(ch) ? ch : \"_\";\n segment = segment.replace(/_+/g, \"_\").replace(/^_|_$/g, \"\");\n if (segment) processed.push(segment);\n }\n let normalized = processed.join(\".\");\n if (normalized.length > MAX_KEY_LENGTH) normalized = normalized.slice(0, MAX_KEY_LENGTH);\n return normalized;\n}\n\n/** Infer 'number' | 'date' | 'bool' | 'string' from a key's suffix, then the value itself. */\nexport function inferDataType(key: string, value: unknown): string {\n if (typeof key !== \"string\") return \"string\";\n\n const keyLower = key.toLowerCase();\n if (keyLower.endsWith(\"_num\") || keyLower.endsWith(\"_number\")) return \"number\";\n if (keyLower.endsWith(\"_date\") || keyLower.endsWith(\"_datetime\")) return \"date\";\n if (keyLower.endsWith(\"_bool\") || keyLower.endsWith(\"_boolean\")) return \"bool\";\n\n if (value == null) return \"string\";\n if (typeof value === \"boolean\") return \"bool\";\n if (typeof value === \"string\") {\n const valueLower = value.toLowerCase().trim();\n if ([\"true\", \"false\", \"yes\", \"no\", \"1\", \"0\"].includes(valueLower)) return \"bool\";\n try {\n const d = new Date(value.replace(\"Z\", \"+00:00\"));\n if (!Number.isNaN(d.getTime()) && /\\d{4}-\\d{2}-\\d{2}/.test(value)) return \"date\";\n } catch {\n /* not a date */\n }\n if (value !== \"\" && !Number.isNaN(Number(value))) return \"number\";\n }\n if (typeof value === \"number\") return \"number\";\n if (value instanceof Date) return \"date\";\n return \"string\";\n}\n\n/**\n * Normalize keys, validate/convert values by inferred type, reject nested\n * structures, truncate over-long strings.\n */\nexport function validateAndNormalize(rawData: Record<string, unknown>): Record<string, unknown> {\n if (!rawData || typeof rawData !== \"object\" || Array.isArray(rawData)) {\n throw new Error(\"Input must be a dictionary\");\n }\n\n const normalized: Record<string, unknown> = {};\n\n for (const [rawKey, rawValue] of Object.entries(rawData)) {\n if (rawValue && typeof rawValue === \"object\") {\n console.warn(\"skipping nested structure for key '%s'\", rawKey);\n continue;\n }\n\n const normKey = normalizeKey(rawKey);\n if (!normKey) continue;\n\n const dataType = inferDataType(normKey, rawValue);\n\n try {\n if (dataType === \"number\") {\n if (rawValue == null || rawValue === \"\") {\n normalized[normKey] = null;\n } else {\n const asNum = Number(rawValue);\n if (!Number.isNaN(asNum)) {\n normalized[normKey] = asNum;\n } else {\n const match = String(rawValue).match(/[-+]?\\d[\\d,]*\\.?\\d*/);\n if (match) {\n const n = Number(match[0].replace(/,/g, \"\"));\n normalized[normKey] = Number.isNaN(n) ? null : n;\n } else {\n normalized[normKey] = null;\n }\n }\n }\n } else if (dataType === \"date\") {\n if (rawValue == null || rawValue === \"\") {\n normalized[normKey] = null;\n } else if (rawValue instanceof Date) {\n normalized[normKey] = rawValue.toISOString();\n } else {\n const d = new Date(String(rawValue).replace(\"Z\", \"+00:00\"));\n normalized[normKey] = Number.isNaN(d.getTime()) ? String(rawValue) : d.toISOString();\n }\n } else if (dataType === \"bool\") {\n if (rawValue == null || rawValue === \"\") {\n normalized[normKey] = null;\n } else if (typeof rawValue === \"boolean\") {\n normalized[normKey] = rawValue;\n } else {\n const valueStr = String(rawValue).toLowerCase().trim();\n if ([\"true\", \"yes\", \"1\"].includes(valueStr)) normalized[normKey] = true;\n else if ([\"false\", \"no\", \"0\"].includes(valueStr)) normalized[normKey] = false;\n else normalized[normKey] = String(rawValue);\n }\n } else {\n if (rawValue == null) {\n normalized[normKey] = null;\n } else {\n let strValue = String(rawValue);\n if (strValue.length > MAX_VALUE_LENGTH) strValue = strValue.slice(0, MAX_VALUE_LENGTH);\n normalized[normKey] = strValue;\n }\n }\n } catch (exc) {\n console.error(\"error processing field '%s': %s\", rawKey, exc);\n normalized[normKey] = rawValue != null ? String(rawValue) : null;\n }\n }\n\n return normalized;\n}\n\n/** Build `{normKey: [synonym variations]}` from raw/normalized key pairs. */\nexport function extractSynonyms(rawKeys: string[], normKeys: string[]): Record<string, string[]> {\n if (rawKeys.length !== normKeys.length) {\n console.error(\"extractSynonyms: length mismatch raw=%d norm=%d\", rawKeys.length, normKeys.length);\n return {};\n }\n\n const synonymMap: Record<string, string[]> = {};\n\n for (let i = 0; i < rawKeys.length; i++) {\n const rawKey = rawKeys[i]!;\n const normKey = normKeys[i]!;\n if (!normKey) continue;\n synonymMap[normKey] ??= [];\n const synonyms = new Set<string>();\n\n if (rawKey) {\n synonyms.add(rawKey);\n synonyms.add(rawKey.toLowerCase());\n synonyms.add(rawKey.toUpperCase());\n const camel = rawKey.replace(/[ _.]/g, \"\");\n if (camel) {\n synonyms.add(camel[0]!.toLowerCase() + camel.slice(1));\n synonyms.add(camel[0]!.toUpperCase() + camel.slice(1));\n }\n }\n\n synonyms.add(normKey);\n synonyms.add(normKey.replace(/_/g, \"\"));\n synonyms.add(normKey.replace(/_/g, \" \"));\n synonyms.add(normKey.replace(/\\./g, \"_\"));\n synonyms.add(normKey.replace(/_/g, \".\"));\n synonyms.add(normKey.toUpperCase());\n synonyms.add(\n normKey\n .split(\"_\")\n .map((w) => (w ? w[0]!.toUpperCase() + w.slice(1) : w))\n .join(\" \"),\n );\n\n synonyms.delete(\"\");\n synonyms.delete(normKey);\n\n const seen = new Set<string>();\n const unique: string[] = [];\n for (const syn of [...[...synonyms].sort(), ...synonymMap[normKey]!]) {\n if (!seen.has(syn)) {\n seen.add(syn);\n unique.push(syn);\n }\n }\n synonymMap[normKey] = unique;\n }\n\n return synonymMap;\n}\n\nfunction embeddingText(keyNorm: string, synonyms: readonly string[]): string {\n return `${keyNorm} ${synonyms.join(\" \")}`.trim();\n}\n\nfunction vectorLiteral(vector: readonly number[]): string {\n return `[${vector.map((x) => Number(x)).join(\",\")}]`;\n}\n\ninterface RegistryRow {\n id: string;\n key_norm: string;\n synonyms: string[] | null;\n embedding: unknown;\n example_values: string[] | null;\n frequency: number | null;\n}\n\n/**\n * Upsert `structuredData`'s keys into the field registry.\n *\n * Generates a field-name embedding (`Embedder.embed(..., kind=\"document\")`)\n * for any NEW field, or one whose synonym set changed, or one that somehow\n * has no embedding yet — batched into one `embed()` call per ingest rather\n * than one per field.\n *\n * Returns the embedding provider's token count (0 if nothing needed embedding).\n */\nexport async function upsertRegistry(opts: {\n pool: Pool;\n embedder: Embedder;\n sourceId: string | null;\n docType: string;\n structuredData: Record<string, unknown>;\n keysRaw: string[];\n keysNormalized: string[];\n}): Promise<number> {\n if (!opts.structuredData || !opts.docType) return 0;\n\n const synonymsMap = extractSynonyms(opts.keysRaw, opts.keysNormalized);\n const toEmbed: Array<[string, string]> = [];\n\n for (const [keyNorm, value] of Object.entries(opts.structuredData)) {\n const dataType = inferDataType(keyNorm, value);\n const exampleValue = value == null ? null : String(value).slice(0, 200);\n const newSynonyms = [\n ...new Set((synonymsMap[keyNorm] ?? []).map((s) => normalizeKey(s)).filter(Boolean)),\n ].sort();\n\n const existing = await opts.pool.query<RegistryRow>(\n `SELECT id, key_norm, synonyms, embedding, example_values, frequency\n FROM context_engine_structured_keys\n WHERE doc_type = $1 AND key_norm = $2\n AND (($3::text IS NULL AND source_id IS NULL) OR source_id = $3)\n LIMIT 1`,\n [opts.docType, keyNorm, opts.sourceId],\n );\n\n let rowId: string;\n let needsEmbedding = false;\n let synonymsForEmbed: string[] = newSynonyms;\n\n if (!existing.rows[0]) {\n rowId = randomUUID();\n await opts.pool.query(\n `INSERT INTO context_engine_structured_keys\n (id, source_id, doc_type, key_norm, data_type, synonyms, example_values, frequency)\n VALUES ($1,$2,$3,$4,$5,$6,$7,1)`,\n [\n rowId,\n opts.sourceId,\n opts.docType,\n keyNorm,\n dataType,\n newSynonyms,\n exampleValue ? [exampleValue] : [],\n ],\n );\n needsEmbedding = true;\n } else {\n const row = existing.rows[0];\n rowId = row.id;\n const freq = (row.frequency ?? 0) + 1;\n let exampleValues = [...(row.example_values ?? [])];\n if (exampleValue && !exampleValues.includes(exampleValue)) {\n exampleValues = [...exampleValues.slice(0, MAX_EXAMPLE_VALUES - 1), exampleValue];\n }\n const currentSyn = [...(row.synonyms ?? [])].sort();\n let merged = currentSyn;\n if (newSynonyms.length) {\n merged = [...new Set([...currentSyn, ...newSynonyms])].sort();\n if (merged.join(\"\\0\") !== currentSyn.join(\"\\0\")) needsEmbedding = true;\n }\n if (row.embedding == null) needsEmbedding = true;\n synonymsForEmbed = merged;\n await opts.pool.query(\n `UPDATE context_engine_structured_keys\n SET frequency = $1, example_values = $2, synonyms = $3, updated_at = now()\n WHERE id = $4`,\n [freq, exampleValues, merged, rowId],\n );\n }\n\n if (needsEmbedding) toEmbed.push([rowId, embeddingText(keyNorm, synonymsForEmbed)]);\n }\n\n if (!toEmbed.length) return 0;\n\n const [vectors, tokens] = await opts.embedder.embed(\n toEmbed.map(([, text]) => text),\n { kind: \"document\" },\n );\n for (let i = 0; i < toEmbed.length; i++) {\n const vec = vectors[i];\n if (!vec) continue;\n await opts.pool.query(\n `UPDATE context_engine_structured_keys SET embedding = $1::vector, updated_at = now() WHERE id = $2`,\n [vectorLiteral(vec), toEmbed[i]![0]],\n );\n }\n return tokens || 0;\n}\n\n/**\n * Resolve free-text field-name candidates to canonical registry keys.\n *\n * Cheapest-first: normalize → exact `key_norm` match → synonym-array\n * match → nearest registry embedding (cosine, gated by\n * FIELD_RESOLUTION_SIMILARITY_FLOOR). Unresolved candidates are simply\n * absent from the returned `{candidate: canonicalKey}` mapping.\n *\n * All still-unresolved candidates are embedded in ONE batched `embed()` call.\n *\n * No ACL: registry rows are field NAMES, not document content, so source_id\n * scoping is enough.\n */\nexport async function resolveFields(\n candidates: readonly string[],\n opts: {\n pool: Pool;\n embedder: Embedder;\n sourceIds?: string[] | null;\n docType?: string | null;\n },\n): Promise<Record<string, string>> {\n const normByCandidate: Record<string, string> = {};\n for (const c of candidates) {\n const n = normalizeKey(c);\n if (n) normByCandidate[c] = n;\n }\n if (!Object.keys(normByCandidate).length) return {};\n\n const { rows } = await opts.pool.query<{\n key_norm: string;\n synonyms: string[] | null;\n embedding: unknown;\n }>(\n `SELECT key_norm, synonyms, embedding\n FROM context_engine_structured_keys\n WHERE ($1::text[] IS NULL OR source_id = ANY($1))\n AND ($2::text IS NULL OR doc_type = $2)`,\n [opts.sourceIds ?? null, opts.docType ?? null],\n );\n\n const resolved: Record<string, string> = {};\n const unresolved: Array<[string, string]> = [];\n for (const [candidate, norm] of Object.entries(normByCandidate)) {\n const exact = rows.find((r) => r.key_norm === norm);\n if (exact) {\n resolved[candidate] = exact.key_norm;\n continue;\n }\n const synonymHit = rows.find((r) => (r.synonyms ?? []).includes(norm));\n if (synonymHit) {\n resolved[candidate] = synonymHit.key_norm;\n continue;\n }\n unresolved.push([candidate, norm]);\n }\n\n if (unresolved.length && rows.some((r) => r.embedding != null)) {\n let vectors: number[][] = [];\n try {\n [vectors] = await opts.embedder.embed(\n unresolved.map(([, norm]) => norm),\n { kind: \"query\" },\n );\n } catch (exc) {\n console.warn(\"resolveFields: batch embedding failed: %s\", exc);\n vectors = [];\n }\n\n for (let i = 0; i < unresolved.length; i++) {\n const vec = vectors[i];\n if (!vec) continue;\n const match = await nearestField(opts.pool, vec, opts.sourceIds ?? null, opts.docType ?? null);\n if (match) resolved[unresolved[i]![0]] = match;\n }\n }\n\n return resolved;\n}\n\nasync function nearestField(\n pool: Pool,\n vector: readonly number[],\n sourceIds: string[] | null,\n docType: string | null,\n): Promise<string | null> {\n const { rows } = await pool.query<{ key_norm: string; distance: number }>(\n `SELECT key_norm, (embedding <=> $1::vector) AS distance\n FROM context_engine_structured_keys\n WHERE embedding IS NOT NULL\n AND ($2::text[] IS NULL OR source_id = ANY($2))\n AND ($3::text IS NULL OR doc_type = $3)\n ORDER BY embedding <=> $1::vector\n LIMIT 1`,\n [vectorLiteral(vector), sourceIds, docType],\n );\n const row = rows[0];\n if (!row) return null;\n const similarity = 1.0 - Number(row.distance);\n if (similarity < FIELD_RESOLUTION_SIMILARITY_FLOOR) return null;\n return String(row.key_norm);\n}\n","/**\n * The ingestion pipeline: bytes/text in, document + chunk rows out.\n *\n * `ContextEngine.ingest()` is a thin shell over `runIngest()` here. One call\n * ingests ONE document through these stages:\n *\n * resolve input → extract → hygiene → dedup check → claim row (queued →\n * processing) → chunk → embed → upsert chunks → graph stage → complete\n *\n * Three rules worth stating up front:\n *\n * 1. **Dedup is by `ingest_hash` + mode.** Re-ingesting identical content at\n * the same-or-lower retrieval mode returns a `skipped` report row, costs\n * zero units, and does not re-process the content. Re-ingesting at a\n * HIGHER mode (hybrid → graph) re-processes fully so the graph stage can\n * run. **`skipped` is about CONTENT, not about the caller's declared\n * attributes**: `acl` / `name` / `description` / `metaData` are not part\n * of the hash, so a skip still applies them (`refreshOnSkip`).\n * 2. **The database is locked to one embedding model.**\n * 3. **Per-document failures are reported, not raised.** Only pre-flight\n * errors (bad arguments, graph disabled, embedding-model mismatch) raise.\n * Hash-redaction misconfig is the exception: finalize to `failed` THEN\n * rethrow so the row is not stuck `processing`.\n * 4. **`batch=true` stops after chunking.** Chunks are stored with\n * `embedding IS NULL`, the document lands at `status=\"batch_pending\"`.\n */\nimport { randomUUID } from \"node:crypto\";\nimport { readFileSync } from \"node:fs\";\nimport { basename } from \"node:path\";\nimport type { Pool } from \"pg\";\nimport {\n calculateContentHash,\n chunkerName,\n dedupLines,\n detectLanguage,\n inferMime,\n looksMostlyBoilerplate,\n routeToChunker,\n sanitizeText,\n sha256Bytes,\n} from \"./chunkers.js\";\nimport type { ContextEngineConfig } from \"./config.js\";\nimport { extract } from \"./extraction/index.js\";\nimport { emitError, emitUsage, type Hooks } from \"./hooks.js\";\nimport { submitEmbeddingBatch } from \"./providers/batch.js\";\nimport type { Embedder } from \"./providers/embeddings.js\";\nimport { applyRedaction, type RedactionPolicy } from \"./redaction.js\";\nimport type { ChunkRow, StorageBackend } from \"./storage.js\";\nimport {\n extractStructuredData,\n EXTRACTION_VERSION as STRUCTURED_EXTRACTION_VERSION,\n upsertRegistry,\n} from \"./structured.js\";\nimport { type DocumentReport, type IngestReport, type UsageEvent, unitsForFile } from \"./usage.js\";\n\nexport type Mode = \"hybrid\" | \"graph\";\n\n/** Retrieval modes are ordered: ingesting at a higher mode than the stored one is a backfill. */\nexport const MODE_RANK: Record<string, number> = { hybrid: 0, graph: 1 };\n\nexport const EMBED_BATCH = 256;\nexport const DOCX_CHARS_PER_PAGE = 1500;\nexport const DEFAULT_MIME = \"text/plain\";\n\nconst DOCX_MIMES = new Set([\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n \"application/msword\",\n]);\n\nconst EXTRA_EXT_MIMES: Record<string, string> = {\n \".pdf\": \"application/pdf\",\n \".docx\": \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n \".pptx\": \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".bmp\": \"image/bmp\",\n \".tif\": \"image/tiff\",\n \".tiff\": \"image/tiff\",\n \".webp\": \"image/webp\",\n \".txt\": \"text/plain\",\n \".tsv\": \"text/tab-separated-values\",\n};\n\nconst MIME_BY_EXT: Record<string, string> = { ...EXTRA_EXT_MIMES };\n\nexport interface IngestRequest {\n content?: Buffer | null;\n filename?: string | null;\n text?: string | null;\n name?: string | null;\n description?: string | null;\n sourceId?: string | null;\n externalId?: string | null;\n metaData?: Record<string, unknown> | null;\n acl?: string[] | null;\n mode?: Mode;\n batch?: boolean;\n extractStructured?: boolean;\n fieldHints?: Record<string, unknown>[] | null;\n}\n\nexport interface Prepared {\n text: string;\n mime: string;\n pages: number | null;\n slides: number | null;\n sizeBytes: number;\n llmPictures: number;\n mediaOnly: boolean;\n providerTokens: Record<string, number>;\n contentHash: string | null;\n isMarkdown: boolean;\n}\n\nexport interface Decision {\n action: \"process\" | \"skip\" | \"upgrade\";\n documentId: string | null;\n}\n\ninterface ContentPayload {\n text: string;\n mime: string;\n lang: string | null;\n ingestHash: Buffer;\n mode: string;\n metaUpdates: Record<string, unknown>;\n documentType?: string | null;\n structuredData?: Record<string, unknown> | null;\n structuredKeys?: string[] | null;\n structuredQuality?: Record<string, unknown> | null;\n extractionVersion?: string | null;\n}\n\nexport interface GraphStageArgs {\n documentId: string;\n chunks: ChunkRow[] | null;\n config: ContextEngineConfig;\n hooks: Hooks;\n}\n\nexport type GraphStage = (args: GraphStageArgs) => Promise<number> | number;\n\nfunction isUniqueViolation(exc: unknown): boolean {\n return (\n typeof exc === \"object\" && exc !== null && \"code\" in exc && (exc as { code?: string }).code === \"23505\"\n );\n}\n\nexport function mimeForFilename(filename: string | null | undefined): string | null {\n if (!filename) return null;\n const upstream = inferMime(null, filename);\n if (upstream) return upstream;\n const dot = filename.lastIndexOf(\".\");\n const ext = dot >= 0 ? filename.slice(dot).toLowerCase() : \"\";\n if (ext && MIME_BY_EXT[ext]) return MIME_BY_EXT[ext]!;\n return null;\n}\n\n/**\n * Normalize the three input modes to `[content, filename, text]`.\n *\n * Exactly one of `file` / `content` / `text` must be given — passing none\n * or more than one is a programming error, so it raises before any work.\n */\nexport function resolveSource(opts: {\n file?: unknown;\n content?: Buffer | Uint8Array | null;\n filename?: string | null;\n text?: string | null;\n}): [Buffer | null, string | null, string | null] {\n const provided = (\n [\n [\"file\", opts.file],\n [\"content\", opts.content],\n [\"text\", opts.text],\n ] as const\n ).filter(([, v]) => v != null);\n if (provided.length !== 1) {\n throw new Error(\n \"exactly one of file=, content= or text= must be provided \" +\n `(got: ${provided.map(([n]) => n).join(\", \") || \"none\"})`,\n );\n }\n\n if (opts.text != null) return [null, opts.filename ?? null, opts.text];\n if (opts.content != null) {\n const buf = Buffer.isBuffer(opts.content) ? opts.content : Buffer.from(opts.content);\n return [buf, opts.filename ?? null, null];\n }\n\n const file = opts.file;\n if (typeof file === \"string\") {\n const data = readFileSync(file);\n return [data, opts.filename || basename(file), null];\n }\n if (\n file &&\n typeof file === \"object\" &&\n \"buffer\" in (file as object) &&\n Buffer.isBuffer((file as { buffer: Buffer }).buffer)\n ) {\n const f = file as { buffer: Buffer; originalname?: string; name?: string };\n return [f.buffer, opts.filename || f.originalname || f.name || null, null];\n }\n if (Buffer.isBuffer(file)) return [file, opts.filename ?? null, null];\n if (file && typeof file === \"object\" && typeof (file as { read?: unknown }).read === \"function\") {\n const data = (file as { read: () => Buffer | string | Uint8Array }).read();\n const buf = typeof data === \"string\" ? Buffer.from(data, \"utf8\") : Buffer.from(data);\n const handleName = (file as { name?: unknown }).name;\n const inferred = typeof handleName === \"string\" ? basename(handleName) : null;\n return [buf, opts.filename || inferred, null];\n }\n throw new Error(\"file= must be a path or an object with a .read() method\");\n}\n\n/** Produce the document's final text + the numbers billing/chunking need. */\nexport async function prepare(opts: {\n content: Buffer | null;\n filename: string | null;\n text: string | null;\n name: string | null;\n config: ContextEngineConfig;\n hooks: Hooks;\n}): Promise<Prepared> {\n if (opts.text != null) {\n const clean = sanitizeText(opts.text) || \"\";\n const mime = inferMime(clean, opts.filename || opts.name) || DEFAULT_MIME;\n return {\n text: clean,\n mime,\n pages: null,\n slides: null,\n sizeBytes: Buffer.byteLength(clean, \"utf8\"),\n llmPictures: 0,\n mediaOnly: false,\n providerTokens: {},\n contentHash: calculateContentHash({ fullText: clean }),\n isMarkdown: false,\n };\n }\n\n const content = opts.content!;\n const fname = opts.filename || opts.name || \"\";\n const mime = mimeForFilename(fname) || \"\";\n const extracted = await extract(content, fname, mime || null, {\n visionLlm: opts.config.visionLlm,\n hooks: opts.hooks,\n });\n\n let body = sanitizeText(extracted.text || \"\") || \"\";\n const effectiveMime = mime || inferMime(body, fname) || DEFAULT_MIME;\n if (effectiveMime === \"application/pdf\" && body) body = dedupLines(body);\n\n return {\n text: body,\n mime: effectiveMime,\n pages: extracted.pages ?? null,\n slides: extracted.slides ?? null,\n sizeBytes: content.length,\n llmPictures: extracted.llmPictures ?? 0,\n mediaOnly: Boolean(extracted.mediaOnly),\n providerTokens: { ...(extracted.providerTokens ?? {}) },\n contentHash: calculateContentHash({ docBytes: content }),\n isMarkdown: Boolean(extracted.isMarkdown),\n };\n}\n\nexport function computeUnits(prepared: Prepared): number {\n let units = unitsForFile(prepared.mime, {\n pages: prepared.pages,\n slides: prepared.slides,\n sizeBytes: prepared.sizeBytes,\n });\n if (DOCX_MIMES.has(prepared.mime) && !prepared.pages && prepared.text) {\n units = Math.max(1, Math.ceil(prepared.text.length / DOCX_CHARS_PER_PAGE));\n }\n return units + Math.max(0, prepared.llmPictures);\n}\n\nfunction mergeFailed(failed: string[] | null | undefined, note: { rules_failed?: string[] }): void {\n if (!failed) return;\n for (const name of note.rules_failed ?? []) {\n if (!failed.includes(name)) failed.push(name);\n }\n}\n\n/**\n * Redact `text` for the DOCUMENT plane using `phase=\"ingest\"` rules.\n *\n * This is the document-level counterpart to the per-chunk redaction inside\n * `buildChunks`: it is what `runIngest` calls to compute `documentText` —\n * the value used for `Document.text`, `Document.lang`, and the input to\n * structured extraction. Without this, those document-plane values kept\n * deriving from the raw `prepared.text`, so an `apply_at=\"ingest\"` policy's\n * \"never-store\" promise held for chunks but not for the document row\n * `getDocument()` / `getDocumentText()` serve whole.\n *\n * `null`/empty `policy` is an exact no-op.\n */\nexport function redactDocumentText(\n text: string,\n policy: RedactionPolicy | null | undefined,\n secretKey: string | Buffer | null,\n hooks?: Hooks | null,\n failed?: string[] | null,\n): string {\n if (policy == null || policy.isEmpty()) return text;\n const [redacted, note] = applyRedaction(text, policy, {\n phase: \"ingest\",\n secretKey,\n hooks,\n });\n mergeFailed(failed, note);\n return redacted;\n}\n\n/**\n * Redact the STRING VALUES of one chunk's structural metadata.\n *\n * KEYS are never touched — they're field names (`section_title`,\n * `sheet_title`, ...), and redacting one would corrupt the result schema,\n * not its content. FLAT walk, deliberately — same trade-off as\n * `search.redactHits`' meta loop.\n */\nexport function redactChunkMeta(\n meta: Record<string, unknown>,\n policy: RedactionPolicy | null | undefined,\n secretKey: string | Buffer | null,\n hooks?: Hooks | null,\n failed?: string[] | null,\n): Record<string, unknown> {\n if (policy == null || policy.isEmpty()) return meta;\n const redacted: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(meta)) {\n if (typeof value === \"string\") {\n const [nv, note] = applyRedaction(value, policy, { phase: \"ingest\", secretKey, hooks });\n mergeFailed(failed, note);\n redacted[key] = nv;\n } else {\n redacted[key] = value;\n }\n }\n return redacted;\n}\n\n/**\n * Route text through the structure-aware chunkers → `ChunkRow`s.\n *\n * When `policy` carries ingest-phase rules, each chunk is redacted BEFORE\n * the `ChunkRow` is built — so the stored text, the detected language, and\n * (later) the embedding all derive from the masked string. An embedding of\n * unmasked text would itself be a partial leak.\n */\nexport function buildChunks(\n prepared: Prepared,\n name: string | null | undefined,\n opts: {\n policy?: RedactionPolicy | null;\n secretKey?: string | Buffer | null;\n hooks?: Hooks | null;\n failed?: string[] | null;\n } = {},\n): [ChunkRow[], string] {\n const [chunks, effectiveMime, chunkMetas] = routeToChunker(prepared.text, prepared.mime, name, {\n isMarkdown: prepared.isMarkdown,\n });\n let kind = chunkerName(effectiveMime);\n if (prepared.isMarkdown && kind === \"generic\") kind = \"markdown\";\n\n const rows: ChunkRow[] = [];\n for (let idx = 0; idx < chunks.length; idx++) {\n let clean = sanitizeText(chunks[idx]!);\n if (opts.policy != null && !opts.policy.isEmpty()) {\n const [redacted, note] = applyRedaction(clean, opts.policy, {\n phase: \"ingest\",\n secretKey: opts.secretKey,\n hooks: opts.hooks,\n });\n mergeFailed(opts.failed, note);\n clean = redacted;\n }\n if (!clean?.trim()) continue;\n const meta: Record<string, unknown> = { chunker: kind };\n if (idx < chunkMetas.length && chunkMetas[idx] && Object.keys(chunkMetas[idx]!).length) {\n Object.assign(\n meta,\n redactChunkMeta(chunkMetas[idx]!, opts.policy, opts.secretKey ?? null, opts.hooks, opts.failed),\n );\n }\n rows.push({ idx: rows.length, text: clean, lang: detectLanguage(clean), meta });\n }\n return [rows, effectiveMime || prepared.mime || DEFAULT_MIME];\n}\n\n/** Embed `rows` in place (batched). Returns the provider token count. */\nexport async function embedChunks(embedder: Embedder, rows: ChunkRow[]): Promise<number> {\n if (!rows.length) return 0;\n let totalTokens = 0;\n for (let start = 0; start < rows.length; start += EMBED_BATCH) {\n const batch = rows.slice(start, start + EMBED_BATCH);\n const [vectors, tokens] = await embedder.embed(\n batch.map((r) => r.text),\n { kind: \"document\" },\n );\n if (vectors.length !== batch.length) {\n throw new Error(`embedding provider returned ${vectors.length} vectors for ${batch.length} inputs`);\n }\n for (let i = 0; i < batch.length; i++) batch[i]!.embedding = [...vectors[i]!];\n totalTokens += tokens || 0;\n }\n return totalTokens;\n}\n\n/** Bind this database to one embedding provider/model, or raise. */\nexport async function checkEmbeddingLock(pool: Pool, config: ContextEngineConfig): Promise<void> {\n const provider = config.embedding.provider;\n const model = config.embedding.model;\n const { rows } = await pool.query(\n `SELECT embedding_provider, embedding_model, embedding_dim FROM context_engine_meta WHERE id = 1`,\n );\n let row = rows[0];\n if (!row) {\n await pool.query(`INSERT INTO context_engine_meta (id) VALUES (1) ON CONFLICT (id) DO NOTHING`);\n row = { embedding_provider: null, embedding_model: null, embedding_dim: null };\n }\n if (row.embedding_model == null && row.embedding_provider == null) {\n await pool.query(\n `UPDATE context_engine_meta\n SET embedding_provider = $1, embedding_model = $2,\n embedding_dim = COALESCE(embedding_dim, $3)\n WHERE id = 1`,\n [provider, model, config.embedding.dim ?? null],\n );\n return;\n }\n if (row.embedding_model !== model || row.embedding_provider !== provider) {\n throw new Error(\n \"embedding model mismatch: this database was ingested with \" +\n `provider=${JSON.stringify(row.embedding_provider)} model=${JSON.stringify(row.embedding_model)}, but the engine ` +\n `is configured with provider=${JSON.stringify(provider)} model=${JSON.stringify(model)}. Re-embedding an existing ` +\n \"corpus is not automatic — use a separate database for a different embedding model.\",\n );\n }\n}\n\n/** Record (or validate) the observed vector width after the first embed. */\nexport async function recordEmbeddingDim(pool: Pool, dim: number | null | undefined): Promise<void> {\n if (dim == null) return;\n const { rows } = await pool.query(`SELECT embedding_dim FROM context_engine_meta WHERE id = 1`);\n const row = rows[0];\n if (!row) return;\n if (row.embedding_dim == null) {\n await pool.query(`UPDATE context_engine_meta SET embedding_dim = $1 WHERE id = 1`, [dim]);\n } else if (Number(row.embedding_dim) !== dim) {\n throw new Error(\n `embedding dimension mismatch: this database's vector columns are ${row.embedding_dim}-wide ` +\n `(set by \\`context-engine migrate --dim\\`), but the configured embedding model returned ` +\n `${dim}-dimensional vectors.`,\n );\n }\n}\n\nasync function loadExisting(\n pool: Pool,\n opts: {\n sourceId: string | null;\n externalId: string | null;\n name: string | null;\n ingestHash: Buffer;\n },\n): Promise<Record<string, unknown> | null> {\n const scope = opts.sourceId == null ? `source_id IS NULL` : `source_id = $1`;\n const params: unknown[] = opts.sourceId == null ? [] : [opts.sourceId];\n let extra: string;\n if (opts.externalId != null) {\n params.push(opts.externalId);\n extra = `external_id = $${params.length}`;\n } else if (opts.name != null) {\n params.push(opts.name);\n extra = `name = $${params.length}`;\n } else {\n params.push(opts.ingestHash);\n extra = `ingest_hash = $${params.length}`;\n }\n const { rows } = await pool.query(\n `SELECT * FROM context_engine_documents WHERE ${scope} AND ${extra} ORDER BY created_at ASC LIMIT 1`,\n params,\n );\n return rows[0] ?? null;\n}\n\n/**\n * Compare an incoming hash against the stored document's.\n *\n * Called TWICE per ingest, with different hashes, on purpose:\n *\n * - `hashKind=\"content\"` runs BEFORE extraction, on the MD5 of the raw\n * bytes. An unchanged file must not re-pay for vision/OCR extraction.\n * - `hashKind=\"ingest\"` runs after extraction, on the SHA-256 of the\n * normalized text, and is the authoritative check.\n */\nexport async function decide(\n pool: Pool,\n opts: {\n request: IngestRequest;\n hashKind: \"content\" | \"ingest\";\n hashValue: Buffer | string | null;\n },\n): Promise<Decision> {\n if (opts.hashValue == null) return { action: \"process\", documentId: null };\n if (opts.hashKind === \"content\" && opts.request.externalId == null && opts.request.name == null) {\n return { action: \"process\", documentId: null };\n }\n\n const existing = await loadExisting(pool, {\n sourceId: opts.request.sourceId ?? null,\n externalId: opts.request.externalId ?? null,\n name: opts.request.name ?? null,\n ingestHash:\n opts.hashKind === \"ingest\" && Buffer.isBuffer(opts.hashValue) ? opts.hashValue : Buffer.alloc(0),\n });\n if (!existing) return { action: \"process\", documentId: null };\n\n const existingId = String(existing.id);\n if (existing.status !== \"completed\" && existing.status !== \"skipped\") {\n return { action: \"process\", documentId: existingId };\n }\n\n let stored: unknown;\n let incoming: unknown;\n if (opts.hashKind === \"ingest\") {\n stored = existing.ingest_hash != null ? Buffer.from(existing.ingest_hash as Buffer) : null;\n incoming = Buffer.isBuffer(opts.hashValue) ? opts.hashValue : Buffer.from(opts.hashValue as string);\n } else {\n stored = (existing.meta_data as Record<string, unknown> | null)?.content_hash;\n incoming = opts.hashValue;\n }\n\n const same =\n stored != null &&\n incoming != null &&\n (Buffer.isBuffer(stored) && Buffer.isBuffer(incoming)\n ? Buffer.compare(stored, incoming) === 0\n : stored === incoming);\n\n if (!same) return { action: \"process\", documentId: existingId };\n if (existing.status === \"skipped\") return { action: \"skip\", documentId: existingId };\n const reqMode = opts.request.mode ?? \"hybrid\";\n if ((MODE_RANK[reqMode] ?? 0) <= (MODE_RANK[(existing.mode as string) || \"hybrid\"] ?? 0)) {\n return { action: \"skip\", documentId: existingId };\n }\n return { action: \"upgrade\", documentId: existingId };\n}\n\n/**\n * Insert-or-reuse the row and move it `queued` → `processing`.\n *\n * The two states are committed separately and in order, so `queued` is\n * genuinely observable by a concurrent reader rather than being an\n * in-memory value that only ever hits the database as `processing`.\n *\n * Only caller-declared attributes are written here. Everything derived\n * from the content lands at completion.\n */\nexport async function claimDocument(\n pool: Pool,\n opts: { request: IngestRequest; documentId: string | null },\n): Promise<string> {\n const client = await pool.connect();\n try {\n let id = opts.documentId;\n const req = opts.request;\n if (id) {\n const { rows } = await client.query(`SELECT id FROM context_engine_documents WHERE id = $1`, [id]);\n if (!rows[0]) id = null;\n }\n if (!id) {\n id = randomUUID();\n await client.query(\n `INSERT INTO context_engine_documents\n (id, source_id, external_id, name, description, acl, status, error, started_at, completed_at)\n VALUES ($1,$2,$3,$4,$5,$6,'queued',NULL,NULL,NULL)`,\n [\n id,\n req.sourceId ?? null,\n req.externalId ?? null,\n req.name ?? null,\n req.description ?? null,\n req.acl ?? null,\n ],\n );\n } else {\n await client.query(\n `UPDATE context_engine_documents\n SET source_id=$1, external_id=$2, name=$3, description=$4, acl=$5,\n error=NULL, status='queued', started_at=NULL, completed_at=NULL, updated_at=now()\n WHERE id=$6`,\n [\n req.sourceId ?? null,\n req.externalId ?? null,\n req.name ?? null,\n req.description ?? null,\n req.acl ?? null,\n id,\n ],\n );\n }\n await client.query(\n `UPDATE context_engine_documents SET status='processing', started_at=now(), updated_at=now() WHERE id=$1`,\n [id],\n );\n return id;\n } finally {\n client.release();\n }\n}\n\nexport async function finalizeDocument(\n pool: Pool,\n documentId: string,\n opts: { status: string; error?: string | null; content?: ContentPayload | null },\n): Promise<void> {\n if (opts.content) {\n const c = opts.content;\n const { rows } = await pool.query(`SELECT meta_data FROM context_engine_documents WHERE id = $1`, [\n documentId,\n ]);\n if (!rows[0]) return;\n const meta = { ...((rows[0].meta_data as Record<string, unknown>) ?? {}), ...c.metaUpdates };\n await pool.query(\n `UPDATE context_engine_documents SET\n text=$1, mime_type=$2, lang=$3, ingest_hash=$4, mode=$5, meta_data=$6::jsonb,\n document_type=COALESCE($7, document_type),\n structured_data=COALESCE($8::jsonb, structured_data),\n structured_keys=COALESCE($9::text[], structured_keys),\n structured_quality=COALESCE($10::jsonb, structured_quality),\n extraction_version=COALESCE($11, extraction_version),\n status=$12, error=$13, completed_at=now(), updated_at=now()\n WHERE id=$14`,\n [\n c.text,\n c.mime,\n c.lang,\n c.ingestHash,\n c.mode,\n JSON.stringify(meta),\n c.documentType ?? null,\n c.structuredData != null ? JSON.stringify(c.structuredData) : null,\n c.structuredKeys ?? null,\n c.structuredQuality != null ? JSON.stringify(c.structuredQuality) : null,\n c.extractionVersion ?? null,\n opts.status,\n opts.error ?? null,\n documentId,\n ],\n );\n return;\n }\n await pool.query(\n `UPDATE context_engine_documents SET status=$1, error=$2, completed_at=now(), updated_at=now() WHERE id=$3`,\n [opts.status, opts.error ?? null, documentId],\n );\n}\n\nexport async function refreshContentHash(\n pool: Pool,\n documentId: string | null,\n contentHash: string | null,\n): Promise<void> {\n if (!contentHash || !documentId) return;\n const { rows } = await pool.query(`SELECT meta_data FROM context_engine_documents WHERE id = $1`, [\n documentId,\n ]);\n if (!rows[0]) return;\n const meta = { ...((rows[0].meta_data as Record<string, unknown>) ?? {}) };\n if (meta.content_hash === contentHash) return;\n meta.content_hash = contentHash;\n await pool.query(`UPDATE context_engine_documents SET meta_data=$1::jsonb, updated_at=now() WHERE id=$2`, [\n JSON.stringify(meta),\n documentId,\n ]);\n}\n\n/**\n * Apply caller-declared attribute changes to a document row.\n *\n * `updates` contains ONLY the fields the caller provided: `acl`/`name`/\n * `description` are REPLACED with the given value (including `null`);\n * `meta_data`/`metaData` is MERGED. Shared by the skip-path refresh and\n * `ContextEngine.updateDocument` (partial PATCH).\n *\n * Throws if the document is absent. Returns the names of the fields that\n * actually changed. `\"acl\"` in that list is the caller's signal to push\n * the new value onto the chunk plane.\n */\nexport async function applyAttributeUpdates(\n pool: Pool,\n documentId: string,\n updates: Record<string, unknown>,\n): Promise<string[]> {\n const { rows } = await pool.query(`SELECT * FROM context_engine_documents WHERE id = $1`, [documentId]);\n const doc = rows[0];\n if (!doc) {\n const err = new Error(`document not found: ${JSON.stringify(documentId)}`);\n err.name = \"KeyError\";\n throw err;\n }\n\n const changed: string[] = [];\n const sets: string[] = [];\n const vals: unknown[] = [];\n let i = 1;\n\n if (\"acl\" in updates) {\n const storedAcl = doc.acl != null ? [...(doc.acl as string[])] : null;\n const next = updates.acl as string[] | null;\n const same =\n storedAcl === next ||\n (Array.isArray(storedAcl) &&\n Array.isArray(next) &&\n storedAcl.length === next.length &&\n storedAcl.every((v, idx) => v === next[idx]));\n if (!same) {\n sets.push(`acl = $${i++}`);\n vals.push(next);\n changed.push(\"acl\");\n }\n }\n for (const field of [\"name\", \"description\"] as const) {\n if (field in updates && doc[field] !== updates[field]) {\n sets.push(`${field} = $${i++}`);\n vals.push(updates[field]);\n changed.push(field);\n }\n }\n const metaUpdate = (updates.meta_data ?? updates.metaData) as Record<string, unknown> | null | undefined;\n if (metaUpdate && typeof metaUpdate === \"object\") {\n const meta = { ...((doc.meta_data as Record<string, unknown>) ?? {}) };\n const merged = { ...meta, ...metaUpdate };\n if (JSON.stringify(merged) !== JSON.stringify(meta)) {\n sets.push(`meta_data = $${i++}::jsonb`);\n vals.push(JSON.stringify(merged));\n changed.push(\"meta_data\");\n }\n }\n\n if (!changed.length) return [];\n sets.push(\"updated_at = now()\");\n vals.push(documentId);\n await pool.query(`UPDATE context_engine_documents SET ${sets.join(\", \")} WHERE id = $${i}`, vals);\n return changed;\n}\n\n/**\n * Apply the caller's declared attributes to a document being SKIPPED.\n *\n * **This is a security fix, not a nicety.** Dedup decides from content, but\n * `acl` / `name` / `description` / `metaData` are declared by the CALLER\n * and are not part of the hash. Without this, re-ingesting identical text\n * with a NEW `acl` returned `skipped` before anything was written, the\n * document (and its denormalized chunk copies) kept the OLD ACL, and a\n * tightening the caller believed had applied silently did nothing.\n *\n * - `name` / `description` / `acl` are REPLACED, including with `null`.\n * `acl=null` means \"unrestricted\", not \"leave whatever was there\".\n * - `metaData` is MERGED.\n */\nexport async function refreshDeclaredAttributes(\n pool: Pool,\n documentId: string,\n request: IngestRequest,\n): Promise<string[]> {\n try {\n return await applyAttributeUpdates(pool, documentId, {\n acl: request.acl ?? null,\n name: request.name ?? null,\n description: request.description ?? null,\n meta_data: request.metaData ?? null,\n });\n } catch (exc) {\n if (exc instanceof Error && exc.name === \"KeyError\") return [];\n throw exc;\n }\n}\n\nasync function backfillStructuredExtraction(\n request: IngestRequest,\n opts: {\n pool: Pool;\n embedder: Embedder;\n hooks: Hooks;\n llmCfg: NonNullable<ContextEngineConfig[\"llm\"]>;\n documentId: string;\n },\n): Promise<void> {\n const { rows } = await opts.pool.query(\n `SELECT text, structured_data, source_id FROM context_engine_documents WHERE id = $1`,\n [opts.documentId],\n );\n const doc = rows[0];\n if (!doc) return;\n if (doc.structured_data != null || !doc.text || !String(doc.text).trim()) return;\n\n const extraction = await extractStructuredData(String(doc.text), {\n llmCfg: opts.llmCfg,\n fieldHints: request.fieldHints,\n });\n\n const providerTokens: Record<string, number> = {};\n if (extraction.providerTokens.llm_input)\n providerTokens.structured_llm_input = extraction.providerTokens.llm_input;\n if (extraction.providerTokens.llm_output)\n providerTokens.structured_llm_output = extraction.providerTokens.llm_output;\n\n if (extraction.documentType != null) {\n let embedTokens = 0;\n if (Object.keys(extraction.structuredData).length) {\n try {\n embedTokens = await upsertRegistry({\n pool: opts.pool,\n embedder: opts.embedder,\n sourceId: doc.source_id ?? null,\n docType: extraction.documentType,\n structuredData: extraction.structuredData,\n keysRaw: extraction.keysRaw,\n keysNormalized: extraction.keysNormalized,\n });\n } catch (exc) {\n emitError(opts.hooks, exc, { stage: \"structured_registry_backfill\", document_id: opts.documentId });\n embedTokens = 0;\n }\n }\n if (embedTokens) providerTokens.structured_embedding_tokens = embedTokens;\n await opts.pool.query(\n `UPDATE context_engine_documents SET\n document_type=$1, structured_data=$2::jsonb, structured_keys=$3,\n structured_quality=$4::jsonb, extraction_version=$5, updated_at=now()\n WHERE id=$6`,\n [\n extraction.documentType,\n JSON.stringify(extraction.structuredData),\n extraction.keysNormalized,\n JSON.stringify({ quality: extraction.quality }),\n STRUCTURED_EXTRACTION_VERSION,\n opts.documentId,\n ],\n );\n } else if (extraction.error) {\n emitError(opts.hooks, new Error(extraction.error), {\n stage: \"structured_extraction_backfill\",\n document_id: opts.documentId,\n });\n }\n\n if (Object.keys(providerTokens).length) {\n emitUsage(opts.hooks, {\n kind: \"ingest\",\n units: 0,\n detail: { document_id: opts.documentId, backfill: \"structured_extraction\" },\n providerTokens,\n } satisfies UsageEvent);\n }\n}\n\n/**\n * Refresh declared attributes across BOTH planes for a skipped document.\n *\n * Called from every skip path — the cheap pre-extraction one, the\n * post-extraction one, and the lost-race one — because all three return\n * without writing anything, and all three are reachable with a changed ACL.\n *\n * Also the choke point for structured-extraction backfill on a skip:\n * `extractStructured=true` against unchanged content used to be a silent\n * no-op because extraction only ran on the `process` branch.\n */\nexport async function refreshOnSkip(\n request: IngestRequest,\n opts: {\n pool: Pool;\n backend: StorageBackend;\n documentId: string | null;\n config: ContextEngineConfig;\n embedder: Embedder;\n hooks: Hooks;\n },\n): Promise<string[]> {\n if (!opts.documentId) return [];\n const changed = await refreshDeclaredAttributes(opts.pool, opts.documentId, request);\n if (changed.includes(\"acl\")) {\n await opts.backend.updateChunkAcl(opts.documentId, request.acl ?? null);\n }\n if (request.extractStructured && opts.config.llm != null) {\n await backfillStructuredExtraction(request, {\n pool: opts.pool,\n embedder: opts.embedder,\n hooks: opts.hooks,\n llmCfg: opts.config.llm,\n documentId: opts.documentId,\n });\n }\n return changed;\n}\n\nasync function upgradeMode(pool: Pool, documentId: string, mode: string): Promise<number> {\n await pool.query(`UPDATE context_engine_documents SET mode=$1, updated_at=now() WHERE id=$2`, [\n mode,\n documentId,\n ]);\n const { rows } = await pool.query(\n `SELECT count(*)::int AS n FROM context_engine_chunks WHERE document_id=$1`,\n [documentId],\n );\n return rows[0]?.n ?? 0;\n}\n\nfunction skippedReport(documentId: string | null, name: string, pages: number | null = null): DocumentReport {\n return {\n documentId: String(documentId ?? \"\"),\n name,\n status: \"skipped\",\n pages,\n chunks: 0,\n units: 0,\n graphUnits: 0,\n providerTokens: {},\n error: null,\n redactionFailed: [],\n };\n}\n\nfunction singleReport(doc: DocumentReport): IngestReport {\n return {\n documents: [doc],\n totals: {\n files: 1,\n failed: doc.status === \"failed\" ? 1 : 0,\n units: doc.units + doc.graphUnits,\n graphUnits: doc.graphUnits,\n },\n };\n}\n\nasync function maybeAwait(value: Promise<number> | number): Promise<number> {\n return value;\n}\n\nasync function runModeUpgrade(\n request: IngestRequest,\n opts: {\n config: ContextEngineConfig;\n hooks: Hooks;\n pool: Pool;\n backend: StorageBackend;\n embedder: Embedder;\n graphStage: GraphStage | null | undefined;\n documentId: string;\n displayName: string;\n },\n): Promise<IngestReport> {\n await refreshOnSkip(request, {\n pool: opts.pool,\n backend: opts.backend,\n documentId: opts.documentId,\n config: opts.config,\n embedder: opts.embedder,\n hooks: opts.hooks,\n });\n\n let graphUnits = 0;\n let chunkCount = 0;\n try {\n if (request.mode === \"graph\" && opts.graphStage) {\n graphUnits = Number(\n (await maybeAwait(\n opts.graphStage({\n documentId: opts.documentId,\n chunks: null,\n config: opts.config,\n hooks: opts.hooks,\n }),\n )) || 0,\n );\n }\n chunkCount = await upgradeMode(opts.pool, opts.documentId, request.mode ?? \"hybrid\");\n } catch (exc) {\n emitError(opts.hooks, exc, { stage: \"mode_upgrade\", document: opts.displayName });\n return singleReport({\n documentId: String(opts.documentId),\n name: opts.displayName,\n status: \"failed\",\n pages: null,\n chunks: 0,\n units: 0,\n graphUnits: 0,\n providerTokens: {},\n error: String(exc),\n redactionFailed: [],\n });\n }\n\n if (graphUnits) {\n emitUsage(opts.hooks, {\n kind: \"ingest\",\n units: graphUnits,\n detail: {\n document_id: String(opts.documentId),\n name: opts.displayName,\n mode: request.mode,\n upgrade: true,\n chunks: chunkCount,\n graph_units: graphUnits,\n },\n } satisfies UsageEvent);\n }\n\n return singleReport({\n documentId: String(opts.documentId),\n name: opts.displayName,\n status: \"upgraded\",\n pages: null,\n chunks: chunkCount,\n units: 0,\n graphUnits,\n providerTokens: {},\n error: null,\n redactionFailed: [],\n });\n}\n\n/**\n * Ingest one document end to end and return its report.\n *\n * `contentSource` is the already-resolved `[content, filename, text]`\n * triple from `resolveSource`; the engine resolves it first so a bad\n * argument combination raises before any DB or network work.\n */\nexport async function runIngest(\n request: IngestRequest,\n opts: {\n config: ContextEngineConfig;\n hooks: Hooks;\n backend: StorageBackend;\n embedder: Embedder;\n pool: Pool;\n graphStage?: GraphStage | null;\n contentSource?: [Buffer | null, string | null, string | null] | null;\n },\n): Promise<IngestReport> {\n const [content, filename, text] = opts.contentSource ?? [\n request.content ?? null,\n request.filename ?? null,\n request.text ?? null,\n ];\n const displayName = request.name || filename || request.externalId || \"(unnamed)\";\n const mode: Mode = request.mode ?? opts.config.defaultMode;\n\n await checkEmbeddingLock(opts.pool, opts.config);\n\n if (content != null) {\n const pre = await decide(opts.pool, {\n request: { ...request, mode },\n hashKind: \"content\",\n hashValue: calculateContentHash({ docBytes: content }),\n });\n if (pre.action === \"skip\") {\n await refreshOnSkip(\n { ...request, mode },\n {\n pool: opts.pool,\n backend: opts.backend,\n documentId: pre.documentId,\n config: opts.config,\n embedder: opts.embedder,\n hooks: opts.hooks,\n },\n );\n return singleReport(skippedReport(pre.documentId, displayName));\n }\n if (pre.action === \"upgrade\") {\n return runModeUpgrade(\n { ...request, mode },\n {\n config: opts.config,\n hooks: opts.hooks,\n pool: opts.pool,\n backend: opts.backend,\n embedder: opts.embedder,\n graphStage: opts.graphStage,\n documentId: pre.documentId!,\n displayName,\n },\n );\n }\n }\n\n const prepared = await prepare({\n content,\n filename,\n text,\n name: request.name ?? null,\n config: opts.config,\n hooks: opts.hooks,\n });\n\n const ingestHash = sha256Bytes(prepared.text || \"\");\n const decision = await decide(opts.pool, {\n request: { ...request, mode },\n hashKind: \"ingest\",\n hashValue: ingestHash,\n });\n\n if (decision.action === \"skip\") {\n await refreshContentHash(opts.pool, decision.documentId, prepared.contentHash);\n await refreshOnSkip(\n { ...request, mode },\n {\n pool: opts.pool,\n backend: opts.backend,\n documentId: decision.documentId,\n config: opts.config,\n embedder: opts.embedder,\n hooks: opts.hooks,\n },\n );\n return singleReport(skippedReport(decision.documentId, displayName, prepared.pages));\n }\n\n if (decision.action === \"upgrade\") {\n return runModeUpgrade(\n { ...request, mode },\n {\n config: opts.config,\n hooks: opts.hooks,\n pool: opts.pool,\n backend: opts.backend,\n embedder: opts.embedder,\n graphStage: opts.graphStage,\n documentId: decision.documentId!,\n displayName,\n },\n );\n }\n\n let documentId: string;\n try {\n documentId = await claimDocument(opts.pool, {\n request: { ...request, mode },\n documentId: decision.documentId,\n });\n } catch (exc) {\n if (!isUniqueViolation(exc)) throw exc;\n const retry = await decide(opts.pool, {\n request: { ...request, mode },\n hashKind: \"ingest\",\n hashValue: ingestHash,\n });\n if (retry.action === \"skip\") {\n await refreshOnSkip(\n { ...request, mode },\n {\n pool: opts.pool,\n backend: opts.backend,\n documentId: retry.documentId,\n config: opts.config,\n embedder: opts.embedder,\n hooks: opts.hooks,\n },\n );\n return singleReport(skippedReport(retry.documentId, displayName, prepared.pages));\n }\n if (retry.action === \"upgrade\") {\n return runModeUpgrade(\n { ...request, mode },\n {\n config: opts.config,\n hooks: opts.hooks,\n pool: opts.pool,\n backend: opts.backend,\n embedder: opts.embedder,\n graphStage: opts.graphStage,\n documentId: retry.documentId!,\n displayName,\n },\n );\n }\n documentId = await claimDocument(opts.pool, {\n request: { ...request, mode },\n documentId: retry.documentId,\n });\n }\n\n const metaUpdates: Record<string, unknown> = { ...(request.metaData ?? {}) };\n metaUpdates.mime_type = prepared.mime;\n if (prepared.contentHash) metaUpdates.content_hash = prepared.contentHash;\n\n const redactionFailed: string[] = [];\n let documentText: string;\n try {\n documentText = redactDocumentText(\n prepared.text,\n opts.config.redaction,\n opts.config.secretKey,\n opts.hooks,\n redactionFailed,\n );\n } catch (exc) {\n // A misconfigured policy (a `hash` rule with no `secretKey`) must still\n // raise loudly: swallowing it would silently store unmasked text.\n // `claimDocument` already committed this row to `status=\"processing\"`.\n // Finalize to `failed` first, THEN rethrow — propagation AND terminal\n // state, not one or the other.\n await finalizeDocument(opts.pool, documentId, { status: \"failed\", error: String(exc) });\n throw exc;\n }\n\n if (!prepared.text.trim() || prepared.mediaOnly || looksMostlyBoilerplate(prepared.text)) {\n const reason = prepared.mediaOnly ? \"media-only (no extractable text)\" : \"no extractable text\";\n await opts.backend.upsertChunks(documentId, request.sourceId ?? null, request.acl ?? null, []);\n await finalizeDocument(opts.pool, documentId, {\n status: \"skipped\",\n error: reason,\n content: {\n text: documentText,\n mime: prepared.mime,\n lang: null,\n ingestHash,\n mode,\n metaUpdates,\n },\n });\n return singleReport({\n documentId: String(documentId),\n name: displayName,\n status: \"skipped\",\n pages: prepared.pages,\n chunks: 0,\n units: 0,\n graphUnits: 0,\n providerTokens: {},\n error: reason,\n redactionFailed,\n });\n }\n\n const units = computeUnits(prepared);\n const providerTokens: Record<string, number> = {};\n if (prepared.providerTokens.input) providerTokens.llm_input = prepared.providerTokens.input;\n if (prepared.providerTokens.output) providerTokens.llm_output = prepared.providerTokens.output;\n\n let rows: ChunkRow[] = [];\n let effectiveMime = prepared.mime;\n try {\n [rows, effectiveMime] = buildChunks(prepared, request.name, {\n policy: opts.config.redaction,\n secretKey: opts.config.secretKey,\n hooks: opts.hooks,\n failed: redactionFailed,\n });\n\n if (request.batch) {\n await opts.backend.upsertChunks(documentId, request.sourceId ?? null, request.acl ?? null, rows);\n const batchId = await submitEmbeddingBatch(\n opts.config.embedding,\n rows.map((r) => r.text),\n );\n metaUpdates.mime_type = effectiveMime;\n metaUpdates.batch = {\n id: batchId,\n units,\n chunks: rows.length,\n mode,\n provider_tokens: providerTokens,\n };\n await finalizeDocument(opts.pool, documentId, {\n status: \"batch_pending\",\n content: {\n text: documentText,\n mime: effectiveMime,\n lang: detectLanguage(documentText),\n ingestHash,\n mode,\n metaUpdates,\n },\n });\n return singleReport({\n documentId: String(documentId),\n name: displayName,\n status: \"batch_pending\",\n pages: prepared.pages,\n chunks: rows.length,\n units: 0,\n graphUnits: 0,\n providerTokens,\n error: null,\n redactionFailed,\n });\n }\n\n const embeddingTokens = await embedChunks(opts.embedder, rows);\n if (embeddingTokens) providerTokens.embedding_tokens = embeddingTokens;\n await recordEmbeddingDim(opts.pool, opts.embedder.dim);\n\n await opts.backend.upsertChunks(documentId, request.sourceId ?? null, request.acl ?? null, rows);\n\n const structuredKw: Partial<ContentPayload> = {};\n if (request.extractStructured && opts.config.llm) {\n const extraction = await extractStructuredData(documentText, {\n llmCfg: opts.config.llm,\n fieldHints: request.fieldHints,\n });\n if (extraction.providerTokens.llm_input) {\n providerTokens.structured_llm_input = extraction.providerTokens.llm_input;\n }\n if (extraction.providerTokens.llm_output) {\n providerTokens.structured_llm_output = extraction.providerTokens.llm_output;\n }\n if (extraction.documentType != null) {\n let embedTokens = 0;\n if (Object.keys(extraction.structuredData).length) {\n try {\n embedTokens = await upsertRegistry({\n pool: opts.pool,\n embedder: opts.embedder,\n sourceId: request.sourceId ?? null,\n docType: extraction.documentType,\n structuredData: extraction.structuredData,\n keysRaw: extraction.keysRaw,\n keysNormalized: extraction.keysNormalized,\n });\n } catch (exc) {\n emitError(opts.hooks, exc, { stage: \"structured_registry\", document: displayName });\n embedTokens = 0;\n }\n }\n structuredKw.documentType = extraction.documentType;\n structuredKw.structuredData = extraction.structuredData;\n structuredKw.structuredKeys = extraction.keysNormalized;\n structuredKw.structuredQuality = { quality: extraction.quality };\n structuredKw.extractionVersion = STRUCTURED_EXTRACTION_VERSION;\n if (embedTokens) providerTokens.structured_embedding_tokens = embedTokens;\n } else if (extraction.error) {\n emitError(opts.hooks, new Error(extraction.error), {\n stage: \"structured_extraction\",\n document: displayName,\n });\n }\n }\n\n let graphUnits = 0;\n if (mode === \"graph\" && opts.graphStage) {\n graphUnits = Number(\n (await maybeAwait(\n opts.graphStage({\n documentId,\n chunks: rows,\n config: opts.config,\n hooks: opts.hooks,\n }),\n )) || 0,\n );\n }\n\n metaUpdates.mime_type = effectiveMime;\n await finalizeDocument(opts.pool, documentId, {\n status: \"completed\",\n content: {\n text: documentText,\n mime: effectiveMime,\n lang: detectLanguage(documentText),\n ingestHash,\n mode,\n metaUpdates,\n ...structuredKw,\n },\n });\n\n emitUsage(opts.hooks, {\n kind: \"ingest\",\n units: units + graphUnits,\n detail: {\n document_id: String(documentId),\n name: displayName,\n mime: effectiveMime,\n mode,\n pages: prepared.pages,\n slides: prepared.slides,\n chunks: rows.length,\n graph_units: graphUnits,\n },\n providerTokens,\n } satisfies UsageEvent);\n\n return singleReport({\n documentId: String(documentId),\n name: displayName,\n status: \"completed\",\n pages: prepared.pages,\n chunks: rows.length,\n units,\n graphUnits,\n providerTokens,\n error: null,\n redactionFailed,\n });\n } catch (exc) {\n emitError(opts.hooks, exc, { stage: \"ingest\", document: displayName });\n await finalizeDocument(opts.pool, documentId, { status: \"failed\", error: String(exc) });\n return singleReport({\n documentId: String(documentId),\n name: displayName,\n status: \"failed\",\n pages: prepared.pages,\n chunks: 0,\n units: 0,\n graphUnits: 0,\n providerTokens,\n error: String(exc),\n redactionFailed,\n });\n }\n}\n","/**\n * OpenAI Batch API — transport behind `ContextEngine.ingest({ batch: true })`.\n *\n * Only `openai` and `azure_openai` (not `custom`). JSONL lines are\n * `{ custom_id: String(i), method: \"POST\", url: \"/v1/embeddings\", body: { model, input: text } }`.\n * `pollEmbeddingBatch` returns `null` if still running.\n */\n\nimport OpenAI from \"openai\";\nimport type { EmbeddingConfig } from \"../config.js\";\n\nexport const TIMEOUT_MS = 30_000;\n\nconst BATCH_PROVIDERS = new Set([\"openai\", \"azure_openai\"]);\n\nconst TERMINAL_FAILURE_STATES = new Set([\"failed\", \"expired\", \"cancelled\"]);\n\nexport type BatchApiClient = {\n files: {\n create(body: { file: unknown; purpose: string }): Promise<{ id: string }>;\n content(fileId: string): Promise<{ text?: string | (() => Promise<string>) } | Response>;\n };\n batches: {\n create(body: {\n input_file_id: string;\n endpoint: string;\n completion_window: string;\n }): Promise<{ id: string }>;\n retrieve(batchId: string): Promise<{\n status: string;\n output_file_id?: string | null;\n }>;\n };\n};\n\nfunction checkProvider(cfg: EmbeddingConfig): void {\n if (!BATCH_PROVIDERS.has(cfg.provider)) {\n throw new Error(`batch not supported for provider ${JSON.stringify(cfg.provider)} — use batch=False`);\n }\n}\n\n/** Test seam: the only network-touching constructor in this module. */\nexport function _buildClient(cfg: EmbeddingConfig): OpenAI {\n return new OpenAI({\n apiKey: cfg.apiKey ?? undefined,\n baseURL: cfg.baseUrl ?? undefined,\n timeout: TIMEOUT_MS,\n maxRetries: 0,\n });\n}\n\n/**\n * Upload `texts` as a `/v1/embeddings` JSONL batch job. Returns the batch id.\n * `custom_id` is the text's position in `texts` (as a string).\n */\nexport async function submitEmbeddingBatch(\n cfg: EmbeddingConfig,\n texts: string[],\n opts: { client?: BatchApiClient | null } = {},\n): Promise<string> {\n checkProvider(cfg);\n const client = opts.client ?? _buildClient(cfg);\n\n const lines = texts.map((text, i) =>\n JSON.stringify({\n custom_id: String(i),\n method: \"POST\",\n url: \"/v1/embeddings\",\n body: { model: cfg.model, input: text },\n }),\n );\n const jsonl = lines.length > 0 ? Buffer.from(`${lines.join(\"\\n\")}\\n`, \"utf-8\") : Buffer.alloc(0);\n\n const fileObj = await client.files.create({\n file: new File([jsonl], \"batch_input.jsonl\"),\n purpose: \"batch\",\n });\n const batch = await client.batches.create({\n input_file_id: fileObj.id,\n endpoint: \"/v1/embeddings\",\n completion_window: \"24h\",\n });\n return batch.id;\n}\n\nasync function readFileText(content: unknown): Promise<string> {\n if (content && typeof content === \"object\") {\n const c = content as { text?: unknown };\n if (typeof c.text === \"function\") {\n return await (c.text as () => Promise<string>)();\n }\n if (typeof c.text === \"string\") return c.text;\n }\n throw new Error(\"unexpected batch file content\");\n}\n\n/**\n * Check one batch job's status.\n *\n * Returns embeddings in submission order once completed, or `null` if still\n * running. Raises if the job ended in a state that will never produce results\n * (failed/expired/cancelled), or if an individual request inside a completed\n * job failed.\n */\nexport async function pollEmbeddingBatch(\n cfg: EmbeddingConfig,\n batchId: string,\n opts: { client?: BatchApiClient | null } = {},\n): Promise<number[][] | null> {\n checkProvider(cfg);\n const client = opts.client ?? _buildClient(cfg);\n\n const batch = await client.batches.retrieve(batchId);\n if (TERMINAL_FAILURE_STATES.has(batch.status)) {\n throw new Error(`embedding batch ${batchId} ended with status=${JSON.stringify(batch.status)}`);\n }\n if (batch.status !== \"completed\") {\n return null;\n }\n if (!batch.output_file_id) {\n throw new Error(`embedding batch ${batchId} completed but produced no output file`);\n }\n\n const content = await client.files.content(batch.output_file_id);\n const raw = await readFileText(content);\n\n const byIndex = new Map<number, number[]>();\n for (const line of raw.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n const row = JSON.parse(trimmed) as {\n custom_id: string;\n error?: unknown;\n response?: { body?: { data?: Array<{ embedding: number[] }> } };\n };\n const customId = Number.parseInt(row.custom_id, 10);\n if (row.error) {\n const errText = typeof row.error === \"string\" ? row.error : JSON.stringify(row.error);\n throw new Error(`embedding batch ${batchId} item ${customId} failed: ${errText}`);\n }\n const embedding = row.response?.body?.data?.[0]?.embedding;\n if (!embedding) {\n throw new Error(`embedding batch ${batchId} item ${customId} failed: missing embedding`);\n }\n byIndex.set(customId, embedding);\n }\n\n return [...byIndex.keys()].sort((a, b) => a - b).map((i) => byIndex.get(i)!);\n}\n","import { z } from \"zod\";\nimport { RedactionPolicy, RedactionRule, type RedactionRuleInit } from \"./redaction.js\";\n\nconst embeddingSchema = z.object({\n provider: z.enum([\"openai\", \"azure_openai\", \"gemini\", \"voyage\", \"cohere\", \"custom\"]),\n model: z.string(),\n dim: z.number().int().positive().nullable().optional().default(null),\n apiKey: z.string().nullable().optional().default(null),\n baseUrl: z.string().nullable().optional().default(null),\n});\n\nconst llmSchema = z.object({\n provider: z.enum([\"anthropic\", \"openai\", \"azure_openai\", \"gemini\", \"bedrock\", \"custom\"]),\n model: z.string(),\n apiKey: z.string().nullable().optional().default(null),\n baseUrl: z.string().nullable().optional().default(null),\n});\n\nconst graphSchema = z.object({\n enabled: z.boolean().default(false),\n neo4jUri: z.string().nullable().optional().default(null),\n neo4jUser: z.string().default(\"neo4j\"),\n neo4jPassword: z.string().nullable().optional().default(null),\n neo4jDatabase: z.string().default(\"neo4j\"),\n extractionLlm: llmSchema.nullable().optional().default(null),\n});\n\nconst rerankerSchema = z.object({\n enabled: z.boolean().default(false),\n provider: z.enum([\"cohere\", \"voyage\", \"jina\", \"custom\"]).nullable().optional().default(null),\n model: z.string().nullable().optional().default(null),\n apiKey: z.string().nullable().optional().default(null),\n baseUrl: z.string().nullable().optional().default(null),\n candidates: z.number().int().positive().default(50),\n});\n\nconst fusionSchema = z.object({\n method: z.literal(\"rrf\").default(\"rrf\"),\n k: z.number().int().positive().default(60),\n weights: z.record(z.string(), z.number()).default({ fts: 1.0, trgm: 0.8, ann: 1.0, graph: 1.0 }),\n});\n\nconst storageSchema = z.object({\n backend: z.literal(\"postgres\").default(\"postgres\"),\n annExactThreshold: z.number().int().positive().default(50_000),\n});\n\nexport type EmbeddingConfig = z.infer<typeof embeddingSchema>;\nexport type LLMConfig = z.infer<typeof llmSchema>;\nexport type GraphConfig = z.infer<typeof graphSchema>;\nexport type RerankerConfig = z.infer<typeof rerankerSchema>;\nexport type FusionConfig = z.infer<typeof fusionSchema>;\nexport type StorageConfig = z.infer<typeof storageSchema>;\n\nexport interface ContextEngineConfigInit {\n databaseUrl: string;\n storage?: Partial<StorageConfig>;\n defaultMode?: \"hybrid\" | \"graph\";\n embedding: EmbeddingConfig;\n llm?: LLMConfig | null;\n visionLlm?: LLMConfig | null;\n graph?: Partial<GraphConfig>;\n reranker?: Partial<RerankerConfig>;\n fusion?: Partial<FusionConfig>;\n enableCodeExecution?: boolean;\n secretKey?: string | null;\n redaction?:\n | RedactionPolicy\n | { rules?: RedactionRuleInit[]; customDetectors?: RedactionPolicy[\"customDetectors\"] };\n}\n\nexport class ContextEngineConfig {\n databaseUrl: string;\n storage: StorageConfig;\n defaultMode: \"hybrid\" | \"graph\";\n embedding: EmbeddingConfig;\n llm: LLMConfig | null;\n visionLlm: LLMConfig | null;\n graph: GraphConfig;\n reranker: RerankerConfig;\n fusion: FusionConfig;\n enableCodeExecution: boolean;\n secretKey: string | null;\n redaction: RedactionPolicy;\n\n constructor(init: ContextEngineConfigInit) {\n this.databaseUrl = init.databaseUrl;\n this.storage = storageSchema.parse(init.storage ?? {});\n this.defaultMode = init.defaultMode ?? \"hybrid\";\n this.embedding = embeddingSchema.parse(init.embedding);\n this.llm = init.llm ? llmSchema.parse(init.llm) : null;\n this.visionLlm = init.visionLlm ? llmSchema.parse(init.visionLlm) : null;\n this.graph = graphSchema.parse(init.graph ?? {});\n this.reranker = rerankerSchema.parse(init.reranker ?? {});\n this.fusion = fusionSchema.parse(init.fusion ?? {});\n this.enableCodeExecution = init.enableCodeExecution ?? false;\n this.secretKey = init.secretKey ?? null;\n this.redaction =\n init.redaction instanceof RedactionPolicy ? init.redaction : new RedactionPolicy(init.redaction ?? {});\n this.validate();\n }\n\n private validate(): void {\n if (\n this.graph.enabled &&\n !(this.graph.neo4jUri && this.graph.neo4jPassword && this.graph.extractionLlm)\n ) {\n throw new Error(\"graph enabled but neo4jUri/neo4jPassword/extractionLlm missing\");\n }\n if (this.reranker.enabled && !(this.reranker.provider && this.reranker.apiKey)) {\n throw new Error(\"reranker enabled but provider/apiKey missing\");\n }\n if (this.defaultMode === \"graph\" && !this.graph.enabled) {\n throw new Error(\"defaultMode is 'graph' but graph enabled is false\");\n }\n for (const rule of this.redaction.rules) {\n if (rule.action === \"hash\" && !this.secretKey) {\n throw new Error(\n `redaction rule '${rule.name}': action='hash' requires ContextEngineConfig.secretKey to be set`,\n );\n }\n }\n }\n\n static fromEnv(\n overrides: Partial<ContextEngineConfigInit> & { embedding?: EmbeddingConfig } = {},\n ): ContextEngineConfig {\n const env = loadCeEnv();\n const merged = deepMerge(env, overrides as Record<string, unknown>);\n if (!merged.databaseUrl || !merged.embedding) {\n throw new Error(\n \"ContextEngineConfig.fromEnv requires CE_DATABASE_URL and CE_EMBEDDING__PROVIDER/MODEL (or explicit overrides)\",\n );\n }\n return new ContextEngineConfig(merged as unknown as ContextEngineConfigInit);\n }\n}\n\nfunction camelize(key: string): string {\n return key.toLowerCase().replace(/_([a-z])/g, (_, c: string) => c.toUpperCase());\n}\n\n/** Load CE_ prefixed env vars. Nested fields use `__` (CE_EMBEDDING__PROVIDER). */\nexport function loadCeEnv(): Record<string, unknown> {\n const root: Record<string, unknown> = {};\n for (const [raw, value] of Object.entries(process.env)) {\n if (!raw.startsWith(\"CE_\") || value === undefined) continue;\n const path = raw.slice(3).split(\"__\").map(camelize);\n let cur: Record<string, unknown> = root;\n for (let i = 0; i < path.length - 1; i++) {\n const k = path[i]!;\n const next = cur[k];\n if (typeof next !== \"object\" || next === null) cur[k] = {};\n cur = cur[k] as Record<string, unknown>;\n }\n cur[path[path.length - 1]!] = coerceEnv(value);\n }\n return root;\n}\n\nfunction coerceEnv(value: string): unknown {\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n if (/^-?\\d+$/.test(value)) return Number(value);\n if (/^-?\\d+\\.\\d+$/.test(value)) return Number(value);\n return value;\n}\n\nfunction deepMerge(a: Record<string, unknown>, b: Record<string, unknown>): Record<string, unknown> {\n const out = { ...a };\n for (const [k, v] of Object.entries(b)) {\n if (v === undefined) continue;\n const existing = out[k];\n if (\n v &&\n typeof v === \"object\" &&\n !Array.isArray(v) &&\n existing &&\n typeof existing === \"object\" &&\n !Array.isArray(existing)\n ) {\n out[k] = deepMerge(existing as Record<string, unknown>, v as Record<string, unknown>);\n } else {\n out[k] = v;\n }\n }\n return out;\n}\n\nexport {\n embeddingSchema,\n fusionSchema,\n graphSchema,\n llmSchema,\n RedactionRule,\n rerankerSchema,\n storageSchema,\n};\n","import { readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { Pool, PoolClient } from \"pg\";\nimport { ExtraMissingError } from \"./errors.js\";\n\nexport const VERSION_TABLE = \"context_engine_alembic_version\";\nexport const REV_BASE = \"0004_acl_indexes\";\nexport const REV_GRAPH = \"0002_graph\";\n\nconst CHAIN_BASE = [\"0001\", \"0003_tools\", \"0004_acl_indexes\"] as const;\nconst CHAIN_GRAPH = [...CHAIN_BASE, \"0002_graph\"] as const;\n\nconst FILES: Record<string, string> = {\n \"0001\": \"0001.sql\",\n \"0003_tools\": \"0003_tools.sql\",\n \"0004_acl_indexes\": \"0004_acl_indexes.sql\",\n \"0002_graph\": \"0002_graph.sql\",\n};\n\nfunction sqlDir(): string {\n // Prefer source tree (dev / tests); fall back to dist-adjacent copy.\n const here = dirname(fileURLToPath(import.meta.url));\n return join(here, \"migrations\", \"sql\");\n}\n\nfunction loadSql(rev: string, dim: number): string {\n const raw = readFileSync(join(sqlDir(), FILES[rev]!), \"utf8\");\n return raw.replaceAll(\"__DIM__\", String(dim));\n}\n\nasync function requirePg(): Promise<typeof import(\"pg\")> {\n try {\n return await import(\"pg\");\n } catch {\n throw new ExtraMissingError(\"postgres\", \"pg\", \"Postgres driver\");\n }\n}\n\nexport async function createPool(databaseUrl: string, extra: Record<string, unknown> = {}): Promise<Pool> {\n const pg = await requirePg();\n return new pg.Pool({ connectionString: databaseUrl, ...extra });\n}\n\nasync function existingDim(client: PoolClient): Promise<number | null> {\n const exists = await client.query(\"SELECT to_regclass('context_engine_meta') AS t\");\n if (!exists.rows[0]?.t) return null;\n const row = await client.query(\"SELECT embedding_dim FROM context_engine_meta WHERE id = 1\");\n return row.rows[0]?.embedding_dim ?? null;\n}\n\nasync function currentRevision(client: PoolClient): Promise<string | null> {\n const exists = await client.query(`SELECT to_regclass('${VERSION_TABLE}') AS t`);\n if (!exists.rows[0]?.t) return null;\n const row = await client.query(`SELECT version_num FROM ${VERSION_TABLE} LIMIT 1`);\n return row.rows[0]?.version_num ?? null;\n}\n\nfunction appliedSet(current: string | null): Set<string> {\n if (!current) return new Set();\n const all = [...CHAIN_GRAPH];\n const idx = all.indexOf(current as (typeof all)[number]);\n if (idx < 0) return new Set();\n return new Set(all.slice(0, idx + 1));\n}\n\nexport async function runMigrate(\n databaseUrl: string,\n opts: { dim?: number; graph?: boolean } = {},\n): Promise<void> {\n const dim = opts.dim ?? 1536;\n const graph = opts.graph ?? false;\n const pool = await createPool(databaseUrl);\n const client = await pool.connect();\n try {\n const existing = await existingDim(client);\n if (existing !== null && existing !== dim) {\n throw new Error(\n `context_engine_meta.embedding_dim is already ${existing}, but migrate was ` +\n `called with dim=${dim}. Changing the embedding dimension on an existing ` +\n \"database would invalidate every previously stored embedding — use a fresh \" +\n \"database (or a new deployment) for a different dim instead.\",\n );\n }\n\n await client.query(\"BEGIN\");\n await client.query(`\n CREATE TABLE IF NOT EXISTS ${VERSION_TABLE} (\n version_num VARCHAR(32) NOT NULL,\n CONSTRAINT ${VERSION_TABLE}_pkc PRIMARY KEY (version_num)\n )\n `);\n let recorded = await currentRevision(client);\n const done = appliedSet(recorded);\n const chain = graph ? CHAIN_GRAPH : CHAIN_BASE;\n for (const rev of chain) {\n if (done.has(rev)) continue;\n await client.query(loadSql(rev, dim));\n if (recorded) {\n await client.query(`UPDATE ${VERSION_TABLE} SET version_num = $1`, [rev]);\n } else {\n await client.query(`INSERT INTO ${VERSION_TABLE} (version_num) VALUES ($1)`, [rev]);\n }\n recorded = rev;\n done.add(rev);\n }\n const meta = await client.query(\"SELECT embedding_dim FROM context_engine_meta WHERE id = 1\");\n if (!meta.rows.length) {\n await client.query(\"INSERT INTO context_engine_meta (id, embedding_dim) VALUES (1, $1)\", [dim]);\n } else if (meta.rows[0].embedding_dim == null) {\n await client.query(\"UPDATE context_engine_meta SET embedding_dim = $1 WHERE id = 1\", [dim]);\n }\n await client.query(\"COMMIT\");\n } catch (err) {\n try {\n await client.query(\"ROLLBACK\");\n } catch {\n /* ignore */\n }\n throw err;\n } finally {\n client.release();\n await pool.end();\n }\n}\n","/**\n * `ContextEngine` — the package's public object.\n *\n * Construction is cheap and side-effect free: no database connection is\n * opened and no provider client is built until the first call that needs\n * one (the embedder in particular is built lazily, so an engine used only\n * for `getDocument`/`stats` never constructs an LLM/embedding HTTP client).\n *\n * Graph mode is gated behind `GraphConfig.enabled` and the optional graph\n * extra. A graph-retrieval error at query time degrades to hybrid-only\n * results (visible via `usage.degraded`) rather than failing the search.\n */\nimport type { Pool } from \"pg\";\nimport * as actions from \"./actions.js\";\nimport type { ContextEngineConfig, LLMConfig } from \"./config.js\";\nimport { createPool } from \"./db.js\";\nimport { DocumentNotFoundError } from \"./errors.js\";\nimport type { GraphStore } from \"./graph/neo4j-client.js\";\nimport { emitUsage, type Hooks } from \"./hooks.js\";\nimport {\n applyAttributeUpdates,\n type GraphStageArgs,\n type IngestRequest,\n recordEmbeddingDim,\n resolveSource,\n runIngest,\n} from \"./ingest.js\";\nimport { pollEmbeddingBatch } from \"./providers/batch.js\";\nimport { buildEmbedder, type Embedder } from \"./providers/embeddings.js\";\nimport { applyRedaction, type RedactionPolicy } from \"./redaction.js\";\nimport { runSearch, type SearchResult } from \"./search.js\";\nimport { type Principals, resolvePrincipals, TRUSTED, UNSET, type Unset } from \"./sentinels.js\";\nimport { PostgresBackend, type StorageBackend } from \"./storage.js\";\nimport type { ToolConfig } from \"./tools/config.js\";\nimport { functionTool } from \"./tools/executors/function.js\";\nimport type { ToolHttpClient } from \"./tools/executors/http.js\";\nimport type { ToolEngine } from \"./tools/governance.js\";\nimport * as governance from \"./tools/governance.js\";\nimport type { CanonicalTool } from \"./tools/registry.js\";\nimport type { DocumentReport, IngestReport, UsageEvent } from \"./usage.js\";\n\n/**\n * Output-phase redaction for `getDocument()`'s dict.\n *\n * In scope: `text`, `documentType`, `structuredData`, and `error` — all\n * FOUR are DOCUMENT-BODY-DERIVED. `error` is `String(exc)` of whatever\n * failed while PROCESSING the document body — an unbounded, body-influenced\n * string. Masking it here does not affect debuggability: the UNMASKED error\n * still reaches `hooks.onError`. `structuredData` is walked recursively;\n * dict KEYS are never redacted, only string leaves.\n *\n * Out of scope, deliberately: `name`/`description`/`metaData` are\n * CALLER-set at ingest time, not text the pipeline derived from the\n * document body — exactly the same reasoning `search.redactHits` uses to\n * leave `Hit.documentName`/`description` untouched.\n *\n * `policy.isEmpty()` is an exact no-op — `doc` is returned unchanged.\n */\nfunction redactDocumentOutput(\n doc: Record<string, unknown>,\n policy: RedactionPolicy,\n opts: { principals: string[] | null; secretKey: string | null; hooks: Hooks },\n): Record<string, unknown> {\n if (policy.isEmpty()) return doc;\n\n const redactStr = (value: string) =>\n applyRedaction(value, policy, {\n phase: \"output\",\n principals: opts.principals,\n secretKey: opts.secretKey,\n hooks: opts.hooks,\n })[0];\n\n const walk = (node: unknown): unknown => {\n if (typeof node === \"string\") return redactStr(node);\n if (Array.isArray(node)) return node.map(walk);\n if (node && typeof node === \"object\") {\n return Object.fromEntries(\n Object.entries(node as Record<string, unknown>).map(([k, v]) => [k, walk(v)]),\n );\n }\n return node;\n };\n\n const out = { ...doc };\n if (typeof out.text === \"string\") out.text = redactStr(out.text);\n if (typeof out.documentType === \"string\") out.documentType = redactStr(out.documentType);\n if (typeof out.error === \"string\") out.error = redactStr(out.error);\n if (out.structuredData != null) out.structuredData = walk(out.structuredData);\n return out;\n}\n\n/**\n * Mask `DocumentReport.error` on every document in `report`.\n *\n * `ContextEngine.ingest()` returns `report` straight to whatever called\n * it. `DocumentReport.error` is `String(exc)` of an arbitrary failure\n * raised while processing the document BODY, so it is exactly as\n * body-derived as `getDocument()`'s `text`/`documentType`.\n *\n * `ingest()` has no `principals=` parameter of its own, so this uses\n * `principals=null`, the trusted-internal-caller default.\n *\n * `policy.isEmpty()` is an exact no-op.\n */\nfunction redactIngestReport(\n report: IngestReport,\n policy: RedactionPolicy,\n opts: { secretKey: string | null; hooks: Hooks },\n): IngestReport {\n if (policy.isEmpty()) return report;\n let changed = false;\n const documents: DocumentReport[] = report.documents.map((doc) => {\n if (typeof doc.error !== \"string\") return doc;\n const [masked] = applyRedaction(doc.error, policy, {\n phase: \"output\",\n principals: null,\n secretKey: opts.secretKey,\n hooks: opts.hooks,\n });\n if (masked === doc.error) return doc;\n changed = true;\n return { ...doc, error: masked };\n });\n if (!changed) return report;\n return { ...report, documents };\n}\n\nexport class ContextEngine implements ToolEngine {\n config: ContextEngineConfig;\n hooks: Hooks;\n pool!: Pool;\n backend: StorageBackend | null = null;\n /** In-memory function-tool registry. Function tools are NOT persisted. */\n _functionTools: Record<string, CanonicalTool> = {};\n _toolHttpClient: ToolHttpClient | null = null;\n private _pool: Pool | null = null;\n private _embedder: Embedder | null = null;\n /** Built lazily on first graph use so constructing an engine never pulls neo4j. */\n private _graphStore: GraphStore | null = null;\n\n constructor(\n config: ContextEngineConfig,\n opts: {\n onUsage?: ((e: UsageEvent) => void) | null;\n onError?: ((e: unknown, ctx: Record<string, unknown>) => void) | null;\n } = {},\n ) {\n this.config = config;\n this.hooks = { onUsage: opts.onUsage ?? null, onError: opts.onError ?? null };\n }\n\n private async ensurePool(): Promise<Pool> {\n if (!this._pool) {\n this._pool = await createPool(this.config.databaseUrl);\n this.pool = this._pool;\n }\n if (!this.backend) {\n this.backend = new PostgresBackend(this._pool, this.config.storage.annExactThreshold);\n }\n return this._pool;\n }\n\n /** The embedding client, built on first use. */\n get embedder(): Embedder {\n if (!this._embedder) this._embedder = buildEmbedder(this.config.embedding);\n return this._embedder;\n }\n\n private async getGraphStore(): Promise<GraphStore> {\n if (!this._graphStore) {\n const { buildGraphStore } = await import(\"./graph/index.js\");\n this._graphStore = await buildGraphStore(this.config.graph, { hooks: this.hooks });\n }\n return this._graphStore;\n }\n\n private async runGraphStage(args: GraphStageArgs): Promise<number> {\n const { runGraphStage } = await import(\"./graph/index.js\");\n const pool = await this.ensurePool();\n return runGraphStage({\n documentId: args.documentId,\n chunks: args.chunks,\n config: args.config,\n hooks: args.hooks,\n pool,\n embedder: this.embedder as never,\n graphStore: await this.getGraphStore(),\n });\n }\n\n /**\n * Release everything this engine opened. Safe to call more than once.\n *\n * Construction is lazy, so this only tears down what was actually built.\n * Also usable via `await using engine = new ContextEngine(config)`.\n */\n async aclose(): Promise<void> {\n if (this._embedder) {\n await this._embedder.aclose();\n this._embedder = null;\n }\n if (this._graphStore) {\n const store = this._graphStore;\n this._graphStore = null;\n const result = store.close?.();\n if (result && typeof (result as Promise<void>).then === \"function\") await result;\n }\n if (this._pool) {\n await this._pool.end();\n this._pool = null;\n }\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.aclose();\n }\n\n /**\n * Ingest one document. Returns its `IngestReport` (never raises for\n * per-document failures — those come back as `status=\"failed\"`).\n *\n * Exactly one of `file` / `content` / `text` must be given. `text=`\n * skips extraction. `mode=null` uses `config.defaultMode`; `\"graph\"`\n * requires `config.graph.enabled`.\n */\n async ingest(\n opts: IngestRequest & {\n file?: unknown;\n content?: Buffer | null;\n filename?: string | null;\n text?: string | null;\n } = {},\n ): Promise<IngestReport> {\n const pool = await this.ensurePool();\n const mode = opts.mode ?? this.config.defaultMode;\n if (mode === \"graph\" && !this.config.graph.enabled) {\n throw new Error(\n \"graph not enabled: ingest(mode='graph') requires GraphConfig.enabled=True \" +\n \"(with neo4j_uri, neo4j_password and extraction_llm configured)\",\n );\n }\n if (opts.batch && ![\"openai\", \"azure_openai\"].includes(this.config.embedding.provider)) {\n throw new Error(\n `batch not supported for provider ${JSON.stringify(this.config.embedding.provider)} — use batch=false`,\n );\n }\n if (opts.extractStructured && !this.config.llm) {\n throw new Error(\"extractStructured=true requires ContextEngineConfig.llm to be configured\");\n }\n if (opts.fieldHints && !opts.extractStructured) {\n throw new Error(\"fieldHints requires extractStructured=true\");\n }\n\n const resolved = resolveSource({\n file: opts.file,\n content: opts.content,\n filename: opts.filename,\n text: opts.text,\n });\n const request: IngestRequest = {\n content: resolved[0],\n filename: resolved[1],\n text: resolved[2],\n name: opts.name,\n description: opts.description,\n sourceId: opts.sourceId,\n externalId: opts.externalId,\n metaData: opts.metaData,\n acl: opts.acl,\n mode,\n batch: opts.batch,\n extractStructured: opts.extractStructured,\n fieldHints: opts.fieldHints,\n };\n\n const report = await runIngest(request, {\n config: this.config,\n hooks: this.hooks,\n backend: this.backend!,\n embedder: this.embedder,\n pool,\n graphStage: this.config.graph.enabled ? (args) => this.runGraphStage(args) : null,\n contentSource: resolved,\n });\n return redactIngestReport(report, this.config.redaction, {\n secretKey: this.config.secretKey,\n hooks: this.hooks,\n });\n }\n\n /**\n * Poll every `batch_pending` document; fill embeddings for finished jobs.\n *\n * There is NO background daemon — `ingest({ batch: true })` submits the\n * embedding job and returns immediately; something has to call this\n * method afterwards. Returns the number of documents flipped to\n * `completed` in this call.\n */\n async resumeBatches(): Promise<number> {\n const pool = await this.ensurePool();\n const { rows } = await pool.query(\n `SELECT id, meta_data FROM context_engine_documents WHERE status = 'batch_pending'`,\n );\n let completed = 0;\n for (const row of rows) {\n const batchMeta = (row.meta_data as Record<string, unknown> | null)?.batch as\n | Record<string, unknown>\n | undefined;\n const batchId = batchMeta?.id as string | undefined;\n if (!batchId) continue;\n const vectors = await pollEmbeddingBatch(this.config.embedding, batchId);\n if (!vectors) continue;\n await this.backend!.updateChunkEmbeddings(row.id, vectors);\n const observedDim = vectors[0]?.length ?? null;\n await recordEmbeddingDim(pool, observedDim);\n await pool.query(\n `UPDATE context_engine_documents SET status='completed', completed_at=now(), updated_at=now() WHERE id=$1`,\n [row.id],\n );\n const units = Number(batchMeta?.units || 0);\n if (units) {\n emitUsage(this.hooks, {\n kind: \"ingest\",\n units,\n detail: {\n document_id: String(row.id),\n batch_id: batchId,\n mode: batchMeta?.mode,\n chunks: batchMeta?.chunks ?? vectors.length,\n },\n providerTokens: (batchMeta?.provider_tokens as Record<string, number>) || {},\n } satisfies UsageEvent);\n }\n completed += 1;\n }\n return completed;\n }\n\n /**\n * Retrieve the `top_k` chunks most relevant to `query`.\n *\n * `principals` is the ACL contract and the two \"empty\" values are NOT\n * the same: `null`/`TRUSTED` means an internal, fully-trusted caller and\n * skips ACL filtering entirely, while `[]` means an anonymous caller and\n * matches only chunks with no ACL.\n */\n async search(\n query: string,\n opts: {\n sourceIds?: string[] | null;\n principals?: Principals;\n topK?: number;\n mode?: \"hybrid\" | \"graph\";\n compressToTokens?: number | null;\n redaction?: RedactionPolicy | null;\n } = {},\n ): Promise<SearchResult> {\n const pool = await this.ensurePool();\n const principals = resolvePrincipals(opts.principals, \"search\");\n let graphRanked: string[] | null = null;\n if ((opts.mode ?? \"hybrid\") === \"graph\" && this.config.graph.enabled) {\n const { buildGraphRanked } = await import(\"./graph/index.js\");\n graphRanked = await buildGraphRanked(query, {\n config: this.config as never,\n pool,\n embedder: this.embedder as never,\n graphStore: await this.getGraphStore(),\n hooks: this.hooks,\n sourceIds: opts.sourceIds ?? null,\n principals,\n });\n }\n return runSearch(query, {\n config: this.config,\n hooks: this.hooks,\n backend: this.backend!,\n embedder: this.embedder,\n pool,\n sourceIds: opts.sourceIds,\n principals,\n topK: opts.topK,\n mode: opts.mode,\n compressToTokens: opts.compressToTokens,\n graphRanked,\n redaction: opts.redaction,\n });\n }\n\n /**\n * Return one document as a plain dict (raises `DocumentNotFoundError` if\n * absent OR not visible under `principals` — identical message, so a\n * caller can never distinguish \"doesn't exist\" from \"exists but you\n * can't see it\").\n */\n async getDocument(\n documentId: string,\n opts: { principals?: Principals } = {},\n ): Promise<Record<string, unknown>> {\n const pool = await this.ensurePool();\n const principals = resolvePrincipals(opts.principals, \"getDocument\");\n const doc = await actions.getDocumentRow(pool, documentId, principals);\n return redactDocumentOutput(doc, this.config.redaction, {\n principals,\n secretKey: this.config.secretKey,\n hooks: this.hooks,\n });\n }\n\n async deleteDocument(documentId: string, opts: { principals?: Principals } = {}): Promise<void> {\n const pool = await this.ensurePool();\n const principals = resolvePrincipals(opts.principals, \"deleteDocument\");\n await actions.requireVisible(pool, documentId, principals);\n await this.backend!.deleteChunks(documentId);\n await pool.query(`DELETE FROM context_engine_documents WHERE id = $1`, [documentId]);\n }\n\n /**\n * Update caller-declared attributes WITHOUT re-sending content.\n *\n * PATCH semantics: only the fields actually passed change. `acl=null`\n * UNRESTRICTS — it can never mean \"leave alone\"; omit the argument\n * entirely for that (the `UNSET` sentinel is what makes the two\n * distinguishable). A PATCH that includes `acl` always re-syncs the\n * chunk plane, even when the value matches what's already stored.\n */\n async updateDocument(\n documentId: string,\n opts: {\n acl?: string[] | null | Unset;\n name?: string | null | Unset;\n description?: string | null | Unset;\n metaData?: Record<string, unknown> | null | Unset;\n principals?: Principals;\n } = {},\n ): Promise<string[]> {\n const pool = await this.ensurePool();\n const principals = resolvePrincipals(opts.principals, \"updateDocument\");\n await actions.requireVisible(pool, documentId, principals);\n\n const updates: Record<string, unknown> = {};\n if (opts.acl !== undefined && opts.acl !== UNSET) updates.acl = opts.acl;\n if (opts.name !== undefined && opts.name !== UNSET) updates.name = opts.name;\n if (opts.description !== undefined && opts.description !== UNSET) updates.description = opts.description;\n if (opts.metaData !== undefined && opts.metaData !== UNSET) updates.meta_data = opts.metaData;\n if (!Object.keys(updates).length) return [];\n\n const changed = await applyAttributeUpdates(pool, documentId, updates);\n if (\"acl\" in updates) {\n await this.backend!.updateChunkAcl(documentId, updates.acl as string[] | null);\n }\n return changed;\n }\n\n async stats(sourceId?: string | null): Promise<Record<string, unknown>> {\n const pool = await this.ensurePool();\n return actions.stats(pool, sourceId ?? null);\n }\n\n async getDocumentText(documentId: string, opts: { principals?: Principals } = {}): Promise<string> {\n const pool = await this.ensurePool();\n return actions.getDocumentText(documentId, {\n pool,\n principals: resolvePrincipals(opts.principals, \"getDocumentText\"),\n redaction: this.config.redaction,\n secretKey: this.config.secretKey,\n hooks: this.hooks,\n });\n }\n\n async listDocuments(\n opts: { sourceId?: string | null; principals?: Principals; cursor?: unknown; limit?: number } = {},\n ): Promise<Record<string, unknown>> {\n const pool = await this.ensurePool();\n return actions.listDocuments({\n pool,\n sourceId: opts.sourceId,\n principals: resolvePrincipals(opts.principals, \"listDocuments\"),\n cursor: opts.cursor,\n limit: opts.limit,\n redaction: this.config.redaction,\n secretKey: this.config.secretKey,\n hooks: this.hooks,\n });\n }\n\n async queryStructured(\n question: string,\n opts: {\n sourceIds?: string[] | null;\n principals?: Principals;\n docType?: string | null;\n limit?: number;\n } = {},\n ): Promise<Record<string, unknown>> {\n const pool = await this.ensurePool();\n return actions.queryStructured(question, {\n pool,\n embedder: this.embedder,\n sourceIds: opts.sourceIds,\n principals: resolvePrincipals(opts.principals, \"queryStructured\"),\n docType: opts.docType,\n limit: opts.limit,\n redaction: this.config.redaction,\n secretKey: this.config.secretKey,\n hooks: this.hooks,\n });\n }\n\n async compute(\n instruction: string,\n opts: {\n sourceIds?: string[] | null;\n principals?: Principals;\n docIds?: string[] | null;\n modelCfg?: LLMConfig | null;\n timeout?: number;\n } = {},\n ): Promise<Record<string, unknown>> {\n const pool = await this.ensurePool();\n return actions.compute(instruction, {\n pool,\n config: this.config,\n hooks: this.hooks,\n sourceIds: opts.sourceIds,\n principals: resolvePrincipals(opts.principals, \"compute\"),\n docIds: opts.docIds,\n modelCfg: opts.modelCfg,\n timeout: opts.timeout,\n });\n }\n\n async registerTool(tc: ToolConfig): Promise<string> {\n await this.ensurePool();\n return governance.registerTool(this, tc);\n }\n\n registerFunctionTool(fn: (...args: never[]) => unknown): string {\n const tool = functionTool(fn);\n this._functionTools[tool.callName] = tool;\n return tool.callName;\n }\n\n async updateTool(\n id: string,\n opts: Record<string, unknown> & { principals?: Principals } = {},\n ): Promise<ToolConfig> {\n await this.ensurePool();\n const { principals, ...fields } = opts;\n return governance.updateTool(this, id, {\n ...fields,\n principals: resolvePrincipals(principals, \"updateTool\"),\n });\n }\n\n async deleteTool(id: string, opts: { principals?: Principals } = {}): Promise<void> {\n await this.ensurePool();\n return governance.deleteTool(this, id, {\n principals: resolvePrincipals(opts.principals, \"deleteTool\"),\n });\n }\n\n async listTools(\n opts: { sourceId?: string | null; principals?: Principals } = {},\n ): Promise<Record<string, unknown>[]> {\n await this.ensurePool();\n return governance.listTools(this, {\n sourceId: opts.sourceId,\n principals: resolvePrincipals(opts.principals, \"listTools\"),\n });\n }\n\n async searchTools(\n query: string,\n opts: { sourceId?: string | null; principals?: Principals; limit?: number } = {},\n ): Promise<Record<string, unknown>[]> {\n await this.ensurePool();\n return governance.searchTools(this, query, {\n sourceId: opts.sourceId,\n principals: resolvePrincipals(opts.principals, \"searchTools\"),\n limit: opts.limit,\n });\n }\n\n async testTool(tc: ToolConfig): Promise<Record<string, unknown>> {\n await this.ensurePool();\n return governance.testTool(this, tc);\n }\n\n async executeTool(\n callName: string,\n args: Record<string, unknown> | null,\n opts: {\n sourceId?: string | null;\n principals?: Principals;\n actor?: Record<string, unknown> | null;\n source?: string;\n } = {},\n ): Promise<Record<string, unknown>> {\n await this.ensurePool();\n return governance.executeTool(this, callName, args, {\n sourceId: opts.sourceId,\n principals: resolvePrincipals(opts.principals, \"executeTool\"),\n actor: opts.actor as { type?: string; id?: unknown } | null,\n source: opts.source ?? \"api\",\n });\n }\n}\n\nexport { DocumentNotFoundError, TRUSTED, UNSET };\n","/**\n * Pluggable embeddings provider.\n *\n * openai / azure_openai / custom → OpenAI SDK (OpenAI-compatible, including TEI/vLLM).\n * gemini → lazy `@google/genai` (optional extra \"gemini\").\n * voyage / cohere → fetch against their public REST APIs.\n *\n * `kind` is accepted everywhere but only voyage/cohere act on it.\n * 30s timeout, no retries. Injectable `client` / `fetch` for tests.\n */\n\nimport OpenAI from \"openai\";\nimport type { EmbeddingConfig } from \"../config.js\";\nimport { ExtraMissingError } from \"../errors.js\";\nimport { tokenCount } from \"../text.js\";\n\nexport const TIMEOUT_MS = 30_000;\n\nconst OPENAI_FAMILY = new Set([\"openai\", \"azure_openai\", \"custom\"]);\n\nexport type EmbedKind = \"document\" | \"query\";\n\nexport type FetchImpl = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;\n\nexport type EmbeddingsClient = {\n embeddings: {\n create(body: { model: string; input: string[] }): Promise<{\n data: Array<{ embedding: number[] }>;\n usage?: { total_tokens?: number } | null;\n }>;\n };\n close?: () => void | Promise<void>;\n timeout?: number;\n baseURL?: string;\n};\n\ntype GeminiEmbedClient = {\n models: {\n embedContent(args: { model: string; contents: string[] }): Promise<{\n embeddings?: Array<{ values?: number[] | Iterable<number> }>;\n }>;\n };\n};\n\nexport type EmbedderOpts = {\n client?: EmbeddingsClient | null;\n fetch?: FetchImpl | null;\n fetchImpl?: FetchImpl | null;\n};\n\nfunction estimatedTokens(texts: string[]): number {\n return texts.reduce((n, t) => n + tokenCount(t), 0);\n}\n\nasync function postJson(\n fetchImpl: FetchImpl,\n url: string,\n body: unknown,\n headers: Record<string, string>,\n): Promise<any> {\n const resp = await fetchImpl(url, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", ...headers },\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(TIMEOUT_MS),\n });\n if (!resp.ok) {\n const text = await resp.text().catch(() => \"\");\n throw new Error(`HTTP ${resp.status} ${resp.statusText}${text ? `: ${text}` : \"\"}`);\n }\n return resp.json();\n}\n\nexport function buildOpenAIClient(cfg: EmbeddingConfig): OpenAI {\n return new OpenAI({\n apiKey: cfg.apiKey ?? undefined,\n baseURL: cfg.baseUrl ?? undefined,\n timeout: TIMEOUT_MS,\n maxRetries: 0,\n });\n}\n\nexport class Embedder {\n cfg: EmbeddingConfig;\n provider: EmbeddingConfig[\"provider\"];\n model: string;\n dim: number | null;\n client: EmbeddingsClient | null;\n fetchImpl: FetchImpl | null;\n private genaiClient: GeminiEmbedClient | null = null;\n\n constructor(cfg: EmbeddingConfig, opts: EmbedderOpts = {}) {\n this.cfg = cfg;\n this.provider = cfg.provider;\n this.model = cfg.model;\n this.dim = cfg.dim ?? null;\n this.client = opts.client ?? null;\n this.fetchImpl = opts.fetch ?? opts.fetchImpl ?? null;\n }\n\n async aclose(): Promise<void> {\n const closer = this.client?.close;\n if (typeof closer === \"function\") {\n await closer.call(this.client);\n }\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.aclose();\n }\n\n /**\n * Embed `texts`, returning `[vectors, tokenCount]`.\n * Auto-detects `this.dim` on first success; raises on mismatch.\n */\n async embed(texts: string[], opts: { kind?: EmbedKind } = {}): Promise<[number[][], number]> {\n const kind = opts.kind ?? \"document\";\n const [vectors, tokens] = await this.rawEmbed(texts, kind);\n const observedDim = vectors[0] !== undefined ? vectors[0].length : undefined;\n if (observedDim !== undefined) {\n if (this.dim === null) {\n this.dim = observedDim;\n } else if (observedDim !== this.dim) {\n throw new Error(\n `embedding dimension mismatch for provider=${JSON.stringify(this.provider)} ` +\n `model=${JSON.stringify(this.model)}: configured dim=${this.dim}, ` +\n `provider returned dim=${observedDim}`,\n );\n }\n }\n return [vectors, tokens];\n }\n\n /** Provider dispatch. Overridable per-instance (tests stub this). */\n async rawEmbed(texts: string[], kind: EmbedKind = \"document\"): Promise<[number[][], number]> {\n if (OPENAI_FAMILY.has(this.provider)) return this.embedOpenAI(texts);\n if (this.provider === \"gemini\") return this.embedGemini(texts);\n if (this.provider === \"voyage\") return this.embedVoyage(texts, kind);\n if (this.provider === \"cohere\") return this.embedCohere(texts, kind);\n throw new Error(`unknown embedding provider: ${JSON.stringify(this.provider)}`);\n }\n\n private async embedOpenAI(texts: string[]): Promise<[number[][], number]> {\n if (!this.client) {\n throw new Error(\"openai-family embedder has no client\");\n }\n const resp = await this.client.embeddings.create({ model: this.model, input: texts });\n const vectors = resp.data.map((d) => d.embedding);\n const tokens = resp.usage?.total_tokens ?? estimatedTokens(texts);\n return [vectors, tokens];\n }\n\n private async embedGemini(texts: string[]): Promise<[number[][], number]> {\n if (!this.genaiClient) {\n this.genaiClient = await loadGeminiEmbedClient(this.cfg.apiKey);\n }\n const resp = await this.genaiClient.models.embedContent({\n model: this.model,\n contents: texts,\n });\n const embeddings = resp.embeddings ?? [];\n const vectors = embeddings.map((e) => Array.from(e.values ?? []));\n return [vectors, estimatedTokens(texts)];\n }\n\n private async embedVoyage(texts: string[], kind: EmbedKind): Promise<[number[][], number]> {\n const fetchImpl = this.requireFetch();\n const inputType = kind === \"query\" ? \"query\" : \"document\";\n const data = await postJson(\n fetchImpl,\n \"https://api.voyageai.com/v1/embeddings\",\n { model: this.model, input: texts, input_type: inputType },\n { Authorization: `Bearer ${this.cfg.apiKey ?? \"\"}` },\n );\n const vectors = (data.data as Array<{ embedding: number[] }>).map((item) => item.embedding);\n const tokens = data.usage?.total_tokens || estimatedTokens(texts);\n return [vectors, tokens];\n }\n\n private async embedCohere(texts: string[], kind: EmbedKind): Promise<[number[][], number]> {\n const fetchImpl = this.requireFetch();\n const inputType = kind === \"query\" ? \"search_query\" : \"search_document\";\n const data = await postJson(\n fetchImpl,\n \"https://api.cohere.com/v2/embed\",\n {\n model: this.model,\n texts,\n input_type: inputType,\n embedding_types: [\"float\"],\n },\n { Authorization: `Bearer ${this.cfg.apiKey ?? \"\"}` },\n );\n const vectors = data.embeddings.float as number[][];\n const billed = data.meta?.billed_units?.input_tokens as number | undefined;\n const tokens = billed != null ? billed : estimatedTokens(texts);\n return [vectors, tokens];\n }\n\n private requireFetch(): FetchImpl {\n if (!this.fetchImpl) {\n throw new Error(`${this.provider} embedder has no fetch implementation`);\n }\n return this.fetchImpl;\n }\n}\n\nasync function loadGeminiEmbedClient(apiKey: string | null | undefined): Promise<GeminiEmbedClient> {\n const specifier = \"@google/genai\";\n let mod: {\n GoogleGenAI?: new (opts: { apiKey?: string | null }) => GeminiEmbedClient;\n Client?: new (opts: { apiKey?: string | null }) => GeminiEmbedClient;\n };\n try {\n mod = (await import(specifier)) as typeof mod;\n } catch {\n throw new ExtraMissingError(\"gemini\", specifier, \"gemini embeddings\");\n }\n const Ctor = mod.GoogleGenAI ?? mod.Client;\n if (!Ctor) {\n throw new ExtraMissingError(\"gemini\", specifier, \"gemini embeddings\");\n }\n return new Ctor({ apiKey: apiKey ?? null });\n}\n\nexport function buildEmbedder(cfg: EmbeddingConfig, opts?: EmbedderOpts): Embedder {\n if (opts?.client || opts?.fetch || opts?.fetchImpl) {\n return new Embedder(cfg, opts);\n }\n if (OPENAI_FAMILY.has(cfg.provider)) {\n return new Embedder(cfg, { client: buildOpenAIClient(cfg) });\n }\n if (cfg.provider === \"voyage\" || cfg.provider === \"cohere\") {\n return new Embedder(cfg, { fetch: globalThis.fetch });\n }\n if (cfg.provider === \"gemini\") {\n return new Embedder(cfg);\n }\n throw new Error(`unknown embedding provider: ${JSON.stringify(cfg.provider)}`);\n}\n","import { getEncoding } from \"js-tiktoken\";\nimport { charScript, isSpacelessChar, tokenize } from \"./text.js\";\n\nexport const TOKENS_PER_CHAR = 0.25;\n\nexport const BOILERPLATE_MAX_CHUNK_CHARS = 200;\n\nconst log = {\n info: (...args: unknown[]) => console.debug(\"[context-engine]\", ...args),\n warn: (...args: unknown[]) => console.warn(\"[context-engine]\", ...args),\n error: (...args: unknown[]) => console.error(\"[context-engine]\", ...args),\n debug: (...args: unknown[]) => console.debug(\"[context-engine]\", ...args),\n};\n\nexport interface CompressionChunk {\n id?: string | number | null;\n text?: string;\n score?: number;\n embedding?: number[] | null;\n source_key?: string;\n token_count?: number;\n token_count_method?: string;\n [key: string]: unknown;\n}\n\nexport interface ClusteringMeta {\n available: boolean;\n reason: string;\n n_embeddings: number;\n n_clusters: number;\n}\n\nexport interface CompressionReport {\n compression_applied: boolean;\n reason?: string;\n method?: string;\n original_chunks_before_noise_filter?: number;\n filtered_noise_chunks?: number;\n original_chunks_after_noise_filter?: number;\n original_chunks?: number;\n compressed_chunks?: number;\n chunks_removed?: number;\n original_tokens?: number;\n compressed_tokens?: number;\n target_tokens?: number;\n effective_budget?: number;\n safety_margin?: number;\n compression_ratio?: number;\n within_budget?: boolean;\n filtered_noise?: number;\n quality_metrics?: Record<string, number>;\n clustering?: ClusteringMeta;\n}\n\ntype Encoder = { encode: (text: string) => number[] };\n\nlet encoder: Encoder | false | null = null;\n\nfunction getTiktokenEncoder(): Encoder | null {\n if (encoder === false) return null;\n if (encoder) return encoder;\n try {\n encoder = getEncoding(\"cl100k_base\");\n return encoder;\n } catch {\n log.warn(\"[TokenCount] tiktoken not available, using heuristic fallback\");\n encoder = false;\n return null;\n }\n}\n\nexport function countTokensUniversal(text: string, returnMethod?: false): number;\nexport function countTokensUniversal(text: string, returnMethod: true): [number, string];\nexport function countTokensUniversal(text: string, returnMethod = false): number | [number, string] {\n if (!text) return returnMethod ? [0, \"empty\"] : 0;\n\n try {\n const enc = getTiktokenEncoder();\n if (enc) {\n const count = enc.encode(text).length;\n return returnMethod ? [count, \"tiktoken_cl100k_base\"] : count;\n }\n } catch (e) {\n log.warn(`[TokenCount] tiktoken failed: ${e}`);\n }\n\n const count = Math.trunc(text.length * TOKENS_PER_CHAR);\n return returnMethod ? [count, \"heuristic_char_0.25\"] : count;\n}\n\nexport function estimateTokens(text: string): number {\n return countTokensUniversal(text, false);\n}\n\nconst CODE_PATTERNS = /[{}[\\]();]|=>|::|<\\/|\\/>|SELECT\\s|INSERT\\s|def\\s|class\\s|function\\s|const\\s|import\\s/i;\n\nexport function estimateRiskMargin(text: string, baseMargin = 1.1): number {\n if (!text || text.length < 20) return baseMargin;\n\n const sample = text.slice(0, 2000);\n\n let nonAlnum = 0;\n for (const c of sample) {\n if (!/^[\\p{L}\\p{N}]$/u.test(c) && !/^\\s$/u.test(c)) nonAlnum += 1;\n }\n const punctRatio = nonAlnum / Math.max(1, sample.length);\n\n const hasCode = CODE_PATTERNS.test(sample);\n\n let nonLatinCount = 0;\n for (const c of sample) {\n const script = charScript(c);\n if (script && script !== \"latin\") nonLatinCount += 1;\n }\n const nonLatin = nonLatinCount / Math.max(1, sample.length);\n\n let margin = baseMargin;\n\n if (punctRatio > 0.2 || hasCode) {\n margin = Math.max(margin, 1.2);\n log.debug(\n `[TokenCount:Margin] Code/structured detected (punct=${punctRatio.toFixed(2)}, code=${hasCode}), using ${margin}x margin`,\n );\n }\n\n if (nonLatin > 0.15) {\n margin = Math.max(margin, 1.15);\n log.debug(\n `[TokenCount:Margin] Non-Latin script detected (${(nonLatin * 100).toFixed(2)}%), using ${margin}x margin`,\n );\n }\n\n if (punctRatio > 0.4) {\n margin = Math.max(margin, 1.25);\n log.debug(\n `[TokenCount:Margin] Extremely dense content (punct=${punctRatio.toFixed(2)}), using ${margin}x margin`,\n );\n }\n\n return margin;\n}\n\nexport function computeCoverageScore(\n query: string | null | undefined,\n compressedChunks: CompressionChunk[],\n): number {\n if (!query) return 1.0;\n if (!compressedChunks.length) return 0.0;\n\n const queryTerms = new Set<string>();\n for (const t of tokenize(query)) {\n if (t.length >= 2 || (t.length >= 1 && isSpacelessChar(t[0]!))) {\n queryTerms.add(t.toLowerCase());\n }\n }\n\n if (!queryTerms.size) return 1.0;\n\n const compressedText = compressedChunks\n .map((c) => (c.text ?? \"\") as string)\n .join(\" \")\n .toLowerCase();\n const compressedTerms = new Set(tokenize(compressedText));\n\n let covered = 0;\n for (const t of queryTerms) if (compressedTerms.has(t)) covered += 1;\n return covered / queryTerms.size;\n}\n\nfunction l2Norm(v: number[]): number {\n let s = 0;\n for (const x of v) s += x * x;\n return Math.sqrt(s);\n}\n\nfunction normalizeVec(v: number[]): number[] | null {\n const n = l2Norm(v);\n if (n < 1e-12) return null;\n return v.map((x) => x / n);\n}\n\nfunction dot(a: number[], b: number[]): number {\n const n = Math.min(a.length, b.length);\n let s = 0;\n for (let i = 0; i < n; i++) s += a[i]! * b[i]!;\n return s;\n}\n\nexport function hasEmbedding(chunk: CompressionChunk): boolean {\n const e = chunk.embedding;\n return e != null && Array.isArray(e) && e.length > 0;\n}\n\nexport function computeSemanticCoverageScore(\n queryEmbedding: number[] | null | undefined,\n compressedChunks: CompressionChunk[],\n topK = 3,\n): number {\n if (queryEmbedding == null || queryEmbedding.length === 0) return 1.0;\n if (!compressedChunks.length) return 0.0;\n\n const chunksWithEmbeddings = compressedChunks.filter(hasEmbedding);\n if (!chunksWithEmbeddings.length) return 0.0;\n\n try {\n const qVec = normalizeVec(queryEmbedding);\n if (!qVec) return 0.0;\n\n const similarities: number[] = [];\n for (const chunk of chunksWithEmbeddings) {\n try {\n const cVec = normalizeVec(chunk.embedding as number[]);\n if (!cVec) continue;\n similarities.push(Math.max(0.0, dot(qVec, cVec)));\n } catch {}\n }\n\n if (!similarities.length) return 0.0;\n similarities.sort((a, b) => b - a);\n const k = Math.min(topK, similarities.length);\n const topKMean = similarities.slice(0, k).reduce((a, b) => a + b, 0) / k;\n return Math.min(1.0, Math.max(0.0, topKMean));\n } catch (e) {\n log.warn(`[Compression:SemanticCoverage] Failed: ${e}`);\n return 0.0;\n }\n}\n\nexport function computeRelevancePreservation(\n originalChunks: CompressionChunk[],\n compressedChunks: CompressionChunk[],\n): number {\n if (!originalChunks.length) return 1.0;\n if (!compressedChunks.length) return 0.0;\n\n const allScores = originalChunks.map((c) => (c.score ?? 0) as number);\n const keptScores = compressedChunks.map((c) => (c.score ?? 0) as number);\n const avgAll = allScores.reduce((a, b) => a + b, 0) / allScores.length;\n const avgKept = keptScores.reduce((a, b) => a + b, 0) / keptScores.length;\n if (avgAll === 0) return 1.0;\n return avgKept / avgAll;\n}\n\nexport function getStableChunkId(chunk: CompressionChunk): string {\n if (\"id\" in chunk && chunk.id !== null && chunk.id !== undefined) {\n const chunkIdStr = String(chunk.id).trim();\n if (chunkIdStr !== \"\") return chunkIdStr;\n }\n throw new Error(\n \"Chunk missing required 'id' field. All chunks must have stable, deterministic IDs. \" +\n \"Consider using: doc_id + ':' + str(chunk_index) or hash of text[:100]\",\n );\n}\n\nconst SIGNAL_PATTERNS = [\n /[$€£¥₹₩₪﷼₱₿]\\s*\\d+/i,\n /\\d+[.,]\\d+/i,\n /[A-Z]{2,}[-_]\\d+/i,\n /^\\d{3,}$/,\n /\\b(?=[a-z0-9]*\\d)[a-z0-9]{8,}\\b/i,\n /\\d+\\s*%/i,\n /#\\d+/i,\n /[\\p{L}\\p{N}_]+@[\\p{L}\\p{N}_]+/u,\n];\n\nexport function isShortSignalChunk(text: string): boolean {\n if (!text || text.trim().length >= 40) return false;\n text = text.trim();\n for (const pattern of SIGNAL_PATTERNS) {\n pattern.lastIndex = 0;\n if (pattern.test(text)) return true;\n }\n return false;\n}\n\nexport function detectCrossDocBoilerplate(chunks: CompressionChunk[]): Set<string> {\n const allSources = new Set<string>();\n for (const c of chunks) {\n if (c.source_key) allSources.add(String(c.source_key));\n }\n if (allSources.size < 2) return new Set();\n\n const textToSources = new Map<string, Set<string>>();\n for (const chunk of chunks) {\n const raw = ((chunk.text ?? \"\") as string).trim();\n const source = chunk.source_key;\n if (!raw || !source) continue;\n if (raw.length > BOILERPLATE_MAX_CHUNK_CHARS) continue;\n const normalized = raw.toLowerCase();\n let sources = textToSources.get(normalized);\n if (!sources) {\n sources = new Set();\n textToSources.set(normalized, sources);\n }\n sources.add(String(source));\n }\n\n const threshold = Math.max(2, allSources.size * 0.5);\n const boilerplate = new Set<string>();\n for (const [text, sources] of textToSources) {\n if (sources.size >= threshold) boilerplate.add(text);\n }\n\n if (boilerplate.size) {\n log.info(\n `[Compression:Boilerplate] Detected ${boilerplate.size} cross-doc boilerplate patterns ` +\n `(threshold=${threshold.toFixed(0)}/${allSources.size} docs)`,\n );\n }\n return boilerplate;\n}\n\nconst BOILERPLATE_PATTERNS = [\n /^page \\d+$/,\n /^page \\d+ of \\d+$/,\n /^\\d+\\/\\d+\\/\\d+$/,\n /^copyright ©/,\n /^all rights reserved/,\n /^confidential/,\n /^draft$/,\n /^table of contents$/,\n /^index$/,\n /^references$/,\n /^appendix [a-z]$/,\n];\n\nexport function isNoiseChunk(\n chunk: CompressionChunk,\n crossDocBoilerplate: Set<string> | null = null,\n): boolean {\n const text = ((chunk.text ?? \"\") as string).trim();\n if (!text) return true;\n\n if (text.length < 40 && isShortSignalChunk(text)) return false;\n if (text.length < 20) return true;\n\n if (crossDocBoilerplate && text.length <= BOILERPLATE_MAX_CHUNK_CHARS) {\n if (crossDocBoilerplate.has(text.toLowerCase())) return true;\n }\n\n const textLower = text.toLowerCase();\n for (const pattern of BOILERPLATE_PATTERNS) {\n if (pattern.test(textLower)) return true;\n }\n\n let specialChars = 0;\n for (const c of text) {\n if (!/^[\\p{L}\\p{N}]$/u.test(c) && !/^\\s$/u.test(c)) specialChars += 1;\n }\n if (text.length > 0 && specialChars / text.length > 0.5) return true;\n\n const tokens = tokenize(text);\n if (tokens.length >= 5) {\n const tokenCounts = new Map<string, number>();\n for (const t of tokens) tokenCounts.set(t, (tokenCounts.get(t) ?? 0) + 1);\n let mostCommonCount = 0;\n for (const c of tokenCounts.values()) if (c > mostCommonCount) mostCommonCount = c;\n if (mostCommonCount / tokens.length > 0.7) return true;\n }\n\n const score = (chunk.score ?? 1.0) as number;\n if (text.length < 60 && score < 0.2) return true;\n return false;\n}\n\nfunction mulberry32(seed: number): () => number {\n let a = seed >>> 0;\n return () => {\n a = (a + 0x6d2b79f5) | 0;\n let t = Math.imul(a ^ (a >>> 15), 1 | a);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\nfunction euclid2(a: number[], b: number[]): number {\n const n = Math.min(a.length, b.length);\n let s = 0;\n for (let i = 0; i < n; i++) {\n const d = a[i]! - b[i]!;\n s += d * d;\n }\n return s;\n}\n\nfunction kmeans2(data: number[][], nClusters: number, seed = 42, maxIter = 10): number[] {\n const n = data.length;\n const dim = data[0]!.length;\n const rng = mulberry32(seed);\n const centroids: number[][] = [];\n centroids.push(data[Math.floor(rng() * n)]!.slice());\n\n while (centroids.length < nClusters) {\n const dists = data.map((p) => {\n let min = Infinity;\n for (const c of centroids) min = Math.min(min, euclid2(p, c));\n return min;\n });\n const sum = dists.reduce((a, b) => a + b, 0);\n let pick = rng() * (sum || 1);\n let idx = n - 1;\n for (let i = 0; i < n; i++) {\n pick -= dists[i]!;\n if (pick <= 0) {\n idx = i;\n break;\n }\n }\n centroids.push(data[idx]!.slice());\n }\n\n const labels = new Array<number>(n).fill(0);\n for (let iter = 0; iter < maxIter; iter++) {\n for (let i = 0; i < n; i++) {\n let best = 0;\n let bestD = Infinity;\n for (let k = 0; k < nClusters; k++) {\n const d = euclid2(data[i]!, centroids[k]!);\n if (d < bestD) {\n bestD = d;\n best = k;\n }\n }\n labels[i] = best;\n }\n const sums = Array.from({ length: nClusters }, () => new Array<number>(dim).fill(0));\n const counts = new Array<number>(nClusters).fill(0);\n for (let i = 0; i < n; i++) {\n const k = labels[i]!;\n counts[k]! += 1;\n const row = data[i]!;\n const acc = sums[k]!;\n for (let d = 0; d < dim; d++) acc[d]! += row[d]!;\n }\n for (let k = 0; k < nClusters; k++) {\n if (!counts[k]) continue;\n const acc = sums[k]!;\n const c = counts[k]!;\n centroids[k] = acc.map((x) => x / c);\n }\n }\n return labels;\n}\n\nexport function computeSemanticClusters(chunks: CompressionChunk[]): Record<string, number> {\n const [labels] = computeSemanticClustersWithMeta(chunks);\n return labels;\n}\n\nexport function computeSemanticClustersWithMeta(\n chunks: CompressionChunk[],\n): [Record<string, number>, ClusteringMeta] {\n const hasEmbeddings = chunks.some(hasEmbedding);\n\n if (!chunks.length || !hasEmbeddings) {\n return [\n {},\n {\n available: false,\n reason: chunks.length ? \"no_embeddings\" : \"no_chunks\",\n n_embeddings: 0,\n n_clusters: 0,\n },\n ];\n }\n\n const embeddings: number[][] = [];\n const chunkIds: string[] = [];\n for (const c of chunks) {\n if (!hasEmbedding(c)) continue;\n const normed = normalizeVec(c.embedding as number[]);\n if (!normed) continue;\n try {\n chunkIds.push(getStableChunkId(c));\n embeddings.push(normed);\n } catch {}\n }\n\n const nEmbeddings = embeddings.length;\n if (nEmbeddings < 8) {\n return [{}, { available: false, reason: \"too_few_embeddings\", n_embeddings: nEmbeddings, n_clusters: 0 }];\n }\n\n try {\n const nClusters = Math.min(5, Math.max(2, Math.floor(nEmbeddings / 10)));\n const clusterLabels = kmeans2(embeddings, nClusters, 42);\n const labelsDict: Record<string, number> = {};\n for (let i = 0; i < chunkIds.length; i++) {\n labelsDict[chunkIds[i]!] = clusterLabels[i]!;\n }\n return [\n labelsDict,\n { available: true, reason: \"success\", n_embeddings: nEmbeddings, n_clusters: nClusters },\n ];\n } catch (e) {\n log.warn(`[Compression:Clustering] Failed: ${e}`);\n return [\n {},\n {\n available: false,\n reason: `clustering_error: ${String(e).slice(0, 50)}`,\n n_embeddings: nEmbeddings,\n n_clusters: 0,\n },\n ];\n }\n}\n\nexport function computeSemanticDiversityScore(\n chunks: CompressionChunk[],\n clusterLabels: Record<string, number>,\n): number {\n if (!clusterLabels || !Object.keys(clusterLabels).length || !chunks.length) return 1.0;\n\n try {\n const assigned: number[] = [];\n for (const c of chunks) {\n try {\n const chunkId = getStableChunkId(c);\n if (chunkId in clusterLabels) assigned.push(clusterLabels[chunkId]!);\n } catch {}\n }\n if (!assigned.length) return 1.0;\n\n const clusterCounts = new Map<number, number>();\n for (const id of assigned) clusterCounts.set(id, (clusterCounts.get(id) ?? 0) + 1);\n const nClusters = clusterCounts.size;\n const total = assigned.length;\n if (nClusters <= 1) return 0.0;\n\n let entropy = 0;\n for (const count of clusterCounts.values()) {\n const p = count / total;\n entropy -= p * Math.log2(p + 1e-10);\n }\n const maxEntropy = Math.log2(nClusters);\n const normalized = maxEntropy > 0 ? entropy / maxEntropy : 0.0;\n return normalized;\n } catch (e) {\n log.warn(`[Compression:Diversity] Failed: ${e}`);\n return 1.0;\n }\n}\n\nexport function countClusters(chunks: CompressionChunk[], clusterLabels: Record<string, number>): number {\n if (!clusterLabels || !Object.keys(clusterLabels).length) return 0;\n const clusterIds = new Set<number>();\n for (const c of chunks) {\n try {\n const chunkId = getStableChunkId(c);\n if (chunkId in clusterLabels) clusterIds.add(clusterLabels[chunkId]!);\n } catch {}\n }\n return clusterIds.size;\n}\n\nexport function checkClusterPreservation(\n originalChunks: CompressionChunk[],\n compressedChunks: CompressionChunk[],\n clusterLabels: Record<string, number>,\n): number {\n if (!clusterLabels || !Object.keys(clusterLabels).length) return 1.0;\n const nOriginal = countClusters(originalChunks, clusterLabels);\n const nCompressed = countClusters(compressedChunks, clusterLabels);\n if (nOriginal === 0) return 1.0;\n return nCompressed / nOriginal;\n}\n\nfunction scoreKey(c: CompressionChunk): [number, string, string] {\n return [-(c.score ?? 0) as number, String(c.source_key ?? \"\"), getStableChunkId(c)];\n}\n\nfunction cmpScoreKey(a: CompressionChunk, b: CompressionChunk): number {\n const ka = scoreKey(a);\n const kb = scoreKey(b);\n if (ka[0] !== kb[0]) return ka[0] - kb[0];\n if (ka[1] < kb[1]) return -1;\n if (ka[1] > kb[1]) return 1;\n if (ka[2] < kb[2]) return -1;\n if (ka[2] > kb[2]) return 1;\n return 0;\n}\n\nfunction median(xs: number[]): number {\n if (!xs.length) return 0.5;\n const s = [...xs].sort((a, b) => a - b);\n const mid = Math.floor(s.length / 2);\n if (s.length % 2) return s[mid]!;\n return (s[mid - 1]! + s[mid]!) / 2;\n}\n\nfunction cfg<T>(config: Record<string, unknown>, key: string, fallback: T): T {\n return key in config ? (config[key] as T) : fallback;\n}\n\n/** @see Python ContextCompressionService — static-only, matching the source. */\n// biome-ignore lint/complexity/noStaticOnlyClass: faithful port of the Python class\nexport class ContextCompressionService {\n static async compressIfNeeded(\n chunks: CompressionChunk[],\n targetTokens: number,\n compressionConfig?: Record<string, unknown> | null,\n query?: string | null,\n returnReport?: false,\n queryEmbedding?: number[] | null,\n ): Promise<CompressionChunk[]>;\n static async compressIfNeeded(\n chunks: CompressionChunk[],\n targetTokens: number,\n compressionConfig: Record<string, unknown> | null | undefined,\n query: string | null | undefined,\n returnReport: true,\n queryEmbedding?: number[] | null,\n ): Promise<{ chunks: CompressionChunk[]; report: CompressionReport }>;\n static async compressIfNeeded(\n chunks: CompressionChunk[],\n targetTokens: number,\n compressionConfig?: Record<string, unknown> | null,\n query?: string | null,\n returnReport = false,\n queryEmbedding?: number[] | null,\n ): Promise<CompressionChunk[] | { chunks: CompressionChunk[]; report: CompressionReport }> {\n const config = compressionConfig ?? {};\n\n if (!cfg(config, \"enabled\", true)) {\n log.info(\"[Compression] Disabled by config\");\n if (returnReport) {\n return { chunks, report: { compression_applied: false, reason: \"disabled_by_config\" } };\n }\n return chunks;\n }\n\n if (!chunks.length) {\n log.info(\"[Compression] No chunks to compress\");\n if (returnReport) {\n return { chunks, report: { compression_applied: false, reason: \"no_chunks\" } };\n }\n return chunks;\n }\n\n const originalCountBeforeFilter = chunks.length;\n let filteredCount = 0;\n\n if (cfg(config, \"filter_noise\", true)) {\n const boilerplateSet = detectCrossDocBoilerplate(chunks);\n chunks = chunks.filter((c) => !isNoiseChunk(c, boilerplateSet));\n filteredCount = originalCountBeforeFilter - chunks.length;\n if (filteredCount > 0) {\n log.info(\n `[Compression:NoiseFilter] Removed ${filteredCount}/${originalCountBeforeFilter} noise chunks`,\n );\n }\n }\n\n if (!chunks.length) {\n log.info(\"[Compression] All chunks filtered as noise\");\n if (returnReport) {\n return {\n chunks,\n report: { compression_applied: true, reason: \"all_noise\", filtered_noise: filteredCount },\n };\n }\n return chunks;\n }\n\n const originalCountAfterFilter = chunks.length;\n\n const missingIdIndices: number[] = [];\n for (let i = 0; i < chunks.length; i++) {\n const c = chunks[i]!;\n const valid = \"id\" in c && c.id !== null && c.id !== undefined && String(c.id).trim() !== \"\";\n if (!valid) missingIdIndices.push(i);\n }\n if (missingIdIndices.length) {\n const errorMsg =\n `Compression requires stable chunk 'id' field. ` +\n `Missing/invalid in ${missingIdIndices.length}/${chunks.length} chunks (indices: ${missingIdIndices.slice(0, 5).join(\",\")}...). ` +\n `IDs should be assigned during chunk creation (e.g., doc_id + ':' + chunk_index).`;\n log.error(`[Compression] ${errorMsg}`);\n throw new Error(errorMsg);\n }\n\n const validMethods = new Set([\"tiktoken_cl100k_base\", \"heuristic_char_0.25\", \"empty\"]);\n chunks = chunks.map((c) => ({ ...c }));\n for (const chunk of chunks) {\n const currentMethod = chunk.token_count_method;\n if (!(\"token_count\" in chunk) || !validMethods.has(currentMethod as string)) {\n const [count, method] = countTokensUniversal((chunk.text ?? \"\") as string, true);\n chunk.token_count = count;\n chunk.token_count_method = method;\n }\n }\n\n const currentTokens = chunks.reduce((s, c) => s + (c.token_count as number), 0);\n const usedHeuristic = chunks.some((c) => c.token_count_method === \"heuristic_char_0.25\");\n\n const sampleText = chunks\n .slice(0, 6)\n .map((c) => ((c.text ?? \"\") as string).slice(0, 500))\n .join(\" \");\n let baseMargin = cfg(config, \"safety_margin\", 1.1);\n\n if (usedHeuristic) {\n baseMargin = Math.max(baseMargin, 1.2);\n log.info(\"[Compression] Heuristic token counting detected, increased base safety margin to 1.20\");\n }\n\n const safetyMargin = estimateRiskMargin(sampleText, baseMargin);\n const effectiveBudget = Math.max(1, Math.trunc(targetTokens / safetyMargin));\n\n log.info(\n `[Compression] Safety margin: ${safetyMargin.toFixed(2)}x ` +\n `(target=${targetTokens}, effective_budget=${effectiveBudget})`,\n );\n\n if (currentTokens <= effectiveBudget) {\n log.info(\n `[Compression] Not needed: ${currentTokens}/${effectiveBudget} tokens (${chunks.length} chunks)`,\n );\n if (returnReport) {\n return {\n chunks,\n report: {\n compression_applied: false,\n reason: \"within_budget\",\n original_chunks_before_noise_filter: originalCountBeforeFilter,\n filtered_noise_chunks: originalCountBeforeFilter - originalCountAfterFilter,\n original_chunks: originalCountAfterFilter,\n original_tokens: currentTokens,\n target_tokens: targetTokens,\n effective_budget: effectiveBudget,\n safety_margin: safetyMargin,\n },\n };\n }\n return chunks;\n }\n\n log.info(\n `[Compression] Needed: ${currentTokens} → ${effectiveBudget} tokens ` +\n `(${chunks.length} chunks, ${(currentTokens / effectiveBudget).toFixed(1)}x over)`,\n );\n\n const method = cfg(config, \"method\", \"auto\");\n let result: CompressionChunk[] | { chunks: CompressionChunk[]; report: CompressionReport };\n\n if (method === \"auto\") {\n result = await ContextCompressionService.compressAuto(\n chunks,\n effectiveBudget,\n config,\n query ?? null,\n returnReport,\n queryEmbedding ?? null,\n originalCountBeforeFilter,\n originalCountAfterFilter,\n targetTokens,\n safetyMargin,\n );\n } else if (method === \"pruning\") {\n const [clusterLabels, clusteringMeta] = computeSemanticClustersWithMeta(chunks);\n const compressed = ContextCompressionService.progressivePrune(chunks, effectiveBudget, clusterLabels);\n result = returnReport\n ? ContextCompressionService.buildReport(\n compressed,\n chunks,\n clusterLabels,\n \"pruning\",\n query ?? null,\n targetTokens,\n originalCountBeforeFilter,\n originalCountAfterFilter,\n queryEmbedding ?? null,\n safetyMargin,\n clusteringMeta,\n )\n : compressed;\n } else if (method === \"dedup\") {\n const [clusterLabels, clusteringMeta] = computeSemanticClustersWithMeta(chunks);\n const compressed = await ContextCompressionService.deduplicateSemantic(\n chunks,\n effectiveBudget,\n cfg(config, \"similarity_threshold\", 0.94),\n );\n result = returnReport\n ? ContextCompressionService.buildReport(\n compressed,\n chunks,\n clusterLabels,\n \"dedup\",\n query ?? null,\n targetTokens,\n originalCountBeforeFilter,\n originalCountAfterFilter,\n queryEmbedding ?? null,\n safetyMargin,\n clusteringMeta,\n )\n : compressed;\n } else {\n log.warn(`[Compression] Unknown method '${method}', using pruning`);\n const [clusterLabels, clusteringMeta] = computeSemanticClustersWithMeta(chunks);\n const compressed = ContextCompressionService.progressivePrune(chunks, effectiveBudget, clusterLabels);\n result = returnReport\n ? ContextCompressionService.buildReport(\n compressed,\n chunks,\n clusterLabels,\n \"pruning_fallback\",\n query ?? null,\n targetTokens,\n originalCountBeforeFilter,\n originalCountAfterFilter,\n queryEmbedding ?? null,\n safetyMargin,\n clusteringMeta,\n )\n : compressed;\n }\n\n if (result && typeof result === \"object\" && !Array.isArray(result) && \"chunks\" in result) {\n result.chunks = ContextCompressionService.enforceMinimumEvidence(\n result.chunks,\n chunks,\n config,\n effectiveBudget,\n );\n } else {\n result = ContextCompressionService.enforceMinimumEvidence(\n result as CompressionChunk[],\n chunks,\n config,\n effectiveBudget,\n );\n }\n\n return result;\n }\n\n static async compressAuto(\n chunks: CompressionChunk[],\n effectiveBudget: number,\n config: Record<string, unknown>,\n query: string | null,\n returnReport = false,\n queryEmbedding: number[] | null = null,\n originalCountBeforeFilter = 0,\n originalCountAfterFilter = 0,\n targetTokens = 0,\n safetyMargin = 1.1,\n ): Promise<CompressionChunk[] | { chunks: CompressionChunk[]; report: CompressionReport }> {\n if (originalCountBeforeFilter === 0) originalCountBeforeFilter = chunks.length;\n if (originalCountAfterFilter === 0) originalCountAfterFilter = chunks.length;\n if (targetTokens === 0) targetTokens = effectiveBudget;\n\n const [clusterLabels, clusteringMeta] = computeSemanticClustersWithMeta(chunks);\n if (Object.keys(clusterLabels).length) {\n log.info(\n `[Compression] Identified ${clusteringMeta.n_clusters} semantic clusters ` +\n `from ${clusteringMeta.n_embeddings} embeddings`,\n );\n } else {\n log.info(`[Compression] Clustering unavailable: ${clusteringMeta.reason}`);\n }\n\n const pruned = ContextCompressionService.progressivePrune(chunks, effectiveBudget, clusterLabels);\n const prunedTokens = pruned.reduce((s, c) => s + (c.token_count as number), 0);\n\n // Audit D2: \"pruning was insufficient\" means chunks were DROPPED, not that\n // tokens exceeded budget (pruning only adds a chunk when it fits).\n if (pruned.length === chunks.length) {\n log.info(\n `[Compression] Tier 1 (pruning): ${pruned.length}/${chunks.length} chunks kept, ${prunedTokens} tokens`,\n );\n const quality = ContextCompressionService.validateQuality(\n pruned,\n chunks,\n config,\n query,\n effectiveBudget,\n clusterLabels,\n queryEmbedding,\n );\n if (returnReport) {\n return ContextCompressionService.buildReport(\n quality,\n chunks,\n clusterLabels,\n \"pruning\",\n query,\n targetTokens,\n originalCountBeforeFilter,\n originalCountAfterFilter,\n queryEmbedding,\n safetyMargin,\n clusteringMeta,\n );\n }\n return quality;\n }\n\n log.info(\"[Compression] Pruning insufficient, trying deduplication...\");\n const deduped = await ContextCompressionService.deduplicateSemanticGreedy(\n chunks,\n effectiveBudget,\n cfg(config, \"similarity_threshold\", 0.94),\n );\n const dedupedTokens = deduped.reduce((s, c) => s + (c.token_count as number), 0);\n log.info(\n `[Compression] Tier 2 (dedup): ${deduped.length}/${chunks.length} chunks kept, ${dedupedTokens} tokens`,\n );\n const quality = ContextCompressionService.validateQuality(\n deduped,\n chunks,\n config,\n query,\n effectiveBudget,\n clusterLabels,\n queryEmbedding,\n );\n if (returnReport) {\n return ContextCompressionService.buildReport(\n quality,\n chunks,\n clusterLabels,\n \"dedup\",\n query,\n targetTokens,\n originalCountBeforeFilter,\n originalCountAfterFilter,\n queryEmbedding,\n safetyMargin,\n clusteringMeta,\n );\n }\n return quality;\n }\n\n static progressivePrune(\n chunks: CompressionChunk[],\n targetTokens: number,\n clusterLabels: Record<string, number> | null = null,\n ): CompressionChunk[] {\n if (!chunks.length) return [];\n if (clusterLabels && Object.keys(clusterLabels).length) {\n return ContextCompressionService.diversityAwarePrune(chunks, targetTokens, clusterLabels);\n }\n return ContextCompressionService.scoreBasedPrune(chunks, targetTokens);\n }\n\n static scoreBasedPrune(chunks: CompressionChunk[], targetTokens: number): CompressionChunk[] {\n const sortedChunks = [...chunks].sort(cmpScoreKey);\n const selected: CompressionChunk[] = [];\n let remainingBudget = targetTokens;\n let firstNonfitIdx: number | null = null;\n\n for (let i = 0; i < sortedChunks.length; i++) {\n const chunk = sortedChunks[i]!;\n const chunkTokens = (chunk.token_count ?? 0) as number;\n if (remainingBudget >= chunkTokens) {\n selected.push(chunk);\n remainingBudget -= chunkTokens;\n } else {\n firstNonfitIdx = i;\n break;\n }\n }\n\n if (firstNonfitIdx !== null && remainingBudget > 0) {\n const remainingChunks = sortedChunks.slice(firstNonfitIdx);\n remainingChunks.sort((a, b) => {\n const ta = (a.token_count ?? 0) as number;\n const tb = (b.token_count ?? 0) as number;\n if (ta !== tb) return ta - tb;\n return -((a.score ?? 0) as number) + ((b.score ?? 0) as number);\n });\n for (const chunk of remainingChunks) {\n const chunkTokens = (chunk.token_count ?? 0) as number;\n if (remainingBudget >= chunkTokens) {\n selected.push(chunk);\n remainingBudget -= chunkTokens;\n }\n }\n }\n\n const totalTokens = selected.reduce((s, c) => s + ((c.token_count ?? 0) as number), 0);\n log.info(\n `[Compression:Prune] ${selected.length}/${chunks.length} chunks, ${totalTokens}/${targetTokens} tokens`,\n );\n return selected;\n }\n\n static diversityAwarePrune(\n chunks: CompressionChunk[],\n targetTokens: number,\n clusterLabels: Record<string, number>,\n ): CompressionChunk[] {\n const clusters = new Map<number, CompressionChunk[]>();\n\n for (const chunk of chunks) {\n try {\n const chunkId = getStableChunkId(chunk);\n const clusterId = clusterLabels[chunkId] ?? -1;\n let list = clusters.get(clusterId);\n if (!list) {\n list = [];\n clusters.set(clusterId, list);\n }\n list.push(chunk);\n } catch {\n log.error(\n `[Compression:Prune] Chunk missing stable ID in diversity-aware pruning. ` +\n `Text preview: ${((chunk.text ?? \"\") as string).slice(0, 50)}`,\n );\n throw new Error(\n \"Diversity-aware pruning requires all chunks to have stable 'id' field. \" +\n \"Ensure chunks have been assigned IDs before compression.\",\n );\n }\n }\n\n for (const list of clusters.values()) list.sort(cmpScoreKey);\n\n const selected: CompressionChunk[] = [];\n let totalTokens = 0;\n const clusterIds = [...clusters.keys()].sort((a, b) => {\n const aUn = a === -1 ? 1 : 0;\n const bUn = b === -1 ? 1 : 0;\n return aUn - bUn || a - b;\n });\n const clusterIndices = new Map<number, number>(clusterIds.map((id) => [id, 0]));\n const selectedClusters = new Set<number>();\n\n while (totalTokens < targetTokens) {\n let addedAny = false;\n for (const clusterId of clusterIds) {\n let idx = clusterIndices.get(clusterId)!;\n const clusterChunks = clusters.get(clusterId)!;\n if (idx >= clusterChunks.length) continue;\n\n let foundFit = false;\n while (idx < clusterChunks.length) {\n const chunk = clusterChunks[idx]!;\n const chunkTokens = (chunk.token_count ?? 0) as number;\n if (totalTokens + chunkTokens <= targetTokens) {\n selected.push(chunk);\n totalTokens += chunkTokens;\n clusterIndices.set(clusterId, idx + 1);\n selectedClusters.add(clusterId);\n addedAny = true;\n foundFit = true;\n break;\n }\n idx += 1;\n }\n if (!foundFit) clusterIndices.set(clusterId, idx);\n }\n if (!addedAny) break;\n }\n\n log.info(\n `[Compression:Prune:Diversity] ${selected.length}/${chunks.length} chunks, ` +\n `${totalTokens}/${targetTokens} tokens, ${selectedClusters.size} clusters represented`,\n );\n return selected;\n }\n\n static async deduplicateSemantic(\n chunks: CompressionChunk[],\n targetTokens: number,\n similarityThreshold = 0.94,\n ): Promise<CompressionChunk[]> {\n if (!chunks.some(hasEmbedding)) {\n log.warn(\"[Compression:Dedup] No embeddings available, skipping deduplication\");\n return ContextCompressionService.progressivePrune(chunks, targetTokens);\n }\n if (!chunks.length) return [];\n\n const sortedChunks = [...chunks].sort((a, b) => ((b.score ?? 0) as number) - ((a.score ?? 0) as number));\n let embeddedChunks = sortedChunks.filter(hasEmbedding);\n const noEmbeddingChunks = sortedChunks.filter((c) => !hasEmbedding(c));\n\n if (embeddedChunks.length < 2) {\n log.info(`[Compression:Dedup] Only ${embeddedChunks.length} chunks with embeddings, skipping dedup`);\n return ContextCompressionService.progressivePrune(sortedChunks, targetTokens);\n }\n\n const normalized: Array<{ chunk: CompressionChunk; vec: number[] }> = [];\n for (const c of embeddedChunks) {\n const vec = normalizeVec(c.embedding as number[]);\n if (vec) normalized.push({ chunk: c, vec });\n }\n if (!normalized.length) {\n log.warn(\"[Compression:Dedup] All embeddings have zero norm, skipping dedup\");\n return ContextCompressionService.progressivePrune(sortedChunks, targetTokens);\n }\n embeddedChunks = normalized.map((n) => n.chunk);\n const vecs = normalized.map((n) => n.vec);\n\n const keptEmbedded: CompressionChunk[] = [];\n const keptIndices = new Set<number>();\n for (let i = 0; i < embeddedChunks.length; i++) {\n let isDuplicate = false;\n for (const j of keptIndices) {\n if (dot(vecs[i]!, vecs[j]!) > similarityThreshold) {\n isDuplicate = true;\n break;\n }\n }\n if (!isDuplicate) {\n keptEmbedded.push(embeddedChunks[i]!);\n keptIndices.add(i);\n }\n }\n\n const MAX_NO_EMBEDDING_CHUNKS = 10;\n const noEmbeddingChunksSorted = [...noEmbeddingChunks]\n .sort((a, b) => ((b.score ?? 0) as number) - ((a.score ?? 0) as number))\n .slice(0, MAX_NO_EMBEDDING_CHUNKS);\n const keptChunks = [...keptEmbedded, ...noEmbeddingChunksSorted];\n\n const removedCount = embeddedChunks.length - keptEmbedded.length;\n const noEmbKept = noEmbeddingChunksSorted.length;\n const noEmbDropped = noEmbeddingChunks.length - noEmbKept;\n log.info(\n `[Compression:Dedup] ${keptEmbedded.length}/${embeddedChunks.length} unique embedded chunks ` +\n `(removed ${removedCount} duplicates), ${noEmbKept}/${noEmbeddingChunks.length} ` +\n `no-embedding chunks kept (dropped ${noEmbDropped})`,\n );\n\n const dedupedTokens = keptChunks.reduce((s, c) => s + ((c.token_count ?? 0) as number), 0);\n if (dedupedTokens > targetTokens) {\n log.info(`[Compression:Dedup] Still over budget (${dedupedTokens}/${targetTokens}), applying pruning`);\n const clusterLabels = computeSemanticClusters(keptChunks);\n return ContextCompressionService.progressivePrune(keptChunks, targetTokens, clusterLabels);\n }\n return keptChunks;\n }\n\n static async deduplicateSemanticGreedy(\n chunks: CompressionChunk[],\n targetTokens: number,\n similarityThreshold = 0.94,\n ): Promise<CompressionChunk[]> {\n if (!chunks.some(hasEmbedding)) {\n log.warn(\"[Compression:Dedup:Greedy] No embeddings available, skipping deduplication\");\n const clusterLabels = computeSemanticClusters(chunks);\n return ContextCompressionService.progressivePrune(chunks, targetTokens, clusterLabels);\n }\n if (!chunks.length) return [];\n\n const sortedChunks = [...chunks].sort(cmpScoreKey);\n const allScores = chunks.map((c) => (c.score ?? 0) as number);\n const scoreThreshold = median(allScores);\n\n const keptChunks: CompressionChunk[] = [];\n const keptEmbeddings: number[][] = [];\n\n for (const chunk of sortedChunks) {\n try {\n const raw = chunk.embedding;\n if (raw == null || !Array.isArray(raw)) throw new Error(\"Zero-norm embedding\");\n const chunkEmbedding = normalizeVec(raw);\n if (!chunkEmbedding) throw new Error(\"Zero-norm embedding\");\n\n let isDuplicate = false;\n for (const keptEmb of keptEmbeddings) {\n if (dot(chunkEmbedding, keptEmb) > similarityThreshold) {\n isDuplicate = true;\n break;\n }\n }\n if (!isDuplicate) {\n keptChunks.push(chunk);\n keptEmbeddings.push(chunkEmbedding);\n }\n } catch {\n if (isNoiseChunk(chunk)) {\n log.debug(\"[Compression:Dedup:Greedy] Dropping noise chunk without embedding\");\n continue;\n }\n const chunkScore = (chunk.score ?? 0) as number;\n const chunkText = (chunk.text ?? \"\") as string;\n const isShortSignal = isShortSignalChunk(chunkText);\n if (chunkScore >= scoreThreshold || isShortSignal) {\n keptChunks.push(chunk);\n const reason = chunkScore >= scoreThreshold ? \"score\" : \"short_signal\";\n let chunkId = \"unknown\";\n try {\n chunkId = getStableChunkId(chunk);\n } catch {\n /* unknown */\n }\n log.debug(\n `[Compression:Dedup:Greedy] Keeping chunk without embedding (${reason}, score=${chunkScore.toFixed(2)}): ${chunkId}`,\n );\n } else {\n log.debug(\n `[Compression:Dedup:Greedy] Dropping chunk without embedding ` +\n `(score=${chunkScore.toFixed(2)} < threshold=${scoreThreshold.toFixed(2)}, noise)`,\n );\n }\n }\n }\n\n const removedCount = chunks.length - keptChunks.length;\n log.info(\n `[Compression:Dedup:Greedy] ${keptChunks.length}/${chunks.length} unique chunks (removed ${removedCount} duplicates)`,\n );\n\n const dedupedTokens = keptChunks.reduce((s, c) => s + ((c.token_count ?? 0) as number), 0);\n if (dedupedTokens > targetTokens) {\n log.info(\n `[Compression:Dedup:Greedy] Still over budget (${dedupedTokens}/${targetTokens}), applying pruning`,\n );\n const clusterLabels = computeSemanticClusters(keptChunks);\n return ContextCompressionService.progressivePrune(keptChunks, targetTokens, clusterLabels);\n }\n return keptChunks;\n }\n\n static buildReport(\n compressedChunks: CompressionChunk[],\n originalChunks: CompressionChunk[],\n clusterLabels: Record<string, number> | null,\n method: string,\n query: string | null,\n targetTokens: number,\n originalCountBeforeNoiseFilter: number,\n originalCountAfterNoiseFilter: number,\n queryEmbedding: number[] | null = null,\n safetyMargin = 1.0,\n clusteringMeta: ClusteringMeta | null = null,\n ): { chunks: CompressionChunk[]; report: CompressionReport } {\n const originalTokens = originalChunks.reduce((s, c) => s + ((c.token_count ?? 0) as number), 0);\n const compressedTokens = compressedChunks.reduce((s, c) => s + ((c.token_count ?? 0) as number), 0);\n\n const coverage = computeCoverageScore(query, compressedChunks);\n const semanticCoverage = computeSemanticCoverageScore(queryEmbedding, compressedChunks);\n const relevance = computeRelevancePreservation(originalChunks, compressedChunks);\n\n let diversityScore = 1.0;\n let clusterPreservation = 1.0;\n let nOriginalClusters = 0;\n let nCompressedClusters = 0;\n\n if (clusterLabels && Object.keys(clusterLabels).length) {\n diversityScore = computeSemanticDiversityScore(compressedChunks, clusterLabels);\n clusterPreservation = checkClusterPreservation(originalChunks, compressedChunks, clusterLabels);\n nOriginalClusters = countClusters(originalChunks, clusterLabels);\n nCompressedClusters = countClusters(compressedChunks, clusterLabels);\n }\n\n const effectiveBudget = safetyMargin > 0 ? Math.trunc(targetTokens / safetyMargin) : targetTokens;\n\n return {\n chunks: compressedChunks,\n report: {\n compression_applied: true,\n method,\n original_chunks_before_noise_filter: originalCountBeforeNoiseFilter,\n filtered_noise_chunks: originalCountBeforeNoiseFilter - originalCountAfterNoiseFilter,\n original_chunks_after_noise_filter: originalCountAfterNoiseFilter,\n original_chunks: originalCountAfterNoiseFilter,\n compressed_chunks: compressedChunks.length,\n chunks_removed: originalCountAfterNoiseFilter - compressedChunks.length,\n original_tokens: originalTokens,\n compressed_tokens: compressedTokens,\n target_tokens: targetTokens,\n effective_budget: effectiveBudget,\n safety_margin: safetyMargin,\n compression_ratio: originalTokens > 0 ? compressedTokens / originalTokens : 1.0,\n within_budget: compressedTokens <= effectiveBudget,\n quality_metrics: {\n coverage,\n semantic_coverage: semanticCoverage,\n relevance_preservation: relevance,\n semantic_diversity: diversityScore,\n cluster_preservation: clusterPreservation,\n original_clusters: nOriginalClusters,\n compressed_clusters: nCompressedClusters,\n },\n clustering: clusteringMeta ?? {\n available: false,\n reason: \"metadata_not_provided\",\n n_embeddings: 0,\n n_clusters: 0,\n },\n },\n };\n }\n\n static enforceMinimumEvidence(\n compressedChunks: CompressionChunk[],\n originalChunks: CompressionChunk[],\n config: Record<string, unknown>,\n targetTokens: number,\n ): CompressionChunk[] {\n const minChunks = cfg(config, \"min_chunks\", 0);\n const minClustersKept = cfg(config, \"min_clusters_kept\", 0);\n\n let clusterLabels: Record<string, number> | null = null;\n if (minClustersKept > 0) clusterLabels = computeSemanticClusters(originalChunks);\n\n const mustKeepIds = new Set<string>();\n for (const c of compressedChunks) {\n try {\n mustKeepIds.add(getStableChunkId(c));\n } catch {\n /* skip */\n }\n }\n\n if (minChunks > 0 && compressedChunks.length < minChunks) {\n const chunksNeeded = minChunks - compressedChunks.length;\n log.warn(\n `[Compression:MinEvidence] Only ${compressedChunks.length} chunks, ` +\n `minimum is ${minChunks}. Adding back ${chunksNeeded} chunks.`,\n );\n\n const compressedIds = new Set<string>();\n for (const c of compressedChunks) {\n try {\n compressedIds.add(getStableChunkId(c));\n } catch {\n /* skip */\n }\n }\n\n const droppedChunks: CompressionChunk[] = [];\n for (const c of originalChunks) {\n try {\n if (!compressedIds.has(getStableChunkId(c))) droppedChunks.push(c);\n } catch {}\n }\n droppedChunks.sort((a, b) => ((b.score ?? 0) as number) - ((a.score ?? 0) as number));\n const addedChunks = droppedChunks.slice(0, chunksNeeded);\n compressedChunks = [...compressedChunks, ...addedChunks];\n for (const c of addedChunks) {\n try {\n mustKeepIds.add(getStableChunkId(c));\n } catch {\n /* skip */\n }\n }\n }\n\n if (minClustersKept > 0 && clusterLabels) {\n const nClusters = countClusters(compressedChunks, clusterLabels);\n if (nClusters < minClustersKept) {\n log.warn(\n `[Compression:MinEvidence] Only ${nClusters} clusters represented, ` +\n `minimum is ${minClustersKept}. Trying to add chunks from missing clusters.`,\n );\n\n const compressedClusterIds = new Set<number>();\n for (const c of compressedChunks) {\n try {\n const cid = getStableChunkId(c);\n if (cid in clusterLabels) compressedClusterIds.add(clusterLabels[cid]!);\n } catch {\n /* skip */\n }\n }\n\n const allOriginalClusters = new Set<number>();\n for (const c of originalChunks) {\n try {\n const cid = getStableChunkId(c);\n if (cid in clusterLabels) allOriginalClusters.add(clusterLabels[cid]!);\n } catch {\n /* skip */\n }\n }\n\n const missingClusters = [...allOriginalClusters].filter((x) => !compressedClusterIds.has(x));\n for (const missingCluster of missingClusters) {\n const candidates: CompressionChunk[] = [];\n for (const c of originalChunks) {\n try {\n const chunkId = getStableChunkId(c);\n if (clusterLabels[chunkId] === missingCluster) candidates.push(c);\n } catch {}\n }\n if (candidates.length) {\n const bestChunk = candidates.reduce((best, c) =>\n ((c.score ?? 0) as number) > ((best.score ?? 0) as number) ? c : best,\n );\n compressedChunks.push(bestChunk);\n try {\n mustKeepIds.add(getStableChunkId(bestChunk));\n } catch {\n /* skip */\n }\n compressedClusterIds.add(missingCluster);\n }\n if (compressedClusterIds.size >= minClustersKept) break;\n }\n }\n }\n\n const finalTokens = compressedChunks.reduce((s, c) => s + ((c.token_count ?? 0) as number), 0);\n if (finalTokens > targetTokens) {\n log.warn(\n `[Compression:MinEvidence] After enforcing minimums, exceeded budget ` +\n `(${finalTokens}/${targetTokens}). Re-pruning while preserving must-keep chunks.`,\n );\n\n const mustKeepChunks: CompressionChunk[] = [];\n const optionalChunks: CompressionChunk[] = [];\n for (const c of compressedChunks) {\n try {\n const chunkId = getStableChunkId(c);\n if (mustKeepIds.has(chunkId)) mustKeepChunks.push(c);\n else optionalChunks.push(c);\n } catch {\n optionalChunks.push(c);\n }\n }\n\n const mustKeepTokens = mustKeepChunks.reduce((s, c) => s + ((c.token_count ?? 0) as number), 0);\n const remainingBudget = targetTokens - mustKeepTokens;\n\n if (mustKeepTokens > targetTokens) {\n log.error(\n `[Compression:MinEvidence] Must-keep chunks (${mustKeepTokens} tokens) ` +\n `exceed budget (${targetTokens} tokens). Pruning must-keep by score to fit.`,\n );\n mustKeepChunks.sort(cmpScoreKey);\n const prunedMustKeep: CompressionChunk[] = [];\n let tokensUsed = 0;\n for (const chunk of mustKeepChunks) {\n const chunkTokens = (chunk.token_count ?? 0) as number;\n if (tokensUsed + chunkTokens <= targetTokens) {\n prunedMustKeep.push(chunk);\n tokensUsed += chunkTokens;\n }\n }\n compressedChunks = prunedMustKeep;\n log.warn(\n `[Compression:MinEvidence] Kept ${prunedMustKeep.length}/${mustKeepChunks.length} ` +\n `must-keep chunks to fit budget (${tokensUsed} tokens)`,\n );\n } else if (remainingBudget > 0 && optionalChunks.length) {\n optionalChunks.sort(cmpScoreKey);\n const keptOptional: CompressionChunk[] = [];\n let optionalTokens = 0;\n for (const chunk of optionalChunks) {\n const chunkTokens = (chunk.token_count ?? 0) as number;\n if (optionalTokens + chunkTokens <= remainingBudget) {\n keptOptional.push(chunk);\n optionalTokens += chunkTokens;\n }\n }\n compressedChunks = [...mustKeepChunks, ...keptOptional];\n } else {\n compressedChunks = mustKeepChunks;\n }\n\n const finalTokensAfter = compressedChunks.reduce((s, c) => s + ((c.token_count ?? 0) as number), 0);\n log.info(\n `[Compression:MinEvidence] After re-pruning: ${compressedChunks.length} chunks, ` +\n `${finalTokensAfter}/${targetTokens} tokens`,\n );\n }\n\n return compressedChunks;\n }\n\n static validateQuality(\n compressedChunks: CompressionChunk[],\n originalChunks: CompressionChunk[],\n config: Record<string, unknown>,\n query: string | null,\n _budgetTokens: number,\n clusterLabels: Record<string, number> | null = null,\n queryEmbedding: number[] | null = null,\n ): CompressionChunk[] {\n const qualityThresholds = cfg(config, \"quality_thresholds\", {}) as Record<string, number>;\n if (!qualityThresholds || !Object.keys(qualityThresholds).length) return compressedChunks;\n\n const coverage = computeCoverageScore(query, compressedChunks);\n const semanticCoverage = computeSemanticCoverageScore(queryEmbedding, compressedChunks);\n const relevance = computeRelevancePreservation(originalChunks, compressedChunks);\n\n let diversityScore = 1.0;\n let clusterPreservation = 1.0;\n let nOriginalClusters = 0;\n let nCompressedClusters = 0;\n\n if (clusterLabels && Object.keys(clusterLabels).length) {\n diversityScore = computeSemanticDiversityScore(compressedChunks, clusterLabels);\n clusterPreservation = checkClusterPreservation(originalChunks, compressedChunks, clusterLabels);\n nOriginalClusters = countClusters(originalChunks, clusterLabels);\n nCompressedClusters = countClusters(compressedChunks, clusterLabels);\n log.info(\n `[Compression:Quality] coverage=${coverage.toFixed(2)}, semantic_coverage=${semanticCoverage.toFixed(2)}, relevance=${relevance.toFixed(2)}, ` +\n `diversity=${diversityScore.toFixed(2)}, cluster_preservation=${clusterPreservation.toFixed(2)} ` +\n `(${nCompressedClusters}/${nOriginalClusters} clusters)`,\n );\n } else {\n log.info(\n `[Compression:Quality] coverage=${coverage.toFixed(2)}, semantic_coverage=${semanticCoverage.toFixed(2)}, relevance=${relevance.toFixed(2)}`,\n );\n }\n\n const minCoverage = qualityThresholds.min_coverage ?? 0;\n const minSemanticCoverage = qualityThresholds.min_semantic_coverage ?? 0;\n const minRelevance = qualityThresholds.min_relevance ?? 0;\n const minSemanticDiversity = qualityThresholds.min_semantic_diversity ?? 0;\n\n if (minSemanticDiversity > 0 && !(clusterLabels && Object.keys(clusterLabels).length)) {\n log.warn(\n `[Compression] Semantic diversity threshold ${minSemanticDiversity.toFixed(2)} configured ` +\n \"but clustering unavailable (not enough embeddings or clustering failed). \" +\n \"Keeping candidate set (audit X1: the old 'revert' re-ran \" +\n \"_progressive_prune with identical arguments — a deterministic \" +\n \"function — so it returned the exact set that had just failed \" +\n \"validation while pretending to be a fallback).\",\n );\n return compressedChunks;\n }\n\n if (minCoverage > 0 && coverage < minCoverage) {\n log.warn(\n `[Compression] Lexical coverage ${coverage.toFixed(2)} below threshold ${minCoverage.toFixed(2)}, reverting to pruning`,\n );\n return compressedChunks;\n }\n if (minSemanticCoverage > 0 && semanticCoverage < minSemanticCoverage) {\n log.warn(\n `[Compression] Semantic coverage ${semanticCoverage.toFixed(2)} below threshold ${minSemanticCoverage.toFixed(2)}, reverting to pruning`,\n );\n return compressedChunks;\n }\n if (minRelevance > 0 && relevance < minRelevance) {\n log.warn(\n `[Compression] Relevance ${relevance.toFixed(2)} below threshold ${minRelevance.toFixed(2)}, reverting to pruning`,\n );\n return compressedChunks;\n }\n if (minSemanticDiversity > 0 && diversityScore < minSemanticDiversity) {\n log.warn(\n `[Compression] Semantic diversity ${diversityScore.toFixed(2)} below threshold ${minSemanticDiversity.toFixed(2)}, ` +\n `reverting to pruning (cluster_preservation=${clusterPreservation.toFixed(2)})`,\n );\n return compressedChunks;\n }\n return compressedChunks;\n }\n}\n","/**\n * Hybrid retrieval: run the legs, fuse, (rerank), hydrate, (compress).\n *\n * `ContextEngine.search()` is a thin shell over `runSearch()` here. One call\n * goes through these stages:\n *\n * embed query → run supported legs concurrently → RRF fuse →\n * hydrate candidates → redact BEFORE rerank → optional rerank →\n * cut to top_k → optional compression → usage event\n *\n * **ACL semantics — read before touching the scope.** `principals=null` means\n * an internal, fully-trusted caller and disables ACL filtering completely;\n * `principals=[]` means an anonymous caller and matches only chunks whose\n * `acl IS NULL`. Those are not interchangeable. The HTTP router ALWAYS\n * passes a list — never `null`, never a `null` that leaked out of an\n * absent auth header — so an unauthenticated request can never be mistaken\n * for a trusted one. `sourceIds=null` likewise means \"the whole corpus\".\n *\n * Failure policy: retrieval degrades rather than dies. A query that can't be\n * embedded (provider down) reports through `emitError` and continues with\n * the lexical legs; one leg raising reports and continues with the others; a\n * reranker or compression failure reports and falls back to the fused order.\n * Only a search where EVERY attempted leg failed raises — at that point there\n * is no result to degrade to, and returning an empty list would look like\n * \"nothing matched\".\n */\nimport type { Pool } from \"pg\";\nimport { ContextCompressionService } from \"./compression.js\";\nimport type { ContextEngineConfig } from \"./config.js\";\nimport { GraphLegUnavailable } from \"./errors.js\";\nimport { rrfFuse } from \"./fusion.js\";\nimport { emitError, emitUsage, type Hooks } from \"./hooks.js\";\nimport type { Embedder } from \"./providers/embeddings.js\";\nimport { rerank } from \"./providers/reranker.js\";\nimport { applyRedaction, type RedactionPolicy } from \"./redaction.js\";\nimport type { SearchScope, StorageBackend } from \"./storage.js\";\nimport type { UsageEvent } from \"./usage.js\";\n\nexport type Mode = \"hybrid\" | \"graph\";\n\n/** Per-leg candidate floor — fusion is only informative if each leg returns more than a couple of rows. */\nexport const MIN_LEG_CANDIDATES = 50;\n/** Per-leg candidate ceiling — a huge value drives the ANN + hydration work that pins CPU. */\nexport const MAX_LEG_CANDIDATES = 500;\n\n/** Units per source scope queried. 1 for hybrid retrieval. */\nexport const UNITS_PER_SCOPE_HYBRID = 1;\n/** Units per source scope when the graph leg actually contributed. */\nexport const UNITS_PER_SCOPE_GRAPH = 5;\n\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\n/**\n * One retrieved chunk, hydrated with its document's identity.\n *\n * **`score` is provenance, not the ranking key.** It is always the RRF\n * fusion score. When a reranker runs, the reranker decides the ORDER while\n * the score keeps its fusion value — `providers.reranker.rerank()` returns\n * positions only, never scores, so there is no reranker score to put here\n * and inventing one would misrepresent a number no provider gave us.\n * Consequence for consumers: **the list order is authoritative — re-sorting\n * hits by `score` silently discards the reranker's ordering.** Check\n * `SearchResult.usage.reranked` if you need to know which applies.\n */\nexport interface Hit {\n documentId: string;\n documentName: string | null;\n description: string | null;\n sourceId: string | null;\n chunkText: string;\n idx: number | null;\n lang: string | null;\n score: number;\n chunkId: string;\n meta: Record<string, unknown>;\n}\n\nexport interface SearchResult {\n hits: Hit[];\n usage: Record<string, unknown>;\n}\n\nexport interface RunSearchOpts {\n config: ContextEngineConfig;\n hooks: Hooks;\n backend: StorageBackend;\n embedder: Embedder;\n pool: Pool;\n sourceIds?: string[] | null;\n principals?: string[] | null;\n topK?: number;\n mode?: Mode;\n compressToTokens?: number | null;\n graphRanked?: string[] | null;\n redaction?: RedactionPolicy | null;\n}\n\nfunction legLimit(topK: number, config: ContextEngineConfig): number {\n let wanted = Math.max(MIN_LEG_CANDIDATES, topK * 10);\n if (config.reranker.enabled) wanted = Math.max(wanted, config.reranker.candidates);\n return Math.min(wanted, MAX_LEG_CANDIDATES);\n}\n\n/**\n * Run `applyRedaction` on one string, merging its note into the running\n * `fired`/`failed` unions (order preserved) and returning `[text, spans]`.\n */\nfunction redactValue(\n text: string,\n policy: RedactionPolicy,\n opts: {\n principals: string[] | null;\n secretKey: string | Buffer | null;\n hooks: Hooks;\n fired: string[];\n failed: string[];\n },\n): [string, number] {\n const [redacted, note] = applyRedaction(text, policy, {\n phase: \"output\",\n principals: opts.principals,\n secretKey: opts.secretKey,\n hooks: opts.hooks,\n });\n if (!note.rules_fired?.length && !note.rules_failed?.length) return [redacted, 0];\n for (const name of note.rules_fired ?? []) {\n if (!opts.fired.includes(name)) opts.fired.push(name);\n }\n for (const name of note.rules_failed ?? []) {\n if (!opts.failed.includes(name)) opts.failed.push(name);\n }\n return [redacted, note.spans ?? 0];\n}\n\n/**\n * Redact every hit's `chunkText`, and any string `meta` values, in\n * place-by-copy.\n *\n * `meta` is in scope for the same reason the ingest-side fix\n * (`redactChunkMeta`) exists: `Hit.meta` (`section_title`, `sheet_title`,\n * ...) is extracted verbatim from the same raw document text as\n * `chunkText` and is returned to the caller right alongside it. Ingest-time\n * redaction only masks `meta` for corpora ingested UNDER a policy with\n * ingest-phase rules; an output-phase policy is the ONLY protection for a\n * corpus ingested WITHOUT one — which is the main use case output rules\n * exist for. Skipping `meta` here would leave that corpus's PII reachable\n * through a field sitting right next to the text we just masked, repeating\n * the exact gap the ingest fix closed. `documentName`/`description` are\n * left untouched: they are uploader/admin-set Document columns, not text\n * the chunker derived from the document body, so they are out of scope for\n * a chunk-content redaction pass.\n *\n * Returns `[hits, note]`; `note` is `{}` when nothing fired. Aggregates\n * `rules_fired` (union, order preserved) and `spans` (sum) across hits and\n * across `chunkText` + `meta`.\n *\n * `runSearch` calls this BEFORE maybeRerank/maybeCompress by design (see the\n * call site), so when a policy is active the reranker scores MASKED text\n * and the compressor counts MASKED tokens, not the original — this can\n * shift relevance ordering and token-budget decisions versus the no-policy\n * case. That is the correct, intended trade-off (redaction is not optional\n * just because it might reorder results), but it is worth stating\n * explicitly: a later \"reranking got worse\" or \"compression drops the\n * wrong hit\" report on a redacted corpus may be this, not a\n * reranker/compressor regression.\n *\n * FLAT walk, deliberately — not the recursive walker\n * `governance.redactToolResult`/`actions.redactValueRecursive` use. Every\n * `chunk_metas` producer in `chunkers.ts` emits a flat\n * `{str: str | int | bool}` dict today (`section_title`, `sheet_title`,\n * `rows_range`, `total_rows`, ...), so a one-level walk covers every string\n * leaf that actually exists. Final review flagged this as a silent-bypass\n * risk if a FUTURE chunker ever nests `meta` — reviewed and accepted\n * rather than switched to a recursive walk, because threading\n * `fired`/`failed` aggregation through a shared recursive primitive across\n * three call sites with different existing note shapes was judged\n * higher-risk than the flat assumption it would replace.\n */\nexport function redactHits(\n hits: Hit[],\n policy: RedactionPolicy,\n opts: { principals: string[] | null; secretKey: string | Buffer | null; hooks?: Hooks | null },\n): [Hit[], Record<string, unknown>] {\n if (policy.isEmpty() || !hits.length) return [hits, {}];\n\n const fired: string[] = [];\n const failed: string[] = [];\n let totalSpans = 0;\n const out: Hit[] = [];\n const hooks = opts.hooks ?? {};\n\n for (const hit of hits) {\n const [text, spans] = redactValue(hit.chunkText, policy, {\n principals: opts.principals,\n secretKey: opts.secretKey,\n hooks,\n fired,\n failed,\n });\n totalSpans += spans;\n\n let meta = hit.meta;\n if (meta) {\n const newMeta: Record<string, unknown> = {};\n let changed = false;\n for (const [key, value] of Object.entries(meta)) {\n if (typeof value === \"string\") {\n const [newValue, metaSpans] = redactValue(value, policy, {\n principals: opts.principals,\n secretKey: opts.secretKey,\n hooks,\n fired,\n failed,\n });\n totalSpans += metaSpans;\n if (newValue !== value) changed = true;\n newMeta[key] = newValue;\n } else {\n newMeta[key] = value;\n }\n }\n if (changed) meta = newMeta;\n }\n\n out.push({ ...hit, chunkText: text, meta });\n }\n\n if (!fired.length && !failed.length) return [out, {}];\n const note: Record<string, unknown> = { rules_fired: fired, spans: totalSpans };\n if (failed.length) note.rules_failed = failed;\n return [out, note];\n}\n\n/** Embed the query for the ANN leg. Never raises — a dead embedding provider costs semantic recall, not the whole search. */\nasync function embedQuery(\n query: string,\n opts: { embedder: Embedder; hooks: Hooks },\n): Promise<[number[] | null, number]> {\n try {\n const [vectors, tokens] = await opts.embedder.embed([query], { kind: \"query\" });\n if (!vectors.length) return [null, 0];\n return [Array.from(vectors[0]!), Number(tokens || 0)];\n } catch (exc) {\n emitError(opts.hooks, exc, { stage: \"embed_query\", query_chars: query.length });\n return [null, 0];\n }\n}\n\n/**\n * Run every leg the backend declares, concurrently.\n *\n * Capability flags are checked BEFORE the call: a backend is never asked\n * for a leg it doesn't declare (a vector-only adapter contributes just\n * `ann` and fusion works on that alone).\n */\nasync function runLegs(\n query: string,\n opts: { vector: number[] | null; backend: StorageBackend; scope: SearchScope; hooks: Hooks },\n): Promise<Record<string, string[]>> {\n const planned: Array<[string, Promise<string[]>]> = [];\n if (opts.backend.supportsFts) planned.push([\"fts\", opts.backend.ftsSearch(query, opts.scope)]);\n if (opts.backend.supportsTrgm) planned.push([\"trgm\", opts.backend.trgmSearch(query, opts.scope)]);\n if (opts.vector != null && opts.backend.supportsAnn) {\n planned.push([\"ann\", opts.backend.annSearch(opts.vector, opts.scope)]);\n }\n if (!planned.length) return {};\n\n const outcomes = await Promise.allSettled(planned.map(([, p]) => p));\n const ranked: Record<string, string[]> = {};\n const failures: unknown[] = [];\n outcomes.forEach((outcome, i) => {\n const leg = planned[i]![0];\n if (outcome.status === \"fulfilled\") {\n ranked[leg] = outcome.value;\n } else {\n emitError(opts.hooks, outcome.reason, { stage: \"search_leg\", leg });\n failures.push(outcome.reason);\n }\n });\n if (failures.length && !Object.keys(ranked).length) {\n // Nothing to degrade to — an empty result here would be indistinguishable\n // from \"the corpus has no match\", which is a very different answer.\n throw failures[0];\n }\n return ranked;\n}\n\n/** Load chunk + document columns for `chunkIds` in ONE query. */\nasync function hydrate(pool: Pool, chunkIds: string[]): Promise<Map<string, Record<string, unknown>>> {\n const parsed = chunkIds.filter((id) => UUID_RE.test(id));\n if (parsed.length !== chunkIds.length) {\n for (const cid of chunkIds) {\n if (!UUID_RE.test(cid)) {\n console.warn(\"search: skipping unhydratable chunk id %s\", cid);\n }\n }\n }\n const map = new Map<string, Record<string, unknown>>();\n if (!parsed.length) return map;\n const { rows } = await pool.query(\n `SELECT c.id::text AS chunk_id, c.document_id::text, c.idx, c.text, c.lang, c.source_id,\n c.meta_data, d.name, d.description\n FROM context_engine_chunks c\n JOIN context_engine_documents d ON d.id = c.document_id\n WHERE c.id = ANY($1::uuid[])`,\n [parsed],\n );\n for (const r of rows) map.set(String(r.chunk_id), r as Record<string, unknown>);\n return map;\n}\n\n/**\n * Reorder `hits` with the configured reranker. Falls back to fused order.\n *\n * Reranked hits keep their FUSION score while taking the reranker's ORDER —\n * see `Hit.score` for what that means for consumers.\n */\nasync function maybeRerank(\n query: string,\n hits: Hit[],\n opts: { config: ContextEngineConfig; hooks: Hooks },\n): Promise<[Hit[], boolean]> {\n if (!opts.config.reranker.enabled || !hits.length) return [hits, false];\n\n const candidates = hits.slice(0, Math.max(1, opts.config.reranker.candidates));\n const tail = hits.slice(candidates.length);\n try {\n const order = await rerank(\n opts.config.reranker,\n query,\n candidates.map((h) => h.chunkText),\n );\n // Never trust provider indices blindly: drop out-of-range/duplicate ones\n // and append anything the reranker forgot, so reranking can only reorder\n // the candidate set, never silently shrink it.\n const seen = new Set<number>();\n const reordered: Hit[] = [];\n for (const i of order) {\n if (Number.isInteger(i) && i >= 0 && i < candidates.length && !seen.has(i)) {\n seen.add(i);\n reordered.push(candidates[i]!);\n }\n }\n for (let i = 0; i < candidates.length; i++) {\n if (!seen.has(i)) reordered.push(candidates[i]!);\n }\n return [reordered.concat(tail), true];\n } catch (exc) {\n emitError(opts.hooks, exc, { stage: \"rerank\", candidates: candidates.length });\n return [hits, false];\n }\n}\n\n/**\n * Drop hits until they fit `targetTokens`, preserving order.\n *\n * Compression may reorder internally; the caller's ranking (fused, then\n * reranked) is authoritative, so only membership is taken from `kept`.\n */\nasync function maybeCompress(\n query: string,\n hits: Hit[],\n opts: { targetTokens: number; queryVector: number[] | null; hooks: Hooks },\n): Promise<[Hit[], boolean]> {\n if (!hits.length) return [hits, false];\n\n const payload = hits.map((h) => ({\n id: h.chunkId || `${h.documentId}:${h.idx}`,\n text: h.chunkText,\n score: h.score,\n source_key: h.documentId,\n }));\n try {\n const kept = await ContextCompressionService.compressIfNeeded(\n payload,\n opts.targetTokens,\n null,\n query,\n false,\n opts.queryVector,\n );\n const keptIds = new Set(kept.map((c) => c.id));\n const compressed = payload\n .map((c, i) => (keptIds.has(c.id) ? hits[i]! : null))\n .filter((h): h is Hit => h != null);\n return [compressed, compressed.length !== hits.length];\n } catch (exc) {\n emitError(opts.hooks, exc, { stage: \"compress\", target_tokens: opts.targetTokens });\n return [hits, false];\n }\n}\n\nfunction hitFromRow(cid: string, score: number, row: Record<string, unknown>): Hit {\n const meta = row.meta_data;\n return {\n documentId: String(row.document_id),\n documentName: (row.name as string | null) ?? null,\n description: (row.description as string | null) ?? null,\n sourceId: (row.source_id as string | null) ?? null,\n chunkText: String(row.text ?? \"\"),\n idx: (row.idx as number | null) ?? null,\n lang: (row.lang as string | null) ?? null,\n score,\n chunkId: cid,\n meta: meta && typeof meta === \"object\" && !Array.isArray(meta) ? (meta as Record<string, unknown>) : {},\n };\n}\n\n/**\n * Hybrid retrieval over one Context Engine database.\n *\n * `graphRanked` is the Task 14 seam: when the graph stage exists it\n * passes its own ranked chunk-id list here and fusion picks it up as a\n * fourth leg (weight `fusion.weights.graph`), which is also what flips\n * the billing to `UNITS_PER_SCOPE_GRAPH`. Those ids are re-filtered through\n * `backend.filterIds` first — they come from Neo4j, not from a leg's WHERE\n * clause, so they carry no ACL or source guarantee of their own.\n *\n * `mode=\"graph\"` therefore runs the hybrid legs and reports\n * `usage.graphLeg = false` with `usage.degraded = \"graph_leg_unavailable\"`\n * (plus one `emitError`), rather than letting `mode` alone imply a leg\n * that never ran. `graphLeg` is the truth of whether the graph leg\n * CONTRIBUTED, not merely whether it was attempted — `filterIds` may have\n * emptied the list (every id ACL/source-filtered out).\n */\nexport async function runSearch(query: string, opts: RunSearchOpts): Promise<SearchResult> {\n if (!query?.trim()) throw new Error(\"query must not be empty\");\n const mode: Mode = opts.mode ?? \"hybrid\";\n if (mode !== \"hybrid\" && mode !== \"graph\") {\n throw new Error(`unknown search mode: ${JSON.stringify(mode)} (expected 'hybrid' or 'graph')`);\n }\n if (mode === \"graph\" && !opts.config.graph.enabled) {\n throw new Error(\n \"graph not enabled: search(mode='graph') requires GraphConfig.enabled=True \" +\n \"(with neo4j_uri, neo4j_password and extraction_llm configured)\",\n );\n }\n const topK = Math.max(1, Math.trunc(opts.topK ?? 10));\n\n const scope: SearchScope = {\n sourceIds: opts.sourceIds != null ? [...opts.sourceIds] : null,\n principals: opts.principals != null ? [...opts.principals] : null,\n limit: legLimit(topK, opts.config),\n };\n\n const [vector, embeddingTokens] = await embedQuery(query, {\n embedder: opts.embedder,\n hooks: opts.hooks,\n });\n const ranked = await runLegs(query, {\n vector,\n backend: opts.backend,\n scope,\n hooks: opts.hooks,\n });\n\n if (opts.graphRanked?.length) {\n // The graph leg resolves chunks through Neo4j, so its ids never went\n // through a leg's WHERE clause and carry NO scope or ACL guarantee.\n // `runSearch` is exported, so this must be enforced HERE rather than\n // trusted to the caller: one careless call would otherwise fuse and\n // hydrate restricted chunks straight into the response.\n ranked.graph = await opts.backend.filterIds([...opts.graphRanked], scope);\n }\n\n const graphLeg = Boolean(ranked.graph?.length);\n let degraded: string | null = null;\n if (mode === \"graph\" && !graphLeg) {\n degraded = \"graph_leg_unavailable\";\n emitError(\n opts.hooks,\n new GraphLegUnavailable(\n \"search(mode='graph') ran the hybrid legs only: no graph ranked list was \" +\n \"supplied (the graph retrieval leg is not implemented yet). Results are \" +\n \"hybrid and billed as hybrid.\",\n ),\n { stage: \"graph_leg\", mode, degraded },\n );\n }\n\n const fused = rrfFuse(ranked, { k: opts.config.fusion.k, weights: opts.config.fusion.weights });\n\n // Hydrate the reranker's whole candidate window (it needs the texts), or\n // just what we're returning when there's no reranker.\n const window = opts.config.reranker.enabled ? Math.max(topK, opts.config.reranker.candidates) : topK;\n const shortlist = fused.slice(0, window);\n const hydrated = await hydrate(\n opts.pool,\n shortlist.map(([cid]) => cid),\n );\n\n let hits: Hit[] = [];\n for (const [cid, score] of shortlist) {\n const row = hydrated.get(cid);\n if (!row) continue;\n hits.push(hitFromRow(cid, score, row));\n }\n\n // Redact BEFORE rerank/compress. maybeRerank → providers.reranker.rerank()\n // is the genuine external-provider leak path: it POSTs hit text to\n // Cohere/Voyage/Jina over HTTP, so redacting after it would ship raw PII\n // off-box. maybeCompress → ContextCompressionService makes no network\n // call at all, so placing redaction before it is defense-in-depth rather\n // than a second external leak path.\n const policy = opts.redaction ?? opts.config.redaction;\n const [redacted, redactionNote] = redactHits(hits, policy, {\n principals: opts.principals ?? null,\n secretKey: opts.config.secretKey,\n hooks: opts.hooks,\n });\n hits = redacted;\n\n const [rerankedHits, reranked] = await maybeRerank(query, hits, {\n config: opts.config,\n hooks: opts.hooks,\n });\n hits = rerankedHits.slice(0, topK);\n\n let compressed = false;\n if (opts.compressToTokens != null) {\n [hits, compressed] = await maybeCompress(query, hits, {\n targetTokens: opts.compressToTokens,\n queryVector: vector,\n hooks: opts.hooks,\n });\n }\n\n // Unit math: one charge per SCOPE queried (`sourceIds=null` = the whole\n // corpus = one scope), 5 instead of 1 when the graph leg actually contributed.\n const scopes = scope.sourceIds?.length ? scope.sourceIds.length : 1;\n const units = scopes * (graphLeg ? UNITS_PER_SCOPE_GRAPH : UNITS_PER_SCOPE_HYBRID);\n\n const legs = Object.keys(ranked).sort();\n const legHits = Object.fromEntries(legs.map((leg) => [leg, ranked[leg]!.length]));\n const usage: Record<string, unknown> = {\n kind: \"search\",\n units,\n mode,\n graphLeg,\n degraded,\n scopes,\n legs,\n legHits,\n candidates: fused.length,\n returned: hits.length,\n reranked,\n compressed,\n providerTokens: { embedding_tokens: embeddingTokens },\n };\n if (Object.keys(redactionNote).length) usage.redaction = redactionNote;\n\n const detail: Record<string, unknown> = {\n mode,\n graphLeg,\n degraded,\n scopes,\n legs,\n legHits,\n candidates: fused.length,\n returned: hits.length,\n };\n if (Object.keys(redactionNote).length) detail.redaction = redactionNote;\n\n emitUsage(opts.hooks, {\n kind: \"search\",\n units,\n detail,\n providerTokens: { embedding_tokens: embeddingTokens },\n } satisfies UsageEvent);\n\n return { hits, usage };\n}\n","export const DEFAULT_LEG_WEIGHT = 1.0;\n\n/**\n * Reciprocal Rank Fusion. score(id) = Σ weight/(k+rank) with 1-based rank.\n * Missing weight → 1.0; explicit 0.0 skips the leg; first occurrence wins;\n * ties broken by chunk id ascending.\n */\nexport function rrfFuse(\n rankedLists: Record<string, string[]>,\n opts: { k: number; weights: Record<string, number> },\n): Array<[string, number]> {\n const scores = new Map<string, number>();\n for (const [leg, ids] of Object.entries(rankedLists)) {\n const weight = opts.weights[leg] ?? DEFAULT_LEG_WEIGHT;\n if (!weight) continue;\n const seen = new Set<string>();\n let rank = 0;\n for (const chunkId of ids) {\n if (seen.has(chunkId)) continue;\n seen.add(chunkId);\n rank += 1;\n scores.set(chunkId, (scores.get(chunkId) ?? 0) + weight / (opts.k + rank));\n }\n }\n return [...scores.entries()].sort((a, b) => b[1] - a[1] || (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0));\n}\n","/**\n * Pluggable reranker provider.\n *\n * Returns indices into `docs`, sorted most-relevant-first (re-sorted by score\n * descending rather than trusting API order). 30s timeout, no retries.\n * Injectable `fetch` for tests.\n *\n * custom POSTs `{ query, texts }` to `{baseUrl}/rerank`.\n */\n\nimport type { RerankerConfig } from \"../config.js\";\nimport type { FetchImpl } from \"./embeddings.js\";\n\nexport const TIMEOUT_MS = 30_000;\n\nasync function postJson(\n fetchImpl: FetchImpl,\n url: string,\n body: unknown,\n headers: Record<string, string> = {},\n): Promise<any> {\n const resp = await fetchImpl(url, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", ...headers },\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(TIMEOUT_MS),\n });\n if (!resp.ok) {\n const text = await resp.text().catch(() => \"\");\n throw new Error(`HTTP ${resp.status} ${resp.statusText}${text ? `: ${text}` : \"\"}`);\n }\n return resp.json();\n}\n\nfunction sortedIndices(scored: Array<[number, number]>): number[] {\n return scored\n .slice()\n .sort((a, b) => b[1]! - a[1]!)\n .map(([idx]) => idx);\n}\n\nasync function rerankCohere(\n cfg: RerankerConfig,\n query: string,\n docs: string[],\n fetchImpl: FetchImpl,\n): Promise<number[]> {\n const data = await postJson(\n fetchImpl,\n \"https://api.cohere.com/v2/rerank\",\n { model: cfg.model, query, documents: docs },\n { Authorization: `Bearer ${cfg.apiKey ?? \"\"}` },\n );\n const scored: Array<[number, number]> = (\n data.results as Array<{ index: number; relevance_score: number }>\n ).map((r) => [r.index, r.relevance_score]);\n return sortedIndices(scored);\n}\n\nasync function rerankVoyage(\n cfg: RerankerConfig,\n query: string,\n docs: string[],\n fetchImpl: FetchImpl,\n): Promise<number[]> {\n const data = await postJson(\n fetchImpl,\n \"https://api.voyageai.com/v1/rerank\",\n { model: cfg.model, query, documents: docs },\n { Authorization: `Bearer ${cfg.apiKey ?? \"\"}` },\n );\n const scored: Array<[number, number]> = (\n data.data as Array<{ index: number; relevance_score: number }>\n ).map((r) => [r.index, r.relevance_score]);\n return sortedIndices(scored);\n}\n\nasync function rerankJina(\n cfg: RerankerConfig,\n query: string,\n docs: string[],\n fetchImpl: FetchImpl,\n): Promise<number[]> {\n const data = await postJson(\n fetchImpl,\n \"https://api.jina.ai/v1/rerank\",\n { model: cfg.model, query, documents: docs },\n { Authorization: `Bearer ${cfg.apiKey ?? \"\"}` },\n );\n const scored: Array<[number, number]> = (\n data.results as Array<{ index: number; relevance_score: number }>\n ).map((r) => [r.index, r.relevance_score]);\n return sortedIndices(scored);\n}\n\nasync function rerankCustom(\n cfg: RerankerConfig,\n query: string,\n docs: string[],\n fetchImpl: FetchImpl,\n): Promise<number[]> {\n const baseUrl = (cfg.baseUrl ?? \"\").replace(/\\/+$/, \"\");\n const data = await postJson(fetchImpl, `${baseUrl}/rerank`, { query, texts: docs });\n const scored: Array<[number, number]> = (data as Array<{ index: number; score: number }>).map((r) => [\n r.index,\n r.score,\n ]);\n return sortedIndices(scored);\n}\n\n/**\n * Rerank `docs` against `query`. Returns indices into `docs`, most-relevant-first.\n * Raises if `cfg.enabled` is false.\n */\nexport async function rerank(\n cfg: RerankerConfig,\n query: string,\n docs: string[],\n opts: { fetch?: FetchImpl | null; fetchImpl?: FetchImpl | null } = {},\n): Promise<number[]> {\n if (!cfg.enabled) {\n throw new Error(\"reranker not enabled\");\n }\n const fetchImpl = opts.fetch ?? opts.fetchImpl ?? globalThis.fetch;\n if (cfg.provider === \"cohere\") return rerankCohere(cfg, query, docs, fetchImpl);\n if (cfg.provider === \"voyage\") return rerankVoyage(cfg, query, docs, fetchImpl);\n if (cfg.provider === \"jina\") return rerankJina(cfg, query, docs, fetchImpl);\n if (cfg.provider === \"custom\") return rerankCustom(cfg, query, docs, fetchImpl);\n throw new Error(`unknown reranker provider: ${JSON.stringify(cfg.provider)}`);\n}\n","/**\n * Sentinels distinguishing omitted arguments from real values, including null.\n *\n * UNSET: \"argument omitted\" vs null (e.g. updateDocument acl=null means unrestricted).\n * TRUSTED: trusted caller, ACL filtering disabled. Truthy on purpose so\n * `if (principals)` does not treat a trusted caller as anonymous.\n */\n\nexport const UNSET: unique symbol = Symbol.for(\"context_engine.UNSET\");\nexport type Unset = typeof UNSET;\n\nclass TrustedSentinel {\n readonly [Symbol.toStringTag] = \"TRUSTED\";\n toString(): string {\n return \"TRUSTED\";\n }\n valueOf(): boolean {\n return true;\n }\n}\n\nexport const TRUSTED: TrustedSentinel = Object.freeze(new TrustedSentinel());\nexport type Trusted = typeof TRUSTED;\n\nexport type Principals = string[] | null | typeof TRUSTED | undefined;\n\nexport function resolvePrincipals(value: Principals, method: string): string[] | null {\n if (value === TRUSTED) return null;\n if (value === undefined) return null;\n if (value === null) {\n process.emitWarning(\n `${method}(principals=null) means TRUSTED CALLER — access control is ` +\n `disabled and every document is returned. If that is what you want, ` +\n `pass principals=TRUSTED (from @promptev/context-engine) to say so explicitly. ` +\n `If you meant 'no authenticated user', pass principals=[] instead; ` +\n `null returns the entire corpus. Passing null will raise in 1.0.`,\n \"DeprecationWarning\",\n );\n return null;\n }\n return Array.isArray(value) ? value : null;\n}\n\nexport function isTrusted(principals: string[] | null | undefined): boolean {\n return principals === null || principals === undefined;\n}\n","/**\n * Storage seam — every chunk read and write goes through a `StorageBackend`.\n *\n * v0.1 ships `PostgresBackend`. Ingestion and search never touch chunk SQL\n * directly: they call the protocol. A future vector-store adapter would declare\n * `supportsFts = false`, `supportsTrgm = false`, `supportsAnn = true`, and\n * fusion fuses whichever legs the backend declares.\n *\n * Each leg returns ONLY ranked chunk ids. Documents stay Postgres-owned;\n * only the CHUNK plane is pluggable.\n */\nimport { randomUUID } from \"node:crypto\";\nimport type { Pool, PoolClient } from \"pg\";\nimport { isSpacelessChar, tokenCount } from \"./text.js\";\n\n/** pgvector release that introduced `hnsw.iterative_scan`. */\nconst MIN_ITERATIVE_SCAN_VERSION = [0, 8] as const;\n\nconst ANN_MIN_EF_SEARCH = 40;\nconst ANN_MAX_EF_SEARCH = 1000;\nconst ANN_SCAN_FRACTION = 0.1;\nconst ANN_SCAN_PER_ROW = 200;\nconst ANN_MIN_SCAN_TUPLES = 20_000;\nconst ANN_MAX_SCAN_TUPLES = 2_000_000;\nconst ANN_SCAN_MEM_MULTIPLIER = 2;\nconst ANN_EXACT_THRESHOLD = 50_000;\n\nexport interface ChunkRow {\n idx: number;\n text: string;\n lang?: string | null;\n embedding?: number[] | null;\n meta?: Record<string, unknown>;\n}\n\nexport interface SearchScope {\n sourceIds?: string[] | null;\n principals?: string[] | null;\n limit?: number;\n}\n\nexport interface StorageBackend {\n supportsFts: boolean;\n supportsTrgm: boolean;\n supportsAnn: boolean;\n upsertChunks(\n documentId: string,\n sourceId: string | null,\n acl: string[] | null,\n chunks: readonly ChunkRow[],\n ): Promise<number>;\n deleteChunks(documentId: string): Promise<void>;\n updateChunkEmbeddings(documentId: string, vectors: readonly number[][]): Promise<number>;\n updateChunkAcl(documentId: string, acl: string[] | null): Promise<number>;\n filterIds(chunkIds: readonly string[], scope: SearchScope): Promise<string[]>;\n ftsSearch(query: string, scope: SearchScope): Promise<string[]>;\n trgmSearch(query: string, scope: SearchScope): Promise<string[]>;\n annSearch(vector: readonly number[], scope: SearchScope): Promise<string[]>;\n}\n\nfunction isSpacelessQuery(query: string): boolean {\n let spaceless = 0;\n let total = 0;\n for (const ch of query) {\n if (/\\s/u.test(ch)) continue;\n total += 1;\n if (isSpacelessChar(ch)) spaceless += 1;\n }\n return total > 0 && spaceless / total > 0.5;\n}\n\n/** Adaptive `pg_trgm` similarity threshold for `query`. */\nexport function trigramThreshold(query: string): number {\n if (isSpacelessQuery(query)) {\n let charCount = 0;\n for (const ch of query) {\n if (!/\\s/u.test(ch)) charCount += 1;\n }\n if (charCount <= 3) return 0.45;\n if (charCount <= 10) return 0.3;\n return 0.2;\n }\n const tokens = tokenCount(query);\n if (tokens <= 1) return 0.4;\n if (tokens <= 3) return 0.25;\n return 0.15;\n}\n\nconst SCOPE = `\n AND ($1::text[] IS NULL OR c.source_id = ANY($1))\n AND ($2::text[] IS NULL OR c.acl IS NULL OR c.acl && $2)\n`;\n\nconst SQL_FTS = `\nSELECT c.id::text\nFROM context_engine_chunks c\nWHERE c.text IS NOT NULL\n AND c.text_search @@ websearch_to_tsquery('simple'::regconfig, $3)\n ${SCOPE}\nORDER BY ts_rank_cd(c.text_search, websearch_to_tsquery('simple'::regconfig, $3)) DESC, c.id\nLIMIT $4\n`;\n\nconst SQL_TRGM = `\nSELECT c.id::text\nFROM context_engine_chunks c\nWHERE c.text IS NOT NULL\n AND c.text_trgm_norm % $3\n ${SCOPE}\nORDER BY similarity(c.text_trgm_norm, $3) DESC, c.id\nLIMIT $4\n`;\n\nconst SQL_COUNT_ELIGIBLE = `\nSELECT count(*)::int AS count FROM (\n SELECT 1\n FROM context_engine_chunks c\n WHERE c.embedding IS NOT NULL\n ${SCOPE}\n LIMIT $3\n) probe\n`;\n\nconst SQL_FILTER_IDS = `\nSELECT c.id::text\nFROM context_engine_chunks c\nWHERE c.id = ANY($3::uuid[])\n ${SCOPE}\n`;\n\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\n/** `'[1,2,3]'::vector` — floats only, safe to interpolate. */\nexport function vectorLiteral(vector: readonly number[]): string {\n const inner = vector\n .map((x) => {\n const n = Number(x);\n if (!Number.isFinite(n)) throw new TypeError(\"non-finite vector component\");\n return String(n);\n })\n .join(\",\");\n return `'[${inner}]'::vector`;\n}\n\nfunction sqlAnn(vec: string): string {\n return `\nSELECT c.id::text\nFROM context_engine_chunks c\nWHERE c.embedding IS NOT NULL\n ${SCOPE}\nORDER BY c.embedding <=> ${vec}\nLIMIT $3\n`;\n}\n\nfunction sqlAnnExact(vec: string): string {\n return `\nWITH eligible AS MATERIALIZED (\n SELECT c.id, c.embedding\n FROM context_engine_chunks c\n WHERE c.embedding IS NOT NULL\n ${SCOPE}\n)\nSELECT id::text FROM eligible\nORDER BY embedding <=> ${vec}\nLIMIT $3\n`;\n}\n\nfunction idsOf(rows: Array<{ id: unknown }>): string[] {\n return rows.map((r) => String(r.id));\n}\n\nexport class PostgresBackend implements StorageBackend {\n supportsFts = true;\n supportsTrgm = true;\n supportsAnn = true;\n\n private readonly pool: Pool;\n private readonly exactThresholdOverride: number | null;\n /** Tri-state: null = not yet checked. */\n private iterativeScan: boolean | null = null;\n\n constructor(pool: Pool, exactThreshold?: number | null) {\n this.pool = pool;\n this.exactThresholdOverride = exactThreshold ?? null;\n }\n\n private get exactThreshold(): number {\n return this.exactThresholdOverride ?? ANN_EXACT_THRESHOLD;\n }\n\n /**\n * Bind values for SCOPE + the row limit.\n * `principals` is passed through UNCHANGED: null (trusted) and [] (anonymous)\n * mean different things.\n */\n private scopeParams(scope: SearchScope): [string[] | null, string[] | null, number] {\n return [\n scope.sourceIds != null ? [...scope.sourceIds] : null,\n scope.principals != null ? [...scope.principals] : null,\n Math.max(1, Math.trunc(scope.limit ?? 50)),\n ];\n }\n\n async upsertChunks(\n documentId: string,\n sourceId: string | null,\n acl: string[] | null,\n chunks: readonly ChunkRow[],\n ): Promise<number> {\n const client = await this.pool.connect();\n try {\n await client.query(\"BEGIN\");\n await client.query(\"DELETE FROM context_engine_chunks WHERE document_id = $1\", [documentId]);\n for (const c of chunks) {\n const emb = c.embedding != null ? vectorLiteral(c.embedding) : \"NULL\";\n await client.query(\n `INSERT INTO context_engine_chunks\n (id, document_id, source_id, acl, idx, text, lang, embedding, meta_data)\n VALUES ($1, $2, $3, $4, $5, $6, $7, ${emb}, $8::jsonb)`,\n [\n randomUUID(),\n documentId,\n sourceId,\n acl,\n c.idx,\n c.text,\n c.lang ?? null,\n JSON.stringify(c.meta ?? {}),\n ],\n );\n }\n await client.query(\"COMMIT\");\n } catch (err) {\n try {\n await client.query(\"ROLLBACK\");\n } catch {\n /* keep original */\n }\n throw err;\n } finally {\n client.release();\n }\n return chunks.length;\n }\n\n async deleteChunks(documentId: string): Promise<void> {\n await this.pool.query(\"DELETE FROM context_engine_chunks WHERE document_id = $1\", [documentId]);\n }\n\n async updateChunkEmbeddings(documentId: string, vectors: readonly number[][]): Promise<number> {\n const client = await this.pool.connect();\n try {\n await client.query(\"BEGIN\");\n const { rows } = await client.query<{ id: string }>(\n `SELECT id FROM context_engine_chunks WHERE document_id = $1 ORDER BY idx`,\n [documentId],\n );\n if (rows.length !== vectors.length) {\n throw new Error(\n `batch embedding count mismatch for document ${documentId}: ${rows.length} stored chunks, ${vectors.length} returned vectors`,\n );\n }\n for (let i = 0; i < rows.length; i++) {\n await client.query(\n `UPDATE context_engine_chunks SET embedding = ${vectorLiteral(vectors[i]!)} WHERE id = $1`,\n [rows[i]!.id],\n );\n }\n await client.query(\"COMMIT\");\n return rows.length;\n } catch (err) {\n try {\n await client.query(\"ROLLBACK\");\n } catch {\n /* keep original */\n }\n throw err;\n } finally {\n client.release();\n }\n }\n\n async updateChunkAcl(documentId: string, acl: string[] | null): Promise<number> {\n const res = await this.pool.query(`UPDATE context_engine_chunks SET acl = $1 WHERE document_id = $2`, [\n acl,\n documentId,\n ]);\n return res.rowCount ?? 0;\n }\n\n async filterIds(chunkIds: readonly string[], scope: SearchScope): Promise<string[]> {\n const parsed: string[] = [];\n for (const cid of chunkIds) {\n try {\n if (UUID_RE.test(String(cid))) parsed.push(String(cid));\n } catch {\n /* unparseable ids are dropped — fail closed */\n }\n }\n if (!parsed.length) return [];\n const [src, principals] = this.scopeParams(scope);\n const { rows } = await this.pool.query(SQL_FILTER_IDS, [src, principals, parsed]);\n const visible = new Set(idsOf(rows));\n return chunkIds.filter((cid) => visible.has(String(cid))).map(String);\n }\n\n async ftsSearch(query: string, scope: SearchScope): Promise<string[]> {\n const [src, principals, lim] = this.scopeParams(scope);\n const { rows } = await this.pool.query(SQL_FTS, [src, principals, query, lim]);\n return idsOf(rows);\n }\n\n async trgmSearch(query: string, scope: SearchScope): Promise<string[]> {\n const threshold = trigramThreshold(query);\n const [src, principals, lim] = this.scopeParams(scope);\n const client = await this.pool.connect();\n let previous: number | null = null;\n let usedSetLimit = false;\n try {\n await client.query(\"BEGIN\");\n const applied = await this.applyTrgmThreshold(client, threshold);\n previous = applied.previous;\n usedSetLimit = applied.usedSetLimit;\n const { rows } = await client.query(SQL_TRGM, [src, principals, query, lim]);\n if (usedSetLimit) await this.restoreTrgmLimit(client, previous);\n await client.query(\"COMMIT\");\n return idsOf(rows);\n } catch (err) {\n try {\n await client.query(\"ROLLBACK\");\n if (usedSetLimit) await this.restoreTrgmLimit(client, previous);\n } catch {\n console.warn(\"trgm leg: could not restore trigram limit\");\n }\n throw err;\n } finally {\n client.release();\n }\n }\n\n /**\n * Set pg_trgm's similarity threshold for this query via the `set_limit()` /\n * `show_limit()` FUNCTIONS — never the GUC `pg_trgm.similarity_threshold`.\n *\n * The GUC is registered lazily, only once pg_trgm's shared library is loaded\n * into the backend process. On a fresh pooled connection that has not yet\n * run any pg_trgm operation, `SHOW pg_trgm.similarity_threshold` raises\n * \"unrecognized configuration parameter\" — and because that error aborts the\n * surrounding transaction, a fallback issued on the same connection then\n * fails with \"current transaction is aborted\". Every connection a pool hands\n * out is fresh, so this is the common case, not an edge case. Calling\n * `set_limit()` loads the library and does not depend on the GUC. This\n * mirrors the Python backend, which was hardened against exactly this.\n *\n * `set_limit()` is connection-scoped and survives COMMIT and the return to\n * the pool, so the previous value is captured here and restored by the\n * caller.\n */\n private async applyTrgmThreshold(\n client: PoolClient,\n threshold: number,\n ): Promise<{ previous: number | null; usedSetLimit: boolean }> {\n const shown = await client.query(\"SELECT show_limit() AS lim\");\n const previous = shown.rows[0]?.lim != null ? Number(shown.rows[0].lim) : null;\n await client.query(\"SELECT set_limit($1)\", [threshold]);\n return { previous, usedSetLimit: true };\n }\n\n private async restoreTrgmLimit(client: PoolClient, previous: number | null): Promise<void> {\n if (previous == null) return;\n await client.query(\"SELECT set_limit($1)\", [previous]);\n }\n\n async annSearch(vector: readonly number[], scope: SearchScope): Promise<string[]> {\n const literal = vectorLiteral(vector);\n const [src, principals, lim] = this.scopeParams(scope);\n const scoped = src !== null || principals !== null;\n const client = await this.pool.connect();\n try {\n await client.query(\"BEGIN\");\n if (scoped && (await this.eligibleIsSmall(client, src, principals))) {\n const { rows } = await client.query(sqlAnnExact(literal), [src, principals, lim]);\n await client.query(\"COMMIT\");\n return idsOf(rows);\n }\n await this.tuneAnnScan(client, lim, scoped);\n const { rows } = await client.query(sqlAnn(literal), [src, principals, lim]);\n await client.query(\"COMMIT\");\n return idsOf(rows);\n } catch (err) {\n try {\n await client.query(\"ROLLBACK\");\n } catch {\n /* ignore */\n }\n throw err;\n } finally {\n client.release();\n }\n }\n\n private async eligibleIsSmall(\n client: PoolClient,\n src: string[] | null,\n principals: string[] | null,\n ): Promise<boolean> {\n const cap = this.exactThreshold + 1;\n const { rows } = await client.query(SQL_COUNT_ELIGIBLE, [src, principals, cap]);\n return Number(rows[0]?.count ?? 0) <= this.exactThreshold;\n }\n\n private async tuneAnnScan(client: PoolClient, limit: number, scoped: boolean): Promise<void> {\n const efSearch = Math.min(Math.max(Math.trunc(limit) * 4, ANN_MIN_EF_SEARCH), ANN_MAX_EF_SEARCH);\n await client.query(`SET LOCAL hnsw.ef_search = ${efSearch}`);\n if (!scoped) return;\n if (!(await this.enableIterativeScan(client))) return;\n const budget = await this.scanBudget(client, limit);\n await client.query(`SET LOCAL hnsw.max_scan_tuples = ${budget}`);\n await client.query(`SET LOCAL hnsw.scan_mem_multiplier = ${ANN_SCAN_MEM_MULTIPLIER}`);\n }\n\n private async scanBudget(client: PoolClient, limit: number): Promise<number> {\n const { rows } = await client.query(\n `SELECT reltuples::bigint AS n FROM pg_class WHERE oid = 'context_engine_chunks'::regclass`,\n );\n let n = Number(rows[0]?.n ?? 0);\n if (n <= 0) n = ANN_MIN_SCAN_TUPLES;\n const budget = Math.max(Math.trunc(n * ANN_SCAN_FRACTION), Math.trunc(limit) * ANN_SCAN_PER_ROW);\n return Math.min(Math.max(budget, ANN_MIN_SCAN_TUPLES + 1), ANN_MAX_SCAN_TUPLES);\n }\n\n private async enableIterativeScan(client: PoolClient): Promise<boolean> {\n if (this.iterativeScan === null) {\n this.iterativeScan = await this.supportsIterativeScan(client);\n if (!this.iterativeScan) {\n console.warn(\n `ann leg: pgvector < ${MIN_ITERATIVE_SCAN_VERSION.join(\".\")} has no iterative index scan; ` +\n \"ACL/source-filtered vector search may under-return on a large corpus\",\n );\n }\n }\n if (this.iterativeScan) {\n await client.query(\"SET LOCAL hnsw.iterative_scan = relaxed_order\");\n }\n return Boolean(this.iterativeScan);\n }\n\n private async supportsIterativeScan(client: PoolClient): Promise<boolean> {\n const { rows } = await client.query(`SELECT extversion FROM pg_extension WHERE extname = 'vector'`);\n const raw = rows[0]?.extversion;\n if (!raw) return false;\n const parts: number[] = [];\n for (const piece of String(raw).split(\".\").slice(0, 3)) {\n const digits = piece.replace(/\\D/g, \"\");\n if (!digits) break;\n parts.push(Number(digits));\n }\n for (let i = 0; i < MIN_ITERATIVE_SCAN_VERSION.length; i++) {\n const a = parts[i] ?? 0;\n const b = MIN_ITERATIVE_SCAN_VERSION[i]!;\n if (a > b) return true;\n if (a < b) return false;\n }\n return true;\n }\n}\n","import type { CanonicalTool } from \"../registry.js\";\n\nfunction paramNames(fn: (...args: never[]) => unknown): string[] {\n const src = Function.prototype.toString.call(fn);\n const match =\n src.match(/^(?:async\\s+)?function\\s*(?:[A-Za-z0-9_$]*)\\s*\\(([^)]*)\\)/) ??\n src.match(/^(?:async\\s*)?\\(([^)]*)\\)\\s*=>/) ??\n src.match(/^(?:async\\s+)?([A-Za-z0-9_$]+)\\s*=>/);\n const raw = (match?.[1] ?? \"\").trim();\n if (!raw) return [];\n return raw\n .split(\",\")\n .map(\n (p) =>\n p\n .trim()\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\")\n .replace(/\\/\\/.*$/, \"\")\n .trim()\n .replace(/^[\\s.]*\\.\\.\\./, \"\")\n .replace(/\\s*=[\\s\\S]*$/, \"\")\n .replace(/^\\{[\\s\\S]*\\}$/, \"\")\n .replace(/^=?>.*/, \"\")\n .split(/\\s+/)\n .pop() ?? \"\",\n )\n .map((n) => n.replace(/[^A-Za-z0-9_$]/g, \"\"))\n .filter((n) => n && n !== \"this\" && n !== \"cls\");\n}\n\n/**\n * Derive a CanonicalTool from a plain function's name and arity.\n * `fn.length` is the count of required positional parameters (JS omits\n * defaults from `.length`); parameter names are parsed from source.\n */\nexport function functionTool(fn: (...args: never[]) => unknown): CanonicalTool {\n const name = fn.name || \"anonymous\";\n const names = paramNames(fn);\n const requiredCount = fn.length;\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n for (let i = 0; i < Math.max(names.length, requiredCount); i++) {\n const key = names[i] || `arg${i}`;\n properties[key] = { type: \"string\" };\n if (i < requiredCount) required.push(key);\n }\n const description =\n (typeof fn === \"function\" && \"doc\" in fn ? String((fn as { doc?: string }).doc) : \"\") || name;\n\n return {\n id: null,\n kind: \"function\",\n callName: `fn_${name}`,\n displayName: name,\n description,\n paramsSchema: { type: \"object\", properties, required },\n requiresApproval: false,\n approvalPolicy: {},\n sourceId: null,\n acl: null,\n raw: { callable: fn },\n };\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { Pool } from \"pg\";\nimport type { ContextEngineConfig } from \"../config.js\";\nimport { EngineActionError } from \"../errors.js\";\nimport { emitUsage, type Hooks } from \"../hooks.js\";\nimport { applyRedaction, type RedactionPolicy } from \"../redaction.js\";\nimport type { UsageEvent } from \"../usage.js\";\nimport { aclVisible } from \"./acl.js\";\nimport { createPending, shouldRequireApproval } from \"./approval.js\";\nimport { logToolCall, ToolCallTimer } from \"./audit.js\";\nimport { ToolConfig } from \"./config.js\";\nimport { decryptDict, encryptDict, getSecretKey } from \"./crypto.js\";\nimport { executeDb, getSchemaText } from \"./executors/db.js\";\nimport { executeHttp, type ToolHttpClient } from \"./executors/http.js\";\nimport { PromptevMCP } from \"./executors/mcp-client.js\";\nimport { type CanonicalTool, canonicalFromConfig, findTool } from \"./registry.js\";\n\nexport const RESULT_MAX_CHARS = 8_000;\nexport const RESULT_MAX_ROWS = 100;\n\nconst UPDATABLE_COLUMNS = new Set([\n \"name\",\n \"kind\",\n \"description\",\n \"sourceId\",\n \"source_id\",\n \"acl\",\n \"requiresApproval\",\n \"requires_approval\",\n \"approvalPolicy\",\n \"approval_policy\",\n \"enabled\",\n]);\n\nexport type ToolEngine = {\n pool: Pool;\n config: ContextEngineConfig;\n hooks?: Hooks | null;\n _functionTools?: Record<string, CanonicalTool>;\n _toolHttpClient?: ToolHttpClient | null;\n};\n\nexport function toolVisible(ct: CanonicalTool, principals: string[] | null | undefined): boolean {\n return aclVisible(ct.acl, principals);\n}\n\nexport function stripUnderscoreArgs(\n args: Record<string, unknown> | null | undefined,\n): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(args ?? {})) {\n if (!String(k).startsWith(\"_\")) out[k] = v;\n }\n return out;\n}\n\nexport function shapeResult(\n result: unknown,\n opts: { maxChars?: number; maxRows?: number } = {},\n): [unknown, boolean] {\n const maxChars = opts.maxChars ?? RESULT_MAX_CHARS;\n const maxRows = opts.maxRows ?? RESULT_MAX_ROWS;\n let truncated = false;\n let shaped = result;\n\n if (\n result &&\n typeof result === \"object\" &&\n Array.isArray((result as { rows?: unknown }).rows) &&\n (result as { rows: unknown[] }).rows.length > maxRows\n ) {\n const rows = (result as { rows: unknown[] }).rows;\n const kept = rows.slice(0, maxRows);\n shaped = {\n ...(result as object),\n rows: kept,\n _result_shaping: { rows_returned: kept.length, rows_omitted: rows.length - kept.length },\n };\n truncated = true;\n }\n\n let serialized: string;\n try {\n serialized = JSON.stringify(shaped);\n } catch {\n serialized = JSON.stringify(String(shaped));\n }\n if (serialized.length > maxChars) {\n return [\n {\n _truncated: serialized.slice(0, maxChars),\n _original_size: serialized.length,\n _note: \"tool result exceeded the context budget and was truncated\",\n },\n true,\n ];\n }\n return [shaped, truncated];\n}\n\nexport function redactToolResult(\n result: unknown,\n policy: RedactionPolicy,\n opts: {\n principals?: readonly string[] | null;\n secretKey?: string | Buffer | null;\n hooks?: Hooks | null;\n },\n): [unknown, Record<string, unknown>] {\n if (policy.isEmpty()) return [result, {}];\n const fired: string[] = [];\n const failed: string[] = [];\n let total = 0;\n\n const walk = (node: unknown): unknown => {\n if (typeof node === \"string\") {\n const [text, note] = applyRedaction(node, policy, {\n phase: \"output\",\n principals: opts.principals ?? null,\n secretKey: opts.secretKey,\n hooks: opts.hooks,\n });\n if (note && Object.keys(note).length) {\n total += note.spans ?? 0;\n for (const name of note.rules_fired ?? []) {\n if (!fired.includes(name)) fired.push(name);\n }\n for (const name of note.rules_failed ?? []) {\n if (!failed.includes(name)) failed.push(name);\n }\n }\n return text;\n }\n if (node && typeof node === \"object\") {\n if (Array.isArray(node)) return node.map(walk);\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(node as Record<string, unknown>)) out[k] = walk(v);\n return out;\n }\n return node;\n };\n\n const redacted = walk(result);\n if (!fired.length && !failed.length) return [redacted, {}];\n const note: Record<string, unknown> = { rules_fired: fired, spans: total };\n if (failed.length) note.rules_failed = failed;\n return [redacted, note];\n}\n\nfunction rowToToolConfig(row: Record<string, unknown>, engine: ToolEngine): ToolConfig {\n let config: Record<string, unknown> = {};\n if (row.config_encrypted) {\n config = decryptDict(String(row.config_encrypted), getSecretKey(engine.config));\n }\n return new ToolConfig({\n id: String(row.id),\n name: String(row.name),\n kind: row.kind as ToolConfig[\"kind\"],\n description: String(row.description ?? \"\"),\n config,\n sourceId: (row.source_id as string | null) ?? null,\n acl: row.acl != null ? [...(row.acl as string[])] : null,\n requiresApproval: Boolean(row.requires_approval),\n approvalPolicy: (row.approval_policy as Record<string, unknown>) ?? {},\n enabled: Boolean(row.enabled),\n });\n}\n\nasync function loadPersistedCanonicals(\n engine: ToolEngine,\n sourceId: string | null,\n): Promise<CanonicalTool[]> {\n const params: unknown[] = [];\n let sql = `SELECT * FROM context_engine_tools WHERE enabled IS TRUE`;\n if (sourceId != null) {\n params.push(sourceId);\n sql += ` AND source_id = $1`;\n }\n const result = await engine.pool.query(sql, params);\n const canonicals: CanonicalTool[] = [];\n for (const row of result.rows) {\n canonicals.push(...canonicalFromConfig(rowToToolConfig(row, engine)));\n }\n return canonicals;\n}\n\nasync function mergedTools(engine: ToolEngine, sourceId: string | null): Promise<CanonicalTool[]> {\n const persisted = await loadPersistedCanonicals(engine, sourceId);\n const functions = Object.values(engine._functionTools ?? {});\n return [...persisted, ...functions];\n}\n\nfunction canonicalToPublic(ct: CanonicalTool): Record<string, unknown> {\n return {\n name: ct.callName,\n kind: ct.kind,\n description: ct.description,\n params_schema: ct.paramsSchema,\n };\n}\n\nexport async function registerTool(engine: ToolEngine, tc: ToolConfig): Promise<string> {\n canonicalFromConfig(tc);\n const config = tc.config ?? {};\n const configEncrypted = Object.keys(config).length\n ? encryptDict(config, getSecretKey(engine.config))\n : null;\n const id = randomUUID();\n await engine.pool.query(\n `INSERT INTO context_engine_tools\n (id, name, kind, description, source_id, acl, config_encrypted,\n requires_approval, approval_policy, enabled)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9::jsonb, $10)`,\n [\n id,\n tc.name,\n tc.kind,\n tc.description || \"\",\n tc.sourceId,\n tc.acl,\n configEncrypted,\n tc.requiresApproval,\n JSON.stringify(tc.approvalPolicy ?? {}),\n tc.enabled,\n ],\n );\n return id;\n}\n\nexport async function updateTool(\n engine: ToolEngine,\n id: string,\n opts: { principals?: string[] | null } & Record<string, unknown>,\n): Promise<ToolConfig> {\n const { principals = null, ...fields } = opts;\n const existing = await engine.pool.query(`SELECT * FROM context_engine_tools WHERE id = $1`, [id]);\n const row = existing.rows[0];\n if (!row || !aclVisible(row.acl != null ? [...row.acl] : null, principals)) {\n throw new EngineActionError(`tool not found: ${id}`);\n }\n const sets: string[] = [];\n const params: unknown[] = [];\n let i = 1;\n for (const [key, value] of Object.entries(fields)) {\n if (key === \"config\") {\n sets.push(`config_encrypted = $${i++}`);\n params.push(value ? encryptDict(value as Record<string, unknown>, getSecretKey(engine.config)) : null);\n } else if (UPDATABLE_COLUMNS.has(key)) {\n const col =\n key === \"sourceId\"\n ? \"source_id\"\n : key === \"requiresApproval\"\n ? \"requires_approval\"\n : key === \"approvalPolicy\"\n ? \"approval_policy\"\n : key;\n sets.push(`${col} = $${i++}`);\n params.push(col === \"approval_policy\" ? JSON.stringify(value ?? {}) : value);\n }\n }\n sets.push(`updated_at = now()`);\n params.push(id);\n const updated = await engine.pool.query(\n `UPDATE context_engine_tools SET ${sets.join(\", \")} WHERE id = $${i} RETURNING *`,\n params,\n );\n return rowToToolConfig(updated.rows[0], engine);\n}\n\nexport async function deleteTool(\n engine: ToolEngine,\n id: string,\n opts: { principals?: string[] | null } = {},\n): Promise<void> {\n const existing = await engine.pool.query(`SELECT * FROM context_engine_tools WHERE id = $1`, [id]);\n const row = existing.rows[0];\n if (!row || !aclVisible(row.acl != null ? [...row.acl] : null, opts.principals ?? null)) {\n throw new EngineActionError(`tool not found: ${id}`);\n }\n await engine.pool.query(`DELETE FROM context_engine_tools WHERE id = $1`, [id]);\n}\n\nexport async function listTools(\n engine: ToolEngine,\n opts: { sourceId?: string | null; principals?: string[] | null } = {},\n): Promise<Array<Record<string, unknown>>> {\n const tools = await mergedTools(engine, opts.sourceId ?? null);\n return tools.filter((ct) => toolVisible(ct, opts.principals ?? null)).map(canonicalToPublic);\n}\n\nexport async function searchTools(\n engine: ToolEngine,\n query: string,\n opts: { sourceId?: string | null; principals?: string[] | null; limit?: number } = {},\n): Promise<Array<Record<string, unknown>>> {\n const listed = await listTools(engine, { sourceId: opts.sourceId, principals: opts.principals });\n const limit = opts.limit ?? 10;\n const normalized = (query || \"\").toLowerCase().trim();\n if (!normalized) return listed.slice(0, limit);\n const terms = normalized.split(/\\s+/);\n const scored: Array<[number, Record<string, unknown>]> = [];\n for (const tool of listed) {\n const haystack = `${tool.name} ${tool.description}`.toLowerCase();\n const score = terms.reduce((n, term) => n + (haystack.includes(term) ? 1 : 0), 0);\n if (score > 0) scored.push([score, tool]);\n }\n scored.sort((a, b) => b[0] - a[0]);\n return scored.slice(0, limit).map(([, t]) => t);\n}\n\nconst PROBE_AUTH = [\n \"authentication failed\",\n \"pg_hba\",\n \"permission denied\",\n \"access denied\",\n \"password\",\n \"unauthorized\",\n \"forbidden\",\n \"401\",\n \"403\",\n \"invalid credentials\",\n];\nconst PROBE_UNREACHABLE = [\n \"connection refused\",\n \"could not connect\",\n \"name or service not known\",\n \"nodename nor servname\",\n \"no route to host\",\n \"network is unreachable\",\n \"temporary failure in name resolution\",\n \"getaddrinfo\",\n \"connection reset\",\n \"fetch failed\",\n \"econnrefused\",\n \"enotfound\",\n];\nconst PROBE_TIMEOUT = [\"timed out\", \"timeout\", \"aborted\"];\nconst PROBE_MISCONFIGURED = [\n \"does not exist\",\n \"invalid\",\n \"unknown database\",\n \"syntax error\",\n \"no such\",\n \"missing\",\n \"not supported\",\n \"unsupported\",\n];\n\nfunction classifyProbeError(exc: unknown): string {\n if (exc instanceof DOMException && exc.name === \"TimeoutError\") return \"timeout\";\n const name = exc instanceof Error ? exc.name : \"\";\n if (name.includes(\"Timeout\")) return \"timeout\";\n if ([\"ConnectError\", \"ConnectionError\", \"NetworkError\", \"TypeError\"].some((t) => name.includes(t))) {\n if (name === \"TypeError\" && !String(exc).toLowerCase().includes(\"fetch\")) {\n /* fall through */\n } else if (name !== \"TypeError\") return \"unreachable\";\n }\n if ([\"Auth\", \"Permission\", \"Forbidden\", \"Unauthorized\"].some((t) => name.includes(t))) return \"auth_failed\";\n const text = String(exc).toLowerCase();\n if (PROBE_TIMEOUT.some((t) => text.includes(t))) return \"timeout\";\n if (PROBE_AUTH.some((t) => text.includes(t))) return \"auth_failed\";\n if (PROBE_UNREACHABLE.some((t) => text.includes(t))) return \"unreachable\";\n if (PROBE_MISCONFIGURED.some((t) => text.includes(t))) return \"misconfigured\";\n return \"error\";\n}\n\nfunction probeFailure(exc: unknown, kind: string): Record<string, unknown> {\n const category = classifyProbeError(exc);\n console.warn(`test_tool(kind=${kind}) failed:`, exc, \"->\", category);\n return { ok: false, error: category };\n}\n\nexport async function testTool(_engine: ToolEngine, tc: ToolConfig): Promise<Record<string, unknown>> {\n const kind = tc.kind;\n const config = tc.config ?? {};\n if (kind === \"http\") {\n const url = config.url as string | undefined;\n if (!url) return { ok: false, error: \"http config missing 'url'\" };\n try {\n const resp = await fetch(url, {\n method: \"HEAD\",\n headers: (config.headers as Record<string, string>) ?? {},\n redirect: \"follow\",\n signal: AbortSignal.timeout(10_000),\n });\n return { ok: resp.status < 500, status_code: resp.status };\n } catch (exc) {\n return probeFailure(exc, \"http\");\n }\n }\n if (kind === \"db\") {\n try {\n const { testConnection } = await import(\"./executors/db.js\");\n const result = await testConnection(config);\n return { ok: Boolean(result.success ?? result.ok), ...result };\n } catch (exc) {\n return probeFailure(exc, \"db\");\n }\n }\n if (kind === \"mcp\") {\n const url = config.url as string | undefined;\n if (!url) return { ok: false, error: \"mcp config missing 'url'\" };\n const token = (config.oauth_token ?? config.bearer ?? config.access_token) as string | undefined;\n const mcp = new PromptevMCP();\n try {\n await mcp.addServer(tc.name, url, { token: token ?? null });\n const client = mcp.clients.get(tc.name);\n return { ok: true, tools: client.tools.map((t) => t.name) };\n } catch (exc) {\n return probeFailure(exc, \"mcp\");\n } finally {\n await mcp.shutdown();\n }\n }\n return { ok: false, error: `test_tool does not support kind=${JSON.stringify(kind)}` };\n}\n\nasync function findAndClaimApproved(\n engine: ToolEngine,\n toolName: string,\n args: Record<string, unknown>,\n sourceId: string | null,\n): Promise<string | null> {\n const claimedAt = new Date();\n const candidates = await engine.pool.query(\n `SELECT * FROM context_engine_tool_approvals WHERE tool_name = $1 AND status = 'approved'`,\n [toolName],\n );\n for (const row of candidates.rows) {\n if ((row.source_id ?? null) !== (sourceId ?? null)) continue;\n const frozen = row.tool_args_frozen ?? {};\n if (JSON.stringify(frozen) !== JSON.stringify(args)) continue;\n const result = await engine.pool.query(\n `UPDATE context_engine_tool_approvals\n SET status = 'executed', resolved_at = $1\n WHERE id = $2 AND status = 'approved'\n RETURNING id`,\n [claimedAt, row.id],\n );\n if (result.rowCount === 1) return String(row.id);\n }\n return null;\n}\n\nasync function dispatchMcp(\n ct: CanonicalTool,\n config: Record<string, unknown>,\n args: Record<string, unknown>,\n): Promise<unknown> {\n const url = config.url as string | undefined;\n if (!url) throw new EngineActionError(`mcp tool ${ct.callName} config missing 'url'`);\n const headers = { ...((config.headers as Record<string, string>) ?? {}) };\n const token = (config.oauth_token ?? config.bearer ?? config.access_token) as string | undefined;\n const apiKey = config.api_key as string | undefined;\n if (token) headers.Authorization = `Bearer ${token}`;\n else if (apiKey) headers.Authorization = `Bearer ${apiKey}`;\n const toolName = String(ct.raw?.tool_name ?? ct.displayName);\n const mcp = new PromptevMCP();\n try {\n await mcp.addServer(ct.callName, url, { headers: Object.keys(headers).length ? headers : null });\n const client = mcp.clients.get(ct.callName);\n return await client.callToolWithReconnect(toolName, args);\n } finally {\n await mcp.shutdown();\n }\n}\n\nasync function dispatch(\n engine: ToolEngine,\n ct: CanonicalTool,\n config: Record<string, unknown>,\n args: Record<string, unknown>,\n): Promise<unknown> {\n if (ct.kind === \"http\") {\n return executeHttp(config, args, { client: engine._toolHttpClient ?? null });\n }\n if (ct.kind === \"db\") {\n const query = String(args.query ?? \"\");\n if (query.trim().toLowerCase().startsWith(\"describe:\")) {\n const tables = query\n .slice(query.indexOf(\":\") + 1)\n .split(\",\")\n .map((t) => t.trim())\n .filter(Boolean);\n const schemaText = await getSchemaText(config, tables.length ? tables : null);\n return { success: true, schema: schemaText };\n }\n const result = await executeDb(config, query);\n if (result && typeof result === \"object\" && result.success === false) {\n throw new EngineActionError(String(result.error || \"database query failed\"));\n }\n return result;\n }\n if (ct.kind === \"mcp\") return dispatchMcp(ct, config, args);\n if (ct.kind === \"function\") {\n const fn = ct.raw?.callable as ((...a: unknown[]) => unknown) | undefined;\n if (!fn) throw new EngineActionError(`function tool ${ct.callName} has no callable`);\n return await fn(...namedArgs(fn, args));\n }\n throw new EngineActionError(`unsupported tool kind: ${JSON.stringify(ct.kind)}`);\n}\n\nfunction namedArgs(fn: (...a: unknown[]) => unknown, args: Record<string, unknown>): unknown[] {\n const src = Function.prototype.toString.call(fn);\n const match = src.match(/\\(([^)]*)\\)/);\n const names = (match?.[1] ?? \"\")\n .split(\",\")\n .map((p) => p.trim().split(/\\s*=/)[0]?.trim())\n .filter(Boolean);\n if (!names.length) return Object.values(args);\n return names.map((n) => args[n!]);\n}\n\nasync function decryptCtConfig(engine: ToolEngine, toolId: string): Promise<Record<string, unknown>> {\n const result = await engine.pool.query(`SELECT config_encrypted FROM context_engine_tools WHERE id = $1`, [\n toolId,\n ]);\n const row = result.rows[0];\n if (!row?.config_encrypted) return {};\n return decryptDict(String(row.config_encrypted), getSecretKey(engine.config));\n}\n\nexport async function executeTool(\n engine: ToolEngine,\n callName: string,\n args: Record<string, unknown> | null | undefined,\n opts: {\n sourceId?: string | null;\n principals?: string[] | null;\n actor?: { type?: string; id?: unknown } | null;\n source?: string;\n } = {},\n): Promise<Record<string, unknown>> {\n const runtimeArgs = args ?? {};\n const ct = findTool(await mergedTools(engine, opts.sourceId ?? null), callName);\n if (!ct) throw new EngineActionError(`tool not found: ${callName}`);\n if (!toolVisible(ct, opts.principals ?? null)) {\n throw new EngineActionError(`tool not found: ${callName}`);\n }\n\n const publicArgs = stripUnderscoreArgs(runtimeArgs);\n let approvalId: string | null = null;\n if (shouldRequireApproval(ct, publicArgs)) {\n approvalId = await findAndClaimApproved(engine, ct.callName, publicArgs, opts.sourceId ?? null);\n if (approvalId == null) {\n const record = await createPending(engine, {\n toolName: ct.callName,\n args: publicArgs,\n sourceId: opts.sourceId ?? null,\n principals: opts.principals ?? null,\n policy: ct.approvalPolicy ?? {},\n });\n const reason = ct.requiresApproval\n ? \"tool requires approval\"\n : `approval policy condition met: ${ct.approvalPolicy?.condition}`;\n return {\n approval_required: {\n approval_id: String(record.id),\n tool_name: ct.callName,\n args: publicArgs,\n reason,\n },\n };\n }\n }\n\n let config: Record<string, unknown> = {};\n if (ct.kind !== \"function\" && ct.id != null) {\n config = await decryptCtConfig(engine, ct.id);\n }\n\n const actorType = opts.actor?.type ?? null;\n const actorId = opts.actor?.id ?? null;\n let rawResult: unknown = null;\n let exc: unknown = null;\n const timer = new ToolCallTimer().start();\n try {\n rawResult = await dispatch(engine, ct, config, publicArgs);\n } catch (e) {\n exc = e;\n }\n timer.stop();\n\n let success = exc == null;\n let shaped: unknown = null;\n let truncated = false;\n if (success) {\n try {\n const [redacted] = redactToolResult(rawResult, engine.config.redaction, {\n principals: opts.principals ?? null,\n secretKey: engine.config.secretKey,\n hooks: engine.hooks,\n });\n rawResult = redacted;\n [shaped, truncated] = shapeResult(rawResult);\n } catch (e) {\n exc = e;\n success = false;\n }\n }\n\n await logToolCall(engine, {\n toolId: ct.id,\n toolName: ct.callName,\n kind: ct.kind,\n actorType,\n actorId,\n source: opts.source ?? \"api\",\n inputArgs: publicArgs,\n outputResult: success ? rawResult : null,\n success,\n error: exc,\n durationMs: timer.durationMs,\n units: success ? 1 : 0,\n approvalId,\n });\n\n if (!success) {\n throw new EngineActionError(`tool execution failed: ${ct.callName}: ${exc}`);\n }\n\n const usage: UsageEvent = {\n kind: \"tool\",\n units: 1,\n detail: { tool_name: ct.callName, kind: ct.kind, truncated },\n };\n emitUsage(engine.hooks, usage);\n\n return {\n result: shaped,\n usage: { units: 1, kind: \"tool\", tool_name: ct.callName, truncated },\n };\n}\n","export function aclVisible(\n acl: string[] | null | undefined,\n principals: string[] | null | undefined,\n): boolean {\n if (principals === null) return true;\n if (acl == null) return true;\n if (!acl.length) return false;\n const held = new Set(principals ?? []);\n return acl.some((p) => held.has(p));\n}\n","import { randomUUID } from \"node:crypto\";\nimport { ApprovalExpired, ApprovalNotPending } from \"../errors.js\";\nimport { aclVisible } from \"./acl.js\";\nimport type { CanonicalTool } from \"./registry.js\";\n\nexport { ApprovalExpired, ApprovalNotPending };\n\nexport const DEFAULT_TIMEOUT_MINUTES = 60;\nexport const DEFAULT_LIST_LIMIT = 50;\nexport const MAX_LIST_LIMIT = 200;\n\nconst CONDITION_RE = /^\\s*(?<field>[A-Za-z_][A-Za-z0-9_.]*)\\s*(?<op>>=|<=|==|!=|>|<)\\s*(?<value>.+?)\\s*$/;\n\nexport interface ApprovalRecord {\n id: string;\n toolName: string;\n toolArgsFrozen: Record<string, unknown>;\n sourceId: string | null;\n principals: unknown;\n status: string;\n approver: string | null;\n approverMeta: Record<string, unknown> | null;\n expiresAt: Date | null;\n resolvedAt: Date | null;\n createdAt: Date | null;\n}\n\ntype EngineLike = {\n pool: {\n query: (\n sql: string,\n params?: unknown[],\n ) => Promise<{ rows: Array<Record<string, unknown>>; rowCount?: number | null }>;\n };\n};\n\nfunction coerceValue(raw: string): unknown {\n const trimmed = raw.trim();\n if (\n trimmed.length >= 2 &&\n trimmed[0] === trimmed[trimmed.length - 1] &&\n (trimmed[0] === \"'\" || trimmed[0] === '\"')\n ) {\n return trimmed.slice(1, -1);\n }\n if (/^-?\\d+$/.test(trimmed)) return Number.parseInt(trimmed, 10);\n if (/^-?\\d+\\.\\d+$/.test(trimmed)) return Number.parseFloat(trimmed);\n return trimmed;\n}\n\nfunction evaluateCondition(condition: unknown, args: Record<string, unknown>): boolean {\n if (typeof condition !== \"string\") return true;\n const match = CONDITION_RE.exec(condition);\n if (!match?.groups) return true;\n const fieldName = match.groups.field!;\n const op = match.groups.op!;\n if (!(fieldName in args)) return true;\n const left = args[fieldName];\n const right = coerceValue(match.groups.value!);\n try {\n switch (op) {\n case \">\":\n return (left as number) > (right as number);\n case \">=\":\n return (left as number) >= (right as number);\n case \"<\":\n return (left as number) < (right as number);\n case \"<=\":\n return (left as number) <= (right as number);\n case \"==\":\n return left === right;\n case \"!=\":\n return left !== right;\n default:\n return true;\n }\n } catch {\n return true;\n }\n}\n\nexport function shouldRequireApproval(\n ct: Pick<CanonicalTool, \"requiresApproval\" | \"approvalPolicy\">,\n args: Record<string, unknown>,\n): boolean {\n if (ct.requiresApproval) return true;\n const policy = ct.approvalPolicy ?? {};\n const condition = policy.condition;\n if (!condition) return false;\n return evaluateCondition(condition, args ?? {});\n}\n\nfunction rowToRecord(row: Record<string, unknown>): ApprovalRecord {\n return {\n id: String(row.id),\n toolName: String(row.tool_name),\n toolArgsFrozen: (row.tool_args_frozen as Record<string, unknown>) ?? {},\n sourceId: (row.source_id as string | null) ?? null,\n principals: row.principals,\n status: String(row.status),\n approver: (row.approver as string | null) ?? null,\n approverMeta: (row.approver_meta as Record<string, unknown> | null) ?? null,\n expiresAt: row.expires_at ? new Date(String(row.expires_at)) : null,\n resolvedAt: row.resolved_at ? new Date(String(row.resolved_at)) : null,\n createdAt: row.created_at ? new Date(String(row.created_at)) : null,\n };\n}\n\nfunction visibilitySql(principals: string[] | null, paramIndex: number): { sql: string; params: unknown[] } {\n if (principals === null) return { sql: \"TRUE\", params: [] };\n if (!principals.length) {\n return { sql: `(principals IS NULL OR principals = 'null'::jsonb)`, params: [] };\n }\n return {\n sql: `(principals IS NULL OR principals = 'null'::jsonb OR principals ?| $${paramIndex}::text[])`,\n params: [principals],\n };\n}\n\nexport async function createPending(\n engine: EngineLike,\n opts: {\n toolName: string;\n args: Record<string, unknown>;\n sourceId?: string | null;\n principals?: unknown;\n policy?: Record<string, unknown>;\n now?: Date;\n },\n): Promise<ApprovalRecord> {\n const policy = opts.policy ?? {};\n const frozen = structuredClone(opts.args);\n const createdAt = opts.now ?? new Date();\n const timeout = Number(policy.timeout_minutes ?? DEFAULT_TIMEOUT_MINUTES);\n const expiresAt = new Date(createdAt.getTime() + timeout * 60_000);\n const id = randomUUID();\n await engine.pool.query(\n `INSERT INTO context_engine_tool_approvals\n (id, tool_name, tool_args_frozen, source_id, principals, status, expires_at, created_at)\n VALUES ($1,$2,$3::jsonb,$4,$5::jsonb,'pending',$6,$7)`,\n [\n id,\n opts.toolName,\n JSON.stringify(frozen),\n opts.sourceId ?? null,\n opts.principals === undefined ? null : JSON.stringify(opts.principals),\n expiresAt,\n createdAt,\n ],\n );\n return {\n id,\n toolName: opts.toolName,\n toolArgsFrozen: frozen,\n sourceId: opts.sourceId ?? null,\n principals: opts.principals ?? null,\n status: \"pending\",\n approver: null,\n approverMeta: null,\n expiresAt,\n resolvedAt: null,\n createdAt,\n };\n}\n\nexport async function resolveApproval(\n engine: EngineLike,\n approvalId: string,\n decision: \"approved\" | \"rejected\",\n approver: string,\n meta: Record<string, unknown> | null = null,\n opts: { principals?: string[] | null } = {},\n): Promise<ApprovalRecord> {\n if (decision !== \"approved\" && decision !== \"rejected\") {\n throw new Error(`invalid decision: ${JSON.stringify(decision)} (expected 'approved' or 'rejected')`);\n }\n const principals = opts.principals === undefined ? null : opts.principals;\n const vis = visibilitySql(principals, 5);\n const result = await engine.pool.query(\n `UPDATE context_engine_tool_approvals\n SET status = $1, approver = $2, approver_meta = $3::jsonb, resolved_at = now()\n WHERE id = $4 AND status = 'pending'\n AND (expires_at IS NULL OR expires_at > now())\n AND ${vis.sql}\n RETURNING *`,\n [decision, approver, JSON.stringify(meta ?? {}), approvalId, ...vis.params],\n );\n if (result.rowCount === 1) return rowToRecord(result.rows[0]!);\n\n const existing = await engine.pool.query(`SELECT * FROM context_engine_tool_approvals WHERE id = $1`, [\n approvalId,\n ]);\n const row = existing.rows[0];\n const rowPrincipals =\n row?.principals == null || row.principals === null ? null : (row.principals as string[]);\n if (!row || !aclVisible(Array.isArray(rowPrincipals) ? rowPrincipals : null, principals)) {\n throw new ApprovalNotPending(\"not_found\");\n }\n if (row.status === \"pending\") {\n await engine.pool.query(\n `UPDATE context_engine_tool_approvals SET status = 'expired' WHERE id = $1 AND status = 'pending'`,\n [approvalId],\n );\n throw new ApprovalExpired();\n }\n throw new ApprovalNotPending(String(row.status));\n}\n\nexport async function getApproval(engine: EngineLike, approvalId: string): Promise<ApprovalRecord | null> {\n const result = await engine.pool.query(`SELECT * FROM context_engine_tool_approvals WHERE id = $1`, [\n approvalId,\n ]);\n return result.rows[0] ? rowToRecord(result.rows[0]) : null;\n}\n\nexport async function listApprovals(\n engine: EngineLike,\n opts: {\n status?: string | null;\n sourceId?: string | null;\n limit?: number;\n principals?: string[] | null;\n } = {},\n): Promise<ApprovalRecord[]> {\n const limit = Math.max(1, Math.min(Number(opts.limit || DEFAULT_LIST_LIMIT), MAX_LIST_LIMIT));\n const principals = opts.principals === undefined ? null : opts.principals;\n const params: unknown[] = [];\n const clauses: string[] = [];\n if (opts.status != null) {\n params.push(opts.status);\n clauses.push(`status = $${params.length}`);\n }\n if (opts.sourceId != null) {\n params.push(opts.sourceId);\n clauses.push(`source_id = $${params.length}`);\n }\n const vis = visibilitySql(principals, params.length + 1);\n clauses.push(vis.sql);\n params.push(...vis.params);\n params.push(limit);\n const result = await engine.pool.query(\n `SELECT * FROM context_engine_tool_approvals\n WHERE ${clauses.join(\" AND \")}\n ORDER BY created_at DESC\n LIMIT $${params.length}`,\n params,\n );\n return result.rows.map(rowToRecord);\n}\n","import { randomUUID } from \"node:crypto\";\nimport { emitToolCall, type Hooks } from \"../hooks.js\";\n\nexport const MAX_OUTPUT_SIZE = 50_000;\nexport const MAX_ERROR_MESSAGE_SIZE = 2_000;\n\ntype EngineLike = {\n pool: { query: (sql: string, params?: unknown[]) => Promise<unknown> };\n hooks?: Hooks | null;\n};\n\nexport class ToolCallTimer {\n private started: number | null = null;\n private ended: number | null = null;\n\n start(): this {\n this.started = Date.now();\n return this;\n }\n\n stop(): this {\n this.ended = Date.now();\n return this;\n }\n\n get durationMs(): number | null {\n if (this.started == null || this.ended == null) return null;\n return this.ended - this.started;\n }\n}\n\nfunction sanitize(obj: unknown): unknown {\n if (obj == null) return obj;\n try {\n return JSON.parse(JSON.stringify(obj, (_k, v) => (typeof v === \"bigint\" ? String(v) : v)));\n } catch {\n return { _raw: String(obj) };\n }\n}\n\nfunction truncateOutput(outputResult: unknown): [unknown, boolean] {\n if (outputResult == null) return [null, false];\n let serialized: string;\n try {\n serialized = JSON.stringify(outputResult);\n } catch {\n serialized = JSON.stringify(String(outputResult));\n }\n if (serialized.length <= MAX_OUTPUT_SIZE) {\n try {\n return [JSON.parse(serialized), false];\n } catch {\n return [outputResult, false];\n }\n }\n return [{ _truncated: serialized.slice(0, MAX_OUTPUT_SIZE), _original_size: serialized.length }, true];\n}\n\nfunction errorMessage(error: unknown): string | null {\n if (error == null) return null;\n const text = error instanceof Error ? error.message : String(error);\n return text.slice(0, MAX_ERROR_MESSAGE_SIZE);\n}\n\nexport async function logToolCall(\n engine: EngineLike,\n row: {\n toolId?: string | null;\n toolName: string;\n kind: string;\n actorType?: string | null;\n actorId?: unknown;\n source?: string | null;\n inputArgs?: Record<string, unknown> | null;\n outputResult?: unknown;\n success?: boolean | null;\n error?: unknown;\n durationMs?: number | null;\n units?: number | null;\n approvalId?: string | null;\n },\n): Promise<void> {\n const event = {\n tool_id: row.toolId != null ? String(row.toolId) : null,\n tool_name: row.toolName,\n kind: row.kind,\n actor_type: row.actorType ?? null,\n actor_id: row.actorId != null ? String(row.actorId) : null,\n source: row.source ?? null,\n input_args: row.inputArgs ?? {},\n output_result: row.outputResult,\n success: row.success ?? null,\n error: row.error != null ? String(row.error) : null,\n duration_ms: row.durationMs ?? null,\n units: row.units ?? null,\n approval_id: row.approvalId ?? null,\n };\n try {\n emitToolCall(engine.hooks, event);\n } catch {\n /* hook must not skip the row */\n }\n try {\n const [stored, truncated] = truncateOutput(row.outputResult);\n const args = sanitize(row.inputArgs ?? {}) ?? {};\n await engine.pool.query(\n `INSERT INTO context_engine_tool_calls\n (id, tool_id, tool_name, kind, actor_type, actor_id, source, input_args, output_result,\n output_truncated, success, error_message, duration_ms, units, approval_id)\n VALUES ($1,$2,$3,$4,$5,$6,$7,$8::jsonb,$9::jsonb,$10,$11,$12,$13,$14,$15)`,\n [\n randomUUID(),\n row.toolId ?? null,\n row.toolName,\n row.kind,\n row.actorType ?? null,\n row.actorId != null ? String(row.actorId) : null,\n row.source ?? \"api\",\n JSON.stringify(args),\n JSON.stringify(stored),\n truncated,\n row.success ?? null,\n errorMessage(row.error),\n row.durationMs ?? null,\n row.units ?? 1,\n row.approvalId ?? null,\n ],\n );\n } catch {\n /* never raises */\n }\n}\n","export type ToolKind = \"http\" | \"db\" | \"mcp\" | \"function\";\n\nconst KINDS: readonly ToolKind[] = [\"http\", \"db\", \"mcp\", \"function\"];\n\nexport interface ToolConfigInit {\n id?: string | null;\n name: string;\n kind: ToolKind;\n description?: string;\n config?: Record<string, unknown>;\n sourceId?: string | null;\n source_id?: string | null;\n acl?: string[] | null;\n requiresApproval?: boolean;\n requires_approval?: boolean;\n approvalPolicy?: Record<string, unknown>;\n approval_policy?: Record<string, unknown>;\n enabled?: boolean;\n}\n\n/**\n * Caller-facing shape for registering a tool. Kind-specific `config` is\n * opaque here and encrypted at rest by governance when it holds secrets.\n */\nexport class ToolConfig {\n id: string | null;\n name: string;\n kind: ToolKind;\n description: string;\n config: Record<string, unknown>;\n sourceId: string | null;\n acl: string[] | null;\n requiresApproval: boolean;\n approvalPolicy: Record<string, unknown>;\n enabled: boolean;\n\n constructor(init: ToolConfigInit) {\n this.id = init.id ?? null;\n this.name = init.name;\n this.kind = init.kind;\n this.description = init.description ?? \"\";\n this.config = init.config ?? {};\n this.sourceId = init.sourceId ?? init.source_id ?? null;\n this.acl = init.acl ?? null;\n this.requiresApproval = init.requiresApproval ?? init.requires_approval ?? false;\n this.approvalPolicy = init.approvalPolicy ?? init.approval_policy ?? {};\n this.enabled = init.enabled ?? true;\n }\n\n static fromUnknown(body: unknown): ToolConfig {\n if (!body || typeof body !== \"object\" || Array.isArray(body)) {\n throw new Error(\"tool config must be an object\");\n }\n const b = body as Record<string, unknown>;\n const kind = String(b.kind ?? \"\") as ToolKind;\n if (!KINDS.includes(kind)) {\n throw new Error(`canonicalFromConfig does not support kind=${JSON.stringify(b.kind)}`);\n }\n const name = String(b.name ?? \"\").trim();\n if (!name) throw new Error(\"name is required\");\n return new ToolConfig({\n id: b.id != null ? String(b.id) : null,\n name,\n kind,\n description: b.description != null ? String(b.description) : \"\",\n config: (b.config as Record<string, unknown> | undefined) ?? {},\n sourceId: (b.sourceId ?? b.source_id) as string | null | undefined,\n acl: (b.acl as string[] | null | undefined) ?? null,\n requiresApproval: Boolean(b.requiresApproval ?? b.requires_approval ?? false),\n approvalPolicy: (b.approvalPolicy ?? b.approval_policy ?? {}) as Record<string, unknown>,\n enabled: b.enabled === undefined ? true : Boolean(b.enabled),\n });\n }\n}\n\nconst SCHEMAS: Record<ToolKind, Record<string, unknown>> = {\n http: {\n type: \"object\",\n properties: {\n url: { type: \"string\", description: \"Endpoint URL, may contain {path} params\" },\n method: {\n type: \"string\",\n enum: [\"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\"],\n default: \"GET\",\n },\n headers: {\n type: \"object\",\n additionalProperties: { type: \"string\" },\n writeOnly: true,\n },\n parameters: {\n type: \"object\",\n description: \"Static/user-fixed parameters sent on every call\",\n },\n llmParameters: {\n type: \"object\",\n description: \"JSON-Schema-shaped parameters the LLM fills in per call\",\n },\n llmQueryParameters: {\n type: \"object\",\n description: \"LLM-filled parameters sent as the query string\",\n },\n },\n required: [\"url\", \"method\"],\n },\n db: {\n type: \"object\",\n properties: {\n engine: {\n type: \"string\",\n enum: [\"postgresql\", \"mysql\", \"mariadb\", \"mssql\", \"sqlite\", \"oracle\", \"clickhouse\", \"snowflake\"],\n },\n host: { type: \"string\" },\n port: { type: \"integer\" },\n database: { type: \"string\" },\n username: { type: \"string\" },\n password: { type: \"string\", writeOnly: true },\n access_mode: {\n type: \"string\",\n enum: [\"readonly\", \"readwrite\", \"full\"],\n default: \"readonly\",\n },\n max_rows: { type: \"integer\", default: 1000 },\n selected_tables: { type: \"array\", items: { type: \"string\" } },\n },\n required: [\"engine\", \"database\"],\n },\n mcp: {\n type: \"object\",\n properties: {\n url: { type: \"string\" },\n transport: { type: \"string\", enum: [\"sse\", \"http\", \"websocket\"] },\n oauth: {\n type: \"object\",\n description: \"Discovered OAuth config, if any\",\n writeOnly: true,\n },\n headers: {\n type: \"object\",\n additionalProperties: { type: \"string\" },\n writeOnly: true,\n },\n },\n required: [\"url\", \"transport\"],\n },\n function: {\n type: \"object\",\n properties: {},\n },\n};\n\nexport function configSchema(kind: ToolKind): Record<string, unknown> {\n const schema = SCHEMAS[kind];\n if (!schema) throw new Error(`unknown tool kind: ${JSON.stringify(kind)}`);\n return schema;\n}\n","const TIMEOUT_MS = 30_000;\n\nconst SENSITIVE_RESPONSE_HEADERS = new Set([\n \"set-cookie\",\n \"set-cookie2\",\n \"authorization\",\n \"proxy-authenticate\",\n \"www-authenticate\",\n]);\n\nfunction percentEncode(value: string): string {\n return encodeURIComponent(value).replace(\n /[!'()*]/g,\n (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`,\n );\n}\n\nfunction extract(\n schema: Record<string, unknown> | null | undefined,\n args: Record<string, unknown>,\n): Record<string, unknown> {\n if (!schema) return {};\n const properties = (schema.properties as Record<string, unknown> | undefined) ?? {};\n const required = (schema.required as unknown[] | undefined) ?? [];\n const values: Record<string, unknown> = {};\n for (const key of Object.keys(properties)) {\n const value = args[key];\n if (required.includes(key) && (value === undefined || value === null || value === \"\")) {\n throw new Error(`Missing required LLM parameter: ${key}`);\n }\n if (value !== undefined && value !== null) values[key] = value;\n }\n return values;\n}\n\nexport type ToolHttpClient = {\n request(init: {\n method: string;\n url: string;\n headers?: Record<string, string>;\n params?: Record<string, unknown>;\n json?: unknown;\n content?: string;\n }): Promise<{\n status: number;\n headers: Record<string, string>;\n json(): Promise<unknown>;\n text(): Promise<string>;\n }>;\n};\n\nfunction withQuery(url: string, params: Record<string, unknown>): string {\n const usp = new URLSearchParams();\n for (const [k, v] of Object.entries(params)) {\n if (v === undefined || v === null) continue;\n usp.set(k, String(v));\n }\n const q = usp.toString();\n if (!q) return url;\n return url.includes(\"?\") ? `${url}&${q}` : `${url}?${q}`;\n}\n\nasync function defaultRequest(init: {\n method: string;\n url: string;\n headers?: Record<string, string>;\n params?: Record<string, unknown>;\n json?: unknown;\n content?: string;\n}): Promise<{\n status: number;\n headers: Record<string, string>;\n json(): Promise<unknown>;\n text(): Promise<string>;\n}> {\n let url = init.url;\n if (init.params) url = withQuery(url, init.params);\n const headers: Record<string, string> = { ...(init.headers ?? {}) };\n let body: string | undefined;\n if (init.json !== undefined) {\n headers[\"Content-Type\"] = headers[\"Content-Type\"] ?? headers[\"content-type\"] ?? \"application/json\";\n body = JSON.stringify(init.json);\n } else if (init.content !== undefined) {\n body = init.content;\n }\n const resp = await fetch(url, {\n method: init.method,\n headers,\n body,\n redirect: \"follow\",\n signal: AbortSignal.timeout(TIMEOUT_MS),\n });\n const respHeaders: Record<string, string> = {};\n resp.headers.forEach((v, k) => {\n respHeaders[k] = v;\n });\n const text = await resp.text();\n return {\n status: resp.status,\n headers: respHeaders,\n async json() {\n return JSON.parse(text);\n },\n async text() {\n return text;\n },\n };\n}\n\nexport async function executeHttp(\n config: Record<string, unknown>,\n args: Record<string, unknown>,\n opts: { client?: ToolHttpClient | null } = {},\n): Promise<Record<string, unknown>> {\n const method = String(config.method ?? \"GET\").toUpperCase();\n let url = config.url as string | undefined;\n const headers = { ...((config.headers as Record<string, string> | undefined) ?? {}) };\n const staticParams = { ...((config.parameters as Record<string, unknown> | undefined) ?? {}) };\n const body = config.body;\n const runtimeArgs = args ?? {};\n\n const queryValues = extract(config.llmQueryParameters as Record<string, unknown> | undefined, runtimeArgs);\n const bodyValues = extract(config.llmParameters as Record<string, unknown> | undefined, runtimeArgs);\n\n if (url?.includes(\"{{\")) {\n for (const source of [queryValues, bodyValues]) {\n for (const key of Object.keys(source)) {\n const placeholder = `{{${key}}}`;\n if (url.includes(placeholder)) {\n url = url.replaceAll(placeholder, percentEncode(String(source[key])));\n delete source[key];\n }\n }\n }\n }\n\n const requestInit: Parameters<ToolHttpClient[\"request\"]>[0] = {\n method,\n url: url ?? \"\",\n headers,\n };\n\n if (method === \"GET\" || method === \"DELETE\") {\n const query = { ...staticParams, ...queryValues, ...bodyValues };\n if (Object.keys(query).length) requestInit.params = query;\n } else {\n const query = { ...staticParams, ...queryValues };\n if (Object.keys(query).length) requestInit.params = query;\n\n let jsonBody: Record<string, unknown> = {};\n if (body !== undefined && body !== null) {\n if (typeof body === \"object\" && !Array.isArray(body)) {\n jsonBody = { ...(body as Record<string, unknown>) };\n } else if (typeof body === \"string\") {\n try {\n const parsed = JSON.parse(body);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n jsonBody = parsed as Record<string, unknown>;\n }\n } catch {\n /* raw string body */\n }\n }\n }\n Object.assign(jsonBody, bodyValues);\n if (Object.keys(jsonBody).length) {\n requestInit.json = jsonBody;\n } else if (body !== undefined && body !== null) {\n const contentType = headers[\"Content-Type\"] ?? headers[\"content-type\"] ?? \"\";\n if (typeof body === \"string\" && !contentType.includes(\"application/json\")) {\n requestInit.content = body;\n }\n }\n }\n\n const client = opts.client;\n const resp = client ? await client.request(requestInit) : await defaultRequest(requestInit);\n const contentType = resp.headers[\"content-type\"] ?? resp.headers[\"Content-Type\"] ?? \"\";\n let data: unknown;\n try {\n data = contentType.includes(\"application/json\") ? await resp.json() : await resp.text();\n } catch {\n data = await resp.text();\n }\n\n const safeHeaders: Record<string, string> = {};\n for (const [k, v] of Object.entries(resp.headers)) {\n if (!SENSITIVE_RESPONSE_HEADERS.has(k.toLowerCase())) safeHeaders[k] = v;\n }\n\n return {\n status_code: resp.status,\n headers: safeHeaders,\n data,\n };\n}\n","/** Bumped by CI on every main merge; 0.0.0 = pre-first-release. */\nexport const __version__ = \"0.0.0\";\n","import { __version__ } from \"../../version.js\";\n\nexport class MCPError extends Error {\n code: number;\n data: unknown;\n constructor(code: number, message: string, data: unknown = null) {\n super(`[${code}] ${message}`);\n this.name = \"MCPError\";\n this.code = code;\n this.data = data;\n }\n static fromJsonrpc(err: Record<string, unknown>): MCPError {\n return new MCPError(Number(err.code ?? -32000), String(err.message ?? \"MCP error\"), err.data);\n }\n}\n\ninterface Transport {\n kind: string;\n connect(): Promise<void>;\n close(): Promise<void>;\n send(msg: Record<string, unknown>): Promise<void>;\n recv(): Promise<Record<string, unknown>>;\n request?(msg: Record<string, unknown>): Promise<Record<string, unknown>>;\n}\n\nfunction parseSseBuffer(raw: string): Record<string, unknown> | null {\n const dataLines = raw\n .split(\"\\n\")\n .filter((ln) => ln.startsWith(\"data:\"))\n .map((ln) => ln.slice(5).trimStart());\n if (!dataLines.length) return null;\n try {\n const payload = JSON.parse(dataLines.join(\"\\n\"));\n if (payload && typeof payload === \"object\" && (\"result\" in payload || \"error\" in payload)) {\n return payload as Record<string, unknown>;\n }\n } catch {\n /* ignore */\n }\n return null;\n}\n\nclass HttpTransport implements Transport {\n kind = \"http\";\n url: string;\n private baseHeaders: Record<string, string>;\n private sessionId: string | null = null;\n\n constructor(url: string, headers: Record<string, string>) {\n this.url = url;\n this.baseHeaders = {\n ...headers,\n \"Content-Type\": \"application/json\",\n Accept: \"application/json, text/event-stream\",\n };\n }\n\n async connect(): Promise<void> {\n /* stateless HTTP */\n }\n\n async close(): Promise<void> {\n this.sessionId = null;\n }\n\n private buildHeaders(): Record<string, string> {\n const hdrs = { ...this.baseHeaders };\n if (this.sessionId) hdrs[\"Mcp-Session-Id\"] = this.sessionId;\n return hdrs;\n }\n\n async request(msg: Record<string, unknown>): Promise<Record<string, unknown>> {\n const resp = await fetch(this.url, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: JSON.stringify(msg),\n });\n const sid = resp.headers.get(\"Mcp-Session-Id\");\n if (sid) this.sessionId = sid;\n if (resp.status >= 400) {\n const body = await resp.text();\n console.error(`[HTTP Transport] ${resp.status} from ${this.url}: ${body.slice(0, 300)}`);\n throw new Error(`HTTP ${resp.status}: ${body.slice(0, 300)}`);\n }\n const contentType = resp.headers.get(\"Content-Type\") ?? \"\";\n if (contentType.includes(\"text/event-stream\")) {\n const text = await resp.text();\n let result: Record<string, unknown> = {};\n for (const frame of text.split(/\\r?\\n\\r?\\n/)) {\n const parsed = parseSseBuffer(frame);\n if (parsed) result = parsed;\n }\n return result;\n }\n return (await resp.json()) as Record<string, unknown>;\n }\n\n async send(msg: Record<string, unknown>): Promise<void> {\n await this.request(msg);\n }\n\n async recv(): Promise<Record<string, unknown>> {\n return {};\n }\n\n getBaseHeaders(): Record<string, string> {\n return { ...this.baseHeaders };\n }\n}\n\nclass SseTransport implements Transport {\n kind = \"sse\";\n eventsUrl: string;\n baseUrl: string;\n headers: Record<string, string>;\n private postUrl: string | null = null;\n private queue: Array<Record<string, unknown>> = [];\n private waiters: Array<(v: Record<string, unknown>) => void> = [];\n private abort: AbortController | null = null;\n\n constructor(url: string, headers: Record<string, string>) {\n this.eventsUrl = url.replace(/\\/$/, \"\");\n if (url.endsWith(\"/events\")) this.baseUrl = url.slice(0, -7);\n else if (url.endsWith(\"/sse\")) this.baseUrl = url.slice(0, -4);\n else this.baseUrl = url.replace(/\\/$/, \"\");\n this.headers = { ...headers };\n }\n\n private enqueue(msg: Record<string, unknown>): void {\n const waiter = this.waiters.shift();\n if (waiter) waiter(msg);\n else this.queue.push(msg);\n }\n\n async connect(): Promise<void> {\n this.abort = new AbortController();\n void this.listen();\n }\n\n private async listen(): Promise<void> {\n const resp = await fetch(this.eventsUrl, {\n headers: { ...this.headers, Accept: \"text/event-stream\" },\n signal: this.abort?.signal,\n });\n if (!resp.ok) throw new Error(`SSE ${resp.status}`);\n if (!resp.body) throw new Error(\"SSE response has no body\");\n const reader = resp.body.getReader();\n const decoder = new TextDecoder();\n let buf = \"\";\n let eventType: string | null = null;\n const frame: string[] = [];\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buf += decoder.decode(value, { stream: true });\n const lines = buf.split(/\\n/);\n buf = lines.pop() ?? \"\";\n for (const line of lines) {\n if (line === \"\" || line === \"\\r\") {\n this.dispatchFrame(frame, eventType);\n frame.length = 0;\n eventType = null;\n continue;\n }\n const stripped = line.replace(/\\r$/, \"\");\n if (stripped.startsWith(\"event:\")) eventType = stripped.slice(6).trim();\n frame.push(stripped);\n }\n }\n }\n\n private dispatchFrame(buf: string[], eventType: string | null): void {\n const dataLines = buf.filter((l) => l.startsWith(\"data:\")).map((l) => l.slice(5).trimStart());\n if (!dataLines.length) return;\n const payload = dataLines.join(\"\\n\");\n if (eventType === \"endpoint\") {\n const endpoint = payload.trim();\n this.postUrl = endpoint.startsWith(\"/\") ? `${this.baseUrl}${endpoint}` : endpoint;\n return;\n }\n try {\n this.enqueue(JSON.parse(payload) as Record<string, unknown>);\n } catch {\n /* non-JSON frame */\n }\n }\n\n async close(): Promise<void> {\n this.abort?.abort();\n }\n\n async send(msg: Record<string, unknown>): Promise<void> {\n if (!this.postUrl) {\n for (let i = 0; i < 30; i++) {\n if (this.postUrl) break;\n await new Promise((r) => setTimeout(r, 100));\n }\n }\n const postUrl = this.postUrl || this.baseUrl;\n const resp = await fetch(postUrl, {\n method: \"POST\",\n headers: { ...this.headers, \"Content-Type\": \"application/json\" },\n body: JSON.stringify(msg),\n });\n if (!resp.ok) throw new Error(`SSE POST ${resp.status}`);\n try {\n const data = (await resp.json()) as Record<string, unknown>;\n if (data && typeof data === \"object\" && (\"result\" in data || \"error\" in data)) {\n this.enqueue(data);\n }\n } catch {\n /* response will come via SSE stream */\n }\n }\n\n async recv(): Promise<Record<string, unknown>> {\n if (this.queue.length) return this.queue.shift()!;\n return new Promise((resolve) => this.waiters.push(resolve));\n }\n}\n\nclass WsTransport implements Transport {\n kind = \"websocket\";\n url: string;\n headers: Record<string, string>;\n private ws: WebSocket | null = null;\n private queue: Array<Record<string, unknown>> = [];\n private waiters: Array<(v: Record<string, unknown>) => void> = [];\n\n constructor(url: string, headers: Record<string, string>) {\n this.url = url;\n this.headers = headers;\n }\n\n async connect(): Promise<void> {\n const WS = globalThis.WebSocket;\n if (!WS) throw new Error(\"WebSocket is not available in this runtime\");\n this.ws = new WS(this.url);\n this.ws.addEventListener(\"message\", (ev) => {\n try {\n const data = JSON.parse(String((ev as MessageEvent).data)) as Record<string, unknown>;\n const waiter = this.waiters.shift();\n if (waiter) waiter(data);\n else this.queue.push(data);\n } catch {\n /* ignore */\n }\n });\n await new Promise<void>((resolve, reject) => {\n this.ws!.addEventListener(\"open\", () => resolve());\n this.ws!.addEventListener(\"error\", () => reject(new Error(\"WebSocket error\")));\n });\n }\n\n async close(): Promise<void> {\n this.ws?.close();\n this.ws = null;\n }\n\n async send(msg: Record<string, unknown>): Promise<void> {\n if (!this.ws) throw new Error(\"Not connected\");\n this.ws.send(JSON.stringify(msg));\n }\n\n async recv(): Promise<Record<string, unknown>> {\n if (this.queue.length) return this.queue.shift()!;\n return new Promise((resolve) => this.waiters.push(resolve));\n }\n}\n\nexport class MCPClient {\n url: string;\n transport: Transport;\n connected = false;\n private id = 0;\n private pending = new Map<\n string,\n { resolve: (v: Record<string, unknown>) => void; reject: (e: unknown) => void }\n >();\n capabilities: Record<string, unknown> = {};\n tools: Array<Record<string, unknown>> = [];\n resources: Array<Record<string, unknown>> = [];\n private headers: Record<string, string>;\n\n constructor(url: string, headers: Record<string, string> | null = null) {\n this.url = url;\n this.headers = headers ?? {};\n this.transport = MCPClient.createTransport(url, this.headers);\n }\n\n static createTransport(url: string, headers: Record<string, string>): Transport {\n if (url.startsWith(\"stdio:\") || url === \"stdio\") {\n throw new Error(\"stdio MCP transport is not supported (cloud deployments use SSE/HTTP/WebSocket)\");\n }\n if (url.startsWith(\"ws://\") || url.startsWith(\"wss://\")) return new WsTransport(url, headers);\n if (\n url.startsWith(\"sse+http://\") ||\n url.startsWith(\"sse+https://\") ||\n url.endsWith(\"/events\") ||\n url.endsWith(\"/sse\")\n ) {\n const clean = url.replace(\"sse+http://\", \"http://\").replace(\"sse+https://\", \"https://\");\n return new SseTransport(clean, headers);\n }\n if (url.startsWith(\"http://\") || url.startsWith(\"https://\")) return new HttpTransport(url, headers);\n throw new Error(`Unsupported URL: ${url} (use http(s)://, ws(s)://, or .../sse)`);\n }\n\n private nextId(): string {\n this.id += 1;\n return String(this.id);\n }\n\n private async recvLoop(): Promise<void> {\n while (this.connected) {\n const msg = await this.transport.recv();\n if (!msg) continue;\n const mid = msg.id != null ? String(msg.id) : null;\n if (mid && (\"result\" in msg || \"error\" in msg)) {\n const fut = this.pending.get(mid);\n this.pending.delete(mid);\n fut?.resolve(msg);\n }\n }\n }\n\n private async rpc(\n method: string,\n params: Record<string, unknown> | null = null,\n timeout = 60_000,\n ): Promise<unknown> {\n const mid = this.nextId();\n const payload = { jsonrpc: \"2.0\", id: mid, method, params: params ?? {} };\n if (this.transport instanceof HttpTransport) {\n const msg = await this.transport.request(payload);\n if (msg.error) throw MCPError.fromJsonrpc(msg.error as Record<string, unknown>);\n return msg.result ?? {};\n }\n const msg = await new Promise<Record<string, unknown>>((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pending.delete(mid);\n reject(new Error(`MCP RPC '${method}' timed out after ${timeout}ms`));\n }, timeout);\n this.pending.set(mid, {\n resolve: (v) => {\n clearTimeout(timer);\n resolve(v);\n },\n reject,\n });\n void this.transport.send(payload).catch((e) => {\n clearTimeout(timer);\n this.pending.delete(mid);\n reject(e);\n });\n });\n if (msg.error) throw MCPError.fromJsonrpc(msg.error as Record<string, unknown>);\n return msg.result ?? {};\n }\n\n private async notify(method: string, params: Record<string, unknown> | null = null): Promise<void> {\n await this.transport.send({ jsonrpc: \"2.0\", method, params: params ?? {} });\n }\n\n async connect(): Promise<void> {\n await this.transport.connect();\n if (!(this.transport instanceof HttpTransport)) {\n this.connected = true;\n void this.recvLoop();\n }\n try {\n const init = (await this.rpc(\"initialize\", {\n protocolVersion: \"2024-11-05\",\n capabilities: { roots: { listChanged: true }, sampling: {} },\n clientInfo: { name: \"context-engine\", version: __version__ },\n })) as Record<string, unknown>;\n this.capabilities = (init.capabilities as Record<string, unknown>) ?? {};\n await this.notify(\"notifications/initialized\");\n this.connected = true;\n } catch (e) {\n await this.close();\n throw e;\n }\n }\n\n async close(): Promise<void> {\n this.connected = false;\n for (const [, fut] of this.pending) fut.reject(new Error(\"closed\"));\n this.pending.clear();\n try {\n await this.transport.close();\n } catch {\n /* ignore */\n }\n }\n\n async listTools(): Promise<Array<Record<string, unknown>>> {\n const res = (await this.rpc(\"tools/list\")) as Record<string, unknown>;\n this.tools = (res.tools as Array<Record<string, unknown>>) ?? [];\n return this.tools;\n }\n\n async listResources(): Promise<Array<Record<string, unknown>>> {\n try {\n const res = (await this.rpc(\"resources/list\", null, 10_000)) as Record<string, unknown>;\n this.resources = (res.resources as Array<Record<string, unknown>>) ?? [];\n } catch {\n this.resources = [];\n }\n return this.resources;\n }\n\n async callTool(toolName: string, arguments_: Record<string, unknown>, timeout = 120_000): Promise<unknown> {\n return this.rpc(\"tools/call\", { name: toolName, arguments: arguments_ }, timeout);\n }\n\n async ping(): Promise<boolean> {\n try {\n await this.rpc(\"ping\", {}, 10_000);\n return true;\n } catch {\n return false;\n }\n }\n\n async callToolWithReconnect(\n toolName: string,\n arguments_: Record<string, unknown>,\n timeout = 120_000,\n ): Promise<unknown> {\n try {\n if (!this.connected) throw new Error(\"Not connected\");\n return await this.callTool(toolName, arguments_, timeout);\n } catch (e) {\n console.warn(`[MCP] Connection issue during call_tool(${toolName}), reconnecting:`, e);\n try {\n await this.reconnect();\n return await this.callTool(toolName, arguments_, timeout);\n } catch (retryErr) {\n throw new Error(`Reconnect failed: ${retryErr}`, { cause: e });\n }\n }\n }\n\n async reconnect(): Promise<void> {\n const url = this.url;\n let headers: Record<string, string> = {};\n if (this.transport instanceof HttpTransport) {\n headers = this.transport.getBaseHeaders();\n delete headers[\"Content-Type\"];\n delete headers.Accept;\n } else if (this.transport instanceof SseTransport || this.transport instanceof WsTransport) {\n headers = { ...this.transport.headers };\n }\n try {\n await this.close();\n } catch {\n /* ignore */\n }\n this.id = 0;\n this.pending.clear();\n this.transport = MCPClient.createTransport(url, headers);\n await this.connect();\n await this.listTools();\n }\n}\n\nexport class MCPRegistry {\n private clients = new Map<string, MCPClient>();\n private healthTask: ReturnType<typeof setInterval> | null = null;\n\n async connect(\n name: string,\n url: string,\n headers: Record<string, string> | null = null,\n token: string | null = null,\n ): Promise<void> {\n this.clients.delete(name);\n const hdrs = { ...(headers ?? {}) };\n if (token) hdrs.Authorization = hdrs.Authorization ?? `Bearer ${token}`;\n const client = new MCPClient(url, hdrs);\n await client.connect();\n await client.listTools();\n this.clients.set(name, client);\n if (!this.healthTask) {\n this.healthTask = setInterval(() => void this.healthLoopOnce(), 60_000);\n }\n }\n\n private async healthLoopOnce(): Promise<void> {\n for (const [name, client] of [...this.clients.entries()]) {\n if (!client.connected) continue;\n try {\n const alive = await client.ping();\n if (!alive) await client.reconnect();\n } catch (e) {\n console.warn(`[MCP Health] ${name} health check error:`, e);\n try {\n await client.reconnect();\n } catch {\n this.clients.delete(name);\n }\n }\n }\n }\n\n get(name: string): MCPClient {\n const c = this.clients.get(name);\n if (!c) throw new Error(`Unknown MCP server: '${name}'`);\n return c;\n }\n\n has(name: string): boolean {\n return this.clients.has(name);\n }\n\n async disconnect(name: string): Promise<void> {\n const c = this.clients.get(name);\n this.clients.delete(name);\n if (c) {\n try {\n await c.close();\n } catch {\n /* ignore */\n }\n }\n }\n\n async shutdown(): Promise<void> {\n if (this.healthTask) {\n clearInterval(this.healthTask);\n this.healthTask = null;\n }\n for (const name of [...this.clients.keys()]) await this.disconnect(name);\n }\n}\n\nexport class PromptevMCP {\n clients = new MCPRegistry();\n\n async addServer(\n name: string,\n url: string,\n opts: { token?: string | null; headers?: Record<string, string> | null } = {},\n ): Promise<void> {\n await this.clients.connect(name, url, opts.headers ?? null, opts.token ?? null);\n }\n\n async shutdown(): Promise<void> {\n await this.clients.shutdown();\n }\n}\n","import type { ToolConfig, ToolKind } from \"./config.js\";\n\nexport interface CanonicalTool {\n id: string | null;\n kind: ToolKind;\n callName: string;\n displayName: string;\n description: string;\n paramsSchema: Record<string, unknown>;\n requiresApproval: boolean;\n approvalPolicy: Record<string, unknown>;\n sourceId: string | null;\n acl: string[] | null;\n raw: Record<string, unknown>;\n}\n\nfunction httpParamsSchema(config: Record<string, unknown>): Record<string, unknown> {\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n for (const key of [\"llmParameters\", \"llmQueryParameters\"]) {\n const src = (config[key] as Record<string, unknown> | undefined) ?? {};\n if (!src || typeof src !== \"object\") continue;\n Object.assign(properties, (src.properties as Record<string, unknown> | undefined) ?? {});\n const req = src.required;\n if (Array.isArray(req)) required.push(...req.map(String));\n }\n return { type: \"object\", properties, required };\n}\n\nfunction expandMcpTools(tc: ToolConfig): CanonicalTool[] {\n const config = tc.config ?? {};\n const discovered = (config.discovered_tools as Array<Record<string, unknown>> | undefined) ?? [];\n if (!discovered.length) {\n return [\n {\n id: tc.id ?? null,\n kind: \"mcp\",\n callName: `mcp_${tc.name}`,\n displayName: tc.name,\n description: tc.description || \"MCP tool\",\n paramsSchema: { type: \"object\", properties: {}, required: [] },\n requiresApproval: tc.requiresApproval,\n approvalPolicy: tc.approvalPolicy,\n sourceId: tc.sourceId,\n acl: tc.acl,\n raw: config,\n },\n ];\n }\n const tools: CanonicalTool[] = [];\n for (const dt of discovered) {\n if (dt.enabled === false) continue;\n const name = String(dt.name ?? \"unknown\");\n const schema = (dt.inputSchema as Record<string, unknown> | undefined) ??\n (dt.input_schema as Record<string, unknown> | undefined) ?? {\n type: \"object\",\n properties: {},\n required: [],\n };\n const toolApproval = dt.requires_approval as boolean | undefined;\n const toolApprovalPolicy = dt.approval_policy as Record<string, unknown> | undefined;\n tools.push({\n id: tc.id ?? null,\n kind: \"mcp\",\n callName: `mcp_${name}`,\n displayName: name,\n description: String(dt.description ?? `MCP tool: ${name}`),\n paramsSchema: schema,\n requiresApproval: toolApproval !== undefined ? Boolean(toolApproval) : tc.requiresApproval,\n approvalPolicy: toolApprovalPolicy ?? tc.approvalPolicy,\n sourceId: tc.sourceId,\n acl: tc.acl,\n raw: { ...config, tool_name: name },\n });\n }\n return tools;\n}\n\nexport function canonicalFromConfig(tc: ToolConfig): CanonicalTool[] {\n if (tc.kind === \"http\") {\n return [\n {\n id: tc.id ?? null,\n kind: \"http\",\n callName: `http_${tc.name}`,\n displayName: tc.name,\n description: tc.description || `Execute HTTP request: ${tc.name}`,\n paramsSchema: httpParamsSchema(tc.config ?? {}),\n requiresApproval: tc.requiresApproval,\n approvalPolicy: tc.approvalPolicy,\n sourceId: tc.sourceId,\n acl: tc.acl,\n raw: tc.config ?? {},\n },\n ];\n }\n if (tc.kind === \"db\") {\n return [\n {\n id: tc.id ?? null,\n kind: \"db\",\n callName: `db_${tc.name}`,\n displayName: tc.name,\n description: tc.description || `Query database: ${tc.name}`,\n paramsSchema: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"Either 'describe:table1,table2' to get column details, or a SQL query to execute\",\n },\n },\n required: [\"query\"],\n },\n requiresApproval: tc.requiresApproval,\n approvalPolicy: tc.approvalPolicy,\n sourceId: tc.sourceId,\n acl: tc.acl,\n raw: tc.config ?? {},\n },\n ];\n }\n if (tc.kind === \"mcp\") return expandMcpTools(tc);\n throw new Error(\n `canonicalFromConfig does not support kind=${JSON.stringify(tc.kind)}; function ` +\n \"tools have no serializable config — build them with functionTool(fn) instead\",\n );\n}\n\nexport function findTool(tools: CanonicalTool[], callName: string): CanonicalTool | undefined {\n return tools.find((t) => t.callName === callName);\n}\n","export { compute, getDocumentText, listDocuments, queryStructured } from \"./actions.js\";\nexport type {\n ContextEngineConfigInit,\n EmbeddingConfig,\n FusionConfig,\n GraphConfig,\n LLMConfig,\n RerankerConfig,\n StorageConfig,\n} from \"./config.js\";\nexport { ContextEngineConfig } from \"./config.js\";\nexport { decryptDict, encryptDict, getSecretKey } from \"./crypto.js\";\nexport { runMigrate } from \"./db.js\";\nexport { ContextEngine } from \"./engine.js\";\nexport {\n ApprovalExpired,\n ApprovalNotPending,\n CodeExecutionError,\n CodeExecutionTimeout,\n DocumentNotFoundError,\n EngineActionError,\n ExtraMissingError,\n GraphLegUnavailable,\n} from \"./errors.js\";\nexport { Extracted, extract } from \"./extraction/index.js\";\nexport { DEFAULT_LEG_WEIGHT, rrfFuse } from \"./fusion.js\";\nexport type { Hooks } from \"./hooks.js\";\nexport { emitError, emitToolCall, emitUsage } from \"./hooks.js\";\nexport { createMcpApp } from \"./mcp.js\";\nexport type { EmbedKind } from \"./providers/index.js\";\nexport { buildEmbedder, buildLlmClient, callLlm, Embedder, LLMClient, rerank } from \"./providers/index.js\";\nexport type { RedactionRuleInit } from \"./redaction.js\";\nexport { applyRedaction, RedactionPolicy, RedactionRule } from \"./redaction.js\";\nexport type { TaskRunner, TaskStatus } from \"./runner.js\";\nexport { CeleryRunner, InProcessRunner } from \"./runner.js\";\nexport type { Hit, SearchResult } from \"./search.js\";\nexport { redactHits, runSearch } from \"./search.js\";\nexport type { Principals, Trusted, Unset } from \"./sentinels.js\";\nexport { resolvePrincipals, TRUSTED, UNSET } from \"./sentinels.js\";\nexport type { ChunkRow, SearchScope, StorageBackend } from \"./storage.js\";\nexport { PostgresBackend } from \"./storage.js\";\nexport type { ExtractionResult } from \"./structured.js\";\nexport { EXTRACTION_VERSION, extractStructuredData, resolveFields, upsertRegistry } from \"./structured.js\";\nexport type { ApprovalRecord } from \"./tools/approval.js\";\nexport { resolveApproval, shouldRequireApproval } from \"./tools/approval.js\";\nexport type { ToolKind } from \"./tools/config.js\";\nexport { configSchema, ToolConfig } from \"./tools/config.js\";\nexport { functionTool } from \"./tools/executors/function.js\";\nexport type { DocumentReport, IngestReport, UsageEvent } from \"./usage.js\";\nexport { graphUnits, unitsForFile } from \"./usage.js\";\nexport { __version__ } from \"./version.js\";\n","import { ExtraMissingError } from \"./errors.js\";\nimport { requireExtra } from \"./extras.js\";\nimport {\n type PrincipalsFn,\n registerToolGateway,\n resolvePrincipalsFn,\n SCOPE_NOTE,\n} from \"./tools/mcp-tools.js\";\nimport { __version__ } from \"./version.js\";\n\ntype Engine = {\n config: { llm?: unknown; enableCodeExecution?: boolean };\n search: (query: string, opts?: Record<string, unknown>) => Promise<{ hits: unknown[]; usage?: unknown }>;\n getDocument: (id: string, opts?: Record<string, unknown>) => Promise<unknown>;\n queryStructured?: (question: string, opts?: Record<string, unknown>) => Promise<unknown>;\n compute?: (instruction: string, opts?: Record<string, unknown>) => Promise<unknown>;\n searchTools: (query: string, opts?: Record<string, unknown>) => Promise<unknown[]>;\n executeTool: (\n name: string,\n args: Record<string, unknown> | null,\n opts?: Record<string, unknown>,\n ) => Promise<Record<string, unknown>>;\n};\n\nfunction asMcpResult(data: unknown): { content: Array<{ type: \"text\"; text: string }> } {\n return { content: [{ type: \"text\", text: JSON.stringify(data) }] };\n}\n\nexport async function createMcpApp(\n engine: Engine,\n opts: { principals: PrincipalsFn },\n): Promise<\n ((req: import(\"node:http\").IncomingMessage, res: import(\"node:http\").ServerResponse) => Promise<void>) & {\n mcp: unknown;\n }\n> {\n if (!opts?.principals) {\n throw new TypeError(\"createMcpApp requires principals\");\n }\n\n let McpServer: new (info: {\n name: string;\n version: string;\n }) => {\n tool: (...args: unknown[]) => unknown;\n connect: (t: unknown) => Promise<void>;\n };\n let StreamableHTTPServerTransport: new (opts: {\n sessionIdGenerator?: undefined;\n }) => {\n handleRequest: (req: unknown, res: unknown, body?: unknown) => Promise<void>;\n };\n try {\n const serverMod = await requireExtra<{ McpServer: typeof McpServer }>(\n \"@modelcontextprotocol/sdk/server/mcp.js\",\n \"mcp\",\n \"MCP server\",\n );\n const httpMod = await requireExtra<{\n StreamableHTTPServerTransport: typeof StreamableHTTPServerTransport;\n }>(\"@modelcontextprotocol/sdk/server/streamableHttp.js\", \"mcp\", \"MCP server\");\n McpServer = serverMod.McpServer;\n StreamableHTTPServerTransport = httpMod.StreamableHTTPServerTransport;\n } catch (exc) {\n if (exc instanceof ExtraMissingError) throw exc;\n throw new ExtraMissingError(\"mcp\", \"@modelcontextprotocol/sdk\", \"MCP server\");\n }\n\n const mcp = new McpServer({ name: \"context-engine\", version: __version__ });\n\n const tool = (\n name: string,\n description: string,\n schema: Record<string, unknown>,\n handler: (args: Record<string, unknown>) => Promise<unknown>,\n ) => {\n mcp.tool(name, description, schema, async (args: Record<string, unknown>) =>\n asMcpResult(await handler(args)),\n );\n };\n\n tool(\n \"search_knowledge_base\",\n `Hybrid search (full-text + trigram + vector, RRF-fused) over the ingested corpus. Returns the top-matching chunks with their source document.${SCOPE_NOTE}`,\n {\n query: { type: \"string\" },\n source_ids: { type: \"array\", items: { type: \"string\" } },\n top_k: { type: \"number\" },\n mode: { type: \"string\", enum: [\"hybrid\", \"graph\"] },\n },\n async (args) => {\n const callerPrincipals = await resolvePrincipalsFn(opts.principals);\n const result = await engine.search(String(args.query ?? \"\"), {\n sourceIds: args.source_ids,\n principals: callerPrincipals,\n topK: args.top_k ?? 10,\n mode: args.mode ?? \"hybrid\",\n });\n return {\n hits: (result.hits ?? []).map((hit) => {\n const h = hit as Record<string, unknown>;\n return {\n document_name: h.document_name ?? h.documentName,\n chunk_text: h.chunk_text ?? h.chunkText,\n score: h.score,\n source_id: h.source_id ?? h.sourceId,\n };\n }),\n usage: result.usage,\n };\n },\n );\n\n tool(\n \"get_document\",\n `Fetch one document's full text and metadata by id.${SCOPE_NOTE}`,\n { document_id: { type: \"string\" } },\n async (args) => {\n const callerPrincipals = await resolvePrincipalsFn(opts.principals);\n return engine.getDocument(String(args.document_id), { principals: callerPrincipals });\n },\n );\n\n if (engine.config.llm != null) {\n tool(\n \"query_structured\",\n `Answer a question against documents' extracted structured data (only documents with structured data are candidates).${SCOPE_NOTE}`,\n { question: { type: \"string\" }, source_ids: { type: \"array\", items: { type: \"string\" } } },\n async (args) => {\n const callerPrincipals = await resolvePrincipalsFn(opts.principals);\n if (!engine.queryStructured) throw new Error(\"queryStructured is not available on this engine\");\n return engine.queryStructured(String(args.question), {\n sourceIds: args.source_ids,\n principals: callerPrincipals,\n });\n },\n );\n if (engine.config.enableCodeExecution) {\n tool(\n \"compute\",\n `Run LLM-authored JavaScript over in-scope spreadsheet documents and return the computed result.${SCOPE_NOTE}`,\n { instruction: { type: \"string\" }, source_ids: { type: \"array\", items: { type: \"string\" } } },\n async (args) => {\n const callerPrincipals = await resolvePrincipalsFn(opts.principals);\n if (!engine.compute) throw new Error(\"compute is not available on this engine\");\n return engine.compute(String(args.instruction), {\n sourceIds: args.source_ids,\n principals: callerPrincipals,\n });\n },\n );\n }\n }\n\n registerToolGateway(\n {\n tool: (name, description, schema, handler) => {\n tool(name, description, schema, async (args) => handler(args as never));\n },\n },\n engine,\n opts.principals,\n );\n\n const handler = (async (\n req: import(\"node:http\").IncomingMessage,\n res: import(\"node:http\").ServerResponse,\n ) => {\n const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });\n await mcp.connect(transport);\n await transport.handleRequest(req, res);\n }) as ((\n req: import(\"node:http\").IncomingMessage,\n res: import(\"node:http\").ServerResponse,\n ) => Promise<void>) & { mcp: unknown };\n handler.mcp = mcp;\n return handler;\n}\n","export type PrincipalsFn = () => unknown | Promise<unknown>;\n\nexport const SCOPE_NOTE =\n \" Results are scoped to the caller's permissions (resolved by the server's \" +\n \"injected principals dependency — never a caller-supplied argument) and to \" +\n \"the given source_ids, if any.\";\n\nexport async function resolvePrincipalsFn(principals: PrincipalsFn): Promise<string[] | null> {\n const result = await Promise.resolve(principals());\n return result as string[] | null;\n}\n\nexport type McpToolHost = {\n tool(\n name: string,\n description: string,\n schema: Record<string, unknown>,\n handler: (...args: never[]) => Promise<unknown>,\n ): unknown;\n};\n\nexport function registerToolGateway(\n mcp: McpToolHost,\n engine: {\n searchTools: (query: string, opts?: Record<string, unknown>) => Promise<unknown[]>;\n executeTool: (\n name: string,\n args: Record<string, unknown> | null,\n opts?: Record<string, unknown>,\n ) => Promise<Record<string, unknown>>;\n },\n principals: PrincipalsFn,\n): void {\n mcp.tool(\n \"search_tools\",\n \"Keyword search over the tools this deployment has registered \" +\n \"(http/db/mcp/function) — the ACL-visible name, kind, description, \" +\n \"and JSON Schema params of each match, so a caller can discover what \" +\n \"it can then invoke with `execute_tool`.\" +\n SCOPE_NOTE,\n { query: { type: \"string\" }, limit: { type: \"number\" } },\n async (...raw: never[]) => {\n const args = (raw[0] ?? {}) as { query?: string; limit?: number };\n const callerPrincipals = await resolvePrincipalsFn(principals);\n const tools = await engine.searchTools(String(args.query ?? \"\"), {\n principals: callerPrincipals,\n limit: args.limit ?? 10,\n });\n return { tools };\n },\n );\n\n mcp.tool(\n \"execute_tool\",\n \"Governed execution of a tool previously discovered via \" +\n \"`search_tools` (ACL check, approval gate, audit). Returns \" +\n \"`{result, usage}` on success, or an `approval_required` payload \" +\n \"when the call needs a human approval that isn't already granted — \" +\n \"the caller must not retry until that approval resolves.\" +\n SCOPE_NOTE,\n { name: { type: \"string\" }, args: { type: \"object\" } },\n async (...raw: never[]) => {\n const body = (raw[0] ?? {}) as { name?: string; args?: Record<string, unknown> };\n const callerPrincipals = await resolvePrincipalsFn(principals);\n return engine.executeTool(String(body.name), body.args ?? null, {\n principals: callerPrincipals,\n source: \"mcp\",\n });\n },\n );\n}\n","/** Pluggable third-party provider adapters: embeddings, LLM, reranker. */\n\nexport { pollEmbeddingBatch, submitEmbeddingBatch } from \"./batch.js\";\nexport { buildEmbedder, Embedder, type EmbedKind } from \"./embeddings.js\";\nexport { buildLlmClient, callLlm, LLMClient } from \"./llm.js\";\nexport { rerank } from \"./reranker.js\";\n","/**\n * Task execution abstraction — where an `ingest()` call actually runs.\n *\n * Nothing in this package REQUIRES a task queue: `ContextEngine.ingest()` is\n * just an async function a caller can await directly. `TaskRunner` is the\n * seam for callers who want fire-and-forget submission with a pollable\n * status instead — `InProcessRunner` (the default) is enough for a\n * single-process service; `CeleryRunner` is a documented adapter seam\n * (not a working integration).\n */\nimport { randomUUID } from \"node:crypto\";\n\nexport interface TaskStatus {\n state: \"running\" | \"done\" | \"failed\" | string;\n error: string | null;\n result: unknown;\n}\n\nexport interface TaskRunner {\n /** Schedule `factory()` to run, returning a task id. Takes a zero-argument CALLABLE — not a bare Promise — because some runners need to construct it lazily. */\n submit(factory: () => Promise<unknown>): string;\n /** Return `{state, error, result}`. Throws for an unknown task id. */\n status(id: string): TaskStatus;\n}\n\nexport class InProcessRunner implements TaskRunner {\n private readonly registry = new Map<string, TaskStatus>();\n /** Kept so the Promise isn't garbage-collected mid-flight. */\n private readonly tasks = new Map<string, Promise<void>>();\n\n submit(factory: () => Promise<unknown>): string {\n const id = randomUUID();\n this.registry.set(id, { state: \"running\", error: null, result: null });\n const task = Promise.resolve()\n .then(() => factory())\n .then((result) => {\n this.registry.set(id, { state: \"done\", error: null, result });\n })\n .catch((err) => {\n this.registry.set(id, { state: \"failed\", error: String(err), result: null });\n });\n this.tasks.set(id, task);\n return id;\n }\n\n status(id: string): TaskStatus {\n const row = this.registry.get(id);\n if (!row) {\n const err = new Error(`unknown task id: ${JSON.stringify(id)}`);\n err.name = \"KeyError\";\n throw err;\n }\n return { ...row };\n }\n}\n\n/**\n * Adapter seam for callers who already run a distributed task queue —\n * NOT a working integration. `submit()`/`status()` throw so nobody\n * mistakes this stub for something that works out of the box.\n */\nexport class CeleryRunner implements TaskRunner {\n celeryApp: unknown;\n taskName: string;\n\n constructor(celeryApp: unknown, taskName: string) {\n this.celeryApp = celeryApp;\n this.taskName = taskName;\n }\n\n submit(_factory?: () => Promise<unknown>): string {\n const err = new Error(\n \"CeleryRunner is a documented adapter seam, not a working integration — \" +\n \"wire your task queue to call ContextEngine.ingest\",\n );\n err.name = \"NotImplementedError\";\n throw err;\n }\n\n status(_id?: string): TaskStatus {\n const err = new Error(\n \"CeleryRunner is a documented adapter seam, not a working integration — \" +\n \"wire your task queue to call ContextEngine.ingest\",\n );\n err.name = \"NotImplementedError\";\n throw err;\n }\n}\n"]}