@lov3kaizen/agentsea-cache 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +323 -0
- package/dist/BaseMatchStrategy-1E1SHaUt.d.ts +60 -0
- package/dist/SemanticCache-vysguwUQ.d.ts +65 -0
- package/dist/SimilarityEngine-Cwv_mF9a.d.ts +41 -0
- package/dist/analytics/index.d.ts +123 -0
- package/dist/analytics/index.js +275 -0
- package/dist/analytics/index.js.map +1 -0
- package/dist/cache.types-DMuyQseO.d.ts +99 -0
- package/dist/index.d.ts +47 -0
- package/dist/index.js +3301 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/agentsea/index.d.ts +103 -0
- package/dist/integrations/agentsea/index.js +201 -0
- package/dist/integrations/agentsea/index.js.map +1 -0
- package/dist/integrations/gateway/index.d.ts +98 -0
- package/dist/integrations/gateway/index.js +205 -0
- package/dist/integrations/gateway/index.js.map +1 -0
- package/dist/invalidation/index.d.ts +113 -0
- package/dist/invalidation/index.js +360 -0
- package/dist/invalidation/index.js.map +1 -0
- package/dist/store.types-BQy5Yyz9.d.ts +111 -0
- package/dist/stores/index.d.ts +138 -0
- package/dist/stores/index.js +1147 -0
- package/dist/stores/index.js.map +1 -0
- package/dist/strategies/index.d.ts +36 -0
- package/dist/strategies/index.js +280 -0
- package/dist/strategies/index.js.map +1 -0
- package/dist/streaming/index.d.ts +206 -0
- package/dist/streaming/index.js +794 -0
- package/dist/streaming/index.js.map +1 -0
- package/package.json +108 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/utils.ts","../src/analytics/CacheAnalytics.ts","../src/core/CacheKey.ts","../src/core/SemanticCache.ts","../src/stores/BaseCacheStore.ts","../src/stores/MemoryCacheStore.ts","../src/similarity/metrics/SimilarityMetrics.ts","../src/stores/RedisCacheStore.ts","../src/stores/SQLiteCacheStore.ts","../src/stores/TieredCacheStore.ts","../src/stores/PineconeCacheStore.ts","../src/strategies/BaseMatchStrategy.ts","../src/strategies/ExactMatchStrategy.ts","../src/strategies/SemanticMatchStrategy.ts","../src/strategies/HybridMatchStrategy.ts","../src/similarity/SimilarityEngine.ts","../src/streaming/ChunkBuffer.ts","../src/streaming/StreamRecorder.ts","../src/streaming/StreamReplayer.ts","../src/streaming/StreamCache.ts","../src/invalidation/InvalidationManager.ts"],"names":["DEFAULT_CONFIG","dotProduct","magnitude","EventEmitter","latencyMs","entry"],"mappings":";;;;;;AAWO,SAAS,WAAW,MAAA,EAAyB;AAClD,EAAA,MAAM,EAAA,GAAK,OAAO,EAAE,CAAA;AACpB,EAAA,OAAO,MAAA,GAAS,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,GAAK,EAAA;AACtC;AAKO,SAAS,GAAA,GAAc;AAC5B,EAAA,OAAO,KAAK,GAAA,EAAI;AAClB;AAKO,SAAS,SAAA,CAAU,WAAmB,UAAA,EAA6B;AACxE,EAAA,IAAI,UAAA,IAAc,GAAG,OAAO,KAAA;AAC5B,EAAA,OAAO,GAAA,EAAI,GAAI,SAAA,GAAY,UAAA,GAAa,GAAA;AAC1C;AAcO,SAAS,kBAAkB,KAAA,EAIvB;AAET,EAAA,MAAM,UAAA,GAAA,CAAc,KAAA,CAAM,SAAA,EAAW,MAAA,IAAU,CAAA,IAAK,CAAA;AAGpD,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,MAAA;AAAA,IACzC,CAAC,GAAA,EAAK,CAAA,KAAM,OAAO,CAAA,CAAE,OAAA,EAAS,UAAU,CAAA,IAAK,CAAA;AAAA,IAC7C;AAAA,GACF;AACA,EAAA,MAAM,YAAA,GAAA,CAAgB,KAAA,CAAM,QAAA,CAAS,OAAA,EAAS,UAAU,CAAA,IAAK,CAAA;AAG7D,EAAA,MAAM,YAAA,GAAe,GAAA;AAErB,EAAA,OAAO,UAAA,GAAa,cAAc,YAAA,GAAe,YAAA;AACnD;AAoEO,SAAS,UAAA,CAAW,QAAkB,CAAA,EAAmB;AAC9D,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA;AAChC,EAAA,MAAM,MAAA,GAAS,CAAC,GAAG,MAAM,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAC/C,EAAA,MAAM,QAAQ,IAAA,CAAK,IAAA,CAAM,IAAI,GAAA,GAAO,MAAA,CAAO,MAAM,CAAA,GAAI,CAAA;AACrD,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAC,CAAA;AAClC;AAKO,SAAS,KAAK,MAAA,EAA0B;AAC7C,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA;AAChC,EAAA,OAAO,MAAA,CAAO,OAAO,CAAC,CAAA,EAAG,MAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,GAAI,MAAA,CAAO,MAAA;AACpD;;;AC1HA,IAAM,qBAAA,GAAsD;AAAA,EAC1D,QAAA,EAAU,EAAE,UAAA,EAAY,KAAA,EAAQ,aAAa,IAAA,EAAK;AAAA,EAClD,aAAA,EAAe,EAAE,UAAA,EAAY,KAAA,EAAS,aAAa,IAAA,EAAO;AAAA,EAC1D,aAAA,EAAe,EAAE,UAAA,EAAY,IAAA,EAAM,aAAa,IAAA,EAAK;AAAA,EACrD,OAAA,EAAS,EAAE,UAAA,EAAY,IAAA,EAAM,aAAa,IAAA,EAAK;AAAA,EAC/C,eAAA,EAAiB,EAAE,UAAA,EAAY,IAAA,EAAQ,aAAa,KAAA,EAAO;AAAA,EAC3D,eAAA,EAAiB,EAAE,UAAA,EAAY,KAAA,EAAO,aAAa,KAAA,EAAM;AAAA,EACzD,0BAAA,EAA4B,EAAE,UAAA,EAAY,IAAA,EAAO,aAAa,KAAA,EAAM;AAAA,EACpE,mBAAA,EAAqB,EAAE,UAAA,EAAY,IAAA,EAAO,aAAa,KAAA,EAAM;AAAA,EAC7D,gBAAA,EAAkB,EAAE,UAAA,EAAY,KAAA,EAAS,aAAa,MAAA,EAAQ;AAAA,EAC9D,OAAA,EAAS,EAAE,UAAA,EAAY,IAAA,EAAO,aAAa,KAAA;AAC7C,CAAA;AAKA,IAAM,cAAA,GAA4C;AAAA,EAChD,OAAA,EAAS,IAAA;AAAA,EACT,UAAA,EAAY,CAAA;AAAA,EACZ,kBAAkB,KAAA,GAAQ,CAAA;AAAA;AAAA,EAC1B,eAAA,EAAiB,GAAA;AAAA;AAAA,EACjB,YAAA,EAAc;AAChB,CAAA;AAoBO,IAAM,iBAAN,MAAqB;AAAA,EAClB,MAAA;AAAA,EACA,IAAA,GAAO,CAAA;AAAA,EACP,MAAA,GAAS,CAAA;AAAA,EACT,SAAA,GAAY,CAAA;AAAA,EACZ,YAAA,GAAe,CAAA;AAAA,EACf,WAAA,GAAc,CAAA;AAAA,EACd,gBAAA,GAAmB,CAAA;AAAA,EACnB,iBAAA,GAAoB,CAAA;AAAA,EACpB,YAAsB,EAAC;AAAA,EACvB,SAAA,uBAAgB,GAAA,EAAoB;AAAA,EACpC,aAAA,uBAAoB,GAAA,EAAoB;AAAA,EACxC,YAAwB,EAAC;AAAA,EACzB,aAA0B,EAAC;AAAA,EAC3B,QAAA,GAAW,CAAA;AAAA,EAEnB,YAAY,MAAA,EAAmC;AAC7C,IAAA,IAAA,CAAK,MAAA,GAAS,EAAE,GAAG,cAAA,EAAgB,GAAG,MAAA,EAAO;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,CACE,KAAA,EACA,IAAA,EACA,SAAA,EACM;AACN,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS;AAC1B,IAAA,IAAI,IAAA,CAAK,MAAA,EAAO,GAAI,IAAA,CAAK,OAAO,UAAA,EAAY;AAE5C,IAAA,IAAA,CAAK,IAAA,EAAA;AACL,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,IAAA,CAAK,SAAA,EAAA;AAAA,IACP,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,YAAA,EAAA;AAAA,IACP;AAEA,IAAA,IAAA,CAAK,SAAA,CAAU,KAAK,SAAS,CAAA;AAG7B,IAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,KAAA;AAC7B,IAAA,IAAA,CAAK,eAAe,KAAA,CAAM,WAAA;AAC1B,IAAA,IAAA,CAAK,oBAAoB,KAAA,CAAM,YAAA;AAC/B,IAAA,IAAA,CAAK,qBAAqB,KAAA,CAAM,gBAAA;AAGhC,IAAA,MAAM,aAAa,IAAA,CAAK,SAAA,CAAU,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,IAAK,CAAA;AAC9D,IAAA,IAAA,CAAK,UAAU,GAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,aAAa,CAAC,CAAA;AAGtD,IAAA,IAAI,KAAA,CAAM,SAAS,SAAA,EAAW;AAC5B,MAAA,MAAM,UAAU,IAAA,CAAK,aAAA,CAAc,IAAI,KAAA,CAAM,QAAA,CAAS,SAAS,CAAA,IAAK,CAAA;AACpE,MAAA,IAAA,CAAK,cAAc,GAAA,CAAI,KAAA,CAAM,QAAA,CAAS,SAAA,EAAW,UAAU,CAAC,CAAA;AAAA,IAC9D;AAGA,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK;AAAA,MAClB,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,IAAA;AAAA,MACA,KAAA,EAAO,MAAM,OAAA,CAAQ,KAAA;AAAA,MACrB,SAAA,EAAW,MAAM,QAAA,CAAS,SAAA;AAAA,MAC1B,UAAA,EAAY,MAAM,QAAA,CAAS,UAAA;AAAA,MAC3B,SAAA;AAAA,MACA,aAAa,KAAA,CAAM;AAAA,KACpB,CAAA;AAGD,IAAA,IAAA,CAAK,UAAA,EAAW;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,CACE,SAAA,EACA,MAAA,GAA8B,WAAA,EACxB;AACN,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS;AAC1B,IAAA,IAAI,IAAA,CAAK,MAAA,EAAO,GAAI,IAAA,CAAK,OAAO,UAAA,EAAY;AAE5C,IAAA,IAAA,CAAK,MAAA,EAAA;AACL,IAAA,IAAA,CAAK,SAAA,CAAU,KAAK,SAAS,CAAA;AAG7B,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK;AAAA,MACnB,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,KAAA,EAAO,SAAA;AAAA,MACP,SAAA;AAAA,MACA;AAAA,KACD,CAAA;AAGD,IAAA,IAAA,CAAK,UAAA,EAAW;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,MAAA,EAA0B;AAClC,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS;AAC1B,IAAA,IAAA,CAAK,QAAA,EAAA;AAAA,EACP;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAA4B;AAC1B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,MAAA;AAE/B,IAAA,OAAO;AAAA,MACL,WAAW,IAAA,CAAK,IAAA;AAAA,MAChB,aAAa,IAAA,CAAK,MAAA;AAAA,MAClB,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,cAAc,IAAA,CAAK,YAAA;AAAA,MACnB,OAAA,EAAS,KAAA,GAAQ,CAAA,GAAI,IAAA,CAAK,OAAO,KAAA,GAAQ,CAAA;AAAA,MACzC,YAAA,EAAc,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA;AAAA,MACjC,YAAA,EAAc,UAAA,CAAW,IAAA,CAAK,SAAA,EAAW,EAAE,CAAA;AAAA,MAC3C,YAAA,EAAc,UAAA,CAAW,IAAA,CAAK,SAAA,EAAW,EAAE,CAAA;AAAA,MAC3C,YAAA,EAAc,UAAA,CAAW,IAAA,CAAK,SAAA,EAAW,EAAE,CAAA;AAAA,MAC3C,kBAAkB,IAAA,CAAK,WAAA;AAAA,MACvB,uBAAA,EAAyB,KAAK,oBAAA,EAAqB;AAAA,MACnD,SAAA,EAAW,IAAA,CAAK,YAAA,CAAa,CAAC,CAAA;AAAA,MAC9B,aAAA,EAAe,IAAA,CAAK,gBAAA,CAAiB,CAAC,CAAA;AAAA,MACtC,WAAA,EAAa,KAAK,cAAA;AAAe,KACnC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAA,CAAqB,cAAc,UAAA,EAA+B;AAChE,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,MAAA;AAC/B,IAAA,MAAM,SAAA,GAAY,KAAK,oBAAA,EAAqB;AAG5C,IAAA,MAAM,iBAAA,GAAoB,SAAA,IAAa,IAAA,CAAK,IAAA,IAAQ,CAAA,CAAA;AACpD,IAAA,MAAM,4BAA4B,iBAAA,GAAoB,KAAA;AAEtD,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,WAAA;AAAA,MACR,aAAA,EAAe,KAAA;AAAA,MACf,gBAAgB,IAAA,CAAK,IAAA;AAAA,MACrB,OAAA,EAAS,KAAA,GAAQ,CAAA,GAAI,IAAA,CAAK,OAAO,KAAA,GAAQ,CAAA;AAAA,MACzC,kBAAkB,IAAA,CAAK,gBAAA;AAAA,MACvB,mBAAmB,IAAA,CAAK,iBAAA;AAAA,MACxB,kBAAkB,IAAA,CAAK,WAAA;AAAA,MACvB,yBAAA;AAAA,MACA,qBAAqB,yBAAA,GAA4B,SAAA;AAAA,MACjD,SAAA;AAAA,MACA,gBAAA,EACE,yBAAA,GAA4B,CAAA,GACvB,SAAA,GAAY,4BAA6B,GAAA,GAC1C;AAAA,KACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAA,GAA4C;AAC1C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,MAAA;AAE/B,IAAA,OAAO;AAAA,MACL,WAAA,EAAa,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA;AAAA,MAChC,cAAA,EAAgB,CAAA;AAAA;AAAA,MAChB,cAAA,EAAgB,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA;AAAA,MACnC,eAAA,EAAiB,CAAA;AAAA;AAAA,MACjB,YAAA,EAAc,UAAA,CAAW,IAAA,CAAK,SAAA,EAAW,EAAE,CAAA;AAAA,MAC3C,YAAA,EAAc,UAAA,CAAW,IAAA,CAAK,SAAA,EAAW,EAAE,CAAA;AAAA,MAC3C,YAAA,EAAc,UAAA,CAAW,IAAA,CAAK,SAAA,EAAW,EAAE,CAAA;AAAA,MAC3C,eAAA,EAAiB,QAAQ,IAAA,CAAK,QAAA;AAAA,MAC9B,gBAAA,EAAkB,CAAA;AAAA;AAAA,MAClB,SAAA,EAAW;AAAA,KACb;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,CAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,CAAA;AACd,IAAA,IAAA,CAAK,SAAA,GAAY,CAAA;AACjB,IAAA,IAAA,CAAK,YAAA,GAAe,CAAA;AACpB,IAAA,IAAA,CAAK,WAAA,GAAc,CAAA;AACnB,IAAA,IAAA,CAAK,gBAAA,GAAmB,CAAA;AACxB,IAAA,IAAA,CAAK,iBAAA,GAAoB,CAAA;AACzB,IAAA,IAAA,CAAK,YAAY,EAAC;AAClB,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,IAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AACzB,IAAA,IAAA,CAAK,YAAY,EAAC;AAClB,IAAA,IAAA,CAAK,aAAa,EAAC;AACnB,IAAA,IAAA,CAAK,QAAA,GAAW,CAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,CAAO,SAAyB,MAAA,EAAgB;AAC9C,IAAA,MAAM,IAAA,GAAO,KAAK,UAAA,EAAW;AAE7B,IAAA,IAAI,WAAW,KAAA,EAAO;AACpB,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,MAAA;AAAA,QAChC,CAAC,CAAA,KAAM,OAAO,IAAA,CAAK,CAAwB,CAAA,KAAM;AAAA,OACnD;AACA,MAAA,MAAM,SAAS,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,CAAwB,CAAC,CAAA;AAChE,MAAA,OAAO,CAAA,EAAG,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAC;AAAA,EAAK,MAAA,CAAO,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAAA,IAClD;AAEA,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAA;AAAA,EACrC;AAAA,EAEQ,oBAAA,GAA+B;AACrC,IAAA,IAAI,OAAA,GAAU,CAAA;AAEd,IAAA,KAAA,MAAW,CAAC,KAAA,EAAO,IAAI,CAAA,IAAK,KAAK,SAAA,EAAW;AAC1C,MAAA,MAAM,OAAA,GACJ,KAAK,MAAA,CAAO,YAAA,CAAa,KAAK,CAAA,IAAK,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,SAAS,CAAA;AAGvE,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,gBAAA,IAAoB,IAAA,CAAK,IAAA,IAAQ,CAAA,CAAA;AAC7D,MAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,iBAAA,IAAqB,IAAA,CAAK,IAAA,IAAQ,CAAA,CAAA;AAE/D,MAAA,MAAM,SAAA,GAAa,cAAA,GAAiB,GAAA,GAAQ,OAAA,CAAQ,UAAA,GAAa,IAAA;AACjE,MAAA,MAAM,UAAA,GAAc,eAAA,GAAkB,GAAA,GAAQ,OAAA,CAAQ,WAAA,GAAc,IAAA;AAEpE,MAAA,OAAA,IAAW,SAAA,GAAY,UAAA;AAAA,IACzB;AAGA,IAAA,IAAI,OAAA,KAAY,CAAA,IAAK,IAAA,CAAK,WAAA,GAAc,CAAA,EAAG;AACzC,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,SAAS,CAAA;AACzD,MAAA,OAAA,GACG,IAAA,CAAK,mBAAmB,GAAA,GAAQ,cAAA,CAAe,aAC/C,IAAA,CAAK,iBAAA,GAAoB,MAAQ,cAAA,CAAe,WAAA;AAAA,IACrD;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEQ,aAAa,CAAA,EAAmD;AACtE,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,CAAA,CACvC,GAAA,CAAI,CAAC,CAAC,KAAA,EAAO,IAAI,CAAA,MAAO,EAAE,KAAA,EAAO,IAAA,EAAK,CAAE,CAAA,CACxC,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE,IAAI,CAAA,CAC9B,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,EACf;AAAA,EAEQ,iBACN,CAAA,EAC4C;AAC5C,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,CAAA,CAC3C,GAAA,CAAI,CAAC,CAAC,SAAA,EAAW,IAAI,CAAA,MAAO,EAAE,SAAA,EAAW,IAAA,EAAK,CAAE,CAAA,CAChD,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE,IAAI,CAAA,CAC9B,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,EACf;AAAA,EAEQ,cAAA,GAKL;AACD,IAAA,MAAM,UAAA,uBAAiB,GAAA,EAGrB;AAGF,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,SAAA,EAAW;AAClC,MAAA,MAAM,OAAO,IAAI,IAAA,CAAK,KAAA,CAAM,SAAS,EAAE,QAAA,EAAS;AAChD,MAAA,MAAM,IAAA,GAAO,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA,IAAK;AAAA,QACnC,IAAA,EAAM,CAAA;AAAA,QACN,MAAA,EAAQ,CAAA;AAAA,QACR,WAAW;AAAC,OACd;AACA,MAAA,IAAA,CAAK,IAAA,EAAA;AACL,MAAA,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA;AACnC,MAAA,UAAA,CAAW,GAAA,CAAI,MAAM,IAAI,CAAA;AAAA,IAC3B;AAGA,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,UAAA,EAAY;AACnC,MAAA,MAAM,OAAO,IAAI,IAAA,CAAK,KAAA,CAAM,SAAS,EAAE,QAAA,EAAS;AAChD,MAAA,MAAM,IAAA,GAAO,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA,IAAK;AAAA,QACnC,IAAA,EAAM,CAAA;AAAA,QACN,MAAA,EAAQ,CAAA;AAAA,QACR,WAAW;AAAC,OACd;AACA,MAAA,IAAA,CAAK,MAAA,EAAA;AACL,MAAA,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA;AACnC,MAAA,UAAA,CAAW,GAAA,CAAI,MAAM,IAAI,CAAA;AAAA,IAC3B;AAEA,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,OAAA,EAAS,CAAA,CACnC,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,IAAI,CAAA,MAAO;AAAA,MACtB,IAAA;AAAA,MACA,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,YAAA,EAAc,IAAA,CAAK,IAAA,CAAK,SAAS;AAAA,KACnC,CAAE,EACD,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE,IAAI,CAAA;AAAA,EACnC;AAAA,EAEQ,UAAA,GAAmB;AACzB,IAAA,MAAM,SAAS,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,OAAO,gBAAA,GAAmB,GAAA;AAC3D,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,SAAA,CAAU,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,MAAM,CAAA;AAClE,IAAA,IAAA,CAAK,UAAA,GAAa,KAAK,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,MAAM,CAAA;AAAA,EACtE;AACF;AAKO,SAAS,qBACd,MAAA,EACgB;AAChB,EAAA,OAAO,IAAI,eAAe,MAAM,CAAA;AAClC;ACjXA,IAAM,mBAAA,GAAuC;AAAA,EAC3C,kBAAA,EAAoB,KAAA;AAAA,EACpB,YAAA,EAAc,KAAA;AAAA,EACd,mBAAA,EAAqB,IAAA;AAAA,EACrB,kBAAA,EAAoB;AACtB,CAAA;AAUO,SAAS,gBAAA,CACd,KAAA,EACA,QAAA,EACA,OAAA,GAA2B,EAAC,EACpB;AACR,EAAA,MAAM,IAAA,GAAO,EAAE,GAAG,mBAAA,EAAqB,GAAG,OAAA,EAAQ;AAClD,EAAA,MAAM,UAAA,GAAa,gBAAA,CAAiB,KAAA,EAAO,QAAA,EAAU,IAAI,CAAA;AACzD,EAAA,MAAM,IAAA,GAAO,WAAW,EAAA,CAAG,IAAA,CAAK,UAAU,UAAU,CAAC,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA;AAClE,EAAA,OAAO,CAAA,MAAA,EAAS,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAC/B;AAKO,SAAS,gBAAA,CACd,KAAA,EACA,QAAA,EACA,OAAA,GAA2B,EAAC,EACH;AACzB,EAAA,MAAM,kBAAA,GAAqB,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IAC9C,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,SAAS,OAAA,CAAQ,mBAAA,GACb,oBAAoB,CAAA,CAAE,OAAO,IAC7B,CAAA,CAAE;AAAA,GACR,CAAE,CAAA;AAEF,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,QAAA,EAAU,OAAA,CAAQ,kBAAA,GACd,kBAAA,CAAmB,kBAAkB,CAAA,GACrC;AAAA,GACN;AACF;AASO,SAAS,oBAAoB,IAAA,EAAsB;AACxD,EAAA,OAAO,IAAA,CAAK,MAAK,CAAE,OAAA,CAAQ,SAAS,IAAI,CAAA,CAAE,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA;AAC/D;AAKO,SAAS,mBACd,QAAA,EACQ;AACR,EAAA,KAAA,IAAS,IAAI,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC7C,IAAA,IAAI,QAAA,CAAS,CAAC,CAAA,CAAE,IAAA,KAAS,MAAA,EAAQ;AAC/B,MAAA,OAAO,QAAA,CAAS,CAAC,CAAA,CAAE,OAAA;AAAA,IACrB;AAAA,EACF;AACA,EAAA,OAAO,EAAA;AACT;AAKO,SAAS,oBACd,QAAA,EACoB;AACpB,EAAA,MAAM,gBAAgB,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,QAAQ,CAAA;AAC9D,EAAA,OAAO,aAAA,EAAe,OAAA;AACxB;AAMO,SAAS,mBAAA,CACd,OACA,QAAA,EACQ;AACR,EAAA,MAAM,WAAA,GAAc,mBAAmB,QAAQ,CAAA;AAC/C,EAAA,MAAM,UAAA,GAAa,oBAAoB,WAAW,CAAA;AAClD,EAAA,OAAO,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA;AAC/B;AAMO,SAAS,gCACd,QAAA,EACQ;AACR,EAAA,MAAM,OAAA,GAAU,QAAA,CACb,GAAA,CAAI,CAAC,MAAM,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,EAAE,OAAA,CAAQ,MAAM,CAAA,CAAE,CAAA,CAC1C,KAAK,GAAG,CAAA;AACX,EAAA,OAAO,UAAA,CAAW,EAAA,CAAG,OAAO,CAAA,CAAE,SAAS,EAAE,CAAA;AAC3C;;;AC7FA,IAAMA,eAAAA,GAAgD;AAAA,EACpD,UAAA,EAAY,IAAA;AAAA,EACZ,mBAAA,EAAqB,IAAA;AAAA,EACrB,UAAA,EAAY,GAAA;AAAA,EACZ,YAAA,EAAc,OAAO,IAAA,GAAO,IAAA;AAAA;AAAA,EAC5B,SAAA,EAAW,WAAA;AAAA,EACX,aAAA,EAAe,QAAA;AAAA,EACf,gBAAA,EAAkB,IAAA;AAAA,EAClB,SAAA,EAAW,SAAA;AAAA,EACX,cAAA,EAAgB,CAAC,OAAA,EAAS,UAAU,CAAA;AAAA,EACpC,mBAAA,EAAqB;AACvB,CAAA;AA4DO,IAAM,aAAA,GAAN,cAA4B,YAAA,CAAkC;AAAA,EAClD,MAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACT,KAAA;AAAA,EAER,WAAA,CACE,MAAA,EACA,KAAA,EACA,QAAA,EACA,UAAA,EACA;AACA,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,MAAA,GAAS,EAAE,GAAGA,eAAAA,EAAgB,GAAG,MAAA,EAAO;AAC7C,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,cAAA,CAAe;AAAA,MAClC,OAAA,EAAS,KAAK,MAAA,CAAO;AAAA,KACtB,CAAA;AACD,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAK,kBAAA,EAAmB;AAAA,EACvC;AAAA,EAEQ,kBAAA,GAAiC;AACvC,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,CAAA;AAAA,MACT,SAAA,EAAW,CAAA;AAAA,MACX,IAAA,EAAM,CAAA;AAAA,MACN,MAAA,EAAQ,CAAA;AAAA,MACR,OAAA,EAAS,CAAA;AAAA,MACT,SAAA,EAAW,CAAA;AAAA,MACX,YAAA,EAAc,CAAA;AAAA,MACd,aAAA,EAAe,CAAA;AAAA,MACf,YAAA,EAAc,CAAA;AAAA,MACd,cAAA,EAAgB,CAAA;AAAA,MAChB,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,IAAA,CACJ,OAAA,EACA,EAAA,EACA,OAAA,EACiE;AACjE,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAGlC,IAAA,IAAI,SAAS,SAAA,EAAW;AACtB,MAAA,MAAM,QAAA,GAAW,MAAM,EAAA,CAAG,OAAO,CAAA;AACjC,MAAA,OAAO,EAAE,GAAG,QAAA,EAAU,QAAQ,EAAE,GAAA,EAAK,OAAM,EAAE;AAAA,IAC/C;AAGA,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,GAAA,CAAI,SAAS,OAAO,CAAA;AAEpD,IAAA,IAAI,aAAa,GAAA,IAAO,YAAA,CAAa,KAAA,IAAS,CAAC,SAAS,YAAA,EAAc;AACpE,MAAA,IAAA,CAAK,KAAK,KAAA,EAAO,YAAA,CAAa,KAAA,EAAO,YAAA,CAAa,cAAc,CAAC,CAAA;AACjE,MAAA,IAAA,CAAK,KAAA,CAAM,IAAA,EAAA;AACX,MAAA,IAAA,CAAK,WAAA,CAAY,OAAO,YAAY,CAAA;AAGpC,MAAA,IAAI,IAAA,CAAK,OAAO,gBAAA,EAAkB;AAChC,QAAA,IAAA,CAAK,SAAA,CAAU,SAAA;AAAA,UACb,YAAA,CAAa,KAAA;AAAA,UACb,YAAA,CAAa,MAAA,KAAW,OAAA,GAAU,OAAA,GAAU,UAAA;AAAA,UAC5C,YAAA,CAAa;AAAA,SACf;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,GAAG,aAAa,KAAA,CAAM,QAAA;AAAA,QACtB,MAAA,EAAQ;AAAA,UACN,GAAA,EAAK,IAAA;AAAA,UACL,YAAY,YAAA,CAAa;AAAA;AAC3B,OACF;AAAA,IACF;AAGA,IAAA,MAAM,GAAA,GAAM,gBAAA,CAAiB,OAAA,CAAQ,KAAA,EAAO,QAAQ,QAAA,EAAU;AAAA,MAC5D,mBAAA,EAAqB,KAAK,MAAA,CAAO;AAAA,KAClC,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,GAAA,EAAK,YAAA,CAAa,MAAM,CAAA;AAC1C,IAAA,IAAA,CAAK,KAAA,CAAM,MAAA,EAAA;AAGX,IAAA,IAAI,IAAA,CAAK,OAAO,gBAAA,EAAkB;AAChC,MAAA,IAAA,CAAK,SAAA,CAAU,UAAA,CAAW,WAAA,CAAY,GAAA,KAAQ,SAAS,CAAA;AAAA,IACzD;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,EAAA,CAAG,OAAO,CAAA;AAGjC,MAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,QAAA,EAAU,OAAO,CAAA;AAEzC,MAAA,OAAO,EAAE,GAAG,QAAA,EAAU,QAAQ,EAAE,GAAA,EAAK,OAAM,EAAE;AAAA,IAC/C,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,KAAA,EAAgB,MAAM,CAAA;AACzC,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,GAAA,CACJ,OAAA,EACA,OAAA,EAC4B;AAC5B,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAElC,IAAA,IAAI;AAEF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,QAAA,CAAS,KAAA;AAAA,QACjC;AAAA,UACE,OAAO,OAAA,CAAQ,KAAA;AAAA,UACf,UAAU,OAAA,CAAQ,QAAA;AAAA,UAClB,aAAa,OAAA,CAAQ;AAAA,SACvB;AAAA,QACA,IAAA,CAAK,KAAA;AAAA,QACL,IAAA,CAAK,UAAA;AAAA,QACL;AAAA,UACE,SAAA,EAAW,KAAK,MAAA,CAAO,mBAAA;AAAA,UACvB,SAAA,EAAW,OAAA,EAAS,SAAA,IAAa,IAAA,CAAK,MAAA,CAAO;AAAA;AAC/C,OACF;AAGA,MAAA,IAAI,MAAA,CAAO,GAAA,IAAO,MAAA,CAAO,KAAA,EAAO;AAC9B,QAAA,IACE,SAAA,CAAU,OAAO,KAAA,CAAM,QAAA,CAAS,WAAW,MAAA,CAAO,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,EACpE;AAEA,UAAA,MAAM,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,MAAA,CAAO,MAAM,GAAG,CAAA;AACxC,UAAA,OAAO;AAAA,YACL,GAAA,EAAK,KAAA;AAAA,YACL,SAAA,EAAW,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,YAC/B,MAAA,EAAQ;AAAA,WACV;AAAA,QACF;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,GAAG,MAAA;AAAA,QACH,SAAA,EAAW,WAAA,CAAY,GAAA,EAAI,GAAI;AAAA,OACjC;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,KAAA,EAAgB,KAAK,CAAA;AACxC,MAAA,OAAO;AAAA,QACL,GAAA,EAAK,KAAA;AAAA,QACL,SAAA,EAAW,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,QAC/B,MAAA,EAAQ;AAAA,OACV;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,GAAA,CACJ,OAAA,EACA,QAAA,EACA,OAAA,EACe;AACf,IAAA,MAAM,SAAA,GAAY,OAAA,EAAS,SAAA,IAAa,IAAA,CAAK,MAAA,CAAO,SAAA;AACpD,IAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,OAAA,CAAQ,KAAA,EAAO,QAAQ,QAAA,EAAU;AAAA,MAChE,mBAAA,EAAqB,KAAK,MAAA,CAAO;AAAA,KAClC,CAAA;AAED,IAAA,MAAM,aACJ,OAAA,CAAQ,WAAA,KAAgB,SAAY,CAAA,GAAA,EAAM,OAAA,CAAQ,WAAW,CAAA,CAAA,GAAK,EAAA;AAEpE,IAAA,MAAM,GAAA,GACJ,SAAA,IAAa,SAAA,KAAc,SAAA,GACvB,GAAG,OAAO,CAAA,EAAG,UAAU,CAAA,IAAA,EAAO,SAAS,CAAA,CAAA,GACvC,CAAA,EAAG,OAAO,GAAG,UAAU,CAAA,CAAA;AAG7B,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,MAAA,CAAO,kBAAkB,OAAA,EAAS;AAC5D,MAAA,IAAI;AACF,QAAA,MAAM,WAAA,GAAc,kBAAA,CAAmB,OAAA,CAAQ,QAAQ,CAAA;AACvD,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,SAAA,GAAY,MAAM,IAAA,CAAK,UAAA,CAAW,KAAA,CAAM,WAAW,CAAA;AAAA,QACrD;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,KAAA,EAAgB,WAAW,CAAA;AAAA,MAEhD;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAoB;AAAA,MACxB,EAAA,EAAI,WAAW,OAAO,CAAA;AAAA,MACtB,GAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,aAAa,OAAA,CAAQ,WAAA;AAAA,QACrB,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,OAAO,OAAA,CAAQ;AAAA,OACjB;AAAA,MACA,QAAA,EAAU;AAAA,QACR,SAAS,QAAA,CAAS,OAAA;AAAA,QAClB,KAAA,EAAO,QAAA,CAAS,KAAA,IAAS,OAAA,CAAQ,KAAA;AAAA,QACjC,KAAA,EAAO,SAAS,KAAA,IAAS;AAAA,UACvB,YAAA,EAAc,CAAA;AAAA,UACd,gBAAA,EAAkB,CAAA;AAAA,UAClB,WAAA,EAAa;AAAA,SACf;AAAA,QACA,YAAA,EAAc,SAAS,YAAA,IAAgB,MAAA;AAAA,QACvC,WAAW,QAAA,CAAS;AAAA,OACtB;AAAA,MACA,QAAA,EAAU;AAAA,QACR,WAAW,GAAA,EAAI;AAAA,QACf,YAAY,GAAA,EAAI;AAAA,QAChB,WAAA,EAAa,CAAA;AAAA,QACb,GAAA,EAAK,OAAA,EAAS,GAAA,IAAO,IAAA,CAAK,MAAA,CAAO,UAAA;AAAA,QACjC,QAAA,EAAU,CAAA;AAAA,QACV,MAAM,OAAA,EAAS,IAAA;AAAA,QACf,SAAA;AAAA,QACA,QAAQ,OAAA,EAAS,MAAA;AAAA,QACjB,SAAS,OAAA,EAAS;AAAA;AACpB,KACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAC/B,MAAA,IAAA,CAAK,IAAA,CAAK,OAAO,KAAK,CAAA;AACtB,MAAA,IAAA,CAAK,KAAA,CAAM,OAAA,EAAA;AAGX,MAAA,IAAI,IAAA,CAAK,OAAO,gBAAA,EAAkB;AAChC,QAAA,IAAA,CAAK,SAAA,CAAU,UAAU,KAAK,CAAA;AAAA,MAChC;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,KAAA,EAAgB,KAAK,CAAA;AACxC,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,OAAO,GAAA,EAA+B;AAC1C,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA;AAC3C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAA,CAAK,IAAA,CAAK,UAAU,GAAG,CAAA;AACvB,MAAA,IAAA,CAAK,KAAA,CAAM,UAAU,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,KAAA,CAAM,UAAU,CAAC,CAAA;AAAA,IACzD;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,IAAA,CAAK,MAAM,KAAA,EAAM;AACvB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAK,kBAAA,EAAmB;AACrC,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,oBAAoB,OAAA,EAAkC;AAC1D,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,EAAK;AACnC,IAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA,EAAG;AACrB,QAAA,MAAM,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,GAAG,CAAA;AAC3B,QAAA,KAAA,EAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,UAAU,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,KAAA,CAAM,UAAU,KAAK,CAAA;AAC3D,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,iBAAiB,IAAA,EAAiC;AACtD,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,EAAK;AACnC,IAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,KAAA,CAAM,IAAI,GAAG,CAAA;AACtC,MAAA,IAAI,KAAA,EAAO,QAAA,CAAS,IAAA,EAAM,IAAA,CAAK,CAAC,MAAM,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG;AACvD,QAAA,MAAM,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,GAAG,CAAA;AAC3B,QAAA,KAAA,EAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,UAAU,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,KAAA,CAAM,UAAU,KAAK,CAAA;AAC3D,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAAuB;AACrB,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,KAAA,EAAM;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAA+B;AAC7B,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,GAA2C;AACzC,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,MAAA,EAAO;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,GAAoC;AACxC,IAAA,OAAO,IAAA,CAAK,MAAM,WAAA,EAAY;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,IAAA,CAAK,MAAM,KAAA,EAAM;AACvB,IAAA,IAAA,CAAK,kBAAA,EAAmB;AAAA,EAC1B;AAAA,EAEQ,WAAA,CAAY,MAAsB,MAAA,EAAkC;AAC1E,IAAA,IAAI,IAAA,KAAS,SAAS,MAAA,EAAQ;AAC5B,MAAA,IAAI,MAAA,CAAO,WAAW,OAAA,EAAS;AAC7B,QAAA,IAAA,CAAK,KAAA,CAAM,SAAA,EAAA;AAAA,MACb,CAAA,MAAA,IAAW,MAAA,CAAO,MAAA,KAAW,UAAA,EAAY;AACvC,QAAA,IAAA,CAAK,KAAA,CAAM,YAAA,EAAA;AACX,QAAA,IAAI,OAAO,UAAA,EAAY;AAErB,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,SAAA,GAAY,KAAK,KAAA,CAAM,YAAA;AAChD,UAAA,IAAA,CAAK,KAAA,CAAM,iBACR,IAAA,CAAK,KAAA,CAAM,iBAAiB,KAAA,GAAQ,CAAA,CAAA,GAAK,OAAO,UAAA,IACjD,KAAA;AAAA,QACJ;AAAA,MACF;AAGA,MAAA,IAAI,MAAA,CAAO,KAAA,EAAO,QAAA,CAAS,KAAA,EAAO;AAChC,QAAA,IAAA,CAAK,KAAA,CAAM,WAAA,IAAe,MAAA,CAAO,KAAA,CAAM,SAAS,KAAA,CAAM,WAAA;AAEtD,QAAA,IAAA,CAAK,MAAM,cAAA,IACR,MAAA,CAAO,MAAM,QAAA,CAAS,KAAA,CAAM,cAAc,GAAA,GAAQ,IAAA;AAAA,MACvD;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,aAAA,EAAc;AAAA,EACrB;AAAA,EAEQ,aAAA,GAAsB;AAC5B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,KAAK,KAAA,CAAM,MAAA;AAC3C,IAAA,IAAA,CAAK,MAAM,OAAA,GAAU,KAAA,GAAQ,IAAI,IAAA,CAAK,KAAA,CAAM,OAAO,KAAA,GAAQ,CAAA;AAAA,EAC7D;AACF;AAKO,SAAS,mBAAA,CACd,MAAA,EACA,KAAA,EACA,QAAA,EACA,UAAA,EACe;AACf,EAAA,OAAO,IAAI,aAAA,CAAc,MAAA,EAAQ,KAAA,EAAO,UAAU,UAAU,CAAA;AAC9D;;;ACjeO,IAAe,iBAAf,MAA8B;AAAA;AAAA,EAKzB,MAAA;AAAA;AAAA,EAGA,OAAA,GAAwB;AAAA,IAChC,IAAA,EAAM,CAAA;AAAA,IACN,IAAA,EAAM,CAAA;AAAA,IACN,OAAA,EAAS,CAAA;AAAA,IACT,IAAA,EAAM,CAAA;AAAA,IACN,MAAA,EAAQ;AAAA,GACV;AAAA,EAEA,YAAY,MAAA,EAAqB;AAC/B,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,SAAA,EAAW,OAAO,SAAA,IAAa,SAAA;AAAA,MAC/B,GAAG;AAAA,KACL;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EA6EA,IAAI,SAAA,GAAoB;AACtB,IAAA,OAAO,IAAA,CAAK,OAAO,SAAA,IAAa,SAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAA2B;AACzB,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,OAAA,EAAQ;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAAqB;AACnB,IAAA,IAAA,CAAK,OAAA,GAAU;AAAA,MACb,IAAA,EAAM,CAAA;AAAA,MACN,IAAA,EAAM,CAAA;AAAA,MACN,OAAA,EAAS,CAAA;AAAA,MACT,IAAA,EAAM,CAAA;AAAA,MACN,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKU,eAAA,CAAgB,MAAA,EAA4B,MAAA,GAAS,CAAA,EAAS;AACtE,IAAA,IAAI,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAM,MAAM,QAAA,EAAU;AAC5C,MAAA,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,IAAK,MAAA;AAAA,IAC1B;AAAA,EACF;AACF;ACpIA,IAAMA,eAAAA,GAA6C;AAAA,EACjD,UAAA,EAAY,GAAA;AAAA,EACZ,YAAA,EAAc,OAAO,IAAA,GAAO,IAAA;AAAA;AAAA,EAC5B,cAAA,EAAgB;AAClB,CAAA;AAoBO,IAAM,gBAAA,GAAN,cAA+B,cAAA,CAAe;AAAA,EAC1C,SAAA,GAA8B,QAAA;AAAA,EAE/B,KAAA;AAAA,EACA,OAAA,uBAA6D,GAAA,EAAI;AAAA,EACjE,YAAA;AAAA,EACA,MAAA,GAAS,KAAA;AAAA,EAEjB,WAAA,CAAY,MAAA,GAA4B,EAAE,IAAA,EAAM,UAAS,EAAG;AAC1D,IAAA,KAAA,CAAM,MAAM,CAAA;AACZ,IAAA,IAAA,CAAK,YAAA,GAAe,EAAE,GAAGA,eAAAA,EAAgB,GAAG,MAAA,EAAO;AAEnD,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,QAAA,CAAS;AAAA,MACxB,GAAA,EAAK,IAAA,CAAK,YAAA,CAAa,UAAA,IAAc,GAAA;AAAA,MACrC,OAAA,EAAS,IAAA,CAAK,YAAA,CAAa,YAAA,IAAgB,OAAO,IAAA,GAAO,IAAA;AAAA,MACzD,eAAA,EAAiB,CAAC,KAAA,KAAU,iBAAA,CAAkB,KAAK,CAAA;AAAA,MACnD,GAAA,EAAK,CAAA;AAAA;AAAA,MACL,cAAA,EAAgB,IAAA;AAAA,MAChB,UAAA,EAAY;AAAA,KACb,CAAA;AAAA,EACH;AAAA,EAEA,IAAI,GAAA,EAA8C;AAChD,IAAA,IAAA,CAAK,gBAAgB,MAAM,CAAA;AAC3B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAEhC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAA,CAAK,gBAAgB,MAAM,CAAA;AAE3B,MAAA,KAAA,CAAM,QAAA,CAAS,aAAa,GAAA,EAAI;AAChC,MAAA,KAAA,CAAM,QAAA,CAAS,WAAA,EAAA;AACf,MAAA,OAAO,OAAA,CAAQ,QAAQ,KAAK,CAAA;AAAA,IAC9B;AAEA,IAAA,IAAA,CAAK,gBAAgB,QAAQ,CAAA;AAC7B,IAAA,OAAO,OAAA,CAAQ,QAAQ,MAAS,CAAA;AAAA,EAClC;AAAA,EAEA,GAAA,CAAI,KAAa,KAAA,EAA0C;AACzD,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAClC,IAAA,IAAA,CAAK,gBAAgB,MAAM,CAAA;AAG3B,IAAA,MAAM,KAAA,GACJ,MAAM,QAAA,CAAS,GAAA,GAAM,IAAI,KAAA,CAAM,QAAA,CAAS,MAAM,GAAA,GAAO,MAAA;AAEvD,IAAA,IAAA,CAAK,MAAM,GAAA,CAAI,GAAA,EAAK,OAAO,EAAE,GAAA,EAAK,OAAO,CAAA;AAGzC,IAAA,IAAI,KAAA,CAAM,SAAA,IAAa,KAAA,CAAM,SAAA,CAAU,SAAS,CAAA,EAAG;AACjD,MAAA,IAAA,CAAK,OAAA,CAAQ,IAAI,GAAA,EAAK;AAAA,QACpB,IAAI,KAAA,CAAM,EAAA;AAAA,QACV,QAAQ,KAAA,CAAM;AAAA,OACf,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,QAAQ,OAAA,CAAQ;AAAA,MACrB,OAAA,EAAS,IAAA;AAAA,MACT,IAAI,KAAA,CAAM,EAAA;AAAA,MACV,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI;AAAA,KACjC,CAAA;AAAA,EACH;AAAA,EAEA,IAAI,GAAA,EAA+B;AACjC,IAAA,OAAO,QAAQ,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA,EAC5C;AAAA,EAEA,OAAO,GAAA,EAA+B;AACpC,IAAA,IAAA,CAAK,gBAAgB,SAAS,CAAA;AAC9B,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAClC,IAAA,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA;AACrB,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,GAAG,CAAA;AACvB,IAAA,OAAO,OAAA,CAAQ,QAAQ,OAAO,CAAA;AAAA,EAChC;AAAA,EAEA,KAAA,GAAuB;AACrB,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AACjB,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AACnB,IAAA,OAAO,QAAQ,OAAA,EAAQ;AAAA,EACzB;AAAA,EAEA,IAAA,GAAwB;AACtB,IAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAAA,EACxC;AAAA,EAEA,IAAA,GAA0B;AACxB,IAAA,OAAO,OAAA,CAAQ,QAAQ,KAAA,CAAM,IAAA,CAAK,KAAK,KAAA,CAAM,IAAA,EAAM,CAAC,CAAA;AAAA,EACtD;AAAA,EAEA,KAAA,CACE,QACA,OAAA,EAC2B;AAC3B,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAClC,IAAA,MAAM,IAAA,GAAO,SAAS,IAAA,IAAQ,EAAA;AAC9B,IAAA,MAAM,aAAA,GAAgB,SAAS,aAAA,IAAiB,CAAA;AAEhD,IAAA,MAAM,UAAiD,EAAC;AAGxD,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,MAAM,CAAA,IAAK,KAAK,OAAA,EAAS;AAExC,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAChC,MAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,MAAA,IACE,SAAS,SAAA,IACT,KAAA,CAAM,QAAA,CAAS,SAAA,KAAc,QAAQ,SAAA,EACrC;AACA,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,gBAAA,CAAiB,MAAA,EAAQ,OAAO,MAAM,CAAA;AAE9D,MAAA,IAAI,cAAc,aAAA,EAAe;AAC/B,QAAA,OAAA,CAAQ,KAAK,EAAE,GAAG,KAAA,EAAO,KAAA,EAAO,YAAY,CAAA;AAAA,MAC9C;AAAA,IACF;AAGA,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AAExC,IAAA,OAAO,QAAQ,OAAA,CAAQ;AAAA,MACrB,OAAA,EAAS,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA;AAAA,MAC9B,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI;AAAA,KACjC,CAAA;AAAA,EACH;AAAA,EAEA,WAAA,GAAoC;AAClC,IAAA,OAAO,QAAQ,OAAA,CAAQ;AAAA,MACrB,OAAA,EAAS,CAAC,IAAA,CAAK,MAAA;AAAA,MACf,SAAA,EAAW,CAAA;AAAA,MACX,WAAW,GAAA,EAAI;AAAA,MACf,KAAA,EAAO,IAAA,CAAK,MAAA,GAAS,iBAAA,GAAoB;AAAA,KAC1C,CAAA;AAAA,EACH;AAAA,EAEA,KAAA,GAAuB;AACrB,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AACjB,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AACnB,IAAA,OAAO,QAAQ,OAAA,EAAQ;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAA,CAAiB,GAAa,CAAA,EAAqB;AACzD,IAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,MAAA,EAAQ,OAAO,CAAA;AAElC,IAAA,IAAIC,WAAAA,GAAa,CAAA;AACjB,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AACjC,MAAAA,WAAAA,IAAc,CAAA,CAAE,CAAC,CAAA,GAAI,EAAE,CAAC,CAAA;AACxB,MAAA,KAAA,IAAS,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AACnB,MAAA,KAAA,IAAS,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AAAA,IACrB;AAEA,IAAA,MAAM,cAAc,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,GAAI,IAAA,CAAK,KAAK,KAAK,CAAA;AACtD,IAAA,IAAI,WAAA,KAAgB,GAAG,OAAO,CAAA;AAE9B,IAAA,OAAOA,WAAAA,GAAa,WAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAKE;AACA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAK,KAAA,CAAM,IAAA;AAAA,MACpB,cAAA,EAAgB,IAAA,CAAK,KAAA,CAAM,cAAA,IAAkB,CAAA;AAAA,MAC7C,OAAA,EAAS,IAAA,CAAK,YAAA,CAAa,YAAA,IAAgB,CAAA;AAAA,MAC3C,WAAA,EAAa,KAAK,OAAA,CAAQ;AAAA,KAC5B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAyB;AAEvB,IAAA,IAAA,CAAK,MAAM,UAAA,EAAW;AAGtB,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAK,EAAG;AACrC,MAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA,EAAG;AACxB,QAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,GAAG,CAAA;AACvB,QAAA,MAAA,EAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,OAAA,CAAQ,QAAQ,MAAM,CAAA;AAAA,EAC/B;AACF;AAKO,SAAS,uBACd,MAAA,EACkB;AAClB,EAAA,OAAO,IAAI,gBAAA,CAAiB,EAAE,MAAM,QAAA,EAAU,GAAG,QAAQ,CAAA;AAC3D;;;ACnPO,SAAS,gBAAA,CAAiB,GAAa,CAAA,EAAqB;AACjE,EAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,MAAA,EAAQ,OAAO,CAAA;AAElC,EAAA,IAAIA,WAAAA,GAAa,CAAA;AACjB,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AACjC,IAAAA,WAAAA,IAAc,CAAA,CAAE,CAAC,CAAA,GAAI,EAAE,CAAC,CAAA;AACxB,IAAA,KAAA,IAAS,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AACnB,IAAA,KAAA,IAAS,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AAAA,EACrB;AAEA,EAAA,MAAM,cAAc,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,GAAI,IAAA,CAAK,KAAK,KAAK,CAAA;AACtD,EAAA,IAAI,WAAA,KAAgB,GAAG,OAAO,CAAA;AAE9B,EAAA,OAAOA,WAAAA,GAAa,WAAA;AACtB;AASO,SAAS,iBAAA,CAAkB,GAAa,CAAA,EAAqB;AAClE,EAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,MAAA,EAAQ,OAAO,QAAA;AAElC,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AACjC,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,CAAC,CAAA,GAAI,EAAE,CAAC,CAAA;AACvB,IAAA,GAAA,IAAO,IAAA,GAAO,IAAA;AAAA,EAChB;AAEA,EAAA,OAAO,IAAA,CAAK,KAAK,GAAG,CAAA;AACtB;AASO,SAAS,UAAA,CAAW,GAAa,CAAA,EAAqB;AAC3D,EAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,MAAA,EAAQ,OAAO,CAAA;AAElC,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AACjC,IAAA,GAAA,IAAO,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AAAA,EACnB;AAEA,EAAA,OAAO,GAAA;AACT;AASO,SAAS,iBAAA,CAAkB,GAAa,CAAA,EAAqB;AAClE,EAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,MAAA,EAAQ,OAAO,QAAA;AAElC,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AACjC,IAAA,GAAA,IAAO,KAAK,GAAA,CAAI,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,EAC7B;AAEA,EAAA,OAAO,GAAA;AACT;AAQO,SAAS,qBAAqB,QAAA,EAA0B;AAC7D,EAAA,OAAO,KAAK,CAAA,GAAI,QAAA,CAAA;AAClB;AAQO,SAAS,UAAU,MAAA,EAA4B;AACpD,EAAA,MAAMC,UAAAA,GAAY,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAC,CAAA;AACrE,EAAA,IAAIA,UAAAA,KAAc,GAAG,OAAO,MAAA;AAC5B,EAAA,OAAO,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,IAAIA,UAAS,CAAA;AACxC;AAQO,SAAS,UAAU,MAAA,EAA0B;AAClD,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAC,CAAA;AAC5D;;;ACjFA,IAAMF,eAAAA,GAA4C;AAAA,EAChD,IAAA,EAAM,WAAA;AAAA,EACN,IAAA,EAAM,IAAA;AAAA,EACN,EAAA,EAAI,CAAA;AAAA,EACJ,SAAA,EAAW,WAAA;AAAA,EACX,cAAA,EAAgB;AAClB,CAAA;AAmBO,IAAM,eAAA,GAAN,cAA8B,cAAA,CAAe;AAAA,EACzC,SAAA,GAA8B,OAAA;AAAA,EAE/B,MAAA,GAA6B,IAAA;AAAA,EAC7B,WAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EAEpB,YAAY,MAAA,EAA0B;AACpC,IAAA,KAAA,CAAM,MAAM,CAAA;AACZ,IAAA,IAAA,CAAK,WAAA,GAAc,EAAE,GAAGA,eAAAA,EAAgB,GAAG,MAAA,EAAO;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAI,KAAK,SAAA,EAAW;AAEpB,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,OAAO,SAAS,CAAA;AAExC,MAAA,IAAI,IAAA,CAAK,YAAY,GAAA,EAAK;AACxB,QAAA,IAAA,CAAK,MAAA,GAAS,IAAI,KAAA,CAAM,IAAA,CAAK,YAAY,GAAA,EAAK;AAAA,UAC5C,cAAA,EAAgB,IAAA,CAAK,WAAA,CAAY,cAAA,IAAkB,GAAA;AAAA,UACnD,WAAA,EAAa,KAAA;AAAA,UACb,GAAA,EAAK,IAAA,CAAK,WAAA,CAAY,GAAA,GAAM,EAAC,GAAI,KAAA;AAAA,SAClC,CAAA;AAAA,MACH,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,MAAA,GAAS,IAAI,KAAA,CAAM;AAAA,UACtB,IAAA,EAAM,IAAA,CAAK,WAAA,CAAY,IAAA,IAAQ,WAAA;AAAA,UAC/B,IAAA,EAAM,IAAA,CAAK,WAAA,CAAY,IAAA,IAAQ,IAAA;AAAA,UAC/B,QAAA,EAAU,KAAK,WAAA,CAAY,QAAA;AAAA,UAC3B,EAAA,EAAI,IAAA,CAAK,WAAA,CAAY,EAAA,IAAM,CAAA;AAAA,UAC3B,cAAA,EAAgB,IAAA,CAAK,WAAA,CAAY,cAAA,IAAkB,GAAA;AAAA,UACnD,GAAA,EAAK,IAAA,CAAK,WAAA,CAAY,GAAA,GAAM,EAAC,GAAI,KAAA;AAAA,SAClC,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,IAAA,CAAK,OAAO,IAAA,EAAK;AACvB,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,IACnB,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,4BAAA,EAAgC,MAAgB,OAAO,CAAA;AAAA,OACzD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,eAAA,GAAwC;AACpD,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,IAAa,CAAC,KAAK,MAAA,EAAQ;AACnC,MAAA,MAAM,KAAK,OAAA,EAAQ;AAAA,IACrB;AACA,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,IAChD;AACA,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAEQ,UAAU,GAAA,EAAqB;AACrC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,SAAA,IAAa,WAAA;AAC7C,IAAA,OAAO,GAAG,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,SAAS,IAAI,GAAG,CAAA,CAAA;AAAA,EAC3C;AAAA,EAEA,MAAM,IAAI,GAAA,EAA8C;AACtD,IAAA,IAAA,CAAK,gBAAgB,MAAM,CAAA;AAC3B,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,eAAA,EAAgB;AAC1C,IAAA,MAAM,OAAO,MAAM,MAAA,CAAO,IAAI,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA;AAEjD,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,IAAA,CAAK,gBAAgB,QAAQ,CAAA;AAC7B,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,IAAA,CAAK,gBAAgB,MAAM,CAAA;AAC3B,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC7B,MAAA,KAAA,CAAM,QAAA,CAAS,aAAa,GAAA,EAAI;AAChC,MAAA,KAAA,CAAM,QAAA,CAAS,WAAA,EAAA;AAEf,MAAA,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AACrE,MAAA,OAAO,KAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,GAAA,CAAI,GAAA,EAAa,KAAA,EAA0C;AAC/D,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAClC,IAAA,IAAA,CAAK,gBAAgB,MAAM,CAAA;AAC3B,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,eAAA,EAAgB;AAE1C,IAAA,MAAM,MAAA,CAAO,IAAI,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAG3D,IAAA,IAAI,KAAA,CAAM,QAAA,CAAS,GAAA,GAAM,CAAA,EAAG;AAC1B,MAAA,MAAM,MAAA,CAAO,OAAO,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA,EAAG,KAAA,CAAM,SAAS,GAAG,CAAA;AAAA,IAC7D;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,IAAI,KAAA,CAAM,EAAA;AAAA,MACV,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI;AAAA,KAClC;AAAA,EACF;AAAA,EAEA,MAAM,IAAI,GAAA,EAA+B;AACvC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,eAAA,EAAgB;AAC1C,IAAA,OAAQ,MAAM,MAAA,CAAO,MAAA,CAAO,KAAK,SAAA,CAAU,GAAG,CAAC,CAAA,GAAK,CAAA;AAAA,EACtD;AAAA,EAEA,MAAM,OAAO,GAAA,EAA+B;AAC1C,IAAA,IAAA,CAAK,gBAAgB,SAAS,CAAA;AAC9B,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,eAAA,EAAgB;AAC1C,IAAA,OAAQ,MAAM,MAAA,CAAO,GAAA,CAAI,KAAK,SAAA,CAAU,GAAG,CAAC,CAAA,GAAK,CAAA;AAAA,EACnD;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,eAAA,EAAgB;AAC1C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA;AAClC,IAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AACtC,IAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,MAAA,MAAM,MAAA,CAAO,GAAA,CAAI,GAAG,IAAI,CAAA;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,MAAM,IAAA,GAAwB;AAC5B,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,eAAA,EAAgB;AAC1C,IAAA,MAAM,OAAO,MAAM,MAAA,CAAO,KAAK,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA;AAClD,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAEA,MAAM,IAAA,GAA0B;AAC9B,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,eAAA,EAAgB;AAC1C,IAAA,MAAM,OAAO,MAAM,MAAA,CAAO,KAAK,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA;AAClD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,EAAE,CAAA;AAChC,IAAA,OAAO,IAAA,CAAK,IAAI,CAAC,CAAA,KAAM,EAAE,KAAA,CAAM,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA,EAC/C;AAAA,EAEA,MAAM,KAAA,CACJ,MAAA,EACA,OAAA,EAC2B;AAC3B,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAMlC,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,IAAA,EAAK;AAChC,IAAA,MAAM,UAAiD,EAAC;AAGxD,IAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,GAAI,CAAA;AAE3C,IAAA,KAAA,MAAW,OAAO,aAAA,EAAe;AAC/B,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAChC,MAAA,IAAI,OAAO,SAAA,EAAW;AACpB,QAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,MAAA,EAAQ,KAAA,CAAM,SAAS,CAAA;AACtD,QAAA,IAAI,KAAA,KAAU,OAAA,EAAS,aAAA,IAAiB,CAAA,CAAA,EAAI;AAE1C,UAAA,IACE,SAAS,SAAA,IACT,KAAA,CAAM,QAAA,CAAS,SAAA,KAAc,QAAQ,SAAA,EACrC;AACA,YAAA;AAAA,UACF;AACA,UAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,GAAG,KAAA,EAAO,OAAO,CAAA;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AAExC,IAAA,OAAO;AAAA,MACL,SAAS,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,OAAA,EAAS,QAAQ,EAAE,CAAA;AAAA,MAC7C,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI;AAAA,KAClC;AAAA,EACF;AAAA,EAEA,MAAM,WAAA,GAAoC;AACxC,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAClC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,eAAA,EAAgB;AAC1C,MAAA,MAAM,OAAO,IAAA,EAAK;AAClB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,SAAA,EAAW,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,QAC/B,WAAW,GAAA;AAAI,OACjB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,SAAA,EAAW,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,QAC/B,WAAW,GAAA,EAAI;AAAA,QACf,OAAQ,KAAA,CAAgB;AAAA,OAC1B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,MAAM,IAAA,CAAK,OAAO,IAAA,EAAK;AACvB,MAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,MAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AAAA,IACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AACF;AAKO,SAAS,sBACd,MAAA,EACiB;AACjB,EAAA,OAAO,IAAI,gBAAgB,MAAM,CAAA;AACnC;;;ACrPA,IAAMA,eAAAA,GAA6C;AAAA,EACjD,MAAA,EAAQ,UAAA;AAAA,EACR,QAAA,EAAU,KAAA;AAAA,EACV,YAAA,EAAc;AAChB,CAAA;AAmBO,IAAM,gBAAA,GAAN,cAA+B,cAAA,CAAe;AAAA,EAC1C,SAAA,GAA8B,QAAA;AAAA,EAE/B,EAAA,GAAsB,IAAA;AAAA,EACtB,YAAA;AAAA,EACA,WAAA,GAAc,KAAA;AAAA,EAEtB,YAAY,MAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,MAAM,CAAA;AACZ,IAAA,IAAA,CAAK,YAAA,GAAe,EAAE,GAAGA,eAAAA,EAAgB,GAAG,MAAA,EAAO;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,GAAsB;AAC1B,IAAA,IAAI,KAAK,WAAA,EAAa;AAEtB,IAAA,IAAI;AACF,MAAA,MAAM,aAAA,GAAA,CAAiB,MAAM,OAAO,gBAAgB,CAAA,EAAG,OAAA;AAEvD,MAAA,MAAM,KAAK,IAAI,aAAA;AAAA,QACb,KAAK,YAAA,CAAa,QAAA,GACd,UAAA,GACC,IAAA,CAAK,aAAa,MAAA,IAAU;AAAA,OACnC;AACA,MAAA,IAAA,CAAK,EAAA,GAAK,EAAA;AAGV,MAAA,EAAA,CAAG,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAiBP,CAAA;AAED,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,IACrB,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,sCAAA,EAA0C,MAAgB,OAAO,CAAA;AAAA,OACnE;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,iBAAA,GAA8B;AACpC,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,IAAe,CAAC,KAAK,EAAA,EAAI;AACjC,MAAA,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAAA,IACpE;AACA,IAAA,OAAO,IAAA,CAAK,EAAA;AAAA,EACd;AAAA,EAEA,IAAI,GAAA,EAA8C;AAChD,IAAA,IAAA,CAAK,gBAAgB,MAAM,CAAA;AAC3B,IAAA,MAAM,EAAA,GAAK,KAAK,iBAAA,EAAkB;AAElC,IAAA,MAAM,MAAM,EAAA,CACT,OAAA,CAAQ,8CAA8C,CAAA,CACtD,IAAI,GAAG,CAAA;AAEV,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,IAAA,CAAK,gBAAgB,QAAQ,CAAA;AAC7B,MAAA,OAAO,OAAA,CAAQ,QAAQ,MAAS,CAAA;AAAA,IAClC;AAEA,IAAA,IAAA,CAAK,gBAAgB,MAAM,CAAA;AAC3B,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AAGjC,MAAA,KAAA,CAAM,QAAA,CAAS,aAAa,GAAA,EAAI;AAChC,MAAA,KAAA,CAAM,QAAA,CAAS,WAAA,EAAA;AACf,MAAA,EAAA,CAAG,OAAA;AAAA,QACD;AAAA,OACF,CAAE,IAAI,GAAA,EAAI,EAAG,KAAK,SAAA,CAAU,KAAK,GAAG,GAAG,CAAA;AAEvC,MAAA,OAAO,OAAA,CAAQ,QAAQ,KAAK,CAAA;AAAA,IAC9B,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,OAAA,CAAQ,QAAQ,MAAS,CAAA;AAAA,IAClC;AAAA,EACF;AAAA,EAEA,GAAA,CAAI,KAAa,KAAA,EAA0C;AACzD,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAClC,IAAA,IAAA,CAAK,gBAAgB,MAAM,CAAA;AAC3B,IAAA,MAAM,EAAA,GAAK,KAAK,iBAAA,EAAkB;AAGlC,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,SAAA,GACpB,MAAA,CAAO,IAAA,CAAK,IAAI,YAAA,CAAa,KAAA,CAAM,SAAS,CAAA,CAAE,MAAM,CAAA,GACpD,IAAA;AAEJ,IAAA,EAAA,CAAG,OAAA;AAAA,MACD;AAAA;AAAA;AAAA;AAAA,IAAA;AAAA,KAKF,CAAE,GAAA;AAAA,MACA,GAAA;AAAA,MACA,KAAA,CAAM,EAAA;AAAA,MACN,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,MACpB,SAAA;AAAA,MACA,MAAM,OAAA,CAAQ,KAAA;AAAA,MACd,KAAA,CAAM,SAAS,SAAA,IAAa,IAAA;AAAA,MAC5B,MAAM,QAAA,CAAS,SAAA;AAAA,MACf,MAAM,QAAA,CAAS,UAAA;AAAA,MACf,MAAM,QAAA,CAAS;AAAA,KACjB;AAEA,IAAA,OAAO,QAAQ,OAAA,CAAQ;AAAA,MACrB,OAAA,EAAS,IAAA;AAAA,MACT,IAAI,KAAA,CAAM,EAAA;AAAA,MACV,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI;AAAA,KACjC,CAAA;AAAA,EACH;AAAA,EAEA,IAAI,GAAA,EAA+B;AACjC,IAAA,MAAM,EAAA,GAAK,KAAK,iBAAA,EAAkB;AAClC,IAAA,MAAM,MAAM,EAAA,CACT,OAAA,CAAQ,2CAA2C,CAAA,CACnD,IAAI,GAAG,CAAA;AACV,IAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAC,GAAG,CAAA;AAAA,EAC9B;AAAA,EAEA,OAAO,GAAA,EAA+B;AACpC,IAAA,IAAA,CAAK,gBAAgB,SAAS,CAAA;AAC9B,IAAA,MAAM,EAAA,GAAK,KAAK,iBAAA,EAAkB;AAClC,IAAA,MAAM,SAAS,EAAA,CACZ,OAAA,CAAQ,yCAAyC,CAAA,CACjD,IAAI,GAAG,CAAA;AACV,IAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,MAAA,CAAO,OAAA,GAAU,CAAC,CAAA;AAAA,EAC3C;AAAA,EAEA,KAAA,GAAuB;AACrB,IAAA,MAAM,EAAA,GAAK,KAAK,iBAAA,EAAkB;AAClC,IAAA,IAAI,IAAA,CAAK,cAAc,SAAA,EAAW;AAChC,MAAA,EAAA,CAAG,OAAA,CAAQ,2BAA2B,CAAA,CAAE,GAAA,EAAI;AAAA,IAC9C,CAAA,MAAO;AACL,MAAA,EAAA,CAAG,OAAA,CAAQ,+CAA+C,CAAA,CAAE,GAAA;AAAA,QAC1D,IAAA,CAAK;AAAA,OACP;AAAA,IACF;AACA,IAAA,OAAO,QAAQ,OAAA,EAAQ;AAAA,EACzB;AAAA,EAEA,IAAA,GAAwB;AACtB,IAAA,MAAM,EAAA,GAAK,KAAK,iBAAA,EAAkB;AAClC,IAAA,MAAM,GAAA,GAAM,EAAA,CACT,OAAA,CAAQ,6CAA6C,EACrD,GAAA,EAAI;AACP,IAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA;AAAA,EAClC;AAAA,EAEA,IAAA,GAA0B;AACxB,IAAA,MAAM,EAAA,GAAK,KAAK,iBAAA,EAAkB;AAClC,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,OAAA,CAAQ,+BAA+B,EAAE,GAAA,EAAI;AAG7D,IAAA,OAAO,OAAA,CAAQ,QAAQ,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,GAAG,CAAC,CAAA;AAAA,EAC/C;AAAA,EAEA,KAAA,CACE,QACA,OAAA,EAC2B;AAC3B,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAClC,IAAA,MAAM,EAAA,GAAK,KAAK,iBAAA,EAAkB;AAGlC,IAAA,IAAI,GAAA,GAAM;AAAA;AAAA;AAAA,IAAA,CAAA;AAIV,IAAA,MAAM,SAAoB,EAAC;AAE3B,IAAA,IAAI,SAAS,SAAA,EAAW;AACtB,MAAA,GAAA,IAAO,oBAAA;AACP,MAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,SAAS,CAAA;AAAA,IAC/B;AAEA,IAAA,MAAM,OAAO,EAAA,CAAG,OAAA,CAAQ,GAAG,CAAA,CAAE,GAAA,CAAI,GAAG,MAAM,CAAA;AAO1C,IAAA,MAAM,UAAiD,EAAC;AAExD,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,SAAS,IAAI,YAAA;AAAA,QACjB,IAAI,SAAA,CAAU,MAAA;AAAA,QACd,IAAI,SAAA,CAAU,UAAA;AAAA,QACd,GAAA,CAAI,UAAU,MAAA,GAAS;AAAA,OACzB;AACA,MAAA,MAAM,aAAa,gBAAA,CAAiB,MAAA,EAAQ,KAAA,CAAM,IAAA,CAAK,MAAM,CAAC,CAAA;AAE9D,MAAA,IAAI,UAAA,KAAe,OAAA,EAAS,aAAA,IAAiB,CAAA,CAAA,EAAI;AAC/C,QAAA,IAAI;AACF,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AACjC,UAAA,OAAA,CAAQ,KAAK,EAAE,GAAG,KAAA,EAAO,KAAA,EAAO,YAAY,CAAA;AAAA,QAC9C,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AAExC,IAAA,OAAO,QAAQ,OAAA,CAAQ;AAAA,MACrB,SAAS,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,OAAA,EAAS,QAAQ,EAAE,CAAA;AAAA,MAC7C,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI;AAAA,KACjC,CAAA;AAAA,EACH;AAAA,EAEA,WAAA,GAAoC;AAClC,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAClC,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,MAAA,OAAO,QAAQ,OAAA,CAAQ;AAAA,QACrB,OAAA,EAAS,IAAA;AAAA,QACT,SAAA,EAAW,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,QAC/B,WAAW,GAAA;AAAI,OAChB,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,QAAQ,OAAA,CAAQ;AAAA,QACrB,OAAA,EAAS,KAAA;AAAA,QACT,SAAA,EAAW,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,QAC/B,WAAW,GAAA,EAAI;AAAA,QACf,OAAQ,KAAA,CAAgB;AAAA,OACzB,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEA,KAAA,GAAuB;AACrB,IAAA,IAAI,KAAK,EAAA,EAAI;AACX,MAAA,IAAA,CAAK,GAAG,KAAA,EAAM;AACd,MAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AACV,MAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AAAA,IACrB;AACA,IAAA,OAAO,QAAQ,OAAA,EAAQ;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAAgC;AAC9B,IAAA,MAAM,EAAA,GAAK,KAAK,iBAAA,EAAkB;AAClC,IAAA,MAAM,cAAc,GAAA,EAAI;AAExB,IAAA,MAAM,SAAS,EAAA,CACZ,OAAA;AAAA,MACC;AAAA;AAAA;AAAA,IAAA;AAAA,KAIF,CACC,IAAI,WAAW,CAAA;AAElB,IAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAA,GAAoC;AACxC,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,QAAA,EAAU,OAAO,IAAA;AAEvC,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAM,OAAO,IAAI,CAAA;AACtC,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,IAAA,CAAK,YAAA,CAAa,UAAU,UAAU,CAAA;AAC7D,MAAA,OAAO,KAAA,CAAM,IAAA;AAAA,IACf,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAyB;AACvB,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AACF;AAKO,SAAS,uBACd,MAAA,EACkB;AAClB,EAAA,OAAO,IAAI,iBAAiB,MAAM,CAAA;AACpC;;;AC9SO,IAAM,gBAAA,GAAN,cAA+B,cAAA,CAAe;AAAA,EAC1C,SAAA,GAA8B,QAAA;AAAA,EAE/B,KAAA;AAAA,EACA,YAAA,uBAAwC,GAAA,EAAI;AAAA,EAEpD,YAAY,MAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,MAAM,CAAA;AAGZ,IAAA,MAAM,UAAA,GAAa,OAAO,KAAA,CAAM,MAAA;AAAA,MAC9B,CAAC,CAAA,KAAyB,CAAA,CAAE,KAAA,KAAU;AAAA,KACxC;AAEA,IAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAGA,IAAA,IAAA,CAAK,KAAA,GAAQ,WAAW,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,QAAA,GAAW,CAAA,CAAE,QAAQ,CAAA;AAAA,EAChE;AAAA,EAEA,MAAM,IAAI,GAAA,EAA8C;AACtD,IAAA,IAAA,CAAK,gBAAgB,MAAM,CAAA;AAG3B,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AAC1C,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AACzB,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,KAAA,CAAM,IAAI,GAAG,CAAA;AAEtC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,IAAA,CAAK,gBAAgB,MAAM,CAAA;AAG3B,QAAA,MAAM,eAAe,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,GAAG,KAAK,CAAA,IAAK,CAAA;AACxD,QAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,GAAA,EAAK,WAAW,CAAA;AAGtC,QAAA,IAAI,IAAI,CAAA,EAAG;AACT,UAAA,MAAM,IAAA,CAAK,cAAA,CAAe,GAAA,EAAK,KAAA,EAAO,GAAG,WAAW,CAAA;AAAA,QACtD;AAEA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,gBAAgB,QAAQ,CAAA;AAC7B,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,GAAA,CAAI,GAAA,EAAa,KAAA,EAA0C;AAC/D,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAClC,IAAA,IAAA,CAAK,gBAAgB,MAAM,CAAA;AAG3B,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAE,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAGvD,IAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,GAAA,EAAK,CAAC,CAAA;AAG5B,IAAA,MAAM,IAAA,CAAK,cAAc,CAAC,CAAA;AAE1B,IAAA,OAAO;AAAA,MACL,GAAG,MAAA;AAAA,MACH,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI;AAAA,KAClC;AAAA,EACF;AAAA,EAEA,MAAM,IAAI,GAAA,EAA+B;AACvC,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,KAAA,EAAO;AAC7B,MAAA,IAAI,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA,EAAG;AAC7B,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,GAAA,EAA+B;AAC1C,IAAA,IAAA,CAAK,gBAAgB,SAAS,CAAA;AAC9B,IAAA,IAAI,OAAA,GAAU,KAAA;AAGd,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,KAAA,EAAO;AAC7B,MAAA,IAAI,MAAM,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,GAAG,CAAA,EAAG;AAChC,QAAA,OAAA,GAAU,IAAA;AAAA,MACZ;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,YAAA,CAAa,OAAO,GAAG,CAAA;AAC5B,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,KAAA,EAAO;AAC7B,MAAA,MAAM,IAAA,CAAK,MAAM,KAAA,EAAM;AAAA,IACzB;AACA,IAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AAAA,EAC1B;AAAA,EAEA,MAAM,IAAA,GAAwB;AAE5B,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,KAAA,EAAO;AAC7B,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,EAAK;AACnC,MAAA,IAAA,CAAK,QAAQ,CAAC,CAAA,KAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAC,CAAA;AAAA,IACpC;AACA,IAAA,OAAO,OAAA,CAAQ,IAAA;AAAA,EACjB;AAAA,EAEA,MAAM,IAAA,GAA0B;AAC9B,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,KAAA,EAAO;AAC7B,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,EAAK;AACnC,MAAA,IAAA,CAAK,QAAQ,CAAC,CAAA,KAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAC,CAAA;AAAA,IACpC;AACA,IAAA,OAAO,KAAA,CAAM,KAAK,OAAO,CAAA;AAAA,EAC3B;AAAA,EAEA,MAAM,KAAA,CACJ,MAAA,EACA,OAAA,EAC2B;AAC3B,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAClC,IAAA,MAAM,UAAA,uBAAiB,GAAA,EAA4C;AAGnE,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,KAAA,EAAO;AAC7B,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,QAAQ,OAAO,CAAA;AACrD,MAAA,KAAA,MAAW,KAAA,IAAS,OAAO,OAAA,EAAS;AAElC,QAAA,MAAM,QAAA,GAAW,UAAA,CAAW,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA;AACzC,QAAA,IAAI,CAAC,QAAA,IAAY,KAAA,CAAM,KAAA,GAAQ,SAAS,KAAA,EAAO;AAC7C,UAAA,UAAA,CAAW,GAAA,CAAI,KAAA,CAAM,GAAA,EAAK,KAAK,CAAA;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,CAC3C,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA,CAChC,MAAM,CAAA,EAAG,OAAA,EAAS,QAAQ,EAAE,CAAA;AAE/B,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI;AAAA,KAClC;AAAA,EACF;AAAA,EAEA,MAAM,WAAA,GAAoC;AACxC,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAClC,IAAA,MAAM,cAAyD,EAAC;AAEhE,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,KAAA,EAAO;AAC7B,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,KAAA,CAAM,WAAA,EAAY;AAC5C,MAAA,WAAA,CAAY,IAAA,CAAK,EAAE,IAAA,EAAM,IAAA,CAAK,MAAM,OAAA,EAAS,MAAA,CAAO,SAAS,CAAA;AAAA,IAC/D;AAEA,IAAA,MAAM,aAAa,WAAA,CAAY,KAAA,CAAM,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA;AAErD,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,UAAA;AAAA,MACT,SAAA,EAAW,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,MAC/B,WAAW,GAAA,EAAI;AAAA,MACf,KAAA,EAAO,aACH,MAAA,GACA,CAAA,iBAAA,EAAoB,YACjB,MAAA,CAAO,CAAC,MAAM,CAAC,CAAA,CAAE,OAAO,CAAA,CACxB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CACjB,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KACnB;AAAA,EACF;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,KAAA,EAAO;AAC7B,MAAA,MAAM,IAAA,CAAK,MAAM,KAAA,EAAM;AAAA,IACzB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,GAOJ;AACA,IAAA,MAAM,QAAQ,EAAC;AACf,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,KAAA,EAAO;AAC7B,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,IAAA,EAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,EAAK;AAAA,QAC5B,SAAS,IAAA,CAAK;AAAA,OACf,CAAA;AAAA,IACH;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CAAQ,GAAA,EAAa,eAAA,GAAkB,CAAA,EAAqB;AAEhE,IAAA,KAAA,IAAS,IAAI,eAAA,GAAkB,CAAA,EAAG,IAAI,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AAC5D,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAE,KAAA,CAAM,IAAI,GAAG,CAAA;AAC/C,MAAA,IAAI,KAAA,EAAO;AAET,QAAA,MAAM,KAAK,KAAA,CAAM,eAAe,EAAE,KAAA,CAAM,GAAA,CAAI,KAAK,KAAK,CAAA;AAEtD,QAAA,MAAM,KAAK,KAAA,CAAM,CAAC,CAAA,CAAE,KAAA,CAAM,OAAO,GAAG,CAAA;AACpC,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,CAAO,GAAA,EAAa,eAAA,EAA4C;AAEpE,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAK,KAAA,CAAM,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AAC9C,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAE,KAAA,CAAM,IAAI,GAAG,CAAA;AAC/C,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,MAAA,GAAS,mBAAmB,CAAA,GAAI,CAAA;AACtC,QAAA,IAAI,MAAA,IAAU,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,OAAO,KAAA;AAGxC,QAAA,MAAM,KAAK,KAAA,CAAM,MAAM,EAAE,KAAA,CAAM,GAAA,CAAI,KAAK,KAAK,CAAA;AAE7C,QAAA,MAAM,KAAK,KAAA,CAAM,CAAC,CAAA,CAAE,KAAA,CAAM,OAAO,GAAG,CAAA;AACpC,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAc,cAAA,CACZ,GAAA,EACA,KAAA,EACA,kBACA,WAAA,EACe;AAEf,IAAA,KAAA,IAAS,CAAA,GAAI,gBAAA,GAAmB,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC9C,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AACzB,MAAA,MAAM,SAAA,GAAY,KAAK,kBAAA,IAAsB,CAAA;AAE7C,MAAA,IAAI,eAAe,SAAA,EAAW;AAE5B,QAAA,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAE/B,QAAA,MAAM,KAAK,KAAA,CAAM,gBAAgB,CAAA,CAAE,KAAA,CAAM,OAAO,GAAG,CAAA;AACnD,QAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,cAAc,SAAA,EAAkC;AAC5D,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA;AACjC,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AAEnB,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,EAAK;AACnC,IAAA,IAAI,IAAA,IAAQ,KAAK,OAAA,EAAS;AAG1B,IAAA,MAAM,cAAA,GAAiB,KAAK,cAAA,IAAkB,GAAA;AAC9C,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,UAAU,cAAc,CAAA;AAC3D,IAAA,MAAM,WAAW,IAAA,GAAO,UAAA;AAExB,IAAA,IAAI,YAAY,CAAA,EAAG;AAGnB,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,EAAK;AACnC,IAAA,MAAM,YAAA,GAAe,IAAA,CAClB,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,GAAA,EAAK,CAAA,EAAG,KAAA,EAAO,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA,EAAE,CAAE,CAAA,CAC7D,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,KAAK,CAAA;AAGnC,IAAA,MAAM,gBAAgB,SAAA,GAAY,CAAA;AAClC,IAAA,IAAI,aAAA,IAAiB,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ;AAEtC,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,YAAY,CAAA,GAAI,YAAA,CAAa,QAAQ,CAAA,EAAA,EAAK;AAC5D,QAAA,MAAM,KAAK,KAAA,CAAM,MAAA,CAAO,YAAA,CAAa,CAAC,EAAE,GAAG,CAAA;AAC3C,QAAA,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,YAAA,CAAa,CAAC,EAAE,GAAG,CAAA;AAAA,MAC9C;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,YAAY,CAAA,GAAI,YAAA,CAAa,QAAQ,CAAA,EAAA,EAAK;AAC5D,QAAA,MAAM,GAAA,GAAM,YAAA,CAAa,CAAC,CAAA,CAAE,GAAA;AAC5B,QAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,KAAA,CAAM,IAAI,GAAG,CAAA;AACtC,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,MAAM,KAAK,KAAA,CAAM,aAAa,EAAE,KAAA,CAAM,GAAA,CAAI,KAAK,KAAK,CAAA;AACpD,UAAA,MAAM,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,GAAG,CAAA;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAKO,SAAS,uBACd,MAAA,EACkB;AAClB,EAAA,OAAO,IAAI,iBAAiB,MAAM,CAAA;AACpC;;;ACxQO,IAAM,kBAAA,GAAN,cAAiC,cAAA,CAAe;AAAA,EAC5C,SAAA,GAA8B,UAAA;AAAA,EAE/B,MAAA,GAAgC,IAAA;AAAA,EAChC,KAAA,GAA8B,IAAA;AAAA,EAC9B,EAAA,GAA+B,IAAA;AAAA,EAC/B,cAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EAEpB,YAAY,MAAA,EAA6B;AACvC,IAAA,KAAA,CAAM,MAAM,CAAA;AACZ,IAAA,IAAA,CAAK,cAAA,GAAiB,MAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAI,KAAK,SAAA,EAAW;AAEpB,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAM,OAAO,6BAA6B,CAAA;AAE/D,MAAA,IAAA,CAAK,MAAA,GAAS,IAAI,QAAA,CAAS;AAAA,QACzB,MAAA,EAAQ,KAAK,cAAA,CAAe;AAAA,OAC7B,CAAA;AAED,MAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,eAAe,KAAK,CAAA;AACxD,MAAA,IAAA,CAAK,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,KAAK,SAAS,CAAA;AAC7C,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,IACnB,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,+BAAA,EAAmC,MAAgB,OAAO,CAAA;AAAA,OAC5D;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,eAAA,GAA8C;AAC1D,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,IAAa,CAAC,KAAK,EAAA,EAAI;AAC/B,MAAA,MAAM,KAAK,OAAA,EAAQ;AAAA,IACrB;AACA,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI;AACZ,MAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,IACtD;AACA,IAAA,OAAO,IAAA,CAAK,EAAA;AAAA,EACd;AAAA,EAEA,MAAM,IAAI,GAAA,EAA8C;AACtD,IAAA,IAAA,CAAK,gBAAgB,MAAM,CAAA;AAC3B,IAAA,MAAM,EAAA,GAAK,MAAM,IAAA,CAAK,eAAA,EAAgB;AAEtC,IAAA,IAAI;AAEF,MAAA,MAAM,SAAS,MAAM,EAAA,CAAG,KAAA,CAAM,CAAC,GAAG,CAAC,CAAA;AAEnC,MAAA,IAAI,CAAC,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AACxB,QAAA,IAAA,CAAK,gBAAgB,QAAQ,CAAA;AAC7B,QAAA,OAAO,KAAA,CAAA;AAAA,MACT;AAEA,MAAA,IAAA,CAAK,gBAAgB,MAAM,CAAA;AAC3B,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA;AACjC,MAAA,MAAM,WAAW,MAAA,CAAO,QAAA;AAGxB,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,SAAS,CAAA;AAC3C,MAAA,KAAA,CAAM,QAAA,CAAS,aAAa,GAAA,EAAI;AAChC,MAAA,KAAA,CAAM,QAAA,CAAS,WAAA,EAAA;AAGf,MAAA,IAAA,CAAK,qBAAqB,GAAA,EAAK,MAAA,CAAO,QAAQ,QAAQ,CAAA,CAAE,MAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AAEtE,MAAA,OAAO,KAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,CAAK,gBAAgB,QAAQ,CAAA;AAC7B,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAc,oBAAA,CACZ,GAAA,EACA,MAAA,EACA,QAAA,EACe;AACf,IAAA,MAAM,EAAA,GAAK,MAAM,IAAA,CAAK,eAAA,EAAgB;AACtC,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,SAAS,CAAA;AAClD,IAAA,YAAA,CAAa,QAAA,CAAS,aAAa,GAAA,EAAI;AACvC,IAAA,YAAA,CAAa,QAAA,CAAS,WAAA,EAAA;AAEtB,IAAA,MAAM,GAAG,MAAA,CAAO;AAAA,MACd;AAAA,QACE,EAAA,EAAI,GAAA;AAAA,QACJ,MAAA;AAAA,QACA,QAAA,EAAU;AAAA,UACR,GAAG,QAAA;AAAA,UACH,YAAY,GAAA,EAAI;AAAA,UAChB,WAAA,EAAa,SAAS,WAAA,GAAc,CAAA;AAAA,UACpC,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,YAAY;AAAA;AACxC;AACF,KACD,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,GAAA,CAAI,GAAA,EAAa,KAAA,EAA0C;AAC/D,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAClC,IAAA,IAAA,CAAK,gBAAgB,MAAM,CAAA;AAC3B,IAAA,MAAM,EAAA,GAAK,MAAM,IAAA,CAAK,eAAA,EAAgB;AAGtC,IAAA,IAAI,CAAC,KAAA,CAAM,SAAA,IAAa,KAAA,CAAM,SAAA,CAAU,WAAW,CAAA,EAAG;AACpD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,IAAI,KAAA,CAAM,EAAA;AAAA,QACV,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI;AAAA,OAClC;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAA0B;AAAA,MAC9B,GAAA;AAAA,MACA,KAAA,EAAO,MAAM,OAAA,CAAQ,KAAA;AAAA,MACrB,SAAS,KAAA,CAAM,QAAA,CAAS,OAAA,CAAQ,SAAA,CAAU,GAAG,GAAK,CAAA;AAAA;AAAA,MAClD,SAAA,EAAW,MAAM,QAAA,CAAS,SAAA;AAAA,MAC1B,UAAA,EAAY,MAAM,QAAA,CAAS,UAAA;AAAA,MAC3B,WAAA,EAAa,MAAM,QAAA,CAAS,WAAA;AAAA,MAC5B,QAAA,EAAU,MAAM,QAAA,CAAS,QAAA;AAAA,MACzB,GAAA,EAAK,MAAM,QAAA,CAAS,GAAA;AAAA,MACpB,SAAA,EAAW,KAAA,CAAM,QAAA,CAAS,SAAA,IAAa,IAAA,CAAK,SAAA;AAAA,MAC5C,IAAA,EAAM,KAAA,CAAM,QAAA,CAAS,IAAA,IAAQ,EAAC;AAAA,MAC9B,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,KAAK;AAAA,KACjC;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,GAAG,MAAA,CAAO;AAAA,QACd;AAAA,UACE,EAAA,EAAI,GAAA;AAAA,UACJ,QAAQ,KAAA,CAAM,SAAA;AAAA,UACd;AAAA;AACF,OACD,CAAA;AAED,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,IAAI,KAAA,CAAM,EAAA;AAAA,QACV,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI;AAAA,OAClC;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,IAAI,KAAA,CAAM,EAAA;AAAA,QACV,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI;AAAA,OAClC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,IAAI,GAAA,EAA+B;AACvC,IAAA,MAAM,EAAA,GAAK,MAAM,IAAA,CAAK,eAAA,EAAgB;AACtC,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,MAAM,EAAA,CAAG,KAAA,CAAM,CAAC,GAAG,CAAC,CAAA;AACnC,MAAA,OAAO,CAAC,CAAC,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA;AAAA,IAC7B,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,GAAA,EAA+B;AAC1C,IAAA,IAAA,CAAK,gBAAgB,SAAS,CAAA;AAC9B,IAAA,MAAM,EAAA,GAAK,MAAM,IAAA,CAAK,eAAA,EAAgB;AAEtC,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,CAAG,UAAU,GAAG,CAAA;AACtB,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,EAAA,GAAK,MAAM,IAAA,CAAK,eAAA,EAAgB;AACtC,IAAA,MAAM,GAAG,SAAA,EAAU;AAAA,EACrB;AAAA,EAEA,MAAM,IAAA,GAAwB;AAC5B,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,MAAA,MAAM,KAAK,OAAA,EAAQ;AAAA,IACrB;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,KAAA,CAAO,kBAAA,EAAmB;AACnD,MAAA,OAAO,KAAA,CAAM,UAAA,CAAW,IAAA,CAAK,SAAS,GAAG,WAAA,IAAe,CAAA;AAAA,IAC1D,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,IAAA,GAA0B;AAC9B,IAAA,MAAM,EAAA,GAAK,MAAM,IAAA,CAAK,eAAA,EAAgB;AAEtC,IAAA,IAAI;AAGF,MAAA,MAAM,SAAS,MAAM,EAAA,CAAG,cAAc,EAAE,KAAA,EAAO,KAAO,CAAA;AACtD,MAAA,OAAO,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AAAA,IACvC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAM,KAAA,CACJ,MAAA,EACA,OAAA,EAC2B;AAC3B,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAClC,IAAA,MAAM,EAAA,GAAK,MAAM,IAAA,CAAK,eAAA,EAAgB;AAEtC,IAAA,MAAM,YAAA,GAAqC;AAAA,MACzC,MAAA;AAAA,MACA,IAAA,EAAM,SAAS,IAAA,IAAQ,EAAA;AAAA,MACvB,eAAA,EAAiB,IAAA;AAAA,MACjB,aAAA,EAAe,SAAS,gBAAA,IAAoB;AAAA,KAC9C;AAGA,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,YAAA,CAAa,SAAS,OAAA,CAAQ,MAAA;AAAA,IAChC;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,KAAA,CAAM,YAAY,CAAA;AAE1C,MAAA,MAAM,UAAiD,EAAC;AAExD,MAAA,KAAA,MAAW,KAAA,IAAS,OAAO,OAAA,EAAS;AAElC,QAAA,IAAI,OAAA,EAAS,aAAA,IAAiB,KAAA,CAAM,KAAA,GAAQ,QAAQ,aAAA,EAAe;AACjE,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,WAAW,KAAA,CAAM,QAAA;AAEvB,QAAA,IAAI,UAAU,SAAA,EAAW;AACvB,UAAA,IAAI;AACF,YAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,SAAS,CAAA;AAG3C,YAAA,IAAI,OAAA,EAAS,gBAAA,IAAoB,KAAA,CAAM,MAAA,EAAQ;AAC7C,cAAA,KAAA,CAAM,YAAY,KAAA,CAAM,MAAA;AAAA,YAC1B;AAEA,YAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,cACX,GAAG,KAAA;AAAA,cACH,OAAO,KAAA,CAAM;AAAA,aACd,CAAA;AAAA,UACH,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,OAAA;AAAA,QACA,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI;AAAA,OAClC;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,SAAS,EAAC;AAAA,QACV,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI;AAAA,OAClC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAA,GAAoC;AACxC,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAElC,IAAA,IAAI;AACF,MAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,QAAA,MAAM,KAAK,OAAA,EAAQ;AAAA,MACrB;AAEA,MAAA,MAAM,IAAA,CAAK,MAAO,kBAAA,EAAmB;AAErC,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,SAAA,EAAW,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,QAC/B,WAAW,GAAA;AAAI,OACjB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,SAAA,EAAW,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,QAC/B,WAAW,GAAA,EAAI;AAAA,QACf,OAAQ,KAAA,CAAgB;AAAA,OAC1B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,KAAA,GAAuB;AAErB,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AACV,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,IAAA,OAAO,QAAQ,OAAA,EAAQ;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,GAEI;AACR,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,MAAA,MAAM,KAAK,OAAA,EAAQ;AAAA,IACrB;AAEA,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,KAAA,CAAO,kBAAA,EAAmB;AAAA,IAC9C,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACF;AAKO,SAAS,yBACd,MAAA,EACoB;AACpB,EAAA,OAAO,IAAI,mBAAmB,MAAM,CAAA;AACtC;;;AC1aO,IAAe,oBAAf,MAAiC;AAmBxC;;;AClBA,IAAMA,eAAAA,GAAmC;AAAA,EACvC,mBAAA,EAAqB,IAAA;AAAA,EACrB,UAAA,EAAY,CAAC,OAAA,EAAS,UAAU;AAClC,CAAA;AAqBO,IAAM,kBAAA,GAAN,cAAiC,iBAAA,CAAkB;AAAA,EAC/C,IAAA,GAA0B,OAAA;AAAA,EAC3B,MAAA;AAAA,EAER,YAAY,MAAA,EAAoC;AAC9C,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,MAAA,GAAS,EAAE,GAAGA,eAAAA,EAAgB,GAAG,MAAA,EAAO;AAAA,EAC/C;AAAA,EAEA,MAAM,KAAA,CACJ,OAAA,EACA,KAAA,EACA,aACA,OAAA,EAC4B;AAC5B,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAGlC,IAAA,MAAM,YAAY,OAAA,EAAS,SAAA;AAC3B,IAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,OAAA,CAAQ,KAAA,EAAO,QAAQ,QAAA,EAAU;AAAA,MAChE,mBAAA,EAAqB,KAAK,MAAA,CAAO,mBAAA;AAAA,MACjC,kBAAA,EAAoB,IAAA,CAAK,MAAA,CAAO,UAAA,EAAY,SAAS,aAAa;AAAA,KACnE,CAAA;AAGD,IAAA,MAAM,aACJ,OAAA,CAAQ,WAAA,KAAgB,SAAY,CAAA,GAAA,EAAM,OAAA,CAAQ,WAAW,CAAA,CAAA,GAAK,EAAA;AAEpE,IAAA,MAAM,GAAA,GACJ,SAAA,IAAa,SAAA,KAAc,SAAA,GACvB,GAAG,OAAO,CAAA,EAAG,UAAU,CAAA,IAAA,EAAO,SAAS,CAAA,CAAA,GACvC,CAAA,EAAG,OAAO,GAAG,UAAU,CAAA,CAAA;AAG7B,IAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAEjC,IAAA,IAAI,KAAA,EAAO;AAET,MAAA,IACE,aACA,KAAA,CAAM,QAAA,CAAS,aACf,KAAA,CAAM,QAAA,CAAS,cAAc,SAAA,EAC7B;AACA,QAAA,OAAO;AAAA,UACL,GAAA,EAAK,KAAA;AAAA,UACL,SAAA,EAAW,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,UAC/B,MAAA,EAAQ;AAAA,SACV;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,GAAA,EAAK,IAAA;AAAA,QACL,KAAA;AAAA,QACA,UAAA,EAAY,CAAA;AAAA;AAAA,QACZ,SAAA,EAAW,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,QAC/B,MAAA,EAAQ;AAAA,OACV;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,KAAA;AAAA,MACL,SAAA,EAAW,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,MAC/B,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AACF;AAKO,SAAS,yBACd,MAAA,EACoB;AACpB,EAAA,OAAO,IAAI,mBAAmB,MAAM,CAAA;AACtC;;;AClGA,IAAMA,eAAAA,GAAsC;AAAA,EAC1C,SAAA,EAAW,IAAA;AAAA,EACX,UAAA,EAAY,IAAA;AAAA,EACZ,IAAA,EAAM;AACR,CAAA;AAqBO,IAAM,qBAAA,GAAN,cAAoC,iBAAA,CAAkB;AAAA,EAClD,IAAA,GAA0B,UAAA;AAAA,EAC3B,MAAA;AAAA,EAER,YAAY,MAAA,EAAuC;AACjD,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,MAAA,GAAS,EAAE,GAAGA,eAAAA,EAAgB,GAAG,MAAA,EAAO;AAAA,EAC/C;AAAA,EAEA,MAAM,KAAA,CACJ,OAAA,EACA,KAAA,EACA,YACA,OAAA,EAC4B;AAC5B,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAGlC,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,OAAO;AAAA,QACL,GAAA,EAAK,KAAA;AAAA,QACL,SAAA,EAAW,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,QAC/B,MAAA,EAAQ;AAAA,OACV;AAAA,IACF;AAGA,IAAA,MAAM,WAAA,GAAc,kBAAA,CAAmB,OAAA,CAAQ,QAAQ,CAAA;AAEvD,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,OAAO;AAAA,QACL,GAAA,EAAK,KAAA;AAAA,QACL,SAAA,EAAW,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,QAC/B,MAAA,EAAQ;AAAA,OACV;AAAA,IACF;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,cAAA,GAAiB,MAAM,UAAA,CAAW,KAAA,CAAM,WAAW,CAAA;AAGzD,MAAA,MAAM,SAAA,GAAY,OAAA,EAAS,SAAA,IAAa,IAAA,CAAK,OAAO,SAAA,IAAa,IAAA;AACjE,MAAA,MAAM,IAAA,GAAO,OAAA,EAAS,IAAA,IAAQ,IAAA,CAAK,OAAO,IAAA,IAAQ,CAAA;AAElD,MAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,KAAA,CAAM,cAAA,EAAgB;AAAA,QAChD,IAAA;AAAA,QACA,aAAA,EAAe,SAAA;AAAA,QACf,WAAW,OAAA,EAAS;AAAA,OACrB,CAAA;AAED,MAAA,IAAI,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AAE9B,QAAA,IAAI,SAAA,GAAY,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA;AAEjC,QAAA,IAAI,IAAA,CAAK,OAAO,UAAA,EAAY;AAC1B,UAAA,MAAM,UAAA,GAAa,QAAQ,OAAA,CAAQ,IAAA;AAAA,YACjC,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,CAAQ,UAAU,OAAA,CAAQ;AAAA,WACrC;AACA,UAAA,IAAI,UAAA,EAAY;AACd,YAAA,SAAA,GAAY,UAAA;AAAA,UACd;AAAA,QACF;AAEA,QAAA,IAAI,SAAA,IAAa,SAAA,CAAU,KAAA,IAAS,SAAA,EAAW;AAC7C,UAAA,OAAO;AAAA,YACL,GAAA,EAAK,IAAA;AAAA,YACL,KAAA,EAAO,SAAA;AAAA,YACP,YAAY,SAAA,CAAU,KAAA;AAAA,YACtB,SAAA,EAAW,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,YAC/B,MAAA,EAAQ;AAAA,WACV;AAAA,QACF;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,GAAA,EAAK,KAAA;AAAA,QACL,SAAA,EAAW,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,QAC/B,MAAA,EAAQ;AAAA,OACV;AAAA,IACF,SAAS,KAAA,EAAO;AAEd,MAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,KAAK,CAAA;AAC5C,MAAA,OAAO;AAAA,QACL,GAAA,EAAK,KAAA;AAAA,QACL,SAAA,EAAW,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,QAC/B,MAAA,EAAQ;AAAA,OACV;AAAA,IACF;AAAA,EACF;AACF;AAKO,SAAS,4BACd,MAAA,EACuB;AACvB,EAAA,OAAO,IAAI,sBAAsB,MAAM,CAAA;AACzC;;;AC3HA,IAAMA,eAAAA,GAAoC;AAAA,EACxC,KAAA,EAAO;AAAA,IACL,mBAAA,EAAqB,IAAA;AAAA,IACrB,UAAA,EAAY,CAAC,OAAA,EAAS,UAAU;AAAA,GAClC;AAAA,EACA,QAAA,EAAU;AAAA,IACR,SAAA,EAAW,IAAA;AAAA,IACX,UAAA,EAAY,IAAA;AAAA,IACZ,IAAA,EAAM;AAAA;AAEV,CAAA;AAqBO,IAAM,mBAAA,GAAN,cAAkC,iBAAA,CAAkB;AAAA,EAChD,IAAA,GAA0B,QAAA;AAAA,EAE3B,KAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EAER,YAAY,MAAA,EAAqC;AAC/C,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,MAAA,GAAS,EAAE,GAAGA,eAAAA,EAAgB,GAAG,MAAA,EAAO;AAC7C,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,kBAAA,CAAmB,IAAA,CAAK,OAAO,KAAK,CAAA;AACrD,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,qBAAA,CAAsB,IAAA,CAAK,OAAO,QAAQ,CAAA;AAAA,EAChE;AAAA,EAEA,MAAM,KAAA,CACJ,OAAA,EACA,KAAA,EACA,YACA,OAAA,EAC4B;AAC5B,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAGlC,IAAA,IAAI,IAAA,CAAK,kBAAA,CAAmB,OAAO,CAAA,EAAG;AACpC,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,KAAA,CAAM,KAAA;AAAA,QAC9B,OAAA;AAAA,QACA,KAAA;AAAA,QACA,UAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,OAAO;AAAA,QACL,GAAG,MAAA;AAAA,QACH,SAAA,EAAW,WAAA,CAAY,GAAA,EAAI,GAAI;AAAA,OACjC;AAAA,IACF;AAGA,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,KAAA,CAAM,KAAA;AAAA,MACnC,OAAA;AAAA,MACA,KAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,IAAI,YAAY,GAAA,EAAK;AACnB,MAAA,OAAO;AAAA,QACL,GAAG,WAAA;AAAA,QACH,SAAA,EAAW,WAAA,CAAY,GAAA,EAAI,GAAI;AAAA,OACjC;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,IAAA,CAAK,iBAAA,CAAkB,OAAO,CAAA,EAAG;AACpC,MAAA,OAAO;AAAA,QACL,GAAA,EAAK,KAAA;AAAA,QACL,SAAA,EAAW,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,QAC/B,MAAA,EAAQ;AAAA,OACV;AAAA,IACF;AAGA,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,QAAA,CAAS,KAAA;AAAA,QACzC,OAAA;AAAA,QACA,KAAA;AAAA,QACA,UAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,OAAO;AAAA,QACL,GAAG,cAAA;AAAA,QACH,SAAA,EAAW,WAAA,CAAY,GAAA,EAAI,GAAI;AAAA,OACjC;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,KAAA;AAAA,MACL,SAAA,EAAW,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,MAC/B,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,OAAA,EAAgC;AACzD,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,iBAAA,EAAmB,OAAO,KAAA;AAE3C,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,kBAAA,CAAmB,OAAO,CAAA;AACnD,IAAA,OAAO,IAAA,CAAK,OAAO,iBAAA,CAAkB,IAAA;AAAA,MAAK,CAAC,OAAA,KACzC,OAAA,CAAQ,IAAA,CAAK,WAAW;AAAA,KAC1B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,OAAA,EAAgC;AAExD,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,gBAAA,EAAkB,OAAO,IAAA;AAE1C,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,kBAAA,CAAmB,OAAO,CAAA;AACnD,IAAA,OAAO,IAAA,CAAK,OAAO,gBAAA,CAAiB,IAAA;AAAA,MAAK,CAAC,OAAA,KACxC,OAAA,CAAQ,IAAA,CAAK,WAAW;AAAA,KAC1B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,OAAA,EAA+B;AACxD,IAAA,KAAA,IAAS,IAAI,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACrD,MAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,CAAC,CAAA,CAAE,SAAS,MAAA,EAAQ;AACvC,QAAA,OAAO,OAAA,CAAQ,QAAA,CAAS,CAAC,CAAA,CAAE,OAAA;AAAA,MAC7B;AAAA,IACF;AACA,IAAA,OAAO,EAAA;AAAA,EACT;AACF;AAKO,SAAS,0BACd,MAAA,EACqB;AACrB,EAAA,OAAO,IAAI,oBAAoB,MAAM,CAAA;AACvC;;;AC3HO,IAAM,mBAAN,MAAuB;AAAA,EACpB,QAAA;AAAA,EACA,MAAA;AAAA,EACA,cAAA;AAAA,EACA,YAAA;AAAA,EAER,YAAY,MAAA,EAAgC;AAC1C,IAAA,IAAA,CAAK,WAAW,MAAA,CAAO,QAAA;AACvB,IAAA,IAAA,CAAK,MAAA,GAAS,OAAO,MAAA,IAAU,QAAA;AAC/B,IAAA,IAAA,CAAK,YAAA,GAAe,OAAO,YAAA,IAAgB,GAAA;AAE3C,IAAA,IAAI,OAAO,eAAA,EAAiB;AAC1B,MAAA,IAAA,CAAK,cAAA,uBAAqB,GAAA,EAAI;AAAA,IAChC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAM,IAAA,EAAiC;AAE3C,IAAA,IAAI,IAAA,CAAK,cAAA,EAAgB,GAAA,CAAI,IAAI,CAAA,EAAG;AAClC,MAAA,OAAO,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,IAAI,CAAA;AAAA,IACrC;AAEA,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,QAAA,CAAS,MAAM,IAAI,CAAA;AAGhD,IAAA,IAAI,KAAK,cAAA,EAAgB;AAEvB,MAAA,IAAI,IAAA,CAAK,cAAA,CAAe,IAAA,IAAQ,IAAA,CAAK,YAAA,EAAc;AACjD,QAAA,MAAM,WAAW,IAAA,CAAK,cAAA,CAAe,IAAA,EAAK,CAAE,MAAK,CAAE,KAAA;AACnD,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,IAAA,CAAK,cAAA,CAAe,OAAO,QAAQ,CAAA;AAAA,QACrC;AAAA,MACF;AACA,MAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,IAAA,EAAM,SAAS,CAAA;AAAA,IACzC;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,KAAA,EAAsC;AACrD,IAAA,IAAI,IAAA,CAAK,SAAS,UAAA,EAAY;AAC5B,MAAA,OAAO,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,KAAK,CAAA;AAAA,IACvC;AAGA,IAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,CAAC,SAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAC,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,CAAkB,GAAa,CAAA,EAAqB;AAClD,IAAA,QAAQ,KAAK,MAAA;AAAQ,MACnB,KAAK,QAAA;AACH,QAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,CAAA,EAAG,CAAC,CAAA;AAAA,MACnC,KAAK,WAAA,EAAa;AAEhB,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,iBAAA,CAAkB,CAAA,EAAG,CAAC,CAAA;AACxC,QAAA,OAAO,KAAK,CAAA,GAAI,IAAA,CAAA;AAAA,MAClB;AAAA,MACA,KAAK,aAAA;AACH,QAAA,OAAO,IAAA,CAAK,UAAA,CAAW,CAAA,EAAG,CAAC,CAAA;AAAA,MAC7B;AACE,QAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,CAAA,EAAG,CAAC,CAAA;AAAA;AACrC,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,CACE,KAAA,EACA,UAAA,EACA,aAAA,GAAgB,CAAA,EAC2B;AAC3C,IAAA,MAAM,OAAA,GAAU,UAAA,CACb,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACX,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,UAAA,EAAY,IAAA,CAAK,iBAAA,CAAkB,KAAA,EAAO,EAAE,MAAM;AAAA,MAClD,CAAA,CACD,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,UAAA,IAAc,aAAa,CAAA,CAC3C,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,UAAA,GAAa,EAAE,UAAU,CAAA;AAE7C,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,UAAA,GAAqB;AACvB,IAAA,OAAO,IAAA,CAAK,SAAS,UAAA,IAAc,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAmB;AACjB,IAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAA0D;AACxD,IAAA,IAAI,CAAC,IAAA,CAAK,cAAA,EAAgB,OAAO,IAAA;AACjC,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,KAAK,cAAA,CAAe,IAAA;AAAA,MAC1B,SAAS,IAAA,CAAK;AAAA,KAChB;AAAA,EACF;AAAA,EAEQ,gBAAA,CAAiB,GAAa,CAAA,EAAqB;AACzD,IAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,MAAA,EAAQ,OAAO,CAAA;AAElC,IAAA,IAAIC,WAAAA,GAAa,CAAA;AACjB,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AACjC,MAAAA,WAAAA,IAAc,CAAA,CAAE,CAAC,CAAA,GAAI,EAAE,CAAC,CAAA;AACxB,MAAA,KAAA,IAAS,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AACnB,MAAA,KAAA,IAAS,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AAAA,IACrB;AAEA,IAAA,MAAM,cAAc,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,GAAI,IAAA,CAAK,KAAK,KAAK,CAAA;AACtD,IAAA,IAAI,WAAA,KAAgB,GAAG,OAAO,CAAA;AAE9B,IAAA,OAAOA,WAAAA,GAAa,WAAA;AAAA,EACtB;AAAA,EAEQ,iBAAA,CAAkB,GAAa,CAAA,EAAqB;AAC1D,IAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,MAAA,EAAQ,OAAO,QAAA;AAElC,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AACjC,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,CAAC,CAAA,GAAI,EAAE,CAAC,CAAA;AACvB,MAAA,GAAA,IAAO,IAAA,GAAO,IAAA;AAAA,IAChB;AAEA,IAAA,OAAO,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,EACtB;AAAA,EAEQ,UAAA,CAAW,GAAa,CAAA,EAAqB;AACnD,IAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,MAAA,EAAQ,OAAO,CAAA;AAElC,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AACjC,MAAA,GAAA,IAAO,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AAAA,IACnB;AAEA,IAAA,OAAO,GAAA;AAAA,EACT;AACF;AAKO,SAAS,uBACd,MAAA,EACkB;AAClB,EAAA,OAAO,IAAI,iBAAiB,MAAM,CAAA;AACpC;;;ACtNA,IAAMD,eAAAA,GAA8C;AAAA,EAClD,SAAA,EAAW,GAAA;AAAA,EACX,UAAU,EAAA,GAAK,IAAA;AAAA;AAAA,EACf,eAAA,EAAiB,GAAA;AAAA,EACjB,aAAA,EAAe;AACjB,CAAA;AAkBO,IAAM,cAAN,MAAkB;AAAA,EACf,SAAwB,EAAC;AAAA,EACzB,YAAA,GAAe,CAAA;AAAA,EACf,MAAA;AAAA,EACA,UAAA,GAAoD,IAAA;AAAA,EACpD,OAAA;AAAA,EAER,WAAA,CACE,QACA,OAAA,EACA;AACA,IAAA,IAAA,CAAK,MAAA,GAAS,EAAE,GAAGA,eAAAA,EAAgB,GAAG,MAAA,EAAO;AAC7C,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAEf,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,eAAA,GAAkB,CAAA,EAAG;AACnC,MAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,IACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,KAAA,EAA0B;AAC5B,IAAA,IAAI,IAAA,CAAK,OAAO,aAAA,EAAe;AAE7B,MAAA,IAAI,KAAA,CAAM,UAAU,MAAA,EAAW;AAC7B,QAAA,KAAA,CAAM,KAAA,GAAQ,KAAK,MAAA,CAAO,MAAA;AAAA,MAC5B;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,KAAK,CAAA;AACtB,IAAA,IAAA,CAAK,YAAA,IAAgB,IAAA,CAAK,iBAAA,CAAkB,KAAK,CAAA;AAGjD,IAAA,IAAI,IAAA,CAAK,aAAY,EAAG;AACtB,MAAA,IAAA,CAAK,KAAA,EAAM;AAAA,IACb;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,MAAA,EAA6B;AAClC,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAA,CAAK,IAAI,KAAK,CAAA;AAAA,IAChB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAuB;AACrB,IAAA,MAAM,UAAU,IAAA,CAAK,MAAA;AAGrB,IAAA,IAAI,IAAA,CAAK,OAAO,aAAA,EAAe;AAC7B,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AAAA,IAC1C;AAGA,IAAA,IAAA,CAAK,SAAS,EAAC;AACf,IAAA,IAAA,CAAK,YAAA,GAAe,CAAA;AAGpB,IAAA,IAAI,IAAA,CAAK,OAAA,IAAW,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AACtC,MAAA,IAAA,CAAK,QAAQ,OAAO,CAAA;AAAA,IACtB;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,GAAe;AACb,IAAA,OAAO,KAAK,MAAA,CAAO,MAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAgB;AACd,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAmB;AACjB,IAAA,OAAO,IAAA,CAAK,OAAO,MAAA,KAAW,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,GAA+B;AAC7B,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,SAAS,EAAC;AACf,IAAA,IAAA,CAAK,YAAA,GAAe,CAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,GAAa;AACX,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,aAAA,CAAc,KAAK,UAAU,CAAA;AAC7B,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAAA,IACpB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,IAAA,EAAK;AACV,IAAA,IAAA,CAAK,KAAA,EAAM;AAAA,EACb;AAAA,EAEQ,WAAA,GAAuB;AAC7B,IAAA,OACE,IAAA,CAAK,OAAO,MAAA,IAAU,IAAA,CAAK,OAAO,SAAA,IAClC,IAAA,CAAK,YAAA,IAAgB,IAAA,CAAK,MAAA,CAAO,QAAA;AAAA,EAErC;AAAA,EAEQ,eAAA,GAAwB;AAC9B,IAAA,IAAA,CAAK,UAAA,GAAa,YAAY,MAAM;AAClC,MAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAQ,EAAG;AACnB,QAAA,IAAA,CAAK,KAAA,EAAM;AAAA,MACb;AAAA,IACF,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,eAAe,CAAA;AAAA,EAChC;AAAA,EAEQ,kBAAkB,KAAA,EAA4B;AACpD,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,IAAI,MAAM,OAAA,EAAS;AACjB,MAAA,IAAA,IAAQ,KAAA,CAAM,QAAQ,MAAA,GAAS,CAAA;AAAA,IACjC;AACA,IAAA,IAAI,MAAM,QAAA,EAAU;AAClB,MAAA,IAAA,IAAQ,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,QAAQ,CAAA,CAAE,MAAA;AAAA,IACzC;AACA,IAAA,IAAI,MAAM,UAAA,EAAY;AACpB,MAAA,IAAA,IAAQ,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,UAAU,CAAA,CAAE,MAAA;AAAA,IAC3C;AACA,IAAA,IAAI,MAAM,QAAA,EAAU;AAClB,MAAA,IAAA,IAAQ,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,QAAQ,CAAA,CAAE,MAAA;AAAA,IACzC;AACA,IAAA,OAAO,IAAA,GAAO,EAAA;AAAA,EAChB;AACF;AAKO,SAAS,iBAAA,CACd,QACA,OAAA,EACa;AACb,EAAA,OAAO,IAAI,WAAA,CAAY,MAAA,EAAQ,OAAO,CAAA;AACxC;;;ACvLA,IAAMA,gBAAAA,GAAiD;AAAA,EACrD,MAAA,EAAQ;AAAA,IACN,SAAA,EAAW,GAAA;AAAA,IACX,UAAU,EAAA,GAAK,IAAA;AAAA,IACf,eAAA,EAAiB,CAAA;AAAA;AAAA,IACjB,aAAA,EAAe;AAAA,GACjB;AAAA,EACA,gBAAA,EAAkB,IAAA;AAAA,EAClB,eAAA,EAAiB,IAAA;AAAA,EACjB,aAAA,EAAe,GAAA;AAAA;AAAA,EACf,SAAA,EAAW;AACb,CAAA;AAsBO,IAAM,iBAAN,MAAqB;AAAA,EAClB,MAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ,SAAA,GAAY,CAAA;AAAA,EACZ,KAAA,GAAQ,EAAA;AAAA,EACR,WAAqD,EAAC;AAAA,EACtD,GAAA,GAAM,EAAA;AAAA,EACN,UAAA,GAAa,CAAA;AAAA,EACb,UAAA,GAAa,CAAA;AAAA,EACb,SAAA,GAAkD,IAAA;AAAA,EAE1D,YAAY,MAAA,EAA+B;AACzC,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,GAAGA,gBAAAA;AAAA,MACH,GAAG,MAAA;AAAA,MACH,QAAQ,EAAE,GAAGA,iBAAe,MAAA,EAAQ,GAAG,QAAQ,MAAA;AAAO,KACxD;AACA,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,WAAA,CAAY,IAAA,CAAK,OAAO,MAAM,CAAA;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,CACE,KAAA,EACA,QAAA,EACA,GAAA,EACM;AACN,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACjD;AAEA,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,IAAA,CAAK,YAAY,GAAA,EAAI;AACrB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,GAAA,GAAM,OAAO,UAAA,EAAW;AAC7B,IAAA,IAAA,CAAK,UAAA,GAAa,CAAA;AAClB,IAAA,IAAA,CAAK,UAAA,GAAa,CAAA;AAClB,IAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAGlB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,aAAA,GAAgB,CAAA,EAAG;AACjC,MAAA,IAAA,CAAK,SAAA,GAAY,WAAW,MAAM;AAChC,QAAA,IAAI,KAAK,SAAA,EAAW;AAClB,UAAA,IAAA,CAAK,MAAM,qCAAqC,CAAA;AAAA,QAClD;AAAA,MACF,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,aAAa,CAAA;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,CAAW,SAAiB,QAAA,EAA0C;AACpE,IAAA,IAAA,CAAK,WAAA,CAAY;AAAA,MACf,IAAA,EAAM,MAAA;AAAA,MACN,OAAA;AAAA,MACA,QAAA,EAAU,IAAA,CAAK,MAAA,CAAO,eAAA,GAAkB,QAAA,GAAW,MAAA;AAAA,MACnD,WAAW,GAAA,EAAI;AAAA,MACf,OAAO,IAAA,CAAK,UAAA;AAAA,KACb,CAAA;AACD,IAAA,IAAA,CAAK,cAAc,OAAA,CAAQ,MAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,CACE,EAAA,EACA,IAAA,EACA,IAAA,EACA,QAAA,EACM;AACN,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,gBAAA,EAAkB;AAEnC,IAAA,IAAA,CAAK,WAAA,CAAY;AAAA,MACf,IAAA,EAAM,WAAA;AAAA,MACN,QAAA,EAAU,EAAE,EAAA,EAAI,IAAA,EAAM,WAAW,IAAA,EAAK;AAAA,MACtC,QAAA,EAAU,IAAA,CAAK,MAAA,CAAO,eAAA,GAAkB,QAAA,GAAW,MAAA;AAAA,MACnD,WAAW,GAAA,EAAI;AAAA,MACf,OAAO,IAAA,CAAK,UAAA;AAAA,KACb,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAA,CACE,MAAA,EACA,OAAA,EACA,QAAA,EACM;AACN,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,gBAAA,EAAkB;AAEnC,IAAA,IAAA,CAAK,WAAA,CAAY;AAAA,MACf,IAAA,EAAM,aAAA;AAAA,MACN,UAAA,EAAY,EAAE,MAAA,EAAQ,OAAA,EAAQ;AAAA,MAC9B,QAAA,EAAU,IAAA,CAAK,MAAA,CAAO,eAAA,GAAkB,QAAA,GAAW,MAAA;AAAA,MACnD,WAAW,GAAA,EAAI;AAAA,MACf,OAAO,IAAA,CAAK,UAAA;AAAA,KACb,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,QAAA,EAAyC;AACtD,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,eAAA,EAAiB;AAElC,IAAA,IAAA,CAAK,WAAA,CAAY;AAAA,MACf,IAAA,EAAM,UAAA;AAAA,MACN,QAAA;AAAA,MACA,WAAW,GAAA,EAAI;AAAA,MACf,OAAO,IAAA,CAAK,UAAA;AAAA,KACb,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,KAAA,EAA0B;AACpC,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,IAC3C;AAGA,IAAA,IAAI,KAAA,CAAM,KAAA,IAAS,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW;AACxC,MAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,IAC3C;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,IAAI,KAAK,CAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,UAAA,EAIU;AACjB,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,IAC3C;AAEA,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,MAAM,UAAU,GAAA,EAAI;AACpB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,KAAA,EAAM;AAEjC,IAAA,MAAM,MAAA,GAAyB;AAAA,MAC7B,IAAI,UAAA,EAAW;AAAA,MACf,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,MAAA;AAAA,MACA,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,OAAA;AAAA,MACA,UAAA,EAAY,UAAU,IAAA,CAAK,SAAA;AAAA,MAC3B,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,UAAA;AAAA,MACA,QAAA,EAAU;AAAA,KACZ;AAEA,IAAA,IAAA,CAAK,KAAA,EAAM;AACX,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,EAAiC;AACrC,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,IAC3C;AAEA,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,MAAM,UAAU,GAAA,EAAI;AACpB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,KAAA,EAAM;AAEjC,IAAA,MAAM,MAAA,GAAyB;AAAA,MAC7B,IAAI,UAAA,EAAW;AAAA,MACf,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,MAAA;AAAA,MACA,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,OAAA;AAAA,MACA,UAAA,EAAY,UAAU,IAAA,CAAK,SAAA;AAAA,MAC3B,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,QAAA,EAAU,KAAA;AAAA,MACV,OAAO,MAAA,IAAU;AAAA,KACnB;AAEA,IAAA,IAAA,CAAK,KAAA,EAAM;AACX,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAwB;AACtB,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAsB;AACpB,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,EAAW,OAAO,CAAA;AAC5B,IAAA,OAAO,GAAA,KAAQ,IAAA,CAAK,SAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,IAAA,CAAK,OAAO,OAAA,EAAQ;AACpB,IAAA,IAAA,CAAK,KAAA,EAAM;AAAA,EACb;AAAA,EAEQ,KAAA,GAAc;AACpB,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,IAAA,IAAA,CAAK,SAAA,GAAY,CAAA;AACjB,IAAA,IAAA,CAAK,KAAA,GAAQ,EAAA;AACb,IAAA,IAAA,CAAK,WAAW,EAAC;AACjB,IAAA,IAAA,CAAK,GAAA,GAAM,EAAA;AACX,IAAA,IAAA,CAAK,UAAA,GAAa,CAAA;AAClB,IAAA,IAAA,CAAK,UAAA,GAAa,CAAA;AAAA,EACpB;AAAA,EAEQ,YAAA,GAAqB;AAC3B,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,YAAA,CAAa,KAAK,SAAS,CAAA;AAC3B,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,IACnB;AAAA,EACF;AACF;AAKO,SAAS,qBACd,MAAA,EACgB;AAChB,EAAA,OAAO,IAAI,eAAe,MAAM,CAAA;AAClC;;;AClSA,IAAMA,gBAAAA,GAAiD;AAAA,EACrD,eAAA,EAAiB,CAAA;AAAA,EACjB,UAAA,EAAY,CAAA;AAAA,EACZ,UAAA,EAAY,GAAA;AAAA,EACZ,cAAA,EAAgB,KAAA;AAAA,EAChB,SAAS,MAAM;AAAA,EAAC,CAAA;AAAA,EAChB,YAAY,MAAM;AAAA,EAAC,CAAA;AAAA,EACnB,SAAS,MAAM;AAAA,EAAC;AAClB,CAAA;AAmBO,IAAM,iBAAN,MAAqB;AAAA,EAClB,MAAA;AAAA,EACA,eAAA,GAA0C,IAAA;AAAA,EAElD,YAAY,MAAA,EAA+B;AACzC,IAAA,IAAA,CAAK,MAAA,GAAS,EAAE,GAAGA,gBAAAA,EAAgB,GAAG,MAAA,EAAO;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,OAAO,MAAA,EAAqD;AACjE,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAI,eAAA,EAAgB;AAC3C,IAAA,MAAM,MAAA,GAAS,KAAK,eAAA,CAAgB,MAAA;AAEpC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,CAAC,GAAG,MAAA,CAAO,MAAM,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AAClE,MAAA,IAAI,aAAA,GAAgB,MAAA,CAAO,CAAC,CAAA,EAAG,SAAA,IAAa,CAAA;AAE5C,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,QAAA,IAAI,OAAO,OAAA,EAAS;AAClB,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,KAAA,GAAQ,OAAO,CAAC,CAAA;AAGtB,QAAA,IAAI,IAAA,CAAK,MAAA,CAAO,cAAA,IAAkB,CAAA,GAAI,CAAA,EAAG;AACvC,UAAA,MAAM,QAAA,GAAW,MAAM,SAAA,GAAY,aAAA;AACnC,UAAA,MAAM,QAAQ,IAAA,CAAK,GAAA;AAAA,YACjB,IAAA,CAAK,GAAA;AAAA,cACH,QAAA,GAAW,KAAK,MAAA,CAAO,eAAA;AAAA,cACvB,KAAK,MAAA,CAAO;AAAA,aACd;AAAA,YACA,KAAK,MAAA,CAAO;AAAA,WACd;AAEA,UAAA,IAAI,QAAQ,CAAA,EAAG;AACb,YAAA,MAAM,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,MAAM,CAAA;AAAA,UAChC;AAAA,QACF;AAEA,QAAA,aAAA,GAAgB,KAAA,CAAM,SAAA;AACtB,QAAA,IAAA,CAAK,MAAA,CAAO,QAAQ,KAAK,CAAA;AACzB,QAAA,MAAM,KAAA;AAAA,MACR;AAEA,MAAA,IAAA,CAAK,MAAA,CAAO,WAAW,MAAM,CAAA;AAAA,IAC/B,SAAS,KAAA,EAAO;AACd,MAAA,IAAK,KAAA,CAAgB,SAAS,YAAA,EAAc;AAC1C,QAAA,IAAA,CAAK,MAAA,CAAO,QAAQ,KAAc,CAAA;AAClC,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,IACzB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,WAAW,MAAA,EAAgD;AAChE,IAAA,WAAA,MAAiB,KAAA,IAAS,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,EAAG;AAC7C,MAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,IAAU,KAAA,CAAM,OAAA,EAAS;AAC1C,QAAA,MAAM,KAAA,CAAM,OAAA;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,CAAC,WAAW,MAAA,EAAgD;AAC1D,IAAA,MAAM,MAAA,GAAS,CAAC,GAAG,MAAA,CAAO,MAAM,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AAClE,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAA,CAAK,MAAA,CAAO,QAAQ,KAAK,CAAA;AACzB,MAAA,MAAM,KAAA;AAAA,IACR;AACA,IAAA,IAAA,CAAK,MAAA,CAAO,WAAW,MAAM,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,MAAA,EAAuC;AAClD,IAAA,OAAO,CAAC,GAAG,MAAA,CAAO,MAAM,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,KAAK,CAAA;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,MAAA,EAAgC;AAC1C,IAAA,OAAO,MAAA,CAAO,MAAA,CACX,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,CAAA,CAAE,OAAO,CAAA,CAC5C,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,KAAK,CAAA,CAChC,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAA,CACpB,IAAA,CAAK,EAAE,CAAA;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA,EAKA,aACE,MAAA,EACwD;AACxD,IAAA,OAAO,MAAA,CAAO,MAAA,CACX,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,IAAA,KAAS,WAAA,IAAe,CAAA,CAAE,QAAQ,CAAA,CAClD,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,KAAK,EAChC,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,QAAS,CAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,GAAa;AACX,IAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,MAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,MAAA,EAA6C;AACrD,IAAA,IAAA,CAAK,SAAS,EAAE,GAAG,IAAA,CAAK,MAAA,EAAQ,GAAG,MAAA,EAAO;AAAA,EAC5C;AAAA,EAEQ,KAAA,CAAM,IAAY,MAAA,EAAoC;AAC5D,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,MAAA,MAAM,SAAA,GAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAA;AAExC,MAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,MAAM;AACrC,QAAA,YAAA,CAAa,SAAS,CAAA;AACtB,QAAA,MAAA,CAAO,IAAI,YAAA,CAAa,SAAA,EAAW,YAAY,CAAC,CAAA;AAAA,MAClD,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AACF;AAKO,SAAS,qBACd,MAAA,EACgB;AAChB,EAAA,OAAO,IAAI,eAAe,MAAM,CAAA;AAClC;ACzJA,IAAMA,gBAAAA,GAA8C;AAAA,EAClD,UAAU,EAAC;AAAA,EACX,UAAU,EAAC;AAAA,EACX,eAAA,EAAiB,KAAA;AAAA,EACjB,gBAAA,EAAkB,EAAA;AAAA,EAClB,SAAA,EAAW;AAAA;AACb,CAAA;AA2BO,IAAM,WAAA,GAAN,cAA0BG,aAAAA,CAAgC;AAAA,EACvD,KAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA,GAA0B;AAAA,IAChC,YAAA,EAAc,CAAA;AAAA,IACd,SAAA,EAAW,CAAA;AAAA,IACX,WAAA,EAAa,CAAA;AAAA,IACb,OAAA,EAAS,CAAA;AAAA,IACT,kBAAA,EAAoB,CAAA;AAAA,IACpB,kBAAA,EAAoB,CAAA;AAAA,IACpB,gBAAA,EAAkB,CAAA;AAAA,IAClB,mBAAA,EAAqB;AAAA,GACvB;AAAA,EACQ,kBAA4B,EAAC;AAAA,EAC7B,kBAA4B,EAAC;AAAA,EAErC,WAAA,CACE,KAAA,EACA,MAAA,EACA,UAAA,EACA;AACA,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,IAAA,IAAA,CAAK,MAAA,GAAS,EAAE,GAAGH,gBAAAA,EAAgB,GAAG,MAAA,EAAO;AAC7C,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,cAAA,CAAe,IAAA,CAAK,OAAO,QAAQ,CAAA;AACvD,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,cAAA,CAAe,IAAA,CAAK,OAAO,QAAQ,CAAA;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,CACJ,KAAA,EACA,QAAA,EACkC;AAClC,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAClC,IAAA,IAAA,CAAK,KAAA,CAAM,YAAA,EAAA;AAEX,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,iBAAA,CAAkB,KAAA,EAAO,QAAQ,CAAA;AAElD,IAAA,IAAI;AAEF,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,KAAA,CAAM,IAAI,GAAG,CAAA;AAEtC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,iBAAA,CAAkB,KAAA,CAAM,SAAS,OAAO,CAAA;AAC5D,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,IAAA,CAAK,KAAA,CAAM,SAAA,EAAA;AACX,UAAA,IAAA,CAAK,aAAA,EAAc;AACnB,UAAA,MAAMI,UAAAA,GAAY,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AACtC,UAAA,IAAA,CAAK,eAAA,CAAgB,KAAKA,UAAS,CAAA;AAEnC,UAAA,MAAM,MAAA,GAAkC;AAAA,YACtC,GAAA,EAAK,IAAA;AAAA,YACL,MAAA;AAAA,YACA,UAAA,EAAY,CAAA;AAAA,YACZ,MAAA,EAAQ,OAAA;AAAA,YACR,SAAA,EAAAA;AAAA,WACF;AAEA,UAAA,IAAA,CAAK,IAAA,CAAK,OAAO,MAAM,CAAA;AACvB,UAAA,OAAO,MAAA;AAAA,QACT;AAAA,MACF;AAGA,MAAA,IAAI,KAAK,UAAA,EAAY;AACnB,QAAA,MAAM,WAAA,GAAc,SAAS,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,MAAM,CAAA,EAAG,OAAA;AAC7D,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,UAAA,CAAW,MAAM,WAAW,CAAA;AACzD,UAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,KAAA,CAAM,MAAM,SAAA,EAAW;AAAA,YAChD,IAAA,EAAM,CAAA;AAAA,YACN,aAAA,EAAe;AAAA,WAChB,CAAA;AAED,UAAA,IAAI,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AAC9B,YAAA,MAAMC,MAAAA,GAAQ,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA;AAC/B,YAAA,MAAM,MAAA,GAAS,IAAA,CAAK,iBAAA,CAAkBA,MAAAA,CAAM,SAAS,OAAO,CAAA;AAC5D,YAAA,IAAI,MAAA,IAAUA,MAAAA,CAAM,KAAA,IAAS,IAAA,EAAM;AACjC,cAAA,IAAA,CAAK,KAAA,CAAM,SAAA,EAAA;AACX,cAAA,IAAA,CAAK,aAAA,EAAc;AACnB,cAAA,MAAMD,UAAAA,GAAY,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AACtC,cAAA,IAAA,CAAK,eAAA,CAAgB,KAAKA,UAAS,CAAA;AAEnC,cAAA,MAAM,MAAA,GAAkC;AAAA,gBACtC,GAAA,EAAK,IAAA;AAAA,gBACL,MAAA;AAAA,gBACA,YAAYC,MAAAA,CAAM,KAAA;AAAA,gBAClB,MAAA,EAAQ,UAAA;AAAA,gBACR,SAAA,EAAAD;AAAA,eACF;AAEA,cAAA,IAAA,CAAK,IAAA,CAAK,OAAO,MAAM,CAAA;AACvB,cAAA,OAAO,MAAA;AAAA,YACT;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAGA,MAAA,IAAA,CAAK,KAAA,CAAM,WAAA,EAAA;AACX,MAAA,IAAA,CAAK,aAAA,EAAc;AACnB,MAAA,MAAM,SAAA,GAAY,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAEtC,MAAA,IAAA,CAAK,IAAA,CAAK,QAAQ,GAAG,CAAA;AACrB,MAAA,OAAO;AAAA,QACL,GAAA,EAAK,KAAA;AAAA,QACL,MAAA,EAAQ,MAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,IAAA,CAAK,SAAS,KAAc,CAAA;AACjC,MAAA,OAAO;AAAA,QACL,GAAA,EAAK,KAAA;AAAA,QACL,MAAA,EAAQ,MAAA;AAAA,QACR,SAAA,EAAW,WAAA,CAAY,GAAA,EAAI,GAAI;AAAA,OACjC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,CAAM,MAAA,EAAwB,SAAA,EAAqC;AAEvE,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,IAAY,CAAC,IAAA,CAAK,OAAO,eAAA,EAAiB;AACpD,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,MAAA,CAAO,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,gBAAA,EAAkB;AACpD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAM,IAAA,CAAK,iBAAA,CAAkB,MAAA,CAAO,KAAA,EAAO,OAAO,QAAQ,CAAA;AAEhE,IAAA,IAAI;AAEF,MAAA,MAAM,aAAA,GAAgC,MAAA,CAAO,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QAChE,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,SAAS,CAAA,CAAE;AAAA,OACb,CAAE,CAAA;AAEF,MAAA,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK;AAAA,QACxB,IAAI,UAAA,EAAW;AAAA,QACf,GAAA;AAAA,QACA,OAAA,EAAS;AAAA,UACP,QAAA,EAAU,aAAA;AAAA,UACV,OAAO,MAAA,CAAO;AAAA,SAChB;AAAA,QACA,QAAA,EAAU;AAAA,UACR,OAAA,EAAS,IAAA,CAAK,eAAA,CAAgB,MAAM,CAAA;AAAA,UACpC,OAAO,MAAA,CAAO,KAAA;AAAA,UACd,YAAA,EAAc,MAAA,CAAO,QAAA,GAAW,MAAA,GAAS,OAAA;AAAA,UACzC,KAAA,EAAO;AAAA,YACL,YAAA,EAAc,MAAA,CAAO,UAAA,EAAY,MAAA,IAAU,CAAA;AAAA,YAC3C,gBAAA,EAAkB,MAAA,CAAO,UAAA,EAAY,UAAA,IAAc,CAAA;AAAA,YACnD,WAAA,EAAa,MAAA,CAAO,UAAA,EAAY,KAAA,IAAS;AAAA;AAC3C,SACF;AAAA,QACA,SAAA;AAAA,QACA,QAAA,EAAU;AAAA,UACR,WAAW,GAAA,EAAI;AAAA,UACf,YAAY,GAAA,EAAI;AAAA,UAChB,WAAA,EAAa,CAAA;AAAA,UACb,QAAA,EAAU,CAAA;AAAA,UACV,GAAA,EAAK,KAAK,MAAA,CAAO;AAAA;AACnB,OACD,CAAA;AAED,MAAA,IAAA,CAAK,KAAA,CAAM,kBAAA,EAAA;AACX,MAAA,IAAA,CAAK,KAAA,CAAM,gBAAA,IAAoB,IAAA,CAAK,kBAAA,CAAmB,MAAM,CAAA;AAC7D,MAAA,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,MAAA,CAAO,UAAU,CAAA;AAC3C,MAAA,IAAA,CAAK,uBAAA,EAAwB;AAE7B,MAAA,IAAA,CAAK,IAAA,CAAK,UAAU,MAAM,CAAA;AAAA,IAC5B,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,IAAA,CAAK,SAAS,KAAc,CAAA;AAAA,IACnC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,UAAA,CACL,KAAA,EACA,QAAA,EACA,UACA,OAAA,EACmB;AAEnB,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,QAAQ,CAAA;AAEtD,IAAA,IAAI,YAAA,CAAa,GAAA,IAAO,YAAA,CAAa,MAAA,EAAQ;AAE3C,MAAA,WAAA,MAAiB,SAAS,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,YAAA,CAAa,MAAM,CAAA,EAAG;AACnE,QAAA,MAAM,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,EAAQ;AAAA,MACjC;AACA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,iBAAA,CAAkB,KAAA,EAAO,QAAQ,CAAA;AAClD,IAAA,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,KAAA,EAAO,QAAA,EAAU,GAAG,CAAA;AAExC,IAAA,IAAI;AACF,MAAA,WAAA,MAAiB,KAAA,IAAS,UAAS,EAAG;AACpC,QAAA,IAAI,MAAM,OAAA,EAAS;AACjB,UAAA,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,KAAA,CAAM,OAAO,CAAA;AAAA,QACxC;AACA,QAAA,MAAM,KAAA;AAAA,MACR;AAGA,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,QAAA,EAAS;AACtC,MAAA,MAAM,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,OAAA,EAAS,SAAS,CAAA;AAAA,IAC7C,SAAS,KAAA,EAAO;AAEd,MAAA,IAAI,IAAA,CAAK,QAAA,CAAS,WAAA,EAAY,EAAG;AAC/B,QAAA,IAAA,CAAK,QAAA,CAAS,KAAA,CAAO,KAAA,CAAgB,OAAO,CAAA;AAAA,MAC9C;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,OAAO,MAAA,EAAqD;AACjE,IAAA,WAAA,MAAiB,KAAA,IAAS,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,MAAM,CAAA,EAAG;AACtD,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAA6B;AAC3B,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,KAAA,EAAM;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,IAAA,CAAK,MAAM,KAAA,EAAM;AACvB,IAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,MACX,YAAA,EAAc,CAAA;AAAA,MACd,SAAA,EAAW,CAAA;AAAA,MACX,WAAA,EAAa,CAAA;AAAA,MACb,OAAA,EAAS,CAAA;AAAA,MACT,kBAAA,EAAoB,CAAA;AAAA,MACpB,kBAAA,EAAoB,CAAA;AAAA,MACpB,gBAAA,EAAkB,CAAA;AAAA,MAClB,mBAAA,EAAqB;AAAA,KACvB;AACA,IAAA,IAAA,CAAK,kBAAkB,EAAC;AACxB,IAAA,IAAA,CAAK,kBAAkB,EAAC;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,SAAS,OAAA,EAAQ;AACtB,IAAA,IAAA,CAAK,SAAS,IAAA,EAAK;AACnB,IAAA,IAAA,CAAK,kBAAA,EAAmB;AAAA,EAC1B;AAAA,EAEQ,iBAAA,CACN,OACA,QAAA,EACQ;AAER,IAAA,MAAM,aAAA,GAAgC,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACzD,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,SAAS,CAAA,CAAE;AAAA,KACb,CAAE,CAAA;AACF,IAAA,OAAO,gBAAA,CAAiB,OAAO,aAAa,CAAA;AAAA,EAC9C;AAAA,EAEQ,gBAAgB,MAAA,EAAgC;AACtD,IAAA,OAAO,IAAA,CAAK,UAAU,MAAM,CAAA;AAAA,EAC9B;AAAA,EAEQ,kBAAkB,OAAA,EAAwC;AAChE,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,IAC3B,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,mBAAmB,MAAA,EAAgC;AACzD,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,CAAE,MAAA;AAAA,EAChC;AAAA,EAEQ,aAAA,GAAsB;AAC5B,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,YAAA,GAAe,CAAA,EAAG;AAC/B,MAAA,IAAA,CAAK,MAAM,OAAA,GACR,IAAA,CAAK,MAAM,SAAA,GAAY,IAAA,CAAK,MAAM,YAAA,GAAgB,GAAA;AAAA,IACvD;AAAA,EACF;AAAA,EAEQ,uBAAA,GAAgC;AACtC,IAAA,IAAI,IAAA,CAAK,eAAA,CAAgB,MAAA,GAAS,CAAA,EAAG;AACnC,MAAA,IAAA,CAAK,KAAA,CAAM,mBAAA,GACT,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,GAC9C,KAAK,eAAA,CAAgB,MAAA;AAAA,IACzB;AAAA,EACF;AACF;AAKO,SAAS,iBAAA,CACd,KAAA,EACA,MAAA,EACA,UAAA,EACa;AACb,EAAA,OAAO,IAAI,WAAA,CAAY,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAA;AAClD;AC/WA,IAAMJ,gBAAAA,GAA4C;AAAA,EAChD,QAAA,EAAU,KAAA;AAAA,EACV,GAAA,EAAK;AAAA,IACH,UAAA,EAAY,IAAA;AAAA,IACZ,OAAA,EAAS;AAAA,GACX;AAAA,EACA,UAAA,EAAY;AACd,CAAA;AAqBO,IAAM,mBAAA,GAAN,cAAkCG,aAAAA,CAAwC;AAAA,EACvE,KAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA,GAAsD,IAAA;AAAA,EACtD,KAAA,GAA2B;AAAA,IACjC,kBAAA,EAAoB,CAAA;AAAA,IACpB,WAAA,EAAa,CAAA;AAAA,IACb,WAAA,EAAa,CAAA;AAAA,IACb,aAAA,EAAe,CAAA;AAAA,IACf,aAAA,EAAe,CAAA;AAAA,IACf,cAAA,EAAgB,CAAA;AAAA,IAChB,eAAA,EAAiB;AAAA,GACnB;AAAA,EACQ,WAAA,uBAAuC,GAAA,EAAI;AAAA,EAEnD,WAAA,CAAY,OAAuB,MAAA,EAAoC;AACrE,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,MAAA,GAAS,EAAE,GAAGH,gBAAAA,EAAgB,GAAG,MAAA,EAAO;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,GAAA,GAAmC;AACvC,IAAA,QAAQ,IAAA,CAAK,OAAO,QAAA;AAAU,MAC5B,KAAK,KAAA;AACH,QAAA,OAAO,KAAK,kBAAA,EAAmB;AAAA,MACjC,KAAK,KAAA;AACH,QAAA,OAAO,KAAK,kBAAA,EAAmB;AAAA,MACjC,KAAK,OAAA;AACH,QAAA,OAAO,KAAK,oBAAA,EAAqB;AAAA,MACnC;AACE,QAAA,OAAO,KAAK,kBAAA,EAAmB;AAAA;AACnC,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAA,GAAkD;AACtD,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAClC,IAAA,MAAM,kBAA4B,EAAC;AACnC,IAAA,IAAI,UAAA,GAAa,CAAA;AACjB,IAAA,MAAM,cAAc,GAAA,EAAI;AAExB,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,EAAK;AAEnC,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,KAAA,CAAM,IAAI,GAAG,CAAA;AACtC,MAAA,IAAI,CAAC,KAAA,EAAO;AAGZ,MAAA,MAAM,GAAA,GACJ,KAAA,CAAM,QAAA,CAAS,GAAA,IACf,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,KAAA,CAAM,QAAA,CAAS,SAAS,CAAA;AAC3D,MAAA,MAAM,GAAA,GAAA,CAAO,WAAA,GAAc,KAAA,CAAM,QAAA,CAAS,SAAA,IAAa,GAAA;AAEvD,MAAA,IAAI,OAAO,GAAA,EAAK;AAEd,QAAA,IAAI,KAAK,MAAA,CAAO,GAAA,EAAK,WAAW,IAAA,CAAK,MAAA,CAAO,KAAK,WAAA,EAAa;AAC5D,UAAA,IAAI,GAAA,GAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,IAAI,WAAA,EAAa;AAE3C,YAAA;AAAA,UACF;AAAA,QACF;AAEA,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA;AAC3C,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,eAAA,CAAgB,KAAK,GAAG,CAAA;AACxB,UAAA,UAAA,IAAc,IAAA,CAAK,kBAAkB,KAAK,CAAA;AAAA,QAC5C;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,kBAAA,EAAA;AACX,IAAA,IAAA,CAAK,KAAA,CAAM,eAAe,eAAA,CAAgB,MAAA;AAC1C,IAAA,IAAA,CAAK,MAAM,eAAA,IAAmB,UAAA;AAC9B,IAAA,IAAA,CAAK,KAAA,CAAM,qBAAqB,GAAA,EAAI;AAEpC,IAAA,MAAM,MAAA,GAA6B;AAAA,MACjC,eAAA;AAAA,MACA,gBAAgB,eAAA,CAAgB,MAAA;AAAA,MAChC,UAAA;AAAA,MACA,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI;AAAA,KAClC;AAEA,IAAA,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,eAAA,EAAiB,UAAU,CAAA;AACjD,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAA,GAAkD;AACtD,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAClC,IAAA,MAAM,kBAA4B,EAAC;AACnC,IAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,GAAA,EAAK,UAAA,IAAc,GAAA;AAClD,IAAsB,IAAA,CAAK,MAAA,CAAO,GAAA,EAAK,YAAA,IAAgB;AACvD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,GAAA,EAAK,iBAAA,IAAqB,EAAA;AACxD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,GAAA,EAAK,MAAA,IAAU,CAAA;AAE1C,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,EAAK;AAC1C,IAAA,IAAI,eAAe,UAAA,EAAY;AAC7B,MAAA,OAAO;AAAA,QACL,iBAAiB,EAAC;AAAA,QAClB,cAAA,EAAgB,CAAA;AAAA,QAChB,UAAA,EAAY,CAAA;AAAA,QACZ,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI;AAAA,OAClC;AAAA,IACF;AAGA,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,EAAK;AACnC,IAAA,MAAM,oBAID,EAAC;AAEN,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,KAAA,CAAM,IAAI,GAAG,CAAA;AACtC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,iBAAA,CAAkB,IAAA,CAAK;AAAA,UACrB,GAAA;AAAA,UACA,UAAA,EAAY,MAAM,QAAA,CAAS,UAAA;AAAA,UAC3B,IAAA,EAAM,IAAA,CAAK,iBAAA,CAAkB,KAAK;AAAA,SACnC,CAAA;AAAA,MACH;AAAA,IACF;AAGA,IAAA,iBAAA,CAAkB,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,UAAA,GAAa,EAAE,UAAU,CAAA;AAG5D,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,WAAA,GAAc,YAAY,SAAS,CAAA;AAC7D,IAAA,MAAM,cAAc,GAAA,EAAI;AAExB,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,YAAY,CAAA,GAAI,iBAAA,CAAkB,QAAQ,CAAA,EAAA,EAAK;AACjE,MAAA,MAAM,EAAE,GAAA,EAAK,UAAA,EAAY,IAAA,EAAK,GAAI,kBAAkB,CAAC,CAAA;AAGrD,MAAA,MAAM,GAAA,GAAA,CAAO,cAAc,UAAA,IAAc,GAAA;AACzC,MAAA,IAAI,MAAM,MAAA,EAAQ;AAElB,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA;AAC3C,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,eAAA,CAAgB,KAAK,GAAG,CAAA;AACxB,QAAA,UAAA,IAAc,IAAA;AAAA,MAChB;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,kBAAA,EAAA;AACX,IAAA,IAAA,CAAK,KAAA,CAAM,eAAe,eAAA,CAAgB,MAAA;AAC1C,IAAA,IAAA,CAAK,MAAM,eAAA,IAAmB,UAAA;AAC9B,IAAA,IAAA,CAAK,KAAA,CAAM,qBAAqB,GAAA,EAAI;AAEpC,IAAA,MAAM,MAAA,GAA6B;AAAA,MACjC,eAAA;AAAA,MACA,gBAAgB,eAAA,CAAgB,MAAA;AAAA,MAChC,UAAA;AAAA,MACA,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI;AAAA,KAClC;AAEA,IAAA,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,eAAA,EAAiB,UAAU,CAAA;AACjD,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAA,GAAoD;AACxD,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAClC,IAAA,MAAM,kBAA4B,EAAC;AACnC,IAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,UAAA,IAAc,GAAA;AACpD,IAAA,MAAM,cAAc,GAAA,EAAI;AAExB,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,EAAK;AAEnC,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,KAAA,CAAM,IAAI,GAAG,CAAA;AACtC,MAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,MAAA,IAAI,gBAAA,GAAmB,KAAA;AAIvB,MAAA,MAAM,GAAA,GACJ,KAAA,CAAM,QAAA,CAAS,GAAA,IACf,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,KAAA,CAAM,QAAA,CAAS,SAAS,CAAA;AAC3D,MAAA,MAAM,GAAA,GAAA,CAAO,WAAA,GAAc,KAAA,CAAM,QAAA,CAAS,SAAA,IAAa,GAAA;AACvD,MAAA,IAAI,OAAO,GAAA,EAAK;AACd,QAAA,gBAAA,GAAmB,IAAA;AAAA,MACrB;AAGA,MAAA,IAAI,KAAK,MAAA,CAAO,KAAA,EAAO,kBAAkB,KAAA,CAAM,QAAA,CAAS,cAAc,CAAA,EAAG;AACvE,QAAA,MAAM,UAAA,GAAa,MAAM,QAAA,CAAS,WAAA,GAAc,KAAK,GAAA,CAAI,GAAA,GAAM,MAAM,CAAC,CAAA;AACtE,QAAA,IAAI,aAAa,UAAA,EAAY;AAC3B,UAAA,gBAAA,GAAmB,IAAA;AAAA,QACrB;AAAA,MACF;AAEA,MAAA,IAAI,gBAAA,EAAkB;AACpB,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA;AAC3C,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,eAAA,CAAgB,KAAK,GAAG,CAAA;AACxB,UAAA,UAAA,IAAc,IAAA,CAAK,kBAAkB,KAAK,CAAA;AAAA,QAC5C;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,kBAAA,EAAA;AACX,IAAA,IAAA,CAAK,KAAA,CAAM,iBAAiB,eAAA,CAAgB,MAAA;AAC5C,IAAA,IAAA,CAAK,MAAM,eAAA,IAAmB,UAAA;AAC9B,IAAA,IAAA,CAAK,KAAA,CAAM,qBAAqB,GAAA,EAAI;AAEpC,IAAA,MAAM,MAAA,GAA6B;AAAA,MACjC,eAAA;AAAA,MACA,gBAAgB,eAAA,CAAgB,MAAA;AAAA,MAChC,UAAA;AAAA,MACA,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI;AAAA,KAClC;AAEA,IAAA,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,eAAA,EAAiB,UAAU,CAAA;AACnD,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,IAAA,EAA6C;AAChE,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAClC,IAAA,MAAM,kBAA4B,EAAC;AACnC,IAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,KAAA,CAAM,IAAI,GAAG,CAAA;AACtC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,iBAAA,CAAkB,KAAK,CAAA;AACzC,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA;AAC3C,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,eAAA,CAAgB,KAAK,GAAG,CAAA;AACxB,UAAA,UAAA,IAAc,IAAA;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,kBAAA,EAAA;AACX,IAAA,IAAA,CAAK,KAAA,CAAM,kBAAkB,eAAA,CAAgB,MAAA;AAC7C,IAAA,IAAA,CAAK,MAAM,eAAA,IAAmB,UAAA;AAC9B,IAAA,IAAA,CAAK,KAAA,CAAM,qBAAqB,GAAA,EAAI;AAEpC,IAAA,MAAM,MAAA,GAA6B;AAAA,MACjC,eAAA;AAAA,MACA,gBAAgB,eAAA,CAAgB,MAAA;AAAA,MAChC,UAAA;AAAA,MACA,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI;AAAA,KAClC;AAEA,IAAA,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU,eAAA,EAAiB,UAAU,CAAA;AACpD,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAoB,OAAA,EAIM;AAC9B,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAClC,IAAA,MAAM,kBAA4B,EAAC;AACnC,IAAA,IAAI,UAAA,GAAa,CAAA;AACjB,IAAA,MAAM,cAAc,GAAA,EAAI;AAExB,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,EAAK;AAEnC,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,KAAA,CAAM,IAAI,GAAG,CAAA;AACtC,MAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,MAAA,IAAI,OAAA,GAAU,IAAA;AAEd,MAAA,IAAI,QAAQ,SAAA,IAAa,KAAA,CAAM,QAAA,CAAS,SAAA,KAAc,QAAQ,SAAA,EAAW;AACvE,QAAA,OAAA,GAAU,KAAA;AAAA,MACZ;AAEA,MAAA,IAAI,QAAQ,KAAA,IAAS,KAAA,CAAM,OAAA,CAAQ,KAAA,KAAU,QAAQ,KAAA,EAAO;AAC1D,QAAA,OAAA,GAAU,KAAA;AAAA,MACZ;AAEA,MAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,QAAA,MAAM,GAAA,GAAA,CAAO,WAAA,GAAc,KAAA,CAAM,QAAA,CAAS,SAAA,IAAa,GAAA;AACvD,QAAA,IAAI,GAAA,GAAM,QAAQ,SAAA,EAAW;AAC3B,UAAA,OAAA,GAAU,KAAA;AAAA,QACZ;AAAA,MACF;AAEA,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,iBAAA,CAAkB,KAAK,CAAA;AACzC,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA;AAC3C,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,eAAA,CAAgB,KAAK,GAAG,CAAA;AACxB,UAAA,UAAA,IAAc,IAAA;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,kBAAA,EAAA;AACX,IAAA,IAAA,CAAK,KAAA,CAAM,kBAAkB,eAAA,CAAgB,MAAA;AAC7C,IAAA,IAAA,CAAK,MAAM,eAAA,IAAmB,UAAA;AAC9B,IAAA,IAAA,CAAK,KAAA,CAAM,qBAAqB,GAAA,EAAI;AAEpC,IAAA,MAAM,MAAA,GAA6B;AAAA,MACjC,eAAA;AAAA,MACA,gBAAgB,eAAA,CAAgB,MAAA;AAAA,MAChC,UAAA;AAAA,MACA,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI;AAAA,KAClC;AAEA,IAAA,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU,eAAA,EAAiB,UAAU,CAAA;AACpD,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,CAAU,aAAa,GAAA,EAAa;AAClC,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,IAAA,CAAK,QAAA,EAAS;AAAA,IAChB;AAEA,IAAA,IAAA,CAAK,YAAA,GAAe,YAAY,MAAM;AACpC,MAAA,KAAA,CAAM,YAAY;AAChB,QAAA,IAAI;AACF,UAAA,MAAM,KAAK,GAAA,EAAI;AAAA,QACjB,SAAS,KAAA,EAAO;AACd,UAAA,IAAA,CAAK,IAAA,CAAK,SAAS,KAAc,CAAA;AAAA,QACnC;AAAA,MACF,CAAA,GAAG;AAAA,IACL,GAAG,UAAU,CAAA;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAAiB;AACf,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,aAAA,CAAc,KAAK,YAAY,CAAA;AAC/B,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,IACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAA8B;AAC5B,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,KAAA,EAAM;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAmB;AACjB,IAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,MACX,kBAAA,EAAoB,CAAA;AAAA,MACpB,WAAA,EAAa,CAAA;AAAA,MACb,WAAA,EAAa,CAAA;AAAA,MACb,aAAA,EAAe,CAAA;AAAA,MACf,aAAA,EAAe,CAAA;AAAA,MACf,cAAA,EAAgB,CAAA;AAAA,MAChB,eAAA,EAAiB;AAAA,KACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,QAAA,EAAS;AACd,IAAA,IAAA,CAAK,kBAAA,EAAmB;AACxB,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AAAA,EACzB;AAAA,EAEQ,MAAA,CAAO,OAAe,SAAA,EAA4B;AAExD,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,GAAA,EAAK,SAAA,GAAY,KAAK,CAAA,EAAG;AACvC,MAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,SAAA,CAAU,KAAK,CAAA;AAAA,IACxC;AAGA,IAAA,IAAI,aAAa,IAAA,CAAK,MAAA,CAAO,GAAA,EAAK,aAAA,GAAgB,SAAS,CAAA,EAAG;AAC5D,MAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,aAAA,CAAc,SAAS,CAAA;AAAA,IAChD;AAGA,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,EAAK,UAAA,IAAc,IAAA;AAAA,EACxC;AAAA,EAEQ,kBAAkB,KAAA,EAAkD;AAC1E,IAAA,OAAO,KAAA,CAAM,QAAA,CAAS,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,GAAA;AAAA,EAC7C;AAAA,EAEQ,SAAA,CACN,MAAA,EACA,IAAA,EACA,UAAA,EACM;AACN,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,UAAA,IAAc,IAAA,CAAK,SAAS,CAAA,EAAG;AAC7C,MAAA,MAAM,KAAA,GAA2B;AAAA,QAC/B,WAAW,GAAA,EAAI;AAAA,QACf,IAAA;AAAA,QACA,MAAA;AAAA,QACA,gBAAgB,IAAA,CAAK,MAAA;AAAA,QACrB;AAAA,OACF;AACA,MAAA,IAAA,CAAK,IAAA,CAAK,cAAc,KAAK,CAAA;AAC7B,MAAA,IAAA,CAAK,MAAA,CAAO,eAAe,KAAK,CAAA;AAAA,IAClC;AAAA,EACF;AACF;AAKO,SAAS,yBAAA,CACd,OACA,MAAA,EACqB;AACrB,EAAA,OAAO,IAAI,mBAAA,CAAoB,KAAA,EAAO,MAAM,CAAA;AAC9C","file":"index.js","sourcesContent":["/**\n * Core Utilities\n *\n * Helper functions for the semantic cache.\n */\n\nimport { nanoid } from 'nanoid';\n\n/**\n * Generate a unique ID with optional prefix\n */\nexport function generateId(prefix?: string): string {\n const id = nanoid(16);\n return prefix ? `${prefix}_${id}` : id;\n}\n\n/**\n * Get current timestamp in milliseconds\n */\nexport function now(): number {\n return Date.now();\n}\n\n/**\n * Check if an entry has expired based on TTL\n */\nexport function isExpired(createdAt: number, ttlSeconds: number): boolean {\n if (ttlSeconds <= 0) return false;\n return now() > createdAt + ttlSeconds * 1000;\n}\n\n/**\n * Estimate the size of an object in bytes\n */\nexport function estimateSize(obj: unknown): number {\n const str = JSON.stringify(obj);\n // Rough estimate: 2 bytes per character for UTF-16\n return str.length * 2;\n}\n\n/**\n * Estimate size of a cache entry\n */\nexport function estimateEntrySize(entry: {\n embedding?: number[];\n request: { messages: Array<{ content: string }> };\n response: { content: string };\n}): number {\n // Vector: 4 bytes per float32\n const vectorSize = (entry.embedding?.length ?? 0) * 4;\n\n // Content: roughly 2 bytes per character\n const messageSize = entry.request.messages.reduce(\n (acc, m) => acc + (m.content?.length ?? 0) * 2,\n 0,\n );\n const responseSize = (entry.response.content?.length ?? 0) * 2;\n\n // Metadata overhead\n const overheadSize = 500;\n\n return vectorSize + messageSize + responseSize + overheadSize;\n}\n\n/**\n * Sleep for a specified duration\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Retry a function with exponential backoff\n */\nexport async function retry<T>(\n fn: () => Promise<T>,\n options: {\n maxAttempts?: number;\n initialDelayMs?: number;\n maxDelayMs?: number;\n backoffMultiplier?: number;\n } = {},\n): Promise<T> {\n const {\n maxAttempts = 3,\n initialDelayMs = 100,\n maxDelayMs = 5000,\n backoffMultiplier = 2,\n } = options;\n\n let lastError: Error | undefined;\n let delay = initialDelayMs;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error as Error;\n\n if (attempt < maxAttempts) {\n await sleep(delay);\n delay = Math.min(delay * backoffMultiplier, maxDelayMs);\n }\n }\n }\n\n throw lastError;\n}\n\n/**\n * Chunk an array into smaller arrays\n */\nexport function chunk<T>(array: T[], size: number): T[][] {\n const chunks: T[][] = [];\n for (let i = 0; i < array.length; i += size) {\n chunks.push(array.slice(i, i + size));\n }\n return chunks;\n}\n\n/**\n * Deep clone an object\n */\nexport function deepClone<T>(obj: T): T {\n return JSON.parse(JSON.stringify(obj));\n}\n\n/**\n * Calculate percentile from an array of numbers\n */\nexport function percentile(values: number[], p: number): number {\n if (values.length === 0) return 0;\n const sorted = [...values].sort((a, b) => a - b);\n const index = Math.ceil((p / 100) * sorted.length) - 1;\n return sorted[Math.max(0, index)];\n}\n\n/**\n * Calculate mean of an array of numbers\n */\nexport function mean(values: number[]): number {\n if (values.length === 0) return 0;\n return values.reduce((a, b) => a + b, 0) / values.length;\n}\n","/**\n * CacheAnalytics\n *\n * Analytics and metrics tracking for cache operations.\n */\n\nimport type {\n CacheEntry,\n AnalyticsData,\n CostSavingsReport,\n PerformanceMetrics,\n HitEvent,\n MissEvent,\n ModelPricing,\n AnalyticsConfig,\n} from '../types/index.js';\nimport { percentile, mean } from '../core/utils.js';\n\n/**\n * Default model pricing (per 1K tokens)\n */\nconst DEFAULT_MODEL_PRICING: Record<string, ModelPricing> = {\n 'gpt-4o': { inputPer1K: 0.0025, outputPer1K: 0.01 },\n 'gpt-4o-mini': { inputPer1K: 0.00015, outputPer1K: 0.0006 },\n 'gpt-4-turbo': { inputPer1K: 0.01, outputPer1K: 0.03 },\n 'gpt-4': { inputPer1K: 0.03, outputPer1K: 0.06 },\n 'gpt-3.5-turbo': { inputPer1K: 0.0005, outputPer1K: 0.0015 },\n 'claude-3-opus': { inputPer1K: 0.015, outputPer1K: 0.075 },\n 'claude-sonnet-4-20250514': { inputPer1K: 0.003, outputPer1K: 0.015 },\n 'claude-3-5-sonnet': { inputPer1K: 0.003, outputPer1K: 0.015 },\n 'claude-3-haiku': { inputPer1K: 0.00025, outputPer1K: 0.00125 },\n default: { inputPer1K: 0.005, outputPer1K: 0.015 },\n};\n\n/**\n * Default analytics configuration\n */\nconst DEFAULT_CONFIG: Required<AnalyticsConfig> = {\n enabled: true,\n sampleRate: 1.0,\n retentionSeconds: 86400 * 7, // 7 days\n flushIntervalMs: 60000, // 1 minute\n modelPricing: DEFAULT_MODEL_PRICING,\n};\n\n/**\n * CacheAnalytics\n *\n * Tracks cache performance metrics, hit rates, and cost savings.\n *\n * @example\n * ```typescript\n * const analytics = new CacheAnalytics({ enabled: true });\n *\n * // Record events\n * analytics.recordHit(entry, 'exact', 5.2);\n * analytics.recordMiss(12.3);\n *\n * // Get summary\n * const summary = analytics.getSummary();\n * console.log(`Hit rate: ${(summary.hitRate * 100).toFixed(1)}%`);\n * ```\n */\nexport class CacheAnalytics {\n private config: Required<AnalyticsConfig>;\n private hits = 0;\n private misses = 0;\n private exactHits = 0;\n private semanticHits = 0;\n private tokensSaved = 0;\n private inputTokensSaved = 0;\n private outputTokensSaved = 0;\n private latencies: number[] = [];\n private modelHits = new Map<string, number>();\n private namespaceHits = new Map<string, number>();\n private hitEvents: HitEvent[] = [];\n private missEvents: MissEvent[] = [];\n private setCount = 0;\n\n constructor(config?: Partial<AnalyticsConfig>) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Record a cache hit\n */\n recordHit(\n entry: CacheEntry,\n type: 'exact' | 'semantic',\n latencyMs: number,\n ): void {\n if (!this.config.enabled) return;\n if (Math.random() > this.config.sampleRate) return;\n\n this.hits++;\n if (type === 'exact') {\n this.exactHits++;\n } else {\n this.semanticHits++;\n }\n\n this.latencies.push(latencyMs);\n\n // Track tokens saved\n const usage = entry.response.usage;\n this.tokensSaved += usage.totalTokens;\n this.inputTokensSaved += usage.promptTokens;\n this.outputTokensSaved += usage.completionTokens;\n\n // Track by model\n const modelCount = this.modelHits.get(entry.request.model) ?? 0;\n this.modelHits.set(entry.request.model, modelCount + 1);\n\n // Track by namespace\n if (entry.metadata.namespace) {\n const nsCount = this.namespaceHits.get(entry.metadata.namespace) ?? 0;\n this.namespaceHits.set(entry.metadata.namespace, nsCount + 1);\n }\n\n // Record event\n this.hitEvents.push({\n timestamp: Date.now(),\n type,\n model: entry.request.model,\n namespace: entry.metadata.namespace,\n similarity: entry.metadata.similarity,\n latencyMs,\n tokensSaved: usage.totalTokens,\n });\n\n // Trim old events\n this.trimEvents();\n }\n\n /**\n * Record a cache miss\n */\n recordMiss(\n latencyMs: number,\n reason: MissEvent['reason'] = 'not_found',\n ): void {\n if (!this.config.enabled) return;\n if (Math.random() > this.config.sampleRate) return;\n\n this.misses++;\n this.latencies.push(latencyMs);\n\n // Record event\n this.missEvents.push({\n timestamp: Date.now(),\n model: 'unknown',\n latencyMs,\n reason,\n });\n\n // Trim old events\n this.trimEvents();\n }\n\n /**\n * Record a cache set operation\n */\n recordSet(_entry: CacheEntry): void {\n if (!this.config.enabled) return;\n this.setCount++;\n }\n\n /**\n * Get analytics summary\n */\n getSummary(): AnalyticsData {\n const total = this.hits + this.misses;\n\n return {\n totalHits: this.hits,\n totalMisses: this.misses,\n exactHits: this.exactHits,\n semanticHits: this.semanticHits,\n hitRate: total > 0 ? this.hits / total : 0,\n avgLatencyMs: mean(this.latencies),\n p50LatencyMs: percentile(this.latencies, 50),\n p95LatencyMs: percentile(this.latencies, 95),\n p99LatencyMs: percentile(this.latencies, 99),\n totalTokensSaved: this.tokensSaved,\n estimatedCostSavingsUSD: this.calculateCostSavings(),\n topModels: this.getTopModels(5),\n topNamespaces: this.getTopNamespaces(5),\n hourlyStats: this.getHourlyStats(),\n };\n }\n\n /**\n * Get cost savings report\n */\n getCostSavingsReport(periodLabel = 'all-time'): CostSavingsReport {\n const total = this.hits + this.misses;\n const costSaved = this.calculateCostSavings();\n\n // Estimate what cost would have been without cache\n const avgCostPerRequest = costSaved / (this.hits || 1);\n const estimatedCostWithoutCache = avgCostPerRequest * total;\n\n return {\n period: periodLabel,\n totalRequests: total,\n cachedRequests: this.hits,\n hitRate: total > 0 ? this.hits / total : 0,\n inputTokensSaved: this.inputTokensSaved,\n outputTokensSaved: this.outputTokensSaved,\n totalTokensSaved: this.tokensSaved,\n estimatedCostWithoutCache,\n actualCostWithCache: estimatedCostWithoutCache - costSaved,\n costSaved,\n reductionPercent:\n estimatedCostWithoutCache > 0\n ? (costSaved / estimatedCostWithoutCache) * 100\n : 0,\n };\n }\n\n /**\n * Get performance metrics\n */\n getPerformanceMetrics(): PerformanceMetrics {\n const total = this.hits + this.misses;\n\n return {\n avgLookupMs: mean(this.latencies),\n avgEmbeddingMs: 0, // Would need to track separately\n avgStoreReadMs: mean(this.latencies),\n avgStoreWriteMs: 0, // Would need to track separately\n p50LatencyMs: percentile(this.latencies, 50),\n p95LatencyMs: percentile(this.latencies, 95),\n p99LatencyMs: percentile(this.latencies, 99),\n totalOperations: total + this.setCount,\n failedOperations: 0, // Would need to track separately\n errorRate: 0,\n };\n }\n\n /**\n * Reset all analytics\n */\n reset(): void {\n this.hits = 0;\n this.misses = 0;\n this.exactHits = 0;\n this.semanticHits = 0;\n this.tokensSaved = 0;\n this.inputTokensSaved = 0;\n this.outputTokensSaved = 0;\n this.latencies = [];\n this.modelHits.clear();\n this.namespaceHits.clear();\n this.hitEvents = [];\n this.missEvents = [];\n this.setCount = 0;\n }\n\n /**\n * Export analytics data\n */\n export(format: 'json' | 'csv' = 'json'): string {\n const data = this.getSummary();\n\n if (format === 'csv') {\n const headers = Object.keys(data).filter(\n (k) => typeof data[k as keyof AnalyticsData] !== 'object',\n );\n const values = headers.map((h) => data[h as keyof AnalyticsData]);\n return `${headers.join(',')}\\n${values.join(',')}`;\n }\n\n return JSON.stringify(data, null, 2);\n }\n\n private calculateCostSavings(): number {\n let savings = 0;\n\n for (const [model, hits] of this.modelHits) {\n const pricing =\n this.config.modelPricing[model] ?? this.config.modelPricing['default'];\n\n // Estimate average tokens per request based on total\n const avgInputTokens = this.inputTokensSaved / (this.hits || 1);\n const avgOutputTokens = this.outputTokensSaved / (this.hits || 1);\n\n const inputCost = (avgInputTokens / 1000) * pricing.inputPer1K * hits;\n const outputCost = (avgOutputTokens / 1000) * pricing.outputPer1K * hits;\n\n savings += inputCost + outputCost;\n }\n\n // If no model-specific data, use default pricing\n if (savings === 0 && this.tokensSaved > 0) {\n const defaultPricing = this.config.modelPricing['default'];\n savings =\n (this.inputTokensSaved / 1000) * defaultPricing.inputPer1K +\n (this.outputTokensSaved / 1000) * defaultPricing.outputPer1K;\n }\n\n return savings;\n }\n\n private getTopModels(n: number): Array<{ model: string; hits: number }> {\n return Array.from(this.modelHits.entries())\n .map(([model, hits]) => ({ model, hits }))\n .sort((a, b) => b.hits - a.hits)\n .slice(0, n);\n }\n\n private getTopNamespaces(\n n: number,\n ): Array<{ namespace: string; hits: number }> {\n return Array.from(this.namespaceHits.entries())\n .map(([namespace, hits]) => ({ namespace, hits }))\n .sort((a, b) => b.hits - a.hits)\n .slice(0, n);\n }\n\n private getHourlyStats(): Array<{\n hour: number;\n hits: number;\n misses: number;\n avgLatencyMs: number;\n }> {\n const hourlyData = new Map<\n number,\n { hits: number; misses: number; latencies: number[] }\n >();\n\n // Process hit events\n for (const event of this.hitEvents) {\n const hour = new Date(event.timestamp).getHours();\n const data = hourlyData.get(hour) ?? {\n hits: 0,\n misses: 0,\n latencies: [],\n };\n data.hits++;\n data.latencies.push(event.latencyMs);\n hourlyData.set(hour, data);\n }\n\n // Process miss events\n for (const event of this.missEvents) {\n const hour = new Date(event.timestamp).getHours();\n const data = hourlyData.get(hour) ?? {\n hits: 0,\n misses: 0,\n latencies: [],\n };\n data.misses++;\n data.latencies.push(event.latencyMs);\n hourlyData.set(hour, data);\n }\n\n return Array.from(hourlyData.entries())\n .map(([hour, data]) => ({\n hour,\n hits: data.hits,\n misses: data.misses,\n avgLatencyMs: mean(data.latencies),\n }))\n .sort((a, b) => a.hour - b.hour);\n }\n\n private trimEvents(): void {\n const cutoff = Date.now() - this.config.retentionSeconds * 1000;\n this.hitEvents = this.hitEvents.filter((e) => e.timestamp > cutoff);\n this.missEvents = this.missEvents.filter((e) => e.timestamp > cutoff);\n }\n}\n\n/**\n * Create a CacheAnalytics instance\n */\nexport function createCacheAnalytics(\n config?: Partial<AnalyticsConfig>,\n): CacheAnalytics {\n return new CacheAnalytics(config);\n}\n","/**\n * Cache Key Generation\n *\n * Utilities for generating and normalizing cache keys.\n */\n\nimport murmurhash from 'murmurhash';\nimport type { CacheMessage, CacheKeyOptions } from '../types/index.js';\n\n/**\n * Default key options\n */\nconst DEFAULT_KEY_OPTIONS: CacheKeyOptions = {\n includeTemperature: false,\n includeTools: false,\n normalizeWhitespace: true,\n extractUserMessage: false,\n};\n\n/**\n * Generate a cache key from request parameters\n *\n * @param model - The model name\n * @param messages - The conversation messages\n * @param options - Key generation options\n * @returns A unique cache key string\n */\nexport function generateCacheKey(\n model: string,\n messages: CacheMessage[],\n options: CacheKeyOptions = {},\n): string {\n const opts = { ...DEFAULT_KEY_OPTIONS, ...options };\n const normalized = normalizeRequest(model, messages, opts);\n const hash = murmurhash.v3(JSON.stringify(normalized)).toString(16);\n return `cache:${model}:${hash}`;\n}\n\n/**\n * Normalize request for consistent hashing\n */\nexport function normalizeRequest(\n model: string,\n messages: CacheMessage[],\n options: CacheKeyOptions = {},\n): Record<string, unknown> {\n const normalizedMessages = messages.map((m) => ({\n role: m.role,\n content: options.normalizeWhitespace\n ? normalizeWhitespace(m.content)\n : m.content,\n }));\n\n return {\n model,\n messages: options.extractUserMessage\n ? extractUserMessage(normalizedMessages)\n : normalizedMessages,\n };\n}\n\n/**\n * Normalize whitespace in text\n *\n * - Trims leading/trailing whitespace\n * - Collapses multiple spaces into single space\n * - Normalizes line endings\n */\nexport function normalizeWhitespace(text: string): string {\n return text.trim().replace(/\\r\\n/g, '\\n').replace(/\\s+/g, ' ');\n}\n\n/**\n * Extract the last user message for semantic comparison\n */\nexport function extractUserMessage(\n messages: CacheMessage[] | Array<{ role: string; content: string }>,\n): string {\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i].role === 'user') {\n return messages[i].content;\n }\n }\n return '';\n}\n\n/**\n * Extract system prompt from messages\n */\nexport function extractSystemPrompt(\n messages: CacheMessage[],\n): string | undefined {\n const systemMessage = messages.find((m) => m.role === 'system');\n return systemMessage?.content;\n}\n\n/**\n * Generate a semantic key for embedding lookup\n * Uses only the user message and model for semantic matching\n */\nexport function generateSemanticKey(\n model: string,\n messages: CacheMessage[],\n): string {\n const userMessage = extractUserMessage(messages);\n const normalized = normalizeWhitespace(userMessage);\n return `${model}:${normalized}`;\n}\n\n/**\n * Generate a fingerprint for a conversation\n * Useful for detecting similar conversation patterns\n */\nexport function generateConversationFingerprint(\n messages: CacheMessage[],\n): string {\n const pattern = messages\n .map((m) => `${m.role}:${m.content.length}`)\n .join('|');\n return murmurhash.v3(pattern).toString(16);\n}\n\n/**\n * Parse a cache key to extract components\n */\nexport function parseCacheKey(key: string): {\n prefix: string;\n model: string;\n hash: string;\n} | null {\n const parts = key.split(':');\n if (parts.length !== 3 || parts[0] !== 'cache') {\n return null;\n }\n return {\n prefix: parts[0],\n model: parts[1],\n hash: parts[2],\n };\n}\n\n/**\n * Check if two cache keys are for the same model\n */\nexport function isSameModel(key1: string, key2: string): boolean {\n const parsed1 = parseCacheKey(key1);\n const parsed2 = parseCacheKey(key2);\n if (!parsed1 || !parsed2) return false;\n return parsed1.model === parsed2.model;\n}\n","/**\n * SemanticCache\n *\n * Main semantic caching class for LLM responses.\n * Supports exact match, semantic match, and hybrid strategies.\n */\n\nimport { EventEmitter } from 'eventemitter3';\nimport type {\n SemanticCacheConfig,\n CacheEntry,\n CacheLookupResult,\n CacheStats,\n WrapOptions,\n CacheMessage,\n StoreHealth,\n} from '../types/index.js';\nimport type { BaseCacheStore } from '../stores/BaseCacheStore.js';\nimport type { BaseMatchStrategy } from '../strategies/BaseMatchStrategy.js';\nimport type { SimilarityEngine } from '../similarity/SimilarityEngine.js';\nimport { CacheAnalytics } from '../analytics/CacheAnalytics.js';\nimport { generateCacheKey, extractUserMessage } from './CacheKey.js';\nimport { generateId, now, isExpired } from './utils.js';\n\n/**\n * Default configuration\n */\nconst DEFAULT_CONFIG: Required<SemanticCacheConfig> = {\n defaultTTL: 3600,\n similarityThreshold: 0.92,\n maxEntries: 10000,\n maxSizeBytes: 1024 * 1024 * 1024, // 1GB\n keyPrefix: 'llm-cache',\n matchStrategy: 'hybrid',\n analyticsEnabled: true,\n namespace: 'default',\n cacheKeyFields: ['model', 'messages'],\n normalizeWhitespace: true,\n};\n\n/**\n * Events emitted by SemanticCache\n */\nexport interface SemanticCacheEvents {\n hit: (entry: CacheEntry, similarity: number) => void;\n miss: (key: string, reason: string) => void;\n set: (entry: CacheEntry) => void;\n delete: (key: string) => void;\n evict: (entry: CacheEntry, reason: string) => void;\n error: (error: Error, context: string) => void;\n}\n\n/**\n * Request type for wrap operations\n */\nexport interface CacheRequest {\n model: string;\n messages: CacheMessage[];\n temperature?: number;\n maxTokens?: number;\n tools?: unknown[];\n}\n\n/**\n * Response type for wrap operations\n */\nexport interface CacheResponseInput {\n content: string;\n model?: string;\n usage?: {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n };\n finishReason?: string;\n toolCalls?: unknown[];\n}\n\n/**\n * SemanticCache\n *\n * @example\n * ```typescript\n * import { SemanticCache, MemoryCacheStore, HybridMatchStrategy } from '@lov3kaizen/agentsea-cache';\n *\n * const cache = new SemanticCache(\n * { defaultTTL: 3600, similarityThreshold: 0.92 },\n * new MemoryCacheStore({ type: 'memory' }),\n * new HybridMatchStrategy()\n * );\n *\n * // Wrap an LLM call\n * const response = await cache.wrap(\n * { model: 'gpt-4', messages: [{ role: 'user', content: 'Hello' }] },\n * async (req) => llm.chat(req)\n * );\n * ```\n */\nexport class SemanticCache extends EventEmitter<SemanticCacheEvents> {\n private readonly config: Required<SemanticCacheConfig>;\n private readonly store: BaseCacheStore;\n private readonly strategy: BaseMatchStrategy;\n private readonly similarity?: SimilarityEngine;\n private readonly analytics: CacheAnalytics;\n private stats: CacheStats;\n\n constructor(\n config: Partial<SemanticCacheConfig>,\n store: BaseCacheStore,\n strategy: BaseMatchStrategy,\n similarity?: SimilarityEngine,\n ) {\n super();\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.store = store;\n this.strategy = strategy;\n this.similarity = similarity;\n this.analytics = new CacheAnalytics({\n enabled: this.config.analyticsEnabled,\n });\n this.stats = this.createInitialStats();\n }\n\n private createInitialStats(): CacheStats {\n return {\n entries: 0,\n sizeBytes: 0,\n hits: 0,\n misses: 0,\n hitRate: 0,\n exactHits: 0,\n semanticHits: 0,\n avgSimilarity: 0,\n avgLatencyMs: 0,\n costSavingsUSD: 0,\n tokensSaved: 0,\n };\n }\n\n /**\n * Wrap an LLM call with caching\n *\n * @param request - The LLM request\n * @param fn - Function to call on cache miss\n * @param options - Cache options\n * @returns The response (cached or fresh)\n */\n async wrap<T extends CacheResponseInput>(\n request: CacheRequest,\n fn: (req: CacheRequest) => Promise<T>,\n options?: WrapOptions,\n ): Promise<T & { _cache?: { hit: boolean; similarity?: number } }> {\n const startTime = performance.now();\n\n // Skip cache if requested\n if (options?.skipCache) {\n const response = await fn(request);\n return { ...response, _cache: { hit: false } };\n }\n\n // Try to get from cache\n const lookupResult = await this.get(request, options);\n\n if (lookupResult.hit && lookupResult.entry && !options?.forceRefresh) {\n this.emit('hit', lookupResult.entry, lookupResult.similarity ?? 1);\n this.stats.hits++;\n this.updateStats('hit', lookupResult);\n\n // Track analytics\n if (this.config.analyticsEnabled) {\n this.analytics.recordHit(\n lookupResult.entry,\n lookupResult.source === 'exact' ? 'exact' : 'semantic',\n lookupResult.latencyMs,\n );\n }\n\n return {\n ...lookupResult.entry.response,\n _cache: {\n hit: true,\n similarity: lookupResult.similarity,\n },\n } as T & { _cache: { hit: boolean; similarity?: number } };\n }\n\n // Cache miss - execute function\n const key = generateCacheKey(request.model, request.messages, {\n normalizeWhitespace: this.config.normalizeWhitespace,\n });\n this.emit('miss', key, lookupResult.source);\n this.stats.misses++;\n\n // Track miss in analytics\n if (this.config.analyticsEnabled) {\n this.analytics.recordMiss(performance.now() - startTime);\n }\n\n try {\n const response = await fn(request);\n\n // Store in cache\n await this.set(request, response, options);\n\n return { ...response, _cache: { hit: false } };\n } catch (error) {\n this.emit('error', error as Error, 'wrap');\n throw error;\n }\n }\n\n /**\n * Get an entry from cache\n *\n * @param request - The request to look up\n * @param options - Lookup options\n * @returns The lookup result\n */\n async get(\n request: CacheRequest,\n options?: WrapOptions,\n ): Promise<CacheLookupResult> {\n const startTime = performance.now();\n\n try {\n // Use the configured match strategy\n const result = await this.strategy.match(\n {\n model: request.model,\n messages: request.messages,\n temperature: request.temperature,\n },\n this.store,\n this.similarity,\n {\n threshold: this.config.similarityThreshold,\n namespace: options?.namespace ?? this.config.namespace,\n },\n );\n\n // Check TTL expiration\n if (result.hit && result.entry) {\n if (\n isExpired(result.entry.metadata.createdAt, result.entry.metadata.ttl)\n ) {\n // Entry expired, delete it\n await this.store.delete(result.entry.key);\n return {\n hit: false,\n latencyMs: performance.now() - startTime,\n source: 'miss',\n };\n }\n }\n\n return {\n ...result,\n latencyMs: performance.now() - startTime,\n };\n } catch (error) {\n this.emit('error', error as Error, 'get');\n return {\n hit: false,\n latencyMs: performance.now() - startTime,\n source: 'miss',\n };\n }\n }\n\n /**\n * Set an entry in cache\n *\n * @param request - The request\n * @param response - The response to cache\n * @param options - Cache options\n */\n async set(\n request: CacheRequest,\n response: CacheResponseInput,\n options?: WrapOptions,\n ): Promise<void> {\n const namespace = options?.namespace ?? this.config.namespace;\n const baseKey = generateCacheKey(request.model, request.messages, {\n normalizeWhitespace: this.config.normalizeWhitespace,\n });\n // Include temperature in key if specified (different temps = different cache entries)\n const tempSuffix =\n request.temperature !== undefined ? `:t:${request.temperature}` : '';\n // Include namespace in key for namespace isolation (matching ExactMatchStrategy)\n const key =\n namespace && namespace !== 'default'\n ? `${baseKey}${tempSuffix}:ns:${namespace}`\n : `${baseKey}${tempSuffix}`;\n\n // Generate embedding if semantic matching is enabled and similarity engine is available\n let embedding: number[] | undefined;\n if (this.similarity && this.config.matchStrategy !== 'exact') {\n try {\n const userMessage = extractUserMessage(request.messages);\n if (userMessage) {\n embedding = await this.similarity.embed(userMessage);\n }\n } catch (error) {\n this.emit('error', error as Error, 'embedding');\n // Continue without embedding\n }\n }\n\n const entry: CacheEntry = {\n id: generateId('entry'),\n key,\n embedding,\n request: {\n model: request.model,\n messages: request.messages,\n temperature: request.temperature,\n maxTokens: request.maxTokens,\n tools: request.tools,\n },\n response: {\n content: response.content,\n model: response.model ?? request.model,\n usage: response.usage ?? {\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n },\n finishReason: response.finishReason ?? 'stop',\n toolCalls: response.toolCalls,\n },\n metadata: {\n createdAt: now(),\n accessedAt: now(),\n accessCount: 0,\n ttl: options?.ttl ?? this.config.defaultTTL,\n hitCount: 0,\n tags: options?.tags,\n namespace,\n userId: options?.userId,\n agentId: options?.agentId,\n },\n };\n\n try {\n await this.store.set(key, entry);\n this.emit('set', entry);\n this.stats.entries++;\n\n // Track analytics\n if (this.config.analyticsEnabled) {\n this.analytics.recordSet(entry);\n }\n } catch (error) {\n this.emit('error', error as Error, 'set');\n throw error;\n }\n }\n\n /**\n * Delete an entry from cache\n *\n * @param key - The cache key to delete\n * @returns Whether the entry was deleted\n */\n async delete(key: string): Promise<boolean> {\n const deleted = await this.store.delete(key);\n if (deleted) {\n this.emit('delete', key);\n this.stats.entries = Math.max(0, this.stats.entries - 1);\n }\n return deleted;\n }\n\n /**\n * Clear all entries from cache\n */\n async clear(): Promise<void> {\n await this.store.clear();\n this.stats = this.createInitialStats();\n this.analytics.reset();\n }\n\n /**\n * Invalidate entries by pattern\n *\n * @param pattern - Regex pattern to match keys\n * @returns Number of entries invalidated\n */\n async invalidateByPattern(pattern: RegExp): Promise<number> {\n const keys = await this.store.keys();\n let count = 0;\n\n for (const key of keys) {\n if (pattern.test(key)) {\n await this.store.delete(key);\n count++;\n }\n }\n\n this.stats.entries = Math.max(0, this.stats.entries - count);\n return count;\n }\n\n /**\n * Invalidate entries by tags\n *\n * @param tags - Tags to match\n * @returns Number of entries invalidated\n */\n async invalidateByTags(tags: string[]): Promise<number> {\n const keys = await this.store.keys();\n let count = 0;\n\n for (const key of keys) {\n const entry = await this.store.get(key);\n if (entry?.metadata.tags?.some((t) => tags.includes(t))) {\n await this.store.delete(key);\n count++;\n }\n }\n\n this.stats.entries = Math.max(0, this.stats.entries - count);\n return count;\n }\n\n /**\n * Get cache statistics\n */\n getStats(): CacheStats {\n this.updateHitRate();\n return { ...this.stats };\n }\n\n /**\n * Get analytics instance\n */\n getAnalytics(): CacheAnalytics {\n return this.analytics;\n }\n\n /**\n * Get configuration\n */\n getConfig(): Readonly<SemanticCacheConfig> {\n return { ...this.config };\n }\n\n /**\n * Check store health\n */\n async checkHealth(): Promise<StoreHealth> {\n return this.store.checkHealth();\n }\n\n /**\n * Close the cache and release resources\n */\n async close(): Promise<void> {\n await this.store.close();\n this.removeAllListeners();\n }\n\n private updateStats(type: 'hit' | 'miss', result?: CacheLookupResult): void {\n if (type === 'hit' && result) {\n if (result.source === 'exact') {\n this.stats.exactHits++;\n } else if (result.source === 'semantic') {\n this.stats.semanticHits++;\n if (result.similarity) {\n // Update running average\n const total = this.stats.exactHits + this.stats.semanticHits;\n this.stats.avgSimilarity =\n (this.stats.avgSimilarity * (total - 1) + result.similarity) /\n total;\n }\n }\n\n // Calculate cost savings\n if (result.entry?.response.usage) {\n this.stats.tokensSaved += result.entry.response.usage.totalTokens;\n // Rough cost estimate: $0.01 per 1K tokens (average across models)\n this.stats.costSavingsUSD +=\n (result.entry.response.usage.totalTokens / 1000) * 0.01;\n }\n }\n\n this.updateHitRate();\n }\n\n private updateHitRate(): void {\n const total = this.stats.hits + this.stats.misses;\n this.stats.hitRate = total > 0 ? this.stats.hits / total : 0;\n }\n}\n\n/**\n * Create a SemanticCache instance\n */\nexport function createSemanticCache(\n config: Partial<SemanticCacheConfig>,\n store: BaseCacheStore,\n strategy: BaseMatchStrategy,\n similarity?: SimilarityEngine,\n): SemanticCache {\n return new SemanticCache(config, store, strategy, similarity);\n}\n","/**\n * BaseCacheStore\n *\n * Abstract base class for cache stores.\n * Follows the template method pattern.\n */\n\nimport type {\n CacheEntry,\n CacheBackendType,\n StoreConfig,\n StoreHealth,\n StoreQueryOptions,\n StoreQueryResult,\n UpsertResult,\n StoreMetrics,\n} from '../types/index.js';\n\n/**\n * Abstract base class for cache stores\n *\n * All store implementations must extend this class and implement\n * the abstract methods for their specific storage backend.\n */\nexport abstract class BaseCacheStore {\n /** Store type identifier */\n abstract readonly storeType: CacheBackendType;\n\n /** Store configuration */\n protected config: StoreConfig;\n\n /** Store metrics */\n protected metrics: StoreMetrics = {\n gets: 0,\n sets: 0,\n deletes: 0,\n hits: 0,\n misses: 0,\n };\n\n constructor(config: StoreConfig) {\n this.config = {\n namespace: config.namespace ?? 'default',\n ...config,\n };\n }\n\n /**\n * Get an entry by key (exact match)\n *\n * @param key - The cache key\n * @returns The cache entry or undefined if not found\n */\n abstract get(key: string): Promise<CacheEntry | undefined>;\n\n /**\n * Set an entry in the store\n *\n * @param key - The cache key\n * @param entry - The cache entry to store\n * @returns The result of the upsert operation\n */\n abstract set(key: string, entry: CacheEntry): Promise<UpsertResult>;\n\n /**\n * Check if a key exists in the store\n *\n * @param key - The cache key\n * @returns Whether the key exists\n */\n abstract has(key: string): Promise<boolean>;\n\n /**\n * Delete an entry from the store\n *\n * @param key - The cache key\n * @returns Whether the entry was deleted\n */\n abstract delete(key: string): Promise<boolean>;\n\n /**\n * Clear all entries from the store\n */\n abstract clear(): Promise<void>;\n\n /**\n * Get the number of entries in the store\n */\n abstract size(): Promise<number>;\n\n /**\n * Get all keys in the store\n */\n abstract keys(): Promise<string[]>;\n\n /**\n * Query by vector similarity (for semantic matching)\n *\n * @param vector - The query embedding vector\n * @param options - Query options\n * @returns Query results with similarity scores\n */\n abstract query(\n vector: number[],\n options?: StoreQueryOptions,\n ): Promise<StoreQueryResult>;\n\n /**\n * Check store health\n *\n * @returns Health status\n */\n abstract checkHealth(): Promise<StoreHealth>;\n\n /**\n * Close/cleanup the store\n */\n abstract close(): Promise<void>;\n\n /**\n * Get the store namespace\n */\n get namespace(): string {\n return this.config.namespace ?? 'default';\n }\n\n /**\n * Get store metrics\n */\n getMetrics(): StoreMetrics {\n return { ...this.metrics };\n }\n\n /**\n * Reset store metrics\n */\n resetMetrics(): void {\n this.metrics = {\n gets: 0,\n sets: 0,\n deletes: 0,\n hits: 0,\n misses: 0,\n };\n }\n\n /**\n * Increment a metric counter\n */\n protected incrementMetric(metric: keyof StoreMetrics, amount = 1): void {\n if (typeof this.metrics[metric] === 'number') {\n this.metrics[metric] += amount;\n }\n }\n}\n","/**\n * MemoryCacheStore\n *\n * In-memory LRU cache store with vector search support.\n */\n\nimport { LRUCache } from 'lru-cache';\nimport { BaseCacheStore } from './BaseCacheStore.js';\nimport type {\n CacheEntry,\n CacheBackendType,\n MemoryStoreConfig,\n StoreHealth,\n StoreQueryOptions,\n StoreQueryResult,\n UpsertResult,\n} from '../types/index.js';\nimport { estimateEntrySize, now } from '../core/utils.js';\n\n/**\n * Default memory store configuration\n */\nconst DEFAULT_CONFIG: Partial<MemoryStoreConfig> = {\n maxEntries: 10000,\n maxSizeBytes: 1024 * 1024 * 1024, // 1GB\n evictionPolicy: 'lru',\n};\n\n/**\n * MemoryCacheStore\n *\n * In-memory cache store using LRU eviction.\n * Supports vector similarity search for semantic matching.\n *\n * @example\n * ```typescript\n * const store = new MemoryCacheStore({\n * type: 'memory',\n * maxEntries: 10000,\n * evictionPolicy: 'lru'\n * });\n *\n * await store.set('key', entry);\n * const result = await store.get('key');\n * ```\n */\nexport class MemoryCacheStore extends BaseCacheStore {\n readonly storeType: CacheBackendType = 'memory';\n\n private cache: LRUCache<string, CacheEntry>;\n private vectors: Map<string, { id: string; vector: number[] }> = new Map();\n private memoryConfig: MemoryStoreConfig;\n private closed = false;\n\n constructor(config: MemoryStoreConfig = { type: 'memory' }) {\n super(config);\n this.memoryConfig = { ...DEFAULT_CONFIG, ...config };\n\n this.cache = new LRUCache({\n max: this.memoryConfig.maxEntries ?? 10000,\n maxSize: this.memoryConfig.maxSizeBytes ?? 1024 * 1024 * 1024,\n sizeCalculation: (entry) => estimateEntrySize(entry),\n ttl: 0, // TTL handled per-entry\n updateAgeOnGet: true,\n allowStale: false,\n });\n }\n\n get(key: string): Promise<CacheEntry | undefined> {\n this.incrementMetric('gets');\n const entry = this.cache.get(key);\n\n if (entry) {\n this.incrementMetric('hits');\n // Update access metadata\n entry.metadata.accessedAt = now();\n entry.metadata.accessCount++;\n return Promise.resolve(entry);\n }\n\n this.incrementMetric('misses');\n return Promise.resolve(undefined);\n }\n\n set(key: string, entry: CacheEntry): Promise<UpsertResult> {\n const startTime = performance.now();\n this.incrementMetric('sets');\n\n // Set TTL if specified\n const ttlMs =\n entry.metadata.ttl > 0 ? entry.metadata.ttl * 1000 : undefined;\n\n this.cache.set(key, entry, { ttl: ttlMs });\n\n // Store vector for similarity search\n if (entry.embedding && entry.embedding.length > 0) {\n this.vectors.set(key, {\n id: entry.id,\n vector: entry.embedding,\n });\n }\n\n return Promise.resolve({\n success: true,\n id: entry.id,\n durationMs: performance.now() - startTime,\n });\n }\n\n has(key: string): Promise<boolean> {\n return Promise.resolve(this.cache.has(key));\n }\n\n delete(key: string): Promise<boolean> {\n this.incrementMetric('deletes');\n const existed = this.cache.has(key);\n this.cache.delete(key);\n this.vectors.delete(key);\n return Promise.resolve(existed);\n }\n\n clear(): Promise<void> {\n this.cache.clear();\n this.vectors.clear();\n return Promise.resolve();\n }\n\n size(): Promise<number> {\n return Promise.resolve(this.cache.size);\n }\n\n keys(): Promise<string[]> {\n return Promise.resolve(Array.from(this.cache.keys()));\n }\n\n query(\n vector: number[],\n options?: StoreQueryOptions,\n ): Promise<StoreQueryResult> {\n const startTime = performance.now();\n const topK = options?.topK ?? 10;\n const minSimilarity = options?.minSimilarity ?? 0;\n\n const results: Array<CacheEntry & { score: number }> = [];\n\n // Compute similarity for all vectors\n for (const [key, stored] of this.vectors) {\n // Filter by namespace if specified\n const entry = this.cache.get(key);\n if (!entry) continue;\n\n if (\n options?.namespace &&\n entry.metadata.namespace !== options.namespace\n ) {\n continue;\n }\n\n const similarity = this.cosineSimilarity(vector, stored.vector);\n\n if (similarity >= minSimilarity) {\n results.push({ ...entry, score: similarity });\n }\n }\n\n // Sort by score descending\n results.sort((a, b) => b.score - a.score);\n\n return Promise.resolve({\n entries: results.slice(0, topK),\n durationMs: performance.now() - startTime,\n });\n }\n\n checkHealth(): Promise<StoreHealth> {\n return Promise.resolve({\n healthy: !this.closed,\n latencyMs: 0,\n lastCheck: now(),\n error: this.closed ? 'Store is closed' : undefined,\n });\n }\n\n close(): Promise<void> {\n this.closed = true;\n this.cache.clear();\n this.vectors.clear();\n return Promise.resolve();\n }\n\n /**\n * Compute cosine similarity between two vectors\n */\n private cosineSimilarity(a: number[], b: number[]): number {\n if (a.length !== b.length) return 0;\n\n let dotProduct = 0;\n let normA = 0;\n let normB = 0;\n\n for (let i = 0; i < a.length; i++) {\n dotProduct += a[i] * b[i];\n normA += a[i] * a[i];\n normB += b[i] * b[i];\n }\n\n const denominator = Math.sqrt(normA) * Math.sqrt(normB);\n if (denominator === 0) return 0;\n\n return dotProduct / denominator;\n }\n\n /**\n * Get memory usage information\n */\n getMemoryInfo(): {\n entries: number;\n calculatedSize: number;\n maxSize: number;\n vectorCount: number;\n } {\n return {\n entries: this.cache.size,\n calculatedSize: this.cache.calculatedSize ?? 0,\n maxSize: this.memoryConfig.maxSizeBytes ?? 0,\n vectorCount: this.vectors.size,\n };\n }\n\n /**\n * Prune expired entries\n */\n prune(): Promise<number> {\n // LRUCache handles TTL automatically, but we can force a purge\n this.cache.purgeStale();\n\n // Clean up orphaned vectors\n let pruned = 0;\n for (const key of this.vectors.keys()) {\n if (!this.cache.has(key)) {\n this.vectors.delete(key);\n pruned++;\n }\n }\n\n return Promise.resolve(pruned);\n }\n}\n\n/**\n * Create a MemoryCacheStore instance\n */\nexport function createMemoryCacheStore(\n config?: Partial<MemoryStoreConfig>,\n): MemoryCacheStore {\n return new MemoryCacheStore({ type: 'memory', ...config });\n}\n","/**\n * Similarity Metrics\n *\n * Common similarity and distance metrics for vector comparison.\n */\n\n/**\n * Compute cosine similarity between two vectors\n *\n * @param a - First vector\n * @param b - Second vector\n * @returns Similarity score between -1 and 1 (1 = identical)\n */\nexport function cosineSimilarity(a: number[], b: number[]): number {\n if (a.length !== b.length) return 0;\n\n let dotProduct = 0;\n let normA = 0;\n let normB = 0;\n\n for (let i = 0; i < a.length; i++) {\n dotProduct += a[i] * b[i];\n normA += a[i] * a[i];\n normB += b[i] * b[i];\n }\n\n const denominator = Math.sqrt(normA) * Math.sqrt(normB);\n if (denominator === 0) return 0;\n\n return dotProduct / denominator;\n}\n\n/**\n * Compute Euclidean distance between two vectors\n *\n * @param a - First vector\n * @param b - Second vector\n * @returns Distance (0 = identical, higher = more different)\n */\nexport function euclideanDistance(a: number[], b: number[]): number {\n if (a.length !== b.length) return Infinity;\n\n let sum = 0;\n for (let i = 0; i < a.length; i++) {\n const diff = a[i] - b[i];\n sum += diff * diff;\n }\n\n return Math.sqrt(sum);\n}\n\n/**\n * Compute dot product between two vectors\n *\n * @param a - First vector\n * @param b - Second vector\n * @returns Dot product value\n */\nexport function dotProduct(a: number[], b: number[]): number {\n if (a.length !== b.length) return 0;\n\n let sum = 0;\n for (let i = 0; i < a.length; i++) {\n sum += a[i] * b[i];\n }\n\n return sum;\n}\n\n/**\n * Compute Manhattan distance between two vectors\n *\n * @param a - First vector\n * @param b - Second vector\n * @returns Distance (0 = identical, higher = more different)\n */\nexport function manhattanDistance(a: number[], b: number[]): number {\n if (a.length !== b.length) return Infinity;\n\n let sum = 0;\n for (let i = 0; i < a.length; i++) {\n sum += Math.abs(a[i] - b[i]);\n }\n\n return sum;\n}\n\n/**\n * Convert Euclidean distance to similarity (0-1)\n *\n * @param distance - Euclidean distance\n * @returns Similarity score between 0 and 1\n */\nexport function distanceToSimilarity(distance: number): number {\n return 1 / (1 + distance);\n}\n\n/**\n * Normalize a vector to unit length\n *\n * @param vector - Vector to normalize\n * @returns Normalized vector\n */\nexport function normalize(vector: number[]): number[] {\n const magnitude = Math.sqrt(vector.reduce((sum, v) => sum + v * v, 0));\n if (magnitude === 0) return vector;\n return vector.map((v) => v / magnitude);\n}\n\n/**\n * Compute the magnitude (L2 norm) of a vector\n *\n * @param vector - Vector\n * @returns Magnitude\n */\nexport function magnitude(vector: number[]): number {\n return Math.sqrt(vector.reduce((sum, v) => sum + v * v, 0));\n}\n","/**\n * RedisCacheStore\n *\n * Redis-based cache store for distributed caching.\n */\n\nimport { BaseCacheStore } from './BaseCacheStore.js';\nimport type {\n CacheEntry,\n CacheBackendType,\n RedisStoreConfig,\n StoreHealth,\n StoreQueryOptions,\n StoreQueryResult,\n UpsertResult,\n} from '../types/index.js';\nimport { now } from '../core/utils.js';\nimport { cosineSimilarity } from '../similarity/metrics/SimilarityMetrics.js';\n\n/**\n * Redis client interface (compatible with ioredis)\n */\ninterface RedisClient {\n get(key: string): Promise<string | null>;\n set(key: string, value: string, ...args: unknown[]): Promise<unknown>;\n del(...keys: string[]): Promise<number>;\n exists(...keys: string[]): Promise<number>;\n keys(pattern: string): Promise<string[]>;\n quit(): Promise<unknown>;\n ping(): Promise<string>;\n expire(key: string, seconds: number): Promise<number>;\n}\n\n/**\n * Default configuration\n */\nconst DEFAULT_CONFIG: Partial<RedisStoreConfig> = {\n host: 'localhost',\n port: 6379,\n db: 0,\n keyPrefix: 'llm-cache',\n connectTimeout: 10000,\n};\n\n/**\n * RedisCacheStore\n *\n * Redis-based cache store for distributed caching scenarios.\n *\n * @example\n * ```typescript\n * const store = new RedisCacheStore({\n * type: 'redis',\n * url: 'redis://localhost:6379',\n * keyPrefix: 'my-app-cache'\n * });\n *\n * await store.connect();\n * await store.set('key', entry);\n * ```\n */\nexport class RedisCacheStore extends BaseCacheStore {\n readonly storeType: CacheBackendType = 'redis';\n\n private client: RedisClient | null = null;\n private redisConfig: RedisStoreConfig;\n private connected = false;\n\n constructor(config: RedisStoreConfig) {\n super(config);\n this.redisConfig = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Connect to Redis\n */\n async connect(): Promise<void> {\n if (this.connected) return;\n\n try {\n const { Redis } = await import('ioredis');\n\n if (this.redisConfig.url) {\n this.client = new Redis(this.redisConfig.url, {\n connectTimeout: this.redisConfig.connectTimeout ?? 10000,\n lazyConnect: false,\n tls: this.redisConfig.tls ? {} : undefined,\n }) as unknown as RedisClient;\n } else {\n this.client = new Redis({\n host: this.redisConfig.host ?? 'localhost',\n port: this.redisConfig.port ?? 6379,\n password: this.redisConfig.password,\n db: this.redisConfig.db ?? 0,\n connectTimeout: this.redisConfig.connectTimeout ?? 10000,\n tls: this.redisConfig.tls ? {} : undefined,\n }) as unknown as RedisClient;\n }\n\n await this.client.ping();\n this.connected = true;\n } catch (error) {\n throw new Error(\n `Failed to connect to Redis: ${(error as Error).message}`,\n );\n }\n }\n\n private async ensureConnected(): Promise<RedisClient> {\n if (!this.connected || !this.client) {\n await this.connect();\n }\n if (!this.client) {\n throw new Error('Redis client not initialized');\n }\n return this.client;\n }\n\n private prefixKey(key: string): string {\n const prefix = this.redisConfig.keyPrefix ?? 'llm-cache';\n return `${prefix}:${this.namespace}:${key}`;\n }\n\n async get(key: string): Promise<CacheEntry | undefined> {\n this.incrementMetric('gets');\n const client = await this.ensureConnected();\n const data = await client.get(this.prefixKey(key));\n\n if (!data) {\n this.incrementMetric('misses');\n return undefined;\n }\n\n this.incrementMetric('hits');\n try {\n const entry = JSON.parse(data) as CacheEntry;\n entry.metadata.accessedAt = now();\n entry.metadata.accessCount++;\n // Fire and forget update\n client.set(this.prefixKey(key), JSON.stringify(entry)).catch(() => {});\n return entry;\n } catch {\n return undefined;\n }\n }\n\n async set(key: string, entry: CacheEntry): Promise<UpsertResult> {\n const startTime = performance.now();\n this.incrementMetric('sets');\n const client = await this.ensureConnected();\n\n await client.set(this.prefixKey(key), JSON.stringify(entry));\n\n // Set TTL if specified\n if (entry.metadata.ttl > 0) {\n await client.expire(this.prefixKey(key), entry.metadata.ttl);\n }\n\n return {\n success: true,\n id: entry.id,\n durationMs: performance.now() - startTime,\n };\n }\n\n async has(key: string): Promise<boolean> {\n const client = await this.ensureConnected();\n return (await client.exists(this.prefixKey(key))) > 0;\n }\n\n async delete(key: string): Promise<boolean> {\n this.incrementMetric('deletes');\n const client = await this.ensureConnected();\n return (await client.del(this.prefixKey(key))) > 0;\n }\n\n async clear(): Promise<void> {\n const client = await this.ensureConnected();\n const pattern = this.prefixKey('*');\n const keys = await client.keys(pattern);\n if (keys.length > 0) {\n await client.del(...keys);\n }\n }\n\n async size(): Promise<number> {\n const client = await this.ensureConnected();\n const keys = await client.keys(this.prefixKey('*'));\n return keys.length;\n }\n\n async keys(): Promise<string[]> {\n const client = await this.ensureConnected();\n const keys = await client.keys(this.prefixKey('*'));\n const prefix = this.prefixKey('');\n return keys.map((k) => k.slice(prefix.length));\n }\n\n async query(\n vector: number[],\n options?: StoreQueryOptions,\n ): Promise<StoreQueryResult> {\n const startTime = performance.now();\n\n // Basic Redis doesn't support vector search natively.\n // For production, use Redis Stack with vector search.\n // This fallback loads entries and computes similarity client-side.\n\n const allKeys = await this.keys();\n const entries: Array<CacheEntry & { score: number }> = [];\n\n // Limit keys to process for performance\n const keysToProcess = allKeys.slice(0, 1000);\n\n for (const key of keysToProcess) {\n const entry = await this.get(key);\n if (entry?.embedding) {\n const score = cosineSimilarity(vector, entry.embedding);\n if (score >= (options?.minSimilarity ?? 0)) {\n // Filter by namespace if specified\n if (\n options?.namespace &&\n entry.metadata.namespace !== options.namespace\n ) {\n continue;\n }\n entries.push({ ...entry, score });\n }\n }\n }\n\n entries.sort((a, b) => b.score - a.score);\n\n return {\n entries: entries.slice(0, options?.topK ?? 10),\n durationMs: performance.now() - startTime,\n };\n }\n\n async checkHealth(): Promise<StoreHealth> {\n const startTime = performance.now();\n try {\n const client = await this.ensureConnected();\n await client.ping();\n return {\n healthy: true,\n latencyMs: performance.now() - startTime,\n lastCheck: now(),\n };\n } catch (error) {\n return {\n healthy: false,\n latencyMs: performance.now() - startTime,\n lastCheck: now(),\n error: (error as Error).message,\n };\n }\n }\n\n async close(): Promise<void> {\n if (this.client) {\n await this.client.quit();\n this.client = null;\n this.connected = false;\n }\n }\n\n /**\n * Check if connected to Redis\n */\n isConnected(): boolean {\n return this.connected;\n }\n}\n\n/**\n * Create a RedisCacheStore instance\n */\nexport function createRedisCacheStore(\n config: RedisStoreConfig,\n): RedisCacheStore {\n return new RedisCacheStore(config);\n}\n","/**\n * SQLiteCacheStore\n *\n * SQLite-based cache store with optional vector search support.\n */\n\nimport { BaseCacheStore } from './BaseCacheStore.js';\nimport type {\n CacheEntry,\n CacheBackendType,\n SQLiteStoreConfig,\n StoreHealth,\n StoreQueryOptions,\n StoreQueryResult,\n UpsertResult,\n} from '../types/index.js';\nimport { now } from '../core/utils.js';\nimport { cosineSimilarity } from '../similarity/metrics/SimilarityMetrics.js';\n\n/**\n * SQLite database interface (compatible with better-sqlite3)\n */\ninterface Database {\n prepare(sql: string): Statement;\n exec(sql: string): void;\n close(): void;\n}\n\ninterface Statement {\n run(...params: unknown[]): { changes: number };\n get(...params: unknown[]): unknown;\n all(...params: unknown[]): unknown[];\n}\n\n/**\n * Default configuration\n */\nconst DEFAULT_CONFIG: Partial<SQLiteStoreConfig> = {\n dbPath: 'cache.db',\n inMemory: false,\n enableVector: false,\n};\n\n/**\n * SQLiteCacheStore\n *\n * SQLite-based cache store for persistent local caching.\n * Supports optional vector search for semantic matching.\n *\n * @example\n * ```typescript\n * const store = new SQLiteCacheStore({\n * type: 'sqlite',\n * dbPath: './cache.db'\n * });\n *\n * await store.init();\n * await store.set('key', entry);\n * ```\n */\nexport class SQLiteCacheStore extends BaseCacheStore {\n readonly storeType: CacheBackendType = 'sqlite';\n\n private db: Database | null = null;\n private sqliteConfig: SQLiteStoreConfig;\n private initialized = false;\n\n constructor(config: SQLiteStoreConfig) {\n super(config);\n this.sqliteConfig = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Initialize the database\n */\n async init(): Promise<void> {\n if (this.initialized) return;\n\n try {\n const BetterSqlite3 = (await import('better-sqlite3')).default;\n\n const db = new BetterSqlite3(\n this.sqliteConfig.inMemory\n ? ':memory:'\n : (this.sqliteConfig.dbPath ?? 'cache.db'),\n );\n this.db = db;\n\n // Create tables\n db.exec(`\n CREATE TABLE IF NOT EXISTS cache_entries (\n key TEXT PRIMARY KEY,\n id TEXT NOT NULL,\n data TEXT NOT NULL,\n embedding BLOB,\n model TEXT NOT NULL,\n namespace TEXT,\n created_at INTEGER NOT NULL,\n accessed_at INTEGER NOT NULL,\n ttl INTEGER DEFAULT 0\n );\n\n CREATE INDEX IF NOT EXISTS idx_namespace ON cache_entries(namespace);\n CREATE INDEX IF NOT EXISTS idx_model ON cache_entries(model);\n CREATE INDEX IF NOT EXISTS idx_created_at ON cache_entries(created_at);\n CREATE INDEX IF NOT EXISTS idx_accessed_at ON cache_entries(accessed_at);\n `);\n\n this.initialized = true;\n } catch (error) {\n throw new Error(\n `Failed to initialize SQLite database: ${(error as Error).message}`,\n );\n }\n }\n\n private ensureInitialized(): Database {\n if (!this.initialized || !this.db) {\n throw new Error('SQLite store not initialized. Call init() first.');\n }\n return this.db;\n }\n\n get(key: string): Promise<CacheEntry | undefined> {\n this.incrementMetric('gets');\n const db = this.ensureInitialized();\n\n const row = db\n .prepare('SELECT data FROM cache_entries WHERE key = ?')\n .get(key) as { data: string } | undefined;\n\n if (!row) {\n this.incrementMetric('misses');\n return Promise.resolve(undefined);\n }\n\n this.incrementMetric('hits');\n try {\n const entry = JSON.parse(row.data) as CacheEntry;\n\n // Update access metadata\n entry.metadata.accessedAt = now();\n entry.metadata.accessCount++;\n db.prepare(\n 'UPDATE cache_entries SET accessed_at = ?, data = ? WHERE key = ?',\n ).run(now(), JSON.stringify(entry), key);\n\n return Promise.resolve(entry);\n } catch {\n return Promise.resolve(undefined);\n }\n }\n\n set(key: string, entry: CacheEntry): Promise<UpsertResult> {\n const startTime = performance.now();\n this.incrementMetric('sets');\n const db = this.ensureInitialized();\n\n // Convert embedding to buffer if present\n const embedding = entry.embedding\n ? Buffer.from(new Float32Array(entry.embedding).buffer)\n : null;\n\n db.prepare(\n `\n INSERT OR REPLACE INTO cache_entries\n (key, id, data, embedding, model, namespace, created_at, accessed_at, ttl)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `,\n ).run(\n key,\n entry.id,\n JSON.stringify(entry),\n embedding,\n entry.request.model,\n entry.metadata.namespace ?? null,\n entry.metadata.createdAt,\n entry.metadata.accessedAt,\n entry.metadata.ttl,\n );\n\n return Promise.resolve({\n success: true,\n id: entry.id,\n durationMs: performance.now() - startTime,\n });\n }\n\n has(key: string): Promise<boolean> {\n const db = this.ensureInitialized();\n const row = db\n .prepare('SELECT 1 FROM cache_entries WHERE key = ?')\n .get(key);\n return Promise.resolve(!!row);\n }\n\n delete(key: string): Promise<boolean> {\n this.incrementMetric('deletes');\n const db = this.ensureInitialized();\n const result = db\n .prepare('DELETE FROM cache_entries WHERE key = ?')\n .run(key);\n return Promise.resolve(result.changes > 0);\n }\n\n clear(): Promise<void> {\n const db = this.ensureInitialized();\n if (this.namespace === 'default') {\n db.prepare('DELETE FROM cache_entries').run();\n } else {\n db.prepare('DELETE FROM cache_entries WHERE namespace = ?').run(\n this.namespace,\n );\n }\n return Promise.resolve();\n }\n\n size(): Promise<number> {\n const db = this.ensureInitialized();\n const row = db\n .prepare('SELECT COUNT(*) as count FROM cache_entries')\n .get() as { count: number };\n return Promise.resolve(row.count);\n }\n\n keys(): Promise<string[]> {\n const db = this.ensureInitialized();\n const rows = db.prepare('SELECT key FROM cache_entries').all() as Array<{\n key: string;\n }>;\n return Promise.resolve(rows.map((r) => r.key));\n }\n\n query(\n vector: number[],\n options?: StoreQueryOptions,\n ): Promise<StoreQueryResult> {\n const startTime = performance.now();\n const db = this.ensureInitialized();\n\n // Build query with optional namespace filter\n let sql = `\n SELECT key, data, embedding FROM cache_entries\n WHERE embedding IS NOT NULL\n `;\n const params: unknown[] = [];\n\n if (options?.namespace) {\n sql += ' AND namespace = ?';\n params.push(options.namespace);\n }\n\n const rows = db.prepare(sql).all(...params) as Array<{\n key: string;\n data: string;\n embedding: Buffer;\n }>;\n\n // Compute similarities\n const results: Array<CacheEntry & { score: number }> = [];\n\n for (const row of rows) {\n const stored = new Float32Array(\n row.embedding.buffer,\n row.embedding.byteOffset,\n row.embedding.length / 4,\n );\n const similarity = cosineSimilarity(vector, Array.from(stored));\n\n if (similarity >= (options?.minSimilarity ?? 0)) {\n try {\n const entry = JSON.parse(row.data) as CacheEntry;\n results.push({ ...entry, score: similarity });\n } catch {\n // Skip invalid entries\n }\n }\n }\n\n results.sort((a, b) => b.score - a.score);\n\n return Promise.resolve({\n entries: results.slice(0, options?.topK ?? 10),\n durationMs: performance.now() - startTime,\n });\n }\n\n checkHealth(): Promise<StoreHealth> {\n const startTime = performance.now();\n try {\n this.ensureInitialized();\n return Promise.resolve({\n healthy: true,\n latencyMs: performance.now() - startTime,\n lastCheck: now(),\n });\n } catch (error) {\n return Promise.resolve({\n healthy: false,\n latencyMs: performance.now() - startTime,\n lastCheck: now(),\n error: (error as Error).message,\n });\n }\n }\n\n close(): Promise<void> {\n if (this.db) {\n this.db.close();\n this.db = null;\n this.initialized = false;\n }\n return Promise.resolve();\n }\n\n /**\n * Prune expired entries\n */\n pruneExpired(): Promise<number> {\n const db = this.ensureInitialized();\n const currentTime = now();\n\n const result = db\n .prepare(\n `\n DELETE FROM cache_entries\n WHERE ttl > 0 AND (created_at + (ttl * 1000)) < ?\n `,\n )\n .run(currentTime);\n\n return Promise.resolve(result.changes);\n }\n\n /**\n * Get database file size (for non-memory databases)\n */\n async getDbSize(): Promise<number | null> {\n if (this.sqliteConfig.inMemory) return null;\n\n try {\n const { statSync } = await import('fs');\n const stats = statSync(this.sqliteConfig.dbPath ?? 'cache.db');\n return stats.size;\n } catch {\n return null;\n }\n }\n\n /**\n * Check if database is initialized\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n}\n\n/**\n * Create a SQLiteCacheStore instance\n */\nexport function createSQLiteCacheStore(\n config: SQLiteStoreConfig,\n): SQLiteCacheStore {\n return new SQLiteCacheStore(config);\n}\n","/**\n * TieredCacheStore\n *\n * Multi-tier cache store with automatic promotion and demotion.\n */\n\nimport { BaseCacheStore } from './BaseCacheStore.js';\nimport type {\n CacheEntry,\n CacheBackendType,\n TieredStoreConfig,\n TierConfig,\n StoreHealth,\n StoreQueryOptions,\n StoreQueryResult,\n UpsertResult,\n} from '../types/index.js';\nimport { now } from '../core/utils.js';\n\n/**\n * TieredCacheStore\n *\n * Multi-tier cache store that manages multiple cache backends\n * with automatic promotion and demotion based on access patterns.\n *\n * @example\n * ```typescript\n * const tieredStore = new TieredCacheStore({\n * type: 'tiered',\n * tiers: [\n * {\n * name: 'hot',\n * store: memoryStore,\n * priority: 1,\n * maxSize: 1000,\n * promotionThreshold: 3\n * },\n * {\n * name: 'warm',\n * store: redisStore,\n * priority: 2,\n * maxSize: 10000\n * },\n * {\n * name: 'cold',\n * store: sqliteStore,\n * priority: 3\n * }\n * ]\n * });\n *\n * await tieredStore.set('key', entry);\n * const result = await tieredStore.get('key');\n * ```\n */\n/**\n * Internal tier representation with guaranteed store\n */\ninterface InternalTier extends TierConfig {\n store: BaseCacheStore;\n}\n\nexport class TieredCacheStore extends BaseCacheStore {\n readonly storeType: CacheBackendType = 'tiered';\n\n private tiers: InternalTier[];\n private accessCounts: Map<string, number> = new Map();\n\n constructor(config: TieredStoreConfig) {\n super(config);\n\n // Filter and validate tiers that have stores\n const validTiers = config.tiers.filter(\n (t): t is InternalTier => t.store !== undefined,\n );\n\n if (validTiers.length === 0) {\n throw new Error(\n 'TieredCacheStore requires at least one tier with a store',\n );\n }\n\n // Sort tiers by priority (lower = higher priority)\n this.tiers = validTiers.sort((a, b) => a.priority - b.priority);\n }\n\n async get(key: string): Promise<CacheEntry | undefined> {\n this.incrementMetric('gets');\n\n // Search tiers from highest to lowest priority\n for (let i = 0; i < this.tiers.length; i++) {\n const tier = this.tiers[i];\n const entry = await tier.store.get(key);\n\n if (entry) {\n this.incrementMetric('hits');\n\n // Track access count\n const accessCount = (this.accessCounts.get(key) ?? 0) + 1;\n this.accessCounts.set(key, accessCount);\n\n // Check for promotion\n if (i > 0) {\n await this.checkPromotion(key, entry, i, accessCount);\n }\n\n return entry;\n }\n }\n\n this.incrementMetric('misses');\n return undefined;\n }\n\n async set(key: string, entry: CacheEntry): Promise<UpsertResult> {\n const startTime = performance.now();\n this.incrementMetric('sets');\n\n // Set in the primary (first) tier\n const result = await this.tiers[0].store.set(key, entry);\n\n // Initialize access count\n this.accessCounts.set(key, 0);\n\n // Check if we need to demote entries from the primary tier\n await this.checkDemotion(0);\n\n return {\n ...result,\n durationMs: performance.now() - startTime,\n };\n }\n\n async has(key: string): Promise<boolean> {\n for (const tier of this.tiers) {\n if (await tier.store.has(key)) {\n return true;\n }\n }\n return false;\n }\n\n async delete(key: string): Promise<boolean> {\n this.incrementMetric('deletes');\n let deleted = false;\n\n // Delete from all tiers\n for (const tier of this.tiers) {\n if (await tier.store.delete(key)) {\n deleted = true;\n }\n }\n\n this.accessCounts.delete(key);\n return deleted;\n }\n\n async clear(): Promise<void> {\n for (const tier of this.tiers) {\n await tier.store.clear();\n }\n this.accessCounts.clear();\n }\n\n async size(): Promise<number> {\n // Count unique keys across all tiers\n const allKeys = new Set<string>();\n for (const tier of this.tiers) {\n const keys = await tier.store.keys();\n keys.forEach((k) => allKeys.add(k));\n }\n return allKeys.size;\n }\n\n async keys(): Promise<string[]> {\n const allKeys = new Set<string>();\n for (const tier of this.tiers) {\n const keys = await tier.store.keys();\n keys.forEach((k) => allKeys.add(k));\n }\n return Array.from(allKeys);\n }\n\n async query(\n vector: number[],\n options?: StoreQueryOptions,\n ): Promise<StoreQueryResult> {\n const startTime = performance.now();\n const entriesMap = new Map<string, CacheEntry & { score: number }>();\n\n // Query all tiers and merge results\n for (const tier of this.tiers) {\n const result = await tier.store.query(vector, options);\n for (const entry of result.entries) {\n // Keep highest score if entry exists in multiple tiers\n const existing = entriesMap.get(entry.key);\n if (!existing || entry.score > existing.score) {\n entriesMap.set(entry.key, entry);\n }\n }\n }\n\n // Sort by score and limit\n const entries = Array.from(entriesMap.values())\n .sort((a, b) => b.score - a.score)\n .slice(0, options?.topK ?? 10);\n\n return {\n entries,\n durationMs: performance.now() - startTime,\n };\n }\n\n async checkHealth(): Promise<StoreHealth> {\n const startTime = performance.now();\n const tierHealths: Array<{ name: string; healthy: boolean }> = [];\n\n for (const tier of this.tiers) {\n const health = await tier.store.checkHealth();\n tierHealths.push({ name: tier.name, healthy: health.healthy });\n }\n\n const allHealthy = tierHealths.every((t) => t.healthy);\n\n return {\n healthy: allHealthy,\n latencyMs: performance.now() - startTime,\n lastCheck: now(),\n error: allHealthy\n ? undefined\n : `Unhealthy tiers: ${tierHealths\n .filter((t) => !t.healthy)\n .map((t) => t.name)\n .join(', ')}`,\n };\n }\n\n async close(): Promise<void> {\n for (const tier of this.tiers) {\n await tier.store.close();\n }\n }\n\n /**\n * Get tier statistics\n */\n async getTierStats(): Promise<\n Array<{\n name: string;\n priority: number;\n size: number;\n maxSize?: number;\n }>\n > {\n const stats = [];\n for (const tier of this.tiers) {\n stats.push({\n name: tier.name,\n priority: tier.priority,\n size: await tier.store.size(),\n maxSize: tier.maxSize,\n });\n }\n return stats;\n }\n\n /**\n * Manually promote an entry to a higher tier\n */\n async promote(key: string, targetTierIndex = 0): Promise<boolean> {\n // Find the entry\n for (let i = targetTierIndex + 1; i < this.tiers.length; i++) {\n const entry = await this.tiers[i].store.get(key);\n if (entry) {\n // Set in target tier\n await this.tiers[targetTierIndex].store.set(key, entry);\n // Delete from source tier\n await this.tiers[i].store.delete(key);\n return true;\n }\n }\n return false;\n }\n\n /**\n * Manually demote an entry to a lower tier\n */\n async demote(key: string, targetTierIndex?: number): Promise<boolean> {\n // Find the entry\n for (let i = 0; i < this.tiers.length - 1; i++) {\n const entry = await this.tiers[i].store.get(key);\n if (entry) {\n const target = targetTierIndex ?? i + 1;\n if (target >= this.tiers.length) return false;\n\n // Set in target tier\n await this.tiers[target].store.set(key, entry);\n // Delete from source tier\n await this.tiers[i].store.delete(key);\n return true;\n }\n }\n return false;\n }\n\n private async checkPromotion(\n key: string,\n entry: CacheEntry,\n currentTierIndex: number,\n accessCount: number,\n ): Promise<void> {\n // Check if entry should be promoted to a higher tier\n for (let i = currentTierIndex - 1; i >= 0; i--) {\n const tier = this.tiers[i];\n const threshold = tier.promotionThreshold ?? 3;\n\n if (accessCount >= threshold) {\n // Promote to this tier\n await tier.store.set(key, entry);\n // Remove from current tier\n await this.tiers[currentTierIndex].store.delete(key);\n break;\n }\n }\n }\n\n private async checkDemotion(tierIndex: number): Promise<void> {\n const tier = this.tiers[tierIndex];\n if (!tier.maxSize) return;\n\n const size = await tier.store.size();\n if (size <= tier.maxSize) return;\n\n // Need to demote some entries\n const demotionTarget = tier.demotionTarget ?? 0.9; // Demote to 90% capacity\n const targetSize = Math.floor(tier.maxSize * demotionTarget);\n const toRemove = size - targetSize;\n\n if (toRemove <= 0) return;\n\n // Get keys sorted by access count (least accessed first)\n const keys = await tier.store.keys();\n const keysByAccess = keys\n .map((k) => ({ key: k, count: this.accessCounts.get(k) ?? 0 }))\n .sort((a, b) => a.count - b.count);\n\n // Demote the least accessed entries\n const nextTierIndex = tierIndex + 1;\n if (nextTierIndex >= this.tiers.length) {\n // No lower tier, just delete\n for (let i = 0; i < toRemove && i < keysByAccess.length; i++) {\n await tier.store.delete(keysByAccess[i].key);\n this.accessCounts.delete(keysByAccess[i].key);\n }\n } else {\n // Demote to next tier\n for (let i = 0; i < toRemove && i < keysByAccess.length; i++) {\n const key = keysByAccess[i].key;\n const entry = await tier.store.get(key);\n if (entry) {\n await this.tiers[nextTierIndex].store.set(key, entry);\n await tier.store.delete(key);\n }\n }\n }\n }\n}\n\n/**\n * Create a TieredCacheStore instance\n */\nexport function createTieredCacheStore(\n config: TieredStoreConfig,\n): TieredCacheStore {\n return new TieredCacheStore(config);\n}\n","/**\n * PineconeCacheStore\n *\n * Pinecone vector database store for scalable semantic caching.\n * Native vector search for high-performance similarity matching.\n */\n\nimport { BaseCacheStore } from './BaseCacheStore.js';\nimport type {\n CacheEntry,\n CacheBackendType,\n PineconeStoreConfig,\n StoreHealth,\n StoreQueryOptions,\n StoreQueryResult,\n UpsertResult,\n} from '../types/index.js';\nimport { now } from '../core/utils.js';\n\n/**\n * Pinecone client interface\n */\ninterface PineconeClient {\n Index(name: string): PineconeIndex;\n}\n\ninterface PineconeIndex {\n namespace(name: string): PineconeNamespace;\n describeIndexStats(): Promise<{\n namespaces: Record<string, { recordCount: number }>;\n }>;\n}\n\ninterface PineconeNamespace {\n upsert(vectors: PineconeVector[]): Promise<void>;\n query(options: PineconeQueryOptions): Promise<PineconeQueryResponse>;\n deleteOne(id: string): Promise<void>;\n deleteMany(ids: string[]): Promise<void>;\n deleteAll(): Promise<void>;\n fetch(ids: string[]): Promise<{ records: Record<string, PineconeRecord> }>;\n listPaginated(options?: {\n prefix?: string;\n limit?: number;\n }): Promise<{ vectors: Array<{ id: string }> }>;\n}\n\ninterface PineconeVector {\n id: string;\n values: number[];\n metadata?: Record<string, unknown>;\n}\n\ninterface PineconeQueryOptions {\n vector: number[];\n topK: number;\n includeMetadata?: boolean;\n includeValues?: boolean;\n filter?: Record<string, unknown>;\n}\n\ninterface PineconeQueryResponse {\n matches: Array<{\n id: string;\n score: number;\n values?: number[];\n metadata?: Record<string, unknown>;\n }>;\n}\n\ninterface PineconeRecord {\n id: string;\n values: number[];\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Pinecone metadata structure for cache entries\n */\ninterface CacheMetadata {\n key: string;\n model: string;\n content: string;\n createdAt: number;\n accessedAt: number;\n accessCount: number;\n hitCount: number;\n ttl: number;\n namespace: string;\n tags: string[];\n entryData: string; // JSON stringified full entry\n}\n\n/**\n * PineconeCacheStore\n *\n * Vector database store for scalable semantic caching.\n * Uses Pinecone for native vector similarity search.\n *\n * @example\n * ```typescript\n * const store = new PineconeCacheStore({\n * type: 'pinecone',\n * apiKey: process.env.PINECONE_API_KEY!,\n * index: 'llm-cache',\n * namespace: 'production'\n * });\n *\n * await store.set('key', entry);\n * const results = await store.query(embedding, { topK: 5 });\n * ```\n */\nexport class PineconeCacheStore extends BaseCacheStore {\n readonly storeType: CacheBackendType = 'pinecone';\n\n private client: PineconeClient | null = null;\n private index: PineconeIndex | null = null;\n private ns: PineconeNamespace | null = null;\n private pineconeConfig: PineconeStoreConfig;\n private connected = false;\n\n constructor(config: PineconeStoreConfig) {\n super(config);\n this.pineconeConfig = config;\n }\n\n /**\n * Connect to Pinecone\n */\n async connect(): Promise<void> {\n if (this.connected) return;\n\n try {\n const { Pinecone } = await import('@pinecone-database/pinecone');\n\n this.client = new Pinecone({\n apiKey: this.pineconeConfig.apiKey,\n }) as unknown as PineconeClient;\n\n this.index = this.client.Index(this.pineconeConfig.index);\n this.ns = this.index.namespace(this.namespace);\n this.connected = true;\n } catch (error) {\n throw new Error(\n `Failed to connect to Pinecone: ${(error as Error).message}`,\n );\n }\n }\n\n private async ensureConnected(): Promise<PineconeNamespace> {\n if (!this.connected || !this.ns) {\n await this.connect();\n }\n if (!this.ns) {\n throw new Error('Pinecone namespace not initialized');\n }\n return this.ns;\n }\n\n async get(key: string): Promise<CacheEntry | undefined> {\n this.incrementMetric('gets');\n const ns = await this.ensureConnected();\n\n try {\n // Fetch by ID (key is used as vector ID)\n const result = await ns.fetch([key]);\n\n if (!result.records[key]) {\n this.incrementMetric('misses');\n return undefined;\n }\n\n this.incrementMetric('hits');\n const record = result.records[key];\n const metadata = record.metadata as unknown as CacheMetadata;\n\n // Parse the full entry from metadata\n const entry = JSON.parse(metadata.entryData) as CacheEntry;\n entry.metadata.accessedAt = now();\n entry.metadata.accessCount++;\n\n // Update access metadata (fire and forget)\n this.updateAccessMetadata(key, record.values, metadata).catch(() => {});\n\n return entry;\n } catch {\n this.incrementMetric('misses');\n return undefined;\n }\n }\n\n private async updateAccessMetadata(\n key: string,\n values: number[],\n metadata: CacheMetadata,\n ): Promise<void> {\n const ns = await this.ensureConnected();\n const updatedEntry = JSON.parse(metadata.entryData) as CacheEntry;\n updatedEntry.metadata.accessedAt = now();\n updatedEntry.metadata.accessCount++;\n\n await ns.upsert([\n {\n id: key,\n values,\n metadata: {\n ...metadata,\n accessedAt: now(),\n accessCount: metadata.accessCount + 1,\n entryData: JSON.stringify(updatedEntry),\n },\n },\n ]);\n }\n\n async set(key: string, entry: CacheEntry): Promise<UpsertResult> {\n const startTime = performance.now();\n this.incrementMetric('sets');\n const ns = await this.ensureConnected();\n\n // Ensure entry has an embedding\n if (!entry.embedding || entry.embedding.length === 0) {\n return {\n success: false,\n id: entry.id,\n durationMs: performance.now() - startTime,\n };\n }\n\n const metadata: CacheMetadata = {\n key,\n model: entry.request.model,\n content: entry.response.content.substring(0, 30000), // Pinecone metadata limit\n createdAt: entry.metadata.createdAt,\n accessedAt: entry.metadata.accessedAt,\n accessCount: entry.metadata.accessCount,\n hitCount: entry.metadata.hitCount,\n ttl: entry.metadata.ttl,\n namespace: entry.metadata.namespace ?? this.namespace,\n tags: entry.metadata.tags ?? [],\n entryData: JSON.stringify(entry),\n };\n\n try {\n await ns.upsert([\n {\n id: key,\n values: entry.embedding,\n metadata: metadata as unknown as Record<string, unknown>,\n },\n ]);\n\n return {\n success: true,\n id: entry.id,\n durationMs: performance.now() - startTime,\n };\n } catch (error) {\n return {\n success: false,\n id: entry.id,\n durationMs: performance.now() - startTime,\n };\n }\n }\n\n async has(key: string): Promise<boolean> {\n const ns = await this.ensureConnected();\n try {\n const result = await ns.fetch([key]);\n return !!result.records[key];\n } catch {\n return false;\n }\n }\n\n async delete(key: string): Promise<boolean> {\n this.incrementMetric('deletes');\n const ns = await this.ensureConnected();\n\n try {\n await ns.deleteOne(key);\n return true;\n } catch {\n return false;\n }\n }\n\n async clear(): Promise<void> {\n const ns = await this.ensureConnected();\n await ns.deleteAll();\n }\n\n async size(): Promise<number> {\n if (!this.index) {\n await this.connect();\n }\n\n try {\n const stats = await this.index!.describeIndexStats();\n return stats.namespaces[this.namespace]?.recordCount ?? 0;\n } catch {\n return 0;\n }\n }\n\n async keys(): Promise<string[]> {\n const ns = await this.ensureConnected();\n\n try {\n // Note: Pinecone doesn't support listing all keys efficiently\n // This uses pagination but may be limited\n const result = await ns.listPaginated({ limit: 10000 });\n return result.vectors.map((v) => v.id);\n } catch {\n return [];\n }\n }\n\n async query(\n vector: number[],\n options?: StoreQueryOptions,\n ): Promise<StoreQueryResult> {\n const startTime = performance.now();\n const ns = await this.ensureConnected();\n\n const queryOptions: PineconeQueryOptions = {\n vector,\n topK: options?.topK ?? 10,\n includeMetadata: true,\n includeValues: options?.includeEmbedding ?? false,\n };\n\n // Add namespace filter if specified\n if (options?.filter) {\n queryOptions.filter = options.filter;\n }\n\n try {\n const result = await ns.query(queryOptions);\n\n const entries: Array<CacheEntry & { score: number }> = [];\n\n for (const match of result.matches) {\n // Skip if below similarity threshold\n if (options?.minSimilarity && match.score < options.minSimilarity) {\n continue;\n }\n\n const metadata = match.metadata as unknown as CacheMetadata;\n\n if (metadata?.entryData) {\n try {\n const entry = JSON.parse(metadata.entryData) as CacheEntry;\n\n // Include embedding if requested\n if (options?.includeEmbedding && match.values) {\n entry.embedding = match.values;\n }\n\n entries.push({\n ...entry,\n score: match.score,\n });\n } catch {\n // Skip malformed entries\n }\n }\n }\n\n return {\n entries,\n durationMs: performance.now() - startTime,\n };\n } catch (error) {\n return {\n entries: [],\n durationMs: performance.now() - startTime,\n };\n }\n }\n\n async checkHealth(): Promise<StoreHealth> {\n const startTime = performance.now();\n\n try {\n if (!this.index) {\n await this.connect();\n }\n\n await this.index!.describeIndexStats();\n\n return {\n healthy: true,\n latencyMs: performance.now() - startTime,\n lastCheck: now(),\n };\n } catch (error) {\n return {\n healthy: false,\n latencyMs: performance.now() - startTime,\n lastCheck: now(),\n error: (error as Error).message,\n };\n }\n }\n\n close(): Promise<void> {\n // Pinecone client doesn't require explicit cleanup\n this.client = null;\n this.index = null;\n this.ns = null;\n this.connected = false;\n return Promise.resolve();\n }\n\n /**\n * Check if connected to Pinecone\n */\n isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Get index stats\n */\n async getIndexStats(): Promise<{\n namespaces: Record<string, { recordCount: number }>;\n } | null> {\n if (!this.index) {\n await this.connect();\n }\n\n try {\n return await this.index!.describeIndexStats();\n } catch {\n return null;\n }\n }\n}\n\n/**\n * Create a PineconeCacheStore instance\n */\nexport function createPineconeCacheStore(\n config: PineconeStoreConfig,\n): PineconeCacheStore {\n return new PineconeCacheStore(config);\n}\n","/**\n * BaseMatchStrategy\n *\n * Abstract base class for cache matching strategies.\n */\n\nimport type {\n CacheLookupResult,\n MatchOptions,\n MatchRequest,\n MatchStrategyType,\n} from '../types/index.js';\nimport type { BaseCacheStore } from '../stores/BaseCacheStore.js';\nimport type { SimilarityEngine } from '../similarity/SimilarityEngine.js';\n\n/**\n * Abstract match strategy\n *\n * All matching strategies must extend this class and implement\n * the match method for their specific matching algorithm.\n */\nexport abstract class BaseMatchStrategy {\n /** Strategy name/type */\n abstract readonly name: MatchStrategyType;\n\n /**\n * Match a request against the cache\n *\n * @param request - The request to match\n * @param store - The cache store to search\n * @param similarity - Optional similarity engine for semantic matching\n * @param options - Match options\n * @returns The lookup result\n */\n abstract match(\n request: MatchRequest,\n store: BaseCacheStore,\n similarity?: SimilarityEngine,\n options?: MatchOptions,\n ): Promise<CacheLookupResult>;\n}\n","/**\n * ExactMatchStrategy\n *\n * Hash-based exact matching strategy.\n * Uses murmurhash to generate cache keys for exact lookups.\n */\n\nimport { BaseMatchStrategy } from './BaseMatchStrategy.js';\nimport type {\n CacheLookupResult,\n MatchOptions,\n MatchRequest,\n MatchStrategyType,\n ExactMatchConfig,\n} from '../types/index.js';\nimport type { BaseCacheStore } from '../stores/BaseCacheStore.js';\nimport type { SimilarityEngine } from '../similarity/SimilarityEngine.js';\nimport { generateCacheKey } from '../core/CacheKey.js';\n\n/**\n * Default exact match configuration\n */\nconst DEFAULT_CONFIG: ExactMatchConfig = {\n normalizeWhitespace: true,\n hashFields: ['model', 'messages'],\n};\n\n/**\n * ExactMatchStrategy\n *\n * Matches requests by computing a hash of the request parameters.\n * This is the fastest matching strategy but only finds identical requests.\n *\n * @example\n * ```typescript\n * const strategy = new ExactMatchStrategy({\n * normalizeWhitespace: true,\n * hashFields: ['model', 'messages']\n * });\n *\n * const result = await strategy.match(request, store);\n * if (result.hit) {\n * console.log('Exact match found:', result.entry);\n * }\n * ```\n */\nexport class ExactMatchStrategy extends BaseMatchStrategy {\n readonly name: MatchStrategyType = 'exact';\n private config: ExactMatchConfig;\n\n constructor(config?: Partial<ExactMatchConfig>) {\n super();\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n async match(\n request: MatchRequest,\n store: BaseCacheStore,\n _similarity?: SimilarityEngine,\n options?: MatchOptions,\n ): Promise<CacheLookupResult> {\n const startTime = performance.now();\n\n // Generate cache key with namespace if provided for exact matching\n const namespace = options?.namespace;\n const baseKey = generateCacheKey(request.model, request.messages, {\n normalizeWhitespace: this.config.normalizeWhitespace,\n includeTemperature: this.config.hashFields?.includes('temperature'),\n });\n\n // Include temperature in key if specified (different temps = different cache entries)\n const tempSuffix =\n request.temperature !== undefined ? `:t:${request.temperature}` : '';\n // Include namespace in key for namespace isolation (matching SemanticCache.set behavior)\n const key =\n namespace && namespace !== 'default'\n ? `${baseKey}${tempSuffix}:ns:${namespace}`\n : `${baseKey}${tempSuffix}`;\n\n // Look up in store\n const entry = await store.get(key);\n\n if (entry) {\n // Verify namespace match if specified\n if (\n namespace &&\n entry.metadata.namespace &&\n entry.metadata.namespace !== namespace\n ) {\n return {\n hit: false,\n latencyMs: performance.now() - startTime,\n source: 'miss',\n };\n }\n\n return {\n hit: true,\n entry,\n similarity: 1.0, // Exact match = 100% similarity\n latencyMs: performance.now() - startTime,\n source: 'exact',\n };\n }\n\n return {\n hit: false,\n latencyMs: performance.now() - startTime,\n source: 'miss',\n };\n }\n}\n\n/**\n * Create an ExactMatchStrategy instance\n */\nexport function createExactMatchStrategy(\n config?: Partial<ExactMatchConfig>,\n): ExactMatchStrategy {\n return new ExactMatchStrategy(config);\n}\n","/**\n * SemanticMatchStrategy\n *\n * Embedding-based semantic matching strategy.\n * Uses vector similarity to find semantically similar cached responses.\n */\n\nimport { BaseMatchStrategy } from './BaseMatchStrategy.js';\nimport type {\n CacheLookupResult,\n MatchOptions,\n MatchRequest,\n MatchStrategyType,\n SemanticMatchConfig,\n} from '../types/index.js';\nimport type { BaseCacheStore } from '../stores/BaseCacheStore.js';\nimport type { SimilarityEngine } from '../similarity/SimilarityEngine.js';\nimport { extractUserMessage } from '../core/CacheKey.js';\n\n/**\n * Default semantic match configuration\n */\nconst DEFAULT_CONFIG: SemanticMatchConfig = {\n threshold: 0.92,\n matchModel: true,\n topK: 5,\n};\n\n/**\n * SemanticMatchStrategy\n *\n * Matches requests by computing semantic similarity between embeddings.\n * Requires a SimilarityEngine to generate and compare embeddings.\n *\n * @example\n * ```typescript\n * const strategy = new SemanticMatchStrategy({\n * threshold: 0.92,\n * topK: 5\n * });\n *\n * const result = await strategy.match(request, store, similarityEngine);\n * if (result.hit) {\n * console.log('Semantic match found:', result.similarity);\n * }\n * ```\n */\nexport class SemanticMatchStrategy extends BaseMatchStrategy {\n readonly name: MatchStrategyType = 'semantic';\n private config: SemanticMatchConfig;\n\n constructor(config?: Partial<SemanticMatchConfig>) {\n super();\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n async match(\n request: MatchRequest,\n store: BaseCacheStore,\n similarity?: SimilarityEngine,\n options?: MatchOptions,\n ): Promise<CacheLookupResult> {\n const startTime = performance.now();\n\n // Require similarity engine for semantic matching\n if (!similarity) {\n return {\n hit: false,\n latencyMs: performance.now() - startTime,\n source: 'miss',\n };\n }\n\n // Extract user message for semantic comparison\n const userMessage = extractUserMessage(request.messages);\n\n if (!userMessage) {\n return {\n hit: false,\n latencyMs: performance.now() - startTime,\n source: 'miss',\n };\n }\n\n try {\n // Generate embedding for query\n const queryEmbedding = await similarity.embed(userMessage);\n\n // Query store for similar entries\n const threshold = options?.threshold ?? this.config.threshold ?? 0.92;\n const topK = options?.topK ?? this.config.topK ?? 5;\n\n const results = await store.query(queryEmbedding, {\n topK,\n minSimilarity: threshold,\n namespace: options?.namespace,\n });\n\n if (results.entries.length > 0) {\n // Find best match, optionally filtering by model\n let bestMatch = results.entries[0];\n\n if (this.config.matchModel) {\n const modelMatch = results.entries.find(\n (e) => e.request.model === request.model,\n );\n if (modelMatch) {\n bestMatch = modelMatch;\n }\n }\n\n if (bestMatch && bestMatch.score >= threshold) {\n return {\n hit: true,\n entry: bestMatch,\n similarity: bestMatch.score,\n latencyMs: performance.now() - startTime,\n source: 'semantic',\n };\n }\n }\n\n return {\n hit: false,\n latencyMs: performance.now() - startTime,\n source: 'miss',\n };\n } catch (error) {\n // On embedding error, return miss\n console.error('Semantic match error:', error);\n return {\n hit: false,\n latencyMs: performance.now() - startTime,\n source: 'miss',\n };\n }\n }\n}\n\n/**\n * Create a SemanticMatchStrategy instance\n */\nexport function createSemanticMatchStrategy(\n config?: Partial<SemanticMatchConfig>,\n): SemanticMatchStrategy {\n return new SemanticMatchStrategy(config);\n}\n","/**\n * HybridMatchStrategy\n *\n * Combined exact + semantic matching strategy.\n * Tries exact match first, then falls back to semantic.\n */\n\nimport { BaseMatchStrategy } from './BaseMatchStrategy.js';\nimport { ExactMatchStrategy } from './ExactMatchStrategy.js';\nimport { SemanticMatchStrategy } from './SemanticMatchStrategy.js';\nimport type {\n CacheLookupResult,\n MatchOptions,\n MatchRequest,\n MatchStrategyType,\n HybridMatchConfig,\n} from '../types/index.js';\nimport type { BaseCacheStore } from '../stores/BaseCacheStore.js';\nimport type { SimilarityEngine } from '../similarity/SimilarityEngine.js';\n\n/**\n * Default hybrid match configuration\n */\nconst DEFAULT_CONFIG: HybridMatchConfig = {\n exact: {\n normalizeWhitespace: true,\n hashFields: ['model', 'messages'],\n },\n semantic: {\n threshold: 0.92,\n matchModel: true,\n topK: 5,\n },\n};\n\n/**\n * HybridMatchStrategy\n *\n * Combines exact and semantic matching for optimal performance.\n * - First tries exact hash match (fast, free)\n * - Falls back to semantic match if no exact match found\n * - Can be configured to use semantic only for certain patterns\n *\n * @example\n * ```typescript\n * const strategy = new HybridMatchStrategy({\n * semantic: { threshold: 0.92 },\n * semanticPatterns: [/what|how|why/i]\n * });\n *\n * const result = await strategy.match(request, store, similarity);\n * console.log('Match source:', result.source); // 'exact' or 'semantic'\n * ```\n */\nexport class HybridMatchStrategy extends BaseMatchStrategy {\n readonly name: MatchStrategyType = 'hybrid';\n\n private exact: ExactMatchStrategy;\n private semantic: SemanticMatchStrategy;\n private config: HybridMatchConfig;\n\n constructor(config?: Partial<HybridMatchConfig>) {\n super();\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.exact = new ExactMatchStrategy(this.config.exact);\n this.semantic = new SemanticMatchStrategy(this.config.semantic);\n }\n\n async match(\n request: MatchRequest,\n store: BaseCacheStore,\n similarity?: SimilarityEngine,\n options?: MatchOptions,\n ): Promise<CacheLookupResult> {\n const startTime = performance.now();\n\n // Check if this request should use exact-only matching\n if (this.shouldUseExactOnly(request)) {\n const result = await this.exact.match(\n request,\n store,\n similarity,\n options,\n );\n return {\n ...result,\n latencyMs: performance.now() - startTime,\n };\n }\n\n // Try exact match first (fast)\n const exactResult = await this.exact.match(\n request,\n store,\n similarity,\n options,\n );\n\n if (exactResult.hit) {\n return {\n ...exactResult,\n latencyMs: performance.now() - startTime,\n };\n }\n\n // Check if semantic matching should be used for this request\n if (!this.shouldUseSemantic(request)) {\n return {\n hit: false,\n latencyMs: performance.now() - startTime,\n source: 'miss',\n };\n }\n\n // Fall back to semantic match\n if (similarity) {\n const semanticResult = await this.semantic.match(\n request,\n store,\n similarity,\n options,\n );\n\n return {\n ...semanticResult,\n latencyMs: performance.now() - startTime,\n };\n }\n\n return {\n hit: false,\n latencyMs: performance.now() - startTime,\n source: 'miss',\n };\n }\n\n /**\n * Check if request should use exact-only matching\n */\n private shouldUseExactOnly(request: MatchRequest): boolean {\n if (!this.config.exactOnlyPatterns) return false;\n\n const userMessage = this.extractUserMessage(request);\n return this.config.exactOnlyPatterns.some((pattern) =>\n pattern.test(userMessage),\n );\n }\n\n /**\n * Check if semantic matching should be used\n */\n private shouldUseSemantic(request: MatchRequest): boolean {\n // If no semantic patterns defined, always use semantic\n if (!this.config.semanticPatterns) return true;\n\n const userMessage = this.extractUserMessage(request);\n return this.config.semanticPatterns.some((pattern) =>\n pattern.test(userMessage),\n );\n }\n\n /**\n * Extract user message from request\n */\n private extractUserMessage(request: MatchRequest): string {\n for (let i = request.messages.length - 1; i >= 0; i--) {\n if (request.messages[i].role === 'user') {\n return request.messages[i].content;\n }\n }\n return '';\n }\n}\n\n/**\n * Create a HybridMatchStrategy instance\n */\nexport function createHybridMatchStrategy(\n config?: Partial<HybridMatchConfig>,\n): HybridMatchStrategy {\n return new HybridMatchStrategy(config);\n}\n","/**\n * SimilarityEngine\n *\n * Wraps embedding providers from @lov3kaizen/agentsea-embeddings\n * for semantic similarity computation.\n */\n\n/**\n * Embedding provider interface\n * Compatible with @lov3kaizen/agentsea-embeddings providers\n */\nexport interface EmbeddingProvider {\n embed(text: string): Promise<number[]>;\n embedBatch?(texts: string[]): Promise<number[][]>;\n readonly dimensions?: number;\n}\n\n/**\n * Similarity metric type\n */\nexport type SimilarityMetric = 'cosine' | 'euclidean' | 'dot_product';\n\n/**\n * Similarity engine configuration\n */\nexport interface SimilarityEngineConfig {\n /** Embedding provider */\n provider: EmbeddingProvider;\n /** Similarity metric to use */\n metric?: SimilarityMetric;\n /** Cache embeddings in memory */\n cacheEmbeddings?: boolean;\n /** Maximum cache size */\n maxCacheSize?: number;\n}\n\n/**\n * SimilarityEngine\n *\n * Manages embedding generation and similarity computation.\n * Wraps embedding providers from @lov3kaizen/agentsea-embeddings.\n *\n * @example\n * ```typescript\n * import { OpenAIProvider } from '@lov3kaizen/agentsea-embeddings';\n * import { SimilarityEngine } from '@lov3kaizen/agentsea-cache';\n *\n * const provider = new OpenAIProvider({\n * apiKey: process.env.OPENAI_API_KEY,\n * model: 'text-embedding-3-small'\n * });\n *\n * const engine = new SimilarityEngine({ provider });\n *\n * const embedding = await engine.embed('Hello world');\n * const similarity = engine.computeSimilarity(embedding1, embedding2);\n * ```\n */\nexport class SimilarityEngine {\n private provider: EmbeddingProvider;\n private metric: SimilarityMetric;\n private embeddingCache?: Map<string, number[]>;\n private maxCacheSize: number;\n\n constructor(config: SimilarityEngineConfig) {\n this.provider = config.provider;\n this.metric = config.metric ?? 'cosine';\n this.maxCacheSize = config.maxCacheSize ?? 10000;\n\n if (config.cacheEmbeddings) {\n this.embeddingCache = new Map();\n }\n }\n\n /**\n * Generate embedding for text\n */\n async embed(text: string): Promise<number[]> {\n // Check cache\n if (this.embeddingCache?.has(text)) {\n return this.embeddingCache.get(text)!;\n }\n\n const embedding = await this.provider.embed(text);\n\n // Cache result\n if (this.embeddingCache) {\n // Evict if at capacity\n if (this.embeddingCache.size >= this.maxCacheSize) {\n const firstKey = this.embeddingCache.keys().next().value;\n if (firstKey) {\n this.embeddingCache.delete(firstKey);\n }\n }\n this.embeddingCache.set(text, embedding);\n }\n\n return embedding;\n }\n\n /**\n * Generate embeddings for multiple texts\n */\n async embedBatch(texts: string[]): Promise<number[][]> {\n if (this.provider.embedBatch) {\n return this.provider.embedBatch(texts);\n }\n\n // Fall back to sequential embedding\n return Promise.all(texts.map((text) => this.embed(text)));\n }\n\n /**\n * Compute similarity between two vectors\n */\n computeSimilarity(a: number[], b: number[]): number {\n switch (this.metric) {\n case 'cosine':\n return this.cosineSimilarity(a, b);\n case 'euclidean': {\n // Convert distance to similarity (0-1)\n const dist = this.euclideanDistance(a, b);\n return 1 / (1 + dist);\n }\n case 'dot_product':\n return this.dotProduct(a, b);\n default:\n return this.cosineSimilarity(a, b);\n }\n }\n\n /**\n * Find most similar vectors from candidates\n */\n findMostSimilar(\n query: number[],\n candidates: Array<{ id: string; vector: number[] }>,\n minSimilarity = 0,\n ): Array<{ id: string; similarity: number }> {\n const results = candidates\n .map((c) => ({\n id: c.id,\n similarity: this.computeSimilarity(query, c.vector),\n }))\n .filter((r) => r.similarity >= minSimilarity)\n .sort((a, b) => b.similarity - a.similarity);\n\n return results;\n }\n\n /**\n * Get embedding dimensions\n */\n get dimensions(): number {\n return this.provider.dimensions ?? 0;\n }\n\n /**\n * Clear embedding cache\n */\n clearCache(): void {\n this.embeddingCache?.clear();\n }\n\n /**\n * Get cache statistics\n */\n getCacheStats(): { size: number; maxSize: number } | null {\n if (!this.embeddingCache) return null;\n return {\n size: this.embeddingCache.size,\n maxSize: this.maxCacheSize,\n };\n }\n\n private cosineSimilarity(a: number[], b: number[]): number {\n if (a.length !== b.length) return 0;\n\n let dotProduct = 0;\n let normA = 0;\n let normB = 0;\n\n for (let i = 0; i < a.length; i++) {\n dotProduct += a[i] * b[i];\n normA += a[i] * a[i];\n normB += b[i] * b[i];\n }\n\n const denominator = Math.sqrt(normA) * Math.sqrt(normB);\n if (denominator === 0) return 0;\n\n return dotProduct / denominator;\n }\n\n private euclideanDistance(a: number[], b: number[]): number {\n if (a.length !== b.length) return Infinity;\n\n let sum = 0;\n for (let i = 0; i < a.length; i++) {\n const diff = a[i] - b[i];\n sum += diff * diff;\n }\n\n return Math.sqrt(sum);\n }\n\n private dotProduct(a: number[], b: number[]): number {\n if (a.length !== b.length) return 0;\n\n let sum = 0;\n for (let i = 0; i < a.length; i++) {\n sum += a[i] * b[i];\n }\n\n return sum;\n }\n}\n\n/**\n * Create a SimilarityEngine instance\n */\nexport function createSimilarityEngine(\n config: SimilarityEngineConfig,\n): SimilarityEngine {\n return new SimilarityEngine(config);\n}\n","/**\n * ChunkBuffer\n *\n * Buffers stream chunks for efficient recording.\n */\n\nimport type { StreamChunk, ChunkBufferConfig } from '../types/index.js';\n\n/**\n * Default buffer configuration\n */\nconst DEFAULT_CONFIG: Required<ChunkBufferConfig> = {\n maxChunks: 100,\n maxBytes: 64 * 1024, // 64KB\n flushIntervalMs: 1000,\n preserveOrder: true,\n};\n\n/**\n * ChunkBuffer\n *\n * Buffers stream chunks for batch processing.\n *\n * @example\n * ```typescript\n * const buffer = new ChunkBuffer({\n * maxChunks: 50,\n * onFlush: (chunks) => console.log(`Flushed ${chunks.length} chunks`)\n * });\n *\n * buffer.add(chunk);\n * const chunks = buffer.flush();\n * ```\n */\nexport class ChunkBuffer {\n private chunks: StreamChunk[] = [];\n private currentBytes = 0;\n private config: Required<ChunkBufferConfig>;\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private onFlush?: (chunks: StreamChunk[]) => void;\n\n constructor(\n config?: ChunkBufferConfig,\n onFlush?: (chunks: StreamChunk[]) => void,\n ) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.onFlush = onFlush;\n\n if (this.config.flushIntervalMs > 0) {\n this.startFlushTimer();\n }\n }\n\n /**\n * Add a chunk to the buffer\n */\n add(chunk: StreamChunk): void {\n if (this.config.preserveOrder) {\n // Ensure chunk has correct index\n if (chunk.index === undefined) {\n chunk.index = this.chunks.length;\n }\n }\n\n this.chunks.push(chunk);\n this.currentBytes += this.estimateChunkSize(chunk);\n\n // Auto-flush if limits exceeded\n if (this.shouldFlush()) {\n this.flush();\n }\n }\n\n /**\n * Add multiple chunks\n */\n addAll(chunks: StreamChunk[]): void {\n for (const chunk of chunks) {\n this.add(chunk);\n }\n }\n\n /**\n * Flush all buffered chunks\n */\n flush(): StreamChunk[] {\n const flushed = this.chunks;\n\n // Sort by index if preserving order\n if (this.config.preserveOrder) {\n flushed.sort((a, b) => a.index - b.index);\n }\n\n // Reset buffer\n this.chunks = [];\n this.currentBytes = 0;\n\n // Callback if set\n if (this.onFlush && flushed.length > 0) {\n this.onFlush(flushed);\n }\n\n return flushed;\n }\n\n /**\n * Get current buffer size\n */\n size(): number {\n return this.chunks.length;\n }\n\n /**\n * Get current buffer bytes\n */\n bytes(): number {\n return this.currentBytes;\n }\n\n /**\n * Check if buffer is empty\n */\n isEmpty(): boolean {\n return this.chunks.length === 0;\n }\n\n /**\n * Peek at buffered chunks without flushing\n */\n peek(): readonly StreamChunk[] {\n return this.chunks;\n }\n\n /**\n * Clear the buffer without flushing\n */\n clear(): void {\n this.chunks = [];\n this.currentBytes = 0;\n }\n\n /**\n * Stop the flush timer\n */\n stop(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n }\n\n /**\n * Destroy the buffer\n */\n destroy(): void {\n this.stop();\n this.clear();\n }\n\n private shouldFlush(): boolean {\n return (\n this.chunks.length >= this.config.maxChunks ||\n this.currentBytes >= this.config.maxBytes\n );\n }\n\n private startFlushTimer(): void {\n this.flushTimer = setInterval(() => {\n if (!this.isEmpty()) {\n this.flush();\n }\n }, this.config.flushIntervalMs);\n }\n\n private estimateChunkSize(chunk: StreamChunk): number {\n let size = 0;\n if (chunk.content) {\n size += chunk.content.length * 2; // Unicode chars\n }\n if (chunk.toolCall) {\n size += JSON.stringify(chunk.toolCall).length;\n }\n if (chunk.toolResult) {\n size += JSON.stringify(chunk.toolResult).length;\n }\n if (chunk.metadata) {\n size += JSON.stringify(chunk.metadata).length;\n }\n return size + 50; // Base overhead\n }\n}\n\n/**\n * Create a ChunkBuffer instance\n */\nexport function createChunkBuffer(\n config?: ChunkBufferConfig,\n onFlush?: (chunks: StreamChunk[]) => void,\n): ChunkBuffer {\n return new ChunkBuffer(config, onFlush);\n}\n","/**\n * StreamRecorder\n *\n * Records LLM stream responses for caching.\n */\n\nimport type {\n StreamChunk,\n RecordedStream,\n StreamRecorderConfig,\n} from '../types/index.js';\nimport { ChunkBuffer } from './ChunkBuffer.js';\nimport { generateId, now } from '../core/utils.js';\n\n/**\n * Default recorder configuration\n */\nconst DEFAULT_CONFIG: Required<StreamRecorderConfig> = {\n buffer: {\n maxChunks: 100,\n maxBytes: 64 * 1024,\n flushIntervalMs: 0, // No auto-flush during recording\n preserveOrder: true,\n },\n captureToolCalls: true,\n captureMetadata: true,\n maxDurationMs: 300000, // 5 minutes\n maxChunks: 10000,\n};\n\n/**\n * StreamRecorder\n *\n * Records stream chunks for later caching and replay.\n *\n * @example\n * ```typescript\n * const recorder = new StreamRecorder({\n * captureToolCalls: true\n * });\n *\n * recorder.start('gpt-4', messages);\n *\n * for await (const chunk of stream) {\n * recorder.recordChunk({ type: 'text', content: chunk.content });\n * }\n *\n * const recorded = recorder.complete();\n * ```\n */\nexport class StreamRecorder {\n private config: Required<StreamRecorderConfig>;\n private buffer: ChunkBuffer;\n private recording = false;\n private startTime = 0;\n private model = '';\n private messages: Array<{ role: string; content: string }> = [];\n private key = '';\n private totalChars = 0;\n private chunkIndex = 0;\n private timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n constructor(config?: StreamRecorderConfig) {\n this.config = {\n ...DEFAULT_CONFIG,\n ...config,\n buffer: { ...DEFAULT_CONFIG.buffer, ...config?.buffer },\n };\n this.buffer = new ChunkBuffer(this.config.buffer);\n }\n\n /**\n * Start recording a new stream\n */\n start(\n model: string,\n messages: Array<{ role: string; content: string }>,\n key?: string,\n ): void {\n if (this.recording) {\n throw new Error('Recording already in progress');\n }\n\n this.recording = true;\n this.startTime = now();\n this.model = model;\n this.messages = messages;\n this.key = key ?? generateId();\n this.totalChars = 0;\n this.chunkIndex = 0;\n this.buffer.clear();\n\n // Set timeout for max duration\n if (this.config.maxDurationMs > 0) {\n this.timeoutId = setTimeout(() => {\n if (this.recording) {\n this.abort('Recording exceeded maximum duration');\n }\n }, this.config.maxDurationMs);\n }\n }\n\n /**\n * Record a text chunk\n */\n recordText(content: string, metadata?: Record<string, unknown>): void {\n this.recordChunk({\n type: 'text',\n content,\n metadata: this.config.captureMetadata ? metadata : undefined,\n timestamp: now(),\n index: this.chunkIndex++,\n });\n this.totalChars += content.length;\n }\n\n /**\n * Record a tool call chunk\n */\n recordToolCall(\n id: string,\n name: string,\n args: string,\n metadata?: Record<string, unknown>,\n ): void {\n if (!this.config.captureToolCalls) return;\n\n this.recordChunk({\n type: 'tool_call',\n toolCall: { id, name, arguments: args },\n metadata: this.config.captureMetadata ? metadata : undefined,\n timestamp: now(),\n index: this.chunkIndex++,\n });\n }\n\n /**\n * Record a tool result chunk\n */\n recordToolResult(\n callId: string,\n content: string,\n metadata?: Record<string, unknown>,\n ): void {\n if (!this.config.captureToolCalls) return;\n\n this.recordChunk({\n type: 'tool_result',\n toolResult: { callId, content },\n metadata: this.config.captureMetadata ? metadata : undefined,\n timestamp: now(),\n index: this.chunkIndex++,\n });\n }\n\n /**\n * Record metadata\n */\n recordMetadata(metadata: Record<string, unknown>): void {\n if (!this.config.captureMetadata) return;\n\n this.recordChunk({\n type: 'metadata',\n metadata,\n timestamp: now(),\n index: this.chunkIndex++,\n });\n }\n\n /**\n * Record a generic chunk\n */\n recordChunk(chunk: StreamChunk): void {\n if (!this.recording) {\n throw new Error('Not currently recording');\n }\n\n // Check if we've already recorded maxChunks (chunk.index is 0-based, already incremented)\n if (chunk.index >= this.config.maxChunks) {\n throw new Error('Maximum chunks exceeded');\n }\n\n this.buffer.add(chunk);\n }\n\n /**\n * Complete the recording and return the recorded stream\n */\n complete(tokenUsage?: {\n prompt: number;\n completion: number;\n total: number;\n }): RecordedStream {\n if (!this.recording) {\n throw new Error('Not currently recording');\n }\n\n this.clearTimeout();\n const endTime = now();\n const chunks = this.buffer.flush();\n\n const stream: RecordedStream = {\n id: generateId(),\n key: this.key,\n chunks,\n model: this.model,\n messages: this.messages,\n startTime: this.startTime,\n endTime,\n durationMs: endTime - this.startTime,\n totalChars: this.totalChars,\n tokenUsage,\n complete: true,\n };\n\n this.reset();\n return stream;\n }\n\n /**\n * Abort the recording\n */\n abort(reason?: string): RecordedStream {\n if (!this.recording) {\n throw new Error('Not currently recording');\n }\n\n this.clearTimeout();\n const endTime = now();\n const chunks = this.buffer.flush();\n\n const stream: RecordedStream = {\n id: generateId(),\n key: this.key,\n chunks,\n model: this.model,\n messages: this.messages,\n startTime: this.startTime,\n endTime,\n durationMs: endTime - this.startTime,\n totalChars: this.totalChars,\n complete: false,\n error: reason ?? 'Recording aborted',\n };\n\n this.reset();\n return stream;\n }\n\n /**\n * Check if currently recording\n */\n isRecording(): boolean {\n return this.recording;\n }\n\n /**\n * Get current chunk count\n */\n getChunkCount(): number {\n return this.chunkIndex;\n }\n\n /**\n * Get current recording duration in ms\n */\n getDuration(): number {\n if (!this.recording) return 0;\n return now() - this.startTime;\n }\n\n /**\n * Destroy the recorder\n */\n destroy(): void {\n this.clearTimeout();\n this.buffer.destroy();\n this.reset();\n }\n\n private reset(): void {\n this.recording = false;\n this.startTime = 0;\n this.model = '';\n this.messages = [];\n this.key = '';\n this.totalChars = 0;\n this.chunkIndex = 0;\n }\n\n private clearTimeout(): void {\n if (this.timeoutId) {\n clearTimeout(this.timeoutId);\n this.timeoutId = null;\n }\n }\n}\n\n/**\n * Create a StreamRecorder instance\n */\nexport function createStreamRecorder(\n config?: StreamRecorderConfig,\n): StreamRecorder {\n return new StreamRecorder(config);\n}\n","/**\n * StreamReplayer\n *\n * Replays cached stream responses.\n */\n\nimport type {\n StreamChunk,\n RecordedStream,\n StreamReplayerConfig,\n} from '../types/index.js';\n\n/**\n * Default replayer configuration\n */\nconst DEFAULT_CONFIG: Required<StreamReplayerConfig> = {\n speedMultiplier: 1,\n minDelayMs: 0,\n maxDelayMs: 100,\n simulateTiming: false,\n onChunk: () => {},\n onComplete: () => {},\n onError: () => {},\n};\n\n/**\n * StreamReplayer\n *\n * Replays recorded streams as async iterables.\n *\n * @example\n * ```typescript\n * const replayer = new StreamReplayer({\n * speedMultiplier: 2, // 2x speed\n * simulateTiming: true\n * });\n *\n * for await (const chunk of replayer.replay(recordedStream)) {\n * process.stdout.write(chunk.content ?? '');\n * }\n * ```\n */\nexport class StreamReplayer {\n private config: Required<StreamReplayerConfig>;\n private abortController: AbortController | null = null;\n\n constructor(config?: StreamReplayerConfig) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Replay a recorded stream as an async iterable\n */\n async *replay(stream: RecordedStream): AsyncGenerator<StreamChunk> {\n this.abortController = new AbortController();\n const signal = this.abortController.signal;\n\n try {\n const chunks = [...stream.chunks].sort((a, b) => a.index - b.index);\n let lastTimestamp = chunks[0]?.timestamp ?? 0;\n\n for (let i = 0; i < chunks.length; i++) {\n if (signal.aborted) {\n break;\n }\n\n const chunk = chunks[i];\n\n // Simulate timing if enabled\n if (this.config.simulateTiming && i > 0) {\n const timeDiff = chunk.timestamp - lastTimestamp;\n const delay = Math.min(\n Math.max(\n timeDiff / this.config.speedMultiplier,\n this.config.minDelayMs,\n ),\n this.config.maxDelayMs,\n );\n\n if (delay > 0) {\n await this.delay(delay, signal);\n }\n }\n\n lastTimestamp = chunk.timestamp;\n this.config.onChunk(chunk);\n yield chunk;\n }\n\n this.config.onComplete(stream);\n } catch (error) {\n if ((error as Error).name !== 'AbortError') {\n this.config.onError(error as Error);\n throw error;\n }\n } finally {\n this.abortController = null;\n }\n }\n\n /**\n * Replay as a full async iterable of text content only\n */\n async *replayText(stream: RecordedStream): AsyncGenerator<string> {\n for await (const chunk of this.replay(stream)) {\n if (chunk.type === 'text' && chunk.content) {\n yield chunk.content;\n }\n }\n }\n\n /**\n * Replay synchronously (no timing simulation)\n */\n *replaySync(stream: RecordedStream): Generator<StreamChunk> {\n const chunks = [...stream.chunks].sort((a, b) => a.index - b.index);\n for (const chunk of chunks) {\n this.config.onChunk(chunk);\n yield chunk;\n }\n this.config.onComplete(stream);\n }\n\n /**\n * Get all chunks at once\n */\n getAllChunks(stream: RecordedStream): StreamChunk[] {\n return [...stream.chunks].sort((a, b) => a.index - b.index);\n }\n\n /**\n * Get full text content from stream\n */\n getFullText(stream: RecordedStream): string {\n return stream.chunks\n .filter((c) => c.type === 'text' && c.content)\n .sort((a, b) => a.index - b.index)\n .map((c) => c.content)\n .join('');\n }\n\n /**\n * Get tool calls from stream\n */\n getToolCalls(\n stream: RecordedStream,\n ): Array<{ id: string; name: string; arguments: string }> {\n return stream.chunks\n .filter((c) => c.type === 'tool_call' && c.toolCall)\n .sort((a, b) => a.index - b.index)\n .map((c) => c.toolCall!);\n }\n\n /**\n * Stop current replay\n */\n stop(): void {\n if (this.abortController) {\n this.abortController.abort();\n }\n }\n\n /**\n * Update configuration\n */\n configure(config: Partial<StreamReplayerConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n private delay(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n const timeoutId = setTimeout(resolve, ms);\n\n signal.addEventListener('abort', () => {\n clearTimeout(timeoutId);\n reject(new DOMException('Aborted', 'AbortError'));\n });\n });\n }\n}\n\n/**\n * Create a StreamReplayer instance\n */\nexport function createStreamReplayer(\n config?: StreamReplayerConfig,\n): StreamReplayer {\n return new StreamReplayer(config);\n}\n","/**\n * StreamCache\n *\n * Main streaming cache class for caching and replaying LLM streams.\n */\n\nimport EventEmitter from 'eventemitter3';\nimport type {\n CacheMessage,\n RecordedStream,\n StreamCacheConfig,\n StreamCacheLookupResult,\n StreamCacheStats,\n StreamChunk,\n} from '../types/index.js';\nimport type { BaseCacheStore } from '../stores/BaseCacheStore.js';\nimport type { SimilarityEngine } from '../similarity/SimilarityEngine.js';\nimport { StreamRecorder } from './StreamRecorder.js';\nimport { StreamReplayer } from './StreamReplayer.js';\nimport { generateCacheKey } from '../core/CacheKey.js';\nimport { generateId, now } from '../core/utils.js';\n\n/**\n * StreamCache events\n */\nexport interface StreamCacheEvents {\n hit: (result: StreamCacheLookupResult) => void;\n miss: (key: string) => void;\n record: (stream: RecordedStream) => void;\n error: (error: Error) => void;\n}\n\n/**\n * Default configuration\n */\nconst DEFAULT_CONFIG: Required<StreamCacheConfig> = {\n recorder: {},\n replayer: {},\n cacheIncomplete: false,\n minLengthToCache: 10,\n streamTtl: 3600, // 1 hour\n};\n\n/**\n * StreamCache\n *\n * Cache for LLM streaming responses.\n *\n * @example\n * ```typescript\n * const streamCache = new StreamCache({\n * store,\n * minLengthToCache: 50\n * });\n *\n * // Wrap a streaming call\n * const stream = streamCache.wrapStream({\n * model: 'gpt-4',\n * messages: [{ role: 'user', content: 'Hello' }],\n * stream: true\n * }, async function* () {\n * // Your streaming LLM call\n * for await (const chunk of llm.stream(request)) {\n * yield chunk;\n * }\n * });\n * ```\n */\nexport class StreamCache extends EventEmitter<StreamCacheEvents> {\n private store: BaseCacheStore;\n private similarity?: SimilarityEngine;\n private config: Required<StreamCacheConfig>;\n private recorder: StreamRecorder;\n private replayer: StreamReplayer;\n private stats: StreamCacheStats = {\n totalLookups: 0,\n totalHits: 0,\n totalMisses: 0,\n hitRate: 0,\n avgReplayLatencyMs: 0,\n totalStreamsCached: 0,\n totalBytesCached: 0,\n avgStreamDurationMs: 0,\n };\n private replayLatencies: number[] = [];\n private streamDurations: number[] = [];\n\n constructor(\n store: BaseCacheStore,\n config?: StreamCacheConfig,\n similarity?: SimilarityEngine,\n ) {\n super();\n this.store = store;\n this.similarity = similarity;\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.recorder = new StreamRecorder(this.config.recorder);\n this.replayer = new StreamReplayer(this.config.replayer);\n }\n\n /**\n * Look up a cached stream\n */\n async lookup(\n model: string,\n messages: CacheMessage[],\n ): Promise<StreamCacheLookupResult> {\n const startTime = performance.now();\n this.stats.totalLookups++;\n\n const key = this.generateStreamKey(model, messages);\n\n try {\n // Try exact match first\n const entry = await this.store.get(key);\n\n if (entry) {\n const stream = this.deserializeStream(entry.response.content);\n if (stream) {\n this.stats.totalHits++;\n this.updateHitRate();\n const latencyMs = performance.now() - startTime;\n this.replayLatencies.push(latencyMs);\n\n const result: StreamCacheLookupResult = {\n hit: true,\n stream,\n similarity: 1.0,\n source: 'exact',\n latencyMs,\n };\n\n this.emit('hit', result);\n return result;\n }\n }\n\n // Try semantic match if similarity engine is available\n if (this.similarity) {\n const userMessage = messages.find((m) => m.role === 'user')?.content;\n if (userMessage) {\n const embedding = await this.similarity.embed(userMessage);\n const results = await this.store.query(embedding, {\n topK: 1,\n minSimilarity: 0.92,\n });\n\n if (results.entries.length > 0) {\n const entry = results.entries[0];\n const stream = this.deserializeStream(entry.response.content);\n if (stream && entry.score >= 0.92) {\n this.stats.totalHits++;\n this.updateHitRate();\n const latencyMs = performance.now() - startTime;\n this.replayLatencies.push(latencyMs);\n\n const result: StreamCacheLookupResult = {\n hit: true,\n stream,\n similarity: entry.score,\n source: 'semantic',\n latencyMs,\n };\n\n this.emit('hit', result);\n return result;\n }\n }\n }\n }\n\n // Cache miss\n this.stats.totalMisses++;\n this.updateHitRate();\n const latencyMs = performance.now() - startTime;\n\n this.emit('miss', key);\n return {\n hit: false,\n source: 'miss',\n latencyMs,\n };\n } catch (error) {\n this.emit('error', error as Error);\n return {\n hit: false,\n source: 'miss',\n latencyMs: performance.now() - startTime,\n };\n }\n }\n\n /**\n * Cache a recorded stream\n */\n async cache(stream: RecordedStream, embedding?: number[]): Promise<void> {\n // Don't cache incomplete streams unless configured\n if (!stream.complete && !this.config.cacheIncomplete) {\n return;\n }\n\n // Don't cache streams that are too short\n if (stream.totalChars < this.config.minLengthToCache) {\n return;\n }\n\n const key = this.generateStreamKey(stream.model, stream.messages);\n\n try {\n // Convert messages to CacheMessage format\n const cacheMessages: CacheMessage[] = stream.messages.map((m) => ({\n role: m.role as 'system' | 'user' | 'assistant' | 'tool',\n content: m.content,\n }));\n\n await this.store.set(key, {\n id: generateId(),\n key,\n request: {\n messages: cacheMessages,\n model: stream.model,\n },\n response: {\n content: this.serializeStream(stream),\n model: stream.model,\n finishReason: stream.complete ? 'stop' : 'error',\n usage: {\n promptTokens: stream.tokenUsage?.prompt ?? 0,\n completionTokens: stream.tokenUsage?.completion ?? 0,\n totalTokens: stream.tokenUsage?.total ?? 0,\n },\n },\n embedding,\n metadata: {\n createdAt: now(),\n accessedAt: now(),\n accessCount: 1,\n hitCount: 0,\n ttl: this.config.streamTtl,\n },\n });\n\n this.stats.totalStreamsCached++;\n this.stats.totalBytesCached += this.estimateStreamSize(stream);\n this.streamDurations.push(stream.durationMs);\n this.updateAvgStreamDuration();\n\n this.emit('record', stream);\n } catch (error) {\n this.emit('error', error as Error);\n }\n }\n\n /**\n * Wrap a streaming function with caching\n */\n async *wrapStream<T extends { content?: string }>(\n model: string,\n messages: CacheMessage[],\n streamFn: () => AsyncGenerator<T>,\n options?: { embedding?: number[] },\n ): AsyncGenerator<T> {\n // Check cache first\n const lookupResult = await this.lookup(model, messages);\n\n if (lookupResult.hit && lookupResult.stream) {\n // Replay from cache\n for await (const chunk of this.replayer.replay(lookupResult.stream)) {\n yield { content: chunk.content } as T;\n }\n return;\n }\n\n // Record new stream\n const key = this.generateStreamKey(model, messages);\n this.recorder.start(model, messages, key);\n\n try {\n for await (const chunk of streamFn()) {\n if (chunk.content) {\n this.recorder.recordText(chunk.content);\n }\n yield chunk;\n }\n\n // Complete recording and cache\n const stream = this.recorder.complete();\n await this.cache(stream, options?.embedding);\n } catch (error) {\n // Abort recording on error\n if (this.recorder.isRecording()) {\n this.recorder.abort((error as Error).message);\n }\n throw error;\n }\n }\n\n /**\n * Replay a cached stream\n */\n async *replay(stream: RecordedStream): AsyncGenerator<StreamChunk> {\n for await (const chunk of this.replayer.replay(stream)) {\n yield chunk;\n }\n }\n\n /**\n * Get cache statistics\n */\n getStats(): StreamCacheStats {\n return { ...this.stats };\n }\n\n /**\n * Clear the stream cache\n */\n async clear(): Promise<void> {\n await this.store.clear();\n this.stats = {\n totalLookups: 0,\n totalHits: 0,\n totalMisses: 0,\n hitRate: 0,\n avgReplayLatencyMs: 0,\n totalStreamsCached: 0,\n totalBytesCached: 0,\n avgStreamDurationMs: 0,\n };\n this.replayLatencies = [];\n this.streamDurations = [];\n }\n\n /**\n * Destroy the stream cache\n */\n destroy(): void {\n this.recorder.destroy();\n this.replayer.stop();\n this.removeAllListeners();\n }\n\n private generateStreamKey(\n model: string,\n messages: Array<{ role: string; content: string }>,\n ): string {\n // Convert to CacheMessage format for key generation\n const cacheMessages: CacheMessage[] = messages.map((m) => ({\n role: m.role as 'system' | 'user' | 'assistant' | 'tool',\n content: m.content,\n }));\n return generateCacheKey(model, cacheMessages);\n }\n\n private serializeStream(stream: RecordedStream): string {\n return JSON.stringify(stream);\n }\n\n private deserializeStream(content: string): RecordedStream | null {\n try {\n return JSON.parse(content) as RecordedStream;\n } catch {\n return null;\n }\n }\n\n private estimateStreamSize(stream: RecordedStream): number {\n return JSON.stringify(stream).length;\n }\n\n private updateHitRate(): void {\n if (this.stats.totalLookups > 0) {\n this.stats.hitRate =\n (this.stats.totalHits / this.stats.totalLookups) * 100;\n }\n }\n\n private updateAvgStreamDuration(): void {\n if (this.streamDurations.length > 0) {\n this.stats.avgStreamDurationMs =\n this.streamDurations.reduce((a, b) => a + b, 0) /\n this.streamDurations.length;\n }\n }\n}\n\n/**\n * Create a StreamCache instance\n */\nexport function createStreamCache(\n store: BaseCacheStore,\n config?: StreamCacheConfig,\n similarity?: SimilarityEngine,\n): StreamCache {\n return new StreamCache(store, config, similarity);\n}\n","/**\n * InvalidationManager\n *\n * Manages cache invalidation strategies.\n */\n\nimport EventEmitter from 'eventemitter3';\nimport type {\n InvalidationManagerConfig,\n InvalidationEvent,\n InvalidationResult,\n InvalidationStats,\n} from '../types/index.js';\nimport type { BaseCacheStore } from '../stores/BaseCacheStore.js';\nimport { now } from '../core/utils.js';\n\n/**\n * InvalidationManager events\n */\nexport interface InvalidationManagerEvents {\n invalidate: (event: InvalidationEvent) => void;\n error: (error: Error) => void;\n}\n\n/**\n * Default configuration\n */\nconst DEFAULT_CONFIG: InvalidationManagerConfig = {\n strategy: 'ttl',\n ttl: {\n defaultTtl: 3600,\n softTtl: false,\n },\n emitEvents: true,\n};\n\n/**\n * InvalidationManager\n *\n * Manages cache invalidation across different strategies.\n *\n * @example\n * ```typescript\n * const invalidation = new InvalidationManager(store, {\n * strategy: 'ttl',\n * ttl: { defaultTtl: 3600 }\n * });\n *\n * // Run invalidation\n * const result = await invalidation.run();\n *\n * // Or start automatic invalidation\n * invalidation.startAuto(60000); // Run every minute\n * ```\n */\nexport class InvalidationManager extends EventEmitter<InvalidationManagerEvents> {\n private store: BaseCacheStore;\n private config: InvalidationManagerConfig;\n private autoInterval: ReturnType<typeof setInterval> | null = null;\n private stats: InvalidationStats = {\n totalInvalidations: 0,\n ttlRemovals: 0,\n lruRemovals: 0,\n eventRemovals: 0,\n smartRemovals: 0,\n manualRemovals: 0,\n totalBytesFreed: 0,\n };\n private accessTimes: Map<string, number> = new Map();\n\n constructor(store: BaseCacheStore, config?: InvalidationManagerConfig) {\n super();\n this.store = store;\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Run invalidation based on configured strategy\n */\n async run(): Promise<InvalidationResult> {\n switch (this.config.strategy) {\n case 'ttl':\n return this.runTTLInvalidation();\n case 'lru':\n return this.runLRUInvalidation();\n case 'smart':\n return this.runSmartInvalidation();\n default:\n return this.runTTLInvalidation();\n }\n }\n\n /**\n * Run TTL-based invalidation\n */\n async runTTLInvalidation(): Promise<InvalidationResult> {\n const startTime = performance.now();\n const invalidatedKeys: string[] = [];\n let bytesFreed = 0;\n const currentTime = now();\n\n const keys = await this.store.keys();\n\n for (const key of keys) {\n const entry = await this.store.get(key);\n if (!entry) continue;\n\n // Use entry's TTL if set, otherwise fall back to config-based TTL\n const ttl =\n entry.metadata.ttl ??\n this.getTTL(entry.request.model, entry.metadata.namespace);\n const age = (currentTime - entry.metadata.createdAt) / 1000; // Convert to seconds\n\n if (age >= ttl) {\n // Check soft TTL grace period\n if (this.config.ttl?.softTtl && this.config.ttl?.gracePeriod) {\n if (age < ttl + this.config.ttl.gracePeriod) {\n // In grace period, skip\n continue;\n }\n }\n\n const deleted = await this.store.delete(key);\n if (deleted) {\n invalidatedKeys.push(key);\n bytesFreed += this.estimateEntrySize(entry);\n }\n }\n }\n\n this.stats.totalInvalidations++;\n this.stats.ttlRemovals += invalidatedKeys.length;\n this.stats.totalBytesFreed += bytesFreed;\n this.stats.lastInvalidationAt = now();\n\n const result: InvalidationResult = {\n invalidatedKeys,\n entriesRemoved: invalidatedKeys.length,\n bytesFreed,\n durationMs: performance.now() - startTime,\n };\n\n this.emitEvent('ttl', invalidatedKeys, bytesFreed);\n return result;\n }\n\n /**\n * Run LRU-based invalidation\n */\n async runLRUInvalidation(): Promise<InvalidationResult> {\n const startTime = performance.now();\n const invalidatedKeys: string[] = [];\n let bytesFreed = 0;\n\n const maxEntries = this.config.lru?.maxEntries ?? 1000;\n const _maxSizeBytes = this.config.lru?.maxSizeBytes ?? Infinity;\n const batchSize = this.config.lru?.evictionBatchSize ?? 10;\n const minAge = this.config.lru?.minAge ?? 0;\n\n const currentSize = await this.store.size();\n if (currentSize <= maxEntries) {\n return {\n invalidatedKeys: [],\n entriesRemoved: 0,\n bytesFreed: 0,\n durationMs: performance.now() - startTime,\n };\n }\n\n // Get all entries and sort by last access time\n const keys = await this.store.keys();\n const entriesWithAccess: Array<{\n key: string;\n accessedAt: number;\n size: number;\n }> = [];\n\n for (const key of keys) {\n const entry = await this.store.get(key);\n if (entry) {\n entriesWithAccess.push({\n key,\n accessedAt: entry.metadata.accessedAt,\n size: this.estimateEntrySize(entry),\n });\n }\n }\n\n // Sort by least recently accessed\n entriesWithAccess.sort((a, b) => a.accessedAt - b.accessedAt);\n\n // Remove until under limit\n const toRemove = Math.min(currentSize - maxEntries, batchSize);\n const currentTime = now();\n\n for (let i = 0; i < toRemove && i < entriesWithAccess.length; i++) {\n const { key, accessedAt, size } = entriesWithAccess[i];\n\n // Check minimum age\n const age = (currentTime - accessedAt) / 1000;\n if (age < minAge) continue;\n\n const deleted = await this.store.delete(key);\n if (deleted) {\n invalidatedKeys.push(key);\n bytesFreed += size;\n }\n }\n\n this.stats.totalInvalidations++;\n this.stats.lruRemovals += invalidatedKeys.length;\n this.stats.totalBytesFreed += bytesFreed;\n this.stats.lastInvalidationAt = now();\n\n const result: InvalidationResult = {\n invalidatedKeys,\n entriesRemoved: invalidatedKeys.length,\n bytesFreed,\n durationMs: performance.now() - startTime,\n };\n\n this.emitEvent('lru', invalidatedKeys, bytesFreed);\n return result;\n }\n\n /**\n * Run smart invalidation (combines TTL + LRU + hit rate analysis)\n */\n async runSmartInvalidation(): Promise<InvalidationResult> {\n const startTime = performance.now();\n const invalidatedKeys: string[] = [];\n let bytesFreed = 0;\n\n const minHitRate = this.config.smart?.minHitRate ?? 0.1;\n const currentTime = now();\n\n const keys = await this.store.keys();\n\n for (const key of keys) {\n const entry = await this.store.get(key);\n if (!entry) continue;\n\n let shouldInvalidate = false;\n\n // Check TTL\n // Use entry's TTL if set, otherwise fall back to config-based TTL\n const ttl =\n entry.metadata.ttl ??\n this.getTTL(entry.request.model, entry.metadata.namespace);\n const age = (currentTime - entry.metadata.createdAt) / 1000;\n if (age >= ttl) {\n shouldInvalidate = true;\n }\n\n // Check hit rate\n if (this.config.smart?.analyzeHitRate && entry.metadata.accessCount > 0) {\n const accessRate = entry.metadata.accessCount / Math.max(age / 3600, 1); // Per hour\n if (accessRate < minHitRate) {\n shouldInvalidate = true;\n }\n }\n\n if (shouldInvalidate) {\n const deleted = await this.store.delete(key);\n if (deleted) {\n invalidatedKeys.push(key);\n bytesFreed += this.estimateEntrySize(entry);\n }\n }\n }\n\n this.stats.totalInvalidations++;\n this.stats.smartRemovals += invalidatedKeys.length;\n this.stats.totalBytesFreed += bytesFreed;\n this.stats.lastInvalidationAt = now();\n\n const result: InvalidationResult = {\n invalidatedKeys,\n entriesRemoved: invalidatedKeys.length,\n bytesFreed,\n durationMs: performance.now() - startTime,\n };\n\n this.emitEvent('smart', invalidatedKeys, bytesFreed);\n return result;\n }\n\n /**\n * Manually invalidate specific keys\n */\n async invalidateKeys(keys: string[]): Promise<InvalidationResult> {\n const startTime = performance.now();\n const invalidatedKeys: string[] = [];\n let bytesFreed = 0;\n\n for (const key of keys) {\n const entry = await this.store.get(key);\n if (entry) {\n const size = this.estimateEntrySize(entry);\n const deleted = await this.store.delete(key);\n if (deleted) {\n invalidatedKeys.push(key);\n bytesFreed += size;\n }\n }\n }\n\n this.stats.totalInvalidations++;\n this.stats.manualRemovals += invalidatedKeys.length;\n this.stats.totalBytesFreed += bytesFreed;\n this.stats.lastInvalidationAt = now();\n\n const result: InvalidationResult = {\n invalidatedKeys,\n entriesRemoved: invalidatedKeys.length,\n bytesFreed,\n durationMs: performance.now() - startTime,\n };\n\n this.emitEvent('manual', invalidatedKeys, bytesFreed);\n return result;\n }\n\n /**\n * Invalidate by pattern (e.g., namespace or model)\n */\n async invalidateByPattern(options: {\n namespace?: string;\n model?: string;\n olderThan?: number;\n }): Promise<InvalidationResult> {\n const startTime = performance.now();\n const invalidatedKeys: string[] = [];\n let bytesFreed = 0;\n const currentTime = now();\n\n const keys = await this.store.keys();\n\n for (const key of keys) {\n const entry = await this.store.get(key);\n if (!entry) continue;\n\n let matches = true;\n\n if (options.namespace && entry.metadata.namespace !== options.namespace) {\n matches = false;\n }\n\n if (options.model && entry.request.model !== options.model) {\n matches = false;\n }\n\n if (options.olderThan) {\n const age = (currentTime - entry.metadata.createdAt) / 1000;\n if (age < options.olderThan) {\n matches = false;\n }\n }\n\n if (matches) {\n const size = this.estimateEntrySize(entry);\n const deleted = await this.store.delete(key);\n if (deleted) {\n invalidatedKeys.push(key);\n bytesFreed += size;\n }\n }\n }\n\n this.stats.totalInvalidations++;\n this.stats.manualRemovals += invalidatedKeys.length;\n this.stats.totalBytesFreed += bytesFreed;\n this.stats.lastInvalidationAt = now();\n\n const result: InvalidationResult = {\n invalidatedKeys,\n entriesRemoved: invalidatedKeys.length,\n bytesFreed,\n durationMs: performance.now() - startTime,\n };\n\n this.emitEvent('manual', invalidatedKeys, bytesFreed);\n return result;\n }\n\n /**\n * Start automatic invalidation\n */\n startAuto(intervalMs = 60000): void {\n if (this.autoInterval) {\n this.stopAuto();\n }\n\n this.autoInterval = setInterval(() => {\n void (async () => {\n try {\n await this.run();\n } catch (error) {\n this.emit('error', error as Error);\n }\n })();\n }, intervalMs);\n }\n\n /**\n * Stop automatic invalidation\n */\n stopAuto(): void {\n if (this.autoInterval) {\n clearInterval(this.autoInterval);\n this.autoInterval = null;\n }\n }\n\n /**\n * Get invalidation statistics\n */\n getStats(): InvalidationStats {\n return { ...this.stats };\n }\n\n /**\n * Reset statistics\n */\n resetStats(): void {\n this.stats = {\n totalInvalidations: 0,\n ttlRemovals: 0,\n lruRemovals: 0,\n eventRemovals: 0,\n smartRemovals: 0,\n manualRemovals: 0,\n totalBytesFreed: 0,\n };\n }\n\n /**\n * Destroy the manager\n */\n destroy(): void {\n this.stopAuto();\n this.removeAllListeners();\n this.accessTimes.clear();\n }\n\n private getTTL(model: string, namespace?: string): number {\n // Check model-specific TTL\n if (this.config.ttl?.modelTtls?.[model]) {\n return this.config.ttl.modelTtls[model];\n }\n\n // Check namespace-specific TTL\n if (namespace && this.config.ttl?.namespaceTtls?.[namespace]) {\n return this.config.ttl.namespaceTtls[namespace];\n }\n\n // Return default TTL\n return this.config.ttl?.defaultTtl ?? 3600;\n }\n\n private estimateEntrySize(entry: { response: { content: string } }): number {\n return entry.response.content.length * 2 + 200; // Rough estimate\n }\n\n private emitEvent(\n reason: 'ttl' | 'lru' | 'event' | 'smart' | 'manual',\n keys: string[],\n bytesFreed: number,\n ): void {\n if (this.config.emitEvents && keys.length > 0) {\n const event: InvalidationEvent = {\n timestamp: now(),\n keys,\n reason,\n entriesRemoved: keys.length,\n bytesFreed,\n };\n this.emit('invalidate', event);\n this.config.onInvalidate?.(event);\n }\n }\n}\n\n/**\n * Create an InvalidationManager instance\n */\nexport function createInvalidationManager(\n store: BaseCacheStore,\n config?: InvalidationManagerConfig,\n): InvalidationManager {\n return new InvalidationManager(store, config);\n}\n"]}
|