@db-bridge/core 1.0.0 → 1.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types/strict-types.ts","../src/types/index.ts","../src/constants.ts","../src/errors/index.ts","../src/utils/retry.ts","../src/utils/validation.ts","../src/utils/cache-key.ts","../src/utils/uuid.ts","../src/utils/compression.ts","../src/base-adapter.ts","../src/query-builder/date-filter-trait.ts","../src/base-query-builder.ts","../src/query-builder/query-builder-types.ts","../src/query-builder/aggregate-trait.ts","../src/query-builder/pagination-trait.ts","../src/query-builder/encryption-trait.ts","../src/health/health-checker.ts","../src/health/metrics-collector.ts","../src/migrations/migration-runner.ts","../src/monitoring/performance-monitor.ts","../src/monitoring/traits/trace-base-trait.ts","../src/monitoring/traits/trace-management-trait.ts","../src/monitoring/traits/query-analysis-trait.ts","../src/monitoring/traits/performance-analysis-trait.ts","../src/monitoring/traits/adapter-wrapper-trait.ts","../src/monitoring/modular-performance-monitor.ts","../src/cache/cache-key-generator.ts","../src/cache/cache-manager.ts","../src/cache/cache-strategy.ts","../src/cache/cache-api.ts","../src/cache/traits/cache-base-trait.ts","../src/cache/traits/cache-operations-trait.ts","../src/cache/traits/cache-invalidation-trait.ts","../src/cache/traits/cache-maintenance-trait.ts","../src/cache/modular-cache-manager.ts","../src/cache/cached-adapter.ts","../src/crypto/crypto.ts","../src/dialect/sql-dialect.ts","../src/dialect/mysql-dialect.ts","../src/dialect/postgresql-dialect.ts","../src/dialect/dialect-factory.ts","../src/query/query-context.ts","../src/query/where-builder.ts","../src/query/select-builder.ts","../src/query/insert-builder.ts","../src/query/update-builder.ts","../src/query/delete-builder.ts","../src/query/query-factory.ts","../src/transaction/base-transaction.ts","../src/middleware/middleware-chain.ts","../src/middleware/cache-middleware.ts","../src/middleware/retry-middleware.ts","../src/middleware/timeout-middleware.ts","../src/middleware/logging-middleware.ts","../src/client.ts","../src/db-bridge.ts","../src/db-bridge-cached.ts","../src/db-bridge-factory.ts"],"names":["IsolationLevel","sql","max","zlibConstants","cacheKey","min","count","EventEmitter","cacheHits","sum","crypto","id","createHash","duration","strategy","generateCacheKey","sleep","DBBridge"],"mappings":";;;;;;;;;;;;AAyBO,SAAS,GAAA,CAAI,YAAkC,OAAA,EAA6B;AAGjF,EAAA,OAAO,OAAA,CAAQ,KAAK,GAAG,CAAA;AACzB;AAoSO,SAAS,eAAkB,MAAA,EAAyD;AACzF,EAAA,OAAO,OAAO,OAAA,KAAY,QAAA;AAC5B;AAKO,SAAS,eAAe,MAAA,EAAmD;AAChF,EAAA,OAAO,OAAO,OAAA,KAAY,QAAA;AAC5B;AAKO,SAAS,eAAe,MAAA,EAAmD;AAChF,EAAA,OAAO,OAAO,OAAA,KAAY,QAAA;AAC5B;AAKO,SAAS,eAAe,MAAA,EAAmD;AAChF,EAAA,OAAO,OAAO,OAAA,KAAY,QAAA;AAC5B;AAOO,IAAM,mBAAA,GAAwC;AAAA,EACnD,GAAA,EAAK,CAAA;AAAA,EACL,GAAA,EAAK,EAAA;AAAA,EACL,cAAA,EAAgB,GAAA;AAAA,EAChB,WAAA,EAAa,GAAA;AAAA,EACb,gBAAA,EAAkB;AACpB;AAKO,IAAM,gBAAA,GAAmB;AAAA,EAC9B,UAAA,EAAY,GAAA;AAAA,EACZ,KAAA,EAAO,GAAA;AAAA,EACP,WAAA,EAAa;AACf;AAKO,IAAM,gBAAA,GAAmB;AAAA,EAC9B,gBAAA,EAAkB,kBAAA;AAAA,EAClB,cAAA,EAAgB,gBAAA;AAAA,EAChB,eAAA,EAAiB,iBAAA;AAAA,EACjB,YAAA,EAAc;AAChB;;;ACxPO,IAAK,cAAA,qBAAAA,eAAAA,KAAL;AACL,EAAAA,gBAAA,kBAAA,CAAA,GAAmB,kBAAA;AACnB,EAAAA,gBAAA,gBAAA,CAAA,GAAiB,gBAAA;AACjB,EAAAA,gBAAA,iBAAA,CAAA,GAAkB,iBAAA;AAClB,EAAAA,gBAAA,cAAA,CAAA,GAAe,cAAA;AAJL,EAAA,OAAAA,eAAAA;AAAA,CAAA,EAAA,cAAA,IAAA,EAAA;;;ACvHL,IAAM,mBAAA,GAAsB;AAAA;AAAA,EAEjC,UAAA,EAAY,IAAA;AAAA;AAAA,EAEZ,eAAA,EAAiB,IAAA;AAAA;AAAA,EAEjB,UAAA,EAAY,IAAA;AAAA;AAAA,EAEZ,YAAA,EAAc,KAAA;AAAA;AAAA,EAEd,kBAAA,EAAoB,GAAA;AAAA;AAAA,EAEpB,YAAA,EAAc,GAAA;AAAA;AAAA,EAEd,QAAA,EAAU,KAAA;AAAA;AAAA,EAEV,QAAA,EAAU;AACZ;AAQO,IAAM,oBAAA,GAAuB;AAAA;AAAA,EAElC,eAAA,EAAiB,CAAA;AAAA;AAAA,EAEjB,eAAA,EAAiB,EAAA;AAAA;AAAA,EAEjB,eAAA,EAAiB,GAAA;AAAA;AAAA,EAEjB,YAAA,EAAc,GAAA;AAAA;AAAA,EAEd,YAAA,EAAc,IAAA;AAAA;AAAA,EAEd,WAAA,EAAa;AACf;AAcO,IAAM,aAAA,GAAgB;AAAA;AAAA,EAE3B,GAAA,EAAK,CAAA;AAAA;AAAA,EAEL,GAAA,EAAK,EAAA;AAAA;AAAA,EAEL,cAAA,EAAgB,GAAA;AAAA;AAAA,EAEhB,WAAA,EAAa,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKb,UAAA,EAAY,GAAA;AAAA;AAAA,EAEZ,YAAA,EAAc;AAChB;AAIO,IAAM,cAAA,GAAiB;AAAA;AAAA,EAE5B,OAAA,EAAS,GAAA;AAAA;AAAA,EAET,mBAAA,EAAqB,GAAA;AAAA;AAAA,EAErB,oBAAA,EAAsB,GAAA;AAAA;AAAA,EAEtB,UAAA,EAAY,GAAA;AAAA;AAAA,EAEZ,yBAAA,EAA2B,GAAA;AAAA;AAAA,EAE3B,0BAAA,EAA4B;AAC9B;AAIO,IAAM,cAAA,GAAiB;AAAA;AAAA,EAE5B,WAAA,EAAa,IAAA;AAAA;AAAA,EAEb,MAAA,EAAQ,IAAA;AAAA;AAAA,EAER,iBAAA,EAAmB,EAAA;AAAA;AAAA,EAEnB,gBAAA,EAAkB,GAAA;AAAA;AAAA,EAElB,gBAAgB,IAAA,GAAO,IAAA;AAAA;AAAA,EAEvB,qBAAA,EAAuB,IAAA;AAAA;AAAA,EAEvB,aAAA,EAAe;AACjB;AAIO,IAAM,cAAA,GAAiB;AAAA;AAAA,EAE5B,WAAA,EAAa,CAAA;AAAA;AAAA,EAEb,UAAA,EAAY,GAAA;AAAA;AAAA,EAEZ,SAAA,EAAW,GAAA;AAAA;AAAA,EAEX,kBAAA,EAAoB,CAAA;AAAA;AAAA,EAEpB,yBAAA,EAA2B,CAAA;AAAA;AAAA,EAE3B,qBAAA,EAAuB;AACzB;AAIO,IAAM,eAAA,GAAkB;AAAA;AAAA,EAE7B,SAAA,EAAW,aAAA;AAAA;AAAA,EAEX,UAAA,EAAY,EAAA;AAAA;AAAA,EAEZ,SAAA,EAAW,EAAA;AAAA;AAAA,EAEX,gBAAA,EAAkB,EAAA;AAAA;AAAA,EAElB,WAAA,EAAa,EAAA;AAAA;AAAA,EAEb,UAAA,EAAY,GAAA;AAAA;AAAA,EAEZ,MAAA,EAAQ;AACV;AAIO,IAAM,eAAA,GAAkB;AAAA;AAAA,EAE7B,cAAA,EAAgB,GAAA;AAAA;AAAA,EAEhB,aAAA,EAAe,GAAA;AAAA;AAAA,EAEf,aAAA,EAAe,GAAA;AAAA;AAAA,EAEf,aAAA,EAAe;AACjB;AAIO,IAAM,gBAAA,GAAmB;AAAA;AAAA,EAE9B,oBAAA,EAAsB,GAAA;AAAA;AAAA,EAEtB,cAAA,EAAgB,GAAA;AAAA;AAAA,EAEhB,iBAAA,EAAmB;AACrB;AAOO,IAAM,gBAAA,GAAmB,CAAC,EAAA,EAAI,EAAA,EAAI,GAAA,EAAK,KAAK,GAAA,EAAK,GAAA,EAAM,IAAA,EAAM,GAAA,EAAM,GAAM;AAIzE,IAAM,iBAAA,GAAoB;AAAA;AAAA,EAE/B,MAAA,EAAQ,IAAA;AAAA;AAAA,EAER,YAAA,EAAc;AAChB;AAIO,IAAM,UAAA,GAAa;AAAA;AAAA,EAExB,aAAA,EAAe,GAAA;AAAA;AAAA,EAEf,aAAA,EAAe,GAAA;AAAA;AAAA,EAEf,WAAA,EAAa,IAAA;AAAA;AAAA,EAEb,kBAAA,EAAoB,EAAA;AAAA;AAAA,EAEpB,gBAAA,EAAkB;AACpB;AAEO,IAAM,UAAA,GAAa;AAAA;AAAA,EAExB,YAAA,EAAc,IAAA;AAAA;AAAA,EAEd,cAAc,IAAA,GAAO,IAAA;AAAA;AAAA,EAErB,YAAA,EAAc,OAAO,IAAA,GAAO;AAC9B;;;ACrNO,IAAM,aAAA,GAAN,cAA4B,KAAA,CAAM;AAAA,EACvC,WAAA,CACE,OAAA,EACO,IAAA,EACS,KAAA,EAChB;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAHN,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACS,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAGhB,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AACZ,IAAA,KAAA,CAAM,iBAAA,CAAkB,IAAA,EAAM,IAAA,CAAK,WAAW,CAAA;AAAA,EAChD;AACF;AAEO,IAAM,aAAA,GAAN,cAA4B,aAAA,CAAc;AAAA,EAC/C,WAAA,CACE,OAAA,EACgB,IAAA,EACA,KAAA,EAChB;AACA,IAAA,KAAA,CAAM,OAAA,EAAS,MAAM,KAAK,CAAA;AAHV,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAGhB,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AACZ,IAAA,KAAA,CAAM,iBAAA,CAAkB,IAAA,EAAM,IAAA,CAAK,WAAW,CAAA;AAAA,EAChD;AACF;AAEO,IAAM,eAAA,GAAN,cAA8B,aAAA,CAAc;AAAA,EACjD,WAAA,CAAY,SAAiB,KAAA,EAAe;AAC1C,IAAA,KAAA,CAAM,OAAA,EAAS,oBAAoB,KAAK,CAAA;AACxC,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,EACd;AACF;AAEO,IAAM,UAAA,GAAN,cAAyB,aAAA,CAAc;AAAA,EAC5C,WAAA,CACE,OAAA,EACOC,IAAAA,EACA,MAAA,EACP,KAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAA,EAAS,eAAe,KAAK,CAAA;AAJ5B,IAAA,IAAA,CAAA,GAAA,GAAAA,IAAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAIP,IAAA,IAAA,CAAK,IAAA,GAAO,YAAA;AAAA,EACd;AACF;AAEO,IAAM,gBAAA,GAAN,cAA+B,aAAA,CAAc;AAAA,EAClD,WAAA,CACE,OAAA,EACO,aAAA,EACP,KAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAA,EAAS,qBAAqB,KAAK,CAAA;AAHlC,IAAA,IAAA,CAAA,aAAA,GAAA,aAAA;AAIP,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AAAA,EACd;AACF;AAEO,IAAM,YAAA,GAAN,cAA2B,aAAA,CAAc;AAAA,EAC9C,WAAA,CACE,OAAA,EACO,OAAA,EACP,KAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAA,EAAS,iBAAiB,KAAK,CAAA;AAH9B,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAIP,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AAAA,EACd;AACF;AAKO,IAAM,iBAAA,GAAN,cAAgC,YAAA,CAAa;AAAA,EAClD,WAAA,CACSA,IAAAA,EACA,SAAA,EACP,KAAA,EACA;AACA,IAAA,KAAA;AAAA,MACE,yBAAyB,SAAS,CAAA,6DAAA,CAAA;AAAA,MAClC,SAAA;AAAA,MACA;AAAA,KACF;AARO,IAAA,IAAA,CAAA,GAAA,GAAAA,IAAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAQP,IAAA,IAAA,CAAK,IAAA,GAAO,mBAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AAAA,EACd;AACF;AASO,IAAM,kBAAA,GAAN,cAAiC,eAAA,CAAgB;AAAA,EACtD,WAAA,CACS,SAAA,EACA,UAAA,EACP,KAAA,EACA;AACA,IAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,EAAS,GAAA,EAAAC,MAAI,GAAI,SAAA;AACjC,IAAA,KAAA;AAAA,MACE,CAAA,2BAAA,EAA8B,MAAM,CAAA,CAAA,EAAIA,IAAG,wBAAwB,OAAO,CAAA,iEAAA,CAAA;AAAA,MAE1E;AAAA,KACF;AATO,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AASP,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AAAA,EACd;AACF;AAEO,IAAM,eAAA,GAAN,cAA8B,aAAA,CAAc;AAAA,EACjD,WAAA,CACE,OAAA,EACO,KAAA,EACP,KAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAA,EAAS,oBAAoB,KAAK,CAAA;AAHjC,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAIP,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,EACd;AACF;AAEO,IAAM,UAAA,GAAN,cAAyB,aAAA,CAAc;AAAA,EAC5C,WAAA,CACE,OAAA,EACO,GAAA,EACP,KAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAA,EAAS,eAAe,KAAK,CAAA;AAH5B,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAIP,IAAA,IAAA,CAAK,IAAA,GAAO,YAAA;AAAA,EACd;AACF;AAEO,IAAM,mBAAA,GAAN,cAAkC,aAAA,CAAc;AAAA,EACrD,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,CAAA,SAAA,EAAY,OAAO,CAAA,oBAAA,CAAA,EAAwB,iBAAiB,CAAA;AAClE,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AAAA,EACd;AACF;;;AC7HA,IAAM,qBAAA,GAAsC;AAAA,EAC1C,UAAA,EAAY,CAAA;AAAA,EACZ,UAAA,EAAY,GAAA;AAAA,EACZ,iBAAA,EAAmB,CAAA;AAAA,EACnB,aAAA,EAAe,GAAA;AAAA,EACf,WAAA,EAAa,CAAC,KAAA,KAAiB;AAC7B,IAAA,MAAM,cAAA,GAAiB,CAAC,cAAA,EAAgB,WAAA,EAAa,aAAa,aAAa,CAAA;AAC/E,IAAA,OAAO,cAAA,CAAe,KAAK,CAAC,IAAA,KAAS,MAAM,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAC,CAAA;AAAA,EACnE;AACF,CAAA;AAEA,eAAsB,KAAA,CACpB,EAAA,EACA,OAAA,GAAiC,EAAC,EACtB;AACZ,EAAA,MAAM,IAAA,GAAO,EAAE,GAAG,qBAAA,EAAuB,GAAG,OAAA,EAAQ;AACpD,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,QAAQ,IAAA,CAAK,UAAA;AAEjB,EAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,IAAA,CAAK,YAAY,OAAA,EAAA,EAAW;AAC3D,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,EAAA,EAAG;AAAA,IAClB,SAAS,KAAA,EAAO;AACd,MAAA,SAAA,GAAY,KAAA;AAEZ,MAAA,IAAI,YAAY,IAAA,CAAK,UAAA,IAAc,CAAC,IAAA,CAAK,WAAA,CAAa,SAAS,CAAA,EAAG;AAChE,QAAA,MAAM,SAAA;AAAA,MACR;AAEA,MAAA,MAAM,MAAM,KAAK,CAAA;AAEjB,MAAA,IAAI,IAAA,CAAK,iBAAA,IAAqB,IAAA,CAAK,iBAAA,GAAoB,CAAA,EAAG;AACxD,QAAA,KAAA,GAAQ,KAAK,GAAA,CAAI,KAAA,GAAQ,IAAA,CAAK,iBAAA,EAAmB,KAAK,aAAc,CAAA;AAAA,MACtE;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,SAAA;AACR;AAEA,eAAsB,WAAA,CACpB,OAAA,EACA,SAAA,EACA,OAAA,EACY;AACZ,EAAA,IAAI,SAAA;AAEJ,EAAA,MAAM,cAAA,GAAiB,IAAI,OAAA,CAAe,CAAC,GAAG,MAAA,KAAW;AACvD,IAAA,SAAA,GAAY,WAAW,MAAM;AAC3B,MAAA,MAAA,CAAO,IAAI,YAAA,CAAa,OAAA,IAAW,6BAA6B,SAAS,CAAA,EAAA,CAAA,EAAM,SAAS,CAAC,CAAA;AAAA,IAC3F,GAAG,SAAS,CAAA;AAAA,EACd,CAAC,CAAA;AAED,EAAA,IAAI;AACF,IAAA,MAAM,SAAS,MAAM,OAAA,CAAQ,KAAK,CAAC,OAAA,EAAS,cAAc,CAAC,CAAA;AAC3D,IAAA,YAAA,CAAa,SAAS,CAAA;AACtB,IAAA,OAAO,MAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,YAAA,CAAa,SAAS,CAAA;AACtB,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAEA,SAAS,MAAM,EAAA,EAA2B;AACxC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AACzD;;;ACvEO,SAAS,yBAAyB,MAAA,EAAgC;AACvE,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,gBAAgB,sCAAsC,CAAA;AAAA,EAClE;AAEA,EAAA,IAAI,CAAC,OAAO,gBAAA,EAAkB;AAC5B,IAAA,IAAI,CAAC,OAAO,IAAA,EAAM;AAChB,MAAA,MAAM,IAAI,eAAA,CAAgB,wDAAA,EAA0D,MAAM,CAAA;AAAA,IAC5F;AAEA,IAAA,IAAI,CAAC,OAAO,QAAA,EAAU;AACpB,MAAA,MAAM,IAAI,eAAA;AAAA,QACR,iEAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IACE,MAAA,CAAO,IAAA,KAAS,MAAA,KACf,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,IAAY,MAAA,CAAO,IAAA,GAAO,CAAA,IAAK,MAAA,CAAO,IAAA,GAAO,KAAA,CAAA,EACrE;AACA,IAAA,MAAM,IAAI,eAAA,CAAgB,2CAAA,EAA6C,MAAM,CAAA;AAAA,EAC/E;AAEA,EAAA,IAAI,MAAA,CAAO,aAAa,OAAO,MAAA,CAAO,aAAa,QAAA,IAAY,MAAA,CAAO,WAAW,CAAA,CAAA,EAAI;AACnF,IAAA,MAAM,IAAI,eAAA,CAAgB,qCAAA,EAAuC,UAAU,CAAA;AAAA,EAC7E;AAEA,EAAA,IACE,MAAA,CAAO,sBACN,OAAO,MAAA,CAAO,sBAAsB,QAAA,IAAY,MAAA,CAAO,oBAAoB,CAAA,CAAA,EAC5E;AACA,IAAA,MAAM,IAAI,eAAA;AAAA,MACR,kDAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,CAAO,gBAAgB,OAAO,MAAA,CAAO,gBAAgB,QAAA,IAAY,MAAA,CAAO,cAAc,CAAA,CAAA,EAAI;AAC5F,IAAA,MAAM,IAAI,eAAA,CAAgB,4CAAA,EAA8C,aAAa,CAAA;AAAA,EACvF;AACF;AAEO,SAAS,YAAYD,IAAAA,EAAmB;AAC7C,EAAA,IAAI,CAACA,IAAAA,IAAO,OAAOA,IAAAA,KAAQ,QAAA,EAAU;AACnC,IAAA,MAAM,IAAI,gBAAgB,sCAAsC,CAAA;AAAA,EAClE;AAEA,EAAA,IAAIA,IAAAA,CAAI,IAAA,EAAK,CAAE,MAAA,KAAW,CAAA,EAAG;AAC3B,IAAA,MAAM,IAAI,gBAAgB,2BAA2B,CAAA;AAAA,EACvD;AACF;AAEO,SAAS,kBAAkB,SAAA,EAAyB;AACzD,EAAA,IAAI,CAAC,SAAA,IAAa,OAAO,SAAA,KAAc,QAAA,EAAU;AAC/C,IAAA,MAAM,IAAI,gBAAgB,uCAAuC,CAAA;AAAA,EACnE;AAEA,EAAA,MAAM,mBAAA,GAAsB,gBAAA;AAC5B,EAAA,IAAI,CAAC,mBAAA,CAAoB,IAAA,CAAK,SAAS,CAAA,EAAG;AACxC,IAAA,MAAM,IAAI,eAAA;AAAA,MACR,sGAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;AAEO,SAAS,mBAAmB,UAAA,EAA0B;AAC3D,EAAA,IAAI,CAAC,UAAA,IAAc,OAAO,UAAA,KAAe,QAAA,EAAU;AACjD,IAAA,MAAM,IAAI,gBAAgB,wCAAwC,CAAA;AAAA,EACpE;AAEA,EAAA,MAAM,oBAAA,GAAuB,gBAAA;AAC7B,EAAA,IAAI,CAAC,oBAAA,CAAqB,IAAA,CAAK,UAAU,CAAA,EAAG;AAC1C,IAAA,MAAM,IAAI,eAAA;AAAA,MACR,uGAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;AClFO,SAAS,gBAAA,CAAiBA,IAAAA,EAAa,MAAA,EAAoB,MAAA,GAAS,WAAA,EAAqB;AAC9F,EAAA,MAAM,IAAA,GAAO,WAAW,QAAQ,CAAA;AAChC,EAAA,IAAA,CAAK,OAAOA,IAAG,CAAA;AAEf,EAAA,IAAI,MAAA,IAAU,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAC/B,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AAAA,EACpC;AAEA,EAAA,OAAO,GAAG,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AACxC;AAEO,SAAS,cAAc,GAAA,EAAsD;AAClF,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA;AAE3B,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,MAAM,CAAC,CAAA;AAAA,IACf,IAAA,EAAM,MAAM,CAAC;AAAA,GACf;AACF;AAEO,SAAS,qBAAA,CAAsB,MAAA,GAAS,WAAA,EAAa,OAAA,GAAU,GAAA,EAAa;AACjF,EAAA,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA;AAC7B;AAEO,SAAS,iBAAiB,GAAA,EAAqB;AACpD,EAAA,OAAO,GAAA,CAAI,UAAA,CAAW,UAAA,EAAY,GAAG,CAAA;AACvC;;;AChCO,SAAS,YAAA,GAAuB;AACrC,EAAA,OAAO,sCAAA,CAAuC,UAAA,CAAW,OAAA,EAAS,CAAC,CAAA,KAAM;AACvE,IAAA,MAAM,CAAA,GAAK,IAAA,CAAK,MAAA,EAAO,GAAI,EAAA,GAAM,CAAA;AACjC,IAAA,MAAM,CAAA,GAAI,CAAA,KAAM,GAAA,GAAM,CAAA,GAAK,IAAI,CAAA,GAAO,CAAA;AACtC,IAAA,OAAO,CAAA,CAAE,SAAS,EAAE,CAAA;AAAA,EACtB,CAAC,CAAA;AACH;ACeA,IAAM,eAAA,GAAgD;AAAA,EACpD,WAAW,cAAA,CAAe,qBAAA;AAAA,EAC1B,OAAOE,SAAA,CAAc;AACvB,CAAA;AAKO,SAAS,QAAA,CAAS,IAAA,EAAc,OAAA,GAA8B,EAAC,EAAW;AAC/E,EAAA,MAAM,IAAA,GAAO,EAAE,GAAG,eAAA,EAAiB,GAAG,OAAA,EAAQ;AAG9C,EAAA,IAAI,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,SAAA,EAAW;AAChC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,IAAA,EAAM,MAAM,CAAA;AACvC,IAAA,MAAM,aAAa,QAAA,CAAS,MAAA,EAAQ,EAAE,KAAA,EAAO,IAAA,CAAK,OAAO,CAAA;AACzD,IAAA,OAAO,UAAA,CAAW,SAAS,QAAQ,CAAA;AAAA,EACrC,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAKO,SAAS,WAAW,IAAA,EAAsB;AAC/C,EAAA,IAAI,CAAC,YAAA,CAAa,IAAI,CAAA,EAAG;AACvB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,IAAA,EAAM,QAAQ,CAAA;AACzC,IAAA,MAAM,YAAA,GAAe,WAAW,MAAM,CAAA;AACtC,IAAA,OAAO,YAAA,CAAa,SAAS,MAAM,CAAA;AAAA,EACrC,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAKO,SAAS,aAAa,IAAA,EAAuB;AAClD,EAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI;AAEF,IAAA,MAAM,MAAA,GAAS,OAAO,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA,EAAG,CAAC,GAAG,QAAQ,CAAA;AACrD,IAAA,OAAO,OAAO,CAAC,CAAA,KAAM,EAAA,IAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,GAAA;AAAA,EAC7C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAKO,SAAS,mBAAA,CAAoB,UAAkB,UAAA,EAA4B;AAChF,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,OAAO,QAAA,CAAS,SAAS,UAAA,CAAW,MAAA;AACtC;AAKO,SAAS,cAAA,CACd,IAAA,EACA,SAAA,GAAY,cAAA,CAAe,qBAAA,EAClB;AAET,EAAA,IAAI,IAAA,CAAK,SAAS,SAAA,EAAW;AAC3B,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,IAAI,CAAA,CAAE,IAAA;AAClC,EAAA,MAAM,eAAA,GAAkB,KAAK,MAAA,GAAS,WAAA;AAGtC,EAAA,OAAO,eAAA,GAAkB,CAAA;AAC3B;AC3EO,IAAe,WAAA,GAAf,cAAmC,YAAA,CAAwC;AAAA,EACtE,MAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA,GAAe,KAAA;AAAA,EACf,YAAA,GAAe;AAAA,IACvB,UAAA,EAAY,CAAA;AAAA,IACZ,UAAA,EAAY;AAAA,GACd;AAAA,EAKA,IAAI,WAAA,GAAuB;AACzB,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA,EAEA,WAAA,CAAY,OAAA,GAA8B,EAAC,EAAG;AAC5C,IAAA,KAAA,EAAM;AACN,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AAAA,IACxB;AACA,IAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,MAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,KAAA;AAAA,IACvB;AACA,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AAAA,IACxB;AACA,IAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,MAAA,IAAA,CAAK,eAAe,EAAE,GAAG,KAAK,YAAA,EAAc,GAAG,QAAQ,YAAA,EAAa;AAAA,IACtE;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,MAAA,EAAyC;AACrD,IAAA,wBAAA,CAAyB,MAAM,CAAA;AAC/B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAEd,IAAA,IAAI;AACF,MAAA,MAAM,KAAA;AAAA,QACJ,YAAY;AACV,UAAA,MAAM,IAAA,CAAK,UAAU,MAAM,CAAA;AAC3B,UAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,UAAA,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,EAAE,MAAA,EAAQ,CAAA;AAAA,QACjC,CAAA;AAAA,QACA;AAAA,UACE,UAAA,EAAY,KAAK,YAAA,CAAa,UAAA;AAAA,UAC9B,UAAA,EAAY,KAAK,YAAA,CAAa;AAAA;AAChC,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,eAAA,CAAgB,+BAAA,EAAiC,KAAc,CAAA;AAAA,IAC3E;AAAA,EACF;AAAA,EAEA,MAAM,UAAA,GAA4B;AAChC,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,KAAK,YAAA,EAAa;AACxB,MAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AACpB,MAAA,IAAA,CAAK,KAAK,YAAY,CAAA;AAAA,IACxB,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,eAAA,CAAgB,oCAAA,EAAsC,KAAc,CAAA;AAAA,IAChF;AAAA,EACF;AAAA,EAEA,MAAM,KAAA,CACJF,IAAAA,EACA,MAAA,EACA,OAAA,GAAwB,EAAC,EACA;AACzB,IAAA,WAAA,CAAYA,IAAG,CAAA;AAEf,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,MAAM,IAAI,gBAAgB,2BAA2B,CAAA;AAAA,IACvD;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,IAAI;AACF,MAAA,IAAI,MAAA;AAEJ,MAAA,IAAI,OAAA,CAAQ,KAAA,IAAS,IAAA,CAAK,KAAA,EAAO;AAC/B,QAAA,MAAMG,YAAW,IAAA,CAAK,WAAA,CAAYH,IAAAA,EAAK,MAAA,EAAQ,QAAQ,KAAK,CAAA;AAC5D,QAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,KAAA,CAAM,IAAoBG,SAAQ,CAAA;AAElE,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,IAAA,CAAK,QAAQ,KAAA,CAAM,WAAA,EAAa,EAAE,GAAA,EAAKA,WAAU,CAAA;AACjD,UAAA,IAAA,CAAK,KAAK,UAAA,EAAY,EAAE,KAAKA,SAAAA,EAAU,GAAA,EAAAH,MAAK,CAAA;AAC5C,UAAA,OAAO,YAAA;AAAA,QACT;AAEA,QAAA,IAAA,CAAK,QAAQ,KAAA,CAAM,YAAA,EAAc,EAAE,GAAA,EAAKG,WAAU,CAAA;AAClD,QAAA,IAAA,CAAK,KAAK,WAAA,EAAa,EAAE,KAAKA,SAAAA,EAAU,GAAA,EAAAH,MAAK,CAAA;AAAA,MAC/C;AAEA,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,OAAA,CAAWA,IAAAA,EAAK,QAAQ,OAAO,CAAA;AAEzD,MAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,QAAA,MAAA,GAAS,MAAM,WAAA;AAAA,UACb,YAAA;AAAA,UACA,OAAA,CAAQ,OAAA;AAAA,UACR,CAAA,sBAAA,EAAyB,QAAQ,OAAO,CAAA,EAAA;AAAA,SAC1C;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAA,GAAS,MAAM,YAAA;AAAA,MACjB;AAEA,MAAA,MAAA,CAAO,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAE/B,MAAA,IAAI,OAAA,CAAQ,KAAA,IAAS,IAAA,CAAK,KAAA,EAAO;AAC/B,QAAA,MAAMG,YAAW,IAAA,CAAK,WAAA,CAAYH,IAAAA,EAAK,MAAA,EAAQ,QAAQ,KAAK,CAAA;AAC5D,QAAA,MAAM,MAAM,OAAO,OAAA,CAAQ,UAAU,QAAA,GAAW,OAAA,CAAQ,MAAM,GAAA,GAAM,KAAA,CAAA;AACpE,QAAA,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAIG,SAAAA,EAAU,QAAQ,GAAG,CAAA;AAC1C,QAAA,IAAA,CAAK,QAAQ,KAAA,CAAM,qBAAA,EAAuB,EAAE,GAAA,EAAKA,SAAAA,EAAU,KAAK,CAAA;AAAA,MAClE;AAEA,MAAA,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,EAAE,GAAA,EAAAH,IAAAA,EAAK,MAAA,EAAQ,QAAA,EAAU,MAAA,CAAO,QAAA,EAAU,QAAA,EAAU,MAAA,CAAO,QAAA,EAAU,CAAA;AACxF,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC9B,MAAA,IAAA,CAAK,IAAA,CAAK,cAAc,EAAE,GAAA,EAAAA,MAAK,MAAA,EAAQ,KAAA,EAAO,UAAU,CAAA;AACxD,MAAA,MAAM,IAAI,UAAA;AAAA,QACR,CAAA,cAAA,EAAkB,MAAgB,OAAO,CAAA,CAAA;AAAA,QACzCA,IAAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,OAAA,CACJA,IAAAA,EACA,MAAA,EACA,OAAA,EACyB;AACzB,IAAA,OAAO,IAAA,CAAK,MAASA,IAAAA,EAAK,MAAA,EAAQ,EAAE,GAAG,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,CAAA;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YAAA,CACJA,IAAAA,EACA,SAAA,EACA,OAAA,EAC2B;AAC3B,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,MAAM,IAAI,gBAAgB,2BAA2B,CAAA;AAAA,IACvD;AAEA,IAAA,MAAM,UAA4B,EAAC;AACnC,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,IAAI;AACF,MAAA,KAAA,MAAW,UAAU,SAAA,EAAW;AAC9B,QAAA,MAAM,SAAS,MAAM,IAAA,CAAK,OAAA,CAAWA,IAAAA,EAAK,QAAQ,OAAO,CAAA;AACzD,QAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,MACrB;AAEA,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC9B,MAAA,IAAA,CAAK,IAAA,CAAK,gBAAgB,EAAE,GAAA,EAAAA,MAAK,SAAA,EAAW,SAAA,CAAU,MAAA,EAAQ,QAAA,EAAU,CAAA;AAExE,MAAA,OAAO,OAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC9B,MAAA,IAAA,CAAK,KAAK,YAAA,EAAc,EAAE,KAAAA,IAAAA,EAAK,KAAA,EAAO,UAAU,CAAA;AAChD,MAAA,MAAM,IAAI,UAAA;AAAA,QACR,CAAA,wBAAA,EAA4B,MAAgB,OAAO,CAAA,CAAA;AAAA,QACnDA,IAAAA;AAAA,QACA,EAAC;AAAA,QACD;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,OAAA,CAAqB,IAAA,EAAc,KAAA,EAA+C;AACtF,IAAA,MAAM,IAAI,oBAAoB,SAAS,CAAA;AAAA,EACzC;AAAA,EAEA,MAAM,iBAAiB,QAAA,EAAqD;AAC1E,IAAA,MAAM,IAAI,oBAAoB,kBAAkB,CAAA;AAAA,EAClD;AAAA,EAEA,YAAA,GAA0B;AACxB,IAAA,MAAM,IAAI,oBAAoB,cAAc,CAAA;AAAA,EAC9C;AAAA,EAEA,MAAM,IAAA,GAAyB;AAC7B,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,MAAM,UAAU,CAAA;AAC3B,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,OAAO,MAAA,EAAyB;AAC9B,IAAA,MAAM,IAAI,oBAAoB,QAAQ,CAAA;AAAA,EACxC;AAAA,EAEA,iBAAiB,WAAA,EAA6B;AAC5C,IAAA,MAAM,IAAI,oBAAoB,kBAAkB,CAAA;AAAA,EAClD;AAAA,EAYQ,WAAA,CACNA,IAAAA,EACA,MAAA,EACA,YAAA,EACQ;AACR,IAAA,IAAI,OAAO,YAAA,KAAiB,QAAA,IAAY,YAAA,CAAa,GAAA,EAAK;AACxD,MAAA,OAAO,YAAA,CAAa,GAAA;AAAA,IACtB;AAEA,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,GAAI,SAAS,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA,GAAI,MAAA;AACtF,IAAA,OAAO,gBAAA,CAAiBA,MAAK,WAAW,CAAA;AAAA,EAC1C;AACF;;;ACrPO,SAAS,SAAA,CACd,GAAA,EACA,MAAA,EACA,QAAA,EACA,IAAA,EACM;AACN,EAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,EAAA,MAAM,SAAA,GAAY,IAAA,YAAgB,IAAA,GAAO,IAAA,CAAK,WAAA,GAAc,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,GAAI,IAAA;AAC5E,EAAA,MAAM,cAAc,GAAA,CAAI,sBAAA,CAAuB,GAAA,CAAI,QAAA,CAAS,SAAS,CAAC,CAAA;AAEtE,EAAA,GAAA,CAAI,aAAa,IAAA,CAAK;AAAA,IACpB,IAAA,EAAM,KAAA;AAAA,IACN,SAAA,EAAW,QAAQ,GAAA,CAAI,kBAAA,CAAmB,MAAM,CAAC,CAAA,EAAA,EAAK,QAAQ,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA;AAAA,IAC7E,QAAA,EAAU,CAAC,SAAS;AAAA,GACrB,CAAA;AACD,EAAA,GAAA,CAAI,QAAA,CAAS,KAAK,SAAS,CAAA;AAC7B;AAKO,SAAS,SAAA,CACd,GAAA,EACA,MAAA,EACA,QAAA,EACA,IAAA,EACM;AACN,EAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,EAAA,MAAM,cAAc,GAAA,CAAI,sBAAA,CAAuB,GAAA,CAAI,QAAA,CAAS,SAAS,CAAC,CAAA;AAEtE,EAAA,GAAA,CAAI,aAAa,IAAA,CAAK;AAAA,IACpB,IAAA,EAAM,KAAA;AAAA,IACN,SAAA,EAAW,QAAQ,GAAA,CAAI,kBAAA,CAAmB,MAAM,CAAC,CAAA,EAAA,EAAK,QAAQ,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA;AAAA,IAC7E,QAAA,EAAU,CAAC,IAAI;AAAA,GAChB,CAAA;AACD,EAAA,GAAA,CAAI,QAAA,CAAS,KAAK,IAAI,CAAA;AACxB;AAKO,SAAS,UAAA,CACd,GAAA,EACA,MAAA,EACA,QAAA,EACA,KAAA,EACM;AACN,EAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,EAAA,MAAM,cAAc,GAAA,CAAI,sBAAA,CAAuB,GAAA,CAAI,QAAA,CAAS,SAAS,CAAC,CAAA;AAEtE,EAAA,GAAA,CAAI,aAAa,IAAA,CAAK;AAAA,IACpB,IAAA,EAAM,KAAA;AAAA,IACN,SAAA,EAAW,SAAS,GAAA,CAAI,kBAAA,CAAmB,MAAM,CAAC,CAAA,EAAA,EAAK,QAAQ,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA;AAAA,IAC9E,QAAA,EAAU,CAAC,KAAK;AAAA,GACjB,CAAA;AACD,EAAA,GAAA,CAAI,QAAA,CAAS,KAAK,KAAK,CAAA;AACzB;AAKO,SAAS,QAAA,CACd,GAAA,EACA,MAAA,EACA,QAAA,EACA,GAAA,EACM;AACN,EAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,EAAA,MAAM,cAAc,GAAA,CAAI,sBAAA,CAAuB,GAAA,CAAI,QAAA,CAAS,SAAS,CAAC,CAAA;AAEtE,EAAA,GAAA,CAAI,aAAa,IAAA,CAAK;AAAA,IACpB,IAAA,EAAM,KAAA;AAAA,IACN,SAAA,EAAW,OAAO,GAAA,CAAI,kBAAA,CAAmB,MAAM,CAAC,CAAA,EAAA,EAAK,QAAQ,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA;AAAA,IAC5E,QAAA,EAAU,CAAC,GAAG;AAAA,GACf,CAAA;AACD,EAAA,GAAA,CAAI,QAAA,CAAS,KAAK,GAAG,CAAA;AACvB;AAKO,SAAS,UAAA,CAAW,KAAwB,MAAA,EAAsB;AACvE,EAAA,MAAM,KAAA,GAAA,qBAAY,IAAA,EAAK,EAAE,aAAY,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA;AACnD,EAAA,SAAA,CAAU,GAAA,EAAK,MAAA,EAAQ,GAAA,EAAK,KAAK,CAAA;AACnC;AAKO,SAAS,cAAA,CAAe,KAAwB,MAAA,EAAsB;AAC3E,EAAA,MAAM,SAAA,uBAAgB,IAAA,EAAK;AAC3B,EAAA,SAAA,CAAU,OAAA,CAAQ,SAAA,CAAU,OAAA,EAAQ,GAAI,CAAC,CAAA;AACzC,EAAA,SAAA,CAAU,GAAA,EAAK,MAAA,EAAQ,GAAA,EAAK,SAAA,CAAU,WAAA,GAAc,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAE,CAAA;AACpE;AAKO,SAAS,iBAAA,CACd,GAAA,EACA,MAAA,EACA,SAAA,EACA,OAAA,EACM;AACN,EAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,EAAA,MAAM,KAAA,GAAQ,SAAA,YAAqB,IAAA,GAAO,SAAA,CAAU,WAAA,GAAc,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,GAAI,SAAA;AAClF,EAAA,MAAM,GAAA,GAAM,OAAA,YAAmB,IAAA,GAAO,OAAA,CAAQ,WAAA,GAAc,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,GAAI,OAAA;AAE5E,EAAA,MAAM,mBAAmB,GAAA,CAAI,sBAAA,CAAuB,GAAA,CAAI,QAAA,CAAS,SAAS,CAAC,CAAA;AAC3E,EAAA,MAAM,iBAAiB,GAAA,CAAI,sBAAA,CAAuB,GAAA,CAAI,QAAA,CAAS,SAAS,CAAC,CAAA;AAEzE,EAAA,GAAA,CAAI,aAAa,IAAA,CAAK;AAAA,IACpB,IAAA,EAAM,KAAA;AAAA,IACN,SAAA,EAAW,QAAQ,GAAA,CAAI,kBAAA,CAAmB,MAAM,CAAC,CAAA,UAAA,EAAa,gBAAgB,CAAA,KAAA,EAAQ,cAAc,CAAA,CAAA;AAAA,IACpG,QAAA,EAAU,CAAC,KAAA,EAAO,GAAG;AAAA,GACtB,CAAA;AACD,EAAA,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,KAAA,EAAO,GAAG,CAAA;AAC9B;AAKO,SAAS,aAAA,CAAc,GAAA,EAAwB,MAAA,EAAgB,IAAA,EAAoB;AACxF,EAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,EAAA,MAAM,cAAc,GAAA,CAAI,sBAAA,CAAuB,GAAA,CAAI,QAAA,CAAS,SAAS,CAAC,CAAA;AAEtE,EAAA,GAAA,CAAI,aAAa,IAAA,CAAK;AAAA,IACpB,IAAA,EAAM,KAAA;AAAA,IACN,WAAW,CAAA,EAAG,GAAA,CAAI,mBAAmB,MAAM,CAAC,oCAAoC,WAAW,CAAA,KAAA,CAAA;AAAA,IAC3F,QAAA,EAAU,CAAC,IAAI;AAAA,GAChB,CAAA;AACD,EAAA,GAAA,CAAI,QAAA,CAAS,KAAK,IAAI,CAAA;AACxB;;;ACzGO,IAAe,mBAAf,MAAwE;AAAA,EACnE,OAAA;AAAA,EACA,kBAAA;AAAA,EACA,sBAAA;AAAA,EACA,MAAA;AAAA,EACA,eAAA,uBAAmC,GAAA,EAAI;AAAA,EACvC,eAAA,uBAAmC,GAAA,EAAI;AAAA;AAAA,EAGvC,aAAA,GAA0B,CAAC,GAAG,CAAA;AAAA,EAC9B,SAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAsB,EAAC;AAAA,EACvB,eAA8B,EAAC;AAAA,EAC/B,iBAA2B,EAAC;AAAA,EAC5B,YAAA;AAAA,EACA,iBAAuE,EAAC;AAAA,EACxE,UAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAsB,EAAC;AAAA,EACvB,UAAA,GAAa,KAAA;AAAA;AAAA,EAGb,WAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA;AAAA,EAGA,MAAA;AAAA,EACA,WAAA;AAAA,EAEV,YAAY,OAAA,EAA8B;AACxC,IAAA,IAAA,CAAK,UAAU,OAAA,CAAQ,OAAA;AACvB,IAAA,IAAA,CAAK,qBAAqB,OAAA,CAAQ,gBAAA,KAAqB,CAAC,EAAA,KAAO,IAAI,EAAE,CAAA,CAAA,CAAA,CAAA;AACrE,IAAA,IAAA,CAAK,yBAAyB,OAAA,CAAQ,oBAAA,KAAyB,CAAC,KAAA,KAAU,IAAI,KAAK,CAAA,CAAA,CAAA;AACnF,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AAAA,EACxB;AAAA,EAQA,UAAU,IAAA,EAAiD;AACzD,IAAA,IAAI,OAAiB,EAAC;AAEtB,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,IAAK,KAAA,CAAM,QAAQ,IAAA,CAAK,CAAC,CAAC,CAAA,EAAG;AAC/C,MAAA,IAAA,GAAO,KAAK,CAAC,CAAA;AAAA,IACf,CAAA,MAAO;AACL,MAAA,IAAA,GAAO,KAAK,MAAA,CAAO,CAAC,GAAA,KAAQ,OAAO,QAAQ,QAAQ,CAAA;AAAA,IACrD;AAEA,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,IAAA,CAAK,aAAA,GAAgB,CAAC,GAAG,CAAA;AAAA,IAC3B,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,aAAA,GAAgB,IAAA,CAClB,MAAA,CAAO,CAAC,GAAA,KAAQ,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAQ,CAAA,CAC9C,GAAA,CAAI,CAAC,GAAA,KAAQ;AACZ,QAAA,IAAI,GAAA,KAAQ,GAAA,IAAO,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,IAAK,GAAA,CAAI,QAAA,CAAS,MAAM,CAAA,IAAK,GAAA,CAAI,QAAA,CAAS,MAAM,CAAA,EAAG;AACpF,UAAA,OAAO,GAAA;AAAA,QACT;AACA,QAAA,kBAAA,CAAmB,GAAG,CAAA;AACtB,QAAA,OAAO,GAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACL;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,IAAA,CAAK,OAAe,KAAA,EAAiC;AACnD,IAAA,iBAAA,CAAkB,KAAK,CAAA;AACvB,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AAAA,IACnB;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,KAAA,CAAM,OAAe,KAAA,EAAiC;AACpD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,KAAK,CAAA;AAAA,EAC/B;AAAA,EAEA,QAAA,GAA4B;AAC1B,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMA,IAAA,CACE,KAAA,EACA,EAAA,EACA,IAAA,GAA4C,OAAA,EAC3B;AACjB,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AACpC,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,iBAAA,CAAkB,SAAS,CAAA;AAAA,IAC7B;AACA,IAAA,IAAA,CAAK,MAAM,IAAA,CAAK,EAAE,IAAA,EAAM,KAAA,EAAO,IAAI,CAAA;AACnC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,SAAA,CAAU,OAAe,EAAA,EAA6B;AACpD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,EAAA,EAAI,OAAO,CAAA;AAAA,EACrC;AAAA,EAEA,QAAA,CAAS,OAAe,EAAA,EAA6B;AACnD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,EAAA,EAAI,MAAM,CAAA;AAAA,EACpC;AAAA,EAEA,SAAA,CAAU,OAAe,EAAA,EAA6B;AACpD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,EAAA,EAAI,OAAO,CAAA;AAAA,EACrC;AAAA,EAEA,QAAA,CAAS,OAAe,EAAA,EAA6B;AACnD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,EAAA,EAAI,MAAM,CAAA;AAAA,EACpC;AAAA,EAYA,SAAS,IAAA,EAA4E;AACnF,IAAA,QAAQ,KAAK,MAAA;AAAQ,MACnB,KAAK,CAAA,EAAG;AACN,QAAA,MAAM,CAAC,MAAA,EAAQ,QAAA,EAAU,KAAK,CAAA,GAAI,IAAA;AAClC,QAAA,IAAA,CAAK,cAAA,CAAe,KAAA,EAAO,MAAA,EAAkB,QAAA,EAAoB,KAAK,CAAA;AAEtE,QAAA;AAAA,MACF;AAAA,MACA,KAAK,CAAA,EAAG;AACN,QAAA,MAAM,CAAC,SAAA,EAAW,QAAA,GAAW,GAAG,CAAA,GAAI,IAAA;AACpC,QAAA,IAAA,CAAK,cAAA;AAAA,UACH,KAAA;AAAA,UACA,SAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,CAAA,EAAG;AACN,QAAA,MAAM,CAAC,SAAS,CAAA,GAAI,IAAA;AACpB,QAAA,IAAA,CAAK,cAAA,CAAe,KAAA,EAAO,SAAA,EAA+C,GAAG,CAAA;AAE7E,QAAA;AAAA,MACF;AAAA;AAGF,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAQA,WAAW,IAAA,EAA4E;AACrF,IAAA,QAAQ,KAAK,MAAA;AAAQ,MACnB,KAAK,CAAA,EAAG;AACN,QAAA,MAAM,CAAC,MAAA,EAAQ,QAAA,EAAU,KAAK,CAAA,GAAI,IAAA;AAClC,QAAA,IAAA,CAAK,cAAA,CAAe,IAAA,EAAM,MAAA,EAAkB,QAAA,EAAoB,KAAK,CAAA;AAErE,QAAA;AAAA,MACF;AAAA,MACA,KAAK,CAAA,EAAG;AACN,QAAA,MAAM,CAAC,SAAA,EAAW,QAAA,GAAW,GAAG,CAAA,GAAI,IAAA;AACpC,QAAA,IAAA,CAAK,cAAA;AAAA,UACH,IAAA;AAAA,UACA,SAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,CAAA,EAAG;AACN,QAAA,MAAM,CAAC,SAAS,CAAA,GAAI,IAAA;AACpB,QAAA,IAAA,CAAK,cAAA,CAAe,IAAA,EAAM,SAAA,EAA+C,GAAG,CAAA;AAE5E,QAAA;AAAA,MACF;AAAA;AAGF,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAA,CAAQ,QAAgB,MAAA,EAAoC;AAC1D,IAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,MAAM,IAAI,gBAAgB,qCAAqC,CAAA;AAAA,IACjE;AAEA,IAAA,MAAM,eAAe,MAAA,CAClB,GAAA,CAAI,CAAC,CAAA,EAAG,UAAU,IAAA,CAAK,sBAAA,CAAuB,IAAA,CAAK,QAAA,CAAS,SAAS,KAAA,GAAQ,CAAC,CAAC,CAAA,CAC/E,KAAK,IAAI,CAAA;AAEZ,IAAA,IAAA,CAAK,aAAa,IAAA,CAAK;AAAA,MACrB,IAAA,EAAM,KAAA;AAAA,MACN,WAAW,CAAA,EAAG,IAAA,CAAK,mBAAmB,MAAM,CAAC,QAAQ,YAAY,CAAA,CAAA,CAAA;AAAA,MACjE,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,GAAG,MAAM,CAAA;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,UAAA,CAAW,QAAgB,MAAA,EAAoC;AAC7D,IAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,MAAM,IAAI,gBAAgB,wCAAwC,CAAA;AAAA,IACpE;AAEA,IAAA,MAAM,eAAe,MAAA,CAClB,GAAA,CAAI,CAAC,CAAA,EAAG,UAAU,IAAA,CAAK,sBAAA,CAAuB,IAAA,CAAK,QAAA,CAAS,SAAS,KAAA,GAAQ,CAAC,CAAC,CAAA,CAC/E,KAAK,IAAI,CAAA;AAEZ,IAAA,IAAA,CAAK,aAAa,IAAA,CAAK;AAAA,MACrB,IAAA,EAAM,KAAA;AAAA,MACN,WAAW,CAAA,EAAG,IAAA,CAAK,mBAAmB,MAAM,CAAC,YAAY,YAAY,CAAA,CAAA,CAAA;AAAA,MACrE,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,GAAG,MAAM,CAAA;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,YAAA,CAAa,MAAA,EAAgBI,IAAAA,EAAcH,IAAAA,EAA+B;AACxE,IAAA,kBAAA,CAAmB,MAAM,CAAA;AAEzB,IAAA,MAAM,iBAAiB,IAAA,CAAK,sBAAA,CAAuB,IAAA,CAAK,QAAA,CAAS,SAAS,CAAC,CAAA;AAC3E,IAAA,MAAM,iBAAiB,IAAA,CAAK,sBAAA,CAAuB,IAAA,CAAK,QAAA,CAAS,SAAS,CAAC,CAAA;AAE3E,IAAA,IAAA,CAAK,aAAa,IAAA,CAAK;AAAA,MACrB,IAAA,EAAM,KAAA;AAAA,MACN,SAAA,EAAW,GAAG,IAAA,CAAK,kBAAA,CAAmB,MAAM,CAAC,CAAA,SAAA,EAAY,cAAc,CAAA,KAAA,EAAQ,cAAc,CAAA,CAAA;AAAA,MAC7F,QAAA,EAAU,CAACG,IAAAA,EAAKH,IAAG;AAAA,KACpB,CAAA;AACD,IAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAKG,IAAAA,EAAKH,IAAG,CAAA;AAC3B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,UAAU,MAAA,EAAiC;AACzC,IAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,IAAA,IAAA,CAAK,aAAa,IAAA,CAAK;AAAA,MACrB,IAAA,EAAM,KAAA;AAAA,MACN,SAAA,EAAW,CAAA,EAAG,IAAA,CAAK,kBAAA,CAAmB,MAAM,CAAC,CAAA,QAAA,CAAA;AAAA,MAC7C,UAAU;AAAC,KACZ,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,aAAa,MAAA,EAAiC;AAC5C,IAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,IAAA,IAAA,CAAK,aAAa,IAAA,CAAK;AAAA,MACrB,IAAA,EAAM,KAAA;AAAA,MACN,SAAA,EAAW,CAAA,EAAG,IAAA,CAAK,kBAAA,CAAmB,MAAM,CAAC,CAAA,YAAA,CAAA;AAAA,MAC7C,UAAU;AAAC,KACZ,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMA,SAAA,CAAU,MAAA,EAAgB,QAAA,EAAkB,IAAA,EAAsC;AAChF,IAAgB,UAAU,IAAA,CAAK,oBAAA,EAAqB,EAAG,MAAA,EAAQ,UAAU,IAAI,CAAA;AAC7E,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,SAAA,CAAU,MAAA,EAAgB,QAAA,EAAkB,IAAA,EAA+B;AACzE,IAAgB,UAAU,IAAA,CAAK,oBAAA,EAAqB,EAAG,MAAA,EAAQ,UAAU,IAAI,CAAA;AAC7E,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,UAAA,CAAW,MAAA,EAAgB,QAAA,EAAkB,KAAA,EAAgC;AAC3E,IAAgB,WAAW,IAAA,CAAK,oBAAA,EAAqB,EAAG,MAAA,EAAQ,UAAU,KAAK,CAAA;AAC/E,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,QAAA,CAAS,MAAA,EAAgB,QAAA,EAAkB,GAAA,EAA8B;AACvE,IAAgB,SAAS,IAAA,CAAK,oBAAA,EAAqB,EAAG,MAAA,EAAQ,UAAU,GAAG,CAAA;AAC3E,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,WAAW,MAAA,EAAiC;AAC1C,IAAgB,UAAA,CAAW,IAAA,CAAK,oBAAA,EAAqB,EAAG,MAAM,CAAA;AAC9D,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,eAAe,MAAA,EAAiC;AAC9C,IAAgB,cAAA,CAAe,IAAA,CAAK,oBAAA,EAAqB,EAAG,MAAM,CAAA;AAClE,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,iBAAA,CACE,MAAA,EACA,SAAA,EACA,OAAA,EACiB;AACjB,IAAgB,kBAAkB,IAAA,CAAK,oBAAA,EAAqB,EAAG,MAAA,EAAQ,WAAW,OAAO,CAAA;AACzF,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,aAAA,CAAc,QAAgB,IAAA,EAA+B;AAC3D,IAAgB,aAAA,CAAc,IAAA,CAAK,oBAAA,EAAqB,EAAG,QAAQ,IAAI,CAAA;AACvE,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,oBAAA,GAA0D;AAChE,IAAA,OAAO;AAAA,MACL,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,cAAc,IAAA,CAAK,YAAA;AAAA,MACnB,oBAAoB,IAAA,CAAK,kBAAA;AAAA,MACzB,wBAAwB,IAAA,CAAK;AAAA,KAC/B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,OAAA,EAAoC;AAC7C,IAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,GAAA,KAAQ,kBAAA,CAAmB,GAAG,CAAC,CAAA;AAChD,IAAA,IAAA,CAAK,cAAA,GAAiB,OAAA;AACtB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAO,SAAA,EAAoC;AACzC,IAAA,IAAA,CAAK,YAAA,GAAe,SAAA;AACpB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAA,CAAQ,MAAA,EAAgB,SAAA,GAA4B,KAAA,EAAwB;AAC1E,IAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,IAAA,IAAA,CAAK,cAAA,CAAe,IAAA,CAAK,EAAE,MAAA,EAAQ,WAAW,CAAA;AAC9C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,KAAA,EAAgC;AACpC,IAAA,IAAI,QAAQ,CAAA,EAAG;AACb,MAAA,MAAM,IAAI,gBAAgB,4BAA4B,CAAA;AAAA,IACxD;AACA,IAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAO,MAAA,EAAiC;AACtC,IAAA,IAAI,SAAS,CAAA,EAAG;AACd,MAAA,MAAM,IAAI,gBAAgB,6BAA6B,CAAA;AAAA,IACzD;AACA,IAAA,IAAA,CAAK,WAAA,GAAc,MAAA;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KAAA,CAAM,MAAA,GAAS,GAAA,EAAK,OAAA,EAAyC;AACjE,IAAA,MAAM,iBAAiB,IAAA,CAAK,aAAA;AAC5B,IAAA,IAAA,CAAK,aAAA,GAAgB,CAAC,CAAA,MAAA,EAAS,MAAM,CAAA,UAAA,CAAY,CAAA;AAEjD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AACzC,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA;AACzB,MAAA,OAAO,GAAA,GAAM,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA,GAAI,CAAA;AAAA,IACnC,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,aAAA,GAAgB,cAAA;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,MAAM,GAAA,CAAI,MAAA,EAAgB,OAAA,EAAyC;AACjE,IAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,IAAA,MAAM,iBAAiB,IAAA,CAAK,aAAA;AAC5B,IAAA,IAAA,CAAK,gBAAgB,CAAC,CAAA,IAAA,EAAO,KAAK,kBAAA,CAAmB,MAAM,CAAC,CAAA,cAAA,CAAgB,CAAA;AAE5E,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AACzC,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA;AACzB,MAAA,OAAO,GAAA,EAAK,SAAA,GAAY,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA,GAAI,CAAA;AAAA,IAClD,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,aAAA,GAAgB,cAAA;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,MAAM,GAAA,CAAI,MAAA,EAAgB,OAAA,EAAyC;AACjE,IAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,IAAA,MAAM,iBAAiB,IAAA,CAAK,aAAA;AAC5B,IAAA,IAAA,CAAK,gBAAgB,CAAC,CAAA,IAAA,EAAO,KAAK,kBAAA,CAAmB,MAAM,CAAC,CAAA,cAAA,CAAgB,CAAA;AAE5E,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AACzC,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA;AACzB,MAAA,OAAO,GAAA,EAAK,SAAA,GAAY,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA,GAAI,CAAA;AAAA,IAClD,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,aAAA,GAAgB,cAAA;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,MAAM,GAAA,CAAI,MAAA,EAAgB,OAAA,EAAgD;AACxE,IAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,IAAA,MAAM,iBAAiB,IAAA,CAAK,aAAA;AAC5B,IAAA,IAAA,CAAK,gBAAgB,CAAC,CAAA,IAAA,EAAO,KAAK,kBAAA,CAAmB,MAAM,CAAC,CAAA,cAAA,CAAgB,CAAA;AAE5E,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AACzC,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA;AACzB,MAAA,IAAI,GAAA,EAAK,SAAA,KAAc,IAAA,IAAQ,GAAA,EAAK,cAAc,KAAA,CAAA,EAAW;AAC3D,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,OAAO,MAAA,CAAO,IAAI,SAAS,CAAA;AAAA,IAC7B,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,aAAA,GAAgB,cAAA;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,MAAM,GAAA,CAAI,MAAA,EAAgB,OAAA,EAAgD;AACxE,IAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,IAAA,MAAM,iBAAiB,IAAA,CAAK,aAAA;AAC5B,IAAA,IAAA,CAAK,gBAAgB,CAAC,CAAA,IAAA,EAAO,KAAK,kBAAA,CAAmB,MAAM,CAAC,CAAA,cAAA,CAAgB,CAAA;AAE5E,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AACzC,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA;AACzB,MAAA,IAAI,GAAA,EAAK,SAAA,KAAc,IAAA,IAAQ,GAAA,EAAK,cAAc,KAAA,CAAA,EAAW;AAC3D,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,OAAO,MAAA,CAAO,IAAI,SAAS,CAAA;AAAA,IAC7B,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,aAAA,GAAgB,cAAA;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,OAAA,EAA0C;AACrD,IAAA,MAAMI,MAAAA,GAAQ,MAAM,IAAA,CAAK,KAAA,CAAM,KAAK,OAAO,CAAA;AAC3C,IAAA,OAAOA,MAAAA,GAAQ,CAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAA,CACJ,IAAA,GAAe,CAAA,EACf,OAAA,GAAkB,IAClB,OAAA,EAC8B;AAC9B,IAAA,IAAI,OAAO,CAAA,EAAG;AACZ,MAAA,IAAA,GAAO,CAAA;AAAA,IACT;AACA,IAAA,IAAI,UAAU,CAAA,EAAG;AACf,MAAA,OAAA,GAAU,EAAA;AAAA,IACZ;AAGA,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,KAAA,CAAM,KAAK,OAAO,CAAA;AAG3C,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,KAAA,GAAQ,OAAO,CAAA;AAC5C,IAAA,MAAM,MAAA,GAAA,CAAU,OAAO,CAAA,IAAK,OAAA;AAG5B,IAAA,IAAA,CAAK,UAAA,GAAa,OAAA;AAClB,IAAA,IAAA,CAAK,WAAA,GAAc,MAAA;AACnB,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AAEzC,IAAA,MAAM,IAAA,GAAO,KAAA,GAAQ,CAAA,GAAI,MAAA,GAAS,CAAA,GAAI,CAAA;AACtC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,MAAA,GAAS,SAAS,KAAK,CAAA;AAE3C,IAAA,OAAO;AAAA,MACL,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,UAAA,EAAY;AAAA,QACV,IAAA;AAAA,QACA,OAAA;AAAA,QACA,KAAA;AAAA,QACA,UAAA;AAAA,QACA,SAAS,IAAA,GAAO,UAAA;AAAA,QAChB,IAAA;AAAA,QACA;AAAA;AACF,KACF;AAAA,EACF;AAAA,EAEA,MAAM,cAAA,CACJ,YAAA,EACA,SAAiC,IAAA,EACjC,KAAA,GAAgB,IAChB,OAAA,EACoC;AACpC,IAAA,kBAAA,CAAmB,YAAY,CAAA;AAE/B,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,IAAA,CAAK,KAAA,CAAM,YAAA,EAAc,GAAA,EAAK,MAAM,CAAA;AAAA,IACtC;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,cAAc,KAAK,CAAA;AAChC,IAAA,IAAA,CAAK,aAAa,KAAA,GAAQ,CAAA;AAE1B,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AACzC,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,MAAA,GAAS,KAAA;AACrC,IAAA,MAAM,IAAA,GAAO,UAAU,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAG,KAAK,IAAI,MAAA,CAAO,IAAA;AAE5D,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,EAAA,CAAG,EAAE,CAAA;AAC3B,IAAA,MAAM,UAAA,GAAa,OAAA,IAAW,QAAA,GAAY,QAAA,CAAS,YAAY,CAAA,GAAwB,IAAA;AAEvF,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,KAAA,CACJ,IAAA,EACA,QAAA,EACA,OAAA,EACe;AACf,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,IAAI,OAAA,GAAU,IAAA;AAEd,IAAA,OAAO,OAAA,EAAS;AACd,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,MAAM,OAAO,CAAA;AAEtD,MAAA,IAAI,MAAA,CAAO,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AAC5B,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,cAAA,GAAiB,MAAM,QAAA,CAAS,MAAA,CAAO,MAAM,IAAI,CAAA;AAEvD,MAAA,IAAI,mBAAmB,KAAA,EAAO;AAC5B,QAAA;AAAA,MACF;AAEA,MAAA,OAAA,GAAU,OAAO,UAAA,CAAW,OAAA;AAC5B,MAAA,IAAA,EAAA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,MAAM,OAAA,EAA2C;AACrD,IAAA,IAAA,CAAK,MAAM,CAAC,CAAA;AACZ,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AACzC,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA;AAAA,EAC3B;AAAA,EAEA,MAAM,KAAA,CAAmB,MAAA,EAAgB,OAAA,EAAsC;AAC7E,IAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,IAAA,MAAM,iBAAiB,IAAA,CAAK,aAAA;AAC5B,IAAA,IAAA,CAAK,aAAA,GAAgB,CAAC,MAAM,CAAA;AAE5B,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AACzC,MAAA,OAAO,MAAA,CAAO,IAAA,CACX,GAAA,CAAI,CAAC,GAAA,KAAkB,GAAA,CAA0B,MAAM,CAAC,CAAA,CACxD,MAAA,CAAO,CAAC,GAAA,KAAkB,QAAQ,KAAA,CAAS,CAAA;AAAA,IAChD,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,aAAA,GAAgB,cAAA;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,MAAM,KAAA,CAAmB,MAAA,EAAgB,OAAA,EAA2C;AAClF,IAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,IAAA,MAAM,iBAAiB,IAAA,CAAK,aAAA;AAC5B,IAAA,IAAA,CAAK,aAAA,GAAgB,CAAC,MAAM,CAAA;AAC5B,IAAA,IAAA,CAAK,UAAA,GAAa,CAAA;AAElB,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AACzC,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA;AACzB,MAAA,IAAI,CAAC,GAAA,EAAK;AACR,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,MAAM,GAAA,GAAM,IAAI,MAAM,CAAA;AACtB,MAAA,OAAO,GAAA,KAAQ,SAAY,IAAA,GAAO,GAAA;AAAA,IACpC,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,aAAA,GAAgB,cAAA;AAAA,IACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAA,CACE,OACA,IAAA,EACiB;AACjB,IAAA,iBAAA,CAAkB,KAAK,CAAA;AACvB,IAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AACnB,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,wBAAA,CAAyB,IAAI,CAAA;AACpD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAA,CAAO,OAAe,IAAA,EAAgD;AACpE,IAAA,iBAAA,CAAkB,KAAK,CAAA;AACvB,IAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AACnB,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,wBAAA,CAAyB,IAAI,CAAA;AACpD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAO,KAAA,EAAgC;AACrC,IAAA,iBAAA,CAAkB,KAAK,CAAA;AACvB,IAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMA,GAAA,CAAIL,MAAa,QAAA,EAAuC;AACtD,IAAA,IAAA,CAAK,MAAA,GAASA,IAAAA;AACd,IAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,MAAA,IAAA,CAAK,WAAA,GAAc,QAAA;AAAA,IACrB;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,MAAA,EAAmC;AAC5C,IAAA,MAAA,CAAO,QAAQ,CAAC,KAAA,KAAU,KAAK,eAAA,CAAgB,GAAA,CAAI,KAAK,CAAC,CAAA;AACzD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,WAAW,MAAA,EAAmC;AAC5C,IAAA,MAAA,CAAO,QAAQ,CAAC,KAAA,KAAU,KAAK,eAAA,CAAgB,GAAA,CAAI,KAAK,CAAC,CAAA;AACzD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMA,KAAA,GAA8C;AAC5C,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,OAAO,EAAE,KAAK,IAAA,CAAK,MAAA,EAAQ,UAAU,IAAA,CAAK,WAAA,IAAe,EAAC,EAAE;AAAA,IAC9D;AAEA,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,OAAO,KAAK,cAAA,EAAe;AAAA,IAC7B;AAEA,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,OAAO,KAAK,cAAA,EAAe;AAAA,IAC7B;AAEA,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,OAAO,KAAK,cAAA,EAAe;AAAA,IAC7B;AAEA,IAAA,OAAO,KAAK,cAAA,EAAe;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAQ,OAAA,EAAiD;AAC7D,IAAA,MAAM,EAAE,GAAA,EAAAA,IAAAA,EAAK,QAAA,EAAS,GAAI,KAAK,KAAA,EAAM;AACrC,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,QAAQ,KAAA,CAASA,IAAAA,EAAK,UAAyB,OAAO,CAAA;AAChF,IAAA,OAAO,IAAA,CAAK,4BAA4B,MAAM,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAMU,cAAA,CACR,IAAA,EACA,SAAA,EACA,QAAA,EACA,KAAA,EACM;AACN,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,kBAAA,CAAmB,SAAmB,CAAA;AACtC,MAAA,MAAM,cAAc,IAAA,CAAK,sBAAA,CAAuB,IAAA,CAAK,QAAA,CAAS,SAAS,CAAC,CAAA;AAExE,MAAA,IAAA,CAAK,aAAa,IAAA,CAAK;AAAA,QACrB,IAAA;AAAA,QACA,SAAA,EAAW,GAAG,IAAA,CAAK,kBAAA,CAAmB,SAAmB,CAAC,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA;AAAA,QACrF,QAAA,EAAU,CAAC,KAAK;AAAA,OACjB,CAAA;AACD,MAAA,IAAA,CAAK,QAAA,CAAS,KAAK,KAAK,CAAA;AAAA,IAC1B,CAAA,MAAA,IAAW,OAAO,SAAA,KAAc,QAAA,EAAU;AACxC,MAAA,IAAA,CAAK,aAAa,IAAA,CAAK;AAAA,QACrB,IAAA;AAAA,QACA,SAAA;AAAA,QACA,UAAU;AAAC,OACZ,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,GAAG,CAAA,KAAM;AAChD,QAAA,kBAAA,CAAmB,GAAG,CAAA;AACtB,QAAA,MAAM,cAAc,IAAA,CAAK,sBAAA,CAAuB,IAAA,CAAK,QAAA,CAAS,SAAS,CAAC,CAAA;AAExE,QAAA,IAAA,CAAK,aAAa,IAAA,CAAK;AAAA,UACrB,IAAA;AAAA,UACA,SAAA,EAAW,GAAG,IAAA,CAAK,kBAAA,CAAmB,GAAG,CAAC,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA;AAAA,UACrE,QAAA,EAAU,CAAC,GAAG;AAAA,SACf,CAAA;AACD,QAAA,IAAA,CAAK,QAAA,CAAS,KAAK,GAAG,CAAA;AAAA,MACxB,CAAC,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEU,yBACR,IAAA,EACqD;AACrD,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,eAAA,CAAgB,SAAS,CAAA,EAAG;AACnD,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,MAAA,OAAO,KAAK,GAAA,CAAI,CAAC,QAAQ,IAAA,CAAK,UAAA,CAAW,GAAG,CAAC,CAAA;AAAA,IAC/C;AACA,IAAA,OAAO,IAAA,CAAK,WAAW,IAAI,CAAA;AAAA,EAC7B;AAAA,EAEU,WAAW,GAAA,EAAuD;AAC1E,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,OAAO,GAAA;AAAA,IACT;AAEA,IAAA,MAAM,YAAA,GAAe,EAAE,GAAG,GAAA,EAAI;AAC9B,IAAA,IAAA,CAAK,eAAA,CAAgB,OAAA,CAAQ,CAAC,KAAA,KAAU;AACtC,MAAA,IAAI,SAAS,YAAA,EAAc;AACzB,QAAA,YAAA,CAAa,KAAK,CAAA,GAAI,IAAA,CAAK,OAAQ,YAAA,CAAa,YAAA,CAAa,KAAK,CAAC,CAAA;AAAA,MACrE;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAO,YAAA;AAAA,EACT;AAAA,EAEA,MAAgB,4BAA4B,MAAA,EAAiD;AAC3F,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,eAAA,CAAgB,SAAS,CAAA,EAAG;AACnD,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ;AAC7C,MAAA,MAAM,YAAA,GAAe,EAAE,GAAG,GAAA,EAAI;AAC9B,MAAA,IAAA,CAAK,eAAA,CAAgB,OAAA,CAAQ,CAAC,KAAA,KAAU;AACtC,QAAA,IAAI,KAAA,IAAS,YAAA,IAAgB,YAAA,CAAa,KAAK,CAAA,EAAG;AAChD,UAAA,IAAI;AACF,YAAA,MAAM,KAAA,GAAQ,aAAa,KAAK,CAAA;AAChC,YAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,cAAA,YAAA,CAAa,KAAK,CAAA,GAAI,IAAA,CAAK,MAAA,CAAQ,aAAa,KAAK,CAAA;AAAA,YACvD;AAAA,UACF,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF,CAAC,CAAA;AACD,MAAA,OAAO,YAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,OAAO;AAAA,MACL,GAAG,MAAA;AAAA,MACH,IAAA,EAAM;AAAA,KACR;AAAA,EACF;AAUF;;;ACzvBO,SAAS,gBAAA,GAA+B;AAC7C,EAAA,OAAO;AAAA,IACL,aAAA,EAAe,CAAC,GAAG,CAAA;AAAA,IACnB,OAAO,EAAC;AAAA,IACR,cAAc,EAAC;AAAA,IACf,gBAAgB,EAAC;AAAA,IACjB,gBAAgB,EAAC;AAAA,IACjB,UAAU,EAAC;AAAA,IACX,UAAA,EAAY,KAAA;AAAA,IACZ,eAAA,sBAAqB,GAAA,EAAI;AAAA,IACzB,eAAA,sBAAqB,GAAA;AAAI,GAC3B;AACF;;;ACvDA,eAAe,gBAAA,CACb,GAAA,EACA,mBAAA,EACA,OAAA,EACmC;AACnC,EAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,aAAA,CAAc,KAAA,EAAM;AAC/C,EAAA,GAAA,CAAI,cAAc,MAAA,GAAS,CAAA;AAC3B,EAAA,GAAA,CAAI,aAAA,CAAc,KAAK,mBAAmB,CAAA;AAE1C,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,GAAA,EAAAA,IAAAA,EAAK,QAAA,EAAS,GAAI,IAAI,KAAA,EAAM;AACpC,IAAA,MAAM,SAAS,MAAM,GAAA,CAAI,QAAQ,KAAA,CAAoBA,IAAAA,EAAK,UAAyB,OAAO,CAAA;AAC1F,IAAA,OAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,EACtB,CAAA,SAAE;AACA,IAAA,GAAA,CAAI,cAAc,MAAA,GAAS,CAAA;AAC3B,IAAA,GAAA,CAAI,aAAA,CAAc,IAAA,CAAK,GAAG,cAAc,CAAA;AAAA,EAC1C;AACF;AAKA,eAAsB,KAAA,CACpB,GAAA,EACA,MAAA,GAAS,GAAA,EACT,OAAA,EACiB;AACjB,EAAA,MAAM,MAAM,MAAM,gBAAA,CAAiB,KAAK,CAAA,MAAA,EAAS,MAAM,cAAc,OAAO,CAAA;AAC5E,EAAA,OAAO,GAAA,GAAM,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA,GAAI,CAAA;AACnC;AAKA,eAAsB,GAAA,CACpB,GAAA,EACA,MAAA,EACA,OAAA,EACiB;AACjB,EAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,EAAA,MAAM,MAAM,MAAM,gBAAA;AAAA,IAChB,GAAA;AAAA,IACA,CAAA,IAAA,EAAO,GAAA,CAAI,kBAAA,CAAmB,MAAM,CAAC,CAAA,cAAA,CAAA;AAAA,IACrC;AAAA,GACF;AACA,EAAA,OAAO,GAAA,EAAK,SAAA,GAAY,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA,GAAI,CAAA;AAClD;AAKA,eAAsB,GAAA,CACpB,GAAA,EACA,MAAA,EACA,OAAA,EACiB;AACjB,EAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,EAAA,MAAM,MAAM,MAAM,gBAAA;AAAA,IAChB,GAAA;AAAA,IACA,CAAA,IAAA,EAAO,GAAA,CAAI,kBAAA,CAAmB,MAAM,CAAC,CAAA,cAAA,CAAA;AAAA,IACrC;AAAA,GACF;AACA,EAAA,OAAO,GAAA,EAAK,SAAA,GAAY,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA,GAAI,CAAA;AAClD;AAKA,eAAsB,GAAA,CACpB,GAAA,EACA,MAAA,EACA,OAAA,EACwB;AACxB,EAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,EAAA,MAAM,MAAM,MAAM,gBAAA;AAAA,IAChB,GAAA;AAAA,IACA,CAAA,IAAA,EAAO,GAAA,CAAI,kBAAA,CAAmB,MAAM,CAAC,CAAA,cAAA,CAAA;AAAA,IACrC;AAAA,GACF;AACA,EAAA,IAAI,GAAA,EAAK,SAAA,KAAc,IAAA,IAAQ,GAAA,EAAK,cAAc,MAAA,EAAW;AAC3D,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAA,CAAO,IAAI,SAAS,CAAA;AAC7B;AAKA,eAAsB,GAAA,CACpB,GAAA,EACA,MAAA,EACA,OAAA,EACwB;AACxB,EAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,EAAA,MAAM,MAAM,MAAM,gBAAA;AAAA,IAChB,GAAA;AAAA,IACA,CAAA,IAAA,EAAO,GAAA,CAAI,kBAAA,CAAmB,MAAM,CAAC,CAAA,cAAA,CAAA;AAAA,IACrC;AAAA,GACF;AACA,EAAA,IAAI,GAAA,EAAK,SAAA,KAAc,IAAA,IAAQ,GAAA,EAAK,cAAc,MAAA,EAAW;AAC3D,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAA,CAAO,IAAI,SAAS,CAAA;AAC7B;AAKA,eAAsB,MAAA,CAAO,KAAuB,OAAA,EAA0C;AAC5F,EAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,GAAA,EAAK,KAAK,OAAO,CAAA;AAC3C,EAAA,OAAO,KAAA,GAAQ,CAAA;AACjB;;;AC9GA,eAAsB,SACpB,GAAA,EACA,KAAA,EACA,OAAe,CAAA,EACf,OAAA,GAAkB,IAClB,OAAA,EAC8B;AAC9B,EAAA,MAAM,QAAA,GAAW,IAAA,GAAO,CAAA,GAAI,CAAA,GAAI,IAAA;AAChC,EAAA,MAAM,WAAA,GAAc,OAAA,GAAU,CAAA,GAAI,EAAA,GAAK,OAAA;AAGvC,EAAA,MAAM,KAAA,GAAQ,MAAM,GAAA,CAAI,KAAA,CAAM,KAAK,OAAO,CAAA;AAG1C,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,KAAA,GAAQ,WAAW,CAAA;AAChD,EAAA,MAAM,MAAA,GAAA,CAAU,WAAW,CAAA,IAAK,WAAA;AAGhC,EAAA,KAAA,CAAM,UAAA,GAAa,WAAA;AACnB,EAAA,KAAA,CAAM,WAAA,GAAc,MAAA;AAGpB,EAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,OAAA,CAAQ,OAAO,CAAA;AAExC,EAAA,MAAM,IAAA,GAAO,KAAA,GAAQ,CAAA,GAAI,MAAA,GAAS,CAAA,GAAI,CAAA;AACtC,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,MAAA,GAAS,aAAa,KAAK,CAAA;AAE/C,EAAA,OAAO;AAAA,IACL,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,UAAA,EAAY;AAAA,MACV,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,WAAA;AAAA,MACT,KAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAS,QAAA,GAAW,UAAA;AAAA,MACpB,IAAA;AAAA,MACA;AAAA;AACF,GACF;AACF;AAKA,eAAsB,cAAA,CACpB,KACA,KAAA,EACA,YAAA,EACA,SAAiC,IAAA,EACjC,KAAA,GAAgB,IAChB,OAAA,EACoC;AACpC,EAAA,kBAAA,CAAmB,YAAY,CAAA;AAE/B,EAAA,IAAI,WAAW,IAAA,EAAM;AACnB,IAAA,GAAA,CAAI,KAAA,CAAM,YAAA,EAAc,GAAA,EAAK,MAAM,CAAA;AAAA,EACrC;AAEA,EAAA,GAAA,CAAI,OAAA,CAAQ,cAAc,KAAK,CAAA;AAC/B,EAAA,KAAA,CAAM,aAAa,KAAA,GAAQ,CAAA;AAE3B,EAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,OAAA,CAAQ,OAAO,CAAA;AACxC,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,MAAA,GAAS,KAAA;AACrC,EAAA,MAAM,IAAA,GAAO,UAAU,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAG,KAAK,IAAI,MAAA,CAAO,IAAA;AAE5D,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,EAAA,CAAG,EAAE,CAAA;AAC3B,EAAA,MAAM,UAAA,GAAa,OAAA,IAAW,QAAA,GAAY,QAAA,CAAS,YAAY,CAAA,GAAwB,IAAA;AAEvF,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AACF;AAKA,eAAsB,KAAA,CACpB,GAAA,EACA,KAAA,EACA,IAAA,EACA,UACA,OAAA,EACe;AACf,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,OAAA,GAAU,IAAA;AAEd,EAAA,OAAO,OAAA,EAAS;AACd,IAAA,MAAM,SAAS,MAAM,QAAA,CAAY,KAAK,KAAA,EAAO,IAAA,EAAM,MAAM,OAAO,CAAA;AAEhE,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AAC5B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,cAAA,GAAiB,MAAM,QAAA,CAAS,MAAA,CAAO,MAAM,IAAI,CAAA;AAEvD,IAAA,IAAI,mBAAmB,KAAA,EAAO;AAC5B,MAAA;AAAA,IACF;AAEA,IAAA,OAAA,GAAU,OAAO,UAAA,CAAW,OAAA;AAC5B,IAAA,IAAA,EAAA;AAAA,EACF;AACF;;;ACjHO,SAAS,wBAAA,CACd,KACA,IAAA,EACqD;AACrD,EAAA,IAAI,CAAC,GAAA,CAAI,MAAA,IAAU,GAAA,CAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AACjD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,OAAO,KAAK,GAAA,CAAI,CAAC,QAAQ,UAAA,CAAW,GAAA,EAAK,GAAG,CAAC,CAAA;AAAA,EAC/C;AACA,EAAA,OAAO,UAAA,CAAW,KAAK,IAAI,CAAA;AAC7B;AAKO,SAAS,UAAA,CACd,KACA,GAAA,EACyB;AACzB,EAAA,IAAI,CAAC,IAAI,MAAA,EAAQ;AACf,IAAA,OAAO,GAAA;AAAA,EACT;AAEA,EAAA,MAAM,YAAA,GAAe,EAAE,GAAG,GAAA,EAAI;AAC9B,EAAA,KAAA,MAAW,KAAA,IAAS,IAAI,eAAA,EAAiB;AACvC,IAAA,IAAI,SAAS,YAAA,EAAc;AACzB,MAAA,YAAA,CAAa,KAAK,CAAA,GAAI,GAAA,CAAI,OAAO,YAAA,CAAa,YAAA,CAAa,KAAK,CAAC,CAAA;AAAA,IACnE;AAAA,EACF;AACA,EAAA,OAAO,YAAA;AACT;AAKA,eAAsB,2BAAA,CACpB,KACA,MAAA,EACyB;AACzB,EAAA,IAAI,CAAC,GAAA,CAAI,MAAA,IAAU,GAAA,CAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AACjD,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ;AAC7C,IAAA,MAAM,YAAA,GAAe,EAAE,GAAG,GAAA,EAAI;AAC9B,IAAA,KAAA,MAAW,KAAA,IAAS,IAAI,eAAA,EAAiB;AACvC,MAAA,IAAI,KAAA,IAAS,YAAA,IAAgB,YAAA,CAAa,KAAK,CAAA,EAAG;AAChD,QAAA,IAAI;AACF,UAAA,MAAM,KAAA,GAAQ,aAAa,KAAK,CAAA;AAChC,UAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,YAAA,YAAA,CAAa,KAAK,CAAA,GAAI,GAAA,CAAI,MAAA,CAAQ,aAAa,KAAK,CAAA;AAAA,UACtD;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,YAAA;AAAA,EACT,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACL,GAAG,MAAA;AAAA,IACH,IAAA,EAAM;AAAA,GACR;AACF;;;ACxDO,IAAM,gBAAN,MAAoB;AAAA,EACjB,OAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,mBAAA,GAAsB,CAAA;AAAA,EAE9B,WAAA,CAAY,OAAA,EAA0B,OAAA,GAA8B,EAAC,EAAG;AACtE,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,SAAA,uBAAgB,IAAA,EAAK;AAC1B,IAAA,IAAA,CAAK,OAAA,GAAU;AAAA,MACb,QAAA,EAAU,QAAQ,QAAA,IAAY,GAAA;AAAA;AAAA,MAC9B,OAAA,EAAS,QAAQ,OAAA,IAAW,GAAA;AAAA;AAAA,MAC5B,OAAA,EAAS,QAAQ,OAAA,IAAW,CAAA;AAAA,MAC5B,cAAA,EAAgB,OAAA,CAAQ,cAAA,KAAmB,MAAM;AAAA,MAAC,CAAA,CAAA;AAAA,MAClD,MAAA,EAAQ,QAAQ,MAAA,IAAU;AAAA,KAC5B;AAAA,EACF;AAAA,EAEA,MAAM,KAAA,GAAoC;AACxC,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAI;AAEvB,IAAA,IAAI;AAEF,MAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,IAAA,CAAK;AAAA,QACnC,IAAA,CAAK,QAAQ,IAAA,EAAK;AAAA,QAClB,IAAI,OAAA;AAAA,UAAiB,CAAC,CAAA,EAAG,MAAA,KACvB,UAAA,CAAW,MAAM,MAAA,CAAO,IAAI,KAAA,CAAM,sBAAsB,CAAC,CAAA,EAAG,IAAA,CAAK,QAAQ,OAAO;AAAA;AAClF,OACD,CAAA;AAED,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,MAAM,IAAI,MAAM,aAAa,CAAA;AAAA,MAC/B;AAGA,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,YAAA,EAAa;AAG5C,MAAA,IAAI,MAAA,GAAsC,SAAA;AAE1C,MAAA,IAAI,UAAU,OAAA,GAAU,CAAA,IAAK,UAAU,MAAA,GAAS,SAAA,CAAU,QAAQ,GAAA,EAAK;AACrE,QAAA,MAAA,GAAS,UAAA;AAAA,MACX;AAEA,MAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,eAAe,SAAA,CAAU,MAAA,KAAW,UAAU,KAAA,EAAO;AACrE,QAAA,MAAA,GAAS,WAAA;AAAA,MACX;AAEA,MAAA,MAAM,MAAA,GAA4B;AAAA,QAChC,MAAA;AAAA,QACA,OAAA,EAAS,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA;AAAA,QACtB,SAAA,sBAAe,IAAA,EAAK;AAAA,QACpB,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,SAAA;AAAA,UAChB,QAAQ,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,UAAU,OAAA,EAAQ;AAAA,UAC5C,OAAA,EAAS,KAAK,OAAA,CAAQ;AAAA;AACxB,OACF;AAGA,MAAA,IAAI,WAAW,SAAA,EAAW;AACxB,QAAA,IAAA,CAAK,mBAAA,GAAsB,CAAA;AAAA,MAC7B;AAGA,MAAA,IAAI,IAAA,CAAK,UAAA,EAAY,MAAA,KAAW,MAAA,CAAO,MAAA,EAAQ;AAC7C,QAAA,IAAA,CAAK,OAAA,CAAQ,eAAe,MAAM,CAAA;AAClC,QAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,IAAA;AAAA,UAClB,0BAA0B,IAAA,CAAK,UAAA,EAAY,MAAM,CAAA,IAAA,EAAO,OAAO,MAAM,CAAA;AAAA,SACvE;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,UAAA,GAAa,MAAA;AAClB,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,mBAAA,EAAA;AAEL,MAAA,MAAM,MAAA,GAA4B;AAAA,QAChC,MAAA,EAAQ,WAAA;AAAA,QACR,OAAA,EAAS,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA;AAAA,QACtB,SAAA,sBAAe,IAAA,EAAK;AAAA,QACpB,OAAA,EAAS;AAAA,UACP,WAAY,KAAA,CAAgB,OAAA;AAAA,UAC5B,QAAQ,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,UAAU,OAAA;AAAQ;AAC9C,OACF;AAEA,MAAA,IAAI,IAAA,CAAK,UAAA,EAAY,MAAA,KAAW,WAAA,EAAa;AAC3C,QAAA,IAAA,CAAK,OAAA,CAAQ,eAAe,MAAM,CAAA;AAClC,QAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,qBAAA,EAAuB,KAAK,CAAA;AAAA,MACxD;AAEA,MAAA,IAAA,CAAK,UAAA,GAAa,MAAA;AAClB,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA;AAAA,IACF;AAGA,IAAA,IAAA,CAAK,KAAA,EAAM,CAAE,KAAA,CAAM,CAAC,KAAA,KAAU;AAC5B,MAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,6BAAA,EAA+B,KAAK,CAAA;AAAA,IAChE,CAAC,CAAA;AAGD,IAAA,IAAA,CAAK,UAAA,GAAa,YAAY,MAAM;AAClC,MAAA,IAAA,CAAK,KAAA,EAAM,CAAE,KAAA,CAAM,CAAC,KAAA,KAAU;AAC5B,QAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,8BAAA,EAAgC,KAAK,CAAA;AAAA,MACjE,CAAC,CAAA;AAAA,IACH,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AAExB,IAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,wBAAA,EAA0B;AAAA,MACjD,QAAA,EAAU,KAAK,OAAA,CAAQ,QAAA;AAAA,MACvB,OAAA,EAAS,KAAK,OAAA,CAAQ;AAAA,KACvB,CAAA;AAAA,EACH;AAAA,EAEA,IAAA,GAAa;AACX,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,aAAA,CAAc,KAAK,UAAU,CAAA;AAC7B,MAAA,IAAA,CAAK,UAAA,GAAa,MAAA;AAClB,MAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,wBAAwB,CAAA;AAAA,IACnD;AAAA,EACF;AAAA,EAEA,aAAA,GAA+C;AAC7C,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA,EAEA,SAAA,GAAqB;AACnB,IAAA,OAAO,IAAA,CAAK,YAAY,MAAA,KAAW,SAAA;AAAA,EACrC;AAAA,EAEA,SAAA,GAAoB;AAClB,IAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,UAAU,OAAA,EAAQ;AAAA,EAC7C;AAAA,EAEA,sBAAA,GAAiC;AAC/B,IAAA,OAAO,IAAA,CAAK,mBAAA;AAAA,EACd;AAAA,EAEA,MAAM,cAAA,CAAe,WAAA,GAAc,GAAA,EAAuB;AACxD,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA,GAAY,WAAA,EAAa;AAC3C,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,KAAA,EAAM;AAEhC,MAAA,IAAI,MAAA,CAAO,WAAW,SAAA,EAAW;AAC/B,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,GAAI,CAAC,CAAA;AAAA,IAC1D;AAEA,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2CAAA,EAA8C,WAAW,CAAA,EAAA,CAAI,CAAA;AAAA,EAC/E;AACF;AC7IO,IAAM,gBAAA,GAAN,cAA+BM,YAAAA,CAAa;AAAA,EACzC,YAAA;AAAA,EACA,iBAAA;AAAA,EACA,kBAAA;AAAA,EACA,iBAA2B,EAAC;AAAA,EAC5B,kBAA4B,EAAC;AAAA,EAC7B,uBAAiC,EAAC;AAAA,EAClC,SAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAyC,EAAC;AAAA,EAC1C,QAAA;AAAA,EAER,WAAA,CAAY,OAAA,GAAwE,EAAC,EAAG;AACtF,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,SAAA,uBAAgB,IAAA,EAAK;AAC1B,IAAA,IAAA,CAAK,kBAAA,GAAqB,QAAQ,kBAAA,IAAsB,GAAA;AAExD,IAAA,IAAA,CAAK,YAAA,GAAe,KAAK,uBAAA,EAAwB;AACjD,IAAA,IAAA,CAAK,iBAAA,GAAoB,KAAK,4BAAA,EAA6B;AAC3D,IAAA,IAAA,CAAK,kBAAA,GAAqB,KAAK,6BAAA,EAA8B;AAE7D,IAAA,IAAI,QAAQ,kBAAA,EAAoB;AAC9B,MAAA,IAAA,CAAK,eAAA,CAAgB,QAAQ,kBAAkB,CAAA;AAAA,IACjD;AAAA,EACF;AAAA,EAEQ,uBAAA,GAAwC;AAC9C,IAAA,OAAO;AAAA,MACL,YAAA,EAAc,CAAA;AAAA,MACd,iBAAA,EAAmB,CAAA;AAAA,MACnB,aAAA,EAAe,CAAA;AAAA,MACf,cAAA,EAAgB,CAAA;AAAA,MAChB,YAAY,MAAA,CAAO,iBAAA;AAAA,MACnB,UAAA,EAAY,CAAA;AAAA,MACZ,gBAAA,EAAkB,CAAA;AAAA,MAClB,YAAA,EAAc,CAAA;AAAA,MACd,WAAA,EAAa,CAAA;AAAA,MACb,mBAAmB;AAAC,KACtB;AAAA,EACF;AAAA,EAEQ,4BAAA,GAAkD;AACxD,IAAA,OAAO;AAAA,MACL,gBAAA,EAAkB,CAAA;AAAA,MAClB,iBAAA,EAAmB,CAAA;AAAA,MACnB,eAAA,EAAiB,CAAA;AAAA,MACjB,gBAAA,EAAkB,CAAA;AAAA,MAClB,qBAAA,EAAuB,CAAA;AAAA,MACvB,eAAA,EAAiB;AAAA,KACnB;AAAA,EACF;AAAA,EAEQ,6BAAA,GAAoD;AAC1D,IAAA,OAAO;AAAA,MACL,iBAAA,EAAmB,CAAA;AAAA,MACnB,qBAAA,EAAuB,CAAA;AAAA,MACvB,sBAAA,EAAwB,CAAA;AAAA,MACxB,0BAAA,EAA4B,CAAA;AAAA,MAC5B,kBAAA,EAAoB,CAAA;AAAA,MACpB,SAAA,EAAW;AAAA,KACb;AAAA,EACF;AAAA,EAEA,WAAA,CAAY,OAAA,EAAiB,OAAA,EAAiB,OAAA,EAAkB,WAAW,KAAA,EAAa;AACtF,IAAA,IAAA,CAAK,YAAA,CAAa,YAAA,EAAA;AAElB,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAA,CAAK,YAAA,CAAa,iBAAA,EAAA;AAAA,IACpB,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,YAAA,CAAa,aAAA,EAAA;AAAA,IACpB;AAGA,IAAA,IAAA,CAAK,cAAA,CAAe,KAAK,OAAO,CAAA;AAChC,IAAA,IAAI,IAAA,CAAK,cAAA,CAAe,MAAA,GAAS,GAAA,EAAM;AACrC,MAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAAA,IAC5B;AAEA,IAAA,IAAA,CAAK,aAAa,UAAA,GAAa,IAAA,CAAK,IAAI,IAAA,CAAK,YAAA,CAAa,YAAY,OAAO,CAAA;AAC7E,IAAA,IAAA,CAAK,aAAa,UAAA,GAAa,IAAA,CAAK,IAAI,IAAA,CAAK,YAAA,CAAa,YAAY,OAAO,CAAA;AAC7E,IAAA,IAAA,CAAK,YAAA,CAAa,cAAA,GAAiB,IAAA,CAAK,gBAAA,CAAiB,KAAK,cAAc,CAAA;AAG5E,IAAA,IAAI,OAAA,GAAU,KAAK,kBAAA,EAAoB;AACrC,MAAA,IAAA,CAAK,YAAA,CAAa,WAAA,EAAA;AAClB,MAAA,IAAA,CAAK,IAAA,CAAK,WAAA,EAAa,EAAE,OAAA,EAAS,SAAS,CAAA;AAAA,IAC7C;AAGA,IAAA,MAAM,SAAA,GAAY,QAAQ,WAAA,EAAY;AACtC,IAAA,IAAA,CAAK,YAAA,CAAa,kBAAkB,SAAS,CAAA,GAAA,CAC1C,KAAK,YAAA,CAAa,iBAAA,CAAkB,SAAS,CAAA,IAAK,CAAA,IAAK,CAAA;AAG1D,IAAA,MAAM,kBAAkB,IAAA,CAAK,GAAA,KAAQ,IAAA,CAAK,SAAA,CAAU,SAAQ,IAAK,GAAA;AACjE,IAAA,IAAA,CAAK,YAAA,CAAa,gBAAA,GAAmB,IAAA,CAAK,YAAA,CAAa,YAAA,GAAe,cAAA;AAGtE,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAMC,UAAAA,GAAa,IAAA,CAAK,aAAA,CAAc,WAAW,CAAA,IAAgB,CAAA;AACjE,MAAA,IAAA,CAAK,aAAA,CAAc,WAAW,CAAA,GAAIA,UAAAA,GAAY,CAAA;AAAA,IAChD;AACA,IAAA,MAAM,SAAA,GAAa,IAAA,CAAK,aAAA,CAAc,WAAW,CAAA,IAAgB,CAAA;AACjE,IAAA,IAAA,CAAK,YAAA,CAAa,eAChB,IAAA,CAAK,YAAA,CAAa,eAAe,CAAA,GAAI,SAAA,GAAY,IAAA,CAAK,YAAA,CAAa,YAAA,GAAe,CAAA;AAAA,EACtF;AAAA,EAEA,gBAAA,CAAiB,WAAoB,cAAA,EAA+B;AAClE,IAAA,IAAA,CAAK,iBAAA,CAAkB,gBAAA,EAAA;AAEvB,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,IAAA,CAAK,iBAAA,CAAkB,iBAAA,EAAA;AAEvB,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,IAAA,CAAK,eAAA,CAAgB,KAAK,cAAc,CAAA;AACxC,QAAA,IAAI,IAAA,CAAK,eAAA,CAAgB,MAAA,GAAS,GAAA,EAAK;AACrC,UAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAAA,QAC7B;AACA,QAAA,IAAA,CAAK,iBAAA,CAAkB,qBAAA,GAAwB,IAAA,CAAK,gBAAA,CAAiB,KAAK,eAAe,CAAA;AAAA,MAC3F;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,iBAAA,CAAkB,gBAAA,EAAA;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,iBAAA,CACE,MAAA,EACA,QAAA,EACA,UAAA,GAAa,KAAA,EACP;AACN,IAAA,QAAQ,MAAA;AAAQ,MACd,KAAK,OAAA,EAAS;AACZ,QAAA,IAAA,CAAK,kBAAA,CAAmB,iBAAA,EAAA;AACxB,QAAA,IAAA,CAAK,kBAAA,CAAmB,kBAAA,EAAA;AACxB,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,QAAA,EAAU;AACb,QAAA,IAAA,CAAK,kBAAA,CAAmB,qBAAA,EAAA;AACxB,QAAA,IAAA,CAAK,kBAAA,CAAmB,qBAAqB,IAAA,CAAK,GAAA;AAAA,UAChD,CAAA;AAAA,UACA,IAAA,CAAK,mBAAmB,kBAAA,GAAqB;AAAA,SAC/C;AACA,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,UAAA,EAAY;AACf,QAAA,IAAA,CAAK,kBAAA,CAAmB,sBAAA,EAAA;AACxB,QAAA,IAAA,CAAK,kBAAA,CAAmB,qBAAqB,IAAA,CAAK,GAAA;AAAA,UAChD,CAAA;AAAA,UACA,IAAA,CAAK,mBAAmB,kBAAA,GAAqB;AAAA,SAC/C;AAEA,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,IAAA,CAAK,kBAAA,CAAmB,SAAA,EAAA;AACxB,UAAA,IAAA,CAAK,KAAK,UAAU,CAAA;AAAA,QACtB;AACA,QAAA;AAAA,MACF;AAAA;AAGF,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAA,CAAK,oBAAA,CAAqB,KAAK,QAAQ,CAAA;AACvC,MAAA,IAAI,IAAA,CAAK,oBAAA,CAAqB,MAAA,GAAS,GAAA,EAAK;AAC1C,QAAA,IAAA,CAAK,qBAAqB,KAAA,EAAM;AAAA,MAClC;AACA,MAAA,IAAA,CAAK,kBAAA,CAAmB,6BAA6B,IAAA,CAAK,gBAAA;AAAA,QACxD,IAAA,CAAK;AAAA,OACP;AAAA,IACF;AAAA,EACF;AAAA,EAEA,qBAAqB,KAAA,EAA8D;AACjF,IAAA,IAAA,CAAK,iBAAA,CAAkB,oBAAoB,KAAA,CAAM,MAAA;AACjD,IAAA,IAAA,CAAK,iBAAA,CAAkB,kBAAkB,KAAA,CAAM,IAAA;AAC/C,IAAA,IAAA,CAAK,iBAAA,CAAkB,kBACrB,KAAA,CAAM,KAAA,GAAQ,IAAI,IAAA,CAAK,YAAA,CAAa,YAAA,GAAe,KAAA,CAAM,KAAA,GAAQ,CAAA;AAAA,EACrE;AAAA,EAEA,eAAA,CAAgB,KAAa,KAAA,EAAsB;AACjD,IAAA,IAAA,CAAK,aAAA,CAAc,GAAG,CAAA,GAAI,KAAA;AAAA,EAC5B;AAAA,EAEA,qBAAA,CAAsB,GAAA,EAAa,KAAA,GAAQ,CAAA,EAAS;AAClD,IAAA,MAAM,OAAA,GAAW,IAAA,CAAK,aAAA,CAAc,GAAG,CAAA,IAAgB,CAAA;AACvD,IAAA,IAAA,CAAK,aAAA,CAAc,GAAG,CAAA,GAAI,OAAA,GAAU,KAAA;AAAA,EACtC;AAAA,EAEA,WAAA,GAA+B;AAC7B,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,EAAE,GAAG,IAAA,CAAK,YAAA,EAAa;AAAA,MAC9B,UAAA,EAAY,EAAE,GAAG,IAAA,CAAK,iBAAA,EAAkB;AAAA,MACxC,WAAA,EAAa,EAAE,GAAG,IAAA,CAAK,kBAAA,EAAmB;AAAA,MAC1C,MAAA,EAAQ;AAAA,QACN,WAAA,EAAa,QAAQ,WAAA,EAAY;AAAA,QACjC,QAAA,EAAU,QAAQ,QAAA,EAAS;AAAA,QAC3B,MAAA,EAAQ,QAAQ,MAAA,EAAO;AAAA,QACvB,SAAA,sBAAe,IAAA;AAAK,OACtB;AAAA,MACA,MAAA,EAAQ,EAAE,GAAG,IAAA,CAAK,aAAA;AAAc,KAClC;AAAA,EACF;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,YAAA,GAAe,KAAK,uBAAA,EAAwB;AACjD,IAAA,IAAA,CAAK,iBAAA,GAAoB,KAAK,4BAAA,EAA6B;AAC3D,IAAA,IAAA,CAAK,kBAAA,GAAqB,KAAK,6BAAA,EAA8B;AAC7D,IAAA,IAAA,CAAK,iBAAiB,EAAC;AACvB,IAAA,IAAA,CAAK,kBAAkB,EAAC;AACxB,IAAA,IAAA,CAAK,uBAAuB,EAAC;AAC7B,IAAA,IAAA,CAAK,gBAAgB,EAAC;AACtB,IAAA,IAAA,CAAK,SAAA,uBAAgB,IAAA,EAAK;AAAA,EAC5B;AAAA,EAEQ,iBAAiB,MAAA,EAA0B;AACjD,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,MAAMC,IAAAA,GAAM,OAAO,MAAA,CAAO,CAAC,KAAK,GAAA,KAAQ,GAAA,GAAM,KAAK,CAAC,CAAA;AACpD,IAAA,OAAOA,OAAM,MAAA,CAAO,MAAA;AAAA,EACtB;AAAA,EAEQ,gBAAgB,QAAA,EAAwB;AAC9C,IAAA,IAAA,CAAK,QAAA,GAAW,YAAY,MAAM;AAChC,MAAA,MAAM,QAAA,GAAW,KAAK,WAAA,EAAY;AAClC,MAAA,IAAA,CAAK,IAAA,CAAK,WAAW,QAAQ,CAAA;AAAA,IAC/B,GAAG,QAAQ,CAAA;AAAA,EACb;AAAA,EAEA,IAAA,GAAa;AACX,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,aAAA,CAAc,KAAK,QAAQ,CAAA;AAC3B,MAAA,IAAA,CAAK,QAAA,GAAW,MAAA;AAAA,IAClB;AAAA,EACF;AAAA;AAAA,EAGA,gBAAA,GAA2B;AACzB,IAAA,MAAM,OAAA,GAAU,KAAK,WAAA,EAAY;AACjC,IAAA,MAAM,QAAkB,EAAC;AAGzB,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,wDAAA,CAAA;AAAA,MACA,CAAA,+BAAA,CAAA;AAAA,MACA,CAAA,iBAAA,EAAoB,OAAA,CAAQ,KAAA,CAAM,YAAY,CAAA,CAAA;AAAA,MAC9C,CAAA,oEAAA,CAAA;AAAA,MACA,CAAA,wCAAA,CAAA;AAAA,MACA,CAAA,0CAAA,EAA6C,OAAA,CAAQ,KAAA,CAAM,cAAA,GAAiB,GAAI,CAAA,CAAA;AAAA,MAChF,CAAA,2CAAA,EAA8C,OAAA,CAAQ,KAAA,CAAM,UAAA,GAAa,GAAI,CAAA,CAAA;AAAA,MAC7E,iCAAkC,OAAA,CAAQ,KAAA,CAAM,iBAAiB,OAAA,CAAQ,KAAA,CAAM,eAAgB,GAAI,CAAA,CAAA;AAAA,MACnG,CAAA,gCAAA,EAAmC,OAAA,CAAQ,KAAA,CAAM,YAAY,CAAA,CAAA;AAAA,MAC7D,CAAA,kEAAA,CAAA;AAAA,MACA,CAAA,kCAAA,CAAA;AAAA,MACA,CAAA,sBAAA,EAAyB,OAAA,CAAQ,UAAA,CAAW,iBAAiB,CAAA,CAAA;AAAA,MAC7D,CAAA,yDAAA,CAAA;AAAA,MACA,CAAA,oCAAA,CAAA;AAAA,MACA,CAAA,0CAAA,EAA6C,OAAA,CAAQ,WAAA,CAAY,qBAAqB,CAAA,CAAA;AAAA,MACtF,CAAA,4CAAA,EAA+C,OAAA,CAAQ,WAAA,CAAY,sBAAsB,CAAA,CAAA;AAAA,MACzF,CAAA,8DAAA,CAAA;AAAA,MACA,CAAA,yCAAA;AAAA,KACF;AACA,IAAA,KAAA,CAAM,KAAK,CAAA,6BAAA,EAAgC,OAAA,CAAQ,MAAA,CAAO,WAAA,CAAY,SAAS,CAAA,CAAE,CAAA;AAEjF,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB;AACF;;;AC5RO,IAAM,kBAAN,MAAsB;AAAA,EACnB,OAAA;AAAA,EACA,aAA0B,EAAC;AAAA,EAC3B,OAAA;AAAA,EAER,WAAA,CAAY,OAAA,EAA0B,OAAA,GAAkC,EAAC,EAAG;AAC1E,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,OAAA,GAAU;AAAA,MACb,SAAA,EAAW,QAAQ,SAAA,IAAa,eAAA;AAAA,MAChC,MAAA,EAAQ,QAAQ,MAAA,IAAU,OAAA;AAAA,MAC1B,iBAAA,EAAmB,QAAQ,iBAAA,IAAqB,IAAA;AAAA,MAChD,MAAA,EAAQ,QAAQ,MAAA,IAAU;AAAA,KAC5B;AAAA,EACF;AAAA,EAEA,MAAM,UAAA,GAA4B;AAChC,IAAA,IAAI,IAAA,CAAK,QAAQ,MAAA,EAAQ;AACvB,MAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,wCAAwC,CAAA;AACjE,MAAA;AAAA,IACF;AAEA,IAAA,MAAMR,IAAAA,GAAM;AAAA,iCAAA,EACmB,IAAA,CAAK,QAAQ,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAYrD,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQA,IAAG,CAAA;AAC9B,MAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,IAAA,CAAK,qBAAqB,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA,OAAA,CAAS,CAAA;AAAA,IAC/E,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,UAAA,CAAW,CAAA,mCAAA,EAAuC,KAAA,CAAgB,OAAO,CAAA,CAAE,CAAA;AAAA,IACvF;AAAA,EACF;AAAA,EAEA,aAAa,SAAA,EAA4B;AAEvC,IAAA,MAAM,QAAA,GAAW,KAAK,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,KAAY,SAAA,CAAU,OAAO,CAAA;AAC5E,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,kBAAA,EAAqB,UAAU,OAAO,CAAA,iBAAA,EAAoB,SAAS,IAAI,CAAA,KAAA,EAAQ,UAAU,IAAI,CAAA;AAAA,OAC/F;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,UAAA,CAAW,KAAK,SAAS,CAAA;AAC9B,IAAA,IAAA,CAAK,UAAA,CAAW,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,OAAA,GAAU,EAAE,OAAO,CAAA;AAAA,EACtD;AAAA,EAEA,cAAc,UAAA,EAA+B;AAC3C,IAAA,UAAA,CAAW,QAAQ,CAAC,SAAA,KAAc,IAAA,CAAK,YAAA,CAAa,SAAS,CAAC,CAAA;AAAA,EAChE;AAAA,EAEA,MAAM,qBAAA,GAAqD;AACzD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAA;AAAA,MAChC,CAAA,cAAA,EAAiB,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA,qBAAA;AAAA,KACzC;AAEA,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,MAC/B,GAAG,GAAA;AAAA,MACH,UAAA,EAAY,IAAI,IAAA,CAAK,GAAA,CAAI,UAAU;AAAA,KACrC,CAAE,CAAA;AAAA,EACJ;AAAA,EAEA,MAAM,oBAAA,GAA6C;AACjD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,qBAAA,EAAsB;AAClD,IAAA,MAAM,gBAAA,GAAmB,IAAI,GAAA,CAAI,QAAA,CAAS,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAC,CAAA;AAE/D,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,gBAAA,CAAiB,GAAA,CAAI,CAAA,CAAE,OAAO,CAAC,CAAA;AAAA,EACvE;AAAA,EAEQ,kBAAkB,SAAA,EAA8B;AACtD,IAAA,MAAMS,OAAAA,GAAS,UAAQ,QAAa,CAAA;AACpC,IAAA,MAAM,UAAU,CAAA,EAAG,SAAA,CAAU,EAAE,CAAA,CAAA,EAAI,SAAA,CAAU,OAAO,CAAA,CAAA,EAAI,SAAA,CAAU,IAAI,CAAA,CAAA,EAAI,SAAA,CAAU,GAAG,QAAA,EAAU,IAAI,SAAA,CAAU,IAAA,CAAK,UAAU,CAAA,CAAA;AAC9H,IAAA,OAAOA,OAAAA,CAAO,WAAW,QAAQ,CAAA,CAAE,OAAO,OAAO,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,EACjE;AAAA,EAEA,MAAM,GAAG,aAAA,EAAuC;AAC9C,IAAA,MAAM,KAAK,UAAA,EAAW;AAEtB,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,oBAAA,EAAqB;AAChD,IAAA,MAAM,KAAA,GAAQ,gBAAgB,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,IAAW,aAAa,CAAA,GAAI,OAAA;AAElF,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,8BAA8B,CAAA;AACvD,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,IAAA,CAAK,CAAA,MAAA,EAAS,KAAA,CAAM,MAAM,CAAA,mBAAA,CAAqB,CAAA;AAEnE,IAAA,KAAA,MAAW,aAAa,KAAA,EAAO;AAC7B,MAAA,MAAM,IAAA,CAAK,YAAA,CAAa,SAAA,EAAW,IAAI,CAAA;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,aAAA,EAAsC;AAC/C,IAAA,MAAM,KAAK,UAAA,EAAW;AAEtB,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,qBAAA,EAAsB;AAClD,IAAA,MAAM,QAAA,GAAW,SAAS,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,OAAA,GAAU,aAAa,CAAA,CAAE,OAAA,EAAQ;AAE3E,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,yBAAyB,CAAA;AAClD,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,IAAA,CAAK,CAAA,MAAA,EAAS,QAAA,CAAS,MAAM,CAAA,qBAAA,CAAuB,CAAA;AAExE,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,MAAM,SAAA,GAAY,KAAK,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,KAAY,OAAA,CAAQ,OAAO,CAAA;AAC3E,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,UAAA,EAAa,OAAA,CAAQ,OAAO,CAAA,sBAAA,CAAwB,CAAA;AAAA,MACtE;AAEA,MAAA,MAAM,IAAA,CAAK,YAAA,CAAa,SAAA,EAAW,MAAM,CAAA;AAAA,IAC3C;AAAA,EACF;AAAA,EAEA,MAAM,MAAA,GAAwB;AAC5B,IAAA,MAAM,KAAK,EAAA,EAAG;AAAA,EAChB;AAAA,EAEA,MAAM,QAAA,CAAS,KAAA,GAAQ,CAAA,EAAkB;AACvC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,qBAAA,EAAsB;AAElD,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,2BAA2B,CAAA;AACpD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,cAAc,IAAA,CAAK,GAAA,CAAI,GAAG,QAAA,CAAS,MAAA,GAAS,QAAQ,CAAC,CAAA;AAC3D,IAAA,MAAM,gBAAgB,WAAA,IAAe,CAAA,GAAI,QAAA,CAAS,WAAW,EAAG,OAAA,GAAU,CAAA;AAE1E,IAAA,MAAM,IAAA,CAAK,KAAK,aAAa,CAAA;AAAA,EAC/B;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,EACnB;AAAA,EAEA,MAAM,OAAA,GAAyB;AAC7B,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,MAAM,KAAK,MAAA,EAAO;AAAA,EACpB;AAAA,EAEA,MAAc,YAAA,CAAa,SAAA,EAAsB,SAAA,EAAyC;AACxF,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAI;AACvB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,iBAAA,CAAkB,SAAS,CAAA;AAEjD,IAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,IAAA;AAAA,MAClB,CAAA,EAAG,SAAA,KAAc,IAAA,GAAO,SAAA,GAAY,WAAW,cAAc,SAAA,CAAU,OAAO,CAAA,EAAA,EAAK,SAAA,CAAU,IAAI,CAAA;AAAA,KACnG;AAEA,IAAA,IAAI,IAAA,CAAK,QAAQ,MAAA,EAAQ;AACvB,MAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,IAAA,CAAK,CAAA,eAAA,EAAkB,SAAS,CAAA,WAAA,EAAc,SAAA,CAAU,OAAO,CAAA,CAAE,CAAA;AACrF,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,OAAA,CAAQ,gBAAA,EAAiB;AAExD,IAAA,IAAI;AAEF,MAAA,IAAI,SAAA,KAAc,MAAA,IAAU,IAAA,CAAK,OAAA,CAAQ,iBAAA,EAAmB;AAC1D,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAA;AAAA,UACjC,CAAA,qBAAA,EAAwB,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA,kBAAA,CAAA;AAAA,UAC9C,CAAC,UAAU,OAAO;AAAA,SACpB;AAEA,QAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,aAAa,QAAA,EAAU;AAC1C,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,CAAA,gCAAA,EAAmC,UAAU,OAAO,CAAA,uCAAA;AAAA,WACtD;AAAA,QACF;AAAA,MACF;AAGA,MAAA,MAAM,SAAA,CAAU,SAAS,CAAA,CAAE,IAAA,CAAK,OAAO,CAAA;AAGvC,MAAA,IAAI,cAAc,IAAA,EAAM;AACtB,QAAA,MAAM,KAAK,OAAA,CAAQ,OAAA;AAAA,UACjB,CAAA,YAAA,EAAe,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA,+EAAA,CAAA;AAAA,UACrC;AAAA,YACE,SAAA,CAAU,EAAA;AAAA,YACV,SAAA,CAAU,OAAA;AAAA,YACV,SAAA,CAAU,IAAA;AAAA,gCACN,IAAA,EAAK;AAAA,YACT,IAAA,CAAK,KAAI,GAAI,KAAA;AAAA,YACb;AAAA,WACF;AAAA,UACA,EAAE,WAAA;AAAY,SAChB;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM,KAAK,OAAA,CAAQ,OAAA;AAAA,UACjB,CAAA,YAAA,EAAe,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA,kBAAA,CAAA;AAAA,UACrC,CAAC,UAAU,OAAO,CAAA;AAAA,UAClB,EAAE,WAAA;AAAY,SAChB;AAAA,MACF;AAEA,MAAA,MAAM,YAAY,MAAA,EAAO;AAEzB,MAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,IAAA;AAAA,QAClB,CAAA,EAAG,SAAA,KAAc,IAAA,GAAO,WAAA,GAAc,UAAU,CAAA,WAAA,EAAc,SAAA,CAAU,OAAO,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAI,GAAI,KAAK,CAAA,EAAA;AAAA,OAC1G;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,YAAY,QAAA,EAAS;AAE3B,MAAA,MAAM,MAAA,GAAS,SAAA,KAAc,IAAA,GAAO,KAAA,GAAQ,QAAA;AAC5C,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,aAAa,MAAM,CAAA,WAAA,EAAc,UAAU,OAAO,CAAA,EAAA,EAAM,MAAgB,OAAO,CAAA;AAAA,OACjF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,MAAA,GAIH;AACD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,qBAAA,EAAsB;AAClD,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,oBAAA,EAAqB;AAChD,IAAA,MAAM,OAAA,GAAU,SAAS,MAAA,GAAS,CAAA,GAAI,SAAS,EAAA,CAAG,EAAE,EAAG,OAAA,GAAU,IAAA;AAEjE,IAAA,OAAO,EAAE,QAAA,EAAU,OAAA,EAAS,OAAA,EAAQ;AAAA,EACtC;AAAA,EAEA,MAAM,QAAA,GAA0D;AAC9D,IAAA,MAAM,SAAmB,EAAC;AAG1B,IAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AACjC,IAAA,KAAA,MAAW,SAAA,IAAa,KAAK,UAAA,EAAY;AACvC,MAAA,IAAI,QAAA,CAAS,GAAA,CAAI,SAAA,CAAU,OAAO,CAAA,EAAG;AACnC,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,6BAAA,EAAgC,SAAA,CAAU,OAAO,CAAA,CAAE,CAAA;AAAA,MACjE;AACA,MAAA,QAAA,CAAS,GAAA,CAAI,UAAU,OAAO,CAAA;AAAA,IAChC;AAGA,IAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAChE,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,cAAA,CAAe,QAAQ,CAAA,EAAA,EAAK;AAC9C,MAAA,IAAI,eAAe,CAAC,CAAA,GAAK,eAAe,CAAA,GAAI,CAAC,IAAK,CAAA,EAAG;AACnD,QAAA,MAAA,CAAO,IAAA;AAAA,UACL,CAAA,kCAAA,EAAqC,eAAe,CAAA,GAAI,CAAC,CAAC,CAAA,KAAA,EAAQ,cAAA,CAAe,CAAC,CAAC,CAAA;AAAA,SACrF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,QAAQ,iBAAA,EAAmB;AAClC,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,qBAAA,EAAsB;AAElD,MAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,QAAA,MAAM,SAAA,GAAY,KAAK,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,KAAY,OAAA,CAAQ,OAAO,CAAA;AAE3E,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,UAAA,EAAa,OAAA,CAAQ,OAAO,CAAA,sCAAA,CAAwC,CAAA;AAChF,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,iBAAA,CAAkB,SAAS,CAAA;AACxD,QAAA,IAAI,eAAA,KAAoB,QAAQ,QAAA,EAAU;AACxC,UAAA,MAAA,CAAO,IAAA;AAAA,YACL,CAAA,gCAAA,EAAmC,OAAA,CAAQ,OAAO,CAAA,EAAA,EAAK,QAAQ,IAAI,CAAA,kDAAA;AAAA,WACrE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,OAAO,MAAA,KAAW,CAAA;AAAA,MACzB;AAAA,KACF;AAAA,EACF;AACF;AC1QO,IAAM,kBAAA,GAAN,cAAiCH,YAAAA,CAAa;AAAA,EAC3C,MAAA,uBAA4C,GAAA,EAAI;AAAA,EAChD,cAKH,EAAC;AAAA,EACE,UAAA,uBAAyC,GAAA,EAAI;AAAA,EAC7C,kBAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EAER,WAAA,CACE,OAAA,EACA,OAAA,GAII,EAAC,EACL;AACA,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,kBAAA,GAAqB,QAAQ,kBAAA,IAAsB,GAAA;AACxD,IAAA,IAAA,CAAK,SAAA,GAAY,QAAQ,SAAA,IAAa,GAAA;AACtC,IAAA,IAAA,CAAK,OAAA,GAAU,QAAQ,OAAA,IAAW,IAAA;AAAA,EACpC;AAAA,EAEA,UAAA,CAAW,SAAA,EAAmB,QAAA,GAAoC,IAAI,MAAA,EAAyB;AAC7F,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,OAAO,EAAA;AAAA,IACT;AAEA,IAAA,MAAM,EAAA,GAAK,KAAK,eAAA,EAAgB;AAChC,IAAA,MAAM,KAAA,GAA0B;AAAA,MAC9B,EAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA,EAAW,YAAY,GAAA,EAAI;AAAA,MAC3B,QAAA;AAAA,MACA,MAAA,EAAQ,SAAA;AAAA,MACR,MAAA;AAAA,MACA,UAAU;AAAC,KACb;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,EAAA,EAAI,KAAK,CAAA;AAGzB,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA;AAC1C,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,WAAA,CAAY,QAAA,CAAS,KAAK,EAAE,CAAA;AAAA,MAC9B;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,IAAA,GAAO,IAAA,CAAK,SAAA,EAAW;AACrC,MAAA,MAAM,YAAA,GAAe,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,CAAA,CAClD,IAAA,CAAK,CAAC,GAAG,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,GAAY,CAAA,CAAE,SAAS,CAAA,CAChD,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,GAAY,GAAG,CAAC,CAAA;AAE5C,MAAA,YAAA,CAAa,OAAA,CAAQ,CAAC,CAACI,GAAE,MAAM,IAAA,CAAK,MAAA,CAAO,MAAA,CAAOA,GAAE,CAAC,CAAA;AAAA,IACvD;AAEA,IAAA,IAAA,CAAK,IAAA,CAAK,cAAc,KAAK,CAAA;AAC7B,IAAA,OAAO,EAAA;AAAA,EACT;AAAA,EAEA,QAAA,CAAS,IAAY,KAAA,EAAqB;AACxC,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,CAAC,EAAA,EAAI;AACxB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAChC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA;AAAA,IACF;AAEA,IAAA,KAAA,CAAM,OAAA,GAAU,YAAY,GAAA,EAAI;AAChC,IAAA,KAAA,CAAM,QAAA,GAAW,KAAA,CAAM,OAAA,GAAU,KAAA,CAAM,SAAA;AACvC,IAAA,KAAA,CAAM,MAAA,GAAS,QAAQ,QAAA,GAAW,WAAA;AAClC,IAAA,KAAA,CAAM,KAAA,GAAQ,KAAA;AAGd,IAAA,IAAI,KAAA,CAAM,WAAW,IAAA,CAAK,kBAAA,IAAsB,MAAM,SAAA,CAAU,QAAA,CAAS,OAAO,CAAA,EAAG;AACjF,MAAA,MAAM,SAAA,GAAY;AAAA,QAChB,KAAA,EAAQ,KAAA,CAAM,QAAA,CAAS,KAAK,CAAA,IAAgB,EAAA;AAAA,QAC5C,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,SAAA,sBAAe,IAAA,EAAK;AAAA,QACpB,MAAA,EAAQ,KAAA,CAAM,QAAA,CAAS,QAAQ;AAAA,OACjC;AAEA,MAAA,IAAA,CAAK,WAAA,CAAY,KAAK,SAAS,CAAA;AAC/B,MAAA,IAAA,CAAK,IAAA,CAAK,aAAa,SAAS,CAAA;AAGhC,MAAA,IAAI,IAAA,CAAK,WAAA,CAAY,MAAA,GAAS,GAAA,EAAK;AACjC,QAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,IAAI,CAAA;AAAA,MAChD;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,EAC7B;AAAA,EAEA,MAAM,YAAA,CAAaV,IAAAA,EAAa,MAAA,EAAiD;AAC/E,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,IAAI,UAAA;AAGJ,MAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,IAAA,KAAS,YAAA,EAAc;AACtC,QAAA,UAAA,GAAa,2CAA2CA,IAAG,CAAA,CAAA;AAAA,MAC7D,CAAA,MAAA,IAAW,IAAA,CAAK,OAAA,CAAQ,IAAA,KAAS,OAAA,EAAS;AACxC,QAAA,UAAA,GAAa,uBAAuBA,IAAG,CAAA,CAAA;AAAA,MACzC,CAAA,MAAO;AACL,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,YAAY,MAAM,CAAA;AAE1D,MAAA,IAAI,MAAA,CAAO,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AAC1B,QAAA,MAAM,OAAO,IAAA,CAAK,kBAAA,CAAmB,MAAA,CAAO,IAAA,CAAK,CAAC,CAA4B,CAAA;AAC9E,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAIA,IAAAA,EAAK,IAAI,CAAA;AAC7B,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AAEd,MAAA,IAAA,CAAK,KAAK,cAAA,EAAgB,EAAE,GAAA,EAAAA,IAAAA,EAAK,OAAO,CAAA;AAAA,IAC1C;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,mBAAmB,MAAA,EAAmD;AAC5E,IAAA,IAAI;AACF,MAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,IAAA,KAAS,YAAA,EAAc;AACtC,QAAA,MAAM,QAAA,GAAY,MAAA,CAAO,YAAY,CAAA,IAAe,MAAA;AACpD,QAAA,MAAM,OAAO,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,QAAA,CAAS,CAAC,CAAA,GAAI,QAAA;AAErD,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,KAAK,KAAA,IAAS,EAAA;AAAA,UACrB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,QAAQ,IAAI,CAAA;AAAA,UACtC,IAAA,EAAM,IAAA,CAAK,IAAA,GAAO,YAAY,CAAA,IAAK,CAAA;AAAA,UACnC,IAAA,EAAM,IAAA,CAAK,IAAA,GAAO,WAAW,CAAA,IAAK,CAAA;AAAA,UAClC,KAAA,EAAO,IAAA,CAAK,IAAA,GAAO,YAAY,CAAA,IAAK,CAAA;AAAA,UACpC,UAAA,EAAY,IAAA,CAAK,IAAA,GAAO,mBAAmB,CAAA,IAAK,CAAA;AAAA,UAChD,UAAA,EAAY,IAAA,CAAK,IAAA,GAAO,aAAa,CAAA,IAAK;AAAA,SAC5C;AAAA,MACF,CAAA,MAAA,IAAW,IAAA,CAAK,OAAA,CAAQ,IAAA,KAAS,OAAA,EAAS;AACxC,QAAA,MAAM,OAAO,OAAO,MAAA,KAAW,WAAW,IAAA,CAAK,KAAA,CAAM,MAAgB,CAAA,GAAI,MAAA;AACzE,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,IAAe,EAAC;AAExC,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,EAAA;AAAA,UACP,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,UACzB,IAAA,EAAM,UAAA,CAAW,SAAA,EAAW,UAAA,IAAc,CAAA;AAAA,UAC1C,IAAA,EAAM,UAAA,CAAW,KAAA,EAAO,sBAAA,IAA0B,CAAA;AAAA,UAClD,KAAA,EAAO;AAAA,SACT;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,kBAAA,CAAmB,QAAA,GAAmB,IAAA,EAAuC;AACjF,IAAA,MAAM,GAAA,GAAM,YAAY,GAAA,EAAI;AAC5B,IAAA,MAAM,SAAS,GAAA,GAAM,QAAA;AAGrB,IAAA,MAAM,eAAe,KAAA,CAAM,IAAA,CAAK,KAAK,MAAA,CAAO,MAAA,EAAQ,CAAA,CAAE,MAAA;AAAA,MACpD,CAAC,KAAA,KAAU,KAAA,CAAM,SAAA,GAAY,MAAA,IAAU,MAAM,MAAA,KAAW;AAAA,KAC1D;AAGA,IAAA,MAAM,cAAA,uBAAqB,GAAA,EAAkD;AAC7E,IAAA,IAAI,SAAA,GAAY,CAAA;AAEhB,IAAA,YAAA,CAAa,OAAA,CAAQ,CAAC,KAAA,KAAU;AAC9B,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,GAAA,CAAI,KAAA,CAAM,SAAS,KAAK,EAAE,SAAA,EAAW,CAAA,EAAG,KAAA,EAAO,CAAA,EAAE;AAC9E,MAAA,KAAA,CAAM,SAAA,IAAa,MAAM,QAAA,IAAY,CAAA;AACrC,MAAA,KAAA,CAAM,KAAA,IAAS,CAAA;AACf,MAAA,cAAA,CAAe,GAAA,CAAI,KAAA,CAAM,SAAA,EAAW,KAAK,CAAA;AACzC,MAAA,SAAA,IAAa,MAAM,QAAA,IAAY,CAAA;AAAA,IACjC,CAAC,CAAA;AAGD,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,IAAA,CAAK,cAAA,CAAe,OAAA,EAAS,CAAA,CACpD,GAAA,CAAI,CAAC,CAAC,SAAA,EAAW,KAAK,CAAA,MAAO;AAAA,MAC5B,SAAA;AAAA,MACA,eAAA,EAAiB,KAAA,CAAM,SAAA,GAAY,KAAA,CAAM,KAAA;AAAA,MACzC,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,MAAA,EAAS,KAAA,CAAM,SAAA,GAAY,SAAA,GAAa;AAAA,KAC1C,CAAE,CAAA,CACD,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,MAAA,GAAS,CAAA,CAAE,MAAM,CAAA,CAClC,KAAA,CAAM,GAAG,EAAE,CAAA;AAGd,IAAA,MAAM,kBAA4B,EAAC;AAGnC,IAAA,MAAM,WAAA,GAAc,KAAK,WAAA,CAAY,MAAA;AAAA,MACnC,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,WAAA,GAAc,QAAA,CAAS,QAAQ,CAAA,IAAK,CAAA,CAAE,QAAA,GAAW;AAAA,KAClE;AACA,IAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,MAAA,eAAA,CAAgB,KAAK,iEAAiE,CAAA;AAAA,IACxF;AAGA,IAAA,MAAM,WAAA,uBAAkB,GAAA,EAAoB;AAC5C,IAAA,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAA,KAAM;AAC9B,MAAA,MAAM,UAAA,GAAa,EAAE,KAAA,CAAM,UAAA,CAAW,QAAQ,GAAG,CAAA,CAAE,UAAA,CAAW,MAAA,EAAQ,GAAG,CAAA;AACzE,MAAA,WAAA,CAAY,IAAI,UAAA,EAAA,CAAa,WAAA,CAAY,IAAI,UAAU,CAAA,IAAK,KAAK,CAAC,CAAA;AAAA,IACpE,CAAC,CAAA;AAED,IAAA,MAAM,iBAAA,GAAoB,KAAA,CAAM,IAAA,CAAK,WAAA,CAAY,SAAS,CAAA,CAAE,MAAA,CAAO,CAAC,GAAGK,MAAK,CAAA,KAAMA,SAAQ,EAAE,CAAA;AAE5F,IAAA,IAAI,iBAAA,CAAkB,SAAS,CAAA,EAAG;AAChC,MAAA,eAAA,CAAgB,IAAA;AAAA,QACd;AAAA,OACF;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,YAAA,EAAa;AAC5C,IAAA,IAAI,SAAA,CAAU,UAAU,CAAA,EAAG;AACzB,MAAA,eAAA,CAAgB,IAAA;AAAA,QACd,CAAA,6EAAA,EAAgF,UAAU,KAAK,CAAA,EAAA;AAAA,OACjG;AAAA,IACF;AAGA,IAAA,MAAM,mBAAmB,YAAA,CAAa,MAAA;AAAA,MACpC,CAAC,MAAM,CAAA,CAAE,SAAA,CAAU,SAAS,aAAa,CAAA,IAAA,CAAM,CAAA,CAAE,QAAA,IAAY,CAAA,IAAK;AAAA,KACpE;AACA,IAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,MAAA,eAAA,CAAgB,IAAA;AAAA,QACd;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,WAAA,EAAa,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,GAAG,CAAA;AAAA,MACvC,YAAY,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA;AAAA,MAC/C,WAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,YAAY,OAAA,EAA2C;AACrD,IAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA;AAEhD,IAAA,OAAA,CAAQ,KAAA,GAAQ,OACdL,IAAAA,EACA,MAAA,EACA,OAAA,KAC4B;AAC5B,MAAA,MAAM,OAAA,GAAU,KAAK,UAAA,CAAW,OAAA,EAAS,EAAE,GAAA,EAAAA,IAAAA,EAAK,QAAQ,CAAA;AAExD,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,aAAA,CAAiBA,IAAAA,EAAK,QAAQ,OAAO,CAAA;AAC1D,QAAA,IAAA,CAAK,SAAS,OAAO,CAAA;AAGrB,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AACrC,QAAA,IAAI,KAAA,EAAO,QAAA,IAAY,KAAA,CAAM,QAAA,GAAW,KAAK,kBAAA,EAAoB;AAC/D,UAAA,IAAA,CAAK,YAAA,CAAaA,IAAAA,EAAK,MAAM,CAAA,CAAE,MAAM,MAAM;AAAA,UAE3C,CAAC,CAAA;AAAA,QACH;AAEA,QAAA,OAAO,MAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,QAAA,CAAS,SAAS,KAAc,CAAA;AACrC,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAA;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAClB,IAAA,IAAA,CAAK,cAAc,EAAC;AACpB,IAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AAAA,EACxB;AAAA,EAEA,MAAA,GAAe;AACb,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,EACjB;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AAAA,EACjB;AAAA,EAEA,SAAA,GAAqB;AACnB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEQ,eAAA,GAA0B;AAChC,IAAA,OAAO,CAAA,MAAA,EAAS,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AAAA,EACvE;AAAA,EAEA,UAAU,MAAA,EAKa;AACrB,IAAA,IAAI,SAAS,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA;AAE5C,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAI,OAAO,SAAA,EAAW;AACpB,QAAA,MAAA,GAAS,MAAA,CAAO,OAAO,CAAC,CAAA,KAAM,EAAE,SAAA,CAAU,QAAA,CAAS,MAAA,CAAO,SAAU,CAAC,CAAA;AAAA,MACvE;AACA,MAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,QAAA,MAAA,GAAS,OAAO,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,OAAO,MAAM,CAAA;AAAA,MAC1D;AACA,MAAA,IAAI,MAAA,CAAO,gBAAgB,MAAA,EAAW;AACpC,QAAA,MAAA,GAAS,MAAA,CAAO,OAAO,CAAC,CAAA,KAAA,CAAO,EAAE,QAAA,IAAY,CAAA,KAAM,OAAO,WAAY,CAAA;AAAA,MACxE;AACA,MAAA,IAAI,MAAA,CAAO,WAAW,MAAA,EAAW;AAC/B,QAAA,MAAA,GAAS,OAAO,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,OAAO,MAAM,CAAA;AAAA,MAC1D;AAAA,IACF;AAEA,IAAA,OAAO,MAAA,CAAO,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,SAAA,GAAY,EAAE,SAAS,CAAA;AAAA,EACxD;AAAA,EAEA,cAAA,CAAe,QAAQ,EAAA,EAA6B;AAClD,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,CAAC,KAAK,CAAA;AAAA,EACtC;AAAA,EAEA,YAAA,GAAuB;AACrB,IAAA,MAAM,SAAS,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA;AAC9C,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,EACvC;AAAA,EAEA,aAAa,IAAA,EAAoB;AAC/B,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC9B,MAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,KAAU;AACxB,QAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,KAAK,CAAA;AAAA,MACjC,CAAC,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA6B,KAAA,CAAgB,OAAO,CAAA,CAAE,CAAA;AAAA,IACxE;AAAA,EACF;AACF;ACjYO,IAAM,cAAA,GAAN,cAA6BM,YAAAA,CAAa;AAAA,EACrC,MAAA,uBAAa,GAAA,EAA8B;AAAA,EAC3C,OAAA,GAAU,IAAA;AAAA,EACV,SAAA;AAAA,EAEV,WAAA,CAAY,SAAA,GAAY,GAAA,EAAQ,OAAA,GAAU,IAAA,EAAM;AAC9C,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA,EAEA,MAAA,GAAe;AACb,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,EACjB;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AAAA,EACjB;AAAA,EAEA,SAAA,GAAqB;AACnB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEU,eAAA,GAA0B;AAClC,IAAA,OAAO,CAAA,MAAA,EAAS,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AAAA,EACvE;AAAA,EAEA,UAAU,MAAA,EAKa;AACrB,IAAA,IAAI,SAAS,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA;AAE5C,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAI,OAAO,SAAA,EAAW;AACpB,QAAA,MAAA,GAAS,MAAA,CAAO,OAAO,CAAC,CAAA,KAAM,EAAE,SAAA,CAAU,QAAA,CAAS,MAAA,CAAO,SAAU,CAAC,CAAA;AAAA,MACvE;AACA,MAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,QAAA,MAAA,GAAS,OAAO,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,OAAO,MAAM,CAAA;AAAA,MAC1D;AACA,MAAA,IAAI,MAAA,CAAO,gBAAgB,MAAA,EAAW;AACpC,QAAA,MAAA,GAAS,MAAA,CAAO,OAAO,CAAC,CAAA,KAAA,CAAO,EAAE,QAAA,IAAY,CAAA,KAAM,OAAO,WAAY,CAAA;AAAA,MACxE;AACA,MAAA,IAAI,MAAA,CAAO,WAAW,MAAA,EAAW;AAC/B,QAAA,MAAA,GAAS,OAAO,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,OAAO,MAAM,CAAA;AAAA,MAC1D;AAAA,IACF;AAEA,IAAA,OAAO,MAAA,CAAO,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,SAAA,GAAY,EAAE,SAAS,CAAA;AAAA,EACxD;AAAA,EAEA,YAAA,GAAuB;AACrB,IAAA,MAAM,SAAS,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA;AAC9C,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,EACvC;AAAA,EAEA,aAAa,IAAA,EAAoB;AAC/B,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC9B,MAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,KAAU;AACxB,QAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,KAAK,CAAA;AAAA,MACjC,CAAC,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA6B,KAAA,CAAgB,OAAO,CAAA,CAAE,CAAA;AAAA,IACxE;AAAA,EACF;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAAA,EACpB;AACF,CAAA;;;ACnFO,IAAM,oBAAA,GAAN,cAAmC,cAAA,CAAe;AAAA,EACvD,UAAA,CAAW,SAAA,EAAmB,QAAA,GAAoC,IAAI,MAAA,EAAyB;AAC7F,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,OAAO,EAAA;AAAA,IACT;AAEA,IAAA,MAAM,EAAA,GAAK,KAAK,eAAA,EAAgB;AAChC,IAAA,MAAM,KAAA,GAA0B;AAAA,MAC9B,EAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA,EAAW,YAAY,GAAA,EAAI;AAAA,MAC3B,QAAA;AAAA,MACA,MAAA,EAAQ,SAAA;AAAA,MACR,MAAA;AAAA,MACA,UAAU;AAAC,KACb;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,EAAA,EAAI,KAAK,CAAA;AAGzB,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA;AAC1C,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,WAAA,CAAY,QAAA,CAAS,KAAK,EAAE,CAAA;AAAA,MAC9B;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,IAAA,GAAO,IAAA,CAAK,SAAA,EAAW;AACrC,MAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,IACxB;AAEA,IAAA,IAAA,CAAK,IAAA,CAAK,cAAc,KAAK,CAAA;AAC7B,IAAA,OAAO,EAAA;AAAA,EACT;AAAA,EAEA,QAAA,CAAS,IAAY,KAAA,EAAqB;AACxC,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,CAAC,EAAA,EAAI;AACxB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAChC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA;AAAA,IACF;AAEA,IAAA,KAAA,CAAM,OAAA,GAAU,YAAY,GAAA,EAAI;AAChC,IAAA,KAAA,CAAM,QAAA,GAAW,KAAA,CAAM,OAAA,GAAU,KAAA,CAAM,SAAA;AACvC,IAAA,KAAA,CAAM,MAAA,GAAS,QAAQ,QAAA,GAAW,WAAA;AAClC,IAAA,KAAA,CAAM,KAAA,GAAQ,KAAA;AAEd,IAAA,IAAA,CAAK,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,EAC7B;AAAA,EAEU,gBAAA,GAAyB;AACjC,IAAA,MAAM,YAAA,GAAe,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,CAAA,CAClD,IAAA,CAAK,CAAC,GAAG,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,GAAY,CAAA,CAAE,SAAS,CAAA,CAChD,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,GAAY,GAAG,CAAC,CAAA;AAE5C,IAAA,YAAA,CAAa,OAAA,CAAQ,CAAC,CAAC,EAAE,MAAM,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,EAAE,CAAC,CAAA;AAAA,EACvD;AAAA,EAEA,SAAS,EAAA,EAA0C;AACjD,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAAA,EAC3B;AAAA,EAEA,eAAe,QAAA,EAAsC;AACnD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,QAAQ,CAAA;AACvC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,OAAO,MAAA,CAAO,QAAA,CAAS,GAAA,CAAI,CAAC,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,EAAE,CAAC,CAAA,CAAE,MAAA,CAAO,CAAC,KAAA,KAAU,UAAU,MAAS,CAAA;AAAA,EAC/F;AAAA,EAEA,kBAAkB,MAAA,EAAyC;AACzD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA;AACnC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,cAAA,GAAiB,CAAC,KAAA,KAA8C;AACpE,MAAA,MAAM,QAAA,GAAW,MAAM,QAAA,CACpB,GAAA,CAAI,CAAC,EAAA,KAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,EAAE,CAAC,EAC/B,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,KAAU,MAAS,CAAA,CACrC,IAAI,CAAC,KAAA,KAAU,cAAA,CAAe,KAAK,CAAC,CAAA;AAEvC,MAAA,OAAO,EAAE,GAAG,KAAA,EAAO,QAAA,EAA0B;AAAA,IAC/C,CAAA;AAEA,IAAA,OAAO,eAAe,IAAI,CAAA;AAAA,EAC5B;AACF,CAAA;;;ACjFO,IAAM,kBAAA,GAAN,cAAiC,oBAAA,CAAqB;AAAA,EACjD,OAAA;AAAA,EACA,kBAAA;AAAA,EACA,cAKL,EAAC;AAAA,EACI,UAAA,uBAAiB,GAAA,EAAuB;AAAA,EAElD,YACE,OAAA,EACA,kBAAA,GAAqB,KACrB,SAAA,GAAY,GAAA,EACZ,UAAU,IAAA,EACV;AACA,IAAA,KAAA,CAAM,WAAW,OAAO,CAAA;AACxB,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,kBAAA,GAAqB,kBAAA;AAAA,EAC5B;AAAA,EAES,QAAA,CAAS,IAAY,KAAA,EAAqB;AACjD,IAAA,KAAA,CAAM,QAAA,CAAS,IAAI,KAAK,CAAA;AAExB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAChC,IAAA,IAAI,CAAC,OAAO,QAAA,EAAU;AACpB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,KAAA,CAAM,WAAW,IAAA,CAAK,kBAAA,IAAsB,MAAM,SAAA,CAAU,QAAA,CAAS,OAAO,CAAA,EAAG;AACjF,MAAA,MAAM,SAAA,GAAY;AAAA,QAChB,KAAA,EAAQ,KAAA,CAAM,QAAA,CAAS,KAAK,CAAA,IAAgB,EAAA;AAAA,QAC5C,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,SAAA,sBAAe,IAAA,EAAK;AAAA,QACpB,MAAA,EAAQ,KAAA,CAAM,QAAA,CAAS,QAAQ;AAAA,OACjC;AAEA,MAAA,IAAA,CAAK,WAAA,CAAY,KAAK,SAAS,CAAA;AAC/B,MAAA,IAAA,CAAK,IAAA,CAAK,aAAa,SAAS,CAAA;AAGhC,MAAA,IAAI,IAAA,CAAK,WAAA,CAAY,MAAA,GAAS,GAAA,EAAK;AACjC,QAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,IAAI,CAAA;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,YAAA,CAAaN,IAAAA,EAAa,MAAA,EAAiD;AAC/E,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,IAAI,UAAA;AAGJ,MAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,IAAA,KAAS,YAAA,EAAc;AACtC,QAAA,UAAA,GAAa,2CAA2CA,IAAG,CAAA,CAAA;AAAA,MAC7D,CAAA,MAAA,IAAW,IAAA,CAAK,OAAA,CAAQ,IAAA,KAAS,OAAA,EAAS;AACxC,QAAA,UAAA,GAAa,uBAAuBA,IAAG,CAAA,CAAA;AAAA,MACzC,CAAA,MAAO;AACL,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,YAAY,MAAM,CAAA;AAE1D,MAAA,IAAI,MAAA,CAAO,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AAC1B,QAAA,MAAM,OAAO,IAAA,CAAK,kBAAA,CAAmB,MAAA,CAAO,IAAA,CAAK,CAAC,CAA4B,CAAA;AAC9E,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAIA,IAAAA,EAAK,IAAI,CAAA;AAC7B,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,KAAK,cAAA,EAAgB,EAAE,GAAA,EAAAA,IAAAA,EAAK,OAAO,CAAA;AAAA,IAC1C;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEU,mBAAmB,MAAA,EAAmD;AAC9E,IAAA,IAAI;AACF,MAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,IAAA,KAAS,YAAA,EAAc;AACtC,QAAA,MAAM,QAAA,GAAY,MAAA,CAAO,YAAY,CAAA,IAAe,MAAA;AACpD,QAAA,MAAM,OAAO,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,QAAA,CAAS,CAAC,CAAA,GAAI,QAAA;AAErD,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,KAAK,KAAA,IAAS,EAAA;AAAA,UACrB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,QAAQ,IAAI,CAAA;AAAA,UACtC,IAAA,EAAM,IAAA,CAAK,IAAA,GAAO,YAAY,CAAA,IAAK,CAAA;AAAA,UACnC,IAAA,EAAM,IAAA,CAAK,IAAA,GAAO,WAAW,CAAA,IAAK,CAAA;AAAA,UAClC,KAAA,EAAO,IAAA,CAAK,IAAA,GAAO,YAAY,CAAA,IAAK,CAAA;AAAA,UACpC,UAAA,EAAY,IAAA,CAAK,IAAA,GAAO,mBAAmB,CAAA,IAAK,CAAA;AAAA,UAChD,UAAA,EAAY,IAAA,CAAK,IAAA,GAAO,aAAa,CAAA,IAAK;AAAA,SAC5C;AAAA,MACF,CAAA,MAAA,IAAW,IAAA,CAAK,OAAA,CAAQ,IAAA,KAAS,OAAA,EAAS;AACxC,QAAA,MAAM,OAAO,OAAO,MAAA,KAAW,WAAW,IAAA,CAAK,KAAA,CAAM,MAAgB,CAAA,GAAI,MAAA;AACzE,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,IAAe,EAAC;AAExC,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,EAAA;AAAA,UACP,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,UACzB,IAAA,EAAM,UAAA,CAAW,SAAA,EAAW,UAAA,IAAc,CAAA;AAAA,UAC1C,IAAA,EAAM,UAAA,CAAW,KAAA,EAAO,sBAAA,IAA0B,CAAA;AAAA,UAClD,KAAA,EAAO;AAAA,SACT;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,cAAA,CAAe,QAAQ,EAAA,EAA6B;AAClD,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,CAAC,KAAK,CAAA;AAAA,EACtC;AAAA,EAES,KAAA,GAAc;AACrB,IAAA,KAAA,CAAM,KAAA,EAAM;AACZ,IAAA,IAAA,CAAK,cAAc,EAAC;AACpB,IAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AAAA,EACxB;AACF,CAAA;;;ACzHO,IAAM,wBAAA,GAAN,cAAuC,kBAAA,CAAmB;AAAA,EAC/D,MAAM,kBAAA,CAAmB,QAAA,GAAmB,IAAA,EAAuC;AACjF,IAAA,MAAM,GAAA,GAAM,YAAY,GAAA,EAAI;AAC5B,IAAA,MAAM,SAAS,GAAA,GAAM,QAAA;AAGrB,IAAA,MAAM,eAAe,KAAA,CAAM,IAAA,CAAK,KAAK,MAAA,CAAO,MAAA,EAAQ,CAAA,CAAE,MAAA;AAAA,MACpD,CAAC,KAAA,KAAU,KAAA,CAAM,SAAA,GAAY,MAAA,IAAU,MAAM,MAAA,KAAW;AAAA,KAC1D;AAGA,IAAA,MAAM,cAAA,uBAAqB,GAAA,EAAkD;AAC7E,IAAA,IAAI,SAAA,GAAY,CAAA;AAEhB,IAAA,YAAA,CAAa,OAAA,CAAQ,CAAC,KAAA,KAAU;AAC9B,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,GAAA,CAAI,KAAA,CAAM,SAAS,KAAK,EAAE,SAAA,EAAW,CAAA,EAAG,KAAA,EAAO,CAAA,EAAE;AAC9E,MAAA,KAAA,CAAM,SAAA,IAAa,MAAM,QAAA,IAAY,CAAA;AACrC,MAAA,KAAA,CAAM,KAAA,IAAS,CAAA;AACf,MAAA,cAAA,CAAe,GAAA,CAAI,KAAA,CAAM,SAAA,EAAW,KAAK,CAAA;AACzC,MAAA,SAAA,IAAa,MAAM,QAAA,IAAY,CAAA;AAAA,IACjC,CAAC,CAAA;AAGD,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,IAAA,CAAK,cAAA,CAAe,OAAA,EAAS,CAAA,CACpD,GAAA,CAAI,CAAC,CAAC,SAAA,EAAW,KAAK,CAAA,MAAO;AAAA,MAC5B,SAAA;AAAA,MACA,eAAA,EAAiB,KAAA,CAAM,SAAA,GAAY,KAAA,CAAM,KAAA;AAAA,MACzC,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,MAAA,EAAS,KAAA,CAAM,SAAA,GAAY,SAAA,GAAa;AAAA,KAC1C,CAAE,CAAA,CACD,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,MAAA,GAAS,CAAA,CAAE,MAAM,CAAA,CAClC,KAAA,CAAM,GAAG,EAAE,CAAA;AAGd,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,uBAAA,CAAwB,YAAY,CAAA;AAEjE,IAAA,OAAO;AAAA,MACL,WAAA,EAAa,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,GAAG,CAAA;AAAA,MACvC,YAAY,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA;AAAA,MAC/C,WAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEU,wBAAwB,MAAA,EAAyB;AACzD,IAAA,MAAM,kBAA4B,EAAC;AAGnC,IAAA,MAAM,WAAA,GAAc,KAAK,WAAA,CAAY,MAAA;AAAA,MACnC,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,WAAA,GAAc,QAAA,CAAS,QAAQ,CAAA,IAAK,CAAA,CAAE,QAAA,GAAW;AAAA,KAClE;AACA,IAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,MAAA,eAAA,CAAgB,KAAK,iEAAiE,CAAA;AAAA,IACxF;AAGA,IAAA,MAAM,WAAA,uBAAkB,GAAA,EAAoB;AAC5C,IAAA,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAA,KAAM;AAC9B,MAAA,MAAM,UAAA,GAAa,EAAE,KAAA,CAAM,UAAA,CAAW,QAAQ,GAAG,CAAA,CAAE,UAAA,CAAW,MAAA,EAAQ,GAAG,CAAA;AACzE,MAAA,WAAA,CAAY,IAAI,UAAA,EAAA,CAAa,WAAA,CAAY,IAAI,UAAU,CAAA,IAAK,KAAK,CAAC,CAAA;AAAA,IACpE,CAAC,CAAA;AAED,IAAA,MAAM,iBAAA,GAAoB,KAAA,CAAM,IAAA,CAAK,WAAA,CAAY,SAAS,CAAA,CAAE,MAAA,CAAO,CAAC,GAAGK,MAAK,CAAA,KAAMA,SAAQ,EAAE,CAAA;AAE5F,IAAA,IAAI,iBAAA,CAAkB,SAAS,CAAA,EAAG;AAChC,MAAA,eAAA,CAAgB,IAAA;AAAA,QACd;AAAA,OACF;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,YAAA,EAAa;AAC5C,IAAA,IAAI,SAAA,CAAU,UAAU,CAAA,EAAG;AACzB,MAAA,eAAA,CAAgB,IAAA;AAAA,QACd,CAAA,6EAAA,EAAgF,UAAU,KAAK,CAAA,EAAA;AAAA,OACjG;AAAA,IACF;AAGA,IAAA,MAAM,mBAAmB,MAAA,CAAO,MAAA;AAAA,MAC9B,CAAC,MAAM,CAAA,CAAE,SAAA,CAAU,SAAS,aAAa,CAAA,IAAA,CAAM,CAAA,CAAE,QAAA,IAAY,CAAA,IAAK;AAAA,KACpE;AACA,IAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,MAAA,eAAA,CAAgB,IAAA;AAAA,QACd;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,eAAA;AAAA,EACT;AAAA,EAEA,cAAA,CAAe,QAAQ,EAAA,EAAsE;AAC3F,IAAA,MAAM,cAAA,uBAAqB,GAAA,EAAkD;AAE7E,IAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,CAAA,CAC5B,MAAA,CAAO,CAAC,KAAA,KAAU,MAAM,MAAA,KAAW,WAAW,CAAA,CAC9C,OAAA,CAAQ,CAAC,KAAA,KAAU;AAClB,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,GAAA,CAAI,KAAA,CAAM,SAAS,KAAK,EAAE,SAAA,EAAW,CAAA,EAAG,KAAA,EAAO,CAAA,EAAE;AAC9E,MAAA,KAAA,CAAM,SAAA,IAAa,MAAM,QAAA,IAAY,CAAA;AACrC,MAAA,KAAA,CAAM,KAAA,IAAS,CAAA;AACf,MAAA,cAAA,CAAe,GAAA,CAAI,KAAA,CAAM,SAAA,EAAW,KAAK,CAAA;AAAA,IAC3C,CAAC,CAAA;AAEH,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,cAAA,CAAe,OAAA,EAAS,CAAA,CACvC,GAAA,CAAI,CAAC,CAAC,SAAA,EAAW,KAAK,CAAA,MAAO;AAAA,MAC5B,SAAA;AAAA,MACA,WAAA,EAAa,KAAA,CAAM,SAAA,GAAY,KAAA,CAAM,KAAA;AAAA,MACrC,OAAO,KAAA,CAAM;AAAA,KACf,CAAE,CAAA,CACD,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,WAAA,GAAc,CAAA,CAAE,WAAW,CAAA,CAC5C,KAAA,CAAM,GAAG,KAAK,CAAA;AAAA,EACnB;AACF,CAAA;;;AC9HO,IAAM,mBAAA,GAAN,cAAkC,wBAAA,CAAyB;AAAA,EAChE,YAAY,OAAA,EAA2C;AACrD,IAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA;AAEhD,IAAA,OAAA,CAAQ,KAAA,GAAQ,OACdL,IAAAA,EACA,MAAA,EACA,OAAA,KAC4B;AAC5B,MAAA,MAAM,OAAA,GAAU,KAAK,UAAA,CAAW,OAAA,EAAS,EAAE,GAAA,EAAAA,IAAAA,EAAK,QAAQ,CAAA;AAExD,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,aAAA,CAAiBA,IAAAA,EAAK,QAAQ,OAAO,CAAA;AAC1D,QAAA,IAAA,CAAK,SAAS,OAAO,CAAA;AAGrB,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AACrC,QAAA,IAAI,KAAA,EAAO,QAAA,IAAY,KAAA,CAAM,QAAA,GAAW,KAAK,kBAAA,EAAoB;AAC/D,UAAA,IAAA,CAAK,YAAA,CAAaA,IAAAA,EAAK,MAAM,CAAA,CAAE,MAAM,MAAM;AAAA,UAE3C,CAAC,CAAA;AAAA,QACH;AAEA,QAAA,OAAO,MAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,QAAA,CAAS,SAAS,KAAc,CAAA;AACrC,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAA;AAGA,IAAA,IAAA,CAAK,UAAA,CAAW,OAAA,EAAS,kBAAA,EAAoB,aAAa,CAAA;AAC1D,IAAA,IAAA,CAAK,UAAA,CAAW,OAAA,EAAS,SAAA,EAAW,YAAY,CAAA;AAChD,IAAA,IAAA,CAAK,UAAA,CAAW,OAAA,EAAS,YAAA,EAAc,YAAY,CAAA;AAEnD,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEU,UAAA,CAAW,OAAA,EAAc,UAAA,EAAoB,aAAA,EAA6B;AAClF,IAAA,MAAM,QAAA,GAAW,QAAQ,UAAU,CAAA;AACnC,IAAA,IAAI,OAAO,aAAa,UAAA,EAAY;AAClC,MAAA;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,UAAU,CAAA,GAAI,OAAA,GAAU,IAAA,KAAgB;AAC9C,MAAA,MAAM,UAAU,IAAA,CAAK,UAAA,CAAW,GAAG,aAAa,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA,EAAI;AAAA,QAChE,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,CAAC;AAAA;AAAA,OACtB,CAAA;AAED,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,KAAA,CAAM,SAAS,IAAI,CAAA;AACjD,QAAA,IAAA,CAAK,SAAS,OAAO,CAAA;AACrB,QAAA,OAAO,MAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,QAAA,CAAS,SAAS,KAAc,CAAA;AACrC,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAA;AAAA,EACF;AAAA,EAEA,cAAc,OAAA,EAAgC;AAG5C,IAAA,IAAA,CAAK,IAAA,CAAK,kBAAA,EAAoB,EAAE,OAAA,EAAS,CAAA;AAAA,EAC3C;AACF,CAAA;;;AC1DO,IAAM,yBAAA,GAAN,cAAwC,mBAAA,CAAoB;AAAA,EACjE,WAAA,CACE,OAAA,EACA,OAAA,GAII,EAAC,EACL;AACA,IAAA,KAAA;AAAA,MACE,OAAA;AAAA,MACA,QAAQ,kBAAA,IAAsB,GAAA;AAAA,MAC9B,QAAQ,SAAA,IAAa,GAAA;AAAA,MACrB,QAAQ,OAAA,IAAW;AAAA,KACrB;AAAA,EACF;AACF;ACsCO,IAAM,iBAAA,GAAN,MAAM,kBAAA,CAAkB;AAAA,EACZ,SAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EAET,iBAAkC,EAAC;AAAA,EAE3C,WAAA,CACE,OAAA,GAKI,EAAC,EACL;AACA,IAAA,IAAA,CAAK,SAAA,GAAY,QAAQ,SAAA,IAAa,OAAA;AACtC,IAAA,IAAA,CAAK,SAAA,GAAY,QAAQ,SAAA,IAAa,GAAA;AACtC,IAAA,IAAA,CAAK,aAAA,GAAgB,QAAQ,aAAA,IAAiB,QAAA;AAC9C,IAAA,IAAA,CAAK,UAAA,GAAa,QAAQ,UAAA,IAAc,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,KAAA,EAAqB;AAC5B,IAAA,IAAA,CAAK,cAAA,GAAiB,EAAE,KAAA,EAAM;AAC9B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,EAAA,EAA2B;AAChC,IAAA,IAAA,CAAK,eAAe,EAAA,GAAK,EAAA;AACzB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,CAAU,OAAe,KAAA,EAAsB;AAC7C,IAAA,IAAA,CAAK,eAAe,KAAA,GAAQ,KAAA;AAC5B,IAAA,IAAA,CAAK,eAAe,KAAA,GAAQ,KAAA;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,IAAA,EAAsB;AAChC,IAAA,IAAA,CAAK,eAAe,IAAA,GAAO,IAAA;AAC3B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,CAASA,MAAa,MAAA,EAA0B;AAC9C,IAAA,IAAA,CAAK,cAAA,GAAiB,EAAE,KAAA,EAAOA,IAAAA,EAAK,MAAA,EAAO;AAC3C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,KAAA,EAAuB;AAClC,IAAA,IAAA,CAAK,cAAA,GAAiB,EAAE,KAAA,EAAM;AAC9B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,SAAA,EAAyB;AACnC,IAAA,IAAA,CAAK,eAAe,SAAA,GAAY,SAAA;AAChC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAgB;AACd,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,MAAM,OAAO,IAAA,CAAK,cAAA;AAClB,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,SAAA;AAGlC,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAGb,IAAA,IAAI,KAAK,KAAA,EAAO;AAEd,MAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAClB,MAAA,KAAA,CAAM,KAAK,IAAA,CAAK,SAAA,CAAU,KAAK,KAAA,EAAO,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,IACpD,CAAA,MAAA,IAAW,KAAK,KAAA,EAAO;AAErB,MAAA,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,KAAK,CAAA;AAE9B,MAAA,IAAI,IAAA,CAAK,OAAO,MAAA,EAAW;AACzB,QAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AACf,QAAA,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,MAC5B;AAEA,MAAA,IAAI,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,KAAA,KAAU,MAAA,EAAW;AAC1C,QAAA,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,KAAK,CAAA;AAC9B,QAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,MACvC;AAAA,IACF,WAAW,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA,EAAG;AAE9C,MAAA,KAAA,CAAM,IAAA,CAAK,GAAG,IAAA,CAAK,KAAK,CAAA;AAAA,IAC1B;AAGA,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA;AACrC,IAAA,IAAA,CAAK,iBAAiB,EAAC;AAEvB,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAiD;AAC/C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,cAAA,CAAe,IAAA,IAAQ,EAAC;AAC1C,IAAA,MAAM,OAAO,IAAA,CAAK,cAAA;AAGlB,IAAA,IAAI,IAAA,CAAK,SAAS,CAAC,IAAA,CAAK,SAAS,CAAA,MAAA,EAAS,IAAA,CAAK,KAAK,CAAA,CAAE,CAAA,EAAG;AACvD,MAAA,IAAA,CAAK,IAAA,CAAK,CAAA,MAAA,EAAS,IAAA,CAAK,KAAK,CAAA,CAAE,CAAA;AAAA,IACjC;AAEA,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,KAAK,KAAA,EAAM;AAAA,MAChB;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,CAAQ,OAAe,EAAA,EAA6B;AAClD,IAAA,OAAO,KAAK,QAAA,CAAS,KAAK,EAAE,MAAA,CAAO,EAAE,EAAE,KAAA,EAAM;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,CAAW,KAAA,EAAe,KAAA,EAAe,KAAA,EAAwB;AAC/D,IAAA,OAAO,IAAA,CAAK,SAAS,KAAK,CAAA,CAAE,UAAU,KAAA,EAAO,KAAK,EAAE,KAAA,EAAM;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,CAAMA,MAAa,MAAA,EAA4B;AAC7C,IAAA,OAAO,IAAA,CAAK,QAAA,CAASA,IAAAA,EAAK,MAAM,EAAE,KAAA,EAAM;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,CAAQ,KAAA,EAAe,OAAA,GAAoC,GAAA,EAAa;AACtE,IAAA,MAAM,KAAK,IAAA,CAAK,SAAA;AAChB,IAAA,IAAI,YAAY,GAAA,EAAK;AACnB,MAAA,OAAO,CAAA,EAAG,EAAE,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,KAAA,EAAQ,IAAA,CAAK,SAAS,CAAA,EAAG,KAAK,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,CAAA,CAAA;AAAA,IAC9E;AACA,IAAA,OAAO,CAAA,EAAG,EAAE,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,KAAA,EAAQ,IAAA,CAAK,SAAS,CAAA,EAAG,KAAK,CAAA,EAAG,IAAA,CAAK,SAAS,GAAG,OAAO,CAAA,CAAA;AAAA,EACxF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAA,EAAyB;AAC3B,IAAA,OAAO,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,GAAA,EAAM,IAAA,CAAK,SAAS,CAAA,EAAG,OAAO,CAAA,CAAA;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAA,CAAUA,MAAa,MAAA,EAA4B;AACzD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,EAAE,GAAA,EAAKA,IAAAA,CAAI,IAAA,EAAK,EAAG,MAAA,EAAQ,MAAA,IAAU,EAAC,EAAG,CAAA;AACxE,IAAA,OAAO,IAAA,CAAK,KAAK,OAAO,CAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAU,KAAA,EAAwB;AACxC,IAAA,MAAM,UAAU,OAAO,KAAA,KAAU,WAAW,KAAA,GAAQ,IAAA,CAAK,UAAU,KAAK,CAAA;AACxE,IAAA,OAAO,IAAA,CAAK,KAAK,OAAO,CAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKQ,KAAK,OAAA,EAAyB;AACpC,IAAA,OAAOW,WAAW,IAAA,CAAK,aAAa,CAAA,CACjC,MAAA,CAAO,OAAO,CAAA,CACd,MAAA,CAAO,KAAK,CAAA,CACZ,MAAM,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,UAAU,CAAC,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,SAAA,EAAsC;AAClD,IAAA,OAAO,IAAI,kBAAA,CAAkB;AAAA,MAC3B,SAAA;AAAA,MACA,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,eAAe,IAAA,CAAK,aAAA;AAAA,MACpB,YAAY,IAAA,CAAK;AAAA,KAClB,CAAA;AAAA,EACH;AACF;AAKO,IAAM,QAAA,GAAW,IAAI,iBAAA;;;AC3PrB,IAAM,YAAA,GAAN,MAAM,aAAA,CAAa;AAAA,EACP,OAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACD,GAAA;AAAA,EAER,KAAA,GAAoB;AAAA,IAC1B,IAAA,EAAM,CAAA;AAAA,IACN,MAAA,EAAQ,CAAA;AAAA,IACR,IAAA,EAAM,CAAA;AAAA,IACN,OAAA,EAAS,CAAA;AAAA,IACT,aAAA,EAAe,CAAA;AAAA,IACf,OAAA,EAAS;AAAA,GACX;AAAA,EAEA,YAAY,OAAA,EAA8B;AACxC,IAAA,IAAA,CAAK,UAAU,OAAA,CAAQ,OAAA;AACvB,IAAA,IAAA,CAAK,UAAA,GAAa,QAAQ,UAAA,IAAc,GAAA;AACxC,IAAA,IAAA,CAAK,WAAA,GAAc,QAAQ,WAAA,IAAe,IAAA;AAC1C,IAAA,IAAA,CAAK,SAAA,GAAY,QAAQ,SAAA,IAAa,EAAA;AACtC,IAAA,IAAA,CAAK,GAAA,GAAM,IAAI,iBAAA,CAAkB,EAAE,WAAW,OAAA,CAAQ,SAAA,IAAa,SAAS,CAAA;AAAA,EAC9E;AAAA,EAEA,MAAM,IAAiB,GAAA,EAAgC;AACrD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA;AACnC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,IAAmB,OAAO,CAAA;AAC5D,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAA,CAAK,SAAA,EAAU;AACf,MAAA,OAAO,MAAA,CAAO,IAAA;AAAA,IAChB;AACA,IAAA,IAAA,CAAK,UAAA,EAAW;AAChB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,GAAA,CAAiB,GAAA,EAAa,IAAA,EAAS,OAAA,GAA2B,EAAC,EAAkB;AACzF,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA;AACnC,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,IAAO,IAAA,CAAK,UAAA;AAChC,IAAA,IAAI,QAAQ,YAAA,IAAiB,MAAM,KAAK,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA,EAAI;AAChE,MAAA;AAAA,IACF;AACA,IAAA,MAAM,KAAA,GAAuB;AAAA,MAC3B,IAAA;AAAA,MACA,QAAA,EAAU,KAAK,GAAA,EAAI;AAAA,MACnB,WAAW,GAAA,GAAM,IAAA,CAAK,GAAA,EAAI,GAAI,MAAM,GAAA,GAAO,MAAA;AAAA,MAC3C,MAAM,OAAA,CAAQ;AAAA,KAChB;AACA,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,OAAA,EAAS,OAAO,GAAG,CAAA;AAC1C,IAAA,IAAI,OAAA,CAAQ,MAAM,MAAA,EAAQ;AACxB,MAAA,MAAM,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS,OAAA,CAAQ,IAAI,CAAA;AAAA,IAC/C;AACA,IAAA,IAAA,CAAK,SAAA,EAAU;AAAA,EACjB;AAAA,EAEA,MAAM,QAAA,CACJ,GAAA,EACA,OAAA,EACA,OAAA,GAA2B,EAAC,EAChB;AACZ,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAO,GAAG,CAAA;AACpC,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,MAAM,IAAA,GAAO,MAAM,OAAA,EAAQ;AAC3B,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,EAAM,OAAO,CAAA;AACjC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,GAAA,EAA+B;AAC1C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA;AACnC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,OAAO,CAAA;AAChD,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAA,CAAK,YAAA,EAAa;AAAA,IACpB;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,WAAW,IAAA,EAAiC;AAChD,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,IAAI,MAAM,IAAA,CAAK,MAAA,CAAO,GAAG,CAAA,EAAG;AAC1B,QAAA,OAAA,EAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,GAAA,EAA+B;AAC1C,IAAA,OAAO,KAAK,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,GAAG,CAAC,CAAA;AAAA,EACjD;AAAA,EAEA,MAAM,gBAAgB,GAAA,EAA8B;AAClD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA;AAC/B,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,IAAc,MAAM,CAAA;AACpD,IAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AACjB,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,IAAI,WAAA,GAAc,CAAA;AAClB,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,IAAI,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,GAAG,CAAA,EAAG;AAClC,QAAA,WAAA,EAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA;AAChC,IAAA,IAAA,CAAK,mBAAmB,WAAW,CAAA;AACnC,IAAA,OAAO,WAAA;AAAA,EACT;AAAA,EAEA,MAAM,iBAAiB,IAAA,EAAiC;AACtD,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,KAAA,IAAS,MAAM,IAAA,CAAK,eAAA,CAAgB,GAAG,CAAA;AAAA,IACzC;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAM,gBAAgB,KAAA,EAAgC;AACpD,IAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,CAAA,MAAA,EAAS,KAAK,CAAA,CAAE,CAAA;AAAA,EAC9C;AAAA,EAEA,MAAM,gBAAA,CAAiB,KAAA,EAAe,EAAA,EAAuC;AAC3E,IAAA,OAAO,KAAK,MAAA,CAAO,IAAA,CAAK,IAAI,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA;AAAA,EAChD;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,UAAU,IAAA,CAAK,OAAA;AACrB,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,MAAM,QAAQ,OAAA,EAAQ;AAAA,IACxB;AACA,IAAA,IAAA,CAAK,UAAA,EAAW;AAAA,EAClB;AAAA,EAEA,QAAA,GAAuB;AACrB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,KAAK,KAAA,CAAM,MAAA;AAC3C,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,KAAA,EAAO,OAAA,EAAS,KAAA,GAAQ,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,KAAA,GAAQ,CAAA,EAAE;AAAA,EAC3E;AAAA,EAEA,UAAA,GAAmB;AACjB,IAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,IAAA,EAAM,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,OAAA,EAAS,CAAA,EAAG,aAAA,EAAe,CAAA,EAAG,SAAS,CAAA,EAAE;AAAA,EACvF;AAAA,EAEA,MAAM,OAAO,GAAA,EAA8B;AACzC,IAAA,OAAO,KAAK,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,UAAA,CAAW,GAAG,CAAC,CAAA;AAAA,EAC9C;AAAA,EACA,MAAM,SAAA,CAAU,GAAA,EAAa,GAAA,EAA+B;AAC1D,IAAA,OAAO,KAAK,OAAA,CAAQ,MAAA,CAAO,KAAK,UAAA,CAAW,GAAG,GAAG,GAAG,CAAA;AAAA,EACtD;AAAA,EAEA,MAAM,SAAA,EAAiC;AACrC,IAAA,OAAO,IAAI,aAAA,CAAa;AAAA,MACtB,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,SAAA;AAAA,MACA,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,WAAW,IAAA,CAAK;AAAA,KACjB,CAAA;AAAA,EACH;AAAA,EAEQ,WAAW,GAAA,EAAqB;AACtC,IAAA,OAAO,KAAK,SAAA,GAAY,CAAA,EAAG,KAAK,SAAS,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,GAAK,GAAA;AAAA,EACvD;AAAA,EAEA,MAAc,YAAA,CAAa,GAAA,EAAa,IAAA,EAA+B;AACrE,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA;AAC/B,MAAA,MAAM,WAAY,MAAM,IAAA,CAAK,QAAQ,GAAA,CAAc,MAAM,KAAM,EAAC;AAChE,MAAA,IAAI,CAAC,QAAA,CAAS,QAAA,CAAS,GAAG,CAAA,EAAG;AAC3B,QAAA,QAAA,CAAS,KAAK,GAAG,CAAA;AACjB,QAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,QAAQ,CAAA;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,SAAA,GAAkB;AACxB,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,IAAA,CAAK,KAAA,CAAM,IAAA,EAAA;AAAA,IACb;AAAA,EACF;AAAA,EACQ,UAAA,GAAmB;AACzB,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,IAAA,CAAK,KAAA,CAAM,MAAA,EAAA;AAAA,IACb;AAAA,EACF;AAAA,EACQ,SAAA,GAAkB;AACxB,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,IAAA,CAAK,KAAA,CAAM,IAAA,EAAA;AAAA,IACb;AAAA,EACF;AAAA,EACQ,YAAA,GAAqB;AAC3B,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,IAAA,CAAK,KAAA,CAAM,OAAA,EAAA;AAAA,IACb;AAAA,EACF;AAAA,EACQ,mBAAmBN,MAAAA,EAAqB;AAC9C,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,IAAA,CAAK,MAAM,aAAA,IAAiBA,MAAAA;AAAA,IAC9B;AAAA,EACF;AACF;;;ACnNO,IAAM,uBAAN,MAAoD;AAAA,EACxC,iBAAA,GAAoB,CAAC,QAAA,EAAU,MAAA,EAAQ,UAAU,CAAA;AAAA,EACjD,UAAA,GAAa,IAAA;AAAA;AAAA,EAE9B,WAAA,CAAYL,MAAa,MAAA,EAA8B;AACrD,IAAA,MAAM,OAAA,GAAUA,KAAI,IAAA,EAAK,CAAE,MAAM,KAAK,CAAA,CAAE,CAAC,CAAA,EAAG,WAAA,EAAY;AAGxD,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,KAAK,iBAAA,CAAkB,QAAA,CAAS,OAAO,CAAA,EAAG;AACzD,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,IAAI,MAAA,CAAO,aAAa,CAAA,EAAG;AACzB,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,CAAE,MAAA;AAC1C,IAAA,IAAI,UAAA,GAAa,OAAO,IAAA,EAAM;AAE5B,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,WAAA,CAAYA,MAAa,OAAA,EAAqC;AAC5D,IAAA,IAAI,OAAA,EAAS,QAAQ,MAAA,EAAW;AAC9B,MAAA,OAAO,OAAA,CAAQ,GAAA;AAAA,IACjB;AAGA,IAAA,MAAM,QAAA,GAAWA,KAAI,WAAA,EAAY;AAEjC,IAAA,IAAI,SAAS,QAAA,CAAS,QAAQ,KAAK,QAAA,CAAS,QAAA,CAAS,MAAM,CAAA,EAAG;AAC5D,MAAA,OAAO,GAAA;AAAA,IACT;AAEA,IAAA,IAAI,QAAA,CAAS,QAAA,CAAS,MAAM,CAAA,EAAG;AAC7B,MAAA,OAAO,GAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA,EAEA,WAAA,CAAYA,IAAAA,EAAa,MAAA,EAAoB,OAAA,EAAqC;AAChF,IAAA,IAAI,SAAS,GAAA,EAAK;AAChB,MAAA,OAAO,OAAA,CAAQ,GAAA;AAAA,IACjB;AAEA,IAAA,OAAO,gBAAA,CAAiBA,MAAK,MAAM,CAAA;AAAA,EACrC;AAAA,EAEA,wBAAwBA,IAAAA,EAAuB;AAC7C,IAAA,MAAM,WAAqB,EAAC;AAC5B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,iBAAA,CAAkBA,IAAG,CAAA;AAEzC,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,KAAU;AACxB,MAAA,QAAA,CAAS,KAAK,CAAA,MAAA,EAAS,KAAK,CAAA,EAAA,CAAA,EAAM,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,IACtD,CAAC,CAAA;AAED,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEU,kBAAkBA,IAAAA,EAAuB;AACjD,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,MAAM,QAAA,GAAW;AAAA,MACf,oBAAA;AAAA,MACA,oBAAA;AAAA,MACA,sBAAA;AAAA,MACA,6BAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC5B,MAAA,IAAI,KAAA;AACJ,MAAA,OAAA,CAAQ,KAAA,GAAQ,OAAA,CAAQ,IAAA,CAAKA,IAAG,OAAO,IAAA,EAAM;AAC3C,QAAA,IAAI,KAAA,CAAM,CAAC,CAAA,EAAG;AACZ,UAAA,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAE,aAAa,CAAA;AAAA,QACpC;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAED,IAAA,OAAO,CAAC,GAAG,IAAI,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,EAC5B;AACF;AAEO,IAAM,kBAAA,GAAN,cAAiC,oBAAA,CAAqB;AAAA,EACnD,aAAA,uBAAoB,GAAA,EAAmD;AAAA,EAEtE,WAAA,CAAYA,MAAa,MAAA,EAA8B;AAC9D,IAAA,IAAI,CAAC,KAAA,CAAM,WAAA,CAAYA,IAAAA,EAAK,MAAM,CAAA,EAAG;AACnC,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAeA,IAAG,CAAA;AACvC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,OAAO,CAAA;AAE5C,IAAA,IAAI,KAAA,EAAO;AAET,MAAA,IAAI,KAAA,CAAM,OAAO,EAAA,EAAI;AACnB,QAAA,OAAO,IAAA;AAAA,MACT;AAGA,MAAA,IAAI,KAAA,CAAM,cAAc,GAAA,EAAK;AAC3B,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAES,WAAA,CAAYA,MAAa,OAAA,EAAqC;AACrE,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,WAAA,CAAYA,IAAAA,EAAK,OAAO,CAAA;AAC9C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAeA,IAAG,CAAA;AACvC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,OAAO,CAAA;AAE5C,IAAA,IAAI,KAAA,EAAO;AAET,MAAA,IAAI,KAAA,CAAM,OAAO,GAAA,EAAK;AACpB,QAAA,OAAO,OAAA,GAAU,CAAA;AAAA,MACnB;AAGA,MAAA,IAAI,KAAA,CAAM,OAAO,CAAA,EAAG;AAClB,QAAA,OAAO,OAAA,GAAU,CAAA;AAAA,MACnB;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,oBAAA,CAAqBA,MAAa,QAAA,EAAwB;AACxD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAeA,IAAG,CAAA;AACvC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,OAAO,KAAK,EAAE,IAAA,EAAM,CAAA,EAAG,WAAA,EAAa,CAAA,EAAE;AAE3E,IAAA,KAAA,CAAM,eAAe,KAAA,CAAM,WAAA,GAAc,MAAM,IAAA,GAAO,QAAA,KAAa,MAAM,IAAA,GAAO,CAAA,CAAA;AAChF,IAAA,KAAA,CAAM,IAAA,EAAA;AAEN,IAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,OAAA,EAAS,KAAK,CAAA;AAAA,EACvC;AAAA,EAEQ,eAAeA,IAAAA,EAAqB;AAE1C,IAAA,OAAOA,IAAAA,CACJ,UAAA,CAAW,MAAA,EAAQ,GAAG,EACtB,UAAA,CAAW,MAAA,EAAQ,GAAG,CAAA,CACtB,WAAW,UAAA,EAAY,GAAG,CAAA,CAC1B,WAAA,GACA,IAAA,EAAK;AAAA,EACV;AACF;;;AC1GO,IAAM,WAAN,MAAe;AAAA,EACZ,OAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA,uBAA4C,GAAA,EAAI;AAAA,EAChD,SAAA,uBAA0C,GAAA,EAAI;AAAA;AAAA,EAG/C,KAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EAEP,YAAY,OAAA,EAA0B;AACpC,IAAA,IAAA,CAAK,UAAU,OAAA,CAAQ,OAAA;AACvB,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,iBAAA,CAAkB;AAAA,MACxC,SAAA,EAAW,QAAQ,SAAA,IAAa;AAAA,KACjC,CAAA;AACD,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,KAAA;AACrB,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,UAAU,OAAA,CAAQ,OAAA;AAEvB,IAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,MACX,IAAA,EAAM,CAAA;AAAA,MACN,MAAA,EAAQ,CAAA;AAAA,MACR,IAAA,EAAM,CAAA;AAAA,MACN,OAAA,EAAS,CAAA;AAAA,MACT,aAAA,EAAe,CAAA;AAAA,MACf,OAAA,EAAS,CAAA;AAAA,MACT,IAAA,EAAM;AAAA,KACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBA,MAAM,WAAW,OAAA,EAAkD;AACjE,IAAA,IAAI,WAAA,GAAc,CAAA;AAGlB,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,MAAM,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAC,OAAA,CAAQ,MAAM,CAAA;AAE/E,MAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,QAAA,MAAM,OAAO,IAAA,CAAK,WAAA,CAAY,IAAI,KAAK,CAAA,wBAAS,GAAA,EAAI;AAEpD,QAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,UAAA,IAAI;AACF,YAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,GAAG,CAAA;AAC7C,YAAA,IAAI,OAAA,EAAS;AACX,cAAA,WAAA,EAAA;AACA,cAAA,IAAA,CAAK,KAAA,CAAM,OAAA,EAAA;AAAA,YACb;AAAA,UACF,SAAS,KAAA,EAAO;AACd,YAAA,IAAA,CAAK,WAAA,CAAY,OAAgB,GAAG,CAAA;AAAA,UACtC;AAAA,QACF;AAGA,QAAA,IAAI;AACF,UAAA,MAAM,OAAA,GAAU,WAAW,KAAK,CAAA,EAAA,CAAA;AAChC,UAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAK,OAAO,CAAA;AACnD,UAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC7B,YAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,GAAG,CAAA;AAC7C,YAAA,IAAI,OAAA,EAAS;AACX,cAAA,WAAA,EAAA;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAEA,QAAA,IAAA,CAAK,WAAA,CAAY,OAAO,KAAK,CAAA;AAC7B,QAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,CAAA,yBAAA,EAA4B,KAAK,IAAI,EAAE,KAAA,EAAO,IAAA,CAAK,IAAA,EAAM,CAAA;AAAA,MAC9E;AAAA,IACF;AAGA,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,IAAI,IAAI,OAAA,CAAQ,IAAA,GAAO,CAAC,OAAA,CAAQ,IAAI,CAAA;AAEvE,MAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA;AAExC,QAAA,IAAI;AAEF,UAAA,MAAM,OAAQ,MAAM,IAAA,CAAK,QAAQ,GAAA,CAAc,MAAM,KAAM,EAAC;AAE5D,UAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,YAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,GAAG,CAAA;AAC7C,YAAA,IAAI,OAAA,EAAS;AACX,cAAA,WAAA,EAAA;AACA,cAAA,IAAA,CAAK,KAAA,CAAM,OAAA,EAAA;AAAA,YACb;AAAA,UACF;AAGA,UAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA;AAChC,UAAA,IAAA,CAAK,SAAA,CAAU,OAAO,GAAG,CAAA;AAEzB,UAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,CAAA,uBAAA,EAA0B,GAAG,IAAI,EAAE,KAAA,EAAO,IAAA,CAAK,MAAA,EAAQ,CAAA;AAAA,QAC5E,SAAS,KAAA,EAAO;AACd,UAAA,IAAA,CAAK,WAAA,CAAY,OAAgB,MAAM,CAAA;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,MAAM,aAAA,IAAiB,WAAA;AAC5B,IAAA,IAAA,CAAK,aAAA,EAAc;AAEnB,IAAA,OAAO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,QAAQ,KAAA,EAAM;AACzB,MAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,MAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,MAAA,IAAA,CAAK,MAAM,IAAA,GAAO,CAAA;AAClB,MAAA,IAAA,CAAK,MAAA,EAAQ,KAAK,eAAe,CAAA;AAAA,IACnC,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,WAAA,CAAY,OAAgB,GAAG,CAAA;AAAA,IACtC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,MAAA,CACJ,OAAA,EACA,QAAA,EAC8C;AAC9C,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,IAAI,MAAA,GAAS,CAAA;AAEb,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,sBAAA,EAAwB,EAAE,KAAA,EAAO,OAAA,CAAQ,QAAQ,CAAA;AAEnE,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,IAAI;AACF,QAAA,MAAM,SAAS,MAAM,QAAA,CAAS,KAAA,CAAM,GAAA,EAAK,MAAM,MAAM,CAAA;AACrD,QAAA,MAAM,MAAM,IAAA,CAAK,YAAA,CAAa,MAAM,KAAA,CAAM,GAAA,EAAK,MAAM,MAAM,CAAA;AAE3D,QAAA,MAAM,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ;AAAA,UAC1B,KAAK,KAAA,CAAM,GAAA;AAAA,UACX,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,MAAA,EAAQ,IAAA,CAAK,aAAA,CAAc,KAAA,CAAM,GAAG;AAAA,SACrC,CAAA;AAED,QAAA,OAAA,EAAA;AACA,QAAA,IAAA,CAAK,QAAQ,KAAA,CAAM,qBAAA,EAAuB,EAAE,GAAA,EAAK,KAAA,CAAM,KAAK,CAAA;AAAA,MAC9D,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,EAAA;AACA,QAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,qBAAA,EAAuB,EAAE,KAAK,KAAA,CAAM,GAAA,EAAK,OAAO,CAAA;AAAA,MACrE;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,wBAAA,EAA0B,EAAE,OAAA,EAAS,QAAQ,CAAA;AAC/D,IAAA,OAAO,EAAE,SAAS,MAAA,EAAO;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAA0B;AACxB,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,IAAA,EAAM,CAAA;AAAA,MACN,MAAA,EAAQ,CAAA;AAAA,MACR,IAAA,EAAM,CAAA;AAAA,MACN,OAAA,EAAS,CAAA;AAAA,MACT,aAAA,EAAe,CAAA;AAAA,MACf,OAAA,EAAS,CAAA;AAAA,MACT,IAAA,EAAM,KAAK,KAAA,CAAM;AAAA,KACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAO,GAAA,EAAgC;AAC3C,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,OAAA,CAAQ,IAAO,GAAG,CAAA;AAE3C,MAAA,IAAI,UAAU,IAAA,EAAM;AAClB,QAAA,IAAA,CAAK,KAAA,CAAM,MAAA,EAAA;AACX,QAAA,IAAA,CAAK,MAAA,GAAS,KAAK,EAAE,CAAA;AAAA,MACvB,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,KAAA,CAAM,IAAA,EAAA;AACX,QAAA,IAAA,CAAK,KAAA,GAAQ,KAAK,EAAE,CAAA;AAAA,MACtB;AAEA,MAAA,IAAA,CAAK,aAAA,EAAc;AACnB,MAAA,OAAO,KAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,WAAA,CAAY,OAAgB,GAAG,CAAA;AACpC,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,GAAA,CACJ,GAAA,EACA,KAAA,EACA,OAAA,EAKe;AACf,IAAA,IAAI;AACF,MAAA,MAAM,KAAK,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,KAAA,EAAO,SAAS,GAAG,CAAA;AAC/C,MAAA,IAAA,CAAK,KAAA,CAAM,IAAA,EAAA;AACX,MAAA,IAAA,CAAK,KAAA,CAAM,IAAA,EAAA;AAGX,MAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,QAAA,KAAA,MAAW,KAAA,IAAS,QAAQ,MAAA,EAAQ;AAClC,UAAA,IAAI,CAAC,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,KAAK,CAAA,EAAG;AAChC,YAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,KAAA,kBAAO,IAAI,KAAK,CAAA;AAAA,UACvC;AACA,UAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,KAAK,CAAA,CAAG,IAAI,GAAG,CAAA;AAAA,QACtC;AAAA,MACF;AAGA,MAAA,IAAI,SAAS,IAAA,EAAM;AACjB,QAAA,KAAA,MAAW,GAAA,IAAO,QAAQ,IAAA,EAAM;AAC9B,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA;AACxC,UAAA,MAAM,WAAY,MAAM,IAAA,CAAK,QAAQ,GAAA,CAAc,MAAM,KAAM,EAAC;AAEhE,UAAA,IAAI,CAAC,QAAA,CAAS,QAAA,CAAS,GAAG,CAAA,EAAG;AAC3B,YAAA,QAAA,CAAS,KAAK,GAAG,CAAA;AACjB,YAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,QAAQ,CAAA;AAAA,UACzC;AAEA,UAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA,EAAG;AAC5B,YAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,GAAA,kBAAK,IAAI,KAAK,CAAA;AAAA,UACnC;AACA,UAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA,CAAG,IAAI,GAAG,CAAA;AAAA,QAClC;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,WAAA,CAAY,OAAgB,GAAG,CAAA;AAAA,IACtC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,GAAA,EAA+B;AAC1C,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,GAAG,CAAA;AAC7C,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,IAAA,CAAK,KAAA,CAAM,OAAA,EAAA;AACX,QAAA,IAAA,CAAK,KAAA,CAAM,OAAO,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA,MACnD;AACA,MAAA,OAAO,OAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,WAAA,CAAY,OAAgB,GAAG,CAAA;AACpC,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,GAAA,EAA+B;AAC1C,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,GAAG,CAAA;AAAA,IACtC,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,WAAA,CAAY,OAAgB,GAAG,CAAA;AACpC,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,CAAYA,MAAa,MAAA,EAA4B;AACnD,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,KAAA,CAAMA,IAAAA,EAAK,MAAM,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,GAAA,GAAyB;AACvB,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAcA,IAAAA,EAAuB;AAC3C,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,MAAM,QAAA,GAAW;AAAA,MACf,4BAAA;AAAA,MACA,4BAAA;AAAA,MACA,4BAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,IAAI,KAAA;AACJ,MAAA,OAAA,CAAQ,KAAA,GAAQ,OAAA,CAAQ,IAAA,CAAKA,IAAG,OAAO,IAAA,EAAM;AAC3C,QAAA,IAAI,KAAA,CAAM,CAAC,CAAA,EAAG;AACZ,UAAA,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAE,aAAa,CAAA;AAAA,QACpC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,CAAC,GAAG,IAAI,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,EAC5B;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;AAAA,EAEQ,WAAA,CAAY,OAAc,GAAA,EAAmB;AACnD,IAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,aAAA,EAAe,EAAE,KAAK,KAAA,EAAO,KAAA,CAAM,SAAS,CAAA;AAC/D,IAAA,IAAA,CAAK,OAAA,GAAU,OAAO,GAAG,CAAA;AAAA,EAC3B;AACF;AC7ZO,IAAM,cAAA,GAAN,cAA6BM,YAAAA,CAAa;AAAA,EACrC,KAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA,GAAU,IAAA;AAAA,EACV,UAAA;AAAA,EAEV,WAAA,CAAY,KAAA,EAAqB,MAAA,EAAiB,OAAA,GAAU,IAAA,EAAM;AAChE,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAEf,IAAA,IAAA,CAAK,UAAA,GAAa;AAAA,MAChB,IAAA,EAAM,CAAA;AAAA,MACN,MAAA,EAAQ,CAAA;AAAA,MACR,OAAA,EAAS,CAAA;AAAA,MACT,WAAA,EAAa,CAAA;AAAA,MACb,YAAA,EAAc,CAAA;AAAA,MACd,UAAA,EAAY,CAAA;AAAA,MACZ,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AAAA,EAEA,MAAA,GAAe;AACb,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,IAAA,CAAK,KAAK,cAAc,CAAA;AAAA,EAC1B;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AACf,IAAA,IAAA,CAAK,KAAK,eAAe,CAAA;AAAA,EAC3B;AAAA,EAEA,SAAA,GAAqB;AACnB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,aAAA,GAAiC;AAC/B,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,UAAA,EAAW;AAAA,EAC9B;AAAA,EAEA,eAAA,GAAwB;AACtB,IAAA,IAAA,CAAK,UAAA,GAAa;AAAA,MAChB,IAAA,EAAM,CAAA;AAAA,MACN,MAAA,EAAQ,CAAA;AAAA,MACR,OAAA,EAAS,CAAA;AAAA,MACT,WAAA,EAAa,CAAA;AAAA,MACb,YAAA,EAAc,CAAA;AAAA,MACd,UAAA,EAAY,CAAA;AAAA,MACZ,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AAAA,EAEU,gBAAA,CAAiB,MAAsB,QAAA,EAAwB;AACvE,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,IAAA,CAAK,UAAA,CAAW,IAAA,EAAA;AAChB,MAAA,IAAA,CAAK,UAAA,CAAW,UAAA,GAAA,CACb,IAAA,CAAK,UAAA,CAAW,UAAA,IAAc,IAAA,CAAK,UAAA,CAAW,IAAA,GAAO,CAAA,CAAA,GAAK,QAAA,IAAY,IAAA,CAAK,UAAA,CAAW,IAAA;AAAA,IAC3F,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,UAAA,CAAW,MAAA,EAAA;AAChB,MAAA,IAAA,CAAK,UAAA,CAAW,WAAA,GAAA,CACb,IAAA,CAAK,UAAA,CAAW,WAAA,IAAe,IAAA,CAAK,UAAA,CAAW,MAAA,GAAS,CAAA,CAAA,GAAK,QAAA,IAC9D,IAAA,CAAK,UAAA,CAAW,MAAA;AAAA,IACpB;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,UAAA,CAAW,IAAA,GAAO,KAAK,UAAA,CAAW,MAAA;AACrD,IAAA,IAAA,CAAK,WAAW,OAAA,GAAU,KAAA,GAAQ,IAAI,IAAA,CAAK,UAAA,CAAW,OAAO,KAAA,GAAQ,CAAA;AAAA,EACvE;AACF,CAAA;;;ACpEO,IAAM,oBAAA,GAAN,cAAmC,cAAA,CAAe;AAAA,EAC7C,QAAA;AAAA,EACA,UAAA,uBAAiB,GAAA,EAAyB;AAAA,EAC1C,QAAA,uBAAe,GAAA,EAAyB;AAAA,EAElD,YAAY,QAAA,EAA+B;AACzC,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,EAClB;AAAA,EAEA,MAAM,GAAA,CACJN,IAAAA,EACA,MAAA,EACA,OAAA,EACgC;AAChC,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,MAAM,MAAM,IAAA,CAAK,QAAA,CAAS,WAAA,CAAYA,IAAAA,EAAK,QAAQ,OAAO,CAAA;AAE1D,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,KAAA,CAAM,IAAoB,GAAG,CAAA;AAEvD,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAMY,SAAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC9B,QAAA,IAAA,CAAK,gBAAA,CAAiB,OAAOA,SAAQ,CAAA;AAGrC,QAAA,MAAM,WAAA,GAAc,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA;AAC3C,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,WAAA,CAAY,IAAA,EAAA;AAAA,QACd;AAEA,QAAA,IAAA,CAAK,IAAA,CAAK,YAAY,EAAE,GAAA,EAAK,KAAAZ,IAAAA,EAAK,QAAA,EAAAY,WAAU,CAAA;AAC5C,QAAA,IAAA,CAAK,QAAQ,KAAA,CAAM,WAAA,EAAa,EAAE,GAAA,EAAK,QAAA,EAAAA,WAAU,CAAA;AAEjD,QAAA,OAAO,MAAA;AAAA,MACT;AAEA,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC9B,MAAA,IAAA,CAAK,gBAAA,CAAiB,QAAQ,QAAQ,CAAA;AACtC,MAAA,IAAA,CAAK,KAAK,WAAA,EAAa,EAAE,KAAK,GAAA,EAAAZ,IAAAA,EAAK,UAAU,CAAA;AAC7C,MAAA,IAAA,CAAK,QAAQ,KAAA,CAAM,YAAA,EAAc,EAAE,GAAA,EAAK,UAAU,CAAA;AAElD,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,EAAQ,KAAA,CAAM,iBAAA,EAAmB,KAAK,CAAA;AAC3C,MAAA,IAAA,CAAK,IAAA,CAAK,YAAA,EAAc,EAAE,GAAA,EAAK,OAAO,CAAA;AACtC,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,GAAA,CACJA,IAAAA,EACA,MAAA,EACA,QACA,OAAA,EACe;AACf,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,WAAA,CAAYA,IAAAA,EAAK,MAAM,CAAA,EAAG;AAC3C,MAAA,IAAA,CAAK,QAAQ,KAAA,CAAM,qBAAA,EAAuB,EAAE,GAAA,EAAAA,MAAK,CAAA;AACjD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAM,IAAA,CAAK,QAAA,CAAS,WAAA,CAAYA,IAAAA,EAAK,QAAQ,OAAO,CAAA;AAC1D,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,WAAA,CAAYA,MAAK,OAAO,CAAA;AAClD,IAAA,MAAM,IAAA,GAAO,OAAA,EAAS,IAAA,IAAQ,EAAC;AAE/B,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,QAAQ,GAAG,CAAA;AAGrC,MAAA,MAAM,WAAA,GAA2B;AAAA,QAC/B,GAAA;AAAA,QACA,GAAA,EAAAA,IAAAA;AAAA,QACA,MAAA;AAAA,QACA,SAAA,sBAAe,IAAA,EAAK;AAAA,QACpB,GAAA;AAAA,QACA,IAAA,EAAM,CAAA;AAAA,QACN,IAAA;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,CAAE;AAAA,OAC/B;AAEA,MAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,GAAA,EAAK,WAAW,CAAA;AAGpC,MAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,GAAA,KAAQ;AACpB,QAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA,EAAG;AAC3B,UAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,GAAA,kBAAK,IAAI,KAAK,CAAA;AAAA,QAClC;AACA,QAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA,CAAG,IAAI,GAAG,CAAA;AAAA,MACjC,CAAC,CAAA;AAED,MAAA,IAAA,CAAK,UAAA,CAAW,WAAA,EAAA;AAChB,MAAA,IAAA,CAAK,IAAA,CAAK,YAAY,EAAE,GAAA,EAAK,KAAAA,IAAAA,EAAK,GAAA,EAAK,MAAM,CAAA;AAC7C,MAAA,IAAA,CAAK,QAAQ,KAAA,CAAM,cAAA,EAAgB,EAAE,GAAA,EAAK,GAAA,EAAK,MAAM,CAAA;AAGrD,MAAA,IAAI,SAAS,YAAA,EAAc;AACzB,QAAA,MAAM,IAAA,CAAK,oBAAA,CAAqB,GAAA,EAAK,OAAA,CAAQ,YAAY,CAAA;AAAA,MAC3D;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,EAAQ,KAAA,CAAM,iBAAA,EAAmB,KAAK,CAAA;AAC3C,MAAA,IAAA,CAAK,IAAA,CAAK,YAAA,EAAc,EAAE,GAAA,EAAK,OAAO,CAAA;AAAA,IACxC;AAAA,EACF;AAAA,EAEA,gBAAA,GAAkC;AAChC,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,IAAA,GAAO,EAAE,IAAI,CAAA;AAAA,EAC5E;AAAA,EAEA,YAAA,GAA6D;AAC3D,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,IAAA,CAAK,UAAA,CAAW,OAAA,CAAQ,CAAC,MAAA,KAAW;AAClC,MAAA,IAAA,IAAQ,MAAA,CAAO,IAAA;AAAA,IACjB,CAAC,CAAA;AAED,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAK,UAAA,CAAW,IAAA;AAAA,MACzB,eAAA,EAAiB;AAAA,KACnB;AAAA,EACF;AAAA,EAEA,MAAgB,oBAAA,CAAqB,GAAA,EAAa,QAAA,EAAmC;AAEnF,IAAA,IAAA,CAAK,QAAQ,KAAA,CAAM,kCAAA,EAAoC,EAAE,GAAA,EAAK,UAAU,CAAA;AAAA,EAC1E;AACF,CAAA;;;AClJO,IAAM,sBAAA,GAAN,cAAqC,oBAAA,CAAqB;AAAA,EAC/D,MAAM,WAAW,QAAA,EAAqC;AACpD,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,OAAO,CAAA;AAAA,IACT;AAEA,IAAA,IAAI,WAAA,GAAc,CAAA;AAElB,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,IAAI;AAEF,QAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,KAAA,CAAM,KAAK,OAAO,CAAA;AAE1C,QAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,UAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA;AAC3C,UAAA,IAAI,OAAA,EAAS;AACX,YAAA,WAAA,EAAA;AACA,YAAA,IAAA,CAAK,UAAA,CAAW,OAAO,GAAG,CAAA;AAG1B,YAAA,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,CAAC,MAAA,KAAW;AAChC,cAAA,MAAA,CAAO,OAAO,GAAG,CAAA;AAAA,YACnB,CAAC,CAAA;AAAA,UACH;AAAA,QACF;AAGA,QAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,EAAG;AAC9B,UAAA,MAAM,UAAA,GAAa,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAE5C,UAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,YAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA;AAC3C,YAAA,IAAI,OAAA,EAAS;AACX,cAAA,WAAA,EAAA;AACA,cAAA,IAAA,CAAK,UAAA,CAAW,OAAO,GAAG,CAAA;AAAA,YAC5B;AAAA,UACF;AAEA,UAAA,IAAA,CAAK,QAAA,CAAS,OAAO,OAAO,CAAA;AAAA,QAC9B;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,QAAQ,KAAA,CAAM,oBAAA,EAAsB,EAAE,OAAA,EAAS,OAAO,CAAA;AAAA,MAC7D;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,WAAW,YAAA,IAAgB,WAAA;AAChC,IAAA,IAAA,CAAK,KAAK,kBAAA,EAAoB,EAAE,QAAA,EAAU,KAAA,EAAO,aAAa,CAAA;AAC9D,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,mBAAA,EAAqB,EAAE,QAAA,EAAU,KAAA,EAAO,aAAa,CAAA;AAEvE,IAAA,OAAO,WAAA;AAAA,EACT;AAAA,EAEA,MAAM,kBAAkB,KAAA,EAAgC;AACtD,IAAA,MAAM,QAAA,GAAW;AAAA,MACf,IAAI,KAAK,CAAA,CAAA,CAAA;AAAA,MACT,SAAS,KAAK,CAAA,EAAA,CAAA;AAAA,MACd;AAAA;AAAA,KACF;AAEA,IAAA,OAAO,IAAA,CAAK,WAAW,QAAQ,CAAA;AAAA,EACjC;AAAA,EAEA,MAAM,aAAA,GAA+B;AACnC,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,CAAK,MAAM,KAAA,EAAM;AACvB,IAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AACtB,IAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AAEpB,IAAA,IAAA,CAAK,UAAA,CAAW,YAAA,IAAgB,IAAA,CAAK,UAAA,CAAW,WAAA;AAChD,IAAA,IAAA,CAAK,WAAW,WAAA,GAAc,CAAA;AAE9B,IAAA,IAAA,CAAK,KAAK,cAAc,CAAA;AACxB,IAAA,IAAA,CAAK,MAAA,EAAQ,KAAK,eAAe,CAAA;AAAA,EACnC;AACF,CAAA;;;AC3EO,IAAM,qBAAA,GAAN,cAAoC,sBAAA,CAAuB;AAAA,EACxD,eAAA;AAAA,EAER,MAAM,OACJ,OAAA,EACe;AACf,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,sBAAA,EAAwB,EAAE,KAAA,EAAO,OAAA,CAAQ,QAAQ,CAAA;AAEnE,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,MAAM,GAAA,EAAK,KAAA,CAAM,MAAA,EAAQ,KAAA,CAAM,OAAO,CAAA;AAEpE,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,IAAA,CAAK,QAAQ,KAAA,CAAM,gCAAA,EAAkC,EAAE,GAAA,EAAK,KAAA,CAAM,KAAK,CAAA;AAAA,QAEzE;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,qBAAA,EAAuB,EAAE,KAAK,KAAA,CAAM,GAAA,EAAK,OAAO,CAAA;AAAA,MACrE;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,KAAK,eAAA,EAAiB,EAAE,KAAA,EAAO,OAAA,CAAQ,QAAQ,CAAA;AACpD,IAAA,IAAA,CAAK,MAAA,EAAQ,KAAK,wBAAwB,CAAA;AAAA,EAC5C;AAAA,EAEA,iBAAA,CAAkB,aAAa,GAAA,EAAc;AAC3C,IAAA,IAAA,CAAK,gBAAA,EAAiB;AAEtB,IAAA,IAAA,CAAK,eAAA,GAAkB,YAAY,MAAM;AACvC,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,MAAA,IAAA,CAAK,UAAA,CAAW,OAAA,CAAQ,CAAC,MAAA,EAAQ,GAAA,KAAQ;AACvC,QAAA,MAAM,GAAA,GAAM,GAAA,GAAM,MAAA,CAAO,SAAA,CAAU,OAAA,EAAQ;AAE3C,QAAA,IAAI,GAAA,GAAM,MAAA,CAAO,GAAA,GAAM,GAAA,EAAM;AAC3B,UAAA,IAAA,CAAK,UAAA,CAAW,OAAO,GAAG,CAAA;AAG1B,UAAA,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,CAAC,GAAA,KAAQ;AAC3B,YAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA,EAAG,OAAO,GAAG,CAAA;AAAA,UACpC,CAAC,CAAA;AAAA,QACH;AAAA,MACF,CAAC,CAAA;AAAA,IACH,GAAG,UAAU,CAAA;AAAA,EACf;AAAA,EAEA,gBAAA,GAAyB;AACvB,IAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,MAAA,aAAA,CAAc,KAAK,eAAe,CAAA;AAClC,MAAA,IAAA,CAAK,eAAA,GAAkB,MAAA;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,IAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AACtB,IAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AACpB,IAAA,IAAA,CAAK,kBAAA,EAAmB;AAAA,EAC1B;AACF,CAAA;;;ACpDO,IAAM,mBAAA,GAAN,cAAkC,qBAAA,CAAsB;AAAA,EAC7D,WAAA,CACE,KAAA,EACA,OAAA,GAII,EAAC,EACL;AACA,IAAA,KAAA,CAAM,KAAA,EAAO,OAAA,CAAQ,MAAA,EAAQ,OAAA,CAAQ,WAAW,IAAI,CAAA;AACpD,IAAA,IAAA,CAAK,QAAA,GAAW,OAAA,CAAQ,QAAA,IAAY,IAAI,oBAAA,EAAqB;AAC7D,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,EACzB;AACF;;;ACYO,IAAM,aAAA,GAAN,cAA4BM,YAAAA,CAAwC;AAAA,EACjE,OAAA;AAAA,EACA,YAAA;AAAA,EACA,iBAAA;AAAA,EACA,UAAA;AAAA,EACA,iBAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,aAAA;AAAA,EAER,YAAY,OAAA,EAA+B;AACzC,IAAA,KAAA,EAAM;AAEN,IAAA,IAAA,CAAK,UAAU,OAAA,CAAQ,OAAA;AACvB,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,iBAAA,GAAoB,IAAI,GAAA,CAAI,OAAA,CAAQ,qBAAqB,CAAC,QAAA,EAAU,MAAA,EAAQ,UAAU,CAAC,CAAA;AAC5F,IAAA,IAAA,CAAK,UAAA,GAAa,QAAQ,UAAA,IAAc,IAAA;AACxC,IAAA,IAAA,CAAK,iBAAA,GAAoB,QAAQ,iBAAA,IAAqB,KAAA;AACtD,IAAA,IAAA,CAAK,WAAA,GAAc,QAAQ,WAAA,IAAe,KAAA;AAC1C,IAAA,IAAA,CAAK,gBAAgB,OAAA,CAAQ,aAAA;AAG7B,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,mBAAA,CAAoB,OAAA,CAAQ,KAAA,EAAO;AAAA,MACzD,QAAA,EAAU,OAAA,CAAQ,QAAA,IAAY,IAAI,kBAAA,EAAmB;AAAA,MACrD,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,OAAA,EAAS,QAAQ,OAAA,IAAW;AAAA,KAC7B,CAAA;AAGD,IAAA,IAAI,QAAQ,IAAA,CAAK,OAAA,IAAW,OAAO,IAAA,CAAK,OAAA,CAAQ,OAAO,UAAA,EAAY;AACjE,MAAA,IAAA,CAAK,OAAA,CAAQ,EAAA,CAAG,SAAA,EAAW,CAAA,GAAI,IAAA,KAAoB;AACjD,QAAA,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,GAAG,IAAI,CAAA;AAC5B,QAAA,KAAK,KAAK,aAAA,EAAc;AAAA,MAC1B,CAAC,CAAA;AACD,MAAA,IAAA,CAAK,OAAA,CAAQ,EAAA,CAAG,YAAA,EAAc,CAAA,GAAI,IAAA,KAAoB,KAAK,IAAA,CAAK,YAAA,EAAc,GAAG,IAAI,CAAC,CAAA;AACtF,MAAA,IAAA,CAAK,OAAA,CAAQ,EAAA,CAAG,OAAA,EAAS,CAAA,GAAI,IAAA,KAAoB,KAAK,IAAA,CAAK,OAAA,EAAS,GAAG,IAAI,CAAC,CAAA;AAAA,IAC9E;AAGA,IAAA,IAAA,CAAK,YAAA,CAAa,EAAA,CAAG,UAAA,EAAY,CAAC,IAAA,KAAS;AACzC,MAAA,IAAA,CAAK,MAAA,EAAQ,KAAA,CAAM,WAAA,EAAa,IAAI,CAAA;AACpC,MAAA,IAAA,CAAK,IAAA,CAAK,YAAY,IAAI,CAAA;AAAA,IAC5B,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,YAAA,CAAa,EAAA,CAAG,WAAA,EAAa,CAAC,IAAA,KAAS;AAC1C,MAAA,IAAA,CAAK,MAAA,EAAQ,KAAA,CAAM,YAAA,EAAc,IAAI,CAAA;AACrC,MAAA,IAAA,CAAK,IAAA,CAAK,aAAa,IAAI,CAAA;AAAA,IAC7B,CAAC,CAAA;AAGD,IAAA,IAAI,QAAQ,IAAA,CAAK,OAAA,IAAW,OAAO,IAAA,CAAK,OAAA,CAAQ,OAAO,UAAA,EAAY;AACjE,MAAA,IAAA,CAAK,OAAA,CAAQ,EAAA,CAAG,OAAA,EAAS,CAAC,IAAA,KAAc;AACtC,QAAA,IAAI,KAAK,OAAA,IAAW,IAAA,CAAK,cAAA,CAAe,IAAA,CAAK,OAAO,CAAA,EAAG;AACrD,UAAA,IAAA,CAAK,uBAAuB,IAAA,CAAK,GAAG,CAAA,CAAE,KAAA,CAAM,CAAC,KAAA,KAAiB;AAC5D,YAAA,IAAA,CAAK,MAAA,EAAQ,KAAA,CAAM,0BAAA,EAA4B,KAAK,CAAA;AAAA,UACtD,CAAC,CAAA;AAAA,QACH;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEA,IAAI,IAAA,GAAe;AACjB,IAAA,OAAO,CAAA,MAAA,EAAS,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA,CAAA;AAAA,EACnC;AAAA,EAEA,IAAI,OAAA,GAAkB;AACpB,IAAA,OAAO,KAAK,OAAA,CAAQ,OAAA;AAAA,EACtB;AAAA,EAEA,IAAI,WAAA,GAAuB;AACzB,IAAA,OAAO,KAAK,OAAA,CAAQ,WAAA;AAAA,EACtB;AAAA,EAEA,MAAM,QAAQ,MAAA,EAAyC;AACrD,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA;AAAA,EACnC;AAAA,EAEA,MAAM,UAAA,GAA4B;AAChC,IAAA,MAAM,IAAA,CAAK,QAAQ,UAAA,EAAW;AAC9B,IAAA,MAAM,IAAA,CAAK,aAAa,aAAA,EAAc;AAAA,EACxC;AAAA,EAEA,MAAM,KAAA,CACJN,IAAAA,EACA,MAAA,EACA,OAAA,EACyB;AACzB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAeA,IAAG,CAAA;AAMvC,IAAA,IAAI,OAAA,EAAS,KAAA,KAAU,KAAA,IAAS,CAAC,IAAA,CAAK,YAAY,OAAA,EAAS,OAAO,CAAA,IAAK,OAAA,EAAS,WAAA,EAAa;AAC3F,MAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,CAASA,IAAAA,EAAK,QAAQ,OAAO,CAAA;AAAA,IACnD;AAEA,IAAA,MAAM,eAAkC,OAAO,OAAA,EAAS,UAAU,QAAA,GAAW,OAAA,CAAQ,QAAQ,EAAC;AAE9F,IAAA,IAAI;AAEF,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,aAAa,GAAA,CAAOA,IAAAA,EAAK,QAAqB,YAAY,CAAA;AAEpF,MAAA,IAAI,MAAA,EAAQ;AAEV,QAAA,MAAMa,SAAAA,GAAY,KAAK,YAAA,CAAqB,QAAA;AAC5C,QAAA,IAAIA,qBAAoB,kBAAA,EAAoB;AAC1C,UAAAA,SAAAA,CAAS,oBAAA,CAAqBb,IAAAA,EAAK,CAAC,CAAA;AAAA,QACtC;AAEA,QAAA,OAAO,MAAA;AAAA,MACT;AAGA,MAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,QAAQ,KAAA,CAASA,IAAAA,EAAK,QAAQ,OAAO,CAAA;AAC/D,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAG9B,MAAA,MAAM,QAAA,GAAY,KAAK,YAAA,CAAqB,QAAA;AAC5C,MAAA,IAAI,oBAAoB,kBAAA,EAAoB;AAC1C,QAAA,QAAA,CAAS,oBAAA,CAAqBA,MAAK,QAAQ,CAAA;AAAA,MAC7C;AAGA,MAAA,IAAI,IAAA,CAAK,iBAAA,CAAkB,MAAA,EAAQ,OAAO,CAAA,EAAG;AAC3C,QAAA,MAAM,KAAK,YAAA,CAAa,GAAA,CAAIA,IAAAA,EAAK,MAAA,EAAqB,QAAQ,YAAY,CAAA;AAAA,MAC5E;AAEA,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AAEd,MAAA,MAAM,YAAA,GAAgB,SAAS,KAAA,KAAkB,KAAA;AACjD,MAAA,IAAI,IAAA,CAAK,eAAe,YAAA,EAAc;AACpC,QAAA,MAAM,WAAA,GAAc;AAAA,UAClB,MAAM,EAAC;AAAA,UACP,QAAA,EAAU,CAAA;AAAA,UACV;AAAA,SACF;AAEA,QAAA,MAAM,IAAA,CAAK,YAAA,CAAa,GAAA,CAAIA,IAAAA,EAAK,QAAqB,WAAA,EAAa;AAAA,UACjE,GAAG,YAAA;AAAA,UACH,GAAA,EAAK;AAAA;AAAA,SACN,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,iBAAiB,OAAA,EAAoD;AACzE,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,OAAA,CAAQ,iBAAiB,OAAO,CAAA;AAG/D,IAAA,MAAM,cAAA,GAAiB,WAAA,CAAY,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA;AAC1D,IAAA,MAAM,gBAAA,GAAmB,WAAA,CAAY,QAAA,CAAS,IAAA,CAAK,WAAW,CAAA;AAE9D,IAAA,WAAA,CAAY,SAAS,YAAY;AAC/B,MAAA,MAAM,MAAA,GAAS,MAAM,cAAA,EAAe;AAEpC,MAAA,MAAM,IAAA,CAAK,aAAa,aAAA,EAAc;AACtC,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAEA,IAAA,WAAA,CAAY,WAAW,YAAY;AACjC,MAAA,MAAM,MAAA,GAAS,MAAM,gBAAA,EAAiB;AAEtC,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAEA,IAAA,OAAO,WAAA;AAAA,EACT;AAAA,EAEA,MAAM,OAAA,CAAqBA,IAAAA,EAAa,IAAA,EAA8C;AACpF,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAWA,IAAAA,EAAK,IAAI,CAAA;AAAA,EAC1C;AAAA,EAEA,YAAA,GAA0B;AACxB,IAAA,OAAO,IAAA,CAAK,QAAQ,YAAA,EAAa;AAAA,EACnC;AAAA,EAEA,MAAM,IAAA,GAAyB;AAC7B,IAAA,OAAO,IAAA,CAAK,QAAQ,IAAA,EAAK;AAAA,EAC3B;AAAA,EAEA,OAAO,KAAA,EAAwB;AAC7B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA;AAAA,EAClC;AAAA,EAEA,iBAAiB,UAAA,EAA4B;AAC3C,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAAiB,UAAU,CAAA;AAAA,EACjD;AAAA,EAEA,OAAA,CACEA,IAAAA,EACA,MAAA,EACA,OAAA,EACyB;AAEzB,IAAA,OAAO,IAAA,CAAK,KAAA,CAASA,IAAAA,EAAK,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC3C;AAAA,EAEA,kBAAA,GAA2E;AACzE,IAAA,OAAO,IAAA,CAAK,QAAQ,kBAAA,EAAsB;AAAA,EAC5C;AAAA,EAEA,eAAA,GAAuC;AACrC,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA,EAEA,MAAM,WAAA,GAA6B;AACjC,IAAA,IAAI,CAAC,IAAA,CAAK,aAAA,IAAiB,IAAA,CAAK,aAAA,CAAc,WAAW,CAAA,EAAG;AAC1D,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,MAAA,EAAQ,KAAK,uBAAA,EAAyB,EAAE,OAAO,IAAA,CAAK,aAAA,CAAc,QAAQ,CAAA;AAE/E,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,aAAA,EAAe;AACtC,MAAA,IAAI;AACF,QAAA,MAAM,SAAS,MAAM,IAAA,CAAK,MAAM,KAAA,CAAM,GAAA,EAAK,MAAM,MAAA,EAAuB;AAAA,UACtE,OAAO,EAAE,GAAA,EAAK,KAAA,CAAM,GAAA,IAAO,KAAK,UAAA;AAAW,SAC5C,CAAA;AAED,QAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,qBAAA,EAAuB;AAAA,UACxC,KAAK,KAAA,CAAM,GAAA;AAAA,UACX,UAAU,MAAA,CAAO;AAAA,SAClB,CAAA;AAAA,MACH,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,qBAAA,EAAuB;AAAA,UACxC,KAAK,KAAA,CAAM,GAAA;AAAA,UACX;AAAA,SACD,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,MAAA,EAAQ,KAAK,wBAAwB,CAAA;AAAA,EAC5C;AAAA,EAEA,MAAc,aAAA,GAA+B;AAC3C,IAAA,IAAI,IAAA,CAAK,aAAA,IAAiB,IAAA,CAAK,aAAA,CAAc,SAAS,CAAA,EAAG;AAEvD,MAAA,UAAA,CAAW,MAAM;AACf,QAAA,IAAA,CAAK,WAAA,EAAY,CAAE,KAAA,CAAM,CAAC,KAAA,KAAU;AAClC,UAAA,IAAA,CAAK,MAAA,EAAQ,KAAA,CAAM,oBAAA,EAAsB,KAAK,CAAA;AAAA,QAChD,CAAC,CAAA;AAAA,MACH,GAAG,GAAI,CAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,WAAA,CAAY,SAAiB,OAAA,EAAiC;AACpE,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,IAAI,CAAC,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,OAAO,CAAA,EAAG;AACxC,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,IAAI,SAAS,KAAA,KAAU,IAAA,IAAQ,OAAO,OAAA,EAAS,UAAU,QAAA,EAAU;AACjE,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,iBAAA,CAAkB,QAAqB,QAAA,EAAkC;AAE/E,IAAA,IAAI,CAAC,IAAA,CAAK,iBAAA,IAAqB,MAAA,CAAO,aAAa,CAAA,EAAG;AACpD,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,IAAK,OAAe,KAAA,EAAO;AACzB,MAAA,OAAO,IAAA,CAAK,WAAA;AAAA,IACd;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,eAAeA,IAAAA,EAAqB;AAC1C,IAAA,OAAOA,IAAAA,CAAI,MAAK,CAAE,KAAA,CAAM,KAAK,CAAA,CAAE,CAAC,CAAA,EAAG,WAAA,EAAY,IAAK,EAAA;AAAA,EACtD;AAAA,EAEQ,eAAe,OAAA,EAA0B;AAC/C,IAAA,MAAM,aAAA,GAAgB,CAAC,QAAA,EAAU,QAAA,EAAU,UAAU,QAAA,EAAU,OAAA,EAAS,QAAQ,UAAU,CAAA;AAC1F,IAAA,OAAO,aAAA,CAAc,QAAA,CAAS,OAAA,CAAQ,WAAA,EAAa,CAAA;AAAA,EACrD;AAAA,EAEA,MAAc,uBAAuBA,IAAAA,EAA4B;AAC/D,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,iBAAA,CAAkBA,IAAG,CAAA;AACzC,IAAA,MAAM,WAAqB,EAAC;AAE5B,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,KAAU;AACxB,MAAA,QAAA,CAAS,KAAK,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAA,EAAK,CAAA,MAAA,EAAS,KAAK,CAAA,EAAA,CAAI,CAAA;AAAA,IAChD,CAAC,CAAA;AAED,IAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,MAAA,MAAM,IAAA,CAAK,YAAA,CAAa,UAAA,CAAW,QAAQ,CAAA;AAAA,IAC7C;AAAA,EACF;AAAA,EAEQ,kBAAkBA,IAAAA,EAAuB;AAC/C,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,MAAM,QAAA,GAAW;AAAA,MACf,oBAAA;AAAA,MACA,oBAAA;AAAA,MACA,sBAAA;AAAA,MACA,6BAAA;AAAA,MACA,6BAAA;AAAA,MACA,8BAAA;AAAA,MACA,4BAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC5B,MAAA,IAAI,KAAA;AACJ,MAAA,OAAA,CAAQ,KAAA,GAAQ,OAAA,CAAQ,IAAA,CAAKA,IAAG,OAAO,IAAA,EAAM;AAC3C,QAAA,IAAI,KAAA,CAAM,CAAC,CAAA,EAAG;AACZ,UAAA,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAE,aAAa,CAAA;AAAA,QACpC;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAED,IAAA,OAAO,CAAC,GAAG,IAAI,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,EAC5B;AACF;AAKO,SAAS,mBAAA,CACd,OAAA,EACA,KAAA,EACA,OAAA,EACe;AACf,EAAA,OAAO,IAAI,aAAA,CAAc;AAAA,IACvB,OAAA;AAAA,IACA,KAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;ACvWO,IAAM,iBAAN,MAAqB;AAAA,EACT,MAAA;AAAA,EAEjB,WAAA,CAAY,MAAA,GAAuB,EAAC,EAAG;AACrC,IAAA,MAAM,SAAA,GAAY,OAAO,SAAA,IAAa,aAAA;AAEtC,IAAA,MAAM,QAAA,GAAW,SAAA,KAAc,mBAAA,GAAsB,EAAA,GAAK,OAAO,QAAA,IAAY,EAAA;AAG7E,IAAA,IAAI,SAAA,GAAY,OAAO,SAAA,IAAa,EAAA;AACpC,IAAA,IAAI,CAAC,OAAO,SAAA,EAAW;AACrB,MAAA,IAAI,SAAA,CAAU,QAAA,CAAS,KAAK,CAAA,EAAG;AAC7B,QAAA,SAAA,GAAY,EAAA;AAAA,MACd,CAAA,MAAA,IAAW,SAAA,CAAU,QAAA,CAAS,KAAK,CAAA,EAAG;AACpC,QAAA,SAAA,GAAY,EAAA;AAAA,MACd,CAAA,MAAA,IAAW,SAAA,CAAU,QAAA,CAAS,KAAK,CAAA,EAAG;AACpC,QAAA,SAAA,GAAY,EAAA;AAAA,MACd;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,SAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA;AAAA,MACA,UAAA,EAAY,OAAO,UAAA,IAAc,EAAA;AAAA,MACjC,UAAA,EAAY,OAAO,UAAA,IAAc,GAAA;AAAA,MACjC,MAAA,EAAQ,OAAO,MAAA,IAAU;AAAA,KAC3B;AAAA,EACF;AAAA,EAEQ,SAAA,CAAU,UAAkB,IAAA,EAAsB;AACxD,IAAA,OAAO,UAAA;AAAA,MACL,QAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAK,MAAA,CAAO,UAAA;AAAA,MACZ,KAAK,MAAA,CAAO,SAAA;AAAA,MACZ,KAAK,MAAA,CAAO;AAAA,KACd;AAAA,EACF;AAAA,EAEA,OAAA,CAAQ,IAAA,EAAc,OAAA,GAA6B,EAAC,EAAkB;AACpE,IAAA,MAAM,OAAO,OAAA,CAAQ,IAAA,IAAQ,WAAA,CAAY,IAAA,CAAK,OAAO,UAAU,CAAA;AAC/D,IAAA,MAAM,MAAM,OAAA,CAAQ,GAAA,GAChB,MAAA,CAAO,IAAA,CAAK,QAAQ,GAAA,EAAK,KAAK,CAAA,GAC9B,IAAA,CAAK,UAAU,OAAA,CAAQ,GAAA,CAAI,0BAA0B,CAAA,IAAK,eAAe,IAAI,CAAA;AAEjF,IAAA,MAAM,EAAA,GAAK,WAAA,CAAY,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA;AAC3C,IAAA,MAAM,SAAS,cAAA,CAAe,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW,KAAK,EAAE,CAAA;AAE5D,IAAA,IAAI,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,IAAA,EAAM,QAAQ,KAAK,CAAA;AACjD,IAAA,SAAA,IAAa,MAAA,CAAO,MAAM,KAAK,CAAA;AAE/B,IAAA,MAAM,MAAA,GAAwB;AAAA,MAC5B,SAAA;AAAA,MACA,IAAA,EAAM,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA;AAAA,MACzB,EAAA,EAAI,EAAA,CAAG,QAAA,CAAS,KAAK;AAAA,KACvB;AAGA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,QAAA,CAAS,KAAK,CAAA,IAAK,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,QAAA,CAAS,UAAU,CAAA,EAAG;AACvF,MAAA,MAAA,CAAO,OAAA,GAAW,MAAA,CAAe,UAAA,EAAW,CAAE,SAAS,KAAK,CAAA;AAAA,IAC9D;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,OAAA,CAAQ,aAAA,EAA8B,OAAA,GAA6B,EAAC,EAAW;AAC7E,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,aAAA,CAAc,MAAM,KAAK,CAAA;AAClD,IAAA,MAAM,MAAM,OAAA,CAAQ,GAAA,GAChB,MAAA,CAAO,IAAA,CAAK,QAAQ,GAAA,EAAK,KAAK,CAAA,GAC9B,IAAA,CAAK,UAAU,OAAA,CAAQ,GAAA,CAAI,0BAA0B,CAAA,IAAK,eAAe,IAAI,CAAA;AAEjF,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,IAAA,CAAK,aAAA,CAAc,IAAI,KAAK,CAAA;AAC9C,IAAA,MAAM,WAAW,gBAAA,CAAiB,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW,KAAK,EAAE,CAAA;AAGhE,IAAA,IAAA,CACG,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,QAAA,CAAS,KAAK,CAAA,IAAK,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,QAAA,CAAS,UAAU,CAAA,KACnF,cAAc,OAAA,EACd;AACA,MAAC,SAAiB,UAAA,CAAW,MAAA,CAAO,KAAK,aAAA,CAAc,OAAA,EAAS,KAAK,CAAC,CAAA;AAAA,IACxE;AAEA,IAAA,IAAI,YAAY,QAAA,CAAS,MAAA,CAAO,aAAA,CAAc,SAAA,EAAW,OAAO,MAAM,CAAA;AACtE,IAAA,SAAA,IAAa,QAAA,CAAS,MAAM,MAAM,CAAA;AAElC,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,KAAA,EAAwB;AACnC,IAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AACzC,MAAA,OAAO,EAAA;AAAA,IACT;AAEA,IAAA,MAAM,OAAO,OAAO,KAAA,KAAU,WAAW,KAAA,GAAQ,IAAA,CAAK,UAAU,KAAK,CAAA;AACrE,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA;AAGnC,IAAA,OAAO;AAAA,MACL,KAAK,MAAA,CAAO,SAAA;AAAA,MACZ,SAAA,CAAU,IAAA;AAAA,MACV,SAAA,CAAU,EAAA;AAAA,MACV,UAAU,OAAA,IAAW,EAAA;AAAA,MACrB,SAAA,CAAU;AAAA,KACZ,CAAE,KAAK,GAAG,CAAA;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,cAAA,EAAiC;AAC5C,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,KAAA,CAAM,GAAG,CAAA;AACtC,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,MAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,IAClD;AAEA,IAAA,MAAM,CAAC,SAAA,EAAW,IAAA,EAAM,EAAA,EAAI,OAAA,EAAS,SAAS,CAAA,GAAI,KAAA;AAGlD,IAAA,IAAI,SAAA,KAAc,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW;AACvC,MAAA,MAAM,IAAI,MAAM,CAAA,6BAAA,EAAgC,IAAA,CAAK,OAAO,SAAS,CAAA,MAAA,EAAS,SAAS,CAAA,CAAE,CAAA;AAAA,IAC3F;AAEA,IAAA,MAAM,aAAA,GAA+B;AAAA,MACnC,SAAA;AAAA,MACA,IAAA;AAAA,MACA,EAAA;AAAA,MACA,SAAS,OAAA,IAAW;AAAA,KACtB;AAEA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,aAAa,CAAA;AAG5C,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,MAAM,SAAS,CAAA;AAAA,IAC7B,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAsB;AACpB,IAAA,OAAO,YAAY,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,CAAE,SAAS,KAAK,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,KAAA,EAAuB;AAC1B,IAAA,MAAM,IAAA,GAAO,SAAA,CAAQ,QAAa,CAAA,CAAE,WAAW,QAAQ,CAAA;AACvD,IAAA,IAAA,CAAK,OAAO,KAAK,CAAA;AACjB,IAAA,OAAO,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,CAAY,OAAe,IAAA,EAAuB;AAChD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,KAAM,IAAA;AAAA,EAC9B;AACF;AAGO,IAAM,MAAA,GAAS,IAAI,cAAA;AAGnB,IAAM,gBAAA,GAAmB;AAAA,EAC9B,WAAA,EAAa,aAAA;AAAA,EACb,WAAA,EAAa,aAAA;AAAA,EACb,WAAA,EAAa,aAAA;AAAA,EACb,WAAA,EAAa,aAAA;AAAA,EACb,WAAA,EAAa,aAAA;AAAA,EACb,WAAA,EAAa,aAAA;AAAA,EACb,iBAAA,EAAmB;AACrB;;;AC7KO,IAAe,aAAf,MAA0B;AAAA,EAIvB,cAAA,GAAiB,CAAA;AAAA;AAAA;AAAA;AAAA,EAKzB,eAAA,GAAwB;AACtB,IAAA,IAAA,CAAK,cAAA,GAAiB,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAYA,iBAAiB,UAAA,EAA4B;AAC3C,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,CAAO,eAAA;AAE1B,IAAA,IAAI,UAAA,CAAW,QAAA,CAAS,GAAG,CAAA,EAAG;AAC5B,MAAA,OAAO,WACJ,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,IAAA,KAAS,CAAA,EAAG,KAAK,CAAA,EAAG,IAAI,CAAA,EAAG,KAAK,CAAA,CAAE,CAAA,CACvC,KAAK,GAAG,CAAA;AAAA,IACb;AACA,IAAA,OAAO,CAAA,EAAG,KAAK,CAAA,EAAG,UAAU,GAAG,KAAK,CAAA,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAUA,YAAY,UAAA,EAAwC;AAClD,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,MAAM,WAAsB,EAAC;AAG7B,IAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AACnB,IAAA,IAAI,WAAW,QAAA,EAAU;AACvB,MAAA,KAAA,CAAM,KAAK,UAAU,CAAA;AAAA,IACvB;AACA,IAAA,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,WAAW,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,GAAI,GAAG,CAAA;AAG9E,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,KAAA,CAAM,KAAK,MAAM,CAAA;AACjB,MAAA,MAAM,aAAa,UAAA,CAAW,SAAA,GAC1B,GAAG,IAAA,CAAK,gBAAA,CAAiB,WAAW,IAAI,CAAC,OAAO,IAAA,CAAK,gBAAA,CAAiB,WAAW,SAAS,CAAC,KAC3F,IAAA,CAAK,gBAAA,CAAiB,WAAW,IAAI,CAAA;AACzC,MAAA,KAAA,CAAM,KAAK,UAAU,CAAA;AAAA,IACvB;AAGA,IAAA,KAAA,MAAW,IAAA,IAAQ,WAAW,KAAA,EAAO;AACnC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,MAAA,EAAS,KAAK,gBAAA,CAAiB,IAAA,CAAK,KAAK,CAAC,CAAA,CAAE,CAAA;AACnE,MAAA,IAAI,KAAK,KAAA,EAAO;AACd,QAAA,KAAA,CAAM,KAAK,CAAA,GAAA,EAAM,IAAA,CAAK,iBAAiB,IAAA,CAAK,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,MACtD;AACA,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,GAAA,EAAM,IAAA,CAAK,SAAS,CAAA,CAAE,CAAA;AACjC,MAAA,QAAA,CAAS,IAAA,CAAK,GAAG,IAAA,CAAK,QAAQ,CAAA;AAAA,IAChC;AAGA,IAAA,IAAI,UAAA,CAAW,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC/B,MAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAClB,MAAA,KAAA,CAAM,KAAK,IAAA,CAAK,gBAAA,CAAiB,UAAA,CAAW,KAAA,EAAO,QAAQ,CAAC,CAAA;AAAA,IAC9D;AAGA,IAAA,IAAI,UAAA,CAAW,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AACjC,MAAA,KAAA,CAAM,KAAK,UAAU,CAAA;AACrB,MAAA,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IACnF;AAGA,IAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,MAAA,KAAA,CAAM,IAAA,CAAK,QAAA,EAAU,UAAA,CAAW,MAAA,CAAO,SAAS,CAAA;AAChD,MAAA,QAAA,CAAS,IAAA,CAAK,GAAG,UAAA,CAAW,MAAA,CAAO,QAAQ,CAAA;AAAA,IAC7C;AAGA,IAAA,IAAI,UAAA,CAAW,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AACjC,MAAA,KAAA,CAAM,KAAK,UAAU,CAAA;AACrB,MAAA,KAAA,CAAM,IAAA;AAAA,QACJ,WAAW,OAAA,CACR,GAAA,CAAI,CAAC,EAAE,MAAA,EAAQ,WAAU,KAAM,CAAA,EAAG,IAAA,CAAK,gBAAA,CAAiB,MAAM,CAAC,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,CAAA,CAC9E,KAAK,IAAI;AAAA,OACd;AAAA,IACF;AAGA,IAAA,IAAA,CAAK,iBAAA,CAAkB,KAAA,EAAO,UAAA,CAAW,KAAA,EAAO,WAAW,MAAM,CAAA;AAEjE,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AAAA,MACnB;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,UAAA,EAAwC;AAClD,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,MAAM,WAAsB,EAAC;AAE7B,IAAA,KAAA,CAAM,KAAK,aAAa,CAAA;AACxB,IAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,gBAAA,CAAiB,UAAA,CAAW,KAAK,CAAC,CAAA;AAElD,IAAA,MAAM,OAAA,GAAU,OAAO,IAAA,CAAK,UAAA,CAAW,KAAK,CAAC,CAAA,IAAK,EAAE,CAAA;AACpD,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,KAAK,QAAQ,CAAA;AAEvF,IAAA,MAAM,YAAsB,EAAC;AAC7B,IAAA,KAAA,MAAW,GAAA,IAAO,WAAW,IAAA,EAAM;AACjC,MAAA,MAAM,eAAyB,EAAC;AAChC,MAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,QAAA,YAAA,CAAa,IAAA,CAAK,IAAA,CAAK,uBAAA,EAAyB,CAAA;AAChD,QAAA,QAAA,CAAS,IAAA,CAAK,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA,MACxB;AACA,MAAA,SAAA,CAAU,KAAK,CAAA,CAAA,EAAI,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,IAC/C;AACA,IAAA,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAC,CAAA;AAG/B,IAAA,IAAI,UAAA,CAAW,SAAA,IAAa,UAAA,CAAW,SAAA,CAAU,SAAS,CAAA,EAAG;AAC3D,MAAA,KAAA,CAAM,KAAK,WAAW,CAAA;AACtB,MAAA,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,SAAA,CAAU,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IACrF;AAEA,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AAAA,MACnB;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,UAAA,EAAwC;AAClD,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,MAAM,WAAsB,EAAC;AAE7B,IAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AACnB,IAAA,KAAA,CAAM,KAAK,IAAA,CAAK,gBAAA,CAAiB,UAAA,CAAW,KAAK,GAAG,KAAK,CAAA;AAEzD,IAAA,MAAM,aAAuB,EAAC;AAC9B,IAAA,KAAA,MAAW,CAAC,QAAQ,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA,EAAG;AAC7D,MAAA,UAAA,CAAW,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,gBAAA,CAAiB,MAAM,CAAC,CAAA,GAAA,EAAM,IAAA,CAAK,uBAAA,EAAyB,CAAA,CAAE,CAAA;AACtF,MAAA,QAAA,CAAS,KAAK,KAAK,CAAA;AAAA,IACrB;AACA,IAAA,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC,CAAA;AAGhC,IAAA,IAAI,UAAA,CAAW,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC/B,MAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAClB,MAAA,KAAA,CAAM,KAAK,IAAA,CAAK,gBAAA,CAAiB,UAAA,CAAW,KAAA,EAAO,QAAQ,CAAC,CAAA;AAAA,IAC9D;AAGA,IAAA,IAAI,UAAA,CAAW,SAAA,IAAa,UAAA,CAAW,SAAA,CAAU,SAAS,CAAA,EAAG;AAC3D,MAAA,KAAA,CAAM,KAAK,WAAW,CAAA;AACtB,MAAA,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,SAAA,CAAU,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IACrF;AAEA,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AAAA,MACnB;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,UAAA,EAAwC;AAClD,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,MAAM,WAAsB,EAAC;AAE7B,IAAA,KAAA,CAAM,KAAK,aAAa,CAAA;AACxB,IAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,gBAAA,CAAiB,UAAA,CAAW,KAAK,CAAC,CAAA;AAGlD,IAAA,IAAI,UAAA,CAAW,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC/B,MAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAClB,MAAA,KAAA,CAAM,KAAK,IAAA,CAAK,gBAAA,CAAiB,UAAA,CAAW,KAAA,EAAO,QAAQ,CAAC,CAAA;AAAA,IAC9D;AAGA,IAAA,IAAI,UAAA,CAAW,SAAA,IAAa,UAAA,CAAW,SAAA,CAAU,SAAS,CAAA,EAAG;AAC3D,MAAA,KAAA,CAAM,KAAK,WAAW,CAAA;AACtB,MAAA,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,SAAA,CAAU,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IACrF;AAEA,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AAAA,MACnB;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKU,gBAAA,CAAiB,YAA8B,QAAA,EAA6B;AACpF,IAAA,OAAO,UAAA,CACJ,GAAA,CAAI,CAAC,SAAA,EAAW,KAAA,KAAU;AACzB,MAAA,MAAM,SAAS,KAAA,KAAU,CAAA,GAAI,EAAA,GAAK,CAAA,CAAA,EAAI,UAAU,IAAI,CAAA,CAAA,CAAA;AACpD,MAAA,QAAA,CAAS,IAAA,CAAK,GAAG,SAAA,CAAU,QAAQ,CAAA;AACnC,MAAA,OAAO,CAAA,EAAG,MAAM,CAAA,EAAG,SAAA,CAAU,GAAG,CAAA,CAAA;AAAA,IAClC,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA,EAKU,iBAAA,CAAkB,KAAA,EAAiB,KAAA,EAAgB,MAAA,EAAuB;AAClF,IAAA,QAAQ,IAAA,CAAK,OAAO,UAAA;AAAY,MAC9B,KAAK,cAAA,EAAgB;AACnB,QAAA,IAAI,UAAU,MAAA,EAAW;AACvB,UAAA,KAAA,CAAM,IAAA,CAAK,CAAA,MAAA,EAAS,KAAK,CAAA,CAAE,CAAA;AAAA,QAC7B;AACA,QAAA,IAAI,WAAW,MAAA,EAAW;AACxB,UAAA,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,MAAM,CAAA,CAAE,CAAA;AAAA,QAC/B;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,aAAA,EAAe;AAClB,QAAA,IAAI,WAAW,MAAA,EAAW;AACxB,UAAA,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,MAAM,CAAA,KAAA,CAAO,CAAA;AAAA,QACpC;AACA,QAAA,IAAI,UAAU,MAAA,EAAW;AACvB,UAAA,KAAA,CAAM,IAAA,CAAK,CAAA,YAAA,EAAe,KAAK,CAAA,UAAA,CAAY,CAAA;AAAA,QAC7C;AACA,QAAA;AAAA,MACF;AAIA;AACF,EACF;AAAA;AAAA;AAAA;AAAA,EAKU,kBAAA,GAA6B;AACrC,IAAA,OAAO,EAAE,IAAA,CAAK,cAAA;AAAA,EAChB;AACF;;;ACvRO,IAAM,YAAA,GAAN,cAA2B,UAAA,CAAW;AAAA,EAClC,IAAA,GAAO,OAAA;AAAA,EAEP,MAAA,GAAwB;AAAA,IAC/B,eAAA,EAAiB,GAAA;AAAA,IACjB,eAAA,EAAiB,KAAA;AAAA,IACjB,cAAA,EAAgB,QAAA;AAAA,IAChB,eAAA,EAAiB,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,OAAA,EAAQ;AAAA,IAChD,aAAA,EAAe;AAAA,MACb,GAAA,EAAK,OAAA;AAAA,MACL,WAAA,EAAa,WAAA;AAAA,MACb,WAAA,EAAa,WAAA;AAAA,MACb,YAAY,CAAC,MAAA,EAAgB,WAAmB,CAAA,YAAA,EAAe,MAAM,MAAM,MAAM,CAAA,EAAA;AAAA,KACnF;AAAA,IACA,UAAA,EAAY,cAAA;AAAA,IACZ,aAAA,EAAe;AAAA,MACb,SAAS,CAAC,MAAA,EAAgB,SAAiB,CAAA,aAAA,EAAgB,MAAM,MAAM,IAAI,CAAA,EAAA,CAAA;AAAA,MAC3E,UAAU,CAAC,MAAA,EAAgB,UAAkB,CAAA,cAAA,EAAiB,MAAM,MAAM,KAAK,CAAA,EAAA;AAAA;AACjF,GACF;AAAA;AAAA;AAAA;AAAA,EAKA,uBAAA,GAAkC;AAChC,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,KAAA,EAAwB;AAClC,IAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AACzC,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,IAAI,OAAO,UAAU,SAAA,EAAW;AAC9B,MAAA,OAAO,QAAQ,MAAA,GAAS,OAAA;AAAA,IAC1B;AAEA,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,OAAO,OAAO,KAAK,CAAA;AAAA,IACrB;AAEA,IAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,MAAA,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,WAAA,EAAY,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA,IAC/D;AAEA,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAE7B,MAAA,OAAO,CAAA,CAAA,EAAI,MAAM,UAAA,CAAW,IAAA,EAAM,MAAM,CAAA,CAAE,UAAA,CAAW,GAAA,EAAK,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,IAClE;AAEA,IAAA,IAAI,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AAC1B,MAAA,OAAO,CAAA,EAAA,EAAK,KAAA,CAAM,QAAA,CAAS,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,IACnC;AAGA,IAAA,OAAO,CAAA,CAAA,EAAI,KAAK,SAAA,CAAU,KAAK,EAAE,UAAA,CAAW,GAAA,EAAK,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,CACE,KAAA,EACA,IAAA,EACA,eAAA,EACsC;AACtC,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAChC,IAAA,MAAM,WAAsB,EAAC;AAE7B,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,KAAA,CAAM,KAAK,aAAa,CAAA;AACxB,IAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,gBAAA,CAAiB,KAAK,CAAC,CAAA;AACvC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,KAAK,QAAQ,CAAA;AAEvF,IAAA,MAAM,eAAe,OAAA,CAAQ,GAAA,CAAI,MAAM,IAAA,CAAK,yBAAyB,CAAA;AACrE,IAAA,KAAA,CAAM,KAAK,CAAA,CAAA,EAAI,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AACzC,IAAA,QAAA,CAAS,IAAA,CAAK,GAAG,MAAA,CAAO,MAAA,CAAO,IAAI,CAAC,CAAA;AAEpC,IAAA,KAAA,CAAM,KAAK,yBAAyB,CAAA;AACpC,IAAA,MAAM,aAAA,GAAgB,OAAA,CACnB,MAAA,CAAO,CAAC,GAAA,KAAQ,CAAC,eAAA,CAAgB,QAAA,CAAS,GAAG,CAAC,CAAA,CAC9C,GAAA,CAAI,CAAC,GAAA,KAAQ,CAAA,EAAG,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAC,aAAa,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAC,CAAA,CAAA,CAAG,CAAA;AACvF,IAAA,KAAA,CAAM,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,IAAI,CAAC,CAAA;AAEnC,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AAAA,MACnB;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,CAAa,OAAe,IAAA,EAAqE;AAC/F,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAChC,IAAA,MAAM,WAAsB,EAAC;AAE7B,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,KAAA,CAAM,KAAK,cAAc,CAAA;AACzB,IAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,gBAAA,CAAiB,KAAK,CAAC,CAAA;AACvC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,KAAK,QAAQ,CAAA;AAEvF,IAAA,MAAM,eAAe,OAAA,CAAQ,GAAA,CAAI,MAAM,IAAA,CAAK,yBAAyB,CAAA;AACrE,IAAA,KAAA,CAAM,KAAK,CAAA,CAAA,EAAI,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AACzC,IAAA,QAAA,CAAS,IAAA,CAAK,GAAG,MAAA,CAAO,MAAA,CAAO,IAAI,CAAC,CAAA;AAEpC,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AAAA,MACnB;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAA,GAA6B;AAC3B,IAAA,OAAO,+BAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMmB,iBAAA,CAAkB,KAAA,EAAiB,KAAA,EAAgB,MAAA,EAAuB;AAE3F,IAAA,IAAI,MAAA,KAAW,MAAA,IAAa,KAAA,KAAU,MAAA,EAAW;AAE/C,MAAA,KAAA,CAAM,KAAK,4BAA4B,CAAA;AACvC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,MAAM,CAAA,CAAE,CAAA;AAAA,IAC/B,CAAA,MAAA,IAAW,UAAU,MAAA,EAAW;AAC9B,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,MAAA,EAAS,KAAK,CAAA,CAAE,CAAA;AAC3B,MAAA,IAAI,WAAW,MAAA,EAAW;AACxB,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,MAAM,CAAA,CAAE,CAAA;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AACF;;;AC1IO,IAAM,iBAAA,GAAN,cAAgC,UAAA,CAAW;AAAA,EACvC,IAAA,GAAO,YAAA;AAAA,EAEP,MAAA,GAAwB;AAAA,IAC/B,eAAA,EAAiB,GAAA;AAAA,IACjB,eAAA,EAAiB,KAAA;AAAA,IACjB,cAAA,EAAgB,IAAA;AAAA,IAChB,eAAA,EAAiB,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,OAAA,EAAQ;AAAA,IAChD,aAAA,EAAe;AAAA,MACb,GAAA,EAAK,OAAA;AAAA,MACL,WAAA,EAAa,cAAA;AAAA,MACb,WAAA,EAAa,cAAA;AAAA,MACb,YAAY,CAAC,MAAA,EAAgB,WAAmB,CAAA,QAAA,EAAW,MAAM,MAAM,MAAM,CAAA,EAAA;AAAA,KAC/E;AAAA,IACA,UAAA,EAAY,cAAA;AAAA,IACZ,aAAA,EAAe;AAAA,MACb,SAAS,CAAC,MAAA,EAAgB,SAAiB,CAAA,EAAG,MAAM,MAAM,IAAI,CAAA,CAAA,CAAA;AAAA,MAC9D,UAAU,CAAC,MAAA,EAAgB,UAAkB,CAAA,EAAG,MAAM,QAAQ,KAAK,CAAA,CAAA;AAAA;AACrE,GACF;AAAA;AAAA;AAAA;AAAA,EAKA,uBAAA,GAAkC;AAChC,IAAA,OAAO,CAAA,CAAA,EAAI,IAAA,CAAK,kBAAA,EAAoB,CAAA,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,KAAA,EAAwB;AAClC,IAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AACzC,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,IAAI,OAAO,UAAU,SAAA,EAAW;AAC9B,MAAA,OAAO,QAAQ,MAAA,GAAS,OAAA;AAAA,IAC1B;AAEA,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,OAAO,OAAO,KAAK,CAAA;AAAA,IACrB;AAEA,IAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,MAAA,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,WAAA,EAAa,CAAA,cAAA,CAAA;AAAA,IAChC;AAEA,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAE7B,MAAA,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,UAAA,CAAW,GAAA,EAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,IACxC;AAEA,IAAA,IAAI,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AAC1B,MAAA,OAAO,CAAA,IAAA,EAAO,KAAA,CAAM,QAAA,CAAS,KAAK,CAAC,CAAA,QAAA,CAAA;AAAA,IACrC;AAEA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAExB,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,WAAA,CAAY,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAC/D,MAAA,OAAO,SAAS,OAAO,CAAA,CAAA,CAAA;AAAA,IACzB;AAGA,IAAA,OAAO,CAAA,CAAA,EAAI,KAAK,SAAA,CAAU,KAAK,EAAE,UAAA,CAAW,GAAA,EAAK,IAAI,CAAC,CAAA,QAAA,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,CACE,KAAA,EACA,IAAA,EACA,eAAA,EACA,aAAA,EACsC;AACtC,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAChC,IAAA,MAAM,WAAsB,EAAC;AAE7B,IAAA,IAAA,CAAK,eAAA,EAAgB;AAErB,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,KAAA,CAAM,KAAK,aAAa,CAAA;AACxB,IAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,gBAAA,CAAiB,KAAK,CAAC,CAAA;AACvC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,KAAK,QAAQ,CAAA;AAEvF,IAAA,MAAM,eAAe,OAAA,CAAQ,GAAA,CAAI,MAAM,IAAA,CAAK,yBAAyB,CAAA;AACrE,IAAA,KAAA,CAAM,KAAK,CAAA,CAAA,EAAI,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AACzC,IAAA,QAAA,CAAS,IAAA,CAAK,GAAG,MAAA,CAAO,MAAA,CAAO,IAAI,CAAC,CAAA;AAEpC,IAAA,KAAA,CAAM,KAAK,aAAa,CAAA;AACxB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,eAAA,CAAgB,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AAErF,IAAA,MAAM,QAAA,GAAW,aAAA,IAAiB,OAAA,CAAQ,MAAA,CAAO,CAAC,QAAQ,CAAC,eAAA,CAAgB,QAAA,CAAS,GAAG,CAAC,CAAA;AAExF,IAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,MAAA,KAAA,CAAM,KAAK,eAAe,CAAA;AAC1B,MAAA,MAAM,gBAAgB,QAAA,CAAS,GAAA;AAAA,QAC7B,CAAC,GAAA,KAAQ,CAAA,EAAG,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAC,CAAA,YAAA,EAAe,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAC,CAAA;AAAA,OACjF;AACA,MAAA,KAAA,CAAM,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IACrC,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,KAAK,YAAY,CAAA;AAAA,IACzB;AAEA,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AAAA,MACnB;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,CAAa,OAAA,EAAiB,QAAA,EAAkB,SAAA,EAAmB,YAAY,KAAA,EAAe;AAC5F,IAAA,MAAM,WAAA,GAAc,YAAY,gBAAA,GAAmB,MAAA;AACnD,IAAA,OAAO,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,IAAA,CAAK,gBAAA,CAAiB,OAAO,CAAC,CAAA,KAAA,EAAQ,QAAQ,CAAA,EAAA,EAAK,SAAS,CAAA,CAAA;AAAA,EACvF;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,OAAA,EAA2B;AACxC,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,MAAA,OAAO,aAAA;AAAA,IACT;AACA,IAAA,OAAO,CAAA,UAAA,EAAa,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAA,CAAmB,QAAgB,KAAA,EAAwB;AACzD,IAAA,OAAO,CAAA,EAAG,KAAK,WAAA,CAAY,KAAK,CAAC,CAAA,OAAA,EAAU,IAAA,CAAK,gBAAA,CAAiB,MAAM,CAAC,CAAA,CAAA,CAAA;AAAA,EAC1E;AAAA,EAEA,iBAAA,CAAkB,QAAgB,MAAA,EAA2B;AAC3D,IAAA,OAAO,GAAG,IAAA,CAAK,gBAAA,CAAiB,MAAM,CAAC,aAAa,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,KAAK,WAAA,CAAY,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,EACvG;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,CAAgB,MAAA,EAAgB,KAAA,EAAe,MAAA,GAAS,SAAA,EAAmB;AACzE,IAAA,OAAO,CAAA,aAAA,EAAgB,MAAM,CAAA,GAAA,EAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,CAAC,CAAA,sBAAA,EAAyB,MAAM,CAAA,GAAA,EAAM,IAAA,CAAK,WAAA,CAAY,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,EAC9H;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,CAAc,QAAgB,IAAA,EAAwB;AACpD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACpD,IAAA,OAAO,GAAG,IAAA,CAAK,gBAAA,CAAiB,MAAM,CAAC,KAAK,QAAQ,CAAA,CAAA;AAAA,EACtD;AAAA,EAEA,iBAAA,CAAkB,QAAgB,IAAA,EAAwB;AACxD,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,MAAM,QAAA,GAAW,KAAK,GAAA,EAAI;AAC1B,IAAA,MAAM,QAAA,GACJ,IAAA,CAAK,MAAA,GAAS,CAAA,GACV,CAAA,EAAG,IAAA,CAAK,gBAAA,CAAiB,MAAM,CAAC,CAAA,EAAA,EAAK,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,KAAA,EAAQ,QAAQ,CAAA,CAAA,CAAA,GACzF,CAAA,EAAG,IAAA,CAAK,gBAAA,CAAiB,MAAM,CAAC,OAAO,QAAQ,CAAA,CAAA,CAAA;AACrD,IAAA,OAAO,QAAA;AAAA,EACT;AACF;;;ACtKA,IAAM,YAAA,uBAAmB,GAAA,EAAqC;AAEvD,IAAM,iBAAN,MAAqB;AAAA;AAAA;AAAA;AAAA,EAI1B,OAAO,WAAW,IAAA,EAAuC;AAEvD,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,aAAA,CAAc,IAAI,CAAA;AAG9C,IAAA,IAAI,YAAA,CAAa,GAAA,CAAI,cAAc,CAAA,EAAG;AACpC,MAAA,OAAO,YAAA,CAAa,IAAI,cAAc,CAAA;AAAA,IACxC;AAGA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,aAAA,CAAc,cAAc,CAAA;AACjD,IAAA,YAAA,CAAa,GAAA,CAAI,gBAAgB,OAAO,CAAA;AACxC,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,cAAc,IAAA,EAAuC;AAC1D,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,aAAA,CAAc,IAAI,CAAA;AAE9C,IAAA,QAAQ,cAAA;AAAgB,MACtB,KAAK,OAAA,EAAS;AACZ,QAAA,OAAO,IAAI,YAAA,EAAa;AAAA,MAC1B;AAAA,MACA,KAAK,YAAA,EAAc;AACjB,QAAA,OAAO,IAAI,iBAAA,EAAkB;AAAA,MAC/B;AAAA,MACA,SAAS;AACP,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,IAAI,CAAA,CAAE,CAAA;AAAA,MACtD;AAAA;AACF,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,cAAc,IAAA,EAAmD;AAC9E,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,OAAA;AAAA,MACL,KAAK,SAAA,EAAW;AACd,QAAA,OAAO,OAAA;AAAA,MACT;AAAA,MACA,KAAK,YAAA;AAAA,MACL,KAAK,UAAA,EAAY;AACf,QAAA,OAAO,YAAA;AAAA,MACT;AAAA,MACA,SAAS;AACP,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,IAAI,CAAA,CAAE,CAAA;AAAA,MAClD;AAAA;AACF,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,YAAY,IAAA,EAA2C;AAC5D,IAAA,OAAO,CAAC,OAAA,EAAS,SAAA,EAAW,cAAc,UAAU,CAAA,CAAE,SAAS,IAAI,CAAA;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,UAAA,GAAmB;AACxB,IAAA,YAAA,CAAa,KAAA,EAAM;AAAA,EACrB;AACF;AC/BO,IAAM,eAAN,MAAmB;AAAA,EAGxB,WAAA,CACkB,OAAA,EACA,QAAA,EACAS,OAAAA,EAChB,WAAA,EACA;AAJgB,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAAA,OAAAA;AAGhB,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AAAA,EACrB;AAAA,EATgB,WAAA;AAAA;AAAA;AAAA;AAAA,EAchB,MAAM,YAAA,CAAgBT,IAAAA,EAAa,QAAA,EAA8C;AAC/E,IAAA,IAAA,CAAK,QAAQ,eAAA,EAAgB;AAC7B,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,KAAA,CAASA,IAAAA,EAAK,QAAQ,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,CAAaA,IAAAA,EAAa,QAAA,EAA6C;AAC3E,IAAA,IAAA,CAAK,QAAQ,eAAA,EAAgB;AAC7B,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQA,MAAK,QAAQ,CAAA;AACxD,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,KAAA,EAAuB;AAC7B,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,IAClD;AACA,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,KAAK,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,KAAA,EAAuB;AAC7B,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,IAClD;AACA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,KAAK,CAAA;AAChD,IAAA,OAAO,OAAO,SAAA,KAAc,QAAA,GAAW,SAAA,GAAY,IAAA,CAAK,UAAU,SAAS,CAAA;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAA,GAAqB;AACvB,IAAA,OAAO,KAAK,MAAA,KAAW,MAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,QAAA,GAAoB;AACtB,IAAA,OAAO,KAAK,WAAA,KAAgB,MAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAA,CAAiBA,MAAa,QAAA,EAA6B;AACzD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,EAAa,MAAA,IAAU,KAAA;AAC3C,IAAA,MAAM,OAAOW,UAAAA,CAAW,QAAQ,CAAA,CAC7B,MAAA,CAAOX,OAAM,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAC,EACrC,MAAA,CAAO,KAAK,CAAA,CACZ,KAAA,CAAM,GAAG,EAAE,CAAA;AACd,IAAA,OAAO,CAAA,EAAG,MAAM,CAAA,EAAG,IAAI,CAAA,CAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,kBAAA,CACJA,IAAAA,EACA,QAAA,EACA,OAAA,EACyB;AACzB,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AAErB,MAAA,OAAO,IAAA,CAAK,YAAA,CAAgBA,IAAAA,EAAK,QAAQ,CAAA;AAAA,IAC3C;AAEA,IAAA,MAAMG,YAAW,OAAA,EAAS,GAAA,IAAO,IAAA,CAAK,gBAAA,CAAiBH,MAAK,QAAQ,CAAA;AAGpE,IAAA,IAAI,GAAA,GAAM,OAAA,EAAS,GAAA,IAAO,IAAA,CAAK,WAAA,CAAY,UAAA;AAC3C,IAAA,IAAI,GAAA,GAAM,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ;AACjC,MAAA,GAAA,GAAM,KAAK,WAAA,CAAY,MAAA;AACvB,MAAA,IAAA,CAAK,YAAY,MAAA,EAAQ,IAAA;AAAA,QACvB,aAAa,OAAA,EAAS,GAAG,CAAA,iBAAA,EAAoB,IAAA,CAAK,YAAY,MAAM,CAAA,eAAA;AAAA,OACtE;AAAA,IACF;AAGA,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ,IAAoBG,SAAQ,CAAA;AAC1E,IAAA,IAAI,MAAA,KAAW,IAAA,IAAQ,MAAA,KAAW,MAAA,EAAW;AAC3C,MAAA,OAAO,MAAA;AAAA,IACT;AAGA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,YAAA,CAAgBH,MAAK,QAAQ,CAAA;AAGvD,IAAA,IAAI,MAAA,CAAO,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,gBAAA,EAAkB;AACvD,MAAA,IAAA,CAAK,YAAY,MAAA,EAAQ,IAAA;AAAA,QACvB,iCAAiC,MAAA,CAAO,QAAQ,CAAA,YAAA,EAAe,IAAA,CAAK,YAAY,gBAAgB,CAAA,0BAAA;AAAA,OAClG;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AAGA,IAAA,IAAI,MAAA,CAAO,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,iBAAA,EAAmB;AACxD,MAAA,IAAA,CAAK,YAAY,MAAA,EAAQ,IAAA;AAAA,QACvB,CAAA,QAAA,EAAW,OAAO,QAAQ,CAAA,wDAAA;AAAA,OAC5B;AAAA,IACF;AAGA,IAAA,MAAM,KAAK,WAAA,CAAY,OAAA,CAAQ,GAAA,CAAIG,SAAAA,EAAU,QAAQ,GAAG,CAAA;AAExD,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,OAAA,EAAiC;AACrD,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,MAAA,IAAU,KAAA;AAC1C,IAAA,MAAM,GAAA,GAAM,UAAU,CAAA,EAAG,MAAM,GAAG,OAAO,CAAA,CAAA,CAAA,GAAM,GAAG,MAAM,CAAA,CAAA,CAAA;AAGxD,IAAA,IAAI,OAAQ,IAAA,CAAK,WAAA,CAAY,OAAA,CAAgB,kBAAkB,UAAA,EAAY;AACzE,MAAA,MAAO,IAAA,CAAK,WAAA,CAAY,OAAA,CAAgB,aAAA,CAAc,GAAG,CAAA;AAAA,IAC3D;AAAA,EACF;AACF;;;AClLO,IAAM,YAAA,GAAN,MAAM,aAAA,CAAa;AAAA,EAGxB,YAA6B,OAAA,EAAqB;AAArB,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAAsB;AAAA,EAF3C,aAA+E,EAAC;AAAA,EAUxF,KAAA,CACE,kBAAA,EACA,eAAA,EACA,KAAA,EACM;AACN,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,cAAA,CAAe,kBAAA,EAAoB,iBAAiB,KAAK,CAAA;AAC5E,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,EAAE,WAAA,EAAa,KAAA,EAAO,OAAO,CAAA;AAClD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAQA,OAAA,CACE,kBAAA,EACA,eAAA,EACA,KAAA,EACM;AACN,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,cAAA,CAAe,kBAAA,EAAoB,iBAAiB,KAAK,CAAA;AAC5E,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,EAAE,WAAA,EAAa,IAAA,EAAM,OAAO,CAAA;AACjD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,MAAA,EAAsB;AAC9B,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK;AAAA,MACnB,WAAA,EAAa,KAAA;AAAA,MACb,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,KAAK,KAAA;AAAM,KAC3C,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,MAAA,EAAsB;AACjC,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK;AAAA,MACnB,WAAA,EAAa,KAAA;AAAA,MACb,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,KAAK,IAAA;AAAK,KAC1C,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,CAAQ,QAAgB,MAAA,EAAyB;AAC/C,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK;AAAA,MACnB,WAAA,EAAa,KAAA;AAAA,MACb,OAAO,EAAE,IAAA,EAAM,MAAM,MAAA,EAAQ,MAAA,EAAQ,KAAK,KAAA;AAAM,KACjD,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,CAAW,QAAgB,MAAA,EAAyB;AAClD,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK;AAAA,MACnB,WAAA,EAAa,KAAA;AAAA,MACb,OAAO,EAAE,IAAA,EAAM,MAAM,MAAA,EAAQ,MAAA,EAAQ,KAAK,IAAA;AAAK,KAChD,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,CAAa,MAAA,EAAgB,IAAA,EAAe,EAAA,EAAmB;AAC7D,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK;AAAA,MACnB,WAAA,EAAa,KAAA;AAAA,MACb,KAAA,EAAO,EAAE,IAAA,EAAM,SAAA,EAAW,QAAQ,IAAA,EAAM,EAAA,EAAI,KAAK,KAAA;AAAM,KACxD,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,CAAgB,MAAA,EAAgB,IAAA,EAAe,EAAA,EAAmB;AAChE,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK;AAAA,MACnB,WAAA,EAAa,KAAA;AAAA,MACb,KAAA,EAAO,EAAE,IAAA,EAAM,SAAA,EAAW,QAAQ,IAAA,EAAM,EAAA,EAAI,KAAK,IAAA;AAAK,KACvD,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,CAAU,QAAgB,OAAA,EAAuB;AAC/C,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK;AAAA,MACnB,WAAA,EAAa,KAAA;AAAA,MACb,OAAO,EAAE,IAAA,EAAM,QAAQ,MAAA,EAAQ,OAAA,EAAS,KAAK,KAAA;AAAM,KACpD,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,CAAa,QAAgB,OAAA,EAAuB;AAClD,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK;AAAA,MACnB,WAAA,EAAa,KAAA;AAAA,MACb,OAAO,EAAE,IAAA,EAAM,QAAQ,MAAA,EAAQ,OAAA,EAAS,KAAK,IAAA;AAAK,KACnD,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,CAASH,IAAAA,EAAa,QAAA,GAAsB,EAAC,EAAS;AACpD,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK;AAAA,MACnB,WAAA,EAAa,KAAA;AAAA,MACb,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,GAAA,EAAAA,MAAK,QAAA;AAAS,KACrC,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAA0B;AACxB,IAAA,OAAO,IAAA,CAAK,WAAW,GAAA,CAAI,CAAC,EAAE,WAAA,EAAa,KAAA,IAAS,KAAA,KAAU;AAC5D,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA;AACxC,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,KAAA,KAAU,CAAA,GAAI,KAAA,GAAQ,WAAA;AAAA,QAC5B,KAAK,MAAA,CAAO,GAAA;AAAA,QACZ,UAAU,MAAA,CAAO;AAAA,OACnB;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAyB;AACvB,IAAA,OAAO,IAAA,CAAK,WAAW,MAAA,GAAS,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,aAAa,EAAC;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAsB;AACpB,IAAA,MAAM,MAAA,GAAS,IAAI,aAAA,CAAa,IAAA,CAAK,OAAO,CAAA;AAE5C,IAAA,MAAA,CAAO,UAAA,GAAa,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,MACjD,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,KAAA,EAAO,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,KAAK;AAAA,KACnC,CAAE,CAAA;AACF,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAW,KAAA,EAAiD;AAClE,IAAA,QAAQ,MAAM,IAAA;AAAM,MAClB,KAAK,QAAA,EAAU;AACb,QAAA,OAAO,EAAE,GAAG,KAAA,EAAM;AAAA,MACpB;AAAA,MACA,KAAK,QAAA,EAAU;AACb,QAAA,OAAO,EAAE,GAAG,KAAA,EAAO,IAAA,EAAM,EAAE,GAAG,KAAA,CAAM,MAAK,EAAE;AAAA,MAC7C;AAAA,MACA,KAAK,KAAA,EAAO;AACV,QAAA,OAAO,EAAE,GAAG,KAAA,EAAO,QAAA,EAAU,CAAC,GAAG,KAAA,CAAM,QAAQ,CAAA,EAAE;AAAA,MACnD;AAAA,MACA,KAAK,MAAA,EAAQ;AACX,QAAA,OAAO,EAAE,GAAG,KAAA,EAAM;AAAA,MACpB;AAAA,MACA,KAAK,IAAA,EAAM;AACT,QAAA,OAAO,EAAE,GAAG,KAAA,EAAO,MAAA,EAAQ,CAAC,GAAG,KAAA,CAAM,MAAM,CAAA,EAAE;AAAA,MAC/C;AAAA,MACA,KAAK,SAAA,EAAW;AACd,QAAA,OAAO,EAAE,GAAG,KAAA,EAAM;AAAA,MACpB;AAAA,MACA,KAAK,MAAA,EAAQ;AACX,QAAA,OAAO,EAAE,GAAG,KAAA,EAAM;AAAA,MACpB;AAAA;AACF,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAA,CACN,kBAAA,EACA,eAAA,EACA,KAAA,EACqB;AAErB,IAAA,IAAI,OAAO,uBAAuB,QAAA,EAAU;AAC1C,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,kBAAA,EAAmB;AAAA,IACpD;AAGA,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,QAAA;AAAA,QACN,MAAA,EAAQ,kBAAA;AAAA,QACR,QAAA,EAAU,eAAA;AAAA,QACV;AAAA,OACF;AAAA,IACF;AAGA,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,QAAA;AAAA,MACN,MAAA,EAAQ,kBAAA;AAAA,MACR,QAAA,EAAU,GAAA;AAAA,MACV,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,KAAA,EAAkE;AACvF,IAAA,QAAQ,MAAM,IAAA;AAAM,MAClB,KAAK,QAAA,EAAU;AACb,QAAA,OAAO,KAAK,oBAAA,CAAqB,KAAA,CAAM,QAAQ,KAAA,CAAM,QAAA,EAAU,MAAM,KAAK,CAAA;AAAA,MAC5E;AAAA,MAEA,KAAK,QAAA,EAAU;AACb,QAAA,OAAO,IAAA,CAAK,oBAAA,CAAqB,KAAA,CAAM,IAAI,CAAA;AAAA,MAC7C;AAAA,MAEA,KAAK,KAAA,EAAO;AACV,QAAA,OAAO,EAAE,GAAA,EAAK,KAAA,CAAM,GAAA,EAAK,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,MACpD;AAAA,MAEA,KAAK,MAAA,EAAQ;AACX,QAAA,OAAO;AAAA,UACL,GAAA,EAAK,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAAiB,KAAA,CAAM,MAAM,CAAC,CAAA,IAAA,EAAO,KAAA,CAAM,GAAA,GAAM,MAAA,GAAS,EAAE,CAAA,IAAA,CAAA;AAAA,UACjF,UAAU;AAAC,SACb;AAAA,MACF;AAAA,MAEA,KAAK,IAAA,EAAM;AACT,QAAA,OAAO,KAAK,gBAAA,CAAiB,KAAA,CAAM,QAAQ,KAAA,CAAM,MAAA,EAAQ,MAAM,GAAG,CAAA;AAAA,MACpE;AAAA,MAEA,KAAK,SAAA,EAAW;AACd,QAAA,OAAO,IAAA,CAAK,sBAAsB,KAAA,CAAM,MAAA,EAAQ,MAAM,IAAA,EAAM,KAAA,CAAM,EAAA,EAAI,KAAA,CAAM,GAAG,CAAA;AAAA,MACjF;AAAA,MAEA,KAAK,MAAA,EAAQ;AACX,QAAA,OAAO;AAAA,UACL,KAAK,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAAiB,MAAM,MAAM,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,MAAM,MAAA,GAAS,EAAE,QAAQ,IAAA,CAAK,OAAA,CAAQ,yBAAyB,CAAA,CAAA;AAAA,UAC5H,QAAA,EAAU,CAAC,KAAA,CAAM,OAAO;AAAA,SAC1B;AAAA,MACF;AAAA;AACF,EACF;AAAA,EAEQ,oBAAA,CACN,MAAA,EACA,QAAA,EACA,KAAA,EACsC;AACtC,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAAiB,MAAM,CAAA;AAG1D,IAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AACzC,MAAA,IAAI,QAAA,KAAa,GAAA,IAAO,QAAA,KAAa,IAAA,EAAM;AACzC,QAAA,OAAO,EAAE,GAAA,EAAK,CAAA,EAAG,aAAa,CAAA,QAAA,CAAA,EAAY,QAAA,EAAU,EAAC,EAAE;AAAA,MACzD;AACA,MAAA,IAAI,QAAA,KAAa,IAAA,IAAQ,QAAA,KAAa,IAAA,EAAM;AAC1C,QAAA,OAAO,EAAE,GAAA,EAAK,CAAA,EAAG,aAAa,CAAA,YAAA,CAAA,EAAgB,QAAA,EAAU,EAAC,EAAE;AAAA,MAC7D;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,OAAA,CAAQ,uBAAA,EAAwB;AACzD,IAAA,OAAO;AAAA,MACL,KAAK,CAAA,EAAG,aAAa,CAAA,CAAA,EAAI,QAAQ,IAAI,WAAW,CAAA,CAAA;AAAA,MAChD,QAAA,EAAU,CAAC,KAAK;AAAA,KAClB;AAAA,EACF;AAAA,EAEQ,qBAAqB,IAAA,EAG3B;AACA,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,MAAM,WAAsB,EAAC;AAE7B,IAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AAClD,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,oBAAA,CAAqB,MAAA,EAAQ,KAAK,KAAK,CAAA;AAC3D,MAAA,OAAA,CAAQ,IAAA,CAAK,OAAO,GAAG,CAAA;AACvB,MAAA,QAAA,CAAS,IAAA,CAAK,GAAG,MAAA,CAAO,QAAQ,CAAA;AAAA,IAClC;AAEA,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,CAAA,CAAA,EAAI,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,CAAA,GAAM,OAAA,CAAQ,CAAC,CAAA,IAAK,KAAA;AAAA,MACvE;AAAA,KACF;AAAA,EACF;AAAA,EAEQ,gBAAA,CACN,MAAA,EACA,MAAA,EACA,GAAA,EACsC;AACtC,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AAEvB,MAAA,OAAO,EAAE,GAAA,EAAK,GAAA,GAAM,QAAQ,KAAA,EAAO,QAAA,EAAU,EAAC,EAAE;AAAA,IAClD;AAEA,IAAA,MAAM,eAAe,MAAA,CAAO,GAAA,CAAI,MAAM,IAAA,CAAK,OAAA,CAAQ,yBAAyB,CAAA;AAC5E,IAAA,MAAM,QAAA,GAAW,MAAM,QAAA,GAAW,IAAA;AAElC,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAAiB,MAAM,CAAC,CAAA,CAAA,EAAI,QAAQ,CAAA,EAAA,EAAK,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,MACrF,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAAA,EAEQ,qBAAA,CACN,MAAA,EACA,IAAA,EACA,EAAA,EACA,GAAA,EACsC;AACtC,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAAiB,MAAM,CAAA;AAC1D,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,OAAA,CAAQ,uBAAA,EAAwB;AAC1D,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,OAAA,CAAQ,uBAAA,EAAwB;AAC1D,IAAA,MAAM,QAAA,GAAW,MAAM,aAAA,GAAgB,SAAA;AAEvC,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,GAAG,aAAa,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,YAAY,QAAQ,YAAY,CAAA,CAAA;AAAA,MACrE,QAAA,EAAU,CAAC,IAAA,EAAM,EAAE;AAAA,KACrB;AAAA,EACF;AACF;;;AC9VO,IAAM,aAAA,GAAN,MAAM,cAAA,CAA2B;AAAA,EAgCtC,YAA6B,GAAA,EAAmB;AAAnB,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAC3B,IAAA,IAAI,GAAA,CAAI,aAAa,MAAA,EAAQ;AAC3B,MAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AAAA,IACvB;AACA,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAI,YAAA,CAAa,GAAA,CAAI,OAAO,CAAA;AAAA,EACnD;AAAA;AAAA,EAnCQ,WAAqB,EAAC;AAAA,EACtB,SAAA,GAAY,KAAA;AAAA,EACZ,MAAA;AAAA,EACA,WAAA;AAAA;AAAA,EAGA,SAA2B,EAAC;AAAA;AAAA,EAG5B,WAAqB,EAAC;AAAA,EACtB,OAAA;AAAA,EACA,WAAgC,EAAC;AAAA;AAAA,EAGjC,MAAA;AAAA,EACA,OAAA;AAAA;AAAA,EAGA,aAAA;AAAA;AAAA,EAGA,cAAA,uBAAkC,GAAA,EAAI;AAAA,EACtC,cAAA,uBAAkC,GAAA,EAAI;AAAA;AAAA,EAGtC,aAAA,GAAgB,KAAA;AAAA,EAChB,SAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcR,UAAU,OAAA,EAAyB;AACjC,IAAA,IAAA,CAAK,QAAA,GAAW,OAAA;AAChB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,OAAA,EAAyB;AACpC,IAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,GAAG,OAAO,CAAA;AAC7B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAAiB;AACf,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,CAAK,OAAe,KAAA,EAAsB;AACxC,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AACd,IAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,CAAM,OAAe,KAAA,EAAsB;AACzC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,KAAK,CAAA;AAAA,EAC/B;AAAA,EAOA,KAAA,CACE,kBAAA,EACA,eAAA,EACA,KAAA,EACM;AACN,IAAA,IAAA,CAAK,aAAA,CAAc,KAAA,CAAM,kBAAA,EAA2B,eAAA,EAAwB,KAAK,CAAA;AACjF,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAKA,OAAA,CACE,kBAAA,EACA,eAAA,EACA,KAAA,EACM;AACN,IAAA,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,kBAAA,EAA2B,eAAA,EAAwB,KAAK,CAAA;AACnF,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,UAAU,MAAA,EAAsB;AAC9B,IAAA,IAAA,CAAK,aAAA,CAAc,UAAU,MAAM,CAAA;AACnC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,aAAa,MAAA,EAAsB;AACjC,IAAA,IAAA,CAAK,aAAA,CAAc,aAAa,MAAM,CAAA;AACtC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAA,CAAQ,QAAgB,MAAA,EAAyB;AAC/C,IAAA,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,MAAA,EAAQ,MAAM,CAAA;AACzC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,UAAA,CAAW,QAAgB,MAAA,EAAyB;AAClD,IAAA,IAAA,CAAK,aAAA,CAAc,UAAA,CAAW,MAAA,EAAQ,MAAM,CAAA;AAC5C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,YAAA,CAAa,MAAA,EAAgB,IAAA,EAAe,EAAA,EAAmB;AAC7D,IAAA,IAAA,CAAK,aAAA,CAAc,YAAA,CAAa,MAAA,EAAQ,IAAA,EAAM,EAAE,CAAA;AAChD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,SAAA,CAAU,QAAgB,OAAA,EAAuB;AAC/C,IAAA,IAAA,CAAK,aAAA,CAAc,SAAA,CAAU,MAAA,EAAQ,OAAO,CAAA;AAC5C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,QAAA,CAASA,IAAAA,EAAa,QAAA,GAAsB,EAAC,EAAS;AACpD,IAAA,IAAA,CAAK,aAAA,CAAc,QAAA,CAASA,IAAAA,EAAK,QAAQ,CAAA;AACzC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAIA,IAAA,CAAK,KAAA,EAAe,SAAA,EAAmB,QAAA,GAAsB,EAAC,EAAS;AACrE,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,SAAA,EAAW,QAAQ,CAAA;AAAA,EAClD;AAAA,EAEA,SAAA,CAAU,KAAA,EAAe,SAAA,EAAmB,QAAA,GAAsB,EAAC,EAAS;AAC1E,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,EAAE,IAAA,EAAM,SAAS,KAAA,EAAO,SAAA,EAAW,UAAU,CAAA;AAC9D,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,QAAA,CAAS,KAAA,EAAe,SAAA,EAAmB,QAAA,GAAsB,EAAC,EAAS;AACzE,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,EAAE,IAAA,EAAM,QAAQ,KAAA,EAAO,SAAA,EAAW,UAAU,CAAA;AAC7D,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,SAAA,CAAU,KAAA,EAAe,SAAA,EAAmB,QAAA,GAAsB,EAAC,EAAS;AAC1E,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,EAAE,IAAA,EAAM,SAAS,KAAA,EAAO,SAAA,EAAW,UAAU,CAAA;AAC9D,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,QAAA,CAAS,KAAA,EAAe,SAAA,EAAmB,QAAA,GAAsB,EAAC,EAAS;AACzE,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,EAAE,IAAA,EAAM,QAAQ,KAAA,EAAO,SAAA,EAAW,UAAU,CAAA;AAC7D,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,UAAU,KAAA,EAAqB;AAC7B,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,SAAA,EAAW,EAAA,EAAI,QAAA,EAAU,EAAC,EAAG,CAAA;AACtE,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,WAAW,KAAA,EAAe,KAAA,EAAe,SAAA,EAAmB,QAAA,GAAsB,EAAC,EAAS;AAC1F,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,EAAE,IAAA,EAAM,QAAQ,KAAA,EAAO,KAAA,EAAO,SAAA,EAAW,QAAA,EAAU,CAAA;AACpE,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,YAAY,KAAA,EAAe,KAAA,EAAe,SAAA,EAAmB,QAAA,GAAsB,EAAC,EAAS;AAC3F,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,EAAE,IAAA,EAAM,SAAS,KAAA,EAAO,KAAA,EAAO,SAAA,EAAW,QAAA,EAAU,CAAA;AACrE,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAIA,WAAW,OAAA,EAAyB;AAClC,IAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,GAAG,OAAO,CAAA;AAC7B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAA,CAAO,SAAA,EAAmB,QAAA,GAAsB,EAAC,EAAS;AACxD,IAAA,IAAA,CAAK,OAAA,GAAU,EAAE,SAAA,EAAW,QAAA,EAAS;AACrC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAIA,OAAA,CAAQ,MAAA,EAAgB,SAAA,GAA4B,KAAA,EAAa;AAC/D,IAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,EAAE,MAAA,EAAQ,WAAW,CAAA;AACxC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,YAAY,MAAA,EAAsB;AAChC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,MAAM,CAAA;AAAA,EACpC;AAAA,EAEA,WAAW,MAAA,EAAsB;AAC/B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,KAAK,CAAA;AAAA,EACnC;AAAA,EAEA,WAAW,UAAA,EAA0B;AACnC,IAAA,IAAA,CAAK,QAAA,CAAS,KAAK,EAAE,MAAA,EAAQ,YAAY,SAAA,EAAW,KAAA,EAAO,GAAA,EAAK,IAAA,EAAM,CAAA;AACtE,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,UAAA,GAAmB;AACjB,IAAA,IAAA,CAAK,WAAW,EAAC;AACjB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAA,CAAQ,MAAA,EAAgB,SAAA,GAA4B,KAAA,EAAa;AAC/D,IAAA,IAAA,CAAK,WAAW,EAAC;AACjB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,SAAS,CAAA;AAAA,EACvC;AAAA;AAAA,EAIA,MAAMK,MAAAA,EAAqB;AACzB,IAAA,IAAA,CAAK,MAAA,GAASA,MAAAA;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAOA,MAAAA,EAAqB;AAC1B,IAAA,IAAA,CAAK,OAAA,GAAUA,MAAAA;AACf,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,KAAKA,MAAAA,EAAqB;AACxB,IAAA,OAAO,IAAA,CAAK,OAAOA,MAAK,CAAA;AAAA,EAC1B;AAAA,EAEA,KAAKA,MAAAA,EAAqB;AACxB,IAAA,OAAO,IAAA,CAAK,MAAMA,MAAK,CAAA;AAAA,EACzB;AAAA,EAEA,QAAA,CAAS,MAAc,OAAA,EAAuB;AAC5C,IAAA,IAAA,CAAK,MAAA,GAAS,OAAA;AACd,IAAA,IAAA,CAAK,OAAA,GAAA,CAAW,OAAO,CAAA,IAAK,OAAA;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAA,CAAQ,IAAA,EAAc,OAAA,GAAU,EAAA,EAAU;AACxC,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,OAAO,CAAA;AAAA,EACpC;AAAA;AAAA,EAIA,WAAW,MAAA,EAAwB;AACjC,IAAA,MAAA,CAAO,QAAQ,CAAC,CAAA,KAAM,KAAK,cAAA,CAAe,GAAA,CAAI,CAAC,CAAC,CAAA;AAChD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,WAAW,MAAA,EAAwB;AACjC,IAAA,MAAA,CAAO,QAAQ,CAAC,CAAA,KAAM,KAAK,cAAA,CAAe,GAAA,CAAI,CAAC,CAAC,CAAA;AAChD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAIA,MAAM,OAAA,EAAuC;AAC3C,IAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU;AACtB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AAErB,IAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,MAAA,IAAA,CAAK,SAAA,GAAY,OAAA;AAAA,IACnB,WAAW,OAAA,EAAS;AAClB,MAAA,IAAA,CAAK,YAAY,OAAA,CAAQ,GAAA;AACzB,MAAA,IAAA,CAAK,YAAY,OAAA,CAAQ,GAAA;AACzB,MAAA,IAAA,CAAK,aAAa,OAAA,CAAQ,IAAA;AAAA,IAC5B;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,aAAA,GAAgB,KAAA;AACrB,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA;AACjB,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA;AACjB,IAAA,IAAA,CAAK,UAAA,GAAa,MAAA;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,SAAS,OAAA,EAAuB;AAC9B,IAAA,IAAA,CAAK,SAAA,GAAY,OAAA;AACjB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,SAAS,GAAA,EAAmB;AAC1B,IAAA,IAAA,CAAK,SAAA,GAAY,GAAA;AACjB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,aAAa,IAAA,EAAsB;AACjC,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,aAAA,GAA4B;AAC1B,IAAA,OAAO;AAAA,MACL,SAAS,IAAA,CAAK,aAAA;AAAA,MACd,KAAK,IAAA,CAAK,SAAA;AAAA,MACV,KAAK,IAAA,CAAK,SAAA;AAAA,MACV,MAAM,IAAA,CAAK;AAAA,KACb;AAAA,EACF;AAAA;AAAA,EAIA,KAAA,GAA8C;AAC5C,IAAA,IAAA,CAAK,GAAA,CAAI,QAAQ,eAAA,EAAgB;AAEjC,IAAA,MAAM,UAAA,GAA+B;AAAA,MACnC,OAAA,EAAS,KAAK,QAAA,CAAS,MAAA,GAAS,IAAI,IAAA,CAAK,QAAA,GAAW,CAAC,GAAG,CAAA;AAAA,MACxD,UAAU,IAAA,CAAK,SAAA;AAAA,MACf,MAAM,IAAA,CAAK,MAAA;AAAA,MACX,WAAW,IAAA,CAAK,WAAA;AAAA,MAChB,OAAO,IAAA,CAAK,MAAA;AAAA,MACZ,KAAA,EAAO,IAAA,CAAK,aAAA,CAAc,KAAA,EAAM;AAAA,MAChC,SAAS,IAAA,CAAK,QAAA;AAAA,MACd,QAAQ,IAAA,CAAK,OAAA;AAAA,MACb,SAAS,IAAA,CAAK,QAAA;AAAA,MACd,OAAO,IAAA,CAAK,MAAA;AAAA,MACZ,QAAQ,IAAA,CAAK;AAAA,KACf;AAEA,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,WAAA,CAAY,UAAU,CAAA;AAAA,EAChD;AAAA;AAAA,EAIA,MAAM,GAAA,GAAoB;AACxB,IAAA,MAAM,EAAE,GAAA,EAAAL,IAAAA,EAAK,QAAA,EAAS,GAAI,KAAK,KAAA,EAAM;AAErC,IAAA,MAAM,MAAA,GACJ,IAAA,CAAK,aAAA,IAAiB,IAAA,CAAK,GAAA,CAAI,QAAA,GAC3B,MAAM,IAAA,CAAK,GAAA,CAAI,kBAAA,CAAsBA,IAAAA,EAAK,QAAA,EAAU;AAAA,MAClD,KAAK,IAAA,CAAK,SAAA;AAAA,MACV,KAAK,IAAA,CAAK;AAAA,KACX,CAAA,GACD,MAAM,KAAK,GAAA,CAAI,YAAA,CAAgBA,MAAK,QAAQ,CAAA;AAElD,IAAA,OAAO,IAAA,CAAK,cAAA,CAAe,MAAA,CAAO,IAAI,CAAA;AAAA,EACxC;AAAA,EAEA,MAAM,KAAA,GAA2B;AAC/B,IAAA,IAAA,CAAK,MAAA,GAAS,CAAA;AACd,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,GAAA,EAAI;AAC/B,IAAA,OAAO,OAAA,CAAQ,CAAC,CAAA,IAAK,IAAA;AAAA,EACvB;AAAA,EAEA,MAAM,WAAA,GAA0B;AAC9B,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,KAAA,EAAM;AAChC,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,MAAM,IAAI,MAAM,iBAAiB,CAAA;AAAA,IACnC;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,IAAA,GAAmB;AACvB,IAAA,IAAA,CAAK,MAAA,GAAS,CAAA;AACd,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,GAAA,EAAI;AAE/B,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,MAAA,MAAM,IAAI,MAAM,iBAAiB,CAAA;AAAA,IACnC;AACA,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,MAAA,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAAA,IAC7D;AAEA,IAAA,OAAO,QAAQ,CAAC,CAAA;AAAA,EAClB;AAAA,EAEA,MAAM,KAAA,CAAM,MAAA,GAAS,GAAA,EAAsB;AACzC,IAAA,MAAM,kBAAkB,IAAA,CAAK,QAAA;AAC7B,IAAA,IAAA,CAAK,QAAA,GAAW,CAAC,CAAA,MAAA,EAAS,MAAM,CAAA,UAAA,CAAY,CAAA;AAE5C,IAAA,MAAM,EAAE,GAAA,EAAAA,IAAAA,EAAK,QAAA,EAAS,GAAI,KAAK,KAAA,EAAM;AACrC,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,GAAA,CAAI,YAAA,CAAyCA,MAAK,QAAQ,CAAA;AAEpF,IAAA,IAAA,CAAK,QAAA,GAAW,eAAA;AAChB,IAAA,OAAO,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,SAAS,CAAC,CAAA;AAAA,EAC1C;AAAA,EAEA,MAAM,MAAA,GAA2B;AAC/B,IAAA,MAAMK,MAAAA,GAAQ,MAAM,IAAA,CAAK,KAAA,EAAM;AAC/B,IAAA,OAAOA,MAAAA,GAAQ,CAAA;AAAA,EACjB;AAAA,EAEA,MAAM,WAAA,GAAgC;AACpC,IAAA,OAAO,CAAE,MAAM,IAAA,CAAK,MAAA,EAAO;AAAA,EAC7B;AAAA,EAEA,MAAM,SAAA,CACJ,EAAA,EACA,MAAA,EACwB;AACxB,IAAA,MAAM,kBAAkB,IAAA,CAAK,QAAA;AAC7B,IAAA,IAAA,CAAK,QAAA,GAAW,CAAC,CAAA,EAAG,EAAE,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,gBAAA,CAAiB,MAAM,CAAC,CAAA,UAAA,CAAY,CAAA;AAE/E,IAAA,MAAM,EAAE,GAAA,EAAAL,IAAAA,EAAK,QAAA,EAAS,GAAI,KAAK,KAAA,EAAM;AACrC,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,GAAA,CAAI,YAAA,CAAgDA,MAAK,QAAQ,CAAA;AAE3F,IAAA,IAAA,CAAK,QAAA,GAAW,eAAA;AAChB,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,KAAA;AAC9B,IAAA,OAAO,KAAA,KAAU,IAAA,GAAO,IAAA,GAAO,MAAA,CAAO,KAAK,CAAA;AAAA,EAC7C;AAAA,EAEA,IAAI,MAAA,EAAwC;AAC1C,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,MAAM,CAAA;AAAA,EACrC;AAAA,EAEA,IAAI,MAAA,EAAwC;AAC1C,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,MAAM,CAAA;AAAA,EACrC;AAAA,EAEA,IAAI,MAAA,EAAwC;AAC1C,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,MAAM,CAAA;AAAA,EACrC;AAAA,EAEA,IAAI,MAAA,EAAwC;AAC1C,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,MAAM,CAAA;AAAA,EACrC;AAAA,EAEA,MAAM,MAAmB,MAAA,EAA8B;AACrD,IAAA,MAAM,kBAAkB,IAAA,CAAK,QAAA;AAC7B,IAAA,IAAA,CAAK,QAAA,GAAW,CAAC,MAAM,CAAA;AAEvB,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,GAAA,EAAI;AAC/B,IAAA,IAAA,CAAK,QAAA,GAAW,eAAA;AAEhB,IAAA,OAAO,QAAQ,GAAA,CAAI,CAAC,GAAA,KAAa,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,EAC9C;AAAA,EAEA,MAAM,aAAA,CACJ,WAAA,EACA,SAAA,EACoB;AACpB,IAAA,MAAM,kBAAkB,IAAA,CAAK,QAAA;AAC7B,IAAA,IAAA,CAAK,QAAA,GAAW,CAAC,SAAA,EAAW,WAAW,CAAA;AAEvC,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,GAAA,EAAI;AAC/B,IAAA,IAAA,CAAK,QAAA,GAAW,eAAA;AAEhB,IAAA,MAAM,GAAA,uBAAU,GAAA,EAAU;AAC1B,IAAA,KAAA,MAAW,OAAO,OAAA,EAAkB;AAClC,MAAA,GAAA,CAAI,IAAI,GAAA,CAAI,SAAS,CAAA,EAAQ,GAAA,CAAI,WAAW,CAAM,CAAA;AAAA,IACpD;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,MAAM,KAAA,CACJ,IAAA,EACA,QAAA,EACe;AACf,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,IAAI,WAAA,GAAc,CAAA;AAClB,IAAA,IAAI,OAAA,GAAU,IAAA;AAEd,IAAA,OAAO,OAAA,EAAS;AACd,MAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,MAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AAEf,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,GAAA,EAAI;AAE5B,MAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,QAAA,OAAA,GAAU,KAAA;AACV,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,EAAM,WAAW,CAAA;AAE/C,MAAA,IAAI,WAAW,KAAA,EAAO;AACpB,QAAA,OAAA,GAAU,KAAA;AACV,QAAA;AAAA,MACF;AAEA,MAAA,MAAA,IAAU,IAAA;AACV,MAAA,WAAA,EAAA;AAEA,MAAA,IAAI,IAAA,CAAK,SAAS,IAAA,EAAM;AACtB,QAAA,OAAA,GAAU,KAAA;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,IAAA,CAAK,SAAA,GAAY,GAAA,EAAuC;AAC7D,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,IAAI,OAAA,GAAU,IAAA;AAEd,IAAA,OAAO,OAAA,EAAS;AACd,MAAA,IAAA,CAAK,MAAA,GAAS,SAAA;AACd,MAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AAEf,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,GAAA,EAAI;AAE5B,MAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,QAAA,MAAM,GAAA;AAAA,MACR;AAEA,MAAA,IAAI,IAAA,CAAK,SAAS,SAAA,EAAW;AAC3B,QAAA,OAAA,GAAU,KAAA;AAAA,MACZ,CAAA,MAAO;AACL,QAAA,MAAA,IAAU,SAAA;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAIQ,eAAe,IAAA,EAAgB;AACrC,IAAA,IAAI,KAAK,cAAA,CAAe,IAAA,KAAS,KAAK,CAAC,IAAA,CAAK,IAAI,SAAA,EAAW;AACzD,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ;AACvB,MAAA,MAAM,SAAA,GAAY,EAAE,GAAG,GAAA,EAAI;AAC3B,MAAA,KAAA,MAAW,KAAA,IAAS,KAAK,cAAA,EAAgB;AACvC,QAAA,IAAI,UAAU,KAAK,CAAA,IAAK,OAAO,SAAA,CAAU,KAAK,MAAM,QAAA,EAAU;AAC5D,UAAA,IAAI;AACF,YAAA,SAAA,CAAU,KAAK,CAAA,GAAI,IAAA,CAAK,IAAI,OAAA,CAAQ,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,UACtD,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF;AACA,MAAA,OAAO,SAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAA,GAA0B;AACxB,IAAA,MAAM,MAAA,GAAS,IAAI,cAAA,CAAiB,IAAA,CAAK,GAAG,CAAA;AAC5C,IAAA,MAAA,CAAO,QAAA,GAAW,CAAC,GAAG,IAAA,CAAK,QAAQ,CAAA;AACnC,IAAA,MAAA,CAAO,YAAY,IAAA,CAAK,SAAA;AACxB,IAAA,MAAA,CAAO,SAAS,IAAA,CAAK,MAAA;AACrB,IAAA,MAAA,CAAO,cAAc,IAAA,CAAK,WAAA;AAC1B,IAAA,MAAA,CAAO,MAAA,GAAS,CAAC,GAAG,IAAA,CAAK,MAAM,CAAA;AAC/B,IAAA,MAAA,CAAO,QAAA,GAAW,CAAC,GAAG,IAAA,CAAK,QAAQ,CAAA;AACnC,IAAA,MAAA,CAAO,UAAU,IAAA,CAAK,OAAA,GAAU,EAAE,GAAG,IAAA,CAAK,SAAQ,GAAI,MAAA;AACtD,IAAA,MAAA,CAAO,QAAA,GAAW,CAAC,GAAG,IAAA,CAAK,QAAQ,CAAA;AACnC,IAAA,MAAA,CAAO,SAAS,IAAA,CAAK,MAAA;AACrB,IAAA,MAAA,CAAO,UAAU,IAAA,CAAK,OAAA;AACtB,IAAA,MAAA,CAAO,cAAA,GAAiB,IAAI,GAAA,CAAI,IAAA,CAAK,cAAc,CAAA;AACnD,IAAA,MAAA,CAAO,cAAA,GAAiB,IAAI,GAAA,CAAI,IAAA,CAAK,cAAc,CAAA;AACnD,IAAA,MAAA,CAAO,gBAAgB,IAAA,CAAK,aAAA;AAC5B,IAAA,MAAA,CAAO,YAAY,IAAA,CAAK,SAAA;AACxB,IAAA,MAAA,CAAO,YAAY,IAAA,CAAK,SAAA;AACxB,IAAA,MAAA,CAAO,aAAa,IAAA,CAAK,UAAA,GAAa,CAAC,GAAG,IAAA,CAAK,UAAU,CAAA,GAAI,MAAA;AAE7D,IAAA,MAAA,CAAO,aAAA,GAAgB,IAAA,CAAK,aAAA,CAAc,KAAA,EAAM;AAChD,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,GAAa;AACX,IAAA,MAAM,EAAE,GAAA,EAAAA,IAAAA,EAAK,QAAA,EAAS,GAAI,KAAK,KAAA,EAAM;AAErC,IAAA,OAAA,CAAQ,GAAA,CAAI,QAAQA,IAAG,CAAA;AAEvB,IAAA,OAAA,CAAQ,GAAA,CAAI,aAAa,QAAQ,CAAA;AACjC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,EAAA,GAAmB;AACvB,IAAA,IAAA,CAAK,IAAA,EAAK;AACV,IAAA,OAAO,KAAK,GAAA,EAAI;AAAA,EAClB;AACF;;;ACtlBO,IAAM,gBAAN,MAAiC;AAAA,EAOtC,YAA6B,GAAA,EAAmB;AAAnB,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAAA,EAAoB;AAAA,EANzC,MAAA;AAAA,EACA,QAAmC,EAAC;AAAA,EACpC,aAAuB,EAAC;AAAA,EACxB,cAAA,uBAAkC,GAAA,EAAI;AAAA,EACtC,OAAA,GAAU,KAAA;AAAA;AAAA;AAAA;AAAA,EAOlB,KAAK,KAAA,EAAqB;AACxB,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,EAAqB;AACzB,IAAA,OAAO,IAAA,CAAK,KAAK,KAAK,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,IAAA,EAAiE;AACtE,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,MAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AAAA,IACf,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,KAAA,GAAQ,CAAC,IAAI,CAAA;AAAA,IACpB;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,MAAA,EAAwB;AACjC,IAAA,MAAA,CAAO,QAAQ,CAAC,CAAA,KAAM,KAAK,cAAA,CAAe,GAAA,CAAI,CAAC,CAAC,CAAA;AAChD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,OAAA,EAAyB;AACpC,IAAA,IAAA,CAAK,UAAA,GAAa,OAAA;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAAe;AACb,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAA8C;AAC5C,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,IACrD;AAEA,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAC3B,MAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,IAC3C;AAEA,IAAA,IAAA,CAAK,GAAA,CAAI,QAAQ,eAAA,EAAgB;AAGjC,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,wBAAA,CAAyB,IAAA,CAAK,KAAK,CAAA;AAE9D,IAAA,MAAM,UAAA,GAA+B;AAAA,MACnC,OAAO,IAAA,CAAK,MAAA;AAAA,MACZ,IAAA,EAAM,aAAA;AAAA,MACN,WAAW,IAAA,CAAK,UAAA,CAAW,MAAA,GAAS,CAAA,GAAI,KAAK,UAAA,GAAa;AAAA,KAC5D;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,YAAY,UAAU,CAAA;AACtD,IAAA,IAAIA,OAAM,MAAA,CAAO,GAAA;AACjB,IAAA,MAAM,EAAE,UAAS,GAAI,MAAA;AAGrB,IAAA,IAAI,KAAK,OAAA,IAAW,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,SAAS,OAAA,EAAS;AACrD,MAAAA,IAAAA,GAAMA,IAAAA,CAAI,OAAA,CAAQ,aAAA,EAAe,oBAAoB,CAAA;AAAA,IACvD;AAEA,IAAA,OAAO,EAAE,GAAA,EAAAA,IAAAA,EAAK,QAAA,EAAS;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,GAAkC;AACtC,IAAA,MAAM,EAAE,GAAA,EAAAA,IAAAA,EAAK,QAAA,EAAS,GAAI,KAAK,KAAA,EAAM;AACrC,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,YAAA,CAAaA,IAAAA,EAAK,QAAQ,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,GAAoD;AACxD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,EAAQ;AAClC,IAAA,OAAO,MAAA,CAAO,QAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,GAAwC;AAC5C,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AAChC,MAAA,IAAA,CAAK,UAAA,GAAa,CAAC,GAAG,CAAA;AAAA,IACxB;AAEA,IAAA,MAAM,EAAE,GAAA,EAAAA,IAAAA,EAAK,QAAA,EAAS,GAAI,KAAK,KAAA,EAAM;AACrC,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,GAAA,CAAI,YAAA,CAAgBA,MAAK,QAAQ,CAAA;AAC3D,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA;AAAA,EAC3B;AAAA;AAAA,EAIQ,yBAAyB,IAAA,EAA4D;AAC3F,IAAA,IAAI,KAAK,cAAA,CAAe,IAAA,KAAS,KAAK,CAAC,IAAA,CAAK,IAAI,SAAA,EAAW;AACzD,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ;AACvB,MAAA,MAAM,SAAA,GAAY,EAAE,GAAG,GAAA,EAAI;AAC3B,MAAA,KAAA,MAAW,KAAA,IAAS,KAAK,cAAA,EAAgB;AACvC,QAAA,IAAI,UAAU,KAAK,CAAA,IAAK,OAAO,SAAA,CAAU,KAAK,MAAM,QAAA,EAAU;AAC5D,UAAA,SAAA,CAAU,KAAK,CAAA,GAAI,IAAA,CAAK,IAAI,OAAA,CAAQ,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,QACtD;AAAA,MACF;AACA,MAAA,OAAO,SAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH;AACF;;;AC5IO,IAAM,gBAAN,MAAiC;AAAA,EAOtC,YAA6B,GAAA,EAAmB;AAAnB,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAC3B,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAI,YAAA,CAAa,GAAA,CAAI,OAAO,CAAA;AAAA,EACnD;AAAA,EARQ,MAAA;AAAA,EACA,QAAiC,EAAC;AAAA,EAClC,aAAA;AAAA,EACA,aAAuB,EAAC;AAAA,EACxB,cAAA,uBAAkC,GAAA,EAAI;AAAA;AAAA;AAAA;AAAA,EAS9C,MAAM,KAAA,EAAqB;AACzB,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,IAAA,EAAqC;AACvC,IAAA,IAAA,CAAK,QAAQ,EAAE,GAAG,IAAA,CAAK,KAAA,EAAO,GAAG,IAAA,EAAK;AACtC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,MAAA,EAAwB;AACjC,IAAA,MAAA,CAAO,QAAQ,CAAC,CAAA,KAAM,KAAK,cAAA,CAAe,GAAA,CAAI,CAAC,CAAC,CAAA;AAChD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,OAAA,EAAyB;AACpC,IAAA,IAAA,CAAK,UAAA,GAAa,OAAA;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAOA,KAAA,CACE,kBAAA,EACA,eAAA,EACA,KAAA,EACM;AACN,IAAA,IAAA,CAAK,aAAA,CAAc,KAAA,CAAM,kBAAA,EAA2B,eAAA,EAAwB,KAAK,CAAA;AACjF,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAKA,OAAA,CACE,kBAAA,EACA,eAAA,EACA,KAAA,EACM;AACN,IAAA,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,kBAAA,EAA2B,eAAA,EAAwB,KAAK,CAAA;AACnF,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,UAAU,MAAA,EAAsB;AAC9B,IAAA,IAAA,CAAK,aAAA,CAAc,UAAU,MAAM,CAAA;AACnC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,aAAa,MAAA,EAAsB;AACjC,IAAA,IAAA,CAAK,aAAA,CAAc,aAAa,MAAM,CAAA;AACtC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAA,CAAQ,QAAgB,MAAA,EAAyB;AAC/C,IAAA,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,MAAA,EAAQ,MAAM,CAAA;AACzC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,UAAA,CAAW,QAAgB,MAAA,EAAyB;AAClD,IAAA,IAAA,CAAK,aAAA,CAAc,UAAA,CAAW,MAAA,EAAQ,MAAM,CAAA;AAC5C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,YAAA,CAAa,MAAA,EAAgB,IAAA,EAAe,EAAA,EAAmB;AAC7D,IAAA,IAAA,CAAK,aAAA,CAAc,YAAA,CAAa,MAAA,EAAQ,IAAA,EAAM,EAAE,CAAA;AAChD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,SAAA,CAAU,QAAgB,OAAA,EAAuB;AAC/C,IAAA,IAAA,CAAK,aAAA,CAAc,SAAA,CAAU,MAAA,EAAQ,OAAO,CAAA;AAC5C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,QAAA,CAASA,IAAAA,EAAa,QAAA,GAAsB,EAAC,EAAS;AACpD,IAAA,IAAA,CAAK,aAAA,CAAc,QAAA,CAASA,IAAAA,EAAK,QAAQ,CAAA;AACzC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAA,GAA8C;AAC5C,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,IACrD;AAEA,IAAA,IAAI,OAAO,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,CAAE,WAAW,CAAA,EAAG;AACxC,MAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,IAC3C;AAEA,IAAA,IAAA,CAAK,GAAA,CAAI,QAAQ,eAAA,EAAgB;AAGjC,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,wBAAA,CAAyB,IAAA,CAAK,KAAK,CAAA;AAE9D,IAAA,MAAM,UAAA,GAA+B;AAAA,MACnC,OAAO,IAAA,CAAK,MAAA;AAAA,MACZ,IAAA,EAAM,aAAA;AAAA,MACN,KAAA,EAAO,IAAA,CAAK,aAAA,CAAc,KAAA,EAAM;AAAA,MAChC,WAAW,IAAA,CAAK,UAAA,CAAW,MAAA,GAAS,CAAA,GAAI,KAAK,UAAA,GAAa;AAAA,KAC5D;AAEA,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,WAAA,CAAY,UAAU,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,GAAkC;AACtC,IAAA,MAAM,EAAE,GAAA,EAAAA,IAAAA,EAAK,QAAA,EAAS,GAAI,KAAK,KAAA,EAAM;AACrC,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,YAAA,CAAaA,IAAAA,EAAK,QAAQ,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAA,GAAmC;AACvC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,EAAQ;AAClC,IAAA,OAAO,MAAA,CAAO,YAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,GAAuC;AAC3C,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AAChC,MAAA,IAAA,CAAK,UAAA,GAAa,CAAC,GAAG,CAAA;AAAA,IACxB;AAEA,IAAA,MAAM,EAAE,GAAA,EAAAA,IAAAA,EAAK,QAAA,EAAS,GAAI,KAAK,KAAA,EAAM;AACrC,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,GAAA,CAAI,YAAA,CAAgBA,MAAK,QAAQ,CAAA;AAC3D,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,GAAqC;AACzC,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AAChC,MAAA,IAAA,CAAK,UAAA,GAAa,CAAC,GAAG,CAAA;AAAA,IACxB;AAEA,IAAA,MAAM,EAAE,GAAA,EAAAA,IAAAA,EAAK,QAAA,EAAS,GAAI,KAAK,KAAA,EAAM;AACrC,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,GAAA,CAAI,YAAA,CAAgBA,MAAK,QAAQ,CAAA;AAC3D,IAAA,OAAO,MAAA,CAAO,IAAA;AAAA,EAChB;AAAA;AAAA,EAIQ,yBAAyB,IAAA,EAAwD;AACvF,IAAA,IAAI,KAAK,cAAA,CAAe,IAAA,KAAS,KAAK,CAAC,IAAA,CAAK,IAAI,SAAA,EAAW;AACzD,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,SAAA,GAAY,EAAE,GAAG,IAAA,EAAK;AAC5B,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,cAAA,EAAgB;AACvC,MAAA,IAAI,UAAU,KAAK,CAAA,IAAK,OAAO,SAAA,CAAU,KAAK,MAAM,QAAA,EAAU;AAC5D,QAAA,SAAA,CAAU,KAAK,CAAA,GAAI,IAAA,CAAK,IAAI,OAAA,CAAQ,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,MACtD;AAAA,IACF;AACA,IAAA,OAAO,SAAA;AAAA,EACT;AACF;;;AC1LO,IAAM,gBAAN,MAAiC;AAAA,EAMtC,YAA6B,GAAA,EAAmB;AAAnB,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAC3B,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAI,YAAA,CAAa,GAAA,CAAI,OAAO,CAAA;AAAA,EACnD;AAAA,EAPQ,MAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAuB,EAAC;AAAA,EACxB,MAAA,GAAS,KAAA;AAAA;AAAA;AAAA;AAAA,EASjB,KAAK,KAAA,EAAqB;AACxB,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,EAAqB;AACzB,IAAA,OAAO,IAAA,CAAK,KAAK,KAAK,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,OAAA,EAAyB;AACpC,IAAA,IAAA,CAAK,UAAA,GAAa,OAAA;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAOA,KAAA,CACE,kBAAA,EACA,eAAA,EACA,KAAA,EACM;AACN,IAAA,IAAA,CAAK,aAAA,CAAc,KAAA,CAAM,kBAAA,EAA2B,eAAA,EAAwB,KAAK,CAAA;AACjF,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAKA,OAAA,CACE,kBAAA,EACA,eAAA,EACA,KAAA,EACM;AACN,IAAA,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,kBAAA,EAA2B,eAAA,EAAwB,KAAK,CAAA;AACnF,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,UAAU,MAAA,EAAsB;AAC9B,IAAA,IAAA,CAAK,aAAA,CAAc,UAAU,MAAM,CAAA;AACnC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,aAAa,MAAA,EAAsB;AACjC,IAAA,IAAA,CAAK,aAAA,CAAc,aAAa,MAAM,CAAA;AACtC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAA,CAAQ,QAAgB,MAAA,EAAyB;AAC/C,IAAA,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,MAAA,EAAQ,MAAM,CAAA;AACzC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,UAAA,CAAW,QAAgB,MAAA,EAAyB;AAClD,IAAA,IAAA,CAAK,aAAA,CAAc,UAAA,CAAW,MAAA,EAAQ,MAAM,CAAA;AAC5C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,YAAA,CAAa,MAAA,EAAgB,IAAA,EAAe,EAAA,EAAmB;AAC7D,IAAA,IAAA,CAAK,aAAA,CAAc,YAAA,CAAa,MAAA,EAAQ,IAAA,EAAM,EAAE,CAAA;AAChD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,SAAA,CAAU,QAAgB,OAAA,EAAuB;AAC/C,IAAA,IAAA,CAAK,aAAA,CAAc,SAAA,CAAU,MAAA,EAAQ,OAAO,CAAA;AAC5C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,QAAA,CAASA,IAAAA,EAAa,QAAA,GAAsB,EAAC,EAAS;AACpD,IAAA,IAAA,CAAK,aAAA,CAAc,QAAA,CAASA,IAAAA,EAAK,QAAQ,CAAA;AACzC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAA,GAA8C;AAC5C,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,IACrD;AAGA,IAAA,IAAI,CAAC,IAAA,CAAK,aAAA,CAAc,eAAc,IAAK,CAAC,KAAK,MAAA,EAAQ;AACvD,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,GAAA,CAAI,QAAQ,eAAA,EAAgB;AAEjC,IAAA,MAAM,UAAA,GAA+B;AAAA,MACnC,OAAO,IAAA,CAAK,MAAA;AAAA,MACZ,KAAA,EAAO,IAAA,CAAK,aAAA,CAAc,KAAA,EAAM;AAAA,MAChC,WAAW,IAAA,CAAK,UAAA,CAAW,MAAA,GAAS,CAAA,GAAI,KAAK,UAAA,GAAa;AAAA,KAC5D;AAEA,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,WAAA,CAAY,UAAU,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,GAAkC;AACtC,IAAA,MAAM,EAAE,GAAA,EAAAA,IAAAA,EAAK,QAAA,EAAS,GAAI,KAAK,KAAA,EAAM;AACrC,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,YAAA,CAAaA,IAAAA,EAAK,QAAQ,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAA,GAAmC;AACvC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,EAAQ;AAClC,IAAA,OAAO,MAAA,CAAO,YAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,GAAuC;AAC3C,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AAChC,MAAA,IAAA,CAAK,UAAA,GAAa,CAAC,GAAG,CAAA;AAAA,IACxB;AAEA,IAAA,MAAM,EAAE,GAAA,EAAAA,IAAAA,EAAK,QAAA,EAAS,GAAI,KAAK,KAAA,EAAM;AACrC,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,GAAA,CAAI,YAAA,CAAgBA,MAAK,QAAQ,CAAA;AAC3D,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,GAAqC;AACzC,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AAChC,MAAA,IAAA,CAAK,UAAA,GAAa,CAAC,GAAG,CAAA;AAAA,IACxB;AAEA,IAAA,MAAM,EAAE,GAAA,EAAAA,IAAAA,EAAK,QAAA,EAAS,GAAI,KAAK,KAAA,EAAM;AACrC,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,GAAA,CAAI,YAAA,CAAgBA,MAAK,QAAQ,CAAA;AAC3D,IAAA,OAAO,MAAA,CAAO,IAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,GAA0B;AAC9B,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,MAAM,qCAAqC,CAAA;AAAA,IACvD;AAEA,IAAA,MAAMA,IAAAA,GAAM,kBAAkB,IAAA,CAAK,GAAA,CAAI,QAAQ,gBAAA,CAAiB,IAAA,CAAK,MAAM,CAAC,CAAA,CAAA;AAC5E,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,YAAA,CAAaA,IAAAA,EAAK,EAAE,CAAA;AAAA,EACrC;AACF;;;AC7CO,SAAS,0BACd,OAAA,EACqB;AAErB,EAAA,MAAM,WAAA,GAAc,QAAQ,KAAA,GACxB;AAAA,IACE,OAAA,EAAS,QAAQ,KAAA,CAAM,OAAA;AAAA,IACvB,UAAA,EAAY,OAAA,CAAQ,KAAA,CAAM,UAAA,IAAc,GAAA;AAAA;AAAA,IACxC,MAAA,EAAQ,OAAA,CAAQ,KAAA,CAAM,MAAA,IAAU,IAAA;AAAA;AAAA,IAChC,MAAA,EAAQ,OAAA,CAAQ,KAAA,CAAM,MAAA,IAAU,KAAA;AAAA,IAChC,MAAA,EAAQ,OAAA,CAAQ,KAAA,CAAM,MAAA,IAAU,KAAA;AAAA;AAAA,IAChC,iBAAA,EAAmB,OAAA,CAAQ,KAAA,CAAM,iBAAA,IAAqB,GAAA;AAAA,IACtD,gBAAA,EAAkB,OAAA,CAAQ,KAAA,CAAM,gBAAA,IAAoB,GAAA;AAAA,IACpD,MAAA,EAAQ,QAAQ,KAAA,CAAM;AAAA,GACxB,GACA,MAAA;AAEJ,EAAA,MAAM,OAAA,GAAU,IAAI,YAAA,CAAa,OAAA,CAAQ,SAAS,OAAA,CAAQ,QAAA,EAAU,OAAA,CAAQ,MAAA,EAAQ,WAAW,CAAA;AAE/F,EAAA,OAAO;AAAA,IACL,UAAuB,OAAA,EAAqC;AAC1D,MAAA,MAAM,OAAA,GAAU,IAAI,aAAA,CAAiB,OAAO,CAAA;AAC5C,MAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,QAAA,OAAA,CAAQ,MAAA,CAAO,GAAG,OAAO,CAAA;AAAA,MAC3B;AACA,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IAEA,MAAA,GAAwC;AACtC,MAAA,OAAO,IAAI,cAAiB,OAAO,CAAA;AAAA,IACrC,CAAA;AAAA,IAEA,MAAA,GAAwC;AACtC,MAAA,OAAO,IAAI,cAAiB,OAAO,CAAA;AAAA,IACrC,CAAA;AAAA,IAEA,MAAA,GAAwC;AACtC,MAAA,OAAO,IAAI,cAAiB,OAAO,CAAA;AAAA,IACrC,CAAA;AAAA,IAEA,UAAA,GAA2B;AACzB,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IAEA,MAAM,GAAA,CAAiBA,IAAAA,EAAa,QAAA,GAAsB,EAAC,EAAiB;AAC1E,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,YAAA,CAAgBA,MAAK,QAAQ,CAAA;AAC1D,MAAA,OAAO,MAAA,CAAO,IAAA;AAAA,IAChB,CAAA;AAAA,IAEA,MAAM,UAAA,CAAWA,IAAAA,EAAa,QAAA,GAAsB,EAAC,EAAsC;AACzF,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,YAAA,CAAaA,MAAK,QAAQ,CAAA;AACvD,MAAA,OAAO,EAAE,YAAA,EAAc,MAAA,CAAO,YAAA,EAAa;AAAA,IAC7C,CAAA;AAAA,IAEA,KAAA,CAAmB,MAAc,KAAA,EAAkC;AACjE,MAAA,OAAO,IAAI,aAAA,CAAiB,OAAO,CAAA,CAAE,IAAA,CAAK,MAAM,KAAK,CAAA;AAAA,IACvD;AAAA,GACF;AACF;;;AChLO,IAAe,kBAAf,MAEkB;AAAA,EAKvB,WAAA,CACqB,YACA,OAAA,EACnB;AAFmB,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAEnB,IAAA,IAAA,CAAK,KAAK,YAAA,EAAa;AAAA,EACzB;AAAA,EATS,EAAA;AAAA,EACC,SAAA,GAAY,KAAA;AAAA,EACH,UAAA,uBAA8B,GAAA,EAAI;AAAA,EASrD,IAAI,QAAA,GAAoB;AACtB,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA;AAAA,EAIA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,MAAM,IAAI,gBAAA,CAAiB,4BAAA,EAA8B,IAAA,CAAK,EAAE,CAAA;AAAA,IAClE;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,KAAK,uBAAA,EAAwB;AACnC,MAAA,MAAM,KAAK,OAAA,EAAQ;AACnB,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,IACnB,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,gBAAA,CAAiB,6BAAA,EAA+B,IAAA,CAAK,IAAI,KAAc,CAAA;AAAA,IACnF;AAAA,EACF;AAAA,EAEA,MAAM,MAAA,GAAwB;AAC5B,IAAA,IAAA,CAAK,aAAa,QAAQ,CAAA;AAE1B,IAAA,IAAI;AACF,MAAA,MAAM,KAAK,QAAA,EAAS;AACpB,MAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,MAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AAAA,IACxB,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,gBAAA,CAAiB,8BAAA,EAAgC,IAAA,CAAK,IAAI,KAAc,CAAA;AAAA,IACpF,CAAA,SAAE;AACA,MAAA,MAAM,KAAK,iBAAA,EAAkB;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,MAAM,QAAA,GAA0B;AAC9B,IAAA,IAAA,CAAK,aAAa,UAAU,CAAA;AAE5B,IAAA,IAAI;AACF,MAAA,MAAM,KAAK,UAAA,EAAW;AACtB,MAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,MAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AAAA,IACxB,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,gBAAA,CAAiB,gCAAA,EAAkC,IAAA,CAAK,IAAI,KAAc,CAAA;AAAA,IACtF,CAAA,SAAE;AACA,MAAA,MAAM,KAAK,iBAAA,EAAkB;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,IAAA,EAA6B;AAC3C,IAAA,IAAA,CAAK,aAAa,kBAAkB,CAAA;AACpC,IAAA,IAAA,CAAK,sBAAsB,IAAI,CAAA;AAE/B,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA,EAAG;AAC7B,MAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,WAAA,EAAc,IAAI,CAAA,gBAAA,CAAA,EAAoB,KAAK,EAAE,CAAA;AAAA,IAC1E;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,YAAY,IAAI,CAAA;AAC3B,MAAA,IAAA,CAAK,UAAA,CAAW,IAAI,IAAI,CAAA;AAAA,IAC1B,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,4BAAA,EAA+B,IAAI,CAAA,CAAA,CAAA,EAAK,IAAA,CAAK,IAAI,KAAc,CAAA;AAAA,IAC5F;AAAA,EACF;AAAA,EAEA,MAAM,iBAAiB,IAAA,EAA6B;AAClD,IAAA,IAAA,CAAK,aAAa,mBAAmB,CAAA;AACrC,IAAA,IAAA,CAAK,sBAAsB,IAAI,CAAA;AAE/B,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,mBAAmB,IAAI,CAAA;AAClC,MAAA,IAAA,CAAK,UAAA,CAAW,OAAO,IAAI,CAAA;AAAA,IAC7B,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,6BAAA,EAAgC,IAAI,CAAA,CAAA,CAAA,EAAK,IAAA,CAAK,IAAI,KAAc,CAAA;AAAA,IAC7F;AAAA,EACF;AAAA,EAEA,MAAM,oBAAoB,IAAA,EAA6B;AACrD,IAAA,IAAA,CAAK,aAAa,uBAAuB,CAAA;AACzC,IAAA,IAAA,CAAK,sBAAsB,IAAI,CAAA;AAE/B,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,sBAAsB,IAAI,CAAA;AACrC,MAAA,IAAA,CAAK,sBAAsB,IAAI,CAAA;AAAA,IACjC,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,gBAAA;AAAA,QACR,oCAAoC,IAAI,CAAA,CAAA,CAAA;AAAA,QACxC,IAAA,CAAK,EAAA;AAAA,QACL;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,KAAA,CACJA,IAAAA,EACA,MAAA,EACA,OAAA,EACyB;AACzB,IAAA,IAAA,CAAK,aAAa,eAAe,CAAA;AAEjC,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAAWA,IAAAA,EAAK,QAAQ,OAAO,CAAA;AAAA,IACnD,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,gBAAA;AAAA,QACR,CAAA,6BAAA,EAAiC,MAAgB,OAAO,CAAA,CAAA;AAAA,QACxD,IAAA,CAAK,EAAA;AAAA,QACL;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CACJA,IAAAA,EACA,MAAA,EACA,OAAA,EACyB;AACzB,IAAA,OAAO,IAAA,CAAK,KAAA,CAASA,IAAAA,EAAK,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAA6B;AAC3B,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EA0DA,MAAgB,uBAAA,GAAyC;AACvD,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAK,OAAA,CAAQ,cAAA,KAAmB,QAAQ,IAAA,CAAK,OAAA,CAAQ,mBAAmB,MAAA,EAAW;AACrF,MAAA,MAAM,IAAA,CAAK,iBAAA,CAAkB,IAAA,CAAK,OAAA,CAAQ,cAAc,CAAA;AAAA,IAC1D;AAAA,EAIF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,iBAAA,GAAmC;AACjD,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA;AAAA,IACjD,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKU,aAAa,SAAA,EAAyB;AAC9C,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,OAAA,EAAU,SAAS,CAAA,wBAAA,CAAA,EAA4B,KAAK,EAAE,CAAA;AAAA,IACnF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKU,sBAAsB,IAAA,EAAoB;AAClD,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA,EAAG;AAC9B,MAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,WAAA,EAAc,IAAI,CAAA,gBAAA,CAAA,EAAoB,KAAK,EAAE,CAAA;AAAA,IAC1E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKU,sBAAsB,IAAA,EAAoB;AAClD,IAAA,IAAI,CAAC,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAA,EAAG;AAChC,MAAA,MAAM,IAAI,gBAAA;AAAA,QACR,2BAA2B,IAAI,CAAA,8CAAA,CAAA;AAAA,QAC/B,IAAA,CAAK;AAAA,OACP;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKU,sBAAsB,IAAA,EAAsB;AACpD,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,KAAA,EAAO,GAAG,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKU,sBAAsB,IAAA,EAAoB;AAClD,IAAA,MAAM,eAAA,GAAkB,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,UAAU,CAAA;AAClD,IAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,OAAA,CAAQ,IAAI,CAAA;AAE1C,IAAA,IAAI,UAAU,EAAA,EAAI;AAChB,MAAA,KAAA,IAAS,IAAI,KAAA,GAAQ,CAAA,EAAG,CAAA,GAAI,eAAA,CAAgB,QAAQ,CAAA,EAAA,EAAK;AACvD,QAAA,MAAM,EAAA,GAAK,gBAAgB,CAAC,CAAA;AAC5B,QAAA,IAAI,EAAA,EAAI;AACN,UAAA,IAAA,CAAK,UAAA,CAAW,OAAO,EAAE,CAAA;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKU,gBAAgB,MAAA,EAAiC;AACzD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,EAAC;AAAA,IACV;AACA,IAAA,OAAO,MAAM,OAAA,CAAQ,MAAM,IAAI,MAAA,GAAS,MAAA,CAAO,OAAO,MAAM,CAAA;AAAA,EAC9D;AACF;;;ACtTO,IAAM,kBAAN,MAAmC;AAAA,EAChC,cAAoC,EAAC;AAAA;AAAA;AAAA;AAAA,EAK7C,IAAI,UAAA,EAAsC;AACxC,IAAA,IAAA,CAAK,WAAA,CAAY,KAAK,UAAU,CAAA;AAChC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,UAAA,EAAsC;AAC3C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ,UAAU,CAAA;AACjD,IAAA,IAAI,UAAU,EAAA,EAAI;AAChB,MAAA,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,KAAA,EAAO,CAAC,CAAA;AAAA,IAClC;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,cAAc,EAAC;AACpB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,MAAA,GAAiB;AACnB,IAAA,OAAO,KAAK,WAAA,CAAY,MAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CACJ,OAAA,EACA,YAAA,EACmC;AAEnC,IAAA,IAAI,IAAA,GAA0B,YAAA;AAE9B,IAAA,KAAA,IAAS,IAAI,IAAA,CAAK,WAAA,CAAY,SAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACrD,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,CAAC,CAAA;AACrC,MAAA,MAAM,WAAA,GAAc,IAAA;AACpB,MAAA,IAAA,GAAO,CAAC,GAAA,KAAQ,UAAA,CAAW,GAAA,EAAK,WAAW,CAAA;AAAA,IAC7C;AAEA,IAAA,OAAO,KAAK,OAAO,CAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,aAAA,CACLA,IAAAA,EACA,MAAA,EACA,OAAA,EACwB;AACxB,IAAA,OAAO;AAAA,MACL,GAAA,EAAAA,IAAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,UAAU;AAAC,KACb;AAAA,EACF;AACF;AAKO,SAAS,qBACX,WAAA,EACiB;AACpB,EAAA,OAAO,OAAO,SAAS,IAAA,KAAS;AAC9B,IAAA,MAAM,KAAA,GAAQ,IAAI,eAAA,EAAmB;AACrC,IAAA,WAAA,CAAY,QAAQ,CAAC,CAAA,KAAM,KAAA,CAAM,GAAA,CAAI,CAAC,CAAC,CAAA;AACvC,IAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,OAAA,EAAS,IAAI,CAAA;AAAA,EACpC,CAAA;AACF;ACjFA,SAAS,mBAAmBA,IAAAA,EAAsB;AAChD,EAAA,MAAM,aAAA,GAAgBA,IAAAA,CAAI,IAAA,EAAK,CAAE,WAAA,EAAY;AAC7C,EAAA,OACE,aAAA,CAAc,UAAA,CAAW,QAAQ,CAAA,IACjC,cAAc,UAAA,CAAW,MAAM,CAAA,IAC/B,aAAA,CAAc,UAAA,CAAW,UAAU,CAAA,IACnC,aAAA,CAAc,WAAW,SAAS,CAAA;AAEtC;AAKA,SAASc,iBAAAA,CAAiB,MAAA,EAAgBd,IAAAA,EAAa,MAAA,EAA2B;AAChF,EAAA,MAAM,IAAA,GAAOW,WAAW,QAAQ,CAAA;AAChC,EAAA,IAAA,CAAK,OAAOX,IAAG,CAAA;AACf,EAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AAClC,EAAA,OAAO,CAAA,EAAG,MAAM,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AACpD;AAKO,SAAS,sBACd,OAAA,EACoB;AACpB,EAAA,MAAM;AAAA,IACJ,OAAA;AAAA,IACA,UAAA,GAAa,GAAA;AAAA,IACb,SAAA,GAAY,SAAA;AAAA,IACZ,WAAA,GAAc;AAAA,GAChB,GAAI,OAAA;AAEJ,EAAA,OAAO,OACL,SACA,IAAA,KACsC;AAEtC,IAAA,IAAI,OAAA,CAAQ,OAAA,EAAS,KAAA,KAAU,KAAA,EAAO;AACpC,MAAA,OAAO,KAAK,OAAO,CAAA;AAAA,IACrB;AAGA,IAAA,IAAI,CAAC,WAAA,CAAY,OAAA,CAAQ,GAAA,EAAK,OAAA,CAAQ,MAAM,CAAA,EAAG;AAC7C,MAAA,OAAO,KAAK,OAAO,CAAA;AAAA,IACrB;AAGA,IAAA,MAAM,YAAA,GAAe,OAAO,OAAA,CAAQ,OAAA,EAAS,UAAU,QAAA,GAAW,OAAA,CAAQ,OAAA,CAAQ,KAAA,GAAQ,EAAC;AAC3F,IAAA,MAAMG,SAAAA,GAAW,aAAa,GAAA,IAAOW,iBAAAA,CAAiB,WAAW,OAAA,CAAQ,GAAA,EAAK,QAAQ,MAAM,CAAA;AAG5F,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,GAAA,CAA8BX,SAAQ,CAAA;AACnE,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,OAAO;AAAA,UACL,GAAG,MAAA;AAAA,UACH,MAAA,EAAQ,IAAA;AAAA,UACR,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI,OAAA,CAAQ;AAAA,SACjC;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAGA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAO,CAAA;AAGjC,IAAA,IAAI,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AACjC,MAAA,MAAM,GAAA,GAAM,aAAa,GAAA,IAAO,UAAA;AAChC,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,CAAQ,GAAA,CAAIA,SAAAA,EAAU,MAAA,EAAQ,GAAG,CAAA;AAAA,MACzC,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,GAAG,MAAA;AAAA,MACH,MAAA,EAAQ;AAAA,KACV;AAAA,EACF,CAAA;AACF;AAMO,SAAS,iCAAA,CACd,QAAA,EACA,UAAA,GAAa,SAAA,EACO;AACpB,EAAA,OAAO,OACL,SACA,IAAA,KACsC;AACtC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAO,CAAA;AAGjC,IAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,GAAA,CAAI,IAAA,GAAO,WAAA,EAAY;AACrD,IAAA,MAAM,OAAA,GACJ,aAAA,CAAc,UAAA,CAAW,QAAQ,KACjC,aAAA,CAAc,UAAA,CAAW,QAAQ,CAAA,IACjC,cAAc,UAAA,CAAW,QAAQ,CAAA,IACjC,aAAA,CAAc,WAAW,UAAU,CAAA;AAErC,IAAA,IAAI,OAAA,EAAS;AAEX,MAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,OAAA,CAAQ,GAAG,CAAA;AAC9C,MAAA,IAAI,SAAA,EAAW;AAEb,QAAA,OAAA,CAAQ,QAAA,CAAS,kBAAkB,CAAA,GAAI,SAAA;AACvC,QAAA,OAAA,CAAQ,QAAA,CAAS,kBAAkB,CAAA,GAAI,IAAA;AAAA,MACzC;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AACF;AAKA,SAAS,iBAAiBH,IAAAA,EAA4B;AACpD,EAAA,MAAM,aAAA,GAAgBA,IAAAA,CAAI,IAAA,EAAK,CAAE,WAAA,EAAY;AAG7C,EAAA,MAAM,WAAA,GAAc,aAAA,CAAc,KAAA,CAAM,oCAAoC,CAAA;AAC5E,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,OAAO,WAAA,CAAY,CAAC,CAAA,IAAK,IAAA;AAAA,EAC3B;AAGA,EAAA,MAAM,WAAA,GAAc,aAAA,CAAc,KAAA,CAAM,6BAA6B,CAAA;AACrE,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,OAAO,WAAA,CAAY,CAAC,CAAA,IAAK,IAAA;AAAA,EAC3B;AAGA,EAAA,MAAM,WAAA,GAAc,aAAA,CAAc,KAAA,CAAM,oCAAoC,CAAA;AAC5E,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,OAAO,WAAA,CAAY,CAAC,CAAA,IAAK,IAAA;AAAA,EAC3B;AAGA,EAAA,MAAM,aAAA,GAAgB,aAAA,CAAc,KAAA,CAAM,4CAA4C,CAAA;AACtF,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,OAAO,aAAA,CAAc,CAAC,CAAA,IAAK,IAAA;AAAA,EAC7B;AAEA,EAAA,OAAO,IAAA;AACT;;;AC3JA,SAAS,sBAAsB,KAAA,EAAuB;AACpD,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,WAAA,EAAY;AAG1C,EAAA,IACE,OAAA,CAAQ,SAAS,YAAY,CAAA,IAC7B,QAAQ,QAAA,CAAS,cAAc,CAAA,IAC/B,OAAA,CAAQ,QAAA,CAAS,WAAW,KAC5B,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA,IACxB,OAAA,CAAQ,QAAA,CAAS,iBAAiB,CAAA,IAClC,OAAA,CAAQ,QAAA,CAAS,mBAAmB,CAAA,EACpC;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IACE,OAAA,CAAQ,QAAA,CAAS,UAAU,CAAA,IAC3B,OAAA,CAAQ,QAAA,CAAS,mBAAmB,CAAA,IACpC,OAAA,CAAQ,QAAA,CAAS,4BAA4B,CAAA,EAC7C;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IACE,OAAA,CAAQ,QAAA,CAAS,sBAAsB,CAAA,IACvC,OAAA,CAAQ,QAAA,CAAS,sBAAsB,CAAA,IACvC,OAAA,CAAQ,QAAA,CAAS,iBAAiB,CAAA,EAClC;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA;AACT;AAKA,SAAS,cAAA,CACP,OAAA,EACA,SAAA,EACA,QAAA,EACA,UAAA,EACQ;AAER,EAAA,MAAM,gBAAA,GAAmB,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,YAAY,OAAO,CAAA;AAGjE,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,gBAAA,EAAkB,QAAQ,CAAA;AAGvD,EAAA,MAAM,SAAS,WAAA,GAAc,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,CAAA,GAAI,CAAA,CAAA;AAEzD,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,WAAA,GAAc,MAAM,CAAA;AACxC;AAKA,SAASe,OAAM,EAAA,EAA2B;AACxC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AACzD;AAKO,SAAS,qBAAA,CACd,OAAA,GAAkC,EAAC,EACf;AACpB,EAAA,MAAM;AAAA,IACJ,UAAA,GAAa,CAAA;AAAA,IACb,SAAA,GAAY,GAAA;AAAA,IACZ,QAAA,GAAW,GAAA;AAAA,IACX,OAAA,GAAU,qBAAA;AAAA,IACV,iBAAA,GAAoB;AAAA,GACtB,GAAI,OAAA;AAEJ,EAAA,OAAO,OACL,SACA,IAAA,KACsC;AACtC,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI,QAAA,GAAW,CAAA;AAEf,IAAA,OAAO,YAAY,UAAA,EAAY;AAC7B,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAO,CAAA;AAGjC,QAAA,IAAI,WAAW,CAAA,EAAG;AAChB,UAAA,MAAA,CAAO,OAAA,GAAU,QAAA;AAAA,QACnB;AAEA,QAAA,OAAO,MAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAA,SAAA,GAAY,KAAA;AACZ,QAAA,QAAA,EAAA;AAGA,QAAA,IAAI,QAAA,GAAW,UAAA,IAAc,CAAC,OAAA,CAAQ,SAAS,CAAA,EAAG;AAChD,UAAA,MAAM,SAAA;AAAA,QACR;AAGA,QAAA,MAAM,QAAQ,cAAA,CAAe,QAAA,GAAW,CAAA,EAAG,SAAA,EAAW,UAAU,iBAAiB,CAAA;AAGjF,QAAA,OAAA,CAAQ,QAAA,CAAS,cAAc,CAAA,GAAI,QAAA;AACnC,QAAA,OAAA,CAAQ,QAAA,CAAS,YAAY,CAAA,GAAI,KAAA;AACjC,QAAA,OAAA,CAAQ,QAAA,CAAS,WAAW,CAAA,GAAI,SAAA,CAAU,OAAA;AAE1C,QAAA,MAAMA,OAAM,KAAK,CAAA;AAAA,MACnB;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,IAAa,IAAI,KAAA,CAAM,cAAc,CAAA;AAAA,EAC7C,CAAA;AACF;AAMO,SAAS,8BAAA,CACd,OAAA,GAII,EAAC,EACe;AACpB,EAAA,MAAM,EAAE,gBAAA,GAAmB,CAAA,EAAG,eAAe,GAAA,EAAQ,gBAAA,GAAmB,GAAE,GAAI,OAAA;AAE9E,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,IAAI,eAAA,GAAkB,CAAA;AACtB,EAAA,IAAI,KAAA,GAAyC,QAAA;AAC7C,EAAA,IAAI,iBAAA,GAAoB,CAAA;AAExB,EAAA,OAAO,OACL,SACA,IAAA,KACsC;AAEtC,IAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,MAAA,IAAI,GAAA,GAAM,mBAAmB,YAAA,EAAc;AACzC,QAAA,KAAA,GAAQ,WAAA;AACR,QAAA,iBAAA,GAAoB,CAAA;AAAA,MACtB,CAAA,MAAO;AACL,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,wCAAwC,IAAA,CAAK,IAAA,CAAA,CAAM,gBAAgB,GAAA,GAAM,eAAA,CAAA,IAAoB,GAAI,CAAC,CAAA,CAAA;AAAA,SACpG;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAO,CAAA;AAGjC,MAAA,IAAI,UAAU,WAAA,EAAa;AACzB,QAAA,iBAAA,EAAA;AACA,QAAA,IAAI,qBAAqB,gBAAA,EAAkB;AACzC,UAAA,KAAA,GAAQ,QAAA;AACR,UAAA,QAAA,GAAW,CAAA;AAAA,QACb;AAAA,MACF,CAAA,MAAO;AACL,QAAA,QAAA,GAAW,CAAA;AAAA,MACb;AAEA,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,QAAA,EAAA;AACA,MAAA,eAAA,GAAkB,KAAK,GAAA,EAAI;AAE3B,MAAA,IAAI,KAAA,KAAU,WAAA,IAAe,QAAA,IAAY,gBAAA,EAAkB;AACzD,QAAA,KAAA,GAAQ,MAAA;AAAA,MACV;AAEA,MAAA,OAAA,CAAQ,QAAA,CAAS,cAAc,CAAA,GAAI,KAAA;AACnC,MAAA,OAAA,CAAQ,QAAA,CAAS,UAAU,CAAA,GAAI,QAAA;AAE/B,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF,CAAA;AACF;;;ACtLO,SAAS,uBAAA,CACd,OAAA,GAAoC,EAAC,EACjB;AACpB,EAAA,MAAM,EAAE,cAAA,GAAiB,GAAA,EAAQ,SAAA,EAAU,GAAI,OAAA;AAE/C,EAAA,OAAO,OACL,SACA,IAAA,KACsC;AAEtC,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,EAAS,OAAA,IAAW,cAAA;AAG5C,IAAA,IAAI,WAAW,CAAA,EAAG;AAChB,MAAA,OAAO,KAAK,OAAO,CAAA;AAAA,IACrB;AAGA,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,IAAI,SAAA;AAGJ,IAAA,MAAM,cAAA,GAAiB,IAAI,OAAA,CAAe,CAAC,GAAG,MAAA,KAAW;AACvD,MAAA,SAAA,GAAY,WAAW,MAAM;AAC3B,QAAA,UAAA,CAAW,KAAA,EAAM;AACjB,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,EAAI,GAAI,OAAA,CAAQ,SAAA;AAGrC,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,IAAI;AACF,YAAA,SAAA,CAAU,OAAA,CAAQ,KAAK,OAAO,CAAA;AAAA,UAChC,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AAGA,QAAA,OAAA,CAAQ,QAAA,CAAS,UAAU,CAAA,GAAI,IAAA;AAC/B,QAAA,OAAA,CAAQ,QAAA,CAAS,WAAW,CAAA,GAAI,OAAA;AAChC,QAAA,OAAA,CAAQ,QAAA,CAAS,WAAW,CAAA,GAAI,OAAA;AAEhC,QAAA,MAAA;AAAA,UACE,IAAI,YAAA,CAAa,CAAA,sBAAA,EAAyB,OAAO,CAAA,WAAA,EAAc,OAAO,OAAO,OAAO;AAAA,SACtF;AAAA,MACF,GAAG,OAAO,CAAA;AAAA,IACZ,CAAC,CAAA;AAED,IAAA,IAAI;AAEF,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,IAAA,CAAK,CAAC,IAAA,CAAK,OAAO,CAAA,EAAG,cAAc,CAAC,CAAA;AAGjE,MAAA,MAAA,CAAO,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,OAAA,CAAQ,SAAA;AAEvC,MAAA,OAAO,MAAA;AAAA,IACT,CAAA,SAAE;AAEA,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,YAAA,CAAa,SAAS,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,EACF,CAAA;AACF;AAMO,SAAS,wBAAA,CACd,OAAA,GAEI,EAAC,EACe;AACpB,EAAA,MAAM,EAAE,aAAY,GAAI,OAAA;AAExB,EAAA,OAAO,OACL,SACA,IAAA,KACsC;AAEtC,IAAA,MAAM,WAAW,WAAA,GAAc,OAAO,CAAA,IAAM,OAAA,CAAQ,SAAS,UAAU,CAAA;AAGvE,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,KAAK,OAAO,CAAA;AAAA,IACrB;AAEA,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,gBAAgB,QAAA,GAAW,GAAA;AAGjC,IAAA,IAAI,iBAAiB,CAAA,EAAG;AACtB,MAAA,MAAM,IAAI,YAAA;AAAA,QACR,mCAAmC,IAAI,IAAA,CAAK,QAAQ,CAAA,CAAE,aAAa,CAAA,CAAA;AAAA,QACnE,CAAC;AAAA,OACH;AAAA,IACF;AAGA,IAAA,MAAM,oBAAoB,uBAAA,CAA2B;AAAA,MACnD,cAAA,EAAgB;AAAA,KACjB,CAAA;AAED,IAAA,OAAO,iBAAA,CAAkB,SAAS,IAAI,CAAA;AAAA,EACxC,CAAA;AACF;;;AC1GA,IAAM,aAAA,GAAkC;AAAA,EACtC,KAAA,EAAO,CAAC,GAAA,EAAA,GAAQ,IAAA,KAAS,OAAA,CAAQ,MAAM,CAAA,YAAA,EAAe,GAAG,CAAA,CAAA,EAAI,GAAG,IAAI,CAAA;AAAA,EACpE,IAAA,EAAM,CAAC,GAAA,EAAA,GAAQ,IAAA,KAAS,OAAA,CAAQ,KAAK,CAAA,YAAA,EAAe,GAAG,CAAA,CAAA,EAAI,GAAG,IAAI,CAAA;AAAA,EAClE,IAAA,EAAM,CAAC,GAAA,EAAA,GAAQ,IAAA,KAAS,OAAA,CAAQ,KAAK,CAAA,YAAA,EAAe,GAAG,CAAA,CAAA,EAAI,GAAG,IAAI,CAAA;AAAA,EAClE,KAAA,EAAO,CAAC,GAAA,EAAA,GAAQ,IAAA,KAAS,OAAA,CAAQ,MAAM,CAAA,YAAA,EAAe,GAAG,CAAA,CAAA,EAAI,GAAG,IAAI;AACtE,CAAA;AAMA,SAAS,WAAA,CAAYf,IAAAA,EAAa,SAAA,GAAY,GAAA,EAAa;AACzD,EAAA,IAAIA,IAAAA,CAAI,UAAU,SAAA,EAAW;AAC3B,IAAA,OAAOA,IAAAA;AAAA,EACT;AACA,EAAA,OAAO,CAAA,EAAGA,IAAAA,CAAI,KAAA,CAAM,CAAA,EAAG,SAAS,CAAC,CAAA,GAAA,CAAA;AACnC;AAKA,SAAS,YAAA,CAAa,MAAA,EAAmB,SAAA,GAAY,GAAA,EAAa;AAChE,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AACjC,EAAA,IAAI,GAAA,CAAI,UAAU,SAAA,EAAW;AAC3B,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,OAAO,CAAA,EAAG,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,SAAS,CAAC,CAAA,GAAA,CAAA;AACnC;AAKO,SAAS,uBAAA,CACd,OAAA,GAAoC,EAAC,EACjB;AACpB,EAAA,MAAM;AAAA,IACJ,MAAA,GAAS,aAAA;AAAA,IACT,QAAA,GAAW,OAAA;AAAA,IACX,SAAA,GAAY,KAAA;AAAA,IACZ,UAAA,GAAa,KAAA;AAAA,IACb,kBAAA,GAAqB;AAAA,GACvB,GAAI,OAAA;AAEJ,EAAA,MAAM,GAAA,GAAM,OAAO,QAAQ,CAAA;AAE3B,EAAA,OAAO,OACL,SACA,IAAA,KACsC;AACtC,IAAA,MAAM,YAAA,GAAe,WAAA,CAAY,OAAA,CAAQ,GAAG,CAAA;AAC5C,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAG3B,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,GAAA,CAAI,oBAAoB,YAAY,CAAA,CAAA,EAAI,YAAA,CAAa,OAAA,CAAQ,MAAM,CAAC,CAAA;AAAA,IACtE,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,CAAA,iBAAA,EAAoB,YAAY,CAAA,CAAE,CAAA;AAAA,IACxC;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAO,CAAA;AACjC,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAG9B,MAAA,IAAI,YAAY,kBAAA,EAAoB;AAClC,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,qBAAA,EAAwB,QAAQ,CAAA,KAAA,EAAQ,YAAY,CAAA,CAAA,EAAI;AAAA,UAClE,QAAA;AAAA,UACA,QAAA,EAAU,OAAO,MAAA,CAAO;AAAA,SACzB,CAAA;AAAA,MACH;AAGA,MAAA,MAAM,SAAS,CAAA,mBAAA,EAAsB,QAAQ,CAAA,IAAA,EAAO,MAAA,CAAO,OAAO,QAAQ,CAAA,MAAA,CAAA;AAC1E,MAAA,IAAI,UAAA,IAAc,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,EAAG;AAC/C,QAAA,GAAA,CAAI,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,CAAO,MAAA,CAAO,KAAK,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,EAAG,CAAA;AAAA,MACtD,CAAA,MAAO;AACL,QAAA,GAAA,CAAI,MAAM,CAAA;AAAA,MACZ;AAGA,MAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,QAAA,GAAA,CAAI,CAAA,uBAAA,CAAyB,CAAA;AAAA,MAC/B;AAEA,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC9B,MAAA,MAAA,CAAO,MAAM,CAAA,mBAAA,EAAsB,QAAQ,CAAA,IAAA,EAAQ,KAAA,CAAgB,OAAO,CAAA,CAAA,EAAI;AAAA,QAC5E,GAAA,EAAK,YAAA;AAAA,QACL;AAAA,OACD,CAAA;AACD,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF,CAAA;AACF;AAMO,SAAS,uBAAA,CACd,OAAA,GAGI,EAAC,EACe;AACpB,EAAA,MAAM,EAAE,OAAA,EAAS,OAAA,GAAU,CAAC,IAAI,EAAA,EAAI,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAM,IAAA,EAAM,GAAA,EAAM,GAAM,GAAE,GAAI,OAAA;AAEjF,EAAA,OAAO,OACL,SACA,IAAA,KACsC;AACtC,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,IAAI,MAAA;AAEJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,MAAM,KAAK,OAAO,CAAA;AAC3B,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,OAAO,MAAA;AAAA,IACT,CAAA,SAAE;AACA,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAG9B,MAAA,MAAM,MAAA,GAAS,QAAQ,IAAA,CAAK,CAAC,MAAM,QAAA,IAAY,CAAC,KAAK,MAAA,CAAO,iBAAA;AAG5D,MAAA,MAAM,OAAA,GAAkC;AAAA,QACtC,KAAK,OAAA,CAAQ,GAAA;AAAA,QACb,QAAA;AAAA,QACA,OAAA;AAAA,QACA,MAAA,EAAQ,QAAQ,MAAA,IAAU,KAAA;AAAA,QAC1B,QAAA,EAAU,MAAA,EAAQ,MAAA,EAAQ,QAAA,IAAY,CAAA;AAAA,QACtC,OAAA,EAAS,QAAQ,OAAA,IAAW,CAAA;AAAA,QAC5B,MAAA;AAAA,QACA,SAAA,sBAAe,IAAA;AAAK,OACtB;AAGA,MAAA,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,GAAI,OAAA;AAG9B,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,IAAI;AACF,UAAA,OAAA,CAAQ,OAAO,CAAA;AAAA,QACjB,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA;AACF;;;ACpFO,IAAM,QAAA,GAAN,MAAM,SAAA,CAAS;AAAA,EACpB,OAAe,SAAA,mBAAmC,IAAI,GAAA,EAAI;AAAA,EAClD,OAAA;AAAA,EACA,SAAA,GAAqB,KAAA;AAAA,EAEb,OAAA;AAAA,EAEhB,YAAY,OAAA,EAAwB;AAClC,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,OAAA,GAAU,KAAK,aAAA,EAAc;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,OAAO,OAAO,OAAA,EAAkC;AAC9C,IAAA,OAAO,IAAI,UAAS,OAAO,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,OAAO,WAAA,CAAY,IAAA,EAAc,OAAA,EAAmC;AAClE,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA,EAAG;AAC7B,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,UAAA,EAAa,IAAI,CAAA,mCAAA,CAAqC,CAAA;AAAA,MACxE;AACA,MAAA,IAAA,CAAK,UAAU,GAAA,CAAI,IAAA,EAAM,IAAI,SAAA,CAAS,OAAO,CAAC,CAAA;AAAA,IAChD;AACA,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAO,OAAA,CAAQ,GAAA,EAAa,OAAA,EAA4C;AACtE,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,CAAc,GAAG,CAAA;AACvC,IAAA,OAAO,IAAI,SAAA,CAAS;AAAA,MAClB,QAAA;AAAA,MACA,GAAA;AAAA,MACA,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA,EAEA,OAAe,cAAc,GAAA,EAAwC;AACnE,IAAA,IAAI,GAAA,CAAI,UAAA,CAAW,UAAU,CAAA,EAAG;AAC9B,MAAA,OAAO,OAAA;AAAA,IACT;AACA,IAAA,IAAI,IAAI,UAAA,CAAW,eAAe,KAAK,GAAA,CAAI,UAAA,CAAW,aAAa,CAAA,EAAG;AACpE,MAAA,OAAO,YAAA;AAAA,IACT;AACA,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,GAAG,CAAA,CAAE,CAAA;AAAA,EACpD;AAAA,EAEQ,aAAA,GAAiC;AACvC,IAAA,MAAM,MAAA,GAAS,KAAK,OAAA,CAAQ,MAAA,KAAW,OAAO,OAAA,GAAU,IAAA,CAAK,QAAQ,MAAA,IAAU,MAAA;AAE/E,IAAA,IAAIS,OAAAA;AACJ,IAAA,IAAI,IAAA,CAAK,QAAQ,UAAA,EAAY;AAC3B,MAAA,MAAM,cAAA,GAAiB,KAAK,OAAA,CAAQ,UAAA,KAAe,OAAO,EAAC,GAAI,KAAK,OAAA,CAAQ,UAAA;AAC5E,MAAAA,OAAAA,GAAS,IAAI,cAAA,CAAe;AAAA,QAC1B,WAAW,cAAA,CAAe;AAAA,OAC3B,CAAA;AACD,MAAA,IAAI,eAAe,GAAA,EAAK;AACtB,QAAA,OAAA,CAAQ,GAAA,CAAI,0BAA0B,CAAA,GAAI,cAAA,CAAe,GAAA;AAAA,MAC3D;AAAA,IACF;AAEA,IAAA,IAAI,OAAA;AAGJ,IAAA,QAAQ,IAAA,CAAK,QAAQ,QAAA;AAAU,MAC7B,KAAK,OAAA,EAAS;AACZ,QAAA,MAAM,EAAE,YAAA,EAAa,GAAI,SAAA,CAAQ,kBAAkB,CAAA;AACnD,QAAA,OAAA,GAAU,IAAI,YAAA,CAAa,EAAE,MAAA,EAAQ,MAAA,EAAAA,SAAQ,CAAA;AAC7C,QAAA;AAAA,MACF;AAAA,MACA,KAAK,YAAA;AAAA,MACL,KAAK,UAAA,EAAY;AACf,QAAA,MAAM,EAAE,iBAAA,EAAkB,GAAI,SAAA,CAAQ,uBAAuB,CAAA;AAC7D,QAAA,OAAA,GAAU,IAAI,iBAAA,CAAkB,EAAE,MAAA,EAAQ,MAAA,EAAAA,SAAQ,CAAA;AAClD,QAAA;AAAA,MACF;AAAA,MACA,SAAS;AACP,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA,CAAE,CAAA;AAAA,MAClE;AAAA;AAIF,IAAA,IAAI,IAAA,CAAK,QAAQ,KAAA,EAAO;AACtB,MAAA,MAAM,SAAA,GACJ,IAAA,CAAK,OAAA,CAAQ,KAAA,KAAU,IAAA,GAAO,EAAE,QAAA,EAAU,OAAA,EAAiB,GAAI,IAAA,CAAK,OAAA,CAAQ,KAAA;AAC9E,MAAA,IAAI,SAAA,CAAU,aAAa,OAAA,EAAS;AAClC,QAAA,MAAM,EAAE,YAAA,EAAa,GAAI,SAAA,CAAQ,kBAAkB,CAAA;AACnD,QAAA,MAAM,YAAA,GAAe,IAAI,YAAA,CAAa,EAAE,QAAQ,CAAA;AAChD,QAAA,IAAI,SAAA,CAAU,GAAA,IAAO,SAAA,CAAU,UAAA,EAAY;AAG3C,QAAA,OAAA,GAAU,IAAI,aAAA,CAAc;AAAA,UAC1B,OAAA;AAAA,UACA,KAAA,EAAO,YAAA;AAAA,UACP,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEQ,mBAAmB,GAAA,EAA+B;AACxD,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,GAAG,CAAA;AAC1B,IAAA,OAAO;AAAA,MACL,MAAM,MAAA,CAAO,QAAA;AAAA,MACb,IAAA,EAAM,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,IAAI,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAA,KAAa,OAAA,GAAU,IAAA,GAAO,IAAA,CAAA;AAAA,MAClF,MAAM,MAAA,CAAO,QAAA;AAAA,MACb,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,QAAA,EAAU,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA;AAAA,MACjC,GAAA,EAAK,KAAK,OAAA,CAAQ;AAAA,KACpB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,GACxB,IAAA,CAAK,kBAAA,CAAmB,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA,GACxC,IAAA,CAAK,OAAA,CAAQ,UAAA;AAEjB,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAAA,IACxD;AAEA,IAAA,MAAM,IAAA,CAAK,QAAQ,OAAA,CAAQ;AAAA,MACzB,GAAG,MAAA;AAAA,MACH,QAAA,EAAU,IAAA,CAAK,OAAA,CAAQ,QAAA,IAAY,MAAA,CAAO;AAAA,KAC3C,CAAA;AAGD,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,KAAA,IAAS,IAAA,CAAK,mBAAmB,aAAA,EAAe;AAC/D,MAAA,MAAM,SAAA,GACJ,IAAA,CAAK,OAAA,CAAQ,KAAA,KAAU,IAAA,GAAO,EAA6B,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,KAAA;AAC9E,MAAA,MAAM,YAAA,GAAgB,KAAK,OAAA,CAAgB,KAAA;AAE3C,MAAA,IAAI,UAAU,GAAA,EAAK;AACjB,QAAA,MAAM,aAAa,OAAA,CAAQ,IAAA,CAAK,kBAAA,CAAmB,SAAA,CAAU,GAAG,CAAC,CAAA;AAAA,MACnE,CAAA,MAAA,IAAW,UAAU,UAAA,EAAY;AAC/B,QAAA,MAAM,YAAA,CAAa,OAAA,CAAQ,SAAA,CAAU,UAAU,CAAA;AAAA,MACjD,CAAA,MAAO;AAEL,QAAA,MAAM,aAAa,OAAA,CAAQ,EAAE,MAAM,WAAA,EAAa,IAAA,EAAM,MAAM,CAAA;AAAA,MAC9D;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,IAAA,CAAc,OAAe,KAAA,EAAgB;AAC3C,IAAA,OAAO,KAAK,OAAA,CAAQ,kBAAA,EAAsB,CAAE,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,KAAA,CAAeT,IAAAA,EAAa,MAAA,EAAgB;AAChD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,CAASA,IAAAA,EAAK,MAAM,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,MAAA,CAAgB,KAAA,EAAe,IAAA,EAAmD;AACtF,IAAA,OAAO,IAAA,CAAK,QAAQ,kBAAA,EAAsB,CAAE,OAAO,KAAA,EAAO,IAAI,EAAE,OAAA,EAAQ;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,MAAA,CAAgB,KAAA,EAAe,IAAA,EAA2B,KAAA,EAA4B;AAC1F,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,kBAAA,EAAsB,CAAE,MAAA,CAAO,KAAA,EAAO,IAAI,CAAA,CAAE,KAAA,CAAM,KAAK,CAAA,CAAE,OAAA,EAAQ;AAAA,EACvF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,MAAA,CAAgB,KAAA,EAAe,KAAA,EAA4B;AAC/D,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,kBAAA,EAAsB,CAAE,MAAA,CAAO,KAAK,CAAA,CAAE,KAAA,CAAM,KAAK,CAAA,CAAE,OAAA,EAAQ;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,MAAM,WAAA,GAAc;AAClB,IAAA,OAAO,IAAA,CAAK,QAAQ,gBAAA,EAAiB;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,GAA4B;AAChC,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,CAAK,QAAQ,UAAA,EAAW;AAG9B,IAAA,IAAI,IAAA,CAAK,mBAAmB,aAAA,EAAe;AACzC,MAAA,MAAM,YAAA,GAAgB,KAAK,OAAA,CAAgB,KAAA;AAC3C,MAAA,MAAM,aAAa,UAAA,EAAW;AAAA,IAChC;AAEA,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAA8B;AAC5B,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,GAAyB;AAC7B,IAAA,OAAO,IAAA,CAAK,QAAQ,IAAA,EAAK;AAAA,EAC3B;AACF;;;AClVO,IAAMgB,SAAAA,GAAN,MAAM,SAAA,CAAS;AAAA,EACZ,OAAA;AAAA,EACS,MAAA;AAAA,EACT,QAAA;AAAA,EACA,aAAA;AAAA,EAER,YAAY,MAAA,EAAwB;AAClC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,KAAA,CAAM,UAAA,EAA8B,OAAA,EAAyB;AAClE,IAAA,OAAO,IAAI,SAAA,CAAS;AAAA,MAClB,IAAA,EAAM,OAAA;AAAA,MACN,UAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBA,aAAa,WAAA,CACX,UAAA,EACA,OAAA,EACA,cAAc,IAAA,EACK;AACnB,IAAA,MAAM,EAAA,GAAK,SAAA,CAAS,KAAA,CAAM,UAAA,EAAY,OAAO,CAAA;AAC7C,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,GAAG,OAAA,EAAQ;AAAA,IACnB;AACA,IAAA,OAAO,EAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,UAAA,CAAW,UAAA,EAA8B,OAAA,EAAyB;AACvE,IAAA,OAAO,IAAI,SAAA,CAAS;AAAA,MAClB,IAAA,EAAM,YAAA;AAAA,MACN,UAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBA,aAAa,gBAAA,CACX,UAAA,EACA,OAAA,EACA,cAAc,IAAA,EACK;AACnB,IAAA,MAAM,EAAA,GAAK,SAAA,CAAS,UAAA,CAAW,UAAA,EAAY,OAAO,CAAA;AAClD,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,GAAG,OAAA,EAAQ;AAAA,IACnB;AACA,IAAA,OAAO,EAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,KAAA,CAAM,UAAA,EAA+B,OAAA,EAAyB;AACnE,IAAA,OAAO,IAAI,SAAA,CAAS;AAAA,MAClB,IAAA,EAAM,OAAA;AAAA,MACN,YAAY,UAAA,IAAc,EAAE,IAAA,EAAM,WAAA,EAAa,MAAM,IAAA,EAAK;AAAA,MAC1D;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,aAAa,WAAA,CACX,UAAA,EACA,OAAA,EACA,cAAc,IAAA,EACK;AACnB,IAAA,MAAM,EAAA,GAAK,SAAA,CAAS,KAAA,CAAM,UAAA,EAAY,OAAO,CAAA;AAC7C,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,GAAG,OAAA,EAAQ;AAAA,IACnB;AACA,IAAA,OAAO,EAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBA,aAAa,MAAA,CAAO,MAAA,EAAwB,WAAA,GAAc,IAAA,EAAyB;AACjF,IAAA,MAAM,EAAA,GAAK,IAAI,SAAA,CAAS,MAAM,CAAA;AAC9B,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,GAAG,OAAA,EAAQ;AAAA,IACnB;AACA,IAAA,OAAO,EAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,GAAyB;AAE7B,IAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,WAAA,EAAY;AAC7C,IAAA,IAAA,CAAK,OAAA,GAAU,aAAA;AACf,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,OAAO,UAAU,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,WAAA,GAAwC;AACpD,IAAA,MAAM,MAAA,GAAS,KAAK,MAAA,CAAO,IAAA;AAG3B,IAAA,QAAQ,MAAA;AAAQ,MACd,KAAK,OAAA,EAAS;AACZ,QAAA,OAAO,KAAK,gBAAA,EAAiB;AAAA,MAC/B;AAAA,MAEA,KAAK,YAAA;AAAA,MACL,KAAK,UAAA,EAAY;AACf,QAAA,OAAO,KAAK,qBAAA,EAAsB;AAAA,MACpC;AAAA,MAEA,KAAK,OAAA,EAAS;AACZ,QAAA,OAAO,KAAK,gBAAA,EAAiB;AAAA,MAC/B;AAAA,MAEA,SAAS;AACP,QAAA,MAAM,IAAI,aAAA,CAAc,CAAA,2BAAA,EAA8B,MAAM,CAAA,CAAE,CAAA;AAAA,MAChE;AAAA;AACF,EACF;AAAA,EAEA,MAAc,gBAAA,GAA6C;AACzD,IAAA,IAAI;AACF,MAAA,IAAI,WAAA;AAGJ,MAAA,IAAI;AACF,QAAA,WAAA,GAAc,MAAO,OAAO,kBAAkB,CAAA;AAAA,MAChD,CAAA,CAAA,MAAQ;AAEN,QAAA,WAAA,GAAc,UAAQ,kBAAkB,CAAA;AAAA,MAC1C;AAEA,MAAA,MAAM,YAAA,GAAe,WAAA,CAAY,YAAA,IAAgB,WAAA,CAAY,OAAA,EAAS,YAAA;AACtE,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,MAAM,IAAI,MAAM,kCAAkC,CAAA;AAAA,MACpD;AAEA,MAAA,MAAM,UAAU,IAAI,YAAA;AAAA,QAClB,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,MAAA,GACjB;AAAA,UACE,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ;AAAA,YAE9B;AAAC,OACP;AACA,MAAA,OAAO,OAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,IAAI,cAAc,gEAAgE,CAAA;AAAA,IAC1F;AAAA,EACF;AAAA,EAEA,MAAc,gBAAA,GAA6C;AACzD,IAAA,IAAI;AACF,MAAA,IAAI,WAAA;AAGJ,MAAA,IAAI;AACF,QAAA,WAAA,GAAc,MAAO,OAAO,kBAAkB,CAAA;AAAA,MAChD,CAAA,CAAA,MAAQ;AAEN,QAAA,WAAA,GAAc,UAAQ,kBAAkB,CAAA;AAAA,MAC1C;AAEA,MAAA,MAAM,YAAA,GAAe,WAAA,CAAY,YAAA,IAAgB,WAAA,CAAY,OAAA,EAAS,YAAA;AACtE,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,MAAM,IAAI,MAAM,kCAAkC,CAAA;AAAA,MACpD;AAEA,MAAA,MAAM,UAAU,IAAI,YAAA;AAAA,QAClB,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,MAAA,GACjB;AAAA,UACE,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ;AAAA,YAE9B;AAAC,OACP;AACA,MAAA,OAAO,OAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,IAAI,cAAc,gEAAgE,CAAA;AAAA,IAC1F;AAAA,EACF;AAAA,EAEA,MAAc,qBAAA,GAAkD;AAC9D,IAAA,IAAI;AACF,MAAA,IAAI,QAAA;AAGJ,MAAA,IAAI;AACF,QAAA,QAAA,GAAW,MAAO,OAAO,uBAAuB,CAAA;AAAA,MAClD,CAAA,CAAA,MAAQ;AAEN,QAAA,QAAA,GAAW,UAAQ,uBAAuB,CAAA;AAAA,MAC5C;AAEA,MAAA,MAAM,iBAAA,GAAoB,QAAA,CAAS,iBAAA,IAAqB,QAAA,CAAS,OAAA,EAAS,iBAAA;AAC1E,MAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,QAAA,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAAA,MACzD;AAEA,MAAA,MAAM,UAAU,IAAI,iBAAA;AAAA,QAClB,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,MAAA,GACjB;AAAA,UACE,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ;AAAA,YAE9B;AAAC,OACP;AACA,MAAA,OAAO,OAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,IAAI,aAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,GAA4B;AAChC,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,MAAM,IAAA,CAAK,QAAQ,UAAA,EAAW;AAAA,IAChC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,CAAehB,IAAAA,EAAa,MAAA,EAAwD;AACxF,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAS,KAAA,CAAMA,IAAAA,EAAK,MAAM,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CAAQA,IAAAA,EAAa,MAAA,EAA8B;AACvD,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAS,OAAA,CAAQA,IAAAA,EAAK,MAAM,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAe,SAAA,EAAoC;AACjD,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,OAAA,CAAS,kBAAA,EAAsB;AAC/C,IAAA,OAAO,IAAA,CAAK,qBAAA,CAAsB,EAAA,EAAI,SAAS,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAA,CAAyB,IAAS,SAAA,EAAoC;AAE5E,IAAA,IAAI,OAAO,EAAA,CAAG,KAAA,KAAU,UAAA,EAAY;AAClC,MAAA,OAAO,EAAA,CAAG,MAAM,SAAS,CAAA;AAAA,IAC3B;AACA,IAAA,IAAI,OAAO,EAAA,CAAG,IAAA,KAAS,UAAA,EAAY;AACjC,MAAA,OAAO,EAAA,CAAG,KAAK,SAAS,CAAA;AAAA,IAC1B;AAEA,IAAA,IAAI,QAAA,IAAY,EAAA,IAAM,WAAA,IAAe,EAAA,EAAI;AACvC,MAAA,EAAA,CAAG,MAAA,GAAS,SAAA;AACZ,MAAA,EAAA,CAAG,SAAA,GAAY,SAAA;AACf,MAAA,OAAO,EAAA;AAAA,IACT;AACA,IAAA,MAAM,IAAI,cAAc,gDAAgD,CAAA;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA,EAKA,KAAc,SAAA,EAAoC;AAChD,IAAA,OAAO,IAAA,CAAK,MAAS,SAAS,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAe,QAAA,EAAgD;AACnE,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAS,gBAAA,EAAiB;AAEjD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,GAAG,CAAA;AACjC,MAAA,MAAM,IAAI,MAAA,EAAO;AACjB,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,QAAA,EAAS;AACnB,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CAAQA,IAAAA,EAAa,OAAA,EAA6B;AACtD,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAS,OAAA,CAAQA,IAAAA,EAAK,OAAO,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAA,GAAwB;AAC9B,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,MAAM,IAAI,cAAc,sCAAsC,CAAA;AAAA,IAChE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAA0C;AACxC,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAA,GAAyB;AACvB,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,MAAA,MAAM,MAAA,GAAS,KAAK,MAAA,CAAO,IAAA;AAG3B,MAAA,QAAQ,MAAA;AAAQ,QACd,KAAK,OAAA,EAAS;AACZ,UAAA,IAAA,CAAK,QAAA,GAAW,IAAI,YAAA,EAAa;AACjC,UAAA;AAAA,QACF;AAAA,QACA,KAAK,YAAA;AAAA,QACL,KAAK,UAAA,EAAY;AACf,UAAA,IAAA,CAAK,QAAA,GAAW,IAAI,iBAAA,EAAkB;AACtC,UAAA;AAAA,QACF;AAAA,QACA,KAAK,OAAA,EAAS;AACZ,UAAA,MAAM,IAAI,cAAc,qCAAqC,CAAA;AAAA,QAC/D;AAAA,QACA,SAAS;AACP,UAAA,MAAM,IAAI,aAAA,CAAc,CAAA,uCAAA,EAA0C,MAAM,CAAA,CAAE,CAAA;AAAA,QAC5E;AAAA;AACF,IACF;AACA,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoCA,EAAA,GAA0B;AACxB,IAAA,IAAA,CAAK,eAAA,EAAgB;AAErB,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACvB,MAAA,MAAM,OAAA,GAAU,KAAK,UAAA,EAAW;AAChC,MAAA,MAAM,UAAU,IAAA,CAAK,OAAA;AAGrB,MAAA,MAAM,QAAA,GAA0B;AAAA,QAC9B,MAAM,KAAA,CAAmBA,IAAAA,EAAa,MAAA,EAA6C;AACjF,UAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,KAAA,CAASA,MAAK,MAAa,CAAA;AACxD,UAAA,OAAO;AAAA,YACL,MAAM,MAAA,CAAO,IAAA;AAAA,YACb,QAAA,EAAU,OAAO,IAAA,CAAK,MAAA;AAAA,YACtB,QAAQ,MAAA,CAAO;AAAA,WACjB;AAAA,QACF,CAAA;AAAA,QACA,MAAM,OAAA,CAAQA,IAAAA,EAAa,MAAA,EAA4C;AACrE,UAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,OAAA,CAAQA,MAAK,MAAa,CAAA;AACvD,UAAA,OAAO;AAAA,YACL,YAAA,EAAc,OAAO,YAAA,IAAgB,CAAA;AAAA,YACrC,UAAU,MAAA,CAAO,QAAA;AAAA,YACjB,aAAc,MAAA,CAAe;AAAA,WAC/B;AAAA,QACF;AAAA,OACF;AAEA,MAAA,IAAA,CAAK,gBAAgB,yBAAA,CAA0B;AAAA,QAC7C,OAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,GAAqD;AACnD,IAAA,OAAO,KAAK,MAAA,CAAO,IAAA;AAAA,EACrB;AACF;ACneO,IAAM,iBAAN,MAAyE;AAAA,EAK9E,WAAA,CACmBA,IAAAA,EACA,MAAA,EACA,QAAA,EAKjB,WAAA,EACA;AARiB,IAAA,IAAA,CAAA,GAAA,GAAAA,IAAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAQjB,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,IAAA,CAAK,WAAA,GAAc,EAAE,OAAA,EAAS,IAAA,EAAK;AAAA,IACrC;AAAA,EACF;AAAA,EAlBQ,QAAA,GAAW,KAAA;AAAA,EACX,WAAA,GAAuC,IAAA;AAAA,EACvC,MAAA,GAAgC,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoCxC,WAAW,OAAA,EAA4C;AACrD,IAAA,IAAI,YAAY,KAAA,EAAO;AACrB,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,IACrB,CAAA,MAAA,IAAW,OAAA,KAAY,IAAA,IAAQ,OAAA,KAAY,MAAA,EAAW;AACpD,MAAA,IAAA,CAAK,WAAA,GAAc,EAAE,OAAA,EAAS,IAAA,EAAK;AAAA,IACrC,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,WAAA,GAAc,EAAE,OAAA,EAAS,IAAA,EAAM,GAAG,OAAA,EAAQ;AAAA,IACjD;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,EAA4C;AAChD,IAAA,OAAO,IAAA,CAAK,WAAW,OAAO,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,GAAmC;AACvC,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,MAAA,IAAA,CAAK,MAAA,GAAS,MAAM,IAAA,CAAK,QAAA,CAAS,KAAK,GAAA,EAAK,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,WAAW,CAAA;AACzE,MAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,IAClB;AACA,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,CACE,aACA,UAAA,EACkC;AAClC,IAAA,OAAO,IAAA,CAAK,OAAA,EAAQ,CAAE,IAAA,CAAK,aAAa,UAAU,CAAA;AAAA,EACpD;AACF;AAKO,IAAM,cAAA,GAAN,MAAM,eAAA,SAAuBM,YAAAA,CAAa;AAAA,EACvC,OAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACS,MAAA;AAAA,EAEjB,YAAY,MAAA,EAA8B;AACxC,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,iBAAA,CAAkB;AAAA,MACxC,SAAA,EAAW,MAAA,CAAO,KAAA,EAAO,SAAA,IAAa;AAAA,KACvC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,MACL,MAAA,EAOgB;AAChB,IAAA,OAAO,IAAI,eAAA,CAAe,EAAE,GAAG,MAAA,EAAQ,IAAA,EAAM,SAAS,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,WACL,MAAA,EAOgB;AAChB,IAAA,OAAO,IAAI,eAAA,CAAe,EAAE,GAAG,MAAA,EAAQ,IAAA,EAAM,cAAc,CAAA;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,SAAS,MAAA,EAA4D;AAC1E,IAAA,OAAO,eAAA,CAAe,WAAW,MAAM,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBA,IAAI,MAAA,GASF;AACA,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,MAAA,MAAM,IAAI,cAAc,2DAA2D,CAAA;AAAA,IACrF;AAEA,IAAA,OAAO;AAAA,MACL,YAAY,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,IAAA,CAAK,KAAK,QAAQ,CAAA;AAAA,MACvD,OAAO,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,IAAA,CAAK,KAAK,QAAQ,CAAA;AAAA,MAC7C,MAAA,EAAQ,CAAC,OAAA,KACP,IAAA,CAAK,QAAA,CAAU,MAAA;AAAA,QAAO,OAAA;AAAA,QAAS,CAACN,IAAAA,EAAK,MAAA,KACnC,KAAK,OAAA,CAAS,KAAA,CAAMA,MAAK,MAAqB;AAAA,OAChD;AAAA,MACF,KAAA,EAAO,MAAM,IAAA,CAAK,QAAA,CAAU,QAAA,EAAS;AAAA,MACrC,UAAA,EAAY,MAAM,IAAA,CAAK,QAAA,CAAU,UAAA,EAAW;AAAA,MAC5C,GAAA,EAAK,MAAM,IAAA,CAAK;AAAA,KAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,cAAA,GAA0B;AAC5B,IAAA,OAAO,CAAC,CAAC,IAAA,CAAK,QAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,OAAA,GAAyB;AAE7B,IAAA,IAAA,CAAK,OAAA,GAAU,MAAM,IAAA,CAAK,WAAA,EAAY;AACtC,IAAA,MAAM,IAAA,CAAK,QAAQ,OAAA,CAAQ;AAAA,MACzB,IAAA,EAAM,KAAK,MAAA,CAAO,IAAA;AAAA,MAClB,IAAA,EAAM,KAAK,MAAA,CAAO,IAAA;AAAA,MAClB,IAAA,EAAM,KAAK,MAAA,CAAO,IAAA;AAAA,MAClB,QAAA,EAAU,KAAK,MAAA,CAAO,QAAA;AAAA,MACtB,QAAA,EAAU,KAAK,MAAA,CAAO,QAAA;AAAA,MACtB,gBAAA,EAAkB,KAAK,MAAA,CAAO,gBAAA;AAAA,MAC9B,IAAA,EAAM,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS;AAAA,KAC5B,CAAA;AAGD,IAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACrB,MAAA,MAAM,KAAK,UAAA,EAAW;AAAA,IACxB;AAEA,IAAA,IAAA,CAAK,KAAK,SAAS,CAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,GAA4B;AAChC,IAAA,IAAI,KAAK,YAAA,IAAgB,OAAO,IAAA,CAAK,YAAA,CAAa,eAAe,UAAA,EAAY;AAC3E,MAAA,MAAM,IAAA,CAAK,aAAa,UAAA,EAAW;AAAA,IACrC;AACA,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,MAAM,IAAA,CAAK,QAAQ,UAAA,EAAW;AAAA,IAChC;AACA,IAAA,IAAA,CAAK,KAAK,YAAY,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2BA,KAAA,CAAmBA,MAAa,MAAA,EAAyC;AACvE,IAAA,IAAA,CAAK,eAAA,EAAgB;AAErB,IAAA,MAAM,QAAA,GAAW,OACf,CAAA,EACA,CAAA,EACA,WAAA,KAC4B;AAE5B,MAAA,IAAI,CAAC,WAAA,IAAe,CAAC,IAAA,CAAK,QAAA,EAAU;AAClC,QAAA,OAAO,IAAA,CAAK,OAAA,CAAS,KAAA,CAAS,CAAA,EAAG,CAAC,CAAA;AAAA,MACpC;AAGA,MAAA,MAAM,MAAM,WAAA,CAAY,GAAA,IAAO,KAAK,QAAA,CAAS,WAAA,CAAY,GAAG,CAAc,CAAA;AAG1E,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,QAAA,CAAS,IAAoB,GAAG,CAAA;AAC1D,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,IAAA,CAAK,KAAK,UAAA,EAAY,EAAE,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA;AACrC,QAAA,OAAO,MAAA;AAAA,MACT;AAGA,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,OAAA,CAAS,KAAA,CAAS,GAAG,CAAC,CAAA;AAChD,MAAA,IAAA,CAAK,KAAK,WAAA,EAAa,EAAE,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA;AAGtC,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,CAAC,CAAA;AACnC,MAAA,MAAM,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ;AAAA,QACnC,KAAK,WAAA,CAAY,GAAA,IAAO,IAAA,CAAK,MAAA,CAAO,OAAO,GAAA,IAAO,IAAA;AAAA,QAClD,MAAM,WAAA,CAAY,IAAA;AAAA,QAClB;AAAA,OACD,CAAA;AAED,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAEA,IAAA,OAAO,IAAI,eAAkBA,IAAAA,EAAK,MAAA,EAAQ,UAAU,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,MAAA,IAAU,KAAK,CAAA;AAAA,EACxF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAA,CAAqBA,IAAAA,EAAa,MAAA,EAA+C;AACrF,IAAA,IAAA,CAAK,eAAA,EAAgB;AAErB,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,OAAA,CAAS,KAAA,CAASA,MAAK,MAAM,CAAA;AAGvD,IAAA,IAAI,KAAK,QAAA,IAAY,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,mBAAmB,KAAA,EAAO;AAChE,MAAA,MAAM,OAAA,GAAUA,KAAI,IAAA,EAAK,CAAE,MAAM,KAAK,CAAA,CAAE,CAAC,CAAA,EAAG,WAAA,EAAY;AACxD,MAAA,MAAM,mBAAmB,CAAC,QAAA,EAAU,UAAU,QAAA,EAAU,UAAA,EAAY,QAAQ,OAAO,CAAA;AAEnF,MAAA,IAAI,OAAA,IAAW,gBAAA,CAAiB,QAAA,CAAS,OAAO,CAAA,EAAG;AACjD,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAcA,IAAG,CAAA;AACrC,QAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,UAAA,MAAM,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,EAAE,QAAQ,CAAA;AACvC,UAAA,IAAA,CAAK,IAAA,CAAK,kBAAA,EAAoB,EAAE,MAAA,EAAQ,SAAS,CAAA;AAAA,QACnD;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAmB,SAAA,EAAoC;AACrD,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,OAAA,CAAS,kBAAA,EAAsB;AAC/C,IAAA,OAAO,IAAA,CAAK,qBAAA,CAAsB,EAAA,EAAI,SAAS,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,KAAkB,SAAA,EAAoC;AACpD,IAAA,OAAO,IAAA,CAAK,MAAS,SAAS,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,WAAA,CACJ,QAAA,EACA,OAAA,EACY;AACZ,IAAA,IAAA,CAAK,eAAA,EAAgB;AAErB,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAS,iBAAiB,OAAO,CAAA;AAExD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,GAAG,CAAA;AACjC,MAAA,MAAM,IAAI,MAAA,EAAO;AAGjB,MAAA,IAAI,KAAK,QAAA,EAAU;AACjB,QAAA,MAAM,IAAA,CAAK,OAAO,KAAA,EAAM;AAAA,MAC1B;AAEA,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,QAAA,EAAS;AACnB,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,UAAA,GAA0C;AACxC,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,GAA4C;AAC1C,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,GAAyB;AAC7B,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,OAAO,IAAA,CAAK,QAAS,IAAA,EAAK;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,WAAA,GAAuB;AACzB,IAAA,OAAO,CAAC,CAAC,IAAA,CAAK,OAAA,EAAS,WAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,UAAA,GAA4B;AACxC,IAAA,MAAM,WAAA,GAAc,KAAK,MAAA,CAAO,KAAA;AAGhC,IAAA,IAAI,OAAO,WAAA,CAAY,KAAA,KAAU,QAAA,EAAU;AACzC,MAAA,IAAA,CAAK,YAAA,GAAe,MAAM,IAAA,CAAK,gBAAA,EAAiB;AAChD,MAAA,IAAI,OAAO,IAAA,CAAK,YAAA,CAAa,OAAA,KAAY,UAAA,EAAY;AACnD,QAAA,MAAM,IAAA,CAAK,aAAa,OAAA,CAAQ;AAAA,UAC9B,kBAAkB,WAAA,CAAY;AAAA,SAC/B,CAAA;AAAA,MACH;AAAA,IACF,CAAA,MAAA,IAAW,YAAY,KAAA,EAAO;AAC5B,MAAA,IAAA,CAAK,eAAe,WAAA,CAAY,KAAA;AAAA,IAClC;AAEA,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,MAAM,IAAI,cAAc,uCAAuC,CAAA;AAAA,IACjE;AAGA,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,QAAA,CAAS;AAAA,MAC3B,SAAS,IAAA,CAAK,YAAA;AAAA,MACd,SAAA,EAAW,YAAY,SAAA,IAAa,WAAA;AAAA,MACpC,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,MAAA;AAAA,MAC7B,OAAO,WAAA,CAAY,KAAA;AAAA,MACnB,QAAQ,WAAA,CAAY,MAAA;AAAA,MACpB,SAAS,WAAA,CAAY;AAAA,KACtB,CAAA;AAGD,IAAA,IAAI,WAAA,CAAY,MAAA,IAAU,WAAA,CAAY,MAAA,CAAO,SAAS,CAAA,EAAG;AACvD,MAAA,MAAM,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,WAAA,CAAY,MAAM,CAAA;AAAA,IAC7C;AAAA,EACF;AAAA,EAEA,MAAc,WAAA,GAAwC;AACpD,IAAA,QAAQ,IAAA,CAAK,OAAO,IAAA;AAAM,MACxB,KAAK,OAAA,EAAS;AACZ,QAAA,OAAO,KAAK,gBAAA,EAAiB;AAAA,MAC/B;AAAA,MACA,KAAK,YAAA;AAAA,MACL,KAAK,UAAA,EAAY;AACf,QAAA,OAAO,KAAK,qBAAA,EAAsB;AAAA,MACpC;AAAA,MACA,SAAS;AACP,QAAA,MAAM,IAAI,aAAA,CAAc,CAAA,2BAAA,EAA8B,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AAAA,MAC1E;AAAA;AACF,EACF;AAAA,EAEA,MAAc,gBAAA,GAA6C;AACzD,IAAA,IAAI;AACF,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI;AACF,QAAA,MAAA,GAAS,MAAM,OAAO,kBAAkB,CAAA;AAAA,MAC1C,CAAA,CAAA,MAAQ;AACN,QAAA,MAAA,GAAS,UAAQ,kBAAkB,CAAA;AAAA,MACrC;AACA,MAAA,MAAM,YAAA,GAAe,MAAA,CAAO,YAAA,IAAgB,MAAA,CAAO,OAAA,EAAS,YAAA;AAC5D,MAAA,OAAO,IAAI,YAAA;AAAA,QACT,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,MAAA,GAAS,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,MAAA,EAAO,GAAI;AAAC,OAC1E;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,IAAI,cAAc,gEAAgE,CAAA;AAAA,IAC1F;AAAA,EACF;AAAA,EAEA,MAAc,qBAAA,GAAkD;AAC9D,IAAA,IAAI;AACF,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI;AACF,QAAA,MAAA,GAAS,MAAM,OAAO,uBAAuB,CAAA;AAAA,MAC/C,CAAA,CAAA,MAAQ;AACN,QAAA,MAAA,GAAS,UAAQ,uBAAuB,CAAA;AAAA,MAC1C;AACA,MAAA,MAAM,iBAAA,GAAoB,MAAA,CAAO,iBAAA,IAAqB,MAAA,CAAO,OAAA,EAAS,iBAAA;AACtE,MAAA,OAAO,IAAI,iBAAA;AAAA,QACT,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,MAAA,GAAS,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,MAAA,EAAO,GAAI;AAAC,OAC1E;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,IAAI,aAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,gBAAA,GAAqD;AACjE,IAAA,IAAI;AACF,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI;AACF,QAAA,MAAA,GAAS,MAAM,OAAO,kBAAkB,CAAA;AAAA,MAC1C,CAAA,CAAA,MAAQ;AACN,QAAA,MAAA,GAAS,UAAQ,kBAAkB,CAAA;AAAA,MACrC;AACA,MAAA,MAAM,YAAA,GAAe,MAAA,CAAO,YAAA,IAAgB,MAAA,CAAO,OAAA,EAAS,YAAA;AAC5D,MAAA,OAAO,IAAI,YAAA,EAAa;AAAA,IAC1B,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,IAAI,cAAc,gEAAgE,CAAA;AAAA,IAC1F;AAAA,EACF;AAAA,EAEQ,qBAAA,CAAyB,IAAS,SAAA,EAAoC;AAC5E,IAAA,IAAI,OAAO,EAAA,CAAG,KAAA,KAAU,UAAA,EAAY;AAClC,MAAA,OAAO,EAAA,CAAG,MAAM,SAAS,CAAA;AAAA,IAC3B;AACA,IAAA,IAAI,OAAO,EAAA,CAAG,IAAA,KAAS,UAAA,EAAY;AACjC,MAAA,OAAO,EAAA,CAAG,KAAK,SAAS,CAAA;AAAA,IAC1B;AACA,IAAA,IAAI,QAAA,IAAY,EAAA,IAAM,WAAA,IAAe,EAAA,EAAI;AACvC,MAAA,EAAA,CAAG,MAAA,GAAS,SAAA;AACZ,MAAA,EAAA,CAAG,SAAA,GAAY,SAAA;AACf,MAAA,OAAO,EAAA;AAAA,IACT;AACA,IAAA,MAAM,IAAI,cAAc,gDAAgD,CAAA;AAAA,EAC1E;AAAA,EAEQ,eAAA,GAAwB;AAC9B,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,MAAM,IAAI,cAAc,sCAAsC,CAAA;AAAA,IAChE;AAAA,EACF;AAAA,EAEQ,cAAcA,IAAAA,EAAuB;AAC3C,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,MAAM,QAAA,GAAW;AAAA,MACf,4BAAA;AAAA,MACA,4BAAA;AAAA,MACA,4BAAA;AAAA,MACA,8BAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,IAAI,KAAA;AACJ,MAAA,OAAA,CAAQ,KAAA,GAAQ,OAAA,CAAQ,IAAA,CAAKA,IAAG,OAAO,IAAA,EAAM;AAC3C,QAAA,IAAI,KAAA,CAAM,CAAC,CAAA,EAAG;AACZ,UAAA,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAE,aAAa,CAAA;AAAA,QACpC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,CAAC,GAAG,IAAI,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,EAC5B;AACF;;;AC5mBA,IAAM,gBAAA,uBAAuB,GAAA,EAAkC;AAKxD,SAAS,sBAAA,CAAuB,MAAoB,OAAA,EAA+B;AACxF,EAAA,gBAAA,CAAiB,GAAA,CAAI,MAAM,OAAO,CAAA;AACpC;AAKO,SAAS,cAAc,MAAA,EAAyC;AACrE,EAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA;AAEhD,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,aAAA;AAAA,MACR,CAAA,wCAAA,EAA2C,OAAO,IAAI,CAAA,gDAAA;AAAA,KAExD;AAAA,EACF;AAEA,EAAA,OAAO,OAAA,CAAQ,cAAc,MAAM,CAAA;AACrC;AAKO,IAAMgB,SAAAA,GAAN,MAAM,SAAA,CAAS;AAAA,EACZ,OAAA;AAAA,EACS,MAAA;AAAA,EAEjB,YAAY,MAAA,EAAwB;AAClC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA,EAEA,OAAO,KAAA,CAAM,UAAA,EAA8B,OAAA,EAAyB;AAClE,IAAA,OAAO,IAAI,SAAA,CAAS;AAAA,MAClB,IAAA,EAAM,OAAA;AAAA,MACN,UAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAAA,EAEA,OAAO,UAAA,CAAW,UAAA,EAA8B,OAAA,EAAyB;AACvE,IAAA,OAAO,IAAI,SAAA,CAAS;AAAA,MAClB,IAAA,EAAM,YAAA;AAAA,MACN,UAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAA,CAAK,OAAA,GAAU,aAAA,CAAc,IAAA,CAAK,MAAM,CAAA;AACxC,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,OAAO,UAAU,CAAA;AAAA,EACnD;AAAA,EAEA,MAAM,UAAA,GAA4B;AAChC,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,MAAM,IAAA,CAAK,QAAQ,UAAA,EAAW;AAAA,IAChC;AAAA,EACF;AAAA,EAEA,MAAM,KAAA,CAAehB,IAAAA,EAAa,MAAA,EAAwD;AACxF,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAS,KAAA,CAAMA,IAAAA,EAAK,MAAM,CAAA;AAAA,EACxC;AAAA,EAEA,MAAM,OAAA,CAAQA,IAAAA,EAAa,MAAA,EAA8B;AACvD,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAS,OAAA,CAAQA,IAAAA,EAAK,MAAM,CAAA;AAAA,EAC1C;AAAA,EAEA,MAAe,SAAA,EAA2D;AACxE,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,OAAA,CAAS,kBAAA,EAAsB;AAC/C,IAAA,OAAO,IAAA,CAAK,qBAAA,CAAsB,EAAA,EAAI,SAAS,CAAA;AAAA,EACjD;AAAA,EAEQ,qBAAA,CACN,IACA,SAAA,EACwC;AACxC,IAAA,IAAI,OAAO,EAAA,CAAG,KAAA,KAAU,UAAA,EAAY;AAClC,MAAA,OAAO,EAAA,CAAG,MAAM,SAAS,CAAA;AAAA,IAC3B;AACA,IAAA,IAAI,OAAO,EAAA,CAAG,IAAA,KAAS,UAAA,EAAY;AACjC,MAAA,OAAO,EAAA,CAAG,KAAK,SAAS,CAAA;AAAA,IAC1B;AACA,IAAA,IAAI,QAAA,IAAY,EAAA,IAAM,WAAA,IAAe,EAAA,EAAI;AACvC,MAAA,EAAA,CAAG,MAAA,GAAS,SAAA;AACZ,MAAA,EAAA,CAAG,SAAA,GAAY,SAAA;AACf,MAAA,OAAO,EAAA;AAAA,IACT;AACA,IAAA,MAAM,IAAI,cAAc,gDAAgD,CAAA;AAAA,EAC1E;AAAA,EAEA,KAAc,SAAA,EAA2D;AACvE,IAAA,OAAO,IAAA,CAAK,MAAS,SAAS,CAAA;AAAA,EAChC;AAAA,EAEA,MAAM,YAAe,QAAA,EAAgD;AACnE,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAS,gBAAA,EAAiB;AAEjD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,GAAG,CAAA;AACjC,MAAA,MAAM,IAAI,MAAA,EAAO;AACjB,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,QAAA,EAAS;AACnB,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,OAAA,CAAQA,IAAAA,EAAa,OAAA,EAA6B;AACtD,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAS,OAAA,CAAQA,IAAAA,EAAK,OAAO,CAAA;AAAA,EAC3C;AAAA,EAEQ,eAAA,GAAwB;AAC9B,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,MAAM,IAAI,cAAc,sCAAsC,CAAA;AAAA,IAChE;AAAA,EACF;AAAA,EAEA,UAAA,GAA0C;AACxC,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AACF","file":"index.js","sourcesContent":["/**\n * Strict Type Definitions\n *\n * Enhanced type definitions with:\n * - Discriminated unions for better type narrowing\n * - Strict generics for type-safe queries\n * - Branded types for runtime safety\n * - Utility types for common patterns\n */\n\n// ============ Branded Types ============\n\n/**\n * Branded type for SQL strings (prevents SQL injection at type level)\n */\ndeclare const __brand: unique symbol;\ntype Brand<T, B> = T & { [__brand]: B };\n\nexport type SafeSQL = Brand<string, 'SafeSQL'>;\nexport type TableName = Brand<string, 'TableName'>;\nexport type ColumnName = Brand<string, 'ColumnName'>;\n\n/**\n * Create a safe SQL string (should be used with parameterized queries)\n */\nexport function sql(strings: TemplateStringsArray, ..._values: unknown[]): SafeSQL {\n // This is a tagged template that marks SQL as safe\n // Values should be passed as parameters, not interpolated\n return strings.join('?') as SafeSQL;\n}\n\n// ============ Discriminated Union for Connection Config ============\n\n/**\n * Host-based connection configuration\n */\nexport interface HostConnectionConfig {\n type: 'host';\n host: string;\n port: number;\n database: string;\n user: string;\n password: string;\n ssl?: SSLConfig;\n pool?: StrictPoolConfig;\n}\n\n/**\n * Connection string based configuration\n */\nexport interface ConnectionStringConfig {\n type: 'connectionString';\n connectionString: string;\n ssl?: SSLConfig;\n pool?: StrictPoolConfig;\n}\n\n/**\n * Strict connection config - must be one or the other\n */\nexport type StrictConnectionConfig = HostConnectionConfig | ConnectionStringConfig;\n\n/**\n * SSL configuration options\n */\nexport interface SSLConfig {\n enabled: boolean;\n rejectUnauthorized?: boolean;\n ca?: string | Buffer;\n cert?: string | Buffer;\n key?: string | Buffer;\n}\n\n/**\n * Strict pool configuration with defaults\n */\nexport interface StrictPoolConfig {\n min: number;\n max: number;\n acquireTimeout: number;\n idleTimeout: number;\n validateOnBorrow?: boolean;\n maxLifetime?: number;\n}\n\n// ============ Discriminated Union for Query Results ============\n\n/**\n * Base query result\n */\ninterface BaseQueryResult {\n duration: number;\n command: SQLCommand;\n}\n\n/**\n * SELECT query result\n */\nexport interface SelectResult<T> extends BaseQueryResult {\n command: 'SELECT';\n rows: T[];\n rowCount: number;\n fields: StrictFieldInfo[];\n}\n\n/**\n * INSERT query result\n */\nexport interface InsertResult extends BaseQueryResult {\n command: 'INSERT';\n insertId: number | bigint;\n affectedRows: number;\n}\n\n/**\n * UPDATE query result\n */\nexport interface UpdateResult extends BaseQueryResult {\n command: 'UPDATE';\n affectedRows: number;\n changedRows: number;\n}\n\n/**\n * DELETE query result\n */\nexport interface DeleteResult extends BaseQueryResult {\n command: 'DELETE';\n affectedRows: number;\n}\n\n/**\n * Discriminated union of all query results\n */\nexport type StrictQueryResult<T = unknown> =\n | SelectResult<T>\n | InsertResult\n | UpdateResult\n | DeleteResult;\n\n/**\n * SQL command types\n */\nexport type SQLCommand =\n | 'SELECT'\n | 'INSERT'\n | 'UPDATE'\n | 'DELETE'\n | 'CREATE'\n | 'ALTER'\n | 'DROP'\n | 'TRUNCATE'\n | 'BEGIN'\n | 'COMMIT'\n | 'ROLLBACK';\n\n// ============ Strict Field Info ============\n\n/**\n * Known database field types\n */\nexport type FieldType =\n // String types\n | 'varchar'\n | 'char'\n | 'text'\n | 'mediumtext'\n | 'longtext'\n | 'enum'\n | 'set'\n // Numeric types\n | 'int'\n | 'tinyint'\n | 'smallint'\n | 'mediumint'\n | 'bigint'\n | 'decimal'\n | 'float'\n | 'double'\n | 'numeric'\n // Date/Time types\n | 'date'\n | 'datetime'\n | 'timestamp'\n | 'time'\n | 'year'\n // Binary types\n | 'blob'\n | 'binary'\n | 'varbinary'\n // Other types\n | 'json'\n | 'jsonb'\n | 'uuid'\n | 'boolean'\n | 'bool'\n // Fallback\n | 'unknown';\n\n/**\n * Strict field info with known types\n */\nexport interface StrictFieldInfo {\n name: string;\n type: FieldType;\n nullable: boolean;\n primaryKey: boolean;\n autoIncrement: boolean;\n defaultValue: unknown;\n maxLength?: number;\n precision?: number;\n scale?: number;\n}\n\n// ============ Type-Safe Query Builder Types ============\n\n/**\n * Operator types for WHERE clauses\n */\nexport type ComparisonOperator = '=' | '!=' | '<>' | '>' | '<' | '>=' | '<=';\nexport type LikeOperator = 'LIKE' | 'NOT LIKE' | 'ILIKE';\nexport type NullOperator = 'IS NULL' | 'IS NOT NULL';\nexport type InOperator = 'IN' | 'NOT IN';\nexport type BetweenOperator = 'BETWEEN' | 'NOT BETWEEN';\n\nexport type WhereOperator =\n | ComparisonOperator\n | LikeOperator\n | NullOperator\n | InOperator\n | BetweenOperator;\n\n/**\n * Join types\n */\nexport type JoinType = 'INNER' | 'LEFT' | 'RIGHT' | 'FULL' | 'CROSS';\n\n/**\n * Order direction\n */\nexport type OrderDirection = 'ASC' | 'DESC';\n\n/**\n * Aggregate functions\n */\nexport type AggregateFunction = 'COUNT' | 'SUM' | 'AVG' | 'MIN' | 'MAX';\n\n// ============ Type-Safe Table Schema ============\n\n/**\n * Define a table schema for type-safe queries\n */\nexport interface TableSchema<T extends Record<string, unknown>> {\n name: TableName;\n columns: {\n [K in keyof T]: ColumnDefinition<T[K]>;\n };\n primaryKey: keyof T;\n}\n\n/**\n * Column definition\n */\nexport interface ColumnDefinition<T> {\n type: FieldType;\n nullable: boolean;\n defaultValue?: T;\n autoIncrement?: boolean;\n}\n\n// ============ Utility Types ============\n\n/**\n * Extract row type from query result\n */\nexport type ExtractRow<T> = T extends SelectResult<infer R> ? R : never;\n\n/**\n * Make specific keys required\n */\nexport type RequireKeys<T, K extends keyof T> = T & Required<Pick<T, K>>;\n\n/**\n * Make specific keys optional\n */\nexport type OptionalKeys<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;\n\n/**\n * Type for insert data (omit auto-generated fields)\n */\nexport type InsertData<T, AutoFields extends keyof T = never> = Omit<T, AutoFields>;\n\n/**\n * Type for update data (all fields optional except the ID field)\n */\nexport type UpdateData<T, IdField extends keyof T> = Partial<Omit<T, IdField>> & Pick<T, IdField>;\n\n/**\n * Nullable version of a type\n */\nexport type Nullable<T> = T | null;\n\n/**\n * Deep partial - makes all nested properties optional\n */\nexport type DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\n/**\n * Deep required - makes all nested properties required\n */\nexport type DeepRequired<T> = {\n [P in keyof T]-?: T[P] extends object ? DeepRequired<T[P]> : T[P];\n};\n\n// ============ Type Guards ============\n\n/**\n * Type guard for SelectResult\n */\nexport function isSelectResult<T>(result: StrictQueryResult<T>): result is SelectResult<T> {\n return result.command === 'SELECT';\n}\n\n/**\n * Type guard for InsertResult\n */\nexport function isInsertResult(result: StrictQueryResult): result is InsertResult {\n return result.command === 'INSERT';\n}\n\n/**\n * Type guard for UpdateResult\n */\nexport function isUpdateResult(result: StrictQueryResult): result is UpdateResult {\n return result.command === 'UPDATE';\n}\n\n/**\n * Type guard for DeleteResult\n */\nexport function isDeleteResult(result: StrictQueryResult): result is DeleteResult {\n return result.command === 'DELETE';\n}\n\n// ============ Constants ============\n\n/**\n * Default pool configuration\n */\nexport const DEFAULT_POOL_CONFIG: StrictPoolConfig = {\n min: 2,\n max: 10,\n acquireTimeout: 30_000,\n idleTimeout: 60_000,\n validateOnBorrow: true,\n} as const;\n\n/**\n * Default timeouts (in milliseconds)\n */\nexport const DEFAULT_TIMEOUTS = {\n connection: 10_000,\n query: 30_000,\n transaction: 60_000,\n} as const;\n\n/**\n * Isolation levels as const\n */\nexport const ISOLATION_LEVELS = {\n READ_UNCOMMITTED: 'READ UNCOMMITTED',\n READ_COMMITTED: 'READ COMMITTED',\n REPEATABLE_READ: 'REPEATABLE READ',\n SERIALIZABLE: 'SERIALIZABLE',\n} as const;\n\nexport type StrictIsolationLevel = (typeof ISOLATION_LEVELS)[keyof typeof ISOLATION_LEVELS];\n","/**\n * Database connection configuration\n * @example\n * ```typescript\n * const config: ConnectionConfig = {\n * host: 'localhost',\n * port: 3306,\n * user: 'root',\n * password: 'password',\n * database: 'mydb',\n * pool: {\n * min: 2,\n * max: 100,\n * acquireTimeout: 30000,\n * idleTimeout: 60000\n * }\n * };\n * ```\n */\nexport interface ConnectionConfig {\n host?: string;\n port?: number;\n database?: string;\n user?: string;\n password?: string;\n connectionString?: string;\n ssl?: boolean | Record<string, unknown>;\n\n /** @deprecated Use pool.max instead */\n poolSize?: number;\n\n /** Pool configuration */\n pool?: PoolConfig;\n\n connectionTimeout?: number;\n idleTimeout?: number;\n maxRetries?: number;\n retryDelay?: number;\n readonly?: boolean;\n}\n\n/**\n * Connection pool configuration\n *\n * Production defaults (when not specified):\n * - max: 10 connections\n * - acquireTimeout: 30000ms (30 seconds)\n * - idleTimeout: 60000ms (60 seconds)\n * - queueLimit: 100 (prevent memory exhaustion)\n * - queryTimeout: 30000ms (30 seconds)\n */\nexport interface PoolConfig {\n /** Minimum number of connections in pool (default: 0) */\n min?: number;\n\n /** Maximum number of connections in pool (default: 10) */\n max?: number;\n\n /**\n * Maximum time to wait for a connection from pool (ms)\n * If exceeded, throws PoolExhaustedError\n * Default: 30000 (30 seconds)\n */\n acquireTimeout?: number;\n\n /**\n * Time before idle connection is closed (ms)\n * Default: 60000 (60 seconds)\n */\n idleTimeout?: number;\n\n /** Whether to validate connections before use (default: false) */\n validateOnBorrow?: boolean;\n\n /**\n * Maximum connection lifetime (ms)\n * Connection will be closed after this time\n * Default: 0 (no limit)\n */\n maxLifetime?: number;\n\n /**\n * Maximum waiting requests in queue\n * When queue is full, new requests immediately fail with PoolExhaustedError\n * Set to 0 for unlimited (NOT recommended for production!)\n * Default: 100\n */\n queueLimit?: number;\n\n /**\n * Maximum time for a query to execute (ms)\n * If exceeded, query is cancelled and throws QueryTimeoutError\n * Default: 30000 (30 seconds)\n */\n queryTimeout?: number;\n\n /** Enable keep-alive on TCP socket (default: true in production) */\n enableKeepAlive?: boolean;\n\n /** Keep-alive initial delay (ms) */\n keepAliveInitialDelay?: number;\n}\n\nexport interface QueryResult<T = unknown> {\n rows: T[];\n rowCount: number;\n affectedRows?: number;\n insertId?: number;\n fields?: FieldInfo[];\n command?: string;\n duration?: number;\n}\n\nexport interface FieldInfo {\n name: string;\n type: string;\n nullable: boolean;\n primaryKey?: boolean;\n autoIncrement?: boolean;\n defaultValue?: unknown;\n}\n\nexport interface TransactionOptions {\n isolationLevel?: IsolationLevel;\n readOnly?: boolean;\n deferrable?: boolean;\n}\n\nexport enum IsolationLevel {\n READ_UNCOMMITTED = 'READ UNCOMMITTED',\n READ_COMMITTED = 'READ COMMITTED',\n REPEATABLE_READ = 'REPEATABLE READ',\n SERIALIZABLE = 'SERIALIZABLE',\n}\n\nexport interface PreparedStatement<T = unknown> {\n execute(params?: unknown[]): Promise<QueryResult<T>>;\n release(): Promise<void>;\n close(): Promise<void>; // Alias for release() - industry standard naming\n}\n\nexport interface CacheOptions {\n ttl?: number;\n key?: string;\n invalidateOn?: string[];\n compress?: boolean;\n}\n\nexport interface QueryOptions {\n cache?: boolean | CacheOptions;\n timeout?: number;\n prepare?: boolean;\n transaction?: Transaction;\n}\n\nexport interface Transaction {\n id: string;\n isActive: boolean;\n commit(): Promise<void>;\n rollback(): Promise<void>;\n savepoint(name: string): Promise<void>;\n releaseSavepoint(name: string): Promise<void>;\n rollbackToSavepoint(name: string): Promise<void>;\n query<T = unknown>(\n sql: string,\n params?: QueryParams,\n options?: QueryOptions,\n ): Promise<QueryResult<T>>;\n execute<T = unknown>(\n sql: string,\n params?: QueryParams,\n options?: QueryOptions,\n ): Promise<QueryResult<T>>;\n}\n\nexport interface PoolStats {\n total: number;\n idle: number;\n waiting: number;\n active: number;\n}\n\nexport type QueryValue = string | number | boolean | Date | Buffer | null | undefined;\nexport type QueryParams = QueryValue[] | Record<string, QueryValue>;\n\nexport interface LogLevel {\n ERROR: 'error';\n WARN: 'warn';\n INFO: 'info';\n DEBUG: 'debug';\n}\n\nexport interface Logger {\n error(message: string, ...args: unknown[]): void;\n warn(message: string, ...args: unknown[]): void;\n info(message: string, ...args: unknown[]): void;\n debug(message: string, ...args: unknown[]): void;\n}\n\n// ============ Strict Types (Enhanced Type Safety) ============\nexport * from './strict-types';\n","/**\n * Constants\n *\n * Centralized configuration constants to eliminate magic numbers.\n * All timing values are in milliseconds unless otherwise noted.\n */\n\n// ============ Connection Defaults ============\n\nexport const CONNECTION_DEFAULTS = {\n /** Default MySQL port */\n MYSQL_PORT: 3306,\n /** Default PostgreSQL port */\n POSTGRESQL_PORT: 5432,\n /** Default Redis port */\n REDIS_PORT: 6379,\n /** Default MongoDB port */\n MONGODB_PORT: 27_017,\n /** Default connection timeout (10 seconds) */\n CONNECTION_TIMEOUT: 10_000,\n /** Default idle timeout (5 minutes) */\n IDLE_TIMEOUT: 300_000,\n /** Maximum port number */\n MAX_PORT: 65_535,\n /** Minimum port number */\n MIN_PORT: 1,\n} as const;\n\n// ============ Pool Defaults ============\n\n/**\n * Legacy pool defaults (CAPS format)\n * @deprecated Use POOL_DEFAULTS instead\n */\nexport const POOL_DEFAULTS_LEGACY = {\n /** Minimum connections in pool */\n MIN_CONNECTIONS: 2,\n /** Maximum connections in pool */\n MAX_CONNECTIONS: 10,\n /** Time to wait for a connection (30 seconds) */\n ACQUIRE_TIMEOUT: 30_000,\n /** Time before idle connection is closed (1 minute) */\n IDLE_TIMEOUT: 60_000,\n /** Maximum connection lifetime (30 minutes) */\n MAX_LIFETIME: 1_800_000,\n /** Queue limit (0 = unlimited) */\n QUEUE_LIMIT: 0,\n} as const;\n\n/**\n * Production-ready pool defaults\n * Matches PoolConfig interface for easy spreading\n *\n * @example\n * ```typescript\n * const poolConfig = {\n * ...POOL_DEFAULTS,\n * max: 20, // Override specific values\n * };\n * ```\n */\nexport const POOL_DEFAULTS = {\n /** Minimum connections in pool */\n min: 0,\n /** Maximum connections in pool */\n max: 10,\n /** Time to wait for connection from pool (30 seconds) */\n acquireTimeout: 30_000,\n /** Time before idle connection is closed (1 minute) */\n idleTimeout: 60_000,\n /**\n * Maximum waiting requests in queue\n * 100 = prevent memory exhaustion under load\n */\n queueLimit: 100,\n /** Query execution timeout (30 seconds) */\n queryTimeout: 30_000,\n} as const;\n\n// ============ Query Defaults ============\n\nexport const QUERY_DEFAULTS = {\n /** Default query timeout (30 seconds) */\n TIMEOUT: 30_000,\n /** Transaction timeout (1 minute) */\n TRANSACTION_TIMEOUT: 60_000,\n /** Slow query threshold (1 second) */\n SLOW_QUERY_THRESHOLD: 1000,\n /** Maximum traces to keep in memory */\n MAX_TRACES: 10_000,\n /** Very slow query threshold for analysis (2 seconds) */\n VERY_SLOW_QUERY_THRESHOLD: 2000,\n /** Slow transaction threshold (5 seconds) */\n SLOW_TRANSACTION_THRESHOLD: 5000,\n} as const;\n\n// ============ Cache Defaults ============\n\nexport const CACHE_DEFAULTS = {\n /** Default cache TTL (1 hour in seconds) */\n TTL_SECONDS: 3600,\n /** Default cache TTL (1 hour in milliseconds) */\n TTL_MS: 3_600_000,\n /** Short TTL for errors (1 minute in seconds) */\n ERROR_TTL_SECONDS: 60,\n /** Cache cleanup interval (1 minute) */\n CLEANUP_INTERVAL: 60_000,\n /** Maximum cache entry size (1MB) */\n MAX_ENTRY_SIZE: 1024 * 1024,\n /** Compression threshold (1KB) */\n COMPRESSION_THRESHOLD: 1024,\n /** Maximum latencies to track for cache statistics */\n MAX_LATENCIES: 1000,\n} as const;\n\n// ============ Retry Defaults ============\n\nexport const RETRY_DEFAULTS = {\n /** Maximum retry attempts */\n MAX_RETRIES: 3,\n /** Base delay between retries (1 second) */\n BASE_DELAY: 1000,\n /** Maximum delay between retries (30 seconds) */\n MAX_DELAY: 30_000,\n /** Backoff multiplier */\n BACKOFF_MULTIPLIER: 2,\n /** Circuit breaker failure threshold */\n CIRCUIT_BREAKER_THRESHOLD: 5,\n /** Circuit breaker reset timeout (30 seconds) */\n CIRCUIT_BREAKER_RESET: 30_000,\n} as const;\n\n// ============ Crypto Defaults ============\n\nexport const CRYPTO_DEFAULTS = {\n /** Default encryption algorithm */\n ALGORITHM: 'aes-256-gcm',\n /** Default key length (32 bytes for AES-256) */\n KEY_LENGTH: 32,\n /** Default IV length (16 bytes) */\n IV_LENGTH: 16,\n /** ChaCha20 IV length (12 bytes) */\n CHACHA_IV_LENGTH: 12,\n /** Default salt length (32 bytes) */\n SALT_LENGTH: 32,\n /** PBKDF2 iterations */\n ITERATIONS: 100_000,\n /** Hash digest algorithm */\n DIGEST: 'sha256',\n} as const;\n\n// ============ Health Check Defaults ============\n\nexport const HEALTH_DEFAULTS = {\n /** Health check interval (30 seconds) */\n CHECK_INTERVAL: 30_000,\n /** Health check timeout (5 seconds) */\n CHECK_TIMEOUT: 5000,\n /** Maximum wait time for healthy state (1 minute) */\n MAX_WAIT_TIME: 60_000,\n /** Wait interval between health checks (1 second) */\n WAIT_INTERVAL: 1000,\n} as const;\n\n// ============ Logging Defaults ============\n\nexport const LOGGING_DEFAULTS = {\n /** Slow query threshold for logging (1 second) */\n SLOW_QUERY_THRESHOLD: 1000,\n /** Maximum SQL length in logs (200 chars) */\n MAX_SQL_LENGTH: 200,\n /** Maximum params length in logs (100 chars) */\n MAX_PARAMS_LENGTH: 100,\n} as const;\n\n// ============ Metrics Buckets ============\n\n/**\n * Histogram buckets for query duration metrics (in ms)\n */\nexport const DURATION_BUCKETS = [10, 50, 100, 250, 500, 1000, 2500, 5000, 10_000] as const;\n\n// ============ Performance Analysis Duration ============\n\nexport const ANALYSIS_DEFAULTS = {\n /** Default analysis window (1 hour) */\n WINDOW: 3_600_000,\n /** Warmup delay after connection (1 second) */\n WARMUP_DELAY: 1000,\n} as const;\n\n// ============ Unit Conversions ============\n\nexport const TIME_UNITS = {\n /** Milliseconds in a second */\n MS_PER_SECOND: 1000,\n /** Milliseconds in a minute */\n MS_PER_MINUTE: 60_000,\n /** Milliseconds in an hour */\n MS_PER_HOUR: 3_600_000,\n /** Seconds in a minute */\n SECONDS_PER_MINUTE: 60,\n /** Seconds in an hour */\n SECONDS_PER_HOUR: 3600,\n} as const;\n\nexport const SIZE_UNITS = {\n /** Bytes in a kilobyte */\n BYTES_PER_KB: 1024,\n /** Bytes in a megabyte */\n BYTES_PER_MB: 1024 * 1024,\n /** Bytes in a gigabyte */\n BYTES_PER_GB: 1024 * 1024 * 1024,\n} as const;\n","export class DatabaseError extends Error {\n constructor(\n message: string,\n public code?: string,\n public override cause?: Error,\n ) {\n super(message);\n this.name = 'DatabaseError';\n Error.captureStackTrace(this, this.constructor);\n }\n}\n\nexport class DBBridgeError extends DatabaseError {\n constructor(\n message: string,\n public override code?: string,\n public override cause?: Error,\n ) {\n super(message, code, cause);\n this.name = 'DBBridgeError';\n Error.captureStackTrace(this, this.constructor);\n }\n}\n\nexport class ConnectionError extends DBBridgeError {\n constructor(message: string, cause?: Error) {\n super(message, 'CONNECTION_ERROR', cause);\n this.name = 'ConnectionError';\n }\n}\n\nexport class QueryError extends DBBridgeError {\n constructor(\n message: string,\n public sql?: string,\n public params?: unknown[],\n cause?: Error,\n ) {\n super(message, 'QUERY_ERROR', cause);\n this.name = 'QueryError';\n }\n}\n\nexport class TransactionError extends DBBridgeError {\n constructor(\n message: string,\n public transactionId?: string,\n cause?: Error,\n ) {\n super(message, 'TRANSACTION_ERROR', cause);\n this.name = 'TransactionError';\n }\n}\n\nexport class TimeoutError extends DBBridgeError {\n constructor(\n message: string,\n public timeout?: number,\n cause?: Error,\n ) {\n super(message, 'TIMEOUT_ERROR', cause);\n this.name = 'TimeoutError';\n }\n}\n\n/**\n * Thrown when a query exceeds the configured timeout\n */\nexport class QueryTimeoutError extends TimeoutError {\n constructor(\n public sql: string,\n public timeoutMs: number,\n cause?: Error,\n ) {\n super(\n `Query timed out after ${timeoutMs}ms. Consider optimizing the query or increasing queryTimeout.`,\n timeoutMs,\n cause,\n );\n this.name = 'QueryTimeoutError';\n this.code = 'QUERY_TIMEOUT';\n }\n}\n\n/**\n * Thrown when the connection pool is exhausted\n * This happens when:\n * - All connections are busy AND\n * - Queue is full (queueLimit reached) OR\n * - acquireTimeout exceeded\n */\nexport class PoolExhaustedError extends ConnectionError {\n constructor(\n public poolStats: { active: number; waiting: number; max: number },\n public waitTimeMs?: number,\n cause?: Error,\n ) {\n const { active, waiting, max } = poolStats;\n super(\n `Connection pool exhausted: ${active}/${max} connections active, ${waiting} requests waiting. ` +\n `Consider increasing pool.max or reducing load.`,\n cause,\n );\n this.name = 'PoolExhaustedError';\n this.code = 'POOL_EXHAUSTED';\n }\n}\n\nexport class ValidationError extends DBBridgeError {\n constructor(\n message: string,\n public field?: string,\n cause?: Error,\n ) {\n super(message, 'VALIDATION_ERROR', cause);\n this.name = 'ValidationError';\n }\n}\n\nexport class CacheError extends DBBridgeError {\n constructor(\n message: string,\n public key?: string,\n cause?: Error,\n ) {\n super(message, 'CACHE_ERROR', cause);\n this.name = 'CacheError';\n }\n}\n\nexport class NotImplementedError extends DBBridgeError {\n constructor(feature: string) {\n super(`Feature \"${feature}\" is not implemented`, 'NOT_IMPLEMENTED');\n this.name = 'NotImplementedError';\n }\n}\n","import { TimeoutError } from '../errors';\n\nexport interface RetryOptions {\n maxRetries: number;\n retryDelay: number;\n backoffMultiplier?: number;\n maxRetryDelay?: number;\n shouldRetry?: (error: Error) => boolean;\n}\n\nconst DEFAULT_RETRY_OPTIONS: RetryOptions = {\n maxRetries: 3,\n retryDelay: 1000,\n backoffMultiplier: 2,\n maxRetryDelay: 30_000,\n shouldRetry: (error: Error) => {\n const retryableCodes = ['ECONNREFUSED', 'ETIMEDOUT', 'ENOTFOUND', 'ENETUNREACH'];\n return retryableCodes.some((code) => error.message.includes(code));\n },\n};\n\nexport async function retry<T>(\n fn: () => Promise<T>,\n options: Partial<RetryOptions> = {},\n): Promise<T> {\n const opts = { ...DEFAULT_RETRY_OPTIONS, ...options };\n let lastError: Error | undefined;\n let delay = opts.retryDelay;\n\n for (let attempt = 0; attempt <= opts.maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error as Error;\n\n if (attempt === opts.maxRetries || !opts.shouldRetry!(lastError)) {\n throw lastError;\n }\n\n await sleep(delay);\n\n if (opts.backoffMultiplier && opts.backoffMultiplier > 1) {\n delay = Math.min(delay * opts.backoffMultiplier, opts.maxRetryDelay!);\n }\n }\n }\n\n throw lastError;\n}\n\nexport async function withTimeout<T>(\n promise: Promise<T>,\n timeoutMs: number,\n message?: string,\n): Promise<T> {\n let timeoutId: NodeJS.Timeout | undefined;\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => {\n reject(new TimeoutError(message || `Operation timed out after ${timeoutMs}ms`, timeoutMs));\n }, timeoutMs);\n });\n\n try {\n const result = await Promise.race([promise, timeoutPromise]);\n clearTimeout(timeoutId);\n return result;\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import { ValidationError } from '../errors';\n\nimport type { ConnectionConfig } from '../types';\n\nexport function validateConnectionConfig(config: ConnectionConfig): void {\n if (!config) {\n throw new ValidationError('Connection configuration is required');\n }\n\n if (!config.connectionString) {\n if (!config.host) {\n throw new ValidationError('Host is required when connectionString is not provided', 'host');\n }\n\n if (!config.database) {\n throw new ValidationError(\n 'Database name is required when connectionString is not provided',\n 'database',\n );\n }\n }\n\n if (\n config.port !== undefined &&\n (typeof config.port !== 'number' || config.port < 1 || config.port > 65_535)\n ) {\n throw new ValidationError('Port must be a number between 1 and 65535', 'port');\n }\n\n if (config.poolSize && (typeof config.poolSize !== 'number' || config.poolSize < 1)) {\n throw new ValidationError('Pool size must be a positive number', 'poolSize');\n }\n\n if (\n config.connectionTimeout &&\n (typeof config.connectionTimeout !== 'number' || config.connectionTimeout < 0)\n ) {\n throw new ValidationError(\n 'Connection timeout must be a non-negative number',\n 'connectionTimeout',\n );\n }\n\n if (config.idleTimeout && (typeof config.idleTimeout !== 'number' || config.idleTimeout < 0)) {\n throw new ValidationError('Idle timeout must be a non-negative number', 'idleTimeout');\n }\n}\n\nexport function validateSQL(sql: string): void {\n if (!sql || typeof sql !== 'string') {\n throw new ValidationError('SQL query must be a non-empty string');\n }\n\n if (sql.trim().length === 0) {\n throw new ValidationError('SQL query cannot be empty');\n }\n}\n\nexport function validateTableName(tableName: string): void {\n if (!tableName || typeof tableName !== 'string') {\n throw new ValidationError('Table name must be a non-empty string');\n }\n\n const validTableNameRegex = /^[A-Z_a-z]\\w*$/;\n if (!validTableNameRegex.test(tableName)) {\n throw new ValidationError(\n 'Table name must start with a letter or underscore and contain only letters, numbers, and underscores',\n 'tableName',\n );\n }\n}\n\nexport function validateColumnName(columnName: string): void {\n if (!columnName || typeof columnName !== 'string') {\n throw new ValidationError('Column name must be a non-empty string');\n }\n\n const validColumnNameRegex = /^[A-Z_a-z]\\w*$/;\n if (!validColumnNameRegex.test(columnName)) {\n throw new ValidationError(\n 'Column name must start with a letter or underscore and contain only letters, numbers, and underscores',\n 'columnName',\n );\n }\n}\n","import { createHash } from 'node:crypto';\n\nexport function generateCacheKey(sql: string, params?: unknown[], prefix = 'db-bridge'): string {\n const hash = createHash('sha256');\n hash.update(sql);\n\n if (params && params.length > 0) {\n hash.update(JSON.stringify(params));\n }\n\n return `${prefix}:${hash.digest('hex')}`;\n}\n\nexport function parseCacheKey(key: string): { prefix: string; hash: string } | null {\n const parts = key.split(':');\n\n if (parts.length !== 2) {\n return null;\n }\n\n return {\n prefix: parts[0]!,\n hash: parts[1]!,\n };\n}\n\nexport function createCacheKeyPattern(prefix = 'db-bridge', pattern = '*'): string {\n return `${prefix}:${pattern}`;\n}\n\nexport function sanitizeCacheKey(key: string): string {\n return key.replaceAll(/[^\\w:-]/g, '_');\n}\n","export function generateUUID(): string {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replaceAll(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n","/**\n * Compression Utilities\n *\n * Provides compression and decompression for cache entries.\n * Uses zlib for gzip compression.\n */\n\nimport { gzipSync, gunzipSync, constants as zlibConstants } from 'node:zlib';\n\nimport { CACHE_DEFAULTS } from '../constants';\n\n/**\n * Compression options\n */\nexport interface CompressionOptions {\n /** Minimum size in bytes before compression is applied */\n threshold?: number;\n /** Compression level (1-9, higher = more compression) */\n level?: number;\n}\n\nconst DEFAULT_OPTIONS: Required<CompressionOptions> = {\n threshold: CACHE_DEFAULTS.COMPRESSION_THRESHOLD,\n level: zlibConstants.Z_DEFAULT_COMPRESSION,\n};\n\n/**\n * Compress a string if it exceeds the threshold\n */\nexport function compress(data: string, options: CompressionOptions = {}): string {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n // Skip compression for small data\n if (data.length < opts.threshold) {\n return data;\n }\n\n try {\n const buffer = Buffer.from(data, 'utf8');\n const compressed = gzipSync(buffer, { level: opts.level });\n return compressed.toString('base64');\n } catch {\n // Return original data if compression fails\n return data;\n }\n}\n\n/**\n * Decompress a string if it was compressed\n */\nexport function decompress(data: string): string {\n if (!isCompressed(data)) {\n return data;\n }\n\n try {\n const buffer = Buffer.from(data, 'base64');\n const decompressed = gunzipSync(buffer);\n return decompressed.toString('utf8');\n } catch {\n // Return original data if decompression fails\n return data;\n }\n}\n\n/**\n * Check if data appears to be gzip compressed (base64 encoded)\n */\nexport function isCompressed(data: string): boolean {\n if (data.length < 4) {\n return false;\n }\n\n try {\n // Check if it's valid base64 and starts with gzip magic bytes\n const buffer = Buffer.from(data.slice(0, 4), 'base64');\n return buffer[0] === 0x1f && buffer[1] === 0x8b;\n } catch {\n return false;\n }\n}\n\n/**\n * Get compression ratio (original size / compressed size)\n */\nexport function getCompressionRatio(original: string, compressed: string): number {\n if (original.length === 0) {\n return 1;\n }\n return original.length / compressed.length;\n}\n\n/**\n * Estimate if compression would be beneficial\n */\nexport function shouldCompress(\n data: string,\n threshold = CACHE_DEFAULTS.COMPRESSION_THRESHOLD,\n): boolean {\n // Don't compress small data\n if (data.length < threshold) {\n return false;\n }\n\n // Check for repetitive patterns that compress well\n const uniqueChars = new Set(data).size;\n const repetitionRatio = data.length / uniqueChars;\n\n // Compress if data has good repetition ratio (> 3)\n return repetitionRatio > 3;\n}\n","import { EventEmitter } from 'eventemitter3';\n\nimport { NotImplementedError, ConnectionError, QueryError } from './errors';\nimport {\n validateConnectionConfig,\n validateSQL,\n retry,\n withTimeout,\n generateCacheKey,\n} from './utils';\n\nimport type { CryptoProvider } from './crypto/crypto';\nimport type { DatabaseAdapter, CacheAdapter } from './interfaces';\nimport type {\n ConnectionConfig,\n QueryResult,\n QueryOptions,\n QueryParams,\n Transaction,\n TransactionOptions,\n PreparedStatement,\n PoolStats,\n Logger,\n} from './types';\n\nexport interface BaseAdapterOptions {\n logger?: Logger;\n cache?: CacheAdapter;\n crypto?: CryptoProvider;\n retryOptions?: {\n maxRetries?: number;\n retryDelay?: number;\n };\n}\n\nexport abstract class BaseAdapter extends EventEmitter implements DatabaseAdapter {\n protected config?: ConnectionConfig;\n protected logger?: Logger;\n protected cache?: CacheAdapter;\n protected crypto?: CryptoProvider;\n protected _isConnected = false;\n protected retryOptions = {\n maxRetries: 3,\n retryDelay: 1000,\n };\n\n abstract readonly name: string;\n abstract readonly version: string;\n\n get isConnected(): boolean {\n return this._isConnected;\n }\n\n constructor(options: BaseAdapterOptions = {}) {\n super();\n if (options.logger) {\n this.logger = options.logger;\n }\n if (options.cache) {\n this.cache = options.cache;\n }\n if (options.crypto) {\n this.crypto = options.crypto;\n }\n if (options.retryOptions) {\n this.retryOptions = { ...this.retryOptions, ...options.retryOptions };\n }\n }\n\n async connect(config: ConnectionConfig): Promise<void> {\n validateConnectionConfig(config);\n this.config = config;\n\n try {\n await retry(\n async () => {\n await this.doConnect(config);\n this._isConnected = true;\n this.emit('connect', { config });\n },\n {\n maxRetries: this.retryOptions.maxRetries,\n retryDelay: this.retryOptions.retryDelay,\n },\n );\n } catch (error) {\n throw new ConnectionError('Failed to connect to database', error as Error);\n }\n }\n\n async disconnect(): Promise<void> {\n if (!this._isConnected) {\n return;\n }\n\n try {\n await this.doDisconnect();\n this._isConnected = false;\n this.emit('disconnect');\n } catch (error) {\n throw new ConnectionError('Failed to disconnect from database', error as Error);\n }\n }\n\n async query<T = unknown>(\n sql: string,\n params?: QueryParams,\n options: QueryOptions = {},\n ): Promise<QueryResult<T>> {\n validateSQL(sql);\n\n if (!this._isConnected) {\n throw new ConnectionError('Not connected to database');\n }\n\n const startTime = Date.now();\n\n try {\n let result: QueryResult<T>;\n\n if (options.cache && this.cache) {\n const cacheKey = this.getCacheKey(sql, params, options.cache);\n const cachedResult = await this.cache.get<QueryResult<T>>(cacheKey);\n\n if (cachedResult) {\n this.logger?.debug('Cache hit', { key: cacheKey });\n this.emit('cacheHit', { key: cacheKey, sql });\n return cachedResult;\n }\n\n this.logger?.debug('Cache miss', { key: cacheKey });\n this.emit('cacheMiss', { key: cacheKey, sql });\n }\n\n const queryPromise = this.doQuery<T>(sql, params, options);\n\n if (options.timeout) {\n result = await withTimeout(\n queryPromise,\n options.timeout,\n `Query timed out after ${options.timeout}ms`,\n );\n } else {\n result = await queryPromise;\n }\n\n result.duration = Date.now() - startTime;\n\n if (options.cache && this.cache) {\n const cacheKey = this.getCacheKey(sql, params, options.cache);\n const ttl = typeof options.cache === 'object' ? options.cache.ttl : undefined;\n await this.cache.set(cacheKey, result, ttl);\n this.logger?.debug('Cached query result', { key: cacheKey, ttl });\n }\n\n this.emit('query', { sql, params, duration: result.duration, rowCount: result.rowCount });\n return result;\n } catch (error) {\n const duration = Date.now() - startTime;\n this.emit('queryError', { sql, params, error, duration });\n throw new QueryError(\n `Query failed: ${(error as Error).message}`,\n sql,\n params as unknown[],\n error as Error,\n );\n }\n }\n\n async execute<T = unknown>(\n sql: string,\n params?: QueryParams,\n options?: QueryOptions,\n ): Promise<QueryResult<T>> {\n return this.query<T>(sql, params, { ...options, cache: false });\n }\n\n /**\n * Execute a batch of queries with different parameter sets\n * Industry-standard batch operations for bulk inserts/updates\n */\n async executeBatch<T = unknown>(\n sql: string,\n paramSets: QueryParams[],\n options?: QueryOptions,\n ): Promise<QueryResult<T>[]> {\n if (!this._isConnected) {\n throw new ConnectionError('Not connected to database');\n }\n\n const results: QueryResult<T>[] = [];\n const startTime = Date.now();\n\n try {\n for (const params of paramSets) {\n const result = await this.execute<T>(sql, params, options);\n results.push(result);\n }\n\n const duration = Date.now() - startTime;\n this.emit('batchExecute', { sql, batchSize: paramSets.length, duration });\n\n return results;\n } catch (error) {\n const duration = Date.now() - startTime;\n this.emit('batchError', { sql, error, duration });\n throw new QueryError(\n `Batch execution failed: ${(error as Error).message}`,\n sql,\n [],\n error as Error,\n );\n }\n }\n\n async prepare<T = unknown>(_sql: string, _name?: string): Promise<PreparedStatement<T>> {\n throw new NotImplementedError('prepare');\n }\n\n async beginTransaction(_options?: TransactionOptions): Promise<Transaction> {\n throw new NotImplementedError('beginTransaction');\n }\n\n getPoolStats(): PoolStats {\n throw new NotImplementedError('getPoolStats');\n }\n\n async ping(): Promise<boolean> {\n try {\n await this.query('SELECT 1');\n return true;\n } catch {\n return false;\n }\n }\n\n escape(_value: unknown): string {\n throw new NotImplementedError('escape');\n }\n\n escapeIdentifier(_identifier: string): string {\n throw new NotImplementedError('escapeIdentifier');\n }\n\n abstract createQueryBuilder<T = unknown>(): import('./interfaces').QueryBuilder<T>;\n\n protected abstract doConnect(config: ConnectionConfig): Promise<void>;\n protected abstract doDisconnect(): Promise<void>;\n protected abstract doQuery<T = unknown>(\n sql: string,\n params?: QueryParams,\n options?: QueryOptions,\n ): Promise<QueryResult<T>>;\n\n private getCacheKey(\n sql: string,\n params?: QueryParams,\n cacheOptions?: boolean | CacheOptions,\n ): string {\n if (typeof cacheOptions === 'object' && cacheOptions.key) {\n return cacheOptions.key;\n }\n\n const paramsArray = Array.isArray(params) ? params : params ? Object.values(params) : undefined;\n return generateCacheKey(sql, paramsArray);\n }\n}\n\ntype CacheOptions = {\n ttl?: number;\n key?: string;\n invalidateOn?: string[];\n compress?: boolean;\n};\n","/**\n * Date Filter Trait\n *\n * Provides date-related WHERE clause methods for query builders.\n * Used by BaseQueryBuilder via composition.\n */\n\nimport { validateColumnName } from '../utils';\n\nimport type { WhereClause } from './query-builder-types';\n\nexport interface DateFilterContext {\n bindings: unknown[];\n whereClauses: WhereClause[];\n escapeIdentifierFn: (identifier: string) => string;\n parameterPlaceholderFn: (index: number) => string;\n}\n\n/**\n * Add a date comparison WHERE clause\n */\nexport function whereDate(\n ctx: DateFilterContext,\n column: string,\n operator: string,\n date: Date | string,\n): void {\n validateColumnName(column);\n const dateValue = date instanceof Date ? date.toISOString().split('T')[0] : date;\n const placeholder = ctx.parameterPlaceholderFn(ctx.bindings.length + 1);\n\n ctx.whereClauses.push({\n type: 'AND',\n condition: `DATE(${ctx.escapeIdentifierFn(column)}) ${operator} ${placeholder}`,\n bindings: [dateValue],\n });\n ctx.bindings.push(dateValue);\n}\n\n/**\n * Add a year comparison WHERE clause\n */\nexport function whereYear(\n ctx: DateFilterContext,\n column: string,\n operator: string,\n year: number,\n): void {\n validateColumnName(column);\n const placeholder = ctx.parameterPlaceholderFn(ctx.bindings.length + 1);\n\n ctx.whereClauses.push({\n type: 'AND',\n condition: `YEAR(${ctx.escapeIdentifierFn(column)}) ${operator} ${placeholder}`,\n bindings: [year],\n });\n ctx.bindings.push(year);\n}\n\n/**\n * Add a month comparison WHERE clause\n */\nexport function whereMonth(\n ctx: DateFilterContext,\n column: string,\n operator: string,\n month: number,\n): void {\n validateColumnName(column);\n const placeholder = ctx.parameterPlaceholderFn(ctx.bindings.length + 1);\n\n ctx.whereClauses.push({\n type: 'AND',\n condition: `MONTH(${ctx.escapeIdentifierFn(column)}) ${operator} ${placeholder}`,\n bindings: [month],\n });\n ctx.bindings.push(month);\n}\n\n/**\n * Add a day comparison WHERE clause\n */\nexport function whereDay(\n ctx: DateFilterContext,\n column: string,\n operator: string,\n day: number,\n): void {\n validateColumnName(column);\n const placeholder = ctx.parameterPlaceholderFn(ctx.bindings.length + 1);\n\n ctx.whereClauses.push({\n type: 'AND',\n condition: `DAY(${ctx.escapeIdentifierFn(column)}) ${operator} ${placeholder}`,\n bindings: [day],\n });\n ctx.bindings.push(day);\n}\n\n/**\n * Add a WHERE clause for today's date\n */\nexport function whereToday(ctx: DateFilterContext, column: string): void {\n const today = new Date().toISOString().split('T')[0]!;\n whereDate(ctx, column, '=', today);\n}\n\n/**\n * Add a WHERE clause for yesterday's date\n */\nexport function whereYesterday(ctx: DateFilterContext, column: string): void {\n const yesterday = new Date();\n yesterday.setDate(yesterday.getDate() - 1);\n whereDate(ctx, column, '=', yesterday.toISOString().split('T')[0]!);\n}\n\n/**\n * Add a WHERE clause for a date range\n */\nexport function whereBetweenDates(\n ctx: DateFilterContext,\n column: string,\n startDate: Date | string,\n endDate: Date | string,\n): void {\n validateColumnName(column);\n const start = startDate instanceof Date ? startDate.toISOString().split('T')[0] : startDate;\n const end = endDate instanceof Date ? endDate.toISOString().split('T')[0] : endDate;\n\n const startPlaceholder = ctx.parameterPlaceholderFn(ctx.bindings.length + 1);\n const endPlaceholder = ctx.parameterPlaceholderFn(ctx.bindings.length + 2);\n\n ctx.whereClauses.push({\n type: 'AND',\n condition: `DATE(${ctx.escapeIdentifierFn(column)}) BETWEEN ${startPlaceholder} AND ${endPlaceholder}`,\n bindings: [start, end],\n });\n ctx.bindings.push(start, end);\n}\n\n/**\n * Add a WHERE clause for the last N days\n */\nexport function whereLastDays(ctx: DateFilterContext, column: string, days: number): void {\n validateColumnName(column);\n const placeholder = ctx.parameterPlaceholderFn(ctx.bindings.length + 1);\n\n ctx.whereClauses.push({\n type: 'AND',\n condition: `${ctx.escapeIdentifierFn(column)} >= DATE_SUB(CURDATE(), INTERVAL ${placeholder} DAY)`,\n bindings: [days],\n });\n ctx.bindings.push(days);\n}\n","/**\n * Base Query Builder\n *\n * Core query building functionality with modular organization.\n * Extended features are implemented via composition pattern.\n *\n * Related modules:\n * @see query-builder/date-filter-trait.ts - Date filter functions\n * @see query-builder/aggregate-trait.ts - Aggregate functions\n * @see query-builder/pagination-trait.ts - Pagination functions\n * @see query-builder/encryption-trait.ts - Encryption/decryption functions\n */\n\nimport { ValidationError } from './errors';\nimport * as dateFilterTrait from './query-builder/date-filter-trait';\nimport { validateTableName, validateColumnName } from './utils';\n\nimport type { CryptoProvider } from './crypto/crypto';\nimport type {\n QueryBuilder,\n DatabaseAdapter,\n PaginationResult,\n CursorPaginationResult,\n} from './interfaces';\nimport type {\n QueryBuilderOptions,\n WhereClause,\n JoinClause,\n} from './query-builder/query-builder-types';\nimport type { QueryResult, QueryOptions, QueryParams } from './types';\n\n// Import and re-export types for backward compatibility\n\n/**\n * Base Query Builder - Full-featured query builder\n *\n * Methods are organized into logical sections:\n * - Selection: select, from, table, distinct\n * - Joins: join, innerJoin, leftJoin, rightJoin, fullJoin\n * - Where clauses: where, orWhere, whereIn, whereNotIn, etc.\n * - Date filters: whereDate, whereToday, whereLastDays, etc.\n * - Grouping & Ordering: groupBy, having, orderBy, limit, offset\n * - Aggregates: count, sum, avg, min, max, exists\n * - Pagination: paginate, cursorPaginate, chunk\n * - Utilities: pluck, value, first, firstOrFail, sole\n * - CRUD: insert, update, delete\n * - Execution: execute, toSQL\n */\nexport abstract class BaseQueryBuilder<T = unknown> implements QueryBuilder<T> {\n protected adapter: DatabaseAdapter;\n protected escapeIdentifierFn: (identifier: string) => string;\n protected parameterPlaceholderFn: (index: number) => string;\n protected crypto?: CryptoProvider;\n protected encryptedFields: Set<string> = new Set();\n protected decryptedFields: Set<string> = new Set();\n\n // Query state\n protected selectColumns: string[] = ['*'];\n protected fromTable?: string;\n protected fromAlias?: string;\n protected joins: JoinClause[] = [];\n protected whereClauses: WhereClause[] = [];\n protected groupByColumns: string[] = [];\n protected havingClause?: string;\n protected orderByColumns: Array<{ column: string; direction: 'ASC' | 'DESC' }> = [];\n protected limitValue?: number;\n protected offsetValue?: number;\n protected bindings: unknown[] = [];\n protected isDistinct = false;\n\n // CRUD state\n protected insertTable?: string;\n protected insertData?: Record<string, unknown> | Record<string, unknown>[];\n protected updateTable?: string;\n protected updateData?: Record<string, unknown>;\n protected deleteTable?: string;\n\n // Raw SQL\n protected rawSql?: string;\n protected rawBindings?: unknown[];\n\n constructor(options: QueryBuilderOptions) {\n this.adapter = options.adapter;\n this.escapeIdentifierFn = options.escapeIdentifier || ((id) => `\"${id}\"`);\n this.parameterPlaceholderFn = options.parameterPlaceholder || ((index) => `$${index}`);\n this.crypto = options.crypto;\n }\n\n // ============================================\n // SELECTION\n // ============================================\n\n select(...columns: string[]): QueryBuilder<T>;\n select(columns: string[]): QueryBuilder<T>;\n select(...args: Array<string | string[]>): QueryBuilder<T> {\n let cols: string[] = [];\n\n if (args.length === 1 && Array.isArray(args[0])) {\n cols = args[0];\n } else {\n cols = args.filter((arg) => typeof arg === 'string');\n }\n\n if (cols.length === 0) {\n this.selectColumns = ['*'];\n } else {\n this.selectColumns = cols\n .filter((col) => col && typeof col === 'string')\n .map((col) => {\n if (col === '*' || col.includes('.') || col.includes(' as ') || col.includes(' AS ')) {\n return col;\n }\n validateColumnName(col);\n return col;\n });\n }\n return this;\n }\n\n from(table: string, alias?: string): QueryBuilder<T> {\n validateTableName(table);\n this.fromTable = table;\n if (alias !== undefined) {\n this.fromAlias = alias;\n }\n return this;\n }\n\n table(table: string, alias?: string): QueryBuilder<T> {\n return this.from(table, alias);\n }\n\n distinct(): QueryBuilder<T> {\n this.isDistinct = true;\n return this;\n }\n\n // ============================================\n // JOINS\n // ============================================\n\n join(\n table: string,\n on: string,\n type: 'INNER' | 'LEFT' | 'RIGHT' | 'FULL' = 'INNER',\n ): QueryBuilder<T> {\n const tableName = table.split(' ')[0];\n if (tableName) {\n validateTableName(tableName);\n }\n this.joins.push({ type, table, on });\n return this;\n }\n\n innerJoin(table: string, on: string): QueryBuilder<T> {\n return this.join(table, on, 'INNER');\n }\n\n leftJoin(table: string, on: string): QueryBuilder<T> {\n return this.join(table, on, 'LEFT');\n }\n\n rightJoin(table: string, on: string): QueryBuilder<T> {\n return this.join(table, on, 'RIGHT');\n }\n\n fullJoin(table: string, on: string): QueryBuilder<T> {\n return this.join(table, on, 'FULL');\n }\n\n // ============================================\n // WHERE CLAUSES\n // ============================================\n\n where(\n condition: string | Record<string, unknown>,\n operator?: string,\n value?: unknown,\n ): QueryBuilder<T>;\n where(column: string, operator: string, value: unknown): QueryBuilder<T>;\n where(...args: Array<string | Record<string, unknown> | undefined>): QueryBuilder<T> {\n switch (args.length) {\n case 3: {\n const [column, operator, value] = args;\n this.addWhereClause('AND', column as string, operator as string, value);\n\n break;\n }\n case 2: {\n const [condition, operator = '='] = args;\n this.addWhereClause(\n 'AND',\n condition as string | Record<string, unknown>,\n operator as string,\n );\n\n break;\n }\n case 1: {\n const [condition] = args;\n this.addWhereClause('AND', condition as string | Record<string, unknown>, '=');\n\n break;\n }\n // No default\n }\n return this;\n }\n\n orWhere(\n condition: string | Record<string, unknown>,\n operator?: string,\n value?: unknown,\n ): QueryBuilder<T>;\n orWhere(column: string, operator: string, value: unknown): QueryBuilder<T>;\n orWhere(...args: Array<string | Record<string, unknown> | undefined>): QueryBuilder<T> {\n switch (args.length) {\n case 3: {\n const [column, operator, value] = args;\n this.addWhereClause('OR', column as string, operator as string, value);\n\n break;\n }\n case 2: {\n const [condition, operator = '='] = args;\n this.addWhereClause(\n 'OR',\n condition as string | Record<string, unknown>,\n operator as string,\n );\n\n break;\n }\n case 1: {\n const [condition] = args;\n this.addWhereClause('OR', condition as string | Record<string, unknown>, '=');\n\n break;\n }\n // No default\n }\n return this;\n }\n\n whereIn(column: string, values: unknown[]): QueryBuilder<T> {\n validateColumnName(column);\n if (values.length === 0) {\n throw new ValidationError('whereIn requires at least one value');\n }\n\n const placeholders = values\n .map((_, index) => this.parameterPlaceholderFn(this.bindings.length + index + 1))\n .join(', ');\n\n this.whereClauses.push({\n type: 'AND',\n condition: `${this.escapeIdentifierFn(column)} IN (${placeholders})`,\n bindings: values,\n });\n this.bindings.push(...values);\n return this;\n }\n\n whereNotIn(column: string, values: unknown[]): QueryBuilder<T> {\n validateColumnName(column);\n if (values.length === 0) {\n throw new ValidationError('whereNotIn requires at least one value');\n }\n\n const placeholders = values\n .map((_, index) => this.parameterPlaceholderFn(this.bindings.length + index + 1))\n .join(', ');\n\n this.whereClauses.push({\n type: 'AND',\n condition: `${this.escapeIdentifierFn(column)} NOT IN (${placeholders})`,\n bindings: values,\n });\n this.bindings.push(...values);\n return this;\n }\n\n whereBetween(column: string, min: unknown, max: unknown): QueryBuilder<T> {\n validateColumnName(column);\n\n const minPlaceholder = this.parameterPlaceholderFn(this.bindings.length + 1);\n const maxPlaceholder = this.parameterPlaceholderFn(this.bindings.length + 2);\n\n this.whereClauses.push({\n type: 'AND',\n condition: `${this.escapeIdentifierFn(column)} BETWEEN ${minPlaceholder} AND ${maxPlaceholder}`,\n bindings: [min, max],\n });\n this.bindings.push(min, max);\n return this;\n }\n\n whereNull(column: string): QueryBuilder<T> {\n validateColumnName(column);\n this.whereClauses.push({\n type: 'AND',\n condition: `${this.escapeIdentifierFn(column)} IS NULL`,\n bindings: [],\n });\n return this;\n }\n\n whereNotNull(column: string): QueryBuilder<T> {\n validateColumnName(column);\n this.whereClauses.push({\n type: 'AND',\n condition: `${this.escapeIdentifierFn(column)} IS NOT NULL`,\n bindings: [],\n });\n return this;\n }\n\n // ============================================\n // DATE FILTERS (delegated to date-filter-trait)\n // ============================================\n\n whereDate(column: string, operator: string, date: Date | string): QueryBuilder<T> {\n dateFilterTrait.whereDate(this.getDateFilterContext(), column, operator, date);\n return this;\n }\n\n whereYear(column: string, operator: string, year: number): QueryBuilder<T> {\n dateFilterTrait.whereYear(this.getDateFilterContext(), column, operator, year);\n return this;\n }\n\n whereMonth(column: string, operator: string, month: number): QueryBuilder<T> {\n dateFilterTrait.whereMonth(this.getDateFilterContext(), column, operator, month);\n return this;\n }\n\n whereDay(column: string, operator: string, day: number): QueryBuilder<T> {\n dateFilterTrait.whereDay(this.getDateFilterContext(), column, operator, day);\n return this;\n }\n\n whereToday(column: string): QueryBuilder<T> {\n dateFilterTrait.whereToday(this.getDateFilterContext(), column);\n return this;\n }\n\n whereYesterday(column: string): QueryBuilder<T> {\n dateFilterTrait.whereYesterday(this.getDateFilterContext(), column);\n return this;\n }\n\n whereBetweenDates(\n column: string,\n startDate: Date | string,\n endDate: Date | string,\n ): QueryBuilder<T> {\n dateFilterTrait.whereBetweenDates(this.getDateFilterContext(), column, startDate, endDate);\n return this;\n }\n\n whereLastDays(column: string, days: number): QueryBuilder<T> {\n dateFilterTrait.whereLastDays(this.getDateFilterContext(), column, days);\n return this;\n }\n\n private getDateFilterContext(): dateFilterTrait.DateFilterContext {\n return {\n bindings: this.bindings,\n whereClauses: this.whereClauses,\n escapeIdentifierFn: this.escapeIdentifierFn,\n parameterPlaceholderFn: this.parameterPlaceholderFn,\n };\n }\n\n // ============================================\n // GROUPING & ORDERING\n // ============================================\n\n groupBy(...columns: string[]): QueryBuilder<T> {\n columns.forEach((col) => validateColumnName(col));\n this.groupByColumns = columns;\n return this;\n }\n\n having(condition: string): QueryBuilder<T> {\n this.havingClause = condition;\n return this;\n }\n\n orderBy(column: string, direction: 'ASC' | 'DESC' = 'ASC'): QueryBuilder<T> {\n validateColumnName(column);\n this.orderByColumns.push({ column, direction });\n return this;\n }\n\n limit(limit: number): QueryBuilder<T> {\n if (limit < 0) {\n throw new ValidationError('Limit must be non-negative');\n }\n this.limitValue = limit;\n return this;\n }\n\n offset(offset: number): QueryBuilder<T> {\n if (offset < 0) {\n throw new ValidationError('Offset must be non-negative');\n }\n this.offsetValue = offset;\n return this;\n }\n\n // ============================================\n // AGGREGATES\n // ============================================\n\n async count(column = '*', options?: QueryOptions): Promise<number> {\n const originalSelect = this.selectColumns;\n this.selectColumns = [`COUNT(${column}) as count`];\n\n try {\n const result = await this.execute(options);\n const row = result.rows[0] as { count: string | number } | undefined;\n return row ? Number(row.count) : 0;\n } finally {\n this.selectColumns = originalSelect;\n }\n }\n\n async sum(column: string, options?: QueryOptions): Promise<number> {\n validateColumnName(column);\n const originalSelect = this.selectColumns;\n this.selectColumns = [`SUM(${this.escapeIdentifierFn(column)}) as aggregate`];\n\n try {\n const result = await this.execute(options);\n const row = result.rows[0] as { aggregate: string | number | null } | undefined;\n return row?.aggregate ? Number(row.aggregate) : 0;\n } finally {\n this.selectColumns = originalSelect;\n }\n }\n\n async avg(column: string, options?: QueryOptions): Promise<number> {\n validateColumnName(column);\n const originalSelect = this.selectColumns;\n this.selectColumns = [`AVG(${this.escapeIdentifierFn(column)}) as aggregate`];\n\n try {\n const result = await this.execute(options);\n const row = result.rows[0] as { aggregate: string | number | null } | undefined;\n return row?.aggregate ? Number(row.aggregate) : 0;\n } finally {\n this.selectColumns = originalSelect;\n }\n }\n\n async min(column: string, options?: QueryOptions): Promise<number | null> {\n validateColumnName(column);\n const originalSelect = this.selectColumns;\n this.selectColumns = [`MIN(${this.escapeIdentifierFn(column)}) as aggregate`];\n\n try {\n const result = await this.execute(options);\n const row = result.rows[0] as { aggregate: string | number | null } | undefined;\n if (row?.aggregate === null || row?.aggregate === undefined) {\n return null;\n }\n return Number(row.aggregate);\n } finally {\n this.selectColumns = originalSelect;\n }\n }\n\n async max(column: string, options?: QueryOptions): Promise<number | null> {\n validateColumnName(column);\n const originalSelect = this.selectColumns;\n this.selectColumns = [`MAX(${this.escapeIdentifierFn(column)}) as aggregate`];\n\n try {\n const result = await this.execute(options);\n const row = result.rows[0] as { aggregate: string | number | null } | undefined;\n if (row?.aggregate === null || row?.aggregate === undefined) {\n return null;\n }\n return Number(row.aggregate);\n } finally {\n this.selectColumns = originalSelect;\n }\n }\n\n async exists(options?: QueryOptions): Promise<boolean> {\n const count = await this.count('*', options);\n return count > 0;\n }\n\n // ============================================\n // PAGINATION\n // ============================================\n\n async paginate(\n page: number = 1,\n perPage: number = 15,\n options?: QueryOptions,\n ): Promise<PaginationResult<T>> {\n if (page < 1) {\n page = 1;\n }\n if (perPage < 1) {\n perPage = 15;\n }\n\n // Get total count\n const total = await this.count('*', options);\n\n // Calculate pagination\n const totalPages = Math.ceil(total / perPage);\n const offset = (page - 1) * perPage;\n\n // Get paginated data\n this.limitValue = perPage;\n this.offsetValue = offset;\n const result = await this.execute(options);\n\n const from = total > 0 ? offset + 1 : 0;\n const to = Math.min(offset + perPage, total);\n\n return {\n data: result.rows,\n pagination: {\n page,\n perPage,\n total,\n totalPages,\n hasMore: page < totalPages,\n from,\n to,\n },\n };\n }\n\n async cursorPaginate(\n cursorColumn: string,\n cursor: number | string | null = null,\n limit: number = 20,\n options?: QueryOptions,\n ): Promise<CursorPaginationResult<T>> {\n validateColumnName(cursorColumn);\n\n if (cursor !== null) {\n this.where(cursorColumn, '>', cursor);\n }\n\n this.orderBy(cursorColumn, 'ASC');\n this.limitValue = limit + 1;\n\n const result = await this.execute(options);\n const hasMore = result.rows.length > limit;\n const data = hasMore ? result.rows.slice(0, limit) : result.rows;\n\n const lastItem = data.at(-1) as Record<string, unknown> | undefined;\n const nextCursor = hasMore && lastItem ? (lastItem[cursorColumn] as number | string) : null;\n\n return {\n data,\n nextCursor,\n hasMore,\n };\n }\n\n async chunk(\n size: number,\n callback: (items: T[], page: number) => Promise<void | false>,\n options?: QueryOptions,\n ): Promise<void> {\n let page = 1;\n let hasMore = true;\n\n while (hasMore) {\n const result = await this.paginate(page, size, options);\n\n if (result.data.length === 0) {\n break;\n }\n\n const shouldContinue = await callback(result.data, page);\n\n if (shouldContinue === false) {\n break;\n }\n\n hasMore = result.pagination.hasMore;\n page++;\n }\n }\n\n // ============================================\n // UTILITIES\n // ============================================\n\n async first(options?: QueryOptions): Promise<T | null> {\n this.limit(1);\n const result = await this.execute(options);\n return result.rows[0] || null;\n }\n\n async pluck<K = unknown>(column: string, options?: QueryOptions): Promise<K[]> {\n validateColumnName(column);\n const originalSelect = this.selectColumns;\n this.selectColumns = [column];\n\n try {\n const result = await this.execute(options);\n return result.rows\n .map((row: unknown) => (row as Record<string, K>)[column])\n .filter((val): val is K => val !== undefined);\n } finally {\n this.selectColumns = originalSelect;\n }\n }\n\n async value<K = unknown>(column: string, options?: QueryOptions): Promise<K | null> {\n validateColumnName(column);\n const originalSelect = this.selectColumns;\n this.selectColumns = [column];\n this.limitValue = 1;\n\n try {\n const result = await this.execute(options);\n const row = result.rows[0] as Record<string, K> | undefined;\n if (!row) {\n return null;\n }\n const val = row[column];\n return val === undefined ? null : val;\n } finally {\n this.selectColumns = originalSelect;\n }\n }\n\n // ============================================\n // CRUD OPERATIONS\n // ============================================\n\n insert(\n table: string,\n data: Record<string, unknown> | Record<string, unknown>[],\n ): QueryBuilder<T> {\n validateTableName(table);\n this.insertTable = table;\n this.insertData = this.processDataForEncryption(data);\n return this;\n }\n\n update(table: string, data: Record<string, unknown>): QueryBuilder<T> {\n validateTableName(table);\n this.updateTable = table;\n this.updateData = this.processDataForEncryption(data) as Record<string, unknown>;\n return this;\n }\n\n delete(table: string): QueryBuilder<T> {\n validateTableName(table);\n this.deleteTable = table;\n return this;\n }\n\n // ============================================\n // RAW SQL\n // ============================================\n\n raw(sql: string, bindings?: unknown[]): QueryBuilder<T> {\n this.rawSql = sql;\n if (bindings !== undefined) {\n this.rawBindings = bindings;\n }\n return this;\n }\n\n // ============================================\n // ENCRYPTION\n // ============================================\n\n encrypt(...fields: string[]): QueryBuilder<T> {\n fields.forEach((field) => this.encryptedFields.add(field));\n return this;\n }\n\n decrypt(...fields: string[]): QueryBuilder<T> {\n fields.forEach((field) => this.decryptedFields.add(field));\n return this;\n }\n\n // ============================================\n // SQL GENERATION\n // ============================================\n\n toSQL(): { sql: string; bindings: unknown[] } {\n if (this.rawSql) {\n return { sql: this.rawSql, bindings: this.rawBindings || [] };\n }\n\n if (this.insertTable) {\n return this.buildInsertSQL();\n }\n\n if (this.updateTable) {\n return this.buildUpdateSQL();\n }\n\n if (this.deleteTable) {\n return this.buildDeleteSQL();\n }\n\n return this.buildSelectSQL();\n }\n\n // ============================================\n // EXECUTION\n // ============================================\n\n async execute(options?: QueryOptions): Promise<QueryResult<T>> {\n const { sql, bindings } = this.toSQL();\n const result = await this.adapter.query<T>(sql, bindings as QueryParams, options);\n return this.processResultsForDecryption(result);\n }\n\n // ============================================\n // PROTECTED HELPERS\n // ============================================\n\n protected addWhereClause(\n type: 'AND' | 'OR',\n condition: string | Record<string, unknown>,\n operator: string,\n value?: unknown,\n ): void {\n if (value !== undefined) {\n validateColumnName(condition as string);\n const placeholder = this.parameterPlaceholderFn(this.bindings.length + 1);\n\n this.whereClauses.push({\n type,\n condition: `${this.escapeIdentifierFn(condition as string)} ${operator} ${placeholder}`,\n bindings: [value],\n });\n this.bindings.push(value);\n } else if (typeof condition === 'string') {\n this.whereClauses.push({\n type,\n condition,\n bindings: [],\n });\n } else {\n Object.entries(condition).forEach(([key, val]) => {\n validateColumnName(key);\n const placeholder = this.parameterPlaceholderFn(this.bindings.length + 1);\n\n this.whereClauses.push({\n type,\n condition: `${this.escapeIdentifierFn(key)} ${operator} ${placeholder}`,\n bindings: [val],\n });\n this.bindings.push(val);\n });\n }\n }\n\n protected processDataForEncryption(\n data: Record<string, unknown> | Record<string, unknown>[],\n ): Record<string, unknown> | Record<string, unknown>[] {\n if (!this.crypto || this.encryptedFields.size === 0) {\n return data;\n }\n\n if (Array.isArray(data)) {\n return data.map((row) => this.encryptRow(row));\n }\n return this.encryptRow(data);\n }\n\n protected encryptRow(row: Record<string, unknown>): Record<string, unknown> {\n if (!this.crypto) {\n return row;\n }\n\n const encryptedRow = { ...row };\n this.encryptedFields.forEach((field) => {\n if (field in encryptedRow) {\n encryptedRow[field] = this.crypto!.encryptField(encryptedRow[field]);\n }\n });\n return encryptedRow;\n }\n\n protected async processResultsForDecryption(result: QueryResult<T>): Promise<QueryResult<T>> {\n if (!this.crypto || this.decryptedFields.size === 0) {\n return result;\n }\n\n const decryptedRows = result.rows.map((row) => {\n const decryptedRow = { ...row } as Record<string, unknown>;\n this.decryptedFields.forEach((field) => {\n if (field in decryptedRow && decryptedRow[field]) {\n try {\n const value = decryptedRow[field];\n if (typeof value === 'string') {\n decryptedRow[field] = this.crypto!.decryptField(value);\n }\n } catch {\n // If decryption fails, leave the value as is\n }\n }\n });\n return decryptedRow as T;\n });\n\n return {\n ...result,\n rows: decryptedRows,\n };\n }\n\n // ============================================\n // SQL BUILDERS (Abstract - to be implemented by dialects)\n // ============================================\n\n protected abstract buildSelectSQL(): { sql: string; bindings: unknown[] };\n protected abstract buildInsertSQL(): { sql: string; bindings: unknown[] };\n protected abstract buildUpdateSQL(): { sql: string; bindings: unknown[] };\n protected abstract buildDeleteSQL(): { sql: string; bindings: unknown[] };\n}\n\nexport {\n type QueryBuilderOptions,\n type JoinClause,\n type WhereClause,\n} from './query-builder/query-builder-types';\n","/**\n * Query Builder Types and Interfaces\n *\n * Shared types used by BaseQueryBuilder and its traits.\n */\n\nimport type { CryptoProvider } from '../crypto/crypto';\nimport type { DatabaseAdapter } from '../interfaces';\n\nexport interface QueryBuilderOptions {\n adapter: DatabaseAdapter;\n escapeIdentifier?: (identifier: string) => string;\n parameterPlaceholder?: (index: number) => string;\n crypto?: CryptoProvider;\n}\n\nexport interface WhereClause {\n type: 'AND' | 'OR';\n condition: string;\n bindings: unknown[];\n}\n\nexport interface JoinClause {\n type: 'INNER' | 'LEFT' | 'RIGHT' | 'FULL';\n table: string;\n on: string;\n}\n\nexport interface OrderByClause {\n column: string;\n direction: 'ASC' | 'DESC';\n}\n\n/**\n * Query state shared across traits\n */\nexport interface QueryState {\n selectColumns: string[];\n fromTable?: string;\n fromAlias?: string;\n joins: JoinClause[];\n whereClauses: WhereClause[];\n groupByColumns: string[];\n havingClause?: string;\n orderByColumns: OrderByClause[];\n limitValue?: number;\n offsetValue?: number;\n bindings: unknown[];\n isDistinct: boolean;\n\n // CRUD state\n insertTable?: string;\n insertData?: Record<string, unknown> | Record<string, unknown>[];\n updateTable?: string;\n updateData?: Record<string, unknown>;\n deleteTable?: string;\n\n // Raw SQL\n rawSql?: string;\n rawBindings?: unknown[];\n\n // Encryption\n encryptedFields: Set<string>;\n decryptedFields: Set<string>;\n}\n\n/**\n * Create initial query state\n */\nexport function createQueryState(): QueryState {\n return {\n selectColumns: ['*'],\n joins: [],\n whereClauses: [],\n groupByColumns: [],\n orderByColumns: [],\n bindings: [],\n isDistinct: false,\n encryptedFields: new Set(),\n decryptedFields: new Set(),\n };\n}\n","/**\n * Aggregate Trait\n *\n * Provides aggregate methods (count, sum, avg, min, max, exists) for query builders.\n */\n\nimport { validateColumnName } from '../utils';\n\nimport type { DatabaseAdapter } from '../interfaces';\nimport type { QueryOptions, QueryParams } from '../types';\n\nexport interface AggregateContext {\n adapter: DatabaseAdapter;\n selectColumns: string[];\n escapeIdentifierFn: (identifier: string) => string;\n toSQL: () => { sql: string; bindings: unknown[] };\n}\n\ninterface AggregateRow {\n count?: string | number;\n aggregate?: string | number | null;\n}\n\n/**\n * Execute an aggregate query and return the result\n */\nasync function executeAggregate(\n ctx: AggregateContext,\n aggregateExpression: string,\n options?: QueryOptions,\n): Promise<AggregateRow | undefined> {\n const originalSelect = ctx.selectColumns.slice();\n ctx.selectColumns.length = 0;\n ctx.selectColumns.push(aggregateExpression);\n\n try {\n const { sql, bindings } = ctx.toSQL();\n const result = await ctx.adapter.query<AggregateRow>(sql, bindings as QueryParams, options);\n return result.rows[0];\n } finally {\n ctx.selectColumns.length = 0;\n ctx.selectColumns.push(...originalSelect);\n }\n}\n\n/**\n * Count rows matching the query\n */\nexport async function count(\n ctx: AggregateContext,\n column = '*',\n options?: QueryOptions,\n): Promise<number> {\n const row = await executeAggregate(ctx, `COUNT(${column}) as count`, options);\n return row ? Number(row.count) : 0;\n}\n\n/**\n * Sum of column values\n */\nexport async function sum(\n ctx: AggregateContext,\n column: string,\n options?: QueryOptions,\n): Promise<number> {\n validateColumnName(column);\n const row = await executeAggregate(\n ctx,\n `SUM(${ctx.escapeIdentifierFn(column)}) as aggregate`,\n options,\n );\n return row?.aggregate ? Number(row.aggregate) : 0;\n}\n\n/**\n * Average of column values\n */\nexport async function avg(\n ctx: AggregateContext,\n column: string,\n options?: QueryOptions,\n): Promise<number> {\n validateColumnName(column);\n const row = await executeAggregate(\n ctx,\n `AVG(${ctx.escapeIdentifierFn(column)}) as aggregate`,\n options,\n );\n return row?.aggregate ? Number(row.aggregate) : 0;\n}\n\n/**\n * Minimum column value\n */\nexport async function min(\n ctx: AggregateContext,\n column: string,\n options?: QueryOptions,\n): Promise<number | null> {\n validateColumnName(column);\n const row = await executeAggregate(\n ctx,\n `MIN(${ctx.escapeIdentifierFn(column)}) as aggregate`,\n options,\n );\n if (row?.aggregate === null || row?.aggregate === undefined) {\n return null;\n }\n return Number(row.aggregate);\n}\n\n/**\n * Maximum column value\n */\nexport async function max(\n ctx: AggregateContext,\n column: string,\n options?: QueryOptions,\n): Promise<number | null> {\n validateColumnName(column);\n const row = await executeAggregate(\n ctx,\n `MAX(${ctx.escapeIdentifierFn(column)}) as aggregate`,\n options,\n );\n if (row?.aggregate === null || row?.aggregate === undefined) {\n return null;\n }\n return Number(row.aggregate);\n}\n\n/**\n * Check if any rows exist\n */\nexport async function exists(ctx: AggregateContext, options?: QueryOptions): Promise<boolean> {\n const total = await count(ctx, '*', options);\n return total > 0;\n}\n","/**\n * Pagination Trait\n *\n * Provides pagination methods for query builders.\n */\n\nimport { validateColumnName } from '../utils';\n\nimport type { PaginationResult, CursorPaginationResult } from '../interfaces';\nimport type { QueryOptions, QueryResult } from '../types';\n\nexport interface PaginationContext<T> {\n toSQL: () => { sql: string; bindings: unknown[] };\n where: (column: string, operator: string, value: unknown) => void;\n orderBy: (column: string, direction: 'ASC' | 'DESC') => void;\n count: (column: string, options?: QueryOptions) => Promise<number>;\n execute: (options?: QueryOptions) => Promise<QueryResult<T>>;\n}\n\nexport interface PaginationState {\n limitValue?: number;\n offsetValue?: number;\n}\n\n/**\n * Paginate results with offset-based pagination\n */\nexport async function paginate<T>(\n ctx: PaginationContext<T>,\n state: PaginationState,\n page: number = 1,\n perPage: number = 15,\n options?: QueryOptions,\n): Promise<PaginationResult<T>> {\n const safePage = page < 1 ? 1 : page;\n const safePerPage = perPage < 1 ? 15 : perPage;\n\n // Get total count\n const total = await ctx.count('*', options);\n\n // Calculate pagination\n const totalPages = Math.ceil(total / safePerPage);\n const offset = (safePage - 1) * safePerPage;\n\n // Set limit and offset\n state.limitValue = safePerPage;\n state.offsetValue = offset;\n\n // Execute query\n const result = await ctx.execute(options);\n\n const from = total > 0 ? offset + 1 : 0;\n const to = Math.min(offset + safePerPage, total);\n\n return {\n data: result.rows,\n pagination: {\n page: safePage,\n perPage: safePerPage,\n total,\n totalPages,\n hasMore: safePage < totalPages,\n from,\n to,\n },\n };\n}\n\n/**\n * Paginate results with cursor-based pagination\n */\nexport async function cursorPaginate<T>(\n ctx: PaginationContext<T>,\n state: PaginationState,\n cursorColumn: string,\n cursor: number | string | null = null,\n limit: number = 20,\n options?: QueryOptions,\n): Promise<CursorPaginationResult<T>> {\n validateColumnName(cursorColumn);\n\n if (cursor !== null) {\n ctx.where(cursorColumn, '>', cursor);\n }\n\n ctx.orderBy(cursorColumn, 'ASC');\n state.limitValue = limit + 1;\n\n const result = await ctx.execute(options);\n const hasMore = result.rows.length > limit;\n const data = hasMore ? result.rows.slice(0, limit) : result.rows;\n\n const lastItem = data.at(-1) as Record<string, unknown> | undefined;\n const nextCursor = hasMore && lastItem ? (lastItem[cursorColumn] as number | string) : null;\n\n return {\n data,\n nextCursor,\n hasMore,\n };\n}\n\n/**\n * Process results in chunks for memory efficiency\n */\nexport async function chunk<T>(\n ctx: PaginationContext<T>,\n state: PaginationState,\n size: number,\n callback: (items: T[], page: number) => Promise<void | false>,\n options?: QueryOptions,\n): Promise<void> {\n let page = 1;\n let hasMore = true;\n\n while (hasMore) {\n const result = await paginate<T>(ctx, state, page, size, options);\n\n if (result.data.length === 0) {\n break;\n }\n\n const shouldContinue = await callback(result.data, page);\n\n if (shouldContinue === false) {\n break;\n }\n\n hasMore = result.pagination.hasMore;\n page++;\n }\n}\n","/**\n * Encryption Trait\n *\n * Provides field encryption/decryption for query builders.\n */\n\nimport type { CryptoProvider } from '../crypto/crypto';\nimport type { QueryResult } from '../types';\n\nexport interface EncryptionContext {\n crypto?: CryptoProvider;\n encryptedFields: Set<string>;\n decryptedFields: Set<string>;\n}\n\n/**\n * Process data for encryption before insert/update\n */\nexport function processDataForEncryption(\n ctx: EncryptionContext,\n data: Record<string, unknown> | Record<string, unknown>[],\n): Record<string, unknown> | Record<string, unknown>[] {\n if (!ctx.crypto || ctx.encryptedFields.size === 0) {\n return data;\n }\n\n if (Array.isArray(data)) {\n return data.map((row) => encryptRow(ctx, row));\n }\n return encryptRow(ctx, data);\n}\n\n/**\n * Encrypt a single row\n */\nexport function encryptRow(\n ctx: EncryptionContext,\n row: Record<string, unknown>,\n): Record<string, unknown> {\n if (!ctx.crypto) {\n return row;\n }\n\n const encryptedRow = { ...row };\n for (const field of ctx.encryptedFields) {\n if (field in encryptedRow) {\n encryptedRow[field] = ctx.crypto.encryptField(encryptedRow[field]);\n }\n }\n return encryptedRow;\n}\n\n/**\n * Process query results for decryption\n */\nexport async function processResultsForDecryption<T>(\n ctx: EncryptionContext,\n result: QueryResult<T>,\n): Promise<QueryResult<T>> {\n if (!ctx.crypto || ctx.decryptedFields.size === 0) {\n return result;\n }\n\n const decryptedRows = result.rows.map((row) => {\n const decryptedRow = { ...row } as Record<string, unknown>;\n for (const field of ctx.decryptedFields) {\n if (field in decryptedRow && decryptedRow[field]) {\n try {\n const value = decryptedRow[field];\n if (typeof value === 'string') {\n decryptedRow[field] = ctx.crypto!.decryptField(value);\n }\n } catch {\n // If decryption fails, leave the value as is\n }\n }\n }\n return decryptedRow as T;\n });\n\n return {\n ...result,\n rows: decryptedRows,\n };\n}\n","import type { DatabaseAdapter } from '../interfaces';\nimport type { Logger } from '../types';\n\nexport interface HealthCheckResult {\n status: 'healthy' | 'degraded' | 'unhealthy';\n latency: number;\n timestamp: Date;\n details: {\n connectionPool?: {\n total: number;\n active: number;\n idle: number;\n waiting: number;\n };\n lastError?: string;\n uptime?: number;\n version?: string;\n };\n}\n\nexport interface HealthCheckOptions {\n interval?: number;\n timeout?: number;\n retries?: number;\n onHealthChange?: (result: HealthCheckResult) => void;\n logger?: Logger;\n}\n\nexport class HealthChecker {\n private adapter: DatabaseAdapter;\n private options: Required<HealthCheckOptions>;\n private intervalId?: NodeJS.Timeout;\n private lastResult?: HealthCheckResult;\n private startTime: Date;\n private consecutiveFailures = 0;\n\n constructor(adapter: DatabaseAdapter, options: HealthCheckOptions = {}) {\n this.adapter = adapter;\n this.startTime = new Date();\n this.options = {\n interval: options.interval ?? 30_000, // 30 seconds\n timeout: options.timeout ?? 5000, // 5 seconds\n retries: options.retries ?? 3,\n onHealthChange: options.onHealthChange ?? (() => {}),\n logger: options.logger ?? console,\n };\n }\n\n async check(): Promise<HealthCheckResult> {\n const start = Date.now();\n\n try {\n // Basic ping test\n const isHealthy = await Promise.race([\n this.adapter.ping(),\n new Promise<boolean>((_, reject) =>\n setTimeout(() => reject(new Error('Health check timeout')), this.options.timeout),\n ),\n ]);\n\n if (!isHealthy) {\n throw new Error('Ping failed');\n }\n\n // Get pool stats\n const poolStats = this.adapter.getPoolStats();\n\n // Determine health status\n let status: HealthCheckResult['status'] = 'healthy';\n\n if (poolStats.waiting > 0 || poolStats.active / poolStats.total > 0.8) {\n status = 'degraded';\n }\n\n if (!this.adapter.isConnected || poolStats.active === poolStats.total) {\n status = 'unhealthy';\n }\n\n const result: HealthCheckResult = {\n status,\n latency: Date.now() - start,\n timestamp: new Date(),\n details: {\n connectionPool: poolStats,\n uptime: Date.now() - this.startTime.getTime(),\n version: this.adapter.version,\n },\n };\n\n // Reset failure counter on success\n if (status === 'healthy') {\n this.consecutiveFailures = 0;\n }\n\n // Notify if health changed\n if (this.lastResult?.status !== result.status) {\n this.options.onHealthChange(result);\n this.options.logger.info(\n `Health status changed: ${this.lastResult?.status} -> ${result.status}`,\n );\n }\n\n this.lastResult = result;\n return result;\n } catch (error) {\n this.consecutiveFailures++;\n\n const result: HealthCheckResult = {\n status: 'unhealthy',\n latency: Date.now() - start,\n timestamp: new Date(),\n details: {\n lastError: (error as Error).message,\n uptime: Date.now() - this.startTime.getTime(),\n },\n };\n\n if (this.lastResult?.status !== 'unhealthy') {\n this.options.onHealthChange(result);\n this.options.logger.error('Health check failed', error);\n }\n\n this.lastResult = result;\n return result;\n }\n }\n\n start(): void {\n if (this.intervalId) {\n return;\n }\n\n // Initial check\n this.check().catch((error) => {\n this.options.logger.error('Initial health check failed', error);\n });\n\n // Schedule periodic checks\n this.intervalId = setInterval(() => {\n this.check().catch((error) => {\n this.options.logger.error('Periodic health check failed', error);\n });\n }, this.options.interval);\n\n this.options.logger.info('Health checker started', {\n interval: this.options.interval,\n timeout: this.options.timeout,\n });\n }\n\n stop(): void {\n if (this.intervalId) {\n clearInterval(this.intervalId);\n this.intervalId = undefined;\n this.options.logger.info('Health checker stopped');\n }\n }\n\n getLastResult(): HealthCheckResult | undefined {\n return this.lastResult;\n }\n\n isHealthy(): boolean {\n return this.lastResult?.status === 'healthy';\n }\n\n getUptime(): number {\n return Date.now() - this.startTime.getTime();\n }\n\n getConsecutiveFailures(): number {\n return this.consecutiveFailures;\n }\n\n async waitForHealthy(maxWaitTime = 60_000): Promise<void> {\n const startTime = Date.now();\n\n while (Date.now() - startTime < maxWaitTime) {\n const result = await this.check();\n\n if (result.status === 'healthy') {\n return;\n }\n\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n\n throw new Error(`Health check did not become healthy within ${maxWaitTime}ms`);\n }\n}\n","import { EventEmitter } from 'eventemitter3';\n\nexport interface QueryMetrics {\n totalQueries: number;\n successfulQueries: number;\n failedQueries: number;\n averageLatency: number;\n minLatency: number;\n maxLatency: number;\n queriesPerSecond: number;\n cacheHitRate: number;\n slowQueries: number;\n queryDistribution: Record<string, number>; // SELECT, INSERT, UPDATE, DELETE, etc.\n}\n\nexport interface ConnectionMetrics {\n totalConnections: number;\n activeConnections: number;\n idleConnections: number;\n connectionErrors: number;\n averageConnectionTime: number;\n connectionReuse: number;\n}\n\nexport interface TransactionMetrics {\n totalTransactions: number;\n committedTransactions: number;\n rolledBackTransactions: number;\n averageTransactionDuration: number;\n activeTransactions: number;\n deadlocks: number;\n}\n\nexport interface SystemMetrics {\n memoryUsage: NodeJS.MemoryUsage;\n cpuUsage: NodeJS.CpuUsage;\n uptime: number;\n timestamp: Date;\n}\n\nexport interface MetricsSnapshot {\n query: QueryMetrics;\n connection: ConnectionMetrics;\n transaction: TransactionMetrics;\n system: SystemMetrics;\n custom: Record<string, unknown>;\n}\n\nexport class MetricsCollector extends EventEmitter {\n private queryMetrics: QueryMetrics;\n private connectionMetrics: ConnectionMetrics;\n private transactionMetrics: TransactionMetrics;\n private queryLatencies: number[] = [];\n private connectionTimes: number[] = [];\n private transactionDurations: number[] = [];\n private startTime: Date;\n private slowQueryThreshold: number;\n private customMetrics: Record<string, unknown> = {};\n private interval?: NodeJS.Timeout;\n\n constructor(options: { slowQueryThreshold?: number; collectionInterval?: number } = {}) {\n super();\n this.startTime = new Date();\n this.slowQueryThreshold = options.slowQueryThreshold ?? 1000; // 1 second\n\n this.queryMetrics = this.createEmptyQueryMetrics();\n this.connectionMetrics = this.createEmptyConnectionMetrics();\n this.transactionMetrics = this.createEmptyTransactionMetrics();\n\n if (options.collectionInterval) {\n this.startCollection(options.collectionInterval);\n }\n }\n\n private createEmptyQueryMetrics(): QueryMetrics {\n return {\n totalQueries: 0,\n successfulQueries: 0,\n failedQueries: 0,\n averageLatency: 0,\n minLatency: Number.POSITIVE_INFINITY,\n maxLatency: 0,\n queriesPerSecond: 0,\n cacheHitRate: 0,\n slowQueries: 0,\n queryDistribution: {},\n };\n }\n\n private createEmptyConnectionMetrics(): ConnectionMetrics {\n return {\n totalConnections: 0,\n activeConnections: 0,\n idleConnections: 0,\n connectionErrors: 0,\n averageConnectionTime: 0,\n connectionReuse: 0,\n };\n }\n\n private createEmptyTransactionMetrics(): TransactionMetrics {\n return {\n totalTransactions: 0,\n committedTransactions: 0,\n rolledBackTransactions: 0,\n averageTransactionDuration: 0,\n activeTransactions: 0,\n deadlocks: 0,\n };\n }\n\n recordQuery(command: string, latency: number, success: boolean, cacheHit = false): void {\n this.queryMetrics.totalQueries++;\n\n if (success) {\n this.queryMetrics.successfulQueries++;\n } else {\n this.queryMetrics.failedQueries++;\n }\n\n // Update latency metrics\n this.queryLatencies.push(latency);\n if (this.queryLatencies.length > 1000) {\n this.queryLatencies.shift(); // Keep only last 1000 queries\n }\n\n this.queryMetrics.minLatency = Math.min(this.queryMetrics.minLatency, latency);\n this.queryMetrics.maxLatency = Math.max(this.queryMetrics.maxLatency, latency);\n this.queryMetrics.averageLatency = this.calculateAverage(this.queryLatencies);\n\n // Track slow queries\n if (latency > this.slowQueryThreshold) {\n this.queryMetrics.slowQueries++;\n this.emit('slowQuery', { command, latency });\n }\n\n // Update query distribution\n const queryType = command.toUpperCase();\n this.queryMetrics.queryDistribution[queryType] =\n (this.queryMetrics.queryDistribution[queryType] || 0) + 1;\n\n // Update QPS\n const elapsedSeconds = (Date.now() - this.startTime.getTime()) / 1000;\n this.queryMetrics.queriesPerSecond = this.queryMetrics.totalQueries / elapsedSeconds;\n\n // Update cache hit rate\n if (cacheHit) {\n const cacheHits = (this.customMetrics['cacheHits'] as number) || 0;\n this.customMetrics['cacheHits'] = cacheHits + 1;\n }\n const cacheHits = (this.customMetrics['cacheHits'] as number) || 0;\n this.queryMetrics.cacheHitRate =\n this.queryMetrics.totalQueries > 0 ? cacheHits / this.queryMetrics.totalQueries : 0;\n }\n\n recordConnection(connected: boolean, connectionTime?: number): void {\n this.connectionMetrics.totalConnections++;\n\n if (connected) {\n this.connectionMetrics.activeConnections++;\n\n if (connectionTime) {\n this.connectionTimes.push(connectionTime);\n if (this.connectionTimes.length > 100) {\n this.connectionTimes.shift();\n }\n this.connectionMetrics.averageConnectionTime = this.calculateAverage(this.connectionTimes);\n }\n } else {\n this.connectionMetrics.connectionErrors++;\n }\n }\n\n recordTransaction(\n action: 'start' | 'commit' | 'rollback',\n duration?: number,\n isDeadlock = false,\n ): void {\n switch (action) {\n case 'start': {\n this.transactionMetrics.totalTransactions++;\n this.transactionMetrics.activeTransactions++;\n break;\n }\n\n case 'commit': {\n this.transactionMetrics.committedTransactions++;\n this.transactionMetrics.activeTransactions = Math.max(\n 0,\n this.transactionMetrics.activeTransactions - 1,\n );\n break;\n }\n\n case 'rollback': {\n this.transactionMetrics.rolledBackTransactions++;\n this.transactionMetrics.activeTransactions = Math.max(\n 0,\n this.transactionMetrics.activeTransactions - 1,\n );\n\n if (isDeadlock) {\n this.transactionMetrics.deadlocks++;\n this.emit('deadlock');\n }\n break;\n }\n }\n\n if (duration) {\n this.transactionDurations.push(duration);\n if (this.transactionDurations.length > 100) {\n this.transactionDurations.shift();\n }\n this.transactionMetrics.averageTransactionDuration = this.calculateAverage(\n this.transactionDurations,\n );\n }\n }\n\n updateConnectionPool(stats: { total: number; active: number; idle: number }): void {\n this.connectionMetrics.activeConnections = stats.active;\n this.connectionMetrics.idleConnections = stats.idle;\n this.connectionMetrics.connectionReuse =\n stats.total > 0 ? this.queryMetrics.totalQueries / stats.total : 0;\n }\n\n setCustomMetric(key: string, value: unknown): void {\n this.customMetrics[key] = value;\n }\n\n incrementCustomMetric(key: string, value = 1): void {\n const current = (this.customMetrics[key] as number) || 0;\n this.customMetrics[key] = current + value;\n }\n\n getSnapshot(): MetricsSnapshot {\n return {\n query: { ...this.queryMetrics },\n connection: { ...this.connectionMetrics },\n transaction: { ...this.transactionMetrics },\n system: {\n memoryUsage: process.memoryUsage(),\n cpuUsage: process.cpuUsage(),\n uptime: process.uptime(),\n timestamp: new Date(),\n },\n custom: { ...this.customMetrics },\n };\n }\n\n reset(): void {\n this.queryMetrics = this.createEmptyQueryMetrics();\n this.connectionMetrics = this.createEmptyConnectionMetrics();\n this.transactionMetrics = this.createEmptyTransactionMetrics();\n this.queryLatencies = [];\n this.connectionTimes = [];\n this.transactionDurations = [];\n this.customMetrics = {};\n this.startTime = new Date();\n }\n\n private calculateAverage(values: number[]): number {\n if (values.length === 0) {\n return 0;\n }\n const sum = values.reduce((acc, val) => acc + val, 0);\n return sum / values.length;\n }\n\n private startCollection(interval: number): void {\n this.interval = setInterval(() => {\n const snapshot = this.getSnapshot();\n this.emit('metrics', snapshot);\n }, interval);\n }\n\n stop(): void {\n if (this.interval) {\n clearInterval(this.interval);\n this.interval = undefined;\n }\n }\n\n // Prometheus-style metrics export\n exportPrometheus(): string {\n const metrics = this.getSnapshot();\n const lines: string[] = [];\n\n // Query metrics\n lines.push(\n `# HELP db_queries_total Total number of queries executed`,\n `# TYPE db_queries_total counter`,\n `db_queries_total ${metrics.query.totalQueries}`,\n `# HELP db_query_duration_seconds Query execution duration in seconds`,\n `# TYPE db_query_duration_seconds summary`,\n `db_query_duration_seconds{quantile=\"0.5\"} ${metrics.query.averageLatency / 1000}`,\n `db_query_duration_seconds{quantile=\"0.99\"} ${metrics.query.maxLatency / 1000}`,\n `db_query_duration_seconds_sum ${(metrics.query.averageLatency * metrics.query.totalQueries) / 1000}`,\n `db_query_duration_seconds_count ${metrics.query.totalQueries}`,\n `# HELP db_connections_active Number of active database connections`,\n `# TYPE db_connections_active gauge`,\n `db_connections_active ${metrics.connection.activeConnections}`,\n `# HELP db_transactions_total Total number of transactions`,\n `# TYPE db_transactions_total counter`,\n `db_transactions_total{status=\"committed\"} ${metrics.transaction.committedTransactions}`,\n `db_transactions_total{status=\"rolled_back\"} ${metrics.transaction.rolledBackTransactions}`,\n `# HELP nodejs_heap_size_total_bytes Process heap size in bytes`,\n `# TYPE nodejs_heap_size_total_bytes gauge`,\n );\n lines.push(`nodejs_heap_size_total_bytes ${metrics.system.memoryUsage.heapTotal}`);\n\n return lines.join('\\n');\n }\n}\n","import { QueryError } from '../errors';\n\nimport type { DatabaseAdapter } from '../interfaces';\nimport type { Logger } from '../types';\n\nexport interface Migration {\n id: string;\n version: number;\n name: string;\n up: (adapter: DatabaseAdapter) => Promise<void>;\n down: (adapter: DatabaseAdapter) => Promise<void>;\n timestamp: Date;\n}\n\nexport interface MigrationHistory {\n id: string;\n version: number;\n name: string;\n executedAt: Date;\n duration: number;\n checksum: string;\n}\n\nexport interface MigrationRunnerOptions {\n tableName?: string;\n logger?: Logger;\n validateChecksums?: boolean;\n dryRun?: boolean;\n}\n\nexport class MigrationRunner {\n private adapter: DatabaseAdapter;\n private migrations: Migration[] = [];\n private options: Required<MigrationRunnerOptions>;\n\n constructor(adapter: DatabaseAdapter, options: MigrationRunnerOptions = {}) {\n this.adapter = adapter;\n this.options = {\n tableName: options.tableName ?? 'db_migrations',\n logger: options.logger ?? console,\n validateChecksums: options.validateChecksums ?? true,\n dryRun: options.dryRun ?? false,\n };\n }\n\n async initialize(): Promise<void> {\n if (this.options.dryRun) {\n this.options.logger.info('DRY RUN: Would create migrations table');\n return;\n }\n\n const sql = `\n CREATE TABLE IF NOT EXISTS ${this.options.tableName} (\n id VARCHAR(255) PRIMARY KEY,\n version INT NOT NULL,\n name VARCHAR(255) NOT NULL,\n executed_at TIMESTAMP NOT NULL,\n duration INT NOT NULL,\n checksum VARCHAR(64) NOT NULL,\n INDEX idx_version (version),\n INDEX idx_executed_at (executed_at)\n )\n `;\n\n try {\n await this.adapter.execute(sql);\n this.options.logger.info(`Migrations table '${this.options.tableName}' ready`);\n } catch (error) {\n throw new QueryError(`Failed to create migrations table: ${(error as Error).message}`);\n }\n }\n\n addMigration(migration: Migration): void {\n // Check for duplicate versions\n const existing = this.migrations.find((m) => m.version === migration.version);\n if (existing) {\n throw new Error(\n `Migration version ${migration.version} already exists: ${existing.name} and ${migration.name}`,\n );\n }\n\n this.migrations.push(migration);\n this.migrations.sort((a, b) => a.version - b.version);\n }\n\n addMigrations(migrations: Migration[]): void {\n migrations.forEach((migration) => this.addMigration(migration));\n }\n\n async getExecutedMigrations(): Promise<MigrationHistory[]> {\n const result = await this.adapter.query<MigrationHistory>(\n `SELECT * FROM ${this.options.tableName} ORDER BY version ASC`,\n );\n\n return result.rows.map((row) => ({\n ...row,\n executedAt: new Date(row.executedAt),\n }));\n }\n\n async getPendingMigrations(): Promise<Migration[]> {\n const executed = await this.getExecutedMigrations();\n const executedVersions = new Set(executed.map((m) => m.version));\n\n return this.migrations.filter((m) => !executedVersions.has(m.version));\n }\n\n private calculateChecksum(migration: Migration): string {\n const crypto = require('node:crypto');\n const content = `${migration.id}:${migration.version}:${migration.name}:${migration.up.toString()}:${migration.down.toString()}`;\n return crypto.createHash('sha256').update(content).digest('hex');\n }\n\n async up(targetVersion?: number): Promise<void> {\n await this.initialize();\n\n const pending = await this.getPendingMigrations();\n const toRun = targetVersion ? pending.filter((m) => m.version <= targetVersion) : pending;\n\n if (toRun.length === 0) {\n this.options.logger.info('No pending migrations to run');\n return;\n }\n\n this.options.logger.info(`Found ${toRun.length} pending migrations`);\n\n for (const migration of toRun) {\n await this.runMigration(migration, 'up');\n }\n }\n\n async down(targetVersion: number): Promise<void> {\n await this.initialize();\n\n const executed = await this.getExecutedMigrations();\n const toRevert = executed.filter((m) => m.version > targetVersion).reverse(); // Revert in reverse order\n\n if (toRevert.length === 0) {\n this.options.logger.info('No migrations to revert');\n return;\n }\n\n this.options.logger.info(`Found ${toRevert.length} migrations to revert`);\n\n for (const history of toRevert) {\n const migration = this.migrations.find((m) => m.version === history.version);\n if (!migration) {\n throw new Error(`Migration ${history.version} not found in codebase`);\n }\n\n await this.runMigration(migration, 'down');\n }\n }\n\n async latest(): Promise<void> {\n await this.up();\n }\n\n async rollback(steps = 1): Promise<void> {\n const executed = await this.getExecutedMigrations();\n\n if (executed.length === 0) {\n this.options.logger.info('No migrations to rollback');\n return;\n }\n\n const targetIndex = Math.max(0, executed.length - steps - 1);\n const targetVersion = targetIndex >= 0 ? executed[targetIndex]!.version : 0;\n\n await this.down(targetVersion);\n }\n\n async reset(): Promise<void> {\n await this.down(0);\n }\n\n async refresh(): Promise<void> {\n await this.reset();\n await this.latest();\n }\n\n private async runMigration(migration: Migration, direction: 'up' | 'down'): Promise<void> {\n const start = Date.now();\n const checksum = this.calculateChecksum(migration);\n\n this.options.logger.info(\n `${direction === 'up' ? 'Running' : 'Reverting'} migration ${migration.version}: ${migration.name}`,\n );\n\n if (this.options.dryRun) {\n this.options.logger.info(`DRY RUN: Would ${direction} migration ${migration.version}`);\n return;\n }\n\n const transaction = await this.adapter.beginTransaction();\n\n try {\n // Validate checksum if going down\n if (direction === 'down' && this.options.validateChecksums) {\n const history = await this.adapter.query<MigrationHistory>(\n `SELECT checksum FROM ${this.options.tableName} WHERE version = ?`,\n [migration.version],\n );\n\n if (history.rows[0]?.checksum !== checksum) {\n throw new Error(\n `Checksum mismatch for migration ${migration.version}. The migration may have been modified.`,\n );\n }\n }\n\n // Run the migration\n await migration[direction](this.adapter);\n\n // Update history\n if (direction === 'up') {\n await this.adapter.execute(\n `INSERT INTO ${this.options.tableName} (id, version, name, executed_at, duration, checksum) VALUES (?, ?, ?, ?, ?, ?)`,\n [\n migration.id,\n migration.version,\n migration.name,\n new Date(),\n Date.now() - start,\n checksum,\n ],\n { transaction },\n );\n } else {\n await this.adapter.execute(\n `DELETE FROM ${this.options.tableName} WHERE version = ?`,\n [migration.version],\n { transaction },\n );\n }\n\n await transaction.commit();\n\n this.options.logger.info(\n `${direction === 'up' ? 'Completed' : 'Reverted'} migration ${migration.version} in ${Date.now() - start}ms`,\n );\n } catch (error) {\n await transaction.rollback();\n\n const action = direction === 'up' ? 'run' : 'revert';\n throw new Error(\n `Failed to ${action} migration ${migration.version}: ${(error as Error).message}`,\n );\n }\n }\n\n async status(): Promise<{\n executed: MigrationHistory[];\n pending: Migration[];\n current: number | null;\n }> {\n const executed = await this.getExecutedMigrations();\n const pending = await this.getPendingMigrations();\n const current = executed.length > 0 ? executed.at(-1)!.version : null;\n\n return { executed, pending, current };\n }\n\n async validate(): Promise<{ valid: boolean; errors: string[] }> {\n const errors: string[] = [];\n\n // Check for duplicate versions\n const versions = new Set<number>();\n for (const migration of this.migrations) {\n if (versions.has(migration.version)) {\n errors.push(`Duplicate migration version: ${migration.version}`);\n }\n versions.add(migration.version);\n }\n\n // Check for gaps in versions\n const sortedVersions = Array.from(versions).sort((a, b) => a - b);\n for (let i = 1; i < sortedVersions.length; i++) {\n if (sortedVersions[i]! - sortedVersions[i - 1]! > 1) {\n errors.push(\n `Gap in migration versions between ${sortedVersions[i - 1]} and ${sortedVersions[i]}`,\n );\n }\n }\n\n // Validate checksums of executed migrations\n if (this.options.validateChecksums) {\n const executed = await this.getExecutedMigrations();\n\n for (const history of executed) {\n const migration = this.migrations.find((m) => m.version === history.version);\n\n if (!migration) {\n errors.push(`Migration ${history.version} exists in history but not in codebase`);\n continue;\n }\n\n const currentChecksum = this.calculateChecksum(migration);\n if (currentChecksum !== history.checksum) {\n errors.push(\n `Checksum mismatch for migration ${history.version}: ${history.name}. The migration has been modified after execution.`,\n );\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n }\n}\n","import { EventEmitter } from 'eventemitter3';\n\nimport type { DatabaseAdapter } from '../interfaces';\nimport type { QueryOptions, QueryResult, QueryParams } from '../types';\n\nexport interface PerformanceTrace {\n id: string;\n operation: string;\n startTime: number;\n endTime?: number;\n duration?: number;\n metadata: Record<string, unknown>;\n status: 'started' | 'completed' | 'failed';\n error?: Error;\n parent?: string;\n children: string[];\n}\n\nexport interface QueryPlan {\n query: string;\n plan: string;\n cost: number;\n rows: number;\n width: number;\n actualTime?: number;\n actualRows?: number;\n}\n\nexport interface PerformanceReport {\n slowQueries: Array<{\n query: string;\n duration: number;\n timestamp: Date;\n params?: unknown[];\n }>;\n queryPlans: QueryPlan[];\n bottlenecks: Array<{\n operation: string;\n averageDuration: number;\n count: number;\n impact: number; // percentage of total time\n }>;\n recommendations: string[];\n}\n\nexport class PerformanceMonitor extends EventEmitter {\n private traces: Map<string, PerformanceTrace> = new Map();\n private slowQueries: Array<{\n query: string;\n duration: number;\n timestamp: Date;\n params?: unknown[];\n }> = [];\n private queryPlans: Map<string, QueryPlan> = new Map();\n private slowQueryThreshold: number;\n private maxTraces: number;\n private adapter: DatabaseAdapter;\n private enabled: boolean;\n\n constructor(\n adapter: DatabaseAdapter,\n options: {\n slowQueryThreshold?: number;\n maxTraces?: number;\n enabled?: boolean;\n } = {},\n ) {\n super();\n this.adapter = adapter;\n this.slowQueryThreshold = options.slowQueryThreshold ?? 1000; // 1 second\n this.maxTraces = options.maxTraces ?? 10_000;\n this.enabled = options.enabled ?? true;\n }\n\n startTrace(operation: string, metadata: Record<string, unknown> = {}, parent?: string): string {\n if (!this.enabled) {\n return '';\n }\n\n const id = this.generateTraceId();\n const trace: PerformanceTrace = {\n id,\n operation,\n startTime: performance.now(),\n metadata,\n status: 'started',\n parent,\n children: [],\n };\n\n this.traces.set(id, trace);\n\n // Add to parent's children if exists\n if (parent) {\n const parentTrace = this.traces.get(parent);\n if (parentTrace) {\n parentTrace.children.push(id);\n }\n }\n\n // Clean up old traces if needed\n if (this.traces.size > this.maxTraces) {\n const oldestTraces = Array.from(this.traces.entries())\n .sort(([, a], [, b]) => a.startTime - b.startTime)\n .slice(0, Math.floor(this.maxTraces * 0.1));\n\n oldestTraces.forEach(([id]) => this.traces.delete(id));\n }\n\n this.emit('traceStart', trace);\n return id;\n }\n\n endTrace(id: string, error?: Error): void {\n if (!this.enabled || !id) {\n return;\n }\n\n const trace = this.traces.get(id);\n if (!trace) {\n return;\n }\n\n trace.endTime = performance.now();\n trace.duration = trace.endTime - trace.startTime;\n trace.status = error ? 'failed' : 'completed';\n trace.error = error;\n\n // Check for slow operations\n if (trace.duration > this.slowQueryThreshold && trace.operation.includes('query')) {\n const queryInfo = {\n query: (trace.metadata['sql'] as string) || '',\n duration: trace.duration,\n timestamp: new Date(),\n params: trace.metadata['params'] as unknown[],\n };\n\n this.slowQueries.push(queryInfo);\n this.emit('slowQuery', queryInfo);\n\n // Keep only recent slow queries\n if (this.slowQueries.length > 100) {\n this.slowQueries = this.slowQueries.slice(-100);\n }\n }\n\n this.emit('traceEnd', trace);\n }\n\n async explainQuery(sql: string, params?: QueryParams): Promise<QueryPlan | null> {\n if (!this.enabled) {\n return null;\n }\n\n try {\n let explainSql: string;\n\n // Database-specific EXPLAIN syntax\n if (this.adapter.name === 'PostgreSQL') {\n explainSql = `EXPLAIN (ANALYZE, BUFFERS, FORMAT JSON) ${sql}`;\n } else if (this.adapter.name === 'MySQL') {\n explainSql = `EXPLAIN FORMAT=JSON ${sql}`;\n } else {\n return null;\n }\n\n const result = await this.adapter.query(explainSql, params);\n\n if (result.rows.length > 0) {\n const plan = this.parseExplainResult(result.rows[0] as Record<string, unknown>);\n if (plan) {\n this.queryPlans.set(sql, plan);\n return plan;\n }\n }\n } catch (error) {\n // Ignore explain errors\n this.emit('explainError', { sql, error });\n }\n\n return null;\n }\n\n private parseExplainResult(result: Record<string, unknown>): QueryPlan | null {\n try {\n if (this.adapter.name === 'PostgreSQL') {\n const planData = (result['QUERY PLAN'] as any[]) || result;\n const plan = Array.isArray(planData) ? planData[0] : planData;\n\n return {\n query: plan.Query || '',\n plan: JSON.stringify(plan.Plan || plan),\n cost: plan.Plan?.['Total Cost'] || 0,\n rows: plan.Plan?.['Plan Rows'] || 0,\n width: plan.Plan?.['Plan Width'] || 0,\n actualTime: plan.Plan?.['Actual Total Time'] || 0,\n actualRows: plan.Plan?.['Actual Rows'] || 0,\n };\n } else if (this.adapter.name === 'MySQL') {\n const plan = typeof result === 'string' ? JSON.parse(result as string) : result;\n const queryBlock = plan.query_block || {};\n\n return {\n query: '',\n plan: JSON.stringify(plan),\n cost: queryBlock.cost_info?.query_cost || 0,\n rows: queryBlock.table?.rows_examined_per_scan || 0,\n width: 0,\n };\n }\n } catch {\n // Failed to parse\n }\n\n return null;\n }\n\n async analyzePerformance(duration: number = 3_600_000): Promise<PerformanceReport> {\n const now = performance.now();\n const cutoff = now - duration;\n\n // Get recent traces\n const recentTraces = Array.from(this.traces.values()).filter(\n (trace) => trace.startTime > cutoff && trace.status === 'completed',\n );\n\n // Group by operation\n const operationStats = new Map<string, { totalTime: number; count: number }>();\n let totalTime = 0;\n\n recentTraces.forEach((trace) => {\n const stats = operationStats.get(trace.operation) || { totalTime: 0, count: 0 };\n stats.totalTime += trace.duration || 0;\n stats.count += 1;\n operationStats.set(trace.operation, stats);\n totalTime += trace.duration || 0;\n });\n\n // Identify bottlenecks\n const bottlenecks = Array.from(operationStats.entries())\n .map(([operation, stats]) => ({\n operation,\n averageDuration: stats.totalTime / stats.count,\n count: stats.count,\n impact: (stats.totalTime / totalTime) * 100,\n }))\n .sort((a, b) => b.impact - a.impact)\n .slice(0, 10);\n\n // Generate recommendations\n const recommendations: string[] = [];\n\n // Check for missing indexes\n const slowSelects = this.slowQueries.filter(\n (q) => q.query.toUpperCase().includes('SELECT') && q.duration > 2000,\n );\n if (slowSelects.length > 5) {\n recommendations.push('Consider adding indexes. Multiple slow SELECT queries detected.');\n }\n\n // Check for N+1 queries\n const queryGroups = new Map<string, number>();\n this.slowQueries.forEach((q) => {\n const normalized = q.query.replaceAll(/\\d+/g, '?').replaceAll(/\\s+/g, ' ');\n queryGroups.set(normalized, (queryGroups.get(normalized) || 0) + 1);\n });\n\n const repetitiveQueries = Array.from(queryGroups.entries()).filter(([, count]) => count > 10);\n\n if (repetitiveQueries.length > 0) {\n recommendations.push(\n 'Possible N+1 query problem detected. Consider using JOINs or batch loading.',\n );\n }\n\n // Check connection pool usage\n const poolStats = this.adapter.getPoolStats();\n if (poolStats.waiting > 0) {\n recommendations.push(\n `Connection pool exhaustion detected. Consider increasing pool size (current: ${poolStats.total}).`,\n );\n }\n\n // Check for long transactions\n const longTransactions = recentTraces.filter(\n (t) => t.operation.includes('transaction') && (t.duration || 0) > 5000,\n );\n if (longTransactions.length > 0) {\n recommendations.push(\n 'Long-running transactions detected. Consider breaking them into smaller units.',\n );\n }\n\n return {\n slowQueries: this.slowQueries.slice(-20),\n queryPlans: Array.from(this.queryPlans.values()),\n bottlenecks,\n recommendations,\n };\n }\n\n wrapAdapter(adapter: DatabaseAdapter): DatabaseAdapter {\n const originalQuery = adapter.query.bind(adapter);\n\n adapter.query = async <T = unknown>(\n sql: string,\n params?: QueryParams,\n options?: QueryOptions,\n ): Promise<QueryResult<T>> => {\n const traceId = this.startTrace('query', { sql, params });\n\n try {\n const result = await originalQuery<T>(sql, params, options);\n this.endTrace(traceId);\n\n // Analyze slow queries\n const trace = this.traces.get(traceId);\n if (trace?.duration && trace.duration > this.slowQueryThreshold) {\n this.explainQuery(sql, params).catch(() => {\n // Ignore explain errors\n });\n }\n\n return result;\n } catch (error) {\n this.endTrace(traceId, error as Error);\n throw error;\n }\n };\n\n return adapter;\n }\n\n reset(): void {\n this.traces.clear();\n this.slowQueries = [];\n this.queryPlans.clear();\n }\n\n enable(): void {\n this.enabled = true;\n }\n\n disable(): void {\n this.enabled = false;\n }\n\n isEnabled(): boolean {\n return this.enabled;\n }\n\n private generateTraceId(): string {\n return `trace_${Date.now()}_${Math.random().toString(36).slice(2, 11)}`;\n }\n\n getTraces(filter?: {\n operation?: string;\n status?: PerformanceTrace['status'];\n minDuration?: number;\n parent?: string;\n }): PerformanceTrace[] {\n let traces = Array.from(this.traces.values());\n\n if (filter) {\n if (filter.operation) {\n traces = traces.filter((t) => t.operation.includes(filter.operation!));\n }\n if (filter.status) {\n traces = traces.filter((t) => t.status === filter.status);\n }\n if (filter.minDuration !== undefined) {\n traces = traces.filter((t) => (t.duration || 0) >= filter.minDuration!);\n }\n if (filter.parent !== undefined) {\n traces = traces.filter((t) => t.parent === filter.parent);\n }\n }\n\n return traces.sort((a, b) => b.startTime - a.startTime);\n }\n\n getSlowQueries(limit = 20): typeof this.slowQueries {\n return this.slowQueries.slice(-limit);\n }\n\n exportTraces(): string {\n const traces = Array.from(this.traces.values());\n return JSON.stringify(traces, null, 2);\n }\n\n importTraces(data: string): void {\n try {\n const traces = JSON.parse(data) as PerformanceTrace[];\n traces.forEach((trace) => {\n this.traces.set(trace.id, trace);\n });\n } catch (error) {\n throw new Error(`Failed to import traces: ${(error as Error).message}`);\n }\n }\n}\n","import { EventEmitter } from 'eventemitter3';\n\nexport interface PerformanceTrace {\n id: string;\n operation: string;\n startTime: number;\n endTime?: number;\n duration?: number;\n metadata: Record<string, unknown>;\n status: 'started' | 'completed' | 'failed';\n error?: Error;\n parent?: string;\n children: string[];\n}\n\nexport class TraceBaseTrait extends EventEmitter {\n protected traces = new Map<string, PerformanceTrace>();\n protected enabled = true;\n protected maxTraces: number;\n\n constructor(maxTraces = 10_000, enabled = true) {\n super();\n this.maxTraces = maxTraces;\n this.enabled = enabled;\n }\n\n enable(): void {\n this.enabled = true;\n }\n\n disable(): void {\n this.enabled = false;\n }\n\n isEnabled(): boolean {\n return this.enabled;\n }\n\n protected generateTraceId(): string {\n return `trace_${Date.now()}_${Math.random().toString(36).slice(2, 11)}`;\n }\n\n getTraces(filter?: {\n operation?: string;\n status?: PerformanceTrace['status'];\n minDuration?: number;\n parent?: string;\n }): PerformanceTrace[] {\n let traces = Array.from(this.traces.values());\n\n if (filter) {\n if (filter.operation) {\n traces = traces.filter((t) => t.operation.includes(filter.operation!));\n }\n if (filter.status) {\n traces = traces.filter((t) => t.status === filter.status);\n }\n if (filter.minDuration !== undefined) {\n traces = traces.filter((t) => (t.duration || 0) >= filter.minDuration!);\n }\n if (filter.parent !== undefined) {\n traces = traces.filter((t) => t.parent === filter.parent);\n }\n }\n\n return traces.sort((a, b) => b.startTime - a.startTime);\n }\n\n exportTraces(): string {\n const traces = Array.from(this.traces.values());\n return JSON.stringify(traces, null, 2);\n }\n\n importTraces(data: string): void {\n try {\n const traces = JSON.parse(data) as PerformanceTrace[];\n traces.forEach((trace) => {\n this.traces.set(trace.id, trace);\n });\n } catch (error) {\n throw new Error(`Failed to import traces: ${(error as Error).message}`);\n }\n }\n\n reset(): void {\n this.traces.clear();\n }\n}\n","import { TraceBaseTrait } from './trace-base-trait';\n\nimport type { PerformanceTrace } from './trace-base-trait';\n\nexport class TraceManagementTrait extends TraceBaseTrait {\n startTrace(operation: string, metadata: Record<string, unknown> = {}, parent?: string): string {\n if (!this.enabled) {\n return '';\n }\n\n const id = this.generateTraceId();\n const trace: PerformanceTrace = {\n id,\n operation,\n startTime: performance.now(),\n metadata,\n status: 'started',\n parent,\n children: [],\n };\n\n this.traces.set(id, trace);\n\n // Add to parent's children if exists\n if (parent) {\n const parentTrace = this.traces.get(parent);\n if (parentTrace) {\n parentTrace.children.push(id);\n }\n }\n\n // Clean up old traces if needed\n if (this.traces.size > this.maxTraces) {\n this.cleanupOldTraces();\n }\n\n this.emit('traceStart', trace);\n return id;\n }\n\n endTrace(id: string, error?: Error): void {\n if (!this.enabled || !id) {\n return;\n }\n\n const trace = this.traces.get(id);\n if (!trace) {\n return;\n }\n\n trace.endTime = performance.now();\n trace.duration = trace.endTime - trace.startTime;\n trace.status = error ? 'failed' : 'completed';\n trace.error = error;\n\n this.emit('traceEnd', trace);\n }\n\n protected cleanupOldTraces(): void {\n const oldestTraces = Array.from(this.traces.entries())\n .sort(([, a], [, b]) => a.startTime - b.startTime)\n .slice(0, Math.floor(this.maxTraces * 0.1));\n\n oldestTraces.forEach(([id]) => this.traces.delete(id));\n }\n\n getTrace(id: string): PerformanceTrace | undefined {\n return this.traces.get(id);\n }\n\n getChildTraces(parentId: string): PerformanceTrace[] {\n const parent = this.traces.get(parentId);\n if (!parent) {\n return [];\n }\n\n return parent.children.map((id) => this.traces.get(id)).filter((trace) => trace !== undefined);\n }\n\n getTraceHierarchy(rootId: string): PerformanceTrace | null {\n const root = this.traces.get(rootId);\n if (!root) {\n return null;\n }\n\n const buildHierarchy = (trace: PerformanceTrace): PerformanceTrace => {\n const children = trace.children\n .map((id) => this.traces.get(id))\n .filter((child) => child !== undefined)\n .map((child) => buildHierarchy(child));\n\n return { ...trace, children: children as any };\n };\n\n return buildHierarchy(root);\n }\n}\n","import { TraceManagementTrait } from './trace-management-trait';\n\nimport type { DatabaseAdapter } from '../../interfaces';\nimport type { QueryParams } from '../../types';\n\nexport interface QueryPlan {\n query: string;\n plan: string;\n cost: number;\n rows: number;\n width: number;\n actualTime?: number;\n actualRows?: number;\n}\n\nexport class QueryAnalysisTrait extends TraceManagementTrait {\n protected adapter: DatabaseAdapter;\n protected slowQueryThreshold: number;\n protected slowQueries: Array<{\n query: string;\n duration: number;\n timestamp: Date;\n params?: unknown[];\n }> = [];\n protected queryPlans = new Map<string, QueryPlan>();\n\n constructor(\n adapter: DatabaseAdapter,\n slowQueryThreshold = 1000,\n maxTraces = 10_000,\n enabled = true,\n ) {\n super(maxTraces, enabled);\n this.adapter = adapter;\n this.slowQueryThreshold = slowQueryThreshold;\n }\n\n override endTrace(id: string, error?: Error): void {\n super.endTrace(id, error);\n\n const trace = this.traces.get(id);\n if (!trace?.duration) {\n return;\n }\n\n // Check for slow operations\n if (trace.duration > this.slowQueryThreshold && trace.operation.includes('query')) {\n const queryInfo = {\n query: (trace.metadata['sql'] as string) || '',\n duration: trace.duration,\n timestamp: new Date(),\n params: trace.metadata['params'] as unknown[],\n };\n\n this.slowQueries.push(queryInfo);\n this.emit('slowQuery', queryInfo);\n\n // Keep only recent slow queries\n if (this.slowQueries.length > 100) {\n this.slowQueries = this.slowQueries.slice(-100);\n }\n }\n }\n\n async explainQuery(sql: string, params?: QueryParams): Promise<QueryPlan | null> {\n if (!this.enabled) {\n return null;\n }\n\n try {\n let explainSql: string;\n\n // Database-specific EXPLAIN syntax\n if (this.adapter.name === 'PostgreSQL') {\n explainSql = `EXPLAIN (ANALYZE, BUFFERS, FORMAT JSON) ${sql}`;\n } else if (this.adapter.name === 'MySQL') {\n explainSql = `EXPLAIN FORMAT=JSON ${sql}`;\n } else {\n return null;\n }\n\n const result = await this.adapter.query(explainSql, params);\n\n if (result.rows.length > 0) {\n const plan = this.parseExplainResult(result.rows[0] as Record<string, unknown>);\n if (plan) {\n this.queryPlans.set(sql, plan);\n return plan;\n }\n }\n } catch (error) {\n this.emit('explainError', { sql, error });\n }\n\n return null;\n }\n\n protected parseExplainResult(result: Record<string, unknown>): QueryPlan | null {\n try {\n if (this.adapter.name === 'PostgreSQL') {\n const planData = (result['QUERY PLAN'] as any[]) || result;\n const plan = Array.isArray(planData) ? planData[0] : planData;\n\n return {\n query: plan.Query || '',\n plan: JSON.stringify(plan.Plan || plan),\n cost: plan.Plan?.['Total Cost'] || 0,\n rows: plan.Plan?.['Plan Rows'] || 0,\n width: plan.Plan?.['Plan Width'] || 0,\n actualTime: plan.Plan?.['Actual Total Time'] || 0,\n actualRows: plan.Plan?.['Actual Rows'] || 0,\n };\n } else if (this.adapter.name === 'MySQL') {\n const plan = typeof result === 'string' ? JSON.parse(result as string) : result;\n const queryBlock = plan.query_block || {};\n\n return {\n query: '',\n plan: JSON.stringify(plan),\n cost: queryBlock.cost_info?.query_cost || 0,\n rows: queryBlock.table?.rows_examined_per_scan || 0,\n width: 0,\n };\n }\n } catch {\n // Failed to parse\n }\n\n return null;\n }\n\n getSlowQueries(limit = 20): typeof this.slowQueries {\n return this.slowQueries.slice(-limit);\n }\n\n override reset(): void {\n super.reset();\n this.slowQueries = [];\n this.queryPlans.clear();\n }\n}\n","import { QueryAnalysisTrait } from './query-analysis-trait';\n\nexport interface PerformanceReport {\n slowQueries: Array<{\n query: string;\n duration: number;\n timestamp: Date;\n params?: unknown[];\n }>;\n queryPlans: any[];\n bottlenecks: Array<{\n operation: string;\n averageDuration: number;\n count: number;\n impact: number;\n }>;\n recommendations: string[];\n}\n\nexport class PerformanceAnalysisTrait extends QueryAnalysisTrait {\n async analyzePerformance(duration: number = 3_600_000): Promise<PerformanceReport> {\n const now = performance.now();\n const cutoff = now - duration;\n\n // Get recent traces\n const recentTraces = Array.from(this.traces.values()).filter(\n (trace) => trace.startTime > cutoff && trace.status === 'completed',\n );\n\n // Group by operation\n const operationStats = new Map<string, { totalTime: number; count: number }>();\n let totalTime = 0;\n\n recentTraces.forEach((trace) => {\n const stats = operationStats.get(trace.operation) || { totalTime: 0, count: 0 };\n stats.totalTime += trace.duration || 0;\n stats.count += 1;\n operationStats.set(trace.operation, stats);\n totalTime += trace.duration || 0;\n });\n\n // Identify bottlenecks\n const bottlenecks = Array.from(operationStats.entries())\n .map(([operation, stats]) => ({\n operation,\n averageDuration: stats.totalTime / stats.count,\n count: stats.count,\n impact: (stats.totalTime / totalTime) * 100,\n }))\n .sort((a, b) => b.impact - a.impact)\n .slice(0, 10);\n\n // Generate recommendations\n const recommendations = this.generateRecommendations(recentTraces);\n\n return {\n slowQueries: this.slowQueries.slice(-20),\n queryPlans: Array.from(this.queryPlans.values()),\n bottlenecks,\n recommendations,\n };\n }\n\n protected generateRecommendations(traces: any[]): string[] {\n const recommendations: string[] = [];\n\n // Check for missing indexes\n const slowSelects = this.slowQueries.filter(\n (q) => q.query.toUpperCase().includes('SELECT') && q.duration > 2000,\n );\n if (slowSelects.length > 5) {\n recommendations.push('Consider adding indexes. Multiple slow SELECT queries detected.');\n }\n\n // Check for N+1 queries\n const queryGroups = new Map<string, number>();\n this.slowQueries.forEach((q) => {\n const normalized = q.query.replaceAll(/\\d+/g, '?').replaceAll(/\\s+/g, ' ');\n queryGroups.set(normalized, (queryGroups.get(normalized) || 0) + 1);\n });\n\n const repetitiveQueries = Array.from(queryGroups.entries()).filter(([, count]) => count > 10);\n\n if (repetitiveQueries.length > 0) {\n recommendations.push(\n 'Possible N+1 query problem detected. Consider using JOINs or batch loading.',\n );\n }\n\n // Check connection pool usage\n const poolStats = this.adapter.getPoolStats();\n if (poolStats.waiting > 0) {\n recommendations.push(\n `Connection pool exhaustion detected. Consider increasing pool size (current: ${poolStats.total}).`,\n );\n }\n\n // Check for long transactions\n const longTransactions = traces.filter(\n (t) => t.operation.includes('transaction') && (t.duration || 0) > 5000,\n );\n if (longTransactions.length > 0) {\n recommendations.push(\n 'Long-running transactions detected. Consider breaking them into smaller units.',\n );\n }\n\n return recommendations;\n }\n\n getBottlenecks(limit = 10): Array<{ operation: string; avgDuration: number; count: number }> {\n const operationStats = new Map<string, { totalTime: number; count: number }>();\n\n Array.from(this.traces.values())\n .filter((trace) => trace.status === 'completed')\n .forEach((trace) => {\n const stats = operationStats.get(trace.operation) || { totalTime: 0, count: 0 };\n stats.totalTime += trace.duration || 0;\n stats.count += 1;\n operationStats.set(trace.operation, stats);\n });\n\n return Array.from(operationStats.entries())\n .map(([operation, stats]) => ({\n operation,\n avgDuration: stats.totalTime / stats.count,\n count: stats.count,\n }))\n .sort((a, b) => b.avgDuration - a.avgDuration)\n .slice(0, limit);\n }\n}\n","import { PerformanceAnalysisTrait } from './performance-analysis-trait';\n\nimport type { DatabaseAdapter } from '../../interfaces';\nimport type { QueryParams, QueryOptions, QueryResult } from '../../types';\n\nexport class AdapterWrapperTrait extends PerformanceAnalysisTrait {\n wrapAdapter(adapter: DatabaseAdapter): DatabaseAdapter {\n const originalQuery = adapter.query.bind(adapter);\n\n adapter.query = async <T = unknown>(\n sql: string,\n params?: QueryParams,\n options?: QueryOptions,\n ): Promise<QueryResult<T>> => {\n const traceId = this.startTrace('query', { sql, params });\n\n try {\n const result = await originalQuery<T>(sql, params, options);\n this.endTrace(traceId);\n\n // Analyze slow queries\n const trace = this.traces.get(traceId);\n if (trace?.duration && trace.duration > this.slowQueryThreshold) {\n this.explainQuery(sql, params).catch(() => {\n // Ignore explain errors\n });\n }\n\n return result;\n } catch (error) {\n this.endTrace(traceId, error as Error);\n throw error;\n }\n };\n\n // Wrap other methods\n this.wrapMethod(adapter, 'beginTransaction', 'transaction');\n this.wrapMethod(adapter, 'connect', 'connection');\n this.wrapMethod(adapter, 'disconnect', 'connection');\n\n return adapter;\n }\n\n protected wrapMethod(adapter: any, methodName: string, operationType: string): void {\n const original = adapter[methodName];\n if (typeof original !== 'function') {\n return;\n }\n\n adapter[methodName] = async (...args: any[]) => {\n const traceId = this.startTrace(`${operationType}.${methodName}`, {\n args: args.slice(0, 2), // Limit logged args\n });\n\n try {\n const result = await original.apply(adapter, args);\n this.endTrace(traceId);\n return result;\n } catch (error) {\n this.endTrace(traceId, error as Error);\n throw error;\n }\n };\n }\n\n unwrapAdapter(adapter: DatabaseAdapter): void {\n // This would restore original methods, but for simplicity\n // we recommend creating a new adapter instance instead\n this.emit('adapterUnwrapped', { adapter });\n }\n}\n","import { AdapterWrapperTrait } from './traits/adapter-wrapper-trait';\n\nimport type { DatabaseAdapter } from '../interfaces';\n\nexport * from './traits/trace-base-trait';\nexport * from './traits/query-analysis-trait';\nexport * from './traits/performance-analysis-trait';\n\n/**\n * Modular Performance Monitor\n * Refactored from 394 lines, 32 methods to modular traits\n */\nexport class ModularPerformanceMonitor extends AdapterWrapperTrait {\n constructor(\n adapter: DatabaseAdapter,\n options: {\n slowQueryThreshold?: number;\n maxTraces?: number;\n enabled?: boolean;\n } = {},\n ) {\n super(\n adapter,\n options.slowQueryThreshold ?? 1000,\n options.maxTraces ?? 10_000,\n options.enabled ?? true,\n );\n }\n}\n","import { createHash } from 'node:crypto';\n\n/**\n * Cache Key Pattern Types\n */\nexport type CacheKeyPattern =\n | 'table' // table:users\n | 'table:id' // table:users:123\n | 'table:query' // table:users:query:abc123\n | 'table:field' // table:users:email:test@test.com\n | 'custom'; // custom pattern\n\n/**\n * Cache Key Options\n */\nexport interface CacheKeyOptions {\n /** Namespace prefix (e.g., 'myapp', 'api') */\n namespace?: string;\n /** Table/collection name */\n table?: string;\n /** Primary key or ID */\n id?: string | number;\n /** Field name for field-based keys */\n field?: string;\n /** Field value */\n value?: unknown;\n /** SQL query (will be hashed) */\n query?: string;\n /** Query parameters */\n params?: unknown[];\n /** Custom key parts */\n parts?: string[];\n /** Tags for grouping (for bulk invalidation) */\n tags?: string[];\n}\n\n/**\n * Industry-standard Cache Key Generator\n *\n * Generates consistent, collision-free cache keys with support for:\n * - Namespacing\n * - Table-based keys\n * - Query hashing\n * - Tag-based grouping\n *\n * @example\n * ```typescript\n * const generator = new CacheKeyGenerator({ namespace: 'myapp' });\n *\n * // Simple table key\n * generator.forTable('users').build();\n * // => 'myapp:table:users'\n *\n * // Table with ID\n * generator.forTable('users').withId(123).build();\n * // => 'myapp:table:users:id:123'\n *\n * // Query-based key\n * generator.forQuery('SELECT * FROM users WHERE age > ?', [18]).build();\n * // => 'myapp:query:a1b2c3d4'\n *\n * // Field-based key\n * generator.forTable('users').withField('email', 'test@test.com').build();\n * // => 'myapp:table:users:field:email:098f6bcd'\n * ```\n */\nexport class CacheKeyGenerator {\n private readonly namespace: string;\n private readonly separator: string;\n private readonly hashAlgorithm: string;\n private readonly hashLength: number;\n\n private currentOptions: CacheKeyOptions = {};\n\n constructor(\n options: {\n namespace?: string;\n separator?: string;\n hashAlgorithm?: string;\n hashLength?: number;\n } = {},\n ) {\n this.namespace = options.namespace || 'cache';\n this.separator = options.separator || ':';\n this.hashAlgorithm = options.hashAlgorithm || 'sha256';\n this.hashLength = options.hashLength || 8;\n }\n\n /**\n * Start building a key for a table\n */\n forTable(table: string): this {\n this.currentOptions = { table };\n return this;\n }\n\n /**\n * Add ID to the key\n */\n withId(id: string | number): this {\n this.currentOptions.id = id;\n return this;\n }\n\n /**\n * Add field-based lookup\n */\n withField(field: string, value: unknown): this {\n this.currentOptions.field = field;\n this.currentOptions.value = value;\n return this;\n }\n\n /**\n * Add tags for bulk invalidation\n */\n withTags(...tags: string[]): this {\n this.currentOptions.tags = tags;\n return this;\n }\n\n /**\n * Create key for a SQL query\n */\n forQuery(sql: string, params?: unknown[]): this {\n this.currentOptions = { query: sql, params };\n return this;\n }\n\n /**\n * Create custom key with parts\n */\n forCustom(...parts: string[]): this {\n this.currentOptions = { parts };\n return this;\n }\n\n /**\n * Set namespace for this key\n */\n inNamespace(namespace: string): this {\n this.currentOptions.namespace = namespace;\n return this;\n }\n\n /**\n * Build the final cache key\n */\n build(): string {\n const parts: string[] = [];\n const opts = this.currentOptions;\n const ns = opts.namespace || this.namespace;\n\n // Add namespace\n parts.push(ns);\n\n // Build key based on options\n if (opts.query) {\n // Query-based key\n parts.push('query');\n parts.push(this.hashQuery(opts.query, opts.params));\n } else if (opts.table) {\n // Table-based key\n parts.push('table', opts.table);\n\n if (opts.id !== undefined) {\n parts.push('id');\n parts.push(String(opts.id));\n }\n\n if (opts.field && opts.value !== undefined) {\n parts.push('field', opts.field);\n parts.push(this.hashValue(opts.value));\n }\n } else if (opts.parts && opts.parts.length > 0) {\n // Custom parts\n parts.push(...opts.parts);\n }\n\n // Reset for next build\n const key = parts.join(this.separator);\n this.currentOptions = {};\n\n return key;\n }\n\n /**\n * Build key and return with tags\n */\n buildWithTags(): { key: string; tags: string[] } {\n const tags = this.currentOptions.tags || [];\n const opts = this.currentOptions;\n\n // Auto-generate table tag\n if (opts.table && !tags.includes(`table:${opts.table}`)) {\n tags.push(`table:${opts.table}`);\n }\n\n return {\n key: this.build(),\n tags,\n };\n }\n\n /**\n * Generate key for table:id pattern\n */\n tableId(table: string, id: string | number): string {\n return this.forTable(table).withId(id).build();\n }\n\n /**\n * Generate key for table:field:value pattern\n */\n tableField(table: string, field: string, value: unknown): string {\n return this.forTable(table).withField(field, value).build();\n }\n\n /**\n * Generate key from SQL query\n */\n query(sql: string, params?: unknown[]): string {\n return this.forQuery(sql, params).build();\n }\n\n /**\n * Generate wildcard pattern for bulk operations\n */\n pattern(table: string, pattern: '*' | 'id:*' | 'field:*' = '*'): string {\n const ns = this.namespace;\n if (pattern === '*') {\n return `${ns}${this.separator}table${this.separator}${table}${this.separator}*`;\n }\n return `${ns}${this.separator}table${this.separator}${table}${this.separator}${pattern}`;\n }\n\n /**\n * Generate tag key\n */\n tag(tagName: string): string {\n return `${this.namespace}${this.separator}tag${this.separator}${tagName}`;\n }\n\n /**\n * Hash a SQL query with params\n */\n private hashQuery(sql: string, params?: unknown[]): string {\n const content = JSON.stringify({ sql: sql.trim(), params: params || [] });\n return this.hash(content);\n }\n\n /**\n * Hash a value\n */\n private hashValue(value: unknown): string {\n const content = typeof value === 'string' ? value : JSON.stringify(value);\n return this.hash(content);\n }\n\n /**\n * Create hash of content\n */\n private hash(content: string): string {\n return createHash(this.hashAlgorithm)\n .update(content)\n .digest('hex')\n .slice(0, Math.max(0, this.hashLength));\n }\n\n /**\n * Create a new generator with different namespace\n */\n withNamespace(namespace: string): CacheKeyGenerator {\n return new CacheKeyGenerator({\n namespace,\n separator: this.separator,\n hashAlgorithm: this.hashAlgorithm,\n hashLength: this.hashLength,\n });\n }\n}\n\n/**\n * Default cache key generator instance\n */\nexport const cacheKey = new CacheKeyGenerator();\n","import { CacheKeyGenerator } from './cache-key-generator';\n\nimport type { CacheAdapter } from '../interfaces';\n\nexport interface CacheEntry<T = unknown> {\n data: T;\n cachedAt: number;\n expiresAt?: number;\n tags?: string[];\n}\n\nexport interface CacheStats {\n hits: number;\n misses: number;\n sets: number;\n deletes: number;\n invalidations: number;\n hitRate: number;\n}\n\nexport interface CacheManagerOptions {\n adapter: CacheAdapter;\n defaultTTL?: number;\n namespace?: string;\n enableStats?: boolean;\n keyPrefix?: string;\n}\n\nexport interface CacheSetOptions {\n ttl?: number;\n tags?: string[];\n skipIfExists?: boolean;\n}\n\nexport class CacheManager {\n private readonly adapter: CacheAdapter;\n private readonly defaultTTL: number;\n private readonly enableStats: boolean;\n private readonly keyPrefix: string;\n public readonly key: CacheKeyGenerator;\n\n private stats: CacheStats = {\n hits: 0,\n misses: 0,\n sets: 0,\n deletes: 0,\n invalidations: 0,\n hitRate: 0,\n };\n\n constructor(options: CacheManagerOptions) {\n this.adapter = options.adapter;\n this.defaultTTL = options.defaultTTL || 300;\n this.enableStats = options.enableStats ?? true;\n this.keyPrefix = options.keyPrefix || '';\n this.key = new CacheKeyGenerator({ namespace: options.namespace || 'cache' });\n }\n\n async get<T = unknown>(key: string): Promise<T | null> {\n const fullKey = this.getFullKey(key);\n const result = await this.adapter.get<CacheEntry<T>>(fullKey);\n if (result) {\n this.recordHit();\n return result.data;\n }\n this.recordMiss();\n return null;\n }\n\n async set<T = unknown>(key: string, data: T, options: CacheSetOptions = {}): Promise<void> {\n const fullKey = this.getFullKey(key);\n const ttl = options.ttl ?? this.defaultTTL;\n if (options.skipIfExists && (await this.adapter.exists(fullKey))) {\n return;\n }\n const entry: CacheEntry<T> = {\n data,\n cachedAt: Date.now(),\n expiresAt: ttl ? Date.now() + ttl * 1000 : undefined,\n tags: options.tags,\n };\n await this.adapter.set(fullKey, entry, ttl);\n if (options.tags?.length) {\n await this.addKeyToTags(fullKey, options.tags);\n }\n this.recordSet();\n }\n\n async getOrSet<T = unknown>(\n key: string,\n fetchFn: () => Promise<T>,\n options: CacheSetOptions = {},\n ): Promise<T> {\n const cached = await this.get<T>(key);\n if (cached !== null) {\n return cached;\n }\n const data = await fetchFn();\n await this.set(key, data, options);\n return data;\n }\n\n async delete(key: string): Promise<boolean> {\n const fullKey = this.getFullKey(key);\n const result = await this.adapter.delete(fullKey);\n if (result) {\n this.recordDelete();\n }\n return result;\n }\n\n async deleteMany(keys: string[]): Promise<number> {\n let deleted = 0;\n for (const key of keys) {\n if (await this.delete(key)) {\n deleted++;\n }\n }\n return deleted;\n }\n\n async exists(key: string): Promise<boolean> {\n return this.adapter.exists(this.getFullKey(key));\n }\n\n async invalidateByTag(tag: string): Promise<number> {\n const tagKey = this.key.tag(tag);\n const keys = await this.adapter.get<string[]>(tagKey);\n if (!keys?.length) {\n return 0;\n }\n let invalidated = 0;\n for (const key of keys) {\n if (await this.adapter.delete(key)) {\n invalidated++;\n }\n }\n await this.adapter.delete(tagKey);\n this.recordInvalidation(invalidated);\n return invalidated;\n }\n\n async invalidateByTags(tags: string[]): Promise<number> {\n let total = 0;\n for (const tag of tags) {\n total += await this.invalidateByTag(tag);\n }\n return total;\n }\n\n async invalidateTable(table: string): Promise<number> {\n return this.invalidateByTag(`table:${table}`);\n }\n\n async invalidateRecord(table: string, id: string | number): Promise<boolean> {\n return this.delete(this.key.tableId(table, id));\n }\n\n async clear(): Promise<void> {\n const adapter = this.adapter as CacheAdapter & { flushdb?: () => Promise<void> };\n if (adapter.flushdb) {\n await adapter.flushdb();\n }\n this.resetStats();\n }\n\n getStats(): CacheStats {\n const total = this.stats.hits + this.stats.misses;\n return { ...this.stats, hitRate: total > 0 ? this.stats.hits / total : 0 };\n }\n\n resetStats(): void {\n this.stats = { hits: 0, misses: 0, sets: 0, deletes: 0, invalidations: 0, hitRate: 0 };\n }\n\n async getTTL(key: string): Promise<number> {\n return this.adapter.ttl(this.getFullKey(key));\n }\n async extendTTL(key: string, ttl: number): Promise<boolean> {\n return this.adapter.expire(this.getFullKey(key), ttl);\n }\n\n scope(namespace: string): CacheManager {\n return new CacheManager({\n adapter: this.adapter,\n defaultTTL: this.defaultTTL,\n namespace,\n enableStats: this.enableStats,\n keyPrefix: this.keyPrefix,\n });\n }\n\n private getFullKey(key: string): string {\n return this.keyPrefix ? `${this.keyPrefix}:${key}` : key;\n }\n\n private async addKeyToTags(key: string, tags: string[]): Promise<void> {\n for (const tag of tags) {\n const tagKey = this.key.tag(tag);\n const existing = (await this.adapter.get<string[]>(tagKey)) || [];\n if (!existing.includes(key)) {\n existing.push(key);\n await this.adapter.set(tagKey, existing);\n }\n }\n }\n\n private recordHit(): void {\n if (this.enableStats) {\n this.stats.hits++;\n }\n }\n private recordMiss(): void {\n if (this.enableStats) {\n this.stats.misses++;\n }\n }\n private recordSet(): void {\n if (this.enableStats) {\n this.stats.sets++;\n }\n }\n private recordDelete(): void {\n if (this.enableStats) {\n this.stats.deletes++;\n }\n }\n private recordInvalidation(count: number): void {\n if (this.enableStats) {\n this.stats.invalidations += count;\n }\n }\n}\n","import { generateCacheKey } from '../utils';\n\nimport type { QueryResult } from '../types';\n\nexport interface CacheStrategy {\n shouldCache(sql: string, result: QueryResult): boolean;\n getCacheTTL(sql: string, options?: QueryCacheOptions): number;\n getCacheKey(sql: string, params?: unknown[], options?: QueryCacheOptions): string;\n getInvalidationPatterns(sql: string): string[];\n}\n\nexport interface QueryCacheOptions {\n ttl?: number;\n key?: string;\n tags?: string[];\n invalidateOn?: string[];\n compress?: boolean;\n cacheEmpty?: boolean;\n cacheErrors?: boolean;\n}\n\nexport class DefaultCacheStrategy implements CacheStrategy {\n private readonly cacheableCommands = ['SELECT', 'SHOW', 'DESCRIBE'];\n private readonly defaultTTL = 3600; // 1 hour\n\n shouldCache(sql: string, result: QueryResult): boolean {\n const command = sql.trim().split(/\\s+/)[0]?.toUpperCase();\n\n // Only cache read operations\n if (!command || !this.cacheableCommands.includes(command)) {\n return false;\n }\n\n // Don't cache empty results by default\n if (result.rowCount === 0) {\n return false;\n }\n\n // Don't cache very large results\n const resultSize = JSON.stringify(result).length;\n if (resultSize > 1024 * 1024) {\n // 1MB\n return false;\n }\n\n return true;\n }\n\n getCacheTTL(sql: string, options?: QueryCacheOptions): number {\n if (options?.ttl !== undefined) {\n return options.ttl;\n }\n\n // Different TTLs for different query types\n const upperSql = sql.toUpperCase();\n\n if (upperSql.includes('COUNT(') || upperSql.includes('SUM(')) {\n return 300; // 5 minutes for aggregates\n }\n\n if (upperSql.includes('JOIN')) {\n return 600; // 10 minutes for joins\n }\n\n return this.defaultTTL;\n }\n\n getCacheKey(sql: string, params?: unknown[], options?: QueryCacheOptions): string {\n if (options?.key) {\n return options.key;\n }\n\n return generateCacheKey(sql, params);\n }\n\n getInvalidationPatterns(sql: string): string[] {\n const patterns: string[] = [];\n const tables = this.extractTableNames(sql);\n\n tables.forEach((table) => {\n patterns.push(`table:${table}:*`, `query:*${table}*`);\n });\n\n return patterns;\n }\n\n protected extractTableNames(sql: string): string[] {\n const tables: string[] = [];\n const patterns = [\n /from\\s+`?(\\w+)`?/gi,\n /join\\s+`?(\\w+)`?/gi,\n /update\\s+`?(\\w+)`?/gi,\n /insert\\s+into\\s+`?(\\w+)`?/gi,\n /delete\\s+from\\s+`?(\\w+)`?/gi,\n ];\n\n patterns.forEach((pattern) => {\n let match;\n while ((match = pattern.exec(sql)) !== null) {\n if (match[1]) {\n tables.push(match[1].toLowerCase());\n }\n }\n });\n\n return [...new Set(tables)];\n }\n}\n\nexport class SmartCacheStrategy extends DefaultCacheStrategy {\n private queryPatterns = new Map<string, { hits: number; avgDuration: number }>();\n\n override shouldCache(sql: string, result: QueryResult): boolean {\n if (!super.shouldCache(sql, result)) {\n return false;\n }\n\n // Learn from query patterns\n const pattern = this.normalizeQuery(sql);\n const stats = this.queryPatterns.get(pattern);\n\n if (stats) {\n // Cache frequently accessed queries\n if (stats.hits > 10) {\n return true;\n }\n\n // Cache slow queries\n if (stats.avgDuration > 100) {\n return true;\n }\n }\n\n return true;\n }\n\n override getCacheTTL(sql: string, options?: QueryCacheOptions): number {\n const baseTTL = super.getCacheTTL(sql, options);\n const pattern = this.normalizeQuery(sql);\n const stats = this.queryPatterns.get(pattern);\n\n if (stats) {\n // Longer TTL for frequently accessed queries\n if (stats.hits > 100) {\n return baseTTL * 2;\n }\n\n // Shorter TTL for rarely accessed queries\n if (stats.hits < 5) {\n return baseTTL / 2;\n }\n }\n\n return baseTTL;\n }\n\n recordQueryExecution(sql: string, duration: number): void {\n const pattern = this.normalizeQuery(sql);\n const stats = this.queryPatterns.get(pattern) || { hits: 0, avgDuration: 0 };\n\n stats.avgDuration = (stats.avgDuration * stats.hits + duration) / (stats.hits + 1);\n stats.hits++;\n\n this.queryPatterns.set(pattern, stats);\n }\n\n private normalizeQuery(sql: string): string {\n // Normalize query to identify patterns\n return sql\n .replaceAll(/\\s+/g, ' ')\n .replaceAll(/\\d+/g, '?')\n .replaceAll(/'[^']*'/g, '?')\n .toLowerCase()\n .trim();\n }\n}\n","/**\n * Cache API - Industry-leading cache interface\n *\n * Inspired by Drizzle ORM's $cache API, TypeORM's simplicity,\n * and enhanced with additional features.\n *\n * @example\n * ```typescript\n * // Invalidate by tables\n * await db.$cache.invalidate({ tables: ['users'] });\n *\n * // Invalidate by tags\n * await db.$cache.invalidate({ tags: ['user-123'] });\n *\n * // Get statistics\n * const stats = db.$cache.stats();\n *\n * // Clear all cache\n * await db.$cache.clear();\n *\n * // Warmup cache\n * await db.$cache.warmup([\n * { sql: 'SELECT * FROM settings', ttl: 86400 }\n * ]);\n * ```\n */\n\nimport { CacheKeyGenerator } from './cache-key-generator';\n\nimport type { CacheAdapter } from '../interfaces';\nimport type { Logger } from '../types';\n\nexport interface CacheInvalidateOptions {\n /** Table names to invalidate */\n tables?: string | string[];\n /** Custom tags to invalidate */\n tags?: string | string[];\n}\n\nexport interface CacheWarmupQuery {\n sql: string;\n params?: unknown[];\n ttl?: number;\n tags?: string[];\n}\n\nexport interface CacheAPIStats {\n hits: number;\n misses: number;\n sets: number;\n deletes: number;\n invalidations: number;\n hitRate: number;\n size: number;\n memoryUsage?: number;\n}\n\nexport interface CacheAPIOptions {\n adapter: CacheAdapter;\n namespace?: string;\n logger?: Logger;\n onHit?: (key: string, sql: string) => void;\n onMiss?: (key: string, sql: string) => void;\n onError?: (error: Error, key: string) => void;\n}\n\n/**\n * Cache API - Drizzle-style $cache interface\n */\nexport class CacheAPI {\n private adapter: CacheAdapter;\n private keyGenerator: CacheKeyGenerator;\n private logger?: Logger;\n private stats: CacheAPIStats;\n private tableKeyMap: Map<string, Set<string>> = new Map();\n private tagKeyMap: Map<string, Set<string>> = new Map();\n\n // Callbacks\n public onHit?: (key: string, sql: string) => void;\n public onMiss?: (key: string, sql: string) => void;\n public onError?: (error: Error, key: string) => void;\n\n constructor(options: CacheAPIOptions) {\n this.adapter = options.adapter;\n this.keyGenerator = new CacheKeyGenerator({\n namespace: options.namespace || 'db-bridge',\n });\n this.logger = options.logger;\n this.onHit = options.onHit;\n this.onMiss = options.onMiss;\n this.onError = options.onError;\n\n this.stats = {\n hits: 0,\n misses: 0,\n sets: 0,\n deletes: 0,\n invalidations: 0,\n hitRate: 0,\n size: 0,\n };\n }\n\n /**\n * Invalidate cache by tables or tags\n *\n * @example\n * ```typescript\n * // Single table\n * await db.$cache.invalidate({ tables: 'users' });\n *\n * // Multiple tables\n * await db.$cache.invalidate({ tables: ['users', 'posts'] });\n *\n * // By tags\n * await db.$cache.invalidate({ tags: ['user-123', 'active-users'] });\n *\n * // Combined\n * await db.$cache.invalidate({\n * tables: ['users'],\n * tags: ['premium-users']\n * });\n * ```\n */\n async invalidate(options: CacheInvalidateOptions): Promise<number> {\n let invalidated = 0;\n\n // Invalidate by tables\n if (options.tables) {\n const tables = Array.isArray(options.tables) ? options.tables : [options.tables];\n\n for (const table of tables) {\n const keys = this.tableKeyMap.get(table) || new Set();\n\n for (const key of keys) {\n try {\n const deleted = await this.adapter.delete(key);\n if (deleted) {\n invalidated++;\n this.stats.deletes++;\n }\n } catch (error) {\n this.handleError(error as Error, key);\n }\n }\n\n // Also try pattern-based deletion\n try {\n const pattern = `*:table:${table}:*`;\n const patternKeys = await this.adapter.keys(pattern);\n for (const key of patternKeys) {\n const deleted = await this.adapter.delete(key);\n if (deleted) {\n invalidated++;\n }\n }\n } catch {\n // Pattern matching not supported, skip\n }\n\n this.tableKeyMap.delete(table);\n this.logger?.debug(`Invalidated table cache: ${table}`, { count: keys.size });\n }\n }\n\n // Invalidate by tags\n if (options.tags) {\n const tags = Array.isArray(options.tags) ? options.tags : [options.tags];\n\n for (const tag of tags) {\n const tagKey = this.keyGenerator.tag(tag);\n\n try {\n // Get all keys associated with this tag\n const keys = (await this.adapter.get<string[]>(tagKey)) || [];\n\n for (const key of keys) {\n const deleted = await this.adapter.delete(key);\n if (deleted) {\n invalidated++;\n this.stats.deletes++;\n }\n }\n\n // Delete the tag key itself\n await this.adapter.delete(tagKey);\n this.tagKeyMap.delete(tag);\n\n this.logger?.debug(`Invalidated tag cache: ${tag}`, { count: keys.length });\n } catch (error) {\n this.handleError(error as Error, tagKey);\n }\n }\n }\n\n this.stats.invalidations += invalidated;\n this.updateHitRate();\n\n return invalidated;\n }\n\n /**\n * Clear all cache\n */\n async clear(): Promise<void> {\n try {\n await this.adapter.clear();\n this.tableKeyMap.clear();\n this.tagKeyMap.clear();\n this.stats.size = 0;\n this.logger?.info('Cache cleared');\n } catch (error) {\n this.handleError(error as Error, '*');\n }\n }\n\n /**\n * Warmup cache with predefined queries\n *\n * @example\n * ```typescript\n * await db.$cache.warmup([\n * { sql: 'SELECT * FROM settings', ttl: 86400 },\n * { sql: 'SELECT * FROM categories', ttl: 3600, tags: ['catalog'] }\n * ]);\n * ```\n */\n async warmup(\n queries: CacheWarmupQuery[],\n executor: (sql: string, params?: unknown[]) => Promise<unknown>,\n ): Promise<{ success: number; failed: number }> {\n let success = 0;\n let failed = 0;\n\n this.logger?.info('Cache warmup started', { count: queries.length });\n\n for (const query of queries) {\n try {\n const result = await executor(query.sql, query.params);\n const key = this.keyGenerator.query(query.sql, query.params);\n\n await this.set(key, result, {\n ttl: query.ttl,\n tags: query.tags,\n tables: this.extractTables(query.sql),\n });\n\n success++;\n this.logger?.debug('Warmup query cached', { sql: query.sql });\n } catch (error) {\n failed++;\n this.logger?.error('Warmup query failed', { sql: query.sql, error });\n }\n }\n\n this.logger?.info('Cache warmup completed', { success, failed });\n return { success, failed };\n }\n\n /**\n * Get cache statistics\n */\n getStats(): CacheAPIStats {\n return { ...this.stats };\n }\n\n /**\n * Reset statistics\n */\n resetStats(): void {\n this.stats = {\n hits: 0,\n misses: 0,\n sets: 0,\n deletes: 0,\n invalidations: 0,\n hitRate: 0,\n size: this.stats.size,\n };\n }\n\n /**\n * Get cached value\n */\n async get<T>(key: string): Promise<T | null> {\n try {\n const value = await this.adapter.get<T>(key);\n\n if (value === null) {\n this.stats.misses++;\n this.onMiss?.(key, '');\n } else {\n this.stats.hits++;\n this.onHit?.(key, '');\n }\n\n this.updateHitRate();\n return value;\n } catch (error) {\n this.handleError(error as Error, key);\n return null;\n }\n }\n\n /**\n * Set cached value with metadata\n */\n async set<T>(\n key: string,\n value: T,\n options?: {\n ttl?: number;\n tags?: string[];\n tables?: string[];\n },\n ): Promise<void> {\n try {\n await this.adapter.set(key, value, options?.ttl);\n this.stats.sets++;\n this.stats.size++;\n\n // Track table associations\n if (options?.tables) {\n for (const table of options.tables) {\n if (!this.tableKeyMap.has(table)) {\n this.tableKeyMap.set(table, new Set());\n }\n this.tableKeyMap.get(table)!.add(key);\n }\n }\n\n // Track tag associations\n if (options?.tags) {\n for (const tag of options.tags) {\n const tagKey = this.keyGenerator.tag(tag);\n const existing = (await this.adapter.get<string[]>(tagKey)) || [];\n\n if (!existing.includes(key)) {\n existing.push(key);\n await this.adapter.set(tagKey, existing);\n }\n\n if (!this.tagKeyMap.has(tag)) {\n this.tagKeyMap.set(tag, new Set());\n }\n this.tagKeyMap.get(tag)!.add(key);\n }\n }\n } catch (error) {\n this.handleError(error as Error, key);\n }\n }\n\n /**\n * Delete cached value\n */\n async delete(key: string): Promise<boolean> {\n try {\n const deleted = await this.adapter.delete(key);\n if (deleted) {\n this.stats.deletes++;\n this.stats.size = Math.max(0, this.stats.size - 1);\n }\n return deleted;\n } catch (error) {\n this.handleError(error as Error, key);\n return false;\n }\n }\n\n /**\n * Check if key exists\n */\n async exists(key: string): Promise<boolean> {\n try {\n return await this.adapter.exists(key);\n } catch (error) {\n this.handleError(error as Error, key);\n return false;\n }\n }\n\n /**\n * Generate cache key for query\n */\n generateKey(sql: string, params?: unknown[]): string {\n return this.keyGenerator.query(sql, params);\n }\n\n /**\n * Get key generator for custom keys\n */\n key(): CacheKeyGenerator {\n return this.keyGenerator;\n }\n\n /**\n * Extract table names from SQL\n */\n private extractTables(sql: string): string[] {\n const tables: string[] = [];\n const patterns = [\n /from\\s+[\"'`]?(\\w+)[\"'`]?/gi,\n /join\\s+[\"'`]?(\\w+)[\"'`]?/gi,\n /into\\s+[\"'`]?(\\w+)[\"'`]?/gi,\n /update\\s+[\"'`]?(\\w+)[\"'`]?/gi,\n ];\n\n for (const pattern of patterns) {\n let match;\n while ((match = pattern.exec(sql)) !== null) {\n if (match[1]) {\n tables.push(match[1].toLowerCase());\n }\n }\n }\n\n return [...new Set(tables)];\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 private handleError(error: Error, key: string): void {\n this.logger?.error('Cache error', { key, error: error.message });\n this.onError?.(error, key);\n }\n}\n\n/**\n * Cache configuration for DBBridge\n */\nexport interface CacheConfig {\n /** Redis connection string or CacheAdapter instance */\n redis?: string | CacheAdapter;\n\n /** Enable global caching (default: false - explicit/opt-in) */\n global?: boolean;\n\n /** Default TTL in seconds (default: 3600) */\n ttl?: number;\n\n /** Cache namespace prefix */\n namespace?: string;\n\n /** Commands to cache (default: ['SELECT', 'SHOW', 'DESCRIBE']) */\n cacheableCommands?: string[];\n\n /** Auto-invalidate on mutations (default: true) */\n autoInvalidate?: boolean;\n\n /** Cache empty results (default: false) */\n cacheEmpty?: boolean;\n\n /** Warmup queries to preload on connect */\n warmup?: CacheWarmupQuery[];\n\n /** Event callbacks */\n onHit?: (key: string, sql: string) => void;\n onMiss?: (key: string, sql: string) => void;\n onError?: (error: Error, key: string) => void;\n}\n\n/**\n * Per-query cache options\n */\nexport interface QueryCacheConfig {\n /** Enable/disable cache for this query */\n enabled?: boolean;\n\n /** Custom TTL for this query */\n ttl?: number;\n\n /** Custom cache key */\n key?: string;\n\n /** Tags for bulk invalidation */\n tags?: string[];\n\n /** Skip auto-invalidation for this query */\n autoInvalidate?: boolean;\n}\n\nexport type CacheOption = boolean | QueryCacheConfig;\n","import { EventEmitter } from 'eventemitter3';\n\nimport type { CacheAdapter } from '../../interfaces';\nimport type { Logger } from '../../types';\n\nexport interface CacheStatistics {\n hits: number;\n misses: number;\n hitRate: number;\n totalCached: number;\n totalEvicted: number;\n avgHitTime: number;\n avgMissTime: number;\n memoryUsage?: number;\n}\n\nexport class CacheBaseTrait extends EventEmitter {\n protected cache: CacheAdapter;\n protected logger?: Logger;\n protected enabled = true;\n protected statistics: CacheStatistics;\n\n constructor(cache: CacheAdapter, logger?: Logger, enabled = true) {\n super();\n this.cache = cache;\n this.logger = logger;\n this.enabled = enabled;\n\n this.statistics = {\n hits: 0,\n misses: 0,\n hitRate: 0,\n totalCached: 0,\n totalEvicted: 0,\n avgHitTime: 0,\n avgMissTime: 0,\n };\n }\n\n enable(): void {\n this.enabled = true;\n this.emit('cacheEnabled');\n }\n\n disable(): void {\n this.enabled = false;\n this.emit('cacheDisabled');\n }\n\n isEnabled(): boolean {\n return this.enabled;\n }\n\n getStatistics(): CacheStatistics {\n return { ...this.statistics };\n }\n\n resetStatistics(): void {\n this.statistics = {\n hits: 0,\n misses: 0,\n hitRate: 0,\n totalCached: 0,\n totalEvicted: 0,\n avgHitTime: 0,\n avgMissTime: 0,\n };\n }\n\n protected updateStatistics(type: 'hit' | 'miss', duration: number): void {\n if (type === 'hit') {\n this.statistics.hits++;\n this.statistics.avgHitTime =\n (this.statistics.avgHitTime * (this.statistics.hits - 1) + duration) / this.statistics.hits;\n } else {\n this.statistics.misses++;\n this.statistics.avgMissTime =\n (this.statistics.avgMissTime * (this.statistics.misses - 1) + duration) /\n this.statistics.misses;\n }\n\n const total = this.statistics.hits + this.statistics.misses;\n this.statistics.hitRate = total > 0 ? this.statistics.hits / total : 0;\n }\n}\n","import { CacheBaseTrait } from './cache-base-trait';\n\nimport type { QueryResult } from '../../types';\nimport type { CacheStrategy, QueryCacheOptions } from '../cache-strategy';\n\nexport interface CachedQuery {\n key: string;\n sql: string;\n result: QueryResult;\n timestamp: Date;\n ttl: number;\n hits: number;\n tags: string[];\n size: number;\n}\n\nexport class CacheOperationsTrait extends CacheBaseTrait {\n protected strategy!: CacheStrategy;\n protected queryCache = new Map<string, CachedQuery>();\n protected tagIndex = new Map<string, Set<string>>();\n\n setStrategy(strategy: CacheStrategy): void {\n this.strategy = strategy;\n }\n\n async get<T = unknown>(\n sql: string,\n params?: unknown[],\n options?: QueryCacheOptions,\n ): Promise<QueryResult<T> | null> {\n if (!this.enabled) {\n return null;\n }\n\n const startTime = Date.now();\n const key = this.strategy.getCacheKey(sql, params, options);\n\n try {\n const cached = await this.cache.get<QueryResult<T>>(key);\n\n if (cached) {\n const duration = Date.now() - startTime;\n this.updateStatistics('hit', duration);\n\n // Update hit count\n const cachedQuery = this.queryCache.get(key);\n if (cachedQuery) {\n cachedQuery.hits++;\n }\n\n this.emit('cacheHit', { key, sql, duration });\n this.logger?.debug('Cache hit', { key, duration });\n\n return cached;\n }\n\n const duration = Date.now() - startTime;\n this.updateStatistics('miss', duration);\n this.emit('cacheMiss', { key, sql, duration });\n this.logger?.debug('Cache miss', { key, duration });\n\n return null;\n } catch (error) {\n this.logger?.error('Cache get error', error);\n this.emit('cacheError', { key, error });\n return null;\n }\n }\n\n async set<T = unknown>(\n sql: string,\n params: unknown[] | undefined,\n result: QueryResult<T>,\n options?: QueryCacheOptions,\n ): Promise<void> {\n if (!this.enabled) {\n return;\n }\n\n // Check if we should cache this query\n if (!this.strategy.shouldCache(sql, result)) {\n this.logger?.debug('Query not cacheable', { sql });\n return;\n }\n\n const key = this.strategy.getCacheKey(sql, params, options);\n const ttl = this.strategy.getCacheTTL(sql, options);\n const tags = options?.tags || [];\n\n try {\n await this.cache.set(key, result, ttl);\n\n // Store metadata\n const cachedQuery: CachedQuery = {\n key,\n sql,\n result,\n timestamp: new Date(),\n ttl,\n hits: 0,\n tags,\n size: JSON.stringify(result).length,\n };\n\n this.queryCache.set(key, cachedQuery);\n\n // Update tag index\n tags.forEach((tag) => {\n if (!this.tagIndex.has(tag)) {\n this.tagIndex.set(tag, new Set());\n }\n this.tagIndex.get(tag)!.add(key);\n });\n\n this.statistics.totalCached++;\n this.emit('cacheSet', { key, sql, ttl, tags });\n this.logger?.debug('Query cached', { key, ttl, tags });\n\n // Register for invalidation\n if (options?.invalidateOn) {\n await this.registerInvalidation(key, options.invalidateOn);\n }\n } catch (error) {\n this.logger?.error('Cache set error', error);\n this.emit('cacheError', { key, error });\n }\n }\n\n getCachedQueries(): CachedQuery[] {\n return Array.from(this.queryCache.values()).sort((a, b) => b.hits - a.hits);\n }\n\n getCacheSize(): { entries: number; approximateSize: number } {\n let size = 0;\n this.queryCache.forEach((cached) => {\n size += cached.size;\n });\n\n return {\n entries: this.queryCache.size,\n approximateSize: size,\n };\n }\n\n protected async registerInvalidation(key: string, patterns: string[]): Promise<void> {\n // This would integrate with a pub/sub system or database triggers\n this.logger?.debug('Registered invalidation patterns', { key, patterns });\n }\n}\n","import { CacheOperationsTrait } from './cache-operations-trait';\n\nexport class CacheInvalidationTrait extends CacheOperationsTrait {\n async invalidate(patterns: string[]): Promise<number> {\n if (!this.enabled) {\n return 0;\n }\n\n let invalidated = 0;\n\n for (const pattern of patterns) {\n try {\n // Invalidate by pattern\n const keys = await this.cache.keys(pattern);\n\n for (const key of keys) {\n const deleted = await this.cache.delete(key);\n if (deleted) {\n invalidated++;\n this.queryCache.delete(key);\n\n // Remove from tag index\n this.tagIndex.forEach((keySet) => {\n keySet.delete(key);\n });\n }\n }\n\n // Invalidate by tags\n if (this.tagIndex.has(pattern)) {\n const taggedKeys = this.tagIndex.get(pattern)!;\n\n for (const key of taggedKeys) {\n const deleted = await this.cache.delete(key);\n if (deleted) {\n invalidated++;\n this.queryCache.delete(key);\n }\n }\n\n this.tagIndex.delete(pattern);\n }\n } catch (error) {\n this.logger?.error('Invalidation error', { pattern, error });\n }\n }\n\n this.statistics.totalEvicted += invalidated;\n this.emit('cacheInvalidated', { patterns, count: invalidated });\n this.logger?.info('Cache invalidated', { patterns, count: invalidated });\n\n return invalidated;\n }\n\n async invalidateByTable(table: string): Promise<number> {\n const patterns = [\n `*${table}*`,\n `table:${table}:*`,\n table, // tag\n ];\n\n return this.invalidate(patterns);\n }\n\n async invalidateAll(): Promise<void> {\n if (!this.enabled) {\n return;\n }\n\n await this.cache.clear();\n this.queryCache.clear();\n this.tagIndex.clear();\n\n this.statistics.totalEvicted += this.statistics.totalCached;\n this.statistics.totalCached = 0;\n\n this.emit('cacheCleared');\n this.logger?.info('Cache cleared');\n }\n}\n","import { CacheInvalidationTrait } from './cache-invalidation-trait';\n\nimport type { QueryCacheOptions } from '../cache-strategy';\n\nexport class CacheMaintenanceTrait extends CacheInvalidationTrait {\n private cleanupInterval?: NodeJS.Timeout;\n\n async warmUp(\n queries: Array<{ sql: string; params?: unknown[]; options?: QueryCacheOptions }>,\n ): Promise<void> {\n if (!this.enabled) {\n return;\n }\n\n this.logger?.info('Cache warmup started', { count: queries.length });\n\n for (const query of queries) {\n try {\n const cached = await this.get(query.sql, query.params, query.options);\n\n if (!cached) {\n this.logger?.debug('Query needs caching for warmup', { sql: query.sql });\n // The actual query execution and caching should be done by the adapter\n }\n } catch (error) {\n this.logger?.error('Warmup query failed', { sql: query.sql, error });\n }\n }\n\n this.emit('cacheWarmedUp', { count: queries.length });\n this.logger?.info('Cache warmup completed');\n }\n\n startCleanupTimer(intervalMs = 60_000): void {\n this.stopCleanupTimer();\n\n this.cleanupInterval = setInterval(() => {\n const now = Date.now();\n\n this.queryCache.forEach((cached, key) => {\n const age = now - cached.timestamp.getTime();\n\n if (age > cached.ttl * 1000) {\n this.queryCache.delete(key);\n\n // Remove from tag index\n cached.tags.forEach((tag) => {\n this.tagIndex.get(tag)?.delete(key);\n });\n }\n });\n }, intervalMs);\n }\n\n stopCleanupTimer(): void {\n if (this.cleanupInterval) {\n clearInterval(this.cleanupInterval);\n this.cleanupInterval = undefined;\n }\n }\n\n destroy(): void {\n this.stopCleanupTimer();\n this.queryCache.clear();\n this.tagIndex.clear();\n this.removeAllListeners();\n }\n}\n","import { DefaultCacheStrategy } from './cache-strategy';\nimport { CacheMaintenanceTrait } from './traits/cache-maintenance-trait';\n\nimport type { CacheStrategy } from './cache-strategy';\nimport type { CacheAdapter } from '../interfaces';\nimport type { Logger } from '../types';\n\nexport * from './cache-strategy';\nexport * from './traits/cache-base-trait';\nexport * from './traits/cache-operations-trait';\n\n/**\n * Modular Cache Manager\n * Refactored from 533 lines, 50 methods to modular traits\n */\nexport class ModularCacheManager extends CacheMaintenanceTrait {\n constructor(\n cache: CacheAdapter,\n options: {\n strategy?: CacheStrategy;\n logger?: Logger;\n enabled?: boolean;\n } = {},\n ) {\n super(cache, options.logger, options.enabled ?? true);\n this.strategy = options.strategy || new DefaultCacheStrategy();\n this.startCleanupTimer();\n }\n}\n","import { EventEmitter } from 'eventemitter3';\n\nimport { SmartCacheStrategy } from './cache-strategy';\nimport { ModularCacheManager } from './modular-cache-manager';\n\nimport type { CacheStrategy, QueryCacheOptions } from './cache-strategy';\nimport type { DatabaseAdapter, CacheAdapter } from '../interfaces';\nimport type {\n QueryResult,\n QueryParams,\n QueryOptions,\n Transaction,\n TransactionOptions,\n PreparedStatement,\n PoolStats,\n ConnectionConfig,\n Logger,\n} from '../types';\n\nexport interface CachedAdapterOptions {\n adapter: DatabaseAdapter;\n cache: CacheAdapter;\n strategy?: CacheStrategy;\n logger?: Logger;\n enabled?: boolean;\n cacheableCommands?: string[];\n defaultTTL?: number;\n cacheEmptyResults?: boolean;\n cacheErrors?: boolean;\n warmupQueries?: Array<{\n sql: string;\n params?: unknown[];\n ttl?: number;\n }>;\n}\n\n/**\n * Wraps any database adapter with automatic caching functionality\n * Works with MySQL, PostgreSQL, MongoDB or any other adapter\n */\nexport class CachedAdapter extends EventEmitter implements DatabaseAdapter {\n private adapter: DatabaseAdapter;\n private cacheManager: ModularCacheManager;\n private cacheableCommands: Set<string>;\n private defaultTTL: number;\n private cacheEmptyResults: boolean;\n private cacheErrors: boolean;\n private logger?: Logger;\n private warmupQueries?: CachedAdapterOptions['warmupQueries'];\n\n constructor(options: CachedAdapterOptions) {\n super();\n\n this.adapter = options.adapter;\n this.logger = options.logger;\n this.cacheableCommands = new Set(options.cacheableCommands || ['SELECT', 'SHOW', 'DESCRIBE']);\n this.defaultTTL = options.defaultTTL || 3600;\n this.cacheEmptyResults = options.cacheEmptyResults || false;\n this.cacheErrors = options.cacheErrors || false;\n this.warmupQueries = options.warmupQueries;\n\n // Create cache manager with strategy\n this.cacheManager = new ModularCacheManager(options.cache, {\n strategy: options.strategy || new SmartCacheStrategy(),\n logger: this.logger,\n enabled: options.enabled ?? true,\n });\n\n // Forward adapter events if it's an EventEmitter\n if ('on' in this.adapter && typeof this.adapter.on === 'function') {\n this.adapter.on('connect', (...args: unknown[]) => {\n this.emit('connect', ...args);\n void this.performWarmup();\n });\n this.adapter.on('disconnect', (...args: unknown[]) => this.emit('disconnect', ...args));\n this.adapter.on('error', (...args: unknown[]) => this.emit('error', ...args));\n }\n\n // Listen for cache events\n this.cacheManager.on('cacheHit', (data) => {\n this.logger?.debug('Cache hit', data);\n this.emit('cacheHit', data);\n });\n\n this.cacheManager.on('cacheMiss', (data) => {\n this.logger?.debug('Cache miss', data);\n this.emit('cacheMiss', data);\n });\n\n // Invalidate cache on write operations if adapter emits events\n if ('on' in this.adapter && typeof this.adapter.on === 'function') {\n this.adapter.on('query', (data: any) => {\n if (data.command && this.isWriteCommand(data.command)) {\n this.invalidateRelatedCache(data.sql).catch((error: Error) => {\n this.logger?.error('Cache invalidation error', error);\n });\n }\n });\n }\n }\n\n get name(): string {\n return `Cached${this.adapter.name}`;\n }\n\n get version(): string {\n return this.adapter.version;\n }\n\n get isConnected(): boolean {\n return this.adapter.isConnected;\n }\n\n async connect(config: ConnectionConfig): Promise<void> {\n await this.adapter.connect(config);\n }\n\n async disconnect(): Promise<void> {\n await this.adapter.disconnect();\n await this.cacheManager.invalidateAll();\n }\n\n async query<T = unknown>(\n sql: string,\n params?: QueryParams,\n options?: QueryOptions,\n ): Promise<QueryResult<T>> {\n const command = this.extractCommand(sql);\n\n // Don't cache if:\n // 1. Cache is disabled in options\n // 2. Command is not cacheable\n // 3. It's part of a transaction\n if (options?.cache === false || !this.shouldCache(command, options) || options?.transaction) {\n return this.adapter.query<T>(sql, params, options);\n }\n\n const cacheOptions: QueryCacheOptions = typeof options?.cache === 'object' ? options.cache : {};\n\n try {\n // Try to get from cache\n const cached = await this.cacheManager.get<T>(sql, params as unknown[], cacheOptions);\n\n if (cached) {\n // Update cache statistics for smart strategy\n const strategy = (this.cacheManager as any).strategy;\n if (strategy instanceof SmartCacheStrategy) {\n strategy.recordQueryExecution(sql, 0); // 0ms for cache hit\n }\n\n return cached;\n }\n\n // Execute query\n const startTime = Date.now();\n const result = await this.adapter.query<T>(sql, params, options);\n const duration = Date.now() - startTime;\n\n // Update statistics\n const strategy = (this.cacheManager as any).strategy;\n if (strategy instanceof SmartCacheStrategy) {\n strategy.recordQueryExecution(sql, duration);\n }\n\n // Check if we should cache the result\n if (this.shouldCacheResult(result, options)) {\n await this.cacheManager.set(sql, params as unknown[], result, cacheOptions);\n }\n\n return result;\n } catch (error) {\n // Optionally cache errors\n const cacheEnabled = (options?.cache as any) !== false;\n if (this.cacheErrors && cacheEnabled) {\n const errorResult = {\n rows: [] as T[],\n rowCount: 0,\n error: error as Error,\n } as QueryResult<T>;\n\n await this.cacheManager.set(sql, params as unknown[], errorResult, {\n ...cacheOptions,\n ttl: 60, // Cache errors for 1 minute\n });\n }\n\n throw error;\n }\n }\n\n async beginTransaction(options?: TransactionOptions): Promise<Transaction> {\n const transaction = await this.adapter.beginTransaction(options);\n\n // Wrap transaction to invalidate cache on commit/rollback\n const originalCommit = transaction.commit.bind(transaction);\n const originalRollback = transaction.rollback.bind(transaction);\n\n transaction.commit = async () => {\n const result = await originalCommit();\n // Invalidate all cache after successful commit\n await this.cacheManager.invalidateAll();\n return result;\n };\n\n transaction.rollback = async () => {\n const result = await originalRollback();\n // No need to invalidate on rollback\n return result;\n };\n\n return transaction;\n }\n\n async prepare<T = unknown>(sql: string, name?: string): Promise<PreparedStatement<T>> {\n return this.adapter.prepare<T>(sql, name);\n }\n\n getPoolStats(): PoolStats {\n return this.adapter.getPoolStats();\n }\n\n async ping(): Promise<boolean> {\n return this.adapter.ping();\n }\n\n escape(value: unknown): string {\n return this.adapter.escape(value);\n }\n\n escapeIdentifier(identifier: string): string {\n return this.adapter.escapeIdentifier(identifier);\n }\n\n execute<T = unknown>(\n sql: string,\n params?: QueryParams,\n options?: QueryOptions,\n ): Promise<QueryResult<T>> {\n // Execute is same as query for most adapters\n return this.query<T>(sql, params, options);\n }\n\n createQueryBuilder<T = unknown>(): import('../interfaces').QueryBuilder<T> {\n return this.adapter.createQueryBuilder<T>();\n }\n\n getCacheManager(): ModularCacheManager {\n return this.cacheManager;\n }\n\n async warmupCache(): Promise<void> {\n if (!this.warmupQueries || this.warmupQueries.length === 0) {\n return;\n }\n\n this.logger?.info('Starting cache warmup', { count: this.warmupQueries.length });\n\n for (const query of this.warmupQueries) {\n try {\n const result = await this.query(query.sql, query.params as QueryParams, {\n cache: { ttl: query.ttl || this.defaultTTL },\n });\n\n this.logger?.debug('Warmup query cached', {\n sql: query.sql,\n rowCount: result.rowCount,\n });\n } catch (error) {\n this.logger?.error('Warmup query failed', {\n sql: query.sql,\n error,\n });\n }\n }\n\n this.logger?.info('Cache warmup completed');\n }\n\n private async performWarmup(): Promise<void> {\n if (this.warmupQueries && this.warmupQueries.length > 0) {\n // Perform warmup asynchronously after connection\n setTimeout(() => {\n this.warmupCache().catch((error) => {\n this.logger?.error('Cache warmup error', error);\n });\n }, 1000); // Wait 1 second after connection\n }\n }\n\n private shouldCache(command: string, options?: QueryOptions): boolean {\n if (!command) {\n return false;\n }\n\n // Check if command is cacheable\n if (!this.cacheableCommands.has(command)) {\n return false;\n }\n\n // Check if caching is explicitly enabled in options\n if (options?.cache === true || typeof options?.cache === 'object') {\n return true;\n }\n\n // Default to true for cacheable commands\n return true;\n }\n\n private shouldCacheResult(result: QueryResult, _options?: QueryOptions): boolean {\n // Don't cache empty results unless explicitly configured\n if (!this.cacheEmptyResults && result.rowCount === 0) {\n return false;\n }\n\n // Don't cache if result has an error\n if ((result as any).error) {\n return this.cacheErrors;\n }\n\n return true;\n }\n\n private extractCommand(sql: string): string {\n return sql.trim().split(/\\s+/)[0]?.toUpperCase() || '';\n }\n\n private isWriteCommand(command: string): boolean {\n const writeCommands = ['INSERT', 'UPDATE', 'DELETE', 'CREATE', 'ALTER', 'DROP', 'TRUNCATE'];\n return writeCommands.includes(command.toUpperCase());\n }\n\n private async invalidateRelatedCache(sql: string): Promise<void> {\n const tables = this.extractTableNames(sql);\n const patterns: string[] = [];\n\n tables.forEach((table) => {\n patterns.push(`*${table}*`, `table:${table}:*`);\n });\n\n if (patterns.length > 0) {\n await this.cacheManager.invalidate(patterns);\n }\n }\n\n private extractTableNames(sql: string): string[] {\n const tables: string[] = [];\n const patterns = [\n /from\\s+`?(\\w+)`?/gi,\n /join\\s+`?(\\w+)`?/gi,\n /update\\s+`?(\\w+)`?/gi,\n /insert\\s+into\\s+`?(\\w+)`?/gi,\n /delete\\s+from\\s+`?(\\w+)`?/gi,\n /create\\s+table\\s+`?(\\w+)`?/gi,\n /drop\\s+table\\s+`?(\\w+)`?/gi,\n /truncate\\s+table?\\s+`?(\\w+)`?/gi,\n ];\n\n patterns.forEach((pattern) => {\n let match;\n while ((match = pattern.exec(sql)) !== null) {\n if (match[1]) {\n tables.push(match[1].toLowerCase());\n }\n }\n });\n\n return [...new Set(tables)];\n }\n}\n\n/**\n * Helper function to create a cached adapter\n */\nexport function createCachedAdapter(\n adapter: DatabaseAdapter,\n cache: CacheAdapter,\n options?: Partial<CachedAdapterOptions>,\n): CachedAdapter {\n return new CachedAdapter({\n adapter,\n cache,\n ...options,\n });\n}\n","import { createCipheriv, createDecipheriv, randomBytes, pbkdf2Sync } from 'node:crypto';\n\nexport interface CryptoConfig {\n algorithm?: string;\n keyLength?: number;\n ivLength?: number;\n saltLength?: number;\n iterations?: number;\n digest?: string;\n}\n\nexport interface EncryptionOptions {\n key?: string;\n salt?: Buffer;\n encoding?: BufferEncoding;\n}\n\nexport interface EncryptedData {\n encrypted: string;\n salt: string;\n iv: string;\n authTag?: string;\n}\n\nexport class CryptoProvider {\n private readonly config: Required<CryptoConfig>;\n\n constructor(config: CryptoConfig = {}) {\n const algorithm = config.algorithm || 'aes-256-gcm';\n // ChaCha20-Poly1305 requires 12 byte IV\n const ivLength = algorithm === 'chacha20-poly1305' ? 12 : config.ivLength || 16;\n\n // Determine key length based on algorithm\n let keyLength = config.keyLength || 32;\n if (!config.keyLength) {\n if (algorithm.includes('128')) {\n keyLength = 16;\n } else if (algorithm.includes('192')) {\n keyLength = 24;\n } else if (algorithm.includes('256')) {\n keyLength = 32;\n }\n }\n\n this.config = {\n algorithm,\n keyLength,\n ivLength,\n saltLength: config.saltLength || 32,\n iterations: config.iterations || 100_000,\n digest: config.digest || 'sha256',\n };\n }\n\n private deriveKey(password: string, salt: Buffer): Buffer {\n return pbkdf2Sync(\n password,\n salt,\n this.config.iterations,\n this.config.keyLength,\n this.config.digest,\n );\n }\n\n encrypt(data: string, options: EncryptionOptions = {}): EncryptedData {\n const salt = options.salt || randomBytes(this.config.saltLength);\n const key = options.key\n ? Buffer.from(options.key, 'hex')\n : this.deriveKey(process.env['DB_BRIDGE_ENCRYPTION_KEY'] || 'default-key', salt);\n\n const iv = randomBytes(this.config.ivLength);\n const cipher = createCipheriv(this.config.algorithm, key, iv);\n\n let encrypted = cipher.update(data, 'utf8', 'hex');\n encrypted += cipher.final('hex');\n\n const result: EncryptedData = {\n encrypted,\n salt: salt.toString('hex'),\n iv: iv.toString('hex'),\n };\n\n // For authenticated encryption modes (GCM, Poly1305), we need the auth tag\n if (this.config.algorithm.includes('gcm') || this.config.algorithm.includes('poly1305')) {\n result.authTag = (cipher as any).getAuthTag().toString('hex');\n }\n\n return result;\n }\n\n decrypt(encryptedData: EncryptedData, options: EncryptionOptions = {}): string {\n const salt = Buffer.from(encryptedData.salt, 'hex');\n const key = options.key\n ? Buffer.from(options.key, 'hex')\n : this.deriveKey(process.env['DB_BRIDGE_ENCRYPTION_KEY'] || 'default-key', salt);\n\n const iv = Buffer.from(encryptedData.iv, 'hex');\n const decipher = createDecipheriv(this.config.algorithm, key, iv);\n\n // For authenticated encryption modes (GCM, Poly1305), set the auth tag\n if (\n (this.config.algorithm.includes('gcm') || this.config.algorithm.includes('poly1305')) &&\n encryptedData.authTag\n ) {\n (decipher as any).setAuthTag(Buffer.from(encryptedData.authTag, 'hex'));\n }\n\n let decrypted = decipher.update(encryptedData.encrypted, 'hex', 'utf8');\n decrypted += decipher.final('utf8');\n\n return decrypted;\n }\n\n /**\n * Encrypt a value for storage in database\n */\n encryptField(value: unknown): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n const data = typeof value === 'string' ? value : JSON.stringify(value);\n const encrypted = this.encrypt(data);\n\n // Store as a single string in format: algorithm:salt:iv:authTag:encrypted\n return [\n this.config.algorithm,\n encrypted.salt,\n encrypted.iv,\n encrypted.authTag || '',\n encrypted.encrypted,\n ].join(':');\n }\n\n /**\n * Decrypt a value from database storage\n */\n decryptField(encryptedField: string): unknown {\n if (!encryptedField) {\n return null;\n }\n\n const parts = encryptedField.split(':');\n if (parts.length < 4) {\n throw new Error('Invalid encrypted field format');\n }\n\n const [algorithm, salt, iv, authTag, encrypted] = parts;\n\n // Verify algorithm matches\n if (algorithm !== this.config.algorithm) {\n throw new Error(`Algorithm mismatch: expected ${this.config.algorithm}, got ${algorithm}`);\n }\n\n const encryptedData: EncryptedData = {\n encrypted: encrypted!,\n salt: salt!,\n iv: iv!,\n authTag: authTag || undefined,\n };\n\n const decrypted = this.decrypt(encryptedData);\n\n // Try to parse as JSON, otherwise return as string\n try {\n return JSON.parse(decrypted);\n } catch {\n return decrypted;\n }\n }\n\n /**\n * Generate a random encryption key\n */\n generateKey(): string {\n return randomBytes(this.config.keyLength).toString('hex');\n }\n\n /**\n * Hash a value using SHA-256 (one-way)\n */\n hash(value: string): string {\n const hash = require('node:crypto').createHash('sha256');\n hash.update(value);\n return hash.digest('hex');\n }\n\n /**\n * Compare a plain value with a hashed value\n */\n compareHash(value: string, hash: string): boolean {\n return this.hash(value) === hash;\n }\n}\n\n// Export a default instance\nexport const crypto = new CryptoProvider();\n\n// Export additional crypto algorithms\nexport const CryptoAlgorithms = {\n AES_256_GCM: 'aes-256-gcm',\n AES_256_CBC: 'aes-256-cbc',\n AES_192_GCM: 'aes-192-gcm',\n AES_192_CBC: 'aes-192-cbc',\n AES_128_GCM: 'aes-128-gcm',\n AES_128_CBC: 'aes-128-cbc',\n CHACHA20_POLY1305: 'chacha20-poly1305',\n} as const;\n\nexport type CryptoAlgorithm = (typeof CryptoAlgorithms)[keyof typeof CryptoAlgorithms];\n","/**\n * SQL Dialect Base Class\n *\n * Provides database-agnostic SQL generation with dialect-specific\n * overrides for placeholder syntax, identifier escaping, and SQL keywords.\n *\n * Following Drizzle ORM's dialect pattern for clean separation of concerns.\n */\n\nexport interface DialectConfig {\n /** Character used to escape identifiers (e.g., ` for MySQL, \" for PostgreSQL) */\n identifierQuote: string;\n /** Whether to use named parameters (:name) or positional (?, $1) */\n namedParameters: boolean;\n /** String concatenation operator */\n concatOperator: string;\n /** Boolean literal values */\n booleanLiterals: { true: string; false: string };\n /** Date/time function names */\n dateFunctions: {\n now: string;\n currentDate: string;\n currentTime: string;\n dateFormat: (column: string, format: string) => string;\n };\n /** Limit/offset syntax style */\n limitStyle: 'LIMIT_OFFSET' | 'FETCH_FIRST' | 'TOP';\n /** JSON operators */\n jsonOperators: {\n extract: (column: string, path: string) => string;\n contains: (column: string, value: string) => string;\n };\n}\n\nexport abstract class SQLDialect {\n abstract readonly name: string;\n abstract readonly config: DialectConfig;\n\n private parameterIndex = 0;\n\n /**\n * Reset parameter index for new query\n */\n resetParameters(): void {\n this.parameterIndex = 0;\n }\n\n /**\n * Get next parameter placeholder\n * MySQL: ?\n * PostgreSQL: $1, $2, $3...\n */\n abstract getParameterPlaceholder(): string;\n\n /**\n * Escape an identifier (table name, column name)\n */\n escapeIdentifier(identifier: string): string {\n const quote = this.config.identifierQuote;\n // Handle schema.table format\n if (identifier.includes('.')) {\n return identifier\n .split('.')\n .map((part) => `${quote}${part}${quote}`)\n .join('.');\n }\n return `${quote}${identifier}${quote}`;\n }\n\n /**\n * Escape a string value for SQL\n */\n abstract escapeValue(value: unknown): string;\n\n /**\n * Build SELECT SQL from components\n */\n buildSelect(components: SelectComponents): BuiltSQL {\n const parts: string[] = [];\n const bindings: unknown[] = [];\n\n // SELECT clause\n parts.push('SELECT');\n if (components.distinct) {\n parts.push('DISTINCT');\n }\n parts.push(components.columns.length > 0 ? components.columns.join(', ') : '*');\n\n // FROM clause\n if (components.from) {\n parts.push('FROM');\n const fromClause = components.fromAlias\n ? `${this.escapeIdentifier(components.from)} AS ${this.escapeIdentifier(components.fromAlias)}`\n : this.escapeIdentifier(components.from);\n parts.push(fromClause);\n }\n\n // JOINs\n for (const join of components.joins) {\n parts.push(`${join.type} JOIN ${this.escapeIdentifier(join.table)}`);\n if (join.alias) {\n parts.push(`AS ${this.escapeIdentifier(join.alias)}`);\n }\n parts.push(`ON ${join.condition}`);\n bindings.push(...join.bindings);\n }\n\n // WHERE\n if (components.where.length > 0) {\n parts.push('WHERE');\n parts.push(this.buildWhereClause(components.where, bindings));\n }\n\n // GROUP BY\n if (components.groupBy.length > 0) {\n parts.push('GROUP BY');\n parts.push(components.groupBy.map((col) => this.escapeIdentifier(col)).join(', '));\n }\n\n // HAVING\n if (components.having) {\n parts.push('HAVING', components.having.condition);\n bindings.push(...components.having.bindings);\n }\n\n // ORDER BY\n if (components.orderBy.length > 0) {\n parts.push('ORDER BY');\n parts.push(\n components.orderBy\n .map(({ column, direction }) => `${this.escapeIdentifier(column)} ${direction}`)\n .join(', '),\n );\n }\n\n // LIMIT/OFFSET\n this.appendLimitOffset(parts, components.limit, components.offset);\n\n return {\n sql: parts.join(' '),\n bindings,\n };\n }\n\n /**\n * Build INSERT SQL from components\n */\n buildInsert(components: InsertComponents): BuiltSQL {\n const parts: string[] = [];\n const bindings: unknown[] = [];\n\n parts.push('INSERT INTO');\n parts.push(this.escapeIdentifier(components.table));\n\n const columns = Object.keys(components.data[0] || {});\n parts.push(`(${columns.map((col) => this.escapeIdentifier(col)).join(', ')})`, 'VALUES');\n\n const valueSets: string[] = [];\n for (const row of components.data) {\n const placeholders: string[] = [];\n for (const col of columns) {\n placeholders.push(this.getParameterPlaceholder());\n bindings.push(row[col]);\n }\n valueSets.push(`(${placeholders.join(', ')})`);\n }\n parts.push(valueSets.join(', '));\n\n // RETURNING clause (PostgreSQL)\n if (components.returning && components.returning.length > 0) {\n parts.push('RETURNING');\n parts.push(components.returning.map((col) => this.escapeIdentifier(col)).join(', '));\n }\n\n return {\n sql: parts.join(' '),\n bindings,\n };\n }\n\n /**\n * Build UPDATE SQL from components\n */\n buildUpdate(components: UpdateComponents): BuiltSQL {\n const parts: string[] = [];\n const bindings: unknown[] = [];\n\n parts.push('UPDATE');\n parts.push(this.escapeIdentifier(components.table), 'SET');\n\n const setClauses: string[] = [];\n for (const [column, value] of Object.entries(components.data)) {\n setClauses.push(`${this.escapeIdentifier(column)} = ${this.getParameterPlaceholder()}`);\n bindings.push(value);\n }\n parts.push(setClauses.join(', '));\n\n // WHERE\n if (components.where.length > 0) {\n parts.push('WHERE');\n parts.push(this.buildWhereClause(components.where, bindings));\n }\n\n // RETURNING clause (PostgreSQL)\n if (components.returning && components.returning.length > 0) {\n parts.push('RETURNING');\n parts.push(components.returning.map((col) => this.escapeIdentifier(col)).join(', '));\n }\n\n return {\n sql: parts.join(' '),\n bindings,\n };\n }\n\n /**\n * Build DELETE SQL from components\n */\n buildDelete(components: DeleteComponents): BuiltSQL {\n const parts: string[] = [];\n const bindings: unknown[] = [];\n\n parts.push('DELETE FROM');\n parts.push(this.escapeIdentifier(components.table));\n\n // WHERE\n if (components.where.length > 0) {\n parts.push('WHERE');\n parts.push(this.buildWhereClause(components.where, bindings));\n }\n\n // RETURNING clause (PostgreSQL)\n if (components.returning && components.returning.length > 0) {\n parts.push('RETURNING');\n parts.push(components.returning.map((col) => this.escapeIdentifier(col)).join(', '));\n }\n\n return {\n sql: parts.join(' '),\n bindings,\n };\n }\n\n /**\n * Build WHERE clause from conditions\n */\n protected buildWhereClause(conditions: WhereCondition[], bindings: unknown[]): string {\n return conditions\n .map((condition, index) => {\n const prefix = index === 0 ? '' : ` ${condition.type} `;\n bindings.push(...condition.bindings);\n return `${prefix}${condition.sql}`;\n })\n .join('');\n }\n\n /**\n * Append LIMIT/OFFSET based on dialect style\n */\n protected appendLimitOffset(parts: string[], limit?: number, offset?: number): void {\n switch (this.config.limitStyle) {\n case 'LIMIT_OFFSET': {\n if (limit !== undefined) {\n parts.push(`LIMIT ${limit}`);\n }\n if (offset !== undefined) {\n parts.push(`OFFSET ${offset}`);\n }\n break;\n }\n case 'FETCH_FIRST': {\n if (offset !== undefined) {\n parts.push(`OFFSET ${offset} ROWS`);\n }\n if (limit !== undefined) {\n parts.push(`FETCH FIRST ${limit} ROWS ONLY`);\n }\n break;\n }\n case 'TOP': {\n // TOP is handled in SELECT clause for SQL Server\n break;\n }\n }\n }\n\n /**\n * Increment and return parameter index (for PostgreSQL-style)\n */\n protected nextParameterIndex(): number {\n return ++this.parameterIndex;\n }\n}\n\n// ============ Type Definitions ============\n\nexport interface BuiltSQL {\n sql: string;\n bindings: unknown[];\n}\n\nexport interface WhereCondition {\n type: 'AND' | 'OR';\n sql: string;\n bindings: unknown[];\n}\n\nexport interface JoinDefinition {\n type: 'INNER' | 'LEFT' | 'RIGHT' | 'FULL' | 'CROSS';\n table: string;\n alias?: string;\n condition: string;\n bindings: unknown[];\n}\n\nexport interface OrderByDefinition {\n column: string;\n direction: 'ASC' | 'DESC';\n raw?: boolean;\n}\n\nexport interface SelectComponents {\n columns: string[];\n distinct?: boolean;\n from?: string;\n fromAlias?: string;\n joins: JoinDefinition[];\n where: WhereCondition[];\n groupBy: string[];\n having?: { condition: string; bindings: unknown[] };\n orderBy: OrderByDefinition[];\n limit?: number;\n offset?: number;\n}\n\nexport interface InsertComponents {\n table: string;\n data: Record<string, unknown>[];\n returning?: string[];\n}\n\nexport interface UpdateComponents {\n table: string;\n data: Record<string, unknown>;\n where: WhereCondition[];\n returning?: string[];\n}\n\nexport interface DeleteComponents {\n table: string;\n where: WhereCondition[];\n returning?: string[];\n}\n","/**\n * MySQL Dialect Implementation\n *\n * Handles MySQL-specific SQL syntax:\n * - Backtick (`) identifier quoting\n * - Positional (?) parameter placeholders\n * - MySQL-specific functions and operators\n */\n\nimport { SQLDialect } from './sql-dialect';\n\nimport type { DialectConfig } from './sql-dialect';\n\nexport class MySQLDialect extends SQLDialect {\n readonly name = 'mysql';\n\n readonly config: DialectConfig = {\n identifierQuote: '`',\n namedParameters: false,\n concatOperator: 'CONCAT',\n booleanLiterals: { true: 'TRUE', false: 'FALSE' },\n dateFunctions: {\n now: 'NOW()',\n currentDate: 'CURDATE()',\n currentTime: 'CURTIME()',\n dateFormat: (column: string, format: string) => `DATE_FORMAT(${column}, '${format}')`,\n },\n limitStyle: 'LIMIT_OFFSET',\n jsonOperators: {\n extract: (column: string, path: string) => `JSON_EXTRACT(${column}, '${path}')`,\n contains: (column: string, value: string) => `JSON_CONTAINS(${column}, '${value}')`,\n },\n };\n\n /**\n * MySQL uses ? for all positional parameters\n */\n getParameterPlaceholder(): string {\n return '?';\n }\n\n /**\n * Escape value for MySQL\n */\n escapeValue(value: unknown): string {\n if (value === null || value === undefined) {\n return 'NULL';\n }\n\n if (typeof value === 'boolean') {\n return value ? 'TRUE' : 'FALSE';\n }\n\n if (typeof value === 'number') {\n return String(value);\n }\n\n if (value instanceof Date) {\n return `'${value.toISOString().slice(0, 19).replace('T', ' ')}'`;\n }\n\n if (typeof value === 'string') {\n // Escape single quotes and backslashes\n return `'${value.replaceAll('\\\\', '\\\\\\\\').replaceAll(\"'\", \"\\\\'\")}'`;\n }\n\n if (Buffer.isBuffer(value)) {\n return `X'${value.toString('hex')}'`;\n }\n\n // Arrays and objects - serialize as JSON\n return `'${JSON.stringify(value).replaceAll(\"'\", \"\\\\'\")}'`;\n }\n\n /**\n * MySQL-specific: INSERT ... ON DUPLICATE KEY UPDATE\n */\n buildUpsert(\n table: string,\n data: Record<string, unknown>,\n conflictColumns: string[],\n ): { sql: string; bindings: unknown[] } {\n const columns = Object.keys(data);\n const bindings: unknown[] = [];\n\n const parts: string[] = [];\n parts.push('INSERT INTO');\n parts.push(this.escapeIdentifier(table));\n parts.push(`(${columns.map((col) => this.escapeIdentifier(col)).join(', ')})`, 'VALUES');\n\n const placeholders = columns.map(() => this.getParameterPlaceholder());\n parts.push(`(${placeholders.join(', ')})`);\n bindings.push(...Object.values(data));\n\n parts.push('ON DUPLICATE KEY UPDATE');\n const updateClauses = columns\n .filter((col) => !conflictColumns.includes(col))\n .map((col) => `${this.escapeIdentifier(col)} = VALUES(${this.escapeIdentifier(col)})`);\n parts.push(updateClauses.join(', '));\n\n return {\n sql: parts.join(' '),\n bindings,\n };\n }\n\n /**\n * MySQL-specific: REPLACE INTO\n */\n buildReplace(table: string, data: Record<string, unknown>): { sql: string; bindings: unknown[] } {\n const columns = Object.keys(data);\n const bindings: unknown[] = [];\n\n const parts: string[] = [];\n parts.push('REPLACE INTO');\n parts.push(this.escapeIdentifier(table));\n parts.push(`(${columns.map((col) => this.escapeIdentifier(col)).join(', ')})`, 'VALUES');\n\n const placeholders = columns.map(() => this.getParameterPlaceholder());\n parts.push(`(${placeholders.join(', ')})`);\n bindings.push(...Object.values(data));\n\n return {\n sql: parts.join(' '),\n bindings,\n };\n }\n\n /**\n * MySQL-specific: Get last insert ID\n */\n getLastInsertIdSQL(): string {\n return 'SELECT LAST_INSERT_ID() as id';\n }\n\n /**\n * MySQL-specific: OFFSET requires LIMIT\n * If offset is specified without limit, use a very large limit (18446744073709551615 = max bigint)\n */\n protected override appendLimitOffset(parts: string[], limit?: number, offset?: number): void {\n // MySQL requires LIMIT before OFFSET\n if (offset !== undefined && limit === undefined) {\n // Use MySQL's max bigint unsigned as unlimited\n parts.push('LIMIT 18446744073709551615');\n parts.push(`OFFSET ${offset}`);\n } else if (limit !== undefined) {\n parts.push(`LIMIT ${limit}`);\n if (offset !== undefined) {\n parts.push(`OFFSET ${offset}`);\n }\n }\n }\n}\n","/**\n * PostgreSQL Dialect Implementation\n *\n * Handles PostgreSQL-specific SQL syntax:\n * - Double quote (\") identifier quoting\n * - Numbered ($1, $2) parameter placeholders\n * - PostgreSQL-specific functions and operators\n * - RETURNING clause support\n */\n\nimport { SQLDialect } from './sql-dialect';\n\nimport type { DialectConfig } from './sql-dialect';\n\nexport class PostgreSQLDialect extends SQLDialect {\n readonly name = 'postgresql';\n\n readonly config: DialectConfig = {\n identifierQuote: '\"',\n namedParameters: false,\n concatOperator: '||',\n booleanLiterals: { true: 'TRUE', false: 'FALSE' },\n dateFunctions: {\n now: 'NOW()',\n currentDate: 'CURRENT_DATE',\n currentTime: 'CURRENT_TIME',\n dateFormat: (column: string, format: string) => `TO_CHAR(${column}, '${format}')`,\n },\n limitStyle: 'LIMIT_OFFSET',\n jsonOperators: {\n extract: (column: string, path: string) => `${column}->'${path}'`,\n contains: (column: string, value: string) => `${column} @> '${value}'`,\n },\n };\n\n /**\n * PostgreSQL uses $1, $2, $3... for positional parameters\n */\n getParameterPlaceholder(): string {\n return `$${this.nextParameterIndex()}`;\n }\n\n /**\n * Escape value for PostgreSQL\n */\n escapeValue(value: unknown): string {\n if (value === null || value === undefined) {\n return 'NULL';\n }\n\n if (typeof value === 'boolean') {\n return value ? 'TRUE' : 'FALSE';\n }\n\n if (typeof value === 'number') {\n return String(value);\n }\n\n if (value instanceof Date) {\n return `'${value.toISOString()}'::timestamptz`;\n }\n\n if (typeof value === 'string') {\n // PostgreSQL uses doubled single quotes for escaping\n return `'${value.replaceAll(\"'\", \"''\")}'`;\n }\n\n if (Buffer.isBuffer(value)) {\n return `'\\\\x${value.toString('hex')}'::bytea`;\n }\n\n if (Array.isArray(value)) {\n // PostgreSQL array literal\n const escaped = value.map((v) => this.escapeValue(v)).join(', ');\n return `ARRAY[${escaped}]`;\n }\n\n // Objects - serialize as JSONB\n return `'${JSON.stringify(value).replaceAll(\"'\", \"''\")}'::jsonb`;\n }\n\n /**\n * PostgreSQL-specific: INSERT ... ON CONFLICT\n */\n buildUpsert(\n table: string,\n data: Record<string, unknown>,\n conflictColumns: string[],\n updateColumns?: string[],\n ): { sql: string; bindings: unknown[] } {\n const columns = Object.keys(data);\n const bindings: unknown[] = [];\n\n this.resetParameters();\n\n const parts: string[] = [];\n parts.push('INSERT INTO');\n parts.push(this.escapeIdentifier(table));\n parts.push(`(${columns.map((col) => this.escapeIdentifier(col)).join(', ')})`, 'VALUES');\n\n const placeholders = columns.map(() => this.getParameterPlaceholder());\n parts.push(`(${placeholders.join(', ')})`);\n bindings.push(...Object.values(data));\n\n parts.push('ON CONFLICT');\n parts.push(`(${conflictColumns.map((col) => this.escapeIdentifier(col)).join(', ')})`);\n\n const toUpdate = updateColumns || columns.filter((col) => !conflictColumns.includes(col));\n\n if (toUpdate.length > 0) {\n parts.push('DO UPDATE SET');\n const updateClauses = toUpdate.map(\n (col) => `${this.escapeIdentifier(col)} = EXCLUDED.${this.escapeIdentifier(col)}`,\n );\n parts.push(updateClauses.join(', '));\n } else {\n parts.push('DO NOTHING');\n }\n\n return {\n sql: parts.join(' '),\n bindings,\n };\n }\n\n /**\n * PostgreSQL-specific: CTE (Common Table Expressions)\n */\n buildWithCTE(cteName: string, cteQuery: string, mainQuery: string, recursive = false): string {\n const withKeyword = recursive ? 'WITH RECURSIVE' : 'WITH';\n return `${withKeyword} ${this.escapeIdentifier(cteName)} AS (${cteQuery}) ${mainQuery}`;\n }\n\n /**\n * PostgreSQL-specific: RETURNING clause\n */\n buildReturning(columns: string[]): string {\n if (columns.length === 0) {\n return 'RETURNING *';\n }\n return `RETURNING ${columns.map((col) => this.escapeIdentifier(col)).join(', ')}`;\n }\n\n /**\n * PostgreSQL-specific: Array operations\n */\n buildArrayContains(column: string, value: unknown): string {\n return `${this.escapeValue(value)} = ANY(${this.escapeIdentifier(column)})`;\n }\n\n buildArrayOverlap(column: string, values: unknown[]): string {\n return `${this.escapeIdentifier(column)} && ARRAY[${values.map((v) => this.escapeValue(v)).join(', ')}]`;\n }\n\n /**\n * PostgreSQL-specific: Full-text search\n */\n buildTextSearch(column: string, query: string, config = 'english'): string {\n return `to_tsvector('${config}', ${this.escapeIdentifier(column)}) @@ plainto_tsquery('${config}', ${this.escapeValue(query)})`;\n }\n\n /**\n * PostgreSQL-specific: JSON/JSONB operations\n */\n buildJsonPath(column: string, path: string[]): string {\n const pathExpr = path.map((p) => `'${p}'`).join('->');\n return `${this.escapeIdentifier(column)}->${pathExpr}`;\n }\n\n buildJsonPathText(column: string, path: string[]): string {\n if (path.length === 0) {\n return column;\n }\n const lastPath = path.pop()!;\n const pathExpr =\n path.length > 0\n ? `${this.escapeIdentifier(column)}->${path.map((p) => `'${p}'`).join('->')}->>>'${lastPath}'`\n : `${this.escapeIdentifier(column)}->>'${lastPath}'`;\n return pathExpr;\n }\n}\n","/**\n * Dialect Factory\n *\n * Creates appropriate SQL dialect based on database type.\n * Implements Factory pattern for clean dialect instantiation.\n */\n\nimport { MySQLDialect } from './mysql-dialect';\nimport { PostgreSQLDialect } from './postgresql-dialect';\n\nimport type { SQLDialect } from './sql-dialect';\n\nexport type DialectDatabaseType = 'mysql' | 'mariadb' | 'postgresql' | 'postgres';\n\nconst dialectCache = new Map<DialectDatabaseType, SQLDialect>();\n\nexport class DialectFactory {\n /**\n * Get dialect for database type (cached)\n */\n static getDialect(type: DialectDatabaseType): SQLDialect {\n // Normalize type\n const normalizedType = this.normalizeType(type);\n\n // Check cache\n if (dialectCache.has(normalizedType)) {\n return dialectCache.get(normalizedType)!;\n }\n\n // Create dialect\n const dialect = this.createDialect(normalizedType);\n dialectCache.set(normalizedType, dialect);\n return dialect;\n }\n\n /**\n * Create new dialect instance (not cached)\n */\n static createDialect(type: DialectDatabaseType): SQLDialect {\n const normalizedType = this.normalizeType(type);\n\n switch (normalizedType) {\n case 'mysql': {\n return new MySQLDialect();\n }\n case 'postgresql': {\n return new PostgreSQLDialect();\n }\n default: {\n throw new Error(`Unsupported database type: ${type}`);\n }\n }\n }\n\n /**\n * Normalize database type aliases\n */\n private static normalizeType(type: DialectDatabaseType): 'mysql' | 'postgresql' {\n switch (type) {\n case 'mysql':\n case 'mariadb': {\n return 'mysql';\n }\n case 'postgresql':\n case 'postgres': {\n return 'postgresql';\n }\n default: {\n throw new Error(`Unknown database type: ${type}`);\n }\n }\n }\n\n /**\n * Check if database type is supported\n */\n static isSupported(type: string): type is DialectDatabaseType {\n return ['mysql', 'mariadb', 'postgresql', 'postgres'].includes(type);\n }\n\n /**\n * Clear dialect cache (useful for testing)\n */\n static clearCache(): void {\n dialectCache.clear();\n }\n}\n","/**\n * Query Context\n *\n * Shared context for all query builders containing:\n * - Database dialect\n * - Query executor\n * - Crypto provider (optional)\n * - Cache config (optional)\n *\n * This separates execution concerns from query building.\n */\n\nimport { createHash } from 'node:crypto';\n\nimport type { CryptoProvider } from '../crypto/crypto';\nimport type { SQLDialect } from '../dialect/sql-dialect';\nimport type { CacheAdapter } from '../interfaces';\nimport type { QueryResult } from '../types';\n\n/**\n * Execute result for write operations (INSERT/UPDATE/DELETE)\n */\nexport interface ExecuteResult {\n affectedRows: number;\n insertId?: number | bigint;\n changedRows?: number;\n}\n\n/**\n * Query executor interface - implemented by adapters\n */\nexport interface QueryExecutor {\n query<T = unknown>(sql: string, params?: unknown[]): Promise<QueryResult<T>>;\n execute(sql: string, params?: unknown[]): Promise<ExecuteResult>;\n}\n\n/**\n * Cache configuration for QueryContext\n */\nexport interface QueryContextCacheConfig {\n adapter: CacheAdapter;\n defaultTTL: number;\n maxTTL: number;\n prefix: string;\n global: boolean;\n warnOnLargeResult: number;\n maxCacheableRows: number;\n logger?: { warn: (message: string) => void };\n}\n\n// Re-export for convenience\n\n/**\n * Query context containing all dependencies for query execution\n */\nexport class QueryContext {\n public readonly cacheConfig?: QueryContextCacheConfig;\n\n constructor(\n public readonly dialect: SQLDialect,\n public readonly executor: QueryExecutor,\n public readonly crypto?: CryptoProvider,\n cacheConfig?: QueryContextCacheConfig,\n ) {\n this.cacheConfig = cacheConfig;\n }\n\n /**\n * Execute a SELECT query\n */\n async executeQuery<T>(sql: string, bindings: unknown[]): Promise<QueryResult<T>> {\n this.dialect.resetParameters();\n return this.executor.query<T>(sql, bindings);\n }\n\n /**\n * Execute a write query (INSERT/UPDATE/DELETE)\n */\n async executeWrite(sql: string, bindings: unknown[]): Promise<ExecuteResult> {\n this.dialect.resetParameters();\n const result = await this.executor.execute(sql, bindings);\n return result;\n }\n\n /**\n * Encrypt a value if crypto provider is available\n */\n encrypt(value: string): string {\n if (!this.crypto) {\n throw new Error('Crypto provider not configured');\n }\n return this.crypto.encryptField(value);\n }\n\n /**\n * Decrypt a value if crypto provider is available\n */\n decrypt(value: string): string {\n if (!this.crypto) {\n throw new Error('Crypto provider not configured');\n }\n const decrypted = this.crypto.decryptField(value);\n return typeof decrypted === 'string' ? decrypted : JSON.stringify(decrypted);\n }\n\n /**\n * Check if crypto is available\n */\n get hasCrypto(): boolean {\n return this.crypto !== undefined;\n }\n\n /**\n * Check if cache is available\n */\n get hasCache(): boolean {\n return this.cacheConfig !== undefined;\n }\n\n /**\n * Generate cache key from SQL and bindings\n */\n generateCacheKey(sql: string, bindings: unknown[]): string {\n const prefix = this.cacheConfig?.prefix || 'qb:';\n const hash = createHash('sha256')\n .update(sql + JSON.stringify(bindings))\n .digest('hex')\n .slice(0, 16);\n return `${prefix}${hash}`;\n }\n\n /**\n * Execute a cached SELECT query\n *\n * Safety measures:\n * - Enforces maxTTL limit\n * - Skips caching for large result sets\n * - Warns on results exceeding threshold\n */\n async executeCachedQuery<T>(\n sql: string,\n bindings: unknown[],\n options?: { ttl?: number; key?: string },\n ): Promise<QueryResult<T>> {\n if (!this.cacheConfig) {\n // No cache configured, execute directly\n return this.executeQuery<T>(sql, bindings);\n }\n\n const cacheKey = options?.key || this.generateCacheKey(sql, bindings);\n\n // Enforce TTL limits\n let ttl = options?.ttl || this.cacheConfig.defaultTTL;\n if (ttl > this.cacheConfig.maxTTL) {\n ttl = this.cacheConfig.maxTTL;\n this.cacheConfig.logger?.warn(\n `Cache TTL ${options?.ttl}s exceeds maxTTL ${this.cacheConfig.maxTTL}s, using maxTTL`,\n );\n }\n\n // Try to get from cache\n const cached = await this.cacheConfig.adapter.get<QueryResult<T>>(cacheKey);\n if (cached !== null && cached !== undefined) {\n return cached;\n }\n\n // Execute query\n const result = await this.executeQuery<T>(sql, bindings);\n\n // Safety: Skip caching for large result sets\n if (result.rowCount > this.cacheConfig.maxCacheableRows) {\n this.cacheConfig.logger?.warn(\n `Skipping cache for query with ${result.rowCount} rows (max: ${this.cacheConfig.maxCacheableRows}). Use pagination instead.`,\n );\n return result;\n }\n\n // Warn on large results\n if (result.rowCount > this.cacheConfig.warnOnLargeResult) {\n this.cacheConfig.logger?.warn(\n `Caching ${result.rowCount} rows. Consider using pagination for better performance.`,\n );\n }\n\n // Store in cache\n await this.cacheConfig.adapter.set(cacheKey, result, ttl);\n\n return result;\n }\n\n /**\n * Invalidate cache for a table\n */\n async invalidateCache(pattern?: string): Promise<void> {\n if (!this.cacheConfig) {\n return;\n }\n\n const prefix = this.cacheConfig.prefix || 'qb:';\n const key = pattern ? `${prefix}${pattern}*` : `${prefix}*`;\n\n // If the adapter supports delete by pattern\n if (typeof (this.cacheConfig.adapter as any).deletePattern === 'function') {\n await (this.cacheConfig.adapter as any).deletePattern(key);\n }\n }\n}\n\nexport { type FieldInfo, type QueryResult } from '../types';\n","/**\n * Where Builder\n *\n * Handles WHERE clause construction with type-safe conditions.\n * Used by SelectBuilder, UpdateBuilder, and DeleteBuilder.\n *\n * Supports:\n * - Simple equality: where('column', value)\n * - Operators: where('column', '>=', value)\n * - Object syntax: where({ column1: value1, column2: value2 })\n * - Raw SQL: whereRaw('column > ?', [value])\n * - NULL checks: whereNull, whereNotNull\n * - IN clauses: whereIn, whereNotIn\n * - BETWEEN: whereBetween\n * - LIKE: whereLike\n */\n\nimport type { SQLDialect, WhereCondition } from '../dialect/sql-dialect';\n\nexport type WhereConditionInput =\n | { type: 'simple'; column: string; operator: string; value: unknown }\n | { type: 'object'; data: Record<string, unknown> }\n | { type: 'raw'; sql: string; bindings: unknown[] }\n | { type: 'null'; column: string; not: boolean }\n | { type: 'in'; column: string; values: unknown[]; not: boolean }\n | { type: 'between'; column: string; from: unknown; to: unknown; not: boolean }\n | { type: 'like'; column: string; pattern: string; not: boolean };\n\nexport class WhereBuilder {\n private conditions: Array<{ conjunction: 'AND' | 'OR'; input: WhereConditionInput }> = [];\n\n constructor(private readonly dialect: SQLDialect) {}\n\n /**\n * Add AND WHERE condition\n */\n where(column: string, value: unknown): this;\n where(column: string, operator: string, value: unknown): this;\n where(conditions: Record<string, unknown>): this;\n where(\n columnOrConditions: string | Record<string, unknown>,\n operatorOrValue?: string | unknown,\n value?: unknown,\n ): this {\n const input = this.parseWhereArgs(columnOrConditions, operatorOrValue, value);\n this.conditions.push({ conjunction: 'AND', input });\n return this;\n }\n\n /**\n * Add OR WHERE condition\n */\n orWhere(column: string, value: unknown): this;\n orWhere(column: string, operator: string, value: unknown): this;\n orWhere(conditions: Record<string, unknown>): this;\n orWhere(\n columnOrConditions: string | Record<string, unknown>,\n operatorOrValue?: string | unknown,\n value?: unknown,\n ): this {\n const input = this.parseWhereArgs(columnOrConditions, operatorOrValue, value);\n this.conditions.push({ conjunction: 'OR', input });\n return this;\n }\n\n /**\n * WHERE column IS NULL\n */\n whereNull(column: string): this {\n this.conditions.push({\n conjunction: 'AND',\n input: { type: 'null', column, not: false },\n });\n return this;\n }\n\n /**\n * WHERE column IS NOT NULL\n */\n whereNotNull(column: string): this {\n this.conditions.push({\n conjunction: 'AND',\n input: { type: 'null', column, not: true },\n });\n return this;\n }\n\n /**\n * WHERE column IN (...)\n */\n whereIn(column: string, values: unknown[]): this {\n this.conditions.push({\n conjunction: 'AND',\n input: { type: 'in', column, values, not: false },\n });\n return this;\n }\n\n /**\n * WHERE column NOT IN (...)\n */\n whereNotIn(column: string, values: unknown[]): this {\n this.conditions.push({\n conjunction: 'AND',\n input: { type: 'in', column, values, not: true },\n });\n return this;\n }\n\n /**\n * WHERE column BETWEEN ... AND ...\n */\n whereBetween(column: string, from: unknown, to: unknown): this {\n this.conditions.push({\n conjunction: 'AND',\n input: { type: 'between', column, from, to, not: false },\n });\n return this;\n }\n\n /**\n * WHERE column NOT BETWEEN ... AND ...\n */\n whereNotBetween(column: string, from: unknown, to: unknown): this {\n this.conditions.push({\n conjunction: 'AND',\n input: { type: 'between', column, from, to, not: true },\n });\n return this;\n }\n\n /**\n * WHERE column LIKE pattern\n */\n whereLike(column: string, pattern: string): this {\n this.conditions.push({\n conjunction: 'AND',\n input: { type: 'like', column, pattern, not: false },\n });\n return this;\n }\n\n /**\n * WHERE column NOT LIKE pattern\n */\n whereNotLike(column: string, pattern: string): this {\n this.conditions.push({\n conjunction: 'AND',\n input: { type: 'like', column, pattern, not: true },\n });\n return this;\n }\n\n /**\n * Raw WHERE clause\n */\n whereRaw(sql: string, bindings: unknown[] = []): this {\n this.conditions.push({\n conjunction: 'AND',\n input: { type: 'raw', sql, bindings },\n });\n return this;\n }\n\n /**\n * Build WHERE conditions for use by SQLDialect\n */\n build(): WhereCondition[] {\n return this.conditions.map(({ conjunction, input }, index) => {\n const result = this.buildCondition(input);\n return {\n type: index === 0 ? 'AND' : conjunction,\n sql: result.sql,\n bindings: result.bindings,\n };\n });\n }\n\n /**\n * Check if any conditions exist\n */\n hasConditions(): boolean {\n return this.conditions.length > 0;\n }\n\n /**\n * Clear all conditions\n */\n clear(): void {\n this.conditions = [];\n }\n\n /**\n * Clone the WhereBuilder\n */\n clone(): WhereBuilder {\n const cloned = new WhereBuilder(this.dialect);\n // Deep clone conditions array\n cloned.conditions = this.conditions.map((cond) => ({\n conjunction: cond.conjunction,\n input: this.cloneInput(cond.input),\n }));\n return cloned;\n }\n\n /**\n * Deep clone a WhereConditionInput\n */\n private cloneInput(input: WhereConditionInput): WhereConditionInput {\n switch (input.type) {\n case 'simple': {\n return { ...input };\n }\n case 'object': {\n return { ...input, data: { ...input.data } };\n }\n case 'raw': {\n return { ...input, bindings: [...input.bindings] };\n }\n case 'null': {\n return { ...input };\n }\n case 'in': {\n return { ...input, values: [...input.values] };\n }\n case 'between': {\n return { ...input };\n }\n case 'like': {\n return { ...input };\n }\n }\n }\n\n /**\n * Parse where method arguments into WhereConditionInput\n */\n private parseWhereArgs(\n columnOrConditions: string | Record<string, unknown>,\n operatorOrValue?: string | unknown,\n value?: unknown,\n ): WhereConditionInput {\n // Object syntax: where({ column: value })\n if (typeof columnOrConditions === 'object') {\n return { type: 'object', data: columnOrConditions };\n }\n\n // Three args: where('column', '>=', value)\n if (value !== undefined) {\n return {\n type: 'simple',\n column: columnOrConditions,\n operator: operatorOrValue as string,\n value,\n };\n }\n\n // Two args: where('column', value) - defaults to '='\n return {\n type: 'simple',\n column: columnOrConditions,\n operator: '=',\n value: operatorOrValue,\n };\n }\n\n /**\n * Build a single condition to SQL\n */\n private buildCondition(input: WhereConditionInput): { sql: string; bindings: unknown[] } {\n switch (input.type) {\n case 'simple': {\n return this.buildSimpleCondition(input.column, input.operator, input.value);\n }\n\n case 'object': {\n return this.buildObjectCondition(input.data);\n }\n\n case 'raw': {\n return { sql: input.sql, bindings: input.bindings };\n }\n\n case 'null': {\n return {\n sql: `${this.dialect.escapeIdentifier(input.column)} IS ${input.not ? 'NOT ' : ''}NULL`,\n bindings: [],\n };\n }\n\n case 'in': {\n return this.buildInCondition(input.column, input.values, input.not);\n }\n\n case 'between': {\n return this.buildBetweenCondition(input.column, input.from, input.to, input.not);\n }\n\n case 'like': {\n return {\n sql: `${this.dialect.escapeIdentifier(input.column)} ${input.not ? 'NOT ' : ''}LIKE ${this.dialect.getParameterPlaceholder()}`,\n bindings: [input.pattern],\n };\n }\n }\n }\n\n private buildSimpleCondition(\n column: string,\n operator: string,\n value: unknown,\n ): { sql: string; bindings: unknown[] } {\n const escapedColumn = this.dialect.escapeIdentifier(column);\n\n // Handle NULL values\n if (value === null || value === undefined) {\n if (operator === '=' || operator === '==') {\n return { sql: `${escapedColumn} IS NULL`, bindings: [] };\n }\n if (operator === '!=' || operator === '<>') {\n return { sql: `${escapedColumn} IS NOT NULL`, bindings: [] };\n }\n }\n\n const placeholder = this.dialect.getParameterPlaceholder();\n return {\n sql: `${escapedColumn} ${operator} ${placeholder}`,\n bindings: [value],\n };\n }\n\n private buildObjectCondition(data: Record<string, unknown>): {\n sql: string;\n bindings: unknown[];\n } {\n const clauses: string[] = [];\n const bindings: unknown[] = [];\n\n for (const [column, value] of Object.entries(data)) {\n const result = this.buildSimpleCondition(column, '=', value);\n clauses.push(result.sql);\n bindings.push(...result.bindings);\n }\n\n return {\n sql: clauses.length > 1 ? `(${clauses.join(' AND ')})` : clauses[0] || '1=1',\n bindings,\n };\n }\n\n private buildInCondition(\n column: string,\n values: unknown[],\n not: boolean,\n ): { sql: string; bindings: unknown[] } {\n if (values.length === 0) {\n // Empty IN clause - always false (or true for NOT IN)\n return { sql: not ? '1=1' : '1=0', bindings: [] };\n }\n\n const placeholders = values.map(() => this.dialect.getParameterPlaceholder());\n const operator = not ? 'NOT IN' : 'IN';\n\n return {\n sql: `${this.dialect.escapeIdentifier(column)} ${operator} (${placeholders.join(', ')})`,\n bindings: values,\n };\n }\n\n private buildBetweenCondition(\n column: string,\n from: unknown,\n to: unknown,\n not: boolean,\n ): { sql: string; bindings: unknown[] } {\n const escapedColumn = this.dialect.escapeIdentifier(column);\n const placeholder1 = this.dialect.getParameterPlaceholder();\n const placeholder2 = this.dialect.getParameterPlaceholder();\n const operator = not ? 'NOT BETWEEN' : 'BETWEEN';\n\n return {\n sql: `${escapedColumn} ${operator} ${placeholder1} AND ${placeholder2}`,\n bindings: [from, to],\n };\n }\n}\n","/**\n * Select Query Builder\n *\n * Fluent builder for SELECT queries following SRP.\n * Modularized into logical concerns via traits.\n *\n * Related modules:\n * @see traits/select-join-trait.ts - JOIN operations\n * @see traits/select-grouping-trait.ts - GROUP BY, HAVING, ORDER BY\n * @see traits/select-cache-trait.ts - Query caching\n * @see traits/select-execution-trait.ts - Query execution\n *\n * @example\n * ```typescript\n * const users = await select\n * .from('users')\n * .select('id', 'name', 'email')\n * .where('active', true)\n * .orderBy('created_at', 'DESC')\n * .limit(10)\n * .get();\n * ```\n */\n\nimport { WhereBuilder } from './where-builder';\n\nimport type { QueryContext } from './query-context';\nimport type { SelectComponents, JoinDefinition, OrderByDefinition } from '../dialect/sql-dialect';\nimport type { CacheOptions, CacheState } from './traits/select-cache-trait';\nimport type { HavingClause } from './traits/select-grouping-trait';\n\n// Re-export trait types for external use\nexport type { CacheOptions, CacheState } from './traits/select-cache-trait';\nexport type { HavingClause } from './traits/select-grouping-trait';\n\nexport class SelectBuilder<T = unknown> {\n // ============ Core State ============\n private _columns: string[] = [];\n private _distinct = false;\n private _table?: string;\n private _tableAlias?: string;\n\n // ============ Join State (from SelectJoinTrait) ============\n private _joins: JoinDefinition[] = [];\n\n // ============ Grouping State (from SelectGroupingTrait) ============\n private _groupBy: string[] = [];\n private _having?: HavingClause;\n private _orderBy: OrderByDefinition[] = [];\n\n // ============ Pagination State ============\n private _limit?: number;\n private _offset?: number;\n\n // ============ Where State ============\n private _whereBuilder: WhereBuilder;\n\n // ============ Encryption State ============\n private _encryptFields: Set<string> = new Set();\n private _decryptFields: Set<string> = new Set();\n\n // ============ Cache State (from SelectCacheTrait) ============\n private _cacheEnabled = false;\n private _cacheTTL?: number;\n private _cacheKey?: string;\n private _cacheTags?: string[];\n\n constructor(private readonly ctx: QueryContext) {\n if (ctx.cacheConfig?.global) {\n this._cacheEnabled = true;\n }\n this._whereBuilder = new WhereBuilder(ctx.dialect);\n }\n\n // ============ Core Selection Methods ============\n\n /**\n * Set columns to select\n */\n select(...columns: string[]): this {\n this._columns = columns;\n return this;\n }\n\n /**\n * Add columns to selection\n */\n addSelect(...columns: string[]): this {\n this._columns.push(...columns);\n return this;\n }\n\n /**\n * Add DISTINCT keyword\n */\n distinct(): this {\n this._distinct = true;\n return this;\n }\n\n /**\n * Set FROM table\n */\n from(table: string, alias?: string): this {\n this._table = table;\n this._tableAlias = alias;\n return this;\n }\n\n /**\n * Alias for from()\n */\n table(table: string, alias?: string): this {\n return this.from(table, alias);\n }\n\n // ============ WHERE Methods (delegated to WhereBuilder) ============\n\n where(column: string, value: unknown): this;\n where(column: string, operator: string, value: unknown): this;\n where(conditions: Record<string, unknown>): this;\n where(\n columnOrConditions: string | Record<string, unknown>,\n operatorOrValue?: string | unknown,\n value?: unknown,\n ): this {\n this._whereBuilder.where(columnOrConditions as any, operatorOrValue as any, value);\n return this;\n }\n\n orWhere(column: string, value: unknown): this;\n orWhere(column: string, operator: string, value: unknown): this;\n orWhere(conditions: Record<string, unknown>): this;\n orWhere(\n columnOrConditions: string | Record<string, unknown>,\n operatorOrValue?: string | unknown,\n value?: unknown,\n ): this {\n this._whereBuilder.orWhere(columnOrConditions as any, operatorOrValue as any, value);\n return this;\n }\n\n whereNull(column: string): this {\n this._whereBuilder.whereNull(column);\n return this;\n }\n\n whereNotNull(column: string): this {\n this._whereBuilder.whereNotNull(column);\n return this;\n }\n\n whereIn(column: string, values: unknown[]): this {\n this._whereBuilder.whereIn(column, values);\n return this;\n }\n\n whereNotIn(column: string, values: unknown[]): this {\n this._whereBuilder.whereNotIn(column, values);\n return this;\n }\n\n whereBetween(column: string, from: unknown, to: unknown): this {\n this._whereBuilder.whereBetween(column, from, to);\n return this;\n }\n\n whereLike(column: string, pattern: string): this {\n this._whereBuilder.whereLike(column, pattern);\n return this;\n }\n\n whereRaw(sql: string, bindings: unknown[] = []): this {\n this._whereBuilder.whereRaw(sql, bindings);\n return this;\n }\n\n // ============ JOIN Methods (from SelectJoinTrait) ============\n\n join(table: string, condition: string, bindings: unknown[] = []): this {\n return this.innerJoin(table, condition, bindings);\n }\n\n innerJoin(table: string, condition: string, bindings: unknown[] = []): this {\n this._joins.push({ type: 'INNER', table, condition, bindings });\n return this;\n }\n\n leftJoin(table: string, condition: string, bindings: unknown[] = []): this {\n this._joins.push({ type: 'LEFT', table, condition, bindings });\n return this;\n }\n\n rightJoin(table: string, condition: string, bindings: unknown[] = []): this {\n this._joins.push({ type: 'RIGHT', table, condition, bindings });\n return this;\n }\n\n fullJoin(table: string, condition: string, bindings: unknown[] = []): this {\n this._joins.push({ type: 'FULL', table, condition, bindings });\n return this;\n }\n\n crossJoin(table: string): this {\n this._joins.push({ type: 'CROSS', table, condition: '', bindings: [] });\n return this;\n }\n\n leftJoinAs(table: string, alias: string, condition: string, bindings: unknown[] = []): this {\n this._joins.push({ type: 'LEFT', table, alias, condition, bindings });\n return this;\n }\n\n innerJoinAs(table: string, alias: string, condition: string, bindings: unknown[] = []): this {\n this._joins.push({ type: 'INNER', table, alias, condition, bindings });\n return this;\n }\n\n // ============ GROUP BY / HAVING (from SelectGroupingTrait) ============\n\n groupBy(...columns: string[]): this {\n this._groupBy.push(...columns);\n return this;\n }\n\n having(condition: string, bindings: unknown[] = []): this {\n this._having = { condition, bindings };\n return this;\n }\n\n // ============ ORDER BY (from SelectGroupingTrait) ============\n\n orderBy(column: string, direction: 'ASC' | 'DESC' = 'ASC'): this {\n this._orderBy.push({ column, direction });\n return this;\n }\n\n orderByDesc(column: string): this {\n return this.orderBy(column, 'DESC');\n }\n\n orderByAsc(column: string): this {\n return this.orderBy(column, 'ASC');\n }\n\n orderByRaw(expression: string): this {\n this._orderBy.push({ column: expression, direction: 'ASC', raw: true });\n return this;\n }\n\n clearOrder(): this {\n this._orderBy = [];\n return this;\n }\n\n reorder(column: string, direction: 'ASC' | 'DESC' = 'ASC'): this {\n this._orderBy = [];\n return this.orderBy(column, direction);\n }\n\n // ============ LIMIT / OFFSET / Pagination ============\n\n limit(count: number): this {\n this._limit = count;\n return this;\n }\n\n offset(count: number): this {\n this._offset = count;\n return this;\n }\n\n skip(count: number): this {\n return this.offset(count);\n }\n\n take(count: number): this {\n return this.limit(count);\n }\n\n paginate(page: number, perPage: number): this {\n this._limit = perPage;\n this._offset = (page - 1) * perPage;\n return this;\n }\n\n forPage(page: number, perPage = 15): this {\n return this.paginate(page, perPage);\n }\n\n // ============ Encryption ============\n\n encrypt(...fields: string[]): this {\n fields.forEach((f) => this._encryptFields.add(f));\n return this;\n }\n\n decrypt(...fields: string[]): this {\n fields.forEach((f) => this._decryptFields.add(f));\n return this;\n }\n\n // ============ Caching (from SelectCacheTrait) ============\n\n cache(options?: number | CacheOptions): this {\n if (!this.ctx.hasCache) {\n return this;\n }\n\n this._cacheEnabled = true;\n\n if (typeof options === 'number') {\n this._cacheTTL = options;\n } else if (options) {\n this._cacheTTL = options.ttl;\n this._cacheKey = options.key;\n this._cacheTags = options.tags;\n }\n\n return this;\n }\n\n noCache(): this {\n this._cacheEnabled = false;\n this._cacheTTL = undefined;\n this._cacheKey = undefined;\n this._cacheTags = undefined;\n return this;\n }\n\n cacheTTL(seconds: number): this {\n this._cacheTTL = seconds;\n return this;\n }\n\n cacheKey(key: string): this {\n this._cacheKey = key;\n return this;\n }\n\n cacheTags(...tags: string[]): this {\n this._cacheTags = tags;\n return this;\n }\n\n getCacheState(): CacheState {\n return {\n enabled: this._cacheEnabled,\n ttl: this._cacheTTL,\n key: this._cacheKey,\n tags: this._cacheTags,\n };\n }\n\n // ============ SQL Building ============\n\n toSQL(): { sql: string; bindings: unknown[] } {\n this.ctx.dialect.resetParameters();\n\n const components: SelectComponents = {\n columns: this._columns.length > 0 ? this._columns : ['*'],\n distinct: this._distinct,\n from: this._table,\n fromAlias: this._tableAlias,\n joins: this._joins,\n where: this._whereBuilder.build(),\n groupBy: this._groupBy,\n having: this._having,\n orderBy: this._orderBy,\n limit: this._limit,\n offset: this._offset,\n };\n\n return this.ctx.dialect.buildSelect(components);\n }\n\n // ============ Execution Methods (from SelectExecutionTrait) ============\n\n async get(): Promise<T[]> {\n const { sql, bindings } = this.toSQL();\n\n const result =\n this._cacheEnabled && this.ctx.hasCache\n ? await this.ctx.executeCachedQuery<T>(sql, bindings, {\n ttl: this._cacheTTL,\n key: this._cacheKey,\n })\n : await this.ctx.executeQuery<T>(sql, bindings);\n\n return this.processResults(result.rows);\n }\n\n async first(): Promise<T | null> {\n this._limit = 1;\n const results = await this.get();\n return results[0] ?? null;\n }\n\n async firstOrFail(): Promise<T> {\n const result = await this.first();\n if (result === null) {\n throw new Error('No record found');\n }\n return result;\n }\n\n async sole(): Promise<T> {\n this._limit = 2;\n const results = await this.get();\n\n if (results.length === 0) {\n throw new Error('No record found');\n }\n if (results.length > 1) {\n throw new Error('Multiple records found when expecting one');\n }\n\n return results[0] as T;\n }\n\n async count(column = '*'): Promise<number> {\n const originalColumns = this._columns;\n this._columns = [`COUNT(${column}) as count`];\n\n const { sql, bindings } = this.toSQL();\n const result = await this.ctx.executeQuery<{ count: string | number }>(sql, bindings);\n\n this._columns = originalColumns;\n return Number(result.rows[0]?.count ?? 0);\n }\n\n async exists(): Promise<boolean> {\n const count = await this.count();\n return count > 0;\n }\n\n async doesntExist(): Promise<boolean> {\n return !(await this.exists());\n }\n\n async aggregate(\n fn: 'SUM' | 'AVG' | 'MIN' | 'MAX' | 'COUNT',\n column: string,\n ): Promise<number | null> {\n const originalColumns = this._columns;\n this._columns = [`${fn}(${this.ctx.dialect.escapeIdentifier(column)}) as value`];\n\n const { sql, bindings } = this.toSQL();\n const result = await this.ctx.executeQuery<{ value: string | number | null }>(sql, bindings);\n\n this._columns = originalColumns;\n const value = result.rows[0]?.value;\n return value === null ? null : Number(value);\n }\n\n sum(column: string): Promise<number | null> {\n return this.aggregate('SUM', column);\n }\n\n avg(column: string): Promise<number | null> {\n return this.aggregate('AVG', column);\n }\n\n min(column: string): Promise<number | null> {\n return this.aggregate('MIN', column);\n }\n\n max(column: string): Promise<number | null> {\n return this.aggregate('MAX', column);\n }\n\n async pluck<V = unknown>(column: string): Promise<V[]> {\n const originalColumns = this._columns;\n this._columns = [column];\n\n const results = await this.get();\n this._columns = originalColumns;\n\n return results.map((row: any) => row[column]) as V[];\n }\n\n async pluckKeyValue<K extends string | number, V = unknown>(\n valueColumn: string,\n keyColumn: string,\n ): Promise<Map<K, V>> {\n const originalColumns = this._columns;\n this._columns = [keyColumn, valueColumn];\n\n const results = await this.get();\n this._columns = originalColumns;\n\n const map = new Map<K, V>();\n for (const row of results as any[]) {\n map.set(row[keyColumn] as K, row[valueColumn] as V);\n }\n return map;\n }\n\n async chunk(\n size: number,\n callback: (rows: T[], chunkNumber: number) => Promise<boolean | void> | boolean | void,\n ): Promise<void> {\n let offset = 0;\n let chunkNumber = 1;\n let hasMore = true;\n\n while (hasMore) {\n this._limit = size;\n this._offset = offset;\n\n const rows = await this.get();\n\n if (rows.length === 0) {\n hasMore = false;\n continue;\n }\n\n const result = await callback(rows, chunkNumber);\n\n if (result === false) {\n hasMore = false;\n continue;\n }\n\n offset += size;\n chunkNumber++;\n\n if (rows.length < size) {\n hasMore = false;\n }\n }\n }\n\n async *lazy(chunkSize = 100): AsyncGenerator<T, void, unknown> {\n let offset = 0;\n let hasMore = true;\n\n while (hasMore) {\n this._limit = chunkSize;\n this._offset = offset;\n\n const rows = await this.get();\n\n for (const row of rows) {\n yield row;\n }\n\n if (rows.length < chunkSize) {\n hasMore = false;\n } else {\n offset += chunkSize;\n }\n }\n }\n\n // ============ Private Methods ============\n\n private processResults(rows: T[]): T[] {\n if (this._decryptFields.size === 0 || !this.ctx.hasCrypto) {\n return rows;\n }\n\n return rows.map((row) => {\n const processed = { ...row } as any;\n for (const field of this._decryptFields) {\n if (processed[field] && typeof processed[field] === 'string') {\n try {\n processed[field] = this.ctx.decrypt(processed[field]);\n } catch {\n // Keep original value if decryption fails\n }\n }\n }\n return processed as T;\n });\n }\n\n // ============ Utility Methods ============\n\n /**\n * Clone the builder\n */\n clone(): SelectBuilder<T> {\n const cloned = new SelectBuilder<T>(this.ctx);\n cloned._columns = [...this._columns];\n cloned._distinct = this._distinct;\n cloned._table = this._table;\n cloned._tableAlias = this._tableAlias;\n cloned._joins = [...this._joins];\n cloned._groupBy = [...this._groupBy];\n cloned._having = this._having ? { ...this._having } : undefined;\n cloned._orderBy = [...this._orderBy];\n cloned._limit = this._limit;\n cloned._offset = this._offset;\n cloned._encryptFields = new Set(this._encryptFields);\n cloned._decryptFields = new Set(this._decryptFields);\n cloned._cacheEnabled = this._cacheEnabled;\n cloned._cacheTTL = this._cacheTTL;\n cloned._cacheKey = this._cacheKey;\n cloned._cacheTags = this._cacheTags ? [...this._cacheTags] : undefined;\n // Clone the WhereBuilder to ensure independent state\n cloned._whereBuilder = this._whereBuilder.clone();\n return cloned;\n }\n\n /**\n * Debug helper - log query without executing\n */\n dump(): this {\n const { sql, bindings } = this.toSQL();\n // eslint-disable-next-line no-console\n console.log('SQL:', sql);\n // eslint-disable-next-line no-console\n console.log('Bindings:', bindings);\n return this;\n }\n\n /**\n * Debug helper - log and execute query\n */\n async dd(): Promise<T[]> {\n this.dump();\n return this.get();\n }\n}\n","/**\n * Insert Query Builder\n *\n * Fluent builder for INSERT queries following SRP.\n *\n * @example\n * ```typescript\n * const id = await insert\n * .into('users')\n * .values({ name: 'John', email: 'john@example.com' })\n * .execute();\n *\n * // Bulk insert\n * await insert\n * .into('users')\n * .values([\n * { name: 'John', email: 'john@example.com' },\n * { name: 'Jane', email: 'jane@example.com' },\n * ])\n * .execute();\n * ```\n */\n\nimport type { QueryContext, ExecuteResult } from './query-context';\nimport type { InsertComponents } from '../dialect/sql-dialect';\n\nexport class InsertBuilder<T = unknown> {\n private _table?: string;\n private _data: Record<string, unknown>[] = [];\n private _returning: string[] = [];\n private _encryptFields: Set<string> = new Set();\n private _ignore = false;\n\n constructor(private readonly ctx: QueryContext) {}\n\n /**\n * Set table to insert into\n */\n into(table: string): this {\n this._table = table;\n return this;\n }\n\n /**\n * Alias for into()\n */\n table(table: string): this {\n return this.into(table);\n }\n\n /**\n * Set values to insert (single row or multiple rows)\n */\n values(data: Record<string, unknown> | Record<string, unknown>[]): this {\n if (Array.isArray(data)) {\n this._data = data;\n } else {\n this._data = [data];\n }\n return this;\n }\n\n /**\n * Mark fields to be encrypted before insertion\n */\n encrypt(...fields: string[]): this {\n fields.forEach((f) => this._encryptFields.add(f));\n return this;\n }\n\n /**\n * Add RETURNING clause (PostgreSQL)\n */\n returning(...columns: string[]): this {\n this._returning = columns;\n return this;\n }\n\n /**\n * Use INSERT IGNORE (MySQL) - ignore duplicate key errors\n */\n ignore(): this {\n this._ignore = true;\n return this;\n }\n\n /**\n * Build SQL without executing\n */\n toSQL(): { sql: string; bindings: unknown[] } {\n if (!this._table) {\n throw new Error('Table name is required for INSERT');\n }\n\n if (this._data.length === 0) {\n throw new Error('Insert data is required');\n }\n\n this.ctx.dialect.resetParameters();\n\n // Process encryption\n const processedData = this.processDataForEncryption(this._data);\n\n const components: InsertComponents = {\n table: this._table,\n data: processedData,\n returning: this._returning.length > 0 ? this._returning : undefined,\n };\n\n const result = this.ctx.dialect.buildInsert(components);\n let sql = result.sql;\n const { bindings } = result;\n\n // Handle INSERT IGNORE for MySQL\n if (this._ignore && this.ctx.dialect.name === 'mysql') {\n sql = sql.replace('INSERT INTO', 'INSERT IGNORE INTO');\n }\n\n return { sql, bindings };\n }\n\n /**\n * Execute insert and return result\n */\n async execute(): Promise<ExecuteResult> {\n const { sql, bindings } = this.toSQL();\n return this.ctx.executeWrite(sql, bindings);\n }\n\n /**\n * Execute and return inserted ID\n */\n async getInsertId(): Promise<number | bigint | undefined> {\n const result = await this.execute();\n return result.insertId;\n }\n\n /**\n * Execute and return inserted row (with RETURNING)\n */\n async getInserted<R = T>(): Promise<R | null> {\n if (this._returning.length === 0) {\n this._returning = ['*'];\n }\n\n const { sql, bindings } = this.toSQL();\n const result = await this.ctx.executeQuery<R>(sql, bindings);\n return result.rows[0] ?? null;\n }\n\n // ============ Private Methods ============\n\n private processDataForEncryption(data: Record<string, unknown>[]): Record<string, unknown>[] {\n if (this._encryptFields.size === 0 || !this.ctx.hasCrypto) {\n return data;\n }\n\n return data.map((row) => {\n const processed = { ...row };\n for (const field of this._encryptFields) {\n if (processed[field] && typeof processed[field] === 'string') {\n processed[field] = this.ctx.encrypt(processed[field]);\n }\n }\n return processed;\n });\n }\n}\n","/**\n * Update Query Builder\n *\n * Fluent builder for UPDATE queries following SRP.\n *\n * @example\n * ```typescript\n * const affected = await update\n * .table('users')\n * .set({ name: 'John Doe', updated_at: new Date() })\n * .where('id', 1)\n * .execute();\n *\n * // Increment a value\n * await update\n * .table('posts')\n * .set({ views: raw('views + 1') })\n * .where('id', postId)\n * .execute();\n * ```\n */\n\nimport { WhereBuilder } from './where-builder';\n\nimport type { QueryContext, ExecuteResult } from './query-context';\nimport type { UpdateComponents } from '../dialect/sql-dialect';\n\nexport class UpdateBuilder<T = unknown> {\n private _table?: string;\n private _data: Record<string, unknown> = {};\n private _whereBuilder: WhereBuilder;\n private _returning: string[] = [];\n private _encryptFields: Set<string> = new Set();\n\n constructor(private readonly ctx: QueryContext) {\n this._whereBuilder = new WhereBuilder(ctx.dialect);\n }\n\n /**\n * Set table to update\n */\n table(table: string): this {\n this._table = table;\n return this;\n }\n\n /**\n * Set values to update\n */\n set(data: Record<string, unknown>): this {\n this._data = { ...this._data, ...data };\n return this;\n }\n\n /**\n * Mark fields to be encrypted before update\n */\n encrypt(...fields: string[]): this {\n fields.forEach((f) => this._encryptFields.add(f));\n return this;\n }\n\n /**\n * Add RETURNING clause (PostgreSQL)\n */\n returning(...columns: string[]): this {\n this._returning = columns;\n return this;\n }\n\n // ============ WHERE Methods (delegated to WhereBuilder) ============\n\n where(column: string, value: unknown): this;\n where(column: string, operator: string, value: unknown): this;\n where(conditions: Record<string, unknown>): this;\n where(\n columnOrConditions: string | Record<string, unknown>,\n operatorOrValue?: string | unknown,\n value?: unknown,\n ): this {\n this._whereBuilder.where(columnOrConditions as any, operatorOrValue as any, value);\n return this;\n }\n\n orWhere(column: string, value: unknown): this;\n orWhere(column: string, operator: string, value: unknown): this;\n orWhere(conditions: Record<string, unknown>): this;\n orWhere(\n columnOrConditions: string | Record<string, unknown>,\n operatorOrValue?: string | unknown,\n value?: unknown,\n ): this {\n this._whereBuilder.orWhere(columnOrConditions as any, operatorOrValue as any, value);\n return this;\n }\n\n whereNull(column: string): this {\n this._whereBuilder.whereNull(column);\n return this;\n }\n\n whereNotNull(column: string): this {\n this._whereBuilder.whereNotNull(column);\n return this;\n }\n\n whereIn(column: string, values: unknown[]): this {\n this._whereBuilder.whereIn(column, values);\n return this;\n }\n\n whereNotIn(column: string, values: unknown[]): this {\n this._whereBuilder.whereNotIn(column, values);\n return this;\n }\n\n whereBetween(column: string, from: unknown, to: unknown): this {\n this._whereBuilder.whereBetween(column, from, to);\n return this;\n }\n\n whereLike(column: string, pattern: string): this {\n this._whereBuilder.whereLike(column, pattern);\n return this;\n }\n\n whereRaw(sql: string, bindings: unknown[] = []): this {\n this._whereBuilder.whereRaw(sql, bindings);\n return this;\n }\n\n // ============ Execution Methods ============\n\n /**\n * Build SQL without executing\n */\n toSQL(): { sql: string; bindings: unknown[] } {\n if (!this._table) {\n throw new Error('Table name is required for UPDATE');\n }\n\n if (Object.keys(this._data).length === 0) {\n throw new Error('Update data is required');\n }\n\n this.ctx.dialect.resetParameters();\n\n // Process encryption\n const processedData = this.processDataForEncryption(this._data);\n\n const components: UpdateComponents = {\n table: this._table,\n data: processedData,\n where: this._whereBuilder.build(),\n returning: this._returning.length > 0 ? this._returning : undefined,\n };\n\n return this.ctx.dialect.buildUpdate(components);\n }\n\n /**\n * Execute update and return result\n */\n async execute(): Promise<ExecuteResult> {\n const { sql, bindings } = this.toSQL();\n return this.ctx.executeWrite(sql, bindings);\n }\n\n /**\n * Execute and return affected row count\n */\n async getAffectedRows(): Promise<number> {\n const result = await this.execute();\n return result.affectedRows;\n }\n\n /**\n * Execute and return updated row (with RETURNING)\n */\n async getUpdated<R = T>(): Promise<R | null> {\n if (this._returning.length === 0) {\n this._returning = ['*'];\n }\n\n const { sql, bindings } = this.toSQL();\n const result = await this.ctx.executeQuery<R>(sql, bindings);\n return result.rows[0] ?? null;\n }\n\n /**\n * Execute and return all updated rows (with RETURNING)\n */\n async getAllUpdated<R = T>(): Promise<R[]> {\n if (this._returning.length === 0) {\n this._returning = ['*'];\n }\n\n const { sql, bindings } = this.toSQL();\n const result = await this.ctx.executeQuery<R>(sql, bindings);\n return result.rows;\n }\n\n // ============ Private Methods ============\n\n private processDataForEncryption(data: Record<string, unknown>): Record<string, unknown> {\n if (this._encryptFields.size === 0 || !this.ctx.hasCrypto) {\n return data;\n }\n\n const processed = { ...data };\n for (const field of this._encryptFields) {\n if (processed[field] && typeof processed[field] === 'string') {\n processed[field] = this.ctx.encrypt(processed[field]);\n }\n }\n return processed;\n }\n}\n","/**\n * Delete Query Builder\n *\n * Fluent builder for DELETE queries following SRP.\n *\n * @example\n * ```typescript\n * // Delete single record\n * const affected = await del\n * .from('users')\n * .where('id', 1)\n * .execute();\n *\n * // Delete with conditions\n * await del\n * .from('sessions')\n * .where('expires_at', '<', new Date())\n * .execute();\n *\n * // Truncate (delete all)\n * await del\n * .from('logs')\n * .truncate();\n * ```\n */\n\nimport { WhereBuilder } from './where-builder';\n\nimport type { QueryContext, ExecuteResult } from './query-context';\nimport type { DeleteComponents } from '../dialect/sql-dialect';\n\nexport class DeleteBuilder<T = unknown> {\n private _table?: string;\n private _whereBuilder: WhereBuilder;\n private _returning: string[] = [];\n private _force = false;\n\n constructor(private readonly ctx: QueryContext) {\n this._whereBuilder = new WhereBuilder(ctx.dialect);\n }\n\n /**\n * Set table to delete from\n */\n from(table: string): this {\n this._table = table;\n return this;\n }\n\n /**\n * Alias for from()\n */\n table(table: string): this {\n return this.from(table);\n }\n\n /**\n * Add RETURNING clause (PostgreSQL)\n */\n returning(...columns: string[]): this {\n this._returning = columns;\n return this;\n }\n\n /**\n * Allow delete without WHERE clause (dangerous!)\n */\n force(): this {\n this._force = true;\n return this;\n }\n\n // ============ WHERE Methods (delegated to WhereBuilder) ============\n\n where(column: string, value: unknown): this;\n where(column: string, operator: string, value: unknown): this;\n where(conditions: Record<string, unknown>): this;\n where(\n columnOrConditions: string | Record<string, unknown>,\n operatorOrValue?: string | unknown,\n value?: unknown,\n ): this {\n this._whereBuilder.where(columnOrConditions as any, operatorOrValue as any, value);\n return this;\n }\n\n orWhere(column: string, value: unknown): this;\n orWhere(column: string, operator: string, value: unknown): this;\n orWhere(conditions: Record<string, unknown>): this;\n orWhere(\n columnOrConditions: string | Record<string, unknown>,\n operatorOrValue?: string | unknown,\n value?: unknown,\n ): this {\n this._whereBuilder.orWhere(columnOrConditions as any, operatorOrValue as any, value);\n return this;\n }\n\n whereNull(column: string): this {\n this._whereBuilder.whereNull(column);\n return this;\n }\n\n whereNotNull(column: string): this {\n this._whereBuilder.whereNotNull(column);\n return this;\n }\n\n whereIn(column: string, values: unknown[]): this {\n this._whereBuilder.whereIn(column, values);\n return this;\n }\n\n whereNotIn(column: string, values: unknown[]): this {\n this._whereBuilder.whereNotIn(column, values);\n return this;\n }\n\n whereBetween(column: string, from: unknown, to: unknown): this {\n this._whereBuilder.whereBetween(column, from, to);\n return this;\n }\n\n whereLike(column: string, pattern: string): this {\n this._whereBuilder.whereLike(column, pattern);\n return this;\n }\n\n whereRaw(sql: string, bindings: unknown[] = []): this {\n this._whereBuilder.whereRaw(sql, bindings);\n return this;\n }\n\n // ============ Execution Methods ============\n\n /**\n * Build SQL without executing\n */\n toSQL(): { sql: string; bindings: unknown[] } {\n if (!this._table) {\n throw new Error('Table name is required for DELETE');\n }\n\n // Safety check: require WHERE clause unless force() is called\n if (!this._whereBuilder.hasConditions() && !this._force) {\n throw new Error(\n 'DELETE without WHERE clause is dangerous. Use .force() to confirm deletion of all records.',\n );\n }\n\n this.ctx.dialect.resetParameters();\n\n const components: DeleteComponents = {\n table: this._table,\n where: this._whereBuilder.build(),\n returning: this._returning.length > 0 ? this._returning : undefined,\n };\n\n return this.ctx.dialect.buildDelete(components);\n }\n\n /**\n * Execute delete and return result\n */\n async execute(): Promise<ExecuteResult> {\n const { sql, bindings } = this.toSQL();\n return this.ctx.executeWrite(sql, bindings);\n }\n\n /**\n * Execute and return affected row count\n */\n async getAffectedRows(): Promise<number> {\n const result = await this.execute();\n return result.affectedRows;\n }\n\n /**\n * Execute and return deleted row (with RETURNING)\n */\n async getDeleted<R = T>(): Promise<R | null> {\n if (this._returning.length === 0) {\n this._returning = ['*'];\n }\n\n const { sql, bindings } = this.toSQL();\n const result = await this.ctx.executeQuery<R>(sql, bindings);\n return result.rows[0] ?? null;\n }\n\n /**\n * Execute and return all deleted rows (with RETURNING)\n */\n async getAllDeleted<R = T>(): Promise<R[]> {\n if (this._returning.length === 0) {\n this._returning = ['*'];\n }\n\n const { sql, bindings } = this.toSQL();\n const result = await this.ctx.executeQuery<R>(sql, bindings);\n return result.rows;\n }\n\n /**\n * Truncate table (delete all records efficiently)\n */\n async truncate(): Promise<void> {\n if (!this._table) {\n throw new Error('Table name is required for TRUNCATE');\n }\n\n const sql = `TRUNCATE TABLE ${this.ctx.dialect.escapeIdentifier(this._table)}`;\n await this.ctx.executeWrite(sql, []);\n }\n}\n","/**\n * Query Builder Factory\n *\n * Factory for creating query builder instances with proper context.\n * This is the main entry point for the query builder API.\n *\n * @example\n * ```typescript\n * const qb = createQueryBuilder({\n * dialect: MySQLDialect,\n * executor: mysqlAdapter,\n * crypto: cryptoProvider, // optional\n * });\n *\n * // Select\n * const users = await qb.select()\n * .from('users')\n * .where('active', true)\n * .get();\n *\n * // Insert\n * const id = await qb.insert()\n * .into('users')\n * .values({ name: 'John' })\n * .getInsertId();\n *\n * // Update\n * await qb.update()\n * .table('users')\n * .set({ name: 'Jane' })\n * .where('id', 1)\n * .execute();\n *\n * // Delete\n * await qb.delete()\n * .from('users')\n * .where('id', 1)\n * .execute();\n * ```\n */\n\nimport { DeleteBuilder } from './delete-builder';\nimport { InsertBuilder } from './insert-builder';\nimport { QueryContext } from './query-context';\nimport { SelectBuilder } from './select-builder';\nimport { UpdateBuilder } from './update-builder';\n\nimport type { CryptoProvider } from '../crypto/crypto';\nimport type { SQLDialect } from '../dialect/sql-dialect';\nimport type { CacheAdapter } from '../interfaces';\nimport type { QueryExecutor } from './query-context';\n\n/**\n * Cache configuration for query builder\n *\n * IMPORTANT: Cache is OPT-IN per query by default.\n * Use .cache() method on queries you want to cache.\n *\n * @example\n * ```typescript\n * // Configure cache (uses Redis - recommended for production)\n * const qb = createModularQueryBuilder({\n * dialect,\n * executor,\n * cache: {\n * adapter: redisAdapter,\n * defaultTTL: 300, // 5 minutes default\n * maxTTL: 3600, // Max 1 hour\n * warnOnLargeResult: 1000 // Warn if result > 1000 rows\n * }\n * });\n *\n * // Cache specific queries (opt-in)\n * const users = await qb.select().from('users').cache(60).get();\n * ```\n *\n * WARNING: Avoid using in-memory cache in production with high traffic.\n * Use Redis or another distributed cache instead.\n */\nexport interface QueryBuilderCacheConfig {\n /** Cache adapter (Redis recommended for production, Memory for dev only) */\n adapter: CacheAdapter;\n\n /** Default TTL in seconds (default: 300 = 5 minutes) */\n defaultTTL?: number;\n\n /** Maximum TTL in seconds - prevents accidental long caching (default: 3600 = 1 hour) */\n maxTTL?: number;\n\n /** Cache key prefix (default: 'qb:') */\n prefix?: string;\n\n /**\n * Enable caching globally for all SELECT queries (default: false)\n * WARNING: Not recommended! Use .cache() per query instead.\n */\n global?: boolean;\n\n /**\n * Warn if result row count exceeds this number (default: 1000)\n * Large results shouldn't be cached - use pagination instead\n */\n warnOnLargeResult?: number;\n\n /**\n * Skip caching if result exceeds this many rows (default: 10000)\n * Prevents memory issues from caching huge result sets\n */\n maxCacheableRows?: number;\n\n /**\n * Logger for cache warnings (optional)\n */\n logger?: { warn: (message: string) => void };\n}\n\nexport interface ModularQueryBuilderOptions {\n dialect: SQLDialect;\n executor: QueryExecutor;\n crypto?: CryptoProvider;\n /** Cache configuration (optional) */\n cache?: QueryBuilderCacheConfig;\n}\n\nexport interface ModularQueryBuilder {\n /**\n * Create a new SELECT query builder\n */\n select<T = unknown>(...columns: string[]): SelectBuilder<T>;\n\n /**\n * Create a new INSERT query builder\n */\n insert<T = unknown>(): InsertBuilder<T>;\n\n /**\n * Create a new UPDATE query builder\n */\n update<T = unknown>(): UpdateBuilder<T>;\n\n /**\n * Create a new DELETE query builder\n */\n delete<T = unknown>(): DeleteBuilder<T>;\n\n /**\n * Get the query context\n */\n getContext(): QueryContext;\n\n /**\n * Execute a raw SQL query\n */\n raw<T = unknown>(sql: string, bindings?: unknown[]): Promise<T[]>;\n\n /**\n * Execute a raw SQL statement\n */\n rawExecute(sql: string, bindings?: unknown[]): Promise<{ affectedRows: number }>;\n\n /**\n * Start a table query (shorthand)\n */\n table<T = unknown>(name: string, alias?: string): SelectBuilder<T>;\n}\n\n/**\n * Create a query builder instance with the provided options\n */\nexport function createModularQueryBuilder(\n options: ModularQueryBuilderOptions,\n): ModularQueryBuilder {\n // Build cache config if provided with safe defaults\n const cacheConfig = options.cache\n ? {\n adapter: options.cache.adapter,\n defaultTTL: options.cache.defaultTTL ?? 300, // 5 minutes default\n maxTTL: options.cache.maxTTL ?? 3600, // Max 1 hour\n prefix: options.cache.prefix ?? 'qb:',\n global: options.cache.global ?? false, // Opt-in by default\n warnOnLargeResult: options.cache.warnOnLargeResult ?? 1000,\n maxCacheableRows: options.cache.maxCacheableRows ?? 10_000,\n logger: options.cache.logger,\n }\n : undefined;\n\n const context = new QueryContext(options.dialect, options.executor, options.crypto, cacheConfig);\n\n return {\n select<T = unknown>(...columns: string[]): SelectBuilder<T> {\n const builder = new SelectBuilder<T>(context);\n if (columns.length > 0) {\n builder.select(...columns);\n }\n return builder;\n },\n\n insert<T = unknown>(): InsertBuilder<T> {\n return new InsertBuilder<T>(context);\n },\n\n update<T = unknown>(): UpdateBuilder<T> {\n return new UpdateBuilder<T>(context);\n },\n\n delete<T = unknown>(): DeleteBuilder<T> {\n return new DeleteBuilder<T>(context);\n },\n\n getContext(): QueryContext {\n return context;\n },\n\n async raw<T = unknown>(sql: string, bindings: unknown[] = []): Promise<T[]> {\n const result = await context.executeQuery<T>(sql, bindings);\n return result.rows;\n },\n\n async rawExecute(sql: string, bindings: unknown[] = []): Promise<{ affectedRows: number }> {\n const result = await context.executeWrite(sql, bindings);\n return { affectedRows: result.affectedRows };\n },\n\n table<T = unknown>(name: string, alias?: string): SelectBuilder<T> {\n return new SelectBuilder<T>(context).from(name, alias);\n },\n };\n}\n\n/**\n * Type helper for extracting row type from a query builder\n */\nexport type InferQueryResult<T> = T extends SelectBuilder<infer R> ? R : never;\n","/**\n * Base Transaction\n *\n * Abstract base class for database transactions following DRY principle.\n * Handles common state management, validation, and error handling.\n * Database-specific implementations only need to override the abstract methods.\n *\n * @example\n * ```typescript\n * class MySQLTransaction extends BaseTransaction<PoolConnection> {\n * protected async doBegin(): Promise<void> {\n * await this.connection.beginTransaction();\n * }\n *\n * protected async doCommit(): Promise<void> {\n * await this.connection.commit();\n * }\n *\n * protected async doRollback(): Promise<void> {\n * await this.connection.rollback();\n * }\n *\n * // ... other abstract method implementations\n * }\n * ```\n */\n\nimport { TransactionError } from '../errors';\nimport { generateUUID } from '../utils';\n\nimport type {\n Transaction,\n TransactionOptions,\n IsolationLevel,\n QueryParams,\n QueryOptions,\n QueryResult,\n} from '../types';\n\n/**\n * Connection interface that all database connections must satisfy\n */\nexport interface TransactionConnection {\n release(): void | Promise<void>;\n}\n\n/**\n * Abstract base class for database transactions\n *\n * Type parameter TConnection is the database-specific connection type\n */\nexport abstract class BaseTransaction<\n TConnection extends TransactionConnection,\n> implements Transaction {\n readonly id: string;\n protected _isActive = false;\n protected readonly savepoints: Set<string> = new Set();\n\n constructor(\n protected readonly connection: TConnection,\n protected readonly options?: TransactionOptions,\n ) {\n this.id = generateUUID();\n }\n\n get isActive(): boolean {\n return this._isActive;\n }\n\n // ============ Public Transaction Methods ============\n\n async begin(): Promise<void> {\n if (this._isActive) {\n throw new TransactionError('Transaction already active', this.id);\n }\n\n try {\n await this.applyTransactionOptions();\n await this.doBegin();\n this._isActive = true;\n } catch (error) {\n throw new TransactionError('Failed to begin transaction', this.id, error as Error);\n }\n }\n\n async commit(): Promise<void> {\n this.ensureActive('commit');\n\n try {\n await this.doCommit();\n this._isActive = false;\n this.savepoints.clear();\n } catch (error) {\n throw new TransactionError('Failed to commit transaction', this.id, error as Error);\n } finally {\n await this.releaseConnection();\n }\n }\n\n async rollback(): Promise<void> {\n this.ensureActive('rollback');\n\n try {\n await this.doRollback();\n this._isActive = false;\n this.savepoints.clear();\n } catch (error) {\n throw new TransactionError('Failed to rollback transaction', this.id, error as Error);\n } finally {\n await this.releaseConnection();\n }\n }\n\n async savepoint(name: string): Promise<void> {\n this.ensureActive('create savepoint');\n this.validateSavepointName(name);\n\n if (this.savepoints.has(name)) {\n throw new TransactionError(`Savepoint \"${name}\" already exists`, this.id);\n }\n\n try {\n await this.doSavepoint(name);\n this.savepoints.add(name);\n } catch (error) {\n throw new TransactionError(`Failed to create savepoint \"${name}\"`, this.id, error as Error);\n }\n }\n\n async releaseSavepoint(name: string): Promise<void> {\n this.ensureActive('release savepoint');\n this.ensureSavepointExists(name);\n\n try {\n await this.doReleaseSavepoint(name);\n this.savepoints.delete(name);\n } catch (error) {\n throw new TransactionError(`Failed to release savepoint \"${name}\"`, this.id, error as Error);\n }\n }\n\n async rollbackToSavepoint(name: string): Promise<void> {\n this.ensureActive('rollback to savepoint');\n this.ensureSavepointExists(name);\n\n try {\n await this.doRollbackToSavepoint(name);\n this.removeNewerSavepoints(name);\n } catch (error) {\n throw new TransactionError(\n `Failed to rollback to savepoint \"${name}\"`,\n this.id,\n error as Error,\n );\n }\n }\n\n async query<T = unknown>(\n sql: string,\n params?: QueryParams,\n options?: QueryOptions,\n ): Promise<QueryResult<T>> {\n this.ensureActive('execute query');\n\n try {\n return await this.doQuery<T>(sql, params, options);\n } catch (error) {\n throw new TransactionError(\n `Query failed in transaction: ${(error as Error).message}`,\n this.id,\n error as Error,\n );\n }\n }\n\n /**\n * Alias for query() for consistency\n */\n async execute<T = unknown>(\n sql: string,\n params?: QueryParams,\n options?: QueryOptions,\n ): Promise<QueryResult<T>> {\n return this.query<T>(sql, params, options);\n }\n\n /**\n * Get the underlying database connection\n */\n getConnection(): TConnection {\n return this.connection;\n }\n\n // ============ Abstract Methods (Database-specific) ============\n\n /**\n * Begin the transaction (database-specific)\n */\n protected abstract doBegin(): Promise<void>;\n\n /**\n * Commit the transaction (database-specific)\n */\n protected abstract doCommit(): Promise<void>;\n\n /**\n * Rollback the transaction (database-specific)\n */\n protected abstract doRollback(): Promise<void>;\n\n /**\n * Create a savepoint (database-specific)\n */\n protected abstract doSavepoint(name: string): Promise<void>;\n\n /**\n * Release a savepoint (database-specific)\n */\n protected abstract doReleaseSavepoint(name: string): Promise<void>;\n\n /**\n * Rollback to a savepoint (database-specific)\n */\n protected abstract doRollbackToSavepoint(name: string): Promise<void>;\n\n /**\n * Execute a query within the transaction (database-specific)\n */\n protected abstract doQuery<T>(\n sql: string,\n params?: QueryParams,\n options?: QueryOptions,\n ): Promise<QueryResult<T>>;\n\n /**\n * Set isolation level (database-specific)\n */\n protected abstract setIsolationLevel(level: IsolationLevel): Promise<void>;\n\n /**\n * Escape an identifier for use in SQL (database-specific)\n */\n protected abstract escapeIdentifier(identifier: string): string;\n\n // ============ Protected Helper Methods ============\n\n /**\n * Apply transaction options (isolation level, read-only, etc.)\n */\n protected async applyTransactionOptions(): Promise<void> {\n if (!this.options) {\n return;\n }\n\n if (this.options.isolationLevel !== null && this.options.isolationLevel !== undefined) {\n await this.setIsolationLevel(this.options.isolationLevel);\n }\n\n // Database-specific options (readOnly, deferrable) can be handled\n // in subclass implementations of applyTransactionOptions\n }\n\n /**\n * Release the connection back to pool\n */\n protected async releaseConnection(): Promise<void> {\n try {\n await Promise.resolve(this.connection.release());\n } catch {\n // Ignore release errors\n }\n }\n\n /**\n * Ensure the transaction is active\n */\n protected ensureActive(operation: string): void {\n if (!this._isActive) {\n throw new TransactionError(`Cannot ${operation}: Transaction not active`, this.id);\n }\n }\n\n /**\n * Ensure a savepoint exists\n */\n protected ensureSavepointExists(name: string): void {\n if (!this.savepoints.has(name)) {\n throw new TransactionError(`Savepoint \"${name}\" does not exist`, this.id);\n }\n }\n\n /**\n * Validate savepoint name (alphanumeric and underscores only)\n */\n protected validateSavepointName(name: string): void {\n if (!/^[A-Z_a-z]\\w*$/.test(name)) {\n throw new TransactionError(\n `Invalid savepoint name \"${name}\". Use only letters, numbers, and underscores.`,\n this.id,\n );\n }\n }\n\n /**\n * Sanitize savepoint name for use in SQL\n */\n protected sanitizeSavepointName(name: string): string {\n return name.replaceAll(/\\W/g, '_');\n }\n\n /**\n * Remove savepoints created after the given savepoint\n */\n protected removeNewerSavepoints(name: string): void {\n const savepointsArray = Array.from(this.savepoints);\n const index = savepointsArray.indexOf(name);\n\n if (index !== -1) {\n for (let i = index + 1; i < savepointsArray.length; i++) {\n const sp = savepointsArray[i];\n if (sp) {\n this.savepoints.delete(sp);\n }\n }\n }\n }\n\n /**\n * Normalize query parameters to array format\n */\n protected normalizeParams(params?: QueryParams): unknown[] {\n if (!params) {\n return [];\n }\n return Array.isArray(params) ? params : Object.values(params);\n }\n}\n","/**\n * Middleware Chain\n *\n * Manages and executes middleware in a chain pattern.\n * Middleware are executed in order, each can modify context\n * or short-circuit the chain.\n *\n * @example\n * ```typescript\n * const chain = new MiddlewareChain()\n * .use(cacheMiddleware)\n * .use(retryMiddleware)\n * .use(timeoutMiddleware)\n * .use(loggingMiddleware);\n *\n * const result = await chain.execute(context, finalHandler);\n * ```\n */\n\nimport type {\n QueryMiddleware,\n QueryMiddlewareContext,\n QueryMiddlewareResult,\n NextMiddleware,\n} from './types';\n\nexport class MiddlewareChain<T = unknown> {\n private middlewares: QueryMiddleware<T>[] = [];\n\n /**\n * Add middleware to the chain\n */\n use(middleware: QueryMiddleware<T>): this {\n this.middlewares.push(middleware);\n return this;\n }\n\n /**\n * Remove middleware from the chain\n */\n remove(middleware: QueryMiddleware<T>): this {\n const index = this.middlewares.indexOf(middleware);\n if (index !== -1) {\n this.middlewares.splice(index, 1);\n }\n return this;\n }\n\n /**\n * Clear all middleware\n */\n clear(): this {\n this.middlewares = [];\n return this;\n }\n\n /**\n * Get count of middleware in chain\n */\n get length(): number {\n return this.middlewares.length;\n }\n\n /**\n * Execute the middleware chain\n */\n async execute(\n context: QueryMiddlewareContext,\n finalHandler: NextMiddleware<T>,\n ): Promise<QueryMiddlewareResult<T>> {\n // Build the chain from right to left\n let next: NextMiddleware<T> = finalHandler;\n\n for (let i = this.middlewares.length - 1; i >= 0; i--) {\n const middleware = this.middlewares[i]!;\n const currentNext = next;\n next = (ctx) => middleware(ctx, currentNext);\n }\n\n return next(context);\n }\n\n /**\n * Create a new context for query execution\n */\n static createContext(\n sql: string,\n params: unknown[],\n options?: QueryMiddlewareContext['options'],\n ): QueryMiddlewareContext {\n return {\n sql,\n params,\n options,\n startTime: Date.now(),\n metadata: {},\n };\n }\n}\n\n/**\n * Compose multiple middleware into a single middleware\n */\nexport function composeMiddleware<T = unknown>(\n ...middlewares: QueryMiddleware<T>[]\n): QueryMiddleware<T> {\n return async (context, next) => {\n const chain = new MiddlewareChain<T>();\n middlewares.forEach((m) => chain.use(m));\n return chain.execute(context, next);\n };\n}\n","/**\n * Cache Middleware\n *\n * Caches query results to improve performance.\n * Supports configurable TTL and cache key generation.\n *\n * @example\n * ```typescript\n * const middleware = createCacheMiddleware({\n * adapter: redisCache,\n * defaultTTL: 60000, // 1 minute\n * keyPrefix: 'db:',\n * });\n * ```\n */\n\nimport { createHash } from 'node:crypto';\n\nimport type {\n QueryMiddleware,\n QueryMiddlewareContext,\n QueryMiddlewareResult,\n NextMiddleware,\n CacheMiddlewareOptions,\n MiddlewareCacheAdapter,\n} from './types';\n\n/**\n * Default function to determine if a query should be cached\n */\nfunction defaultShouldCache(sql: string): boolean {\n const normalizedSql = sql.trim().toUpperCase();\n return (\n normalizedSql.startsWith('SELECT') ||\n normalizedSql.startsWith('SHOW') ||\n normalizedSql.startsWith('DESCRIBE') ||\n normalizedSql.startsWith('EXPLAIN')\n );\n}\n\n/**\n * Generate a cache key from SQL and params\n */\nfunction generateCacheKey(prefix: string, sql: string, params: unknown[]): string {\n const hash = createHash('sha256');\n hash.update(sql);\n hash.update(JSON.stringify(params));\n return `${prefix}${hash.digest('hex').slice(0, 16)}`;\n}\n\n/**\n * Create a cache middleware with the given options\n */\nexport function createCacheMiddleware<T = unknown>(\n options: CacheMiddlewareOptions,\n): QueryMiddleware<T> {\n const {\n adapter,\n defaultTTL = 60_000,\n keyPrefix = 'qcache:',\n shouldCache = defaultShouldCache,\n } = options;\n\n return async (\n context: QueryMiddlewareContext,\n next: NextMiddleware<T>,\n ): Promise<QueryMiddlewareResult<T>> => {\n // Check if caching is explicitly disabled\n if (context.options?.cache === false) {\n return next(context);\n }\n\n // Check if query should be cached\n if (!shouldCache(context.sql, context.params)) {\n return next(context);\n }\n\n // Determine cache key\n const cacheOptions = typeof context.options?.cache === 'object' ? context.options.cache : {};\n const cacheKey = cacheOptions.key || generateCacheKey(keyPrefix, context.sql, context.params);\n\n // Try to get from cache\n try {\n const cached = await adapter.get<QueryMiddlewareResult<T>>(cacheKey);\n if (cached) {\n return {\n ...cached,\n cached: true,\n duration: Date.now() - context.startTime,\n };\n }\n } catch {\n // Ignore cache errors, proceed with query\n }\n\n // Execute the query\n const result = await next(context);\n\n // Cache the result if it has data\n if (result.result.rows.length > 0) {\n const ttl = cacheOptions.ttl || defaultTTL;\n try {\n await adapter.set(cacheKey, result, ttl);\n } catch {\n // Ignore cache errors\n }\n }\n\n return {\n ...result,\n cached: false,\n };\n };\n}\n\n/**\n * Create cache invalidation middleware\n * Invalidates cache entries when write operations occur\n */\nexport function createCacheInvalidationMiddleware<T = unknown>(\n _adapter: MiddlewareCacheAdapter,\n _keyPrefix = 'qcache:',\n): QueryMiddleware<T> {\n return async (\n context: QueryMiddlewareContext,\n next: NextMiddleware<T>,\n ): Promise<QueryMiddlewareResult<T>> => {\n const result = await next(context);\n\n // Check if this is a write operation\n const normalizedSql = context.sql.trim().toUpperCase();\n const isWrite =\n normalizedSql.startsWith('INSERT') ||\n normalizedSql.startsWith('UPDATE') ||\n normalizedSql.startsWith('DELETE') ||\n normalizedSql.startsWith('TRUNCATE');\n\n if (isWrite) {\n // Extract table name from query\n const tableName = extractTableName(context.sql);\n if (tableName) {\n // Mark for invalidation in metadata\n context.metadata['invalidatedTable'] = tableName;\n context.metadata['cacheInvalidated'] = true;\n }\n }\n\n return result;\n };\n}\n\n/**\n * Extract table name from SQL query\n */\nfunction extractTableName(sql: string): string | null {\n const normalizedSql = sql.trim().toUpperCase();\n\n // INSERT INTO table_name\n const insertMatch = normalizedSql.match(/insert\\s+into\\s+[\"'`]?(\\w+)[\"'`]?/i);\n if (insertMatch) {\n return insertMatch[1] || null;\n }\n\n // UPDATE table_name\n const updateMatch = normalizedSql.match(/update\\s+[\"'`]?(\\w+)[\"'`]?/i);\n if (updateMatch) {\n return updateMatch[1] || null;\n }\n\n // DELETE FROM table_name\n const deleteMatch = normalizedSql.match(/delete\\s+from\\s+[\"'`]?(\\w+)[\"'`]?/i);\n if (deleteMatch) {\n return deleteMatch[1] || null;\n }\n\n // TRUNCATE TABLE table_name\n const truncateMatch = normalizedSql.match(/truncate\\s+(?:table\\s+)?[\"'`]?(\\w+)[\"'`]?/i);\n if (truncateMatch) {\n return truncateMatch[1] || null;\n }\n\n return null;\n}\n","/**\n * Retry Middleware\n *\n * Automatically retries failed queries with exponential backoff.\n * Supports configurable retry conditions and delays.\n *\n * @example\n * ```typescript\n * const middleware = createRetryMiddleware({\n * maxRetries: 3,\n * baseDelay: 100,\n * retryOn: (error) => error.message.includes('ECONNRESET'),\n * });\n * ```\n */\n\nimport type {\n QueryMiddleware,\n QueryMiddlewareContext,\n QueryMiddlewareResult,\n NextMiddleware,\n RetryMiddlewareOptions,\n} from './types';\n\n/**\n * Default retry condition - retry on transient errors\n */\nfunction defaultRetryCondition(error: Error): boolean {\n const message = error.message.toLowerCase();\n\n // Connection errors\n if (\n message.includes('econnreset') ||\n message.includes('econnrefused') ||\n message.includes('etimedout') ||\n message.includes('epipe') ||\n message.includes('connection lost') ||\n message.includes('connection closed')\n ) {\n return true;\n }\n\n // Deadlock errors\n if (\n message.includes('deadlock') ||\n message.includes('lock wait timeout') ||\n message.includes('could not serialize access')\n ) {\n return true;\n }\n\n // Server temporarily unavailable\n if (\n message.includes('server has gone away') ||\n message.includes('too many connections') ||\n message.includes('max_connections')\n ) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Calculate delay with exponential backoff and jitter\n */\nfunction calculateDelay(\n attempt: number,\n baseDelay: number,\n maxDelay: number,\n multiplier: number,\n): number {\n // Exponential backoff\n const exponentialDelay = baseDelay * Math.pow(multiplier, attempt);\n\n // Cap at max delay\n const cappedDelay = Math.min(exponentialDelay, maxDelay);\n\n // Add jitter (±25%)\n const jitter = cappedDelay * 0.25 * (Math.random() * 2 - 1);\n\n return Math.floor(cappedDelay + jitter);\n}\n\n/**\n * Sleep for specified milliseconds\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Create a retry middleware with the given options\n */\nexport function createRetryMiddleware<T = unknown>(\n options: RetryMiddlewareOptions = {},\n): QueryMiddleware<T> {\n const {\n maxRetries = 3,\n baseDelay = 100,\n maxDelay = 5000,\n retryOn = defaultRetryCondition,\n backoffMultiplier = 2,\n } = options;\n\n return async (\n context: QueryMiddlewareContext,\n next: NextMiddleware<T>,\n ): Promise<QueryMiddlewareResult<T>> => {\n let lastError: Error | undefined;\n let attempts = 0;\n\n while (attempts <= maxRetries) {\n try {\n const result = await next(context);\n\n // Track retry count in result\n if (attempts > 0) {\n result.retries = attempts;\n }\n\n return result;\n } catch (error) {\n lastError = error as Error;\n attempts++;\n\n // Check if we should retry\n if (attempts > maxRetries || !retryOn(lastError)) {\n throw lastError;\n }\n\n // Calculate and wait for backoff delay\n const delay = calculateDelay(attempts - 1, baseDelay, maxDelay, backoffMultiplier);\n\n // Store retry info in context metadata\n context.metadata['retryAttempt'] = attempts;\n context.metadata['retryDelay'] = delay;\n context.metadata['lastError'] = lastError.message;\n\n await sleep(delay);\n }\n }\n\n // Should never reach here, but TypeScript needs it\n throw lastError || new Error('Retry failed');\n };\n}\n\n/**\n * Create a circuit breaker middleware\n * Prevents cascading failures by temporarily blocking requests\n */\nexport function createCircuitBreakerMiddleware<T = unknown>(\n options: {\n failureThreshold?: number;\n resetTimeout?: number;\n halfOpenRequests?: number;\n } = {},\n): QueryMiddleware<T> {\n const { failureThreshold = 5, resetTimeout = 30_000, halfOpenRequests = 1 } = options;\n\n let failures = 0;\n let lastFailureTime = 0;\n let state: 'closed' | 'open' | 'half-open' = 'closed';\n let halfOpenSuccesses = 0;\n\n return async (\n context: QueryMiddlewareContext,\n next: NextMiddleware<T>,\n ): Promise<QueryMiddlewareResult<T>> => {\n // Check circuit state\n if (state === 'open') {\n const now = Date.now();\n if (now - lastFailureTime >= resetTimeout) {\n state = 'half-open';\n halfOpenSuccesses = 0;\n } else {\n throw new Error(\n `Circuit breaker is open. Retry after ${Math.ceil((resetTimeout - (now - lastFailureTime)) / 1000)}s`,\n );\n }\n }\n\n try {\n const result = await next(context);\n\n // Success - update circuit state\n if (state === 'half-open') {\n halfOpenSuccesses++;\n if (halfOpenSuccesses >= halfOpenRequests) {\n state = 'closed';\n failures = 0;\n }\n } else {\n failures = 0;\n }\n\n return result;\n } catch (error) {\n failures++;\n lastFailureTime = Date.now();\n\n if (state === 'half-open' || failures >= failureThreshold) {\n state = 'open';\n }\n\n context.metadata['circuitState'] = state;\n context.metadata['failures'] = failures;\n\n throw error;\n }\n };\n}\n","/**\n * Timeout Middleware\n *\n * Enforces query execution time limits.\n * Throws TimeoutError if query exceeds the configured timeout.\n *\n * @example\n * ```typescript\n * const middleware = createTimeoutMiddleware({\n * defaultTimeout: 30000, // 30 seconds\n * onTimeout: (sql, elapsed) => {\n * console.warn(`Query timed out after ${elapsed}ms: ${sql}`);\n * },\n * });\n * ```\n */\n\nimport { TimeoutError } from '../errors';\n\nimport type {\n QueryMiddleware,\n QueryMiddlewareContext,\n QueryMiddlewareResult,\n NextMiddleware,\n TimeoutMiddlewareOptions,\n} from './types';\n\n/**\n * Create a timeout middleware with the given options\n */\nexport function createTimeoutMiddleware<T = unknown>(\n options: TimeoutMiddlewareOptions = {},\n): QueryMiddleware<T> {\n const { defaultTimeout = 30_000, onTimeout } = options;\n\n return async (\n context: QueryMiddlewareContext,\n next: NextMiddleware<T>,\n ): Promise<QueryMiddlewareResult<T>> => {\n // Get timeout from options or use default\n const timeout = context.options?.timeout ?? defaultTimeout;\n\n // If timeout is 0 or negative, skip timeout handling\n if (timeout <= 0) {\n return next(context);\n }\n\n // Create abort controller for cancellation\n const controller = new AbortController();\n let timeoutId: NodeJS.Timeout | undefined;\n\n // Create timeout promise\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => {\n controller.abort();\n const elapsed = Date.now() - context.startTime;\n\n // Call timeout callback if provided\n if (onTimeout) {\n try {\n onTimeout(context.sql, elapsed);\n } catch {\n // Ignore callback errors\n }\n }\n\n // Store timeout info in context\n context.metadata['timedOut'] = true;\n context.metadata['timeoutMs'] = timeout;\n context.metadata['elapsedMs'] = elapsed;\n\n reject(\n new TimeoutError(`Query timed out after ${elapsed}ms (limit: ${timeout}ms)`, elapsed),\n );\n }, timeout);\n });\n\n try {\n // Race between query and timeout\n const result = await Promise.race([next(context), timeoutPromise]);\n\n // Store timing in result\n result.duration = Date.now() - context.startTime;\n\n return result;\n } finally {\n // Clean up timeout\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n }\n };\n}\n\n/**\n * Create a deadline middleware\n * Similar to timeout but uses absolute deadline instead of relative timeout\n */\nexport function createDeadlineMiddleware<T = unknown>(\n options: {\n getDeadline?: (context: QueryMiddlewareContext) => number | undefined;\n } = {},\n): QueryMiddleware<T> {\n const { getDeadline } = options;\n\n return async (\n context: QueryMiddlewareContext,\n next: NextMiddleware<T>,\n ): Promise<QueryMiddlewareResult<T>> => {\n // Get deadline from options or context\n const deadline = getDeadline?.(context) ?? (context.metadata['deadline'] as number | undefined);\n\n // If no deadline, skip\n if (!deadline) {\n return next(context);\n }\n\n const now = Date.now();\n const remainingTime = deadline - now;\n\n // Check if deadline already passed\n if (remainingTime <= 0) {\n throw new TimeoutError(\n `Deadline exceeded: deadline was ${new Date(deadline).toISOString()}`,\n -remainingTime,\n );\n }\n\n // Use timeout middleware with remaining time\n const timeoutMiddleware = createTimeoutMiddleware<T>({\n defaultTimeout: remainingTime,\n });\n\n return timeoutMiddleware(context, next);\n };\n}\n","/**\n * Logging Middleware\n *\n * Logs query execution details for debugging and monitoring.\n * Supports configurable log levels and slow query detection.\n *\n * @example\n * ```typescript\n * const middleware = createLoggingMiddleware({\n * logger: console,\n * logLevel: 'debug',\n * slowQueryThreshold: 1000, // Log slow queries > 1s\n * });\n * ```\n */\n\nimport type {\n QueryMiddleware,\n QueryMiddlewareContext,\n QueryMiddlewareResult,\n NextMiddleware,\n LoggingMiddlewareOptions,\n MiddlewareLogger,\n} from './types';\n\n/**\n * Default console logger\n */\n/* eslint-disable no-console */\nconst consoleLogger: MiddlewareLogger = {\n debug: (msg, ...args) => console.debug(`[db-bridge] ${msg}`, ...args),\n info: (msg, ...args) => console.info(`[db-bridge] ${msg}`, ...args),\n warn: (msg, ...args) => console.warn(`[db-bridge] ${msg}`, ...args),\n error: (msg, ...args) => console.error(`[db-bridge] ${msg}`, ...args),\n};\n/* eslint-enable no-console */\n\n/**\n * Truncate long SQL for logging\n */\nfunction truncateSql(sql: string, maxLength = 200): string {\n if (sql.length <= maxLength) {\n return sql;\n }\n return `${sql.slice(0, maxLength)}...`;\n}\n\n/**\n * Format parameters for logging (hide sensitive data)\n */\nfunction formatParams(params: unknown[], maxLength = 100): string {\n const str = JSON.stringify(params);\n if (str.length <= maxLength) {\n return str;\n }\n return `${str.slice(0, maxLength)}...`;\n}\n\n/**\n * Create a logging middleware with the given options\n */\nexport function createLoggingMiddleware<T = unknown>(\n options: LoggingMiddlewareOptions = {},\n): QueryMiddleware<T> {\n const {\n logger = consoleLogger,\n logLevel = 'debug',\n logParams = false,\n logResults = false,\n slowQueryThreshold = 1000,\n } = options;\n\n const log = logger[logLevel];\n\n return async (\n context: QueryMiddlewareContext,\n next: NextMiddleware<T>,\n ): Promise<QueryMiddlewareResult<T>> => {\n const truncatedSql = truncateSql(context.sql);\n const startTime = Date.now();\n\n // Log query start\n if (logParams) {\n log(`Executing query: ${truncatedSql}`, formatParams(context.params));\n } else {\n log(`Executing query: ${truncatedSql}`);\n }\n\n try {\n const result = await next(context);\n const duration = Date.now() - startTime;\n\n // Check for slow query\n if (duration >= slowQueryThreshold) {\n logger.warn(`Slow query detected (${duration}ms): ${truncatedSql}`, {\n duration,\n rowCount: result.result.rowCount,\n });\n }\n\n // Log query completion\n const logMsg = `Query completed in ${duration}ms (${result.result.rowCount} rows)`;\n if (logResults && result.result.rows.length > 0) {\n log(logMsg, { rows: result.result.rows.slice(0, 5) }); // Log first 5 rows\n } else {\n log(logMsg);\n }\n\n // Add cached flag if present\n if (result.cached) {\n log(`Query served from cache`);\n }\n\n return result;\n } catch (error) {\n const duration = Date.now() - startTime;\n logger.error(`Query failed after ${duration}ms: ${(error as Error).message}`, {\n sql: truncatedSql,\n error,\n });\n throw error;\n }\n };\n}\n\n/**\n * Create a metrics middleware\n * Collects query metrics without logging\n */\nexport function createMetricsMiddleware<T = unknown>(\n options: {\n onQuery?: (metrics: MiddlewareQueryMetrics) => void;\n buckets?: number[];\n } = {},\n): QueryMiddleware<T> {\n const { onQuery, buckets = [10, 50, 100, 250, 500, 1000, 2500, 5000, 10_000] } = options;\n\n return async (\n context: QueryMiddlewareContext,\n next: NextMiddleware<T>,\n ): Promise<QueryMiddlewareResult<T>> => {\n const startTime = Date.now();\n let success = false;\n let result: QueryMiddlewareResult<T> | undefined;\n\n try {\n result = await next(context);\n success = true;\n return result;\n } finally {\n const duration = Date.now() - startTime;\n\n // Determine histogram bucket\n const bucket = buckets.find((b) => duration <= b) ?? Number.POSITIVE_INFINITY;\n\n // Build metrics object\n const metrics: MiddlewareQueryMetrics = {\n sql: context.sql,\n duration,\n success,\n cached: result?.cached ?? false,\n rowCount: result?.result?.rowCount ?? 0,\n retries: result?.retries ?? 0,\n bucket,\n timestamp: new Date(),\n };\n\n // Store in context metadata\n context.metadata['metrics'] = metrics;\n\n // Call metrics callback if provided\n if (onQuery) {\n try {\n onQuery(metrics);\n } catch {\n // Ignore callback errors\n }\n }\n }\n };\n}\n\n/**\n * Query metrics interface\n */\nexport interface MiddlewareQueryMetrics {\n sql: string;\n duration: number;\n success: boolean;\n cached: boolean;\n rowCount: number;\n retries: number;\n bucket: number;\n timestamp: Date;\n}\n","import { CachedAdapter } from './cache/cached-adapter';\nimport { CryptoProvider } from './crypto/crypto';\n\nimport type { DatabaseAdapter, CacheAdapter } from './interfaces';\nimport type { ConnectionConfig } from './types';\n\nexport interface ClientOptions {\n provider: 'mysql' | 'postgresql' | 'postgres';\n url?: string;\n connection?: ConnectionConfig & {\n // Additional connection options\n poolMin?: number;\n poolMax?: number;\n poolIdleTimeout?: number;\n poolAcquireTimeout?: number;\n charset?: string;\n timezone?: string;\n multipleStatements?: boolean;\n dateStrings?: boolean;\n supportBigNumbers?: boolean;\n bigNumberStrings?: boolean;\n schema?: string;\n searchPath?: string[];\n statement_timeout?: number;\n query_timeout?: number;\n application_name?: string;\n };\n cache?:\n | boolean\n | {\n provider: 'redis';\n url?: string;\n connection?: ConnectionConfig & {\n db?: number;\n sentinels?: Array<{ host: string; port: number }>;\n name?: string;\n sentinelPassword?: string;\n retryStrategy?: (times: number) => number;\n maxRetriesPerRequest?: number;\n enableReadyCheck?: boolean;\n enableOfflineQueue?: boolean;\n cluster?: Array<{ host: string; port: number }>;\n };\n };\n encryption?:\n | boolean\n | {\n algorithm?: string;\n key?: string;\n keyRotationInterval?: number;\n autoEncryptFields?: Record<string, string[]>;\n };\n logger?:\n | boolean\n | Console\n | {\n level?: string;\n prettyPrint?: boolean;\n customLogger?: (level: string, message: string, meta?: any) => void;\n };\n monitoring?: {\n enabled?: boolean;\n slowQueryThreshold?: number;\n captureStackTrace?: boolean;\n metricsCollector?: (metric: any) => void;\n };\n healthCheck?: {\n enabled?: boolean;\n interval?: number;\n timeout?: number;\n retries?: number;\n };\n multiTenant?: {\n enabled?: boolean;\n tenantIdField?: string;\n tenantIdHeader?: string;\n isolationLevel?: 'schema' | 'database' | 'row';\n tenantResolver?: (context: any) => Promise<string>;\n };\n migrations?: {\n directory?: string;\n tableName?: string;\n strategy?: 'safe' | 'force' | 'dry-run';\n beforeMigrate?: (migration: any) => Promise<void>;\n afterMigrate?: (migration: any) => Promise<void>;\n rollbackOnError?: boolean;\n validateChecksum?: boolean;\n };\n typeMappings?: {\n pg_to_js?: Record<string, (value: any) => any>;\n js_to_pg?: Record<string, (value: any) => any>;\n };\n poolSize?: number;\n ssl?: boolean | any;\n}\n\nexport class DBBridge {\n private static instances: Map<string, DBBridge> = new Map();\n private adapter: DatabaseAdapter;\n private connected: boolean = false;\n\n public readonly options: ClientOptions;\n\n constructor(options: ClientOptions) {\n this.options = options;\n this.adapter = this.createAdapter();\n }\n\n /**\n * Create a new database client\n *\n * @example\n * ```ts\n * const db = DBBridge.create({\n * provider: 'mysql',\n * url: 'mysql://user:pass@localhost:3306/mydb'\n * });\n * ```\n */\n static create(options: ClientOptions): DBBridge {\n return new DBBridge(options);\n }\n\n /**\n * Get or create a singleton instance\n *\n * @example\n * ```ts\n * const db = DBBridge.getInstance('main', {\n * provider: 'postgresql',\n * url: process.env.DATABASE_URL\n * });\n * ```\n */\n static getInstance(name: string, options?: ClientOptions): DBBridge {\n if (!this.instances.has(name)) {\n if (!options) {\n throw new Error(`Instance \"${name}\" not found and no options provided`);\n }\n this.instances.set(name, new DBBridge(options));\n }\n return this.instances.get(name)!;\n }\n\n /**\n * Create from connection string\n *\n * @example\n * ```ts\n * const db = DBBridge.fromUrl('postgresql://user:pass@localhost/mydb');\n * ```\n */\n static fromUrl(url: string, options?: Partial<ClientOptions>): DBBridge {\n const provider = this.parseProvider(url);\n return new DBBridge({\n provider,\n url,\n ...options,\n });\n }\n\n private static parseProvider(url: string): ClientOptions['provider'] {\n if (url.startsWith('mysql://')) {\n return 'mysql';\n }\n if (url.startsWith('postgresql://') || url.startsWith('postgres://')) {\n return 'postgresql';\n }\n throw new Error(`Unsupported database URL: ${url}`);\n }\n\n private createAdapter(): DatabaseAdapter {\n const logger = this.options.logger === true ? console : this.options.logger || undefined;\n\n let crypto: CryptoProvider | undefined;\n if (this.options.encryption) {\n const encryptionOpts = this.options.encryption === true ? {} : this.options.encryption;\n crypto = new CryptoProvider({\n algorithm: encryptionOpts.algorithm,\n });\n if (encryptionOpts.key) {\n process.env['DB_BRIDGE_ENCRYPTION_KEY'] = encryptionOpts.key;\n }\n }\n\n let adapter: DatabaseAdapter;\n\n // Dynamically load adapters to avoid circular dependencies\n switch (this.options.provider) {\n case 'mysql': {\n const { MySQLAdapter } = require('@db-bridge/mysql');\n adapter = new MySQLAdapter({ logger, crypto });\n break;\n }\n case 'postgresql':\n case 'postgres': {\n const { PostgreSQLAdapter } = require('@db-bridge/postgresql');\n adapter = new PostgreSQLAdapter({ logger, crypto });\n break;\n }\n default: {\n throw new Error(`Unsupported provider: ${this.options.provider}`);\n }\n }\n\n // Wrap with caching if enabled\n if (this.options.cache) {\n const cacheOpts =\n this.options.cache === true ? { provider: 'redis' as const } : this.options.cache;\n if (cacheOpts.provider === 'redis') {\n const { RedisAdapter } = require('@db-bridge/redis');\n const redisAdapter = new RedisAdapter({ logger }) as CacheAdapter;\n if (cacheOpts.url || cacheOpts.connection) {\n // Connect to Redis will be handled in connect()\n }\n adapter = new CachedAdapter({\n adapter,\n cache: redisAdapter,\n enabled: true,\n });\n }\n }\n\n return adapter;\n }\n\n private parseConnectionUrl(url: string): ConnectionConfig {\n const urlObj = new URL(url);\n return {\n host: urlObj.hostname,\n port: Number.parseInt(urlObj.port) || (this.options.provider === 'mysql' ? 3306 : 5432),\n user: urlObj.username,\n password: urlObj.password,\n database: urlObj.pathname.slice(1),\n ssl: this.options.ssl,\n };\n }\n\n /**\n * Connect to the database\n */\n async connect(): Promise<void> {\n if (this.connected) {\n return;\n }\n\n const config = this.options.url\n ? this.parseConnectionUrl(this.options.url)\n : this.options.connection;\n\n if (!config) {\n throw new Error('No connection configuration provided');\n }\n\n await this.adapter.connect({\n ...config,\n poolSize: this.options.poolSize || config.poolSize,\n });\n\n // Connect to cache if needed\n if (this.options.cache && this.adapter instanceof CachedAdapter) {\n const cacheOpts =\n this.options.cache === true ? { provider: 'redis' as const } : this.options.cache;\n const cacheAdapter = (this.adapter as any).cache;\n\n if (cacheOpts.url) {\n await cacheAdapter.connect(this.parseConnectionUrl(cacheOpts.url));\n } else if (cacheOpts.connection) {\n await cacheAdapter.connect(cacheOpts.connection);\n } else {\n // Default Redis connection\n await cacheAdapter.connect({ host: 'localhost', port: 6379 });\n }\n }\n\n this.connected = true;\n }\n\n /**\n * Get a query builder\n *\n * @example\n * ```ts\n * const users = await db.from('users')\n * .select('id', 'name', 'email')\n * .where({ active: true })\n * .limit(10);\n * ```\n */\n from<T = any>(table: string, alias?: string) {\n return this.adapter.createQueryBuilder<T>().from(table, alias);\n }\n\n /**\n * Execute a raw query\n *\n * @example\n * ```ts\n * const result = await db.query('SELECT * FROM users WHERE id = ?', [userId]);\n * ```\n */\n async query<T = any>(sql: string, params?: any[]) {\n return this.adapter.query<T>(sql, params);\n }\n\n /**\n * Insert data\n *\n * @example\n * ```ts\n * await db.insert('users', { name: 'John', email: 'john@example.com' });\n * ```\n */\n async insert<T = any>(table: string, data: Record<string, any> | Record<string, any>[]) {\n return this.adapter.createQueryBuilder<T>().insert(table, data).execute();\n }\n\n /**\n * Update data\n *\n * @example\n * ```ts\n * await db.update('users', { name: 'Jane' }, { id: userId });\n * ```\n */\n async update<T = any>(table: string, data: Record<string, any>, where: Record<string, any>) {\n return this.adapter.createQueryBuilder<T>().update(table, data).where(where).execute();\n }\n\n /**\n * Delete data\n *\n * @example\n * ```ts\n * await db.delete('users', { id: userId });\n * ```\n */\n async delete<T = any>(table: string, where: Record<string, any>) {\n return this.adapter.createQueryBuilder<T>().delete(table).where(where).execute();\n }\n\n /**\n * Start a transaction\n *\n * @example\n * ```ts\n * const tx = await db.transaction();\n * try {\n * await tx.query('INSERT INTO...');\n * await tx.commit();\n * } catch (error) {\n * await tx.rollback();\n * }\n * ```\n */\n async transaction() {\n return this.adapter.beginTransaction();\n }\n\n /**\n * Disconnect from the database\n */\n async disconnect(): Promise<void> {\n if (!this.connected) {\n return;\n }\n\n await this.adapter.disconnect();\n\n // Disconnect from cache if needed\n if (this.adapter instanceof CachedAdapter) {\n const cacheAdapter = (this.adapter as any).cache;\n await cacheAdapter.disconnect();\n }\n\n this.connected = false;\n }\n\n /**\n * Get the underlying adapter\n */\n getAdapter(): DatabaseAdapter {\n return this.adapter;\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Ping the database\n */\n async ping(): Promise<boolean> {\n return this.adapter.ping();\n }\n}\n","import { MySQLDialect, PostgreSQLDialect } from './dialect';\nimport { DatabaseError } from './errors';\nimport { createModularQueryBuilder } from './query';\n\nimport type { SQLDialect } from './dialect';\nimport type { ConnectionConfig, DatabaseAdapter, QueryBuilder } from './interfaces';\nimport type { ModularQueryBuilder, QueryExecutor, ExecuteResult } from './query';\nimport type { QueryResult } from './types';\n\n/**\n * Supported database types\n */\nexport enum DatabaseType {\n MySQL = 'mysql',\n PostgreSQL = 'postgresql',\n Postgres = 'postgres', // Alias for PostgreSQL\n Redis = 'redis',\n}\n\n// Also export as string literal type for backward compatibility\nexport type DatabaseTypeString = 'mysql' | 'postgresql' | 'postgres' | 'redis';\n\nexport interface DBBridgeConfig {\n type: DatabaseType | DatabaseTypeString;\n connection: ConnectionConfig;\n options?: {\n logging?: boolean;\n logger?: any;\n /** Auto-connect on creation (default: false) */\n autoConnect?: boolean;\n /** @deprecated Use connection.pool instead */\n pool?: {\n min?: number;\n max?: number;\n };\n };\n}\n\n/**\n * DBBridge - Simple and user-friendly database interface\n *\n * @example\n * ```typescript\n * // Basic usage\n * const db = DBBridge.mysql({\n * host: 'localhost',\n * user: 'root',\n * password: '',\n * database: 'mydb'\n * });\n *\n * await db.connect();\n *\n * // Query builder\n * const users = await db.table('users')\n * .where('active', true)\n * .orderBy('created_at', 'desc')\n * .get();\n * ```\n */\nexport class DBBridge {\n private adapter?: DatabaseAdapter;\n private readonly config: DBBridgeConfig;\n private _dialect?: SQLDialect;\n private _queryBuilder?: ModularQueryBuilder;\n\n constructor(config: DBBridgeConfig) {\n this.config = config;\n }\n\n /**\n * Create MySQL instance (requires manual connect())\n */\n static mysql(connection: ConnectionConfig, options?: any): DBBridge {\n return new DBBridge({\n type: DatabaseType.MySQL,\n connection,\n options,\n });\n }\n\n /**\n * Create and connect to MySQL database\n *\n * @param connection - Connection configuration\n * @param options - Additional options\n * @param autoConnect - Whether to auto-connect (default: true)\n *\n * @example\n * ```typescript\n * // Auto-connect (default)\n * const db = await DBBridge.createMySQL({\n * host: 'localhost',\n * user: 'root',\n * database: 'mydb'\n * });\n * // Ready to use - no connect() needed!\n *\n * // Without auto-connect\n * const db = await DBBridge.createMySQL(config, null, false);\n * await db.connect(); // Connect when ready\n * ```\n */\n static async createMySQL(\n connection: ConnectionConfig,\n options?: any,\n autoConnect = true,\n ): Promise<DBBridge> {\n const db = DBBridge.mysql(connection, options);\n if (autoConnect) {\n await db.connect();\n }\n return db;\n }\n\n /**\n * Create PostgreSQL instance (requires manual connect())\n */\n static postgresql(connection: ConnectionConfig, options?: any): DBBridge {\n return new DBBridge({\n type: DatabaseType.PostgreSQL,\n connection,\n options,\n });\n }\n\n /**\n * Create and connect to PostgreSQL database\n *\n * @param connection - Connection configuration\n * @param options - Additional options\n * @param autoConnect - Whether to auto-connect (default: true)\n *\n * @example\n * ```typescript\n * // Auto-connect (default)\n * const db = await DBBridge.createPostgreSQL({\n * host: 'localhost',\n * user: 'postgres',\n * database: 'mydb'\n * });\n * // Ready to use!\n *\n * // Without auto-connect\n * const db = await DBBridge.createPostgreSQL(config, null, false);\n * ```\n */\n static async createPostgreSQL(\n connection: ConnectionConfig,\n options?: any,\n autoConnect = true,\n ): Promise<DBBridge> {\n const db = DBBridge.postgresql(connection, options);\n if (autoConnect) {\n await db.connect();\n }\n return db;\n }\n\n /**\n * Create Redis instance (requires manual connect())\n */\n static redis(connection?: ConnectionConfig, options?: any): DBBridge {\n return new DBBridge({\n type: DatabaseType.Redis,\n connection: connection || { host: 'localhost', port: 6379 },\n options,\n });\n }\n\n /**\n * Create and connect to Redis\n *\n * @param connection - Connection configuration\n * @param options - Additional options\n * @param autoConnect - Whether to auto-connect (default: true)\n *\n * @example\n * ```typescript\n * // Auto-connect (default)\n * const redis = await DBBridge.createRedis({\n * host: 'localhost',\n * port: 6379\n * });\n * // Ready to use!\n *\n * // Without auto-connect\n * const redis = await DBBridge.createRedis(config, null, false);\n * ```\n */\n static async createRedis(\n connection?: ConnectionConfig,\n options?: any,\n autoConnect = true,\n ): Promise<DBBridge> {\n const db = DBBridge.redis(connection, options);\n if (autoConnect) {\n await db.connect();\n }\n return db;\n }\n\n /**\n * Generic factory method - create and optionally connect\n *\n * @param config - Database configuration\n * @param autoConnect - Whether to auto-connect (default: true)\n *\n * @example\n * ```typescript\n * // Auto-connect enabled (default)\n * const db = await DBBridge.create({\n * type: DatabaseType.MySQL,\n * connection: { host: 'localhost', database: 'test' }\n * });\n *\n * // Auto-connect disabled\n * const db = await DBBridge.create({\n * type: DatabaseType.MySQL,\n * connection: { host: 'localhost', database: 'test' }\n * }, false);\n * await db.connect(); // Manual connect when ready\n * ```\n */\n static async create(config: DBBridgeConfig, autoConnect = true): Promise<DBBridge> {\n const db = new DBBridge(config);\n if (autoConnect) {\n await db.connect();\n }\n return db;\n }\n\n /**\n * Connect to database\n */\n async connect(): Promise<void> {\n // Create adapter based on type (will be loaded dynamically at runtime)\n const adapterModule = await this.loadAdapter();\n this.adapter = adapterModule;\n await this.adapter.connect(this.config.connection);\n }\n\n /**\n * Load adapter dynamically\n */\n private async loadAdapter(): Promise<DatabaseAdapter> {\n const dbType = this.config.type;\n\n // Enum values are string literals, so this handles both\n switch (dbType) {\n case 'mysql': {\n return this.loadMySQLAdapter();\n }\n\n case 'postgresql':\n case 'postgres': {\n return this.loadPostgreSQLAdapter();\n }\n\n case 'redis': {\n return this.loadRedisAdapter();\n }\n\n default: {\n throw new DatabaseError(`Unsupported database type: ${dbType}`);\n }\n }\n }\n\n private async loadRedisAdapter(): Promise<DatabaseAdapter> {\n try {\n let redisModule: any;\n\n // Try dynamic import first (for ESM)\n try {\n redisModule = await (import('@db-bridge/redis') as Promise<any>);\n } catch {\n // Fallback to require (for CJS)\n redisModule = require('@db-bridge/redis');\n }\n\n const RedisAdapter = redisModule.RedisAdapter || redisModule.default?.RedisAdapter;\n if (!RedisAdapter) {\n throw new Error('RedisAdapter not found in module');\n }\n\n const adapter = new RedisAdapter(\n this.config.options?.logger\n ? {\n logger: this.config.options.logger,\n }\n : {},\n );\n return adapter as DatabaseAdapter;\n } catch {\n throw new DatabaseError('Redis adapter not installed. Run: npm install @db-bridge/redis');\n }\n }\n\n private async loadMySQLAdapter(): Promise<DatabaseAdapter> {\n try {\n let mysqlModule: any;\n\n // Try dynamic import first (for ESM)\n try {\n mysqlModule = await (import('@db-bridge/mysql') as Promise<any>);\n } catch {\n // Fallback to require (for CJS)\n mysqlModule = require('@db-bridge/mysql');\n }\n\n const MySQLAdapter = mysqlModule.MySQLAdapter || mysqlModule.default?.MySQLAdapter;\n if (!MySQLAdapter) {\n throw new Error('MySQLAdapter not found in module');\n }\n\n const adapter = new MySQLAdapter(\n this.config.options?.logger\n ? {\n logger: this.config.options.logger,\n }\n : {},\n );\n return adapter as DatabaseAdapter;\n } catch {\n throw new DatabaseError('MySQL adapter not installed. Run: npm install @db-bridge/mysql');\n }\n }\n\n private async loadPostgreSQLAdapter(): Promise<DatabaseAdapter> {\n try {\n let pgModule: any;\n\n // Try dynamic import first (for ESM)\n try {\n pgModule = await (import('@db-bridge/postgresql') as Promise<any>);\n } catch {\n // Fallback to require (for CJS)\n pgModule = require('@db-bridge/postgresql');\n }\n\n const PostgreSQLAdapter = pgModule.PostgreSQLAdapter || pgModule.default?.PostgreSQLAdapter;\n if (!PostgreSQLAdapter) {\n throw new Error('PostgreSQLAdapter not found in module');\n }\n\n const adapter = new PostgreSQLAdapter(\n this.config.options?.logger\n ? {\n logger: this.config.options.logger,\n }\n : {},\n );\n return adapter as DatabaseAdapter;\n } catch {\n throw new DatabaseError(\n 'PostgreSQL adapter not installed. Run: npm install @db-bridge/postgresql',\n );\n }\n }\n\n /**\n * Disconnect from database\n */\n async disconnect(): Promise<void> {\n if (this.adapter) {\n await this.adapter.disconnect();\n }\n }\n\n /**\n * Execute raw SQL query\n */\n async query<T = any>(sql: string, params?: any[]): Promise<{ rows: T[]; fields?: any[] }> {\n this.ensureConnected();\n return this.adapter!.query(sql, params);\n }\n\n /**\n * Execute SQL command (INSERT, UPDATE, DELETE)\n */\n async execute(sql: string, params?: any[]): Promise<any> {\n this.ensureConnected();\n return this.adapter!.execute(sql, params);\n }\n\n /**\n * Get query builder for table\n */\n table<T = any>(tableName: string): QueryBuilder<T> {\n this.ensureConnected();\n const qb = this.adapter!.createQueryBuilder<T>();\n return this.configureQueryBuilder(qb, tableName);\n }\n\n /**\n * Configure query builder with table\n */\n private configureQueryBuilder<T>(qb: any, tableName: string): QueryBuilder<T> {\n // Try common methods\n if (typeof qb.table === 'function') {\n return qb.table(tableName);\n }\n if (typeof qb.from === 'function') {\n return qb.from(tableName);\n }\n // As last resort, set internal property if exists\n if ('_table' in qb || 'tableName' in qb) {\n qb._table = tableName;\n qb.tableName = tableName;\n return qb;\n }\n throw new DatabaseError('Query builder does not support table selection');\n }\n\n /**\n * from() method - alias for table()\n */\n from<T = any>(tableName: string): QueryBuilder<T> {\n return this.table<T>(tableName);\n }\n\n /**\n * Start a transaction\n */\n async transaction<T>(callback: (trx: any) => Promise<T>): Promise<T> {\n this.ensureConnected();\n const trx = await this.adapter!.beginTransaction();\n\n try {\n const result = await callback(trx);\n await trx.commit();\n return result;\n } catch (error) {\n await trx.rollback();\n throw error;\n }\n }\n\n /**\n * Create prepared statement\n */\n async prepare(sql: string, options?: any): Promise<any> {\n this.ensureConnected();\n return this.adapter!.prepare(sql, options);\n }\n\n /**\n * Ensure connected\n */\n private ensureConnected(): void {\n if (!this.adapter) {\n throw new DatabaseError('Not connected. Call connect() first.');\n }\n }\n\n /**\n * Get adapter (for advanced usage)\n */\n getAdapter(): DatabaseAdapter | undefined {\n return this.adapter;\n }\n\n /**\n * Get SQL dialect for current database type\n * Auto-selects MySQL or PostgreSQL dialect based on configuration\n */\n getDialect(): SQLDialect {\n if (!this._dialect) {\n const dbType = this.config.type;\n\n // Enum values are string literals, so this handles both\n switch (dbType) {\n case 'mysql': {\n this._dialect = new MySQLDialect();\n break;\n }\n case 'postgresql':\n case 'postgres': {\n this._dialect = new PostgreSQLDialect();\n break;\n }\n case 'redis': {\n throw new DatabaseError('Redis does not support SQL dialects');\n }\n default: {\n throw new DatabaseError(`Unsupported database type for dialect: ${dbType}`);\n }\n }\n }\n return this._dialect;\n }\n\n /**\n * Get dialect-aware modular query builder\n *\n * The query builder auto-adapts SQL syntax based on database type:\n * - MySQL: Uses backticks (`) and ? placeholders\n * - PostgreSQL: Uses double quotes (\") and $1, $2 placeholders\n *\n * @example\n * ```typescript\n * // Works the same for MySQL and PostgreSQL\n * const users = await db.qb()\n * .select('id', 'name', 'email')\n * .from('users')\n * .where('active', true)\n * .orderBy('created_at', 'DESC')\n * .limit(10)\n * .get();\n *\n * // Insert with auto-syntax\n * await db.qb()\n * .insert()\n * .into('users')\n * .values({ name: 'John', email: 'john@example.com' })\n * .execute();\n *\n * // PostgreSQL-specific: RETURNING clause works automatically\n * const inserted = await db.qb()\n * .insert()\n * .into('users')\n * .values({ name: 'John' })\n * .returning('id', 'created_at')\n * .execute();\n * ```\n */\n qb(): ModularQueryBuilder {\n this.ensureConnected();\n\n if (!this._queryBuilder) {\n const dialect = this.getDialect();\n const adapter = this.adapter!;\n\n // Create executor that wraps the adapter\n const executor: QueryExecutor = {\n async query<T = unknown>(sql: string, params?: unknown[]): Promise<QueryResult<T>> {\n const result = await adapter.query<T>(sql, params as any);\n return {\n rows: result.rows,\n rowCount: result.rows.length,\n fields: result.fields,\n };\n },\n async execute(sql: string, params?: unknown[]): Promise<ExecuteResult> {\n const result = await adapter.execute(sql, params as any);\n return {\n affectedRows: result.affectedRows ?? 0,\n insertId: result.insertId,\n changedRows: (result as any).changedRows,\n };\n },\n };\n\n this._queryBuilder = createModularQueryBuilder({\n dialect,\n executor,\n });\n }\n\n return this._queryBuilder;\n }\n\n /**\n * Get database type\n */\n getDatabaseType(): DatabaseType | DatabaseTypeString {\n return this.config.type;\n }\n}\n","/**\n * DBBridge with Industry-Leading Cache Support\n *\n * Combines the best features from:\n * - Drizzle ORM: $cache API, $withCache() method chaining\n * - TypeORM: Simple configuration\n * - Prisma: Extension pattern with callbacks\n *\n * @example\n * ```typescript\n * // Simple setup with cache\n * const db = CachedDBBridge.mysql({\n * host: 'localhost',\n * database: 'mydb',\n * cache: {\n * redis: 'redis://localhost:6379',\n * ttl: 3600,\n * global: false, // Explicit caching (opt-in)\n * }\n * });\n *\n * await db.connect();\n *\n * // Per-query caching\n * const users = await db.query('SELECT * FROM users').$withCache();\n * const posts = await db.query('SELECT * FROM posts').$withCache({ ttl: 60 });\n *\n * // Cache invalidation\n * await db.$cache.invalidate({ tables: ['users'] });\n *\n * // Statistics\n * console.log(db.$cache.stats());\n * ```\n */\n\nimport { EventEmitter } from 'eventemitter3';\n\nimport { CacheAPI } from './cache/cache-api';\nimport { CacheKeyGenerator } from './cache/cache-key-generator';\nimport { DatabaseError } from './errors';\n\nimport type { CacheConfig, QueryCacheConfig } from './cache/cache-api';\nimport type { DatabaseAdapter, CacheAdapter, QueryBuilder } from './interfaces';\nimport type {\n QueryResult,\n QueryParams,\n Transaction,\n TransactionOptions,\n ConnectionConfig,\n} from './types';\n\nexport type DatabaseType = 'mysql' | 'postgresql' | 'postgres' | 'redis';\n\n/** Extended cache adapter with connection methods */\ninterface ConnectableCacheAdapter extends CacheAdapter {\n connect(config: ConnectionConfig): Promise<void>;\n disconnect(): Promise<void>;\n isConnected?: boolean;\n}\n\nexport interface CachedDBBridgeConfig {\n type: DatabaseType;\n host?: string;\n port?: number;\n user?: string;\n password?: string;\n database?: string;\n connectionString?: string;\n\n /** Cache configuration */\n cache?: CacheConfig;\n\n /** Additional options */\n options?: {\n logging?: boolean;\n logger?: any;\n pool?: {\n min?: number;\n max?: number;\n };\n };\n}\n\n/**\n * Chainable query result with $withCache support\n */\nexport class CacheableQuery<T = unknown> implements PromiseLike<QueryResult<T>> {\n private executed = false;\n private cacheConfig: QueryCacheConfig | null = null;\n private result: QueryResult<T> | null = null;\n\n constructor(\n private readonly sql: string,\n private readonly params: QueryParams | undefined,\n private readonly executor: (\n sql: string,\n params?: QueryParams,\n cache?: QueryCacheConfig | null,\n ) => Promise<QueryResult<T>>,\n globalCache: boolean,\n ) {\n // If global cache is enabled, use cache by default\n if (globalCache) {\n this.cacheConfig = { enabled: true };\n }\n }\n\n /**\n * Enable caching for this query (Drizzle-style)\n *\n * @example\n * ```typescript\n * // Simple enable\n * await db.query('SELECT * FROM users').$withCache();\n *\n * // With options\n * await db.query('SELECT * FROM users').$withCache({\n * ttl: 60,\n * tags: ['users']\n * });\n *\n * // Disable for global cache mode\n * await db.query('SELECT * FROM users').$withCache(false);\n * ```\n */\n $withCache(options?: boolean | QueryCacheConfig): this {\n if (options === false) {\n this.cacheConfig = null;\n } else if (options === true || options === undefined) {\n this.cacheConfig = { enabled: true };\n } else {\n this.cacheConfig = { enabled: true, ...options };\n }\n return this;\n }\n\n /**\n * Alias for $withCache\n */\n cache(options?: boolean | QueryCacheConfig): this {\n return this.$withCache(options);\n }\n\n /**\n * Execute the query\n */\n async execute(): Promise<QueryResult<T>> {\n if (!this.executed) {\n this.result = await this.executor(this.sql, this.params, this.cacheConfig);\n this.executed = true;\n }\n return this.result!;\n }\n\n /**\n * Implement PromiseLike for await support\n */\n then<TResult1 = QueryResult<T>, TResult2 = never>(\n onfulfilled?: ((value: QueryResult<T>) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null,\n ): PromiseLike<TResult1 | TResult2> {\n return this.execute().then(onfulfilled, onrejected);\n }\n}\n\n/**\n * CachedDBBridge - Database client with integrated caching\n */\nexport class CachedDBBridge extends EventEmitter {\n private adapter?: DatabaseAdapter;\n private cacheAdapter?: ConnectableCacheAdapter;\n private cacheAPI?: CacheAPI;\n private keyGenerator: CacheKeyGenerator;\n private readonly config: CachedDBBridgeConfig;\n\n constructor(config: CachedDBBridgeConfig) {\n super();\n this.config = config;\n this.keyGenerator = new CacheKeyGenerator({\n namespace: config.cache?.namespace || 'db-bridge',\n });\n }\n\n // ============================================\n // Static Factory Methods\n // ============================================\n\n /**\n * Create MySQL instance with optional cache\n */\n static mysql(\n config: Omit<CachedDBBridgeConfig, 'type'> & {\n host?: string;\n port?: number;\n user?: string;\n password?: string;\n database?: string;\n },\n ): CachedDBBridge {\n return new CachedDBBridge({ ...config, type: 'mysql' });\n }\n\n /**\n * Create PostgreSQL instance with optional cache\n */\n static postgresql(\n config: Omit<CachedDBBridgeConfig, 'type'> & {\n host?: string;\n port?: number;\n user?: string;\n password?: string;\n database?: string;\n },\n ): CachedDBBridge {\n return new CachedDBBridge({ ...config, type: 'postgresql' });\n }\n\n /**\n * Alias for postgresql\n */\n static postgres(config: Omit<CachedDBBridgeConfig, 'type'>): CachedDBBridge {\n return CachedDBBridge.postgresql(config);\n }\n\n // ============================================\n // $cache API (Drizzle-style)\n // ============================================\n\n /**\n * Cache management API\n *\n * @example\n * ```typescript\n * // Invalidate by tables\n * await db.$cache.invalidate({ tables: ['users', 'posts'] });\n *\n * // Invalidate by tags\n * await db.$cache.invalidate({ tags: ['user-123'] });\n *\n * // Get statistics\n * const stats = db.$cache.stats();\n *\n * // Clear all\n * await db.$cache.clear();\n * ```\n */\n get $cache(): {\n invalidate: CacheAPI['invalidate'];\n clear: CacheAPI['clear'];\n warmup: (\n queries: Array<{ sql: string; params?: unknown[]; ttl?: number }>,\n ) => Promise<{ success: number; failed: number }>;\n stats: () => ReturnType<CacheAPI['getStats']>;\n resetStats: () => void;\n key: () => CacheKeyGenerator;\n } {\n if (!this.cacheAPI) {\n throw new DatabaseError('Cache not configured. Add cache config to enable caching.');\n }\n\n return {\n invalidate: this.cacheAPI.invalidate.bind(this.cacheAPI),\n clear: this.cacheAPI.clear.bind(this.cacheAPI),\n warmup: (queries) =>\n this.cacheAPI!.warmup(queries, (sql, params) =>\n this.adapter!.query(sql, params as QueryParams),\n ),\n stats: () => this.cacheAPI!.getStats(),\n resetStats: () => this.cacheAPI!.resetStats(),\n key: () => this.keyGenerator,\n };\n }\n\n /**\n * Check if cache is enabled\n */\n get isCacheEnabled(): boolean {\n return !!this.cacheAPI;\n }\n\n // ============================================\n // Connection Methods\n // ============================================\n\n /**\n * Connect to database (and cache if configured)\n */\n async connect(): Promise<void> {\n // Load and connect database adapter\n this.adapter = await this.loadAdapter();\n await this.adapter.connect({\n host: this.config.host,\n port: this.config.port,\n user: this.config.user,\n password: this.config.password,\n database: this.config.database,\n connectionString: this.config.connectionString,\n pool: this.config.options?.pool,\n });\n\n // Setup cache if configured\n if (this.config.cache) {\n await this.setupCache();\n }\n\n this.emit('connect');\n }\n\n /**\n * Disconnect from database and cache\n */\n async disconnect(): Promise<void> {\n if (this.cacheAdapter && typeof this.cacheAdapter.disconnect === 'function') {\n await this.cacheAdapter.disconnect();\n }\n if (this.adapter) {\n await this.adapter.disconnect();\n }\n this.emit('disconnect');\n }\n\n // ============================================\n // Query Methods with $withCache Support\n // ============================================\n\n /**\n * Execute query with optional caching\n *\n * @example\n * ```typescript\n * // Simple query\n * const result = await db.query('SELECT * FROM users');\n *\n * // With cache (method chaining)\n * const cached = await db.query('SELECT * FROM users').$withCache();\n *\n * // With cache options\n * const custom = await db.query('SELECT * FROM users').$withCache({\n * ttl: 60,\n * tags: ['users-list']\n * });\n *\n * // Disable cache (when global is true)\n * const fresh = await db.query('SELECT * FROM users').$withCache(false);\n * ```\n */\n query<T = unknown>(sql: string, params?: QueryParams): CacheableQuery<T> {\n this.ensureConnected();\n\n const executor = async (\n s: string,\n p?: QueryParams,\n cacheConfig?: QueryCacheConfig | null,\n ): Promise<QueryResult<T>> => {\n // No caching\n if (!cacheConfig || !this.cacheAPI) {\n return this.adapter!.query<T>(s, p);\n }\n\n // Generate cache key\n const key = cacheConfig.key || this.cacheAPI.generateKey(s, p as unknown[]);\n\n // Try cache first\n const cached = await this.cacheAPI.get<QueryResult<T>>(key);\n if (cached) {\n this.emit('cacheHit', { key, sql: s });\n return cached;\n }\n\n // Execute query\n const result = await this.adapter!.query<T>(s, p);\n this.emit('cacheMiss', { key, sql: s });\n\n // Cache the result\n const tables = this.extractTables(s);\n await this.cacheAPI.set(key, result, {\n ttl: cacheConfig.ttl || this.config.cache?.ttl || 3600,\n tags: cacheConfig.tags,\n tables,\n });\n\n return result;\n };\n\n return new CacheableQuery<T>(sql, params, executor, this.config.cache?.global ?? false);\n }\n\n /**\n * Execute command (INSERT, UPDATE, DELETE)\n * Automatically invalidates related cache\n */\n async execute<T = unknown>(sql: string, params?: QueryParams): Promise<QueryResult<T>> {\n this.ensureConnected();\n\n const result = await this.adapter!.query<T>(sql, params);\n\n // Auto-invalidate cache for mutations\n if (this.cacheAPI && this.config.cache?.autoInvalidate !== false) {\n const command = sql.trim().split(/\\s+/)[0]?.toUpperCase();\n const mutationCommands = ['INSERT', 'UPDATE', 'DELETE', 'TRUNCATE', 'DROP', 'ALTER'];\n\n if (command && mutationCommands.includes(command)) {\n const tables = this.extractTables(sql);\n if (tables.length > 0) {\n await this.$cache.invalidate({ tables });\n this.emit('cacheInvalidated', { tables, command });\n }\n }\n }\n\n return result;\n }\n\n // ============================================\n // Query Builder\n // ============================================\n\n /**\n * Get query builder for table\n */\n table<T = unknown>(tableName: string): QueryBuilder<T> {\n this.ensureConnected();\n const qb = this.adapter!.createQueryBuilder<T>();\n return this.configureQueryBuilder(qb, tableName);\n }\n\n /**\n * Alias for table()\n */\n from<T = unknown>(tableName: string): QueryBuilder<T> {\n return this.table<T>(tableName);\n }\n\n // ============================================\n // Transaction Support\n // ============================================\n\n /**\n * Execute transaction\n * Note: Cache is bypassed during transactions\n */\n async transaction<T>(\n callback: (trx: Transaction) => Promise<T>,\n options?: TransactionOptions,\n ): Promise<T> {\n this.ensureConnected();\n\n const trx = await this.adapter!.beginTransaction(options);\n\n try {\n const result = await callback(trx);\n await trx.commit();\n\n // Invalidate all cache after successful transaction\n if (this.cacheAPI) {\n await this.$cache.clear();\n }\n\n return result;\n } catch (error) {\n await trx.rollback();\n throw error;\n }\n }\n\n // ============================================\n // Utility Methods\n // ============================================\n\n /**\n * Get raw adapter for advanced usage\n */\n getAdapter(): DatabaseAdapter | undefined {\n return this.adapter;\n }\n\n /**\n * Get cache adapter\n */\n getCacheAdapter(): CacheAdapter | undefined {\n return this.cacheAdapter;\n }\n\n /**\n * Ping database\n */\n async ping(): Promise<boolean> {\n this.ensureConnected();\n return this.adapter!.ping();\n }\n\n /**\n * Check if connected\n */\n get isConnected(): boolean {\n return !!this.adapter?.isConnected;\n }\n\n // ============================================\n // Private Methods\n // ============================================\n\n private async setupCache(): Promise<void> {\n const cacheConfig = this.config.cache!;\n\n // Load Redis adapter if string connection\n if (typeof cacheConfig.redis === 'string') {\n this.cacheAdapter = await this.loadRedisAdapter();\n if (typeof this.cacheAdapter.connect === 'function') {\n await this.cacheAdapter.connect({\n connectionString: cacheConfig.redis,\n });\n }\n } else if (cacheConfig.redis) {\n this.cacheAdapter = cacheConfig.redis as ConnectableCacheAdapter;\n }\n\n if (!this.cacheAdapter) {\n throw new DatabaseError('Cache adapter not configured properly');\n }\n\n // Create Cache API\n this.cacheAPI = new CacheAPI({\n adapter: this.cacheAdapter,\n namespace: cacheConfig.namespace || 'db-bridge',\n logger: this.config.options?.logger,\n onHit: cacheConfig.onHit,\n onMiss: cacheConfig.onMiss,\n onError: cacheConfig.onError,\n });\n\n // Warmup if configured\n if (cacheConfig.warmup && cacheConfig.warmup.length > 0) {\n await this.$cache.warmup(cacheConfig.warmup);\n }\n }\n\n private async loadAdapter(): Promise<DatabaseAdapter> {\n switch (this.config.type) {\n case 'mysql': {\n return this.loadMySQLAdapter();\n }\n case 'postgresql':\n case 'postgres': {\n return this.loadPostgreSQLAdapter();\n }\n default: {\n throw new DatabaseError(`Unsupported database type: ${this.config.type}`);\n }\n }\n }\n\n private async loadMySQLAdapter(): Promise<DatabaseAdapter> {\n try {\n let module: any;\n try {\n module = await import('@db-bridge/mysql');\n } catch {\n module = require('@db-bridge/mysql');\n }\n const MySQLAdapter = module.MySQLAdapter || module.default?.MySQLAdapter;\n return new MySQLAdapter(\n this.config.options?.logger ? { logger: this.config.options.logger } : {},\n );\n } catch {\n throw new DatabaseError('MySQL adapter not installed. Run: npm install @db-bridge/mysql');\n }\n }\n\n private async loadPostgreSQLAdapter(): Promise<DatabaseAdapter> {\n try {\n let module: any;\n try {\n module = await import('@db-bridge/postgresql');\n } catch {\n module = require('@db-bridge/postgresql');\n }\n const PostgreSQLAdapter = module.PostgreSQLAdapter || module.default?.PostgreSQLAdapter;\n return new PostgreSQLAdapter(\n this.config.options?.logger ? { logger: this.config.options.logger } : {},\n );\n } catch {\n throw new DatabaseError(\n 'PostgreSQL adapter not installed. Run: npm install @db-bridge/postgresql',\n );\n }\n }\n\n private async loadRedisAdapter(): Promise<ConnectableCacheAdapter> {\n try {\n let module: any;\n try {\n module = await import('@db-bridge/redis');\n } catch {\n module = require('@db-bridge/redis');\n }\n const RedisAdapter = module.RedisAdapter || module.default?.RedisAdapter;\n return new RedisAdapter() as ConnectableCacheAdapter;\n } catch {\n throw new DatabaseError('Redis adapter not installed. Run: npm install @db-bridge/redis');\n }\n }\n\n private configureQueryBuilder<T>(qb: any, tableName: string): QueryBuilder<T> {\n if (typeof qb.table === 'function') {\n return qb.table(tableName);\n }\n if (typeof qb.from === 'function') {\n return qb.from(tableName);\n }\n if ('_table' in qb || 'tableName' in qb) {\n qb._table = tableName;\n qb.tableName = tableName;\n return qb;\n }\n throw new DatabaseError('Query builder does not support table selection');\n }\n\n private ensureConnected(): void {\n if (!this.adapter) {\n throw new DatabaseError('Not connected. Call connect() first.');\n }\n }\n\n private extractTables(sql: string): string[] {\n const tables: string[] = [];\n const patterns = [\n /from\\s+[\"'`]?(\\w+)[\"'`]?/gi,\n /join\\s+[\"'`]?(\\w+)[\"'`]?/gi,\n /into\\s+[\"'`]?(\\w+)[\"'`]?/gi,\n /update\\s+[\"'`]?(\\w+)[\"'`]?/gi,\n /delete\\s+from\\s+[\"'`]?(\\w+)[\"'`]?/gi,\n ];\n\n for (const pattern of patterns) {\n let match;\n while ((match = pattern.exec(sql)) !== null) {\n if (match[1]) {\n tables.push(match[1].toLowerCase());\n }\n }\n }\n\n return [...new Set(tables)];\n }\n}\n\n// Export types\n\nexport { type CacheConfig, type QueryCacheConfig } from './cache/cache-api';\n","import { DatabaseError } from './errors';\n\nimport type { ConnectionConfig, DatabaseAdapter } from './interfaces';\n\nexport type DatabaseType = 'mysql' | 'postgresql' | 'postgres';\n\nexport interface DBBridgeConfig {\n type: DatabaseType;\n connection: ConnectionConfig;\n options?: {\n logging?: boolean;\n logger?: any;\n pool?: {\n min?: number;\n max?: number;\n };\n };\n}\n\n// Adapter factory interface\nexport interface AdapterFactory {\n createAdapter(config: DBBridgeConfig): DatabaseAdapter;\n}\n\n// Registry for adapter factories\nconst adapterFactories = new Map<DatabaseType, AdapterFactory>();\n\n/**\n * Register an adapter factory\n */\nexport function registerAdapterFactory(type: DatabaseType, factory: AdapterFactory): void {\n adapterFactories.set(type, factory);\n}\n\n/**\n * Create adapter using registered factory\n */\nexport function createAdapter(config: DBBridgeConfig): DatabaseAdapter {\n const factory = adapterFactories.get(config.type);\n\n if (!factory) {\n throw new DatabaseError(\n `No adapter factory registered for type: ${config.type}. ` +\n `Make sure you've imported the adapter package.`,\n );\n }\n\n return factory.createAdapter(config);\n}\n\n/**\n * DBBridge with factory pattern - no dynamic imports\n */\nexport class DBBridge {\n private adapter?: DatabaseAdapter;\n private readonly config: DBBridgeConfig;\n\n constructor(config: DBBridgeConfig) {\n this.config = config;\n }\n\n static mysql(connection: ConnectionConfig, options?: any): DBBridge {\n return new DBBridge({\n type: 'mysql',\n connection,\n options,\n });\n }\n\n static postgresql(connection: ConnectionConfig, options?: any): DBBridge {\n return new DBBridge({\n type: 'postgresql',\n connection,\n options,\n });\n }\n\n async connect(): Promise<void> {\n this.adapter = createAdapter(this.config);\n await this.adapter.connect(this.config.connection);\n }\n\n async disconnect(): Promise<void> {\n if (this.adapter) {\n await this.adapter.disconnect();\n }\n }\n\n async query<T = any>(sql: string, params?: any[]): Promise<{ rows: T[]; fields?: any[] }> {\n this.ensureConnected();\n return this.adapter!.query(sql, params);\n }\n\n async execute(sql: string, params?: any[]): Promise<any> {\n this.ensureConnected();\n return this.adapter!.execute(sql, params);\n }\n\n table<T = any>(tableName: string): import('./interfaces').QueryBuilder<T> {\n this.ensureConnected();\n const qb = this.adapter!.createQueryBuilder<T>();\n return this.configureQueryBuilder(qb, tableName);\n }\n\n private configureQueryBuilder<T>(\n qb: any,\n tableName: string,\n ): import('./interfaces').QueryBuilder<T> {\n if (typeof qb.table === 'function') {\n return qb.table(tableName);\n }\n if (typeof qb.from === 'function') {\n return qb.from(tableName);\n }\n if ('_table' in qb || 'tableName' in qb) {\n qb._table = tableName;\n qb.tableName = tableName;\n return qb;\n }\n throw new DatabaseError('Query builder does not support table selection');\n }\n\n from<T = any>(tableName: string): import('./interfaces').QueryBuilder<T> {\n return this.table<T>(tableName);\n }\n\n async transaction<T>(callback: (trx: any) => Promise<T>): Promise<T> {\n this.ensureConnected();\n const trx = await this.adapter!.beginTransaction();\n\n try {\n const result = await callback(trx);\n await trx.commit();\n return result;\n } catch (error) {\n await trx.rollback();\n throw error;\n }\n }\n\n async prepare(sql: string, options?: any): Promise<any> {\n this.ensureConnected();\n return this.adapter!.prepare(sql, options);\n }\n\n private ensureConnected(): void {\n if (!this.adapter) {\n throw new DatabaseError('Not connected. Call connect() first.');\n }\n }\n\n getAdapter(): DatabaseAdapter | undefined {\n return this.adapter;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/types/strict-types.ts","../src/types/index.ts","../src/constants.ts","../src/errors/index.ts","../src/utils/retry.ts","../src/utils/validation.ts","../src/utils/cache-key.ts","../src/utils/uuid.ts","../src/utils/compression.ts","../src/base-adapter.ts","../src/query-builder/date-filter-trait.ts","../src/base-query-builder.ts","../src/query-builder/query-builder-types.ts","../src/query-builder/aggregate-trait.ts","../src/query-builder/pagination-trait.ts","../src/query-builder/encryption-trait.ts","../src/health/health-checker.ts","../src/health/metrics-collector.ts","../src/migrations/migration-runner.ts","../src/migrations/MigrationLoader.ts","../src/schema/dialects/MySQLDialect.ts","../src/schema/dialects/PostgreSQLDialect.ts","../src/migrations/MigrationLock.ts","../src/schema/ColumnBuilder.ts","../src/schema/TableBuilder.ts","../src/schema/SchemaBuilder.ts","../src/migrations/FileMigrationRunner.ts","../src/migrations/ExpandContract.ts","../src/seeds/SeederLoader.ts","../src/seeds/SeederRunner.ts","../src/monitoring/performance-monitor.ts","../src/monitoring/traits/trace-base-trait.ts","../src/monitoring/traits/trace-management-trait.ts","../src/monitoring/traits/query-analysis-trait.ts","../src/monitoring/traits/performance-analysis-trait.ts","../src/monitoring/traits/adapter-wrapper-trait.ts","../src/monitoring/modular-performance-monitor.ts","../src/cache/cache-key-generator.ts","../src/cache/cache-manager.ts","../src/cache/cache-strategy.ts","../src/cache/cache-api.ts","../src/cache/traits/cache-base-trait.ts","../src/cache/traits/cache-operations-trait.ts","../src/cache/traits/cache-invalidation-trait.ts","../src/cache/traits/cache-maintenance-trait.ts","../src/cache/modular-cache-manager.ts","../src/cache/cached-adapter.ts","../src/crypto/crypto.ts","../src/dialect/sql-dialect.ts","../src/dialect/mysql-dialect.ts","../src/dialect/postgresql-dialect.ts","../src/dialect/dialect-factory.ts","../src/query/query-context.ts","../src/query/where-builder.ts","../src/query/select-builder.ts","../src/query/insert-builder.ts","../src/query/update-builder.ts","../src/query/delete-builder.ts","../src/query/query-factory.ts","../src/transaction/base-transaction.ts","../src/middleware/middleware-chain.ts","../src/middleware/cache-middleware.ts","../src/middleware/retry-middleware.ts","../src/middleware/timeout-middleware.ts","../src/middleware/logging-middleware.ts","../src/client.ts","../src/db-bridge.ts","../src/db-bridge-cached.ts","../src/db-bridge-factory.ts"],"names":["IsolationLevel","sql","max","resolve","zlibConstants","cacheKey","min","count","EventEmitter","cacheHits","sum","crypto","createHash","exists","readdir","pathToFileURL","basename","id","duration","strategy","join","MySQLDialect","PostgreSQLDialect","generateCacheKey","sleep","DBBridge"],"mappings":";;;;;;;;;;;;;;;;AAyBO,SAAS,GAAA,CAAI,YAAkC,OAAA,EAA6B;AAGjF,EAAA,OAAO,OAAA,CAAQ,KAAK,GAAG,CAAA;AACzB;AAoSO,SAAS,eAAkB,MAAA,EAAyD;AACzF,EAAA,OAAO,OAAO,OAAA,KAAY,QAAA;AAC5B;AAKO,SAAS,eAAe,MAAA,EAAmD;AAChF,EAAA,OAAO,OAAO,OAAA,KAAY,QAAA;AAC5B;AAKO,SAAS,eAAe,MAAA,EAAmD;AAChF,EAAA,OAAO,OAAO,OAAA,KAAY,QAAA;AAC5B;AAKO,SAAS,eAAe,MAAA,EAAmD;AAChF,EAAA,OAAO,OAAO,OAAA,KAAY,QAAA;AAC5B;AAOO,IAAM,mBAAA,GAAwC;AAAA,EACnD,GAAA,EAAK,CAAA;AAAA,EACL,GAAA,EAAK,EAAA;AAAA,EACL,cAAA,EAAgB,GAAA;AAAA,EAChB,WAAA,EAAa,GAAA;AAAA,EACb,gBAAA,EAAkB;AACpB;AAKO,IAAM,gBAAA,GAAmB;AAAA,EAC9B,UAAA,EAAY,GAAA;AAAA,EACZ,KAAA,EAAO,GAAA;AAAA,EACP,WAAA,EAAa;AACf;AAKO,IAAM,gBAAA,GAAmB;AAAA,EAC9B,gBAAA,EAAkB,kBAAA;AAAA,EAClB,cAAA,EAAgB,gBAAA;AAAA,EAChB,eAAA,EAAiB,iBAAA;AAAA,EACjB,YAAA,EAAc;AAChB;;;ACxPO,IAAK,cAAA,qBAAAA,eAAAA,KAAL;AACL,EAAAA,gBAAA,kBAAA,CAAA,GAAmB,kBAAA;AACnB,EAAAA,gBAAA,gBAAA,CAAA,GAAiB,gBAAA;AACjB,EAAAA,gBAAA,iBAAA,CAAA,GAAkB,iBAAA;AAClB,EAAAA,gBAAA,cAAA,CAAA,GAAe,cAAA;AAJL,EAAA,OAAAA,eAAAA;AAAA,CAAA,EAAA,cAAA,IAAA,EAAA;;;ACvHL,IAAM,mBAAA,GAAsB;AAAA;AAAA,EAEjC,UAAA,EAAY,IAAA;AAAA;AAAA,EAEZ,eAAA,EAAiB,IAAA;AAAA;AAAA,EAEjB,UAAA,EAAY,IAAA;AAAA;AAAA,EAEZ,YAAA,EAAc,KAAA;AAAA;AAAA,EAEd,kBAAA,EAAoB,GAAA;AAAA;AAAA,EAEpB,YAAA,EAAc,GAAA;AAAA;AAAA,EAEd,QAAA,EAAU,KAAA;AAAA;AAAA,EAEV,QAAA,EAAU;AACZ;AAQO,IAAM,oBAAA,GAAuB;AAAA;AAAA,EAElC,eAAA,EAAiB,CAAA;AAAA;AAAA,EAEjB,eAAA,EAAiB,EAAA;AAAA;AAAA,EAEjB,eAAA,EAAiB,GAAA;AAAA;AAAA,EAEjB,YAAA,EAAc,GAAA;AAAA;AAAA,EAEd,YAAA,EAAc,IAAA;AAAA;AAAA,EAEd,WAAA,EAAa;AACf;AAcO,IAAM,aAAA,GAAgB;AAAA;AAAA,EAE3B,GAAA,EAAK,CAAA;AAAA;AAAA,EAEL,GAAA,EAAK,EAAA;AAAA;AAAA,EAEL,cAAA,EAAgB,GAAA;AAAA;AAAA,EAEhB,WAAA,EAAa,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKb,UAAA,EAAY,GAAA;AAAA;AAAA,EAEZ,YAAA,EAAc;AAChB;AAIO,IAAM,cAAA,GAAiB;AAAA;AAAA,EAE5B,OAAA,EAAS,GAAA;AAAA;AAAA,EAET,mBAAA,EAAqB,GAAA;AAAA;AAAA,EAErB,oBAAA,EAAsB,GAAA;AAAA;AAAA,EAEtB,UAAA,EAAY,GAAA;AAAA;AAAA,EAEZ,yBAAA,EAA2B,GAAA;AAAA;AAAA,EAE3B,0BAAA,EAA4B;AAC9B;AAIO,IAAM,cAAA,GAAiB;AAAA;AAAA,EAE5B,WAAA,EAAa,IAAA;AAAA;AAAA,EAEb,MAAA,EAAQ,IAAA;AAAA;AAAA,EAER,iBAAA,EAAmB,EAAA;AAAA;AAAA,EAEnB,gBAAA,EAAkB,GAAA;AAAA;AAAA,EAElB,gBAAgB,IAAA,GAAO,IAAA;AAAA;AAAA,EAEvB,qBAAA,EAAuB,IAAA;AAAA;AAAA,EAEvB,aAAA,EAAe;AACjB;AAIO,IAAM,cAAA,GAAiB;AAAA;AAAA,EAE5B,WAAA,EAAa,CAAA;AAAA;AAAA,EAEb,UAAA,EAAY,GAAA;AAAA;AAAA,EAEZ,SAAA,EAAW,GAAA;AAAA;AAAA,EAEX,kBAAA,EAAoB,CAAA;AAAA;AAAA,EAEpB,yBAAA,EAA2B,CAAA;AAAA;AAAA,EAE3B,qBAAA,EAAuB;AACzB;AAIO,IAAM,eAAA,GAAkB;AAAA;AAAA,EAE7B,SAAA,EAAW,aAAA;AAAA;AAAA,EAEX,UAAA,EAAY,EAAA;AAAA;AAAA,EAEZ,SAAA,EAAW,EAAA;AAAA;AAAA,EAEX,gBAAA,EAAkB,EAAA;AAAA;AAAA,EAElB,WAAA,EAAa,EAAA;AAAA;AAAA,EAEb,UAAA,EAAY,GAAA;AAAA;AAAA,EAEZ,MAAA,EAAQ;AACV;AAIO,IAAM,eAAA,GAAkB;AAAA;AAAA,EAE7B,cAAA,EAAgB,GAAA;AAAA;AAAA,EAEhB,aAAA,EAAe,GAAA;AAAA;AAAA,EAEf,aAAA,EAAe,GAAA;AAAA;AAAA,EAEf,aAAA,EAAe;AACjB;AAIO,IAAM,gBAAA,GAAmB;AAAA;AAAA,EAE9B,oBAAA,EAAsB,GAAA;AAAA;AAAA,EAEtB,cAAA,EAAgB,GAAA;AAAA;AAAA,EAEhB,iBAAA,EAAmB;AACrB;AAOO,IAAM,gBAAA,GAAmB,CAAC,EAAA,EAAI,EAAA,EAAI,GAAA,EAAK,KAAK,GAAA,EAAK,GAAA,EAAM,IAAA,EAAM,GAAA,EAAM,GAAM;AAIzE,IAAM,iBAAA,GAAoB;AAAA;AAAA,EAE/B,MAAA,EAAQ,IAAA;AAAA;AAAA,EAER,YAAA,EAAc;AAChB;AAIO,IAAM,UAAA,GAAa;AAAA;AAAA,EAExB,aAAA,EAAe,GAAA;AAAA;AAAA,EAEf,aAAA,EAAe,GAAA;AAAA;AAAA,EAEf,WAAA,EAAa,IAAA;AAAA;AAAA,EAEb,kBAAA,EAAoB,EAAA;AAAA;AAAA,EAEpB,gBAAA,EAAkB;AACpB;AAEO,IAAM,UAAA,GAAa;AAAA;AAAA,EAExB,YAAA,EAAc,IAAA;AAAA;AAAA,EAEd,cAAc,IAAA,GAAO,IAAA;AAAA;AAAA,EAErB,YAAA,EAAc,OAAO,IAAA,GAAO;AAC9B;;;ACrNO,IAAM,aAAA,GAAN,cAA4B,KAAA,CAAM;AAAA,EACvC,WAAA,CACE,OAAA,EACO,IAAA,EACS,KAAA,EAChB;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAHN,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACS,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAGhB,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AACZ,IAAA,KAAA,CAAM,iBAAA,CAAkB,IAAA,EAAM,IAAA,CAAK,WAAW,CAAA;AAAA,EAChD;AACF;AAEO,IAAM,aAAA,GAAN,cAA4B,aAAA,CAAc;AAAA,EAC/C,WAAA,CACE,OAAA,EACgB,IAAA,EACA,KAAA,EAChB;AACA,IAAA,KAAA,CAAM,OAAA,EAAS,MAAM,KAAK,CAAA;AAHV,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAGhB,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AACZ,IAAA,KAAA,CAAM,iBAAA,CAAkB,IAAA,EAAM,IAAA,CAAK,WAAW,CAAA;AAAA,EAChD;AACF;AAEO,IAAM,eAAA,GAAN,cAA8B,aAAA,CAAc;AAAA,EACjD,WAAA,CAAY,SAAiB,KAAA,EAAe;AAC1C,IAAA,KAAA,CAAM,OAAA,EAAS,oBAAoB,KAAK,CAAA;AACxC,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,EACd;AACF;AAEO,IAAM,UAAA,GAAN,cAAyB,aAAA,CAAc;AAAA,EAC5C,WAAA,CACE,OAAA,EACOC,IAAAA,EACA,MAAA,EACP,KAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAA,EAAS,eAAe,KAAK,CAAA;AAJ5B,IAAA,IAAA,CAAA,GAAA,GAAAA,IAAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAIP,IAAA,IAAA,CAAK,IAAA,GAAO,YAAA;AAAA,EACd;AACF;AAEO,IAAM,gBAAA,GAAN,cAA+B,aAAA,CAAc;AAAA,EAClD,WAAA,CACE,OAAA,EACO,aAAA,EACP,KAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAA,EAAS,qBAAqB,KAAK,CAAA;AAHlC,IAAA,IAAA,CAAA,aAAA,GAAA,aAAA;AAIP,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AAAA,EACd;AACF;AAEO,IAAM,YAAA,GAAN,cAA2B,aAAA,CAAc;AAAA,EAC9C,WAAA,CACE,OAAA,EACO,OAAA,EACP,KAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAA,EAAS,iBAAiB,KAAK,CAAA;AAH9B,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAIP,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AAAA,EACd;AACF;AAKO,IAAM,iBAAA,GAAN,cAAgC,YAAA,CAAa;AAAA,EAClD,WAAA,CACSA,IAAAA,EACA,SAAA,EACP,KAAA,EACA;AACA,IAAA,KAAA;AAAA,MACE,yBAAyB,SAAS,CAAA,6DAAA,CAAA;AAAA,MAClC,SAAA;AAAA,MACA;AAAA,KACF;AARO,IAAA,IAAA,CAAA,GAAA,GAAAA,IAAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAQP,IAAA,IAAA,CAAK,IAAA,GAAO,mBAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AAAA,EACd;AACF;AASO,IAAM,kBAAA,GAAN,cAAiC,eAAA,CAAgB;AAAA,EACtD,WAAA,CACS,SAAA,EACA,UAAA,EACP,KAAA,EACA;AACA,IAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,EAAS,GAAA,EAAAC,MAAI,GAAI,SAAA;AACjC,IAAA,KAAA;AAAA,MACE,CAAA,2BAAA,EAA8B,MAAM,CAAA,CAAA,EAAIA,IAAG,wBAAwB,OAAO,CAAA,iEAAA,CAAA;AAAA,MAE1E;AAAA,KACF;AATO,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AASP,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AAAA,EACd;AACF;AAEO,IAAM,eAAA,GAAN,cAA8B,aAAA,CAAc;AAAA,EACjD,WAAA,CACE,OAAA,EACO,KAAA,EACP,KAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAA,EAAS,oBAAoB,KAAK,CAAA;AAHjC,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAIP,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,EACd;AACF;AAEO,IAAM,UAAA,GAAN,cAAyB,aAAA,CAAc;AAAA,EAC5C,WAAA,CACE,OAAA,EACO,GAAA,EACP,KAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAA,EAAS,eAAe,KAAK,CAAA;AAH5B,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAIP,IAAA,IAAA,CAAK,IAAA,GAAO,YAAA;AAAA,EACd;AACF;AAEO,IAAM,mBAAA,GAAN,cAAkC,aAAA,CAAc;AAAA,EACrD,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,CAAA,SAAA,EAAY,OAAO,CAAA,oBAAA,CAAA,EAAwB,iBAAiB,CAAA;AAClE,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AAAA,EACd;AACF;;;AC7HA,IAAM,qBAAA,GAAsC;AAAA,EAC1C,UAAA,EAAY,CAAA;AAAA,EACZ,UAAA,EAAY,GAAA;AAAA,EACZ,iBAAA,EAAmB,CAAA;AAAA,EACnB,aAAA,EAAe,GAAA;AAAA,EACf,WAAA,EAAa,CAAC,KAAA,KAAiB;AAC7B,IAAA,MAAM,cAAA,GAAiB,CAAC,cAAA,EAAgB,WAAA,EAAa,aAAa,aAAa,CAAA;AAC/E,IAAA,OAAO,cAAA,CAAe,KAAK,CAAC,IAAA,KAAS,MAAM,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAC,CAAA;AAAA,EACnE;AACF,CAAA;AAEA,eAAsB,KAAA,CACpB,EAAA,EACA,OAAA,GAAiC,EAAC,EACtB;AACZ,EAAA,MAAM,IAAA,GAAO,EAAE,GAAG,qBAAA,EAAuB,GAAG,OAAA,EAAQ;AACpD,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,QAAQ,IAAA,CAAK,UAAA;AAEjB,EAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,IAAA,CAAK,YAAY,OAAA,EAAA,EAAW;AAC3D,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,EAAA,EAAG;AAAA,IAClB,SAAS,KAAA,EAAO;AACd,MAAA,SAAA,GAAY,KAAA;AAEZ,MAAA,IAAI,YAAY,IAAA,CAAK,UAAA,IAAc,CAAC,IAAA,CAAK,WAAA,CAAa,SAAS,CAAA,EAAG;AAChE,QAAA,MAAM,SAAA;AAAA,MACR;AAEA,MAAA,MAAM,MAAM,KAAK,CAAA;AAEjB,MAAA,IAAI,IAAA,CAAK,iBAAA,IAAqB,IAAA,CAAK,iBAAA,GAAoB,CAAA,EAAG;AACxD,QAAA,KAAA,GAAQ,KAAK,GAAA,CAAI,KAAA,GAAQ,IAAA,CAAK,iBAAA,EAAmB,KAAK,aAAc,CAAA;AAAA,MACtE;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,SAAA;AACR;AAEA,eAAsB,WAAA,CACpB,OAAA,EACA,SAAA,EACA,OAAA,EACY;AACZ,EAAA,IAAI,SAAA;AAEJ,EAAA,MAAM,cAAA,GAAiB,IAAI,OAAA,CAAe,CAAC,GAAG,MAAA,KAAW;AACvD,IAAA,SAAA,GAAY,WAAW,MAAM;AAC3B,MAAA,MAAA,CAAO,IAAI,YAAA,CAAa,OAAA,IAAW,6BAA6B,SAAS,CAAA,EAAA,CAAA,EAAM,SAAS,CAAC,CAAA;AAAA,IAC3F,GAAG,SAAS,CAAA;AAAA,EACd,CAAC,CAAA;AAED,EAAA,IAAI;AACF,IAAA,MAAM,SAAS,MAAM,OAAA,CAAQ,KAAK,CAAC,OAAA,EAAS,cAAc,CAAC,CAAA;AAC3D,IAAA,YAAA,CAAa,SAAS,CAAA;AACtB,IAAA,OAAO,MAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,YAAA,CAAa,SAAS,CAAA;AACtB,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAEA,SAAS,MAAM,EAAA,EAA2B;AACxC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAACC,aAAY,UAAA,CAAWA,QAAAA,EAAS,EAAE,CAAC,CAAA;AACzD;;;ACvEO,SAAS,yBAAyB,MAAA,EAAgC;AACvE,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,gBAAgB,sCAAsC,CAAA;AAAA,EAClE;AAEA,EAAA,IAAI,CAAC,OAAO,gBAAA,EAAkB;AAC5B,IAAA,IAAI,CAAC,OAAO,IAAA,EAAM;AAChB,MAAA,MAAM,IAAI,eAAA,CAAgB,wDAAA,EAA0D,MAAM,CAAA;AAAA,IAC5F;AAEA,IAAA,IAAI,CAAC,OAAO,QAAA,EAAU;AACpB,MAAA,MAAM,IAAI,eAAA;AAAA,QACR,iEAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IACE,MAAA,CAAO,IAAA,KAAS,MAAA,KACf,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,IAAY,MAAA,CAAO,IAAA,GAAO,CAAA,IAAK,MAAA,CAAO,IAAA,GAAO,KAAA,CAAA,EACrE;AACA,IAAA,MAAM,IAAI,eAAA,CAAgB,2CAAA,EAA6C,MAAM,CAAA;AAAA,EAC/E;AAEA,EAAA,IAAI,MAAA,CAAO,aAAa,OAAO,MAAA,CAAO,aAAa,QAAA,IAAY,MAAA,CAAO,WAAW,CAAA,CAAA,EAAI;AACnF,IAAA,MAAM,IAAI,eAAA,CAAgB,qCAAA,EAAuC,UAAU,CAAA;AAAA,EAC7E;AAEA,EAAA,IACE,MAAA,CAAO,sBACN,OAAO,MAAA,CAAO,sBAAsB,QAAA,IAAY,MAAA,CAAO,oBAAoB,CAAA,CAAA,EAC5E;AACA,IAAA,MAAM,IAAI,eAAA;AAAA,MACR,kDAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,CAAO,gBAAgB,OAAO,MAAA,CAAO,gBAAgB,QAAA,IAAY,MAAA,CAAO,cAAc,CAAA,CAAA,EAAI;AAC5F,IAAA,MAAM,IAAI,eAAA,CAAgB,4CAAA,EAA8C,aAAa,CAAA;AAAA,EACvF;AACF;AAEO,SAAS,YAAYF,IAAAA,EAAmB;AAC7C,EAAA,IAAI,CAACA,IAAAA,IAAO,OAAOA,IAAAA,KAAQ,QAAA,EAAU;AACnC,IAAA,MAAM,IAAI,gBAAgB,sCAAsC,CAAA;AAAA,EAClE;AAEA,EAAA,IAAIA,IAAAA,CAAI,IAAA,EAAK,CAAE,MAAA,KAAW,CAAA,EAAG;AAC3B,IAAA,MAAM,IAAI,gBAAgB,2BAA2B,CAAA;AAAA,EACvD;AACF;AAEO,SAAS,kBAAkB,SAAA,EAAyB;AACzD,EAAA,IAAI,CAAC,SAAA,IAAa,OAAO,SAAA,KAAc,QAAA,EAAU;AAC/C,IAAA,MAAM,IAAI,gBAAgB,uCAAuC,CAAA;AAAA,EACnE;AAEA,EAAA,MAAM,mBAAA,GAAsB,gBAAA;AAC5B,EAAA,IAAI,CAAC,mBAAA,CAAoB,IAAA,CAAK,SAAS,CAAA,EAAG;AACxC,IAAA,MAAM,IAAI,eAAA;AAAA,MACR,sGAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;AAEO,SAAS,mBAAmB,UAAA,EAA0B;AAC3D,EAAA,IAAI,CAAC,UAAA,IAAc,OAAO,UAAA,KAAe,QAAA,EAAU;AACjD,IAAA,MAAM,IAAI,gBAAgB,wCAAwC,CAAA;AAAA,EACpE;AAEA,EAAA,MAAM,oBAAA,GAAuB,gBAAA;AAC7B,EAAA,IAAI,CAAC,oBAAA,CAAqB,IAAA,CAAK,UAAU,CAAA,EAAG;AAC1C,IAAA,MAAM,IAAI,eAAA;AAAA,MACR,uGAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;AClFO,SAAS,gBAAA,CAAiBA,IAAAA,EAAa,MAAA,EAAoB,MAAA,GAAS,WAAA,EAAqB;AAC9F,EAAA,MAAM,IAAA,GAAO,WAAW,QAAQ,CAAA;AAChC,EAAA,IAAA,CAAK,OAAOA,IAAG,CAAA;AAEf,EAAA,IAAI,MAAA,IAAU,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAC/B,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AAAA,EACpC;AAEA,EAAA,OAAO,GAAG,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AACxC;AAEO,SAAS,cAAc,GAAA,EAAsD;AAClF,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA;AAE3B,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,MAAM,CAAC,CAAA;AAAA,IACf,IAAA,EAAM,MAAM,CAAC;AAAA,GACf;AACF;AAEO,SAAS,qBAAA,CAAsB,MAAA,GAAS,WAAA,EAAa,OAAA,GAAU,GAAA,EAAa;AACjF,EAAA,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA;AAC7B;AAEO,SAAS,iBAAiB,GAAA,EAAqB;AACpD,EAAA,OAAO,GAAA,CAAI,UAAA,CAAW,UAAA,EAAY,GAAG,CAAA;AACvC;;;AChCO,SAAS,YAAA,GAAuB;AACrC,EAAA,OAAO,sCAAA,CAAuC,UAAA,CAAW,OAAA,EAAS,CAAC,CAAA,KAAM;AACvE,IAAA,MAAM,CAAA,GAAK,IAAA,CAAK,MAAA,EAAO,GAAI,EAAA,GAAM,CAAA;AACjC,IAAA,MAAM,CAAA,GAAI,CAAA,KAAM,GAAA,GAAM,CAAA,GAAK,IAAI,CAAA,GAAO,CAAA;AACtC,IAAA,OAAO,CAAA,CAAE,SAAS,EAAE,CAAA;AAAA,EACtB,CAAC,CAAA;AACH;ACeA,IAAM,eAAA,GAAgD;AAAA,EACpD,WAAW,cAAA,CAAe,qBAAA;AAAA,EAC1B,OAAOG,SAAA,CAAc;AACvB,CAAA;AAKO,SAAS,QAAA,CAAS,IAAA,EAAc,OAAA,GAA8B,EAAC,EAAW;AAC/E,EAAA,MAAM,IAAA,GAAO,EAAE,GAAG,eAAA,EAAiB,GAAG,OAAA,EAAQ;AAG9C,EAAA,IAAI,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,SAAA,EAAW;AAChC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,IAAA,EAAM,MAAM,CAAA;AACvC,IAAA,MAAM,aAAa,QAAA,CAAS,MAAA,EAAQ,EAAE,KAAA,EAAO,IAAA,CAAK,OAAO,CAAA;AACzD,IAAA,OAAO,UAAA,CAAW,SAAS,QAAQ,CAAA;AAAA,EACrC,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAKO,SAAS,WAAW,IAAA,EAAsB;AAC/C,EAAA,IAAI,CAAC,YAAA,CAAa,IAAI,CAAA,EAAG;AACvB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,IAAA,EAAM,QAAQ,CAAA;AACzC,IAAA,MAAM,YAAA,GAAe,WAAW,MAAM,CAAA;AACtC,IAAA,OAAO,YAAA,CAAa,SAAS,MAAM,CAAA;AAAA,EACrC,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAKO,SAAS,aAAa,IAAA,EAAuB;AAClD,EAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI;AAEF,IAAA,MAAM,MAAA,GAAS,OAAO,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA,EAAG,CAAC,GAAG,QAAQ,CAAA;AACrD,IAAA,OAAO,OAAO,CAAC,CAAA,KAAM,EAAA,IAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,GAAA;AAAA,EAC7C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAKO,SAAS,mBAAA,CAAoB,UAAkB,UAAA,EAA4B;AAChF,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,OAAO,QAAA,CAAS,SAAS,UAAA,CAAW,MAAA;AACtC;AAKO,SAAS,cAAA,CACd,IAAA,EACA,SAAA,GAAY,cAAA,CAAe,qBAAA,EAClB;AAET,EAAA,IAAI,IAAA,CAAK,SAAS,SAAA,EAAW;AAC3B,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,IAAI,CAAA,CAAE,IAAA;AAClC,EAAA,MAAM,eAAA,GAAkB,KAAK,MAAA,GAAS,WAAA;AAGtC,EAAA,OAAO,eAAA,GAAkB,CAAA;AAC3B;AC3EO,IAAe,WAAA,GAAf,cAAmC,YAAA,CAAwC;AAAA,EACtE,MAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA,GAAe,KAAA;AAAA,EACf,YAAA,GAAe;AAAA,IACvB,UAAA,EAAY,CAAA;AAAA,IACZ,UAAA,EAAY;AAAA,GACd;AAAA,EAKA,IAAI,WAAA,GAAuB;AACzB,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA,EAEA,WAAA,CAAY,OAAA,GAA8B,EAAC,EAAG;AAC5C,IAAA,KAAA,EAAM;AACN,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AAAA,IACxB;AACA,IAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,MAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,KAAA;AAAA,IACvB;AACA,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AAAA,IACxB;AACA,IAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,MAAA,IAAA,CAAK,eAAe,EAAE,GAAG,KAAK,YAAA,EAAc,GAAG,QAAQ,YAAA,EAAa;AAAA,IACtE;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,MAAA,EAAyC;AACrD,IAAA,wBAAA,CAAyB,MAAM,CAAA;AAC/B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAEd,IAAA,IAAI;AACF,MAAA,MAAM,KAAA;AAAA,QACJ,YAAY;AACV,UAAA,MAAM,IAAA,CAAK,UAAU,MAAM,CAAA;AAC3B,UAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,UAAA,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,EAAE,MAAA,EAAQ,CAAA;AAAA,QACjC,CAAA;AAAA,QACA;AAAA,UACE,UAAA,EAAY,KAAK,YAAA,CAAa,UAAA;AAAA,UAC9B,UAAA,EAAY,KAAK,YAAA,CAAa;AAAA;AAChC,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,eAAA,CAAgB,+BAAA,EAAiC,KAAc,CAAA;AAAA,IAC3E;AAAA,EACF;AAAA,EAEA,MAAM,UAAA,GAA4B;AAChC,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,KAAK,YAAA,EAAa;AACxB,MAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AACpB,MAAA,IAAA,CAAK,KAAK,YAAY,CAAA;AAAA,IACxB,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,eAAA,CAAgB,oCAAA,EAAsC,KAAc,CAAA;AAAA,IAChF;AAAA,EACF;AAAA,EAEA,MAAM,KAAA,CACJH,IAAAA,EACA,MAAA,EACA,OAAA,GAAwB,EAAC,EACA;AACzB,IAAA,WAAA,CAAYA,IAAG,CAAA;AAEf,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,MAAM,IAAI,gBAAgB,2BAA2B,CAAA;AAAA,IACvD;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,IAAI;AACF,MAAA,IAAI,MAAA;AAEJ,MAAA,IAAI,OAAA,CAAQ,KAAA,IAAS,IAAA,CAAK,KAAA,EAAO;AAC/B,QAAA,MAAMI,YAAW,IAAA,CAAK,WAAA,CAAYJ,IAAAA,EAAK,MAAA,EAAQ,QAAQ,KAAK,CAAA;AAC5D,QAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,KAAA,CAAM,IAAoBI,SAAQ,CAAA;AAElE,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,IAAA,CAAK,QAAQ,KAAA,CAAM,WAAA,EAAa,EAAE,GAAA,EAAKA,WAAU,CAAA;AACjD,UAAA,IAAA,CAAK,KAAK,UAAA,EAAY,EAAE,KAAKA,SAAAA,EAAU,GAAA,EAAAJ,MAAK,CAAA;AAC5C,UAAA,OAAO,YAAA;AAAA,QACT;AAEA,QAAA,IAAA,CAAK,QAAQ,KAAA,CAAM,YAAA,EAAc,EAAE,GAAA,EAAKI,WAAU,CAAA;AAClD,QAAA,IAAA,CAAK,KAAK,WAAA,EAAa,EAAE,KAAKA,SAAAA,EAAU,GAAA,EAAAJ,MAAK,CAAA;AAAA,MAC/C;AAEA,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,OAAA,CAAWA,IAAAA,EAAK,QAAQ,OAAO,CAAA;AAEzD,MAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,QAAA,MAAA,GAAS,MAAM,WAAA;AAAA,UACb,YAAA;AAAA,UACA,OAAA,CAAQ,OAAA;AAAA,UACR,CAAA,sBAAA,EAAyB,QAAQ,OAAO,CAAA,EAAA;AAAA,SAC1C;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAA,GAAS,MAAM,YAAA;AAAA,MACjB;AAEA,MAAA,MAAA,CAAO,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAE/B,MAAA,IAAI,OAAA,CAAQ,KAAA,IAAS,IAAA,CAAK,KAAA,EAAO;AAC/B,QAAA,MAAMI,YAAW,IAAA,CAAK,WAAA,CAAYJ,IAAAA,EAAK,MAAA,EAAQ,QAAQ,KAAK,CAAA;AAC5D,QAAA,MAAM,MAAM,OAAO,OAAA,CAAQ,UAAU,QAAA,GAAW,OAAA,CAAQ,MAAM,GAAA,GAAM,KAAA,CAAA;AACpE,QAAA,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAII,SAAAA,EAAU,QAAQ,GAAG,CAAA;AAC1C,QAAA,IAAA,CAAK,QAAQ,KAAA,CAAM,qBAAA,EAAuB,EAAE,GAAA,EAAKA,SAAAA,EAAU,KAAK,CAAA;AAAA,MAClE;AAEA,MAAA,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,EAAE,GAAA,EAAAJ,IAAAA,EAAK,MAAA,EAAQ,QAAA,EAAU,MAAA,CAAO,QAAA,EAAU,QAAA,EAAU,MAAA,CAAO,QAAA,EAAU,CAAA;AACxF,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC9B,MAAA,IAAA,CAAK,IAAA,CAAK,cAAc,EAAE,GAAA,EAAAA,MAAK,MAAA,EAAQ,KAAA,EAAO,UAAU,CAAA;AACxD,MAAA,MAAM,IAAI,UAAA;AAAA,QACR,CAAA,cAAA,EAAkB,MAAgB,OAAO,CAAA,CAAA;AAAA,QACzCA,IAAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,OAAA,CACJA,IAAAA,EACA,MAAA,EACA,OAAA,EACyB;AACzB,IAAA,OAAO,IAAA,CAAK,MAASA,IAAAA,EAAK,MAAA,EAAQ,EAAE,GAAG,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,CAAA;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YAAA,CACJA,IAAAA,EACA,SAAA,EACA,OAAA,EAC2B;AAC3B,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,MAAM,IAAI,gBAAgB,2BAA2B,CAAA;AAAA,IACvD;AAEA,IAAA,MAAM,UAA4B,EAAC;AACnC,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,IAAI;AACF,MAAA,KAAA,MAAW,UAAU,SAAA,EAAW;AAC9B,QAAA,MAAM,SAAS,MAAM,IAAA,CAAK,OAAA,CAAWA,IAAAA,EAAK,QAAQ,OAAO,CAAA;AACzD,QAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,MACrB;AAEA,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC9B,MAAA,IAAA,CAAK,IAAA,CAAK,gBAAgB,EAAE,GAAA,EAAAA,MAAK,SAAA,EAAW,SAAA,CAAU,MAAA,EAAQ,QAAA,EAAU,CAAA;AAExE,MAAA,OAAO,OAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC9B,MAAA,IAAA,CAAK,KAAK,YAAA,EAAc,EAAE,KAAAA,IAAAA,EAAK,KAAA,EAAO,UAAU,CAAA;AAChD,MAAA,MAAM,IAAI,UAAA;AAAA,QACR,CAAA,wBAAA,EAA4B,MAAgB,OAAO,CAAA,CAAA;AAAA,QACnDA,IAAAA;AAAA,QACA,EAAC;AAAA,QACD;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,OAAA,CAAqB,IAAA,EAAc,KAAA,EAA+C;AACtF,IAAA,MAAM,IAAI,oBAAoB,SAAS,CAAA;AAAA,EACzC;AAAA,EAEA,MAAM,iBAAiB,QAAA,EAAqD;AAC1E,IAAA,MAAM,IAAI,oBAAoB,kBAAkB,CAAA;AAAA,EAClD;AAAA,EAEA,YAAA,GAA0B;AACxB,IAAA,MAAM,IAAI,oBAAoB,cAAc,CAAA;AAAA,EAC9C;AAAA,EAEA,MAAM,IAAA,GAAyB;AAC7B,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,MAAM,UAAU,CAAA;AAC3B,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,OAAO,MAAA,EAAyB;AAC9B,IAAA,MAAM,IAAI,oBAAoB,QAAQ,CAAA;AAAA,EACxC;AAAA,EAEA,iBAAiB,WAAA,EAA6B;AAC5C,IAAA,MAAM,IAAI,oBAAoB,kBAAkB,CAAA;AAAA,EAClD;AAAA,EAYQ,WAAA,CACNA,IAAAA,EACA,MAAA,EACA,YAAA,EACQ;AACR,IAAA,IAAI,OAAO,YAAA,KAAiB,QAAA,IAAY,YAAA,CAAa,GAAA,EAAK;AACxD,MAAA,OAAO,YAAA,CAAa,GAAA;AAAA,IACtB;AAEA,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,GAAI,SAAS,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA,GAAI,MAAA;AACtF,IAAA,OAAO,gBAAA,CAAiBA,MAAK,WAAW,CAAA;AAAA,EAC1C;AACF;;;ACrPO,SAAS,SAAA,CACd,GAAA,EACA,MAAA,EACA,QAAA,EACA,IAAA,EACM;AACN,EAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,EAAA,MAAM,SAAA,GAAY,IAAA,YAAgB,IAAA,GAAO,IAAA,CAAK,WAAA,GAAc,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,GAAI,IAAA;AAC5E,EAAA,MAAM,cAAc,GAAA,CAAI,sBAAA,CAAuB,GAAA,CAAI,QAAA,CAAS,SAAS,CAAC,CAAA;AAEtE,EAAA,GAAA,CAAI,aAAa,IAAA,CAAK;AAAA,IACpB,IAAA,EAAM,KAAA;AAAA,IACN,SAAA,EAAW,QAAQ,GAAA,CAAI,kBAAA,CAAmB,MAAM,CAAC,CAAA,EAAA,EAAK,QAAQ,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA;AAAA,IAC7E,QAAA,EAAU,CAAC,SAAS;AAAA,GACrB,CAAA;AACD,EAAA,GAAA,CAAI,QAAA,CAAS,KAAK,SAAS,CAAA;AAC7B;AAKO,SAAS,SAAA,CACd,GAAA,EACA,MAAA,EACA,QAAA,EACA,IAAA,EACM;AACN,EAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,EAAA,MAAM,cAAc,GAAA,CAAI,sBAAA,CAAuB,GAAA,CAAI,QAAA,CAAS,SAAS,CAAC,CAAA;AAEtE,EAAA,GAAA,CAAI,aAAa,IAAA,CAAK;AAAA,IACpB,IAAA,EAAM,KAAA;AAAA,IACN,SAAA,EAAW,QAAQ,GAAA,CAAI,kBAAA,CAAmB,MAAM,CAAC,CAAA,EAAA,EAAK,QAAQ,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA;AAAA,IAC7E,QAAA,EAAU,CAAC,IAAI;AAAA,GAChB,CAAA;AACD,EAAA,GAAA,CAAI,QAAA,CAAS,KAAK,IAAI,CAAA;AACxB;AAKO,SAAS,UAAA,CACd,GAAA,EACA,MAAA,EACA,QAAA,EACA,KAAA,EACM;AACN,EAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,EAAA,MAAM,cAAc,GAAA,CAAI,sBAAA,CAAuB,GAAA,CAAI,QAAA,CAAS,SAAS,CAAC,CAAA;AAEtE,EAAA,GAAA,CAAI,aAAa,IAAA,CAAK;AAAA,IACpB,IAAA,EAAM,KAAA;AAAA,IACN,SAAA,EAAW,SAAS,GAAA,CAAI,kBAAA,CAAmB,MAAM,CAAC,CAAA,EAAA,EAAK,QAAQ,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA;AAAA,IAC9E,QAAA,EAAU,CAAC,KAAK;AAAA,GACjB,CAAA;AACD,EAAA,GAAA,CAAI,QAAA,CAAS,KAAK,KAAK,CAAA;AACzB;AAKO,SAAS,QAAA,CACd,GAAA,EACA,MAAA,EACA,QAAA,EACA,GAAA,EACM;AACN,EAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,EAAA,MAAM,cAAc,GAAA,CAAI,sBAAA,CAAuB,GAAA,CAAI,QAAA,CAAS,SAAS,CAAC,CAAA;AAEtE,EAAA,GAAA,CAAI,aAAa,IAAA,CAAK;AAAA,IACpB,IAAA,EAAM,KAAA;AAAA,IACN,SAAA,EAAW,OAAO,GAAA,CAAI,kBAAA,CAAmB,MAAM,CAAC,CAAA,EAAA,EAAK,QAAQ,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA;AAAA,IAC5E,QAAA,EAAU,CAAC,GAAG;AAAA,GACf,CAAA;AACD,EAAA,GAAA,CAAI,QAAA,CAAS,KAAK,GAAG,CAAA;AACvB;AAKO,SAAS,UAAA,CAAW,KAAwB,MAAA,EAAsB;AACvE,EAAA,MAAM,KAAA,GAAA,qBAAY,IAAA,EAAK,EAAE,aAAY,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA;AACnD,EAAA,SAAA,CAAU,GAAA,EAAK,MAAA,EAAQ,GAAA,EAAK,KAAK,CAAA;AACnC;AAKO,SAAS,cAAA,CAAe,KAAwB,MAAA,EAAsB;AAC3E,EAAA,MAAM,SAAA,uBAAgB,IAAA,EAAK;AAC3B,EAAA,SAAA,CAAU,OAAA,CAAQ,SAAA,CAAU,OAAA,EAAQ,GAAI,CAAC,CAAA;AACzC,EAAA,SAAA,CAAU,GAAA,EAAK,MAAA,EAAQ,GAAA,EAAK,SAAA,CAAU,WAAA,GAAc,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAE,CAAA;AACpE;AAKO,SAAS,iBAAA,CACd,GAAA,EACA,MAAA,EACA,SAAA,EACA,OAAA,EACM;AACN,EAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,EAAA,MAAM,KAAA,GAAQ,SAAA,YAAqB,IAAA,GAAO,SAAA,CAAU,WAAA,GAAc,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,GAAI,SAAA;AAClF,EAAA,MAAM,GAAA,GAAM,OAAA,YAAmB,IAAA,GAAO,OAAA,CAAQ,WAAA,GAAc,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,GAAI,OAAA;AAE5E,EAAA,MAAM,mBAAmB,GAAA,CAAI,sBAAA,CAAuB,GAAA,CAAI,QAAA,CAAS,SAAS,CAAC,CAAA;AAC3E,EAAA,MAAM,iBAAiB,GAAA,CAAI,sBAAA,CAAuB,GAAA,CAAI,QAAA,CAAS,SAAS,CAAC,CAAA;AAEzE,EAAA,GAAA,CAAI,aAAa,IAAA,CAAK;AAAA,IACpB,IAAA,EAAM,KAAA;AAAA,IACN,SAAA,EAAW,QAAQ,GAAA,CAAI,kBAAA,CAAmB,MAAM,CAAC,CAAA,UAAA,EAAa,gBAAgB,CAAA,KAAA,EAAQ,cAAc,CAAA,CAAA;AAAA,IACpG,QAAA,EAAU,CAAC,KAAA,EAAO,GAAG;AAAA,GACtB,CAAA;AACD,EAAA,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,KAAA,EAAO,GAAG,CAAA;AAC9B;AAKO,SAAS,aAAA,CAAc,GAAA,EAAwB,MAAA,EAAgB,IAAA,EAAoB;AACxF,EAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,EAAA,MAAM,cAAc,GAAA,CAAI,sBAAA,CAAuB,GAAA,CAAI,QAAA,CAAS,SAAS,CAAC,CAAA;AAEtE,EAAA,GAAA,CAAI,aAAa,IAAA,CAAK;AAAA,IACpB,IAAA,EAAM,KAAA;AAAA,IACN,WAAW,CAAA,EAAG,GAAA,CAAI,mBAAmB,MAAM,CAAC,oCAAoC,WAAW,CAAA,KAAA,CAAA;AAAA,IAC3F,QAAA,EAAU,CAAC,IAAI;AAAA,GAChB,CAAA;AACD,EAAA,GAAA,CAAI,QAAA,CAAS,KAAK,IAAI,CAAA;AACxB;;;ACzGO,IAAe,mBAAf,MAAwE;AAAA,EACnE,OAAA;AAAA,EACA,kBAAA;AAAA,EACA,sBAAA;AAAA,EACA,MAAA;AAAA,EACA,eAAA,uBAAmC,GAAA,EAAI;AAAA,EACvC,eAAA,uBAAmC,GAAA,EAAI;AAAA;AAAA,EAGvC,aAAA,GAA0B,CAAC,GAAG,CAAA;AAAA,EAC9B,SAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAsB,EAAC;AAAA,EACvB,eAA8B,EAAC;AAAA,EAC/B,iBAA2B,EAAC;AAAA,EAC5B,YAAA;AAAA,EACA,iBAAuE,EAAC;AAAA,EACxE,UAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAsB,EAAC;AAAA,EACvB,UAAA,GAAa,KAAA;AAAA;AAAA,EAGb,WAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA;AAAA,EAGA,MAAA;AAAA,EACA,WAAA;AAAA,EAEV,YAAY,OAAA,EAA8B;AACxC,IAAA,IAAA,CAAK,UAAU,OAAA,CAAQ,OAAA;AACvB,IAAA,IAAA,CAAK,qBAAqB,OAAA,CAAQ,gBAAA,KAAqB,CAAC,EAAA,KAAO,IAAI,EAAE,CAAA,CAAA,CAAA,CAAA;AACrE,IAAA,IAAA,CAAK,yBAAyB,OAAA,CAAQ,oBAAA,KAAyB,CAAC,KAAA,KAAU,IAAI,KAAK,CAAA,CAAA,CAAA;AACnF,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AAAA,EACxB;AAAA,EAQA,UAAU,IAAA,EAAiD;AACzD,IAAA,IAAI,OAAiB,EAAC;AAEtB,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,IAAK,KAAA,CAAM,QAAQ,IAAA,CAAK,CAAC,CAAC,CAAA,EAAG;AAC/C,MAAA,IAAA,GAAO,KAAK,CAAC,CAAA;AAAA,IACf,CAAA,MAAO;AACL,MAAA,IAAA,GAAO,KAAK,MAAA,CAAO,CAAC,GAAA,KAAQ,OAAO,QAAQ,QAAQ,CAAA;AAAA,IACrD;AAEA,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,IAAA,CAAK,aAAA,GAAgB,CAAC,GAAG,CAAA;AAAA,IAC3B,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,aAAA,GAAgB,IAAA,CAClB,MAAA,CAAO,CAAC,GAAA,KAAQ,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAQ,CAAA,CAC9C,GAAA,CAAI,CAAC,GAAA,KAAQ;AACZ,QAAA,IAAI,GAAA,KAAQ,GAAA,IAAO,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,IAAK,GAAA,CAAI,QAAA,CAAS,MAAM,CAAA,IAAK,GAAA,CAAI,QAAA,CAAS,MAAM,CAAA,EAAG;AACpF,UAAA,OAAO,GAAA;AAAA,QACT;AACA,QAAA,kBAAA,CAAmB,GAAG,CAAA;AACtB,QAAA,OAAO,GAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACL;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,IAAA,CAAK,OAAe,KAAA,EAAiC;AACnD,IAAA,iBAAA,CAAkB,KAAK,CAAA;AACvB,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AAAA,IACnB;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,KAAA,CAAM,OAAe,KAAA,EAAiC;AACpD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,KAAK,CAAA;AAAA,EAC/B;AAAA,EAEA,QAAA,GAA4B;AAC1B,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMA,IAAA,CACE,KAAA,EACA,EAAA,EACA,IAAA,GAA4C,OAAA,EAC3B;AACjB,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AACpC,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,iBAAA,CAAkB,SAAS,CAAA;AAAA,IAC7B;AACA,IAAA,IAAA,CAAK,MAAM,IAAA,CAAK,EAAE,IAAA,EAAM,KAAA,EAAO,IAAI,CAAA;AACnC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,SAAA,CAAU,OAAe,EAAA,EAA6B;AACpD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,EAAA,EAAI,OAAO,CAAA;AAAA,EACrC;AAAA,EAEA,QAAA,CAAS,OAAe,EAAA,EAA6B;AACnD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,EAAA,EAAI,MAAM,CAAA;AAAA,EACpC;AAAA,EAEA,SAAA,CAAU,OAAe,EAAA,EAA6B;AACpD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,EAAA,EAAI,OAAO,CAAA;AAAA,EACrC;AAAA,EAEA,QAAA,CAAS,OAAe,EAAA,EAA6B;AACnD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,EAAA,EAAI,MAAM,CAAA;AAAA,EACpC;AAAA,EAYA,SAAS,IAAA,EAA4E;AACnF,IAAA,QAAQ,KAAK,MAAA;AAAQ,MACnB,KAAK,CAAA,EAAG;AACN,QAAA,MAAM,CAAC,MAAA,EAAQ,QAAA,EAAU,KAAK,CAAA,GAAI,IAAA;AAClC,QAAA,IAAA,CAAK,cAAA,CAAe,KAAA,EAAO,MAAA,EAAkB,QAAA,EAAoB,KAAK,CAAA;AAEtE,QAAA;AAAA,MACF;AAAA,MACA,KAAK,CAAA,EAAG;AACN,QAAA,MAAM,CAAC,SAAA,EAAW,QAAA,GAAW,GAAG,CAAA,GAAI,IAAA;AACpC,QAAA,IAAA,CAAK,cAAA;AAAA,UACH,KAAA;AAAA,UACA,SAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,CAAA,EAAG;AACN,QAAA,MAAM,CAAC,SAAS,CAAA,GAAI,IAAA;AACpB,QAAA,IAAA,CAAK,cAAA,CAAe,KAAA,EAAO,SAAA,EAA+C,GAAG,CAAA;AAE7E,QAAA;AAAA,MACF;AAAA;AAGF,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAQA,WAAW,IAAA,EAA4E;AACrF,IAAA,QAAQ,KAAK,MAAA;AAAQ,MACnB,KAAK,CAAA,EAAG;AACN,QAAA,MAAM,CAAC,MAAA,EAAQ,QAAA,EAAU,KAAK,CAAA,GAAI,IAAA;AAClC,QAAA,IAAA,CAAK,cAAA,CAAe,IAAA,EAAM,MAAA,EAAkB,QAAA,EAAoB,KAAK,CAAA;AAErE,QAAA;AAAA,MACF;AAAA,MACA,KAAK,CAAA,EAAG;AACN,QAAA,MAAM,CAAC,SAAA,EAAW,QAAA,GAAW,GAAG,CAAA,GAAI,IAAA;AACpC,QAAA,IAAA,CAAK,cAAA;AAAA,UACH,IAAA;AAAA,UACA,SAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,CAAA,EAAG;AACN,QAAA,MAAM,CAAC,SAAS,CAAA,GAAI,IAAA;AACpB,QAAA,IAAA,CAAK,cAAA,CAAe,IAAA,EAAM,SAAA,EAA+C,GAAG,CAAA;AAE5E,QAAA;AAAA,MACF;AAAA;AAGF,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAA,CAAQ,QAAgB,MAAA,EAAoC;AAC1D,IAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,MAAM,IAAI,gBAAgB,qCAAqC,CAAA;AAAA,IACjE;AAEA,IAAA,MAAM,eAAe,MAAA,CAClB,GAAA,CAAI,CAAC,CAAA,EAAG,UAAU,IAAA,CAAK,sBAAA,CAAuB,IAAA,CAAK,QAAA,CAAS,SAAS,KAAA,GAAQ,CAAC,CAAC,CAAA,CAC/E,KAAK,IAAI,CAAA;AAEZ,IAAA,IAAA,CAAK,aAAa,IAAA,CAAK;AAAA,MACrB,IAAA,EAAM,KAAA;AAAA,MACN,WAAW,CAAA,EAAG,IAAA,CAAK,mBAAmB,MAAM,CAAC,QAAQ,YAAY,CAAA,CAAA,CAAA;AAAA,MACjE,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,GAAG,MAAM,CAAA;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,UAAA,CAAW,QAAgB,MAAA,EAAoC;AAC7D,IAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,MAAM,IAAI,gBAAgB,wCAAwC,CAAA;AAAA,IACpE;AAEA,IAAA,MAAM,eAAe,MAAA,CAClB,GAAA,CAAI,CAAC,CAAA,EAAG,UAAU,IAAA,CAAK,sBAAA,CAAuB,IAAA,CAAK,QAAA,CAAS,SAAS,KAAA,GAAQ,CAAC,CAAC,CAAA,CAC/E,KAAK,IAAI,CAAA;AAEZ,IAAA,IAAA,CAAK,aAAa,IAAA,CAAK;AAAA,MACrB,IAAA,EAAM,KAAA;AAAA,MACN,WAAW,CAAA,EAAG,IAAA,CAAK,mBAAmB,MAAM,CAAC,YAAY,YAAY,CAAA,CAAA,CAAA;AAAA,MACrE,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,GAAG,MAAM,CAAA;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,YAAA,CAAa,MAAA,EAAgBK,IAAAA,EAAcJ,IAAAA,EAA+B;AACxE,IAAA,kBAAA,CAAmB,MAAM,CAAA;AAEzB,IAAA,MAAM,iBAAiB,IAAA,CAAK,sBAAA,CAAuB,IAAA,CAAK,QAAA,CAAS,SAAS,CAAC,CAAA;AAC3E,IAAA,MAAM,iBAAiB,IAAA,CAAK,sBAAA,CAAuB,IAAA,CAAK,QAAA,CAAS,SAAS,CAAC,CAAA;AAE3E,IAAA,IAAA,CAAK,aAAa,IAAA,CAAK;AAAA,MACrB,IAAA,EAAM,KAAA;AAAA,MACN,SAAA,EAAW,GAAG,IAAA,CAAK,kBAAA,CAAmB,MAAM,CAAC,CAAA,SAAA,EAAY,cAAc,CAAA,KAAA,EAAQ,cAAc,CAAA,CAAA;AAAA,MAC7F,QAAA,EAAU,CAACI,IAAAA,EAAKJ,IAAG;AAAA,KACpB,CAAA;AACD,IAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAKI,IAAAA,EAAKJ,IAAG,CAAA;AAC3B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,UAAU,MAAA,EAAiC;AACzC,IAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,IAAA,IAAA,CAAK,aAAa,IAAA,CAAK;AAAA,MACrB,IAAA,EAAM,KAAA;AAAA,MACN,SAAA,EAAW,CAAA,EAAG,IAAA,CAAK,kBAAA,CAAmB,MAAM,CAAC,CAAA,QAAA,CAAA;AAAA,MAC7C,UAAU;AAAC,KACZ,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,aAAa,MAAA,EAAiC;AAC5C,IAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,IAAA,IAAA,CAAK,aAAa,IAAA,CAAK;AAAA,MACrB,IAAA,EAAM,KAAA;AAAA,MACN,SAAA,EAAW,CAAA,EAAG,IAAA,CAAK,kBAAA,CAAmB,MAAM,CAAC,CAAA,YAAA,CAAA;AAAA,MAC7C,UAAU;AAAC,KACZ,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMA,SAAA,CAAU,MAAA,EAAgB,QAAA,EAAkB,IAAA,EAAsC;AAChF,IAAgB,UAAU,IAAA,CAAK,oBAAA,EAAqB,EAAG,MAAA,EAAQ,UAAU,IAAI,CAAA;AAC7E,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,SAAA,CAAU,MAAA,EAAgB,QAAA,EAAkB,IAAA,EAA+B;AACzE,IAAgB,UAAU,IAAA,CAAK,oBAAA,EAAqB,EAAG,MAAA,EAAQ,UAAU,IAAI,CAAA;AAC7E,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,UAAA,CAAW,MAAA,EAAgB,QAAA,EAAkB,KAAA,EAAgC;AAC3E,IAAgB,WAAW,IAAA,CAAK,oBAAA,EAAqB,EAAG,MAAA,EAAQ,UAAU,KAAK,CAAA;AAC/E,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,QAAA,CAAS,MAAA,EAAgB,QAAA,EAAkB,GAAA,EAA8B;AACvE,IAAgB,SAAS,IAAA,CAAK,oBAAA,EAAqB,EAAG,MAAA,EAAQ,UAAU,GAAG,CAAA;AAC3E,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,WAAW,MAAA,EAAiC;AAC1C,IAAgB,UAAA,CAAW,IAAA,CAAK,oBAAA,EAAqB,EAAG,MAAM,CAAA;AAC9D,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,eAAe,MAAA,EAAiC;AAC9C,IAAgB,cAAA,CAAe,IAAA,CAAK,oBAAA,EAAqB,EAAG,MAAM,CAAA;AAClE,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,iBAAA,CACE,MAAA,EACA,SAAA,EACA,OAAA,EACiB;AACjB,IAAgB,kBAAkB,IAAA,CAAK,oBAAA,EAAqB,EAAG,MAAA,EAAQ,WAAW,OAAO,CAAA;AACzF,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,aAAA,CAAc,QAAgB,IAAA,EAA+B;AAC3D,IAAgB,aAAA,CAAc,IAAA,CAAK,oBAAA,EAAqB,EAAG,QAAQ,IAAI,CAAA;AACvE,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,oBAAA,GAA0D;AAChE,IAAA,OAAO;AAAA,MACL,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,cAAc,IAAA,CAAK,YAAA;AAAA,MACnB,oBAAoB,IAAA,CAAK,kBAAA;AAAA,MACzB,wBAAwB,IAAA,CAAK;AAAA,KAC/B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,OAAA,EAAoC;AAC7C,IAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,GAAA,KAAQ,kBAAA,CAAmB,GAAG,CAAC,CAAA;AAChD,IAAA,IAAA,CAAK,cAAA,GAAiB,OAAA;AACtB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAO,SAAA,EAAoC;AACzC,IAAA,IAAA,CAAK,YAAA,GAAe,SAAA;AACpB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAA,CAAQ,MAAA,EAAgB,SAAA,GAA4B,KAAA,EAAwB;AAC1E,IAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,IAAA,IAAA,CAAK,cAAA,CAAe,IAAA,CAAK,EAAE,MAAA,EAAQ,WAAW,CAAA;AAC9C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,KAAA,EAAgC;AACpC,IAAA,IAAI,QAAQ,CAAA,EAAG;AACb,MAAA,MAAM,IAAI,gBAAgB,4BAA4B,CAAA;AAAA,IACxD;AACA,IAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAO,MAAA,EAAiC;AACtC,IAAA,IAAI,SAAS,CAAA,EAAG;AACd,MAAA,MAAM,IAAI,gBAAgB,6BAA6B,CAAA;AAAA,IACzD;AACA,IAAA,IAAA,CAAK,WAAA,GAAc,MAAA;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KAAA,CAAM,MAAA,GAAS,GAAA,EAAK,OAAA,EAAyC;AACjE,IAAA,MAAM,iBAAiB,IAAA,CAAK,aAAA;AAC5B,IAAA,IAAA,CAAK,aAAA,GAAgB,CAAC,CAAA,MAAA,EAAS,MAAM,CAAA,UAAA,CAAY,CAAA;AAEjD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AACzC,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA;AACzB,MAAA,OAAO,GAAA,GAAM,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA,GAAI,CAAA;AAAA,IACnC,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,aAAA,GAAgB,cAAA;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,MAAM,GAAA,CAAI,MAAA,EAAgB,OAAA,EAAyC;AACjE,IAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,IAAA,MAAM,iBAAiB,IAAA,CAAK,aAAA;AAC5B,IAAA,IAAA,CAAK,gBAAgB,CAAC,CAAA,IAAA,EAAO,KAAK,kBAAA,CAAmB,MAAM,CAAC,CAAA,cAAA,CAAgB,CAAA;AAE5E,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AACzC,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA;AACzB,MAAA,OAAO,GAAA,EAAK,SAAA,GAAY,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA,GAAI,CAAA;AAAA,IAClD,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,aAAA,GAAgB,cAAA;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,MAAM,GAAA,CAAI,MAAA,EAAgB,OAAA,EAAyC;AACjE,IAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,IAAA,MAAM,iBAAiB,IAAA,CAAK,aAAA;AAC5B,IAAA,IAAA,CAAK,gBAAgB,CAAC,CAAA,IAAA,EAAO,KAAK,kBAAA,CAAmB,MAAM,CAAC,CAAA,cAAA,CAAgB,CAAA;AAE5E,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AACzC,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA;AACzB,MAAA,OAAO,GAAA,EAAK,SAAA,GAAY,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA,GAAI,CAAA;AAAA,IAClD,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,aAAA,GAAgB,cAAA;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,MAAM,GAAA,CAAI,MAAA,EAAgB,OAAA,EAAgD;AACxE,IAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,IAAA,MAAM,iBAAiB,IAAA,CAAK,aAAA;AAC5B,IAAA,IAAA,CAAK,gBAAgB,CAAC,CAAA,IAAA,EAAO,KAAK,kBAAA,CAAmB,MAAM,CAAC,CAAA,cAAA,CAAgB,CAAA;AAE5E,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AACzC,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA;AACzB,MAAA,IAAI,GAAA,EAAK,SAAA,KAAc,IAAA,IAAQ,GAAA,EAAK,cAAc,KAAA,CAAA,EAAW;AAC3D,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,OAAO,MAAA,CAAO,IAAI,SAAS,CAAA;AAAA,IAC7B,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,aAAA,GAAgB,cAAA;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,MAAM,GAAA,CAAI,MAAA,EAAgB,OAAA,EAAgD;AACxE,IAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,IAAA,MAAM,iBAAiB,IAAA,CAAK,aAAA;AAC5B,IAAA,IAAA,CAAK,gBAAgB,CAAC,CAAA,IAAA,EAAO,KAAK,kBAAA,CAAmB,MAAM,CAAC,CAAA,cAAA,CAAgB,CAAA;AAE5E,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AACzC,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA;AACzB,MAAA,IAAI,GAAA,EAAK,SAAA,KAAc,IAAA,IAAQ,GAAA,EAAK,cAAc,KAAA,CAAA,EAAW;AAC3D,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,OAAO,MAAA,CAAO,IAAI,SAAS,CAAA;AAAA,IAC7B,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,aAAA,GAAgB,cAAA;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,OAAA,EAA0C;AACrD,IAAA,MAAMK,MAAAA,GAAQ,MAAM,IAAA,CAAK,KAAA,CAAM,KAAK,OAAO,CAAA;AAC3C,IAAA,OAAOA,MAAAA,GAAQ,CAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAA,CACJ,IAAA,GAAe,CAAA,EACf,OAAA,GAAkB,IAClB,OAAA,EAC8B;AAC9B,IAAA,IAAI,OAAO,CAAA,EAAG;AACZ,MAAA,IAAA,GAAO,CAAA;AAAA,IACT;AACA,IAAA,IAAI,UAAU,CAAA,EAAG;AACf,MAAA,OAAA,GAAU,EAAA;AAAA,IACZ;AAGA,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,KAAA,CAAM,KAAK,OAAO,CAAA;AAG3C,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,KAAA,GAAQ,OAAO,CAAA;AAC5C,IAAA,MAAM,MAAA,GAAA,CAAU,OAAO,CAAA,IAAK,OAAA;AAG5B,IAAA,IAAA,CAAK,UAAA,GAAa,OAAA;AAClB,IAAA,IAAA,CAAK,WAAA,GAAc,MAAA;AACnB,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AAEzC,IAAA,MAAM,IAAA,GAAO,KAAA,GAAQ,CAAA,GAAI,MAAA,GAAS,CAAA,GAAI,CAAA;AACtC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,MAAA,GAAS,SAAS,KAAK,CAAA;AAE3C,IAAA,OAAO;AAAA,MACL,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,UAAA,EAAY;AAAA,QACV,IAAA;AAAA,QACA,OAAA;AAAA,QACA,KAAA;AAAA,QACA,UAAA;AAAA,QACA,SAAS,IAAA,GAAO,UAAA;AAAA,QAChB,IAAA;AAAA,QACA;AAAA;AACF,KACF;AAAA,EACF;AAAA,EAEA,MAAM,cAAA,CACJ,YAAA,EACA,SAAiC,IAAA,EACjC,KAAA,GAAgB,IAChB,OAAA,EACoC;AACpC,IAAA,kBAAA,CAAmB,YAAY,CAAA;AAE/B,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,IAAA,CAAK,KAAA,CAAM,YAAA,EAAc,GAAA,EAAK,MAAM,CAAA;AAAA,IACtC;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,cAAc,KAAK,CAAA;AAChC,IAAA,IAAA,CAAK,aAAa,KAAA,GAAQ,CAAA;AAE1B,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AACzC,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,MAAA,GAAS,KAAA;AACrC,IAAA,MAAM,IAAA,GAAO,UAAU,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAG,KAAK,IAAI,MAAA,CAAO,IAAA;AAE5D,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,EAAA,CAAG,EAAE,CAAA;AAC3B,IAAA,MAAM,UAAA,GAAa,OAAA,IAAW,QAAA,GAAY,QAAA,CAAS,YAAY,CAAA,GAAwB,IAAA;AAEvF,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,KAAA,CACJ,IAAA,EACA,QAAA,EACA,OAAA,EACe;AACf,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,IAAI,OAAA,GAAU,IAAA;AAEd,IAAA,OAAO,OAAA,EAAS;AACd,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,MAAM,OAAO,CAAA;AAEtD,MAAA,IAAI,MAAA,CAAO,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AAC5B,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,cAAA,GAAiB,MAAM,QAAA,CAAS,MAAA,CAAO,MAAM,IAAI,CAAA;AAEvD,MAAA,IAAI,mBAAmB,KAAA,EAAO;AAC5B,QAAA;AAAA,MACF;AAEA,MAAA,OAAA,GAAU,OAAO,UAAA,CAAW,OAAA;AAC5B,MAAA,IAAA,EAAA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,MAAM,OAAA,EAA2C;AACrD,IAAA,IAAA,CAAK,MAAM,CAAC,CAAA;AACZ,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AACzC,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA;AAAA,EAC3B;AAAA,EAEA,MAAM,KAAA,CAAmB,MAAA,EAAgB,OAAA,EAAsC;AAC7E,IAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,IAAA,MAAM,iBAAiB,IAAA,CAAK,aAAA;AAC5B,IAAA,IAAA,CAAK,aAAA,GAAgB,CAAC,MAAM,CAAA;AAE5B,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AACzC,MAAA,OAAO,MAAA,CAAO,IAAA,CACX,GAAA,CAAI,CAAC,GAAA,KAAkB,GAAA,CAA0B,MAAM,CAAC,CAAA,CACxD,MAAA,CAAO,CAAC,GAAA,KAAkB,QAAQ,KAAA,CAAS,CAAA;AAAA,IAChD,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,aAAA,GAAgB,cAAA;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,MAAM,KAAA,CAAmB,MAAA,EAAgB,OAAA,EAA2C;AAClF,IAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,IAAA,MAAM,iBAAiB,IAAA,CAAK,aAAA;AAC5B,IAAA,IAAA,CAAK,aAAA,GAAgB,CAAC,MAAM,CAAA;AAC5B,IAAA,IAAA,CAAK,UAAA,GAAa,CAAA;AAElB,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AACzC,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA;AACzB,MAAA,IAAI,CAAC,GAAA,EAAK;AACR,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,MAAM,GAAA,GAAM,IAAI,MAAM,CAAA;AACtB,MAAA,OAAO,GAAA,KAAQ,SAAY,IAAA,GAAO,GAAA;AAAA,IACpC,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,aAAA,GAAgB,cAAA;AAAA,IACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAA,CACE,OACA,IAAA,EACiB;AACjB,IAAA,iBAAA,CAAkB,KAAK,CAAA;AACvB,IAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AACnB,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,wBAAA,CAAyB,IAAI,CAAA;AACpD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAA,CAAO,OAAe,IAAA,EAAgD;AACpE,IAAA,iBAAA,CAAkB,KAAK,CAAA;AACvB,IAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AACnB,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,wBAAA,CAAyB,IAAI,CAAA;AACpD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAO,KAAA,EAAgC;AACrC,IAAA,iBAAA,CAAkB,KAAK,CAAA;AACvB,IAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMA,GAAA,CAAIN,MAAa,QAAA,EAAuC;AACtD,IAAA,IAAA,CAAK,MAAA,GAASA,IAAAA;AACd,IAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,MAAA,IAAA,CAAK,WAAA,GAAc,QAAA;AAAA,IACrB;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,MAAA,EAAmC;AAC5C,IAAA,MAAA,CAAO,QAAQ,CAAC,KAAA,KAAU,KAAK,eAAA,CAAgB,GAAA,CAAI,KAAK,CAAC,CAAA;AACzD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,WAAW,MAAA,EAAmC;AAC5C,IAAA,MAAA,CAAO,QAAQ,CAAC,KAAA,KAAU,KAAK,eAAA,CAAgB,GAAA,CAAI,KAAK,CAAC,CAAA;AACzD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMA,KAAA,GAA8C;AAC5C,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,OAAO,EAAE,KAAK,IAAA,CAAK,MAAA,EAAQ,UAAU,IAAA,CAAK,WAAA,IAAe,EAAC,EAAE;AAAA,IAC9D;AAEA,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,OAAO,KAAK,cAAA,EAAe;AAAA,IAC7B;AAEA,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,OAAO,KAAK,cAAA,EAAe;AAAA,IAC7B;AAEA,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,OAAO,KAAK,cAAA,EAAe;AAAA,IAC7B;AAEA,IAAA,OAAO,KAAK,cAAA,EAAe;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAQ,OAAA,EAAiD;AAC7D,IAAA,MAAM,EAAE,GAAA,EAAAA,IAAAA,EAAK,QAAA,EAAS,GAAI,KAAK,KAAA,EAAM;AACrC,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,QAAQ,KAAA,CAASA,IAAAA,EAAK,UAAyB,OAAO,CAAA;AAChF,IAAA,OAAO,IAAA,CAAK,4BAA4B,MAAM,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAMU,cAAA,CACR,IAAA,EACA,SAAA,EACA,QAAA,EACA,KAAA,EACM;AACN,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,kBAAA,CAAmB,SAAmB,CAAA;AACtC,MAAA,MAAM,cAAc,IAAA,CAAK,sBAAA,CAAuB,IAAA,CAAK,QAAA,CAAS,SAAS,CAAC,CAAA;AAExE,MAAA,IAAA,CAAK,aAAa,IAAA,CAAK;AAAA,QACrB,IAAA;AAAA,QACA,SAAA,EAAW,GAAG,IAAA,CAAK,kBAAA,CAAmB,SAAmB,CAAC,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA;AAAA,QACrF,QAAA,EAAU,CAAC,KAAK;AAAA,OACjB,CAAA;AACD,MAAA,IAAA,CAAK,QAAA,CAAS,KAAK,KAAK,CAAA;AAAA,IAC1B,CAAA,MAAA,IAAW,OAAO,SAAA,KAAc,QAAA,EAAU;AACxC,MAAA,IAAA,CAAK,aAAa,IAAA,CAAK;AAAA,QACrB,IAAA;AAAA,QACA,SAAA;AAAA,QACA,UAAU;AAAC,OACZ,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,GAAG,CAAA,KAAM;AAChD,QAAA,kBAAA,CAAmB,GAAG,CAAA;AACtB,QAAA,MAAM,cAAc,IAAA,CAAK,sBAAA,CAAuB,IAAA,CAAK,QAAA,CAAS,SAAS,CAAC,CAAA;AAExE,QAAA,IAAA,CAAK,aAAa,IAAA,CAAK;AAAA,UACrB,IAAA;AAAA,UACA,SAAA,EAAW,GAAG,IAAA,CAAK,kBAAA,CAAmB,GAAG,CAAC,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA;AAAA,UACrE,QAAA,EAAU,CAAC,GAAG;AAAA,SACf,CAAA;AACD,QAAA,IAAA,CAAK,QAAA,CAAS,KAAK,GAAG,CAAA;AAAA,MACxB,CAAC,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEU,yBACR,IAAA,EACqD;AACrD,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,eAAA,CAAgB,SAAS,CAAA,EAAG;AACnD,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,MAAA,OAAO,KAAK,GAAA,CAAI,CAAC,QAAQ,IAAA,CAAK,UAAA,CAAW,GAAG,CAAC,CAAA;AAAA,IAC/C;AACA,IAAA,OAAO,IAAA,CAAK,WAAW,IAAI,CAAA;AAAA,EAC7B;AAAA,EAEU,WAAW,GAAA,EAAuD;AAC1E,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,OAAO,GAAA;AAAA,IACT;AAEA,IAAA,MAAM,YAAA,GAAe,EAAE,GAAG,GAAA,EAAI;AAC9B,IAAA,IAAA,CAAK,eAAA,CAAgB,OAAA,CAAQ,CAAC,KAAA,KAAU;AACtC,MAAA,IAAI,SAAS,YAAA,EAAc;AACzB,QAAA,YAAA,CAAa,KAAK,CAAA,GAAI,IAAA,CAAK,OAAQ,YAAA,CAAa,YAAA,CAAa,KAAK,CAAC,CAAA;AAAA,MACrE;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAO,YAAA;AAAA,EACT;AAAA,EAEA,MAAgB,4BAA4B,MAAA,EAAiD;AAC3F,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,eAAA,CAAgB,SAAS,CAAA,EAAG;AACnD,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ;AAC7C,MAAA,MAAM,YAAA,GAAe,EAAE,GAAG,GAAA,EAAI;AAC9B,MAAA,IAAA,CAAK,eAAA,CAAgB,OAAA,CAAQ,CAAC,KAAA,KAAU;AACtC,QAAA,IAAI,KAAA,IAAS,YAAA,IAAgB,YAAA,CAAa,KAAK,CAAA,EAAG;AAChD,UAAA,IAAI;AACF,YAAA,MAAM,KAAA,GAAQ,aAAa,KAAK,CAAA;AAChC,YAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,cAAA,YAAA,CAAa,KAAK,CAAA,GAAI,IAAA,CAAK,MAAA,CAAQ,aAAa,KAAK,CAAA;AAAA,YACvD;AAAA,UACF,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF,CAAC,CAAA;AACD,MAAA,OAAO,YAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,OAAO;AAAA,MACL,GAAG,MAAA;AAAA,MACH,IAAA,EAAM;AAAA,KACR;AAAA,EACF;AAUF;;;ACzvBO,SAAS,gBAAA,GAA+B;AAC7C,EAAA,OAAO;AAAA,IACL,aAAA,EAAe,CAAC,GAAG,CAAA;AAAA,IACnB,OAAO,EAAC;AAAA,IACR,cAAc,EAAC;AAAA,IACf,gBAAgB,EAAC;AAAA,IACjB,gBAAgB,EAAC;AAAA,IACjB,UAAU,EAAC;AAAA,IACX,UAAA,EAAY,KAAA;AAAA,IACZ,eAAA,sBAAqB,GAAA,EAAI;AAAA,IACzB,eAAA,sBAAqB,GAAA;AAAI,GAC3B;AACF;;;ACvDA,eAAe,gBAAA,CACb,GAAA,EACA,mBAAA,EACA,OAAA,EACmC;AACnC,EAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,aAAA,CAAc,KAAA,EAAM;AAC/C,EAAA,GAAA,CAAI,cAAc,MAAA,GAAS,CAAA;AAC3B,EAAA,GAAA,CAAI,aAAA,CAAc,KAAK,mBAAmB,CAAA;AAE1C,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,GAAA,EAAAA,IAAAA,EAAK,QAAA,EAAS,GAAI,IAAI,KAAA,EAAM;AACpC,IAAA,MAAM,SAAS,MAAM,GAAA,CAAI,QAAQ,KAAA,CAAoBA,IAAAA,EAAK,UAAyB,OAAO,CAAA;AAC1F,IAAA,OAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,EACtB,CAAA,SAAE;AACA,IAAA,GAAA,CAAI,cAAc,MAAA,GAAS,CAAA;AAC3B,IAAA,GAAA,CAAI,aAAA,CAAc,IAAA,CAAK,GAAG,cAAc,CAAA;AAAA,EAC1C;AACF;AAKA,eAAsB,KAAA,CACpB,GAAA,EACA,MAAA,GAAS,GAAA,EACT,OAAA,EACiB;AACjB,EAAA,MAAM,MAAM,MAAM,gBAAA,CAAiB,KAAK,CAAA,MAAA,EAAS,MAAM,cAAc,OAAO,CAAA;AAC5E,EAAA,OAAO,GAAA,GAAM,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA,GAAI,CAAA;AACnC;AAKA,eAAsB,GAAA,CACpB,GAAA,EACA,MAAA,EACA,OAAA,EACiB;AACjB,EAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,EAAA,MAAM,MAAM,MAAM,gBAAA;AAAA,IAChB,GAAA;AAAA,IACA,CAAA,IAAA,EAAO,GAAA,CAAI,kBAAA,CAAmB,MAAM,CAAC,CAAA,cAAA,CAAA;AAAA,IACrC;AAAA,GACF;AACA,EAAA,OAAO,GAAA,EAAK,SAAA,GAAY,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA,GAAI,CAAA;AAClD;AAKA,eAAsB,GAAA,CACpB,GAAA,EACA,MAAA,EACA,OAAA,EACiB;AACjB,EAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,EAAA,MAAM,MAAM,MAAM,gBAAA;AAAA,IAChB,GAAA;AAAA,IACA,CAAA,IAAA,EAAO,GAAA,CAAI,kBAAA,CAAmB,MAAM,CAAC,CAAA,cAAA,CAAA;AAAA,IACrC;AAAA,GACF;AACA,EAAA,OAAO,GAAA,EAAK,SAAA,GAAY,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA,GAAI,CAAA;AAClD;AAKA,eAAsB,GAAA,CACpB,GAAA,EACA,MAAA,EACA,OAAA,EACwB;AACxB,EAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,EAAA,MAAM,MAAM,MAAM,gBAAA;AAAA,IAChB,GAAA;AAAA,IACA,CAAA,IAAA,EAAO,GAAA,CAAI,kBAAA,CAAmB,MAAM,CAAC,CAAA,cAAA,CAAA;AAAA,IACrC;AAAA,GACF;AACA,EAAA,IAAI,GAAA,EAAK,SAAA,KAAc,IAAA,IAAQ,GAAA,EAAK,cAAc,MAAA,EAAW;AAC3D,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAA,CAAO,IAAI,SAAS,CAAA;AAC7B;AAKA,eAAsB,GAAA,CACpB,GAAA,EACA,MAAA,EACA,OAAA,EACwB;AACxB,EAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,EAAA,MAAM,MAAM,MAAM,gBAAA;AAAA,IAChB,GAAA;AAAA,IACA,CAAA,IAAA,EAAO,GAAA,CAAI,kBAAA,CAAmB,MAAM,CAAC,CAAA,cAAA,CAAA;AAAA,IACrC;AAAA,GACF;AACA,EAAA,IAAI,GAAA,EAAK,SAAA,KAAc,IAAA,IAAQ,GAAA,EAAK,cAAc,MAAA,EAAW;AAC3D,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAA,CAAO,IAAI,SAAS,CAAA;AAC7B;AAKA,eAAsB,MAAA,CAAO,KAAuB,OAAA,EAA0C;AAC5F,EAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,GAAA,EAAK,KAAK,OAAO,CAAA;AAC3C,EAAA,OAAO,KAAA,GAAQ,CAAA;AACjB;;;AC9GA,eAAsB,SACpB,GAAA,EACA,KAAA,EACA,OAAe,CAAA,EACf,OAAA,GAAkB,IAClB,OAAA,EAC8B;AAC9B,EAAA,MAAM,QAAA,GAAW,IAAA,GAAO,CAAA,GAAI,CAAA,GAAI,IAAA;AAChC,EAAA,MAAM,WAAA,GAAc,OAAA,GAAU,CAAA,GAAI,EAAA,GAAK,OAAA;AAGvC,EAAA,MAAM,KAAA,GAAQ,MAAM,GAAA,CAAI,KAAA,CAAM,KAAK,OAAO,CAAA;AAG1C,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,KAAA,GAAQ,WAAW,CAAA;AAChD,EAAA,MAAM,MAAA,GAAA,CAAU,WAAW,CAAA,IAAK,WAAA;AAGhC,EAAA,KAAA,CAAM,UAAA,GAAa,WAAA;AACnB,EAAA,KAAA,CAAM,WAAA,GAAc,MAAA;AAGpB,EAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,OAAA,CAAQ,OAAO,CAAA;AAExC,EAAA,MAAM,IAAA,GAAO,KAAA,GAAQ,CAAA,GAAI,MAAA,GAAS,CAAA,GAAI,CAAA;AACtC,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,MAAA,GAAS,aAAa,KAAK,CAAA;AAE/C,EAAA,OAAO;AAAA,IACL,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,UAAA,EAAY;AAAA,MACV,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,WAAA;AAAA,MACT,KAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAS,QAAA,GAAW,UAAA;AAAA,MACpB,IAAA;AAAA,MACA;AAAA;AACF,GACF;AACF;AAKA,eAAsB,cAAA,CACpB,KACA,KAAA,EACA,YAAA,EACA,SAAiC,IAAA,EACjC,KAAA,GAAgB,IAChB,OAAA,EACoC;AACpC,EAAA,kBAAA,CAAmB,YAAY,CAAA;AAE/B,EAAA,IAAI,WAAW,IAAA,EAAM;AACnB,IAAA,GAAA,CAAI,KAAA,CAAM,YAAA,EAAc,GAAA,EAAK,MAAM,CAAA;AAAA,EACrC;AAEA,EAAA,GAAA,CAAI,OAAA,CAAQ,cAAc,KAAK,CAAA;AAC/B,EAAA,KAAA,CAAM,aAAa,KAAA,GAAQ,CAAA;AAE3B,EAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,OAAA,CAAQ,OAAO,CAAA;AACxC,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,MAAA,GAAS,KAAA;AACrC,EAAA,MAAM,IAAA,GAAO,UAAU,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAG,KAAK,IAAI,MAAA,CAAO,IAAA;AAE5D,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,EAAA,CAAG,EAAE,CAAA;AAC3B,EAAA,MAAM,UAAA,GAAa,OAAA,IAAW,QAAA,GAAY,QAAA,CAAS,YAAY,CAAA,GAAwB,IAAA;AAEvF,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AACF;AAKA,eAAsB,KAAA,CACpB,GAAA,EACA,KAAA,EACA,IAAA,EACA,UACA,OAAA,EACe;AACf,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,OAAA,GAAU,IAAA;AAEd,EAAA,OAAO,OAAA,EAAS;AACd,IAAA,MAAM,SAAS,MAAM,QAAA,CAAY,KAAK,KAAA,EAAO,IAAA,EAAM,MAAM,OAAO,CAAA;AAEhE,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AAC5B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,cAAA,GAAiB,MAAM,QAAA,CAAS,MAAA,CAAO,MAAM,IAAI,CAAA;AAEvD,IAAA,IAAI,mBAAmB,KAAA,EAAO;AAC5B,MAAA;AAAA,IACF;AAEA,IAAA,OAAA,GAAU,OAAO,UAAA,CAAW,OAAA;AAC5B,IAAA,IAAA,EAAA;AAAA,EACF;AACF;;;ACjHO,SAAS,wBAAA,CACd,KACA,IAAA,EACqD;AACrD,EAAA,IAAI,CAAC,GAAA,CAAI,MAAA,IAAU,GAAA,CAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AACjD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,OAAO,KAAK,GAAA,CAAI,CAAC,QAAQ,UAAA,CAAW,GAAA,EAAK,GAAG,CAAC,CAAA;AAAA,EAC/C;AACA,EAAA,OAAO,UAAA,CAAW,KAAK,IAAI,CAAA;AAC7B;AAKO,SAAS,UAAA,CACd,KACA,GAAA,EACyB;AACzB,EAAA,IAAI,CAAC,IAAI,MAAA,EAAQ;AACf,IAAA,OAAO,GAAA;AAAA,EACT;AAEA,EAAA,MAAM,YAAA,GAAe,EAAE,GAAG,GAAA,EAAI;AAC9B,EAAA,KAAA,MAAW,KAAA,IAAS,IAAI,eAAA,EAAiB;AACvC,IAAA,IAAI,SAAS,YAAA,EAAc;AACzB,MAAA,YAAA,CAAa,KAAK,CAAA,GAAI,GAAA,CAAI,OAAO,YAAA,CAAa,YAAA,CAAa,KAAK,CAAC,CAAA;AAAA,IACnE;AAAA,EACF;AACA,EAAA,OAAO,YAAA;AACT;AAKA,eAAsB,2BAAA,CACpB,KACA,MAAA,EACyB;AACzB,EAAA,IAAI,CAAC,GAAA,CAAI,MAAA,IAAU,GAAA,CAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AACjD,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ;AAC7C,IAAA,MAAM,YAAA,GAAe,EAAE,GAAG,GAAA,EAAI;AAC9B,IAAA,KAAA,MAAW,KAAA,IAAS,IAAI,eAAA,EAAiB;AACvC,MAAA,IAAI,KAAA,IAAS,YAAA,IAAgB,YAAA,CAAa,KAAK,CAAA,EAAG;AAChD,QAAA,IAAI;AACF,UAAA,MAAM,KAAA,GAAQ,aAAa,KAAK,CAAA;AAChC,UAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,YAAA,YAAA,CAAa,KAAK,CAAA,GAAI,GAAA,CAAI,MAAA,CAAQ,aAAa,KAAK,CAAA;AAAA,UACtD;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,YAAA;AAAA,EACT,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACL,GAAG,MAAA;AAAA,IACH,IAAA,EAAM;AAAA,GACR;AACF;;;ACxDO,IAAM,gBAAN,MAAoB;AAAA,EACjB,OAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,mBAAA,GAAsB,CAAA;AAAA,EAE9B,WAAA,CAAY,OAAA,EAA0B,OAAA,GAA8B,EAAC,EAAG;AACtE,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,SAAA,uBAAgB,IAAA,EAAK;AAC1B,IAAA,IAAA,CAAK,OAAA,GAAU;AAAA,MACb,QAAA,EAAU,QAAQ,QAAA,IAAY,GAAA;AAAA;AAAA,MAC9B,OAAA,EAAS,QAAQ,OAAA,IAAW,GAAA;AAAA;AAAA,MAC5B,OAAA,EAAS,QAAQ,OAAA,IAAW,CAAA;AAAA,MAC5B,cAAA,EAAgB,OAAA,CAAQ,cAAA,KAAmB,MAAM;AAAA,MAAC,CAAA,CAAA;AAAA,MAClD,MAAA,EAAQ,QAAQ,MAAA,IAAU;AAAA,KAC5B;AAAA,EACF;AAAA,EAEA,MAAM,KAAA,GAAoC;AACxC,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAI;AAEvB,IAAA,IAAI;AAEF,MAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,IAAA,CAAK;AAAA,QACnC,IAAA,CAAK,QAAQ,IAAA,EAAK;AAAA,QAClB,IAAI,OAAA;AAAA,UAAiB,CAAC,CAAA,EAAG,MAAA,KACvB,UAAA,CAAW,MAAM,MAAA,CAAO,IAAI,KAAA,CAAM,sBAAsB,CAAC,CAAA,EAAG,IAAA,CAAK,QAAQ,OAAO;AAAA;AAClF,OACD,CAAA;AAED,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,MAAM,IAAI,MAAM,aAAa,CAAA;AAAA,MAC/B;AAGA,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,YAAA,EAAa;AAG5C,MAAA,IAAI,MAAA,GAAsC,SAAA;AAE1C,MAAA,IAAI,UAAU,OAAA,GAAU,CAAA,IAAK,UAAU,MAAA,GAAS,SAAA,CAAU,QAAQ,GAAA,EAAK;AACrE,QAAA,MAAA,GAAS,UAAA;AAAA,MACX;AAEA,MAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,eAAe,SAAA,CAAU,MAAA,KAAW,UAAU,KAAA,EAAO;AACrE,QAAA,MAAA,GAAS,WAAA;AAAA,MACX;AAEA,MAAA,MAAM,MAAA,GAA4B;AAAA,QAChC,MAAA;AAAA,QACA,OAAA,EAAS,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA;AAAA,QACtB,SAAA,sBAAe,IAAA,EAAK;AAAA,QACpB,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,SAAA;AAAA,UAChB,QAAQ,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,UAAU,OAAA,EAAQ;AAAA,UAC5C,OAAA,EAAS,KAAK,OAAA,CAAQ;AAAA;AACxB,OACF;AAGA,MAAA,IAAI,WAAW,SAAA,EAAW;AACxB,QAAA,IAAA,CAAK,mBAAA,GAAsB,CAAA;AAAA,MAC7B;AAGA,MAAA,IAAI,IAAA,CAAK,UAAA,EAAY,MAAA,KAAW,MAAA,CAAO,MAAA,EAAQ;AAC7C,QAAA,IAAA,CAAK,OAAA,CAAQ,eAAe,MAAM,CAAA;AAClC,QAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,IAAA;AAAA,UAClB,0BAA0B,IAAA,CAAK,UAAA,EAAY,MAAM,CAAA,IAAA,EAAO,OAAO,MAAM,CAAA;AAAA,SACvE;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,UAAA,GAAa,MAAA;AAClB,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,mBAAA,EAAA;AAEL,MAAA,MAAM,MAAA,GAA4B;AAAA,QAChC,MAAA,EAAQ,WAAA;AAAA,QACR,OAAA,EAAS,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA;AAAA,QACtB,SAAA,sBAAe,IAAA,EAAK;AAAA,QACpB,OAAA,EAAS;AAAA,UACP,WAAY,KAAA,CAAgB,OAAA;AAAA,UAC5B,QAAQ,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,UAAU,OAAA;AAAQ;AAC9C,OACF;AAEA,MAAA,IAAI,IAAA,CAAK,UAAA,EAAY,MAAA,KAAW,WAAA,EAAa;AAC3C,QAAA,IAAA,CAAK,OAAA,CAAQ,eAAe,MAAM,CAAA;AAClC,QAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,qBAAA,EAAuB,KAAK,CAAA;AAAA,MACxD;AAEA,MAAA,IAAA,CAAK,UAAA,GAAa,MAAA;AAClB,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA;AAAA,IACF;AAGA,IAAA,IAAA,CAAK,KAAA,EAAM,CAAE,KAAA,CAAM,CAAC,KAAA,KAAU;AAC5B,MAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,6BAAA,EAA+B,KAAK,CAAA;AAAA,IAChE,CAAC,CAAA;AAGD,IAAA,IAAA,CAAK,UAAA,GAAa,YAAY,MAAM;AAClC,MAAA,IAAA,CAAK,KAAA,EAAM,CAAE,KAAA,CAAM,CAAC,KAAA,KAAU;AAC5B,QAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,8BAAA,EAAgC,KAAK,CAAA;AAAA,MACjE,CAAC,CAAA;AAAA,IACH,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AAExB,IAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,wBAAA,EAA0B;AAAA,MACjD,QAAA,EAAU,KAAK,OAAA,CAAQ,QAAA;AAAA,MACvB,OAAA,EAAS,KAAK,OAAA,CAAQ;AAAA,KACvB,CAAA;AAAA,EACH;AAAA,EAEA,IAAA,GAAa;AACX,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,aAAA,CAAc,KAAK,UAAU,CAAA;AAC7B,MAAA,IAAA,CAAK,UAAA,GAAa,MAAA;AAClB,MAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,wBAAwB,CAAA;AAAA,IACnD;AAAA,EACF;AAAA,EAEA,aAAA,GAA+C;AAC7C,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA,EAEA,SAAA,GAAqB;AACnB,IAAA,OAAO,IAAA,CAAK,YAAY,MAAA,KAAW,SAAA;AAAA,EACrC;AAAA,EAEA,SAAA,GAAoB;AAClB,IAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,UAAU,OAAA,EAAQ;AAAA,EAC7C;AAAA,EAEA,sBAAA,GAAiC;AAC/B,IAAA,OAAO,IAAA,CAAK,mBAAA;AAAA,EACd;AAAA,EAEA,MAAM,cAAA,CAAe,WAAA,GAAc,GAAA,EAAuB;AACxD,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA,GAAY,WAAA,EAAa;AAC3C,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,KAAA,EAAM;AAEhC,MAAA,IAAI,MAAA,CAAO,WAAW,SAAA,EAAW;AAC/B,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,IAAI,OAAA,CAAQ,CAACE,aAAY,UAAA,CAAWA,QAAAA,EAAS,GAAI,CAAC,CAAA;AAAA,IAC1D;AAEA,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2CAAA,EAA8C,WAAW,CAAA,EAAA,CAAI,CAAA;AAAA,EAC/E;AACF;AC7IO,IAAM,gBAAA,GAAN,cAA+BK,YAAAA,CAAa;AAAA,EACzC,YAAA;AAAA,EACA,iBAAA;AAAA,EACA,kBAAA;AAAA,EACA,iBAA2B,EAAC;AAAA,EAC5B,kBAA4B,EAAC;AAAA,EAC7B,uBAAiC,EAAC;AAAA,EAClC,SAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAyC,EAAC;AAAA,EAC1C,QAAA;AAAA,EAER,WAAA,CAAY,OAAA,GAAwE,EAAC,EAAG;AACtF,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,SAAA,uBAAgB,IAAA,EAAK;AAC1B,IAAA,IAAA,CAAK,kBAAA,GAAqB,QAAQ,kBAAA,IAAsB,GAAA;AAExD,IAAA,IAAA,CAAK,YAAA,GAAe,KAAK,uBAAA,EAAwB;AACjD,IAAA,IAAA,CAAK,iBAAA,GAAoB,KAAK,4BAAA,EAA6B;AAC3D,IAAA,IAAA,CAAK,kBAAA,GAAqB,KAAK,6BAAA,EAA8B;AAE7D,IAAA,IAAI,QAAQ,kBAAA,EAAoB;AAC9B,MAAA,IAAA,CAAK,eAAA,CAAgB,QAAQ,kBAAkB,CAAA;AAAA,IACjD;AAAA,EACF;AAAA,EAEQ,uBAAA,GAAwC;AAC9C,IAAA,OAAO;AAAA,MACL,YAAA,EAAc,CAAA;AAAA,MACd,iBAAA,EAAmB,CAAA;AAAA,MACnB,aAAA,EAAe,CAAA;AAAA,MACf,cAAA,EAAgB,CAAA;AAAA,MAChB,YAAY,MAAA,CAAO,iBAAA;AAAA,MACnB,UAAA,EAAY,CAAA;AAAA,MACZ,gBAAA,EAAkB,CAAA;AAAA,MAClB,YAAA,EAAc,CAAA;AAAA,MACd,WAAA,EAAa,CAAA;AAAA,MACb,mBAAmB;AAAC,KACtB;AAAA,EACF;AAAA,EAEQ,4BAAA,GAAkD;AACxD,IAAA,OAAO;AAAA,MACL,gBAAA,EAAkB,CAAA;AAAA,MAClB,iBAAA,EAAmB,CAAA;AAAA,MACnB,eAAA,EAAiB,CAAA;AAAA,MACjB,gBAAA,EAAkB,CAAA;AAAA,MAClB,qBAAA,EAAuB,CAAA;AAAA,MACvB,eAAA,EAAiB;AAAA,KACnB;AAAA,EACF;AAAA,EAEQ,6BAAA,GAAoD;AAC1D,IAAA,OAAO;AAAA,MACL,iBAAA,EAAmB,CAAA;AAAA,MACnB,qBAAA,EAAuB,CAAA;AAAA,MACvB,sBAAA,EAAwB,CAAA;AAAA,MACxB,0BAAA,EAA4B,CAAA;AAAA,MAC5B,kBAAA,EAAoB,CAAA;AAAA,MACpB,SAAA,EAAW;AAAA,KACb;AAAA,EACF;AAAA,EAEA,WAAA,CAAY,OAAA,EAAiB,OAAA,EAAiB,OAAA,EAAkB,WAAW,KAAA,EAAa;AACtF,IAAA,IAAA,CAAK,YAAA,CAAa,YAAA,EAAA;AAElB,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAA,CAAK,YAAA,CAAa,iBAAA,EAAA;AAAA,IACpB,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,YAAA,CAAa,aAAA,EAAA;AAAA,IACpB;AAGA,IAAA,IAAA,CAAK,cAAA,CAAe,KAAK,OAAO,CAAA;AAChC,IAAA,IAAI,IAAA,CAAK,cAAA,CAAe,MAAA,GAAS,GAAA,EAAM;AACrC,MAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAAA,IAC5B;AAEA,IAAA,IAAA,CAAK,aAAa,UAAA,GAAa,IAAA,CAAK,IAAI,IAAA,CAAK,YAAA,CAAa,YAAY,OAAO,CAAA;AAC7E,IAAA,IAAA,CAAK,aAAa,UAAA,GAAa,IAAA,CAAK,IAAI,IAAA,CAAK,YAAA,CAAa,YAAY,OAAO,CAAA;AAC7E,IAAA,IAAA,CAAK,YAAA,CAAa,cAAA,GAAiB,IAAA,CAAK,gBAAA,CAAiB,KAAK,cAAc,CAAA;AAG5E,IAAA,IAAI,OAAA,GAAU,KAAK,kBAAA,EAAoB;AACrC,MAAA,IAAA,CAAK,YAAA,CAAa,WAAA,EAAA;AAClB,MAAA,IAAA,CAAK,IAAA,CAAK,WAAA,EAAa,EAAE,OAAA,EAAS,SAAS,CAAA;AAAA,IAC7C;AAGA,IAAA,MAAM,SAAA,GAAY,QAAQ,WAAA,EAAY;AACtC,IAAA,IAAA,CAAK,YAAA,CAAa,kBAAkB,SAAS,CAAA,GAAA,CAC1C,KAAK,YAAA,CAAa,iBAAA,CAAkB,SAAS,CAAA,IAAK,CAAA,IAAK,CAAA;AAG1D,IAAA,MAAM,kBAAkB,IAAA,CAAK,GAAA,KAAQ,IAAA,CAAK,SAAA,CAAU,SAAQ,IAAK,GAAA;AACjE,IAAA,IAAA,CAAK,YAAA,CAAa,gBAAA,GAAmB,IAAA,CAAK,YAAA,CAAa,YAAA,GAAe,cAAA;AAGtE,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAMC,UAAAA,GAAa,IAAA,CAAK,aAAA,CAAc,WAAW,CAAA,IAAgB,CAAA;AACjE,MAAA,IAAA,CAAK,aAAA,CAAc,WAAW,CAAA,GAAIA,UAAAA,GAAY,CAAA;AAAA,IAChD;AACA,IAAA,MAAM,SAAA,GAAa,IAAA,CAAK,aAAA,CAAc,WAAW,CAAA,IAAgB,CAAA;AACjE,IAAA,IAAA,CAAK,YAAA,CAAa,eAChB,IAAA,CAAK,YAAA,CAAa,eAAe,CAAA,GAAI,SAAA,GAAY,IAAA,CAAK,YAAA,CAAa,YAAA,GAAe,CAAA;AAAA,EACtF;AAAA,EAEA,gBAAA,CAAiB,WAAoB,cAAA,EAA+B;AAClE,IAAA,IAAA,CAAK,iBAAA,CAAkB,gBAAA,EAAA;AAEvB,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,IAAA,CAAK,iBAAA,CAAkB,iBAAA,EAAA;AAEvB,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,IAAA,CAAK,eAAA,CAAgB,KAAK,cAAc,CAAA;AACxC,QAAA,IAAI,IAAA,CAAK,eAAA,CAAgB,MAAA,GAAS,GAAA,EAAK;AACrC,UAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAAA,QAC7B;AACA,QAAA,IAAA,CAAK,iBAAA,CAAkB,qBAAA,GAAwB,IAAA,CAAK,gBAAA,CAAiB,KAAK,eAAe,CAAA;AAAA,MAC3F;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,iBAAA,CAAkB,gBAAA,EAAA;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,iBAAA,CACE,MAAA,EACA,QAAA,EACA,UAAA,GAAa,KAAA,EACP;AACN,IAAA,QAAQ,MAAA;AAAQ,MACd,KAAK,OAAA,EAAS;AACZ,QAAA,IAAA,CAAK,kBAAA,CAAmB,iBAAA,EAAA;AACxB,QAAA,IAAA,CAAK,kBAAA,CAAmB,kBAAA,EAAA;AACxB,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,QAAA,EAAU;AACb,QAAA,IAAA,CAAK,kBAAA,CAAmB,qBAAA,EAAA;AACxB,QAAA,IAAA,CAAK,kBAAA,CAAmB,qBAAqB,IAAA,CAAK,GAAA;AAAA,UAChD,CAAA;AAAA,UACA,IAAA,CAAK,mBAAmB,kBAAA,GAAqB;AAAA,SAC/C;AACA,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,UAAA,EAAY;AACf,QAAA,IAAA,CAAK,kBAAA,CAAmB,sBAAA,EAAA;AACxB,QAAA,IAAA,CAAK,kBAAA,CAAmB,qBAAqB,IAAA,CAAK,GAAA;AAAA,UAChD,CAAA;AAAA,UACA,IAAA,CAAK,mBAAmB,kBAAA,GAAqB;AAAA,SAC/C;AAEA,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,IAAA,CAAK,kBAAA,CAAmB,SAAA,EAAA;AACxB,UAAA,IAAA,CAAK,KAAK,UAAU,CAAA;AAAA,QACtB;AACA,QAAA;AAAA,MACF;AAAA;AAGF,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAA,CAAK,oBAAA,CAAqB,KAAK,QAAQ,CAAA;AACvC,MAAA,IAAI,IAAA,CAAK,oBAAA,CAAqB,MAAA,GAAS,GAAA,EAAK;AAC1C,QAAA,IAAA,CAAK,qBAAqB,KAAA,EAAM;AAAA,MAClC;AACA,MAAA,IAAA,CAAK,kBAAA,CAAmB,6BAA6B,IAAA,CAAK,gBAAA;AAAA,QACxD,IAAA,CAAK;AAAA,OACP;AAAA,IACF;AAAA,EACF;AAAA,EAEA,qBAAqB,KAAA,EAA8D;AACjF,IAAA,IAAA,CAAK,iBAAA,CAAkB,oBAAoB,KAAA,CAAM,MAAA;AACjD,IAAA,IAAA,CAAK,iBAAA,CAAkB,kBAAkB,KAAA,CAAM,IAAA;AAC/C,IAAA,IAAA,CAAK,iBAAA,CAAkB,kBACrB,KAAA,CAAM,KAAA,GAAQ,IAAI,IAAA,CAAK,YAAA,CAAa,YAAA,GAAe,KAAA,CAAM,KAAA,GAAQ,CAAA;AAAA,EACrE;AAAA,EAEA,eAAA,CAAgB,KAAa,KAAA,EAAsB;AACjD,IAAA,IAAA,CAAK,aAAA,CAAc,GAAG,CAAA,GAAI,KAAA;AAAA,EAC5B;AAAA,EAEA,qBAAA,CAAsB,GAAA,EAAa,KAAA,GAAQ,CAAA,EAAS;AAClD,IAAA,MAAM,OAAA,GAAW,IAAA,CAAK,aAAA,CAAc,GAAG,CAAA,IAAgB,CAAA;AACvD,IAAA,IAAA,CAAK,aAAA,CAAc,GAAG,CAAA,GAAI,OAAA,GAAU,KAAA;AAAA,EACtC;AAAA,EAEA,WAAA,GAA+B;AAC7B,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,EAAE,GAAG,IAAA,CAAK,YAAA,EAAa;AAAA,MAC9B,UAAA,EAAY,EAAE,GAAG,IAAA,CAAK,iBAAA,EAAkB;AAAA,MACxC,WAAA,EAAa,EAAE,GAAG,IAAA,CAAK,kBAAA,EAAmB;AAAA,MAC1C,MAAA,EAAQ;AAAA,QACN,WAAA,EAAa,QAAQ,WAAA,EAAY;AAAA,QACjC,QAAA,EAAU,QAAQ,QAAA,EAAS;AAAA,QAC3B,MAAA,EAAQ,QAAQ,MAAA,EAAO;AAAA,QACvB,SAAA,sBAAe,IAAA;AAAK,OACtB;AAAA,MACA,MAAA,EAAQ,EAAE,GAAG,IAAA,CAAK,aAAA;AAAc,KAClC;AAAA,EACF;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,YAAA,GAAe,KAAK,uBAAA,EAAwB;AACjD,IAAA,IAAA,CAAK,iBAAA,GAAoB,KAAK,4BAAA,EAA6B;AAC3D,IAAA,IAAA,CAAK,kBAAA,GAAqB,KAAK,6BAAA,EAA8B;AAC7D,IAAA,IAAA,CAAK,iBAAiB,EAAC;AACvB,IAAA,IAAA,CAAK,kBAAkB,EAAC;AACxB,IAAA,IAAA,CAAK,uBAAuB,EAAC;AAC7B,IAAA,IAAA,CAAK,gBAAgB,EAAC;AACtB,IAAA,IAAA,CAAK,SAAA,uBAAgB,IAAA,EAAK;AAAA,EAC5B;AAAA,EAEQ,iBAAiB,MAAA,EAA0B;AACjD,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,MAAMC,IAAAA,GAAM,OAAO,MAAA,CAAO,CAAC,KAAK,GAAA,KAAQ,GAAA,GAAM,KAAK,CAAC,CAAA;AACpD,IAAA,OAAOA,OAAM,MAAA,CAAO,MAAA;AAAA,EACtB;AAAA,EAEQ,gBAAgB,QAAA,EAAwB;AAC9C,IAAA,IAAA,CAAK,QAAA,GAAW,YAAY,MAAM;AAChC,MAAA,MAAM,QAAA,GAAW,KAAK,WAAA,EAAY;AAClC,MAAA,IAAA,CAAK,IAAA,CAAK,WAAW,QAAQ,CAAA;AAAA,IAC/B,GAAG,QAAQ,CAAA;AAAA,EACb;AAAA,EAEA,IAAA,GAAa;AACX,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,aAAA,CAAc,KAAK,QAAQ,CAAA;AAC3B,MAAA,IAAA,CAAK,QAAA,GAAW,MAAA;AAAA,IAClB;AAAA,EACF;AAAA;AAAA,EAGA,gBAAA,GAA2B;AACzB,IAAA,MAAM,OAAA,GAAU,KAAK,WAAA,EAAY;AACjC,IAAA,MAAM,QAAkB,EAAC;AAGzB,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,wDAAA,CAAA;AAAA,MACA,CAAA,+BAAA,CAAA;AAAA,MACA,CAAA,iBAAA,EAAoB,OAAA,CAAQ,KAAA,CAAM,YAAY,CAAA,CAAA;AAAA,MAC9C,CAAA,oEAAA,CAAA;AAAA,MACA,CAAA,wCAAA,CAAA;AAAA,MACA,CAAA,0CAAA,EAA6C,OAAA,CAAQ,KAAA,CAAM,cAAA,GAAiB,GAAI,CAAA,CAAA;AAAA,MAChF,CAAA,2CAAA,EAA8C,OAAA,CAAQ,KAAA,CAAM,UAAA,GAAa,GAAI,CAAA,CAAA;AAAA,MAC7E,iCAAkC,OAAA,CAAQ,KAAA,CAAM,iBAAiB,OAAA,CAAQ,KAAA,CAAM,eAAgB,GAAI,CAAA,CAAA;AAAA,MACnG,CAAA,gCAAA,EAAmC,OAAA,CAAQ,KAAA,CAAM,YAAY,CAAA,CAAA;AAAA,MAC7D,CAAA,kEAAA,CAAA;AAAA,MACA,CAAA,kCAAA,CAAA;AAAA,MACA,CAAA,sBAAA,EAAyB,OAAA,CAAQ,UAAA,CAAW,iBAAiB,CAAA,CAAA;AAAA,MAC7D,CAAA,yDAAA,CAAA;AAAA,MACA,CAAA,oCAAA,CAAA;AAAA,MACA,CAAA,0CAAA,EAA6C,OAAA,CAAQ,WAAA,CAAY,qBAAqB,CAAA,CAAA;AAAA,MACtF,CAAA,4CAAA,EAA+C,OAAA,CAAQ,WAAA,CAAY,sBAAsB,CAAA,CAAA;AAAA,MACzF,CAAA,8DAAA,CAAA;AAAA,MACA,CAAA,yCAAA;AAAA,KACF;AACA,IAAA,KAAA,CAAM,KAAK,CAAA,6BAAA,EAAgC,OAAA,CAAQ,MAAA,CAAO,WAAA,CAAY,SAAS,CAAA,CAAE,CAAA;AAEjF,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB;AACF;;;AC5RO,IAAM,kBAAN,MAAsB;AAAA,EACnB,OAAA;AAAA,EACA,aAA0B,EAAC;AAAA,EAC3B,OAAA;AAAA,EAER,WAAA,CAAY,OAAA,EAA0B,OAAA,GAAkC,EAAC,EAAG;AAC1E,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,OAAA,GAAU;AAAA,MACb,SAAA,EAAW,QAAQ,SAAA,IAAa,eAAA;AAAA,MAChC,MAAA,EAAQ,QAAQ,MAAA,IAAU,OAAA;AAAA,MAC1B,iBAAA,EAAmB,QAAQ,iBAAA,IAAqB,IAAA;AAAA,MAChD,MAAA,EAAQ,QAAQ,MAAA,IAAU;AAAA,KAC5B;AAAA,EACF;AAAA,EAEA,MAAM,UAAA,GAA4B;AAChC,IAAA,IAAI,IAAA,CAAK,QAAQ,MAAA,EAAQ;AACvB,MAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,wCAAwC,CAAA;AACjE,MAAA;AAAA,IACF;AAEA,IAAA,MAAMT,IAAAA,GAAM;AAAA,iCAAA,EACmB,IAAA,CAAK,QAAQ,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAYrD,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQA,IAAG,CAAA;AAC9B,MAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,IAAA,CAAK,qBAAqB,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA,OAAA,CAAS,CAAA;AAAA,IAC/E,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,UAAA,CAAW,CAAA,mCAAA,EAAuC,KAAA,CAAgB,OAAO,CAAA,CAAE,CAAA;AAAA,IACvF;AAAA,EACF;AAAA,EAEA,aAAa,SAAA,EAA4B;AAEvC,IAAA,MAAM,QAAA,GAAW,KAAK,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,KAAY,SAAA,CAAU,OAAO,CAAA;AAC5E,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,kBAAA,EAAqB,UAAU,OAAO,CAAA,iBAAA,EAAoB,SAAS,IAAI,CAAA,KAAA,EAAQ,UAAU,IAAI,CAAA;AAAA,OAC/F;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,UAAA,CAAW,KAAK,SAAS,CAAA;AAC9B,IAAA,IAAA,CAAK,UAAA,CAAW,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,OAAA,GAAU,EAAE,OAAO,CAAA;AAAA,EACtD;AAAA,EAEA,cAAc,UAAA,EAA+B;AAC3C,IAAA,UAAA,CAAW,QAAQ,CAAC,SAAA,KAAc,IAAA,CAAK,YAAA,CAAa,SAAS,CAAC,CAAA;AAAA,EAChE;AAAA,EAEA,MAAM,qBAAA,GAAqD;AACzD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAA;AAAA,MAChC,CAAA,cAAA,EAAiB,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA,qBAAA;AAAA,KACzC;AAEA,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,MAC/B,GAAG,GAAA;AAAA,MACH,UAAA,EAAY,IAAI,IAAA,CAAK,GAAA,CAAI,UAAU;AAAA,KACrC,CAAE,CAAA;AAAA,EACJ;AAAA,EAEA,MAAM,oBAAA,GAA6C;AACjD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,qBAAA,EAAsB;AAClD,IAAA,MAAM,gBAAA,GAAmB,IAAI,GAAA,CAAI,QAAA,CAAS,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAC,CAAA;AAE/D,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,gBAAA,CAAiB,GAAA,CAAI,CAAA,CAAE,OAAO,CAAC,CAAA;AAAA,EACvE;AAAA,EAEQ,kBAAkB,SAAA,EAA8B;AACtD,IAAA,MAAMU,OAAAA,GAAS,UAAQ,QAAa,CAAA;AACpC,IAAA,MAAM,UAAU,CAAA,EAAG,SAAA,CAAU,EAAE,CAAA,CAAA,EAAI,SAAA,CAAU,OAAO,CAAA,CAAA,EAAI,SAAA,CAAU,IAAI,CAAA,CAAA,EAAI,SAAA,CAAU,GAAG,QAAA,EAAU,IAAI,SAAA,CAAU,IAAA,CAAK,UAAU,CAAA,CAAA;AAC9H,IAAA,OAAOA,OAAAA,CAAO,WAAW,QAAQ,CAAA,CAAE,OAAO,OAAO,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,EACjE;AAAA,EAEA,MAAM,GAAG,aAAA,EAAuC;AAC9C,IAAA,MAAM,KAAK,UAAA,EAAW;AAEtB,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,oBAAA,EAAqB;AAChD,IAAA,MAAM,KAAA,GAAQ,gBAAgB,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,IAAW,aAAa,CAAA,GAAI,OAAA;AAElF,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,8BAA8B,CAAA;AACvD,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,IAAA,CAAK,CAAA,MAAA,EAAS,KAAA,CAAM,MAAM,CAAA,mBAAA,CAAqB,CAAA;AAEnE,IAAA,KAAA,MAAW,aAAa,KAAA,EAAO;AAC7B,MAAA,MAAM,IAAA,CAAK,YAAA,CAAa,SAAA,EAAW,IAAI,CAAA;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,aAAA,EAAsC;AAC/C,IAAA,MAAM,KAAK,UAAA,EAAW;AAEtB,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,qBAAA,EAAsB;AAClD,IAAA,MAAM,QAAA,GAAW,SAAS,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,OAAA,GAAU,aAAa,CAAA,CAAE,OAAA,EAAQ;AAE3E,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,yBAAyB,CAAA;AAClD,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,IAAA,CAAK,CAAA,MAAA,EAAS,QAAA,CAAS,MAAM,CAAA,qBAAA,CAAuB,CAAA;AAExE,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,MAAM,SAAA,GAAY,KAAK,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,KAAY,OAAA,CAAQ,OAAO,CAAA;AAC3E,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,UAAA,EAAa,OAAA,CAAQ,OAAO,CAAA,sBAAA,CAAwB,CAAA;AAAA,MACtE;AAEA,MAAA,MAAM,IAAA,CAAK,YAAA,CAAa,SAAA,EAAW,MAAM,CAAA;AAAA,IAC3C;AAAA,EACF;AAAA,EAEA,MAAM,MAAA,GAAwB;AAC5B,IAAA,MAAM,KAAK,EAAA,EAAG;AAAA,EAChB;AAAA,EAEA,MAAM,QAAA,CAAS,KAAA,GAAQ,CAAA,EAAkB;AACvC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,qBAAA,EAAsB;AAElD,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,2BAA2B,CAAA;AACpD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,cAAc,IAAA,CAAK,GAAA,CAAI,GAAG,QAAA,CAAS,MAAA,GAAS,QAAQ,CAAC,CAAA;AAC3D,IAAA,MAAM,gBAAgB,WAAA,IAAe,CAAA,GAAI,QAAA,CAAS,WAAW,EAAG,OAAA,GAAU,CAAA;AAE1E,IAAA,MAAM,IAAA,CAAK,KAAK,aAAa,CAAA;AAAA,EAC/B;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,EACnB;AAAA,EAEA,MAAM,OAAA,GAAyB;AAC7B,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,MAAM,KAAK,MAAA,EAAO;AAAA,EACpB;AAAA,EAEA,MAAc,YAAA,CAAa,SAAA,EAAsB,SAAA,EAAyC;AACxF,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAI;AACvB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,iBAAA,CAAkB,SAAS,CAAA;AAEjD,IAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,IAAA;AAAA,MAClB,CAAA,EAAG,SAAA,KAAc,IAAA,GAAO,SAAA,GAAY,WAAW,cAAc,SAAA,CAAU,OAAO,CAAA,EAAA,EAAK,SAAA,CAAU,IAAI,CAAA;AAAA,KACnG;AAEA,IAAA,IAAI,IAAA,CAAK,QAAQ,MAAA,EAAQ;AACvB,MAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,IAAA,CAAK,CAAA,eAAA,EAAkB,SAAS,CAAA,WAAA,EAAc,SAAA,CAAU,OAAO,CAAA,CAAE,CAAA;AACrF,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,OAAA,CAAQ,gBAAA,EAAiB;AAExD,IAAA,IAAI;AAEF,MAAA,IAAI,SAAA,KAAc,MAAA,IAAU,IAAA,CAAK,OAAA,CAAQ,iBAAA,EAAmB;AAC1D,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAA;AAAA,UACjC,CAAA,qBAAA,EAAwB,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA,kBAAA,CAAA;AAAA,UAC9C,CAAC,UAAU,OAAO;AAAA,SACpB;AAEA,QAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,aAAa,QAAA,EAAU;AAC1C,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,CAAA,gCAAA,EAAmC,UAAU,OAAO,CAAA,uCAAA;AAAA,WACtD;AAAA,QACF;AAAA,MACF;AAGA,MAAA,MAAM,SAAA,CAAU,SAAS,CAAA,CAAE,IAAA,CAAK,OAAO,CAAA;AAGvC,MAAA,IAAI,cAAc,IAAA,EAAM;AACtB,QAAA,MAAM,KAAK,OAAA,CAAQ,OAAA;AAAA,UACjB,CAAA,YAAA,EAAe,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA,+EAAA,CAAA;AAAA,UACrC;AAAA,YACE,SAAA,CAAU,EAAA;AAAA,YACV,SAAA,CAAU,OAAA;AAAA,YACV,SAAA,CAAU,IAAA;AAAA,gCACN,IAAA,EAAK;AAAA,YACT,IAAA,CAAK,KAAI,GAAI,KAAA;AAAA,YACb;AAAA,WACF;AAAA,UACA,EAAE,WAAA;AAAY,SAChB;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM,KAAK,OAAA,CAAQ,OAAA;AAAA,UACjB,CAAA,YAAA,EAAe,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA,kBAAA,CAAA;AAAA,UACrC,CAAC,UAAU,OAAO,CAAA;AAAA,UAClB,EAAE,WAAA;AAAY,SAChB;AAAA,MACF;AAEA,MAAA,MAAM,YAAY,MAAA,EAAO;AAEzB,MAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,IAAA;AAAA,QAClB,CAAA,EAAG,SAAA,KAAc,IAAA,GAAO,WAAA,GAAc,UAAU,CAAA,WAAA,EAAc,SAAA,CAAU,OAAO,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAI,GAAI,KAAK,CAAA,EAAA;AAAA,OAC1G;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,YAAY,QAAA,EAAS;AAE3B,MAAA,MAAM,MAAA,GAAS,SAAA,KAAc,IAAA,GAAO,KAAA,GAAQ,QAAA;AAC5C,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,aAAa,MAAM,CAAA,WAAA,EAAc,UAAU,OAAO,CAAA,EAAA,EAAM,MAAgB,OAAO,CAAA;AAAA,OACjF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,MAAA,GAIH;AACD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,qBAAA,EAAsB;AAClD,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,oBAAA,EAAqB;AAChD,IAAA,MAAM,OAAA,GAAU,SAAS,MAAA,GAAS,CAAA,GAAI,SAAS,EAAA,CAAG,EAAE,EAAG,OAAA,GAAU,IAAA;AAEjE,IAAA,OAAO,EAAE,QAAA,EAAU,OAAA,EAAS,OAAA,EAAQ;AAAA,EACtC;AAAA,EAEA,MAAM,QAAA,GAA0D;AAC9D,IAAA,MAAM,SAAmB,EAAC;AAG1B,IAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AACjC,IAAA,KAAA,MAAW,SAAA,IAAa,KAAK,UAAA,EAAY;AACvC,MAAA,IAAI,QAAA,CAAS,GAAA,CAAI,SAAA,CAAU,OAAO,CAAA,EAAG;AACnC,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,6BAAA,EAAgC,SAAA,CAAU,OAAO,CAAA,CAAE,CAAA;AAAA,MACjE;AACA,MAAA,QAAA,CAAS,GAAA,CAAI,UAAU,OAAO,CAAA;AAAA,IAChC;AAGA,IAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAChE,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,cAAA,CAAe,QAAQ,CAAA,EAAA,EAAK;AAC9C,MAAA,IAAI,eAAe,CAAC,CAAA,GAAK,eAAe,CAAA,GAAI,CAAC,IAAK,CAAA,EAAG;AACnD,QAAA,MAAA,CAAO,IAAA;AAAA,UACL,CAAA,kCAAA,EAAqC,eAAe,CAAA,GAAI,CAAC,CAAC,CAAA,KAAA,EAAQ,cAAA,CAAe,CAAC,CAAC,CAAA;AAAA,SACrF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,QAAQ,iBAAA,EAAmB;AAClC,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,qBAAA,EAAsB;AAElD,MAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,QAAA,MAAM,SAAA,GAAY,KAAK,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,KAAY,OAAA,CAAQ,OAAO,CAAA;AAE3E,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,UAAA,EAAa,OAAA,CAAQ,OAAO,CAAA,sCAAA,CAAwC,CAAA;AAChF,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,iBAAA,CAAkB,SAAS,CAAA;AACxD,QAAA,IAAI,eAAA,KAAoB,QAAQ,QAAA,EAAU;AACxC,UAAA,MAAA,CAAO,IAAA;AAAA,YACL,CAAA,gCAAA,EAAmC,OAAA,CAAQ,OAAO,CAAA,EAAA,EAAK,QAAQ,IAAI,CAAA,kDAAA;AAAA,WACrE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,OAAO,MAAA,KAAW,CAAA;AAAA,MACzB;AAAA,KACF;AAAA,EACF;AACF;ACtSA,IAAM,iBAAA,GAAoB,8BAAA;AAEnB,IAAM,kBAAN,MAAsB;AAAA,EACnB,SAAA;AAAA,EACA,UAAA;AAAA,EAER,YAAY,SAAA,EAAmB,UAAA,GAAuB,CAAC,KAAA,EAAO,KAAA,EAAO,MAAM,CAAA,EAAG;AAC5E,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,GAA0C;AAC9C,IAAA,MAAM,QAAyB,EAAC;AAEhC,IAAA,IAAI;AAEF,MAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,IAAA,CAAK,WAAW,EAAE,aAAA,EAAe,MAAM,CAAA;AAErE,MAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,QAAA,IAAI,CAAC,KAAA,CAAM,MAAA,EAAO,EAAG;AACnB,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AAC9B,QAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,QAAA,CAAS,GAAG,CAAA,EAAG;AAClC,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,iBAAiB,CAAA;AAChD,QAAA,IAAI,CAAC,KAAA,EAAO;AACV,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,GAAG,SAAA,EAAW,WAAW,CAAA,GAAI,KAAA;AACnC,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,UACT,IAAA,EAAM,QAAA,CAAS,KAAA,CAAM,IAAA,EAAM,GAAG,CAAA;AAAA,UAC9B,IAAA,EAAM,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,MAAM,IAAI,CAAA;AAAA,UACrC,SAAA;AAAA,UACA,WAAA,EAAa,WAAA,CAAa,UAAA,CAAW,GAAA,EAAK,GAAG;AAAA,SAC9C,CAAA;AAAA,MACH;AAGA,MAAA,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,SAAA,CAAU,aAAA,CAAc,CAAA,CAAE,SAAS,CAAC,CAAA;AAE3D,MAAA,OAAO,KAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAK,KAAA,CAAgC,SAAS,QAAA,EAAU;AACtD,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,IAAA,CAAK,SAAS,CAAA,CAAE,CAAA;AAAA,MACpE;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,IAAA,EAAyC;AAC3D,IAAA,IAAI;AAEF,MAAA,MAAM,OAAA,GAAU,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA,CAAE,IAAA;AACzC,MAAA,MAAM,MAAA,GAAS,MAAM,OAAO,OAAA,CAAA;AAG5B,MAAA,MAAM,SAAA,GAAY,OAAO,OAAA,IAAW,MAAA;AAGpC,MAAA,IAAI,OAAO,SAAA,CAAU,EAAA,KAAO,UAAA,EAAY;AACtC,QAAA,MAAM,IAAI,SAAA,CAAU,CAAA,UAAA,EAAa,IAAA,CAAK,IAAI,CAAA,yBAAA,CAA2B,CAAA;AAAA,MACvE;AACA,MAAA,IAAI,OAAO,SAAA,CAAU,IAAA,KAAS,UAAA,EAAY;AACxC,QAAA,MAAM,IAAI,SAAA,CAAU,CAAA,UAAA,EAAa,IAAA,CAAK,IAAI,CAAA,2BAAA,CAA6B,CAAA;AAAA,MACzE;AAEA,MAAA,OAAO;AAAA,QACL,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,IAAI,SAAA,CAAU,EAAA;AAAA,QACd,MAAM,SAAA,CAAU,IAAA;AAAA,QAChB,aAAA,EAAe,UAAU,aAAA,IAAiB,IAAA;AAAA,QAC1C,OAAO,SAAA,CAAU;AAAA,OACnB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,MAAM,CAAA,yBAAA,EAA4B,IAAA,CAAK,IAAI,CAAA,EAAA,EAAM,KAAA,CAAgB,OAAO,CAAA,CAAE,CAAA;AAAA,IACtF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,GAAgC;AACpC,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,aAAA,EAAc;AACvC,IAAA,MAAM,aAA0B,EAAC;AAEjC,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,aAAA,CAAc,IAAI,CAAA;AAC/C,MAAA,UAAA,CAAW,KAAK,SAAS,CAAA;AAAA,IAC3B;AAEA,IAAA,OAAO,UAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAA,GAA8C;AAClD,IAAA,OAAO,KAAK,aAAA,EAAc;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,IAAA,EAAsC;AAE5D,IAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,IAAA,CAAK,MAAM,MAAM,CAAA;AAEhD,IAAA,MAAM,aAAa,OAAA,CAAQ,UAAA,CAAW,MAAA,EAAQ,IAAI,EAAE,IAAA,EAAK;AACzD,IAAA,OAAOC,UAAAA,CAAW,QAAQ,CAAA,CAAE,MAAA,CAAO,UAAU,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAA,GAAsD;AAC1D,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,aAAA,EAAc;AACvC,IAAA,MAAM,SAAA,uBAAgB,GAAA,EAAoB;AAE1C,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,iBAAA,CAAkB,IAAI,CAAA;AAClD,MAAA,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,QAAQ,CAAA;AAAA,IACnC;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,iBAAiB,WAAA,EAA6B;AACnD,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,MAAM,SAAA,GAAY;AAAA,MAChB,IAAI,WAAA,EAAY;AAAA,MAChB,MAAA,CAAO,IAAI,QAAA,EAAS,GAAI,CAAC,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAAA,MAC1C,OAAO,GAAA,CAAI,OAAA,EAAS,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAAA,MACrC,OAAO,GAAA,CAAI,QAAA,EAAU,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAAA,MACtC,OAAO,GAAA,CAAI,UAAA,EAAY,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAAA,MACxC,OAAO,GAAA,CAAI,UAAA,EAAY,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG;AAAA,KAC1C,CAAE,KAAK,EAAE,CAAA;AAET,IAAA,MAAM,oBAAA,GAAuB,WAAA,CAC1B,WAAA,EAAY,CACZ,UAAA,CAAW,cAAc,GAAG,CAAA,CAC5B,UAAA,CAAW,UAAA,EAAY,EAAE,CAAA;AAE5B,IAAA,OAAO,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,oBAAoB,CAAA,GAAA,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,qBAAqB,IAAA,EAAsB;AAChD,IAAA,OAAO,CAAA;AAAA,cAAA,EACK,IAAI;AAAA,eAAA,EAAA,iBACH,IAAI,IAAA,EAAK,EAAE,WAAA,EAAa;AAAA;;AAAA;;AAAA;AAAA,SAAA,EAM9B,IAAI,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAAA,EAmBb;AACF;;;AClMO,IAAM,eAAN,MAA4C;AAAA,EACxC,OAAA,GAAU,OAAA;AAAA;AAAA;AAAA;AAAA,EAKnB,gBAAgB,IAAA,EAAsB;AACpC,IAAA,OAAO,CAAA,EAAA,EAAK,IAAA,CAAK,UAAA,CAAW,GAAA,EAAK,IAAI,CAAC,CAAA,EAAA,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,KAAA,EAAwB;AACjC,IAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AACzC,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,IAAI,OAAO,UAAU,SAAA,EAAW;AAC9B,MAAA,OAAO,QAAQ,GAAA,GAAM,GAAA;AAAA,IACvB;AACA,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,OAAO,OAAO,KAAK,CAAA;AAAA,IACrB;AACA,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,UAAA,CAAW,GAAA,EAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,IACxC;AACA,IAAA,OAAO,IAAI,MAAA,CAAO,KAAK,EAAE,UAAA,CAAW,GAAA,EAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,UAAA,EAAqC;AAC/C,IAAA,MAAM,QAAkB,EAAC;AAGzB,IAAA,KAAA,MAAW,MAAA,IAAU,WAAW,OAAA,EAAS;AACvC,MAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,MAAM,CAAC,CAAA;AAAA,IACrC;AAGA,IAAA,IAAI,UAAA,CAAW,UAAA,IAAc,UAAA,CAAW,UAAA,CAAW,SAAS,CAAA,EAAG;AAC7D,MAAA,MAAM,SAAA,GAAY,UAAA,CAAW,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,eAAA,CAAgB,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACrF,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgB,SAAS,CAAA,CAAA,CAAG,CAAA;AAAA,IACzC;AAGA,IAAA,KAAA,MAAW,KAAA,IAAS,WAAW,OAAA,EAAS;AACtC,MAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,IACnC;AAGA,IAAA,KAAA,MAAW,EAAA,IAAM,WAAW,WAAA,EAAa;AACvC,MAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,eAAA,CAAgB,EAAE,CAAC,CAAA;AAAA,IACrC;AAEA,IAAA,IAAIX,OAAM,CAAA,aAAA,EAAgB,IAAA,CAAK,eAAA,CAAgB,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA,EAAA,EAAS,KAAA,CAAM,IAAA,CAAK,OAAO,CAAC;AAAA,CAAA,CAAA;AAG3F,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,OAAA,EAAU,UAAA,CAAW,MAAM,CAAA,CAAE,CAAA;AAAA,IAC5C,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,KAAK,eAAe,CAAA;AAAA,IAC9B;AACA,IAAA,IAAI,WAAW,OAAA,EAAS;AACtB,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,gBAAA,EAAmB,UAAA,CAAW,OAAO,CAAA,CAAE,CAAA;AAAA,IACtD,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,KAAK,yBAAyB,CAAA;AAAA,IACxC;AACA,IAAA,IAAI,WAAW,SAAA,EAAW;AACxB,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,QAAA,EAAW,UAAA,CAAW,SAAS,CAAA,CAAE,CAAA;AAAA,IAChD;AACA,IAAA,IAAI,WAAW,OAAA,EAAS;AACtB,MAAA,OAAA,CAAQ,KAAK,CAAA,QAAA,EAAW,IAAA,CAAK,WAAW,UAAA,CAAW,OAAO,CAAC,CAAA,CAAE,CAAA;AAAA,IAC/D;AAEA,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,MAAAA,IAAAA,IAAO,CAAA,CAAA,EAAI,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAAA,IAC9B;AAEA,IAAA,OAAOA,IAAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,SAAA,EAA2B;AACnC,IAAA,OAAO,CAAA,WAAA,EAAc,IAAA,CAAK,eAAA,CAAgB,SAAS,CAAC,CAAA,CAAA;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,SAAA,EAA2B;AAC3C,IAAA,OAAO,CAAA,qBAAA,EAAwB,IAAA,CAAK,eAAA,CAAgB,SAAS,CAAC,CAAA,CAAA;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,CAAY,MAAc,EAAA,EAAoB;AAC5C,IAAA,OAAO,CAAA,aAAA,EAAgB,KAAK,eAAA,CAAgB,IAAI,CAAC,CAAA,IAAA,EAAO,IAAA,CAAK,eAAA,CAAgB,EAAE,CAAC,CAAA,CAAA;AAAA,EAClF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,UAAA,EAA4C;AACrD,IAAA,MAAM,aAAuB,EAAC;AAC9B,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,eAAA,CAAgB,UAAA,CAAW,SAAS,CAAA;AAE3D,IAAA,KAAA,MAAW,EAAA,IAAM,WAAW,UAAA,EAAY;AACtC,MAAA,QAAQ,GAAG,IAAA;AAAM,QACf,KAAK,WAAA,EAAa;AAChB,UAAA,UAAA,CAAW,IAAA,CAAK,eAAe,SAAS,CAAA,YAAA,EAAe,KAAK,WAAA,CAAY,EAAA,CAAG,MAAM,CAAC,CAAA,CAAE,CAAA;AACpF,UAAA;AAAA,QACF;AAAA,QAEA,KAAK,YAAA,EAAc;AACjB,UAAA,UAAA,CAAW,IAAA,CAAK,eAAe,SAAS,CAAA,aAAA,EAAgB,KAAK,eAAA,CAAgB,EAAA,CAAG,IAAI,CAAC,CAAA,CAAE,CAAA;AACvF,UAAA;AAAA,QACF;AAAA,QAEA,KAAK,cAAA,EAAgB;AACnB,UAAA,UAAA,CAAW,IAAA;AAAA,YACT,CAAA,YAAA,EAAe,SAAS,CAAA,eAAA,EAAkB,IAAA,CAAK,eAAA,CAAgB,EAAA,CAAG,IAAI,CAAC,CAAA,IAAA,EAAO,IAAA,CAAK,eAAA,CAAgB,EAAA,CAAG,EAAE,CAAC,CAAA;AAAA,WAC3G;AACA,UAAA;AAAA,QACF;AAAA,QAEA,KAAK,cAAA,EAAgB;AACnB,UAAA,UAAA,CAAW,IAAA,CAAK,eAAe,SAAS,CAAA,eAAA,EAAkB,KAAK,WAAA,CAAY,EAAA,CAAG,MAAM,CAAC,CAAA,CAAE,CAAA;AACvF,UAAA;AAAA,QACF;AAAA,QAEA,KAAK,UAAA,EAAY;AACf,UAAA,UAAA,CAAW,IAAA,CAAK,eAAe,SAAS,CAAA,KAAA,EAAQ,KAAK,UAAA,CAAW,EAAA,CAAG,KAAK,CAAC,CAAA,CAAE,CAAA;AAC3E,UAAA;AAAA,QACF;AAAA,QAEA,KAAK,WAAA,EAAa;AAChB,UAAA,UAAA,CAAW,IAAA,CAAK,eAAe,SAAS,CAAA,YAAA,EAAe,KAAK,eAAA,CAAgB,EAAA,CAAG,IAAI,CAAC,CAAA,CAAE,CAAA;AACtF,UAAA;AAAA,QACF;AAAA,QAEA,KAAK,eAAA,EAAiB;AACpB,UAAA,UAAA,CAAW,IAAA,CAAK,eAAe,SAAS,CAAA,KAAA,EAAQ,KAAK,eAAA,CAAgB,EAAA,CAAG,UAAU,CAAC,CAAA,CAAE,CAAA;AACrF,UAAA;AAAA,QACF;AAAA,QAEA,KAAK,gBAAA,EAAkB;AACrB,UAAA,UAAA,CAAW,IAAA;AAAA,YACT,eAAe,SAAS,CAAA,kBAAA,EAAqB,KAAK,eAAA,CAAgB,EAAA,CAAG,IAAI,CAAC,CAAA;AAAA,WAC5E;AACA,UAAA;AAAA,QACF;AAAA,QAEA,KAAK,YAAA,EAAc;AACjB,UAAA,MAAM,MAAA,GAAS,EAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,eAAA,CAAgB,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACvE,UAAA,UAAA,CAAW,IAAA,CAAK,CAAA,YAAA,EAAe,SAAS,CAAA,kBAAA,EAAqB,MAAM,CAAA,CAAA,CAAG,CAAA;AACtE,UAAA;AAAA,QACF;AAAA,QAEA,KAAK,aAAA,EAAe;AAClB,UAAA,UAAA,CAAW,IAAA,CAAK,CAAA,YAAA,EAAe,SAAS,CAAA,iBAAA,CAAmB,CAAA;AAC3D,UAAA;AAAA,QACF;AAAA;AACF,IACF;AAEA,IAAA,OAAO,UAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,SAAA,EAA2B;AAClC,IAAA,OAAO,CAAA,yFAAA,EAA4F,IAAA,CAAK,UAAA,CAAW,SAAS,CAAC,CAAA,QAAA,CAAA;AAAA,EAC/H;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,CAAU,WAAmB,UAAA,EAA4B;AACvD,IAAA,OAAO,CAAA,0FAAA,EAA6F,KAAK,UAAA,CAAW,SAAS,CAAC,CAAA,mBAAA,EAAsB,IAAA,CAAK,UAAA,CAAW,UAAU,CAAC,CAAA,QAAA,CAAA;AAAA,EACjL;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,MAAA,EAAkC;AACpD,IAAA,MAAM,QAAkB,CAAC,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,IAAI,CAAC,CAAA;AAG1D,IAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,eAAA,CAAgB,MAAM,CAAC,CAAA;AAGvC,IAAA,IAAI,OAAO,QAAA,EAAU;AACnB,MAAA,KAAA,CAAM,KAAK,UAAU,CAAA;AAAA,IACvB;AAGA,IAAA,IAAI,OAAO,QAAA,EAAU;AACnB,MAAA,KAAA,CAAM,KAAK,MAAM,CAAA;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,KAAK,UAAU,CAAA;AAAA,IACvB;AAGA,IAAA,IAAI,OAAO,UAAA,EAAY;AACrB,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,MAAA,CAAO,UAAU,CAAA,CAAE,CAAA;AAAA,IAC3C,CAAA,MAAA,IAAW,MAAA,CAAO,YAAA,KAAiB,MAAA,EAAW;AAC5C,MAAA,KAAA,CAAM,KAAK,CAAA,QAAA,EAAW,IAAA,CAAK,WAAW,MAAA,CAAO,YAAY,CAAC,CAAA,CAAE,CAAA;AAAA,IAC9D;AAGA,IAAA,IAAI,OAAO,aAAA,EAAe;AACxB,MAAA,KAAA,CAAM,KAAK,gBAAgB,CAAA;AAAA,IAC7B;AAGA,IAAA,IAAI,MAAA,CAAO,OAAA,IAAW,CAAC,MAAA,CAAO,aAAA,EAAe;AAC3C,MAAA,KAAA,CAAM,KAAK,aAAa,CAAA;AAAA,IAC1B,CAAA,MAAA,IAAW,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,aAAA,EAAe;AACjD,MAAA,KAAA,CAAM,KAAK,aAAa,CAAA;AAAA,IAC1B;AAGA,IAAA,IAAI,MAAA,CAAO,MAAA,IAAU,CAAC,MAAA,CAAO,OAAA,EAAS;AACpC,MAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AAAA,IACrB;AAGA,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,KAAA,CAAM,KAAK,CAAA,QAAA,EAAW,IAAA,CAAK,WAAW,MAAA,CAAO,OAAO,CAAC,CAAA,CAAE,CAAA;AAAA,IACzD;AAGA,IAAA,IAAI,OAAO,KAAA,EAAO;AAChB,MAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAAA,IACpB,CAAA,MAAA,IAAW,OAAO,KAAA,EAAO;AACvB,MAAA,KAAA,CAAM,KAAK,CAAA,MAAA,EAAS,IAAA,CAAK,gBAAgB,MAAA,CAAO,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,IAC1D;AAEA,IAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,MAAA,EAAkC;AACxD,IAAA,QAAQ,OAAO,IAAA;AAAM,MACnB,KAAK,YAAA,EAAc;AACjB,QAAA,OAAO,6BAAA;AAAA,MACT;AAAA,MACA,KAAK,eAAA,EAAiB;AACpB,QAAA,OAAO,gCAAA;AAAA,MACT;AAAA,MACA,KAAK,SAAA,EAAW;AACd,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,MACA,KAAK,YAAA,EAAc;AACjB,QAAA,OAAO,QAAA;AAAA,MACT;AAAA,MACA,KAAK,cAAA,EAAgB;AACnB,QAAA,OAAO,UAAA;AAAA,MACT;AAAA,MACA,KAAK,aAAA,EAAe;AAClB,QAAA,OAAO,SAAA;AAAA,MACT;AAAA,MACA,KAAK,OAAA,EAAS;AACZ,QAAA,OAAO,OAAA;AAAA,MACT;AAAA,MACA,KAAK,QAAA,EAAU;AACb,QAAA,OAAO,QAAA;AAAA,MACT;AAAA,MACA,KAAK,SAAA,EAAW;AACd,QAAA,MAAM,SAAA,GAAY,OAAO,SAAA,IAAa,EAAA;AACtC,QAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,IAAS,CAAA;AAC9B,QAAA,OAAO,CAAA,QAAA,EAAW,SAAS,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAA;AAAA,MACtC;AAAA,MACA,KAAK,QAAA,EAAU;AACb,QAAA,OAAO,CAAA,QAAA,EAAW,MAAA,CAAO,MAAA,IAAU,GAAG,CAAA,CAAA,CAAA;AAAA,MACxC;AAAA,MACA,KAAK,MAAA,EAAQ;AACX,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,MACA,KAAK,YAAA,EAAc;AACjB,QAAA,OAAO,YAAA;AAAA,MACT;AAAA,MACA,KAAK,UAAA,EAAY;AACf,QAAA,OAAO,UAAA;AAAA,MACT;AAAA,MACA,KAAK,SAAA,EAAW;AACd,QAAA,OAAO,YAAA;AAAA,MACT;AAAA,MACA,KAAK,MAAA,EAAQ;AACX,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,MACA,KAAK,UAAA,EAAY;AACf,QAAA,OAAO,UAAA;AAAA,MACT;AAAA,MACA,KAAK,WAAA,EAAa;AAChB,QAAA,OAAO,WAAA;AAAA,MACT;AAAA,MACA,KAAK,MAAA,EAAQ;AACX,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,MACA,KAAK,MAAA;AAAA,MACL,KAAK,OAAA,EAAS;AACZ,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,MACA,KAAK,MAAA,EAAQ;AACX,QAAA,OAAO,UAAA;AAAA,MACT;AAAA,MACA,KAAK,QAAA,EAAU;AACb,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,MACA,KAAK,MAAA,EAAQ;AACX,QAAA,IAAI,MAAA,CAAO,UAAA,IAAc,MAAA,CAAO,UAAA,CAAW,SAAS,CAAA,EAAG;AACrD,UAAA,MAAM,MAAA,GAAS,MAAA,CAAO,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,UAAA,CAAW,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACzE,UAAA,OAAO,QAAQ,MAAM,CAAA,CAAA,CAAA;AAAA,QACvB;AACA,QAAA,OAAO,cAAA;AAAA,MACT;AAAA,MACA,SAAS;AACP,QAAA,OAAO,cAAA;AAAA,MACT;AAAA;AACF,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAW,KAAA,EAAgC;AACjD,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,eAAA,CAAgB,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAC3E,IAAA,MAAM,OAAO,KAAA,CAAM,IAAA,GAAO,KAAK,eAAA,CAAgB,KAAA,CAAM,IAAI,CAAA,GAAI,EAAA;AAE7D,IAAA,IAAI,KAAA,CAAM,SAAS,UAAA,EAAY;AAC7B,MAAA,OAAO,CAAA,eAAA,EAAkB,IAAI,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,CAAA;AAAA,IAC3C;AAEA,IAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,MAAA,OAAO,CAAA,aAAA,EAAgB,IAAI,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,CAAA;AAAA,IACzC;AAEA,IAAA,OAAO,CAAA,MAAA,EAAS,IAAI,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,EAAA,EAAkC;AACxD,IAAA,MAAM,KAAA,GAAkB,CAAC,YAAY,CAAA;AAErC,IAAA,IAAI,GAAG,IAAA,EAAM;AACX,MAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,eAAA,CAAgB,EAAA,CAAG,IAAI,CAAC,CAAA;AAAA,IAC1C;AAEA,IAAA,KAAA,CAAM,KAAK,CAAA,aAAA,EAAgB,IAAA,CAAK,gBAAgB,EAAA,CAAG,MAAM,CAAC,CAAA,CAAA,CAAG,CAAA;AAC7D,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,WAAA,EAAc,IAAA,CAAK,eAAA,CAAgB,EAAA,CAAG,KAAK,CAAC,CAAA,EAAA,EAAK,IAAA,CAAK,eAAA,CAAgB,EAAA,CAAG,eAAe,CAAC,CAAA,CAAA;AAAA,KAC3F;AAEA,IAAA,IAAI,GAAG,QAAA,EAAU;AACf,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,UAAA,EAAa,EAAA,CAAG,QAAQ,CAAA,CAAE,CAAA;AAAA,IACvC;AAEA,IAAA,IAAI,GAAG,QAAA,EAAU;AACf,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,UAAA,EAAa,EAAA,CAAG,QAAQ,CAAA,CAAE,CAAA;AAAA,IACvC;AAEA,IAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,EACvB;AACF;;;ACvXO,IAAM,oBAAN,MAAiD;AAAA,EAC7C,OAAA,GAAU,YAAA;AAAA;AAAA;AAAA;AAAA,EAKnB,gBAAgB,IAAA,EAAsB;AACpC,IAAA,OAAO,CAAA,CAAA,EAAI,IAAA,CAAK,UAAA,CAAW,GAAA,EAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,KAAA,EAAwB;AACjC,IAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AACzC,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,IAAI,OAAO,UAAU,SAAA,EAAW;AAC9B,MAAA,OAAO,QAAQ,MAAA,GAAS,OAAA;AAAA,IAC1B;AACA,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,OAAO,OAAO,KAAK,CAAA;AAAA,IACrB;AACA,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,UAAA,CAAW,GAAA,EAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,IACxC;AACA,IAAA,OAAO,IAAI,MAAA,CAAO,KAAK,EAAE,UAAA,CAAW,GAAA,EAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,UAAA,EAAqC;AAC/C,IAAA,MAAM,QAAkB,EAAC;AAGzB,IAAA,KAAA,MAAW,MAAA,IAAU,WAAW,OAAA,EAAS;AACvC,MAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,MAAM,CAAC,CAAA;AAAA,IACrC;AAGA,IAAA,IAAI,UAAA,CAAW,UAAA,IAAc,UAAA,CAAW,UAAA,CAAW,SAAS,CAAA,EAAG;AAC7D,MAAA,MAAM,SAAA,GAAY,UAAA,CAAW,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,eAAA,CAAgB,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACrF,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgB,SAAS,CAAA,CAAA,CAAG,CAAA;AAAA,IACzC;AAGA,IAAA,KAAA,MAAW,EAAA,IAAM,WAAW,WAAA,EAAa;AACvC,MAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,eAAA,CAAgB,EAAE,CAAC,CAAA;AAAA,IACrC;AAEA,IAAA,MAAMA,OAAM,CAAA,aAAA,EAAgB,IAAA,CAAK,eAAA,CAAgB,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA,EAAA,EAAS,KAAA,CAAM,IAAA,CAAK,OAAO,CAAC;AAAA,CAAA,CAAA;AAG7F,IAAA,MAAM,UAAA,GAAa,CAACA,IAAG,CAAA;AACvB,IAAA,IAAI,WAAW,OAAA,EAAS;AACtB,MAAA,UAAA,CAAW,IAAA;AAAA,QACT,CAAA,iBAAA,EAAoB,IAAA,CAAK,eAAA,CAAgB,UAAA,CAAW,IAAI,CAAC,CAAA,IAAA,EAAO,IAAA,CAAK,UAAA,CAAW,UAAA,CAAW,OAAO,CAAC,CAAA;AAAA,OACrG;AAAA,IACF;AAKA,IAAA,OAAO,UAAA,CAAW,KAAK,KAAK,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,SAAA,EAA2B;AACnC,IAAA,OAAO,CAAA,WAAA,EAAc,IAAA,CAAK,eAAA,CAAgB,SAAS,CAAC,CAAA,CAAA;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,SAAA,EAA2B;AAC3C,IAAA,OAAO,CAAA,qBAAA,EAAwB,IAAA,CAAK,eAAA,CAAgB,SAAS,CAAC,CAAA,CAAA;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,CAAY,MAAc,EAAA,EAAoB;AAC5C,IAAA,OAAO,CAAA,YAAA,EAAe,KAAK,eAAA,CAAgB,IAAI,CAAC,CAAA,WAAA,EAAc,IAAA,CAAK,eAAA,CAAgB,EAAE,CAAC,CAAA,CAAA;AAAA,EACxF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,UAAA,EAA4C;AACrD,IAAA,MAAM,aAAuB,EAAC;AAC9B,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,eAAA,CAAgB,UAAA,CAAW,SAAS,CAAA;AAE3D,IAAA,KAAA,MAAW,EAAA,IAAM,WAAW,UAAA,EAAY;AACtC,MAAA,QAAQ,GAAG,IAAA;AAAM,QACf,KAAK,WAAA,EAAa;AAChB,UAAA,UAAA,CAAW,IAAA,CAAK,eAAe,SAAS,CAAA,YAAA,EAAe,KAAK,WAAA,CAAY,EAAA,CAAG,MAAM,CAAC,CAAA,CAAE,CAAA;AACpF,UAAA;AAAA,QACF;AAAA,QAEA,KAAK,YAAA,EAAc;AACjB,UAAA,UAAA,CAAW,IAAA,CAAK,eAAe,SAAS,CAAA,aAAA,EAAgB,KAAK,eAAA,CAAgB,EAAA,CAAG,IAAI,CAAC,CAAA,CAAE,CAAA;AACvF,UAAA;AAAA,QACF;AAAA,QAEA,KAAK,cAAA,EAAgB;AACnB,UAAA,UAAA,CAAW,IAAA;AAAA,YACT,CAAA,YAAA,EAAe,SAAS,CAAA,eAAA,EAAkB,IAAA,CAAK,eAAA,CAAgB,EAAA,CAAG,IAAI,CAAC,CAAA,IAAA,EAAO,IAAA,CAAK,eAAA,CAAgB,EAAA,CAAG,EAAE,CAAC,CAAA;AAAA,WAC3G;AACA,UAAA;AAAA,QACF;AAAA,QAEA,KAAK,cAAA,EAAgB;AAEnB,UAAA,MAAM,MAAM,EAAA,CAAG,MAAA;AAGf,UAAA,UAAA,CAAW,IAAA;AAAA,YACT,CAAA,YAAA,EAAe,SAAS,CAAA,cAAA,EAAiB,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,IAAI,CAAC,CAAA,MAAA,EAAS,IAAA,CAAK,eAAA,CAAgB,GAAG,CAAC,CAAA;AAAA,WAC3G;AAGA,UAAA,IAAI,IAAI,QAAA,EAAU;AAChB,YAAA,UAAA,CAAW,IAAA;AAAA,cACT,eAAe,SAAS,CAAA,cAAA,EAAiB,KAAK,eAAA,CAAgB,GAAA,CAAI,IAAI,CAAC,CAAA,cAAA;AAAA,aACzE;AAAA,UACF,CAAA,MAAO;AACL,YAAA,UAAA,CAAW,IAAA;AAAA,cACT,eAAe,SAAS,CAAA,cAAA,EAAiB,KAAK,eAAA,CAAgB,GAAA,CAAI,IAAI,CAAC,CAAA,aAAA;AAAA,aACzE;AAAA,UACF;AAGA,UAAA,IAAI,IAAI,UAAA,EAAY;AAClB,YAAA,UAAA,CAAW,IAAA;AAAA,cACT,CAAA,YAAA,EAAe,SAAS,CAAA,cAAA,EAAiB,IAAA,CAAK,eAAA,CAAgB,IAAI,IAAI,CAAC,CAAA,aAAA,EAAgB,GAAA,CAAI,UAAU,CAAA;AAAA,aACvG;AAAA,UACF,CAAA,MAAA,IAAW,GAAA,CAAI,YAAA,KAAiB,MAAA,EAAW;AACzC,YAAA,UAAA,CAAW,IAAA;AAAA,cACT,CAAA,YAAA,EAAe,SAAS,CAAA,cAAA,EAAiB,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,IAAI,CAAC,CAAA,aAAA,EAAgB,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,YAAY,CAAC,CAAA;AAAA,aAC1H;AAAA,UACF;AACA,UAAA;AAAA,QACF;AAAA,QAEA,KAAK,UAAA,EAAY;AACf,UAAA,UAAA,CAAW,KAAK,IAAA,CAAK,WAAA,CAAY,WAAW,SAAA,EAAW,EAAA,CAAG,KAAK,CAAC,CAAA;AAChE,UAAA;AAAA,QACF;AAAA,QAEA,KAAK,WAAA,EAAa;AAChB,UAAA,UAAA,CAAW,KAAK,CAAA,WAAA,EAAc,IAAA,CAAK,gBAAgB,EAAA,CAAG,IAAI,CAAC,CAAA,CAAE,CAAA;AAC7D,UAAA;AAAA,QACF;AAAA,QAEA,KAAK,eAAA,EAAiB;AACpB,UAAA,UAAA,CAAW,IAAA,CAAK,eAAe,SAAS,CAAA,KAAA,EAAQ,KAAK,eAAA,CAAgB,EAAA,CAAG,UAAU,CAAC,CAAA,CAAE,CAAA;AACrF,UAAA;AAAA,QACF;AAAA,QAEA,KAAK,gBAAA,EAAkB;AACrB,UAAA,UAAA,CAAW,IAAA;AAAA,YACT,eAAe,SAAS,CAAA,iBAAA,EAAoB,KAAK,eAAA,CAAgB,EAAA,CAAG,IAAI,CAAC,CAAA;AAAA,WAC3E;AACA,UAAA;AAAA,QACF;AAAA,QAEA,KAAK,YAAA,EAAc;AACjB,UAAA,MAAM,MAAA,GAAS,EAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,eAAA,CAAgB,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACvE,UAAA,UAAA,CAAW,IAAA,CAAK,CAAA,YAAA,EAAe,SAAS,CAAA,kBAAA,EAAqB,MAAM,CAAA,CAAA,CAAG,CAAA;AACtE,UAAA;AAAA,QACF;AAAA,QAEA,KAAK,aAAA,EAAe;AAElB,UAAA,UAAA,CAAW,IAAA;AAAA,YACT,CAAA,YAAA,EAAe,SAAS,CAAA,iBAAA,EAAoB,IAAA,CAAK,gBAAgB,CAAA,EAAG,UAAA,CAAW,SAAS,CAAA,KAAA,CAAO,CAAC,CAAA;AAAA,WAClG;AACA,UAAA;AAAA,QACF;AAAA;AACF,IACF;AAEA,IAAA,OAAO,UAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,SAAA,EAA2B;AAClC,IAAA,OAAO,CAAA,uFAAA,EAA0F,IAAA,CAAK,UAAA,CAAW,SAAS,CAAC,CAAA,QAAA,CAAA;AAAA,EAC7H;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,CAAU,WAAmB,UAAA,EAA4B;AACvD,IAAA,OAAO,CAAA,wFAAA,EAA2F,KAAK,UAAA,CAAW,SAAS,CAAC,CAAA,mBAAA,EAAsB,IAAA,CAAK,UAAA,CAAW,UAAU,CAAC,CAAA,QAAA,CAAA;AAAA,EAC/K;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,CAAY,WAAmB,KAAA,EAAgC;AAC7D,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,eAAA,CAAgB,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAC3E,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,IAAA,IAAQ,CAAA,IAAA,EAAO,SAAS,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAC3E,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,GAAS,SAAA,GAAY,EAAA;AAE1C,IAAA,OAAO,CAAA,OAAA,EAAU,MAAM,CAAA,MAAA,EAAS,IAAA,CAAK,eAAA,CAAgB,SAAS,CAAC,CAAA,IAAA,EAAO,IAAA,CAAK,eAAA,CAAgB,SAAS,CAAC,KAAK,OAAO,CAAA,CAAA,CAAA;AAAA,EACnH;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,MAAA,EAAkC;AACpD,IAAA,MAAM,QAAkB,CAAC,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,IAAI,CAAC,CAAA;AAG1D,IAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,eAAA,CAAgB,MAAM,CAAC,CAAA;AAGvC,IAAA,IAAI,CAAC,OAAO,QAAA,EAAU;AACpB,MAAA,KAAA,CAAM,KAAK,UAAU,CAAA;AAAA,IACvB;AAGA,IAAA,IAAI,OAAO,UAAA,EAAY;AACrB,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,MAAA,CAAO,UAAU,CAAA,CAAE,CAAA;AAAA,IAC3C,CAAA,MAAA,IAAW,MAAA,CAAO,YAAA,KAAiB,MAAA,EAAW;AAC5C,MAAA,KAAA,CAAM,KAAK,CAAA,QAAA,EAAW,IAAA,CAAK,WAAW,MAAA,CAAO,YAAY,CAAC,CAAA,CAAE,CAAA;AAAA,IAC9D;AAGA,IAAA,IAAI,OAAO,OAAA,IAAW,MAAA,CAAO,SAAS,YAAA,IAAgB,MAAA,CAAO,SAAS,eAAA,EAAiB;AACrF,MAAA,KAAA,CAAM,KAAK,aAAa,CAAA;AAAA,IAC1B;AAGA,IAAA,IAAI,MAAA,CAAO,MAAA,IAAU,CAAC,MAAA,CAAO,OAAA,EAAS;AACpC,MAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AAAA,IACrB;AAEA,IAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,MAAA,EAAkC;AACxD,IAAA,QAAQ,OAAO,IAAA;AAAM,MACnB,KAAK,YAAA,EAAc;AACjB,QAAA,OAAO,oBAAA;AAAA,MACT;AAAA,MACA,KAAK,eAAA,EAAiB;AACpB,QAAA,OAAO,uBAAA;AAAA,MACT;AAAA,MACA,KAAK,SAAA,EAAW;AACd,QAAA,OAAO,SAAA;AAAA,MACT;AAAA,MACA,KAAK,YAAA,EAAc;AACjB,QAAA,OAAO,QAAA;AAAA,MACT;AAAA,MACA,KAAK,cAAA,EAAgB;AACnB,QAAA,OAAO,UAAA;AAAA,MACT;AAAA,MACA,KAAK,aAAA,EAAe;AAClB,QAAA,OAAO,UAAA;AAAA,MACT;AAAA;AAAA,MACA,KAAK,OAAA,EAAS;AACZ,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,MACA,KAAK,QAAA,EAAU;AACb,QAAA,OAAO,kBAAA;AAAA,MACT;AAAA,MACA,KAAK,SAAA,EAAW;AACd,QAAA,MAAM,SAAA,GAAY,OAAO,SAAA,IAAa,EAAA;AACtC,QAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,IAAS,CAAA;AAC9B,QAAA,OAAO,CAAA,QAAA,EAAW,SAAS,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAA;AAAA,MACtC;AAAA,MACA,KAAK,QAAA,EAAU;AACb,QAAA,OAAO,CAAA,QAAA,EAAW,MAAA,CAAO,MAAA,IAAU,GAAG,CAAA,CAAA,CAAA;AAAA,MACxC;AAAA,MACA,KAAK,MAAA;AAAA,MACL,KAAK,YAAA;AAAA,MACL,KAAK,UAAA,EAAY;AACf,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,MACA,KAAK,SAAA,EAAW;AACd,QAAA,OAAO,SAAA;AAAA,MACT;AAAA,MACA,KAAK,MAAA,EAAQ;AACX,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,MACA,KAAK,UAAA;AAAA,MACL,KAAK,WAAA,EAAa;AAChB,QAAA,OAAO,WAAA;AAAA,MACT;AAAA,MACA,KAAK,MAAA,EAAQ;AACX,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,MACA,KAAK,MAAA,EAAQ;AACX,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,MACA,KAAK,OAAA,EAAS;AACZ,QAAA,OAAO,OAAA;AAAA,MACT;AAAA,MACA,KAAK,MAAA,EAAQ;AACX,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,MACA,KAAK,QAAA,EAAU;AACb,QAAA,OAAO,OAAA;AAAA,MACT;AAAA,MACA,KAAK,MAAA,EAAQ;AAGX,QAAA,IAAI,MAAA,CAAO,UAAA,IAAc,MAAA,CAAO,UAAA,CAAW,SAAS,CAAA,EAAG;AACrD,UAAA,MAAM,MAAA,GAAS,MAAA,CAAO,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,UAAA,CAAW,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACzE,UAAA,OAAO,uBAAuB,IAAA,CAAK,eAAA,CAAgB,OAAO,IAAI,CAAC,QAAQ,MAAM,CAAA,EAAA,CAAA;AAAA,QAC/E;AACA,QAAA,OAAO,cAAA;AAAA,MACT;AAAA,MACA,SAAS;AACP,QAAA,OAAO,cAAA;AAAA,MACT;AAAA;AACF,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,EAAA,EAAkC;AACxD,IAAA,MAAM,KAAA,GAAkB,CAAC,YAAY,CAAA;AAErC,IAAA,IAAI,GAAG,IAAA,EAAM;AACX,MAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,eAAA,CAAgB,EAAA,CAAG,IAAI,CAAC,CAAA;AAAA,IAC1C,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,eAAA,CAAgB,CAAA,GAAA,EAAM,EAAA,CAAG,MAAM,CAAA,CAAA,EAAI,EAAA,CAAG,KAAK,CAAA,CAAE,CAAC,CAAA;AAAA,IAChE;AAEA,IAAA,KAAA,CAAM,KAAK,CAAA,aAAA,EAAgB,IAAA,CAAK,gBAAgB,EAAA,CAAG,MAAM,CAAC,CAAA,CAAA,CAAG,CAAA;AAC7D,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,WAAA,EAAc,IAAA,CAAK,eAAA,CAAgB,EAAA,CAAG,KAAK,CAAC,CAAA,EAAA,EAAK,IAAA,CAAK,eAAA,CAAgB,EAAA,CAAG,eAAe,CAAC,CAAA,CAAA;AAAA,KAC3F;AAEA,IAAA,IAAI,GAAG,QAAA,EAAU;AACf,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,UAAA,EAAa,EAAA,CAAG,QAAQ,CAAA,CAAE,CAAA;AAAA,IACvC;AAEA,IAAA,IAAI,GAAG,QAAA,EAAU;AACf,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,UAAA,EAAa,EAAA,CAAG,QAAQ,CAAA,CAAE,CAAA;AAAA,IACvC;AAEA,IAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,EACvB;AACF;;;AC/VO,IAAM,gBAAN,MAAoB;AAAA,EACjB,OAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA,GAAoB,KAAA;AAAA,EAE5B,WAAA,CAAY,SAA0B,OAAA,EAA+B;AACnE,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,SAAA,GAAY,QAAQ,SAAA,IAAa,oBAAA;AACtC,IAAA,IAAA,CAAK,OAAA,GAAU,QAAQ,OAAA,IAAW,GAAA;AAClC,IAAA,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG,QAAA,EAAU,CAAA,CAAA,EAAI,QAAQ,GAAG,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AAExD,IAAA,IAAA,CAAK,OAAA,GAAU,QAAQ,OAAA,KAAY,OAAA,GAAU,IAAI,YAAA,EAAa,GAAI,IAAI,iBAAA,EAAkB;AAAA,EAC1F;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,GAA4B;AAChC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,eAAA,CAAgB,KAAK,SAAS,CAAA;AAE7D,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,OAAA,KAAY,OAAA,EAAS;AACpC,MAAA,MAAM,IAAA,CAAK,QAAQ,OAAA,CAAQ;AAAA,mCAAA,EACI,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAMvC,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,MAAM,IAAA,CAAK,QAAQ,OAAA,CAAQ;AAAA,mCAAA,EACI,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAMvC,CAAA;AAAA,IACH;AAGA,IAAA,MAAM,QAAA,GACJ,KAAK,OAAA,CAAQ,OAAA,KAAY,UACrB,CAAA,cAAA,EAAiB,SAAS,CAAA,aAAA,CAAA,GAC1B,CAAA,cAAA,EAAiB,SAAS,CAAA,aAAA,CAAA;AAEhC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,QAAQ,CAAA;AAEhD,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AAC5B,MAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,OAAA,KAAY,OAAA,EAAS;AACpC,QAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,CAAA,YAAA,EAAe,SAAS,CAAA,8BAAA,CAAgC,CAAA;AAAA,MACrF,CAAA,MAAO;AACL,QAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,CAAA,YAAA,EAAe,SAAS,CAAA,kCAAA,CAAoC,CAAA;AAAA,MACzF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,GAA4B;AAChC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,eAAA,CAAgB,KAAK,SAAS,CAAA;AAC7D,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA,GAAY,KAAK,OAAA,EAAS;AAC5C,MAAA,IAAI;AAEF,QAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,OAAA,KAAY,OAAA,EAAS;AACpC,UAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA;AAAA,YAChC;AAAA,mBAAA,EACS,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAAA;AAAA,YAMlB,CAAC,KAAK,MAAM;AAAA,WACd;AAEA,UAAA,IAAA,CAAK,MAAA,CAAO,YAAA,IAAgB,CAAA,IAAK,CAAA,EAAG;AAClC,YAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,YAAA,OAAO,IAAA;AAAA,UACT;AAAA,QACF,CAAA,MAAO;AACL,UAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA;AAAA,YAChC;AAAA,mBAAA,EACS,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAAA;AAAA,YAOlB,CAAC,KAAK,MAAM;AAAA,WACd;AAEA,UAAA,IAAI,MAAA,CAAO,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AAC1B,YAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,YAAA,OAAO,IAAA;AAAA,UACT;AAAA,QACF;AAGA,QAAA,MAAM,cAAc,MAAM,IAAA,CAAK,QAAQ,KAAA,CAGpC,CAAA,iCAAA,EAAoC,SAAS,CAAA,aAAA,CAAe,CAAA;AAE/D,QAAA,IAAI,WAAA,CAAY,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AAC/B,UAAA,MAAM,QAAA,GAAW,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,CAAG,SAAA;AACtC,UAAA,IAAI,QAAA,IAAY,IAAA,CAAK,GAAA,EAAI,GAAI,IAAI,IAAA,CAAK,QAAQ,CAAA,CAAE,OAAA,EAAQ,GAAI,IAAA,CAAK,OAAA,EAAS;AAExE,YAAA,OAAA,CAAQ,IAAA;AAAA,cACN,CAAA,uCAAA,EAA0C,WAAA,CAAY,IAAA,CAAK,CAAC,EAAG,SAAS,CAAA;AAAA,aAC1E;AACA,YAAA,MAAM,KAAK,YAAA,EAAa;AACxB,YAAA;AAAA,UACF;AAAA,QACF;AAGA,QAAA,MAAM,IAAA,CAAK,MAAM,GAAI,CAAA;AAAA,MACvB,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,KAAK,CAAA;AACtD,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,eAAA,CAAgB,KAAK,SAAS,CAAA;AAE7D,IAAA,IAAI;AACF,MAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,OAAA,KAAY,OAAA,EAAS;AACpC,QAAA,MAAM,KAAK,OAAA,CAAQ,OAAA;AAAA,UACjB;AAAA,iBAAA,EACS,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA;AAAA,UAMlB,CAAC,KAAK,MAAM;AAAA,SACd;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM,KAAK,OAAA,CAAQ,OAAA;AAAA,UACjB;AAAA,iBAAA,EACS,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA;AAAA,UAMlB,CAAC,KAAK,MAAM;AAAA,SACd;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,IAClB,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,KAAK,CAAA;AACtD,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,GAA8B;AAClC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,eAAA,CAAgB,KAAK,SAAS,CAAA;AAE7D,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,OAAA,KAAY,OAAA,EAAS;AACpC,MAAA,MAAM,IAAA,CAAK,QAAQ,OAAA,CAAQ;AAAA,eAAA,EAChB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAKnB,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,MAAM,IAAA,CAAK,QAAQ,OAAA,CAAQ;AAAA,eAAA,EAChB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAKnB,CAAA;AAAA,IACH;AAEA,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,GAA2B;AAC/B,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,eAAA,CAAgB,KAAK,SAAS,CAAA;AAC7D,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAA;AAAA,MAChC,yBAAyB,SAAS,CAAA,aAAA;AAAA,KACpC;AAEA,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AAC5B,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,CAAG,SAAA;AACjC,IAAA,OAAO,QAAA,KAAa,KAAK,QAAA,KAAa,IAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,GAIH;AACD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,eAAA,CAAgB,KAAK,SAAS,CAAA;AAC7D,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,QAAQ,KAAA,CAI/B,CAAA,4CAAA,EAA+C,SAAS,CAAA,aAAA,CAAe,CAAA;AAE1E,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AAC5B,MAAA,OAAO,EAAE,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,IAAA,EAAM,UAAU,IAAA,EAAK;AAAA,IAC3D;AAEA,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA;AACzB,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,GAAA,CAAI,SAAA,KAAc,CAAA,IAAK,IAAI,SAAA,KAAc,IAAA;AAAA,MACnD,UAAU,GAAA,CAAI,SAAA;AAAA,MACd,UAAU,GAAA,CAAI;AAAA,KAChB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAY,EAAA,EAAkC;AAClD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,EAAQ;AACpC,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,wCAAA,EAA2C,KAAK,OAAO,CAAA,qCAAA;AAAA,OACzD;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,EAAA,EAAG;AAAA,IAClB,CAAA,SAAE;AACA,MAAA,MAAM,KAAK,OAAA,EAAQ;AAAA,IACrB;AAAA,EACF;AAAA,EAEQ,MAAM,EAAA,EAA2B;AACvC,IAAA,OAAO,IAAI,OAAA,CAAQ,CAACE,aAAY,UAAA,CAAWA,QAAAA,EAAS,EAAE,CAAC,CAAA;AAAA,EACzD;AACF;;;ACxRO,IAAM,gBAAN,MAAoB;AAAA,EACjB,UAAA;AAAA,EAER,WAAA,CAAY,MAAc,IAAA,EAAkB;AAC1C,IAAA,IAAA,CAAK,UAAA,GAAa;AAAA,MAChB,IAAA;AAAA,MACA,IAAA;AAAA,MACA,QAAA,EAAU,IAAA,KAAS,YAAA,IAAgB,IAAA,KAAS,eAAA;AAAA,MAC5C,QAAA,EAAU,KAAA;AAAA,MACV,aAAA,EAAe,IAAA,KAAS,YAAA,IAAgB,IAAA,KAAS,eAAA;AAAA,MACjD,OAAA,EAAS,IAAA,KAAS,YAAA,IAAgB,IAAA,KAAS,eAAA;AAAA,MAC3C,MAAA,EAAQ,KAAA;AAAA,MACR,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,MAAA,EAAsB;AAC3B,IAAA,IAAA,CAAK,WAAW,MAAA,GAAS,MAAA;AACzB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,CAAU,WAAmB,KAAA,EAAsB;AACjD,IAAA,IAAA,CAAK,WAAW,SAAA,GAAY,SAAA;AAC5B,IAAA,IAAA,CAAK,WAAW,KAAA,GAAQ,KAAA;AACxB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAAiB;AACf,IAAA,IAAA,CAAK,WAAW,QAAA,GAAW,IAAA;AAC3B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,WAAW,QAAA,GAAW,KAAA;AAC3B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAoB;AAClB,IAAA,OAAO,KAAK,OAAA,EAAQ;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,KAAA,EAAsB;AAC5B,IAAA,IAAA,CAAK,WAAW,YAAA,GAAe,KAAA;AAC/B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,WAAWF,IAAAA,EAAmB;AAC5B,IAAA,IAAA,CAAK,WAAW,UAAA,GAAaA,IAAAA;AAC7B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAmB;AACjB,IAAA,IAAA,CAAK,WAAW,UAAA,GAAa,mBAAA;AAC7B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAAiB;AACf,IAAA,IAAA,CAAK,WAAW,QAAA,GAAW,IAAA;AAC3B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAsB;AACpB,IAAA,IAAA,CAAK,WAAW,aAAA,GAAgB,IAAA;AAChC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,WAAW,OAAA,GAAU,IAAA;AAC1B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAAe;AACb,IAAA,IAAA,CAAK,WAAW,MAAA,GAAS,IAAA;AACzB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,WAAW,KAAA,GAAQ,IAAA;AACxB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,OAAA,EAAuB;AAC7B,IAAA,IAAA,CAAK,WAAW,OAAA,GAAU,OAAA;AAC1B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,EAA0B;AAC9B,IAAA,IAAA,CAAK,WAAW,KAAA,GAAQ,UAAA;AACxB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,WAAW,KAAA,GAAQ,IAAA;AACxB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,MAAA,EAAwB;AAC7B,IAAA,IAAA,CAAK,WAAW,UAAA,GAAa,MAAA;AAC7B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,MAAA,EAAmC;AAC5C,IAAA,MAAM,SAAA,GAAY,IAAI,iBAAA,CAAkB,IAAA,EAAM,MAAM,CAAA;AACpD,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,EAAA,EAAgC;AAC5C,IAAA,IAAA,CAAK,WAAW,UAAA,GAAa,EAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAkC;AAChC,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,UAAA,EAAW;AAAA,EAC9B;AACF;AAMO,IAAM,oBAAN,MAAwB;AAAA,EACrB,aAAA;AAAA,EACA,YAAA;AAAA,EAER,WAAA,CAAY,eAA8B,eAAA,EAAyB;AACjE,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AACrB,IAAA,IAAA,CAAK,YAAA,GAAe;AAAA,MAClB,MAAA,EAAQ,aAAA,CAAc,aAAA,EAAc,CAAE,IAAA;AAAA,MACtC;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,GAAG,SAAA,EAAyB;AAC1B,IAAA,IAAA,CAAK,aAAa,KAAA,GAAQ,SAAA;AAC1B,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,SAAA,EAAyB;AAC/B,IAAA,OAAO,IAAA,CAAK,GAAG,SAAS,CAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,MAAA,EAAgC;AACvC,IAAA,IAAA,CAAK,aAAa,QAAA,GAAW,MAAA;AAC7B,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,MAAA,EAAgC;AACvC,IAAA,IAAA,CAAK,aAAa,QAAA,GAAW,MAAA;AAC7B,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,IAAA,EAAoB;AACvB,IAAA,IAAA,CAAK,aAAa,IAAA,GAAO,IAAA;AACzB,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAA,GAAsB;AAC5B,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,KAAA,IAAS,IAAA,CAAK,aAAa,eAAA,EAAiB;AAChE,MAAA,IAAA,CAAK,aAAA,CAAc,aAAA,CAAc,IAAA,CAAK,YAAoC,CAAA;AAAA,IAC5E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAA,GAAkC;AAChC,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AACF;;;AClPO,IAAM,eAAN,MAAmB;AAAA,EAChB,SAAA;AAAA,EACA,UAA8B,EAAC;AAAA,EAC/B,UAA6B,EAAC;AAAA,EAC9B,cAAsC,EAAC;AAAA,EACvC,iBAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA;AAAA,EACA,YAAA;AAAA,EAER,YAAY,SAAA,EAAmB;AAC7B,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,UAAA,CAAW,OAAe,IAAA,EAAqB;AAC7C,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,YAAY,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,CAAc,OAAe,IAAA,EAAqB;AAChD,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,eAAe,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,IAAA,EAA6B;AACnC,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,SAAS,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,IAAA,EAA6B;AACtC,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,YAAY,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,IAAA,EAA6B;AACxC,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,cAAc,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,IAAA,EAA6B;AACvC,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,aAAa,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,EAA6B;AACjC,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,OAAO,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,IAAA,EAA6B;AAClC,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,QAAQ,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,CAAQ,IAAA,EAAc,SAAA,GAAoB,EAAA,EAAI,QAAgB,CAAA,EAAkB;AAC9E,IAAA,OAAO,KAAK,SAAA,CAAU,IAAA,EAAM,SAAS,CAAA,CAAE,SAAA,CAAU,WAAW,KAAK,CAAA;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,CAAO,IAAA,EAAc,MAAA,GAAiB,GAAA,EAAoB;AACxD,IAAA,OAAO,KAAK,SAAA,CAAU,IAAA,EAAM,QAAQ,CAAA,CAAE,OAAO,MAAM,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,IAAA,EAA6B;AAChC,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,MAAM,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,IAAA,EAA6B;AACtC,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,YAAY,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,IAAA,EAA6B;AACpC,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,UAAU,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,IAAA,EAA6B;AACnC,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,SAAS,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,IAAA,EAA6B;AAChC,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,MAAM,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,IAAA,EAA6B;AACpC,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,UAAU,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,IAAA,EAA6B;AACrC,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,WAAW,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,IAAA,EAA6B;AAChC,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,MAAM,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,IAAA,EAA6B;AAChC,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,MAAM,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,EAA6B;AACjC,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,OAAO,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,IAAA,EAA6B;AAChC,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,MAAM,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,IAAA,EAA6B;AAClC,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,QAAQ,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,CAAK,MAAc,MAAA,EAAiC;AAClD,IAAA,OAAO,KAAK,SAAA,CAAU,IAAA,EAAM,MAAM,CAAA,CAAE,OAAO,MAAM,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,UAAA,GAAmB;AACjB,IAAA,IAAA,CAAK,SAAA,CAAU,YAAY,CAAA,CAAE,OAAA,GAAU,UAAA,EAAW;AAClD,IAAA,IAAA,CAAK,SAAA,CAAU,YAAY,CAAA,CAAE,OAAA,GAAU,UAAA,EAAW;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAA6B;AAC3B,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,YAAY,CAAA,CAAE,QAAA,EAAS;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,IAAA,EAA6B;AAErC,IAAA,MAAM,YAAY,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAC,CAAA,CAAA,CAAA;AAC7C,IAAA,MAAM,SAAS,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA,CAAE,QAAA,GAAW,OAAA,EAAQ;AAErD,IAAA,IAAA,CAAK,QAAQ,IAAI,CAAA,CAAE,WAAW,IAAI,CAAA,CAAE,GAAG,SAAS,CAAA;AAChD,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,CAAY,OAAe,IAAA,EAAqB;AAC9C,IAAA,OAAO,KAAK,IAAA,CAAK,IAAI,CAAA,CAAE,OAAA,GAAU,OAAA,EAAQ;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,KAAA,CAAM,SAA4B,IAAA,EAAqB;AACrD,IAAA,MAAM,cAAc,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,GAAI,OAAA,GAAU,CAAC,OAAO,CAAA;AAC/D,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK;AAAA,MAChB,IAAA,EAAM,QAAQ,CAAA,IAAA,EAAO,IAAA,CAAK,SAAS,CAAA,CAAA,EAAI,WAAA,CAAY,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAAA,MAC5D,OAAA,EAAS,WAAA;AAAA,MACT,MAAA,EAAQ;AAAA,KACT,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,CAAO,SAA4B,IAAA,EAAqB;AACtD,IAAA,MAAM,cAAc,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,GAAI,OAAA,GAAU,CAAC,OAAO,CAAA;AAC/D,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK;AAAA,MAChB,IAAA,EAAM,QAAQ,CAAA,KAAA,EAAQ,IAAA,CAAK,SAAS,CAAA,CAAA,EAAI,WAAA,CAAY,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAAA,MAC7D,OAAA,EAAS,WAAA;AAAA,MACT,MAAA,EAAQ;AAAA,KACT,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,CAAS,SAA4B,IAAA,EAAqB;AACxD,IAAA,MAAM,cAAc,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,GAAI,OAAA,GAAU,CAAC,OAAO,CAAA;AAC/D,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK;AAAA,MAChB,IAAA,EAAM,QAAQ,CAAA,GAAA,EAAM,IAAA,CAAK,SAAS,CAAA,CAAA,EAAI,WAAA,CAAY,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAAA,MAC3D,OAAA,EAAS,WAAA;AAAA,MACT,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,OAAA,EAAkC;AACxC,IAAA,IAAA,CAAK,oBAAoB,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,GAAI,OAAA,GAAU,CAAC,OAAO,CAAA;AACpE,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,QAAQ,MAAA,EAAiC;AACvC,IAAA,OAAO,IAAI,eAAA,CAAgB,IAAA,EAAM,MAAM,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,EAAA,EAAgC;AAC5C,IAAA,IAAA,CAAK,WAAA,CAAY,KAAK,EAAE,CAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,MAAA,EAAsB;AAC3B,IAAA,IAAA,CAAK,WAAA,GAAc,MAAA;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,OAAA,EAAuB;AAC7B,IAAA,IAAA,CAAK,YAAA,GAAe,OAAA;AACpB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,SAAA,EAAyB;AACjC,IAAA,IAAA,CAAK,cAAA,GAAiB,SAAA;AACtB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,OAAA,EAAuB;AAC7B,IAAA,IAAA,CAAK,YAAA,GAAe,OAAA;AACpB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,SAAA,CAAU,MAAc,IAAA,EAA+C;AAC7E,IAAA,MAAM,OAAA,GAAU,IAAI,aAAA,CAAc,IAAA,EAAM,IAAI,CAAA;AAE5C,IAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,aAAA,EAAe,CAAA;AAEzC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,CAAA;AACpC,IAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,OAAA,EAAS;AAAA,MAC/B,GAAA,EAAK,CAAC,MAAA,EAAQ,IAAA,EAAM,QAAA,KAAa;AAC/B,QAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,MAAM,QAAQ,CAAA;AACjD,QAAA,IAAI,OAAO,WAAW,UAAA,EAAY;AAChC,UAAA,OAAO,IAAI,IAAA,KAAoB;AAC7B,YAAA,MAAM,WAAA,GAAc,MAAA,CAAO,KAAA,CAAM,MAAA,EAAQ,IAAI,CAAA;AAE7C,YAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAA,GAAI,MAAA,CAAO,aAAA,EAAc;AAC3C,YAAA,OAAO,WAAA,KAAgB,SAAS,KAAA,GAAQ,WAAA;AAAA,UAC1C,CAAA;AAAA,QACF;AACA,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,KACD,CAAA;AACD,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAiC;AAC/B,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,SAAA;AAAA,MACX,OAAA,EAAS,CAAC,GAAG,IAAA,CAAK,OAAO,CAAA;AAAA,MACzB,OAAA,EAAS,CAAC,GAAG,IAAA,CAAK,OAAO,CAAA;AAAA,MACzB,WAAA,EAAa,CAAC,GAAG,IAAA,CAAK,WAAW,CAAA;AAAA,MACjC,YAAY,IAAA,CAAK,iBAAA;AAAA,MACjB,QAAQ,IAAA,CAAK,WAAA;AAAA,MACb,SAAS,IAAA,CAAK,YAAA;AAAA,MACd,WAAW,IAAA,CAAK,cAAA;AAAA,MAChB,SAAS,IAAA,CAAK;AAAA,KAChB;AAAA,EACF;AACF;AAKO,IAAM,kBAAN,MAAsB;AAAA,EACnB,YAAA;AAAA,EACA,YAAA;AAAA,EAER,WAAA,CAAY,cAA4B,MAAA,EAAgB;AACtD,IAAA,IAAA,CAAK,YAAA,GAAe,YAAA;AACpB,IAAA,IAAA,CAAK,YAAA,GAAe,EAAE,MAAA,EAAO;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,MAAA,EAAsB;AAC/B,IAAA,IAAA,CAAK,aAAa,eAAA,GAAkB,MAAA;AACpC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,GAAG,SAAA,EAAyB;AAC1B,IAAA,IAAA,CAAK,aAAa,KAAA,GAAQ,SAAA;AAC1B,IAAA,IAAA,CAAK,KAAA,EAAM;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,SAAA,EAAyB;AAC/B,IAAA,OAAO,IAAA,CAAK,GAAG,SAAS,CAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,MAAA,EAAgC;AACvC,IAAA,IAAA,CAAK,aAAa,QAAA,GAAW,MAAA;AAC7B,IAAA,IAAA,CAAK,KAAA,EAAM;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,MAAA,EAAgC;AACvC,IAAA,IAAA,CAAK,aAAa,QAAA,GAAW,MAAA;AAC7B,IAAA,IAAA,CAAK,KAAA,EAAM;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,IAAA,EAAoB;AACvB,IAAA,IAAA,CAAK,aAAa,IAAA,GAAO,IAAA;AACzB,IAAA,IAAA,CAAK,KAAA,EAAM;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,KAAA,GAAc;AACpB,IAAA,IAAI,IAAA,CAAK,aAAa,MAAA,IAAU,IAAA,CAAK,aAAa,KAAA,IAAS,IAAA,CAAK,aAAa,eAAA,EAAiB;AAE5F,MAAA,IAAI,CAAC,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM;AAC3B,QAAA,IAAA,CAAK,YAAA,CAAa,OAAO,CAAA,GAAA,EAAM,IAAA,CAAK,aAAa,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA,CAAA;AAAA,MACpF;AACA,MAAA,IAAA,CAAK,YAAA,CAAa,aAAA,CAAc,IAAA,CAAK,YAAoC,CAAA;AAAA,IAC3E;AAAA,EACF;AACF;;;ACtbO,IAAM,gBAAN,MAAoB;AAAA,EACjB,eAAA;AAAA,EACA,OAAA;AAAA,EAER,YAAY,OAAA,EAA+B;AACzC,IAAA,IAAA,CAAK,UAAU,OAAA,CAAQ,OAAA;AAEvB,IAAA,QAAQ,QAAQ,OAAA;AAAS,MACvB,KAAK,OAAA,EAAS;AACZ,QAAA,IAAA,CAAK,eAAA,GAAkB,IAAI,YAAA,EAAa;AACxC,QAAA;AAAA,MACF;AAAA,MACA,KAAK,YAAA,EAAc;AACjB,QAAA,IAAA,CAAK,eAAA,GAAkB,IAAI,iBAAA,EAAkB;AAC7C,QAAA;AAAA,MACF;AAAA,MACA,SAAS;AACP,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,OAAA,CAAQ,OAAO,CAAA,CAAE,CAAA;AAAA,MAC3D;AAAA;AACF,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAA,GAAyB;AAC3B,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,CAAY,SAAA,EAAmB,QAAA,EAAwD;AAC3F,IAAA,MAAM,OAAA,GAAU,IAAI,YAAA,CAAa,SAAS,CAAA;AAC1C,IAAA,QAAA,CAAS,OAAO,CAAA;AAEhB,IAAA,MAAM,UAAA,GAAa,QAAQ,aAAA,EAAc;AACzC,IAAA,MAAMA,IAAAA,GAAM,IAAA,CAAK,eAAA,CAAgB,WAAA,CAAY,UAAU,CAAA;AAEvD,IAAA,MAAM,IAAA,CAAK,QAAQA,IAAG,CAAA;AAGtB,IAAA,IAAI,KAAK,eAAA,CAAgB,OAAA,KAAY,gBAAgB,UAAA,CAAW,OAAA,CAAQ,SAAS,CAAA,EAAG;AAClF,MAAA,MAAM,YAAY,IAAA,CAAK,eAAA;AACvB,MAAA,KAAA,MAAW,KAAA,IAAS,WAAW,OAAA,EAAS;AACtC,QAAA,MAAM,QAAA,GAAW,SAAA,CAAU,WAAA,CAAY,SAAA,EAAW,KAAK,CAAA;AACvD,QAAA,MAAM,IAAA,CAAK,QAAQ,QAAQ,CAAA;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,sBAAA,CACJ,SAAA,EACA,QAAA,EACe;AACf,IAAA,MAAMY,OAAAA,GAAS,MAAM,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA;AAC5C,IAAA,IAAI,CAACA,OAAAA,EAAQ;AACX,MAAA,MAAM,IAAA,CAAK,WAAA,CAAY,SAAA,EAAW,QAAQ,CAAA;AAAA,IAC5C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,SAAA,EAAkC;AAChD,IAAA,MAAMZ,IAAAA,GAAM,IAAA,CAAK,eAAA,CAAgB,SAAA,CAAU,SAAS,CAAA;AACpD,IAAA,MAAM,IAAA,CAAK,QAAQA,IAAG,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,SAAA,EAAkC;AACxD,IAAA,MAAMA,IAAAA,GAAM,IAAA,CAAK,eAAA,CAAgB,iBAAA,CAAkB,SAAS,CAAA;AAC5D,IAAA,MAAM,IAAA,CAAK,QAAQA,IAAG,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,CAAY,IAAA,EAAc,EAAA,EAA2B;AACzD,IAAA,MAAMA,IAAAA,GAAM,IAAA,CAAK,eAAA,CAAgB,WAAA,CAAY,MAAM,EAAE,CAAA;AACrD,IAAA,MAAM,IAAA,CAAK,QAAQA,IAAG,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,SAAA,EAAqC;AAClD,IAAA,MAAMA,IAAAA,GAAM,IAAA,CAAK,eAAA,CAAgB,QAAA,CAAS,SAAS,CAAA;AACnD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,KAAA,CAAMA,IAAG,CAAA;AACnC,IAAA,OAAO,OAAO,MAAA,GAAS,CAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAA,CAAU,SAAA,EAAmB,UAAA,EAAsC;AACvE,IAAA,MAAMA,IAAAA,GAAM,IAAA,CAAK,eAAA,CAAgB,SAAA,CAAU,WAAW,UAAU,CAAA;AAChE,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,KAAA,CAAMA,IAAG,CAAA;AACnC,IAAA,OAAO,OAAO,MAAA,GAAS,CAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,CAAW,SAAA,EAAmB,QAAA,EAA6D;AAC/F,IAAA,MAAM,OAAA,GAAU,IAAI,iBAAA,CAAkB,SAAS,CAAA;AAC/C,IAAA,QAAA,CAAS,OAAO,CAAA;AAEhB,IAAA,MAAM,UAAA,GAAa,QAAQ,aAAA,EAAc;AACzC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,UAAA,CAAW,UAAU,CAAA;AAE7D,IAAA,KAAA,MAAWA,QAAO,UAAA,EAAY;AAC5B,MAAA,MAAM,IAAA,CAAK,QAAQA,IAAG,CAAA;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,GAAA,CAAIA,IAAAA,EAAa,MAAA,EAAmC;AACxD,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQA,IAAAA,EAAK,MAAM,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,OAAA,CAAQA,IAAAA,EAAa,MAAA,EAAmC;AACpE,IAAA,IAAI,KAAK,OAAA,EAAS;AAEhB,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQA,IAAAA,EAAK,MAAwC,CAAA;AAAA,IAC1E,CAAA,MAAO;AAGL,MAAA,OAAA,CAAQ,GAAA,CAAI,QAAQA,IAAG,CAAA;AACvB,MAAA,IAAI,MAAA,IAAU,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE/B,QAAA,OAAA,CAAQ,GAAA,CAAI,WAAW,MAAM,CAAA;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,MAAMA,IAAAA,EAAiC;AACnD,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAMA,IAAG,CAAA;AAC3C,MAAA,OAAO,MAAA,CAAO,IAAA;AAAA,IAChB;AACA,IAAA,OAAO,EAAC;AAAA,EACV;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAA,CAAuB,WAAmB,QAAA,EAAiD;AACzF,IAAA,MAAM,OAAA,GAAU,IAAI,YAAA,CAAa,SAAS,CAAA;AAC1C,IAAA,QAAA,CAAS,OAAO,CAAA;AAChB,IAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,WAAA,CAAY,OAAA,CAAQ,eAAe,CAAA;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAA,CAAsB,WAAmB,QAAA,EAAwD;AAC/F,IAAA,MAAM,OAAA,GAAU,IAAI,iBAAA,CAAkB,SAAS,CAAA;AAC/C,IAAA,QAAA,CAAS,OAAO,CAAA;AAChB,IAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,UAAA,CAAW,OAAA,CAAQ,eAAe,CAAA;AAAA,EAChE;AACF;AAMO,IAAM,oBAAN,MAAwB;AAAA,EACrB,SAAA;AAAA,EACA,aAA+B,EAAC;AAAA,EAExC,YAAY,SAAA,EAAmB;AAC7B,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,CACE,IAAA,EACA,IAAA,EACA,OAAA,EACM;AACN,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK;AAAA,MACnB,IAAA,EAAM,WAAA;AAAA,MACN,MAAA,EAAQ;AAAA,QACN,IAAA;AAAA,QACA,IAAA;AAAA,QACA,QAAA,EAAU,IAAA;AAAA,QACV,QAAA,EAAU,KAAA;AAAA,QACV,aAAA,EAAe,KAAA;AAAA,QACf,OAAA,EAAS,KAAA;AAAA,QACT,MAAA,EAAQ,KAAA;AAAA,QACR,KAAA,EAAO,KAAA;AAAA,QACP,KAAA,EAAO,KAAA;AAAA,QACP,GAAG;AAAA;AACL,KACD,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,IAAA,EAAoB;AAC7B,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,EAAE,IAAA,EAAM,YAAA,EAAc,MAAM,CAAA;AACjD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,CAAa,MAAc,EAAA,EAAkB;AAC3C,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,EAAE,MAAM,cAAA,EAAgB,IAAA,EAAM,IAAI,CAAA;AACvD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,CACE,IAAA,EACA,IAAA,EACA,OAAA,EACM;AACN,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK;AAAA,MACnB,IAAA,EAAM,cAAA;AAAA,MACN,MAAA,EAAQ;AAAA,QACN,IAAA;AAAA,QACA,IAAA;AAAA,QACA,QAAA,EAAU,IAAA;AAAA,QACV,QAAA,EAAU,KAAA;AAAA,QACV,aAAA,EAAe,KAAA;AAAA,QACf,OAAA,EAAS,KAAA;AAAA,QACT,MAAA,EAAQ,KAAA;AAAA,QACR,KAAA,EAAO,KAAA;AAAA,QACP,KAAA,EAAO,KAAA;AAAA,QACP,GAAG;AAAA;AACL,KACD,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,CAAS,SAA4B,IAAA,EAAqB;AACxD,IAAA,MAAM,cAAc,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,GAAI,OAAA,GAAU,CAAC,OAAO,CAAA;AAC/D,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK;AAAA,MACnB,IAAA,EAAM,UAAA;AAAA,MACN,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,QAAQ,CAAA,IAAA,EAAO,IAAA,CAAK,SAAS,CAAA,CAAA,EAAI,WAAA,CAAY,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAAA,QAC5D,OAAA,EAAS,WAAA;AAAA,QACT,MAAA,EAAQ;AAAA;AACV,KACD,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,CAAU,SAA4B,IAAA,EAAqB;AACzD,IAAA,MAAM,cAAc,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,GAAI,OAAA,GAAU,CAAC,OAAO,CAAA;AAC/D,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK;AAAA,MACnB,IAAA,EAAM,UAAA;AAAA,MACN,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,QAAQ,CAAA,KAAA,EAAQ,IAAA,CAAK,SAAS,CAAA,CAAA,EAAI,WAAA,CAAY,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAAA,QAC7D,OAAA,EAAS,WAAA;AAAA,QACT,MAAA,EAAQ;AAAA;AACV,KACD,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,IAAA,EAAoB;AAC5B,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,EAAE,IAAA,EAAM,WAAA,EAAa,MAAM,CAAA;AAChD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,MAAA,EAAwC;AACjD,IAAA,OAAO,IAAI,sBAAA,CAAuB,IAAA,EAAM,MAAM,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,uBAAuB,EAAA,EAAgC;AACrD,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,EAAE,MAAM,eAAA,EAAiB,UAAA,EAAY,IAAI,CAAA;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,IAAA,EAAoB;AAC9B,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,EAAE,IAAA,EAAM,gBAAA,EAAkB,MAAM,CAAA;AACrD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,OAAA,EAAkC;AAC3C,IAAA,MAAM,cAAc,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,GAAI,OAAA,GAAU,CAAC,OAAO,CAAA;AAC/D,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,EAAE,MAAM,YAAA,EAAc,OAAA,EAAS,aAAa,CAAA;AACjE,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAoB;AAClB,IAAA,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,EAAE,IAAA,EAAM,eAAe,CAAA;AAC5C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAsC;AACpC,IAAA,OAAO;AAAA,MACL,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,UAAA,EAAY,CAAC,GAAG,IAAA,CAAK,UAAU;AAAA,KACjC;AAAA,EACF;AACF;AAKA,IAAM,yBAAN,MAA6B;AAAA,EACnB,OAAA;AAAA,EACA,YAAA;AAAA,EAER,WAAA,CAAY,SAA4B,MAAA,EAAgB;AACtD,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,YAAA,GAAe,EAAE,MAAA,EAAO;AAAA,EAC/B;AAAA,EAEA,WAAW,MAAA,EAAsB;AAC/B,IAAA,IAAA,CAAK,aAAa,eAAA,GAAkB,MAAA;AACpC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,GAAG,SAAA,EAAyB;AAC1B,IAAA,IAAA,CAAK,aAAa,KAAA,GAAQ,SAAA;AAC1B,IAAA,IAAA,CAAK,KAAA,EAAM;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,SAAS,MAAA,EAAgD;AACvD,IAAA,IAAA,CAAK,aAAa,QAAA,GAAW,MAAA;AAC7B,IAAA,IAAA,CAAK,KAAA,EAAM;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,SAAS,MAAA,EAAgD;AACvD,IAAA,IAAA,CAAK,aAAa,QAAA,GAAW,MAAA;AAC7B,IAAA,IAAA,CAAK,KAAA,EAAM;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,KAAK,IAAA,EAAoB;AACvB,IAAA,IAAA,CAAK,aAAa,IAAA,GAAO,IAAA;AACzB,IAAA,IAAA,CAAK,KAAA,EAAM;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,KAAA,GAAc;AACpB,IAAA,IAAI,IAAA,CAAK,aAAa,MAAA,IAAU,IAAA,CAAK,aAAa,KAAA,IAAS,IAAA,CAAK,aAAa,eAAA,EAAiB;AAC5F,MAAA,IAAI,CAAC,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM;AAC3B,QAAA,IAAA,CAAK,YAAA,CAAa,OAAO,CAAA,GAAA,EAAM,IAAA,CAAK,aAAa,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA,CAAA;AAAA,MACpF;AACA,MAAA,IAAA,CAAK,OAAA,CAAQ,sBAAA,CAAuB,IAAA,CAAK,YAAoC,CAAA;AAAA,IAC/E;AAAA,EACF;AACF,CAAA;;;ACzYO,IAAM,sBAAN,MAA0B;AAAA,EACvB,OAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EAIR,WAAA,CAAY,SAA0B,OAAA,EAAqC;AACzE,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,OAAA,GAAU;AAAA,MACb,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,SAAA,EAAW,QAAQ,SAAA,IAAa,eAAA;AAAA,MAChC,aAAA,EAAe,QAAQ,aAAA,IAAiB,oBAAA;AAAA,MACxC,WAAA,EAAa,QAAQ,WAAA,IAAe,GAAA;AAAA,MACpC,iBAAA,EAAmB,QAAQ,iBAAA,IAAqB,IAAA;AAAA,MAChD,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,MAAA,EAAQ,QAAQ,MAAA,IAAU,OAAA;AAAA,MAC1B,MAAA,EAAQ,QAAQ,MAAA,IAAU;AAAA,KAC5B;AAEA,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,eAAA,CAAgB,OAAA,CAAQ,SAAS,CAAA;AACnD,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,aAAA,CAAc,OAAA,EAAS;AAAA,MACrC,SAAA,EAAW,KAAK,OAAA,CAAQ,aAAA;AAAA,MACxB,OAAA,EAAS,KAAK,OAAA,CAAQ,WAAA;AAAA,MACtB,SAAS,OAAA,CAAQ;AAAA,KAClB,CAAA;AACD,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,aAAA,CAAc;AAAA,MAC9B,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,GAA4B;AAChC,IAAA,IAAI,IAAA,CAAK,QAAQ,MAAA,EAAQ;AACvB,MAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,wCAAwC,CAAA;AACjE,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,GAAY,KAAK,OAAA,CAAQ,SAAA;AAC/B,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,SAAS,SAAS,CAAA;AAErD,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,SAAA,EAAW,CAAC,KAAA,KAAU;AAClD,QAAA,KAAA,CAAM,WAAW,IAAI,CAAA;AACrB,QAAA,KAAA,CAAM,OAAO,MAAA,EAAQ,GAAG,CAAA,CAAE,OAAA,GAAU,MAAA,EAAO;AAC3C,QAAA,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,CAAE,OAAA,EAAQ;AAC/B,QAAA,KAAA,CAAM,SAAA,CAAU,aAAa,CAAA,CAAE,OAAA,GAAU,UAAA,EAAW;AACpD,QAAA,KAAA,CAAM,OAAA,CAAQ,mBAAmB,CAAA,CAAE,OAAA,EAAQ;AAC3C,QAAA,KAAA,CAAM,MAAA,CAAO,UAAA,EAAY,EAAE,CAAA,CAAE,OAAA,EAAQ;AACrC,QAAA,KAAA,CAAM,MAAM,OAAO,CAAA;AACnB,QAAA,KAAA,CAAM,MAAM,aAAa,CAAA;AAAA,MAC3B,CAAC,CAAA;AACD,MAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,CAAA,0BAAA,EAA6B,SAAS,CAAA,CAAE,CAAA;AAAA,IACnE;AAGA,IAAA,MAAM,IAAA,CAAK,KAAK,UAAA,EAAW;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,GAA4B;AAEhC,IAAA,MAAM,IAAA,CAAK,KAAK,UAAA,EAAW;AAE3B,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,YAAY;AACpC,MAAA,MAAM,KAAK,UAAA,EAAW;AAEtB,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,oBAAA,EAAqB;AAChD,MAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,QAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,uBAAuB,CAAA;AAChD,QAAA,OAAO,EAAC;AAAA,MACV;AAEA,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,YAAA,EAAa;AACtC,MAAA,MAAM,WAAqB,EAAC;AAE5B,MAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,IAAA,CAAK,CAAA,QAAA,EAAW,QAAQ,MAAM,CAAA,mBAAA,EAAsB,KAAK,CAAA,CAAA,CAAG,CAAA;AAEhF,MAAA,KAAA,MAAW,aAAa,OAAA,EAAS;AAC/B,QAAA,MAAM,IAAA,CAAK,YAAA,CAAa,SAAA,EAAW,IAAA,EAAM,KAAK,CAAA;AAC9C,QAAA,QAAA,CAAS,IAAA,CAAK,UAAU,IAAI,CAAA;AAAA,MAC9B;AAEA,MAAA,OAAO,QAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,CAAS,KAAA,GAAgB,CAAA,EAAsB;AACnD,IAAA,MAAM,IAAA,CAAK,KAAK,UAAA,EAAW;AAE3B,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,YAAY;AACpC,MAAA,MAAM,KAAK,UAAA,EAAW;AAEtB,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA;AAC/C,MAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,QAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,2BAA2B,CAAA;AACpD,QAAA,OAAO,EAAC;AAAA,MACV;AAEA,MAAA,MAAM,aAAuB,EAAC;AAE9B,MAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,QAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,IAAA,CAAK,CAAA,mBAAA,EAAsB,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAG5D,QAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,oBAAA;AAAA,UAC5B,KAAA,CAAM,WAAW,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,IAAI,EAAE,OAAA;AAAQ,SAC9C;AAEA,QAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,UAAA,MAAM,IAAA,CAAK,YAAA,CAAa,SAAA,EAAW,MAAA,EAAQ,MAAM,KAAK,CAAA;AACtD,UAAA,UAAA,CAAW,IAAA,CAAK,UAAU,IAAI,CAAA;AAAA,QAChC;AAAA,MACF;AAEA,MAAA,OAAO,UAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,GAA2B;AAC/B,IAAA,MAAM,IAAA,CAAK,KAAK,UAAA,EAAW;AAE3B,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,YAAY;AACpC,MAAA,MAAM,KAAK,UAAA,EAAW;AAEtB,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,qBAAA,EAAsB;AAClD,MAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,QAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,wBAAwB,CAAA;AACjD,QAAA,OAAO,EAAC;AAAA,MACV;AAEA,MAAA,MAAM,aAAuB,EAAC;AAG9B,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,oBAAA,CAAqB,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CAAE,OAAA,EAAS,CAAA;AAExF,MAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,QAAA,MAAM,MAAA,GAAS,SAAS,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,UAAU,IAAI,CAAA;AAC7D,QAAA,MAAM,IAAA,CAAK,YAAA,CAAa,SAAA,EAAW,MAAA,EAAQ,OAAO,KAAK,CAAA;AACvD,QAAA,UAAA,CAAW,IAAA,CAAK,UAAU,IAAI,CAAA;AAAA,MAChC;AAEA,MAAA,OAAO,UAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,GAA2B;AAC/B,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,OAAO,KAAK,MAAA,EAAO;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,GAAqC;AACzC,IAAA,MAAM,KAAK,UAAA,EAAW;AAEtB,IAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,MAAA,CAAO,iBAAA,EAAkB;AAC1D,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,qBAAA,EAAsB;AAClD,IAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,IAAA,EAAM,CAAC,CAAC,CAAC,CAAA;AAE5D,IAAA,OAAO,aAAA,CAAc,GAAA,CAAI,CAAC,IAAA,KAAS;AACjC,MAAA,MAAM,MAAA,GAAS,WAAA,CAAY,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA;AACxC,MAAA,OAAO;AAAA,QACL,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,KAAA,EAAO,QAAQ,KAAA,IAAS,IAAA;AAAA,QACxB,UAAA,EAAY,QAAQ,WAAA,IAAe,IAAA;AAAA,QACnC,SAAS,CAAC;AAAA,OACZ;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,GAA0D;AAC9D,IAAA,MAAM,SAAmB,EAAC;AAE1B,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,MAAA,CAAO,OAAA,EAAQ;AAC7C,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,qBAAA,EAAsB;AAGlD,MAAA,KAAA,MAAW,UAAU,QAAA,EAAU;AAC7B,QAAA,MAAM,SAAA,GAAY,WAAW,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,OAAO,IAAI,CAAA;AAC/D,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,WAAA,EAAc,MAAA,CAAO,IAAI,CAAA,wCAAA,CAA0C,CAAA;AAC/E,UAAA;AAAA,QACF;AAGA,QAAA,IAAI,IAAA,CAAK,QAAQ,iBAAA,EAAmB;AAClC,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,iBAAA,CAAkB,SAAS,CAAA;AACjD,UAAA,IAAI,QAAA,KAAa,OAAO,QAAA,EAAU;AAChC,YAAA,MAAA,CAAO,IAAA;AAAA,cACL,CAAA,iCAAA,EAAoC,OAAO,IAAI,CAAA,wCAAA;AAAA,aACjD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,kBAAA,EAAsB,KAAA,CAAgB,OAAO,CAAA,CAAE,CAAA;AAAA,IAC7D;AAEA,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,OAAO,MAAA,KAAW,CAAA;AAAA,MACzB;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAA,GAA6C;AACjD,IAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,MAAA,CAAO,OAAA,EAAQ;AAChD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,qBAAA,EAAsB;AAClD,IAAA,MAAM,aAAA,GAAgB,IAAI,GAAA,CAAI,QAAA,CAAS,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAC,CAAA;AAEzD,IAAA,OAAO,aAAA,CAAc,OAAO,CAAC,CAAA,KAAM,CAAC,aAAA,CAAc,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,qBAAA,GAAoD;AAChE,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAA;AAAA,MAChC,CAAA,cAAA,EAAiB,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA,gBAAA;AAAA,KACzC;AACA,IAAA,OAAO,MAAA,CAAO,IAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,YAAA,GAAgC;AAC5C,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAA;AAAA,MAChC,CAAA,oCAAA,EAAuC,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA;AAAA,KAC/D;AACA,IAAA,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,aAAa,CAAA,IAAK,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,eAAeM,MAAAA,EAAqC;AAChE,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAA;AAAA,MAChC,CAAA,cAAA,EAAiB,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA,6BAAA;AAAA,KACzC;AAEA,IAAA,MAAM,OAAA,uBAAc,GAAA,EAA+B;AACnD,IAAA,KAAA,MAAW,MAAA,IAAU,OAAO,IAAA,EAAM;AAChC,MAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA,EAAG;AAC9B,QAAA,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,KAAA,EAAO,EAAE,CAAA;AAAA,MAC9B;AACA,MAAA,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA,CAAG,KAAK,MAAM,CAAA;AAAA,IACxC;AAEA,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,CAAE,KAAA,CAAM,CAAA,EAAGA,MAAK,CAAA;AAC9D,IAAA,OAAO,YAAA,CAAa,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MAClC,KAAA;AAAA,MACA,UAAA,EAAY,OAAA,CAAQ,GAAA,CAAI,KAAK;AAAA,KAC/B,CAAE,CAAA;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,qBAAqB,KAAA,EAAuC;AACxE,IAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,MAAA,CAAO,OAAA,EAAQ;AAChD,IAAA,MAAM,YAAA,GAAe,IAAI,GAAA,CAAI,aAAA,CAAc,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,IAAA,EAAM,CAAC,CAAC,CAAC,CAAA;AAElE,IAAA,OAAO,KAAA,CACJ,GAAA,CAAI,CAAC,IAAA,KAAS,YAAA,CAAa,GAAA,CAAI,IAAI,CAAC,CAAA,CACpC,MAAA,CAAO,CAAC,CAAA,KAAsB,MAAM,MAAS,CAAA;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,YAAA,CACZ,SAAA,EACA,SAAA,EACA,KAAA,EACe;AACf,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,MAAM,MAAA,GAAS,SAAA,KAAc,IAAA,GAAO,SAAA,GAAY,cAAA;AAEhD,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,EAAA,EAAK,SAAA,CAAU,IAAI,CAAA,CAAE,CAAA;AAEvD,IAAA,IAAI,IAAA,CAAK,QAAQ,MAAA,EAAQ;AACvB,MAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,IAAA,CAAK,CAAA,eAAA,EAAkB,SAAS,CAAA,CAAA,EAAI,SAAA,CAAU,IAAI,CAAA,CAAE,CAAA;AACxE,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,cAAc,SAAA,CAAU,aAAA,GAAgB,MAAM,IAAA,CAAK,OAAA,CAAQ,kBAAiB,GAAI,IAAA;AAEtF,IAAA,IAAI;AAEF,MAAA,MAAM,MAAA,GAAS,IAAI,aAAA,CAAc;AAAA,QAC/B,OAAA,EAAS,KAAK,OAAA,CAAQ,OAAA;AAAA,QACtB,SAAS,IAAA,CAAK;AAAA,OACf,CAAA;AAGD,MAAA,MAAM,SAAA,CAAU,SAAS,CAAA,CAAE,MAAM,CAAA;AAEjC,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAGnC,MAAA,IAAI,cAAc,IAAA,EAAM;AACtB,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,iBAAA,CAAkB,SAAS,CAAA;AACjD,QAAA,MAAM,KAAK,OAAA,CAAQ,OAAA;AAAA,UACjB,CAAA,YAAA,EAAe,IAAA,CAAK,OAAA,CAAQ,SAAS;AAAA;AAAA,qCAAA,CAAA;AAAA,UAGrC,CAAC,SAAA,CAAU,IAAA,EAAM,KAAA,EAAO,eAAe,QAAQ;AAAA,SACjD;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM,KAAK,OAAA,CAAQ,OAAA,CAAQ,eAAe,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA,eAAA,CAAA,EAAmB;AAAA,UACjF,SAAA,CAAU;AAAA,SACX,CAAA;AAAA,MACH;AAEA,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,MAAM,YAAY,MAAA,EAAO;AAAA,MAC3B;AAEA,MAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,IAAA;AAAA,QAClB,CAAA,EAAG,cAAc,IAAA,GAAO,WAAA,GAAc,aAAa,CAAA,EAAA,EAAK,SAAA,CAAU,IAAI,CAAA,EAAA,EAAK,aAAa,CAAA,GAAA;AAAA,OAC1F;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,MAAM,YAAY,QAAA,EAAS;AAAA,MAC7B;AACA,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,aAAa,SAAS,CAAA,YAAA,EAAe,UAAU,IAAI,CAAA,GAAA,EAAO,MAAgB,OAAO,CAAA;AAAA,OACnF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,SAAA,EAA8B;AACtD,IAAA,MAAM,OAAA,GAAU,CAAA,EAAG,SAAA,CAAU,IAAI,CAAA,CAAA,EAAI,SAAA,CAAU,EAAA,CAAG,QAAA,EAAU,CAAA,CAAA,EAAI,SAAA,CAAU,IAAA,CAAK,UAAU,CAAA,CAAA;AACzF,IAAA,OAAOK,WAAW,QAAQ,CAAA,CAAE,OAAO,OAAO,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,EAC1D;AACF;;;ACnVO,IAAM,uBAAN,MAA2B;AAAA,EAChC,WAAA,CACmB,SACA,MAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQH,MAAM,YAAA,CACJ,KAAA,EACA,SAAA,EACA,WACA,KAAA,EACe;AACf,IAAA,QAAQ,KAAA;AAAO,MACb,KAAK,QAAA,EAAU;AAEb,QAAA,MAAM,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,KAAA,EAAO,CAAC,CAAA,KAAM;AACzC,UAAA,CAAA,CAAE,SAAA,CAAU,WAAW,MAAM,CAAA;AAAA,QAC/B,CAAC,CAAA;AACD,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,SAAA,EAAW;AAEd,QAAA,MAAM,KAAK,OAAA,CAAQ,OAAA;AAAA,UACjB,UAAU,KAAK,CAAA,KAAA,EAAQ,SAAS,CAAA,GAAA,EAAM,SAAS,UAAU,SAAS,CAAA,QAAA;AAAA,SACpE;AACA,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,UAAA,EAAY;AACf,QAAA,MAAM,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,KAAA,EAAO,CAAC,CAAA,KAAM;AACzC,UAAA,CAAA,CAAE,WAAW,SAAS,CAAA;AAAA,QACxB,CAAC,CAAA;AACD,QAAA;AAAA,MACF;AAAA;AACF,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAA,CACJ,KAAA,EACA,MAAA,EACA,OAAA,EACA,WACA,KAAA,EACe;AACf,IAAA,MAAM,UAAA,GAAa,GAAG,MAAM,CAAA,IAAA,CAAA;AAE5B,IAAA,QAAQ,KAAA;AAAO,MACb,KAAK,QAAA,EAAU;AACb,QAAA,MAAM,IAAA,CAAK,QAAQ,OAAA,CAAQ,CAAA,YAAA,EAAe,KAAK,CAAA,YAAA,EAAe,UAAU,CAAA,CAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AACrF,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,SAAA,EAAW;AACd,QAAA,MAAM,IAAA,CAAK,QAAQ,OAAA,CAAQ,CAAA,OAAA,EAAU,KAAK,CAAA,KAAA,EAAQ,UAAU,CAAA,GAAA,EAAM,SAAS,CAAA,CAAE,CAAA;AAC7E,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,UAAA,EAAY;AACf,QAAA,MAAM,KAAK,OAAA,CAAQ,OAAA,CAAQ,eAAe,KAAK,CAAA,aAAA,EAAgB,MAAM,CAAA,CAAE,CAAA;AACvE,QAAA,MAAM,IAAA,CAAK,QAAQ,OAAA,CAAQ,CAAA,YAAA,EAAe,KAAK,CAAA,eAAA,EAAkB,UAAU,CAAA,IAAA,EAAO,MAAM,CAAA,CAAE,CAAA;AAC1F,QAAA;AAAA,MACF;AAAA;AACF,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,CACJ,WAAA,EACA,QAAA,EACA,aAAA,EACA,kBACA,KAAA,EACe;AACf,IAAA,QAAQ,KAAA;AAAO,MACb,KAAK,QAAA,EAAU;AAEb,QAAA,MAAM,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,QAAA,EAAU,CAAC,CAAA,KAAM;AAC7C,UAAA,CAAA,CAAE,WAAW,IAAI,CAAA;AACjB,UAAA,CAAA,CAAE,OAAA,CAAQ,gBAAgB,CAAA,CAAE,OAAA,EAAQ;AAAA,QAEtC,CAAC,CAAA;AACD,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,SAAA,EAAW;AAEd,QAAA,MAAM,IAAA,GAAO,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AACpC,QAAA,MAAM,KAAK,OAAA,CAAQ,OAAA;AAAA,UACjB,CAAA,YAAA,EAAe,QAAQ,CAAA,EAAA,EAAK,gBAAgB,KAAK,IAAI,CAAA;AAAA,sBAAA,EACvC,IAAI,SAAS,WAAW,CAAA;AAAA,SACxC;AACA,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,UAAA,EAAY;AAEf,QAAA,KAAA,MAAW,OAAO,aAAA,EAAe;AAC/B,UAAA,MAAM,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,WAAA,EAAa,CAAC,CAAA,KAAM;AAC/C,YAAA,CAAA,CAAE,WAAW,GAAG,CAAA;AAAA,UAClB,CAAC,CAAA;AAAA,QACH;AACA,QAAA;AAAA,MACF;AAAA;AACF,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,CACJ,WAAA,EACA,WAAA,EACA,cAAA,EACA,YACA,KAAA,EACe;AACf,IAAA,QAAQ,KAAA;AAAO,MACb,KAAK,QAAA,EAAU;AAEb,QAAA,KAAA,MAAW,OAAO,cAAA,EAAgB;AAChC,UAAA,MAAM,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,WAAA,EAAa,CAAC,CAAA,KAAM;AAC/C,YAAA,CAAA,CAAE,SAAA,CAAU,KAAK,MAAM,CAAA;AAAA,UACzB,CAAC,CAAA;AAAA,QACH;AACA,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,SAAA,EAAW;AAEd,QAAA,MAAM,aAAa,cAAA,CAChB,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAG,WAAW,CAAA,CAAA,EAAI,GAAG,CAAA,GAAA,EAAM,WAAW,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,CAAA,CAC5D,KAAK,IAAI,CAAA;AAEZ,QAAA,MAAM,KAAK,OAAA,CAAQ,OAAA;AAAA,UACjB,UAAU,WAAW;AAAA,eAAA,EACd,UAAU;AAAA,gBAAA,EACT,WAAW;AAAA,iBAAA,EACV,WAAW,CAAA,MAAA,EAAS,WAAW,CAAA,CAAA,EAAI,UAAU,CAAA;AAAA,SACxD;AACA,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,UAAA,EAAY;AAEf,QAAA,MAAM,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,WAAW,CAAA;AACvC,QAAA;AAAA,MACF;AAAA;AACF,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAA,CACJ,KAAA,EACA,MAAA,EACA,cACA,KAAA,EACe;AACf,IAAA,QAAQ,KAAA;AAAO,MACb,KAAK,QAAA,EAAU;AAEb,QAAA,MAAM,KAAK,OAAA,CAAQ,OAAA;AAAA,UACjB,UAAU,KAAK,CAAA,KAAA,EAAQ,MAAM,CAAA,GAAA,EAAM,YAAY,UAAU,MAAM,CAAA,QAAA;AAAA,SACjE;AACA,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,SAAA,EAAW;AAEd,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAA;AAAA,UAChC,CAAA,8BAAA,EAAiC,KAAK,CAAA,OAAA,EAAU,MAAM,CAAA,QAAA;AAAA,SACxD;AACA,QAAA,IAAI,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,KAAA,IAAS,OAAO,IAAA,CAAK,CAAC,CAAA,CAAE,KAAA,GAAQ,CAAA,EAAG;AACrD,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,CAAA,qBAAA,EAAwB,MAAA,CAAO,IAAA,CAAK,CAAC,EAAE,KAAK,CAAA,4BAAA;AAAA,WAC9C;AAAA,QACF;AACA,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,UAAA,EAAY;AAEf,QAAA,MAAM,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,KAAA,EAAO,CAAC,CAAA,KAAM;AACzC,UAAA,CAAA,CAAE,aAAa,MAAA,EAAQ,MAAA,EAAQ,EAAE,QAAA,EAAU,OAAO,CAAA;AAAA,QACpD,CAAC,CAAA;AACD,QAAA;AAAA,MACF;AAAA;AACF,EACF;AACF;AAKO,SAAS,0BAAA,CACd,SACA,MAAA,EACsB;AACtB,EAAA,OAAO,IAAI,oBAAA,CAAqB,OAAA,EAAS,MAAM,CAAA;AACjD;AC5PO,IAAM,eAAN,MAAmB;AAAA,EACxB,YAA6B,SAAA,EAAmB;AAAnB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EAAoB;AAAA;AAAA;AAAA;AAAA,EAKjD,MAAM,OAAA,GAAiC;AAErC,IAAA,MAAM,KAAA,GAAQ,MAAME,OAAAA,CAAQ,IAAA,CAAK,SAAS,CAAA;AAE1C,IAAA,MAAM,cAAc,KAAA,CACjB,MAAA,CAAO,CAAC,CAAA,KAAM,gBAAA,CAAiB,KAAK,CAAC,CAAA,IAAK,CAAC,CAAA,CAAE,QAAA,CAAS,OAAO,CAAC,CAAA,CAC9D,MAAK,CACL,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACX,IAAA,EAAM,IAAA,CAAK,aAAA,CAAc,CAAC,CAAA;AAAA,MAC1B,IAAA,EAAM,OAAA,CAAQ,IAAA,CAAK,SAAA,EAAW,CAAC;AAAA,KACjC,CAAE,CAAA;AAEJ,IAAA,OAAO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,UAAA,EAAqC;AAC9C,IAAA,MAAM,OAAA,GAAUC,aAAAA,CAAc,UAAU,CAAA,CAAE,IAAA;AAC1C,IAAA,MAAM,MAAA,GAAS,MAAM,OAAO,OAAA,CAAA;AAC5B,IAAA,MAAM,MAAA,GAAS,OAAO,OAAA,IAAW,MAAA;AAEjC,IAAA,IAAI,CAAC,MAAA,IAAU,OAAO,MAAA,CAAO,QAAQ,UAAA,EAAY;AAC/C,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,UAAU,CAAA,+BAAA,CAAiC,CAAA;AAAA,IAChF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,QAAA,EAA0B;AAC9C,IAAA,OAAOC,QAAAA,CAAS,QAAQ,CAAA,CAAE,OAAA,CAAQ,kBAAkB,EAAE,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,iBAAiB,IAAA,EAAsB;AAE5C,IAAA,MAAM,SAAA,GAAY,IAAA,CACf,UAAA,CAAW,iBAAA,EAAmB,OAAO,EACrC,UAAA,CAAW,SAAA,EAAW,GAAG,CAAA,CACzB,WAAA,EAAY;AAEf,IAAA,OAAO,GAAG,SAAS,CAAA,UAAA,CAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,kBAAkB,IAAA,EAAsB;AAC7C,IAAA,MAAM,SAAA,GAAY,KACf,KAAA,CAAM,GAAG,EACT,GAAA,CAAI,CAAC,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,KAAgB,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA,CAC1D,KAAK,EAAE,CAAA;AAEV,IAAA,OAAO,CAAA;AAAA,GAAA,EACN,SAAS,CAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAAA,EAgBZ;AACF;;;AC7EO,IAAM,eAAN,MAAmB;AAAA,EAIxB,WAAA,CACmB,SACjB,OAAA,EACA;AAFiB,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAGjB,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,YAAA,CAAa,OAAA,CAAQ,SAAS,CAAA;AAAA,EAClD;AAAA,EATiB,MAAA;AAAA,EACA,OAAA;AAAA;AAAA;AAAA;AAAA,EAajB,MAAM,GAAA,GAA+B;AACnC,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,MAAA,CAAO,OAAA,EAAQ;AACxC,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,aAAA,CAAc,KAAK,CAAA;AAC9C,IAAA,MAAM,UAA0B,EAAC;AAEjC,IAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAChC,MAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,MAAA,IAAI;AACF,QAAA,MAAM,SAAS,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,KAAK,IAAI,CAAA;AAC/C,QAAA,MAAM,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA;AAE7B,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,OAAA,EAAS,IAAA;AAAA,UACT,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,SACxB,CAAA;AAAA,MACH,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,OAAA,EAAS,KAAA;AAAA,UACT,OAAQ,KAAA,CAAgB,OAAA;AAAA,UACxB,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,SACxB,CAAA;AAGD,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,IAAA,EAAqC;AACnD,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,MAAA,CAAO,OAAA,EAAQ;AACxC,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,IAAA,IAAQ,CAAA,CAAE,IAAA,KAAS,CAAA,EAAG,IAAI,CAAA,OAAA,CAAS,CAAA;AAE7E,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAO;AAAA,QACL,IAAA;AAAA,QACA,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,qBAAqB,IAAI,CAAA,CAAA;AAAA,QAChC,QAAA,EAAU;AAAA,OACZ;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,KAAK,IAAI,CAAA;AAC/C,MAAA,MAAM,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA;AAE7B,MAAA,OAAO;AAAA,QACL,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,OAAA,EAAS,IAAA;AAAA,QACT,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,OACzB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,OAAA,EAAS,KAAA;AAAA,QACT,OAAQ,KAAA,CAAgB,OAAA;AAAA,QACxB,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,OACzB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,KAAA,EAAmC;AACvD,IAAA,IAAI,QAAA,GAAW,KAAA;AAGf,IAAA,IAAI,KAAK,OAAA,CAAQ,IAAA,IAAQ,KAAK,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA,EAAG;AACrD,MAAA,QAAA,GAAW,QAAA,CAAS,MAAA;AAAA,QAAO,CAAC,CAAA,KAC1B,IAAA,CAAK,OAAA,CAAQ,KAAM,IAAA,CAAK,CAAC,IAAA,KAAS,CAAA,CAAE,SAAS,IAAA,IAAQ,CAAA,CAAE,IAAA,KAAS,CAAA,EAAG,IAAI,CAAA,OAAA,CAAS;AAAA,OAClF;AAAA,IACF;AAGA,IAAA,IAAI,KAAK,OAAA,CAAQ,MAAA,IAAU,KAAK,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAA,EAAG;AACzD,MAAA,QAAA,GAAW,QAAA,CAAS,MAAA;AAAA,QAClB,CAAC,CAAA,KAAM,CAAC,IAAA,CAAK,OAAA,CAAQ,OAAQ,IAAA,CAAK,CAAC,IAAA,KAAS,CAAA,CAAE,SAAS,IAAA,IAAQ,CAAA,CAAE,IAAA,KAAS,CAAA,EAAG,IAAI,CAAA,OAAA,CAAS;AAAA,OAC5F;AAAA,IACF;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,GAA8B;AAClC,IAAA,OAAO,IAAA,CAAK,OAAO,OAAA,EAAQ;AAAA,EAC7B;AACF;ACtFO,IAAM,kBAAA,GAAN,cAAiCR,YAAAA,CAAa;AAAA,EAC3C,MAAA,uBAA4C,GAAA,EAAI;AAAA,EAChD,cAKH,EAAC;AAAA,EACE,UAAA,uBAAyC,GAAA,EAAI;AAAA,EAC7C,kBAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EAER,WAAA,CACE,OAAA,EACA,OAAA,GAII,EAAC,EACL;AACA,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,kBAAA,GAAqB,QAAQ,kBAAA,IAAsB,GAAA;AACxD,IAAA,IAAA,CAAK,SAAA,GAAY,QAAQ,SAAA,IAAa,GAAA;AACtC,IAAA,IAAA,CAAK,OAAA,GAAU,QAAQ,OAAA,IAAW,IAAA;AAAA,EACpC;AAAA,EAEA,UAAA,CAAW,SAAA,EAAmB,QAAA,GAAoC,IAAI,MAAA,EAAyB;AAC7F,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,OAAO,EAAA;AAAA,IACT;AAEA,IAAA,MAAM,EAAA,GAAK,KAAK,eAAA,EAAgB;AAChC,IAAA,MAAM,KAAA,GAA0B;AAAA,MAC9B,EAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA,EAAW,YAAY,GAAA,EAAI;AAAA,MAC3B,QAAA;AAAA,MACA,MAAA,EAAQ,SAAA;AAAA,MACR,MAAA;AAAA,MACA,UAAU;AAAC,KACb;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,EAAA,EAAI,KAAK,CAAA;AAGzB,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA;AAC1C,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,WAAA,CAAY,QAAA,CAAS,KAAK,EAAE,CAAA;AAAA,MAC9B;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,IAAA,GAAO,IAAA,CAAK,SAAA,EAAW;AACrC,MAAA,MAAM,YAAA,GAAe,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,CAAA,CAClD,IAAA,CAAK,CAAC,GAAG,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,GAAY,CAAA,CAAE,SAAS,CAAA,CAChD,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,GAAY,GAAG,CAAC,CAAA;AAE5C,MAAA,YAAA,CAAa,OAAA,CAAQ,CAAC,CAACS,GAAE,MAAM,IAAA,CAAK,MAAA,CAAO,MAAA,CAAOA,GAAE,CAAC,CAAA;AAAA,IACvD;AAEA,IAAA,IAAA,CAAK,IAAA,CAAK,cAAc,KAAK,CAAA;AAC7B,IAAA,OAAO,EAAA;AAAA,EACT;AAAA,EAEA,QAAA,CAAS,IAAY,KAAA,EAAqB;AACxC,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,CAAC,EAAA,EAAI;AACxB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAChC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA;AAAA,IACF;AAEA,IAAA,KAAA,CAAM,OAAA,GAAU,YAAY,GAAA,EAAI;AAChC,IAAA,KAAA,CAAM,QAAA,GAAW,KAAA,CAAM,OAAA,GAAU,KAAA,CAAM,SAAA;AACvC,IAAA,KAAA,CAAM,MAAA,GAAS,QAAQ,QAAA,GAAW,WAAA;AAClC,IAAA,KAAA,CAAM,KAAA,GAAQ,KAAA;AAGd,IAAA,IAAI,KAAA,CAAM,WAAW,IAAA,CAAK,kBAAA,IAAsB,MAAM,SAAA,CAAU,QAAA,CAAS,OAAO,CAAA,EAAG;AACjF,MAAA,MAAM,SAAA,GAAY;AAAA,QAChB,KAAA,EAAQ,KAAA,CAAM,QAAA,CAAS,KAAK,CAAA,IAAgB,EAAA;AAAA,QAC5C,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,SAAA,sBAAe,IAAA,EAAK;AAAA,QACpB,MAAA,EAAQ,KAAA,CAAM,QAAA,CAAS,QAAQ;AAAA,OACjC;AAEA,MAAA,IAAA,CAAK,WAAA,CAAY,KAAK,SAAS,CAAA;AAC/B,MAAA,IAAA,CAAK,IAAA,CAAK,aAAa,SAAS,CAAA;AAGhC,MAAA,IAAI,IAAA,CAAK,WAAA,CAAY,MAAA,GAAS,GAAA,EAAK;AACjC,QAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,IAAI,CAAA;AAAA,MAChD;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,EAC7B;AAAA,EAEA,MAAM,YAAA,CAAahB,IAAAA,EAAa,MAAA,EAAiD;AAC/E,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,IAAI,UAAA;AAGJ,MAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,IAAA,KAAS,YAAA,EAAc;AACtC,QAAA,UAAA,GAAa,2CAA2CA,IAAG,CAAA,CAAA;AAAA,MAC7D,CAAA,MAAA,IAAW,IAAA,CAAK,OAAA,CAAQ,IAAA,KAAS,OAAA,EAAS;AACxC,QAAA,UAAA,GAAa,uBAAuBA,IAAG,CAAA,CAAA;AAAA,MACzC,CAAA,MAAO;AACL,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,YAAY,MAAM,CAAA;AAE1D,MAAA,IAAI,MAAA,CAAO,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AAC1B,QAAA,MAAM,OAAO,IAAA,CAAK,kBAAA,CAAmB,MAAA,CAAO,IAAA,CAAK,CAAC,CAA4B,CAAA;AAC9E,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAIA,IAAAA,EAAK,IAAI,CAAA;AAC7B,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AAEd,MAAA,IAAA,CAAK,KAAK,cAAA,EAAgB,EAAE,GAAA,EAAAA,IAAAA,EAAK,OAAO,CAAA;AAAA,IAC1C;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,mBAAmB,MAAA,EAAmD;AAC5E,IAAA,IAAI;AACF,MAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,IAAA,KAAS,YAAA,EAAc;AACtC,QAAA,MAAM,QAAA,GAAY,MAAA,CAAO,YAAY,CAAA,IAAe,MAAA;AACpD,QAAA,MAAM,OAAO,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,QAAA,CAAS,CAAC,CAAA,GAAI,QAAA;AAErD,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,KAAK,KAAA,IAAS,EAAA;AAAA,UACrB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,QAAQ,IAAI,CAAA;AAAA,UACtC,IAAA,EAAM,IAAA,CAAK,IAAA,GAAO,YAAY,CAAA,IAAK,CAAA;AAAA,UACnC,IAAA,EAAM,IAAA,CAAK,IAAA,GAAO,WAAW,CAAA,IAAK,CAAA;AAAA,UAClC,KAAA,EAAO,IAAA,CAAK,IAAA,GAAO,YAAY,CAAA,IAAK,CAAA;AAAA,UACpC,UAAA,EAAY,IAAA,CAAK,IAAA,GAAO,mBAAmB,CAAA,IAAK,CAAA;AAAA,UAChD,UAAA,EAAY,IAAA,CAAK,IAAA,GAAO,aAAa,CAAA,IAAK;AAAA,SAC5C;AAAA,MACF,CAAA,MAAA,IAAW,IAAA,CAAK,OAAA,CAAQ,IAAA,KAAS,OAAA,EAAS;AACxC,QAAA,MAAM,OAAO,OAAO,MAAA,KAAW,WAAW,IAAA,CAAK,KAAA,CAAM,MAAgB,CAAA,GAAI,MAAA;AACzE,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,IAAe,EAAC;AAExC,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,EAAA;AAAA,UACP,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,UACzB,IAAA,EAAM,UAAA,CAAW,SAAA,EAAW,UAAA,IAAc,CAAA;AAAA,UAC1C,IAAA,EAAM,UAAA,CAAW,KAAA,EAAO,sBAAA,IAA0B,CAAA;AAAA,UAClD,KAAA,EAAO;AAAA,SACT;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,kBAAA,CAAmB,QAAA,GAAmB,IAAA,EAAuC;AACjF,IAAA,MAAM,GAAA,GAAM,YAAY,GAAA,EAAI;AAC5B,IAAA,MAAM,SAAS,GAAA,GAAM,QAAA;AAGrB,IAAA,MAAM,eAAe,KAAA,CAAM,IAAA,CAAK,KAAK,MAAA,CAAO,MAAA,EAAQ,CAAA,CAAE,MAAA;AAAA,MACpD,CAAC,KAAA,KAAU,KAAA,CAAM,SAAA,GAAY,MAAA,IAAU,MAAM,MAAA,KAAW;AAAA,KAC1D;AAGA,IAAA,MAAM,cAAA,uBAAqB,GAAA,EAAkD;AAC7E,IAAA,IAAI,SAAA,GAAY,CAAA;AAEhB,IAAA,YAAA,CAAa,OAAA,CAAQ,CAAC,KAAA,KAAU;AAC9B,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,GAAA,CAAI,KAAA,CAAM,SAAS,KAAK,EAAE,SAAA,EAAW,CAAA,EAAG,KAAA,EAAO,CAAA,EAAE;AAC9E,MAAA,KAAA,CAAM,SAAA,IAAa,MAAM,QAAA,IAAY,CAAA;AACrC,MAAA,KAAA,CAAM,KAAA,IAAS,CAAA;AACf,MAAA,cAAA,CAAe,GAAA,CAAI,KAAA,CAAM,SAAA,EAAW,KAAK,CAAA;AACzC,MAAA,SAAA,IAAa,MAAM,QAAA,IAAY,CAAA;AAAA,IACjC,CAAC,CAAA;AAGD,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,IAAA,CAAK,cAAA,CAAe,OAAA,EAAS,CAAA,CACpD,GAAA,CAAI,CAAC,CAAC,SAAA,EAAW,KAAK,CAAA,MAAO;AAAA,MAC5B,SAAA;AAAA,MACA,eAAA,EAAiB,KAAA,CAAM,SAAA,GAAY,KAAA,CAAM,KAAA;AAAA,MACzC,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,MAAA,EAAS,KAAA,CAAM,SAAA,GAAY,SAAA,GAAa;AAAA,KAC1C,CAAE,CAAA,CACD,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,MAAA,GAAS,CAAA,CAAE,MAAM,CAAA,CAClC,KAAA,CAAM,GAAG,EAAE,CAAA;AAGd,IAAA,MAAM,kBAA4B,EAAC;AAGnC,IAAA,MAAM,WAAA,GAAc,KAAK,WAAA,CAAY,MAAA;AAAA,MACnC,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,WAAA,GAAc,QAAA,CAAS,QAAQ,CAAA,IAAK,CAAA,CAAE,QAAA,GAAW;AAAA,KAClE;AACA,IAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,MAAA,eAAA,CAAgB,KAAK,iEAAiE,CAAA;AAAA,IACxF;AAGA,IAAA,MAAM,WAAA,uBAAkB,GAAA,EAAoB;AAC5C,IAAA,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAA,KAAM;AAC9B,MAAA,MAAM,UAAA,GAAa,EAAE,KAAA,CAAM,UAAA,CAAW,QAAQ,GAAG,CAAA,CAAE,UAAA,CAAW,MAAA,EAAQ,GAAG,CAAA;AACzE,MAAA,WAAA,CAAY,IAAI,UAAA,EAAA,CAAa,WAAA,CAAY,IAAI,UAAU,CAAA,IAAK,KAAK,CAAC,CAAA;AAAA,IACpE,CAAC,CAAA;AAED,IAAA,MAAM,iBAAA,GAAoB,KAAA,CAAM,IAAA,CAAK,WAAA,CAAY,SAAS,CAAA,CAAE,MAAA,CAAO,CAAC,GAAGM,MAAK,CAAA,KAAMA,SAAQ,EAAE,CAAA;AAE5F,IAAA,IAAI,iBAAA,CAAkB,SAAS,CAAA,EAAG;AAChC,MAAA,eAAA,CAAgB,IAAA;AAAA,QACd;AAAA,OACF;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,YAAA,EAAa;AAC5C,IAAA,IAAI,SAAA,CAAU,UAAU,CAAA,EAAG;AACzB,MAAA,eAAA,CAAgB,IAAA;AAAA,QACd,CAAA,6EAAA,EAAgF,UAAU,KAAK,CAAA,EAAA;AAAA,OACjG;AAAA,IACF;AAGA,IAAA,MAAM,mBAAmB,YAAA,CAAa,MAAA;AAAA,MACpC,CAAC,MAAM,CAAA,CAAE,SAAA,CAAU,SAAS,aAAa,CAAA,IAAA,CAAM,CAAA,CAAE,QAAA,IAAY,CAAA,IAAK;AAAA,KACpE;AACA,IAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,MAAA,eAAA,CAAgB,IAAA;AAAA,QACd;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,WAAA,EAAa,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,GAAG,CAAA;AAAA,MACvC,YAAY,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA;AAAA,MAC/C,WAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,YAAY,OAAA,EAA2C;AACrD,IAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA;AAEhD,IAAA,OAAA,CAAQ,KAAA,GAAQ,OACdN,IAAAA,EACA,MAAA,EACA,OAAA,KAC4B;AAC5B,MAAA,MAAM,OAAA,GAAU,KAAK,UAAA,CAAW,OAAA,EAAS,EAAE,GAAA,EAAAA,IAAAA,EAAK,QAAQ,CAAA;AAExD,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,aAAA,CAAiBA,IAAAA,EAAK,QAAQ,OAAO,CAAA;AAC1D,QAAA,IAAA,CAAK,SAAS,OAAO,CAAA;AAGrB,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AACrC,QAAA,IAAI,KAAA,EAAO,QAAA,IAAY,KAAA,CAAM,QAAA,GAAW,KAAK,kBAAA,EAAoB;AAC/D,UAAA,IAAA,CAAK,YAAA,CAAaA,IAAAA,EAAK,MAAM,CAAA,CAAE,MAAM,MAAM;AAAA,UAE3C,CAAC,CAAA;AAAA,QACH;AAEA,QAAA,OAAO,MAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,QAAA,CAAS,SAAS,KAAc,CAAA;AACrC,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAA;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAClB,IAAA,IAAA,CAAK,cAAc,EAAC;AACpB,IAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AAAA,EACxB;AAAA,EAEA,MAAA,GAAe;AACb,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,EACjB;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AAAA,EACjB;AAAA,EAEA,SAAA,GAAqB;AACnB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEQ,eAAA,GAA0B;AAChC,IAAA,OAAO,CAAA,MAAA,EAAS,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AAAA,EACvE;AAAA,EAEA,UAAU,MAAA,EAKa;AACrB,IAAA,IAAI,SAAS,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA;AAE5C,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAI,OAAO,SAAA,EAAW;AACpB,QAAA,MAAA,GAAS,MAAA,CAAO,OAAO,CAAC,CAAA,KAAM,EAAE,SAAA,CAAU,QAAA,CAAS,MAAA,CAAO,SAAU,CAAC,CAAA;AAAA,MACvE;AACA,MAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,QAAA,MAAA,GAAS,OAAO,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,OAAO,MAAM,CAAA;AAAA,MAC1D;AACA,MAAA,IAAI,MAAA,CAAO,gBAAgB,MAAA,EAAW;AACpC,QAAA,MAAA,GAAS,MAAA,CAAO,OAAO,CAAC,CAAA,KAAA,CAAO,EAAE,QAAA,IAAY,CAAA,KAAM,OAAO,WAAY,CAAA;AAAA,MACxE;AACA,MAAA,IAAI,MAAA,CAAO,WAAW,MAAA,EAAW;AAC/B,QAAA,MAAA,GAAS,OAAO,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,OAAO,MAAM,CAAA;AAAA,MAC1D;AAAA,IACF;AAEA,IAAA,OAAO,MAAA,CAAO,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,SAAA,GAAY,EAAE,SAAS,CAAA;AAAA,EACxD;AAAA,EAEA,cAAA,CAAe,QAAQ,EAAA,EAA6B;AAClD,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,CAAC,KAAK,CAAA;AAAA,EACtC;AAAA,EAEA,YAAA,GAAuB;AACrB,IAAA,MAAM,SAAS,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA;AAC9C,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,EACvC;AAAA,EAEA,aAAa,IAAA,EAAoB;AAC/B,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC9B,MAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,KAAU;AACxB,QAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,KAAK,CAAA;AAAA,MACjC,CAAC,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA6B,KAAA,CAAgB,OAAO,CAAA,CAAE,CAAA;AAAA,IACxE;AAAA,EACF;AACF;ACjYO,IAAM,cAAA,GAAN,cAA6BO,YAAAA,CAAa;AAAA,EACrC,MAAA,uBAAa,GAAA,EAA8B;AAAA,EAC3C,OAAA,GAAU,IAAA;AAAA,EACV,SAAA;AAAA,EAEV,WAAA,CAAY,SAAA,GAAY,GAAA,EAAQ,OAAA,GAAU,IAAA,EAAM;AAC9C,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA,EAEA,MAAA,GAAe;AACb,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,EACjB;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AAAA,EACjB;AAAA,EAEA,SAAA,GAAqB;AACnB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEU,eAAA,GAA0B;AAClC,IAAA,OAAO,CAAA,MAAA,EAAS,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AAAA,EACvE;AAAA,EAEA,UAAU,MAAA,EAKa;AACrB,IAAA,IAAI,SAAS,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA;AAE5C,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAI,OAAO,SAAA,EAAW;AACpB,QAAA,MAAA,GAAS,MAAA,CAAO,OAAO,CAAC,CAAA,KAAM,EAAE,SAAA,CAAU,QAAA,CAAS,MAAA,CAAO,SAAU,CAAC,CAAA;AAAA,MACvE;AACA,MAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,QAAA,MAAA,GAAS,OAAO,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,OAAO,MAAM,CAAA;AAAA,MAC1D;AACA,MAAA,IAAI,MAAA,CAAO,gBAAgB,MAAA,EAAW;AACpC,QAAA,MAAA,GAAS,MAAA,CAAO,OAAO,CAAC,CAAA,KAAA,CAAO,EAAE,QAAA,IAAY,CAAA,KAAM,OAAO,WAAY,CAAA;AAAA,MACxE;AACA,MAAA,IAAI,MAAA,CAAO,WAAW,MAAA,EAAW;AAC/B,QAAA,MAAA,GAAS,OAAO,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,OAAO,MAAM,CAAA;AAAA,MAC1D;AAAA,IACF;AAEA,IAAA,OAAO,MAAA,CAAO,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,SAAA,GAAY,EAAE,SAAS,CAAA;AAAA,EACxD;AAAA,EAEA,YAAA,GAAuB;AACrB,IAAA,MAAM,SAAS,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA;AAC9C,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,EACvC;AAAA,EAEA,aAAa,IAAA,EAAoB;AAC/B,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC9B,MAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,KAAU;AACxB,QAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,KAAK,CAAA;AAAA,MACjC,CAAC,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA6B,KAAA,CAAgB,OAAO,CAAA,CAAE,CAAA;AAAA,IACxE;AAAA,EACF;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAAA,EACpB;AACF,CAAA;;;ACnFO,IAAM,oBAAA,GAAN,cAAmC,cAAA,CAAe;AAAA,EACvD,UAAA,CAAW,SAAA,EAAmB,QAAA,GAAoC,IAAI,MAAA,EAAyB;AAC7F,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,OAAO,EAAA;AAAA,IACT;AAEA,IAAA,MAAM,EAAA,GAAK,KAAK,eAAA,EAAgB;AAChC,IAAA,MAAM,KAAA,GAA0B;AAAA,MAC9B,EAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA,EAAW,YAAY,GAAA,EAAI;AAAA,MAC3B,QAAA;AAAA,MACA,MAAA,EAAQ,SAAA;AAAA,MACR,MAAA;AAAA,MACA,UAAU;AAAC,KACb;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,EAAA,EAAI,KAAK,CAAA;AAGzB,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA;AAC1C,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,WAAA,CAAY,QAAA,CAAS,KAAK,EAAE,CAAA;AAAA,MAC9B;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,IAAA,GAAO,IAAA,CAAK,SAAA,EAAW;AACrC,MAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,IACxB;AAEA,IAAA,IAAA,CAAK,IAAA,CAAK,cAAc,KAAK,CAAA;AAC7B,IAAA,OAAO,EAAA;AAAA,EACT;AAAA,EAEA,QAAA,CAAS,IAAY,KAAA,EAAqB;AACxC,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,CAAC,EAAA,EAAI;AACxB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAChC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA;AAAA,IACF;AAEA,IAAA,KAAA,CAAM,OAAA,GAAU,YAAY,GAAA,EAAI;AAChC,IAAA,KAAA,CAAM,QAAA,GAAW,KAAA,CAAM,OAAA,GAAU,KAAA,CAAM,SAAA;AACvC,IAAA,KAAA,CAAM,MAAA,GAAS,QAAQ,QAAA,GAAW,WAAA;AAClC,IAAA,KAAA,CAAM,KAAA,GAAQ,KAAA;AAEd,IAAA,IAAA,CAAK,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,EAC7B;AAAA,EAEU,gBAAA,GAAyB;AACjC,IAAA,MAAM,YAAA,GAAe,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,CAAA,CAClD,IAAA,CAAK,CAAC,GAAG,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,GAAY,CAAA,CAAE,SAAS,CAAA,CAChD,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,GAAY,GAAG,CAAC,CAAA;AAE5C,IAAA,YAAA,CAAa,OAAA,CAAQ,CAAC,CAAC,EAAE,MAAM,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,EAAE,CAAC,CAAA;AAAA,EACvD;AAAA,EAEA,SAAS,EAAA,EAA0C;AACjD,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAAA,EAC3B;AAAA,EAEA,eAAe,QAAA,EAAsC;AACnD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,QAAQ,CAAA;AACvC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,OAAO,MAAA,CAAO,QAAA,CAAS,GAAA,CAAI,CAAC,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,EAAE,CAAC,CAAA,CAAE,MAAA,CAAO,CAAC,KAAA,KAAU,UAAU,MAAS,CAAA;AAAA,EAC/F;AAAA,EAEA,kBAAkB,MAAA,EAAyC;AACzD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA;AACnC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,cAAA,GAAiB,CAAC,KAAA,KAA8C;AACpE,MAAA,MAAM,QAAA,GAAW,MAAM,QAAA,CACpB,GAAA,CAAI,CAAC,EAAA,KAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,EAAE,CAAC,EAC/B,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,KAAU,MAAS,CAAA,CACrC,IAAI,CAAC,KAAA,KAAU,cAAA,CAAe,KAAK,CAAC,CAAA;AAEvC,MAAA,OAAO,EAAE,GAAG,KAAA,EAAO,QAAA,EAA0B;AAAA,IAC/C,CAAA;AAEA,IAAA,OAAO,eAAe,IAAI,CAAA;AAAA,EAC5B;AACF,CAAA;;;ACjFO,IAAM,kBAAA,GAAN,cAAiC,oBAAA,CAAqB;AAAA,EACjD,OAAA;AAAA,EACA,kBAAA;AAAA,EACA,cAKL,EAAC;AAAA,EACI,UAAA,uBAAiB,GAAA,EAAuB;AAAA,EAElD,YACE,OAAA,EACA,kBAAA,GAAqB,KACrB,SAAA,GAAY,GAAA,EACZ,UAAU,IAAA,EACV;AACA,IAAA,KAAA,CAAM,WAAW,OAAO,CAAA;AACxB,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,kBAAA,GAAqB,kBAAA;AAAA,EAC5B;AAAA,EAES,QAAA,CAAS,IAAY,KAAA,EAAqB;AACjD,IAAA,KAAA,CAAM,QAAA,CAAS,IAAI,KAAK,CAAA;AAExB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAChC,IAAA,IAAI,CAAC,OAAO,QAAA,EAAU;AACpB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,KAAA,CAAM,WAAW,IAAA,CAAK,kBAAA,IAAsB,MAAM,SAAA,CAAU,QAAA,CAAS,OAAO,CAAA,EAAG;AACjF,MAAA,MAAM,SAAA,GAAY;AAAA,QAChB,KAAA,EAAQ,KAAA,CAAM,QAAA,CAAS,KAAK,CAAA,IAAgB,EAAA;AAAA,QAC5C,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,SAAA,sBAAe,IAAA,EAAK;AAAA,QACpB,MAAA,EAAQ,KAAA,CAAM,QAAA,CAAS,QAAQ;AAAA,OACjC;AAEA,MAAA,IAAA,CAAK,WAAA,CAAY,KAAK,SAAS,CAAA;AAC/B,MAAA,IAAA,CAAK,IAAA,CAAK,aAAa,SAAS,CAAA;AAGhC,MAAA,IAAI,IAAA,CAAK,WAAA,CAAY,MAAA,GAAS,GAAA,EAAK;AACjC,QAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,IAAI,CAAA;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,YAAA,CAAaP,IAAAA,EAAa,MAAA,EAAiD;AAC/E,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,IAAI,UAAA;AAGJ,MAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,IAAA,KAAS,YAAA,EAAc;AACtC,QAAA,UAAA,GAAa,2CAA2CA,IAAG,CAAA,CAAA;AAAA,MAC7D,CAAA,MAAA,IAAW,IAAA,CAAK,OAAA,CAAQ,IAAA,KAAS,OAAA,EAAS;AACxC,QAAA,UAAA,GAAa,uBAAuBA,IAAG,CAAA,CAAA;AAAA,MACzC,CAAA,MAAO;AACL,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,YAAY,MAAM,CAAA;AAE1D,MAAA,IAAI,MAAA,CAAO,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AAC1B,QAAA,MAAM,OAAO,IAAA,CAAK,kBAAA,CAAmB,MAAA,CAAO,IAAA,CAAK,CAAC,CAA4B,CAAA;AAC9E,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAIA,IAAAA,EAAK,IAAI,CAAA;AAC7B,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,KAAK,cAAA,EAAgB,EAAE,GAAA,EAAAA,IAAAA,EAAK,OAAO,CAAA;AAAA,IAC1C;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEU,mBAAmB,MAAA,EAAmD;AAC9E,IAAA,IAAI;AACF,MAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,IAAA,KAAS,YAAA,EAAc;AACtC,QAAA,MAAM,QAAA,GAAY,MAAA,CAAO,YAAY,CAAA,IAAe,MAAA;AACpD,QAAA,MAAM,OAAO,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,QAAA,CAAS,CAAC,CAAA,GAAI,QAAA;AAErD,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,KAAK,KAAA,IAAS,EAAA;AAAA,UACrB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,QAAQ,IAAI,CAAA;AAAA,UACtC,IAAA,EAAM,IAAA,CAAK,IAAA,GAAO,YAAY,CAAA,IAAK,CAAA;AAAA,UACnC,IAAA,EAAM,IAAA,CAAK,IAAA,GAAO,WAAW,CAAA,IAAK,CAAA;AAAA,UAClC,KAAA,EAAO,IAAA,CAAK,IAAA,GAAO,YAAY,CAAA,IAAK,CAAA;AAAA,UACpC,UAAA,EAAY,IAAA,CAAK,IAAA,GAAO,mBAAmB,CAAA,IAAK,CAAA;AAAA,UAChD,UAAA,EAAY,IAAA,CAAK,IAAA,GAAO,aAAa,CAAA,IAAK;AAAA,SAC5C;AAAA,MACF,CAAA,MAAA,IAAW,IAAA,CAAK,OAAA,CAAQ,IAAA,KAAS,OAAA,EAAS;AACxC,QAAA,MAAM,OAAO,OAAO,MAAA,KAAW,WAAW,IAAA,CAAK,KAAA,CAAM,MAAgB,CAAA,GAAI,MAAA;AACzE,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,IAAe,EAAC;AAExC,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,EAAA;AAAA,UACP,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,UACzB,IAAA,EAAM,UAAA,CAAW,SAAA,EAAW,UAAA,IAAc,CAAA;AAAA,UAC1C,IAAA,EAAM,UAAA,CAAW,KAAA,EAAO,sBAAA,IAA0B,CAAA;AAAA,UAClD,KAAA,EAAO;AAAA,SACT;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,cAAA,CAAe,QAAQ,EAAA,EAA6B;AAClD,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,CAAC,KAAK,CAAA;AAAA,EACtC;AAAA,EAES,KAAA,GAAc;AACrB,IAAA,KAAA,CAAM,KAAA,EAAM;AACZ,IAAA,IAAA,CAAK,cAAc,EAAC;AACpB,IAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AAAA,EACxB;AACF,CAAA;;;ACzHO,IAAM,wBAAA,GAAN,cAAuC,kBAAA,CAAmB;AAAA,EAC/D,MAAM,kBAAA,CAAmB,QAAA,GAAmB,IAAA,EAAuC;AACjF,IAAA,MAAM,GAAA,GAAM,YAAY,GAAA,EAAI;AAC5B,IAAA,MAAM,SAAS,GAAA,GAAM,QAAA;AAGrB,IAAA,MAAM,eAAe,KAAA,CAAM,IAAA,CAAK,KAAK,MAAA,CAAO,MAAA,EAAQ,CAAA,CAAE,MAAA;AAAA,MACpD,CAAC,KAAA,KAAU,KAAA,CAAM,SAAA,GAAY,MAAA,IAAU,MAAM,MAAA,KAAW;AAAA,KAC1D;AAGA,IAAA,MAAM,cAAA,uBAAqB,GAAA,EAAkD;AAC7E,IAAA,IAAI,SAAA,GAAY,CAAA;AAEhB,IAAA,YAAA,CAAa,OAAA,CAAQ,CAAC,KAAA,KAAU;AAC9B,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,GAAA,CAAI,KAAA,CAAM,SAAS,KAAK,EAAE,SAAA,EAAW,CAAA,EAAG,KAAA,EAAO,CAAA,EAAE;AAC9E,MAAA,KAAA,CAAM,SAAA,IAAa,MAAM,QAAA,IAAY,CAAA;AACrC,MAAA,KAAA,CAAM,KAAA,IAAS,CAAA;AACf,MAAA,cAAA,CAAe,GAAA,CAAI,KAAA,CAAM,SAAA,EAAW,KAAK,CAAA;AACzC,MAAA,SAAA,IAAa,MAAM,QAAA,IAAY,CAAA;AAAA,IACjC,CAAC,CAAA;AAGD,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,IAAA,CAAK,cAAA,CAAe,OAAA,EAAS,CAAA,CACpD,GAAA,CAAI,CAAC,CAAC,SAAA,EAAW,KAAK,CAAA,MAAO;AAAA,MAC5B,SAAA;AAAA,MACA,eAAA,EAAiB,KAAA,CAAM,SAAA,GAAY,KAAA,CAAM,KAAA;AAAA,MACzC,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,MAAA,EAAS,KAAA,CAAM,SAAA,GAAY,SAAA,GAAa;AAAA,KAC1C,CAAE,CAAA,CACD,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,MAAA,GAAS,CAAA,CAAE,MAAM,CAAA,CAClC,KAAA,CAAM,GAAG,EAAE,CAAA;AAGd,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,uBAAA,CAAwB,YAAY,CAAA;AAEjE,IAAA,OAAO;AAAA,MACL,WAAA,EAAa,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,GAAG,CAAA;AAAA,MACvC,YAAY,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA;AAAA,MAC/C,WAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEU,wBAAwB,MAAA,EAAyB;AACzD,IAAA,MAAM,kBAA4B,EAAC;AAGnC,IAAA,MAAM,WAAA,GAAc,KAAK,WAAA,CAAY,MAAA;AAAA,MACnC,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,WAAA,GAAc,QAAA,CAAS,QAAQ,CAAA,IAAK,CAAA,CAAE,QAAA,GAAW;AAAA,KAClE;AACA,IAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,MAAA,eAAA,CAAgB,KAAK,iEAAiE,CAAA;AAAA,IACxF;AAGA,IAAA,MAAM,WAAA,uBAAkB,GAAA,EAAoB;AAC5C,IAAA,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAA,KAAM;AAC9B,MAAA,MAAM,UAAA,GAAa,EAAE,KAAA,CAAM,UAAA,CAAW,QAAQ,GAAG,CAAA,CAAE,UAAA,CAAW,MAAA,EAAQ,GAAG,CAAA;AACzE,MAAA,WAAA,CAAY,IAAI,UAAA,EAAA,CAAa,WAAA,CAAY,IAAI,UAAU,CAAA,IAAK,KAAK,CAAC,CAAA;AAAA,IACpE,CAAC,CAAA;AAED,IAAA,MAAM,iBAAA,GAAoB,KAAA,CAAM,IAAA,CAAK,WAAA,CAAY,SAAS,CAAA,CAAE,MAAA,CAAO,CAAC,GAAGM,MAAK,CAAA,KAAMA,SAAQ,EAAE,CAAA;AAE5F,IAAA,IAAI,iBAAA,CAAkB,SAAS,CAAA,EAAG;AAChC,MAAA,eAAA,CAAgB,IAAA;AAAA,QACd;AAAA,OACF;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,YAAA,EAAa;AAC5C,IAAA,IAAI,SAAA,CAAU,UAAU,CAAA,EAAG;AACzB,MAAA,eAAA,CAAgB,IAAA;AAAA,QACd,CAAA,6EAAA,EAAgF,UAAU,KAAK,CAAA,EAAA;AAAA,OACjG;AAAA,IACF;AAGA,IAAA,MAAM,mBAAmB,MAAA,CAAO,MAAA;AAAA,MAC9B,CAAC,MAAM,CAAA,CAAE,SAAA,CAAU,SAAS,aAAa,CAAA,IAAA,CAAM,CAAA,CAAE,QAAA,IAAY,CAAA,IAAK;AAAA,KACpE;AACA,IAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,MAAA,eAAA,CAAgB,IAAA;AAAA,QACd;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,eAAA;AAAA,EACT;AAAA,EAEA,cAAA,CAAe,QAAQ,EAAA,EAAsE;AAC3F,IAAA,MAAM,cAAA,uBAAqB,GAAA,EAAkD;AAE7E,IAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,CAAA,CAC5B,MAAA,CAAO,CAAC,KAAA,KAAU,MAAM,MAAA,KAAW,WAAW,CAAA,CAC9C,OAAA,CAAQ,CAAC,KAAA,KAAU;AAClB,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,GAAA,CAAI,KAAA,CAAM,SAAS,KAAK,EAAE,SAAA,EAAW,CAAA,EAAG,KAAA,EAAO,CAAA,EAAE;AAC9E,MAAA,KAAA,CAAM,SAAA,IAAa,MAAM,QAAA,IAAY,CAAA;AACrC,MAAA,KAAA,CAAM,KAAA,IAAS,CAAA;AACf,MAAA,cAAA,CAAe,GAAA,CAAI,KAAA,CAAM,SAAA,EAAW,KAAK,CAAA;AAAA,IAC3C,CAAC,CAAA;AAEH,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,cAAA,CAAe,OAAA,EAAS,CAAA,CACvC,GAAA,CAAI,CAAC,CAAC,SAAA,EAAW,KAAK,CAAA,MAAO;AAAA,MAC5B,SAAA;AAAA,MACA,WAAA,EAAa,KAAA,CAAM,SAAA,GAAY,KAAA,CAAM,KAAA;AAAA,MACrC,OAAO,KAAA,CAAM;AAAA,KACf,CAAE,CAAA,CACD,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,WAAA,GAAc,CAAA,CAAE,WAAW,CAAA,CAC5C,KAAA,CAAM,GAAG,KAAK,CAAA;AAAA,EACnB;AACF,CAAA;;;AC9HO,IAAM,mBAAA,GAAN,cAAkC,wBAAA,CAAyB;AAAA,EAChE,YAAY,OAAA,EAA2C;AACrD,IAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA;AAEhD,IAAA,OAAA,CAAQ,KAAA,GAAQ,OACdN,IAAAA,EACA,MAAA,EACA,OAAA,KAC4B;AAC5B,MAAA,MAAM,OAAA,GAAU,KAAK,UAAA,CAAW,OAAA,EAAS,EAAE,GAAA,EAAAA,IAAAA,EAAK,QAAQ,CAAA;AAExD,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,aAAA,CAAiBA,IAAAA,EAAK,QAAQ,OAAO,CAAA;AAC1D,QAAA,IAAA,CAAK,SAAS,OAAO,CAAA;AAGrB,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AACrC,QAAA,IAAI,KAAA,EAAO,QAAA,IAAY,KAAA,CAAM,QAAA,GAAW,KAAK,kBAAA,EAAoB;AAC/D,UAAA,IAAA,CAAK,YAAA,CAAaA,IAAAA,EAAK,MAAM,CAAA,CAAE,MAAM,MAAM;AAAA,UAE3C,CAAC,CAAA;AAAA,QACH;AAEA,QAAA,OAAO,MAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,QAAA,CAAS,SAAS,KAAc,CAAA;AACrC,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAA;AAGA,IAAA,IAAA,CAAK,UAAA,CAAW,OAAA,EAAS,kBAAA,EAAoB,aAAa,CAAA;AAC1D,IAAA,IAAA,CAAK,UAAA,CAAW,OAAA,EAAS,SAAA,EAAW,YAAY,CAAA;AAChD,IAAA,IAAA,CAAK,UAAA,CAAW,OAAA,EAAS,YAAA,EAAc,YAAY,CAAA;AAEnD,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEU,UAAA,CAAW,OAAA,EAAc,UAAA,EAAoB,aAAA,EAA6B;AAClF,IAAA,MAAM,QAAA,GAAW,QAAQ,UAAU,CAAA;AACnC,IAAA,IAAI,OAAO,aAAa,UAAA,EAAY;AAClC,MAAA;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,UAAU,CAAA,GAAI,OAAA,GAAU,IAAA,KAAgB;AAC9C,MAAA,MAAM,UAAU,IAAA,CAAK,UAAA,CAAW,GAAG,aAAa,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA,EAAI;AAAA,QAChE,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,CAAC;AAAA;AAAA,OACtB,CAAA;AAED,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,KAAA,CAAM,SAAS,IAAI,CAAA;AACjD,QAAA,IAAA,CAAK,SAAS,OAAO,CAAA;AACrB,QAAA,OAAO,MAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,QAAA,CAAS,SAAS,KAAc,CAAA;AACrC,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAA;AAAA,EACF;AAAA,EAEA,cAAc,OAAA,EAAgC;AAG5C,IAAA,IAAA,CAAK,IAAA,CAAK,kBAAA,EAAoB,EAAE,OAAA,EAAS,CAAA;AAAA,EAC3C;AACF,CAAA;;;AC1DO,IAAM,yBAAA,GAAN,cAAwC,mBAAA,CAAoB;AAAA,EACjE,WAAA,CACE,OAAA,EACA,OAAA,GAII,EAAC,EACL;AACA,IAAA,KAAA;AAAA,MACE,OAAA;AAAA,MACA,QAAQ,kBAAA,IAAsB,GAAA;AAAA,MAC9B,QAAQ,SAAA,IAAa,GAAA;AAAA,MACrB,QAAQ,OAAA,IAAW;AAAA,KACrB;AAAA,EACF;AACF;ACsCO,IAAM,iBAAA,GAAN,MAAM,kBAAA,CAAkB;AAAA,EACZ,SAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EAET,iBAAkC,EAAC;AAAA,EAE3C,WAAA,CACE,OAAA,GAKI,EAAC,EACL;AACA,IAAA,IAAA,CAAK,SAAA,GAAY,QAAQ,SAAA,IAAa,OAAA;AACtC,IAAA,IAAA,CAAK,SAAA,GAAY,QAAQ,SAAA,IAAa,GAAA;AACtC,IAAA,IAAA,CAAK,aAAA,GAAgB,QAAQ,aAAA,IAAiB,QAAA;AAC9C,IAAA,IAAA,CAAK,UAAA,GAAa,QAAQ,UAAA,IAAc,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,KAAA,EAAqB;AAC5B,IAAA,IAAA,CAAK,cAAA,GAAiB,EAAE,KAAA,EAAM;AAC9B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,EAAA,EAA2B;AAChC,IAAA,IAAA,CAAK,eAAe,EAAA,GAAK,EAAA;AACzB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,CAAU,OAAe,KAAA,EAAsB;AAC7C,IAAA,IAAA,CAAK,eAAe,KAAA,GAAQ,KAAA;AAC5B,IAAA,IAAA,CAAK,eAAe,KAAA,GAAQ,KAAA;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,IAAA,EAAsB;AAChC,IAAA,IAAA,CAAK,eAAe,IAAA,GAAO,IAAA;AAC3B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,CAASA,MAAa,MAAA,EAA0B;AAC9C,IAAA,IAAA,CAAK,cAAA,GAAiB,EAAE,KAAA,EAAOA,IAAAA,EAAK,MAAA,EAAO;AAC3C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,KAAA,EAAuB;AAClC,IAAA,IAAA,CAAK,cAAA,GAAiB,EAAE,KAAA,EAAM;AAC9B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,SAAA,EAAyB;AACnC,IAAA,IAAA,CAAK,eAAe,SAAA,GAAY,SAAA;AAChC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAgB;AACd,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,MAAM,OAAO,IAAA,CAAK,cAAA;AAClB,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,SAAA;AAGlC,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAGb,IAAA,IAAI,KAAK,KAAA,EAAO;AAEd,MAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAClB,MAAA,KAAA,CAAM,KAAK,IAAA,CAAK,SAAA,CAAU,KAAK,KAAA,EAAO,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,IACpD,CAAA,MAAA,IAAW,KAAK,KAAA,EAAO;AAErB,MAAA,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,KAAK,CAAA;AAE9B,MAAA,IAAI,IAAA,CAAK,OAAO,MAAA,EAAW;AACzB,QAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AACf,QAAA,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,MAC5B;AAEA,MAAA,IAAI,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,KAAA,KAAU,MAAA,EAAW;AAC1C,QAAA,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,KAAK,CAAA;AAC9B,QAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,MACvC;AAAA,IACF,WAAW,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA,EAAG;AAE9C,MAAA,KAAA,CAAM,IAAA,CAAK,GAAG,IAAA,CAAK,KAAK,CAAA;AAAA,IAC1B;AAGA,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA;AACrC,IAAA,IAAA,CAAK,iBAAiB,EAAC;AAEvB,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAiD;AAC/C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,cAAA,CAAe,IAAA,IAAQ,EAAC;AAC1C,IAAA,MAAM,OAAO,IAAA,CAAK,cAAA;AAGlB,IAAA,IAAI,IAAA,CAAK,SAAS,CAAC,IAAA,CAAK,SAAS,CAAA,MAAA,EAAS,IAAA,CAAK,KAAK,CAAA,CAAE,CAAA,EAAG;AACvD,MAAA,IAAA,CAAK,IAAA,CAAK,CAAA,MAAA,EAAS,IAAA,CAAK,KAAK,CAAA,CAAE,CAAA;AAAA,IACjC;AAEA,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,KAAK,KAAA,EAAM;AAAA,MAChB;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,CAAQ,OAAe,EAAA,EAA6B;AAClD,IAAA,OAAO,KAAK,QAAA,CAAS,KAAK,EAAE,MAAA,CAAO,EAAE,EAAE,KAAA,EAAM;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,CAAW,KAAA,EAAe,KAAA,EAAe,KAAA,EAAwB;AAC/D,IAAA,OAAO,IAAA,CAAK,SAAS,KAAK,CAAA,CAAE,UAAU,KAAA,EAAO,KAAK,EAAE,KAAA,EAAM;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,CAAMA,MAAa,MAAA,EAA4B;AAC7C,IAAA,OAAO,IAAA,CAAK,QAAA,CAASA,IAAAA,EAAK,MAAM,EAAE,KAAA,EAAM;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,CAAQ,KAAA,EAAe,OAAA,GAAoC,GAAA,EAAa;AACtE,IAAA,MAAM,KAAK,IAAA,CAAK,SAAA;AAChB,IAAA,IAAI,YAAY,GAAA,EAAK;AACnB,MAAA,OAAO,CAAA,EAAG,EAAE,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,KAAA,EAAQ,IAAA,CAAK,SAAS,CAAA,EAAG,KAAK,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,CAAA,CAAA;AAAA,IAC9E;AACA,IAAA,OAAO,CAAA,EAAG,EAAE,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,KAAA,EAAQ,IAAA,CAAK,SAAS,CAAA,EAAG,KAAK,CAAA,EAAG,IAAA,CAAK,SAAS,GAAG,OAAO,CAAA,CAAA;AAAA,EACxF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAA,EAAyB;AAC3B,IAAA,OAAO,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,GAAA,EAAM,IAAA,CAAK,SAAS,CAAA,EAAG,OAAO,CAAA,CAAA;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAA,CAAUA,MAAa,MAAA,EAA4B;AACzD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,EAAE,GAAA,EAAKA,IAAAA,CAAI,IAAA,EAAK,EAAG,MAAA,EAAQ,MAAA,IAAU,EAAC,EAAG,CAAA;AACxE,IAAA,OAAO,IAAA,CAAK,KAAK,OAAO,CAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAU,KAAA,EAAwB;AACxC,IAAA,MAAM,UAAU,OAAO,KAAA,KAAU,WAAW,KAAA,GAAQ,IAAA,CAAK,UAAU,KAAK,CAAA;AACxE,IAAA,OAAO,IAAA,CAAK,KAAK,OAAO,CAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKQ,KAAK,OAAA,EAAyB;AACpC,IAAA,OAAOW,WAAW,IAAA,CAAK,aAAa,CAAA,CACjC,MAAA,CAAO,OAAO,CAAA,CACd,MAAA,CAAO,KAAK,CAAA,CACZ,MAAM,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,UAAU,CAAC,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,SAAA,EAAsC;AAClD,IAAA,OAAO,IAAI,kBAAA,CAAkB;AAAA,MAC3B,SAAA;AAAA,MACA,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,eAAe,IAAA,CAAK,aAAA;AAAA,MACpB,YAAY,IAAA,CAAK;AAAA,KAClB,CAAA;AAAA,EACH;AACF;AAKO,IAAM,QAAA,GAAW,IAAI,iBAAA;;;AC3PrB,IAAM,YAAA,GAAN,MAAM,aAAA,CAAa;AAAA,EACP,OAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACD,GAAA;AAAA,EAER,KAAA,GAAoB;AAAA,IAC1B,IAAA,EAAM,CAAA;AAAA,IACN,MAAA,EAAQ,CAAA;AAAA,IACR,IAAA,EAAM,CAAA;AAAA,IACN,OAAA,EAAS,CAAA;AAAA,IACT,aAAA,EAAe,CAAA;AAAA,IACf,OAAA,EAAS;AAAA,GACX;AAAA,EAEA,YAAY,OAAA,EAA8B;AACxC,IAAA,IAAA,CAAK,UAAU,OAAA,CAAQ,OAAA;AACvB,IAAA,IAAA,CAAK,UAAA,GAAa,QAAQ,UAAA,IAAc,GAAA;AACxC,IAAA,IAAA,CAAK,WAAA,GAAc,QAAQ,WAAA,IAAe,IAAA;AAC1C,IAAA,IAAA,CAAK,SAAA,GAAY,QAAQ,SAAA,IAAa,EAAA;AACtC,IAAA,IAAA,CAAK,GAAA,GAAM,IAAI,iBAAA,CAAkB,EAAE,WAAW,OAAA,CAAQ,SAAA,IAAa,SAAS,CAAA;AAAA,EAC9E;AAAA,EAEA,MAAM,IAAiB,GAAA,EAAgC;AACrD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA;AACnC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,IAAmB,OAAO,CAAA;AAC5D,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAA,CAAK,SAAA,EAAU;AACf,MAAA,OAAO,MAAA,CAAO,IAAA;AAAA,IAChB;AACA,IAAA,IAAA,CAAK,UAAA,EAAW;AAChB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,GAAA,CAAiB,GAAA,EAAa,IAAA,EAAS,OAAA,GAA2B,EAAC,EAAkB;AACzF,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA;AACnC,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,IAAO,IAAA,CAAK,UAAA;AAChC,IAAA,IAAI,QAAQ,YAAA,IAAiB,MAAM,KAAK,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA,EAAI;AAChE,MAAA;AAAA,IACF;AACA,IAAA,MAAM,KAAA,GAAuB;AAAA,MAC3B,IAAA;AAAA,MACA,QAAA,EAAU,KAAK,GAAA,EAAI;AAAA,MACnB,WAAW,GAAA,GAAM,IAAA,CAAK,GAAA,EAAI,GAAI,MAAM,GAAA,GAAO,MAAA;AAAA,MAC3C,MAAM,OAAA,CAAQ;AAAA,KAChB;AACA,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,OAAA,EAAS,OAAO,GAAG,CAAA;AAC1C,IAAA,IAAI,OAAA,CAAQ,MAAM,MAAA,EAAQ;AACxB,MAAA,MAAM,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS,OAAA,CAAQ,IAAI,CAAA;AAAA,IAC/C;AACA,IAAA,IAAA,CAAK,SAAA,EAAU;AAAA,EACjB;AAAA,EAEA,MAAM,QAAA,CACJ,GAAA,EACA,OAAA,EACA,OAAA,GAA2B,EAAC,EAChB;AACZ,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAO,GAAG,CAAA;AACpC,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,MAAM,IAAA,GAAO,MAAM,OAAA,EAAQ;AAC3B,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,EAAM,OAAO,CAAA;AACjC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,GAAA,EAA+B;AAC1C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA;AACnC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,OAAO,CAAA;AAChD,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAA,CAAK,YAAA,EAAa;AAAA,IACpB;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,WAAW,IAAA,EAAiC;AAChD,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,IAAI,MAAM,IAAA,CAAK,MAAA,CAAO,GAAG,CAAA,EAAG;AAC1B,QAAA,OAAA,EAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,GAAA,EAA+B;AAC1C,IAAA,OAAO,KAAK,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,GAAG,CAAC,CAAA;AAAA,EACjD;AAAA,EAEA,MAAM,gBAAgB,GAAA,EAA8B;AAClD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA;AAC/B,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,IAAc,MAAM,CAAA;AACpD,IAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AACjB,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,IAAI,WAAA,GAAc,CAAA;AAClB,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,IAAI,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,GAAG,CAAA,EAAG;AAClC,QAAA,WAAA,EAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA;AAChC,IAAA,IAAA,CAAK,mBAAmB,WAAW,CAAA;AACnC,IAAA,OAAO,WAAA;AAAA,EACT;AAAA,EAEA,MAAM,iBAAiB,IAAA,EAAiC;AACtD,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,KAAA,IAAS,MAAM,IAAA,CAAK,eAAA,CAAgB,GAAG,CAAA;AAAA,IACzC;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAM,gBAAgB,KAAA,EAAgC;AACpD,IAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,CAAA,MAAA,EAAS,KAAK,CAAA,CAAE,CAAA;AAAA,EAC9C;AAAA,EAEA,MAAM,gBAAA,CAAiB,KAAA,EAAe,EAAA,EAAuC;AAC3E,IAAA,OAAO,KAAK,MAAA,CAAO,IAAA,CAAK,IAAI,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA;AAAA,EAChD;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,UAAU,IAAA,CAAK,OAAA;AACrB,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,MAAM,QAAQ,OAAA,EAAQ;AAAA,IACxB;AACA,IAAA,IAAA,CAAK,UAAA,EAAW;AAAA,EAClB;AAAA,EAEA,QAAA,GAAuB;AACrB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,KAAK,KAAA,CAAM,MAAA;AAC3C,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,KAAA,EAAO,OAAA,EAAS,KAAA,GAAQ,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,KAAA,GAAQ,CAAA,EAAE;AAAA,EAC3E;AAAA,EAEA,UAAA,GAAmB;AACjB,IAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,IAAA,EAAM,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,OAAA,EAAS,CAAA,EAAG,aAAA,EAAe,CAAA,EAAG,SAAS,CAAA,EAAE;AAAA,EACvF;AAAA,EAEA,MAAM,OAAO,GAAA,EAA8B;AACzC,IAAA,OAAO,KAAK,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,UAAA,CAAW,GAAG,CAAC,CAAA;AAAA,EAC9C;AAAA,EACA,MAAM,SAAA,CAAU,GAAA,EAAa,GAAA,EAA+B;AAC1D,IAAA,OAAO,KAAK,OAAA,CAAQ,MAAA,CAAO,KAAK,UAAA,CAAW,GAAG,GAAG,GAAG,CAAA;AAAA,EACtD;AAAA,EAEA,MAAM,SAAA,EAAiC;AACrC,IAAA,OAAO,IAAI,aAAA,CAAa;AAAA,MACtB,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,SAAA;AAAA,MACA,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,WAAW,IAAA,CAAK;AAAA,KACjB,CAAA;AAAA,EACH;AAAA,EAEQ,WAAW,GAAA,EAAqB;AACtC,IAAA,OAAO,KAAK,SAAA,GAAY,CAAA,EAAG,KAAK,SAAS,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,GAAK,GAAA;AAAA,EACvD;AAAA,EAEA,MAAc,YAAA,CAAa,GAAA,EAAa,IAAA,EAA+B;AACrE,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA;AAC/B,MAAA,MAAM,WAAY,MAAM,IAAA,CAAK,QAAQ,GAAA,CAAc,MAAM,KAAM,EAAC;AAChE,MAAA,IAAI,CAAC,QAAA,CAAS,QAAA,CAAS,GAAG,CAAA,EAAG;AAC3B,QAAA,QAAA,CAAS,KAAK,GAAG,CAAA;AACjB,QAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,QAAQ,CAAA;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,SAAA,GAAkB;AACxB,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,IAAA,CAAK,KAAA,CAAM,IAAA,EAAA;AAAA,IACb;AAAA,EACF;AAAA,EACQ,UAAA,GAAmB;AACzB,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,IAAA,CAAK,KAAA,CAAM,MAAA,EAAA;AAAA,IACb;AAAA,EACF;AAAA,EACQ,SAAA,GAAkB;AACxB,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,IAAA,CAAK,KAAA,CAAM,IAAA,EAAA;AAAA,IACb;AAAA,EACF;AAAA,EACQ,YAAA,GAAqB;AAC3B,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,IAAA,CAAK,KAAA,CAAM,OAAA,EAAA;AAAA,IACb;AAAA,EACF;AAAA,EACQ,mBAAmBL,MAAAA,EAAqB;AAC9C,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,IAAA,CAAK,MAAM,aAAA,IAAiBA,MAAAA;AAAA,IAC9B;AAAA,EACF;AACF;;;ACnNO,IAAM,uBAAN,MAAoD;AAAA,EACxC,iBAAA,GAAoB,CAAC,QAAA,EAAU,MAAA,EAAQ,UAAU,CAAA;AAAA,EACjD,UAAA,GAAa,IAAA;AAAA;AAAA,EAE9B,WAAA,CAAYN,MAAa,MAAA,EAA8B;AACrD,IAAA,MAAM,OAAA,GAAUA,KAAI,IAAA,EAAK,CAAE,MAAM,KAAK,CAAA,CAAE,CAAC,CAAA,EAAG,WAAA,EAAY;AAGxD,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,KAAK,iBAAA,CAAkB,QAAA,CAAS,OAAO,CAAA,EAAG;AACzD,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,IAAI,MAAA,CAAO,aAAa,CAAA,EAAG;AACzB,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,CAAE,MAAA;AAC1C,IAAA,IAAI,UAAA,GAAa,OAAO,IAAA,EAAM;AAE5B,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,WAAA,CAAYA,MAAa,OAAA,EAAqC;AAC5D,IAAA,IAAI,OAAA,EAAS,QAAQ,MAAA,EAAW;AAC9B,MAAA,OAAO,OAAA,CAAQ,GAAA;AAAA,IACjB;AAGA,IAAA,MAAM,QAAA,GAAWA,KAAI,WAAA,EAAY;AAEjC,IAAA,IAAI,SAAS,QAAA,CAAS,QAAQ,KAAK,QAAA,CAAS,QAAA,CAAS,MAAM,CAAA,EAAG;AAC5D,MAAA,OAAO,GAAA;AAAA,IACT;AAEA,IAAA,IAAI,QAAA,CAAS,QAAA,CAAS,MAAM,CAAA,EAAG;AAC7B,MAAA,OAAO,GAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA,EAEA,WAAA,CAAYA,IAAAA,EAAa,MAAA,EAAoB,OAAA,EAAqC;AAChF,IAAA,IAAI,SAAS,GAAA,EAAK;AAChB,MAAA,OAAO,OAAA,CAAQ,GAAA;AAAA,IACjB;AAEA,IAAA,OAAO,gBAAA,CAAiBA,MAAK,MAAM,CAAA;AAAA,EACrC;AAAA,EAEA,wBAAwBA,IAAAA,EAAuB;AAC7C,IAAA,MAAM,WAAqB,EAAC;AAC5B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,iBAAA,CAAkBA,IAAG,CAAA;AAEzC,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,KAAU;AACxB,MAAA,QAAA,CAAS,KAAK,CAAA,MAAA,EAAS,KAAK,CAAA,EAAA,CAAA,EAAM,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,IACtD,CAAC,CAAA;AAED,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEU,kBAAkBA,IAAAA,EAAuB;AACjD,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,MAAM,QAAA,GAAW;AAAA,MACf,oBAAA;AAAA,MACA,oBAAA;AAAA,MACA,sBAAA;AAAA,MACA,6BAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC5B,MAAA,IAAI,KAAA;AACJ,MAAA,OAAA,CAAQ,KAAA,GAAQ,OAAA,CAAQ,IAAA,CAAKA,IAAG,OAAO,IAAA,EAAM;AAC3C,QAAA,IAAI,KAAA,CAAM,CAAC,CAAA,EAAG;AACZ,UAAA,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAE,aAAa,CAAA;AAAA,QACpC;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAED,IAAA,OAAO,CAAC,GAAG,IAAI,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,EAC5B;AACF;AAEO,IAAM,kBAAA,GAAN,cAAiC,oBAAA,CAAqB;AAAA,EACnD,aAAA,uBAAoB,GAAA,EAAmD;AAAA,EAEtE,WAAA,CAAYA,MAAa,MAAA,EAA8B;AAC9D,IAAA,IAAI,CAAC,KAAA,CAAM,WAAA,CAAYA,IAAAA,EAAK,MAAM,CAAA,EAAG;AACnC,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAeA,IAAG,CAAA;AACvC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,OAAO,CAAA;AAE5C,IAAA,IAAI,KAAA,EAAO;AAET,MAAA,IAAI,KAAA,CAAM,OAAO,EAAA,EAAI;AACnB,QAAA,OAAO,IAAA;AAAA,MACT;AAGA,MAAA,IAAI,KAAA,CAAM,cAAc,GAAA,EAAK;AAC3B,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAES,WAAA,CAAYA,MAAa,OAAA,EAAqC;AACrE,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,WAAA,CAAYA,IAAAA,EAAK,OAAO,CAAA;AAC9C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAeA,IAAG,CAAA;AACvC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,OAAO,CAAA;AAE5C,IAAA,IAAI,KAAA,EAAO;AAET,MAAA,IAAI,KAAA,CAAM,OAAO,GAAA,EAAK;AACpB,QAAA,OAAO,OAAA,GAAU,CAAA;AAAA,MACnB;AAGA,MAAA,IAAI,KAAA,CAAM,OAAO,CAAA,EAAG;AAClB,QAAA,OAAO,OAAA,GAAU,CAAA;AAAA,MACnB;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,oBAAA,CAAqBA,MAAa,QAAA,EAAwB;AACxD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAeA,IAAG,CAAA;AACvC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,OAAO,KAAK,EAAE,IAAA,EAAM,CAAA,EAAG,WAAA,EAAa,CAAA,EAAE;AAE3E,IAAA,KAAA,CAAM,eAAe,KAAA,CAAM,WAAA,GAAc,MAAM,IAAA,GAAO,QAAA,KAAa,MAAM,IAAA,GAAO,CAAA,CAAA;AAChF,IAAA,KAAA,CAAM,IAAA,EAAA;AAEN,IAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,OAAA,EAAS,KAAK,CAAA;AAAA,EACvC;AAAA,EAEQ,eAAeA,IAAAA,EAAqB;AAE1C,IAAA,OAAOA,IAAAA,CACJ,UAAA,CAAW,MAAA,EAAQ,GAAG,EACtB,UAAA,CAAW,MAAA,EAAQ,GAAG,CAAA,CACtB,WAAW,UAAA,EAAY,GAAG,CAAA,CAC1B,WAAA,GACA,IAAA,EAAK;AAAA,EACV;AACF;;;AC1GO,IAAM,WAAN,MAAe;AAAA,EACZ,OAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA,uBAA4C,GAAA,EAAI;AAAA,EAChD,SAAA,uBAA0C,GAAA,EAAI;AAAA;AAAA,EAG/C,KAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EAEP,YAAY,OAAA,EAA0B;AACpC,IAAA,IAAA,CAAK,UAAU,OAAA,CAAQ,OAAA;AACvB,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,iBAAA,CAAkB;AAAA,MACxC,SAAA,EAAW,QAAQ,SAAA,IAAa;AAAA,KACjC,CAAA;AACD,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,KAAA;AACrB,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,UAAU,OAAA,CAAQ,OAAA;AAEvB,IAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,MACX,IAAA,EAAM,CAAA;AAAA,MACN,MAAA,EAAQ,CAAA;AAAA,MACR,IAAA,EAAM,CAAA;AAAA,MACN,OAAA,EAAS,CAAA;AAAA,MACT,aAAA,EAAe,CAAA;AAAA,MACf,OAAA,EAAS,CAAA;AAAA,MACT,IAAA,EAAM;AAAA,KACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBA,MAAM,WAAW,OAAA,EAAkD;AACjE,IAAA,IAAI,WAAA,GAAc,CAAA;AAGlB,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,MAAM,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAC,OAAA,CAAQ,MAAM,CAAA;AAE/E,MAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,QAAA,MAAM,OAAO,IAAA,CAAK,WAAA,CAAY,IAAI,KAAK,CAAA,wBAAS,GAAA,EAAI;AAEpD,QAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,UAAA,IAAI;AACF,YAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,GAAG,CAAA;AAC7C,YAAA,IAAI,OAAA,EAAS;AACX,cAAA,WAAA,EAAA;AACA,cAAA,IAAA,CAAK,KAAA,CAAM,OAAA,EAAA;AAAA,YACb;AAAA,UACF,SAAS,KAAA,EAAO;AACd,YAAA,IAAA,CAAK,WAAA,CAAY,OAAgB,GAAG,CAAA;AAAA,UACtC;AAAA,QACF;AAGA,QAAA,IAAI;AACF,UAAA,MAAM,OAAA,GAAU,WAAW,KAAK,CAAA,EAAA,CAAA;AAChC,UAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAK,OAAO,CAAA;AACnD,UAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC7B,YAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,GAAG,CAAA;AAC7C,YAAA,IAAI,OAAA,EAAS;AACX,cAAA,WAAA,EAAA;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAEA,QAAA,IAAA,CAAK,WAAA,CAAY,OAAO,KAAK,CAAA;AAC7B,QAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,CAAA,yBAAA,EAA4B,KAAK,IAAI,EAAE,KAAA,EAAO,IAAA,CAAK,IAAA,EAAM,CAAA;AAAA,MAC9E;AAAA,IACF;AAGA,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,IAAI,IAAI,OAAA,CAAQ,IAAA,GAAO,CAAC,OAAA,CAAQ,IAAI,CAAA;AAEvE,MAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA;AAExC,QAAA,IAAI;AAEF,UAAA,MAAM,OAAQ,MAAM,IAAA,CAAK,QAAQ,GAAA,CAAc,MAAM,KAAM,EAAC;AAE5D,UAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,YAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,GAAG,CAAA;AAC7C,YAAA,IAAI,OAAA,EAAS;AACX,cAAA,WAAA,EAAA;AACA,cAAA,IAAA,CAAK,KAAA,CAAM,OAAA,EAAA;AAAA,YACb;AAAA,UACF;AAGA,UAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA;AAChC,UAAA,IAAA,CAAK,SAAA,CAAU,OAAO,GAAG,CAAA;AAEzB,UAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,CAAA,uBAAA,EAA0B,GAAG,IAAI,EAAE,KAAA,EAAO,IAAA,CAAK,MAAA,EAAQ,CAAA;AAAA,QAC5E,SAAS,KAAA,EAAO;AACd,UAAA,IAAA,CAAK,WAAA,CAAY,OAAgB,MAAM,CAAA;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,MAAM,aAAA,IAAiB,WAAA;AAC5B,IAAA,IAAA,CAAK,aAAA,EAAc;AAEnB,IAAA,OAAO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,QAAQ,KAAA,EAAM;AACzB,MAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,MAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,MAAA,IAAA,CAAK,MAAM,IAAA,GAAO,CAAA;AAClB,MAAA,IAAA,CAAK,MAAA,EAAQ,KAAK,eAAe,CAAA;AAAA,IACnC,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,WAAA,CAAY,OAAgB,GAAG,CAAA;AAAA,IACtC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,MAAA,CACJ,OAAA,EACA,QAAA,EAC8C;AAC9C,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,IAAI,MAAA,GAAS,CAAA;AAEb,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,sBAAA,EAAwB,EAAE,KAAA,EAAO,OAAA,CAAQ,QAAQ,CAAA;AAEnE,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,IAAI;AACF,QAAA,MAAM,SAAS,MAAM,QAAA,CAAS,KAAA,CAAM,GAAA,EAAK,MAAM,MAAM,CAAA;AACrD,QAAA,MAAM,MAAM,IAAA,CAAK,YAAA,CAAa,MAAM,KAAA,CAAM,GAAA,EAAK,MAAM,MAAM,CAAA;AAE3D,QAAA,MAAM,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ;AAAA,UAC1B,KAAK,KAAA,CAAM,GAAA;AAAA,UACX,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,MAAA,EAAQ,IAAA,CAAK,aAAA,CAAc,KAAA,CAAM,GAAG;AAAA,SACrC,CAAA;AAED,QAAA,OAAA,EAAA;AACA,QAAA,IAAA,CAAK,QAAQ,KAAA,CAAM,qBAAA,EAAuB,EAAE,GAAA,EAAK,KAAA,CAAM,KAAK,CAAA;AAAA,MAC9D,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,EAAA;AACA,QAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,qBAAA,EAAuB,EAAE,KAAK,KAAA,CAAM,GAAA,EAAK,OAAO,CAAA;AAAA,MACrE;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,wBAAA,EAA0B,EAAE,OAAA,EAAS,QAAQ,CAAA;AAC/D,IAAA,OAAO,EAAE,SAAS,MAAA,EAAO;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAA0B;AACxB,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,IAAA,EAAM,CAAA;AAAA,MACN,MAAA,EAAQ,CAAA;AAAA,MACR,IAAA,EAAM,CAAA;AAAA,MACN,OAAA,EAAS,CAAA;AAAA,MACT,aAAA,EAAe,CAAA;AAAA,MACf,OAAA,EAAS,CAAA;AAAA,MACT,IAAA,EAAM,KAAK,KAAA,CAAM;AAAA,KACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAO,GAAA,EAAgC;AAC3C,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,OAAA,CAAQ,IAAO,GAAG,CAAA;AAE3C,MAAA,IAAI,UAAU,IAAA,EAAM;AAClB,QAAA,IAAA,CAAK,KAAA,CAAM,MAAA,EAAA;AACX,QAAA,IAAA,CAAK,MAAA,GAAS,KAAK,EAAE,CAAA;AAAA,MACvB,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,KAAA,CAAM,IAAA,EAAA;AACX,QAAA,IAAA,CAAK,KAAA,GAAQ,KAAK,EAAE,CAAA;AAAA,MACtB;AAEA,MAAA,IAAA,CAAK,aAAA,EAAc;AACnB,MAAA,OAAO,KAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,WAAA,CAAY,OAAgB,GAAG,CAAA;AACpC,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,GAAA,CACJ,GAAA,EACA,KAAA,EACA,OAAA,EAKe;AACf,IAAA,IAAI;AACF,MAAA,MAAM,KAAK,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,KAAA,EAAO,SAAS,GAAG,CAAA;AAC/C,MAAA,IAAA,CAAK,KAAA,CAAM,IAAA,EAAA;AACX,MAAA,IAAA,CAAK,KAAA,CAAM,IAAA,EAAA;AAGX,MAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,QAAA,KAAA,MAAW,KAAA,IAAS,QAAQ,MAAA,EAAQ;AAClC,UAAA,IAAI,CAAC,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,KAAK,CAAA,EAAG;AAChC,YAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,KAAA,kBAAO,IAAI,KAAK,CAAA;AAAA,UACvC;AACA,UAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,KAAK,CAAA,CAAG,IAAI,GAAG,CAAA;AAAA,QACtC;AAAA,MACF;AAGA,MAAA,IAAI,SAAS,IAAA,EAAM;AACjB,QAAA,KAAA,MAAW,GAAA,IAAO,QAAQ,IAAA,EAAM;AAC9B,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA;AACxC,UAAA,MAAM,WAAY,MAAM,IAAA,CAAK,QAAQ,GAAA,CAAc,MAAM,KAAM,EAAC;AAEhE,UAAA,IAAI,CAAC,QAAA,CAAS,QAAA,CAAS,GAAG,CAAA,EAAG;AAC3B,YAAA,QAAA,CAAS,KAAK,GAAG,CAAA;AACjB,YAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,QAAQ,CAAA;AAAA,UACzC;AAEA,UAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA,EAAG;AAC5B,YAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,GAAA,kBAAK,IAAI,KAAK,CAAA;AAAA,UACnC;AACA,UAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA,CAAG,IAAI,GAAG,CAAA;AAAA,QAClC;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,WAAA,CAAY,OAAgB,GAAG,CAAA;AAAA,IACtC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,GAAA,EAA+B;AAC1C,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,GAAG,CAAA;AAC7C,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,IAAA,CAAK,KAAA,CAAM,OAAA,EAAA;AACX,QAAA,IAAA,CAAK,KAAA,CAAM,OAAO,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA,MACnD;AACA,MAAA,OAAO,OAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,WAAA,CAAY,OAAgB,GAAG,CAAA;AACpC,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,GAAA,EAA+B;AAC1C,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,GAAG,CAAA;AAAA,IACtC,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,WAAA,CAAY,OAAgB,GAAG,CAAA;AACpC,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,CAAYA,MAAa,MAAA,EAA4B;AACnD,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,KAAA,CAAMA,IAAAA,EAAK,MAAM,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,GAAA,GAAyB;AACvB,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAcA,IAAAA,EAAuB;AAC3C,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,MAAM,QAAA,GAAW;AAAA,MACf,4BAAA;AAAA,MACA,4BAAA;AAAA,MACA,4BAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,IAAI,KAAA;AACJ,MAAA,OAAA,CAAQ,KAAA,GAAQ,OAAA,CAAQ,IAAA,CAAKA,IAAG,OAAO,IAAA,EAAM;AAC3C,QAAA,IAAI,KAAA,CAAM,CAAC,CAAA,EAAG;AACZ,UAAA,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAE,aAAa,CAAA;AAAA,QACpC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,CAAC,GAAG,IAAI,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,EAC5B;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;AAAA,EAEQ,WAAA,CAAY,OAAc,GAAA,EAAmB;AACnD,IAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,aAAA,EAAe,EAAE,KAAK,KAAA,EAAO,KAAA,CAAM,SAAS,CAAA;AAC/D,IAAA,IAAA,CAAK,OAAA,GAAU,OAAO,GAAG,CAAA;AAAA,EAC3B;AACF;AC7ZO,IAAM,cAAA,GAAN,cAA6BO,YAAAA,CAAa;AAAA,EACrC,KAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA,GAAU,IAAA;AAAA,EACV,UAAA;AAAA,EAEV,WAAA,CAAY,KAAA,EAAqB,MAAA,EAAiB,OAAA,GAAU,IAAA,EAAM;AAChE,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAEf,IAAA,IAAA,CAAK,UAAA,GAAa;AAAA,MAChB,IAAA,EAAM,CAAA;AAAA,MACN,MAAA,EAAQ,CAAA;AAAA,MACR,OAAA,EAAS,CAAA;AAAA,MACT,WAAA,EAAa,CAAA;AAAA,MACb,YAAA,EAAc,CAAA;AAAA,MACd,UAAA,EAAY,CAAA;AAAA,MACZ,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AAAA,EAEA,MAAA,GAAe;AACb,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,IAAA,CAAK,KAAK,cAAc,CAAA;AAAA,EAC1B;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AACf,IAAA,IAAA,CAAK,KAAK,eAAe,CAAA;AAAA,EAC3B;AAAA,EAEA,SAAA,GAAqB;AACnB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,aAAA,GAAiC;AAC/B,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,UAAA,EAAW;AAAA,EAC9B;AAAA,EAEA,eAAA,GAAwB;AACtB,IAAA,IAAA,CAAK,UAAA,GAAa;AAAA,MAChB,IAAA,EAAM,CAAA;AAAA,MACN,MAAA,EAAQ,CAAA;AAAA,MACR,OAAA,EAAS,CAAA;AAAA,MACT,WAAA,EAAa,CAAA;AAAA,MACb,YAAA,EAAc,CAAA;AAAA,MACd,UAAA,EAAY,CAAA;AAAA,MACZ,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AAAA,EAEU,gBAAA,CAAiB,MAAsB,QAAA,EAAwB;AACvE,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,IAAA,CAAK,UAAA,CAAW,IAAA,EAAA;AAChB,MAAA,IAAA,CAAK,UAAA,CAAW,UAAA,GAAA,CACb,IAAA,CAAK,UAAA,CAAW,UAAA,IAAc,IAAA,CAAK,UAAA,CAAW,IAAA,GAAO,CAAA,CAAA,GAAK,QAAA,IAAY,IAAA,CAAK,UAAA,CAAW,IAAA;AAAA,IAC3F,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,UAAA,CAAW,MAAA,EAAA;AAChB,MAAA,IAAA,CAAK,UAAA,CAAW,WAAA,GAAA,CACb,IAAA,CAAK,UAAA,CAAW,WAAA,IAAe,IAAA,CAAK,UAAA,CAAW,MAAA,GAAS,CAAA,CAAA,GAAK,QAAA,IAC9D,IAAA,CAAK,UAAA,CAAW,MAAA;AAAA,IACpB;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,UAAA,CAAW,IAAA,GAAO,KAAK,UAAA,CAAW,MAAA;AACrD,IAAA,IAAA,CAAK,WAAW,OAAA,GAAU,KAAA,GAAQ,IAAI,IAAA,CAAK,UAAA,CAAW,OAAO,KAAA,GAAQ,CAAA;AAAA,EACvE;AACF,CAAA;;;ACpEO,IAAM,oBAAA,GAAN,cAAmC,cAAA,CAAe;AAAA,EAC7C,QAAA;AAAA,EACA,UAAA,uBAAiB,GAAA,EAAyB;AAAA,EAC1C,QAAA,uBAAe,GAAA,EAAyB;AAAA,EAElD,YAAY,QAAA,EAA+B;AACzC,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,EAClB;AAAA,EAEA,MAAM,GAAA,CACJP,IAAAA,EACA,MAAA,EACA,OAAA,EACgC;AAChC,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,MAAM,MAAM,IAAA,CAAK,QAAA,CAAS,WAAA,CAAYA,IAAAA,EAAK,QAAQ,OAAO,CAAA;AAE1D,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,KAAA,CAAM,IAAoB,GAAG,CAAA;AAEvD,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAMiB,SAAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC9B,QAAA,IAAA,CAAK,gBAAA,CAAiB,OAAOA,SAAQ,CAAA;AAGrC,QAAA,MAAM,WAAA,GAAc,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA;AAC3C,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,WAAA,CAAY,IAAA,EAAA;AAAA,QACd;AAEA,QAAA,IAAA,CAAK,IAAA,CAAK,YAAY,EAAE,GAAA,EAAK,KAAAjB,IAAAA,EAAK,QAAA,EAAAiB,WAAU,CAAA;AAC5C,QAAA,IAAA,CAAK,QAAQ,KAAA,CAAM,WAAA,EAAa,EAAE,GAAA,EAAK,QAAA,EAAAA,WAAU,CAAA;AAEjD,QAAA,OAAO,MAAA;AAAA,MACT;AAEA,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC9B,MAAA,IAAA,CAAK,gBAAA,CAAiB,QAAQ,QAAQ,CAAA;AACtC,MAAA,IAAA,CAAK,KAAK,WAAA,EAAa,EAAE,KAAK,GAAA,EAAAjB,IAAAA,EAAK,UAAU,CAAA;AAC7C,MAAA,IAAA,CAAK,QAAQ,KAAA,CAAM,YAAA,EAAc,EAAE,GAAA,EAAK,UAAU,CAAA;AAElD,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,EAAQ,KAAA,CAAM,iBAAA,EAAmB,KAAK,CAAA;AAC3C,MAAA,IAAA,CAAK,IAAA,CAAK,YAAA,EAAc,EAAE,GAAA,EAAK,OAAO,CAAA;AACtC,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,GAAA,CACJA,IAAAA,EACA,MAAA,EACA,QACA,OAAA,EACe;AACf,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,WAAA,CAAYA,IAAAA,EAAK,MAAM,CAAA,EAAG;AAC3C,MAAA,IAAA,CAAK,QAAQ,KAAA,CAAM,qBAAA,EAAuB,EAAE,GAAA,EAAAA,MAAK,CAAA;AACjD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAM,IAAA,CAAK,QAAA,CAAS,WAAA,CAAYA,IAAAA,EAAK,QAAQ,OAAO,CAAA;AAC1D,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,WAAA,CAAYA,MAAK,OAAO,CAAA;AAClD,IAAA,MAAM,IAAA,GAAO,OAAA,EAAS,IAAA,IAAQ,EAAC;AAE/B,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,QAAQ,GAAG,CAAA;AAGrC,MAAA,MAAM,WAAA,GAA2B;AAAA,QAC/B,GAAA;AAAA,QACA,GAAA,EAAAA,IAAAA;AAAA,QACA,MAAA;AAAA,QACA,SAAA,sBAAe,IAAA,EAAK;AAAA,QACpB,GAAA;AAAA,QACA,IAAA,EAAM,CAAA;AAAA,QACN,IAAA;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,CAAE;AAAA,OAC/B;AAEA,MAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,GAAA,EAAK,WAAW,CAAA;AAGpC,MAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,GAAA,KAAQ;AACpB,QAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA,EAAG;AAC3B,UAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,GAAA,kBAAK,IAAI,KAAK,CAAA;AAAA,QAClC;AACA,QAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA,CAAG,IAAI,GAAG,CAAA;AAAA,MACjC,CAAC,CAAA;AAED,MAAA,IAAA,CAAK,UAAA,CAAW,WAAA,EAAA;AAChB,MAAA,IAAA,CAAK,IAAA,CAAK,YAAY,EAAE,GAAA,EAAK,KAAAA,IAAAA,EAAK,GAAA,EAAK,MAAM,CAAA;AAC7C,MAAA,IAAA,CAAK,QAAQ,KAAA,CAAM,cAAA,EAAgB,EAAE,GAAA,EAAK,GAAA,EAAK,MAAM,CAAA;AAGrD,MAAA,IAAI,SAAS,YAAA,EAAc;AACzB,QAAA,MAAM,IAAA,CAAK,oBAAA,CAAqB,GAAA,EAAK,OAAA,CAAQ,YAAY,CAAA;AAAA,MAC3D;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,EAAQ,KAAA,CAAM,iBAAA,EAAmB,KAAK,CAAA;AAC3C,MAAA,IAAA,CAAK,IAAA,CAAK,YAAA,EAAc,EAAE,GAAA,EAAK,OAAO,CAAA;AAAA,IACxC;AAAA,EACF;AAAA,EAEA,gBAAA,GAAkC;AAChC,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,IAAA,GAAO,EAAE,IAAI,CAAA;AAAA,EAC5E;AAAA,EAEA,YAAA,GAA6D;AAC3D,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,IAAA,CAAK,UAAA,CAAW,OAAA,CAAQ,CAAC,MAAA,KAAW;AAClC,MAAA,IAAA,IAAQ,MAAA,CAAO,IAAA;AAAA,IACjB,CAAC,CAAA;AAED,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAK,UAAA,CAAW,IAAA;AAAA,MACzB,eAAA,EAAiB;AAAA,KACnB;AAAA,EACF;AAAA,EAEA,MAAgB,oBAAA,CAAqB,GAAA,EAAa,QAAA,EAAmC;AAEnF,IAAA,IAAA,CAAK,QAAQ,KAAA,CAAM,kCAAA,EAAoC,EAAE,GAAA,EAAK,UAAU,CAAA;AAAA,EAC1E;AACF,CAAA;;;AClJO,IAAM,sBAAA,GAAN,cAAqC,oBAAA,CAAqB;AAAA,EAC/D,MAAM,WAAW,QAAA,EAAqC;AACpD,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,OAAO,CAAA;AAAA,IACT;AAEA,IAAA,IAAI,WAAA,GAAc,CAAA;AAElB,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,IAAI;AAEF,QAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,KAAA,CAAM,KAAK,OAAO,CAAA;AAE1C,QAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,UAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA;AAC3C,UAAA,IAAI,OAAA,EAAS;AACX,YAAA,WAAA,EAAA;AACA,YAAA,IAAA,CAAK,UAAA,CAAW,OAAO,GAAG,CAAA;AAG1B,YAAA,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,CAAC,MAAA,KAAW;AAChC,cAAA,MAAA,CAAO,OAAO,GAAG,CAAA;AAAA,YACnB,CAAC,CAAA;AAAA,UACH;AAAA,QACF;AAGA,QAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,EAAG;AAC9B,UAAA,MAAM,UAAA,GAAa,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAE5C,UAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,YAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA;AAC3C,YAAA,IAAI,OAAA,EAAS;AACX,cAAA,WAAA,EAAA;AACA,cAAA,IAAA,CAAK,UAAA,CAAW,OAAO,GAAG,CAAA;AAAA,YAC5B;AAAA,UACF;AAEA,UAAA,IAAA,CAAK,QAAA,CAAS,OAAO,OAAO,CAAA;AAAA,QAC9B;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,QAAQ,KAAA,CAAM,oBAAA,EAAsB,EAAE,OAAA,EAAS,OAAO,CAAA;AAAA,MAC7D;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,WAAW,YAAA,IAAgB,WAAA;AAChC,IAAA,IAAA,CAAK,KAAK,kBAAA,EAAoB,EAAE,QAAA,EAAU,KAAA,EAAO,aAAa,CAAA;AAC9D,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,mBAAA,EAAqB,EAAE,QAAA,EAAU,KAAA,EAAO,aAAa,CAAA;AAEvE,IAAA,OAAO,WAAA;AAAA,EACT;AAAA,EAEA,MAAM,kBAAkB,KAAA,EAAgC;AACtD,IAAA,MAAM,QAAA,GAAW;AAAA,MACf,IAAI,KAAK,CAAA,CAAA,CAAA;AAAA,MACT,SAAS,KAAK,CAAA,EAAA,CAAA;AAAA,MACd;AAAA;AAAA,KACF;AAEA,IAAA,OAAO,IAAA,CAAK,WAAW,QAAQ,CAAA;AAAA,EACjC;AAAA,EAEA,MAAM,aAAA,GAA+B;AACnC,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,CAAK,MAAM,KAAA,EAAM;AACvB,IAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AACtB,IAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AAEpB,IAAA,IAAA,CAAK,UAAA,CAAW,YAAA,IAAgB,IAAA,CAAK,UAAA,CAAW,WAAA;AAChD,IAAA,IAAA,CAAK,WAAW,WAAA,GAAc,CAAA;AAE9B,IAAA,IAAA,CAAK,KAAK,cAAc,CAAA;AACxB,IAAA,IAAA,CAAK,MAAA,EAAQ,KAAK,eAAe,CAAA;AAAA,EACnC;AACF,CAAA;;;AC3EO,IAAM,qBAAA,GAAN,cAAoC,sBAAA,CAAuB;AAAA,EACxD,eAAA;AAAA,EAER,MAAM,OACJ,OAAA,EACe;AACf,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,sBAAA,EAAwB,EAAE,KAAA,EAAO,OAAA,CAAQ,QAAQ,CAAA;AAEnE,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,MAAM,GAAA,EAAK,KAAA,CAAM,MAAA,EAAQ,KAAA,CAAM,OAAO,CAAA;AAEpE,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,IAAA,CAAK,QAAQ,KAAA,CAAM,gCAAA,EAAkC,EAAE,GAAA,EAAK,KAAA,CAAM,KAAK,CAAA;AAAA,QAEzE;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,qBAAA,EAAuB,EAAE,KAAK,KAAA,CAAM,GAAA,EAAK,OAAO,CAAA;AAAA,MACrE;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,KAAK,eAAA,EAAiB,EAAE,KAAA,EAAO,OAAA,CAAQ,QAAQ,CAAA;AACpD,IAAA,IAAA,CAAK,MAAA,EAAQ,KAAK,wBAAwB,CAAA;AAAA,EAC5C;AAAA,EAEA,iBAAA,CAAkB,aAAa,GAAA,EAAc;AAC3C,IAAA,IAAA,CAAK,gBAAA,EAAiB;AAEtB,IAAA,IAAA,CAAK,eAAA,GAAkB,YAAY,MAAM;AACvC,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,MAAA,IAAA,CAAK,UAAA,CAAW,OAAA,CAAQ,CAAC,MAAA,EAAQ,GAAA,KAAQ;AACvC,QAAA,MAAM,GAAA,GAAM,GAAA,GAAM,MAAA,CAAO,SAAA,CAAU,OAAA,EAAQ;AAE3C,QAAA,IAAI,GAAA,GAAM,MAAA,CAAO,GAAA,GAAM,GAAA,EAAM;AAC3B,UAAA,IAAA,CAAK,UAAA,CAAW,OAAO,GAAG,CAAA;AAG1B,UAAA,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,CAAC,GAAA,KAAQ;AAC3B,YAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA,EAAG,OAAO,GAAG,CAAA;AAAA,UACpC,CAAC,CAAA;AAAA,QACH;AAAA,MACF,CAAC,CAAA;AAAA,IACH,GAAG,UAAU,CAAA;AAAA,EACf;AAAA,EAEA,gBAAA,GAAyB;AACvB,IAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,MAAA,aAAA,CAAc,KAAK,eAAe,CAAA;AAClC,MAAA,IAAA,CAAK,eAAA,GAAkB,MAAA;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,IAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AACtB,IAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AACpB,IAAA,IAAA,CAAK,kBAAA,EAAmB;AAAA,EAC1B;AACF,CAAA;;;ACpDO,IAAM,mBAAA,GAAN,cAAkC,qBAAA,CAAsB;AAAA,EAC7D,WAAA,CACE,KAAA,EACA,OAAA,GAII,EAAC,EACL;AACA,IAAA,KAAA,CAAM,KAAA,EAAO,OAAA,CAAQ,MAAA,EAAQ,OAAA,CAAQ,WAAW,IAAI,CAAA;AACpD,IAAA,IAAA,CAAK,QAAA,GAAW,OAAA,CAAQ,QAAA,IAAY,IAAI,oBAAA,EAAqB;AAC7D,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,EACzB;AACF;;;ACYO,IAAM,aAAA,GAAN,cAA4BO,YAAAA,CAAwC;AAAA,EACjE,OAAA;AAAA,EACA,YAAA;AAAA,EACA,iBAAA;AAAA,EACA,UAAA;AAAA,EACA,iBAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,aAAA;AAAA,EAER,YAAY,OAAA,EAA+B;AACzC,IAAA,KAAA,EAAM;AAEN,IAAA,IAAA,CAAK,UAAU,OAAA,CAAQ,OAAA;AACvB,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,iBAAA,GAAoB,IAAI,GAAA,CAAI,OAAA,CAAQ,qBAAqB,CAAC,QAAA,EAAU,MAAA,EAAQ,UAAU,CAAC,CAAA;AAC5F,IAAA,IAAA,CAAK,UAAA,GAAa,QAAQ,UAAA,IAAc,IAAA;AACxC,IAAA,IAAA,CAAK,iBAAA,GAAoB,QAAQ,iBAAA,IAAqB,KAAA;AACtD,IAAA,IAAA,CAAK,WAAA,GAAc,QAAQ,WAAA,IAAe,KAAA;AAC1C,IAAA,IAAA,CAAK,gBAAgB,OAAA,CAAQ,aAAA;AAG7B,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,mBAAA,CAAoB,OAAA,CAAQ,KAAA,EAAO;AAAA,MACzD,QAAA,EAAU,OAAA,CAAQ,QAAA,IAAY,IAAI,kBAAA,EAAmB;AAAA,MACrD,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,OAAA,EAAS,QAAQ,OAAA,IAAW;AAAA,KAC7B,CAAA;AAGD,IAAA,IAAI,QAAQ,IAAA,CAAK,OAAA,IAAW,OAAO,IAAA,CAAK,OAAA,CAAQ,OAAO,UAAA,EAAY;AACjE,MAAA,IAAA,CAAK,OAAA,CAAQ,EAAA,CAAG,SAAA,EAAW,CAAA,GAAI,IAAA,KAAoB;AACjD,QAAA,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,GAAG,IAAI,CAAA;AAC5B,QAAA,KAAK,KAAK,aAAA,EAAc;AAAA,MAC1B,CAAC,CAAA;AACD,MAAA,IAAA,CAAK,OAAA,CAAQ,EAAA,CAAG,YAAA,EAAc,CAAA,GAAI,IAAA,KAAoB,KAAK,IAAA,CAAK,YAAA,EAAc,GAAG,IAAI,CAAC,CAAA;AACtF,MAAA,IAAA,CAAK,OAAA,CAAQ,EAAA,CAAG,OAAA,EAAS,CAAA,GAAI,IAAA,KAAoB,KAAK,IAAA,CAAK,OAAA,EAAS,GAAG,IAAI,CAAC,CAAA;AAAA,IAC9E;AAGA,IAAA,IAAA,CAAK,YAAA,CAAa,EAAA,CAAG,UAAA,EAAY,CAAC,IAAA,KAAS;AACzC,MAAA,IAAA,CAAK,MAAA,EAAQ,KAAA,CAAM,WAAA,EAAa,IAAI,CAAA;AACpC,MAAA,IAAA,CAAK,IAAA,CAAK,YAAY,IAAI,CAAA;AAAA,IAC5B,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,YAAA,CAAa,EAAA,CAAG,WAAA,EAAa,CAAC,IAAA,KAAS;AAC1C,MAAA,IAAA,CAAK,MAAA,EAAQ,KAAA,CAAM,YAAA,EAAc,IAAI,CAAA;AACrC,MAAA,IAAA,CAAK,IAAA,CAAK,aAAa,IAAI,CAAA;AAAA,IAC7B,CAAC,CAAA;AAGD,IAAA,IAAI,QAAQ,IAAA,CAAK,OAAA,IAAW,OAAO,IAAA,CAAK,OAAA,CAAQ,OAAO,UAAA,EAAY;AACjE,MAAA,IAAA,CAAK,OAAA,CAAQ,EAAA,CAAG,OAAA,EAAS,CAAC,IAAA,KAAc;AACtC,QAAA,IAAI,KAAK,OAAA,IAAW,IAAA,CAAK,cAAA,CAAe,IAAA,CAAK,OAAO,CAAA,EAAG;AACrD,UAAA,IAAA,CAAK,uBAAuB,IAAA,CAAK,GAAG,CAAA,CAAE,KAAA,CAAM,CAAC,KAAA,KAAiB;AAC5D,YAAA,IAAA,CAAK,MAAA,EAAQ,KAAA,CAAM,0BAAA,EAA4B,KAAK,CAAA;AAAA,UACtD,CAAC,CAAA;AAAA,QACH;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEA,IAAI,IAAA,GAAe;AACjB,IAAA,OAAO,CAAA,MAAA,EAAS,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA,CAAA;AAAA,EACnC;AAAA,EAEA,IAAI,OAAA,GAAkB;AACpB,IAAA,OAAO,KAAK,OAAA,CAAQ,OAAA;AAAA,EACtB;AAAA,EAEA,IAAI,WAAA,GAAuB;AACzB,IAAA,OAAO,KAAK,OAAA,CAAQ,WAAA;AAAA,EACtB;AAAA,EAEA,MAAM,QAAQ,MAAA,EAAyC;AACrD,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA;AAAA,EACnC;AAAA,EAEA,MAAM,UAAA,GAA4B;AAChC,IAAA,MAAM,IAAA,CAAK,QAAQ,UAAA,EAAW;AAC9B,IAAA,MAAM,IAAA,CAAK,aAAa,aAAA,EAAc;AAAA,EACxC;AAAA,EAEA,MAAM,KAAA,CACJP,IAAAA,EACA,MAAA,EACA,OAAA,EACyB;AACzB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAeA,IAAG,CAAA;AAMvC,IAAA,IAAI,OAAA,EAAS,KAAA,KAAU,KAAA,IAAS,CAAC,IAAA,CAAK,YAAY,OAAA,EAAS,OAAO,CAAA,IAAK,OAAA,EAAS,WAAA,EAAa;AAC3F,MAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,CAASA,IAAAA,EAAK,QAAQ,OAAO,CAAA;AAAA,IACnD;AAEA,IAAA,MAAM,eAAkC,OAAO,OAAA,EAAS,UAAU,QAAA,GAAW,OAAA,CAAQ,QAAQ,EAAC;AAE9F,IAAA,IAAI;AAEF,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,aAAa,GAAA,CAAOA,IAAAA,EAAK,QAAqB,YAAY,CAAA;AAEpF,MAAA,IAAI,MAAA,EAAQ;AAEV,QAAA,MAAMkB,SAAAA,GAAY,KAAK,YAAA,CAAqB,QAAA;AAC5C,QAAA,IAAIA,qBAAoB,kBAAA,EAAoB;AAC1C,UAAAA,SAAAA,CAAS,oBAAA,CAAqBlB,IAAAA,EAAK,CAAC,CAAA;AAAA,QACtC;AAEA,QAAA,OAAO,MAAA;AAAA,MACT;AAGA,MAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,QAAQ,KAAA,CAASA,IAAAA,EAAK,QAAQ,OAAO,CAAA;AAC/D,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAG9B,MAAA,MAAM,QAAA,GAAY,KAAK,YAAA,CAAqB,QAAA;AAC5C,MAAA,IAAI,oBAAoB,kBAAA,EAAoB;AAC1C,QAAA,QAAA,CAAS,oBAAA,CAAqBA,MAAK,QAAQ,CAAA;AAAA,MAC7C;AAGA,MAAA,IAAI,IAAA,CAAK,iBAAA,CAAkB,MAAA,EAAQ,OAAO,CAAA,EAAG;AAC3C,QAAA,MAAM,KAAK,YAAA,CAAa,GAAA,CAAIA,IAAAA,EAAK,MAAA,EAAqB,QAAQ,YAAY,CAAA;AAAA,MAC5E;AAEA,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AAEd,MAAA,MAAM,YAAA,GAAgB,SAAS,KAAA,KAAkB,KAAA;AACjD,MAAA,IAAI,IAAA,CAAK,eAAe,YAAA,EAAc;AACpC,QAAA,MAAM,WAAA,GAAc;AAAA,UAClB,MAAM,EAAC;AAAA,UACP,QAAA,EAAU,CAAA;AAAA,UACV;AAAA,SACF;AAEA,QAAA,MAAM,IAAA,CAAK,YAAA,CAAa,GAAA,CAAIA,IAAAA,EAAK,QAAqB,WAAA,EAAa;AAAA,UACjE,GAAG,YAAA;AAAA,UACH,GAAA,EAAK;AAAA;AAAA,SACN,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,iBAAiB,OAAA,EAAoD;AACzE,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,OAAA,CAAQ,iBAAiB,OAAO,CAAA;AAG/D,IAAA,MAAM,cAAA,GAAiB,WAAA,CAAY,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA;AAC1D,IAAA,MAAM,gBAAA,GAAmB,WAAA,CAAY,QAAA,CAAS,IAAA,CAAK,WAAW,CAAA;AAE9D,IAAA,WAAA,CAAY,SAAS,YAAY;AAC/B,MAAA,MAAM,MAAA,GAAS,MAAM,cAAA,EAAe;AAEpC,MAAA,MAAM,IAAA,CAAK,aAAa,aAAA,EAAc;AACtC,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAEA,IAAA,WAAA,CAAY,WAAW,YAAY;AACjC,MAAA,MAAM,MAAA,GAAS,MAAM,gBAAA,EAAiB;AAEtC,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAEA,IAAA,OAAO,WAAA;AAAA,EACT;AAAA,EAEA,MAAM,OAAA,CAAqBA,IAAAA,EAAa,IAAA,EAA8C;AACpF,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAWA,IAAAA,EAAK,IAAI,CAAA;AAAA,EAC1C;AAAA,EAEA,YAAA,GAA0B;AACxB,IAAA,OAAO,IAAA,CAAK,QAAQ,YAAA,EAAa;AAAA,EACnC;AAAA,EAEA,MAAM,IAAA,GAAyB;AAC7B,IAAA,OAAO,IAAA,CAAK,QAAQ,IAAA,EAAK;AAAA,EAC3B;AAAA,EAEA,OAAO,KAAA,EAAwB;AAC7B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA;AAAA,EAClC;AAAA,EAEA,iBAAiB,UAAA,EAA4B;AAC3C,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAAiB,UAAU,CAAA;AAAA,EACjD;AAAA,EAEA,OAAA,CACEA,IAAAA,EACA,MAAA,EACA,OAAA,EACyB;AAEzB,IAAA,OAAO,IAAA,CAAK,KAAA,CAASA,IAAAA,EAAK,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC3C;AAAA,EAEA,kBAAA,GAA2E;AACzE,IAAA,OAAO,IAAA,CAAK,QAAQ,kBAAA,EAAsB;AAAA,EAC5C;AAAA,EAEA,eAAA,GAAuC;AACrC,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA,EAEA,MAAM,WAAA,GAA6B;AACjC,IAAA,IAAI,CAAC,IAAA,CAAK,aAAA,IAAiB,IAAA,CAAK,aAAA,CAAc,WAAW,CAAA,EAAG;AAC1D,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,MAAA,EAAQ,KAAK,uBAAA,EAAyB,EAAE,OAAO,IAAA,CAAK,aAAA,CAAc,QAAQ,CAAA;AAE/E,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,aAAA,EAAe;AACtC,MAAA,IAAI;AACF,QAAA,MAAM,SAAS,MAAM,IAAA,CAAK,MAAM,KAAA,CAAM,GAAA,EAAK,MAAM,MAAA,EAAuB;AAAA,UACtE,OAAO,EAAE,GAAA,EAAK,KAAA,CAAM,GAAA,IAAO,KAAK,UAAA;AAAW,SAC5C,CAAA;AAED,QAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,qBAAA,EAAuB;AAAA,UACxC,KAAK,KAAA,CAAM,GAAA;AAAA,UACX,UAAU,MAAA,CAAO;AAAA,SAClB,CAAA;AAAA,MACH,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,qBAAA,EAAuB;AAAA,UACxC,KAAK,KAAA,CAAM,GAAA;AAAA,UACX;AAAA,SACD,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,MAAA,EAAQ,KAAK,wBAAwB,CAAA;AAAA,EAC5C;AAAA,EAEA,MAAc,aAAA,GAA+B;AAC3C,IAAA,IAAI,IAAA,CAAK,aAAA,IAAiB,IAAA,CAAK,aAAA,CAAc,SAAS,CAAA,EAAG;AAEvD,MAAA,UAAA,CAAW,MAAM;AACf,QAAA,IAAA,CAAK,WAAA,EAAY,CAAE,KAAA,CAAM,CAAC,KAAA,KAAU;AAClC,UAAA,IAAA,CAAK,MAAA,EAAQ,KAAA,CAAM,oBAAA,EAAsB,KAAK,CAAA;AAAA,QAChD,CAAC,CAAA;AAAA,MACH,GAAG,GAAI,CAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,WAAA,CAAY,SAAiB,OAAA,EAAiC;AACpE,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,IAAI,CAAC,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,OAAO,CAAA,EAAG;AACxC,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,IAAI,SAAS,KAAA,KAAU,IAAA,IAAQ,OAAO,OAAA,EAAS,UAAU,QAAA,EAAU;AACjE,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,iBAAA,CAAkB,QAAqB,QAAA,EAAkC;AAE/E,IAAA,IAAI,CAAC,IAAA,CAAK,iBAAA,IAAqB,MAAA,CAAO,aAAa,CAAA,EAAG;AACpD,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,IAAK,OAAe,KAAA,EAAO;AACzB,MAAA,OAAO,IAAA,CAAK,WAAA;AAAA,IACd;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,eAAeA,IAAAA,EAAqB;AAC1C,IAAA,OAAOA,IAAAA,CAAI,MAAK,CAAE,KAAA,CAAM,KAAK,CAAA,CAAE,CAAC,CAAA,EAAG,WAAA,EAAY,IAAK,EAAA;AAAA,EACtD;AAAA,EAEQ,eAAe,OAAA,EAA0B;AAC/C,IAAA,MAAM,aAAA,GAAgB,CAAC,QAAA,EAAU,QAAA,EAAU,UAAU,QAAA,EAAU,OAAA,EAAS,QAAQ,UAAU,CAAA;AAC1F,IAAA,OAAO,aAAA,CAAc,QAAA,CAAS,OAAA,CAAQ,WAAA,EAAa,CAAA;AAAA,EACrD;AAAA,EAEA,MAAc,uBAAuBA,IAAAA,EAA4B;AAC/D,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,iBAAA,CAAkBA,IAAG,CAAA;AACzC,IAAA,MAAM,WAAqB,EAAC;AAE5B,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,KAAU;AACxB,MAAA,QAAA,CAAS,KAAK,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAA,EAAK,CAAA,MAAA,EAAS,KAAK,CAAA,EAAA,CAAI,CAAA;AAAA,IAChD,CAAC,CAAA;AAED,IAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,MAAA,MAAM,IAAA,CAAK,YAAA,CAAa,UAAA,CAAW,QAAQ,CAAA;AAAA,IAC7C;AAAA,EACF;AAAA,EAEQ,kBAAkBA,IAAAA,EAAuB;AAC/C,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,MAAM,QAAA,GAAW;AAAA,MACf,oBAAA;AAAA,MACA,oBAAA;AAAA,MACA,sBAAA;AAAA,MACA,6BAAA;AAAA,MACA,6BAAA;AAAA,MACA,8BAAA;AAAA,MACA,4BAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC5B,MAAA,IAAI,KAAA;AACJ,MAAA,OAAA,CAAQ,KAAA,GAAQ,OAAA,CAAQ,IAAA,CAAKA,IAAG,OAAO,IAAA,EAAM;AAC3C,QAAA,IAAI,KAAA,CAAM,CAAC,CAAA,EAAG;AACZ,UAAA,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAE,aAAa,CAAA;AAAA,QACpC;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAED,IAAA,OAAO,CAAC,GAAG,IAAI,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,EAC5B;AACF;AAKO,SAAS,mBAAA,CACd,OAAA,EACA,KAAA,EACA,OAAA,EACe;AACf,EAAA,OAAO,IAAI,aAAA,CAAc;AAAA,IACvB,OAAA;AAAA,IACA,KAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;ACvWO,IAAM,iBAAN,MAAqB;AAAA,EACT,MAAA;AAAA,EAEjB,WAAA,CAAY,MAAA,GAAuB,EAAC,EAAG;AACrC,IAAA,MAAM,SAAA,GAAY,OAAO,SAAA,IAAa,aAAA;AAEtC,IAAA,MAAM,QAAA,GAAW,SAAA,KAAc,mBAAA,GAAsB,EAAA,GAAK,OAAO,QAAA,IAAY,EAAA;AAG7E,IAAA,IAAI,SAAA,GAAY,OAAO,SAAA,IAAa,EAAA;AACpC,IAAA,IAAI,CAAC,OAAO,SAAA,EAAW;AACrB,MAAA,IAAI,SAAA,CAAU,QAAA,CAAS,KAAK,CAAA,EAAG;AAC7B,QAAA,SAAA,GAAY,EAAA;AAAA,MACd,CAAA,MAAA,IAAW,SAAA,CAAU,QAAA,CAAS,KAAK,CAAA,EAAG;AACpC,QAAA,SAAA,GAAY,EAAA;AAAA,MACd,CAAA,MAAA,IAAW,SAAA,CAAU,QAAA,CAAS,KAAK,CAAA,EAAG;AACpC,QAAA,SAAA,GAAY,EAAA;AAAA,MACd;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,SAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA;AAAA,MACA,UAAA,EAAY,OAAO,UAAA,IAAc,EAAA;AAAA,MACjC,UAAA,EAAY,OAAO,UAAA,IAAc,GAAA;AAAA,MACjC,MAAA,EAAQ,OAAO,MAAA,IAAU;AAAA,KAC3B;AAAA,EACF;AAAA,EAEQ,SAAA,CAAU,UAAkB,IAAA,EAAsB;AACxD,IAAA,OAAO,UAAA;AAAA,MACL,QAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAK,MAAA,CAAO,UAAA;AAAA,MACZ,KAAK,MAAA,CAAO,SAAA;AAAA,MACZ,KAAK,MAAA,CAAO;AAAA,KACd;AAAA,EACF;AAAA,EAEA,OAAA,CAAQ,IAAA,EAAc,OAAA,GAA6B,EAAC,EAAkB;AACpE,IAAA,MAAM,OAAO,OAAA,CAAQ,IAAA,IAAQ,WAAA,CAAY,IAAA,CAAK,OAAO,UAAU,CAAA;AAC/D,IAAA,MAAM,MAAM,OAAA,CAAQ,GAAA,GAChB,MAAA,CAAO,IAAA,CAAK,QAAQ,GAAA,EAAK,KAAK,CAAA,GAC9B,IAAA,CAAK,UAAU,OAAA,CAAQ,GAAA,CAAI,0BAA0B,CAAA,IAAK,eAAe,IAAI,CAAA;AAEjF,IAAA,MAAM,EAAA,GAAK,WAAA,CAAY,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA;AAC3C,IAAA,MAAM,SAAS,cAAA,CAAe,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW,KAAK,EAAE,CAAA;AAE5D,IAAA,IAAI,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,IAAA,EAAM,QAAQ,KAAK,CAAA;AACjD,IAAA,SAAA,IAAa,MAAA,CAAO,MAAM,KAAK,CAAA;AAE/B,IAAA,MAAM,MAAA,GAAwB;AAAA,MAC5B,SAAA;AAAA,MACA,IAAA,EAAM,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA;AAAA,MACzB,EAAA,EAAI,EAAA,CAAG,QAAA,CAAS,KAAK;AAAA,KACvB;AAGA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,QAAA,CAAS,KAAK,CAAA,IAAK,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,QAAA,CAAS,UAAU,CAAA,EAAG;AACvF,MAAA,MAAA,CAAO,OAAA,GAAW,MAAA,CAAe,UAAA,EAAW,CAAE,SAAS,KAAK,CAAA;AAAA,IAC9D;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,OAAA,CAAQ,aAAA,EAA8B,OAAA,GAA6B,EAAC,EAAW;AAC7E,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,aAAA,CAAc,MAAM,KAAK,CAAA;AAClD,IAAA,MAAM,MAAM,OAAA,CAAQ,GAAA,GAChB,MAAA,CAAO,IAAA,CAAK,QAAQ,GAAA,EAAK,KAAK,CAAA,GAC9B,IAAA,CAAK,UAAU,OAAA,CAAQ,GAAA,CAAI,0BAA0B,CAAA,IAAK,eAAe,IAAI,CAAA;AAEjF,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,IAAA,CAAK,aAAA,CAAc,IAAI,KAAK,CAAA;AAC9C,IAAA,MAAM,WAAW,gBAAA,CAAiB,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW,KAAK,EAAE,CAAA;AAGhE,IAAA,IAAA,CACG,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,QAAA,CAAS,KAAK,CAAA,IAAK,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,QAAA,CAAS,UAAU,CAAA,KACnF,cAAc,OAAA,EACd;AACA,MAAC,SAAiB,UAAA,CAAW,MAAA,CAAO,KAAK,aAAA,CAAc,OAAA,EAAS,KAAK,CAAC,CAAA;AAAA,IACxE;AAEA,IAAA,IAAI,YAAY,QAAA,CAAS,MAAA,CAAO,aAAA,CAAc,SAAA,EAAW,OAAO,MAAM,CAAA;AACtE,IAAA,SAAA,IAAa,QAAA,CAAS,MAAM,MAAM,CAAA;AAElC,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,KAAA,EAAwB;AACnC,IAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AACzC,MAAA,OAAO,EAAA;AAAA,IACT;AAEA,IAAA,MAAM,OAAO,OAAO,KAAA,KAAU,WAAW,KAAA,GAAQ,IAAA,CAAK,UAAU,KAAK,CAAA;AACrE,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA;AAGnC,IAAA,OAAO;AAAA,MACL,KAAK,MAAA,CAAO,SAAA;AAAA,MACZ,SAAA,CAAU,IAAA;AAAA,MACV,SAAA,CAAU,EAAA;AAAA,MACV,UAAU,OAAA,IAAW,EAAA;AAAA,MACrB,SAAA,CAAU;AAAA,KACZ,CAAE,KAAK,GAAG,CAAA;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,cAAA,EAAiC;AAC5C,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,KAAA,CAAM,GAAG,CAAA;AACtC,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,MAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,IAClD;AAEA,IAAA,MAAM,CAAC,SAAA,EAAW,IAAA,EAAM,EAAA,EAAI,OAAA,EAAS,SAAS,CAAA,GAAI,KAAA;AAGlD,IAAA,IAAI,SAAA,KAAc,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW;AACvC,MAAA,MAAM,IAAI,MAAM,CAAA,6BAAA,EAAgC,IAAA,CAAK,OAAO,SAAS,CAAA,MAAA,EAAS,SAAS,CAAA,CAAE,CAAA;AAAA,IAC3F;AAEA,IAAA,MAAM,aAAA,GAA+B;AAAA,MACnC,SAAA;AAAA,MACA,IAAA;AAAA,MACA,EAAA;AAAA,MACA,SAAS,OAAA,IAAW;AAAA,KACtB;AAEA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,aAAa,CAAA;AAG5C,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,MAAM,SAAS,CAAA;AAAA,IAC7B,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAsB;AACpB,IAAA,OAAO,YAAY,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,CAAE,SAAS,KAAK,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,KAAA,EAAuB;AAC1B,IAAA,MAAM,IAAA,GAAO,SAAA,CAAQ,QAAa,CAAA,CAAE,WAAW,QAAQ,CAAA;AACvD,IAAA,IAAA,CAAK,OAAO,KAAK,CAAA;AACjB,IAAA,OAAO,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,CAAY,OAAe,IAAA,EAAuB;AAChD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,KAAM,IAAA;AAAA,EAC9B;AACF;AAGO,IAAM,MAAA,GAAS,IAAI,cAAA;AAGnB,IAAM,gBAAA,GAAmB;AAAA,EAC9B,WAAA,EAAa,aAAA;AAAA,EACb,WAAA,EAAa,aAAA;AAAA,EACb,WAAA,EAAa,aAAA;AAAA,EACb,WAAA,EAAa,aAAA;AAAA,EACb,WAAA,EAAa,aAAA;AAAA,EACb,WAAA,EAAa,aAAA;AAAA,EACb,iBAAA,EAAmB;AACrB;;;AC7KO,IAAe,aAAf,MAA0B;AAAA,EAIvB,cAAA,GAAiB,CAAA;AAAA;AAAA;AAAA;AAAA,EAKzB,eAAA,GAAwB;AACtB,IAAA,IAAA,CAAK,cAAA,GAAiB,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAYA,iBAAiB,UAAA,EAA4B;AAC3C,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,CAAO,eAAA;AAE1B,IAAA,IAAI,UAAA,CAAW,QAAA,CAAS,GAAG,CAAA,EAAG;AAC5B,MAAA,OAAO,WACJ,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,IAAA,KAAS,CAAA,EAAG,KAAK,CAAA,EAAG,IAAI,CAAA,EAAG,KAAK,CAAA,CAAE,CAAA,CACvC,KAAK,GAAG,CAAA;AAAA,IACb;AACA,IAAA,OAAO,CAAA,EAAG,KAAK,CAAA,EAAG,UAAU,GAAG,KAAK,CAAA,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAUA,YAAY,UAAA,EAAwC;AAClD,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,MAAM,WAAsB,EAAC;AAG7B,IAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AACnB,IAAA,IAAI,WAAW,QAAA,EAAU;AACvB,MAAA,KAAA,CAAM,KAAK,UAAU,CAAA;AAAA,IACvB;AACA,IAAA,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,WAAW,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,GAAI,GAAG,CAAA;AAG9E,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,KAAA,CAAM,KAAK,MAAM,CAAA;AACjB,MAAA,MAAM,aAAa,UAAA,CAAW,SAAA,GAC1B,GAAG,IAAA,CAAK,gBAAA,CAAiB,WAAW,IAAI,CAAC,OAAO,IAAA,CAAK,gBAAA,CAAiB,WAAW,SAAS,CAAC,KAC3F,IAAA,CAAK,gBAAA,CAAiB,WAAW,IAAI,CAAA;AACzC,MAAA,KAAA,CAAM,KAAK,UAAU,CAAA;AAAA,IACvB;AAGA,IAAA,KAAA,MAAWmB,KAAAA,IAAQ,WAAW,KAAA,EAAO;AACnC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAGA,KAAAA,CAAK,IAAI,CAAA,MAAA,EAAS,KAAK,gBAAA,CAAiBA,KAAAA,CAAK,KAAK,CAAC,CAAA,CAAE,CAAA;AACnE,MAAA,IAAIA,MAAK,KAAA,EAAO;AACd,QAAA,KAAA,CAAM,KAAK,CAAA,GAAA,EAAM,IAAA,CAAK,iBAAiBA,KAAAA,CAAK,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,MACtD;AACA,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,GAAA,EAAMA,KAAAA,CAAK,SAAS,CAAA,CAAE,CAAA;AACjC,MAAA,QAAA,CAAS,IAAA,CAAK,GAAGA,KAAAA,CAAK,QAAQ,CAAA;AAAA,IAChC;AAGA,IAAA,IAAI,UAAA,CAAW,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC/B,MAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAClB,MAAA,KAAA,CAAM,KAAK,IAAA,CAAK,gBAAA,CAAiB,UAAA,CAAW,KAAA,EAAO,QAAQ,CAAC,CAAA;AAAA,IAC9D;AAGA,IAAA,IAAI,UAAA,CAAW,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AACjC,MAAA,KAAA,CAAM,KAAK,UAAU,CAAA;AACrB,MAAA,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IACnF;AAGA,IAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,MAAA,KAAA,CAAM,IAAA,CAAK,QAAA,EAAU,UAAA,CAAW,MAAA,CAAO,SAAS,CAAA;AAChD,MAAA,QAAA,CAAS,IAAA,CAAK,GAAG,UAAA,CAAW,MAAA,CAAO,QAAQ,CAAA;AAAA,IAC7C;AAGA,IAAA,IAAI,UAAA,CAAW,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AACjC,MAAA,KAAA,CAAM,KAAK,UAAU,CAAA;AACrB,MAAA,KAAA,CAAM,IAAA;AAAA,QACJ,WAAW,OAAA,CACR,GAAA,CAAI,CAAC,EAAE,MAAA,EAAQ,WAAU,KAAM,CAAA,EAAG,IAAA,CAAK,gBAAA,CAAiB,MAAM,CAAC,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,CAAA,CAC9E,KAAK,IAAI;AAAA,OACd;AAAA,IACF;AAGA,IAAA,IAAA,CAAK,iBAAA,CAAkB,KAAA,EAAO,UAAA,CAAW,KAAA,EAAO,WAAW,MAAM,CAAA;AAEjE,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AAAA,MACnB;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,UAAA,EAAwC;AAClD,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,MAAM,WAAsB,EAAC;AAE7B,IAAA,KAAA,CAAM,KAAK,aAAa,CAAA;AACxB,IAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,gBAAA,CAAiB,UAAA,CAAW,KAAK,CAAC,CAAA;AAElD,IAAA,MAAM,OAAA,GAAU,OAAO,IAAA,CAAK,UAAA,CAAW,KAAK,CAAC,CAAA,IAAK,EAAE,CAAA;AACpD,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,KAAK,QAAQ,CAAA;AAEvF,IAAA,MAAM,YAAsB,EAAC;AAC7B,IAAA,KAAA,MAAW,GAAA,IAAO,WAAW,IAAA,EAAM;AACjC,MAAA,MAAM,eAAyB,EAAC;AAChC,MAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,QAAA,YAAA,CAAa,IAAA,CAAK,IAAA,CAAK,uBAAA,EAAyB,CAAA;AAChD,QAAA,QAAA,CAAS,IAAA,CAAK,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA,MACxB;AACA,MAAA,SAAA,CAAU,KAAK,CAAA,CAAA,EAAI,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,IAC/C;AACA,IAAA,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAC,CAAA;AAG/B,IAAA,IAAI,UAAA,CAAW,SAAA,IAAa,UAAA,CAAW,SAAA,CAAU,SAAS,CAAA,EAAG;AAC3D,MAAA,KAAA,CAAM,KAAK,WAAW,CAAA;AACtB,MAAA,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,SAAA,CAAU,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IACrF;AAEA,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AAAA,MACnB;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,UAAA,EAAwC;AAClD,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,MAAM,WAAsB,EAAC;AAE7B,IAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AACnB,IAAA,KAAA,CAAM,KAAK,IAAA,CAAK,gBAAA,CAAiB,UAAA,CAAW,KAAK,GAAG,KAAK,CAAA;AAEzD,IAAA,MAAM,aAAuB,EAAC;AAC9B,IAAA,KAAA,MAAW,CAAC,QAAQ,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA,EAAG;AAC7D,MAAA,UAAA,CAAW,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,gBAAA,CAAiB,MAAM,CAAC,CAAA,GAAA,EAAM,IAAA,CAAK,uBAAA,EAAyB,CAAA,CAAE,CAAA;AACtF,MAAA,QAAA,CAAS,KAAK,KAAK,CAAA;AAAA,IACrB;AACA,IAAA,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC,CAAA;AAGhC,IAAA,IAAI,UAAA,CAAW,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC/B,MAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAClB,MAAA,KAAA,CAAM,KAAK,IAAA,CAAK,gBAAA,CAAiB,UAAA,CAAW,KAAA,EAAO,QAAQ,CAAC,CAAA;AAAA,IAC9D;AAGA,IAAA,IAAI,UAAA,CAAW,SAAA,IAAa,UAAA,CAAW,SAAA,CAAU,SAAS,CAAA,EAAG;AAC3D,MAAA,KAAA,CAAM,KAAK,WAAW,CAAA;AACtB,MAAA,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,SAAA,CAAU,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IACrF;AAEA,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AAAA,MACnB;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,UAAA,EAAwC;AAClD,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,MAAM,WAAsB,EAAC;AAE7B,IAAA,KAAA,CAAM,KAAK,aAAa,CAAA;AACxB,IAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,gBAAA,CAAiB,UAAA,CAAW,KAAK,CAAC,CAAA;AAGlD,IAAA,IAAI,UAAA,CAAW,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC/B,MAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAClB,MAAA,KAAA,CAAM,KAAK,IAAA,CAAK,gBAAA,CAAiB,UAAA,CAAW,KAAA,EAAO,QAAQ,CAAC,CAAA;AAAA,IAC9D;AAGA,IAAA,IAAI,UAAA,CAAW,SAAA,IAAa,UAAA,CAAW,SAAA,CAAU,SAAS,CAAA,EAAG;AAC3D,MAAA,KAAA,CAAM,KAAK,WAAW,CAAA;AACtB,MAAA,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,SAAA,CAAU,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IACrF;AAEA,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AAAA,MACnB;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKU,gBAAA,CAAiB,YAA8B,QAAA,EAA6B;AACpF,IAAA,OAAO,UAAA,CACJ,GAAA,CAAI,CAAC,SAAA,EAAW,KAAA,KAAU;AACzB,MAAA,MAAM,SAAS,KAAA,KAAU,CAAA,GAAI,EAAA,GAAK,CAAA,CAAA,EAAI,UAAU,IAAI,CAAA,CAAA,CAAA;AACpD,MAAA,QAAA,CAAS,IAAA,CAAK,GAAG,SAAA,CAAU,QAAQ,CAAA;AACnC,MAAA,OAAO,CAAA,EAAG,MAAM,CAAA,EAAG,SAAA,CAAU,GAAG,CAAA,CAAA;AAAA,IAClC,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA,EAKU,iBAAA,CAAkB,KAAA,EAAiB,KAAA,EAAgB,MAAA,EAAuB;AAClF,IAAA,QAAQ,IAAA,CAAK,OAAO,UAAA;AAAY,MAC9B,KAAK,cAAA,EAAgB;AACnB,QAAA,IAAI,UAAU,MAAA,EAAW;AACvB,UAAA,KAAA,CAAM,IAAA,CAAK,CAAA,MAAA,EAAS,KAAK,CAAA,CAAE,CAAA;AAAA,QAC7B;AACA,QAAA,IAAI,WAAW,MAAA,EAAW;AACxB,UAAA,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,MAAM,CAAA,CAAE,CAAA;AAAA,QAC/B;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,aAAA,EAAe;AAClB,QAAA,IAAI,WAAW,MAAA,EAAW;AACxB,UAAA,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,MAAM,CAAA,KAAA,CAAO,CAAA;AAAA,QACpC;AACA,QAAA,IAAI,UAAU,MAAA,EAAW;AACvB,UAAA,KAAA,CAAM,IAAA,CAAK,CAAA,YAAA,EAAe,KAAK,CAAA,UAAA,CAAY,CAAA;AAAA,QAC7C;AACA,QAAA;AAAA,MACF;AAIA;AACF,EACF;AAAA;AAAA;AAAA;AAAA,EAKU,kBAAA,GAA6B;AACrC,IAAA,OAAO,EAAE,IAAA,CAAK,cAAA;AAAA,EAChB;AACF;;;ACvRO,IAAMC,aAAAA,GAAN,cAA2B,UAAA,CAAW;AAAA,EAClC,IAAA,GAAO,OAAA;AAAA,EAEP,MAAA,GAAwB;AAAA,IAC/B,eAAA,EAAiB,GAAA;AAAA,IACjB,eAAA,EAAiB,KAAA;AAAA,IACjB,cAAA,EAAgB,QAAA;AAAA,IAChB,eAAA,EAAiB,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,OAAA,EAAQ;AAAA,IAChD,aAAA,EAAe;AAAA,MACb,GAAA,EAAK,OAAA;AAAA,MACL,WAAA,EAAa,WAAA;AAAA,MACb,WAAA,EAAa,WAAA;AAAA,MACb,YAAY,CAAC,MAAA,EAAgB,WAAmB,CAAA,YAAA,EAAe,MAAM,MAAM,MAAM,CAAA,EAAA;AAAA,KACnF;AAAA,IACA,UAAA,EAAY,cAAA;AAAA,IACZ,aAAA,EAAe;AAAA,MACb,SAAS,CAAC,MAAA,EAAgB,SAAiB,CAAA,aAAA,EAAgB,MAAM,MAAM,IAAI,CAAA,EAAA,CAAA;AAAA,MAC3E,UAAU,CAAC,MAAA,EAAgB,UAAkB,CAAA,cAAA,EAAiB,MAAM,MAAM,KAAK,CAAA,EAAA;AAAA;AACjF,GACF;AAAA;AAAA;AAAA;AAAA,EAKA,uBAAA,GAAkC;AAChC,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,KAAA,EAAwB;AAClC,IAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AACzC,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,IAAI,OAAO,UAAU,SAAA,EAAW;AAC9B,MAAA,OAAO,QAAQ,MAAA,GAAS,OAAA;AAAA,IAC1B;AAEA,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,OAAO,OAAO,KAAK,CAAA;AAAA,IACrB;AAEA,IAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,MAAA,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,WAAA,EAAY,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA,IAC/D;AAEA,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAE7B,MAAA,OAAO,CAAA,CAAA,EAAI,MAAM,UAAA,CAAW,IAAA,EAAM,MAAM,CAAA,CAAE,UAAA,CAAW,GAAA,EAAK,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,IAClE;AAEA,IAAA,IAAI,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AAC1B,MAAA,OAAO,CAAA,EAAA,EAAK,KAAA,CAAM,QAAA,CAAS,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,IACnC;AAGA,IAAA,OAAO,CAAA,CAAA,EAAI,KAAK,SAAA,CAAU,KAAK,EAAE,UAAA,CAAW,GAAA,EAAK,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,CACE,KAAA,EACA,IAAA,EACA,eAAA,EACsC;AACtC,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAChC,IAAA,MAAM,WAAsB,EAAC;AAE7B,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,KAAA,CAAM,KAAK,aAAa,CAAA;AACxB,IAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,gBAAA,CAAiB,KAAK,CAAC,CAAA;AACvC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,KAAK,QAAQ,CAAA;AAEvF,IAAA,MAAM,eAAe,OAAA,CAAQ,GAAA,CAAI,MAAM,IAAA,CAAK,yBAAyB,CAAA;AACrE,IAAA,KAAA,CAAM,KAAK,CAAA,CAAA,EAAI,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AACzC,IAAA,QAAA,CAAS,IAAA,CAAK,GAAG,MAAA,CAAO,MAAA,CAAO,IAAI,CAAC,CAAA;AAEpC,IAAA,KAAA,CAAM,KAAK,yBAAyB,CAAA;AACpC,IAAA,MAAM,aAAA,GAAgB,OAAA,CACnB,MAAA,CAAO,CAAC,GAAA,KAAQ,CAAC,eAAA,CAAgB,QAAA,CAAS,GAAG,CAAC,CAAA,CAC9C,GAAA,CAAI,CAAC,GAAA,KAAQ,CAAA,EAAG,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAC,aAAa,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAC,CAAA,CAAA,CAAG,CAAA;AACvF,IAAA,KAAA,CAAM,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,IAAI,CAAC,CAAA;AAEnC,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AAAA,MACnB;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,CAAa,OAAe,IAAA,EAAqE;AAC/F,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAChC,IAAA,MAAM,WAAsB,EAAC;AAE7B,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,KAAA,CAAM,KAAK,cAAc,CAAA;AACzB,IAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,gBAAA,CAAiB,KAAK,CAAC,CAAA;AACvC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,KAAK,QAAQ,CAAA;AAEvF,IAAA,MAAM,eAAe,OAAA,CAAQ,GAAA,CAAI,MAAM,IAAA,CAAK,yBAAyB,CAAA;AACrE,IAAA,KAAA,CAAM,KAAK,CAAA,CAAA,EAAI,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AACzC,IAAA,QAAA,CAAS,IAAA,CAAK,GAAG,MAAA,CAAO,MAAA,CAAO,IAAI,CAAC,CAAA;AAEpC,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AAAA,MACnB;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAA,GAA6B;AAC3B,IAAA,OAAO,+BAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMmB,iBAAA,CAAkB,KAAA,EAAiB,KAAA,EAAgB,MAAA,EAAuB;AAE3F,IAAA,IAAI,MAAA,KAAW,MAAA,IAAa,KAAA,KAAU,MAAA,EAAW;AAE/C,MAAA,KAAA,CAAM,KAAK,4BAA4B,CAAA;AACvC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,MAAM,CAAA,CAAE,CAAA;AAAA,IAC/B,CAAA,MAAA,IAAW,UAAU,MAAA,EAAW;AAC9B,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,MAAA,EAAS,KAAK,CAAA,CAAE,CAAA;AAC3B,MAAA,IAAI,WAAW,MAAA,EAAW;AACxB,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,MAAM,CAAA,CAAE,CAAA;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AACF;;;AC1IO,IAAMC,kBAAAA,GAAN,cAAgC,UAAA,CAAW;AAAA,EACvC,IAAA,GAAO,YAAA;AAAA,EAEP,MAAA,GAAwB;AAAA,IAC/B,eAAA,EAAiB,GAAA;AAAA,IACjB,eAAA,EAAiB,KAAA;AAAA,IACjB,cAAA,EAAgB,IAAA;AAAA,IAChB,eAAA,EAAiB,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,OAAA,EAAQ;AAAA,IAChD,aAAA,EAAe;AAAA,MACb,GAAA,EAAK,OAAA;AAAA,MACL,WAAA,EAAa,cAAA;AAAA,MACb,WAAA,EAAa,cAAA;AAAA,MACb,YAAY,CAAC,MAAA,EAAgB,WAAmB,CAAA,QAAA,EAAW,MAAM,MAAM,MAAM,CAAA,EAAA;AAAA,KAC/E;AAAA,IACA,UAAA,EAAY,cAAA;AAAA,IACZ,aAAA,EAAe;AAAA,MACb,SAAS,CAAC,MAAA,EAAgB,SAAiB,CAAA,EAAG,MAAM,MAAM,IAAI,CAAA,CAAA,CAAA;AAAA,MAC9D,UAAU,CAAC,MAAA,EAAgB,UAAkB,CAAA,EAAG,MAAM,QAAQ,KAAK,CAAA,CAAA;AAAA;AACrE,GACF;AAAA;AAAA;AAAA;AAAA,EAKA,uBAAA,GAAkC;AAChC,IAAA,OAAO,CAAA,CAAA,EAAI,IAAA,CAAK,kBAAA,EAAoB,CAAA,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,KAAA,EAAwB;AAClC,IAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AACzC,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,IAAI,OAAO,UAAU,SAAA,EAAW;AAC9B,MAAA,OAAO,QAAQ,MAAA,GAAS,OAAA;AAAA,IAC1B;AAEA,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,OAAO,OAAO,KAAK,CAAA;AAAA,IACrB;AAEA,IAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,MAAA,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,WAAA,EAAa,CAAA,cAAA,CAAA;AAAA,IAChC;AAEA,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAE7B,MAAA,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,UAAA,CAAW,GAAA,EAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,IACxC;AAEA,IAAA,IAAI,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AAC1B,MAAA,OAAO,CAAA,IAAA,EAAO,KAAA,CAAM,QAAA,CAAS,KAAK,CAAC,CAAA,QAAA,CAAA;AAAA,IACrC;AAEA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAExB,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,WAAA,CAAY,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAC/D,MAAA,OAAO,SAAS,OAAO,CAAA,CAAA,CAAA;AAAA,IACzB;AAGA,IAAA,OAAO,CAAA,CAAA,EAAI,KAAK,SAAA,CAAU,KAAK,EAAE,UAAA,CAAW,GAAA,EAAK,IAAI,CAAC,CAAA,QAAA,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,CACE,KAAA,EACA,IAAA,EACA,eAAA,EACA,aAAA,EACsC;AACtC,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAChC,IAAA,MAAM,WAAsB,EAAC;AAE7B,IAAA,IAAA,CAAK,eAAA,EAAgB;AAErB,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,KAAA,CAAM,KAAK,aAAa,CAAA;AACxB,IAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,gBAAA,CAAiB,KAAK,CAAC,CAAA;AACvC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,KAAK,QAAQ,CAAA;AAEvF,IAAA,MAAM,eAAe,OAAA,CAAQ,GAAA,CAAI,MAAM,IAAA,CAAK,yBAAyB,CAAA;AACrE,IAAA,KAAA,CAAM,KAAK,CAAA,CAAA,EAAI,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AACzC,IAAA,QAAA,CAAS,IAAA,CAAK,GAAG,MAAA,CAAO,MAAA,CAAO,IAAI,CAAC,CAAA;AAEpC,IAAA,KAAA,CAAM,KAAK,aAAa,CAAA;AACxB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,eAAA,CAAgB,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AAErF,IAAA,MAAM,QAAA,GAAW,aAAA,IAAiB,OAAA,CAAQ,MAAA,CAAO,CAAC,QAAQ,CAAC,eAAA,CAAgB,QAAA,CAAS,GAAG,CAAC,CAAA;AAExF,IAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,MAAA,KAAA,CAAM,KAAK,eAAe,CAAA;AAC1B,MAAA,MAAM,gBAAgB,QAAA,CAAS,GAAA;AAAA,QAC7B,CAAC,GAAA,KAAQ,CAAA,EAAG,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAC,CAAA,YAAA,EAAe,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAC,CAAA;AAAA,OACjF;AACA,MAAA,KAAA,CAAM,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IACrC,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,KAAK,YAAY,CAAA;AAAA,IACzB;AAEA,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AAAA,MACnB;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,CAAa,OAAA,EAAiB,QAAA,EAAkB,SAAA,EAAmB,YAAY,KAAA,EAAe;AAC5F,IAAA,MAAM,WAAA,GAAc,YAAY,gBAAA,GAAmB,MAAA;AACnD,IAAA,OAAO,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,IAAA,CAAK,gBAAA,CAAiB,OAAO,CAAC,CAAA,KAAA,EAAQ,QAAQ,CAAA,EAAA,EAAK,SAAS,CAAA,CAAA;AAAA,EACvF;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,OAAA,EAA2B;AACxC,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,MAAA,OAAO,aAAA;AAAA,IACT;AACA,IAAA,OAAO,CAAA,UAAA,EAAa,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAA,CAAmB,QAAgB,KAAA,EAAwB;AACzD,IAAA,OAAO,CAAA,EAAG,KAAK,WAAA,CAAY,KAAK,CAAC,CAAA,OAAA,EAAU,IAAA,CAAK,gBAAA,CAAiB,MAAM,CAAC,CAAA,CAAA,CAAA;AAAA,EAC1E;AAAA,EAEA,iBAAA,CAAkB,QAAgB,MAAA,EAA2B;AAC3D,IAAA,OAAO,GAAG,IAAA,CAAK,gBAAA,CAAiB,MAAM,CAAC,aAAa,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,KAAK,WAAA,CAAY,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,EACvG;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,CAAgB,MAAA,EAAgB,KAAA,EAAe,MAAA,GAAS,SAAA,EAAmB;AACzE,IAAA,OAAO,CAAA,aAAA,EAAgB,MAAM,CAAA,GAAA,EAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,CAAC,CAAA,sBAAA,EAAyB,MAAM,CAAA,GAAA,EAAM,IAAA,CAAK,WAAA,CAAY,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,EAC9H;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,CAAc,QAAgB,IAAA,EAAwB;AACpD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACpD,IAAA,OAAO,GAAG,IAAA,CAAK,gBAAA,CAAiB,MAAM,CAAC,KAAK,QAAQ,CAAA,CAAA;AAAA,EACtD;AAAA,EAEA,iBAAA,CAAkB,QAAgB,IAAA,EAAwB;AACxD,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,MAAM,QAAA,GAAW,KAAK,GAAA,EAAI;AAC1B,IAAA,MAAM,QAAA,GACJ,IAAA,CAAK,MAAA,GAAS,CAAA,GACV,CAAA,EAAG,IAAA,CAAK,gBAAA,CAAiB,MAAM,CAAC,CAAA,EAAA,EAAK,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,KAAA,EAAQ,QAAQ,CAAA,CAAA,CAAA,GACzF,CAAA,EAAG,IAAA,CAAK,gBAAA,CAAiB,MAAM,CAAC,OAAO,QAAQ,CAAA,CAAA,CAAA;AACrD,IAAA,OAAO,QAAA;AAAA,EACT;AACF;;;ACtKA,IAAM,YAAA,uBAAmB,GAAA,EAAqC;AAEvD,IAAM,iBAAN,MAAqB;AAAA;AAAA;AAAA;AAAA,EAI1B,OAAO,WAAW,IAAA,EAAuC;AAEvD,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,aAAA,CAAc,IAAI,CAAA;AAG9C,IAAA,IAAI,YAAA,CAAa,GAAA,CAAI,cAAc,CAAA,EAAG;AACpC,MAAA,OAAO,YAAA,CAAa,IAAI,cAAc,CAAA;AAAA,IACxC;AAGA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,aAAA,CAAc,cAAc,CAAA;AACjD,IAAA,YAAA,CAAa,GAAA,CAAI,gBAAgB,OAAO,CAAA;AACxC,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,cAAc,IAAA,EAAuC;AAC1D,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,aAAA,CAAc,IAAI,CAAA;AAE9C,IAAA,QAAQ,cAAA;AAAgB,MACtB,KAAK,OAAA,EAAS;AACZ,QAAA,OAAO,IAAID,aAAAA,EAAa;AAAA,MAC1B;AAAA,MACA,KAAK,YAAA,EAAc;AACjB,QAAA,OAAO,IAAIC,kBAAAA,EAAkB;AAAA,MAC/B;AAAA,MACA,SAAS;AACP,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,IAAI,CAAA,CAAE,CAAA;AAAA,MACtD;AAAA;AACF,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,cAAc,IAAA,EAAmD;AAC9E,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,OAAA;AAAA,MACL,KAAK,SAAA,EAAW;AACd,QAAA,OAAO,OAAA;AAAA,MACT;AAAA,MACA,KAAK,YAAA;AAAA,MACL,KAAK,UAAA,EAAY;AACf,QAAA,OAAO,YAAA;AAAA,MACT;AAAA,MACA,SAAS;AACP,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,IAAI,CAAA,CAAE,CAAA;AAAA,MAClD;AAAA;AACF,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,YAAY,IAAA,EAA2C;AAC5D,IAAA,OAAO,CAAC,OAAA,EAAS,SAAA,EAAW,cAAc,UAAU,CAAA,CAAE,SAAS,IAAI,CAAA;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,UAAA,GAAmB;AACxB,IAAA,YAAA,CAAa,KAAA,EAAM;AAAA,EACrB;AACF;AC/BO,IAAM,eAAN,MAAmB;AAAA,EAGxB,WAAA,CACkB,OAAA,EACA,QAAA,EACAX,OAAAA,EAChB,WAAA,EACA;AAJgB,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAAA,OAAAA;AAGhB,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AAAA,EACrB;AAAA,EATgB,WAAA;AAAA;AAAA;AAAA;AAAA,EAchB,MAAM,YAAA,CAAgBV,IAAAA,EAAa,QAAA,EAA8C;AAC/E,IAAA,IAAA,CAAK,QAAQ,eAAA,EAAgB;AAC7B,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,KAAA,CAASA,IAAAA,EAAK,QAAQ,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,CAAaA,IAAAA,EAAa,QAAA,EAA6C;AAC3E,IAAA,IAAA,CAAK,QAAQ,eAAA,EAAgB;AAC7B,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQA,MAAK,QAAQ,CAAA;AACxD,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,KAAA,EAAuB;AAC7B,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,IAClD;AACA,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,KAAK,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,KAAA,EAAuB;AAC7B,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,IAClD;AACA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,KAAK,CAAA;AAChD,IAAA,OAAO,OAAO,SAAA,KAAc,QAAA,GAAW,SAAA,GAAY,IAAA,CAAK,UAAU,SAAS,CAAA;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAA,GAAqB;AACvB,IAAA,OAAO,KAAK,MAAA,KAAW,MAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,QAAA,GAAoB;AACtB,IAAA,OAAO,KAAK,WAAA,KAAgB,MAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAA,CAAiBA,MAAa,QAAA,EAA6B;AACzD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,EAAa,MAAA,IAAU,KAAA;AAC3C,IAAA,MAAM,OAAOW,UAAAA,CAAW,QAAQ,CAAA,CAC7B,MAAA,CAAOX,OAAM,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAC,EACrC,MAAA,CAAO,KAAK,CAAA,CACZ,KAAA,CAAM,GAAG,EAAE,CAAA;AACd,IAAA,OAAO,CAAA,EAAG,MAAM,CAAA,EAAG,IAAI,CAAA,CAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,kBAAA,CACJA,IAAAA,EACA,QAAA,EACA,OAAA,EACyB;AACzB,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AAErB,MAAA,OAAO,IAAA,CAAK,YAAA,CAAgBA,IAAAA,EAAK,QAAQ,CAAA;AAAA,IAC3C;AAEA,IAAA,MAAMI,YAAW,OAAA,EAAS,GAAA,IAAO,IAAA,CAAK,gBAAA,CAAiBJ,MAAK,QAAQ,CAAA;AAGpE,IAAA,IAAI,GAAA,GAAM,OAAA,EAAS,GAAA,IAAO,IAAA,CAAK,WAAA,CAAY,UAAA;AAC3C,IAAA,IAAI,GAAA,GAAM,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ;AACjC,MAAA,GAAA,GAAM,KAAK,WAAA,CAAY,MAAA;AACvB,MAAA,IAAA,CAAK,YAAY,MAAA,EAAQ,IAAA;AAAA,QACvB,aAAa,OAAA,EAAS,GAAG,CAAA,iBAAA,EAAoB,IAAA,CAAK,YAAY,MAAM,CAAA,eAAA;AAAA,OACtE;AAAA,IACF;AAGA,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ,IAAoBI,SAAQ,CAAA;AAC1E,IAAA,IAAI,MAAA,KAAW,IAAA,IAAQ,MAAA,KAAW,MAAA,EAAW;AAC3C,MAAA,OAAO,MAAA;AAAA,IACT;AAGA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,YAAA,CAAgBJ,MAAK,QAAQ,CAAA;AAGvD,IAAA,IAAI,MAAA,CAAO,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,gBAAA,EAAkB;AACvD,MAAA,IAAA,CAAK,YAAY,MAAA,EAAQ,IAAA;AAAA,QACvB,iCAAiC,MAAA,CAAO,QAAQ,CAAA,YAAA,EAAe,IAAA,CAAK,YAAY,gBAAgB,CAAA,0BAAA;AAAA,OAClG;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AAGA,IAAA,IAAI,MAAA,CAAO,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,iBAAA,EAAmB;AACxD,MAAA,IAAA,CAAK,YAAY,MAAA,EAAQ,IAAA;AAAA,QACvB,CAAA,QAAA,EAAW,OAAO,QAAQ,CAAA,wDAAA;AAAA,OAC5B;AAAA,IACF;AAGA,IAAA,MAAM,KAAK,WAAA,CAAY,OAAA,CAAQ,GAAA,CAAII,SAAAA,EAAU,QAAQ,GAAG,CAAA;AAExD,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,OAAA,EAAiC;AACrD,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,MAAA,IAAU,KAAA;AAC1C,IAAA,MAAM,GAAA,GAAM,UAAU,CAAA,EAAG,MAAM,GAAG,OAAO,CAAA,CAAA,CAAA,GAAM,GAAG,MAAM,CAAA,CAAA,CAAA;AAGxD,IAAA,IAAI,OAAQ,IAAA,CAAK,WAAA,CAAY,OAAA,CAAgB,kBAAkB,UAAA,EAAY;AACzE,MAAA,MAAO,IAAA,CAAK,WAAA,CAAY,OAAA,CAAgB,aAAA,CAAc,GAAG,CAAA;AAAA,IAC3D;AAAA,EACF;AACF;;;AClLO,IAAM,YAAA,GAAN,MAAM,aAAA,CAAa;AAAA,EAGxB,YAA6B,OAAA,EAAqB;AAArB,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAAsB;AAAA,EAF3C,aAA+E,EAAC;AAAA,EAUxF,KAAA,CACE,kBAAA,EACA,eAAA,EACA,KAAA,EACM;AACN,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,cAAA,CAAe,kBAAA,EAAoB,iBAAiB,KAAK,CAAA;AAC5E,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,EAAE,WAAA,EAAa,KAAA,EAAO,OAAO,CAAA;AAClD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAQA,OAAA,CACE,kBAAA,EACA,eAAA,EACA,KAAA,EACM;AACN,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,cAAA,CAAe,kBAAA,EAAoB,iBAAiB,KAAK,CAAA;AAC5E,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,EAAE,WAAA,EAAa,IAAA,EAAM,OAAO,CAAA;AACjD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,MAAA,EAAsB;AAC9B,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK;AAAA,MACnB,WAAA,EAAa,KAAA;AAAA,MACb,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,KAAK,KAAA;AAAM,KAC3C,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,MAAA,EAAsB;AACjC,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK;AAAA,MACnB,WAAA,EAAa,KAAA;AAAA,MACb,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,KAAK,IAAA;AAAK,KAC1C,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,CAAQ,QAAgB,MAAA,EAAyB;AAC/C,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK;AAAA,MACnB,WAAA,EAAa,KAAA;AAAA,MACb,OAAO,EAAE,IAAA,EAAM,MAAM,MAAA,EAAQ,MAAA,EAAQ,KAAK,KAAA;AAAM,KACjD,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,CAAW,QAAgB,MAAA,EAAyB;AAClD,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK;AAAA,MACnB,WAAA,EAAa,KAAA;AAAA,MACb,OAAO,EAAE,IAAA,EAAM,MAAM,MAAA,EAAQ,MAAA,EAAQ,KAAK,IAAA;AAAK,KAChD,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,CAAa,MAAA,EAAgB,IAAA,EAAe,EAAA,EAAmB;AAC7D,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK;AAAA,MACnB,WAAA,EAAa,KAAA;AAAA,MACb,KAAA,EAAO,EAAE,IAAA,EAAM,SAAA,EAAW,QAAQ,IAAA,EAAM,EAAA,EAAI,KAAK,KAAA;AAAM,KACxD,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,CAAgB,MAAA,EAAgB,IAAA,EAAe,EAAA,EAAmB;AAChE,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK;AAAA,MACnB,WAAA,EAAa,KAAA;AAAA,MACb,KAAA,EAAO,EAAE,IAAA,EAAM,SAAA,EAAW,QAAQ,IAAA,EAAM,EAAA,EAAI,KAAK,IAAA;AAAK,KACvD,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,CAAU,QAAgB,OAAA,EAAuB;AAC/C,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK;AAAA,MACnB,WAAA,EAAa,KAAA;AAAA,MACb,OAAO,EAAE,IAAA,EAAM,QAAQ,MAAA,EAAQ,OAAA,EAAS,KAAK,KAAA;AAAM,KACpD,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,CAAa,QAAgB,OAAA,EAAuB;AAClD,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK;AAAA,MACnB,WAAA,EAAa,KAAA;AAAA,MACb,OAAO,EAAE,IAAA,EAAM,QAAQ,MAAA,EAAQ,OAAA,EAAS,KAAK,IAAA;AAAK,KACnD,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,CAASJ,IAAAA,EAAa,QAAA,GAAsB,EAAC,EAAS;AACpD,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK;AAAA,MACnB,WAAA,EAAa,KAAA;AAAA,MACb,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,GAAA,EAAAA,MAAK,QAAA;AAAS,KACrC,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAA0B;AACxB,IAAA,OAAO,IAAA,CAAK,WAAW,GAAA,CAAI,CAAC,EAAE,WAAA,EAAa,KAAA,IAAS,KAAA,KAAU;AAC5D,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA;AACxC,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,KAAA,KAAU,CAAA,GAAI,KAAA,GAAQ,WAAA;AAAA,QAC5B,KAAK,MAAA,CAAO,GAAA;AAAA,QACZ,UAAU,MAAA,CAAO;AAAA,OACnB;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAyB;AACvB,IAAA,OAAO,IAAA,CAAK,WAAW,MAAA,GAAS,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,aAAa,EAAC;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAsB;AACpB,IAAA,MAAM,MAAA,GAAS,IAAI,aAAA,CAAa,IAAA,CAAK,OAAO,CAAA;AAE5C,IAAA,MAAA,CAAO,UAAA,GAAa,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,MACjD,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,KAAA,EAAO,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,KAAK;AAAA,KACnC,CAAE,CAAA;AACF,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAW,KAAA,EAAiD;AAClE,IAAA,QAAQ,MAAM,IAAA;AAAM,MAClB,KAAK,QAAA,EAAU;AACb,QAAA,OAAO,EAAE,GAAG,KAAA,EAAM;AAAA,MACpB;AAAA,MACA,KAAK,QAAA,EAAU;AACb,QAAA,OAAO,EAAE,GAAG,KAAA,EAAO,IAAA,EAAM,EAAE,GAAG,KAAA,CAAM,MAAK,EAAE;AAAA,MAC7C;AAAA,MACA,KAAK,KAAA,EAAO;AACV,QAAA,OAAO,EAAE,GAAG,KAAA,EAAO,QAAA,EAAU,CAAC,GAAG,KAAA,CAAM,QAAQ,CAAA,EAAE;AAAA,MACnD;AAAA,MACA,KAAK,MAAA,EAAQ;AACX,QAAA,OAAO,EAAE,GAAG,KAAA,EAAM;AAAA,MACpB;AAAA,MACA,KAAK,IAAA,EAAM;AACT,QAAA,OAAO,EAAE,GAAG,KAAA,EAAO,MAAA,EAAQ,CAAC,GAAG,KAAA,CAAM,MAAM,CAAA,EAAE;AAAA,MAC/C;AAAA,MACA,KAAK,SAAA,EAAW;AACd,QAAA,OAAO,EAAE,GAAG,KAAA,EAAM;AAAA,MACpB;AAAA,MACA,KAAK,MAAA,EAAQ;AACX,QAAA,OAAO,EAAE,GAAG,KAAA,EAAM;AAAA,MACpB;AAAA;AACF,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAA,CACN,kBAAA,EACA,eAAA,EACA,KAAA,EACqB;AAErB,IAAA,IAAI,OAAO,uBAAuB,QAAA,EAAU;AAC1C,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,kBAAA,EAAmB;AAAA,IACpD;AAGA,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,QAAA;AAAA,QACN,MAAA,EAAQ,kBAAA;AAAA,QACR,QAAA,EAAU,eAAA;AAAA,QACV;AAAA,OACF;AAAA,IACF;AAGA,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,QAAA;AAAA,MACN,MAAA,EAAQ,kBAAA;AAAA,MACR,QAAA,EAAU,GAAA;AAAA,MACV,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,KAAA,EAAkE;AACvF,IAAA,QAAQ,MAAM,IAAA;AAAM,MAClB,KAAK,QAAA,EAAU;AACb,QAAA,OAAO,KAAK,oBAAA,CAAqB,KAAA,CAAM,QAAQ,KAAA,CAAM,QAAA,EAAU,MAAM,KAAK,CAAA;AAAA,MAC5E;AAAA,MAEA,KAAK,QAAA,EAAU;AACb,QAAA,OAAO,IAAA,CAAK,oBAAA,CAAqB,KAAA,CAAM,IAAI,CAAA;AAAA,MAC7C;AAAA,MAEA,KAAK,KAAA,EAAO;AACV,QAAA,OAAO,EAAE,GAAA,EAAK,KAAA,CAAM,GAAA,EAAK,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,MACpD;AAAA,MAEA,KAAK,MAAA,EAAQ;AACX,QAAA,OAAO;AAAA,UACL,GAAA,EAAK,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAAiB,KAAA,CAAM,MAAM,CAAC,CAAA,IAAA,EAAO,KAAA,CAAM,GAAA,GAAM,MAAA,GAAS,EAAE,CAAA,IAAA,CAAA;AAAA,UACjF,UAAU;AAAC,SACb;AAAA,MACF;AAAA,MAEA,KAAK,IAAA,EAAM;AACT,QAAA,OAAO,KAAK,gBAAA,CAAiB,KAAA,CAAM,QAAQ,KAAA,CAAM,MAAA,EAAQ,MAAM,GAAG,CAAA;AAAA,MACpE;AAAA,MAEA,KAAK,SAAA,EAAW;AACd,QAAA,OAAO,IAAA,CAAK,sBAAsB,KAAA,CAAM,MAAA,EAAQ,MAAM,IAAA,EAAM,KAAA,CAAM,EAAA,EAAI,KAAA,CAAM,GAAG,CAAA;AAAA,MACjF;AAAA,MAEA,KAAK,MAAA,EAAQ;AACX,QAAA,OAAO;AAAA,UACL,KAAK,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAAiB,MAAM,MAAM,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,MAAM,MAAA,GAAS,EAAE,QAAQ,IAAA,CAAK,OAAA,CAAQ,yBAAyB,CAAA,CAAA;AAAA,UAC5H,QAAA,EAAU,CAAC,KAAA,CAAM,OAAO;AAAA,SAC1B;AAAA,MACF;AAAA;AACF,EACF;AAAA,EAEQ,oBAAA,CACN,MAAA,EACA,QAAA,EACA,KAAA,EACsC;AACtC,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAAiB,MAAM,CAAA;AAG1D,IAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AACzC,MAAA,IAAI,QAAA,KAAa,GAAA,IAAO,QAAA,KAAa,IAAA,EAAM;AACzC,QAAA,OAAO,EAAE,GAAA,EAAK,CAAA,EAAG,aAAa,CAAA,QAAA,CAAA,EAAY,QAAA,EAAU,EAAC,EAAE;AAAA,MACzD;AACA,MAAA,IAAI,QAAA,KAAa,IAAA,IAAQ,QAAA,KAAa,IAAA,EAAM;AAC1C,QAAA,OAAO,EAAE,GAAA,EAAK,CAAA,EAAG,aAAa,CAAA,YAAA,CAAA,EAAgB,QAAA,EAAU,EAAC,EAAE;AAAA,MAC7D;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,OAAA,CAAQ,uBAAA,EAAwB;AACzD,IAAA,OAAO;AAAA,MACL,KAAK,CAAA,EAAG,aAAa,CAAA,CAAA,EAAI,QAAQ,IAAI,WAAW,CAAA,CAAA;AAAA,MAChD,QAAA,EAAU,CAAC,KAAK;AAAA,KAClB;AAAA,EACF;AAAA,EAEQ,qBAAqB,IAAA,EAG3B;AACA,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,MAAM,WAAsB,EAAC;AAE7B,IAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AAClD,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,oBAAA,CAAqB,MAAA,EAAQ,KAAK,KAAK,CAAA;AAC3D,MAAA,OAAA,CAAQ,IAAA,CAAK,OAAO,GAAG,CAAA;AACvB,MAAA,QAAA,CAAS,IAAA,CAAK,GAAG,MAAA,CAAO,QAAQ,CAAA;AAAA,IAClC;AAEA,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,CAAA,CAAA,EAAI,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,CAAA,GAAM,OAAA,CAAQ,CAAC,CAAA,IAAK,KAAA;AAAA,MACvE;AAAA,KACF;AAAA,EACF;AAAA,EAEQ,gBAAA,CACN,MAAA,EACA,MAAA,EACA,GAAA,EACsC;AACtC,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AAEvB,MAAA,OAAO,EAAE,GAAA,EAAK,GAAA,GAAM,QAAQ,KAAA,EAAO,QAAA,EAAU,EAAC,EAAE;AAAA,IAClD;AAEA,IAAA,MAAM,eAAe,MAAA,CAAO,GAAA,CAAI,MAAM,IAAA,CAAK,OAAA,CAAQ,yBAAyB,CAAA;AAC5E,IAAA,MAAM,QAAA,GAAW,MAAM,QAAA,GAAW,IAAA;AAElC,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAAiB,MAAM,CAAC,CAAA,CAAA,EAAI,QAAQ,CAAA,EAAA,EAAK,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,MACrF,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAAA,EAEQ,qBAAA,CACN,MAAA,EACA,IAAA,EACA,EAAA,EACA,GAAA,EACsC;AACtC,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAAiB,MAAM,CAAA;AAC1D,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,OAAA,CAAQ,uBAAA,EAAwB;AAC1D,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,OAAA,CAAQ,uBAAA,EAAwB;AAC1D,IAAA,MAAM,QAAA,GAAW,MAAM,aAAA,GAAgB,SAAA;AAEvC,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,GAAG,aAAa,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,YAAY,QAAQ,YAAY,CAAA,CAAA;AAAA,MACrE,QAAA,EAAU,CAAC,IAAA,EAAM,EAAE;AAAA,KACrB;AAAA,EACF;AACF;;;AC9VO,IAAM,aAAA,GAAN,MAAM,cAAA,CAA2B;AAAA,EAgCtC,YAA6B,GAAA,EAAmB;AAAnB,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAC3B,IAAA,IAAI,GAAA,CAAI,aAAa,MAAA,EAAQ;AAC3B,MAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AAAA,IACvB;AACA,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAI,YAAA,CAAa,GAAA,CAAI,OAAO,CAAA;AAAA,EACnD;AAAA;AAAA,EAnCQ,WAAqB,EAAC;AAAA,EACtB,SAAA,GAAY,KAAA;AAAA,EACZ,MAAA;AAAA,EACA,WAAA;AAAA;AAAA,EAGA,SAA2B,EAAC;AAAA;AAAA,EAG5B,WAAqB,EAAC;AAAA,EACtB,OAAA;AAAA,EACA,WAAgC,EAAC;AAAA;AAAA,EAGjC,MAAA;AAAA,EACA,OAAA;AAAA;AAAA,EAGA,aAAA;AAAA;AAAA,EAGA,cAAA,uBAAkC,GAAA,EAAI;AAAA,EACtC,cAAA,uBAAkC,GAAA,EAAI;AAAA;AAAA,EAGtC,aAAA,GAAgB,KAAA;AAAA,EAChB,SAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcR,UAAU,OAAA,EAAyB;AACjC,IAAA,IAAA,CAAK,QAAA,GAAW,OAAA;AAChB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,OAAA,EAAyB;AACpC,IAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,GAAG,OAAO,CAAA;AAC7B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAAiB;AACf,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,CAAK,OAAe,KAAA,EAAsB;AACxC,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AACd,IAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,CAAM,OAAe,KAAA,EAAsB;AACzC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,KAAK,CAAA;AAAA,EAC/B;AAAA,EAOA,KAAA,CACE,kBAAA,EACA,eAAA,EACA,KAAA,EACM;AACN,IAAA,IAAA,CAAK,aAAA,CAAc,KAAA,CAAM,kBAAA,EAA2B,eAAA,EAAwB,KAAK,CAAA;AACjF,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAKA,OAAA,CACE,kBAAA,EACA,eAAA,EACA,KAAA,EACM;AACN,IAAA,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,kBAAA,EAA2B,eAAA,EAAwB,KAAK,CAAA;AACnF,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,UAAU,MAAA,EAAsB;AAC9B,IAAA,IAAA,CAAK,aAAA,CAAc,UAAU,MAAM,CAAA;AACnC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,aAAa,MAAA,EAAsB;AACjC,IAAA,IAAA,CAAK,aAAA,CAAc,aAAa,MAAM,CAAA;AACtC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAA,CAAQ,QAAgB,MAAA,EAAyB;AAC/C,IAAA,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,MAAA,EAAQ,MAAM,CAAA;AACzC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,UAAA,CAAW,QAAgB,MAAA,EAAyB;AAClD,IAAA,IAAA,CAAK,aAAA,CAAc,UAAA,CAAW,MAAA,EAAQ,MAAM,CAAA;AAC5C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,YAAA,CAAa,MAAA,EAAgB,IAAA,EAAe,EAAA,EAAmB;AAC7D,IAAA,IAAA,CAAK,aAAA,CAAc,YAAA,CAAa,MAAA,EAAQ,IAAA,EAAM,EAAE,CAAA;AAChD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,SAAA,CAAU,QAAgB,OAAA,EAAuB;AAC/C,IAAA,IAAA,CAAK,aAAA,CAAc,SAAA,CAAU,MAAA,EAAQ,OAAO,CAAA;AAC5C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,QAAA,CAASA,IAAAA,EAAa,QAAA,GAAsB,EAAC,EAAS;AACpD,IAAA,IAAA,CAAK,aAAA,CAAc,QAAA,CAASA,IAAAA,EAAK,QAAQ,CAAA;AACzC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAIA,IAAA,CAAK,KAAA,EAAe,SAAA,EAAmB,QAAA,GAAsB,EAAC,EAAS;AACrE,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,SAAA,EAAW,QAAQ,CAAA;AAAA,EAClD;AAAA,EAEA,SAAA,CAAU,KAAA,EAAe,SAAA,EAAmB,QAAA,GAAsB,EAAC,EAAS;AAC1E,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,EAAE,IAAA,EAAM,SAAS,KAAA,EAAO,SAAA,EAAW,UAAU,CAAA;AAC9D,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,QAAA,CAAS,KAAA,EAAe,SAAA,EAAmB,QAAA,GAAsB,EAAC,EAAS;AACzE,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,EAAE,IAAA,EAAM,QAAQ,KAAA,EAAO,SAAA,EAAW,UAAU,CAAA;AAC7D,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,SAAA,CAAU,KAAA,EAAe,SAAA,EAAmB,QAAA,GAAsB,EAAC,EAAS;AAC1E,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,EAAE,IAAA,EAAM,SAAS,KAAA,EAAO,SAAA,EAAW,UAAU,CAAA;AAC9D,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,QAAA,CAAS,KAAA,EAAe,SAAA,EAAmB,QAAA,GAAsB,EAAC,EAAS;AACzE,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,EAAE,IAAA,EAAM,QAAQ,KAAA,EAAO,SAAA,EAAW,UAAU,CAAA;AAC7D,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,UAAU,KAAA,EAAqB;AAC7B,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,SAAA,EAAW,EAAA,EAAI,QAAA,EAAU,EAAC,EAAG,CAAA;AACtE,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,WAAW,KAAA,EAAe,KAAA,EAAe,SAAA,EAAmB,QAAA,GAAsB,EAAC,EAAS;AAC1F,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,EAAE,IAAA,EAAM,QAAQ,KAAA,EAAO,KAAA,EAAO,SAAA,EAAW,QAAA,EAAU,CAAA;AACpE,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,YAAY,KAAA,EAAe,KAAA,EAAe,SAAA,EAAmB,QAAA,GAAsB,EAAC,EAAS;AAC3F,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,EAAE,IAAA,EAAM,SAAS,KAAA,EAAO,KAAA,EAAO,SAAA,EAAW,QAAA,EAAU,CAAA;AACrE,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAIA,WAAW,OAAA,EAAyB;AAClC,IAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,GAAG,OAAO,CAAA;AAC7B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAA,CAAO,SAAA,EAAmB,QAAA,GAAsB,EAAC,EAAS;AACxD,IAAA,IAAA,CAAK,OAAA,GAAU,EAAE,SAAA,EAAW,QAAA,EAAS;AACrC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAIA,OAAA,CAAQ,MAAA,EAAgB,SAAA,GAA4B,KAAA,EAAa;AAC/D,IAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,EAAE,MAAA,EAAQ,WAAW,CAAA;AACxC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,YAAY,MAAA,EAAsB;AAChC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,MAAM,CAAA;AAAA,EACpC;AAAA,EAEA,WAAW,MAAA,EAAsB;AAC/B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,KAAK,CAAA;AAAA,EACnC;AAAA,EAEA,WAAW,UAAA,EAA0B;AACnC,IAAA,IAAA,CAAK,QAAA,CAAS,KAAK,EAAE,MAAA,EAAQ,YAAY,SAAA,EAAW,KAAA,EAAO,GAAA,EAAK,IAAA,EAAM,CAAA;AACtE,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,UAAA,GAAmB;AACjB,IAAA,IAAA,CAAK,WAAW,EAAC;AACjB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAA,CAAQ,MAAA,EAAgB,SAAA,GAA4B,KAAA,EAAa;AAC/D,IAAA,IAAA,CAAK,WAAW,EAAC;AACjB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,SAAS,CAAA;AAAA,EACvC;AAAA;AAAA,EAIA,MAAMM,MAAAA,EAAqB;AACzB,IAAA,IAAA,CAAK,MAAA,GAASA,MAAAA;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAOA,MAAAA,EAAqB;AAC1B,IAAA,IAAA,CAAK,OAAA,GAAUA,MAAAA;AACf,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,KAAKA,MAAAA,EAAqB;AACxB,IAAA,OAAO,IAAA,CAAK,OAAOA,MAAK,CAAA;AAAA,EAC1B;AAAA,EAEA,KAAKA,MAAAA,EAAqB;AACxB,IAAA,OAAO,IAAA,CAAK,MAAMA,MAAK,CAAA;AAAA,EACzB;AAAA,EAEA,QAAA,CAAS,MAAc,OAAA,EAAuB;AAC5C,IAAA,IAAA,CAAK,MAAA,GAAS,OAAA;AACd,IAAA,IAAA,CAAK,OAAA,GAAA,CAAW,OAAO,CAAA,IAAK,OAAA;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAA,CAAQ,IAAA,EAAc,OAAA,GAAU,EAAA,EAAU;AACxC,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,OAAO,CAAA;AAAA,EACpC;AAAA;AAAA,EAIA,WAAW,MAAA,EAAwB;AACjC,IAAA,MAAA,CAAO,QAAQ,CAAC,CAAA,KAAM,KAAK,cAAA,CAAe,GAAA,CAAI,CAAC,CAAC,CAAA;AAChD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,WAAW,MAAA,EAAwB;AACjC,IAAA,MAAA,CAAO,QAAQ,CAAC,CAAA,KAAM,KAAK,cAAA,CAAe,GAAA,CAAI,CAAC,CAAC,CAAA;AAChD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAIA,MAAM,OAAA,EAAuC;AAC3C,IAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU;AACtB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AAErB,IAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,MAAA,IAAA,CAAK,SAAA,GAAY,OAAA;AAAA,IACnB,WAAW,OAAA,EAAS;AAClB,MAAA,IAAA,CAAK,YAAY,OAAA,CAAQ,GAAA;AACzB,MAAA,IAAA,CAAK,YAAY,OAAA,CAAQ,GAAA;AACzB,MAAA,IAAA,CAAK,aAAa,OAAA,CAAQ,IAAA;AAAA,IAC5B;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,aAAA,GAAgB,KAAA;AACrB,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA;AACjB,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA;AACjB,IAAA,IAAA,CAAK,UAAA,GAAa,MAAA;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,SAAS,OAAA,EAAuB;AAC9B,IAAA,IAAA,CAAK,SAAA,GAAY,OAAA;AACjB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,SAAS,GAAA,EAAmB;AAC1B,IAAA,IAAA,CAAK,SAAA,GAAY,GAAA;AACjB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,aAAa,IAAA,EAAsB;AACjC,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,aAAA,GAA4B;AAC1B,IAAA,OAAO;AAAA,MACL,SAAS,IAAA,CAAK,aAAA;AAAA,MACd,KAAK,IAAA,CAAK,SAAA;AAAA,MACV,KAAK,IAAA,CAAK,SAAA;AAAA,MACV,MAAM,IAAA,CAAK;AAAA,KACb;AAAA,EACF;AAAA;AAAA,EAIA,KAAA,GAA8C;AAC5C,IAAA,IAAA,CAAK,GAAA,CAAI,QAAQ,eAAA,EAAgB;AAEjC,IAAA,MAAM,UAAA,GAA+B;AAAA,MACnC,OAAA,EAAS,KAAK,QAAA,CAAS,MAAA,GAAS,IAAI,IAAA,CAAK,QAAA,GAAW,CAAC,GAAG,CAAA;AAAA,MACxD,UAAU,IAAA,CAAK,SAAA;AAAA,MACf,MAAM,IAAA,CAAK,MAAA;AAAA,MACX,WAAW,IAAA,CAAK,WAAA;AAAA,MAChB,OAAO,IAAA,CAAK,MAAA;AAAA,MACZ,KAAA,EAAO,IAAA,CAAK,aAAA,CAAc,KAAA,EAAM;AAAA,MAChC,SAAS,IAAA,CAAK,QAAA;AAAA,MACd,QAAQ,IAAA,CAAK,OAAA;AAAA,MACb,SAAS,IAAA,CAAK,QAAA;AAAA,MACd,OAAO,IAAA,CAAK,MAAA;AAAA,MACZ,QAAQ,IAAA,CAAK;AAAA,KACf;AAEA,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,WAAA,CAAY,UAAU,CAAA;AAAA,EAChD;AAAA;AAAA,EAIA,MAAM,GAAA,GAAoB;AACxB,IAAA,MAAM,EAAE,GAAA,EAAAN,IAAAA,EAAK,QAAA,EAAS,GAAI,KAAK,KAAA,EAAM;AAErC,IAAA,MAAM,MAAA,GACJ,IAAA,CAAK,aAAA,IAAiB,IAAA,CAAK,GAAA,CAAI,QAAA,GAC3B,MAAM,IAAA,CAAK,GAAA,CAAI,kBAAA,CAAsBA,IAAAA,EAAK,QAAA,EAAU;AAAA,MAClD,KAAK,IAAA,CAAK,SAAA;AAAA,MACV,KAAK,IAAA,CAAK;AAAA,KACX,CAAA,GACD,MAAM,KAAK,GAAA,CAAI,YAAA,CAAgBA,MAAK,QAAQ,CAAA;AAElD,IAAA,OAAO,IAAA,CAAK,cAAA,CAAe,MAAA,CAAO,IAAI,CAAA;AAAA,EACxC;AAAA,EAEA,MAAM,KAAA,GAA2B;AAC/B,IAAA,IAAA,CAAK,MAAA,GAAS,CAAA;AACd,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,GAAA,EAAI;AAC/B,IAAA,OAAO,OAAA,CAAQ,CAAC,CAAA,IAAK,IAAA;AAAA,EACvB;AAAA,EAEA,MAAM,WAAA,GAA0B;AAC9B,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,KAAA,EAAM;AAChC,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,MAAM,IAAI,MAAM,iBAAiB,CAAA;AAAA,IACnC;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,IAAA,GAAmB;AACvB,IAAA,IAAA,CAAK,MAAA,GAAS,CAAA;AACd,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,GAAA,EAAI;AAE/B,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,MAAA,MAAM,IAAI,MAAM,iBAAiB,CAAA;AAAA,IACnC;AACA,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,MAAA,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAAA,IAC7D;AAEA,IAAA,OAAO,QAAQ,CAAC,CAAA;AAAA,EAClB;AAAA,EAEA,MAAM,KAAA,CAAM,MAAA,GAAS,GAAA,EAAsB;AACzC,IAAA,MAAM,kBAAkB,IAAA,CAAK,QAAA;AAC7B,IAAA,IAAA,CAAK,QAAA,GAAW,CAAC,CAAA,MAAA,EAAS,MAAM,CAAA,UAAA,CAAY,CAAA;AAE5C,IAAA,MAAM,EAAE,GAAA,EAAAA,IAAAA,EAAK,QAAA,EAAS,GAAI,KAAK,KAAA,EAAM;AACrC,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,GAAA,CAAI,YAAA,CAAyCA,MAAK,QAAQ,CAAA;AAEpF,IAAA,IAAA,CAAK,QAAA,GAAW,eAAA;AAChB,IAAA,OAAO,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,SAAS,CAAC,CAAA;AAAA,EAC1C;AAAA,EAEA,MAAM,MAAA,GAA2B;AAC/B,IAAA,MAAMM,MAAAA,GAAQ,MAAM,IAAA,CAAK,KAAA,EAAM;AAC/B,IAAA,OAAOA,MAAAA,GAAQ,CAAA;AAAA,EACjB;AAAA,EAEA,MAAM,WAAA,GAAgC;AACpC,IAAA,OAAO,CAAE,MAAM,IAAA,CAAK,MAAA,EAAO;AAAA,EAC7B;AAAA,EAEA,MAAM,SAAA,CACJ,EAAA,EACA,MAAA,EACwB;AACxB,IAAA,MAAM,kBAAkB,IAAA,CAAK,QAAA;AAC7B,IAAA,IAAA,CAAK,QAAA,GAAW,CAAC,CAAA,EAAG,EAAE,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,gBAAA,CAAiB,MAAM,CAAC,CAAA,UAAA,CAAY,CAAA;AAE/E,IAAA,MAAM,EAAE,GAAA,EAAAN,IAAAA,EAAK,QAAA,EAAS,GAAI,KAAK,KAAA,EAAM;AACrC,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,GAAA,CAAI,YAAA,CAAgDA,MAAK,QAAQ,CAAA;AAE3F,IAAA,IAAA,CAAK,QAAA,GAAW,eAAA;AAChB,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,KAAA;AAC9B,IAAA,OAAO,KAAA,KAAU,IAAA,GAAO,IAAA,GAAO,MAAA,CAAO,KAAK,CAAA;AAAA,EAC7C;AAAA,EAEA,IAAI,MAAA,EAAwC;AAC1C,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,MAAM,CAAA;AAAA,EACrC;AAAA,EAEA,IAAI,MAAA,EAAwC;AAC1C,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,MAAM,CAAA;AAAA,EACrC;AAAA,EAEA,IAAI,MAAA,EAAwC;AAC1C,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,MAAM,CAAA;AAAA,EACrC;AAAA,EAEA,IAAI,MAAA,EAAwC;AAC1C,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,MAAM,CAAA;AAAA,EACrC;AAAA,EAEA,MAAM,MAAmB,MAAA,EAA8B;AACrD,IAAA,MAAM,kBAAkB,IAAA,CAAK,QAAA;AAC7B,IAAA,IAAA,CAAK,QAAA,GAAW,CAAC,MAAM,CAAA;AAEvB,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,GAAA,EAAI;AAC/B,IAAA,IAAA,CAAK,QAAA,GAAW,eAAA;AAEhB,IAAA,OAAO,QAAQ,GAAA,CAAI,CAAC,GAAA,KAAa,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,EAC9C;AAAA,EAEA,MAAM,aAAA,CACJ,WAAA,EACA,SAAA,EACoB;AACpB,IAAA,MAAM,kBAAkB,IAAA,CAAK,QAAA;AAC7B,IAAA,IAAA,CAAK,QAAA,GAAW,CAAC,SAAA,EAAW,WAAW,CAAA;AAEvC,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,GAAA,EAAI;AAC/B,IAAA,IAAA,CAAK,QAAA,GAAW,eAAA;AAEhB,IAAA,MAAM,GAAA,uBAAU,GAAA,EAAU;AAC1B,IAAA,KAAA,MAAW,OAAO,OAAA,EAAkB;AAClC,MAAA,GAAA,CAAI,IAAI,GAAA,CAAI,SAAS,CAAA,EAAQ,GAAA,CAAI,WAAW,CAAM,CAAA;AAAA,IACpD;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,MAAM,KAAA,CACJ,IAAA,EACA,QAAA,EACe;AACf,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,IAAI,WAAA,GAAc,CAAA;AAClB,IAAA,IAAI,OAAA,GAAU,IAAA;AAEd,IAAA,OAAO,OAAA,EAAS;AACd,MAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,MAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AAEf,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,GAAA,EAAI;AAE5B,MAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,QAAA,OAAA,GAAU,KAAA;AACV,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,EAAM,WAAW,CAAA;AAE/C,MAAA,IAAI,WAAW,KAAA,EAAO;AACpB,QAAA,OAAA,GAAU,KAAA;AACV,QAAA;AAAA,MACF;AAEA,MAAA,MAAA,IAAU,IAAA;AACV,MAAA,WAAA,EAAA;AAEA,MAAA,IAAI,IAAA,CAAK,SAAS,IAAA,EAAM;AACtB,QAAA,OAAA,GAAU,KAAA;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,IAAA,CAAK,SAAA,GAAY,GAAA,EAAuC;AAC7D,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,IAAI,OAAA,GAAU,IAAA;AAEd,IAAA,OAAO,OAAA,EAAS;AACd,MAAA,IAAA,CAAK,MAAA,GAAS,SAAA;AACd,MAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AAEf,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,GAAA,EAAI;AAE5B,MAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,QAAA,MAAM,GAAA;AAAA,MACR;AAEA,MAAA,IAAI,IAAA,CAAK,SAAS,SAAA,EAAW;AAC3B,QAAA,OAAA,GAAU,KAAA;AAAA,MACZ,CAAA,MAAO;AACL,QAAA,MAAA,IAAU,SAAA;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAIQ,eAAe,IAAA,EAAgB;AACrC,IAAA,IAAI,KAAK,cAAA,CAAe,IAAA,KAAS,KAAK,CAAC,IAAA,CAAK,IAAI,SAAA,EAAW;AACzD,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ;AACvB,MAAA,MAAM,SAAA,GAAY,EAAE,GAAG,GAAA,EAAI;AAC3B,MAAA,KAAA,MAAW,KAAA,IAAS,KAAK,cAAA,EAAgB;AACvC,QAAA,IAAI,UAAU,KAAK,CAAA,IAAK,OAAO,SAAA,CAAU,KAAK,MAAM,QAAA,EAAU;AAC5D,UAAA,IAAI;AACF,YAAA,SAAA,CAAU,KAAK,CAAA,GAAI,IAAA,CAAK,IAAI,OAAA,CAAQ,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,UACtD,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF;AACA,MAAA,OAAO,SAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAA,GAA0B;AACxB,IAAA,MAAM,MAAA,GAAS,IAAI,cAAA,CAAiB,IAAA,CAAK,GAAG,CAAA;AAC5C,IAAA,MAAA,CAAO,QAAA,GAAW,CAAC,GAAG,IAAA,CAAK,QAAQ,CAAA;AACnC,IAAA,MAAA,CAAO,YAAY,IAAA,CAAK,SAAA;AACxB,IAAA,MAAA,CAAO,SAAS,IAAA,CAAK,MAAA;AACrB,IAAA,MAAA,CAAO,cAAc,IAAA,CAAK,WAAA;AAC1B,IAAA,MAAA,CAAO,MAAA,GAAS,CAAC,GAAG,IAAA,CAAK,MAAM,CAAA;AAC/B,IAAA,MAAA,CAAO,QAAA,GAAW,CAAC,GAAG,IAAA,CAAK,QAAQ,CAAA;AACnC,IAAA,MAAA,CAAO,UAAU,IAAA,CAAK,OAAA,GAAU,EAAE,GAAG,IAAA,CAAK,SAAQ,GAAI,MAAA;AACtD,IAAA,MAAA,CAAO,QAAA,GAAW,CAAC,GAAG,IAAA,CAAK,QAAQ,CAAA;AACnC,IAAA,MAAA,CAAO,SAAS,IAAA,CAAK,MAAA;AACrB,IAAA,MAAA,CAAO,UAAU,IAAA,CAAK,OAAA;AACtB,IAAA,MAAA,CAAO,cAAA,GAAiB,IAAI,GAAA,CAAI,IAAA,CAAK,cAAc,CAAA;AACnD,IAAA,MAAA,CAAO,cAAA,GAAiB,IAAI,GAAA,CAAI,IAAA,CAAK,cAAc,CAAA;AACnD,IAAA,MAAA,CAAO,gBAAgB,IAAA,CAAK,aAAA;AAC5B,IAAA,MAAA,CAAO,YAAY,IAAA,CAAK,SAAA;AACxB,IAAA,MAAA,CAAO,YAAY,IAAA,CAAK,SAAA;AACxB,IAAA,MAAA,CAAO,aAAa,IAAA,CAAK,UAAA,GAAa,CAAC,GAAG,IAAA,CAAK,UAAU,CAAA,GAAI,MAAA;AAE7D,IAAA,MAAA,CAAO,aAAA,GAAgB,IAAA,CAAK,aAAA,CAAc,KAAA,EAAM;AAChD,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,GAAa;AACX,IAAA,MAAM,EAAE,GAAA,EAAAA,IAAAA,EAAK,QAAA,EAAS,GAAI,KAAK,KAAA,EAAM;AAErC,IAAA,OAAA,CAAQ,GAAA,CAAI,QAAQA,IAAG,CAAA;AAEvB,IAAA,OAAA,CAAQ,GAAA,CAAI,aAAa,QAAQ,CAAA;AACjC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,EAAA,GAAmB;AACvB,IAAA,IAAA,CAAK,IAAA,EAAK;AACV,IAAA,OAAO,KAAK,GAAA,EAAI;AAAA,EAClB;AACF;;;ACtlBO,IAAM,gBAAN,MAAiC;AAAA,EAOtC,YAA6B,GAAA,EAAmB;AAAnB,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAAA,EAAoB;AAAA,EANzC,MAAA;AAAA,EACA,QAAmC,EAAC;AAAA,EACpC,aAAuB,EAAC;AAAA,EACxB,cAAA,uBAAkC,GAAA,EAAI;AAAA,EACtC,OAAA,GAAU,KAAA;AAAA;AAAA;AAAA;AAAA,EAOlB,KAAK,KAAA,EAAqB;AACxB,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,EAAqB;AACzB,IAAA,OAAO,IAAA,CAAK,KAAK,KAAK,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,IAAA,EAAiE;AACtE,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,MAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AAAA,IACf,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,KAAA,GAAQ,CAAC,IAAI,CAAA;AAAA,IACpB;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,MAAA,EAAwB;AACjC,IAAA,MAAA,CAAO,QAAQ,CAAC,CAAA,KAAM,KAAK,cAAA,CAAe,GAAA,CAAI,CAAC,CAAC,CAAA;AAChD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,OAAA,EAAyB;AACpC,IAAA,IAAA,CAAK,UAAA,GAAa,OAAA;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAAe;AACb,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAA8C;AAC5C,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,IACrD;AAEA,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAC3B,MAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,IAC3C;AAEA,IAAA,IAAA,CAAK,GAAA,CAAI,QAAQ,eAAA,EAAgB;AAGjC,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,wBAAA,CAAyB,IAAA,CAAK,KAAK,CAAA;AAE9D,IAAA,MAAM,UAAA,GAA+B;AAAA,MACnC,OAAO,IAAA,CAAK,MAAA;AAAA,MACZ,IAAA,EAAM,aAAA;AAAA,MACN,WAAW,IAAA,CAAK,UAAA,CAAW,MAAA,GAAS,CAAA,GAAI,KAAK,UAAA,GAAa;AAAA,KAC5D;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,YAAY,UAAU,CAAA;AACtD,IAAA,IAAIA,OAAM,MAAA,CAAO,GAAA;AACjB,IAAA,MAAM,EAAE,UAAS,GAAI,MAAA;AAGrB,IAAA,IAAI,KAAK,OAAA,IAAW,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,SAAS,OAAA,EAAS;AACrD,MAAAA,IAAAA,GAAMA,IAAAA,CAAI,OAAA,CAAQ,aAAA,EAAe,oBAAoB,CAAA;AAAA,IACvD;AAEA,IAAA,OAAO,EAAE,GAAA,EAAAA,IAAAA,EAAK,QAAA,EAAS;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,GAAkC;AACtC,IAAA,MAAM,EAAE,GAAA,EAAAA,IAAAA,EAAK,QAAA,EAAS,GAAI,KAAK,KAAA,EAAM;AACrC,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,YAAA,CAAaA,IAAAA,EAAK,QAAQ,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,GAAoD;AACxD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,EAAQ;AAClC,IAAA,OAAO,MAAA,CAAO,QAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,GAAwC;AAC5C,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AAChC,MAAA,IAAA,CAAK,UAAA,GAAa,CAAC,GAAG,CAAA;AAAA,IACxB;AAEA,IAAA,MAAM,EAAE,GAAA,EAAAA,IAAAA,EAAK,QAAA,EAAS,GAAI,KAAK,KAAA,EAAM;AACrC,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,GAAA,CAAI,YAAA,CAAgBA,MAAK,QAAQ,CAAA;AAC3D,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA;AAAA,EAC3B;AAAA;AAAA,EAIQ,yBAAyB,IAAA,EAA4D;AAC3F,IAAA,IAAI,KAAK,cAAA,CAAe,IAAA,KAAS,KAAK,CAAC,IAAA,CAAK,IAAI,SAAA,EAAW;AACzD,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ;AACvB,MAAA,MAAM,SAAA,GAAY,EAAE,GAAG,GAAA,EAAI;AAC3B,MAAA,KAAA,MAAW,KAAA,IAAS,KAAK,cAAA,EAAgB;AACvC,QAAA,IAAI,UAAU,KAAK,CAAA,IAAK,OAAO,SAAA,CAAU,KAAK,MAAM,QAAA,EAAU;AAC5D,UAAA,SAAA,CAAU,KAAK,CAAA,GAAI,IAAA,CAAK,IAAI,OAAA,CAAQ,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,QACtD;AAAA,MACF;AACA,MAAA,OAAO,SAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH;AACF;;;AC5IO,IAAM,gBAAN,MAAiC;AAAA,EAOtC,YAA6B,GAAA,EAAmB;AAAnB,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAC3B,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAI,YAAA,CAAa,GAAA,CAAI,OAAO,CAAA;AAAA,EACnD;AAAA,EARQ,MAAA;AAAA,EACA,QAAiC,EAAC;AAAA,EAClC,aAAA;AAAA,EACA,aAAuB,EAAC;AAAA,EACxB,cAAA,uBAAkC,GAAA,EAAI;AAAA;AAAA;AAAA;AAAA,EAS9C,MAAM,KAAA,EAAqB;AACzB,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,IAAA,EAAqC;AACvC,IAAA,IAAA,CAAK,QAAQ,EAAE,GAAG,IAAA,CAAK,KAAA,EAAO,GAAG,IAAA,EAAK;AACtC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,MAAA,EAAwB;AACjC,IAAA,MAAA,CAAO,QAAQ,CAAC,CAAA,KAAM,KAAK,cAAA,CAAe,GAAA,CAAI,CAAC,CAAC,CAAA;AAChD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,OAAA,EAAyB;AACpC,IAAA,IAAA,CAAK,UAAA,GAAa,OAAA;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAOA,KAAA,CACE,kBAAA,EACA,eAAA,EACA,KAAA,EACM;AACN,IAAA,IAAA,CAAK,aAAA,CAAc,KAAA,CAAM,kBAAA,EAA2B,eAAA,EAAwB,KAAK,CAAA;AACjF,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAKA,OAAA,CACE,kBAAA,EACA,eAAA,EACA,KAAA,EACM;AACN,IAAA,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,kBAAA,EAA2B,eAAA,EAAwB,KAAK,CAAA;AACnF,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,UAAU,MAAA,EAAsB;AAC9B,IAAA,IAAA,CAAK,aAAA,CAAc,UAAU,MAAM,CAAA;AACnC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,aAAa,MAAA,EAAsB;AACjC,IAAA,IAAA,CAAK,aAAA,CAAc,aAAa,MAAM,CAAA;AACtC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAA,CAAQ,QAAgB,MAAA,EAAyB;AAC/C,IAAA,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,MAAA,EAAQ,MAAM,CAAA;AACzC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,UAAA,CAAW,QAAgB,MAAA,EAAyB;AAClD,IAAA,IAAA,CAAK,aAAA,CAAc,UAAA,CAAW,MAAA,EAAQ,MAAM,CAAA;AAC5C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,YAAA,CAAa,MAAA,EAAgB,IAAA,EAAe,EAAA,EAAmB;AAC7D,IAAA,IAAA,CAAK,aAAA,CAAc,YAAA,CAAa,MAAA,EAAQ,IAAA,EAAM,EAAE,CAAA;AAChD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,SAAA,CAAU,QAAgB,OAAA,EAAuB;AAC/C,IAAA,IAAA,CAAK,aAAA,CAAc,SAAA,CAAU,MAAA,EAAQ,OAAO,CAAA;AAC5C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,QAAA,CAASA,IAAAA,EAAa,QAAA,GAAsB,EAAC,EAAS;AACpD,IAAA,IAAA,CAAK,aAAA,CAAc,QAAA,CAASA,IAAAA,EAAK,QAAQ,CAAA;AACzC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAA,GAA8C;AAC5C,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,IACrD;AAEA,IAAA,IAAI,OAAO,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,CAAE,WAAW,CAAA,EAAG;AACxC,MAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,IAC3C;AAEA,IAAA,IAAA,CAAK,GAAA,CAAI,QAAQ,eAAA,EAAgB;AAGjC,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,wBAAA,CAAyB,IAAA,CAAK,KAAK,CAAA;AAE9D,IAAA,MAAM,UAAA,GAA+B;AAAA,MACnC,OAAO,IAAA,CAAK,MAAA;AAAA,MACZ,IAAA,EAAM,aAAA;AAAA,MACN,KAAA,EAAO,IAAA,CAAK,aAAA,CAAc,KAAA,EAAM;AAAA,MAChC,WAAW,IAAA,CAAK,UAAA,CAAW,MAAA,GAAS,CAAA,GAAI,KAAK,UAAA,GAAa;AAAA,KAC5D;AAEA,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,WAAA,CAAY,UAAU,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,GAAkC;AACtC,IAAA,MAAM,EAAE,GAAA,EAAAA,IAAAA,EAAK,QAAA,EAAS,GAAI,KAAK,KAAA,EAAM;AACrC,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,YAAA,CAAaA,IAAAA,EAAK,QAAQ,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAA,GAAmC;AACvC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,EAAQ;AAClC,IAAA,OAAO,MAAA,CAAO,YAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,GAAuC;AAC3C,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AAChC,MAAA,IAAA,CAAK,UAAA,GAAa,CAAC,GAAG,CAAA;AAAA,IACxB;AAEA,IAAA,MAAM,EAAE,GAAA,EAAAA,IAAAA,EAAK,QAAA,EAAS,GAAI,KAAK,KAAA,EAAM;AACrC,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,GAAA,CAAI,YAAA,CAAgBA,MAAK,QAAQ,CAAA;AAC3D,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,GAAqC;AACzC,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AAChC,MAAA,IAAA,CAAK,UAAA,GAAa,CAAC,GAAG,CAAA;AAAA,IACxB;AAEA,IAAA,MAAM,EAAE,GAAA,EAAAA,IAAAA,EAAK,QAAA,EAAS,GAAI,KAAK,KAAA,EAAM;AACrC,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,GAAA,CAAI,YAAA,CAAgBA,MAAK,QAAQ,CAAA;AAC3D,IAAA,OAAO,MAAA,CAAO,IAAA;AAAA,EAChB;AAAA;AAAA,EAIQ,yBAAyB,IAAA,EAAwD;AACvF,IAAA,IAAI,KAAK,cAAA,CAAe,IAAA,KAAS,KAAK,CAAC,IAAA,CAAK,IAAI,SAAA,EAAW;AACzD,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,SAAA,GAAY,EAAE,GAAG,IAAA,EAAK;AAC5B,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,cAAA,EAAgB;AACvC,MAAA,IAAI,UAAU,KAAK,CAAA,IAAK,OAAO,SAAA,CAAU,KAAK,MAAM,QAAA,EAAU;AAC5D,QAAA,SAAA,CAAU,KAAK,CAAA,GAAI,IAAA,CAAK,IAAI,OAAA,CAAQ,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,MACtD;AAAA,IACF;AACA,IAAA,OAAO,SAAA;AAAA,EACT;AACF;;;AC1LO,IAAM,gBAAN,MAAiC;AAAA,EAMtC,YAA6B,GAAA,EAAmB;AAAnB,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAC3B,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAI,YAAA,CAAa,GAAA,CAAI,OAAO,CAAA;AAAA,EACnD;AAAA,EAPQ,MAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAuB,EAAC;AAAA,EACxB,MAAA,GAAS,KAAA;AAAA;AAAA;AAAA;AAAA,EASjB,KAAK,KAAA,EAAqB;AACxB,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,EAAqB;AACzB,IAAA,OAAO,IAAA,CAAK,KAAK,KAAK,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,OAAA,EAAyB;AACpC,IAAA,IAAA,CAAK,UAAA,GAAa,OAAA;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAOA,KAAA,CACE,kBAAA,EACA,eAAA,EACA,KAAA,EACM;AACN,IAAA,IAAA,CAAK,aAAA,CAAc,KAAA,CAAM,kBAAA,EAA2B,eAAA,EAAwB,KAAK,CAAA;AACjF,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAKA,OAAA,CACE,kBAAA,EACA,eAAA,EACA,KAAA,EACM;AACN,IAAA,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,kBAAA,EAA2B,eAAA,EAAwB,KAAK,CAAA;AACnF,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,UAAU,MAAA,EAAsB;AAC9B,IAAA,IAAA,CAAK,aAAA,CAAc,UAAU,MAAM,CAAA;AACnC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,aAAa,MAAA,EAAsB;AACjC,IAAA,IAAA,CAAK,aAAA,CAAc,aAAa,MAAM,CAAA;AACtC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAA,CAAQ,QAAgB,MAAA,EAAyB;AAC/C,IAAA,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,MAAA,EAAQ,MAAM,CAAA;AACzC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,UAAA,CAAW,QAAgB,MAAA,EAAyB;AAClD,IAAA,IAAA,CAAK,aAAA,CAAc,UAAA,CAAW,MAAA,EAAQ,MAAM,CAAA;AAC5C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,YAAA,CAAa,MAAA,EAAgB,IAAA,EAAe,EAAA,EAAmB;AAC7D,IAAA,IAAA,CAAK,aAAA,CAAc,YAAA,CAAa,MAAA,EAAQ,IAAA,EAAM,EAAE,CAAA;AAChD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,SAAA,CAAU,QAAgB,OAAA,EAAuB;AAC/C,IAAA,IAAA,CAAK,aAAA,CAAc,SAAA,CAAU,MAAA,EAAQ,OAAO,CAAA;AAC5C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,QAAA,CAASA,IAAAA,EAAa,QAAA,GAAsB,EAAC,EAAS;AACpD,IAAA,IAAA,CAAK,aAAA,CAAc,QAAA,CAASA,IAAAA,EAAK,QAAQ,CAAA;AACzC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAA,GAA8C;AAC5C,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,IACrD;AAGA,IAAA,IAAI,CAAC,IAAA,CAAK,aAAA,CAAc,eAAc,IAAK,CAAC,KAAK,MAAA,EAAQ;AACvD,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,GAAA,CAAI,QAAQ,eAAA,EAAgB;AAEjC,IAAA,MAAM,UAAA,GAA+B;AAAA,MACnC,OAAO,IAAA,CAAK,MAAA;AAAA,MACZ,KAAA,EAAO,IAAA,CAAK,aAAA,CAAc,KAAA,EAAM;AAAA,MAChC,WAAW,IAAA,CAAK,UAAA,CAAW,MAAA,GAAS,CAAA,GAAI,KAAK,UAAA,GAAa;AAAA,KAC5D;AAEA,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,WAAA,CAAY,UAAU,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,GAAkC;AACtC,IAAA,MAAM,EAAE,GAAA,EAAAA,IAAAA,EAAK,QAAA,EAAS,GAAI,KAAK,KAAA,EAAM;AACrC,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,YAAA,CAAaA,IAAAA,EAAK,QAAQ,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAA,GAAmC;AACvC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,EAAQ;AAClC,IAAA,OAAO,MAAA,CAAO,YAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,GAAuC;AAC3C,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AAChC,MAAA,IAAA,CAAK,UAAA,GAAa,CAAC,GAAG,CAAA;AAAA,IACxB;AAEA,IAAA,MAAM,EAAE,GAAA,EAAAA,IAAAA,EAAK,QAAA,EAAS,GAAI,KAAK,KAAA,EAAM;AACrC,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,GAAA,CAAI,YAAA,CAAgBA,MAAK,QAAQ,CAAA;AAC3D,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,GAAqC;AACzC,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AAChC,MAAA,IAAA,CAAK,UAAA,GAAa,CAAC,GAAG,CAAA;AAAA,IACxB;AAEA,IAAA,MAAM,EAAE,GAAA,EAAAA,IAAAA,EAAK,QAAA,EAAS,GAAI,KAAK,KAAA,EAAM;AACrC,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,GAAA,CAAI,YAAA,CAAgBA,MAAK,QAAQ,CAAA;AAC3D,IAAA,OAAO,MAAA,CAAO,IAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,GAA0B;AAC9B,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,MAAM,qCAAqC,CAAA;AAAA,IACvD;AAEA,IAAA,MAAMA,IAAAA,GAAM,kBAAkB,IAAA,CAAK,GAAA,CAAI,QAAQ,gBAAA,CAAiB,IAAA,CAAK,MAAM,CAAC,CAAA,CAAA;AAC5E,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,YAAA,CAAaA,IAAAA,EAAK,EAAE,CAAA;AAAA,EACrC;AACF;;;AC7CO,SAAS,0BACd,OAAA,EACqB;AAErB,EAAA,MAAM,WAAA,GAAc,QAAQ,KAAA,GACxB;AAAA,IACE,OAAA,EAAS,QAAQ,KAAA,CAAM,OAAA;AAAA,IACvB,UAAA,EAAY,OAAA,CAAQ,KAAA,CAAM,UAAA,IAAc,GAAA;AAAA;AAAA,IACxC,MAAA,EAAQ,OAAA,CAAQ,KAAA,CAAM,MAAA,IAAU,IAAA;AAAA;AAAA,IAChC,MAAA,EAAQ,OAAA,CAAQ,KAAA,CAAM,MAAA,IAAU,KAAA;AAAA,IAChC,MAAA,EAAQ,OAAA,CAAQ,KAAA,CAAM,MAAA,IAAU,KAAA;AAAA;AAAA,IAChC,iBAAA,EAAmB,OAAA,CAAQ,KAAA,CAAM,iBAAA,IAAqB,GAAA;AAAA,IACtD,gBAAA,EAAkB,OAAA,CAAQ,KAAA,CAAM,gBAAA,IAAoB,GAAA;AAAA,IACpD,MAAA,EAAQ,QAAQ,KAAA,CAAM;AAAA,GACxB,GACA,MAAA;AAEJ,EAAA,MAAM,OAAA,GAAU,IAAI,YAAA,CAAa,OAAA,CAAQ,SAAS,OAAA,CAAQ,QAAA,EAAU,OAAA,CAAQ,MAAA,EAAQ,WAAW,CAAA;AAE/F,EAAA,OAAO;AAAA,IACL,UAAuB,OAAA,EAAqC;AAC1D,MAAA,MAAM,OAAA,GAAU,IAAI,aAAA,CAAiB,OAAO,CAAA;AAC5C,MAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,QAAA,OAAA,CAAQ,MAAA,CAAO,GAAG,OAAO,CAAA;AAAA,MAC3B;AACA,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IAEA,MAAA,GAAwC;AACtC,MAAA,OAAO,IAAI,cAAiB,OAAO,CAAA;AAAA,IACrC,CAAA;AAAA,IAEA,MAAA,GAAwC;AACtC,MAAA,OAAO,IAAI,cAAiB,OAAO,CAAA;AAAA,IACrC,CAAA;AAAA,IAEA,MAAA,GAAwC;AACtC,MAAA,OAAO,IAAI,cAAiB,OAAO,CAAA;AAAA,IACrC,CAAA;AAAA,IAEA,UAAA,GAA2B;AACzB,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IAEA,MAAM,GAAA,CAAiBA,IAAAA,EAAa,QAAA,GAAsB,EAAC,EAAiB;AAC1E,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,YAAA,CAAgBA,MAAK,QAAQ,CAAA;AAC1D,MAAA,OAAO,MAAA,CAAO,IAAA;AAAA,IAChB,CAAA;AAAA,IAEA,MAAM,UAAA,CAAWA,IAAAA,EAAa,QAAA,GAAsB,EAAC,EAAsC;AACzF,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,YAAA,CAAaA,MAAK,QAAQ,CAAA;AACvD,MAAA,OAAO,EAAE,YAAA,EAAc,MAAA,CAAO,YAAA,EAAa;AAAA,IAC7C,CAAA;AAAA,IAEA,KAAA,CAAmB,MAAc,KAAA,EAAkC;AACjE,MAAA,OAAO,IAAI,aAAA,CAAiB,OAAO,CAAA,CAAE,IAAA,CAAK,MAAM,KAAK,CAAA;AAAA,IACvD;AAAA,GACF;AACF;;;AChLO,IAAe,kBAAf,MAEkB;AAAA,EAKvB,WAAA,CACqB,YACA,OAAA,EACnB;AAFmB,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAEnB,IAAA,IAAA,CAAK,KAAK,YAAA,EAAa;AAAA,EACzB;AAAA,EATS,EAAA;AAAA,EACC,SAAA,GAAY,KAAA;AAAA,EACH,UAAA,uBAA8B,GAAA,EAAI;AAAA,EASrD,IAAI,QAAA,GAAoB;AACtB,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA;AAAA,EAIA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,MAAM,IAAI,gBAAA,CAAiB,4BAAA,EAA8B,IAAA,CAAK,EAAE,CAAA;AAAA,IAClE;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,KAAK,uBAAA,EAAwB;AACnC,MAAA,MAAM,KAAK,OAAA,EAAQ;AACnB,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,IACnB,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,gBAAA,CAAiB,6BAAA,EAA+B,IAAA,CAAK,IAAI,KAAc,CAAA;AAAA,IACnF;AAAA,EACF;AAAA,EAEA,MAAM,MAAA,GAAwB;AAC5B,IAAA,IAAA,CAAK,aAAa,QAAQ,CAAA;AAE1B,IAAA,IAAI;AACF,MAAA,MAAM,KAAK,QAAA,EAAS;AACpB,MAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,MAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AAAA,IACxB,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,gBAAA,CAAiB,8BAAA,EAAgC,IAAA,CAAK,IAAI,KAAc,CAAA;AAAA,IACpF,CAAA,SAAE;AACA,MAAA,MAAM,KAAK,iBAAA,EAAkB;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,MAAM,QAAA,GAA0B;AAC9B,IAAA,IAAA,CAAK,aAAa,UAAU,CAAA;AAE5B,IAAA,IAAI;AACF,MAAA,MAAM,KAAK,UAAA,EAAW;AACtB,MAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,MAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AAAA,IACxB,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,gBAAA,CAAiB,gCAAA,EAAkC,IAAA,CAAK,IAAI,KAAc,CAAA;AAAA,IACtF,CAAA,SAAE;AACA,MAAA,MAAM,KAAK,iBAAA,EAAkB;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,IAAA,EAA6B;AAC3C,IAAA,IAAA,CAAK,aAAa,kBAAkB,CAAA;AACpC,IAAA,IAAA,CAAK,sBAAsB,IAAI,CAAA;AAE/B,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA,EAAG;AAC7B,MAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,WAAA,EAAc,IAAI,CAAA,gBAAA,CAAA,EAAoB,KAAK,EAAE,CAAA;AAAA,IAC1E;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,YAAY,IAAI,CAAA;AAC3B,MAAA,IAAA,CAAK,UAAA,CAAW,IAAI,IAAI,CAAA;AAAA,IAC1B,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,4BAAA,EAA+B,IAAI,CAAA,CAAA,CAAA,EAAK,IAAA,CAAK,IAAI,KAAc,CAAA;AAAA,IAC5F;AAAA,EACF;AAAA,EAEA,MAAM,iBAAiB,IAAA,EAA6B;AAClD,IAAA,IAAA,CAAK,aAAa,mBAAmB,CAAA;AACrC,IAAA,IAAA,CAAK,sBAAsB,IAAI,CAAA;AAE/B,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,mBAAmB,IAAI,CAAA;AAClC,MAAA,IAAA,CAAK,UAAA,CAAW,OAAO,IAAI,CAAA;AAAA,IAC7B,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,6BAAA,EAAgC,IAAI,CAAA,CAAA,CAAA,EAAK,IAAA,CAAK,IAAI,KAAc,CAAA;AAAA,IAC7F;AAAA,EACF;AAAA,EAEA,MAAM,oBAAoB,IAAA,EAA6B;AACrD,IAAA,IAAA,CAAK,aAAa,uBAAuB,CAAA;AACzC,IAAA,IAAA,CAAK,sBAAsB,IAAI,CAAA;AAE/B,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,sBAAsB,IAAI,CAAA;AACrC,MAAA,IAAA,CAAK,sBAAsB,IAAI,CAAA;AAAA,IACjC,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,gBAAA;AAAA,QACR,oCAAoC,IAAI,CAAA,CAAA,CAAA;AAAA,QACxC,IAAA,CAAK,EAAA;AAAA,QACL;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,KAAA,CACJA,IAAAA,EACA,MAAA,EACA,OAAA,EACyB;AACzB,IAAA,IAAA,CAAK,aAAa,eAAe,CAAA;AAEjC,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAAWA,IAAAA,EAAK,QAAQ,OAAO,CAAA;AAAA,IACnD,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,gBAAA;AAAA,QACR,CAAA,6BAAA,EAAiC,MAAgB,OAAO,CAAA,CAAA;AAAA,QACxD,IAAA,CAAK,EAAA;AAAA,QACL;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CACJA,IAAAA,EACA,MAAA,EACA,OAAA,EACyB;AACzB,IAAA,OAAO,IAAA,CAAK,KAAA,CAASA,IAAAA,EAAK,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAA6B;AAC3B,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EA0DA,MAAgB,uBAAA,GAAyC;AACvD,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAK,OAAA,CAAQ,cAAA,KAAmB,QAAQ,IAAA,CAAK,OAAA,CAAQ,mBAAmB,MAAA,EAAW;AACrF,MAAA,MAAM,IAAA,CAAK,iBAAA,CAAkB,IAAA,CAAK,OAAA,CAAQ,cAAc,CAAA;AAAA,IAC1D;AAAA,EAIF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,iBAAA,GAAmC;AACjD,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA;AAAA,IACjD,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKU,aAAa,SAAA,EAAyB;AAC9C,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,OAAA,EAAU,SAAS,CAAA,wBAAA,CAAA,EAA4B,KAAK,EAAE,CAAA;AAAA,IACnF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKU,sBAAsB,IAAA,EAAoB;AAClD,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA,EAAG;AAC9B,MAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,WAAA,EAAc,IAAI,CAAA,gBAAA,CAAA,EAAoB,KAAK,EAAE,CAAA;AAAA,IAC1E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKU,sBAAsB,IAAA,EAAoB;AAClD,IAAA,IAAI,CAAC,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAA,EAAG;AAChC,MAAA,MAAM,IAAI,gBAAA;AAAA,QACR,2BAA2B,IAAI,CAAA,8CAAA,CAAA;AAAA,QAC/B,IAAA,CAAK;AAAA,OACP;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKU,sBAAsB,IAAA,EAAsB;AACpD,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,KAAA,EAAO,GAAG,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKU,sBAAsB,IAAA,EAAoB;AAClD,IAAA,MAAM,eAAA,GAAkB,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,UAAU,CAAA;AAClD,IAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,OAAA,CAAQ,IAAI,CAAA;AAE1C,IAAA,IAAI,UAAU,EAAA,EAAI;AAChB,MAAA,KAAA,IAAS,IAAI,KAAA,GAAQ,CAAA,EAAG,CAAA,GAAI,eAAA,CAAgB,QAAQ,CAAA,EAAA,EAAK;AACvD,QAAA,MAAM,EAAA,GAAK,gBAAgB,CAAC,CAAA;AAC5B,QAAA,IAAI,EAAA,EAAI;AACN,UAAA,IAAA,CAAK,UAAA,CAAW,OAAO,EAAE,CAAA;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKU,gBAAgB,MAAA,EAAiC;AACzD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,EAAC;AAAA,IACV;AACA,IAAA,OAAO,MAAM,OAAA,CAAQ,MAAM,IAAI,MAAA,GAAS,MAAA,CAAO,OAAO,MAAM,CAAA;AAAA,EAC9D;AACF;;;ACtTO,IAAM,kBAAN,MAAmC;AAAA,EAChC,cAAoC,EAAC;AAAA;AAAA;AAAA;AAAA,EAK7C,IAAI,UAAA,EAAsC;AACxC,IAAA,IAAA,CAAK,WAAA,CAAY,KAAK,UAAU,CAAA;AAChC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,UAAA,EAAsC;AAC3C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ,UAAU,CAAA;AACjD,IAAA,IAAI,UAAU,EAAA,EAAI;AAChB,MAAA,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,KAAA,EAAO,CAAC,CAAA;AAAA,IAClC;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,cAAc,EAAC;AACpB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,MAAA,GAAiB;AACnB,IAAA,OAAO,KAAK,WAAA,CAAY,MAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CACJ,OAAA,EACA,YAAA,EACmC;AAEnC,IAAA,IAAI,IAAA,GAA0B,YAAA;AAE9B,IAAA,KAAA,IAAS,IAAI,IAAA,CAAK,WAAA,CAAY,SAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACrD,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,CAAC,CAAA;AACrC,MAAA,MAAM,WAAA,GAAc,IAAA;AACpB,MAAA,IAAA,GAAO,CAAC,GAAA,KAAQ,UAAA,CAAW,GAAA,EAAK,WAAW,CAAA;AAAA,IAC7C;AAEA,IAAA,OAAO,KAAK,OAAO,CAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,aAAA,CACLA,IAAAA,EACA,MAAA,EACA,OAAA,EACwB;AACxB,IAAA,OAAO;AAAA,MACL,GAAA,EAAAA,IAAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,UAAU;AAAC,KACb;AAAA,EACF;AACF;AAKO,SAAS,qBACX,WAAA,EACiB;AACpB,EAAA,OAAO,OAAO,SAAS,IAAA,KAAS;AAC9B,IAAA,MAAM,KAAA,GAAQ,IAAI,eAAA,EAAmB;AACrC,IAAA,WAAA,CAAY,QAAQ,CAAC,CAAA,KAAM,KAAA,CAAM,GAAA,CAAI,CAAC,CAAC,CAAA;AACvC,IAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,OAAA,EAAS,IAAI,CAAA;AAAA,EACpC,CAAA;AACF;ACjFA,SAAS,mBAAmBA,IAAAA,EAAsB;AAChD,EAAA,MAAM,aAAA,GAAgBA,IAAAA,CAAI,IAAA,EAAK,CAAE,WAAA,EAAY;AAC7C,EAAA,OACE,aAAA,CAAc,UAAA,CAAW,QAAQ,CAAA,IACjC,cAAc,UAAA,CAAW,MAAM,CAAA,IAC/B,aAAA,CAAc,UAAA,CAAW,UAAU,CAAA,IACnC,aAAA,CAAc,WAAW,SAAS,CAAA;AAEtC;AAKA,SAASsB,iBAAAA,CAAiB,MAAA,EAAgBtB,IAAAA,EAAa,MAAA,EAA2B;AAChF,EAAA,MAAM,IAAA,GAAOW,WAAW,QAAQ,CAAA;AAChC,EAAA,IAAA,CAAK,OAAOX,IAAG,CAAA;AACf,EAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AAClC,EAAA,OAAO,CAAA,EAAG,MAAM,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AACpD;AAKO,SAAS,sBACd,OAAA,EACoB;AACpB,EAAA,MAAM;AAAA,IACJ,OAAA;AAAA,IACA,UAAA,GAAa,GAAA;AAAA,IACb,SAAA,GAAY,SAAA;AAAA,IACZ,WAAA,GAAc;AAAA,GAChB,GAAI,OAAA;AAEJ,EAAA,OAAO,OACL,SACA,IAAA,KACsC;AAEtC,IAAA,IAAI,OAAA,CAAQ,OAAA,EAAS,KAAA,KAAU,KAAA,EAAO;AACpC,MAAA,OAAO,KAAK,OAAO,CAAA;AAAA,IACrB;AAGA,IAAA,IAAI,CAAC,WAAA,CAAY,OAAA,CAAQ,GAAA,EAAK,OAAA,CAAQ,MAAM,CAAA,EAAG;AAC7C,MAAA,OAAO,KAAK,OAAO,CAAA;AAAA,IACrB;AAGA,IAAA,MAAM,YAAA,GAAe,OAAO,OAAA,CAAQ,OAAA,EAAS,UAAU,QAAA,GAAW,OAAA,CAAQ,OAAA,CAAQ,KAAA,GAAQ,EAAC;AAC3F,IAAA,MAAMI,SAAAA,GAAW,aAAa,GAAA,IAAOkB,iBAAAA,CAAiB,WAAW,OAAA,CAAQ,GAAA,EAAK,QAAQ,MAAM,CAAA;AAG5F,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,GAAA,CAA8BlB,SAAQ,CAAA;AACnE,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,OAAO;AAAA,UACL,GAAG,MAAA;AAAA,UACH,MAAA,EAAQ,IAAA;AAAA,UACR,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI,OAAA,CAAQ;AAAA,SACjC;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAGA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAO,CAAA;AAGjC,IAAA,IAAI,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AACjC,MAAA,MAAM,GAAA,GAAM,aAAa,GAAA,IAAO,UAAA;AAChC,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,CAAQ,GAAA,CAAIA,SAAAA,EAAU,MAAA,EAAQ,GAAG,CAAA;AAAA,MACzC,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,GAAG,MAAA;AAAA,MACH,MAAA,EAAQ;AAAA,KACV;AAAA,EACF,CAAA;AACF;AAMO,SAAS,iCAAA,CACd,QAAA,EACA,UAAA,GAAa,SAAA,EACO;AACpB,EAAA,OAAO,OACL,SACA,IAAA,KACsC;AACtC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAO,CAAA;AAGjC,IAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,GAAA,CAAI,IAAA,GAAO,WAAA,EAAY;AACrD,IAAA,MAAM,OAAA,GACJ,aAAA,CAAc,UAAA,CAAW,QAAQ,KACjC,aAAA,CAAc,UAAA,CAAW,QAAQ,CAAA,IACjC,cAAc,UAAA,CAAW,QAAQ,CAAA,IACjC,aAAA,CAAc,WAAW,UAAU,CAAA;AAErC,IAAA,IAAI,OAAA,EAAS;AAEX,MAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,OAAA,CAAQ,GAAG,CAAA;AAC9C,MAAA,IAAI,SAAA,EAAW;AAEb,QAAA,OAAA,CAAQ,QAAA,CAAS,kBAAkB,CAAA,GAAI,SAAA;AACvC,QAAA,OAAA,CAAQ,QAAA,CAAS,kBAAkB,CAAA,GAAI,IAAA;AAAA,MACzC;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AACF;AAKA,SAAS,iBAAiBJ,IAAAA,EAA4B;AACpD,EAAA,MAAM,aAAA,GAAgBA,IAAAA,CAAI,IAAA,EAAK,CAAE,WAAA,EAAY;AAG7C,EAAA,MAAM,WAAA,GAAc,aAAA,CAAc,KAAA,CAAM,oCAAoC,CAAA;AAC5E,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,OAAO,WAAA,CAAY,CAAC,CAAA,IAAK,IAAA;AAAA,EAC3B;AAGA,EAAA,MAAM,WAAA,GAAc,aAAA,CAAc,KAAA,CAAM,6BAA6B,CAAA;AACrE,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,OAAO,WAAA,CAAY,CAAC,CAAA,IAAK,IAAA;AAAA,EAC3B;AAGA,EAAA,MAAM,WAAA,GAAc,aAAA,CAAc,KAAA,CAAM,oCAAoC,CAAA;AAC5E,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,OAAO,WAAA,CAAY,CAAC,CAAA,IAAK,IAAA;AAAA,EAC3B;AAGA,EAAA,MAAM,aAAA,GAAgB,aAAA,CAAc,KAAA,CAAM,4CAA4C,CAAA;AACtF,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,OAAO,aAAA,CAAc,CAAC,CAAA,IAAK,IAAA;AAAA,EAC7B;AAEA,EAAA,OAAO,IAAA;AACT;;;AC3JA,SAAS,sBAAsB,KAAA,EAAuB;AACpD,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,WAAA,EAAY;AAG1C,EAAA,IACE,OAAA,CAAQ,SAAS,YAAY,CAAA,IAC7B,QAAQ,QAAA,CAAS,cAAc,CAAA,IAC/B,OAAA,CAAQ,QAAA,CAAS,WAAW,KAC5B,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA,IACxB,OAAA,CAAQ,QAAA,CAAS,iBAAiB,CAAA,IAClC,OAAA,CAAQ,QAAA,CAAS,mBAAmB,CAAA,EACpC;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IACE,OAAA,CAAQ,QAAA,CAAS,UAAU,CAAA,IAC3B,OAAA,CAAQ,QAAA,CAAS,mBAAmB,CAAA,IACpC,OAAA,CAAQ,QAAA,CAAS,4BAA4B,CAAA,EAC7C;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IACE,OAAA,CAAQ,QAAA,CAAS,sBAAsB,CAAA,IACvC,OAAA,CAAQ,QAAA,CAAS,sBAAsB,CAAA,IACvC,OAAA,CAAQ,QAAA,CAAS,iBAAiB,CAAA,EAClC;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA;AACT;AAKA,SAAS,cAAA,CACP,OAAA,EACA,SAAA,EACA,QAAA,EACA,UAAA,EACQ;AAER,EAAA,MAAM,gBAAA,GAAmB,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,YAAY,OAAO,CAAA;AAGjE,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,gBAAA,EAAkB,QAAQ,CAAA;AAGvD,EAAA,MAAM,SAAS,WAAA,GAAc,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,CAAA,GAAI,CAAA,CAAA;AAEzD,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,WAAA,GAAc,MAAM,CAAA;AACxC;AAKA,SAASuB,OAAM,EAAA,EAA2B;AACxC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAACrB,aAAY,UAAA,CAAWA,QAAAA,EAAS,EAAE,CAAC,CAAA;AACzD;AAKO,SAAS,qBAAA,CACd,OAAA,GAAkC,EAAC,EACf;AACpB,EAAA,MAAM;AAAA,IACJ,UAAA,GAAa,CAAA;AAAA,IACb,SAAA,GAAY,GAAA;AAAA,IACZ,QAAA,GAAW,GAAA;AAAA,IACX,OAAA,GAAU,qBAAA;AAAA,IACV,iBAAA,GAAoB;AAAA,GACtB,GAAI,OAAA;AAEJ,EAAA,OAAO,OACL,SACA,IAAA,KACsC;AACtC,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI,QAAA,GAAW,CAAA;AAEf,IAAA,OAAO,YAAY,UAAA,EAAY;AAC7B,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAO,CAAA;AAGjC,QAAA,IAAI,WAAW,CAAA,EAAG;AAChB,UAAA,MAAA,CAAO,OAAA,GAAU,QAAA;AAAA,QACnB;AAEA,QAAA,OAAO,MAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAA,SAAA,GAAY,KAAA;AACZ,QAAA,QAAA,EAAA;AAGA,QAAA,IAAI,QAAA,GAAW,UAAA,IAAc,CAAC,OAAA,CAAQ,SAAS,CAAA,EAAG;AAChD,UAAA,MAAM,SAAA;AAAA,QACR;AAGA,QAAA,MAAM,QAAQ,cAAA,CAAe,QAAA,GAAW,CAAA,EAAG,SAAA,EAAW,UAAU,iBAAiB,CAAA;AAGjF,QAAA,OAAA,CAAQ,QAAA,CAAS,cAAc,CAAA,GAAI,QAAA;AACnC,QAAA,OAAA,CAAQ,QAAA,CAAS,YAAY,CAAA,GAAI,KAAA;AACjC,QAAA,OAAA,CAAQ,QAAA,CAAS,WAAW,CAAA,GAAI,SAAA,CAAU,OAAA;AAE1C,QAAA,MAAMqB,OAAM,KAAK,CAAA;AAAA,MACnB;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,IAAa,IAAI,KAAA,CAAM,cAAc,CAAA;AAAA,EAC7C,CAAA;AACF;AAMO,SAAS,8BAAA,CACd,OAAA,GAII,EAAC,EACe;AACpB,EAAA,MAAM,EAAE,gBAAA,GAAmB,CAAA,EAAG,eAAe,GAAA,EAAQ,gBAAA,GAAmB,GAAE,GAAI,OAAA;AAE9E,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,IAAI,eAAA,GAAkB,CAAA;AACtB,EAAA,IAAI,KAAA,GAAyC,QAAA;AAC7C,EAAA,IAAI,iBAAA,GAAoB,CAAA;AAExB,EAAA,OAAO,OACL,SACA,IAAA,KACsC;AAEtC,IAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,MAAA,IAAI,GAAA,GAAM,mBAAmB,YAAA,EAAc;AACzC,QAAA,KAAA,GAAQ,WAAA;AACR,QAAA,iBAAA,GAAoB,CAAA;AAAA,MACtB,CAAA,MAAO;AACL,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,wCAAwC,IAAA,CAAK,IAAA,CAAA,CAAM,gBAAgB,GAAA,GAAM,eAAA,CAAA,IAAoB,GAAI,CAAC,CAAA,CAAA;AAAA,SACpG;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAO,CAAA;AAGjC,MAAA,IAAI,UAAU,WAAA,EAAa;AACzB,QAAA,iBAAA,EAAA;AACA,QAAA,IAAI,qBAAqB,gBAAA,EAAkB;AACzC,UAAA,KAAA,GAAQ,QAAA;AACR,UAAA,QAAA,GAAW,CAAA;AAAA,QACb;AAAA,MACF,CAAA,MAAO;AACL,QAAA,QAAA,GAAW,CAAA;AAAA,MACb;AAEA,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,QAAA,EAAA;AACA,MAAA,eAAA,GAAkB,KAAK,GAAA,EAAI;AAE3B,MAAA,IAAI,KAAA,KAAU,WAAA,IAAe,QAAA,IAAY,gBAAA,EAAkB;AACzD,QAAA,KAAA,GAAQ,MAAA;AAAA,MACV;AAEA,MAAA,OAAA,CAAQ,QAAA,CAAS,cAAc,CAAA,GAAI,KAAA;AACnC,MAAA,OAAA,CAAQ,QAAA,CAAS,UAAU,CAAA,GAAI,QAAA;AAE/B,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF,CAAA;AACF;;;ACtLO,SAAS,uBAAA,CACd,OAAA,GAAoC,EAAC,EACjB;AACpB,EAAA,MAAM,EAAE,cAAA,GAAiB,GAAA,EAAQ,SAAA,EAAU,GAAI,OAAA;AAE/C,EAAA,OAAO,OACL,SACA,IAAA,KACsC;AAEtC,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,EAAS,OAAA,IAAW,cAAA;AAG5C,IAAA,IAAI,WAAW,CAAA,EAAG;AAChB,MAAA,OAAO,KAAK,OAAO,CAAA;AAAA,IACrB;AAGA,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,IAAI,SAAA;AAGJ,IAAA,MAAM,cAAA,GAAiB,IAAI,OAAA,CAAe,CAAC,GAAG,MAAA,KAAW;AACvD,MAAA,SAAA,GAAY,WAAW,MAAM;AAC3B,QAAA,UAAA,CAAW,KAAA,EAAM;AACjB,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,EAAI,GAAI,OAAA,CAAQ,SAAA;AAGrC,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,IAAI;AACF,YAAA,SAAA,CAAU,OAAA,CAAQ,KAAK,OAAO,CAAA;AAAA,UAChC,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AAGA,QAAA,OAAA,CAAQ,QAAA,CAAS,UAAU,CAAA,GAAI,IAAA;AAC/B,QAAA,OAAA,CAAQ,QAAA,CAAS,WAAW,CAAA,GAAI,OAAA;AAChC,QAAA,OAAA,CAAQ,QAAA,CAAS,WAAW,CAAA,GAAI,OAAA;AAEhC,QAAA,MAAA;AAAA,UACE,IAAI,YAAA,CAAa,CAAA,sBAAA,EAAyB,OAAO,CAAA,WAAA,EAAc,OAAO,OAAO,OAAO;AAAA,SACtF;AAAA,MACF,GAAG,OAAO,CAAA;AAAA,IACZ,CAAC,CAAA;AAED,IAAA,IAAI;AAEF,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,IAAA,CAAK,CAAC,IAAA,CAAK,OAAO,CAAA,EAAG,cAAc,CAAC,CAAA;AAGjE,MAAA,MAAA,CAAO,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,OAAA,CAAQ,SAAA;AAEvC,MAAA,OAAO,MAAA;AAAA,IACT,CAAA,SAAE;AAEA,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,YAAA,CAAa,SAAS,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,EACF,CAAA;AACF;AAMO,SAAS,wBAAA,CACd,OAAA,GAEI,EAAC,EACe;AACpB,EAAA,MAAM,EAAE,aAAY,GAAI,OAAA;AAExB,EAAA,OAAO,OACL,SACA,IAAA,KACsC;AAEtC,IAAA,MAAM,WAAW,WAAA,GAAc,OAAO,CAAA,IAAM,OAAA,CAAQ,SAAS,UAAU,CAAA;AAGvE,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,KAAK,OAAO,CAAA;AAAA,IACrB;AAEA,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,gBAAgB,QAAA,GAAW,GAAA;AAGjC,IAAA,IAAI,iBAAiB,CAAA,EAAG;AACtB,MAAA,MAAM,IAAI,YAAA;AAAA,QACR,mCAAmC,IAAI,IAAA,CAAK,QAAQ,CAAA,CAAE,aAAa,CAAA,CAAA;AAAA,QACnE,CAAC;AAAA,OACH;AAAA,IACF;AAGA,IAAA,MAAM,oBAAoB,uBAAA,CAA2B;AAAA,MACnD,cAAA,EAAgB;AAAA,KACjB,CAAA;AAED,IAAA,OAAO,iBAAA,CAAkB,SAAS,IAAI,CAAA;AAAA,EACxC,CAAA;AACF;;;AC1GA,IAAM,aAAA,GAAkC;AAAA,EACtC,KAAA,EAAO,CAAC,GAAA,EAAA,GAAQ,IAAA,KAAS,OAAA,CAAQ,MAAM,CAAA,YAAA,EAAe,GAAG,CAAA,CAAA,EAAI,GAAG,IAAI,CAAA;AAAA,EACpE,IAAA,EAAM,CAAC,GAAA,EAAA,GAAQ,IAAA,KAAS,OAAA,CAAQ,KAAK,CAAA,YAAA,EAAe,GAAG,CAAA,CAAA,EAAI,GAAG,IAAI,CAAA;AAAA,EAClE,IAAA,EAAM,CAAC,GAAA,EAAA,GAAQ,IAAA,KAAS,OAAA,CAAQ,KAAK,CAAA,YAAA,EAAe,GAAG,CAAA,CAAA,EAAI,GAAG,IAAI,CAAA;AAAA,EAClE,KAAA,EAAO,CAAC,GAAA,EAAA,GAAQ,IAAA,KAAS,OAAA,CAAQ,MAAM,CAAA,YAAA,EAAe,GAAG,CAAA,CAAA,EAAI,GAAG,IAAI;AACtE,CAAA;AAMA,SAAS,WAAA,CAAYvB,IAAAA,EAAa,SAAA,GAAY,GAAA,EAAa;AACzD,EAAA,IAAIA,IAAAA,CAAI,UAAU,SAAA,EAAW;AAC3B,IAAA,OAAOA,IAAAA;AAAA,EACT;AACA,EAAA,OAAO,CAAA,EAAGA,IAAAA,CAAI,KAAA,CAAM,CAAA,EAAG,SAAS,CAAC,CAAA,GAAA,CAAA;AACnC;AAKA,SAAS,YAAA,CAAa,MAAA,EAAmB,SAAA,GAAY,GAAA,EAAa;AAChE,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AACjC,EAAA,IAAI,GAAA,CAAI,UAAU,SAAA,EAAW;AAC3B,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,OAAO,CAAA,EAAG,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,SAAS,CAAC,CAAA,GAAA,CAAA;AACnC;AAKO,SAAS,uBAAA,CACd,OAAA,GAAoC,EAAC,EACjB;AACpB,EAAA,MAAM;AAAA,IACJ,MAAA,GAAS,aAAA;AAAA,IACT,QAAA,GAAW,OAAA;AAAA,IACX,SAAA,GAAY,KAAA;AAAA,IACZ,UAAA,GAAa,KAAA;AAAA,IACb,kBAAA,GAAqB;AAAA,GACvB,GAAI,OAAA;AAEJ,EAAA,MAAM,GAAA,GAAM,OAAO,QAAQ,CAAA;AAE3B,EAAA,OAAO,OACL,SACA,IAAA,KACsC;AACtC,IAAA,MAAM,YAAA,GAAe,WAAA,CAAY,OAAA,CAAQ,GAAG,CAAA;AAC5C,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAG3B,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,GAAA,CAAI,oBAAoB,YAAY,CAAA,CAAA,EAAI,YAAA,CAAa,OAAA,CAAQ,MAAM,CAAC,CAAA;AAAA,IACtE,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,CAAA,iBAAA,EAAoB,YAAY,CAAA,CAAE,CAAA;AAAA,IACxC;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAO,CAAA;AACjC,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAG9B,MAAA,IAAI,YAAY,kBAAA,EAAoB;AAClC,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,qBAAA,EAAwB,QAAQ,CAAA,KAAA,EAAQ,YAAY,CAAA,CAAA,EAAI;AAAA,UAClE,QAAA;AAAA,UACA,QAAA,EAAU,OAAO,MAAA,CAAO;AAAA,SACzB,CAAA;AAAA,MACH;AAGA,MAAA,MAAM,SAAS,CAAA,mBAAA,EAAsB,QAAQ,CAAA,IAAA,EAAO,MAAA,CAAO,OAAO,QAAQ,CAAA,MAAA,CAAA;AAC1E,MAAA,IAAI,UAAA,IAAc,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,EAAG;AAC/C,QAAA,GAAA,CAAI,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,CAAO,MAAA,CAAO,KAAK,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,EAAG,CAAA;AAAA,MACtD,CAAA,MAAO;AACL,QAAA,GAAA,CAAI,MAAM,CAAA;AAAA,MACZ;AAGA,MAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,QAAA,GAAA,CAAI,CAAA,uBAAA,CAAyB,CAAA;AAAA,MAC/B;AAEA,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC9B,MAAA,MAAA,CAAO,MAAM,CAAA,mBAAA,EAAsB,QAAQ,CAAA,IAAA,EAAQ,KAAA,CAAgB,OAAO,CAAA,CAAA,EAAI;AAAA,QAC5E,GAAA,EAAK,YAAA;AAAA,QACL;AAAA,OACD,CAAA;AACD,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF,CAAA;AACF;AAMO,SAAS,uBAAA,CACd,OAAA,GAGI,EAAC,EACe;AACpB,EAAA,MAAM,EAAE,OAAA,EAAS,OAAA,GAAU,CAAC,IAAI,EAAA,EAAI,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAM,IAAA,EAAM,GAAA,EAAM,GAAM,GAAE,GAAI,OAAA;AAEjF,EAAA,OAAO,OACL,SACA,IAAA,KACsC;AACtC,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,IAAI,MAAA;AAEJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,MAAM,KAAK,OAAO,CAAA;AAC3B,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,OAAO,MAAA;AAAA,IACT,CAAA,SAAE;AACA,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAG9B,MAAA,MAAM,MAAA,GAAS,QAAQ,IAAA,CAAK,CAAC,MAAM,QAAA,IAAY,CAAC,KAAK,MAAA,CAAO,iBAAA;AAG5D,MAAA,MAAM,OAAA,GAAkC;AAAA,QACtC,KAAK,OAAA,CAAQ,GAAA;AAAA,QACb,QAAA;AAAA,QACA,OAAA;AAAA,QACA,MAAA,EAAQ,QAAQ,MAAA,IAAU,KAAA;AAAA,QAC1B,QAAA,EAAU,MAAA,EAAQ,MAAA,EAAQ,QAAA,IAAY,CAAA;AAAA,QACtC,OAAA,EAAS,QAAQ,OAAA,IAAW,CAAA;AAAA,QAC5B,MAAA;AAAA,QACA,SAAA,sBAAe,IAAA;AAAK,OACtB;AAGA,MAAA,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,GAAI,OAAA;AAG9B,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,IAAI;AACF,UAAA,OAAA,CAAQ,OAAO,CAAA;AAAA,QACjB,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA;AACF;;;ACpFO,IAAM,QAAA,GAAN,MAAM,SAAA,CAAS;AAAA,EACpB,OAAe,SAAA,mBAAmC,IAAI,GAAA,EAAI;AAAA,EAClD,OAAA;AAAA,EACA,SAAA,GAAqB,KAAA;AAAA,EAEb,OAAA;AAAA,EAEhB,YAAY,OAAA,EAAwB;AAClC,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,OAAA,GAAU,KAAK,aAAA,EAAc;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,OAAO,OAAO,OAAA,EAAkC;AAC9C,IAAA,OAAO,IAAI,UAAS,OAAO,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,OAAO,WAAA,CAAY,IAAA,EAAc,OAAA,EAAmC;AAClE,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA,EAAG;AAC7B,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,UAAA,EAAa,IAAI,CAAA,mCAAA,CAAqC,CAAA;AAAA,MACxE;AACA,MAAA,IAAA,CAAK,UAAU,GAAA,CAAI,IAAA,EAAM,IAAI,SAAA,CAAS,OAAO,CAAC,CAAA;AAAA,IAChD;AACA,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAO,OAAA,CAAQ,GAAA,EAAa,OAAA,EAA4C;AACtE,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,CAAc,GAAG,CAAA;AACvC,IAAA,OAAO,IAAI,SAAA,CAAS;AAAA,MAClB,QAAA;AAAA,MACA,GAAA;AAAA,MACA,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA,EAEA,OAAe,cAAc,GAAA,EAAwC;AACnE,IAAA,IAAI,GAAA,CAAI,UAAA,CAAW,UAAU,CAAA,EAAG;AAC9B,MAAA,OAAO,OAAA;AAAA,IACT;AACA,IAAA,IAAI,IAAI,UAAA,CAAW,eAAe,KAAK,GAAA,CAAI,UAAA,CAAW,aAAa,CAAA,EAAG;AACpE,MAAA,OAAO,YAAA;AAAA,IACT;AACA,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,GAAG,CAAA,CAAE,CAAA;AAAA,EACpD;AAAA,EAEQ,aAAA,GAAiC;AACvC,IAAA,MAAM,MAAA,GAAS,KAAK,OAAA,CAAQ,MAAA,KAAW,OAAO,OAAA,GAAU,IAAA,CAAK,QAAQ,MAAA,IAAU,MAAA;AAE/E,IAAA,IAAIU,OAAAA;AACJ,IAAA,IAAI,IAAA,CAAK,QAAQ,UAAA,EAAY;AAC3B,MAAA,MAAM,cAAA,GAAiB,KAAK,OAAA,CAAQ,UAAA,KAAe,OAAO,EAAC,GAAI,KAAK,OAAA,CAAQ,UAAA;AAC5E,MAAAA,OAAAA,GAAS,IAAI,cAAA,CAAe;AAAA,QAC1B,WAAW,cAAA,CAAe;AAAA,OAC3B,CAAA;AACD,MAAA,IAAI,eAAe,GAAA,EAAK;AACtB,QAAA,OAAA,CAAQ,GAAA,CAAI,0BAA0B,CAAA,GAAI,cAAA,CAAe,GAAA;AAAA,MAC3D;AAAA,IACF;AAEA,IAAA,IAAI,OAAA;AAGJ,IAAA,QAAQ,IAAA,CAAK,QAAQ,QAAA;AAAU,MAC7B,KAAK,OAAA,EAAS;AACZ,QAAA,MAAM,EAAE,YAAA,EAAa,GAAI,SAAA,CAAQ,kBAAkB,CAAA;AACnD,QAAA,OAAA,GAAU,IAAI,YAAA,CAAa,EAAE,MAAA,EAAQ,MAAA,EAAAA,SAAQ,CAAA;AAC7C,QAAA;AAAA,MACF;AAAA,MACA,KAAK,YAAA;AAAA,MACL,KAAK,UAAA,EAAY;AACf,QAAA,MAAM,EAAE,iBAAA,EAAkB,GAAI,SAAA,CAAQ,uBAAuB,CAAA;AAC7D,QAAA,OAAA,GAAU,IAAI,iBAAA,CAAkB,EAAE,MAAA,EAAQ,MAAA,EAAAA,SAAQ,CAAA;AAClD,QAAA;AAAA,MACF;AAAA,MACA,SAAS;AACP,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA,CAAE,CAAA;AAAA,MAClE;AAAA;AAIF,IAAA,IAAI,IAAA,CAAK,QAAQ,KAAA,EAAO;AACtB,MAAA,MAAM,SAAA,GACJ,IAAA,CAAK,OAAA,CAAQ,KAAA,KAAU,IAAA,GAAO,EAAE,QAAA,EAAU,OAAA,EAAiB,GAAI,IAAA,CAAK,OAAA,CAAQ,KAAA;AAC9E,MAAA,IAAI,SAAA,CAAU,aAAa,OAAA,EAAS;AAClC,QAAA,MAAM,EAAE,YAAA,EAAa,GAAI,SAAA,CAAQ,kBAAkB,CAAA;AACnD,QAAA,MAAM,YAAA,GAAe,IAAI,YAAA,CAAa,EAAE,QAAQ,CAAA;AAChD,QAAA,IAAI,SAAA,CAAU,GAAA,IAAO,SAAA,CAAU,UAAA,EAAY;AAG3C,QAAA,OAAA,GAAU,IAAI,aAAA,CAAc;AAAA,UAC1B,OAAA;AAAA,UACA,KAAA,EAAO,YAAA;AAAA,UACP,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEQ,mBAAmB,GAAA,EAA+B;AACxD,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,GAAG,CAAA;AAC1B,IAAA,OAAO;AAAA,MACL,MAAM,MAAA,CAAO,QAAA;AAAA,MACb,IAAA,EAAM,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,IAAI,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAA,KAAa,OAAA,GAAU,IAAA,GAAO,IAAA,CAAA;AAAA,MAClF,MAAM,MAAA,CAAO,QAAA;AAAA,MACb,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,QAAA,EAAU,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA;AAAA,MACjC,GAAA,EAAK,KAAK,OAAA,CAAQ;AAAA,KACpB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,GACxB,IAAA,CAAK,kBAAA,CAAmB,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA,GACxC,IAAA,CAAK,OAAA,CAAQ,UAAA;AAEjB,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAAA,IACxD;AAEA,IAAA,MAAM,IAAA,CAAK,QAAQ,OAAA,CAAQ;AAAA,MACzB,GAAG,MAAA;AAAA,MACH,QAAA,EAAU,IAAA,CAAK,OAAA,CAAQ,QAAA,IAAY,MAAA,CAAO;AAAA,KAC3C,CAAA;AAGD,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,KAAA,IAAS,IAAA,CAAK,mBAAmB,aAAA,EAAe;AAC/D,MAAA,MAAM,SAAA,GACJ,IAAA,CAAK,OAAA,CAAQ,KAAA,KAAU,IAAA,GAAO,EAA6B,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,KAAA;AAC9E,MAAA,MAAM,YAAA,GAAgB,KAAK,OAAA,CAAgB,KAAA;AAE3C,MAAA,IAAI,UAAU,GAAA,EAAK;AACjB,QAAA,MAAM,aAAa,OAAA,CAAQ,IAAA,CAAK,kBAAA,CAAmB,SAAA,CAAU,GAAG,CAAC,CAAA;AAAA,MACnE,CAAA,MAAA,IAAW,UAAU,UAAA,EAAY;AAC/B,QAAA,MAAM,YAAA,CAAa,OAAA,CAAQ,SAAA,CAAU,UAAU,CAAA;AAAA,MACjD,CAAA,MAAO;AAEL,QAAA,MAAM,aAAa,OAAA,CAAQ,EAAE,MAAM,WAAA,EAAa,IAAA,EAAM,MAAM,CAAA;AAAA,MAC9D;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,IAAA,CAAc,OAAe,KAAA,EAAgB;AAC3C,IAAA,OAAO,KAAK,OAAA,CAAQ,kBAAA,EAAsB,CAAE,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,KAAA,CAAeV,IAAAA,EAAa,MAAA,EAAgB;AAChD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,CAASA,IAAAA,EAAK,MAAM,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,MAAA,CAAgB,KAAA,EAAe,IAAA,EAAmD;AACtF,IAAA,OAAO,IAAA,CAAK,QAAQ,kBAAA,EAAsB,CAAE,OAAO,KAAA,EAAO,IAAI,EAAE,OAAA,EAAQ;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,MAAA,CAAgB,KAAA,EAAe,IAAA,EAA2B,KAAA,EAA4B;AAC1F,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,kBAAA,EAAsB,CAAE,MAAA,CAAO,KAAA,EAAO,IAAI,CAAA,CAAE,KAAA,CAAM,KAAK,CAAA,CAAE,OAAA,EAAQ;AAAA,EACvF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,MAAA,CAAgB,KAAA,EAAe,KAAA,EAA4B;AAC/D,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,kBAAA,EAAsB,CAAE,MAAA,CAAO,KAAK,CAAA,CAAE,KAAA,CAAM,KAAK,CAAA,CAAE,OAAA,EAAQ;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,MAAM,WAAA,GAAc;AAClB,IAAA,OAAO,IAAA,CAAK,QAAQ,gBAAA,EAAiB;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,GAA4B;AAChC,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,CAAK,QAAQ,UAAA,EAAW;AAG9B,IAAA,IAAI,IAAA,CAAK,mBAAmB,aAAA,EAAe;AACzC,MAAA,MAAM,YAAA,GAAgB,KAAK,OAAA,CAAgB,KAAA;AAC3C,MAAA,MAAM,aAAa,UAAA,EAAW;AAAA,IAChC;AAEA,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAA8B;AAC5B,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,GAAyB;AAC7B,IAAA,OAAO,IAAA,CAAK,QAAQ,IAAA,EAAK;AAAA,EAC3B;AACF;;;AClVO,IAAMwB,SAAAA,GAAN,MAAM,SAAA,CAAS;AAAA,EACZ,OAAA;AAAA,EACS,MAAA;AAAA,EACT,QAAA;AAAA,EACA,aAAA;AAAA,EAER,YAAY,MAAA,EAAwB;AAClC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,KAAA,CAAM,UAAA,EAA8B,OAAA,EAAyB;AAClE,IAAA,OAAO,IAAI,SAAA,CAAS;AAAA,MAClB,IAAA,EAAM,OAAA;AAAA,MACN,UAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBA,aAAa,WAAA,CACX,UAAA,EACA,OAAA,EACA,cAAc,IAAA,EACK;AACnB,IAAA,MAAM,EAAA,GAAK,SAAA,CAAS,KAAA,CAAM,UAAA,EAAY,OAAO,CAAA;AAC7C,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,GAAG,OAAA,EAAQ;AAAA,IACnB;AACA,IAAA,OAAO,EAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,UAAA,CAAW,UAAA,EAA8B,OAAA,EAAyB;AACvE,IAAA,OAAO,IAAI,SAAA,CAAS;AAAA,MAClB,IAAA,EAAM,YAAA;AAAA,MACN,UAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBA,aAAa,gBAAA,CACX,UAAA,EACA,OAAA,EACA,cAAc,IAAA,EACK;AACnB,IAAA,MAAM,EAAA,GAAK,SAAA,CAAS,UAAA,CAAW,UAAA,EAAY,OAAO,CAAA;AAClD,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,GAAG,OAAA,EAAQ;AAAA,IACnB;AACA,IAAA,OAAO,EAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,KAAA,CAAM,UAAA,EAA+B,OAAA,EAAyB;AACnE,IAAA,OAAO,IAAI,SAAA,CAAS;AAAA,MAClB,IAAA,EAAM,OAAA;AAAA,MACN,YAAY,UAAA,IAAc,EAAE,IAAA,EAAM,WAAA,EAAa,MAAM,IAAA,EAAK;AAAA,MAC1D;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,aAAa,WAAA,CACX,UAAA,EACA,OAAA,EACA,cAAc,IAAA,EACK;AACnB,IAAA,MAAM,EAAA,GAAK,SAAA,CAAS,KAAA,CAAM,UAAA,EAAY,OAAO,CAAA;AAC7C,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,GAAG,OAAA,EAAQ;AAAA,IACnB;AACA,IAAA,OAAO,EAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBA,aAAa,MAAA,CAAO,MAAA,EAAwB,WAAA,GAAc,IAAA,EAAyB;AACjF,IAAA,MAAM,EAAA,GAAK,IAAI,SAAA,CAAS,MAAM,CAAA;AAC9B,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,GAAG,OAAA,EAAQ;AAAA,IACnB;AACA,IAAA,OAAO,EAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,GAAyB;AAE7B,IAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,WAAA,EAAY;AAC7C,IAAA,IAAA,CAAK,OAAA,GAAU,aAAA;AACf,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,OAAO,UAAU,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,WAAA,GAAwC;AACpD,IAAA,MAAM,MAAA,GAAS,KAAK,MAAA,CAAO,IAAA;AAG3B,IAAA,QAAQ,MAAA;AAAQ,MACd,KAAK,OAAA,EAAS;AACZ,QAAA,OAAO,KAAK,gBAAA,EAAiB;AAAA,MAC/B;AAAA,MAEA,KAAK,YAAA;AAAA,MACL,KAAK,UAAA,EAAY;AACf,QAAA,OAAO,KAAK,qBAAA,EAAsB;AAAA,MACpC;AAAA,MAEA,KAAK,OAAA,EAAS;AACZ,QAAA,OAAO,KAAK,gBAAA,EAAiB;AAAA,MAC/B;AAAA,MAEA,SAAS;AACP,QAAA,MAAM,IAAI,aAAA,CAAc,CAAA,2BAAA,EAA8B,MAAM,CAAA,CAAE,CAAA;AAAA,MAChE;AAAA;AACF,EACF;AAAA,EAEA,MAAc,gBAAA,GAA6C;AACzD,IAAA,IAAI;AACF,MAAA,IAAI,WAAA;AAGJ,MAAA,IAAI;AACF,QAAA,WAAA,GAAc,MAAO,OAAO,kBAAkB,CAAA;AAAA,MAChD,CAAA,CAAA,MAAQ;AAEN,QAAA,WAAA,GAAc,UAAQ,kBAAkB,CAAA;AAAA,MAC1C;AAEA,MAAA,MAAM,YAAA,GAAe,WAAA,CAAY,YAAA,IAAgB,WAAA,CAAY,OAAA,EAAS,YAAA;AACtE,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,MAAM,IAAI,MAAM,kCAAkC,CAAA;AAAA,MACpD;AAEA,MAAA,MAAM,UAAU,IAAI,YAAA;AAAA,QAClB,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,MAAA,GACjB;AAAA,UACE,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ;AAAA,YAE9B;AAAC,OACP;AACA,MAAA,OAAO,OAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,IAAI,cAAc,gEAAgE,CAAA;AAAA,IAC1F;AAAA,EACF;AAAA,EAEA,MAAc,gBAAA,GAA6C;AACzD,IAAA,IAAI;AACF,MAAA,IAAI,WAAA;AAGJ,MAAA,IAAI;AACF,QAAA,WAAA,GAAc,MAAO,OAAO,kBAAkB,CAAA;AAAA,MAChD,CAAA,CAAA,MAAQ;AAEN,QAAA,WAAA,GAAc,UAAQ,kBAAkB,CAAA;AAAA,MAC1C;AAEA,MAAA,MAAM,YAAA,GAAe,WAAA,CAAY,YAAA,IAAgB,WAAA,CAAY,OAAA,EAAS,YAAA;AACtE,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,MAAM,IAAI,MAAM,kCAAkC,CAAA;AAAA,MACpD;AAEA,MAAA,MAAM,UAAU,IAAI,YAAA;AAAA,QAClB,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,MAAA,GACjB;AAAA,UACE,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ;AAAA,YAE9B;AAAC,OACP;AACA,MAAA,OAAO,OAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,IAAI,cAAc,gEAAgE,CAAA;AAAA,IAC1F;AAAA,EACF;AAAA,EAEA,MAAc,qBAAA,GAAkD;AAC9D,IAAA,IAAI;AACF,MAAA,IAAI,QAAA;AAGJ,MAAA,IAAI;AACF,QAAA,QAAA,GAAW,MAAO,OAAO,uBAAuB,CAAA;AAAA,MAClD,CAAA,CAAA,MAAQ;AAEN,QAAA,QAAA,GAAW,UAAQ,uBAAuB,CAAA;AAAA,MAC5C;AAEA,MAAA,MAAM,iBAAA,GAAoB,QAAA,CAAS,iBAAA,IAAqB,QAAA,CAAS,OAAA,EAAS,iBAAA;AAC1E,MAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,QAAA,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAAA,MACzD;AAEA,MAAA,MAAM,UAAU,IAAI,iBAAA;AAAA,QAClB,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,MAAA,GACjB;AAAA,UACE,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ;AAAA,YAE9B;AAAC,OACP;AACA,MAAA,OAAO,OAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,IAAI,aAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,GAA4B;AAChC,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,MAAM,IAAA,CAAK,QAAQ,UAAA,EAAW;AAAA,IAChC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,CAAexB,IAAAA,EAAa,MAAA,EAAwD;AACxF,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAS,KAAA,CAAMA,IAAAA,EAAK,MAAM,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CAAQA,IAAAA,EAAa,MAAA,EAA8B;AACvD,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAS,OAAA,CAAQA,IAAAA,EAAK,MAAM,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAe,SAAA,EAAoC;AACjD,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,OAAA,CAAS,kBAAA,EAAsB;AAC/C,IAAA,OAAO,IAAA,CAAK,qBAAA,CAAsB,EAAA,EAAI,SAAS,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAA,CAAyB,IAAS,SAAA,EAAoC;AAE5E,IAAA,IAAI,OAAO,EAAA,CAAG,KAAA,KAAU,UAAA,EAAY;AAClC,MAAA,OAAO,EAAA,CAAG,MAAM,SAAS,CAAA;AAAA,IAC3B;AACA,IAAA,IAAI,OAAO,EAAA,CAAG,IAAA,KAAS,UAAA,EAAY;AACjC,MAAA,OAAO,EAAA,CAAG,KAAK,SAAS,CAAA;AAAA,IAC1B;AAEA,IAAA,IAAI,QAAA,IAAY,EAAA,IAAM,WAAA,IAAe,EAAA,EAAI;AACvC,MAAA,EAAA,CAAG,MAAA,GAAS,SAAA;AACZ,MAAA,EAAA,CAAG,SAAA,GAAY,SAAA;AACf,MAAA,OAAO,EAAA;AAAA,IACT;AACA,IAAA,MAAM,IAAI,cAAc,gDAAgD,CAAA;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA,EAKA,KAAc,SAAA,EAAoC;AAChD,IAAA,OAAO,IAAA,CAAK,MAAS,SAAS,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAe,QAAA,EAAgD;AACnE,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAS,gBAAA,EAAiB;AAEjD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,GAAG,CAAA;AACjC,MAAA,MAAM,IAAI,MAAA,EAAO;AACjB,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,QAAA,EAAS;AACnB,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CAAQA,IAAAA,EAAa,OAAA,EAA6B;AACtD,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAS,OAAA,CAAQA,IAAAA,EAAK,OAAO,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAA,GAAwB;AAC9B,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,MAAM,IAAI,cAAc,sCAAsC,CAAA;AAAA,IAChE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAA0C;AACxC,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAA,GAAyB;AACvB,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,MAAA,MAAM,MAAA,GAAS,KAAK,MAAA,CAAO,IAAA;AAG3B,MAAA,QAAQ,MAAA;AAAQ,QACd,KAAK,OAAA,EAAS;AACZ,UAAA,IAAA,CAAK,QAAA,GAAW,IAAIoB,aAAAA,EAAa;AACjC,UAAA;AAAA,QACF;AAAA,QACA,KAAK,YAAA;AAAA,QACL,KAAK,UAAA,EAAY;AACf,UAAA,IAAA,CAAK,QAAA,GAAW,IAAIC,kBAAAA,EAAkB;AACtC,UAAA;AAAA,QACF;AAAA,QACA,KAAK,OAAA,EAAS;AACZ,UAAA,MAAM,IAAI,cAAc,qCAAqC,CAAA;AAAA,QAC/D;AAAA,QACA,SAAS;AACP,UAAA,MAAM,IAAI,aAAA,CAAc,CAAA,uCAAA,EAA0C,MAAM,CAAA,CAAE,CAAA;AAAA,QAC5E;AAAA;AACF,IACF;AACA,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoCA,EAAA,GAA0B;AACxB,IAAA,IAAA,CAAK,eAAA,EAAgB;AAErB,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACvB,MAAA,MAAM,OAAA,GAAU,KAAK,UAAA,EAAW;AAChC,MAAA,MAAM,UAAU,IAAA,CAAK,OAAA;AAGrB,MAAA,MAAM,QAAA,GAA0B;AAAA,QAC9B,MAAM,KAAA,CAAmBrB,IAAAA,EAAa,MAAA,EAA6C;AACjF,UAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,KAAA,CAASA,MAAK,MAAa,CAAA;AACxD,UAAA,OAAO;AAAA,YACL,MAAM,MAAA,CAAO,IAAA;AAAA,YACb,QAAA,EAAU,OAAO,IAAA,CAAK,MAAA;AAAA,YACtB,QAAQ,MAAA,CAAO;AAAA,WACjB;AAAA,QACF,CAAA;AAAA,QACA,MAAM,OAAA,CAAQA,IAAAA,EAAa,MAAA,EAA4C;AACrE,UAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,OAAA,CAAQA,MAAK,MAAa,CAAA;AACvD,UAAA,OAAO;AAAA,YACL,YAAA,EAAc,OAAO,YAAA,IAAgB,CAAA;AAAA,YACrC,UAAU,MAAA,CAAO,QAAA;AAAA,YACjB,aAAc,MAAA,CAAe;AAAA,WAC/B;AAAA,QACF;AAAA,OACF;AAEA,MAAA,IAAA,CAAK,gBAAgB,yBAAA,CAA0B;AAAA,QAC7C,OAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,GAAqD;AACnD,IAAA,OAAO,KAAK,MAAA,CAAO,IAAA;AAAA,EACrB;AACF;ACneO,IAAM,iBAAN,MAAyE;AAAA,EAK9E,WAAA,CACmBA,IAAAA,EACA,MAAA,EACA,QAAA,EAKjB,WAAA,EACA;AARiB,IAAA,IAAA,CAAA,GAAA,GAAAA,IAAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAQjB,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,IAAA,CAAK,WAAA,GAAc,EAAE,OAAA,EAAS,IAAA,EAAK;AAAA,IACrC;AAAA,EACF;AAAA,EAlBQ,QAAA,GAAW,KAAA;AAAA,EACX,WAAA,GAAuC,IAAA;AAAA,EACvC,MAAA,GAAgC,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoCxC,WAAW,OAAA,EAA4C;AACrD,IAAA,IAAI,YAAY,KAAA,EAAO;AACrB,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,IACrB,CAAA,MAAA,IAAW,OAAA,KAAY,IAAA,IAAQ,OAAA,KAAY,MAAA,EAAW;AACpD,MAAA,IAAA,CAAK,WAAA,GAAc,EAAE,OAAA,EAAS,IAAA,EAAK;AAAA,IACrC,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,WAAA,GAAc,EAAE,OAAA,EAAS,IAAA,EAAM,GAAG,OAAA,EAAQ;AAAA,IACjD;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,EAA4C;AAChD,IAAA,OAAO,IAAA,CAAK,WAAW,OAAO,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,GAAmC;AACvC,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,MAAA,IAAA,CAAK,MAAA,GAAS,MAAM,IAAA,CAAK,QAAA,CAAS,KAAK,GAAA,EAAK,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,WAAW,CAAA;AACzE,MAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,IAClB;AACA,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,CACE,aACA,UAAA,EACkC;AAClC,IAAA,OAAO,IAAA,CAAK,OAAA,EAAQ,CAAE,IAAA,CAAK,aAAa,UAAU,CAAA;AAAA,EACpD;AACF;AAKO,IAAM,cAAA,GAAN,MAAM,eAAA,SAAuBO,YAAAA,CAAa;AAAA,EACvC,OAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACS,MAAA;AAAA,EAEjB,YAAY,MAAA,EAA8B;AACxC,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,iBAAA,CAAkB;AAAA,MACxC,SAAA,EAAW,MAAA,CAAO,KAAA,EAAO,SAAA,IAAa;AAAA,KACvC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,MACL,MAAA,EAOgB;AAChB,IAAA,OAAO,IAAI,eAAA,CAAe,EAAE,GAAG,MAAA,EAAQ,IAAA,EAAM,SAAS,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,WACL,MAAA,EAOgB;AAChB,IAAA,OAAO,IAAI,eAAA,CAAe,EAAE,GAAG,MAAA,EAAQ,IAAA,EAAM,cAAc,CAAA;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,SAAS,MAAA,EAA4D;AAC1E,IAAA,OAAO,eAAA,CAAe,WAAW,MAAM,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBA,IAAI,MAAA,GASF;AACA,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,MAAA,MAAM,IAAI,cAAc,2DAA2D,CAAA;AAAA,IACrF;AAEA,IAAA,OAAO;AAAA,MACL,YAAY,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,IAAA,CAAK,KAAK,QAAQ,CAAA;AAAA,MACvD,OAAO,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,IAAA,CAAK,KAAK,QAAQ,CAAA;AAAA,MAC7C,MAAA,EAAQ,CAAC,OAAA,KACP,IAAA,CAAK,QAAA,CAAU,MAAA;AAAA,QAAO,OAAA;AAAA,QAAS,CAACP,IAAAA,EAAK,MAAA,KACnC,KAAK,OAAA,CAAS,KAAA,CAAMA,MAAK,MAAqB;AAAA,OAChD;AAAA,MACF,KAAA,EAAO,MAAM,IAAA,CAAK,QAAA,CAAU,QAAA,EAAS;AAAA,MACrC,UAAA,EAAY,MAAM,IAAA,CAAK,QAAA,CAAU,UAAA,EAAW;AAAA,MAC5C,GAAA,EAAK,MAAM,IAAA,CAAK;AAAA,KAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,cAAA,GAA0B;AAC5B,IAAA,OAAO,CAAC,CAAC,IAAA,CAAK,QAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,OAAA,GAAyB;AAE7B,IAAA,IAAA,CAAK,OAAA,GAAU,MAAM,IAAA,CAAK,WAAA,EAAY;AACtC,IAAA,MAAM,IAAA,CAAK,QAAQ,OAAA,CAAQ;AAAA,MACzB,IAAA,EAAM,KAAK,MAAA,CAAO,IAAA;AAAA,MAClB,IAAA,EAAM,KAAK,MAAA,CAAO,IAAA;AAAA,MAClB,IAAA,EAAM,KAAK,MAAA,CAAO,IAAA;AAAA,MAClB,QAAA,EAAU,KAAK,MAAA,CAAO,QAAA;AAAA,MACtB,QAAA,EAAU,KAAK,MAAA,CAAO,QAAA;AAAA,MACtB,gBAAA,EAAkB,KAAK,MAAA,CAAO,gBAAA;AAAA,MAC9B,IAAA,EAAM,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS;AAAA,KAC5B,CAAA;AAGD,IAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACrB,MAAA,MAAM,KAAK,UAAA,EAAW;AAAA,IACxB;AAEA,IAAA,IAAA,CAAK,KAAK,SAAS,CAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,GAA4B;AAChC,IAAA,IAAI,KAAK,YAAA,IAAgB,OAAO,IAAA,CAAK,YAAA,CAAa,eAAe,UAAA,EAAY;AAC3E,MAAA,MAAM,IAAA,CAAK,aAAa,UAAA,EAAW;AAAA,IACrC;AACA,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,MAAM,IAAA,CAAK,QAAQ,UAAA,EAAW;AAAA,IAChC;AACA,IAAA,IAAA,CAAK,KAAK,YAAY,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2BA,KAAA,CAAmBA,MAAa,MAAA,EAAyC;AACvE,IAAA,IAAA,CAAK,eAAA,EAAgB;AAErB,IAAA,MAAM,QAAA,GAAW,OACf,CAAA,EACA,CAAA,EACA,WAAA,KAC4B;AAE5B,MAAA,IAAI,CAAC,WAAA,IAAe,CAAC,IAAA,CAAK,QAAA,EAAU;AAClC,QAAA,OAAO,IAAA,CAAK,OAAA,CAAS,KAAA,CAAS,CAAA,EAAG,CAAC,CAAA;AAAA,MACpC;AAGA,MAAA,MAAM,MAAM,WAAA,CAAY,GAAA,IAAO,KAAK,QAAA,CAAS,WAAA,CAAY,GAAG,CAAc,CAAA;AAG1E,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,QAAA,CAAS,IAAoB,GAAG,CAAA;AAC1D,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,IAAA,CAAK,KAAK,UAAA,EAAY,EAAE,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA;AACrC,QAAA,OAAO,MAAA;AAAA,MACT;AAGA,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,OAAA,CAAS,KAAA,CAAS,GAAG,CAAC,CAAA;AAChD,MAAA,IAAA,CAAK,KAAK,WAAA,EAAa,EAAE,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA;AAGtC,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,CAAC,CAAA;AACnC,MAAA,MAAM,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ;AAAA,QACnC,KAAK,WAAA,CAAY,GAAA,IAAO,IAAA,CAAK,MAAA,CAAO,OAAO,GAAA,IAAO,IAAA;AAAA,QAClD,MAAM,WAAA,CAAY,IAAA;AAAA,QAClB;AAAA,OACD,CAAA;AAED,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAEA,IAAA,OAAO,IAAI,eAAkBA,IAAAA,EAAK,MAAA,EAAQ,UAAU,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,MAAA,IAAU,KAAK,CAAA;AAAA,EACxF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAA,CAAqBA,IAAAA,EAAa,MAAA,EAA+C;AACrF,IAAA,IAAA,CAAK,eAAA,EAAgB;AAErB,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,OAAA,CAAS,KAAA,CAASA,MAAK,MAAM,CAAA;AAGvD,IAAA,IAAI,KAAK,QAAA,IAAY,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,mBAAmB,KAAA,EAAO;AAChE,MAAA,MAAM,OAAA,GAAUA,KAAI,IAAA,EAAK,CAAE,MAAM,KAAK,CAAA,CAAE,CAAC,CAAA,EAAG,WAAA,EAAY;AACxD,MAAA,MAAM,mBAAmB,CAAC,QAAA,EAAU,UAAU,QAAA,EAAU,UAAA,EAAY,QAAQ,OAAO,CAAA;AAEnF,MAAA,IAAI,OAAA,IAAW,gBAAA,CAAiB,QAAA,CAAS,OAAO,CAAA,EAAG;AACjD,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAcA,IAAG,CAAA;AACrC,QAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,UAAA,MAAM,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,EAAE,QAAQ,CAAA;AACvC,UAAA,IAAA,CAAK,IAAA,CAAK,kBAAA,EAAoB,EAAE,MAAA,EAAQ,SAAS,CAAA;AAAA,QACnD;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAmB,SAAA,EAAoC;AACrD,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,OAAA,CAAS,kBAAA,EAAsB;AAC/C,IAAA,OAAO,IAAA,CAAK,qBAAA,CAAsB,EAAA,EAAI,SAAS,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,KAAkB,SAAA,EAAoC;AACpD,IAAA,OAAO,IAAA,CAAK,MAAS,SAAS,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,WAAA,CACJ,QAAA,EACA,OAAA,EACY;AACZ,IAAA,IAAA,CAAK,eAAA,EAAgB;AAErB,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAS,iBAAiB,OAAO,CAAA;AAExD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,GAAG,CAAA;AACjC,MAAA,MAAM,IAAI,MAAA,EAAO;AAGjB,MAAA,IAAI,KAAK,QAAA,EAAU;AACjB,QAAA,MAAM,IAAA,CAAK,OAAO,KAAA,EAAM;AAAA,MAC1B;AAEA,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,QAAA,EAAS;AACnB,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,UAAA,GAA0C;AACxC,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,GAA4C;AAC1C,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,GAAyB;AAC7B,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,OAAO,IAAA,CAAK,QAAS,IAAA,EAAK;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,WAAA,GAAuB;AACzB,IAAA,OAAO,CAAC,CAAC,IAAA,CAAK,OAAA,EAAS,WAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,UAAA,GAA4B;AACxC,IAAA,MAAM,WAAA,GAAc,KAAK,MAAA,CAAO,KAAA;AAGhC,IAAA,IAAI,OAAO,WAAA,CAAY,KAAA,KAAU,QAAA,EAAU;AACzC,MAAA,IAAA,CAAK,YAAA,GAAe,MAAM,IAAA,CAAK,gBAAA,EAAiB;AAChD,MAAA,IAAI,OAAO,IAAA,CAAK,YAAA,CAAa,OAAA,KAAY,UAAA,EAAY;AACnD,QAAA,MAAM,IAAA,CAAK,aAAa,OAAA,CAAQ;AAAA,UAC9B,kBAAkB,WAAA,CAAY;AAAA,SAC/B,CAAA;AAAA,MACH;AAAA,IACF,CAAA,MAAA,IAAW,YAAY,KAAA,EAAO;AAC5B,MAAA,IAAA,CAAK,eAAe,WAAA,CAAY,KAAA;AAAA,IAClC;AAEA,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,MAAM,IAAI,cAAc,uCAAuC,CAAA;AAAA,IACjE;AAGA,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,QAAA,CAAS;AAAA,MAC3B,SAAS,IAAA,CAAK,YAAA;AAAA,MACd,SAAA,EAAW,YAAY,SAAA,IAAa,WAAA;AAAA,MACpC,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,MAAA;AAAA,MAC7B,OAAO,WAAA,CAAY,KAAA;AAAA,MACnB,QAAQ,WAAA,CAAY,MAAA;AAAA,MACpB,SAAS,WAAA,CAAY;AAAA,KACtB,CAAA;AAGD,IAAA,IAAI,WAAA,CAAY,MAAA,IAAU,WAAA,CAAY,MAAA,CAAO,SAAS,CAAA,EAAG;AACvD,MAAA,MAAM,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,WAAA,CAAY,MAAM,CAAA;AAAA,IAC7C;AAAA,EACF;AAAA,EAEA,MAAc,WAAA,GAAwC;AACpD,IAAA,QAAQ,IAAA,CAAK,OAAO,IAAA;AAAM,MACxB,KAAK,OAAA,EAAS;AACZ,QAAA,OAAO,KAAK,gBAAA,EAAiB;AAAA,MAC/B;AAAA,MACA,KAAK,YAAA;AAAA,MACL,KAAK,UAAA,EAAY;AACf,QAAA,OAAO,KAAK,qBAAA,EAAsB;AAAA,MACpC;AAAA,MACA,SAAS;AACP,QAAA,MAAM,IAAI,aAAA,CAAc,CAAA,2BAAA,EAA8B,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AAAA,MAC1E;AAAA;AACF,EACF;AAAA,EAEA,MAAc,gBAAA,GAA6C;AACzD,IAAA,IAAI;AACF,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI;AACF,QAAA,MAAA,GAAS,MAAM,OAAO,kBAAkB,CAAA;AAAA,MAC1C,CAAA,CAAA,MAAQ;AACN,QAAA,MAAA,GAAS,UAAQ,kBAAkB,CAAA;AAAA,MACrC;AACA,MAAA,MAAM,YAAA,GAAe,MAAA,CAAO,YAAA,IAAgB,MAAA,CAAO,OAAA,EAAS,YAAA;AAC5D,MAAA,OAAO,IAAI,YAAA;AAAA,QACT,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,MAAA,GAAS,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,MAAA,EAAO,GAAI;AAAC,OAC1E;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,IAAI,cAAc,gEAAgE,CAAA;AAAA,IAC1F;AAAA,EACF;AAAA,EAEA,MAAc,qBAAA,GAAkD;AAC9D,IAAA,IAAI;AACF,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI;AACF,QAAA,MAAA,GAAS,MAAM,OAAO,uBAAuB,CAAA;AAAA,MAC/C,CAAA,CAAA,MAAQ;AACN,QAAA,MAAA,GAAS,UAAQ,uBAAuB,CAAA;AAAA,MAC1C;AACA,MAAA,MAAM,iBAAA,GAAoB,MAAA,CAAO,iBAAA,IAAqB,MAAA,CAAO,OAAA,EAAS,iBAAA;AACtE,MAAA,OAAO,IAAI,iBAAA;AAAA,QACT,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,MAAA,GAAS,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,MAAA,EAAO,GAAI;AAAC,OAC1E;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,IAAI,aAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,gBAAA,GAAqD;AACjE,IAAA,IAAI;AACF,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI;AACF,QAAA,MAAA,GAAS,MAAM,OAAO,kBAAkB,CAAA;AAAA,MAC1C,CAAA,CAAA,MAAQ;AACN,QAAA,MAAA,GAAS,UAAQ,kBAAkB,CAAA;AAAA,MACrC;AACA,MAAA,MAAM,YAAA,GAAe,MAAA,CAAO,YAAA,IAAgB,MAAA,CAAO,OAAA,EAAS,YAAA;AAC5D,MAAA,OAAO,IAAI,YAAA,EAAa;AAAA,IAC1B,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,IAAI,cAAc,gEAAgE,CAAA;AAAA,IAC1F;AAAA,EACF;AAAA,EAEQ,qBAAA,CAAyB,IAAS,SAAA,EAAoC;AAC5E,IAAA,IAAI,OAAO,EAAA,CAAG,KAAA,KAAU,UAAA,EAAY;AAClC,MAAA,OAAO,EAAA,CAAG,MAAM,SAAS,CAAA;AAAA,IAC3B;AACA,IAAA,IAAI,OAAO,EAAA,CAAG,IAAA,KAAS,UAAA,EAAY;AACjC,MAAA,OAAO,EAAA,CAAG,KAAK,SAAS,CAAA;AAAA,IAC1B;AACA,IAAA,IAAI,QAAA,IAAY,EAAA,IAAM,WAAA,IAAe,EAAA,EAAI;AACvC,MAAA,EAAA,CAAG,MAAA,GAAS,SAAA;AACZ,MAAA,EAAA,CAAG,SAAA,GAAY,SAAA;AACf,MAAA,OAAO,EAAA;AAAA,IACT;AACA,IAAA,MAAM,IAAI,cAAc,gDAAgD,CAAA;AAAA,EAC1E;AAAA,EAEQ,eAAA,GAAwB;AAC9B,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,MAAM,IAAI,cAAc,sCAAsC,CAAA;AAAA,IAChE;AAAA,EACF;AAAA,EAEQ,cAAcA,IAAAA,EAAuB;AAC3C,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,MAAM,QAAA,GAAW;AAAA,MACf,4BAAA;AAAA,MACA,4BAAA;AAAA,MACA,4BAAA;AAAA,MACA,8BAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,IAAI,KAAA;AACJ,MAAA,OAAA,CAAQ,KAAA,GAAQ,OAAA,CAAQ,IAAA,CAAKA,IAAG,OAAO,IAAA,EAAM;AAC3C,QAAA,IAAI,KAAA,CAAM,CAAC,CAAA,EAAG;AACZ,UAAA,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAE,aAAa,CAAA;AAAA,QACpC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,CAAC,GAAG,IAAI,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,EAC5B;AACF;;;AC5mBA,IAAM,gBAAA,uBAAuB,GAAA,EAAkC;AAKxD,SAAS,sBAAA,CAAuB,MAAoB,OAAA,EAA+B;AACxF,EAAA,gBAAA,CAAiB,GAAA,CAAI,MAAM,OAAO,CAAA;AACpC;AAKO,SAAS,cAAc,MAAA,EAAyC;AACrE,EAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA;AAEhD,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,aAAA;AAAA,MACR,CAAA,wCAAA,EAA2C,OAAO,IAAI,CAAA,gDAAA;AAAA,KAExD;AAAA,EACF;AAEA,EAAA,OAAO,OAAA,CAAQ,cAAc,MAAM,CAAA;AACrC;AAKO,IAAMwB,SAAAA,GAAN,MAAM,SAAA,CAAS;AAAA,EACZ,OAAA;AAAA,EACS,MAAA;AAAA,EAEjB,YAAY,MAAA,EAAwB;AAClC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA,EAEA,OAAO,KAAA,CAAM,UAAA,EAA8B,OAAA,EAAyB;AAClE,IAAA,OAAO,IAAI,SAAA,CAAS;AAAA,MAClB,IAAA,EAAM,OAAA;AAAA,MACN,UAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAAA,EAEA,OAAO,UAAA,CAAW,UAAA,EAA8B,OAAA,EAAyB;AACvE,IAAA,OAAO,IAAI,SAAA,CAAS;AAAA,MAClB,IAAA,EAAM,YAAA;AAAA,MACN,UAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAA,CAAK,OAAA,GAAU,aAAA,CAAc,IAAA,CAAK,MAAM,CAAA;AACxC,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,OAAO,UAAU,CAAA;AAAA,EACnD;AAAA,EAEA,MAAM,UAAA,GAA4B;AAChC,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,MAAM,IAAA,CAAK,QAAQ,UAAA,EAAW;AAAA,IAChC;AAAA,EACF;AAAA,EAEA,MAAM,KAAA,CAAexB,IAAAA,EAAa,MAAA,EAAwD;AACxF,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAS,KAAA,CAAMA,IAAAA,EAAK,MAAM,CAAA;AAAA,EACxC;AAAA,EAEA,MAAM,OAAA,CAAQA,IAAAA,EAAa,MAAA,EAA8B;AACvD,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAS,OAAA,CAAQA,IAAAA,EAAK,MAAM,CAAA;AAAA,EAC1C;AAAA,EAEA,MAAe,SAAA,EAA2D;AACxE,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,OAAA,CAAS,kBAAA,EAAsB;AAC/C,IAAA,OAAO,IAAA,CAAK,qBAAA,CAAsB,EAAA,EAAI,SAAS,CAAA;AAAA,EACjD;AAAA,EAEQ,qBAAA,CACN,IACA,SAAA,EACwC;AACxC,IAAA,IAAI,OAAO,EAAA,CAAG,KAAA,KAAU,UAAA,EAAY;AAClC,MAAA,OAAO,EAAA,CAAG,MAAM,SAAS,CAAA;AAAA,IAC3B;AACA,IAAA,IAAI,OAAO,EAAA,CAAG,IAAA,KAAS,UAAA,EAAY;AACjC,MAAA,OAAO,EAAA,CAAG,KAAK,SAAS,CAAA;AAAA,IAC1B;AACA,IAAA,IAAI,QAAA,IAAY,EAAA,IAAM,WAAA,IAAe,EAAA,EAAI;AACvC,MAAA,EAAA,CAAG,MAAA,GAAS,SAAA;AACZ,MAAA,EAAA,CAAG,SAAA,GAAY,SAAA;AACf,MAAA,OAAO,EAAA;AAAA,IACT;AACA,IAAA,MAAM,IAAI,cAAc,gDAAgD,CAAA;AAAA,EAC1E;AAAA,EAEA,KAAc,SAAA,EAA2D;AACvE,IAAA,OAAO,IAAA,CAAK,MAAS,SAAS,CAAA;AAAA,EAChC;AAAA,EAEA,MAAM,YAAe,QAAA,EAAgD;AACnE,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAS,gBAAA,EAAiB;AAEjD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,GAAG,CAAA;AACjC,MAAA,MAAM,IAAI,MAAA,EAAO;AACjB,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,QAAA,EAAS;AACnB,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,OAAA,CAAQA,IAAAA,EAAa,OAAA,EAA6B;AACtD,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAS,OAAA,CAAQA,IAAAA,EAAK,OAAO,CAAA;AAAA,EAC3C;AAAA,EAEQ,eAAA,GAAwB;AAC9B,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,MAAM,IAAI,cAAc,sCAAsC,CAAA;AAAA,IAChE;AAAA,EACF;AAAA,EAEA,UAAA,GAA0C;AACxC,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AACF","file":"index.js","sourcesContent":["/**\n * Strict Type Definitions\n *\n * Enhanced type definitions with:\n * - Discriminated unions for better type narrowing\n * - Strict generics for type-safe queries\n * - Branded types for runtime safety\n * - Utility types for common patterns\n */\n\n// ============ Branded Types ============\n\n/**\n * Branded type for SQL strings (prevents SQL injection at type level)\n */\ndeclare const __brand: unique symbol;\ntype Brand<T, B> = T & { [__brand]: B };\n\nexport type SafeSQL = Brand<string, 'SafeSQL'>;\nexport type TableName = Brand<string, 'TableName'>;\nexport type ColumnName = Brand<string, 'ColumnName'>;\n\n/**\n * Create a safe SQL string (should be used with parameterized queries)\n */\nexport function sql(strings: TemplateStringsArray, ..._values: unknown[]): SafeSQL {\n // This is a tagged template that marks SQL as safe\n // Values should be passed as parameters, not interpolated\n return strings.join('?') as SafeSQL;\n}\n\n// ============ Discriminated Union for Connection Config ============\n\n/**\n * Host-based connection configuration\n */\nexport interface HostConnectionConfig {\n type: 'host';\n host: string;\n port: number;\n database: string;\n user: string;\n password: string;\n ssl?: SSLConfig;\n pool?: StrictPoolConfig;\n}\n\n/**\n * Connection string based configuration\n */\nexport interface ConnectionStringConfig {\n type: 'connectionString';\n connectionString: string;\n ssl?: SSLConfig;\n pool?: StrictPoolConfig;\n}\n\n/**\n * Strict connection config - must be one or the other\n */\nexport type StrictConnectionConfig = HostConnectionConfig | ConnectionStringConfig;\n\n/**\n * SSL configuration options\n */\nexport interface SSLConfig {\n enabled: boolean;\n rejectUnauthorized?: boolean;\n ca?: string | Buffer;\n cert?: string | Buffer;\n key?: string | Buffer;\n}\n\n/**\n * Strict pool configuration with defaults\n */\nexport interface StrictPoolConfig {\n min: number;\n max: number;\n acquireTimeout: number;\n idleTimeout: number;\n validateOnBorrow?: boolean;\n maxLifetime?: number;\n}\n\n// ============ Discriminated Union for Query Results ============\n\n/**\n * Base query result\n */\ninterface BaseQueryResult {\n duration: number;\n command: SQLCommand;\n}\n\n/**\n * SELECT query result\n */\nexport interface SelectResult<T> extends BaseQueryResult {\n command: 'SELECT';\n rows: T[];\n rowCount: number;\n fields: StrictFieldInfo[];\n}\n\n/**\n * INSERT query result\n */\nexport interface InsertResult extends BaseQueryResult {\n command: 'INSERT';\n insertId: number | bigint;\n affectedRows: number;\n}\n\n/**\n * UPDATE query result\n */\nexport interface UpdateResult extends BaseQueryResult {\n command: 'UPDATE';\n affectedRows: number;\n changedRows: number;\n}\n\n/**\n * DELETE query result\n */\nexport interface DeleteResult extends BaseQueryResult {\n command: 'DELETE';\n affectedRows: number;\n}\n\n/**\n * Discriminated union of all query results\n */\nexport type StrictQueryResult<T = unknown> =\n | SelectResult<T>\n | InsertResult\n | UpdateResult\n | DeleteResult;\n\n/**\n * SQL command types\n */\nexport type SQLCommand =\n | 'SELECT'\n | 'INSERT'\n | 'UPDATE'\n | 'DELETE'\n | 'CREATE'\n | 'ALTER'\n | 'DROP'\n | 'TRUNCATE'\n | 'BEGIN'\n | 'COMMIT'\n | 'ROLLBACK';\n\n// ============ Strict Field Info ============\n\n/**\n * Known database field types\n */\nexport type FieldType =\n // String types\n | 'varchar'\n | 'char'\n | 'text'\n | 'mediumtext'\n | 'longtext'\n | 'enum'\n | 'set'\n // Numeric types\n | 'int'\n | 'tinyint'\n | 'smallint'\n | 'mediumint'\n | 'bigint'\n | 'decimal'\n | 'float'\n | 'double'\n | 'numeric'\n // Date/Time types\n | 'date'\n | 'datetime'\n | 'timestamp'\n | 'time'\n | 'year'\n // Binary types\n | 'blob'\n | 'binary'\n | 'varbinary'\n // Other types\n | 'json'\n | 'jsonb'\n | 'uuid'\n | 'boolean'\n | 'bool'\n // Fallback\n | 'unknown';\n\n/**\n * Strict field info with known types\n */\nexport interface StrictFieldInfo {\n name: string;\n type: FieldType;\n nullable: boolean;\n primaryKey: boolean;\n autoIncrement: boolean;\n defaultValue: unknown;\n maxLength?: number;\n precision?: number;\n scale?: number;\n}\n\n// ============ Type-Safe Query Builder Types ============\n\n/**\n * Operator types for WHERE clauses\n */\nexport type ComparisonOperator = '=' | '!=' | '<>' | '>' | '<' | '>=' | '<=';\nexport type LikeOperator = 'LIKE' | 'NOT LIKE' | 'ILIKE';\nexport type NullOperator = 'IS NULL' | 'IS NOT NULL';\nexport type InOperator = 'IN' | 'NOT IN';\nexport type BetweenOperator = 'BETWEEN' | 'NOT BETWEEN';\n\nexport type WhereOperator =\n | ComparisonOperator\n | LikeOperator\n | NullOperator\n | InOperator\n | BetweenOperator;\n\n/**\n * Join types\n */\nexport type JoinType = 'INNER' | 'LEFT' | 'RIGHT' | 'FULL' | 'CROSS';\n\n/**\n * Order direction\n */\nexport type OrderDirection = 'ASC' | 'DESC';\n\n/**\n * Aggregate functions\n */\nexport type AggregateFunction = 'COUNT' | 'SUM' | 'AVG' | 'MIN' | 'MAX';\n\n// ============ Type-Safe Table Schema ============\n\n/**\n * Define a table schema for type-safe queries\n */\nexport interface TableSchema<T extends Record<string, unknown>> {\n name: TableName;\n columns: {\n [K in keyof T]: ColumnDefinition<T[K]>;\n };\n primaryKey: keyof T;\n}\n\n/**\n * Column definition\n */\nexport interface ColumnDefinition<T> {\n type: FieldType;\n nullable: boolean;\n defaultValue?: T;\n autoIncrement?: boolean;\n}\n\n// ============ Utility Types ============\n\n/**\n * Extract row type from query result\n */\nexport type ExtractRow<T> = T extends SelectResult<infer R> ? R : never;\n\n/**\n * Make specific keys required\n */\nexport type RequireKeys<T, K extends keyof T> = T & Required<Pick<T, K>>;\n\n/**\n * Make specific keys optional\n */\nexport type OptionalKeys<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;\n\n/**\n * Type for insert data (omit auto-generated fields)\n */\nexport type InsertData<T, AutoFields extends keyof T = never> = Omit<T, AutoFields>;\n\n/**\n * Type for update data (all fields optional except the ID field)\n */\nexport type UpdateData<T, IdField extends keyof T> = Partial<Omit<T, IdField>> & Pick<T, IdField>;\n\n/**\n * Nullable version of a type\n */\nexport type Nullable<T> = T | null;\n\n/**\n * Deep partial - makes all nested properties optional\n */\nexport type DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\n/**\n * Deep required - makes all nested properties required\n */\nexport type DeepRequired<T> = {\n [P in keyof T]-?: T[P] extends object ? DeepRequired<T[P]> : T[P];\n};\n\n// ============ Type Guards ============\n\n/**\n * Type guard for SelectResult\n */\nexport function isSelectResult<T>(result: StrictQueryResult<T>): result is SelectResult<T> {\n return result.command === 'SELECT';\n}\n\n/**\n * Type guard for InsertResult\n */\nexport function isInsertResult(result: StrictQueryResult): result is InsertResult {\n return result.command === 'INSERT';\n}\n\n/**\n * Type guard for UpdateResult\n */\nexport function isUpdateResult(result: StrictQueryResult): result is UpdateResult {\n return result.command === 'UPDATE';\n}\n\n/**\n * Type guard for DeleteResult\n */\nexport function isDeleteResult(result: StrictQueryResult): result is DeleteResult {\n return result.command === 'DELETE';\n}\n\n// ============ Constants ============\n\n/**\n * Default pool configuration\n */\nexport const DEFAULT_POOL_CONFIG: StrictPoolConfig = {\n min: 2,\n max: 10,\n acquireTimeout: 30_000,\n idleTimeout: 60_000,\n validateOnBorrow: true,\n} as const;\n\n/**\n * Default timeouts (in milliseconds)\n */\nexport const DEFAULT_TIMEOUTS = {\n connection: 10_000,\n query: 30_000,\n transaction: 60_000,\n} as const;\n\n/**\n * Isolation levels as const\n */\nexport const ISOLATION_LEVELS = {\n READ_UNCOMMITTED: 'READ UNCOMMITTED',\n READ_COMMITTED: 'READ COMMITTED',\n REPEATABLE_READ: 'REPEATABLE READ',\n SERIALIZABLE: 'SERIALIZABLE',\n} as const;\n\nexport type StrictIsolationLevel = (typeof ISOLATION_LEVELS)[keyof typeof ISOLATION_LEVELS];\n","/**\n * Database connection configuration\n * @example\n * ```typescript\n * const config: ConnectionConfig = {\n * host: 'localhost',\n * port: 3306,\n * user: 'root',\n * password: 'password',\n * database: 'mydb',\n * pool: {\n * min: 2,\n * max: 100,\n * acquireTimeout: 30000,\n * idleTimeout: 60000\n * }\n * };\n * ```\n */\nexport interface ConnectionConfig {\n host?: string;\n port?: number;\n database?: string;\n user?: string;\n password?: string;\n connectionString?: string;\n ssl?: boolean | Record<string, unknown>;\n\n /** @deprecated Use pool.max instead */\n poolSize?: number;\n\n /** Pool configuration */\n pool?: PoolConfig;\n\n connectionTimeout?: number;\n idleTimeout?: number;\n maxRetries?: number;\n retryDelay?: number;\n readonly?: boolean;\n}\n\n/**\n * Connection pool configuration\n *\n * Production defaults (when not specified):\n * - max: 10 connections\n * - acquireTimeout: 30000ms (30 seconds)\n * - idleTimeout: 60000ms (60 seconds)\n * - queueLimit: 100 (prevent memory exhaustion)\n * - queryTimeout: 30000ms (30 seconds)\n */\nexport interface PoolConfig {\n /** Minimum number of connections in pool (default: 0) */\n min?: number;\n\n /** Maximum number of connections in pool (default: 10) */\n max?: number;\n\n /**\n * Maximum time to wait for a connection from pool (ms)\n * If exceeded, throws PoolExhaustedError\n * Default: 30000 (30 seconds)\n */\n acquireTimeout?: number;\n\n /**\n * Time before idle connection is closed (ms)\n * Default: 60000 (60 seconds)\n */\n idleTimeout?: number;\n\n /** Whether to validate connections before use (default: false) */\n validateOnBorrow?: boolean;\n\n /**\n * Maximum connection lifetime (ms)\n * Connection will be closed after this time\n * Default: 0 (no limit)\n */\n maxLifetime?: number;\n\n /**\n * Maximum waiting requests in queue\n * When queue is full, new requests immediately fail with PoolExhaustedError\n * Set to 0 for unlimited (NOT recommended for production!)\n * Default: 100\n */\n queueLimit?: number;\n\n /**\n * Maximum time for a query to execute (ms)\n * If exceeded, query is cancelled and throws QueryTimeoutError\n * Default: 30000 (30 seconds)\n */\n queryTimeout?: number;\n\n /** Enable keep-alive on TCP socket (default: true in production) */\n enableKeepAlive?: boolean;\n\n /** Keep-alive initial delay (ms) */\n keepAliveInitialDelay?: number;\n}\n\nexport interface QueryResult<T = unknown> {\n rows: T[];\n rowCount: number;\n affectedRows?: number;\n insertId?: number;\n fields?: FieldInfo[];\n command?: string;\n duration?: number;\n}\n\nexport interface FieldInfo {\n name: string;\n type: string;\n nullable: boolean;\n primaryKey?: boolean;\n autoIncrement?: boolean;\n defaultValue?: unknown;\n}\n\nexport interface TransactionOptions {\n isolationLevel?: IsolationLevel;\n readOnly?: boolean;\n deferrable?: boolean;\n}\n\nexport enum IsolationLevel {\n READ_UNCOMMITTED = 'READ UNCOMMITTED',\n READ_COMMITTED = 'READ COMMITTED',\n REPEATABLE_READ = 'REPEATABLE READ',\n SERIALIZABLE = 'SERIALIZABLE',\n}\n\nexport interface PreparedStatement<T = unknown> {\n execute(params?: unknown[]): Promise<QueryResult<T>>;\n release(): Promise<void>;\n close(): Promise<void>; // Alias for release() - industry standard naming\n}\n\nexport interface CacheOptions {\n ttl?: number;\n key?: string;\n invalidateOn?: string[];\n compress?: boolean;\n}\n\nexport interface QueryOptions {\n cache?: boolean | CacheOptions;\n timeout?: number;\n prepare?: boolean;\n transaction?: Transaction;\n}\n\nexport interface Transaction {\n id: string;\n isActive: boolean;\n commit(): Promise<void>;\n rollback(): Promise<void>;\n savepoint(name: string): Promise<void>;\n releaseSavepoint(name: string): Promise<void>;\n rollbackToSavepoint(name: string): Promise<void>;\n query<T = unknown>(\n sql: string,\n params?: QueryParams,\n options?: QueryOptions,\n ): Promise<QueryResult<T>>;\n execute<T = unknown>(\n sql: string,\n params?: QueryParams,\n options?: QueryOptions,\n ): Promise<QueryResult<T>>;\n}\n\nexport interface PoolStats {\n total: number;\n idle: number;\n waiting: number;\n active: number;\n}\n\nexport type QueryValue = string | number | boolean | Date | Buffer | null | undefined;\nexport type QueryParams = QueryValue[] | Record<string, QueryValue>;\n\nexport interface LogLevel {\n ERROR: 'error';\n WARN: 'warn';\n INFO: 'info';\n DEBUG: 'debug';\n}\n\nexport interface Logger {\n error(message: string, ...args: unknown[]): void;\n warn(message: string, ...args: unknown[]): void;\n info(message: string, ...args: unknown[]): void;\n debug(message: string, ...args: unknown[]): void;\n}\n\n// ============ Strict Types (Enhanced Type Safety) ============\nexport * from './strict-types';\n","/**\n * Constants\n *\n * Centralized configuration constants to eliminate magic numbers.\n * All timing values are in milliseconds unless otherwise noted.\n */\n\n// ============ Connection Defaults ============\n\nexport const CONNECTION_DEFAULTS = {\n /** Default MySQL port */\n MYSQL_PORT: 3306,\n /** Default PostgreSQL port */\n POSTGRESQL_PORT: 5432,\n /** Default Redis port */\n REDIS_PORT: 6379,\n /** Default MongoDB port */\n MONGODB_PORT: 27_017,\n /** Default connection timeout (10 seconds) */\n CONNECTION_TIMEOUT: 10_000,\n /** Default idle timeout (5 minutes) */\n IDLE_TIMEOUT: 300_000,\n /** Maximum port number */\n MAX_PORT: 65_535,\n /** Minimum port number */\n MIN_PORT: 1,\n} as const;\n\n// ============ Pool Defaults ============\n\n/**\n * Legacy pool defaults (CAPS format)\n * @deprecated Use POOL_DEFAULTS instead\n */\nexport const POOL_DEFAULTS_LEGACY = {\n /** Minimum connections in pool */\n MIN_CONNECTIONS: 2,\n /** Maximum connections in pool */\n MAX_CONNECTIONS: 10,\n /** Time to wait for a connection (30 seconds) */\n ACQUIRE_TIMEOUT: 30_000,\n /** Time before idle connection is closed (1 minute) */\n IDLE_TIMEOUT: 60_000,\n /** Maximum connection lifetime (30 minutes) */\n MAX_LIFETIME: 1_800_000,\n /** Queue limit (0 = unlimited) */\n QUEUE_LIMIT: 0,\n} as const;\n\n/**\n * Production-ready pool defaults\n * Matches PoolConfig interface for easy spreading\n *\n * @example\n * ```typescript\n * const poolConfig = {\n * ...POOL_DEFAULTS,\n * max: 20, // Override specific values\n * };\n * ```\n */\nexport const POOL_DEFAULTS = {\n /** Minimum connections in pool */\n min: 0,\n /** Maximum connections in pool */\n max: 10,\n /** Time to wait for connection from pool (30 seconds) */\n acquireTimeout: 30_000,\n /** Time before idle connection is closed (1 minute) */\n idleTimeout: 60_000,\n /**\n * Maximum waiting requests in queue\n * 100 = prevent memory exhaustion under load\n */\n queueLimit: 100,\n /** Query execution timeout (30 seconds) */\n queryTimeout: 30_000,\n} as const;\n\n// ============ Query Defaults ============\n\nexport const QUERY_DEFAULTS = {\n /** Default query timeout (30 seconds) */\n TIMEOUT: 30_000,\n /** Transaction timeout (1 minute) */\n TRANSACTION_TIMEOUT: 60_000,\n /** Slow query threshold (1 second) */\n SLOW_QUERY_THRESHOLD: 1000,\n /** Maximum traces to keep in memory */\n MAX_TRACES: 10_000,\n /** Very slow query threshold for analysis (2 seconds) */\n VERY_SLOW_QUERY_THRESHOLD: 2000,\n /** Slow transaction threshold (5 seconds) */\n SLOW_TRANSACTION_THRESHOLD: 5000,\n} as const;\n\n// ============ Cache Defaults ============\n\nexport const CACHE_DEFAULTS = {\n /** Default cache TTL (1 hour in seconds) */\n TTL_SECONDS: 3600,\n /** Default cache TTL (1 hour in milliseconds) */\n TTL_MS: 3_600_000,\n /** Short TTL for errors (1 minute in seconds) */\n ERROR_TTL_SECONDS: 60,\n /** Cache cleanup interval (1 minute) */\n CLEANUP_INTERVAL: 60_000,\n /** Maximum cache entry size (1MB) */\n MAX_ENTRY_SIZE: 1024 * 1024,\n /** Compression threshold (1KB) */\n COMPRESSION_THRESHOLD: 1024,\n /** Maximum latencies to track for cache statistics */\n MAX_LATENCIES: 1000,\n} as const;\n\n// ============ Retry Defaults ============\n\nexport const RETRY_DEFAULTS = {\n /** Maximum retry attempts */\n MAX_RETRIES: 3,\n /** Base delay between retries (1 second) */\n BASE_DELAY: 1000,\n /** Maximum delay between retries (30 seconds) */\n MAX_DELAY: 30_000,\n /** Backoff multiplier */\n BACKOFF_MULTIPLIER: 2,\n /** Circuit breaker failure threshold */\n CIRCUIT_BREAKER_THRESHOLD: 5,\n /** Circuit breaker reset timeout (30 seconds) */\n CIRCUIT_BREAKER_RESET: 30_000,\n} as const;\n\n// ============ Crypto Defaults ============\n\nexport const CRYPTO_DEFAULTS = {\n /** Default encryption algorithm */\n ALGORITHM: 'aes-256-gcm',\n /** Default key length (32 bytes for AES-256) */\n KEY_LENGTH: 32,\n /** Default IV length (16 bytes) */\n IV_LENGTH: 16,\n /** ChaCha20 IV length (12 bytes) */\n CHACHA_IV_LENGTH: 12,\n /** Default salt length (32 bytes) */\n SALT_LENGTH: 32,\n /** PBKDF2 iterations */\n ITERATIONS: 100_000,\n /** Hash digest algorithm */\n DIGEST: 'sha256',\n} as const;\n\n// ============ Health Check Defaults ============\n\nexport const HEALTH_DEFAULTS = {\n /** Health check interval (30 seconds) */\n CHECK_INTERVAL: 30_000,\n /** Health check timeout (5 seconds) */\n CHECK_TIMEOUT: 5000,\n /** Maximum wait time for healthy state (1 minute) */\n MAX_WAIT_TIME: 60_000,\n /** Wait interval between health checks (1 second) */\n WAIT_INTERVAL: 1000,\n} as const;\n\n// ============ Logging Defaults ============\n\nexport const LOGGING_DEFAULTS = {\n /** Slow query threshold for logging (1 second) */\n SLOW_QUERY_THRESHOLD: 1000,\n /** Maximum SQL length in logs (200 chars) */\n MAX_SQL_LENGTH: 200,\n /** Maximum params length in logs (100 chars) */\n MAX_PARAMS_LENGTH: 100,\n} as const;\n\n// ============ Metrics Buckets ============\n\n/**\n * Histogram buckets for query duration metrics (in ms)\n */\nexport const DURATION_BUCKETS = [10, 50, 100, 250, 500, 1000, 2500, 5000, 10_000] as const;\n\n// ============ Performance Analysis Duration ============\n\nexport const ANALYSIS_DEFAULTS = {\n /** Default analysis window (1 hour) */\n WINDOW: 3_600_000,\n /** Warmup delay after connection (1 second) */\n WARMUP_DELAY: 1000,\n} as const;\n\n// ============ Unit Conversions ============\n\nexport const TIME_UNITS = {\n /** Milliseconds in a second */\n MS_PER_SECOND: 1000,\n /** Milliseconds in a minute */\n MS_PER_MINUTE: 60_000,\n /** Milliseconds in an hour */\n MS_PER_HOUR: 3_600_000,\n /** Seconds in a minute */\n SECONDS_PER_MINUTE: 60,\n /** Seconds in an hour */\n SECONDS_PER_HOUR: 3600,\n} as const;\n\nexport const SIZE_UNITS = {\n /** Bytes in a kilobyte */\n BYTES_PER_KB: 1024,\n /** Bytes in a megabyte */\n BYTES_PER_MB: 1024 * 1024,\n /** Bytes in a gigabyte */\n BYTES_PER_GB: 1024 * 1024 * 1024,\n} as const;\n","export class DatabaseError extends Error {\n constructor(\n message: string,\n public code?: string,\n public override cause?: Error,\n ) {\n super(message);\n this.name = 'DatabaseError';\n Error.captureStackTrace(this, this.constructor);\n }\n}\n\nexport class DBBridgeError extends DatabaseError {\n constructor(\n message: string,\n public override code?: string,\n public override cause?: Error,\n ) {\n super(message, code, cause);\n this.name = 'DBBridgeError';\n Error.captureStackTrace(this, this.constructor);\n }\n}\n\nexport class ConnectionError extends DBBridgeError {\n constructor(message: string, cause?: Error) {\n super(message, 'CONNECTION_ERROR', cause);\n this.name = 'ConnectionError';\n }\n}\n\nexport class QueryError extends DBBridgeError {\n constructor(\n message: string,\n public sql?: string,\n public params?: unknown[],\n cause?: Error,\n ) {\n super(message, 'QUERY_ERROR', cause);\n this.name = 'QueryError';\n }\n}\n\nexport class TransactionError extends DBBridgeError {\n constructor(\n message: string,\n public transactionId?: string,\n cause?: Error,\n ) {\n super(message, 'TRANSACTION_ERROR', cause);\n this.name = 'TransactionError';\n }\n}\n\nexport class TimeoutError extends DBBridgeError {\n constructor(\n message: string,\n public timeout?: number,\n cause?: Error,\n ) {\n super(message, 'TIMEOUT_ERROR', cause);\n this.name = 'TimeoutError';\n }\n}\n\n/**\n * Thrown when a query exceeds the configured timeout\n */\nexport class QueryTimeoutError extends TimeoutError {\n constructor(\n public sql: string,\n public timeoutMs: number,\n cause?: Error,\n ) {\n super(\n `Query timed out after ${timeoutMs}ms. Consider optimizing the query or increasing queryTimeout.`,\n timeoutMs,\n cause,\n );\n this.name = 'QueryTimeoutError';\n this.code = 'QUERY_TIMEOUT';\n }\n}\n\n/**\n * Thrown when the connection pool is exhausted\n * This happens when:\n * - All connections are busy AND\n * - Queue is full (queueLimit reached) OR\n * - acquireTimeout exceeded\n */\nexport class PoolExhaustedError extends ConnectionError {\n constructor(\n public poolStats: { active: number; waiting: number; max: number },\n public waitTimeMs?: number,\n cause?: Error,\n ) {\n const { active, waiting, max } = poolStats;\n super(\n `Connection pool exhausted: ${active}/${max} connections active, ${waiting} requests waiting. ` +\n `Consider increasing pool.max or reducing load.`,\n cause,\n );\n this.name = 'PoolExhaustedError';\n this.code = 'POOL_EXHAUSTED';\n }\n}\n\nexport class ValidationError extends DBBridgeError {\n constructor(\n message: string,\n public field?: string,\n cause?: Error,\n ) {\n super(message, 'VALIDATION_ERROR', cause);\n this.name = 'ValidationError';\n }\n}\n\nexport class CacheError extends DBBridgeError {\n constructor(\n message: string,\n public key?: string,\n cause?: Error,\n ) {\n super(message, 'CACHE_ERROR', cause);\n this.name = 'CacheError';\n }\n}\n\nexport class NotImplementedError extends DBBridgeError {\n constructor(feature: string) {\n super(`Feature \"${feature}\" is not implemented`, 'NOT_IMPLEMENTED');\n this.name = 'NotImplementedError';\n }\n}\n","import { TimeoutError } from '../errors';\n\nexport interface RetryOptions {\n maxRetries: number;\n retryDelay: number;\n backoffMultiplier?: number;\n maxRetryDelay?: number;\n shouldRetry?: (error: Error) => boolean;\n}\n\nconst DEFAULT_RETRY_OPTIONS: RetryOptions = {\n maxRetries: 3,\n retryDelay: 1000,\n backoffMultiplier: 2,\n maxRetryDelay: 30_000,\n shouldRetry: (error: Error) => {\n const retryableCodes = ['ECONNREFUSED', 'ETIMEDOUT', 'ENOTFOUND', 'ENETUNREACH'];\n return retryableCodes.some((code) => error.message.includes(code));\n },\n};\n\nexport async function retry<T>(\n fn: () => Promise<T>,\n options: Partial<RetryOptions> = {},\n): Promise<T> {\n const opts = { ...DEFAULT_RETRY_OPTIONS, ...options };\n let lastError: Error | undefined;\n let delay = opts.retryDelay;\n\n for (let attempt = 0; attempt <= opts.maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error as Error;\n\n if (attempt === opts.maxRetries || !opts.shouldRetry!(lastError)) {\n throw lastError;\n }\n\n await sleep(delay);\n\n if (opts.backoffMultiplier && opts.backoffMultiplier > 1) {\n delay = Math.min(delay * opts.backoffMultiplier, opts.maxRetryDelay!);\n }\n }\n }\n\n throw lastError;\n}\n\nexport async function withTimeout<T>(\n promise: Promise<T>,\n timeoutMs: number,\n message?: string,\n): Promise<T> {\n let timeoutId: NodeJS.Timeout | undefined;\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => {\n reject(new TimeoutError(message || `Operation timed out after ${timeoutMs}ms`, timeoutMs));\n }, timeoutMs);\n });\n\n try {\n const result = await Promise.race([promise, timeoutPromise]);\n clearTimeout(timeoutId);\n return result;\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import { ValidationError } from '../errors';\n\nimport type { ConnectionConfig } from '../types';\n\nexport function validateConnectionConfig(config: ConnectionConfig): void {\n if (!config) {\n throw new ValidationError('Connection configuration is required');\n }\n\n if (!config.connectionString) {\n if (!config.host) {\n throw new ValidationError('Host is required when connectionString is not provided', 'host');\n }\n\n if (!config.database) {\n throw new ValidationError(\n 'Database name is required when connectionString is not provided',\n 'database',\n );\n }\n }\n\n if (\n config.port !== undefined &&\n (typeof config.port !== 'number' || config.port < 1 || config.port > 65_535)\n ) {\n throw new ValidationError('Port must be a number between 1 and 65535', 'port');\n }\n\n if (config.poolSize && (typeof config.poolSize !== 'number' || config.poolSize < 1)) {\n throw new ValidationError('Pool size must be a positive number', 'poolSize');\n }\n\n if (\n config.connectionTimeout &&\n (typeof config.connectionTimeout !== 'number' || config.connectionTimeout < 0)\n ) {\n throw new ValidationError(\n 'Connection timeout must be a non-negative number',\n 'connectionTimeout',\n );\n }\n\n if (config.idleTimeout && (typeof config.idleTimeout !== 'number' || config.idleTimeout < 0)) {\n throw new ValidationError('Idle timeout must be a non-negative number', 'idleTimeout');\n }\n}\n\nexport function validateSQL(sql: string): void {\n if (!sql || typeof sql !== 'string') {\n throw new ValidationError('SQL query must be a non-empty string');\n }\n\n if (sql.trim().length === 0) {\n throw new ValidationError('SQL query cannot be empty');\n }\n}\n\nexport function validateTableName(tableName: string): void {\n if (!tableName || typeof tableName !== 'string') {\n throw new ValidationError('Table name must be a non-empty string');\n }\n\n const validTableNameRegex = /^[A-Z_a-z]\\w*$/;\n if (!validTableNameRegex.test(tableName)) {\n throw new ValidationError(\n 'Table name must start with a letter or underscore and contain only letters, numbers, and underscores',\n 'tableName',\n );\n }\n}\n\nexport function validateColumnName(columnName: string): void {\n if (!columnName || typeof columnName !== 'string') {\n throw new ValidationError('Column name must be a non-empty string');\n }\n\n const validColumnNameRegex = /^[A-Z_a-z]\\w*$/;\n if (!validColumnNameRegex.test(columnName)) {\n throw new ValidationError(\n 'Column name must start with a letter or underscore and contain only letters, numbers, and underscores',\n 'columnName',\n );\n }\n}\n","import { createHash } from 'node:crypto';\n\nexport function generateCacheKey(sql: string, params?: unknown[], prefix = 'db-bridge'): string {\n const hash = createHash('sha256');\n hash.update(sql);\n\n if (params && params.length > 0) {\n hash.update(JSON.stringify(params));\n }\n\n return `${prefix}:${hash.digest('hex')}`;\n}\n\nexport function parseCacheKey(key: string): { prefix: string; hash: string } | null {\n const parts = key.split(':');\n\n if (parts.length !== 2) {\n return null;\n }\n\n return {\n prefix: parts[0]!,\n hash: parts[1]!,\n };\n}\n\nexport function createCacheKeyPattern(prefix = 'db-bridge', pattern = '*'): string {\n return `${prefix}:${pattern}`;\n}\n\nexport function sanitizeCacheKey(key: string): string {\n return key.replaceAll(/[^\\w:-]/g, '_');\n}\n","export function generateUUID(): string {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replaceAll(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n","/**\n * Compression Utilities\n *\n * Provides compression and decompression for cache entries.\n * Uses zlib for gzip compression.\n */\n\nimport { gzipSync, gunzipSync, constants as zlibConstants } from 'node:zlib';\n\nimport { CACHE_DEFAULTS } from '../constants';\n\n/**\n * Compression options\n */\nexport interface CompressionOptions {\n /** Minimum size in bytes before compression is applied */\n threshold?: number;\n /** Compression level (1-9, higher = more compression) */\n level?: number;\n}\n\nconst DEFAULT_OPTIONS: Required<CompressionOptions> = {\n threshold: CACHE_DEFAULTS.COMPRESSION_THRESHOLD,\n level: zlibConstants.Z_DEFAULT_COMPRESSION,\n};\n\n/**\n * Compress a string if it exceeds the threshold\n */\nexport function compress(data: string, options: CompressionOptions = {}): string {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n // Skip compression for small data\n if (data.length < opts.threshold) {\n return data;\n }\n\n try {\n const buffer = Buffer.from(data, 'utf8');\n const compressed = gzipSync(buffer, { level: opts.level });\n return compressed.toString('base64');\n } catch {\n // Return original data if compression fails\n return data;\n }\n}\n\n/**\n * Decompress a string if it was compressed\n */\nexport function decompress(data: string): string {\n if (!isCompressed(data)) {\n return data;\n }\n\n try {\n const buffer = Buffer.from(data, 'base64');\n const decompressed = gunzipSync(buffer);\n return decompressed.toString('utf8');\n } catch {\n // Return original data if decompression fails\n return data;\n }\n}\n\n/**\n * Check if data appears to be gzip compressed (base64 encoded)\n */\nexport function isCompressed(data: string): boolean {\n if (data.length < 4) {\n return false;\n }\n\n try {\n // Check if it's valid base64 and starts with gzip magic bytes\n const buffer = Buffer.from(data.slice(0, 4), 'base64');\n return buffer[0] === 0x1f && buffer[1] === 0x8b;\n } catch {\n return false;\n }\n}\n\n/**\n * Get compression ratio (original size / compressed size)\n */\nexport function getCompressionRatio(original: string, compressed: string): number {\n if (original.length === 0) {\n return 1;\n }\n return original.length / compressed.length;\n}\n\n/**\n * Estimate if compression would be beneficial\n */\nexport function shouldCompress(\n data: string,\n threshold = CACHE_DEFAULTS.COMPRESSION_THRESHOLD,\n): boolean {\n // Don't compress small data\n if (data.length < threshold) {\n return false;\n }\n\n // Check for repetitive patterns that compress well\n const uniqueChars = new Set(data).size;\n const repetitionRatio = data.length / uniqueChars;\n\n // Compress if data has good repetition ratio (> 3)\n return repetitionRatio > 3;\n}\n","import { EventEmitter } from 'eventemitter3';\n\nimport { NotImplementedError, ConnectionError, QueryError } from './errors';\nimport {\n validateConnectionConfig,\n validateSQL,\n retry,\n withTimeout,\n generateCacheKey,\n} from './utils';\n\nimport type { CryptoProvider } from './crypto/crypto';\nimport type { DatabaseAdapter, CacheAdapter } from './interfaces';\nimport type {\n ConnectionConfig,\n QueryResult,\n QueryOptions,\n QueryParams,\n Transaction,\n TransactionOptions,\n PreparedStatement,\n PoolStats,\n Logger,\n} from './types';\n\nexport interface BaseAdapterOptions {\n logger?: Logger;\n cache?: CacheAdapter;\n crypto?: CryptoProvider;\n retryOptions?: {\n maxRetries?: number;\n retryDelay?: number;\n };\n}\n\nexport abstract class BaseAdapter extends EventEmitter implements DatabaseAdapter {\n protected config?: ConnectionConfig;\n protected logger?: Logger;\n protected cache?: CacheAdapter;\n protected crypto?: CryptoProvider;\n protected _isConnected = false;\n protected retryOptions = {\n maxRetries: 3,\n retryDelay: 1000,\n };\n\n abstract readonly name: string;\n abstract readonly version: string;\n\n get isConnected(): boolean {\n return this._isConnected;\n }\n\n constructor(options: BaseAdapterOptions = {}) {\n super();\n if (options.logger) {\n this.logger = options.logger;\n }\n if (options.cache) {\n this.cache = options.cache;\n }\n if (options.crypto) {\n this.crypto = options.crypto;\n }\n if (options.retryOptions) {\n this.retryOptions = { ...this.retryOptions, ...options.retryOptions };\n }\n }\n\n async connect(config: ConnectionConfig): Promise<void> {\n validateConnectionConfig(config);\n this.config = config;\n\n try {\n await retry(\n async () => {\n await this.doConnect(config);\n this._isConnected = true;\n this.emit('connect', { config });\n },\n {\n maxRetries: this.retryOptions.maxRetries,\n retryDelay: this.retryOptions.retryDelay,\n },\n );\n } catch (error) {\n throw new ConnectionError('Failed to connect to database', error as Error);\n }\n }\n\n async disconnect(): Promise<void> {\n if (!this._isConnected) {\n return;\n }\n\n try {\n await this.doDisconnect();\n this._isConnected = false;\n this.emit('disconnect');\n } catch (error) {\n throw new ConnectionError('Failed to disconnect from database', error as Error);\n }\n }\n\n async query<T = unknown>(\n sql: string,\n params?: QueryParams,\n options: QueryOptions = {},\n ): Promise<QueryResult<T>> {\n validateSQL(sql);\n\n if (!this._isConnected) {\n throw new ConnectionError('Not connected to database');\n }\n\n const startTime = Date.now();\n\n try {\n let result: QueryResult<T>;\n\n if (options.cache && this.cache) {\n const cacheKey = this.getCacheKey(sql, params, options.cache);\n const cachedResult = await this.cache.get<QueryResult<T>>(cacheKey);\n\n if (cachedResult) {\n this.logger?.debug('Cache hit', { key: cacheKey });\n this.emit('cacheHit', { key: cacheKey, sql });\n return cachedResult;\n }\n\n this.logger?.debug('Cache miss', { key: cacheKey });\n this.emit('cacheMiss', { key: cacheKey, sql });\n }\n\n const queryPromise = this.doQuery<T>(sql, params, options);\n\n if (options.timeout) {\n result = await withTimeout(\n queryPromise,\n options.timeout,\n `Query timed out after ${options.timeout}ms`,\n );\n } else {\n result = await queryPromise;\n }\n\n result.duration = Date.now() - startTime;\n\n if (options.cache && this.cache) {\n const cacheKey = this.getCacheKey(sql, params, options.cache);\n const ttl = typeof options.cache === 'object' ? options.cache.ttl : undefined;\n await this.cache.set(cacheKey, result, ttl);\n this.logger?.debug('Cached query result', { key: cacheKey, ttl });\n }\n\n this.emit('query', { sql, params, duration: result.duration, rowCount: result.rowCount });\n return result;\n } catch (error) {\n const duration = Date.now() - startTime;\n this.emit('queryError', { sql, params, error, duration });\n throw new QueryError(\n `Query failed: ${(error as Error).message}`,\n sql,\n params as unknown[],\n error as Error,\n );\n }\n }\n\n async execute<T = unknown>(\n sql: string,\n params?: QueryParams,\n options?: QueryOptions,\n ): Promise<QueryResult<T>> {\n return this.query<T>(sql, params, { ...options, cache: false });\n }\n\n /**\n * Execute a batch of queries with different parameter sets\n * Industry-standard batch operations for bulk inserts/updates\n */\n async executeBatch<T = unknown>(\n sql: string,\n paramSets: QueryParams[],\n options?: QueryOptions,\n ): Promise<QueryResult<T>[]> {\n if (!this._isConnected) {\n throw new ConnectionError('Not connected to database');\n }\n\n const results: QueryResult<T>[] = [];\n const startTime = Date.now();\n\n try {\n for (const params of paramSets) {\n const result = await this.execute<T>(sql, params, options);\n results.push(result);\n }\n\n const duration = Date.now() - startTime;\n this.emit('batchExecute', { sql, batchSize: paramSets.length, duration });\n\n return results;\n } catch (error) {\n const duration = Date.now() - startTime;\n this.emit('batchError', { sql, error, duration });\n throw new QueryError(\n `Batch execution failed: ${(error as Error).message}`,\n sql,\n [],\n error as Error,\n );\n }\n }\n\n async prepare<T = unknown>(_sql: string, _name?: string): Promise<PreparedStatement<T>> {\n throw new NotImplementedError('prepare');\n }\n\n async beginTransaction(_options?: TransactionOptions): Promise<Transaction> {\n throw new NotImplementedError('beginTransaction');\n }\n\n getPoolStats(): PoolStats {\n throw new NotImplementedError('getPoolStats');\n }\n\n async ping(): Promise<boolean> {\n try {\n await this.query('SELECT 1');\n return true;\n } catch {\n return false;\n }\n }\n\n escape(_value: unknown): string {\n throw new NotImplementedError('escape');\n }\n\n escapeIdentifier(_identifier: string): string {\n throw new NotImplementedError('escapeIdentifier');\n }\n\n abstract createQueryBuilder<T = unknown>(): import('./interfaces').QueryBuilder<T>;\n\n protected abstract doConnect(config: ConnectionConfig): Promise<void>;\n protected abstract doDisconnect(): Promise<void>;\n protected abstract doQuery<T = unknown>(\n sql: string,\n params?: QueryParams,\n options?: QueryOptions,\n ): Promise<QueryResult<T>>;\n\n private getCacheKey(\n sql: string,\n params?: QueryParams,\n cacheOptions?: boolean | CacheOptions,\n ): string {\n if (typeof cacheOptions === 'object' && cacheOptions.key) {\n return cacheOptions.key;\n }\n\n const paramsArray = Array.isArray(params) ? params : params ? Object.values(params) : undefined;\n return generateCacheKey(sql, paramsArray);\n }\n}\n\ntype CacheOptions = {\n ttl?: number;\n key?: string;\n invalidateOn?: string[];\n compress?: boolean;\n};\n","/**\n * Date Filter Trait\n *\n * Provides date-related WHERE clause methods for query builders.\n * Used by BaseQueryBuilder via composition.\n */\n\nimport { validateColumnName } from '../utils';\n\nimport type { WhereClause } from './query-builder-types';\n\nexport interface DateFilterContext {\n bindings: unknown[];\n whereClauses: WhereClause[];\n escapeIdentifierFn: (identifier: string) => string;\n parameterPlaceholderFn: (index: number) => string;\n}\n\n/**\n * Add a date comparison WHERE clause\n */\nexport function whereDate(\n ctx: DateFilterContext,\n column: string,\n operator: string,\n date: Date | string,\n): void {\n validateColumnName(column);\n const dateValue = date instanceof Date ? date.toISOString().split('T')[0] : date;\n const placeholder = ctx.parameterPlaceholderFn(ctx.bindings.length + 1);\n\n ctx.whereClauses.push({\n type: 'AND',\n condition: `DATE(${ctx.escapeIdentifierFn(column)}) ${operator} ${placeholder}`,\n bindings: [dateValue],\n });\n ctx.bindings.push(dateValue);\n}\n\n/**\n * Add a year comparison WHERE clause\n */\nexport function whereYear(\n ctx: DateFilterContext,\n column: string,\n operator: string,\n year: number,\n): void {\n validateColumnName(column);\n const placeholder = ctx.parameterPlaceholderFn(ctx.bindings.length + 1);\n\n ctx.whereClauses.push({\n type: 'AND',\n condition: `YEAR(${ctx.escapeIdentifierFn(column)}) ${operator} ${placeholder}`,\n bindings: [year],\n });\n ctx.bindings.push(year);\n}\n\n/**\n * Add a month comparison WHERE clause\n */\nexport function whereMonth(\n ctx: DateFilterContext,\n column: string,\n operator: string,\n month: number,\n): void {\n validateColumnName(column);\n const placeholder = ctx.parameterPlaceholderFn(ctx.bindings.length + 1);\n\n ctx.whereClauses.push({\n type: 'AND',\n condition: `MONTH(${ctx.escapeIdentifierFn(column)}) ${operator} ${placeholder}`,\n bindings: [month],\n });\n ctx.bindings.push(month);\n}\n\n/**\n * Add a day comparison WHERE clause\n */\nexport function whereDay(\n ctx: DateFilterContext,\n column: string,\n operator: string,\n day: number,\n): void {\n validateColumnName(column);\n const placeholder = ctx.parameterPlaceholderFn(ctx.bindings.length + 1);\n\n ctx.whereClauses.push({\n type: 'AND',\n condition: `DAY(${ctx.escapeIdentifierFn(column)}) ${operator} ${placeholder}`,\n bindings: [day],\n });\n ctx.bindings.push(day);\n}\n\n/**\n * Add a WHERE clause for today's date\n */\nexport function whereToday(ctx: DateFilterContext, column: string): void {\n const today = new Date().toISOString().split('T')[0]!;\n whereDate(ctx, column, '=', today);\n}\n\n/**\n * Add a WHERE clause for yesterday's date\n */\nexport function whereYesterday(ctx: DateFilterContext, column: string): void {\n const yesterday = new Date();\n yesterday.setDate(yesterday.getDate() - 1);\n whereDate(ctx, column, '=', yesterday.toISOString().split('T')[0]!);\n}\n\n/**\n * Add a WHERE clause for a date range\n */\nexport function whereBetweenDates(\n ctx: DateFilterContext,\n column: string,\n startDate: Date | string,\n endDate: Date | string,\n): void {\n validateColumnName(column);\n const start = startDate instanceof Date ? startDate.toISOString().split('T')[0] : startDate;\n const end = endDate instanceof Date ? endDate.toISOString().split('T')[0] : endDate;\n\n const startPlaceholder = ctx.parameterPlaceholderFn(ctx.bindings.length + 1);\n const endPlaceholder = ctx.parameterPlaceholderFn(ctx.bindings.length + 2);\n\n ctx.whereClauses.push({\n type: 'AND',\n condition: `DATE(${ctx.escapeIdentifierFn(column)}) BETWEEN ${startPlaceholder} AND ${endPlaceholder}`,\n bindings: [start, end],\n });\n ctx.bindings.push(start, end);\n}\n\n/**\n * Add a WHERE clause for the last N days\n */\nexport function whereLastDays(ctx: DateFilterContext, column: string, days: number): void {\n validateColumnName(column);\n const placeholder = ctx.parameterPlaceholderFn(ctx.bindings.length + 1);\n\n ctx.whereClauses.push({\n type: 'AND',\n condition: `${ctx.escapeIdentifierFn(column)} >= DATE_SUB(CURDATE(), INTERVAL ${placeholder} DAY)`,\n bindings: [days],\n });\n ctx.bindings.push(days);\n}\n","/**\n * Base Query Builder\n *\n * Core query building functionality with modular organization.\n * Extended features are implemented via composition pattern.\n *\n * Related modules:\n * @see query-builder/date-filter-trait.ts - Date filter functions\n * @see query-builder/aggregate-trait.ts - Aggregate functions\n * @see query-builder/pagination-trait.ts - Pagination functions\n * @see query-builder/encryption-trait.ts - Encryption/decryption functions\n */\n\nimport { ValidationError } from './errors';\nimport * as dateFilterTrait from './query-builder/date-filter-trait';\nimport { validateTableName, validateColumnName } from './utils';\n\nimport type { CryptoProvider } from './crypto/crypto';\nimport type {\n QueryBuilder,\n DatabaseAdapter,\n PaginationResult,\n CursorPaginationResult,\n} from './interfaces';\nimport type {\n QueryBuilderOptions,\n WhereClause,\n JoinClause,\n} from './query-builder/query-builder-types';\nimport type { QueryResult, QueryOptions, QueryParams } from './types';\n\n// Import and re-export types for backward compatibility\n\n/**\n * Base Query Builder - Full-featured query builder\n *\n * Methods are organized into logical sections:\n * - Selection: select, from, table, distinct\n * - Joins: join, innerJoin, leftJoin, rightJoin, fullJoin\n * - Where clauses: where, orWhere, whereIn, whereNotIn, etc.\n * - Date filters: whereDate, whereToday, whereLastDays, etc.\n * - Grouping & Ordering: groupBy, having, orderBy, limit, offset\n * - Aggregates: count, sum, avg, min, max, exists\n * - Pagination: paginate, cursorPaginate, chunk\n * - Utilities: pluck, value, first, firstOrFail, sole\n * - CRUD: insert, update, delete\n * - Execution: execute, toSQL\n */\nexport abstract class BaseQueryBuilder<T = unknown> implements QueryBuilder<T> {\n protected adapter: DatabaseAdapter;\n protected escapeIdentifierFn: (identifier: string) => string;\n protected parameterPlaceholderFn: (index: number) => string;\n protected crypto?: CryptoProvider;\n protected encryptedFields: Set<string> = new Set();\n protected decryptedFields: Set<string> = new Set();\n\n // Query state\n protected selectColumns: string[] = ['*'];\n protected fromTable?: string;\n protected fromAlias?: string;\n protected joins: JoinClause[] = [];\n protected whereClauses: WhereClause[] = [];\n protected groupByColumns: string[] = [];\n protected havingClause?: string;\n protected orderByColumns: Array<{ column: string; direction: 'ASC' | 'DESC' }> = [];\n protected limitValue?: number;\n protected offsetValue?: number;\n protected bindings: unknown[] = [];\n protected isDistinct = false;\n\n // CRUD state\n protected insertTable?: string;\n protected insertData?: Record<string, unknown> | Record<string, unknown>[];\n protected updateTable?: string;\n protected updateData?: Record<string, unknown>;\n protected deleteTable?: string;\n\n // Raw SQL\n protected rawSql?: string;\n protected rawBindings?: unknown[];\n\n constructor(options: QueryBuilderOptions) {\n this.adapter = options.adapter;\n this.escapeIdentifierFn = options.escapeIdentifier || ((id) => `\"${id}\"`);\n this.parameterPlaceholderFn = options.parameterPlaceholder || ((index) => `$${index}`);\n this.crypto = options.crypto;\n }\n\n // ============================================\n // SELECTION\n // ============================================\n\n select(...columns: string[]): QueryBuilder<T>;\n select(columns: string[]): QueryBuilder<T>;\n select(...args: Array<string | string[]>): QueryBuilder<T> {\n let cols: string[] = [];\n\n if (args.length === 1 && Array.isArray(args[0])) {\n cols = args[0];\n } else {\n cols = args.filter((arg) => typeof arg === 'string');\n }\n\n if (cols.length === 0) {\n this.selectColumns = ['*'];\n } else {\n this.selectColumns = cols\n .filter((col) => col && typeof col === 'string')\n .map((col) => {\n if (col === '*' || col.includes('.') || col.includes(' as ') || col.includes(' AS ')) {\n return col;\n }\n validateColumnName(col);\n return col;\n });\n }\n return this;\n }\n\n from(table: string, alias?: string): QueryBuilder<T> {\n validateTableName(table);\n this.fromTable = table;\n if (alias !== undefined) {\n this.fromAlias = alias;\n }\n return this;\n }\n\n table(table: string, alias?: string): QueryBuilder<T> {\n return this.from(table, alias);\n }\n\n distinct(): QueryBuilder<T> {\n this.isDistinct = true;\n return this;\n }\n\n // ============================================\n // JOINS\n // ============================================\n\n join(\n table: string,\n on: string,\n type: 'INNER' | 'LEFT' | 'RIGHT' | 'FULL' = 'INNER',\n ): QueryBuilder<T> {\n const tableName = table.split(' ')[0];\n if (tableName) {\n validateTableName(tableName);\n }\n this.joins.push({ type, table, on });\n return this;\n }\n\n innerJoin(table: string, on: string): QueryBuilder<T> {\n return this.join(table, on, 'INNER');\n }\n\n leftJoin(table: string, on: string): QueryBuilder<T> {\n return this.join(table, on, 'LEFT');\n }\n\n rightJoin(table: string, on: string): QueryBuilder<T> {\n return this.join(table, on, 'RIGHT');\n }\n\n fullJoin(table: string, on: string): QueryBuilder<T> {\n return this.join(table, on, 'FULL');\n }\n\n // ============================================\n // WHERE CLAUSES\n // ============================================\n\n where(\n condition: string | Record<string, unknown>,\n operator?: string,\n value?: unknown,\n ): QueryBuilder<T>;\n where(column: string, operator: string, value: unknown): QueryBuilder<T>;\n where(...args: Array<string | Record<string, unknown> | undefined>): QueryBuilder<T> {\n switch (args.length) {\n case 3: {\n const [column, operator, value] = args;\n this.addWhereClause('AND', column as string, operator as string, value);\n\n break;\n }\n case 2: {\n const [condition, operator = '='] = args;\n this.addWhereClause(\n 'AND',\n condition as string | Record<string, unknown>,\n operator as string,\n );\n\n break;\n }\n case 1: {\n const [condition] = args;\n this.addWhereClause('AND', condition as string | Record<string, unknown>, '=');\n\n break;\n }\n // No default\n }\n return this;\n }\n\n orWhere(\n condition: string | Record<string, unknown>,\n operator?: string,\n value?: unknown,\n ): QueryBuilder<T>;\n orWhere(column: string, operator: string, value: unknown): QueryBuilder<T>;\n orWhere(...args: Array<string | Record<string, unknown> | undefined>): QueryBuilder<T> {\n switch (args.length) {\n case 3: {\n const [column, operator, value] = args;\n this.addWhereClause('OR', column as string, operator as string, value);\n\n break;\n }\n case 2: {\n const [condition, operator = '='] = args;\n this.addWhereClause(\n 'OR',\n condition as string | Record<string, unknown>,\n operator as string,\n );\n\n break;\n }\n case 1: {\n const [condition] = args;\n this.addWhereClause('OR', condition as string | Record<string, unknown>, '=');\n\n break;\n }\n // No default\n }\n return this;\n }\n\n whereIn(column: string, values: unknown[]): QueryBuilder<T> {\n validateColumnName(column);\n if (values.length === 0) {\n throw new ValidationError('whereIn requires at least one value');\n }\n\n const placeholders = values\n .map((_, index) => this.parameterPlaceholderFn(this.bindings.length + index + 1))\n .join(', ');\n\n this.whereClauses.push({\n type: 'AND',\n condition: `${this.escapeIdentifierFn(column)} IN (${placeholders})`,\n bindings: values,\n });\n this.bindings.push(...values);\n return this;\n }\n\n whereNotIn(column: string, values: unknown[]): QueryBuilder<T> {\n validateColumnName(column);\n if (values.length === 0) {\n throw new ValidationError('whereNotIn requires at least one value');\n }\n\n const placeholders = values\n .map((_, index) => this.parameterPlaceholderFn(this.bindings.length + index + 1))\n .join(', ');\n\n this.whereClauses.push({\n type: 'AND',\n condition: `${this.escapeIdentifierFn(column)} NOT IN (${placeholders})`,\n bindings: values,\n });\n this.bindings.push(...values);\n return this;\n }\n\n whereBetween(column: string, min: unknown, max: unknown): QueryBuilder<T> {\n validateColumnName(column);\n\n const minPlaceholder = this.parameterPlaceholderFn(this.bindings.length + 1);\n const maxPlaceholder = this.parameterPlaceholderFn(this.bindings.length + 2);\n\n this.whereClauses.push({\n type: 'AND',\n condition: `${this.escapeIdentifierFn(column)} BETWEEN ${minPlaceholder} AND ${maxPlaceholder}`,\n bindings: [min, max],\n });\n this.bindings.push(min, max);\n return this;\n }\n\n whereNull(column: string): QueryBuilder<T> {\n validateColumnName(column);\n this.whereClauses.push({\n type: 'AND',\n condition: `${this.escapeIdentifierFn(column)} IS NULL`,\n bindings: [],\n });\n return this;\n }\n\n whereNotNull(column: string): QueryBuilder<T> {\n validateColumnName(column);\n this.whereClauses.push({\n type: 'AND',\n condition: `${this.escapeIdentifierFn(column)} IS NOT NULL`,\n bindings: [],\n });\n return this;\n }\n\n // ============================================\n // DATE FILTERS (delegated to date-filter-trait)\n // ============================================\n\n whereDate(column: string, operator: string, date: Date | string): QueryBuilder<T> {\n dateFilterTrait.whereDate(this.getDateFilterContext(), column, operator, date);\n return this;\n }\n\n whereYear(column: string, operator: string, year: number): QueryBuilder<T> {\n dateFilterTrait.whereYear(this.getDateFilterContext(), column, operator, year);\n return this;\n }\n\n whereMonth(column: string, operator: string, month: number): QueryBuilder<T> {\n dateFilterTrait.whereMonth(this.getDateFilterContext(), column, operator, month);\n return this;\n }\n\n whereDay(column: string, operator: string, day: number): QueryBuilder<T> {\n dateFilterTrait.whereDay(this.getDateFilterContext(), column, operator, day);\n return this;\n }\n\n whereToday(column: string): QueryBuilder<T> {\n dateFilterTrait.whereToday(this.getDateFilterContext(), column);\n return this;\n }\n\n whereYesterday(column: string): QueryBuilder<T> {\n dateFilterTrait.whereYesterday(this.getDateFilterContext(), column);\n return this;\n }\n\n whereBetweenDates(\n column: string,\n startDate: Date | string,\n endDate: Date | string,\n ): QueryBuilder<T> {\n dateFilterTrait.whereBetweenDates(this.getDateFilterContext(), column, startDate, endDate);\n return this;\n }\n\n whereLastDays(column: string, days: number): QueryBuilder<T> {\n dateFilterTrait.whereLastDays(this.getDateFilterContext(), column, days);\n return this;\n }\n\n private getDateFilterContext(): dateFilterTrait.DateFilterContext {\n return {\n bindings: this.bindings,\n whereClauses: this.whereClauses,\n escapeIdentifierFn: this.escapeIdentifierFn,\n parameterPlaceholderFn: this.parameterPlaceholderFn,\n };\n }\n\n // ============================================\n // GROUPING & ORDERING\n // ============================================\n\n groupBy(...columns: string[]): QueryBuilder<T> {\n columns.forEach((col) => validateColumnName(col));\n this.groupByColumns = columns;\n return this;\n }\n\n having(condition: string): QueryBuilder<T> {\n this.havingClause = condition;\n return this;\n }\n\n orderBy(column: string, direction: 'ASC' | 'DESC' = 'ASC'): QueryBuilder<T> {\n validateColumnName(column);\n this.orderByColumns.push({ column, direction });\n return this;\n }\n\n limit(limit: number): QueryBuilder<T> {\n if (limit < 0) {\n throw new ValidationError('Limit must be non-negative');\n }\n this.limitValue = limit;\n return this;\n }\n\n offset(offset: number): QueryBuilder<T> {\n if (offset < 0) {\n throw new ValidationError('Offset must be non-negative');\n }\n this.offsetValue = offset;\n return this;\n }\n\n // ============================================\n // AGGREGATES\n // ============================================\n\n async count(column = '*', options?: QueryOptions): Promise<number> {\n const originalSelect = this.selectColumns;\n this.selectColumns = [`COUNT(${column}) as count`];\n\n try {\n const result = await this.execute(options);\n const row = result.rows[0] as { count: string | number } | undefined;\n return row ? Number(row.count) : 0;\n } finally {\n this.selectColumns = originalSelect;\n }\n }\n\n async sum(column: string, options?: QueryOptions): Promise<number> {\n validateColumnName(column);\n const originalSelect = this.selectColumns;\n this.selectColumns = [`SUM(${this.escapeIdentifierFn(column)}) as aggregate`];\n\n try {\n const result = await this.execute(options);\n const row = result.rows[0] as { aggregate: string | number | null } | undefined;\n return row?.aggregate ? Number(row.aggregate) : 0;\n } finally {\n this.selectColumns = originalSelect;\n }\n }\n\n async avg(column: string, options?: QueryOptions): Promise<number> {\n validateColumnName(column);\n const originalSelect = this.selectColumns;\n this.selectColumns = [`AVG(${this.escapeIdentifierFn(column)}) as aggregate`];\n\n try {\n const result = await this.execute(options);\n const row = result.rows[0] as { aggregate: string | number | null } | undefined;\n return row?.aggregate ? Number(row.aggregate) : 0;\n } finally {\n this.selectColumns = originalSelect;\n }\n }\n\n async min(column: string, options?: QueryOptions): Promise<number | null> {\n validateColumnName(column);\n const originalSelect = this.selectColumns;\n this.selectColumns = [`MIN(${this.escapeIdentifierFn(column)}) as aggregate`];\n\n try {\n const result = await this.execute(options);\n const row = result.rows[0] as { aggregate: string | number | null } | undefined;\n if (row?.aggregate === null || row?.aggregate === undefined) {\n return null;\n }\n return Number(row.aggregate);\n } finally {\n this.selectColumns = originalSelect;\n }\n }\n\n async max(column: string, options?: QueryOptions): Promise<number | null> {\n validateColumnName(column);\n const originalSelect = this.selectColumns;\n this.selectColumns = [`MAX(${this.escapeIdentifierFn(column)}) as aggregate`];\n\n try {\n const result = await this.execute(options);\n const row = result.rows[0] as { aggregate: string | number | null } | undefined;\n if (row?.aggregate === null || row?.aggregate === undefined) {\n return null;\n }\n return Number(row.aggregate);\n } finally {\n this.selectColumns = originalSelect;\n }\n }\n\n async exists(options?: QueryOptions): Promise<boolean> {\n const count = await this.count('*', options);\n return count > 0;\n }\n\n // ============================================\n // PAGINATION\n // ============================================\n\n async paginate(\n page: number = 1,\n perPage: number = 15,\n options?: QueryOptions,\n ): Promise<PaginationResult<T>> {\n if (page < 1) {\n page = 1;\n }\n if (perPage < 1) {\n perPage = 15;\n }\n\n // Get total count\n const total = await this.count('*', options);\n\n // Calculate pagination\n const totalPages = Math.ceil(total / perPage);\n const offset = (page - 1) * perPage;\n\n // Get paginated data\n this.limitValue = perPage;\n this.offsetValue = offset;\n const result = await this.execute(options);\n\n const from = total > 0 ? offset + 1 : 0;\n const to = Math.min(offset + perPage, total);\n\n return {\n data: result.rows,\n pagination: {\n page,\n perPage,\n total,\n totalPages,\n hasMore: page < totalPages,\n from,\n to,\n },\n };\n }\n\n async cursorPaginate(\n cursorColumn: string,\n cursor: number | string | null = null,\n limit: number = 20,\n options?: QueryOptions,\n ): Promise<CursorPaginationResult<T>> {\n validateColumnName(cursorColumn);\n\n if (cursor !== null) {\n this.where(cursorColumn, '>', cursor);\n }\n\n this.orderBy(cursorColumn, 'ASC');\n this.limitValue = limit + 1;\n\n const result = await this.execute(options);\n const hasMore = result.rows.length > limit;\n const data = hasMore ? result.rows.slice(0, limit) : result.rows;\n\n const lastItem = data.at(-1) as Record<string, unknown> | undefined;\n const nextCursor = hasMore && lastItem ? (lastItem[cursorColumn] as number | string) : null;\n\n return {\n data,\n nextCursor,\n hasMore,\n };\n }\n\n async chunk(\n size: number,\n callback: (items: T[], page: number) => Promise<void | false>,\n options?: QueryOptions,\n ): Promise<void> {\n let page = 1;\n let hasMore = true;\n\n while (hasMore) {\n const result = await this.paginate(page, size, options);\n\n if (result.data.length === 0) {\n break;\n }\n\n const shouldContinue = await callback(result.data, page);\n\n if (shouldContinue === false) {\n break;\n }\n\n hasMore = result.pagination.hasMore;\n page++;\n }\n }\n\n // ============================================\n // UTILITIES\n // ============================================\n\n async first(options?: QueryOptions): Promise<T | null> {\n this.limit(1);\n const result = await this.execute(options);\n return result.rows[0] || null;\n }\n\n async pluck<K = unknown>(column: string, options?: QueryOptions): Promise<K[]> {\n validateColumnName(column);\n const originalSelect = this.selectColumns;\n this.selectColumns = [column];\n\n try {\n const result = await this.execute(options);\n return result.rows\n .map((row: unknown) => (row as Record<string, K>)[column])\n .filter((val): val is K => val !== undefined);\n } finally {\n this.selectColumns = originalSelect;\n }\n }\n\n async value<K = unknown>(column: string, options?: QueryOptions): Promise<K | null> {\n validateColumnName(column);\n const originalSelect = this.selectColumns;\n this.selectColumns = [column];\n this.limitValue = 1;\n\n try {\n const result = await this.execute(options);\n const row = result.rows[0] as Record<string, K> | undefined;\n if (!row) {\n return null;\n }\n const val = row[column];\n return val === undefined ? null : val;\n } finally {\n this.selectColumns = originalSelect;\n }\n }\n\n // ============================================\n // CRUD OPERATIONS\n // ============================================\n\n insert(\n table: string,\n data: Record<string, unknown> | Record<string, unknown>[],\n ): QueryBuilder<T> {\n validateTableName(table);\n this.insertTable = table;\n this.insertData = this.processDataForEncryption(data);\n return this;\n }\n\n update(table: string, data: Record<string, unknown>): QueryBuilder<T> {\n validateTableName(table);\n this.updateTable = table;\n this.updateData = this.processDataForEncryption(data) as Record<string, unknown>;\n return this;\n }\n\n delete(table: string): QueryBuilder<T> {\n validateTableName(table);\n this.deleteTable = table;\n return this;\n }\n\n // ============================================\n // RAW SQL\n // ============================================\n\n raw(sql: string, bindings?: unknown[]): QueryBuilder<T> {\n this.rawSql = sql;\n if (bindings !== undefined) {\n this.rawBindings = bindings;\n }\n return this;\n }\n\n // ============================================\n // ENCRYPTION\n // ============================================\n\n encrypt(...fields: string[]): QueryBuilder<T> {\n fields.forEach((field) => this.encryptedFields.add(field));\n return this;\n }\n\n decrypt(...fields: string[]): QueryBuilder<T> {\n fields.forEach((field) => this.decryptedFields.add(field));\n return this;\n }\n\n // ============================================\n // SQL GENERATION\n // ============================================\n\n toSQL(): { sql: string; bindings: unknown[] } {\n if (this.rawSql) {\n return { sql: this.rawSql, bindings: this.rawBindings || [] };\n }\n\n if (this.insertTable) {\n return this.buildInsertSQL();\n }\n\n if (this.updateTable) {\n return this.buildUpdateSQL();\n }\n\n if (this.deleteTable) {\n return this.buildDeleteSQL();\n }\n\n return this.buildSelectSQL();\n }\n\n // ============================================\n // EXECUTION\n // ============================================\n\n async execute(options?: QueryOptions): Promise<QueryResult<T>> {\n const { sql, bindings } = this.toSQL();\n const result = await this.adapter.query<T>(sql, bindings as QueryParams, options);\n return this.processResultsForDecryption(result);\n }\n\n // ============================================\n // PROTECTED HELPERS\n // ============================================\n\n protected addWhereClause(\n type: 'AND' | 'OR',\n condition: string | Record<string, unknown>,\n operator: string,\n value?: unknown,\n ): void {\n if (value !== undefined) {\n validateColumnName(condition as string);\n const placeholder = this.parameterPlaceholderFn(this.bindings.length + 1);\n\n this.whereClauses.push({\n type,\n condition: `${this.escapeIdentifierFn(condition as string)} ${operator} ${placeholder}`,\n bindings: [value],\n });\n this.bindings.push(value);\n } else if (typeof condition === 'string') {\n this.whereClauses.push({\n type,\n condition,\n bindings: [],\n });\n } else {\n Object.entries(condition).forEach(([key, val]) => {\n validateColumnName(key);\n const placeholder = this.parameterPlaceholderFn(this.bindings.length + 1);\n\n this.whereClauses.push({\n type,\n condition: `${this.escapeIdentifierFn(key)} ${operator} ${placeholder}`,\n bindings: [val],\n });\n this.bindings.push(val);\n });\n }\n }\n\n protected processDataForEncryption(\n data: Record<string, unknown> | Record<string, unknown>[],\n ): Record<string, unknown> | Record<string, unknown>[] {\n if (!this.crypto || this.encryptedFields.size === 0) {\n return data;\n }\n\n if (Array.isArray(data)) {\n return data.map((row) => this.encryptRow(row));\n }\n return this.encryptRow(data);\n }\n\n protected encryptRow(row: Record<string, unknown>): Record<string, unknown> {\n if (!this.crypto) {\n return row;\n }\n\n const encryptedRow = { ...row };\n this.encryptedFields.forEach((field) => {\n if (field in encryptedRow) {\n encryptedRow[field] = this.crypto!.encryptField(encryptedRow[field]);\n }\n });\n return encryptedRow;\n }\n\n protected async processResultsForDecryption(result: QueryResult<T>): Promise<QueryResult<T>> {\n if (!this.crypto || this.decryptedFields.size === 0) {\n return result;\n }\n\n const decryptedRows = result.rows.map((row) => {\n const decryptedRow = { ...row } as Record<string, unknown>;\n this.decryptedFields.forEach((field) => {\n if (field in decryptedRow && decryptedRow[field]) {\n try {\n const value = decryptedRow[field];\n if (typeof value === 'string') {\n decryptedRow[field] = this.crypto!.decryptField(value);\n }\n } catch {\n // If decryption fails, leave the value as is\n }\n }\n });\n return decryptedRow as T;\n });\n\n return {\n ...result,\n rows: decryptedRows,\n };\n }\n\n // ============================================\n // SQL BUILDERS (Abstract - to be implemented by dialects)\n // ============================================\n\n protected abstract buildSelectSQL(): { sql: string; bindings: unknown[] };\n protected abstract buildInsertSQL(): { sql: string; bindings: unknown[] };\n protected abstract buildUpdateSQL(): { sql: string; bindings: unknown[] };\n protected abstract buildDeleteSQL(): { sql: string; bindings: unknown[] };\n}\n\nexport {\n type QueryBuilderOptions,\n type JoinClause,\n type WhereClause,\n} from './query-builder/query-builder-types';\n","/**\n * Query Builder Types and Interfaces\n *\n * Shared types used by BaseQueryBuilder and its traits.\n */\n\nimport type { CryptoProvider } from '../crypto/crypto';\nimport type { DatabaseAdapter } from '../interfaces';\n\nexport interface QueryBuilderOptions {\n adapter: DatabaseAdapter;\n escapeIdentifier?: (identifier: string) => string;\n parameterPlaceholder?: (index: number) => string;\n crypto?: CryptoProvider;\n}\n\nexport interface WhereClause {\n type: 'AND' | 'OR';\n condition: string;\n bindings: unknown[];\n}\n\nexport interface JoinClause {\n type: 'INNER' | 'LEFT' | 'RIGHT' | 'FULL';\n table: string;\n on: string;\n}\n\nexport interface OrderByClause {\n column: string;\n direction: 'ASC' | 'DESC';\n}\n\n/**\n * Query state shared across traits\n */\nexport interface QueryState {\n selectColumns: string[];\n fromTable?: string;\n fromAlias?: string;\n joins: JoinClause[];\n whereClauses: WhereClause[];\n groupByColumns: string[];\n havingClause?: string;\n orderByColumns: OrderByClause[];\n limitValue?: number;\n offsetValue?: number;\n bindings: unknown[];\n isDistinct: boolean;\n\n // CRUD state\n insertTable?: string;\n insertData?: Record<string, unknown> | Record<string, unknown>[];\n updateTable?: string;\n updateData?: Record<string, unknown>;\n deleteTable?: string;\n\n // Raw SQL\n rawSql?: string;\n rawBindings?: unknown[];\n\n // Encryption\n encryptedFields: Set<string>;\n decryptedFields: Set<string>;\n}\n\n/**\n * Create initial query state\n */\nexport function createQueryState(): QueryState {\n return {\n selectColumns: ['*'],\n joins: [],\n whereClauses: [],\n groupByColumns: [],\n orderByColumns: [],\n bindings: [],\n isDistinct: false,\n encryptedFields: new Set(),\n decryptedFields: new Set(),\n };\n}\n","/**\n * Aggregate Trait\n *\n * Provides aggregate methods (count, sum, avg, min, max, exists) for query builders.\n */\n\nimport { validateColumnName } from '../utils';\n\nimport type { DatabaseAdapter } from '../interfaces';\nimport type { QueryOptions, QueryParams } from '../types';\n\nexport interface AggregateContext {\n adapter: DatabaseAdapter;\n selectColumns: string[];\n escapeIdentifierFn: (identifier: string) => string;\n toSQL: () => { sql: string; bindings: unknown[] };\n}\n\ninterface AggregateRow {\n count?: string | number;\n aggregate?: string | number | null;\n}\n\n/**\n * Execute an aggregate query and return the result\n */\nasync function executeAggregate(\n ctx: AggregateContext,\n aggregateExpression: string,\n options?: QueryOptions,\n): Promise<AggregateRow | undefined> {\n const originalSelect = ctx.selectColumns.slice();\n ctx.selectColumns.length = 0;\n ctx.selectColumns.push(aggregateExpression);\n\n try {\n const { sql, bindings } = ctx.toSQL();\n const result = await ctx.adapter.query<AggregateRow>(sql, bindings as QueryParams, options);\n return result.rows[0];\n } finally {\n ctx.selectColumns.length = 0;\n ctx.selectColumns.push(...originalSelect);\n }\n}\n\n/**\n * Count rows matching the query\n */\nexport async function count(\n ctx: AggregateContext,\n column = '*',\n options?: QueryOptions,\n): Promise<number> {\n const row = await executeAggregate(ctx, `COUNT(${column}) as count`, options);\n return row ? Number(row.count) : 0;\n}\n\n/**\n * Sum of column values\n */\nexport async function sum(\n ctx: AggregateContext,\n column: string,\n options?: QueryOptions,\n): Promise<number> {\n validateColumnName(column);\n const row = await executeAggregate(\n ctx,\n `SUM(${ctx.escapeIdentifierFn(column)}) as aggregate`,\n options,\n );\n return row?.aggregate ? Number(row.aggregate) : 0;\n}\n\n/**\n * Average of column values\n */\nexport async function avg(\n ctx: AggregateContext,\n column: string,\n options?: QueryOptions,\n): Promise<number> {\n validateColumnName(column);\n const row = await executeAggregate(\n ctx,\n `AVG(${ctx.escapeIdentifierFn(column)}) as aggregate`,\n options,\n );\n return row?.aggregate ? Number(row.aggregate) : 0;\n}\n\n/**\n * Minimum column value\n */\nexport async function min(\n ctx: AggregateContext,\n column: string,\n options?: QueryOptions,\n): Promise<number | null> {\n validateColumnName(column);\n const row = await executeAggregate(\n ctx,\n `MIN(${ctx.escapeIdentifierFn(column)}) as aggregate`,\n options,\n );\n if (row?.aggregate === null || row?.aggregate === undefined) {\n return null;\n }\n return Number(row.aggregate);\n}\n\n/**\n * Maximum column value\n */\nexport async function max(\n ctx: AggregateContext,\n column: string,\n options?: QueryOptions,\n): Promise<number | null> {\n validateColumnName(column);\n const row = await executeAggregate(\n ctx,\n `MAX(${ctx.escapeIdentifierFn(column)}) as aggregate`,\n options,\n );\n if (row?.aggregate === null || row?.aggregate === undefined) {\n return null;\n }\n return Number(row.aggregate);\n}\n\n/**\n * Check if any rows exist\n */\nexport async function exists(ctx: AggregateContext, options?: QueryOptions): Promise<boolean> {\n const total = await count(ctx, '*', options);\n return total > 0;\n}\n","/**\n * Pagination Trait\n *\n * Provides pagination methods for query builders.\n */\n\nimport { validateColumnName } from '../utils';\n\nimport type { PaginationResult, CursorPaginationResult } from '../interfaces';\nimport type { QueryOptions, QueryResult } from '../types';\n\nexport interface PaginationContext<T> {\n toSQL: () => { sql: string; bindings: unknown[] };\n where: (column: string, operator: string, value: unknown) => void;\n orderBy: (column: string, direction: 'ASC' | 'DESC') => void;\n count: (column: string, options?: QueryOptions) => Promise<number>;\n execute: (options?: QueryOptions) => Promise<QueryResult<T>>;\n}\n\nexport interface PaginationState {\n limitValue?: number;\n offsetValue?: number;\n}\n\n/**\n * Paginate results with offset-based pagination\n */\nexport async function paginate<T>(\n ctx: PaginationContext<T>,\n state: PaginationState,\n page: number = 1,\n perPage: number = 15,\n options?: QueryOptions,\n): Promise<PaginationResult<T>> {\n const safePage = page < 1 ? 1 : page;\n const safePerPage = perPage < 1 ? 15 : perPage;\n\n // Get total count\n const total = await ctx.count('*', options);\n\n // Calculate pagination\n const totalPages = Math.ceil(total / safePerPage);\n const offset = (safePage - 1) * safePerPage;\n\n // Set limit and offset\n state.limitValue = safePerPage;\n state.offsetValue = offset;\n\n // Execute query\n const result = await ctx.execute(options);\n\n const from = total > 0 ? offset + 1 : 0;\n const to = Math.min(offset + safePerPage, total);\n\n return {\n data: result.rows,\n pagination: {\n page: safePage,\n perPage: safePerPage,\n total,\n totalPages,\n hasMore: safePage < totalPages,\n from,\n to,\n },\n };\n}\n\n/**\n * Paginate results with cursor-based pagination\n */\nexport async function cursorPaginate<T>(\n ctx: PaginationContext<T>,\n state: PaginationState,\n cursorColumn: string,\n cursor: number | string | null = null,\n limit: number = 20,\n options?: QueryOptions,\n): Promise<CursorPaginationResult<T>> {\n validateColumnName(cursorColumn);\n\n if (cursor !== null) {\n ctx.where(cursorColumn, '>', cursor);\n }\n\n ctx.orderBy(cursorColumn, 'ASC');\n state.limitValue = limit + 1;\n\n const result = await ctx.execute(options);\n const hasMore = result.rows.length > limit;\n const data = hasMore ? result.rows.slice(0, limit) : result.rows;\n\n const lastItem = data.at(-1) as Record<string, unknown> | undefined;\n const nextCursor = hasMore && lastItem ? (lastItem[cursorColumn] as number | string) : null;\n\n return {\n data,\n nextCursor,\n hasMore,\n };\n}\n\n/**\n * Process results in chunks for memory efficiency\n */\nexport async function chunk<T>(\n ctx: PaginationContext<T>,\n state: PaginationState,\n size: number,\n callback: (items: T[], page: number) => Promise<void | false>,\n options?: QueryOptions,\n): Promise<void> {\n let page = 1;\n let hasMore = true;\n\n while (hasMore) {\n const result = await paginate<T>(ctx, state, page, size, options);\n\n if (result.data.length === 0) {\n break;\n }\n\n const shouldContinue = await callback(result.data, page);\n\n if (shouldContinue === false) {\n break;\n }\n\n hasMore = result.pagination.hasMore;\n page++;\n }\n}\n","/**\n * Encryption Trait\n *\n * Provides field encryption/decryption for query builders.\n */\n\nimport type { CryptoProvider } from '../crypto/crypto';\nimport type { QueryResult } from '../types';\n\nexport interface EncryptionContext {\n crypto?: CryptoProvider;\n encryptedFields: Set<string>;\n decryptedFields: Set<string>;\n}\n\n/**\n * Process data for encryption before insert/update\n */\nexport function processDataForEncryption(\n ctx: EncryptionContext,\n data: Record<string, unknown> | Record<string, unknown>[],\n): Record<string, unknown> | Record<string, unknown>[] {\n if (!ctx.crypto || ctx.encryptedFields.size === 0) {\n return data;\n }\n\n if (Array.isArray(data)) {\n return data.map((row) => encryptRow(ctx, row));\n }\n return encryptRow(ctx, data);\n}\n\n/**\n * Encrypt a single row\n */\nexport function encryptRow(\n ctx: EncryptionContext,\n row: Record<string, unknown>,\n): Record<string, unknown> {\n if (!ctx.crypto) {\n return row;\n }\n\n const encryptedRow = { ...row };\n for (const field of ctx.encryptedFields) {\n if (field in encryptedRow) {\n encryptedRow[field] = ctx.crypto.encryptField(encryptedRow[field]);\n }\n }\n return encryptedRow;\n}\n\n/**\n * Process query results for decryption\n */\nexport async function processResultsForDecryption<T>(\n ctx: EncryptionContext,\n result: QueryResult<T>,\n): Promise<QueryResult<T>> {\n if (!ctx.crypto || ctx.decryptedFields.size === 0) {\n return result;\n }\n\n const decryptedRows = result.rows.map((row) => {\n const decryptedRow = { ...row } as Record<string, unknown>;\n for (const field of ctx.decryptedFields) {\n if (field in decryptedRow && decryptedRow[field]) {\n try {\n const value = decryptedRow[field];\n if (typeof value === 'string') {\n decryptedRow[field] = ctx.crypto!.decryptField(value);\n }\n } catch {\n // If decryption fails, leave the value as is\n }\n }\n }\n return decryptedRow as T;\n });\n\n return {\n ...result,\n rows: decryptedRows,\n };\n}\n","import type { DatabaseAdapter } from '../interfaces';\nimport type { Logger } from '../types';\n\nexport interface HealthCheckResult {\n status: 'healthy' | 'degraded' | 'unhealthy';\n latency: number;\n timestamp: Date;\n details: {\n connectionPool?: {\n total: number;\n active: number;\n idle: number;\n waiting: number;\n };\n lastError?: string;\n uptime?: number;\n version?: string;\n };\n}\n\nexport interface HealthCheckOptions {\n interval?: number;\n timeout?: number;\n retries?: number;\n onHealthChange?: (result: HealthCheckResult) => void;\n logger?: Logger;\n}\n\nexport class HealthChecker {\n private adapter: DatabaseAdapter;\n private options: Required<HealthCheckOptions>;\n private intervalId?: NodeJS.Timeout;\n private lastResult?: HealthCheckResult;\n private startTime: Date;\n private consecutiveFailures = 0;\n\n constructor(adapter: DatabaseAdapter, options: HealthCheckOptions = {}) {\n this.adapter = adapter;\n this.startTime = new Date();\n this.options = {\n interval: options.interval ?? 30_000, // 30 seconds\n timeout: options.timeout ?? 5000, // 5 seconds\n retries: options.retries ?? 3,\n onHealthChange: options.onHealthChange ?? (() => {}),\n logger: options.logger ?? console,\n };\n }\n\n async check(): Promise<HealthCheckResult> {\n const start = Date.now();\n\n try {\n // Basic ping test\n const isHealthy = await Promise.race([\n this.adapter.ping(),\n new Promise<boolean>((_, reject) =>\n setTimeout(() => reject(new Error('Health check timeout')), this.options.timeout),\n ),\n ]);\n\n if (!isHealthy) {\n throw new Error('Ping failed');\n }\n\n // Get pool stats\n const poolStats = this.adapter.getPoolStats();\n\n // Determine health status\n let status: HealthCheckResult['status'] = 'healthy';\n\n if (poolStats.waiting > 0 || poolStats.active / poolStats.total > 0.8) {\n status = 'degraded';\n }\n\n if (!this.adapter.isConnected || poolStats.active === poolStats.total) {\n status = 'unhealthy';\n }\n\n const result: HealthCheckResult = {\n status,\n latency: Date.now() - start,\n timestamp: new Date(),\n details: {\n connectionPool: poolStats,\n uptime: Date.now() - this.startTime.getTime(),\n version: this.adapter.version,\n },\n };\n\n // Reset failure counter on success\n if (status === 'healthy') {\n this.consecutiveFailures = 0;\n }\n\n // Notify if health changed\n if (this.lastResult?.status !== result.status) {\n this.options.onHealthChange(result);\n this.options.logger.info(\n `Health status changed: ${this.lastResult?.status} -> ${result.status}`,\n );\n }\n\n this.lastResult = result;\n return result;\n } catch (error) {\n this.consecutiveFailures++;\n\n const result: HealthCheckResult = {\n status: 'unhealthy',\n latency: Date.now() - start,\n timestamp: new Date(),\n details: {\n lastError: (error as Error).message,\n uptime: Date.now() - this.startTime.getTime(),\n },\n };\n\n if (this.lastResult?.status !== 'unhealthy') {\n this.options.onHealthChange(result);\n this.options.logger.error('Health check failed', error);\n }\n\n this.lastResult = result;\n return result;\n }\n }\n\n start(): void {\n if (this.intervalId) {\n return;\n }\n\n // Initial check\n this.check().catch((error) => {\n this.options.logger.error('Initial health check failed', error);\n });\n\n // Schedule periodic checks\n this.intervalId = setInterval(() => {\n this.check().catch((error) => {\n this.options.logger.error('Periodic health check failed', error);\n });\n }, this.options.interval);\n\n this.options.logger.info('Health checker started', {\n interval: this.options.interval,\n timeout: this.options.timeout,\n });\n }\n\n stop(): void {\n if (this.intervalId) {\n clearInterval(this.intervalId);\n this.intervalId = undefined;\n this.options.logger.info('Health checker stopped');\n }\n }\n\n getLastResult(): HealthCheckResult | undefined {\n return this.lastResult;\n }\n\n isHealthy(): boolean {\n return this.lastResult?.status === 'healthy';\n }\n\n getUptime(): number {\n return Date.now() - this.startTime.getTime();\n }\n\n getConsecutiveFailures(): number {\n return this.consecutiveFailures;\n }\n\n async waitForHealthy(maxWaitTime = 60_000): Promise<void> {\n const startTime = Date.now();\n\n while (Date.now() - startTime < maxWaitTime) {\n const result = await this.check();\n\n if (result.status === 'healthy') {\n return;\n }\n\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n\n throw new Error(`Health check did not become healthy within ${maxWaitTime}ms`);\n }\n}\n","import { EventEmitter } from 'eventemitter3';\n\nexport interface QueryMetrics {\n totalQueries: number;\n successfulQueries: number;\n failedQueries: number;\n averageLatency: number;\n minLatency: number;\n maxLatency: number;\n queriesPerSecond: number;\n cacheHitRate: number;\n slowQueries: number;\n queryDistribution: Record<string, number>; // SELECT, INSERT, UPDATE, DELETE, etc.\n}\n\nexport interface ConnectionMetrics {\n totalConnections: number;\n activeConnections: number;\n idleConnections: number;\n connectionErrors: number;\n averageConnectionTime: number;\n connectionReuse: number;\n}\n\nexport interface TransactionMetrics {\n totalTransactions: number;\n committedTransactions: number;\n rolledBackTransactions: number;\n averageTransactionDuration: number;\n activeTransactions: number;\n deadlocks: number;\n}\n\nexport interface SystemMetrics {\n memoryUsage: NodeJS.MemoryUsage;\n cpuUsage: NodeJS.CpuUsage;\n uptime: number;\n timestamp: Date;\n}\n\nexport interface MetricsSnapshot {\n query: QueryMetrics;\n connection: ConnectionMetrics;\n transaction: TransactionMetrics;\n system: SystemMetrics;\n custom: Record<string, unknown>;\n}\n\nexport class MetricsCollector extends EventEmitter {\n private queryMetrics: QueryMetrics;\n private connectionMetrics: ConnectionMetrics;\n private transactionMetrics: TransactionMetrics;\n private queryLatencies: number[] = [];\n private connectionTimes: number[] = [];\n private transactionDurations: number[] = [];\n private startTime: Date;\n private slowQueryThreshold: number;\n private customMetrics: Record<string, unknown> = {};\n private interval?: NodeJS.Timeout;\n\n constructor(options: { slowQueryThreshold?: number; collectionInterval?: number } = {}) {\n super();\n this.startTime = new Date();\n this.slowQueryThreshold = options.slowQueryThreshold ?? 1000; // 1 second\n\n this.queryMetrics = this.createEmptyQueryMetrics();\n this.connectionMetrics = this.createEmptyConnectionMetrics();\n this.transactionMetrics = this.createEmptyTransactionMetrics();\n\n if (options.collectionInterval) {\n this.startCollection(options.collectionInterval);\n }\n }\n\n private createEmptyQueryMetrics(): QueryMetrics {\n return {\n totalQueries: 0,\n successfulQueries: 0,\n failedQueries: 0,\n averageLatency: 0,\n minLatency: Number.POSITIVE_INFINITY,\n maxLatency: 0,\n queriesPerSecond: 0,\n cacheHitRate: 0,\n slowQueries: 0,\n queryDistribution: {},\n };\n }\n\n private createEmptyConnectionMetrics(): ConnectionMetrics {\n return {\n totalConnections: 0,\n activeConnections: 0,\n idleConnections: 0,\n connectionErrors: 0,\n averageConnectionTime: 0,\n connectionReuse: 0,\n };\n }\n\n private createEmptyTransactionMetrics(): TransactionMetrics {\n return {\n totalTransactions: 0,\n committedTransactions: 0,\n rolledBackTransactions: 0,\n averageTransactionDuration: 0,\n activeTransactions: 0,\n deadlocks: 0,\n };\n }\n\n recordQuery(command: string, latency: number, success: boolean, cacheHit = false): void {\n this.queryMetrics.totalQueries++;\n\n if (success) {\n this.queryMetrics.successfulQueries++;\n } else {\n this.queryMetrics.failedQueries++;\n }\n\n // Update latency metrics\n this.queryLatencies.push(latency);\n if (this.queryLatencies.length > 1000) {\n this.queryLatencies.shift(); // Keep only last 1000 queries\n }\n\n this.queryMetrics.minLatency = Math.min(this.queryMetrics.minLatency, latency);\n this.queryMetrics.maxLatency = Math.max(this.queryMetrics.maxLatency, latency);\n this.queryMetrics.averageLatency = this.calculateAverage(this.queryLatencies);\n\n // Track slow queries\n if (latency > this.slowQueryThreshold) {\n this.queryMetrics.slowQueries++;\n this.emit('slowQuery', { command, latency });\n }\n\n // Update query distribution\n const queryType = command.toUpperCase();\n this.queryMetrics.queryDistribution[queryType] =\n (this.queryMetrics.queryDistribution[queryType] || 0) + 1;\n\n // Update QPS\n const elapsedSeconds = (Date.now() - this.startTime.getTime()) / 1000;\n this.queryMetrics.queriesPerSecond = this.queryMetrics.totalQueries / elapsedSeconds;\n\n // Update cache hit rate\n if (cacheHit) {\n const cacheHits = (this.customMetrics['cacheHits'] as number) || 0;\n this.customMetrics['cacheHits'] = cacheHits + 1;\n }\n const cacheHits = (this.customMetrics['cacheHits'] as number) || 0;\n this.queryMetrics.cacheHitRate =\n this.queryMetrics.totalQueries > 0 ? cacheHits / this.queryMetrics.totalQueries : 0;\n }\n\n recordConnection(connected: boolean, connectionTime?: number): void {\n this.connectionMetrics.totalConnections++;\n\n if (connected) {\n this.connectionMetrics.activeConnections++;\n\n if (connectionTime) {\n this.connectionTimes.push(connectionTime);\n if (this.connectionTimes.length > 100) {\n this.connectionTimes.shift();\n }\n this.connectionMetrics.averageConnectionTime = this.calculateAverage(this.connectionTimes);\n }\n } else {\n this.connectionMetrics.connectionErrors++;\n }\n }\n\n recordTransaction(\n action: 'start' | 'commit' | 'rollback',\n duration?: number,\n isDeadlock = false,\n ): void {\n switch (action) {\n case 'start': {\n this.transactionMetrics.totalTransactions++;\n this.transactionMetrics.activeTransactions++;\n break;\n }\n\n case 'commit': {\n this.transactionMetrics.committedTransactions++;\n this.transactionMetrics.activeTransactions = Math.max(\n 0,\n this.transactionMetrics.activeTransactions - 1,\n );\n break;\n }\n\n case 'rollback': {\n this.transactionMetrics.rolledBackTransactions++;\n this.transactionMetrics.activeTransactions = Math.max(\n 0,\n this.transactionMetrics.activeTransactions - 1,\n );\n\n if (isDeadlock) {\n this.transactionMetrics.deadlocks++;\n this.emit('deadlock');\n }\n break;\n }\n }\n\n if (duration) {\n this.transactionDurations.push(duration);\n if (this.transactionDurations.length > 100) {\n this.transactionDurations.shift();\n }\n this.transactionMetrics.averageTransactionDuration = this.calculateAverage(\n this.transactionDurations,\n );\n }\n }\n\n updateConnectionPool(stats: { total: number; active: number; idle: number }): void {\n this.connectionMetrics.activeConnections = stats.active;\n this.connectionMetrics.idleConnections = stats.idle;\n this.connectionMetrics.connectionReuse =\n stats.total > 0 ? this.queryMetrics.totalQueries / stats.total : 0;\n }\n\n setCustomMetric(key: string, value: unknown): void {\n this.customMetrics[key] = value;\n }\n\n incrementCustomMetric(key: string, value = 1): void {\n const current = (this.customMetrics[key] as number) || 0;\n this.customMetrics[key] = current + value;\n }\n\n getSnapshot(): MetricsSnapshot {\n return {\n query: { ...this.queryMetrics },\n connection: { ...this.connectionMetrics },\n transaction: { ...this.transactionMetrics },\n system: {\n memoryUsage: process.memoryUsage(),\n cpuUsage: process.cpuUsage(),\n uptime: process.uptime(),\n timestamp: new Date(),\n },\n custom: { ...this.customMetrics },\n };\n }\n\n reset(): void {\n this.queryMetrics = this.createEmptyQueryMetrics();\n this.connectionMetrics = this.createEmptyConnectionMetrics();\n this.transactionMetrics = this.createEmptyTransactionMetrics();\n this.queryLatencies = [];\n this.connectionTimes = [];\n this.transactionDurations = [];\n this.customMetrics = {};\n this.startTime = new Date();\n }\n\n private calculateAverage(values: number[]): number {\n if (values.length === 0) {\n return 0;\n }\n const sum = values.reduce((acc, val) => acc + val, 0);\n return sum / values.length;\n }\n\n private startCollection(interval: number): void {\n this.interval = setInterval(() => {\n const snapshot = this.getSnapshot();\n this.emit('metrics', snapshot);\n }, interval);\n }\n\n stop(): void {\n if (this.interval) {\n clearInterval(this.interval);\n this.interval = undefined;\n }\n }\n\n // Prometheus-style metrics export\n exportPrometheus(): string {\n const metrics = this.getSnapshot();\n const lines: string[] = [];\n\n // Query metrics\n lines.push(\n `# HELP db_queries_total Total number of queries executed`,\n `# TYPE db_queries_total counter`,\n `db_queries_total ${metrics.query.totalQueries}`,\n `# HELP db_query_duration_seconds Query execution duration in seconds`,\n `# TYPE db_query_duration_seconds summary`,\n `db_query_duration_seconds{quantile=\"0.5\"} ${metrics.query.averageLatency / 1000}`,\n `db_query_duration_seconds{quantile=\"0.99\"} ${metrics.query.maxLatency / 1000}`,\n `db_query_duration_seconds_sum ${(metrics.query.averageLatency * metrics.query.totalQueries) / 1000}`,\n `db_query_duration_seconds_count ${metrics.query.totalQueries}`,\n `# HELP db_connections_active Number of active database connections`,\n `# TYPE db_connections_active gauge`,\n `db_connections_active ${metrics.connection.activeConnections}`,\n `# HELP db_transactions_total Total number of transactions`,\n `# TYPE db_transactions_total counter`,\n `db_transactions_total{status=\"committed\"} ${metrics.transaction.committedTransactions}`,\n `db_transactions_total{status=\"rolled_back\"} ${metrics.transaction.rolledBackTransactions}`,\n `# HELP nodejs_heap_size_total_bytes Process heap size in bytes`,\n `# TYPE nodejs_heap_size_total_bytes gauge`,\n );\n lines.push(`nodejs_heap_size_total_bytes ${metrics.system.memoryUsage.heapTotal}`);\n\n return lines.join('\\n');\n }\n}\n","import { QueryError } from '../errors';\n\nimport type { DatabaseAdapter } from '../interfaces';\nimport type { Logger } from '../types';\n\nexport interface Migration {\n id: string;\n version: number;\n name: string;\n up: (adapter: DatabaseAdapter) => Promise<void>;\n down: (adapter: DatabaseAdapter) => Promise<void>;\n timestamp: Date;\n}\n\nexport interface MigrationHistory {\n id: string;\n version: number;\n name: string;\n executedAt: Date;\n duration: number;\n checksum: string;\n}\n\nexport interface MigrationRunnerOptions {\n tableName?: string;\n logger?: Logger;\n validateChecksums?: boolean;\n dryRun?: boolean;\n}\n\nexport class MigrationRunner {\n private adapter: DatabaseAdapter;\n private migrations: Migration[] = [];\n private options: Required<MigrationRunnerOptions>;\n\n constructor(adapter: DatabaseAdapter, options: MigrationRunnerOptions = {}) {\n this.adapter = adapter;\n this.options = {\n tableName: options.tableName ?? 'db_migrations',\n logger: options.logger ?? console,\n validateChecksums: options.validateChecksums ?? true,\n dryRun: options.dryRun ?? false,\n };\n }\n\n async initialize(): Promise<void> {\n if (this.options.dryRun) {\n this.options.logger.info('DRY RUN: Would create migrations table');\n return;\n }\n\n const sql = `\n CREATE TABLE IF NOT EXISTS ${this.options.tableName} (\n id VARCHAR(255) PRIMARY KEY,\n version INT NOT NULL,\n name VARCHAR(255) NOT NULL,\n executed_at TIMESTAMP NOT NULL,\n duration INT NOT NULL,\n checksum VARCHAR(64) NOT NULL,\n INDEX idx_version (version),\n INDEX idx_executed_at (executed_at)\n )\n `;\n\n try {\n await this.adapter.execute(sql);\n this.options.logger.info(`Migrations table '${this.options.tableName}' ready`);\n } catch (error) {\n throw new QueryError(`Failed to create migrations table: ${(error as Error).message}`);\n }\n }\n\n addMigration(migration: Migration): void {\n // Check for duplicate versions\n const existing = this.migrations.find((m) => m.version === migration.version);\n if (existing) {\n throw new Error(\n `Migration version ${migration.version} already exists: ${existing.name} and ${migration.name}`,\n );\n }\n\n this.migrations.push(migration);\n this.migrations.sort((a, b) => a.version - b.version);\n }\n\n addMigrations(migrations: Migration[]): void {\n migrations.forEach((migration) => this.addMigration(migration));\n }\n\n async getExecutedMigrations(): Promise<MigrationHistory[]> {\n const result = await this.adapter.query<MigrationHistory>(\n `SELECT * FROM ${this.options.tableName} ORDER BY version ASC`,\n );\n\n return result.rows.map((row) => ({\n ...row,\n executedAt: new Date(row.executedAt),\n }));\n }\n\n async getPendingMigrations(): Promise<Migration[]> {\n const executed = await this.getExecutedMigrations();\n const executedVersions = new Set(executed.map((m) => m.version));\n\n return this.migrations.filter((m) => !executedVersions.has(m.version));\n }\n\n private calculateChecksum(migration: Migration): string {\n const crypto = require('node:crypto');\n const content = `${migration.id}:${migration.version}:${migration.name}:${migration.up.toString()}:${migration.down.toString()}`;\n return crypto.createHash('sha256').update(content).digest('hex');\n }\n\n async up(targetVersion?: number): Promise<void> {\n await this.initialize();\n\n const pending = await this.getPendingMigrations();\n const toRun = targetVersion ? pending.filter((m) => m.version <= targetVersion) : pending;\n\n if (toRun.length === 0) {\n this.options.logger.info('No pending migrations to run');\n return;\n }\n\n this.options.logger.info(`Found ${toRun.length} pending migrations`);\n\n for (const migration of toRun) {\n await this.runMigration(migration, 'up');\n }\n }\n\n async down(targetVersion: number): Promise<void> {\n await this.initialize();\n\n const executed = await this.getExecutedMigrations();\n const toRevert = executed.filter((m) => m.version > targetVersion).reverse(); // Revert in reverse order\n\n if (toRevert.length === 0) {\n this.options.logger.info('No migrations to revert');\n return;\n }\n\n this.options.logger.info(`Found ${toRevert.length} migrations to revert`);\n\n for (const history of toRevert) {\n const migration = this.migrations.find((m) => m.version === history.version);\n if (!migration) {\n throw new Error(`Migration ${history.version} not found in codebase`);\n }\n\n await this.runMigration(migration, 'down');\n }\n }\n\n async latest(): Promise<void> {\n await this.up();\n }\n\n async rollback(steps = 1): Promise<void> {\n const executed = await this.getExecutedMigrations();\n\n if (executed.length === 0) {\n this.options.logger.info('No migrations to rollback');\n return;\n }\n\n const targetIndex = Math.max(0, executed.length - steps - 1);\n const targetVersion = targetIndex >= 0 ? executed[targetIndex]!.version : 0;\n\n await this.down(targetVersion);\n }\n\n async reset(): Promise<void> {\n await this.down(0);\n }\n\n async refresh(): Promise<void> {\n await this.reset();\n await this.latest();\n }\n\n private async runMigration(migration: Migration, direction: 'up' | 'down'): Promise<void> {\n const start = Date.now();\n const checksum = this.calculateChecksum(migration);\n\n this.options.logger.info(\n `${direction === 'up' ? 'Running' : 'Reverting'} migration ${migration.version}: ${migration.name}`,\n );\n\n if (this.options.dryRun) {\n this.options.logger.info(`DRY RUN: Would ${direction} migration ${migration.version}`);\n return;\n }\n\n const transaction = await this.adapter.beginTransaction();\n\n try {\n // Validate checksum if going down\n if (direction === 'down' && this.options.validateChecksums) {\n const history = await this.adapter.query<MigrationHistory>(\n `SELECT checksum FROM ${this.options.tableName} WHERE version = ?`,\n [migration.version],\n );\n\n if (history.rows[0]?.checksum !== checksum) {\n throw new Error(\n `Checksum mismatch for migration ${migration.version}. The migration may have been modified.`,\n );\n }\n }\n\n // Run the migration\n await migration[direction](this.adapter);\n\n // Update history\n if (direction === 'up') {\n await this.adapter.execute(\n `INSERT INTO ${this.options.tableName} (id, version, name, executed_at, duration, checksum) VALUES (?, ?, ?, ?, ?, ?)`,\n [\n migration.id,\n migration.version,\n migration.name,\n new Date(),\n Date.now() - start,\n checksum,\n ],\n { transaction },\n );\n } else {\n await this.adapter.execute(\n `DELETE FROM ${this.options.tableName} WHERE version = ?`,\n [migration.version],\n { transaction },\n );\n }\n\n await transaction.commit();\n\n this.options.logger.info(\n `${direction === 'up' ? 'Completed' : 'Reverted'} migration ${migration.version} in ${Date.now() - start}ms`,\n );\n } catch (error) {\n await transaction.rollback();\n\n const action = direction === 'up' ? 'run' : 'revert';\n throw new Error(\n `Failed to ${action} migration ${migration.version}: ${(error as Error).message}`,\n );\n }\n }\n\n async status(): Promise<{\n executed: MigrationHistory[];\n pending: Migration[];\n current: number | null;\n }> {\n const executed = await this.getExecutedMigrations();\n const pending = await this.getPendingMigrations();\n const current = executed.length > 0 ? executed.at(-1)!.version : null;\n\n return { executed, pending, current };\n }\n\n async validate(): Promise<{ valid: boolean; errors: string[] }> {\n const errors: string[] = [];\n\n // Check for duplicate versions\n const versions = new Set<number>();\n for (const migration of this.migrations) {\n if (versions.has(migration.version)) {\n errors.push(`Duplicate migration version: ${migration.version}`);\n }\n versions.add(migration.version);\n }\n\n // Check for gaps in versions\n const sortedVersions = Array.from(versions).sort((a, b) => a - b);\n for (let i = 1; i < sortedVersions.length; i++) {\n if (sortedVersions[i]! - sortedVersions[i - 1]! > 1) {\n errors.push(\n `Gap in migration versions between ${sortedVersions[i - 1]} and ${sortedVersions[i]}`,\n );\n }\n }\n\n // Validate checksums of executed migrations\n if (this.options.validateChecksums) {\n const executed = await this.getExecutedMigrations();\n\n for (const history of executed) {\n const migration = this.migrations.find((m) => m.version === history.version);\n\n if (!migration) {\n errors.push(`Migration ${history.version} exists in history but not in codebase`);\n continue;\n }\n\n const currentChecksum = this.calculateChecksum(migration);\n if (currentChecksum !== history.checksum) {\n errors.push(\n `Checksum mismatch for migration ${history.version}: ${history.name}. The migration has been modified after execution.`,\n );\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n }\n}\n","/**\n * Migration Loader\n * Loads migration files from a directory\n */\n\nimport { createHash } from 'node:crypto';\nimport { readdir, readFile } from 'node:fs/promises';\nimport { join, basename, extname } from 'node:path';\nimport { pathToFileURL } from 'node:url';\n\nimport type { Migration, MigrationFile } from './types';\n\n/**\n * Migration filename pattern\n * Format: YYYYMMDDHHMMSS_description.ts\n * Example: 20250118120000_create_users_table.ts\n */\nconst MIGRATION_PATTERN = /^(\\d{14})_(.+)\\.(ts|js|mjs)$/;\n\nexport class MigrationLoader {\n private directory: string;\n private extensions: string[];\n\n constructor(directory: string, extensions: string[] = ['.ts', '.js', '.mjs']) {\n this.directory = directory;\n this.extensions = extensions;\n }\n\n /**\n * Scan directory for migration files\n */\n async scanDirectory(): Promise<MigrationFile[]> {\n const files: MigrationFile[] = [];\n\n try {\n // eslint-disable-next-line security/detect-non-literal-fs-filename -- directory is user-configured\n const entries = await readdir(this.directory, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isFile()) {\n continue;\n }\n\n const ext = extname(entry.name);\n if (!this.extensions.includes(ext)) {\n continue;\n }\n\n const match = entry.name.match(MIGRATION_PATTERN);\n if (!match) {\n continue;\n }\n\n const [, timestamp, description] = match;\n files.push({\n name: basename(entry.name, ext),\n path: join(this.directory, entry.name),\n timestamp: timestamp!,\n description: description!.replaceAll('_', ' '),\n });\n }\n\n // Sort by timestamp\n files.sort((a, b) => a.timestamp.localeCompare(b.timestamp));\n\n return files;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n throw new Error(`Migration directory not found: ${this.directory}`);\n }\n throw error;\n }\n }\n\n /**\n * Load a single migration file\n */\n async loadMigration(file: MigrationFile): Promise<Migration> {\n try {\n // Convert path to file URL for ESM import\n const fileUrl = pathToFileURL(file.path).href;\n const module = await import(fileUrl);\n\n // Support both default export and named exports\n const migration = module.default || module;\n\n // Validate migration structure\n if (typeof migration.up !== 'function') {\n throw new TypeError(`Migration ${file.name} is missing 'up' function`);\n }\n if (typeof migration.down !== 'function') {\n throw new TypeError(`Migration ${file.name} is missing 'down' function`);\n }\n\n return {\n name: file.name,\n up: migration.up,\n down: migration.down,\n transactional: migration.transactional ?? true,\n phase: migration.phase,\n };\n } catch (error) {\n throw new Error(`Failed to load migration ${file.name}: ${(error as Error).message}`);\n }\n }\n\n /**\n * Load all migrations from directory\n */\n async loadAll(): Promise<Migration[]> {\n const files = await this.scanDirectory();\n const migrations: Migration[] = [];\n\n for (const file of files) {\n const migration = await this.loadMigration(file);\n migrations.push(migration);\n }\n\n return migrations;\n }\n\n /**\n * Get migration files (metadata only, without loading)\n */\n async getMigrationFiles(): Promise<MigrationFile[]> {\n return this.scanDirectory();\n }\n\n /**\n * Calculate checksum for a migration file\n */\n async calculateChecksum(file: MigrationFile): Promise<string> {\n // eslint-disable-next-line security/detect-non-literal-fs-filename -- path from scanned directory\n const content = await readFile(file.path, 'utf8');\n // Normalize line endings and trim whitespace for consistent checksums\n const normalized = content.replaceAll('\\r\\n', '\\n').trim();\n return createHash('sha256').update(normalized).digest('hex').slice(0, 16);\n }\n\n /**\n * Calculate checksums for all migration files\n */\n async calculateAllChecksums(): Promise<Map<string, string>> {\n const files = await this.scanDirectory();\n const checksums = new Map<string, string>();\n\n for (const file of files) {\n const checksum = await this.calculateChecksum(file);\n checksums.set(file.name, checksum);\n }\n\n return checksums;\n }\n\n /**\n * Generate a new migration filename\n */\n static generateFilename(description: string): string {\n const now = new Date();\n const timestamp = [\n now.getFullYear(),\n String(now.getMonth() + 1).padStart(2, '0'),\n String(now.getDate()).padStart(2, '0'),\n String(now.getHours()).padStart(2, '0'),\n String(now.getMinutes()).padStart(2, '0'),\n String(now.getSeconds()).padStart(2, '0'),\n ].join('');\n\n const sanitizedDescription = description\n .toLowerCase()\n .replaceAll(/[^\\da-z]+/g, '_')\n .replaceAll(/^_+|_+$/g, '');\n\n return `${timestamp}_${sanitizedDescription}.ts`;\n }\n\n /**\n * Get migration template content\n */\n static getMigrationTemplate(name: string): string {\n return `/**\n * Migration: ${name}\n * Created at: ${new Date().toISOString()}\n */\n\nimport type { SchemaBuilder } from '@db-bridge/core';\n\nexport default {\n name: '${name}',\n\n async up(schema: SchemaBuilder): Promise<void> {\n // Write your migration here\n // Example:\n // await schema.createTable('users', (table) => {\n // table.increments('id');\n // table.string('email', 255).unique().notNull();\n // table.timestamps();\n // });\n },\n\n async down(schema: SchemaBuilder): Promise<void> {\n // Reverse the migration\n // Example:\n // await schema.dropTableIfExists('users');\n },\n};\n`;\n }\n}\n","/**\n * MySQL Dialect\n * SQL generation for MySQL database\n */\n\nimport type {\n AlterTableDefinition,\n ColumnDefinition,\n ForeignKeyDefinition,\n IndexDefinition,\n SchemaDialect,\n TableDefinition,\n} from '../types';\n\nexport class MySQLDialect implements SchemaDialect {\n readonly dialect = 'mysql' as const;\n\n /**\n * Quote an identifier (table/column name)\n */\n quoteIdentifier(name: string): string {\n return `\\`${name.replaceAll('`', '``')}\\``;\n }\n\n /**\n * Quote a value for SQL\n */\n quoteValue(value: unknown): string {\n if (value === null || value === undefined) {\n return 'NULL';\n }\n if (typeof value === 'boolean') {\n return value ? '1' : '0';\n }\n if (typeof value === 'number') {\n return String(value);\n }\n if (typeof value === 'string') {\n return `'${value.replaceAll(\"'\", \"''\")}'`;\n }\n return `'${String(value).replaceAll(\"'\", \"''\")}'`;\n }\n\n /**\n * Generate CREATE TABLE statement\n */\n createTable(definition: TableDefinition): string {\n const parts: string[] = [];\n\n // Columns\n for (const column of definition.columns) {\n parts.push(this.columnToSQL(column));\n }\n\n // Primary key (if composite or not defined in column)\n if (definition.primaryKey && definition.primaryKey.length > 0) {\n const pkColumns = definition.primaryKey.map((c) => this.quoteIdentifier(c)).join(', ');\n parts.push(`PRIMARY KEY (${pkColumns})`);\n }\n\n // Indexes\n for (const index of definition.indexes) {\n parts.push(this.indexToSQL(index));\n }\n\n // Foreign keys\n for (const fk of definition.foreignKeys) {\n parts.push(this.foreignKeyToSQL(fk));\n }\n\n let sql = `CREATE TABLE ${this.quoteIdentifier(definition.name)} (\\n ${parts.join(',\\n ')}\\n)`;\n\n // Table options\n const options: string[] = [];\n if (definition.engine) {\n options.push(`ENGINE=${definition.engine}`);\n } else {\n options.push('ENGINE=InnoDB');\n }\n if (definition.charset) {\n options.push(`DEFAULT CHARSET=${definition.charset}`);\n } else {\n options.push('DEFAULT CHARSET=utf8mb4');\n }\n if (definition.collation) {\n options.push(`COLLATE=${definition.collation}`);\n }\n if (definition.comment) {\n options.push(`COMMENT=${this.quoteValue(definition.comment)}`);\n }\n\n if (options.length > 0) {\n sql += ` ${options.join(' ')}`;\n }\n\n return sql;\n }\n\n /**\n * Generate DROP TABLE statement\n */\n dropTable(tableName: string): string {\n return `DROP TABLE ${this.quoteIdentifier(tableName)}`;\n }\n\n /**\n * Generate DROP TABLE IF EXISTS statement\n */\n dropTableIfExists(tableName: string): string {\n return `DROP TABLE IF EXISTS ${this.quoteIdentifier(tableName)}`;\n }\n\n /**\n * Generate RENAME TABLE statement\n */\n renameTable(from: string, to: string): string {\n return `RENAME TABLE ${this.quoteIdentifier(from)} TO ${this.quoteIdentifier(to)}`;\n }\n\n /**\n * Generate ALTER TABLE statements\n */\n alterTable(definition: AlterTableDefinition): string[] {\n const statements: string[] = [];\n const tableName = this.quoteIdentifier(definition.tableName);\n\n for (const op of definition.operations) {\n switch (op.type) {\n case 'addColumn': {\n statements.push(`ALTER TABLE ${tableName} ADD COLUMN ${this.columnToSQL(op.column)}`);\n break;\n }\n\n case 'dropColumn': {\n statements.push(`ALTER TABLE ${tableName} DROP COLUMN ${this.quoteIdentifier(op.name)}`);\n break;\n }\n\n case 'renameColumn': {\n statements.push(\n `ALTER TABLE ${tableName} RENAME COLUMN ${this.quoteIdentifier(op.from)} TO ${this.quoteIdentifier(op.to)}`,\n );\n break;\n }\n\n case 'modifyColumn': {\n statements.push(`ALTER TABLE ${tableName} MODIFY COLUMN ${this.columnToSQL(op.column)}`);\n break;\n }\n\n case 'addIndex': {\n statements.push(`ALTER TABLE ${tableName} ADD ${this.indexToSQL(op.index)}`);\n break;\n }\n\n case 'dropIndex': {\n statements.push(`ALTER TABLE ${tableName} DROP INDEX ${this.quoteIdentifier(op.name)}`);\n break;\n }\n\n case 'addForeignKey': {\n statements.push(`ALTER TABLE ${tableName} ADD ${this.foreignKeyToSQL(op.foreignKey)}`);\n break;\n }\n\n case 'dropForeignKey': {\n statements.push(\n `ALTER TABLE ${tableName} DROP FOREIGN KEY ${this.quoteIdentifier(op.name)}`,\n );\n break;\n }\n\n case 'addPrimary': {\n const pkCols = op.columns.map((c) => this.quoteIdentifier(c)).join(', ');\n statements.push(`ALTER TABLE ${tableName} ADD PRIMARY KEY (${pkCols})`);\n break;\n }\n\n case 'dropPrimary': {\n statements.push(`ALTER TABLE ${tableName} DROP PRIMARY KEY`);\n break;\n }\n }\n }\n\n return statements;\n }\n\n /**\n * Generate query to check if table exists\n */\n hasTable(tableName: string): string {\n return `SELECT 1 FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = ${this.quoteValue(tableName)} LIMIT 1`;\n }\n\n /**\n * Generate query to check if column exists\n */\n hasColumn(tableName: string, columnName: string): string {\n return `SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = ${this.quoteValue(tableName)} AND column_name = ${this.quoteValue(columnName)} LIMIT 1`;\n }\n\n /**\n * Convert column definition to SQL\n */\n private columnToSQL(column: ColumnDefinition): string {\n const parts: string[] = [this.quoteIdentifier(column.name)];\n\n // Type\n parts.push(this.columnTypeToSQL(column));\n\n // Unsigned\n if (column.unsigned) {\n parts.push('UNSIGNED');\n }\n\n // Nullable\n if (column.nullable) {\n parts.push('NULL');\n } else {\n parts.push('NOT NULL');\n }\n\n // Default value\n if (column.defaultRaw) {\n parts.push(`DEFAULT ${column.defaultRaw}`);\n } else if (column.defaultValue !== undefined) {\n parts.push(`DEFAULT ${this.quoteValue(column.defaultValue)}`);\n }\n\n // Auto increment\n if (column.autoIncrement) {\n parts.push('AUTO_INCREMENT');\n }\n\n // Primary key (inline)\n if (column.primary && !column.autoIncrement) {\n parts.push('PRIMARY KEY');\n } else if (column.primary && column.autoIncrement) {\n parts.push('PRIMARY KEY');\n }\n\n // Unique (inline)\n if (column.unique && !column.primary) {\n parts.push('UNIQUE');\n }\n\n // Comment\n if (column.comment) {\n parts.push(`COMMENT ${this.quoteValue(column.comment)}`);\n }\n\n // Position\n if (column.first) {\n parts.push('FIRST');\n } else if (column.after) {\n parts.push(`AFTER ${this.quoteIdentifier(column.after)}`);\n }\n\n return parts.join(' ');\n }\n\n /**\n * Convert column type to MySQL type\n */\n private columnTypeToSQL(column: ColumnDefinition): string {\n switch (column.type) {\n case 'increments': {\n return 'INT UNSIGNED AUTO_INCREMENT';\n }\n case 'bigIncrements': {\n return 'BIGINT UNSIGNED AUTO_INCREMENT';\n }\n case 'integer': {\n return 'INT';\n }\n case 'bigInteger': {\n return 'BIGINT';\n }\n case 'smallInteger': {\n return 'SMALLINT';\n }\n case 'tinyInteger': {\n return 'TINYINT';\n }\n case 'float': {\n return 'FLOAT';\n }\n case 'double': {\n return 'DOUBLE';\n }\n case 'decimal': {\n const precision = column.precision ?? 10;\n const scale = column.scale ?? 2;\n return `DECIMAL(${precision},${scale})`;\n }\n case 'string': {\n return `VARCHAR(${column.length ?? 255})`;\n }\n case 'text': {\n return 'TEXT';\n }\n case 'mediumText': {\n return 'MEDIUMTEXT';\n }\n case 'longText': {\n return 'LONGTEXT';\n }\n case 'boolean': {\n return 'TINYINT(1)';\n }\n case 'date': {\n return 'DATE';\n }\n case 'datetime': {\n return 'DATETIME';\n }\n case 'timestamp': {\n return 'TIMESTAMP';\n }\n case 'time': {\n return 'TIME';\n }\n case 'json':\n case 'jsonb': {\n return 'JSON';\n }\n case 'uuid': {\n return 'CHAR(36)';\n }\n case 'binary': {\n return 'BLOB';\n }\n case 'enum': {\n if (column.enumValues && column.enumValues.length > 0) {\n const values = column.enumValues.map((v) => this.quoteValue(v)).join(', ');\n return `ENUM(${values})`;\n }\n return 'VARCHAR(255)';\n }\n default: {\n return 'VARCHAR(255)';\n }\n }\n }\n\n /**\n * Convert index definition to SQL\n */\n private indexToSQL(index: IndexDefinition): string {\n const columns = index.columns.map((c) => this.quoteIdentifier(c)).join(', ');\n const name = index.name ? this.quoteIdentifier(index.name) : '';\n\n if (index.type === 'fulltext') {\n return `FULLTEXT INDEX ${name} (${columns})`;\n }\n\n if (index.unique) {\n return `UNIQUE INDEX ${name} (${columns})`;\n }\n\n return `INDEX ${name} (${columns})`;\n }\n\n /**\n * Convert foreign key definition to SQL\n */\n private foreignKeyToSQL(fk: ForeignKeyDefinition): string {\n const parts: string[] = ['CONSTRAINT'];\n\n if (fk.name) {\n parts.push(this.quoteIdentifier(fk.name));\n }\n\n parts.push(`FOREIGN KEY (${this.quoteIdentifier(fk.column)})`);\n parts.push(\n `REFERENCES ${this.quoteIdentifier(fk.table)} (${this.quoteIdentifier(fk.referenceColumn)})`,\n );\n\n if (fk.onDelete) {\n parts.push(`ON DELETE ${fk.onDelete}`);\n }\n\n if (fk.onUpdate) {\n parts.push(`ON UPDATE ${fk.onUpdate}`);\n }\n\n return parts.join(' ');\n }\n}\n","/**\n * PostgreSQL Dialect\n * SQL generation for PostgreSQL database\n */\n\nimport type {\n AlterTableDefinition,\n ColumnDefinition,\n ForeignKeyDefinition,\n IndexDefinition,\n SchemaDialect,\n TableDefinition,\n} from '../types';\n\nexport class PostgreSQLDialect implements SchemaDialect {\n readonly dialect = 'postgresql' as const;\n\n /**\n * Quote an identifier (table/column name)\n */\n quoteIdentifier(name: string): string {\n return `\"${name.replaceAll('\"', '\"\"')}\"`;\n }\n\n /**\n * Quote a value for SQL\n */\n quoteValue(value: unknown): string {\n if (value === null || value === undefined) {\n return 'NULL';\n }\n if (typeof value === 'boolean') {\n return value ? 'TRUE' : 'FALSE';\n }\n if (typeof value === 'number') {\n return String(value);\n }\n if (typeof value === 'string') {\n return `'${value.replaceAll(\"'\", \"''\")}'`;\n }\n return `'${String(value).replaceAll(\"'\", \"''\")}'`;\n }\n\n /**\n * Generate CREATE TABLE statement\n */\n createTable(definition: TableDefinition): string {\n const parts: string[] = [];\n\n // Columns\n for (const column of definition.columns) {\n parts.push(this.columnToSQL(column));\n }\n\n // Primary key (if composite or not defined in column)\n if (definition.primaryKey && definition.primaryKey.length > 0) {\n const pkColumns = definition.primaryKey.map((c) => this.quoteIdentifier(c)).join(', ');\n parts.push(`PRIMARY KEY (${pkColumns})`);\n }\n\n // Foreign keys (inline in CREATE TABLE)\n for (const fk of definition.foreignKeys) {\n parts.push(this.foreignKeyToSQL(fk));\n }\n\n const sql = `CREATE TABLE ${this.quoteIdentifier(definition.name)} (\\n ${parts.join(',\\n ')}\\n)`;\n\n // Table comment (separate statement in PostgreSQL)\n const statements = [sql];\n if (definition.comment) {\n statements.push(\n `COMMENT ON TABLE ${this.quoteIdentifier(definition.name)} IS ${this.quoteValue(definition.comment)}`,\n );\n }\n\n // Note: Indexes are created separately in PostgreSQL\n // This is handled by the SchemaBuilder\n\n return statements.join(';\\n');\n }\n\n /**\n * Generate DROP TABLE statement\n */\n dropTable(tableName: string): string {\n return `DROP TABLE ${this.quoteIdentifier(tableName)}`;\n }\n\n /**\n * Generate DROP TABLE IF EXISTS statement\n */\n dropTableIfExists(tableName: string): string {\n return `DROP TABLE IF EXISTS ${this.quoteIdentifier(tableName)}`;\n }\n\n /**\n * Generate ALTER TABLE ... RENAME statement\n */\n renameTable(from: string, to: string): string {\n return `ALTER TABLE ${this.quoteIdentifier(from)} RENAME TO ${this.quoteIdentifier(to)}`;\n }\n\n /**\n * Generate ALTER TABLE statements\n */\n alterTable(definition: AlterTableDefinition): string[] {\n const statements: string[] = [];\n const tableName = this.quoteIdentifier(definition.tableName);\n\n for (const op of definition.operations) {\n switch (op.type) {\n case 'addColumn': {\n statements.push(`ALTER TABLE ${tableName} ADD COLUMN ${this.columnToSQL(op.column)}`);\n break;\n }\n\n case 'dropColumn': {\n statements.push(`ALTER TABLE ${tableName} DROP COLUMN ${this.quoteIdentifier(op.name)}`);\n break;\n }\n\n case 'renameColumn': {\n statements.push(\n `ALTER TABLE ${tableName} RENAME COLUMN ${this.quoteIdentifier(op.from)} TO ${this.quoteIdentifier(op.to)}`,\n );\n break;\n }\n\n case 'modifyColumn': {\n // PostgreSQL requires separate ALTER statements for each modification\n const col = op.column;\n\n // Change type\n statements.push(\n `ALTER TABLE ${tableName} ALTER COLUMN ${this.quoteIdentifier(col.name)} TYPE ${this.columnTypeToSQL(col)}`,\n );\n\n // Change nullable\n if (col.nullable) {\n statements.push(\n `ALTER TABLE ${tableName} ALTER COLUMN ${this.quoteIdentifier(col.name)} DROP NOT NULL`,\n );\n } else {\n statements.push(\n `ALTER TABLE ${tableName} ALTER COLUMN ${this.quoteIdentifier(col.name)} SET NOT NULL`,\n );\n }\n\n // Change default\n if (col.defaultRaw) {\n statements.push(\n `ALTER TABLE ${tableName} ALTER COLUMN ${this.quoteIdentifier(col.name)} SET DEFAULT ${col.defaultRaw}`,\n );\n } else if (col.defaultValue !== undefined) {\n statements.push(\n `ALTER TABLE ${tableName} ALTER COLUMN ${this.quoteIdentifier(col.name)} SET DEFAULT ${this.quoteValue(col.defaultValue)}`,\n );\n }\n break;\n }\n\n case 'addIndex': {\n statements.push(this.createIndex(definition.tableName, op.index));\n break;\n }\n\n case 'dropIndex': {\n statements.push(`DROP INDEX ${this.quoteIdentifier(op.name)}`);\n break;\n }\n\n case 'addForeignKey': {\n statements.push(`ALTER TABLE ${tableName} ADD ${this.foreignKeyToSQL(op.foreignKey)}`);\n break;\n }\n\n case 'dropForeignKey': {\n statements.push(\n `ALTER TABLE ${tableName} DROP CONSTRAINT ${this.quoteIdentifier(op.name)}`,\n );\n break;\n }\n\n case 'addPrimary': {\n const pkCols = op.columns.map((c) => this.quoteIdentifier(c)).join(', ');\n statements.push(`ALTER TABLE ${tableName} ADD PRIMARY KEY (${pkCols})`);\n break;\n }\n\n case 'dropPrimary': {\n // PostgreSQL requires knowing the constraint name\n statements.push(\n `ALTER TABLE ${tableName} DROP CONSTRAINT ${this.quoteIdentifier(`${definition.tableName}_pkey`)}`,\n );\n break;\n }\n }\n }\n\n return statements;\n }\n\n /**\n * Generate query to check if table exists\n */\n hasTable(tableName: string): string {\n return `SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = ${this.quoteValue(tableName)} LIMIT 1`;\n }\n\n /**\n * Generate query to check if column exists\n */\n hasColumn(tableName: string, columnName: string): string {\n return `SELECT 1 FROM information_schema.columns WHERE table_schema = 'public' AND table_name = ${this.quoteValue(tableName)} AND column_name = ${this.quoteValue(columnName)} LIMIT 1`;\n }\n\n /**\n * Create index statement\n */\n createIndex(tableName: string, index: IndexDefinition): string {\n const columns = index.columns.map((c) => this.quoteIdentifier(c)).join(', ');\n const indexName = index.name || `idx_${tableName}_${index.columns.join('_')}`;\n const unique = index.unique ? 'UNIQUE ' : '';\n\n return `CREATE ${unique}INDEX ${this.quoteIdentifier(indexName)} ON ${this.quoteIdentifier(tableName)} (${columns})`;\n }\n\n /**\n * Convert column definition to SQL\n */\n private columnToSQL(column: ColumnDefinition): string {\n const parts: string[] = [this.quoteIdentifier(column.name)];\n\n // Type\n parts.push(this.columnTypeToSQL(column));\n\n // Nullable\n if (!column.nullable) {\n parts.push('NOT NULL');\n }\n\n // Default value\n if (column.defaultRaw) {\n parts.push(`DEFAULT ${column.defaultRaw}`);\n } else if (column.defaultValue !== undefined) {\n parts.push(`DEFAULT ${this.quoteValue(column.defaultValue)}`);\n }\n\n // Primary key (inline)\n if (column.primary && column.type !== 'increments' && column.type !== 'bigIncrements') {\n parts.push('PRIMARY KEY');\n }\n\n // Unique (inline)\n if (column.unique && !column.primary) {\n parts.push('UNIQUE');\n }\n\n return parts.join(' ');\n }\n\n /**\n * Convert column type to PostgreSQL type\n */\n private columnTypeToSQL(column: ColumnDefinition): string {\n switch (column.type) {\n case 'increments': {\n return 'SERIAL PRIMARY KEY';\n }\n case 'bigIncrements': {\n return 'BIGSERIAL PRIMARY KEY';\n }\n case 'integer': {\n return 'INTEGER';\n }\n case 'bigInteger': {\n return 'BIGINT';\n }\n case 'smallInteger': {\n return 'SMALLINT';\n }\n case 'tinyInteger': {\n return 'SMALLINT';\n } // PostgreSQL doesn't have TINYINT\n case 'float': {\n return 'REAL';\n }\n case 'double': {\n return 'DOUBLE PRECISION';\n }\n case 'decimal': {\n const precision = column.precision ?? 10;\n const scale = column.scale ?? 2;\n return `NUMERIC(${precision},${scale})`;\n }\n case 'string': {\n return `VARCHAR(${column.length ?? 255})`;\n }\n case 'text':\n case 'mediumText':\n case 'longText': {\n return 'TEXT';\n }\n case 'boolean': {\n return 'BOOLEAN';\n }\n case 'date': {\n return 'DATE';\n }\n case 'datetime':\n case 'timestamp': {\n return 'TIMESTAMP';\n }\n case 'time': {\n return 'TIME';\n }\n case 'json': {\n return 'JSON';\n }\n case 'jsonb': {\n return 'JSONB';\n }\n case 'uuid': {\n return 'UUID';\n }\n case 'binary': {\n return 'BYTEA';\n }\n case 'enum': {\n // PostgreSQL uses VARCHAR with CHECK constraint for enums\n // or custom ENUM types (more complex)\n if (column.enumValues && column.enumValues.length > 0) {\n const values = column.enumValues.map((v) => this.quoteValue(v)).join(', ');\n return `VARCHAR(255) CHECK (${this.quoteIdentifier(column.name)} IN (${values}))`;\n }\n return 'VARCHAR(255)';\n }\n default: {\n return 'VARCHAR(255)';\n }\n }\n }\n\n /**\n * Convert foreign key definition to SQL\n */\n private foreignKeyToSQL(fk: ForeignKeyDefinition): string {\n const parts: string[] = ['CONSTRAINT'];\n\n if (fk.name) {\n parts.push(this.quoteIdentifier(fk.name));\n } else {\n parts.push(this.quoteIdentifier(`fk_${fk.column}_${fk.table}`));\n }\n\n parts.push(`FOREIGN KEY (${this.quoteIdentifier(fk.column)})`);\n parts.push(\n `REFERENCES ${this.quoteIdentifier(fk.table)} (${this.quoteIdentifier(fk.referenceColumn)})`,\n );\n\n if (fk.onDelete) {\n parts.push(`ON DELETE ${fk.onDelete}`);\n }\n\n if (fk.onUpdate) {\n parts.push(`ON UPDATE ${fk.onUpdate}`);\n }\n\n return parts.join(' ');\n }\n}\n","/**\n * Migration Lock\n * Prevents concurrent migration execution\n */\n\nimport { hostname } from 'node:os';\n\nimport { MySQLDialect } from '../schema/dialects/MySQLDialect';\nimport { PostgreSQLDialect } from '../schema/dialects/PostgreSQLDialect';\n\nimport type { DatabaseAdapter } from '../interfaces';\nimport type { SchemaDialect } from '../schema/types';\n\nexport interface MigrationLockOptions {\n tableName?: string;\n timeout?: number;\n dialect: 'mysql' | 'postgresql';\n}\n\nexport class MigrationLock {\n private adapter: DatabaseAdapter;\n private tableName: string;\n private timeout: number;\n private dialect: SchemaDialect;\n private lockId: string;\n private isLocked: boolean = false;\n\n constructor(adapter: DatabaseAdapter, options: MigrationLockOptions) {\n this.adapter = adapter;\n this.tableName = options.tableName ?? 'db_migrations_lock';\n this.timeout = options.timeout ?? 60000; // 60 seconds\n this.lockId = `${hostname()}_${process.pid}_${Date.now()}`;\n\n this.dialect = options.dialect === 'mysql' ? new MySQLDialect() : new PostgreSQLDialect();\n }\n\n /**\n * Initialize the lock table\n */\n async initialize(): Promise<void> {\n const tableName = this.dialect.quoteIdentifier(this.tableName);\n\n if (this.dialect.dialect === 'mysql') {\n await this.adapter.execute(`\n CREATE TABLE IF NOT EXISTS ${tableName} (\n id INT PRIMARY KEY,\n is_locked TINYINT NOT NULL DEFAULT 0,\n locked_at TIMESTAMP NULL,\n locked_by VARCHAR(255) NULL\n ) ENGINE=InnoDB\n `);\n } else {\n await this.adapter.execute(`\n CREATE TABLE IF NOT EXISTS ${tableName} (\n id INT PRIMARY KEY,\n is_locked BOOLEAN NOT NULL DEFAULT FALSE,\n locked_at TIMESTAMP NULL,\n locked_by VARCHAR(255) NULL\n )\n `);\n }\n\n // Insert initial row if not exists\n const checkSql =\n this.dialect.dialect === 'mysql'\n ? `SELECT 1 FROM ${tableName} WHERE id = 1`\n : `SELECT 1 FROM ${tableName} WHERE id = 1`;\n\n const result = await this.adapter.query(checkSql);\n\n if (result.rows.length === 0) {\n if (this.dialect.dialect === 'mysql') {\n await this.adapter.execute(`INSERT INTO ${tableName} (id, is_locked) VALUES (1, 0)`);\n } else {\n await this.adapter.execute(`INSERT INTO ${tableName} (id, is_locked) VALUES (1, FALSE)`);\n }\n }\n }\n\n /**\n * Acquire the migration lock\n */\n async acquire(): Promise<boolean> {\n const tableName = this.dialect.quoteIdentifier(this.tableName);\n const startTime = Date.now();\n\n while (Date.now() - startTime < this.timeout) {\n try {\n // Try to acquire lock with atomic update\n if (this.dialect.dialect === 'mysql') {\n const result = await this.adapter.execute(\n `\n UPDATE ${tableName}\n SET is_locked = 1,\n locked_at = NOW(),\n locked_by = ?\n WHERE id = 1 AND is_locked = 0\n `,\n [this.lockId],\n );\n\n if ((result.affectedRows ?? 0) > 0) {\n this.isLocked = true;\n return true;\n }\n } else {\n const result = await this.adapter.execute(\n `\n UPDATE ${tableName}\n SET is_locked = TRUE,\n locked_at = NOW(),\n locked_by = $1\n WHERE id = 1 AND is_locked = FALSE\n RETURNING id\n `,\n [this.lockId],\n );\n\n if (result.rows.length > 0) {\n this.isLocked = true;\n return true;\n }\n }\n\n // Check if lock is stale (held for more than timeout)\n const staleResult = await this.adapter.query<{\n locked_at: Date;\n locked_by: string;\n }>(`SELECT locked_at, locked_by FROM ${tableName} WHERE id = 1`);\n\n if (staleResult.rows.length > 0) {\n const lockedAt = staleResult.rows[0]!.locked_at;\n if (lockedAt && Date.now() - new Date(lockedAt).getTime() > this.timeout) {\n // Force release stale lock\n console.warn(\n `Releasing stale migration lock held by ${staleResult.rows[0]!.locked_by}`,\n );\n await this.forceRelease();\n continue;\n }\n }\n\n // Wait before retrying\n await this.sleep(1000);\n } catch (error) {\n console.error('Error acquiring migration lock:', error);\n throw error;\n }\n }\n\n return false;\n }\n\n /**\n * Release the migration lock\n */\n async release(): Promise<void> {\n if (!this.isLocked) {\n return;\n }\n\n const tableName = this.dialect.quoteIdentifier(this.tableName);\n\n try {\n if (this.dialect.dialect === 'mysql') {\n await this.adapter.execute(\n `\n UPDATE ${tableName}\n SET is_locked = 0,\n locked_at = NULL,\n locked_by = NULL\n WHERE id = 1 AND locked_by = ?\n `,\n [this.lockId],\n );\n } else {\n await this.adapter.execute(\n `\n UPDATE ${tableName}\n SET is_locked = FALSE,\n locked_at = NULL,\n locked_by = NULL\n WHERE id = 1 AND locked_by = $1\n `,\n [this.lockId],\n );\n }\n\n this.isLocked = false;\n } catch (error) {\n console.error('Error releasing migration lock:', error);\n throw error;\n }\n }\n\n /**\n * Force release the lock (for stale locks)\n */\n async forceRelease(): Promise<void> {\n const tableName = this.dialect.quoteIdentifier(this.tableName);\n\n if (this.dialect.dialect === 'mysql') {\n await this.adapter.execute(`\n UPDATE ${tableName}\n SET is_locked = 0,\n locked_at = NULL,\n locked_by = NULL\n WHERE id = 1\n `);\n } else {\n await this.adapter.execute(`\n UPDATE ${tableName}\n SET is_locked = FALSE,\n locked_at = NULL,\n locked_by = NULL\n WHERE id = 1\n `);\n }\n\n this.isLocked = false;\n }\n\n /**\n * Check if lock is currently held\n */\n async isHeld(): Promise<boolean> {\n const tableName = this.dialect.quoteIdentifier(this.tableName);\n const result = await this.adapter.query<{ is_locked: number | boolean }>(\n `SELECT is_locked FROM ${tableName} WHERE id = 1`,\n );\n\n if (result.rows.length === 0) {\n return false;\n }\n\n const isLocked = result.rows[0]!.is_locked;\n return isLocked === 1 || isLocked === true;\n }\n\n /**\n * Get lock info\n */\n async getLockInfo(): Promise<{\n isLocked: boolean;\n lockedAt: Date | null;\n lockedBy: string | null;\n }> {\n const tableName = this.dialect.quoteIdentifier(this.tableName);\n const result = await this.adapter.query<{\n is_locked: number | boolean;\n locked_at: Date | null;\n locked_by: string | null;\n }>(`SELECT is_locked, locked_at, locked_by FROM ${tableName} WHERE id = 1`);\n\n if (result.rows.length === 0) {\n return { isLocked: false, lockedAt: null, lockedBy: null };\n }\n\n const row = result.rows[0]!;\n return {\n isLocked: row.is_locked === 1 || row.is_locked === true,\n lockedAt: row.locked_at,\n lockedBy: row.locked_by,\n };\n }\n\n /**\n * Execute a function with lock\n */\n async withLock<T>(fn: () => Promise<T>): Promise<T> {\n const acquired = await this.acquire();\n if (!acquired) {\n throw new Error(\n `Could not acquire migration lock within ${this.timeout}ms. Another migration may be running.`,\n );\n }\n\n try {\n return await fn();\n } finally {\n await this.release();\n }\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","/**\n * Column Builder\n * Fluent API for defining table columns\n */\n\nimport type { ColumnDefinition, ColumnType, ForeignKeyAction, ForeignKeyDefinition } from './types';\n\nexport class ColumnBuilder {\n private definition: ColumnDefinition;\n\n constructor(name: string, type: ColumnType) {\n this.definition = {\n name,\n type,\n nullable: type !== 'increments' && type !== 'bigIncrements',\n unsigned: false,\n autoIncrement: type === 'increments' || type === 'bigIncrements',\n primary: type === 'increments' || type === 'bigIncrements',\n unique: false,\n index: false,\n first: false,\n };\n }\n\n /**\n * Set column length (for string types)\n */\n length(length: number): this {\n this.definition.length = length;\n return this;\n }\n\n /**\n * Set precision and scale (for decimal types)\n */\n precision(precision: number, scale?: number): this {\n this.definition.precision = precision;\n this.definition.scale = scale;\n return this;\n }\n\n /**\n * Mark column as nullable\n */\n nullable(): this {\n this.definition.nullable = true;\n return this;\n }\n\n /**\n * Mark column as not nullable\n */\n notNull(): this {\n this.definition.nullable = false;\n return this;\n }\n\n /**\n * Alias for notNull()\n */\n notNullable(): this {\n return this.notNull();\n }\n\n /**\n * Set default value\n */\n default(value: unknown): this {\n this.definition.defaultValue = value;\n return this;\n }\n\n /**\n * Set default value as raw SQL\n */\n defaultRaw(sql: string): this {\n this.definition.defaultRaw = sql;\n return this;\n }\n\n /**\n * Set default to current timestamp\n */\n defaultNow(): this {\n this.definition.defaultRaw = 'CURRENT_TIMESTAMP';\n return this;\n }\n\n /**\n * Mark column as unsigned (MySQL)\n */\n unsigned(): this {\n this.definition.unsigned = true;\n return this;\n }\n\n /**\n * Mark column as auto increment\n */\n autoIncrement(): this {\n this.definition.autoIncrement = true;\n return this;\n }\n\n /**\n * Mark column as primary key\n */\n primary(): this {\n this.definition.primary = true;\n return this;\n }\n\n /**\n * Mark column as unique\n */\n unique(): this {\n this.definition.unique = true;\n return this;\n }\n\n /**\n * Add index to column\n */\n index(): this {\n this.definition.index = true;\n return this;\n }\n\n /**\n * Add comment to column\n */\n comment(comment: string): this {\n this.definition.comment = comment;\n return this;\n }\n\n /**\n * Position column after another column (MySQL)\n */\n after(columnName: string): this {\n this.definition.after = columnName;\n return this;\n }\n\n /**\n * Position column first (MySQL)\n */\n first(): this {\n this.definition.first = true;\n return this;\n }\n\n /**\n * Set enum values\n */\n values(values: string[]): this {\n this.definition.enumValues = values;\n return this;\n }\n\n /**\n * Add foreign key reference\n */\n references(column: string): ForeignKeyBuilder {\n const fkBuilder = new ForeignKeyBuilder(this, column);\n return fkBuilder;\n }\n\n /**\n * Set foreign key definition (internal)\n */\n setForeignKey(fk: ForeignKeyDefinition): void {\n this.definition.references = fk;\n }\n\n /**\n * Get the column definition\n */\n getDefinition(): ColumnDefinition {\n return { ...this.definition };\n }\n}\n\n/**\n * Foreign Key Builder\n * Fluent API for defining foreign key constraints\n */\nexport class ForeignKeyBuilder {\n private columnBuilder: ColumnBuilder;\n private fkDefinition: Partial<ForeignKeyDefinition>;\n\n constructor(columnBuilder: ColumnBuilder, referenceColumn: string) {\n this.columnBuilder = columnBuilder;\n this.fkDefinition = {\n column: columnBuilder.getDefinition().name,\n referenceColumn,\n };\n }\n\n /**\n * Set the referenced table\n */\n on(tableName: string): this {\n this.fkDefinition.table = tableName;\n this.applyToColumn();\n return this;\n }\n\n /**\n * Alias for on()\n */\n inTable(tableName: string): this {\n return this.on(tableName);\n }\n\n /**\n * Set ON DELETE action\n */\n onDelete(action: ForeignKeyAction): this {\n this.fkDefinition.onDelete = action;\n this.applyToColumn();\n return this;\n }\n\n /**\n * Set ON UPDATE action\n */\n onUpdate(action: ForeignKeyAction): this {\n this.fkDefinition.onUpdate = action;\n this.applyToColumn();\n return this;\n }\n\n /**\n * Set constraint name\n */\n name(name: string): this {\n this.fkDefinition.name = name;\n this.applyToColumn();\n return this;\n }\n\n /**\n * Apply the foreign key definition to the column\n */\n private applyToColumn(): void {\n if (this.fkDefinition.table && this.fkDefinition.referenceColumn) {\n this.columnBuilder.setForeignKey(this.fkDefinition as ForeignKeyDefinition);\n }\n }\n\n /**\n * Get the column builder for chaining\n */\n getColumnBuilder(): ColumnBuilder {\n return this.columnBuilder;\n }\n}\n","/**\n * Table Builder\n * Fluent API for defining table structure\n */\n\nimport { ColumnBuilder } from './ColumnBuilder';\n\nimport type {\n ColumnDefinition,\n ForeignKeyDefinition,\n IndexDefinition,\n TableDefinition,\n ForeignKeyAction,\n} from './types';\n\nexport class TableBuilder {\n private tableName: string;\n private columns: ColumnDefinition[] = [];\n private indexes: IndexDefinition[] = [];\n private foreignKeys: ForeignKeyDefinition[] = [];\n private primaryKeyColumns?: string[];\n private tableEngine?: string;\n private tableCharset?: string;\n private tableCollation?: string;\n private tableComment?: string;\n\n constructor(tableName: string) {\n this.tableName = tableName;\n }\n\n // ============================================\n // Column Types\n // ============================================\n\n /**\n * Auto-incrementing integer primary key\n */\n increments(name: string = 'id'): ColumnBuilder {\n return this.addColumn(name, 'increments');\n }\n\n /**\n * Auto-incrementing big integer primary key\n */\n bigIncrements(name: string = 'id'): ColumnBuilder {\n return this.addColumn(name, 'bigIncrements');\n }\n\n /**\n * Integer column\n */\n integer(name: string): ColumnBuilder {\n return this.addColumn(name, 'integer');\n }\n\n /**\n * Big integer column\n */\n bigInteger(name: string): ColumnBuilder {\n return this.addColumn(name, 'bigInteger');\n }\n\n /**\n * Small integer column\n */\n smallInteger(name: string): ColumnBuilder {\n return this.addColumn(name, 'smallInteger');\n }\n\n /**\n * Tiny integer column\n */\n tinyInteger(name: string): ColumnBuilder {\n return this.addColumn(name, 'tinyInteger');\n }\n\n /**\n * Float column\n */\n float(name: string): ColumnBuilder {\n return this.addColumn(name, 'float');\n }\n\n /**\n * Double column\n */\n double(name: string): ColumnBuilder {\n return this.addColumn(name, 'double');\n }\n\n /**\n * Decimal column\n */\n decimal(name: string, precision: number = 10, scale: number = 2): ColumnBuilder {\n return this.addColumn(name, 'decimal').precision(precision, scale);\n }\n\n /**\n * String (VARCHAR) column\n */\n string(name: string, length: number = 255): ColumnBuilder {\n return this.addColumn(name, 'string').length(length);\n }\n\n /**\n * Text column\n */\n text(name: string): ColumnBuilder {\n return this.addColumn(name, 'text');\n }\n\n /**\n * Medium text column\n */\n mediumText(name: string): ColumnBuilder {\n return this.addColumn(name, 'mediumText');\n }\n\n /**\n * Long text column\n */\n longText(name: string): ColumnBuilder {\n return this.addColumn(name, 'longText');\n }\n\n /**\n * Boolean column\n */\n boolean(name: string): ColumnBuilder {\n return this.addColumn(name, 'boolean');\n }\n\n /**\n * Date column\n */\n date(name: string): ColumnBuilder {\n return this.addColumn(name, 'date');\n }\n\n /**\n * Datetime column\n */\n datetime(name: string): ColumnBuilder {\n return this.addColumn(name, 'datetime');\n }\n\n /**\n * Timestamp column\n */\n timestamp(name: string): ColumnBuilder {\n return this.addColumn(name, 'timestamp');\n }\n\n /**\n * Time column\n */\n time(name: string): ColumnBuilder {\n return this.addColumn(name, 'time');\n }\n\n /**\n * JSON column\n */\n json(name: string): ColumnBuilder {\n return this.addColumn(name, 'json');\n }\n\n /**\n * JSONB column (PostgreSQL)\n */\n jsonb(name: string): ColumnBuilder {\n return this.addColumn(name, 'jsonb');\n }\n\n /**\n * UUID column\n */\n uuid(name: string): ColumnBuilder {\n return this.addColumn(name, 'uuid');\n }\n\n /**\n * Binary column\n */\n binary(name: string): ColumnBuilder {\n return this.addColumn(name, 'binary');\n }\n\n /**\n * Enum column\n */\n enum(name: string, values: string[]): ColumnBuilder {\n return this.addColumn(name, 'enum').values(values);\n }\n\n // ============================================\n // Shortcut Methods\n // ============================================\n\n /**\n * Add created_at and updated_at timestamp columns\n */\n timestamps(): void {\n this.timestamp('created_at').notNull().defaultNow();\n this.timestamp('updated_at').notNull().defaultNow();\n }\n\n /**\n * Add deleted_at timestamp column for soft deletes\n */\n softDeletes(): ColumnBuilder {\n return this.timestamp('deleted_at').nullable();\n }\n\n /**\n * Add foreign id column with foreign key\n */\n foreignId(name: string): ColumnBuilder {\n // Extract table name from column name (e.g., user_id -> users)\n const tableName = `${name.replace(/_id$/, '')}s`;\n const column = this.integer(name).unsigned().notNull();\n // Add foreign key separately\n this.foreign(name).references('id').on(tableName);\n return column;\n }\n\n /**\n * Add UUID primary key column\n */\n uuidPrimary(name: string = 'id'): ColumnBuilder {\n return this.uuid(name).primary().notNull();\n }\n\n // ============================================\n // Indexes\n // ============================================\n\n /**\n * Add an index\n */\n index(columns: string | string[], name?: string): this {\n const columnArray = Array.isArray(columns) ? columns : [columns];\n this.indexes.push({\n name: name || `idx_${this.tableName}_${columnArray.join('_')}`,\n columns: columnArray,\n unique: false,\n });\n return this;\n }\n\n /**\n * Add a unique index\n */\n unique(columns: string | string[], name?: string): this {\n const columnArray = Array.isArray(columns) ? columns : [columns];\n this.indexes.push({\n name: name || `uniq_${this.tableName}_${columnArray.join('_')}`,\n columns: columnArray,\n unique: true,\n });\n return this;\n }\n\n /**\n * Add a fulltext index (MySQL)\n */\n fulltext(columns: string | string[], name?: string): this {\n const columnArray = Array.isArray(columns) ? columns : [columns];\n this.indexes.push({\n name: name || `ft_${this.tableName}_${columnArray.join('_')}`,\n columns: columnArray,\n unique: false,\n type: 'fulltext',\n });\n return this;\n }\n\n /**\n * Set primary key columns\n */\n primary(columns: string | string[]): this {\n this.primaryKeyColumns = Array.isArray(columns) ? columns : [columns];\n return this;\n }\n\n // ============================================\n // Foreign Keys\n // ============================================\n\n /**\n * Add a foreign key constraint\n */\n foreign(column: string): ForeignKeyChain {\n return new ForeignKeyChain(this, column);\n }\n\n /**\n * Add foreign key (internal)\n */\n addForeignKey(fk: ForeignKeyDefinition): void {\n this.foreignKeys.push(fk);\n }\n\n // ============================================\n // Table Options\n // ============================================\n\n /**\n * Set table engine (MySQL)\n */\n engine(engine: string): this {\n this.tableEngine = engine;\n return this;\n }\n\n /**\n * Set table charset (MySQL)\n */\n charset(charset: string): this {\n this.tableCharset = charset;\n return this;\n }\n\n /**\n * Set table collation (MySQL)\n */\n collation(collation: string): this {\n this.tableCollation = collation;\n return this;\n }\n\n /**\n * Set table comment\n */\n comment(comment: string): this {\n this.tableComment = comment;\n return this;\n }\n\n // ============================================\n // Internal Methods\n // ============================================\n\n /**\n * Add a column and return its builder\n */\n private addColumn(name: string, type: ColumnDefinition['type']): ColumnBuilder {\n const builder = new ColumnBuilder(name, type);\n // Store reference to add definition later\n this.columns.push(builder.getDefinition());\n // Return builder for chaining, but we need to update the stored definition\n const index = this.columns.length - 1;\n const proxy = new Proxy(builder, {\n get: (target, prop, receiver) => {\n const result = Reflect.get(target, prop, receiver);\n if (typeof result === 'function') {\n return (...args: unknown[]) => {\n const returnValue = result.apply(target, args);\n // Update stored definition after each method call\n this.columns[index] = target.getDefinition();\n return returnValue === target ? proxy : returnValue;\n };\n }\n return result;\n },\n });\n return proxy;\n }\n\n /**\n * Get the table definition\n */\n getDefinition(): TableDefinition {\n return {\n name: this.tableName,\n columns: [...this.columns],\n indexes: [...this.indexes],\n foreignKeys: [...this.foreignKeys],\n primaryKey: this.primaryKeyColumns,\n engine: this.tableEngine,\n charset: this.tableCharset,\n collation: this.tableCollation,\n comment: this.tableComment,\n };\n }\n}\n\n/**\n * Foreign Key Chain Builder\n */\nexport class ForeignKeyChain {\n private tableBuilder: TableBuilder;\n private fkDefinition: Partial<ForeignKeyDefinition>;\n\n constructor(tableBuilder: TableBuilder, column: string) {\n this.tableBuilder = tableBuilder;\n this.fkDefinition = { column };\n }\n\n /**\n * Set the referenced column\n */\n references(column: string): this {\n this.fkDefinition.referenceColumn = column;\n return this;\n }\n\n /**\n * Set the referenced table\n */\n on(tableName: string): this {\n this.fkDefinition.table = tableName;\n this.apply();\n return this;\n }\n\n /**\n * Alias for on()\n */\n inTable(tableName: string): this {\n return this.on(tableName);\n }\n\n /**\n * Set ON DELETE action\n */\n onDelete(action: ForeignKeyAction): this {\n this.fkDefinition.onDelete = action;\n this.apply();\n return this;\n }\n\n /**\n * Set ON UPDATE action\n */\n onUpdate(action: ForeignKeyAction): this {\n this.fkDefinition.onUpdate = action;\n this.apply();\n return this;\n }\n\n /**\n * Set constraint name\n */\n name(name: string): this {\n this.fkDefinition.name = name;\n this.apply();\n return this;\n }\n\n /**\n * Apply the foreign key to the table\n */\n private apply(): void {\n if (this.fkDefinition.column && this.fkDefinition.table && this.fkDefinition.referenceColumn) {\n // Generate default name if not set\n if (!this.fkDefinition.name) {\n this.fkDefinition.name = `fk_${this.fkDefinition.column}_${this.fkDefinition.table}`;\n }\n this.tableBuilder.addForeignKey(this.fkDefinition as ForeignKeyDefinition);\n }\n }\n}\n","/**\n * Schema Builder\n * Main API for database schema operations\n */\n\nimport { MySQLDialect } from './dialects/MySQLDialect';\nimport { PostgreSQLDialect } from './dialects/PostgreSQLDialect';\nimport { TableBuilder } from './TableBuilder';\n\nimport type {\n AlterOperation,\n AlterTableDefinition,\n ColumnDefinition,\n Dialect,\n SchemaDialect,\n ForeignKeyDefinition,\n} from './types';\nimport type { DatabaseAdapter } from '../interfaces';\n\nexport interface SchemaBuilderOptions {\n dialect: Dialect;\n adapter?: DatabaseAdapter;\n}\n\nexport class SchemaBuilder {\n private dialectInstance: SchemaDialect;\n private adapter?: DatabaseAdapter;\n\n constructor(options: SchemaBuilderOptions) {\n this.adapter = options.adapter;\n\n switch (options.dialect) {\n case 'mysql': {\n this.dialectInstance = new MySQLDialect();\n break;\n }\n case 'postgresql': {\n this.dialectInstance = new PostgreSQLDialect();\n break;\n }\n default: {\n throw new Error(`Unsupported dialect: ${options.dialect}`);\n }\n }\n }\n\n /**\n * Get the dialect instance\n */\n get dialect(): SchemaDialect {\n return this.dialectInstance;\n }\n\n /**\n * Create a new table\n */\n async createTable(tableName: string, callback: (table: TableBuilder) => void): Promise<void> {\n const builder = new TableBuilder(tableName);\n callback(builder);\n\n const definition = builder.getDefinition();\n const sql = this.dialectInstance.createTable(definition);\n\n await this.execute(sql);\n\n // Create indexes separately for PostgreSQL\n if (this.dialectInstance.dialect === 'postgresql' && definition.indexes.length > 0) {\n const pgDialect = this.dialectInstance as PostgreSQLDialect;\n for (const index of definition.indexes) {\n const indexSql = pgDialect.createIndex(tableName, index);\n await this.execute(indexSql);\n }\n }\n }\n\n /**\n * Create a table if it doesn't exist\n */\n async createTableIfNotExists(\n tableName: string,\n callback: (table: TableBuilder) => void,\n ): Promise<void> {\n const exists = await this.hasTable(tableName);\n if (!exists) {\n await this.createTable(tableName, callback);\n }\n }\n\n /**\n * Drop a table\n */\n async dropTable(tableName: string): Promise<void> {\n const sql = this.dialectInstance.dropTable(tableName);\n await this.execute(sql);\n }\n\n /**\n * Drop a table if it exists\n */\n async dropTableIfExists(tableName: string): Promise<void> {\n const sql = this.dialectInstance.dropTableIfExists(tableName);\n await this.execute(sql);\n }\n\n /**\n * Rename a table\n */\n async renameTable(from: string, to: string): Promise<void> {\n const sql = this.dialectInstance.renameTable(from, to);\n await this.execute(sql);\n }\n\n /**\n * Check if a table exists\n */\n async hasTable(tableName: string): Promise<boolean> {\n const sql = this.dialectInstance.hasTable(tableName);\n const result = await this.query(sql);\n return result.length > 0;\n }\n\n /**\n * Check if a column exists in a table\n */\n async hasColumn(tableName: string, columnName: string): Promise<boolean> {\n const sql = this.dialectInstance.hasColumn(tableName, columnName);\n const result = await this.query(sql);\n return result.length > 0;\n }\n\n /**\n * Alter a table\n */\n async alterTable(tableName: string, callback: (table: AlterTableBuilder) => void): Promise<void> {\n const builder = new AlterTableBuilder(tableName);\n callback(builder);\n\n const definition = builder.getDefinition();\n const statements = this.dialectInstance.alterTable(definition);\n\n for (const sql of statements) {\n await this.execute(sql);\n }\n }\n\n /**\n * Execute raw SQL\n */\n async raw(sql: string, params?: unknown[]): Promise<void> {\n await this.execute(sql, params);\n }\n\n /**\n * Execute SQL statement\n */\n private async execute(sql: string, params?: unknown[]): Promise<void> {\n if (this.adapter) {\n // Cast params to the expected type\n await this.adapter.execute(sql, params as import('../types').QueryParams);\n } else {\n // If no adapter, just log the SQL (useful for dry-run)\n // eslint-disable-next-line no-console\n console.log('SQL:', sql);\n if (params && params.length > 0) {\n // eslint-disable-next-line no-console\n console.log('Params:', params);\n }\n }\n }\n\n /**\n * Execute SQL query\n */\n private async query(sql: string): Promise<unknown[]> {\n if (this.adapter) {\n const result = await this.adapter.query(sql);\n return result.rows;\n }\n return [];\n }\n\n /**\n * Generate SQL without executing (for preview/dry-run)\n */\n generateCreateTableSQL(tableName: string, callback: (table: TableBuilder) => void): string {\n const builder = new TableBuilder(tableName);\n callback(builder);\n return this.dialectInstance.createTable(builder.getDefinition());\n }\n\n /**\n * Generate ALTER TABLE SQL without executing\n */\n generateAlterTableSQL(tableName: string, callback: (table: AlterTableBuilder) => void): string[] {\n const builder = new AlterTableBuilder(tableName);\n callback(builder);\n return this.dialectInstance.alterTable(builder.getDefinition());\n }\n}\n\n/**\n * Alter Table Builder\n * Builder for ALTER TABLE operations\n */\nexport class AlterTableBuilder {\n private tableName: string;\n private operations: AlterOperation[] = [];\n\n constructor(tableName: string) {\n this.tableName = tableName;\n }\n\n /**\n * Add a new column\n */\n addColumn(\n name: string,\n type: ColumnDefinition['type'],\n options?: Partial<Omit<ColumnDefinition, 'name' | 'type'>>,\n ): this {\n this.operations.push({\n type: 'addColumn',\n column: {\n name,\n type,\n nullable: true,\n unsigned: false,\n autoIncrement: false,\n primary: false,\n unique: false,\n index: false,\n first: false,\n ...options,\n },\n });\n return this;\n }\n\n /**\n * Drop a column\n */\n dropColumn(name: string): this {\n this.operations.push({ type: 'dropColumn', name });\n return this;\n }\n\n /**\n * Rename a column\n */\n renameColumn(from: string, to: string): this {\n this.operations.push({ type: 'renameColumn', from, to });\n return this;\n }\n\n /**\n * Modify a column\n */\n modifyColumn(\n name: string,\n type: ColumnDefinition['type'],\n options?: Partial<Omit<ColumnDefinition, 'name' | 'type'>>,\n ): this {\n this.operations.push({\n type: 'modifyColumn',\n column: {\n name,\n type,\n nullable: true,\n unsigned: false,\n autoIncrement: false,\n primary: false,\n unique: false,\n index: false,\n first: false,\n ...options,\n },\n });\n return this;\n }\n\n /**\n * Add an index\n */\n addIndex(columns: string | string[], name?: string): this {\n const columnArray = Array.isArray(columns) ? columns : [columns];\n this.operations.push({\n type: 'addIndex',\n index: {\n name: name || `idx_${this.tableName}_${columnArray.join('_')}`,\n columns: columnArray,\n unique: false,\n },\n });\n return this;\n }\n\n /**\n * Add a unique index\n */\n addUnique(columns: string | string[], name?: string): this {\n const columnArray = Array.isArray(columns) ? columns : [columns];\n this.operations.push({\n type: 'addIndex',\n index: {\n name: name || `uniq_${this.tableName}_${columnArray.join('_')}`,\n columns: columnArray,\n unique: true,\n },\n });\n return this;\n }\n\n /**\n * Drop an index\n */\n dropIndex(name: string): this {\n this.operations.push({ type: 'dropIndex', name });\n return this;\n }\n\n /**\n * Add a foreign key\n */\n addForeign(column: string): AlterForeignKeyBuilder {\n return new AlterForeignKeyBuilder(this, column);\n }\n\n /**\n * Add foreign key (internal)\n */\n addForeignKeyOperation(fk: ForeignKeyDefinition): void {\n this.operations.push({ type: 'addForeignKey', foreignKey: fk });\n }\n\n /**\n * Drop a foreign key\n */\n dropForeign(name: string): this {\n this.operations.push({ type: 'dropForeignKey', name });\n return this;\n }\n\n /**\n * Add primary key\n */\n addPrimary(columns: string | string[]): this {\n const columnArray = Array.isArray(columns) ? columns : [columns];\n this.operations.push({ type: 'addPrimary', columns: columnArray });\n return this;\n }\n\n /**\n * Drop primary key\n */\n dropPrimary(): this {\n this.operations.push({ type: 'dropPrimary' });\n return this;\n }\n\n /**\n * Get the alter table definition\n */\n getDefinition(): AlterTableDefinition {\n return {\n tableName: this.tableName,\n operations: [...this.operations],\n };\n }\n}\n\n/**\n * Alter Foreign Key Builder\n */\nclass AlterForeignKeyBuilder {\n private builder: AlterTableBuilder;\n private fkDefinition: Partial<ForeignKeyDefinition>;\n\n constructor(builder: AlterTableBuilder, column: string) {\n this.builder = builder;\n this.fkDefinition = { column };\n }\n\n references(column: string): this {\n this.fkDefinition.referenceColumn = column;\n return this;\n }\n\n on(tableName: string): this {\n this.fkDefinition.table = tableName;\n this.apply();\n return this;\n }\n\n onDelete(action: ForeignKeyDefinition['onDelete']): this {\n this.fkDefinition.onDelete = action;\n this.apply();\n return this;\n }\n\n onUpdate(action: ForeignKeyDefinition['onUpdate']): this {\n this.fkDefinition.onUpdate = action;\n this.apply();\n return this;\n }\n\n name(name: string): this {\n this.fkDefinition.name = name;\n this.apply();\n return this;\n }\n\n private apply(): void {\n if (this.fkDefinition.column && this.fkDefinition.table && this.fkDefinition.referenceColumn) {\n if (!this.fkDefinition.name) {\n this.fkDefinition.name = `fk_${this.fkDefinition.column}_${this.fkDefinition.table}`;\n }\n this.builder.addForeignKeyOperation(this.fkDefinition as ForeignKeyDefinition);\n }\n }\n}\n","/**\n * File Migration Runner\n * Enhanced migration runner with file-based loading, batch tracking, and locks\n */\n\nimport { createHash } from 'node:crypto';\n\nimport { MigrationLoader } from './MigrationLoader';\nimport { MigrationLock } from './MigrationLock';\nimport { SchemaBuilder } from '../schema';\n\nimport type { DatabaseAdapter } from '../interfaces';\nimport type { Logger } from '../types';\nimport type {\n Migration,\n MigrationConfig,\n MigrationRecord,\n MigrationStatus,\n BatchInfo,\n} from './types';\n\nexport interface FileMigrationRunnerOptions extends MigrationConfig {\n logger?: Logger;\n dryRun?: boolean;\n}\n\nexport class FileMigrationRunner {\n private adapter: DatabaseAdapter;\n private loader: MigrationLoader;\n private lock: MigrationLock;\n private schema: SchemaBuilder;\n private options: Required<Omit<FileMigrationRunnerOptions, 'logger'>> & {\n logger: Logger;\n };\n\n constructor(adapter: DatabaseAdapter, options: FileMigrationRunnerOptions) {\n this.adapter = adapter;\n this.options = {\n directory: options.directory,\n tableName: options.tableName ?? 'db_migrations',\n lockTableName: options.lockTableName ?? 'db_migrations_lock',\n lockTimeout: options.lockTimeout ?? 60000,\n validateChecksums: options.validateChecksums ?? true,\n dialect: options.dialect,\n logger: options.logger ?? console,\n dryRun: options.dryRun ?? false,\n };\n\n this.loader = new MigrationLoader(options.directory);\n this.lock = new MigrationLock(adapter, {\n tableName: this.options.lockTableName,\n timeout: this.options.lockTimeout,\n dialect: options.dialect,\n });\n this.schema = new SchemaBuilder({\n dialect: options.dialect,\n adapter,\n });\n }\n\n /**\n * Initialize migration tables\n */\n async initialize(): Promise<void> {\n if (this.options.dryRun) {\n this.options.logger.info('DRY RUN: Would create migration tables');\n return;\n }\n\n // Create migrations table\n const tableName = this.options.tableName;\n const hasTable = await this.schema.hasTable(tableName);\n\n if (!hasTable) {\n await this.schema.createTable(tableName, (table) => {\n table.increments('id');\n table.string('name', 255).notNull().unique();\n table.integer('batch').notNull();\n table.timestamp('executed_at').notNull().defaultNow();\n table.integer('execution_time_ms').notNull();\n table.string('checksum', 64).notNull();\n table.index('batch');\n table.index('executed_at');\n });\n this.options.logger.info(`Created migrations table: ${tableName}`);\n }\n\n // Initialize lock table\n await this.lock.initialize();\n }\n\n /**\n * Run all pending migrations\n */\n async latest(): Promise<string[]> {\n // Initialize lock table before trying to acquire lock\n await this.lock.initialize();\n\n return this.lock.withLock(async () => {\n await this.initialize();\n\n const pending = await this.getPendingMigrations();\n if (pending.length === 0) {\n this.options.logger.info('No pending migrations');\n return [];\n }\n\n const batch = await this.getNextBatch();\n const executed: string[] = [];\n\n this.options.logger.info(`Running ${pending.length} migrations (batch ${batch})`);\n\n for (const migration of pending) {\n await this.runMigration(migration, 'up', batch);\n executed.push(migration.name);\n }\n\n return executed;\n });\n }\n\n /**\n * Rollback the last batch of migrations\n */\n async rollback(steps: number = 1): Promise<string[]> {\n await this.lock.initialize();\n\n return this.lock.withLock(async () => {\n await this.initialize();\n\n const batches = await this.getLastBatches(steps);\n if (batches.length === 0) {\n this.options.logger.info('No migrations to rollback');\n return [];\n }\n\n const rolledBack: string[] = [];\n\n for (const batch of batches) {\n this.options.logger.info(`Rolling back batch ${batch.batch}`);\n\n // Rollback in reverse order\n const migrations = await this.loadMigrationsByName(\n batch.migrations.map((m) => m.name).reverse(),\n );\n\n for (const migration of migrations) {\n await this.runMigration(migration, 'down', batch.batch);\n rolledBack.push(migration.name);\n }\n }\n\n return rolledBack;\n });\n }\n\n /**\n * Reset all migrations\n */\n async reset(): Promise<string[]> {\n await this.lock.initialize();\n\n return this.lock.withLock(async () => {\n await this.initialize();\n\n const executed = await this.getExecutedMigrations();\n if (executed.length === 0) {\n this.options.logger.info('No migrations to reset');\n return [];\n }\n\n const rolledBack: string[] = [];\n\n // Rollback all in reverse order\n const migrations = await this.loadMigrationsByName(executed.map((m) => m.name).reverse());\n\n for (const migration of migrations) {\n const record = executed.find((e) => e.name === migration.name)!;\n await this.runMigration(migration, 'down', record.batch);\n rolledBack.push(migration.name);\n }\n\n return rolledBack;\n });\n }\n\n /**\n * Reset and re-run all migrations\n */\n async fresh(): Promise<string[]> {\n await this.reset();\n return this.latest();\n }\n\n /**\n * Get migration status\n */\n async status(): Promise<MigrationStatus[]> {\n await this.initialize();\n\n const allMigrations = await this.loader.getMigrationFiles();\n const executed = await this.getExecutedMigrations();\n const executedMap = new Map(executed.map((e) => [e.name, e]));\n\n return allMigrations.map((file) => {\n const record = executedMap.get(file.name);\n return {\n name: file.name,\n batch: record?.batch ?? null,\n executedAt: record?.executed_at ?? null,\n pending: !record,\n };\n });\n }\n\n /**\n * Validate migrations\n */\n async validate(): Promise<{ valid: boolean; errors: string[] }> {\n const errors: string[] = [];\n\n try {\n const migrations = await this.loader.loadAll();\n const executed = await this.getExecutedMigrations();\n\n // Check for missing migrations in codebase\n for (const record of executed) {\n const migration = migrations.find((m) => m.name === record.name);\n if (!migration) {\n errors.push(`Migration '${record.name}' exists in database but not in codebase`);\n continue;\n }\n\n // Validate checksum\n if (this.options.validateChecksums) {\n const checksum = this.calculateChecksum(migration);\n if (checksum !== record.checksum) {\n errors.push(\n `Checksum mismatch for migration '${record.name}'. The migration may have been modified.`,\n );\n }\n }\n }\n } catch (error) {\n errors.push(`Validation error: ${(error as Error).message}`);\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n }\n\n /**\n * Get pending migrations\n */\n async getPendingMigrations(): Promise<Migration[]> {\n const allMigrations = await this.loader.loadAll();\n const executed = await this.getExecutedMigrations();\n const executedNames = new Set(executed.map((e) => e.name));\n\n return allMigrations.filter((m) => !executedNames.has(m.name));\n }\n\n /**\n * Get executed migrations from database\n */\n private async getExecutedMigrations(): Promise<MigrationRecord[]> {\n const result = await this.adapter.query<MigrationRecord>(\n `SELECT * FROM ${this.options.tableName} ORDER BY id ASC`,\n );\n return result.rows;\n }\n\n /**\n * Get the next batch number\n */\n private async getNextBatch(): Promise<number> {\n const result = await this.adapter.query<{ max_batch: number | null }>(\n `SELECT MAX(batch) as max_batch FROM ${this.options.tableName}`,\n );\n return (result.rows[0]?.max_batch ?? 0) + 1;\n }\n\n /**\n * Get the last N batches\n */\n private async getLastBatches(count: number): Promise<BatchInfo[]> {\n const result = await this.adapter.query<MigrationRecord>(\n `SELECT * FROM ${this.options.tableName} ORDER BY batch DESC, id DESC`,\n );\n\n const batches = new Map<number, MigrationRecord[]>();\n for (const record of result.rows) {\n if (!batches.has(record.batch)) {\n batches.set(record.batch, []);\n }\n batches.get(record.batch)!.push(record);\n }\n\n const batchNumbers = Array.from(batches.keys()).slice(0, count);\n return batchNumbers.map((batch) => ({\n batch,\n migrations: batches.get(batch)!,\n }));\n }\n\n /**\n * Load migrations by name\n */\n private async loadMigrationsByName(names: string[]): Promise<Migration[]> {\n const allMigrations = await this.loader.loadAll();\n const migrationMap = new Map(allMigrations.map((m) => [m.name, m]));\n\n return names\n .map((name) => migrationMap.get(name))\n .filter((m): m is Migration => m !== undefined);\n }\n\n /**\n * Run a single migration\n */\n private async runMigration(\n migration: Migration,\n direction: 'up' | 'down',\n batch: number,\n ): Promise<void> {\n const startTime = Date.now();\n const action = direction === 'up' ? 'Running' : 'Rolling back';\n\n this.options.logger.info(`${action}: ${migration.name}`);\n\n if (this.options.dryRun) {\n this.options.logger.info(`DRY RUN: Would ${direction} ${migration.name}`);\n return;\n }\n\n const transaction = migration.transactional ? await this.adapter.beginTransaction() : null;\n\n try {\n // Create schema builder with transaction if applicable\n const schema = new SchemaBuilder({\n dialect: this.options.dialect,\n adapter: this.adapter,\n });\n\n // Run migration\n await migration[direction](schema);\n\n const executionTime = Date.now() - startTime;\n\n // Update migration record\n if (direction === 'up') {\n const checksum = this.calculateChecksum(migration);\n await this.adapter.execute(\n `INSERT INTO ${this.options.tableName}\n (name, batch, executed_at, execution_time_ms, checksum)\n VALUES (?, ?, NOW(), ?, ?)`,\n [migration.name, batch, executionTime, checksum],\n );\n } else {\n await this.adapter.execute(`DELETE FROM ${this.options.tableName} WHERE name = ?`, [\n migration.name,\n ]);\n }\n\n if (transaction) {\n await transaction.commit();\n }\n\n this.options.logger.info(\n `${direction === 'up' ? 'Completed' : 'Rolled back'}: ${migration.name} (${executionTime}ms)`,\n );\n } catch (error) {\n if (transaction) {\n await transaction.rollback();\n }\n throw new Error(\n `Failed to ${direction} migration '${migration.name}': ${(error as Error).message}`,\n );\n }\n }\n\n /**\n * Calculate migration checksum\n */\n private calculateChecksum(migration: Migration): string {\n const content = `${migration.name}:${migration.up.toString()}:${migration.down.toString()}`;\n return createHash('sha256').update(content).digest('hex');\n }\n}\n","/**\n * Expand/Contract Pattern Helpers\n *\n * Zero-downtime migration pattern that works in three phases:\n * 1. EXPAND - Add new columns/tables without breaking existing code\n * 2. MIGRATE - Move/transform data from old to new structures\n * 3. CONTRACT - Remove old columns/tables after code is updated\n *\n * Usage:\n * - Create separate migrations for each phase\n * - Deploy expand migrations first\n * - Update application code to use new structure\n * - Deploy migrate phase to copy/transform data\n * - Deploy contract phase to clean up old structure\n */\n\nimport type { DatabaseAdapter } from '../interfaces';\nimport type { SchemaBuilder } from '../schema';\n\nexport type Phase = 'expand' | 'migrate' | 'contract';\n\n/**\n * Expand/Contract migration interface\n */\nexport interface ExpandContractMigration {\n name: string;\n phase: Phase;\n description?: string;\n\n /** Run the expansion phase (add new structure) */\n expand?: (schema: SchemaBuilder) => Promise<void>;\n\n /** Run the migration phase (copy/transform data) */\n migrate?: (adapter: DatabaseAdapter, schema: SchemaBuilder) => Promise<void>;\n\n /** Run the contraction phase (remove old structure) */\n contract?: (schema: SchemaBuilder) => Promise<void>;\n\n /** Reverse expansion */\n rollbackExpand?: (schema: SchemaBuilder) => Promise<void>;\n\n /** Reverse data migration */\n rollbackMigrate?: (adapter: DatabaseAdapter, schema: SchemaBuilder) => Promise<void>;\n\n /** Reverse contraction */\n rollbackContract?: (schema: SchemaBuilder) => Promise<void>;\n}\n\n/**\n * Helper class for common expand/contract operations\n */\nexport class ExpandContractHelper {\n constructor(\n private readonly adapter: DatabaseAdapter,\n private readonly schema: SchemaBuilder,\n ) {}\n\n /**\n * Rename a column using expand/contract pattern\n * Expand: Add new column\n * Migrate: Copy data from old to new\n * Contract: Drop old column\n */\n async renameColumn(\n table: string,\n oldColumn: string,\n newColumn: string,\n phase: Phase,\n ): Promise<void> {\n switch (phase) {\n case 'expand': {\n // Get column definition from old column and add new one\n await this.schema.alterTable(table, (t) => {\n t.addColumn(newColumn, 'text'); // Will be overridden by actual type\n });\n break;\n }\n\n case 'migrate': {\n // Copy data from old column to new\n await this.adapter.execute(\n `UPDATE ${table} SET ${newColumn} = ${oldColumn} WHERE ${newColumn} IS NULL`,\n );\n break;\n }\n\n case 'contract': {\n await this.schema.alterTable(table, (t) => {\n t.dropColumn(oldColumn);\n });\n break;\n }\n }\n }\n\n /**\n * Change column type using expand/contract pattern\n */\n async changeColumnType(\n table: string,\n column: string,\n newType: string,\n transform: string, // SQL expression to transform data\n phase: Phase,\n ): Promise<void> {\n const tempColumn = `${column}_new`;\n\n switch (phase) {\n case 'expand': {\n await this.adapter.execute(`ALTER TABLE ${table} ADD COLUMN ${tempColumn} ${newType}`);\n break;\n }\n\n case 'migrate': {\n await this.adapter.execute(`UPDATE ${table} SET ${tempColumn} = ${transform}`);\n break;\n }\n\n case 'contract': {\n await this.adapter.execute(`ALTER TABLE ${table} DROP COLUMN ${column}`);\n await this.adapter.execute(`ALTER TABLE ${table} RENAME COLUMN ${tempColumn} TO ${column}`);\n break;\n }\n }\n }\n\n /**\n * Split a table into two tables using expand/contract\n */\n async splitTable(\n sourceTable: string,\n newTable: string,\n columnsToMove: string[],\n foreignKeyColumn: string,\n phase: Phase,\n ): Promise<void> {\n switch (phase) {\n case 'expand': {\n // Create new table with moved columns\n await this.schema.createTable(newTable, (t) => {\n t.increments('id');\n t.integer(foreignKeyColumn).notNull();\n // Columns will need to be added manually based on types\n });\n break;\n }\n\n case 'migrate': {\n // Copy data to new table\n const cols = columnsToMove.join(', ');\n await this.adapter.execute(\n `INSERT INTO ${newTable} (${foreignKeyColumn}, ${cols})\n SELECT id, ${cols} FROM ${sourceTable}`,\n );\n break;\n }\n\n case 'contract': {\n // Drop columns from original table\n for (const col of columnsToMove) {\n await this.schema.alterTable(sourceTable, (t) => {\n t.dropColumn(col);\n });\n }\n break;\n }\n }\n }\n\n /**\n * Merge two tables into one using expand/contract\n */\n async mergeTables(\n targetTable: string,\n sourceTable: string,\n columnsToMerge: string[],\n joinColumn: string,\n phase: Phase,\n ): Promise<void> {\n switch (phase) {\n case 'expand': {\n // Add columns to target table\n for (const col of columnsToMerge) {\n await this.schema.alterTable(targetTable, (t) => {\n t.addColumn(col, 'text'); // Type will be inferred\n });\n }\n break;\n }\n\n case 'migrate': {\n // Copy data from source to target\n const setClauses = columnsToMerge\n .map((col) => `${targetTable}.${col} = ${sourceTable}.${col}`)\n .join(', ');\n\n await this.adapter.execute(\n `UPDATE ${targetTable}\n SET ${setClauses}\n FROM ${sourceTable}\n WHERE ${targetTable}.id = ${sourceTable}.${joinColumn}`,\n );\n break;\n }\n\n case 'contract': {\n // Drop source table\n await this.schema.dropTable(sourceTable);\n break;\n }\n }\n }\n\n /**\n * Add NOT NULL constraint safely\n */\n async addNotNullConstraint(\n table: string,\n column: string,\n defaultValue: string,\n phase: Phase,\n ): Promise<void> {\n switch (phase) {\n case 'expand': {\n // Add default value for existing nulls\n await this.adapter.execute(\n `UPDATE ${table} SET ${column} = ${defaultValue} WHERE ${column} IS NULL`,\n );\n break;\n }\n\n case 'migrate': {\n // Ensure no nulls remain\n const result = await this.adapter.query<{ count: number }>(\n `SELECT COUNT(*) as count FROM ${table} WHERE ${column} IS NULL`,\n );\n if (result.rows[0]?.count && result.rows[0].count > 0) {\n throw new Error(\n `Cannot add NOT NULL: ${result.rows[0].count} rows still have NULL values`,\n );\n }\n break;\n }\n\n case 'contract': {\n // Add the NOT NULL constraint\n await this.schema.alterTable(table, (t) => {\n t.modifyColumn(column, 'text', { nullable: false });\n });\n break;\n }\n }\n }\n}\n\n/**\n * Create expand/contract helper for use in migrations\n */\nexport function createExpandContractHelper(\n adapter: DatabaseAdapter,\n schema: SchemaBuilder,\n): ExpandContractHelper {\n return new ExpandContractHelper(adapter, schema);\n}\n","/**\n * Seeder Loader\n * Load seeder files from directory\n */\n\nimport { readdir } from 'node:fs/promises';\nimport { resolve, basename } from 'node:path';\nimport { pathToFileURL } from 'node:url';\n\nimport type { Seeder, SeederFile } from './types';\n\nexport class SeederLoader {\n constructor(private readonly directory: string) {}\n\n /**\n * Load all seeder files from directory\n */\n async loadAll(): Promise<SeederFile[]> {\n // eslint-disable-next-line security/detect-non-literal-fs-filename -- directory is user-configured\n const files = await readdir(this.directory);\n\n const seederFiles = files\n .filter((f) => /\\.(ts|js|mjs)$/.test(f) && !f.endsWith('.d.ts'))\n .sort() // Alphabetical order\n .map((f) => ({\n name: this.getSeederName(f),\n path: resolve(this.directory, f),\n }));\n\n return seederFiles;\n }\n\n /**\n * Load a specific seeder by path\n */\n async load(seederPath: string): Promise<Seeder> {\n const fileUrl = pathToFileURL(seederPath).href;\n const module = await import(fileUrl);\n const seeder = module.default || module;\n\n if (!seeder || typeof seeder.run !== 'function') {\n throw new Error(`Invalid seeder: ${seederPath} - must export a run() function`);\n }\n\n return seeder;\n }\n\n /**\n * Get seeder name from filename\n */\n private getSeederName(filename: string): string {\n return basename(filename).replace(/\\.(ts|js|mjs)$/, '');\n }\n\n /**\n * Generate a new seeder filename\n */\n static generateFilename(name: string): string {\n // Convert to snake_case\n const snakeName = name\n .replaceAll(/([a-z])([A-Z])/g, '$1_$2')\n .replaceAll(/[\\s-]+/g, '_')\n .toLowerCase();\n\n return `${snakeName}_seeder.ts`;\n }\n\n /**\n * Get seeder template\n */\n static getSeederTemplate(name: string): string {\n const className = name\n .split('_')\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join('');\n\n return `/**\n * ${className} Seeder\n */\n\nimport type { Seeder, DatabaseAdapter } from '@db-bridge/core';\n\nexport default {\n async run(adapter: DatabaseAdapter): Promise<void> {\n // Insert seed data\n // await adapter.execute(\\`\n // INSERT INTO users (name, email) VALUES\n // ('John Doe', 'john@example.com'),\n // ('Jane Doe', 'jane@example.com')\n // \\`);\n },\n} satisfies Seeder;\n`;\n }\n}\n","/**\n * Seeder Runner\n * Execute seeders\n */\n\nimport { SeederLoader } from './SeederLoader';\n\nimport type { DatabaseAdapter } from '../interfaces';\nimport type { SeederRunnerOptions, SeederFile } from './types';\n\nexport interface SeederResult {\n name: string;\n success: boolean;\n error?: string;\n duration: number;\n}\n\nexport class SeederRunner {\n private readonly loader: SeederLoader;\n private readonly options: SeederRunnerOptions;\n\n constructor(\n private readonly adapter: DatabaseAdapter,\n options: SeederRunnerOptions,\n ) {\n this.options = options;\n this.loader = new SeederLoader(options.directory);\n }\n\n /**\n * Run all seeders (or filtered by options)\n */\n async run(): Promise<SeederResult[]> {\n const files = await this.loader.loadAll();\n const filteredFiles = this.filterSeeders(files);\n const results: SeederResult[] = [];\n\n for (const file of filteredFiles) {\n const startTime = Date.now();\n\n try {\n const seeder = await this.loader.load(file.path);\n await seeder.run(this.adapter);\n\n results.push({\n name: file.name,\n success: true,\n duration: Date.now() - startTime,\n });\n } catch (error) {\n results.push({\n name: file.name,\n success: false,\n error: (error as Error).message,\n duration: Date.now() - startTime,\n });\n\n // Stop on first error\n break;\n }\n }\n\n return results;\n }\n\n /**\n * Run a specific seeder by name\n */\n async runSeeder(name: string): Promise<SeederResult> {\n const files = await this.loader.loadAll();\n const file = files.find((f) => f.name === name || f.name === `${name}_seeder`);\n\n if (!file) {\n return {\n name,\n success: false,\n error: `Seeder not found: ${name}`,\n duration: 0,\n };\n }\n\n const startTime = Date.now();\n\n try {\n const seeder = await this.loader.load(file.path);\n await seeder.run(this.adapter);\n\n return {\n name: file.name,\n success: true,\n duration: Date.now() - startTime,\n };\n } catch (error) {\n return {\n name: file.name,\n success: false,\n error: (error as Error).message,\n duration: Date.now() - startTime,\n };\n }\n }\n\n /**\n * Filter seeders based on options\n */\n private filterSeeders(files: SeederFile[]): SeederFile[] {\n let filtered = files;\n\n // Filter by 'only' option\n if (this.options.only && this.options.only.length > 0) {\n filtered = filtered.filter((f) =>\n this.options.only!.some((name) => f.name === name || f.name === `${name}_seeder`),\n );\n }\n\n // Filter by 'except' option\n if (this.options.except && this.options.except.length > 0) {\n filtered = filtered.filter(\n (f) => !this.options.except!.some((name) => f.name === name || f.name === `${name}_seeder`),\n );\n }\n\n return filtered;\n }\n\n /**\n * List all available seeders\n */\n async list(): Promise<SeederFile[]> {\n return this.loader.loadAll();\n }\n}\n","import { EventEmitter } from 'eventemitter3';\n\nimport type { DatabaseAdapter } from '../interfaces';\nimport type { QueryOptions, QueryResult, QueryParams } from '../types';\n\nexport interface PerformanceTrace {\n id: string;\n operation: string;\n startTime: number;\n endTime?: number;\n duration?: number;\n metadata: Record<string, unknown>;\n status: 'started' | 'completed' | 'failed';\n error?: Error;\n parent?: string;\n children: string[];\n}\n\nexport interface QueryPlan {\n query: string;\n plan: string;\n cost: number;\n rows: number;\n width: number;\n actualTime?: number;\n actualRows?: number;\n}\n\nexport interface PerformanceReport {\n slowQueries: Array<{\n query: string;\n duration: number;\n timestamp: Date;\n params?: unknown[];\n }>;\n queryPlans: QueryPlan[];\n bottlenecks: Array<{\n operation: string;\n averageDuration: number;\n count: number;\n impact: number; // percentage of total time\n }>;\n recommendations: string[];\n}\n\nexport class PerformanceMonitor extends EventEmitter {\n private traces: Map<string, PerformanceTrace> = new Map();\n private slowQueries: Array<{\n query: string;\n duration: number;\n timestamp: Date;\n params?: unknown[];\n }> = [];\n private queryPlans: Map<string, QueryPlan> = new Map();\n private slowQueryThreshold: number;\n private maxTraces: number;\n private adapter: DatabaseAdapter;\n private enabled: boolean;\n\n constructor(\n adapter: DatabaseAdapter,\n options: {\n slowQueryThreshold?: number;\n maxTraces?: number;\n enabled?: boolean;\n } = {},\n ) {\n super();\n this.adapter = adapter;\n this.slowQueryThreshold = options.slowQueryThreshold ?? 1000; // 1 second\n this.maxTraces = options.maxTraces ?? 10_000;\n this.enabled = options.enabled ?? true;\n }\n\n startTrace(operation: string, metadata: Record<string, unknown> = {}, parent?: string): string {\n if (!this.enabled) {\n return '';\n }\n\n const id = this.generateTraceId();\n const trace: PerformanceTrace = {\n id,\n operation,\n startTime: performance.now(),\n metadata,\n status: 'started',\n parent,\n children: [],\n };\n\n this.traces.set(id, trace);\n\n // Add to parent's children if exists\n if (parent) {\n const parentTrace = this.traces.get(parent);\n if (parentTrace) {\n parentTrace.children.push(id);\n }\n }\n\n // Clean up old traces if needed\n if (this.traces.size > this.maxTraces) {\n const oldestTraces = Array.from(this.traces.entries())\n .sort(([, a], [, b]) => a.startTime - b.startTime)\n .slice(0, Math.floor(this.maxTraces * 0.1));\n\n oldestTraces.forEach(([id]) => this.traces.delete(id));\n }\n\n this.emit('traceStart', trace);\n return id;\n }\n\n endTrace(id: string, error?: Error): void {\n if (!this.enabled || !id) {\n return;\n }\n\n const trace = this.traces.get(id);\n if (!trace) {\n return;\n }\n\n trace.endTime = performance.now();\n trace.duration = trace.endTime - trace.startTime;\n trace.status = error ? 'failed' : 'completed';\n trace.error = error;\n\n // Check for slow operations\n if (trace.duration > this.slowQueryThreshold && trace.operation.includes('query')) {\n const queryInfo = {\n query: (trace.metadata['sql'] as string) || '',\n duration: trace.duration,\n timestamp: new Date(),\n params: trace.metadata['params'] as unknown[],\n };\n\n this.slowQueries.push(queryInfo);\n this.emit('slowQuery', queryInfo);\n\n // Keep only recent slow queries\n if (this.slowQueries.length > 100) {\n this.slowQueries = this.slowQueries.slice(-100);\n }\n }\n\n this.emit('traceEnd', trace);\n }\n\n async explainQuery(sql: string, params?: QueryParams): Promise<QueryPlan | null> {\n if (!this.enabled) {\n return null;\n }\n\n try {\n let explainSql: string;\n\n // Database-specific EXPLAIN syntax\n if (this.adapter.name === 'PostgreSQL') {\n explainSql = `EXPLAIN (ANALYZE, BUFFERS, FORMAT JSON) ${sql}`;\n } else if (this.adapter.name === 'MySQL') {\n explainSql = `EXPLAIN FORMAT=JSON ${sql}`;\n } else {\n return null;\n }\n\n const result = await this.adapter.query(explainSql, params);\n\n if (result.rows.length > 0) {\n const plan = this.parseExplainResult(result.rows[0] as Record<string, unknown>);\n if (plan) {\n this.queryPlans.set(sql, plan);\n return plan;\n }\n }\n } catch (error) {\n // Ignore explain errors\n this.emit('explainError', { sql, error });\n }\n\n return null;\n }\n\n private parseExplainResult(result: Record<string, unknown>): QueryPlan | null {\n try {\n if (this.adapter.name === 'PostgreSQL') {\n const planData = (result['QUERY PLAN'] as any[]) || result;\n const plan = Array.isArray(planData) ? planData[0] : planData;\n\n return {\n query: plan.Query || '',\n plan: JSON.stringify(plan.Plan || plan),\n cost: plan.Plan?.['Total Cost'] || 0,\n rows: plan.Plan?.['Plan Rows'] || 0,\n width: plan.Plan?.['Plan Width'] || 0,\n actualTime: plan.Plan?.['Actual Total Time'] || 0,\n actualRows: plan.Plan?.['Actual Rows'] || 0,\n };\n } else if (this.adapter.name === 'MySQL') {\n const plan = typeof result === 'string' ? JSON.parse(result as string) : result;\n const queryBlock = plan.query_block || {};\n\n return {\n query: '',\n plan: JSON.stringify(plan),\n cost: queryBlock.cost_info?.query_cost || 0,\n rows: queryBlock.table?.rows_examined_per_scan || 0,\n width: 0,\n };\n }\n } catch {\n // Failed to parse\n }\n\n return null;\n }\n\n async analyzePerformance(duration: number = 3_600_000): Promise<PerformanceReport> {\n const now = performance.now();\n const cutoff = now - duration;\n\n // Get recent traces\n const recentTraces = Array.from(this.traces.values()).filter(\n (trace) => trace.startTime > cutoff && trace.status === 'completed',\n );\n\n // Group by operation\n const operationStats = new Map<string, { totalTime: number; count: number }>();\n let totalTime = 0;\n\n recentTraces.forEach((trace) => {\n const stats = operationStats.get(trace.operation) || { totalTime: 0, count: 0 };\n stats.totalTime += trace.duration || 0;\n stats.count += 1;\n operationStats.set(trace.operation, stats);\n totalTime += trace.duration || 0;\n });\n\n // Identify bottlenecks\n const bottlenecks = Array.from(operationStats.entries())\n .map(([operation, stats]) => ({\n operation,\n averageDuration: stats.totalTime / stats.count,\n count: stats.count,\n impact: (stats.totalTime / totalTime) * 100,\n }))\n .sort((a, b) => b.impact - a.impact)\n .slice(0, 10);\n\n // Generate recommendations\n const recommendations: string[] = [];\n\n // Check for missing indexes\n const slowSelects = this.slowQueries.filter(\n (q) => q.query.toUpperCase().includes('SELECT') && q.duration > 2000,\n );\n if (slowSelects.length > 5) {\n recommendations.push('Consider adding indexes. Multiple slow SELECT queries detected.');\n }\n\n // Check for N+1 queries\n const queryGroups = new Map<string, number>();\n this.slowQueries.forEach((q) => {\n const normalized = q.query.replaceAll(/\\d+/g, '?').replaceAll(/\\s+/g, ' ');\n queryGroups.set(normalized, (queryGroups.get(normalized) || 0) + 1);\n });\n\n const repetitiveQueries = Array.from(queryGroups.entries()).filter(([, count]) => count > 10);\n\n if (repetitiveQueries.length > 0) {\n recommendations.push(\n 'Possible N+1 query problem detected. Consider using JOINs or batch loading.',\n );\n }\n\n // Check connection pool usage\n const poolStats = this.adapter.getPoolStats();\n if (poolStats.waiting > 0) {\n recommendations.push(\n `Connection pool exhaustion detected. Consider increasing pool size (current: ${poolStats.total}).`,\n );\n }\n\n // Check for long transactions\n const longTransactions = recentTraces.filter(\n (t) => t.operation.includes('transaction') && (t.duration || 0) > 5000,\n );\n if (longTransactions.length > 0) {\n recommendations.push(\n 'Long-running transactions detected. Consider breaking them into smaller units.',\n );\n }\n\n return {\n slowQueries: this.slowQueries.slice(-20),\n queryPlans: Array.from(this.queryPlans.values()),\n bottlenecks,\n recommendations,\n };\n }\n\n wrapAdapter(adapter: DatabaseAdapter): DatabaseAdapter {\n const originalQuery = adapter.query.bind(adapter);\n\n adapter.query = async <T = unknown>(\n sql: string,\n params?: QueryParams,\n options?: QueryOptions,\n ): Promise<QueryResult<T>> => {\n const traceId = this.startTrace('query', { sql, params });\n\n try {\n const result = await originalQuery<T>(sql, params, options);\n this.endTrace(traceId);\n\n // Analyze slow queries\n const trace = this.traces.get(traceId);\n if (trace?.duration && trace.duration > this.slowQueryThreshold) {\n this.explainQuery(sql, params).catch(() => {\n // Ignore explain errors\n });\n }\n\n return result;\n } catch (error) {\n this.endTrace(traceId, error as Error);\n throw error;\n }\n };\n\n return adapter;\n }\n\n reset(): void {\n this.traces.clear();\n this.slowQueries = [];\n this.queryPlans.clear();\n }\n\n enable(): void {\n this.enabled = true;\n }\n\n disable(): void {\n this.enabled = false;\n }\n\n isEnabled(): boolean {\n return this.enabled;\n }\n\n private generateTraceId(): string {\n return `trace_${Date.now()}_${Math.random().toString(36).slice(2, 11)}`;\n }\n\n getTraces(filter?: {\n operation?: string;\n status?: PerformanceTrace['status'];\n minDuration?: number;\n parent?: string;\n }): PerformanceTrace[] {\n let traces = Array.from(this.traces.values());\n\n if (filter) {\n if (filter.operation) {\n traces = traces.filter((t) => t.operation.includes(filter.operation!));\n }\n if (filter.status) {\n traces = traces.filter((t) => t.status === filter.status);\n }\n if (filter.minDuration !== undefined) {\n traces = traces.filter((t) => (t.duration || 0) >= filter.minDuration!);\n }\n if (filter.parent !== undefined) {\n traces = traces.filter((t) => t.parent === filter.parent);\n }\n }\n\n return traces.sort((a, b) => b.startTime - a.startTime);\n }\n\n getSlowQueries(limit = 20): typeof this.slowQueries {\n return this.slowQueries.slice(-limit);\n }\n\n exportTraces(): string {\n const traces = Array.from(this.traces.values());\n return JSON.stringify(traces, null, 2);\n }\n\n importTraces(data: string): void {\n try {\n const traces = JSON.parse(data) as PerformanceTrace[];\n traces.forEach((trace) => {\n this.traces.set(trace.id, trace);\n });\n } catch (error) {\n throw new Error(`Failed to import traces: ${(error as Error).message}`);\n }\n }\n}\n","import { EventEmitter } from 'eventemitter3';\n\nexport interface PerformanceTrace {\n id: string;\n operation: string;\n startTime: number;\n endTime?: number;\n duration?: number;\n metadata: Record<string, unknown>;\n status: 'started' | 'completed' | 'failed';\n error?: Error;\n parent?: string;\n children: string[];\n}\n\nexport class TraceBaseTrait extends EventEmitter {\n protected traces = new Map<string, PerformanceTrace>();\n protected enabled = true;\n protected maxTraces: number;\n\n constructor(maxTraces = 10_000, enabled = true) {\n super();\n this.maxTraces = maxTraces;\n this.enabled = enabled;\n }\n\n enable(): void {\n this.enabled = true;\n }\n\n disable(): void {\n this.enabled = false;\n }\n\n isEnabled(): boolean {\n return this.enabled;\n }\n\n protected generateTraceId(): string {\n return `trace_${Date.now()}_${Math.random().toString(36).slice(2, 11)}`;\n }\n\n getTraces(filter?: {\n operation?: string;\n status?: PerformanceTrace['status'];\n minDuration?: number;\n parent?: string;\n }): PerformanceTrace[] {\n let traces = Array.from(this.traces.values());\n\n if (filter) {\n if (filter.operation) {\n traces = traces.filter((t) => t.operation.includes(filter.operation!));\n }\n if (filter.status) {\n traces = traces.filter((t) => t.status === filter.status);\n }\n if (filter.minDuration !== undefined) {\n traces = traces.filter((t) => (t.duration || 0) >= filter.minDuration!);\n }\n if (filter.parent !== undefined) {\n traces = traces.filter((t) => t.parent === filter.parent);\n }\n }\n\n return traces.sort((a, b) => b.startTime - a.startTime);\n }\n\n exportTraces(): string {\n const traces = Array.from(this.traces.values());\n return JSON.stringify(traces, null, 2);\n }\n\n importTraces(data: string): void {\n try {\n const traces = JSON.parse(data) as PerformanceTrace[];\n traces.forEach((trace) => {\n this.traces.set(trace.id, trace);\n });\n } catch (error) {\n throw new Error(`Failed to import traces: ${(error as Error).message}`);\n }\n }\n\n reset(): void {\n this.traces.clear();\n }\n}\n","import { TraceBaseTrait } from './trace-base-trait';\n\nimport type { PerformanceTrace } from './trace-base-trait';\n\nexport class TraceManagementTrait extends TraceBaseTrait {\n startTrace(operation: string, metadata: Record<string, unknown> = {}, parent?: string): string {\n if (!this.enabled) {\n return '';\n }\n\n const id = this.generateTraceId();\n const trace: PerformanceTrace = {\n id,\n operation,\n startTime: performance.now(),\n metadata,\n status: 'started',\n parent,\n children: [],\n };\n\n this.traces.set(id, trace);\n\n // Add to parent's children if exists\n if (parent) {\n const parentTrace = this.traces.get(parent);\n if (parentTrace) {\n parentTrace.children.push(id);\n }\n }\n\n // Clean up old traces if needed\n if (this.traces.size > this.maxTraces) {\n this.cleanupOldTraces();\n }\n\n this.emit('traceStart', trace);\n return id;\n }\n\n endTrace(id: string, error?: Error): void {\n if (!this.enabled || !id) {\n return;\n }\n\n const trace = this.traces.get(id);\n if (!trace) {\n return;\n }\n\n trace.endTime = performance.now();\n trace.duration = trace.endTime - trace.startTime;\n trace.status = error ? 'failed' : 'completed';\n trace.error = error;\n\n this.emit('traceEnd', trace);\n }\n\n protected cleanupOldTraces(): void {\n const oldestTraces = Array.from(this.traces.entries())\n .sort(([, a], [, b]) => a.startTime - b.startTime)\n .slice(0, Math.floor(this.maxTraces * 0.1));\n\n oldestTraces.forEach(([id]) => this.traces.delete(id));\n }\n\n getTrace(id: string): PerformanceTrace | undefined {\n return this.traces.get(id);\n }\n\n getChildTraces(parentId: string): PerformanceTrace[] {\n const parent = this.traces.get(parentId);\n if (!parent) {\n return [];\n }\n\n return parent.children.map((id) => this.traces.get(id)).filter((trace) => trace !== undefined);\n }\n\n getTraceHierarchy(rootId: string): PerformanceTrace | null {\n const root = this.traces.get(rootId);\n if (!root) {\n return null;\n }\n\n const buildHierarchy = (trace: PerformanceTrace): PerformanceTrace => {\n const children = trace.children\n .map((id) => this.traces.get(id))\n .filter((child) => child !== undefined)\n .map((child) => buildHierarchy(child));\n\n return { ...trace, children: children as any };\n };\n\n return buildHierarchy(root);\n }\n}\n","import { TraceManagementTrait } from './trace-management-trait';\n\nimport type { DatabaseAdapter } from '../../interfaces';\nimport type { QueryParams } from '../../types';\n\nexport interface QueryPlan {\n query: string;\n plan: string;\n cost: number;\n rows: number;\n width: number;\n actualTime?: number;\n actualRows?: number;\n}\n\nexport class QueryAnalysisTrait extends TraceManagementTrait {\n protected adapter: DatabaseAdapter;\n protected slowQueryThreshold: number;\n protected slowQueries: Array<{\n query: string;\n duration: number;\n timestamp: Date;\n params?: unknown[];\n }> = [];\n protected queryPlans = new Map<string, QueryPlan>();\n\n constructor(\n adapter: DatabaseAdapter,\n slowQueryThreshold = 1000,\n maxTraces = 10_000,\n enabled = true,\n ) {\n super(maxTraces, enabled);\n this.adapter = adapter;\n this.slowQueryThreshold = slowQueryThreshold;\n }\n\n override endTrace(id: string, error?: Error): void {\n super.endTrace(id, error);\n\n const trace = this.traces.get(id);\n if (!trace?.duration) {\n return;\n }\n\n // Check for slow operations\n if (trace.duration > this.slowQueryThreshold && trace.operation.includes('query')) {\n const queryInfo = {\n query: (trace.metadata['sql'] as string) || '',\n duration: trace.duration,\n timestamp: new Date(),\n params: trace.metadata['params'] as unknown[],\n };\n\n this.slowQueries.push(queryInfo);\n this.emit('slowQuery', queryInfo);\n\n // Keep only recent slow queries\n if (this.slowQueries.length > 100) {\n this.slowQueries = this.slowQueries.slice(-100);\n }\n }\n }\n\n async explainQuery(sql: string, params?: QueryParams): Promise<QueryPlan | null> {\n if (!this.enabled) {\n return null;\n }\n\n try {\n let explainSql: string;\n\n // Database-specific EXPLAIN syntax\n if (this.adapter.name === 'PostgreSQL') {\n explainSql = `EXPLAIN (ANALYZE, BUFFERS, FORMAT JSON) ${sql}`;\n } else if (this.adapter.name === 'MySQL') {\n explainSql = `EXPLAIN FORMAT=JSON ${sql}`;\n } else {\n return null;\n }\n\n const result = await this.adapter.query(explainSql, params);\n\n if (result.rows.length > 0) {\n const plan = this.parseExplainResult(result.rows[0] as Record<string, unknown>);\n if (plan) {\n this.queryPlans.set(sql, plan);\n return plan;\n }\n }\n } catch (error) {\n this.emit('explainError', { sql, error });\n }\n\n return null;\n }\n\n protected parseExplainResult(result: Record<string, unknown>): QueryPlan | null {\n try {\n if (this.adapter.name === 'PostgreSQL') {\n const planData = (result['QUERY PLAN'] as any[]) || result;\n const plan = Array.isArray(planData) ? planData[0] : planData;\n\n return {\n query: plan.Query || '',\n plan: JSON.stringify(plan.Plan || plan),\n cost: plan.Plan?.['Total Cost'] || 0,\n rows: plan.Plan?.['Plan Rows'] || 0,\n width: plan.Plan?.['Plan Width'] || 0,\n actualTime: plan.Plan?.['Actual Total Time'] || 0,\n actualRows: plan.Plan?.['Actual Rows'] || 0,\n };\n } else if (this.adapter.name === 'MySQL') {\n const plan = typeof result === 'string' ? JSON.parse(result as string) : result;\n const queryBlock = plan.query_block || {};\n\n return {\n query: '',\n plan: JSON.stringify(plan),\n cost: queryBlock.cost_info?.query_cost || 0,\n rows: queryBlock.table?.rows_examined_per_scan || 0,\n width: 0,\n };\n }\n } catch {\n // Failed to parse\n }\n\n return null;\n }\n\n getSlowQueries(limit = 20): typeof this.slowQueries {\n return this.slowQueries.slice(-limit);\n }\n\n override reset(): void {\n super.reset();\n this.slowQueries = [];\n this.queryPlans.clear();\n }\n}\n","import { QueryAnalysisTrait } from './query-analysis-trait';\n\nexport interface PerformanceReport {\n slowQueries: Array<{\n query: string;\n duration: number;\n timestamp: Date;\n params?: unknown[];\n }>;\n queryPlans: any[];\n bottlenecks: Array<{\n operation: string;\n averageDuration: number;\n count: number;\n impact: number;\n }>;\n recommendations: string[];\n}\n\nexport class PerformanceAnalysisTrait extends QueryAnalysisTrait {\n async analyzePerformance(duration: number = 3_600_000): Promise<PerformanceReport> {\n const now = performance.now();\n const cutoff = now - duration;\n\n // Get recent traces\n const recentTraces = Array.from(this.traces.values()).filter(\n (trace) => trace.startTime > cutoff && trace.status === 'completed',\n );\n\n // Group by operation\n const operationStats = new Map<string, { totalTime: number; count: number }>();\n let totalTime = 0;\n\n recentTraces.forEach((trace) => {\n const stats = operationStats.get(trace.operation) || { totalTime: 0, count: 0 };\n stats.totalTime += trace.duration || 0;\n stats.count += 1;\n operationStats.set(trace.operation, stats);\n totalTime += trace.duration || 0;\n });\n\n // Identify bottlenecks\n const bottlenecks = Array.from(operationStats.entries())\n .map(([operation, stats]) => ({\n operation,\n averageDuration: stats.totalTime / stats.count,\n count: stats.count,\n impact: (stats.totalTime / totalTime) * 100,\n }))\n .sort((a, b) => b.impact - a.impact)\n .slice(0, 10);\n\n // Generate recommendations\n const recommendations = this.generateRecommendations(recentTraces);\n\n return {\n slowQueries: this.slowQueries.slice(-20),\n queryPlans: Array.from(this.queryPlans.values()),\n bottlenecks,\n recommendations,\n };\n }\n\n protected generateRecommendations(traces: any[]): string[] {\n const recommendations: string[] = [];\n\n // Check for missing indexes\n const slowSelects = this.slowQueries.filter(\n (q) => q.query.toUpperCase().includes('SELECT') && q.duration > 2000,\n );\n if (slowSelects.length > 5) {\n recommendations.push('Consider adding indexes. Multiple slow SELECT queries detected.');\n }\n\n // Check for N+1 queries\n const queryGroups = new Map<string, number>();\n this.slowQueries.forEach((q) => {\n const normalized = q.query.replaceAll(/\\d+/g, '?').replaceAll(/\\s+/g, ' ');\n queryGroups.set(normalized, (queryGroups.get(normalized) || 0) + 1);\n });\n\n const repetitiveQueries = Array.from(queryGroups.entries()).filter(([, count]) => count > 10);\n\n if (repetitiveQueries.length > 0) {\n recommendations.push(\n 'Possible N+1 query problem detected. Consider using JOINs or batch loading.',\n );\n }\n\n // Check connection pool usage\n const poolStats = this.adapter.getPoolStats();\n if (poolStats.waiting > 0) {\n recommendations.push(\n `Connection pool exhaustion detected. Consider increasing pool size (current: ${poolStats.total}).`,\n );\n }\n\n // Check for long transactions\n const longTransactions = traces.filter(\n (t) => t.operation.includes('transaction') && (t.duration || 0) > 5000,\n );\n if (longTransactions.length > 0) {\n recommendations.push(\n 'Long-running transactions detected. Consider breaking them into smaller units.',\n );\n }\n\n return recommendations;\n }\n\n getBottlenecks(limit = 10): Array<{ operation: string; avgDuration: number; count: number }> {\n const operationStats = new Map<string, { totalTime: number; count: number }>();\n\n Array.from(this.traces.values())\n .filter((trace) => trace.status === 'completed')\n .forEach((trace) => {\n const stats = operationStats.get(trace.operation) || { totalTime: 0, count: 0 };\n stats.totalTime += trace.duration || 0;\n stats.count += 1;\n operationStats.set(trace.operation, stats);\n });\n\n return Array.from(operationStats.entries())\n .map(([operation, stats]) => ({\n operation,\n avgDuration: stats.totalTime / stats.count,\n count: stats.count,\n }))\n .sort((a, b) => b.avgDuration - a.avgDuration)\n .slice(0, limit);\n }\n}\n","import { PerformanceAnalysisTrait } from './performance-analysis-trait';\n\nimport type { DatabaseAdapter } from '../../interfaces';\nimport type { QueryParams, QueryOptions, QueryResult } from '../../types';\n\nexport class AdapterWrapperTrait extends PerformanceAnalysisTrait {\n wrapAdapter(adapter: DatabaseAdapter): DatabaseAdapter {\n const originalQuery = adapter.query.bind(adapter);\n\n adapter.query = async <T = unknown>(\n sql: string,\n params?: QueryParams,\n options?: QueryOptions,\n ): Promise<QueryResult<T>> => {\n const traceId = this.startTrace('query', { sql, params });\n\n try {\n const result = await originalQuery<T>(sql, params, options);\n this.endTrace(traceId);\n\n // Analyze slow queries\n const trace = this.traces.get(traceId);\n if (trace?.duration && trace.duration > this.slowQueryThreshold) {\n this.explainQuery(sql, params).catch(() => {\n // Ignore explain errors\n });\n }\n\n return result;\n } catch (error) {\n this.endTrace(traceId, error as Error);\n throw error;\n }\n };\n\n // Wrap other methods\n this.wrapMethod(adapter, 'beginTransaction', 'transaction');\n this.wrapMethod(adapter, 'connect', 'connection');\n this.wrapMethod(adapter, 'disconnect', 'connection');\n\n return adapter;\n }\n\n protected wrapMethod(adapter: any, methodName: string, operationType: string): void {\n const original = adapter[methodName];\n if (typeof original !== 'function') {\n return;\n }\n\n adapter[methodName] = async (...args: any[]) => {\n const traceId = this.startTrace(`${operationType}.${methodName}`, {\n args: args.slice(0, 2), // Limit logged args\n });\n\n try {\n const result = await original.apply(adapter, args);\n this.endTrace(traceId);\n return result;\n } catch (error) {\n this.endTrace(traceId, error as Error);\n throw error;\n }\n };\n }\n\n unwrapAdapter(adapter: DatabaseAdapter): void {\n // This would restore original methods, but for simplicity\n // we recommend creating a new adapter instance instead\n this.emit('adapterUnwrapped', { adapter });\n }\n}\n","import { AdapterWrapperTrait } from './traits/adapter-wrapper-trait';\n\nimport type { DatabaseAdapter } from '../interfaces';\n\nexport * from './traits/trace-base-trait';\nexport * from './traits/query-analysis-trait';\nexport * from './traits/performance-analysis-trait';\n\n/**\n * Modular Performance Monitor\n * Refactored from 394 lines, 32 methods to modular traits\n */\nexport class ModularPerformanceMonitor extends AdapterWrapperTrait {\n constructor(\n adapter: DatabaseAdapter,\n options: {\n slowQueryThreshold?: number;\n maxTraces?: number;\n enabled?: boolean;\n } = {},\n ) {\n super(\n adapter,\n options.slowQueryThreshold ?? 1000,\n options.maxTraces ?? 10_000,\n options.enabled ?? true,\n );\n }\n}\n","import { createHash } from 'node:crypto';\n\n/**\n * Cache Key Pattern Types\n */\nexport type CacheKeyPattern =\n | 'table' // table:users\n | 'table:id' // table:users:123\n | 'table:query' // table:users:query:abc123\n | 'table:field' // table:users:email:test@test.com\n | 'custom'; // custom pattern\n\n/**\n * Cache Key Options\n */\nexport interface CacheKeyOptions {\n /** Namespace prefix (e.g., 'myapp', 'api') */\n namespace?: string;\n /** Table/collection name */\n table?: string;\n /** Primary key or ID */\n id?: string | number;\n /** Field name for field-based keys */\n field?: string;\n /** Field value */\n value?: unknown;\n /** SQL query (will be hashed) */\n query?: string;\n /** Query parameters */\n params?: unknown[];\n /** Custom key parts */\n parts?: string[];\n /** Tags for grouping (for bulk invalidation) */\n tags?: string[];\n}\n\n/**\n * Industry-standard Cache Key Generator\n *\n * Generates consistent, collision-free cache keys with support for:\n * - Namespacing\n * - Table-based keys\n * - Query hashing\n * - Tag-based grouping\n *\n * @example\n * ```typescript\n * const generator = new CacheKeyGenerator({ namespace: 'myapp' });\n *\n * // Simple table key\n * generator.forTable('users').build();\n * // => 'myapp:table:users'\n *\n * // Table with ID\n * generator.forTable('users').withId(123).build();\n * // => 'myapp:table:users:id:123'\n *\n * // Query-based key\n * generator.forQuery('SELECT * FROM users WHERE age > ?', [18]).build();\n * // => 'myapp:query:a1b2c3d4'\n *\n * // Field-based key\n * generator.forTable('users').withField('email', 'test@test.com').build();\n * // => 'myapp:table:users:field:email:098f6bcd'\n * ```\n */\nexport class CacheKeyGenerator {\n private readonly namespace: string;\n private readonly separator: string;\n private readonly hashAlgorithm: string;\n private readonly hashLength: number;\n\n private currentOptions: CacheKeyOptions = {};\n\n constructor(\n options: {\n namespace?: string;\n separator?: string;\n hashAlgorithm?: string;\n hashLength?: number;\n } = {},\n ) {\n this.namespace = options.namespace || 'cache';\n this.separator = options.separator || ':';\n this.hashAlgorithm = options.hashAlgorithm || 'sha256';\n this.hashLength = options.hashLength || 8;\n }\n\n /**\n * Start building a key for a table\n */\n forTable(table: string): this {\n this.currentOptions = { table };\n return this;\n }\n\n /**\n * Add ID to the key\n */\n withId(id: string | number): this {\n this.currentOptions.id = id;\n return this;\n }\n\n /**\n * Add field-based lookup\n */\n withField(field: string, value: unknown): this {\n this.currentOptions.field = field;\n this.currentOptions.value = value;\n return this;\n }\n\n /**\n * Add tags for bulk invalidation\n */\n withTags(...tags: string[]): this {\n this.currentOptions.tags = tags;\n return this;\n }\n\n /**\n * Create key for a SQL query\n */\n forQuery(sql: string, params?: unknown[]): this {\n this.currentOptions = { query: sql, params };\n return this;\n }\n\n /**\n * Create custom key with parts\n */\n forCustom(...parts: string[]): this {\n this.currentOptions = { parts };\n return this;\n }\n\n /**\n * Set namespace for this key\n */\n inNamespace(namespace: string): this {\n this.currentOptions.namespace = namespace;\n return this;\n }\n\n /**\n * Build the final cache key\n */\n build(): string {\n const parts: string[] = [];\n const opts = this.currentOptions;\n const ns = opts.namespace || this.namespace;\n\n // Add namespace\n parts.push(ns);\n\n // Build key based on options\n if (opts.query) {\n // Query-based key\n parts.push('query');\n parts.push(this.hashQuery(opts.query, opts.params));\n } else if (opts.table) {\n // Table-based key\n parts.push('table', opts.table);\n\n if (opts.id !== undefined) {\n parts.push('id');\n parts.push(String(opts.id));\n }\n\n if (opts.field && opts.value !== undefined) {\n parts.push('field', opts.field);\n parts.push(this.hashValue(opts.value));\n }\n } else if (opts.parts && opts.parts.length > 0) {\n // Custom parts\n parts.push(...opts.parts);\n }\n\n // Reset for next build\n const key = parts.join(this.separator);\n this.currentOptions = {};\n\n return key;\n }\n\n /**\n * Build key and return with tags\n */\n buildWithTags(): { key: string; tags: string[] } {\n const tags = this.currentOptions.tags || [];\n const opts = this.currentOptions;\n\n // Auto-generate table tag\n if (opts.table && !tags.includes(`table:${opts.table}`)) {\n tags.push(`table:${opts.table}`);\n }\n\n return {\n key: this.build(),\n tags,\n };\n }\n\n /**\n * Generate key for table:id pattern\n */\n tableId(table: string, id: string | number): string {\n return this.forTable(table).withId(id).build();\n }\n\n /**\n * Generate key for table:field:value pattern\n */\n tableField(table: string, field: string, value: unknown): string {\n return this.forTable(table).withField(field, value).build();\n }\n\n /**\n * Generate key from SQL query\n */\n query(sql: string, params?: unknown[]): string {\n return this.forQuery(sql, params).build();\n }\n\n /**\n * Generate wildcard pattern for bulk operations\n */\n pattern(table: string, pattern: '*' | 'id:*' | 'field:*' = '*'): string {\n const ns = this.namespace;\n if (pattern === '*') {\n return `${ns}${this.separator}table${this.separator}${table}${this.separator}*`;\n }\n return `${ns}${this.separator}table${this.separator}${table}${this.separator}${pattern}`;\n }\n\n /**\n * Generate tag key\n */\n tag(tagName: string): string {\n return `${this.namespace}${this.separator}tag${this.separator}${tagName}`;\n }\n\n /**\n * Hash a SQL query with params\n */\n private hashQuery(sql: string, params?: unknown[]): string {\n const content = JSON.stringify({ sql: sql.trim(), params: params || [] });\n return this.hash(content);\n }\n\n /**\n * Hash a value\n */\n private hashValue(value: unknown): string {\n const content = typeof value === 'string' ? value : JSON.stringify(value);\n return this.hash(content);\n }\n\n /**\n * Create hash of content\n */\n private hash(content: string): string {\n return createHash(this.hashAlgorithm)\n .update(content)\n .digest('hex')\n .slice(0, Math.max(0, this.hashLength));\n }\n\n /**\n * Create a new generator with different namespace\n */\n withNamespace(namespace: string): CacheKeyGenerator {\n return new CacheKeyGenerator({\n namespace,\n separator: this.separator,\n hashAlgorithm: this.hashAlgorithm,\n hashLength: this.hashLength,\n });\n }\n}\n\n/**\n * Default cache key generator instance\n */\nexport const cacheKey = new CacheKeyGenerator();\n","import { CacheKeyGenerator } from './cache-key-generator';\n\nimport type { CacheAdapter } from '../interfaces';\n\nexport interface CacheEntry<T = unknown> {\n data: T;\n cachedAt: number;\n expiresAt?: number;\n tags?: string[];\n}\n\nexport interface CacheStats {\n hits: number;\n misses: number;\n sets: number;\n deletes: number;\n invalidations: number;\n hitRate: number;\n}\n\nexport interface CacheManagerOptions {\n adapter: CacheAdapter;\n defaultTTL?: number;\n namespace?: string;\n enableStats?: boolean;\n keyPrefix?: string;\n}\n\nexport interface CacheSetOptions {\n ttl?: number;\n tags?: string[];\n skipIfExists?: boolean;\n}\n\nexport class CacheManager {\n private readonly adapter: CacheAdapter;\n private readonly defaultTTL: number;\n private readonly enableStats: boolean;\n private readonly keyPrefix: string;\n public readonly key: CacheKeyGenerator;\n\n private stats: CacheStats = {\n hits: 0,\n misses: 0,\n sets: 0,\n deletes: 0,\n invalidations: 0,\n hitRate: 0,\n };\n\n constructor(options: CacheManagerOptions) {\n this.adapter = options.adapter;\n this.defaultTTL = options.defaultTTL || 300;\n this.enableStats = options.enableStats ?? true;\n this.keyPrefix = options.keyPrefix || '';\n this.key = new CacheKeyGenerator({ namespace: options.namespace || 'cache' });\n }\n\n async get<T = unknown>(key: string): Promise<T | null> {\n const fullKey = this.getFullKey(key);\n const result = await this.adapter.get<CacheEntry<T>>(fullKey);\n if (result) {\n this.recordHit();\n return result.data;\n }\n this.recordMiss();\n return null;\n }\n\n async set<T = unknown>(key: string, data: T, options: CacheSetOptions = {}): Promise<void> {\n const fullKey = this.getFullKey(key);\n const ttl = options.ttl ?? this.defaultTTL;\n if (options.skipIfExists && (await this.adapter.exists(fullKey))) {\n return;\n }\n const entry: CacheEntry<T> = {\n data,\n cachedAt: Date.now(),\n expiresAt: ttl ? Date.now() + ttl * 1000 : undefined,\n tags: options.tags,\n };\n await this.adapter.set(fullKey, entry, ttl);\n if (options.tags?.length) {\n await this.addKeyToTags(fullKey, options.tags);\n }\n this.recordSet();\n }\n\n async getOrSet<T = unknown>(\n key: string,\n fetchFn: () => Promise<T>,\n options: CacheSetOptions = {},\n ): Promise<T> {\n const cached = await this.get<T>(key);\n if (cached !== null) {\n return cached;\n }\n const data = await fetchFn();\n await this.set(key, data, options);\n return data;\n }\n\n async delete(key: string): Promise<boolean> {\n const fullKey = this.getFullKey(key);\n const result = await this.adapter.delete(fullKey);\n if (result) {\n this.recordDelete();\n }\n return result;\n }\n\n async deleteMany(keys: string[]): Promise<number> {\n let deleted = 0;\n for (const key of keys) {\n if (await this.delete(key)) {\n deleted++;\n }\n }\n return deleted;\n }\n\n async exists(key: string): Promise<boolean> {\n return this.adapter.exists(this.getFullKey(key));\n }\n\n async invalidateByTag(tag: string): Promise<number> {\n const tagKey = this.key.tag(tag);\n const keys = await this.adapter.get<string[]>(tagKey);\n if (!keys?.length) {\n return 0;\n }\n let invalidated = 0;\n for (const key of keys) {\n if (await this.adapter.delete(key)) {\n invalidated++;\n }\n }\n await this.adapter.delete(tagKey);\n this.recordInvalidation(invalidated);\n return invalidated;\n }\n\n async invalidateByTags(tags: string[]): Promise<number> {\n let total = 0;\n for (const tag of tags) {\n total += await this.invalidateByTag(tag);\n }\n return total;\n }\n\n async invalidateTable(table: string): Promise<number> {\n return this.invalidateByTag(`table:${table}`);\n }\n\n async invalidateRecord(table: string, id: string | number): Promise<boolean> {\n return this.delete(this.key.tableId(table, id));\n }\n\n async clear(): Promise<void> {\n const adapter = this.adapter as CacheAdapter & { flushdb?: () => Promise<void> };\n if (adapter.flushdb) {\n await adapter.flushdb();\n }\n this.resetStats();\n }\n\n getStats(): CacheStats {\n const total = this.stats.hits + this.stats.misses;\n return { ...this.stats, hitRate: total > 0 ? this.stats.hits / total : 0 };\n }\n\n resetStats(): void {\n this.stats = { hits: 0, misses: 0, sets: 0, deletes: 0, invalidations: 0, hitRate: 0 };\n }\n\n async getTTL(key: string): Promise<number> {\n return this.adapter.ttl(this.getFullKey(key));\n }\n async extendTTL(key: string, ttl: number): Promise<boolean> {\n return this.adapter.expire(this.getFullKey(key), ttl);\n }\n\n scope(namespace: string): CacheManager {\n return new CacheManager({\n adapter: this.adapter,\n defaultTTL: this.defaultTTL,\n namespace,\n enableStats: this.enableStats,\n keyPrefix: this.keyPrefix,\n });\n }\n\n private getFullKey(key: string): string {\n return this.keyPrefix ? `${this.keyPrefix}:${key}` : key;\n }\n\n private async addKeyToTags(key: string, tags: string[]): Promise<void> {\n for (const tag of tags) {\n const tagKey = this.key.tag(tag);\n const existing = (await this.adapter.get<string[]>(tagKey)) || [];\n if (!existing.includes(key)) {\n existing.push(key);\n await this.adapter.set(tagKey, existing);\n }\n }\n }\n\n private recordHit(): void {\n if (this.enableStats) {\n this.stats.hits++;\n }\n }\n private recordMiss(): void {\n if (this.enableStats) {\n this.stats.misses++;\n }\n }\n private recordSet(): void {\n if (this.enableStats) {\n this.stats.sets++;\n }\n }\n private recordDelete(): void {\n if (this.enableStats) {\n this.stats.deletes++;\n }\n }\n private recordInvalidation(count: number): void {\n if (this.enableStats) {\n this.stats.invalidations += count;\n }\n }\n}\n","import { generateCacheKey } from '../utils';\n\nimport type { QueryResult } from '../types';\n\nexport interface CacheStrategy {\n shouldCache(sql: string, result: QueryResult): boolean;\n getCacheTTL(sql: string, options?: QueryCacheOptions): number;\n getCacheKey(sql: string, params?: unknown[], options?: QueryCacheOptions): string;\n getInvalidationPatterns(sql: string): string[];\n}\n\nexport interface QueryCacheOptions {\n ttl?: number;\n key?: string;\n tags?: string[];\n invalidateOn?: string[];\n compress?: boolean;\n cacheEmpty?: boolean;\n cacheErrors?: boolean;\n}\n\nexport class DefaultCacheStrategy implements CacheStrategy {\n private readonly cacheableCommands = ['SELECT', 'SHOW', 'DESCRIBE'];\n private readonly defaultTTL = 3600; // 1 hour\n\n shouldCache(sql: string, result: QueryResult): boolean {\n const command = sql.trim().split(/\\s+/)[0]?.toUpperCase();\n\n // Only cache read operations\n if (!command || !this.cacheableCommands.includes(command)) {\n return false;\n }\n\n // Don't cache empty results by default\n if (result.rowCount === 0) {\n return false;\n }\n\n // Don't cache very large results\n const resultSize = JSON.stringify(result).length;\n if (resultSize > 1024 * 1024) {\n // 1MB\n return false;\n }\n\n return true;\n }\n\n getCacheTTL(sql: string, options?: QueryCacheOptions): number {\n if (options?.ttl !== undefined) {\n return options.ttl;\n }\n\n // Different TTLs for different query types\n const upperSql = sql.toUpperCase();\n\n if (upperSql.includes('COUNT(') || upperSql.includes('SUM(')) {\n return 300; // 5 minutes for aggregates\n }\n\n if (upperSql.includes('JOIN')) {\n return 600; // 10 minutes for joins\n }\n\n return this.defaultTTL;\n }\n\n getCacheKey(sql: string, params?: unknown[], options?: QueryCacheOptions): string {\n if (options?.key) {\n return options.key;\n }\n\n return generateCacheKey(sql, params);\n }\n\n getInvalidationPatterns(sql: string): string[] {\n const patterns: string[] = [];\n const tables = this.extractTableNames(sql);\n\n tables.forEach((table) => {\n patterns.push(`table:${table}:*`, `query:*${table}*`);\n });\n\n return patterns;\n }\n\n protected extractTableNames(sql: string): string[] {\n const tables: string[] = [];\n const patterns = [\n /from\\s+`?(\\w+)`?/gi,\n /join\\s+`?(\\w+)`?/gi,\n /update\\s+`?(\\w+)`?/gi,\n /insert\\s+into\\s+`?(\\w+)`?/gi,\n /delete\\s+from\\s+`?(\\w+)`?/gi,\n ];\n\n patterns.forEach((pattern) => {\n let match;\n while ((match = pattern.exec(sql)) !== null) {\n if (match[1]) {\n tables.push(match[1].toLowerCase());\n }\n }\n });\n\n return [...new Set(tables)];\n }\n}\n\nexport class SmartCacheStrategy extends DefaultCacheStrategy {\n private queryPatterns = new Map<string, { hits: number; avgDuration: number }>();\n\n override shouldCache(sql: string, result: QueryResult): boolean {\n if (!super.shouldCache(sql, result)) {\n return false;\n }\n\n // Learn from query patterns\n const pattern = this.normalizeQuery(sql);\n const stats = this.queryPatterns.get(pattern);\n\n if (stats) {\n // Cache frequently accessed queries\n if (stats.hits > 10) {\n return true;\n }\n\n // Cache slow queries\n if (stats.avgDuration > 100) {\n return true;\n }\n }\n\n return true;\n }\n\n override getCacheTTL(sql: string, options?: QueryCacheOptions): number {\n const baseTTL = super.getCacheTTL(sql, options);\n const pattern = this.normalizeQuery(sql);\n const stats = this.queryPatterns.get(pattern);\n\n if (stats) {\n // Longer TTL for frequently accessed queries\n if (stats.hits > 100) {\n return baseTTL * 2;\n }\n\n // Shorter TTL for rarely accessed queries\n if (stats.hits < 5) {\n return baseTTL / 2;\n }\n }\n\n return baseTTL;\n }\n\n recordQueryExecution(sql: string, duration: number): void {\n const pattern = this.normalizeQuery(sql);\n const stats = this.queryPatterns.get(pattern) || { hits: 0, avgDuration: 0 };\n\n stats.avgDuration = (stats.avgDuration * stats.hits + duration) / (stats.hits + 1);\n stats.hits++;\n\n this.queryPatterns.set(pattern, stats);\n }\n\n private normalizeQuery(sql: string): string {\n // Normalize query to identify patterns\n return sql\n .replaceAll(/\\s+/g, ' ')\n .replaceAll(/\\d+/g, '?')\n .replaceAll(/'[^']*'/g, '?')\n .toLowerCase()\n .trim();\n }\n}\n","/**\n * Cache API - Industry-leading cache interface\n *\n * Inspired by Drizzle ORM's $cache API, TypeORM's simplicity,\n * and enhanced with additional features.\n *\n * @example\n * ```typescript\n * // Invalidate by tables\n * await db.$cache.invalidate({ tables: ['users'] });\n *\n * // Invalidate by tags\n * await db.$cache.invalidate({ tags: ['user-123'] });\n *\n * // Get statistics\n * const stats = db.$cache.stats();\n *\n * // Clear all cache\n * await db.$cache.clear();\n *\n * // Warmup cache\n * await db.$cache.warmup([\n * { sql: 'SELECT * FROM settings', ttl: 86400 }\n * ]);\n * ```\n */\n\nimport { CacheKeyGenerator } from './cache-key-generator';\n\nimport type { CacheAdapter } from '../interfaces';\nimport type { Logger } from '../types';\n\nexport interface CacheInvalidateOptions {\n /** Table names to invalidate */\n tables?: string | string[];\n /** Custom tags to invalidate */\n tags?: string | string[];\n}\n\nexport interface CacheWarmupQuery {\n sql: string;\n params?: unknown[];\n ttl?: number;\n tags?: string[];\n}\n\nexport interface CacheAPIStats {\n hits: number;\n misses: number;\n sets: number;\n deletes: number;\n invalidations: number;\n hitRate: number;\n size: number;\n memoryUsage?: number;\n}\n\nexport interface CacheAPIOptions {\n adapter: CacheAdapter;\n namespace?: string;\n logger?: Logger;\n onHit?: (key: string, sql: string) => void;\n onMiss?: (key: string, sql: string) => void;\n onError?: (error: Error, key: string) => void;\n}\n\n/**\n * Cache API - Drizzle-style $cache interface\n */\nexport class CacheAPI {\n private adapter: CacheAdapter;\n private keyGenerator: CacheKeyGenerator;\n private logger?: Logger;\n private stats: CacheAPIStats;\n private tableKeyMap: Map<string, Set<string>> = new Map();\n private tagKeyMap: Map<string, Set<string>> = new Map();\n\n // Callbacks\n public onHit?: (key: string, sql: string) => void;\n public onMiss?: (key: string, sql: string) => void;\n public onError?: (error: Error, key: string) => void;\n\n constructor(options: CacheAPIOptions) {\n this.adapter = options.adapter;\n this.keyGenerator = new CacheKeyGenerator({\n namespace: options.namespace || 'db-bridge',\n });\n this.logger = options.logger;\n this.onHit = options.onHit;\n this.onMiss = options.onMiss;\n this.onError = options.onError;\n\n this.stats = {\n hits: 0,\n misses: 0,\n sets: 0,\n deletes: 0,\n invalidations: 0,\n hitRate: 0,\n size: 0,\n };\n }\n\n /**\n * Invalidate cache by tables or tags\n *\n * @example\n * ```typescript\n * // Single table\n * await db.$cache.invalidate({ tables: 'users' });\n *\n * // Multiple tables\n * await db.$cache.invalidate({ tables: ['users', 'posts'] });\n *\n * // By tags\n * await db.$cache.invalidate({ tags: ['user-123', 'active-users'] });\n *\n * // Combined\n * await db.$cache.invalidate({\n * tables: ['users'],\n * tags: ['premium-users']\n * });\n * ```\n */\n async invalidate(options: CacheInvalidateOptions): Promise<number> {\n let invalidated = 0;\n\n // Invalidate by tables\n if (options.tables) {\n const tables = Array.isArray(options.tables) ? options.tables : [options.tables];\n\n for (const table of tables) {\n const keys = this.tableKeyMap.get(table) || new Set();\n\n for (const key of keys) {\n try {\n const deleted = await this.adapter.delete(key);\n if (deleted) {\n invalidated++;\n this.stats.deletes++;\n }\n } catch (error) {\n this.handleError(error as Error, key);\n }\n }\n\n // Also try pattern-based deletion\n try {\n const pattern = `*:table:${table}:*`;\n const patternKeys = await this.adapter.keys(pattern);\n for (const key of patternKeys) {\n const deleted = await this.adapter.delete(key);\n if (deleted) {\n invalidated++;\n }\n }\n } catch {\n // Pattern matching not supported, skip\n }\n\n this.tableKeyMap.delete(table);\n this.logger?.debug(`Invalidated table cache: ${table}`, { count: keys.size });\n }\n }\n\n // Invalidate by tags\n if (options.tags) {\n const tags = Array.isArray(options.tags) ? options.tags : [options.tags];\n\n for (const tag of tags) {\n const tagKey = this.keyGenerator.tag(tag);\n\n try {\n // Get all keys associated with this tag\n const keys = (await this.adapter.get<string[]>(tagKey)) || [];\n\n for (const key of keys) {\n const deleted = await this.adapter.delete(key);\n if (deleted) {\n invalidated++;\n this.stats.deletes++;\n }\n }\n\n // Delete the tag key itself\n await this.adapter.delete(tagKey);\n this.tagKeyMap.delete(tag);\n\n this.logger?.debug(`Invalidated tag cache: ${tag}`, { count: keys.length });\n } catch (error) {\n this.handleError(error as Error, tagKey);\n }\n }\n }\n\n this.stats.invalidations += invalidated;\n this.updateHitRate();\n\n return invalidated;\n }\n\n /**\n * Clear all cache\n */\n async clear(): Promise<void> {\n try {\n await this.adapter.clear();\n this.tableKeyMap.clear();\n this.tagKeyMap.clear();\n this.stats.size = 0;\n this.logger?.info('Cache cleared');\n } catch (error) {\n this.handleError(error as Error, '*');\n }\n }\n\n /**\n * Warmup cache with predefined queries\n *\n * @example\n * ```typescript\n * await db.$cache.warmup([\n * { sql: 'SELECT * FROM settings', ttl: 86400 },\n * { sql: 'SELECT * FROM categories', ttl: 3600, tags: ['catalog'] }\n * ]);\n * ```\n */\n async warmup(\n queries: CacheWarmupQuery[],\n executor: (sql: string, params?: unknown[]) => Promise<unknown>,\n ): Promise<{ success: number; failed: number }> {\n let success = 0;\n let failed = 0;\n\n this.logger?.info('Cache warmup started', { count: queries.length });\n\n for (const query of queries) {\n try {\n const result = await executor(query.sql, query.params);\n const key = this.keyGenerator.query(query.sql, query.params);\n\n await this.set(key, result, {\n ttl: query.ttl,\n tags: query.tags,\n tables: this.extractTables(query.sql),\n });\n\n success++;\n this.logger?.debug('Warmup query cached', { sql: query.sql });\n } catch (error) {\n failed++;\n this.logger?.error('Warmup query failed', { sql: query.sql, error });\n }\n }\n\n this.logger?.info('Cache warmup completed', { success, failed });\n return { success, failed };\n }\n\n /**\n * Get cache statistics\n */\n getStats(): CacheAPIStats {\n return { ...this.stats };\n }\n\n /**\n * Reset statistics\n */\n resetStats(): void {\n this.stats = {\n hits: 0,\n misses: 0,\n sets: 0,\n deletes: 0,\n invalidations: 0,\n hitRate: 0,\n size: this.stats.size,\n };\n }\n\n /**\n * Get cached value\n */\n async get<T>(key: string): Promise<T | null> {\n try {\n const value = await this.adapter.get<T>(key);\n\n if (value === null) {\n this.stats.misses++;\n this.onMiss?.(key, '');\n } else {\n this.stats.hits++;\n this.onHit?.(key, '');\n }\n\n this.updateHitRate();\n return value;\n } catch (error) {\n this.handleError(error as Error, key);\n return null;\n }\n }\n\n /**\n * Set cached value with metadata\n */\n async set<T>(\n key: string,\n value: T,\n options?: {\n ttl?: number;\n tags?: string[];\n tables?: string[];\n },\n ): Promise<void> {\n try {\n await this.adapter.set(key, value, options?.ttl);\n this.stats.sets++;\n this.stats.size++;\n\n // Track table associations\n if (options?.tables) {\n for (const table of options.tables) {\n if (!this.tableKeyMap.has(table)) {\n this.tableKeyMap.set(table, new Set());\n }\n this.tableKeyMap.get(table)!.add(key);\n }\n }\n\n // Track tag associations\n if (options?.tags) {\n for (const tag of options.tags) {\n const tagKey = this.keyGenerator.tag(tag);\n const existing = (await this.adapter.get<string[]>(tagKey)) || [];\n\n if (!existing.includes(key)) {\n existing.push(key);\n await this.adapter.set(tagKey, existing);\n }\n\n if (!this.tagKeyMap.has(tag)) {\n this.tagKeyMap.set(tag, new Set());\n }\n this.tagKeyMap.get(tag)!.add(key);\n }\n }\n } catch (error) {\n this.handleError(error as Error, key);\n }\n }\n\n /**\n * Delete cached value\n */\n async delete(key: string): Promise<boolean> {\n try {\n const deleted = await this.adapter.delete(key);\n if (deleted) {\n this.stats.deletes++;\n this.stats.size = Math.max(0, this.stats.size - 1);\n }\n return deleted;\n } catch (error) {\n this.handleError(error as Error, key);\n return false;\n }\n }\n\n /**\n * Check if key exists\n */\n async exists(key: string): Promise<boolean> {\n try {\n return await this.adapter.exists(key);\n } catch (error) {\n this.handleError(error as Error, key);\n return false;\n }\n }\n\n /**\n * Generate cache key for query\n */\n generateKey(sql: string, params?: unknown[]): string {\n return this.keyGenerator.query(sql, params);\n }\n\n /**\n * Get key generator for custom keys\n */\n key(): CacheKeyGenerator {\n return this.keyGenerator;\n }\n\n /**\n * Extract table names from SQL\n */\n private extractTables(sql: string): string[] {\n const tables: string[] = [];\n const patterns = [\n /from\\s+[\"'`]?(\\w+)[\"'`]?/gi,\n /join\\s+[\"'`]?(\\w+)[\"'`]?/gi,\n /into\\s+[\"'`]?(\\w+)[\"'`]?/gi,\n /update\\s+[\"'`]?(\\w+)[\"'`]?/gi,\n ];\n\n for (const pattern of patterns) {\n let match;\n while ((match = pattern.exec(sql)) !== null) {\n if (match[1]) {\n tables.push(match[1].toLowerCase());\n }\n }\n }\n\n return [...new Set(tables)];\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 private handleError(error: Error, key: string): void {\n this.logger?.error('Cache error', { key, error: error.message });\n this.onError?.(error, key);\n }\n}\n\n/**\n * Cache configuration for DBBridge\n */\nexport interface CacheConfig {\n /** Redis connection string or CacheAdapter instance */\n redis?: string | CacheAdapter;\n\n /** Enable global caching (default: false - explicit/opt-in) */\n global?: boolean;\n\n /** Default TTL in seconds (default: 3600) */\n ttl?: number;\n\n /** Cache namespace prefix */\n namespace?: string;\n\n /** Commands to cache (default: ['SELECT', 'SHOW', 'DESCRIBE']) */\n cacheableCommands?: string[];\n\n /** Auto-invalidate on mutations (default: true) */\n autoInvalidate?: boolean;\n\n /** Cache empty results (default: false) */\n cacheEmpty?: boolean;\n\n /** Warmup queries to preload on connect */\n warmup?: CacheWarmupQuery[];\n\n /** Event callbacks */\n onHit?: (key: string, sql: string) => void;\n onMiss?: (key: string, sql: string) => void;\n onError?: (error: Error, key: string) => void;\n}\n\n/**\n * Per-query cache options\n */\nexport interface QueryCacheConfig {\n /** Enable/disable cache for this query */\n enabled?: boolean;\n\n /** Custom TTL for this query */\n ttl?: number;\n\n /** Custom cache key */\n key?: string;\n\n /** Tags for bulk invalidation */\n tags?: string[];\n\n /** Skip auto-invalidation for this query */\n autoInvalidate?: boolean;\n}\n\nexport type CacheOption = boolean | QueryCacheConfig;\n","import { EventEmitter } from 'eventemitter3';\n\nimport type { CacheAdapter } from '../../interfaces';\nimport type { Logger } from '../../types';\n\nexport interface CacheStatistics {\n hits: number;\n misses: number;\n hitRate: number;\n totalCached: number;\n totalEvicted: number;\n avgHitTime: number;\n avgMissTime: number;\n memoryUsage?: number;\n}\n\nexport class CacheBaseTrait extends EventEmitter {\n protected cache: CacheAdapter;\n protected logger?: Logger;\n protected enabled = true;\n protected statistics: CacheStatistics;\n\n constructor(cache: CacheAdapter, logger?: Logger, enabled = true) {\n super();\n this.cache = cache;\n this.logger = logger;\n this.enabled = enabled;\n\n this.statistics = {\n hits: 0,\n misses: 0,\n hitRate: 0,\n totalCached: 0,\n totalEvicted: 0,\n avgHitTime: 0,\n avgMissTime: 0,\n };\n }\n\n enable(): void {\n this.enabled = true;\n this.emit('cacheEnabled');\n }\n\n disable(): void {\n this.enabled = false;\n this.emit('cacheDisabled');\n }\n\n isEnabled(): boolean {\n return this.enabled;\n }\n\n getStatistics(): CacheStatistics {\n return { ...this.statistics };\n }\n\n resetStatistics(): void {\n this.statistics = {\n hits: 0,\n misses: 0,\n hitRate: 0,\n totalCached: 0,\n totalEvicted: 0,\n avgHitTime: 0,\n avgMissTime: 0,\n };\n }\n\n protected updateStatistics(type: 'hit' | 'miss', duration: number): void {\n if (type === 'hit') {\n this.statistics.hits++;\n this.statistics.avgHitTime =\n (this.statistics.avgHitTime * (this.statistics.hits - 1) + duration) / this.statistics.hits;\n } else {\n this.statistics.misses++;\n this.statistics.avgMissTime =\n (this.statistics.avgMissTime * (this.statistics.misses - 1) + duration) /\n this.statistics.misses;\n }\n\n const total = this.statistics.hits + this.statistics.misses;\n this.statistics.hitRate = total > 0 ? this.statistics.hits / total : 0;\n }\n}\n","import { CacheBaseTrait } from './cache-base-trait';\n\nimport type { QueryResult } from '../../types';\nimport type { CacheStrategy, QueryCacheOptions } from '../cache-strategy';\n\nexport interface CachedQuery {\n key: string;\n sql: string;\n result: QueryResult;\n timestamp: Date;\n ttl: number;\n hits: number;\n tags: string[];\n size: number;\n}\n\nexport class CacheOperationsTrait extends CacheBaseTrait {\n protected strategy!: CacheStrategy;\n protected queryCache = new Map<string, CachedQuery>();\n protected tagIndex = new Map<string, Set<string>>();\n\n setStrategy(strategy: CacheStrategy): void {\n this.strategy = strategy;\n }\n\n async get<T = unknown>(\n sql: string,\n params?: unknown[],\n options?: QueryCacheOptions,\n ): Promise<QueryResult<T> | null> {\n if (!this.enabled) {\n return null;\n }\n\n const startTime = Date.now();\n const key = this.strategy.getCacheKey(sql, params, options);\n\n try {\n const cached = await this.cache.get<QueryResult<T>>(key);\n\n if (cached) {\n const duration = Date.now() - startTime;\n this.updateStatistics('hit', duration);\n\n // Update hit count\n const cachedQuery = this.queryCache.get(key);\n if (cachedQuery) {\n cachedQuery.hits++;\n }\n\n this.emit('cacheHit', { key, sql, duration });\n this.logger?.debug('Cache hit', { key, duration });\n\n return cached;\n }\n\n const duration = Date.now() - startTime;\n this.updateStatistics('miss', duration);\n this.emit('cacheMiss', { key, sql, duration });\n this.logger?.debug('Cache miss', { key, duration });\n\n return null;\n } catch (error) {\n this.logger?.error('Cache get error', error);\n this.emit('cacheError', { key, error });\n return null;\n }\n }\n\n async set<T = unknown>(\n sql: string,\n params: unknown[] | undefined,\n result: QueryResult<T>,\n options?: QueryCacheOptions,\n ): Promise<void> {\n if (!this.enabled) {\n return;\n }\n\n // Check if we should cache this query\n if (!this.strategy.shouldCache(sql, result)) {\n this.logger?.debug('Query not cacheable', { sql });\n return;\n }\n\n const key = this.strategy.getCacheKey(sql, params, options);\n const ttl = this.strategy.getCacheTTL(sql, options);\n const tags = options?.tags || [];\n\n try {\n await this.cache.set(key, result, ttl);\n\n // Store metadata\n const cachedQuery: CachedQuery = {\n key,\n sql,\n result,\n timestamp: new Date(),\n ttl,\n hits: 0,\n tags,\n size: JSON.stringify(result).length,\n };\n\n this.queryCache.set(key, cachedQuery);\n\n // Update tag index\n tags.forEach((tag) => {\n if (!this.tagIndex.has(tag)) {\n this.tagIndex.set(tag, new Set());\n }\n this.tagIndex.get(tag)!.add(key);\n });\n\n this.statistics.totalCached++;\n this.emit('cacheSet', { key, sql, ttl, tags });\n this.logger?.debug('Query cached', { key, ttl, tags });\n\n // Register for invalidation\n if (options?.invalidateOn) {\n await this.registerInvalidation(key, options.invalidateOn);\n }\n } catch (error) {\n this.logger?.error('Cache set error', error);\n this.emit('cacheError', { key, error });\n }\n }\n\n getCachedQueries(): CachedQuery[] {\n return Array.from(this.queryCache.values()).sort((a, b) => b.hits - a.hits);\n }\n\n getCacheSize(): { entries: number; approximateSize: number } {\n let size = 0;\n this.queryCache.forEach((cached) => {\n size += cached.size;\n });\n\n return {\n entries: this.queryCache.size,\n approximateSize: size,\n };\n }\n\n protected async registerInvalidation(key: string, patterns: string[]): Promise<void> {\n // This would integrate with a pub/sub system or database triggers\n this.logger?.debug('Registered invalidation patterns', { key, patterns });\n }\n}\n","import { CacheOperationsTrait } from './cache-operations-trait';\n\nexport class CacheInvalidationTrait extends CacheOperationsTrait {\n async invalidate(patterns: string[]): Promise<number> {\n if (!this.enabled) {\n return 0;\n }\n\n let invalidated = 0;\n\n for (const pattern of patterns) {\n try {\n // Invalidate by pattern\n const keys = await this.cache.keys(pattern);\n\n for (const key of keys) {\n const deleted = await this.cache.delete(key);\n if (deleted) {\n invalidated++;\n this.queryCache.delete(key);\n\n // Remove from tag index\n this.tagIndex.forEach((keySet) => {\n keySet.delete(key);\n });\n }\n }\n\n // Invalidate by tags\n if (this.tagIndex.has(pattern)) {\n const taggedKeys = this.tagIndex.get(pattern)!;\n\n for (const key of taggedKeys) {\n const deleted = await this.cache.delete(key);\n if (deleted) {\n invalidated++;\n this.queryCache.delete(key);\n }\n }\n\n this.tagIndex.delete(pattern);\n }\n } catch (error) {\n this.logger?.error('Invalidation error', { pattern, error });\n }\n }\n\n this.statistics.totalEvicted += invalidated;\n this.emit('cacheInvalidated', { patterns, count: invalidated });\n this.logger?.info('Cache invalidated', { patterns, count: invalidated });\n\n return invalidated;\n }\n\n async invalidateByTable(table: string): Promise<number> {\n const patterns = [\n `*${table}*`,\n `table:${table}:*`,\n table, // tag\n ];\n\n return this.invalidate(patterns);\n }\n\n async invalidateAll(): Promise<void> {\n if (!this.enabled) {\n return;\n }\n\n await this.cache.clear();\n this.queryCache.clear();\n this.tagIndex.clear();\n\n this.statistics.totalEvicted += this.statistics.totalCached;\n this.statistics.totalCached = 0;\n\n this.emit('cacheCleared');\n this.logger?.info('Cache cleared');\n }\n}\n","import { CacheInvalidationTrait } from './cache-invalidation-trait';\n\nimport type { QueryCacheOptions } from '../cache-strategy';\n\nexport class CacheMaintenanceTrait extends CacheInvalidationTrait {\n private cleanupInterval?: NodeJS.Timeout;\n\n async warmUp(\n queries: Array<{ sql: string; params?: unknown[]; options?: QueryCacheOptions }>,\n ): Promise<void> {\n if (!this.enabled) {\n return;\n }\n\n this.logger?.info('Cache warmup started', { count: queries.length });\n\n for (const query of queries) {\n try {\n const cached = await this.get(query.sql, query.params, query.options);\n\n if (!cached) {\n this.logger?.debug('Query needs caching for warmup', { sql: query.sql });\n // The actual query execution and caching should be done by the adapter\n }\n } catch (error) {\n this.logger?.error('Warmup query failed', { sql: query.sql, error });\n }\n }\n\n this.emit('cacheWarmedUp', { count: queries.length });\n this.logger?.info('Cache warmup completed');\n }\n\n startCleanupTimer(intervalMs = 60_000): void {\n this.stopCleanupTimer();\n\n this.cleanupInterval = setInterval(() => {\n const now = Date.now();\n\n this.queryCache.forEach((cached, key) => {\n const age = now - cached.timestamp.getTime();\n\n if (age > cached.ttl * 1000) {\n this.queryCache.delete(key);\n\n // Remove from tag index\n cached.tags.forEach((tag) => {\n this.tagIndex.get(tag)?.delete(key);\n });\n }\n });\n }, intervalMs);\n }\n\n stopCleanupTimer(): void {\n if (this.cleanupInterval) {\n clearInterval(this.cleanupInterval);\n this.cleanupInterval = undefined;\n }\n }\n\n destroy(): void {\n this.stopCleanupTimer();\n this.queryCache.clear();\n this.tagIndex.clear();\n this.removeAllListeners();\n }\n}\n","import { DefaultCacheStrategy } from './cache-strategy';\nimport { CacheMaintenanceTrait } from './traits/cache-maintenance-trait';\n\nimport type { CacheStrategy } from './cache-strategy';\nimport type { CacheAdapter } from '../interfaces';\nimport type { Logger } from '../types';\n\nexport * from './cache-strategy';\nexport * from './traits/cache-base-trait';\nexport * from './traits/cache-operations-trait';\n\n/**\n * Modular Cache Manager\n * Refactored from 533 lines, 50 methods to modular traits\n */\nexport class ModularCacheManager extends CacheMaintenanceTrait {\n constructor(\n cache: CacheAdapter,\n options: {\n strategy?: CacheStrategy;\n logger?: Logger;\n enabled?: boolean;\n } = {},\n ) {\n super(cache, options.logger, options.enabled ?? true);\n this.strategy = options.strategy || new DefaultCacheStrategy();\n this.startCleanupTimer();\n }\n}\n","import { EventEmitter } from 'eventemitter3';\n\nimport { SmartCacheStrategy } from './cache-strategy';\nimport { ModularCacheManager } from './modular-cache-manager';\n\nimport type { CacheStrategy, QueryCacheOptions } from './cache-strategy';\nimport type { DatabaseAdapter, CacheAdapter } from '../interfaces';\nimport type {\n QueryResult,\n QueryParams,\n QueryOptions,\n Transaction,\n TransactionOptions,\n PreparedStatement,\n PoolStats,\n ConnectionConfig,\n Logger,\n} from '../types';\n\nexport interface CachedAdapterOptions {\n adapter: DatabaseAdapter;\n cache: CacheAdapter;\n strategy?: CacheStrategy;\n logger?: Logger;\n enabled?: boolean;\n cacheableCommands?: string[];\n defaultTTL?: number;\n cacheEmptyResults?: boolean;\n cacheErrors?: boolean;\n warmupQueries?: Array<{\n sql: string;\n params?: unknown[];\n ttl?: number;\n }>;\n}\n\n/**\n * Wraps any database adapter with automatic caching functionality\n * Works with MySQL, PostgreSQL, MongoDB or any other adapter\n */\nexport class CachedAdapter extends EventEmitter implements DatabaseAdapter {\n private adapter: DatabaseAdapter;\n private cacheManager: ModularCacheManager;\n private cacheableCommands: Set<string>;\n private defaultTTL: number;\n private cacheEmptyResults: boolean;\n private cacheErrors: boolean;\n private logger?: Logger;\n private warmupQueries?: CachedAdapterOptions['warmupQueries'];\n\n constructor(options: CachedAdapterOptions) {\n super();\n\n this.adapter = options.adapter;\n this.logger = options.logger;\n this.cacheableCommands = new Set(options.cacheableCommands || ['SELECT', 'SHOW', 'DESCRIBE']);\n this.defaultTTL = options.defaultTTL || 3600;\n this.cacheEmptyResults = options.cacheEmptyResults || false;\n this.cacheErrors = options.cacheErrors || false;\n this.warmupQueries = options.warmupQueries;\n\n // Create cache manager with strategy\n this.cacheManager = new ModularCacheManager(options.cache, {\n strategy: options.strategy || new SmartCacheStrategy(),\n logger: this.logger,\n enabled: options.enabled ?? true,\n });\n\n // Forward adapter events if it's an EventEmitter\n if ('on' in this.adapter && typeof this.adapter.on === 'function') {\n this.adapter.on('connect', (...args: unknown[]) => {\n this.emit('connect', ...args);\n void this.performWarmup();\n });\n this.adapter.on('disconnect', (...args: unknown[]) => this.emit('disconnect', ...args));\n this.adapter.on('error', (...args: unknown[]) => this.emit('error', ...args));\n }\n\n // Listen for cache events\n this.cacheManager.on('cacheHit', (data) => {\n this.logger?.debug('Cache hit', data);\n this.emit('cacheHit', data);\n });\n\n this.cacheManager.on('cacheMiss', (data) => {\n this.logger?.debug('Cache miss', data);\n this.emit('cacheMiss', data);\n });\n\n // Invalidate cache on write operations if adapter emits events\n if ('on' in this.adapter && typeof this.adapter.on === 'function') {\n this.adapter.on('query', (data: any) => {\n if (data.command && this.isWriteCommand(data.command)) {\n this.invalidateRelatedCache(data.sql).catch((error: Error) => {\n this.logger?.error('Cache invalidation error', error);\n });\n }\n });\n }\n }\n\n get name(): string {\n return `Cached${this.adapter.name}`;\n }\n\n get version(): string {\n return this.adapter.version;\n }\n\n get isConnected(): boolean {\n return this.adapter.isConnected;\n }\n\n async connect(config: ConnectionConfig): Promise<void> {\n await this.adapter.connect(config);\n }\n\n async disconnect(): Promise<void> {\n await this.adapter.disconnect();\n await this.cacheManager.invalidateAll();\n }\n\n async query<T = unknown>(\n sql: string,\n params?: QueryParams,\n options?: QueryOptions,\n ): Promise<QueryResult<T>> {\n const command = this.extractCommand(sql);\n\n // Don't cache if:\n // 1. Cache is disabled in options\n // 2. Command is not cacheable\n // 3. It's part of a transaction\n if (options?.cache === false || !this.shouldCache(command, options) || options?.transaction) {\n return this.adapter.query<T>(sql, params, options);\n }\n\n const cacheOptions: QueryCacheOptions = typeof options?.cache === 'object' ? options.cache : {};\n\n try {\n // Try to get from cache\n const cached = await this.cacheManager.get<T>(sql, params as unknown[], cacheOptions);\n\n if (cached) {\n // Update cache statistics for smart strategy\n const strategy = (this.cacheManager as any).strategy;\n if (strategy instanceof SmartCacheStrategy) {\n strategy.recordQueryExecution(sql, 0); // 0ms for cache hit\n }\n\n return cached;\n }\n\n // Execute query\n const startTime = Date.now();\n const result = await this.adapter.query<T>(sql, params, options);\n const duration = Date.now() - startTime;\n\n // Update statistics\n const strategy = (this.cacheManager as any).strategy;\n if (strategy instanceof SmartCacheStrategy) {\n strategy.recordQueryExecution(sql, duration);\n }\n\n // Check if we should cache the result\n if (this.shouldCacheResult(result, options)) {\n await this.cacheManager.set(sql, params as unknown[], result, cacheOptions);\n }\n\n return result;\n } catch (error) {\n // Optionally cache errors\n const cacheEnabled = (options?.cache as any) !== false;\n if (this.cacheErrors && cacheEnabled) {\n const errorResult = {\n rows: [] as T[],\n rowCount: 0,\n error: error as Error,\n } as QueryResult<T>;\n\n await this.cacheManager.set(sql, params as unknown[], errorResult, {\n ...cacheOptions,\n ttl: 60, // Cache errors for 1 minute\n });\n }\n\n throw error;\n }\n }\n\n async beginTransaction(options?: TransactionOptions): Promise<Transaction> {\n const transaction = await this.adapter.beginTransaction(options);\n\n // Wrap transaction to invalidate cache on commit/rollback\n const originalCommit = transaction.commit.bind(transaction);\n const originalRollback = transaction.rollback.bind(transaction);\n\n transaction.commit = async () => {\n const result = await originalCommit();\n // Invalidate all cache after successful commit\n await this.cacheManager.invalidateAll();\n return result;\n };\n\n transaction.rollback = async () => {\n const result = await originalRollback();\n // No need to invalidate on rollback\n return result;\n };\n\n return transaction;\n }\n\n async prepare<T = unknown>(sql: string, name?: string): Promise<PreparedStatement<T>> {\n return this.adapter.prepare<T>(sql, name);\n }\n\n getPoolStats(): PoolStats {\n return this.adapter.getPoolStats();\n }\n\n async ping(): Promise<boolean> {\n return this.adapter.ping();\n }\n\n escape(value: unknown): string {\n return this.adapter.escape(value);\n }\n\n escapeIdentifier(identifier: string): string {\n return this.adapter.escapeIdentifier(identifier);\n }\n\n execute<T = unknown>(\n sql: string,\n params?: QueryParams,\n options?: QueryOptions,\n ): Promise<QueryResult<T>> {\n // Execute is same as query for most adapters\n return this.query<T>(sql, params, options);\n }\n\n createQueryBuilder<T = unknown>(): import('../interfaces').QueryBuilder<T> {\n return this.adapter.createQueryBuilder<T>();\n }\n\n getCacheManager(): ModularCacheManager {\n return this.cacheManager;\n }\n\n async warmupCache(): Promise<void> {\n if (!this.warmupQueries || this.warmupQueries.length === 0) {\n return;\n }\n\n this.logger?.info('Starting cache warmup', { count: this.warmupQueries.length });\n\n for (const query of this.warmupQueries) {\n try {\n const result = await this.query(query.sql, query.params as QueryParams, {\n cache: { ttl: query.ttl || this.defaultTTL },\n });\n\n this.logger?.debug('Warmup query cached', {\n sql: query.sql,\n rowCount: result.rowCount,\n });\n } catch (error) {\n this.logger?.error('Warmup query failed', {\n sql: query.sql,\n error,\n });\n }\n }\n\n this.logger?.info('Cache warmup completed');\n }\n\n private async performWarmup(): Promise<void> {\n if (this.warmupQueries && this.warmupQueries.length > 0) {\n // Perform warmup asynchronously after connection\n setTimeout(() => {\n this.warmupCache().catch((error) => {\n this.logger?.error('Cache warmup error', error);\n });\n }, 1000); // Wait 1 second after connection\n }\n }\n\n private shouldCache(command: string, options?: QueryOptions): boolean {\n if (!command) {\n return false;\n }\n\n // Check if command is cacheable\n if (!this.cacheableCommands.has(command)) {\n return false;\n }\n\n // Check if caching is explicitly enabled in options\n if (options?.cache === true || typeof options?.cache === 'object') {\n return true;\n }\n\n // Default to true for cacheable commands\n return true;\n }\n\n private shouldCacheResult(result: QueryResult, _options?: QueryOptions): boolean {\n // Don't cache empty results unless explicitly configured\n if (!this.cacheEmptyResults && result.rowCount === 0) {\n return false;\n }\n\n // Don't cache if result has an error\n if ((result as any).error) {\n return this.cacheErrors;\n }\n\n return true;\n }\n\n private extractCommand(sql: string): string {\n return sql.trim().split(/\\s+/)[0]?.toUpperCase() || '';\n }\n\n private isWriteCommand(command: string): boolean {\n const writeCommands = ['INSERT', 'UPDATE', 'DELETE', 'CREATE', 'ALTER', 'DROP', 'TRUNCATE'];\n return writeCommands.includes(command.toUpperCase());\n }\n\n private async invalidateRelatedCache(sql: string): Promise<void> {\n const tables = this.extractTableNames(sql);\n const patterns: string[] = [];\n\n tables.forEach((table) => {\n patterns.push(`*${table}*`, `table:${table}:*`);\n });\n\n if (patterns.length > 0) {\n await this.cacheManager.invalidate(patterns);\n }\n }\n\n private extractTableNames(sql: string): string[] {\n const tables: string[] = [];\n const patterns = [\n /from\\s+`?(\\w+)`?/gi,\n /join\\s+`?(\\w+)`?/gi,\n /update\\s+`?(\\w+)`?/gi,\n /insert\\s+into\\s+`?(\\w+)`?/gi,\n /delete\\s+from\\s+`?(\\w+)`?/gi,\n /create\\s+table\\s+`?(\\w+)`?/gi,\n /drop\\s+table\\s+`?(\\w+)`?/gi,\n /truncate\\s+table?\\s+`?(\\w+)`?/gi,\n ];\n\n patterns.forEach((pattern) => {\n let match;\n while ((match = pattern.exec(sql)) !== null) {\n if (match[1]) {\n tables.push(match[1].toLowerCase());\n }\n }\n });\n\n return [...new Set(tables)];\n }\n}\n\n/**\n * Helper function to create a cached adapter\n */\nexport function createCachedAdapter(\n adapter: DatabaseAdapter,\n cache: CacheAdapter,\n options?: Partial<CachedAdapterOptions>,\n): CachedAdapter {\n return new CachedAdapter({\n adapter,\n cache,\n ...options,\n });\n}\n","import { createCipheriv, createDecipheriv, randomBytes, pbkdf2Sync } from 'node:crypto';\n\nexport interface CryptoConfig {\n algorithm?: string;\n keyLength?: number;\n ivLength?: number;\n saltLength?: number;\n iterations?: number;\n digest?: string;\n}\n\nexport interface EncryptionOptions {\n key?: string;\n salt?: Buffer;\n encoding?: BufferEncoding;\n}\n\nexport interface EncryptedData {\n encrypted: string;\n salt: string;\n iv: string;\n authTag?: string;\n}\n\nexport class CryptoProvider {\n private readonly config: Required<CryptoConfig>;\n\n constructor(config: CryptoConfig = {}) {\n const algorithm = config.algorithm || 'aes-256-gcm';\n // ChaCha20-Poly1305 requires 12 byte IV\n const ivLength = algorithm === 'chacha20-poly1305' ? 12 : config.ivLength || 16;\n\n // Determine key length based on algorithm\n let keyLength = config.keyLength || 32;\n if (!config.keyLength) {\n if (algorithm.includes('128')) {\n keyLength = 16;\n } else if (algorithm.includes('192')) {\n keyLength = 24;\n } else if (algorithm.includes('256')) {\n keyLength = 32;\n }\n }\n\n this.config = {\n algorithm,\n keyLength,\n ivLength,\n saltLength: config.saltLength || 32,\n iterations: config.iterations || 100_000,\n digest: config.digest || 'sha256',\n };\n }\n\n private deriveKey(password: string, salt: Buffer): Buffer {\n return pbkdf2Sync(\n password,\n salt,\n this.config.iterations,\n this.config.keyLength,\n this.config.digest,\n );\n }\n\n encrypt(data: string, options: EncryptionOptions = {}): EncryptedData {\n const salt = options.salt || randomBytes(this.config.saltLength);\n const key = options.key\n ? Buffer.from(options.key, 'hex')\n : this.deriveKey(process.env['DB_BRIDGE_ENCRYPTION_KEY'] || 'default-key', salt);\n\n const iv = randomBytes(this.config.ivLength);\n const cipher = createCipheriv(this.config.algorithm, key, iv);\n\n let encrypted = cipher.update(data, 'utf8', 'hex');\n encrypted += cipher.final('hex');\n\n const result: EncryptedData = {\n encrypted,\n salt: salt.toString('hex'),\n iv: iv.toString('hex'),\n };\n\n // For authenticated encryption modes (GCM, Poly1305), we need the auth tag\n if (this.config.algorithm.includes('gcm') || this.config.algorithm.includes('poly1305')) {\n result.authTag = (cipher as any).getAuthTag().toString('hex');\n }\n\n return result;\n }\n\n decrypt(encryptedData: EncryptedData, options: EncryptionOptions = {}): string {\n const salt = Buffer.from(encryptedData.salt, 'hex');\n const key = options.key\n ? Buffer.from(options.key, 'hex')\n : this.deriveKey(process.env['DB_BRIDGE_ENCRYPTION_KEY'] || 'default-key', salt);\n\n const iv = Buffer.from(encryptedData.iv, 'hex');\n const decipher = createDecipheriv(this.config.algorithm, key, iv);\n\n // For authenticated encryption modes (GCM, Poly1305), set the auth tag\n if (\n (this.config.algorithm.includes('gcm') || this.config.algorithm.includes('poly1305')) &&\n encryptedData.authTag\n ) {\n (decipher as any).setAuthTag(Buffer.from(encryptedData.authTag, 'hex'));\n }\n\n let decrypted = decipher.update(encryptedData.encrypted, 'hex', 'utf8');\n decrypted += decipher.final('utf8');\n\n return decrypted;\n }\n\n /**\n * Encrypt a value for storage in database\n */\n encryptField(value: unknown): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n const data = typeof value === 'string' ? value : JSON.stringify(value);\n const encrypted = this.encrypt(data);\n\n // Store as a single string in format: algorithm:salt:iv:authTag:encrypted\n return [\n this.config.algorithm,\n encrypted.salt,\n encrypted.iv,\n encrypted.authTag || '',\n encrypted.encrypted,\n ].join(':');\n }\n\n /**\n * Decrypt a value from database storage\n */\n decryptField(encryptedField: string): unknown {\n if (!encryptedField) {\n return null;\n }\n\n const parts = encryptedField.split(':');\n if (parts.length < 4) {\n throw new Error('Invalid encrypted field format');\n }\n\n const [algorithm, salt, iv, authTag, encrypted] = parts;\n\n // Verify algorithm matches\n if (algorithm !== this.config.algorithm) {\n throw new Error(`Algorithm mismatch: expected ${this.config.algorithm}, got ${algorithm}`);\n }\n\n const encryptedData: EncryptedData = {\n encrypted: encrypted!,\n salt: salt!,\n iv: iv!,\n authTag: authTag || undefined,\n };\n\n const decrypted = this.decrypt(encryptedData);\n\n // Try to parse as JSON, otherwise return as string\n try {\n return JSON.parse(decrypted);\n } catch {\n return decrypted;\n }\n }\n\n /**\n * Generate a random encryption key\n */\n generateKey(): string {\n return randomBytes(this.config.keyLength).toString('hex');\n }\n\n /**\n * Hash a value using SHA-256 (one-way)\n */\n hash(value: string): string {\n const hash = require('node:crypto').createHash('sha256');\n hash.update(value);\n return hash.digest('hex');\n }\n\n /**\n * Compare a plain value with a hashed value\n */\n compareHash(value: string, hash: string): boolean {\n return this.hash(value) === hash;\n }\n}\n\n// Export a default instance\nexport const crypto = new CryptoProvider();\n\n// Export additional crypto algorithms\nexport const CryptoAlgorithms = {\n AES_256_GCM: 'aes-256-gcm',\n AES_256_CBC: 'aes-256-cbc',\n AES_192_GCM: 'aes-192-gcm',\n AES_192_CBC: 'aes-192-cbc',\n AES_128_GCM: 'aes-128-gcm',\n AES_128_CBC: 'aes-128-cbc',\n CHACHA20_POLY1305: 'chacha20-poly1305',\n} as const;\n\nexport type CryptoAlgorithm = (typeof CryptoAlgorithms)[keyof typeof CryptoAlgorithms];\n","/**\n * SQL Dialect Base Class\n *\n * Provides database-agnostic SQL generation with dialect-specific\n * overrides for placeholder syntax, identifier escaping, and SQL keywords.\n *\n * Following Drizzle ORM's dialect pattern for clean separation of concerns.\n */\n\nexport interface DialectConfig {\n /** Character used to escape identifiers (e.g., ` for MySQL, \" for PostgreSQL) */\n identifierQuote: string;\n /** Whether to use named parameters (:name) or positional (?, $1) */\n namedParameters: boolean;\n /** String concatenation operator */\n concatOperator: string;\n /** Boolean literal values */\n booleanLiterals: { true: string; false: string };\n /** Date/time function names */\n dateFunctions: {\n now: string;\n currentDate: string;\n currentTime: string;\n dateFormat: (column: string, format: string) => string;\n };\n /** Limit/offset syntax style */\n limitStyle: 'LIMIT_OFFSET' | 'FETCH_FIRST' | 'TOP';\n /** JSON operators */\n jsonOperators: {\n extract: (column: string, path: string) => string;\n contains: (column: string, value: string) => string;\n };\n}\n\nexport abstract class SQLDialect {\n abstract readonly name: string;\n abstract readonly config: DialectConfig;\n\n private parameterIndex = 0;\n\n /**\n * Reset parameter index for new query\n */\n resetParameters(): void {\n this.parameterIndex = 0;\n }\n\n /**\n * Get next parameter placeholder\n * MySQL: ?\n * PostgreSQL: $1, $2, $3...\n */\n abstract getParameterPlaceholder(): string;\n\n /**\n * Escape an identifier (table name, column name)\n */\n escapeIdentifier(identifier: string): string {\n const quote = this.config.identifierQuote;\n // Handle schema.table format\n if (identifier.includes('.')) {\n return identifier\n .split('.')\n .map((part) => `${quote}${part}${quote}`)\n .join('.');\n }\n return `${quote}${identifier}${quote}`;\n }\n\n /**\n * Escape a string value for SQL\n */\n abstract escapeValue(value: unknown): string;\n\n /**\n * Build SELECT SQL from components\n */\n buildSelect(components: SelectComponents): BuiltSQL {\n const parts: string[] = [];\n const bindings: unknown[] = [];\n\n // SELECT clause\n parts.push('SELECT');\n if (components.distinct) {\n parts.push('DISTINCT');\n }\n parts.push(components.columns.length > 0 ? components.columns.join(', ') : '*');\n\n // FROM clause\n if (components.from) {\n parts.push('FROM');\n const fromClause = components.fromAlias\n ? `${this.escapeIdentifier(components.from)} AS ${this.escapeIdentifier(components.fromAlias)}`\n : this.escapeIdentifier(components.from);\n parts.push(fromClause);\n }\n\n // JOINs\n for (const join of components.joins) {\n parts.push(`${join.type} JOIN ${this.escapeIdentifier(join.table)}`);\n if (join.alias) {\n parts.push(`AS ${this.escapeIdentifier(join.alias)}`);\n }\n parts.push(`ON ${join.condition}`);\n bindings.push(...join.bindings);\n }\n\n // WHERE\n if (components.where.length > 0) {\n parts.push('WHERE');\n parts.push(this.buildWhereClause(components.where, bindings));\n }\n\n // GROUP BY\n if (components.groupBy.length > 0) {\n parts.push('GROUP BY');\n parts.push(components.groupBy.map((col) => this.escapeIdentifier(col)).join(', '));\n }\n\n // HAVING\n if (components.having) {\n parts.push('HAVING', components.having.condition);\n bindings.push(...components.having.bindings);\n }\n\n // ORDER BY\n if (components.orderBy.length > 0) {\n parts.push('ORDER BY');\n parts.push(\n components.orderBy\n .map(({ column, direction }) => `${this.escapeIdentifier(column)} ${direction}`)\n .join(', '),\n );\n }\n\n // LIMIT/OFFSET\n this.appendLimitOffset(parts, components.limit, components.offset);\n\n return {\n sql: parts.join(' '),\n bindings,\n };\n }\n\n /**\n * Build INSERT SQL from components\n */\n buildInsert(components: InsertComponents): BuiltSQL {\n const parts: string[] = [];\n const bindings: unknown[] = [];\n\n parts.push('INSERT INTO');\n parts.push(this.escapeIdentifier(components.table));\n\n const columns = Object.keys(components.data[0] || {});\n parts.push(`(${columns.map((col) => this.escapeIdentifier(col)).join(', ')})`, 'VALUES');\n\n const valueSets: string[] = [];\n for (const row of components.data) {\n const placeholders: string[] = [];\n for (const col of columns) {\n placeholders.push(this.getParameterPlaceholder());\n bindings.push(row[col]);\n }\n valueSets.push(`(${placeholders.join(', ')})`);\n }\n parts.push(valueSets.join(', '));\n\n // RETURNING clause (PostgreSQL)\n if (components.returning && components.returning.length > 0) {\n parts.push('RETURNING');\n parts.push(components.returning.map((col) => this.escapeIdentifier(col)).join(', '));\n }\n\n return {\n sql: parts.join(' '),\n bindings,\n };\n }\n\n /**\n * Build UPDATE SQL from components\n */\n buildUpdate(components: UpdateComponents): BuiltSQL {\n const parts: string[] = [];\n const bindings: unknown[] = [];\n\n parts.push('UPDATE');\n parts.push(this.escapeIdentifier(components.table), 'SET');\n\n const setClauses: string[] = [];\n for (const [column, value] of Object.entries(components.data)) {\n setClauses.push(`${this.escapeIdentifier(column)} = ${this.getParameterPlaceholder()}`);\n bindings.push(value);\n }\n parts.push(setClauses.join(', '));\n\n // WHERE\n if (components.where.length > 0) {\n parts.push('WHERE');\n parts.push(this.buildWhereClause(components.where, bindings));\n }\n\n // RETURNING clause (PostgreSQL)\n if (components.returning && components.returning.length > 0) {\n parts.push('RETURNING');\n parts.push(components.returning.map((col) => this.escapeIdentifier(col)).join(', '));\n }\n\n return {\n sql: parts.join(' '),\n bindings,\n };\n }\n\n /**\n * Build DELETE SQL from components\n */\n buildDelete(components: DeleteComponents): BuiltSQL {\n const parts: string[] = [];\n const bindings: unknown[] = [];\n\n parts.push('DELETE FROM');\n parts.push(this.escapeIdentifier(components.table));\n\n // WHERE\n if (components.where.length > 0) {\n parts.push('WHERE');\n parts.push(this.buildWhereClause(components.where, bindings));\n }\n\n // RETURNING clause (PostgreSQL)\n if (components.returning && components.returning.length > 0) {\n parts.push('RETURNING');\n parts.push(components.returning.map((col) => this.escapeIdentifier(col)).join(', '));\n }\n\n return {\n sql: parts.join(' '),\n bindings,\n };\n }\n\n /**\n * Build WHERE clause from conditions\n */\n protected buildWhereClause(conditions: WhereCondition[], bindings: unknown[]): string {\n return conditions\n .map((condition, index) => {\n const prefix = index === 0 ? '' : ` ${condition.type} `;\n bindings.push(...condition.bindings);\n return `${prefix}${condition.sql}`;\n })\n .join('');\n }\n\n /**\n * Append LIMIT/OFFSET based on dialect style\n */\n protected appendLimitOffset(parts: string[], limit?: number, offset?: number): void {\n switch (this.config.limitStyle) {\n case 'LIMIT_OFFSET': {\n if (limit !== undefined) {\n parts.push(`LIMIT ${limit}`);\n }\n if (offset !== undefined) {\n parts.push(`OFFSET ${offset}`);\n }\n break;\n }\n case 'FETCH_FIRST': {\n if (offset !== undefined) {\n parts.push(`OFFSET ${offset} ROWS`);\n }\n if (limit !== undefined) {\n parts.push(`FETCH FIRST ${limit} ROWS ONLY`);\n }\n break;\n }\n case 'TOP': {\n // TOP is handled in SELECT clause for SQL Server\n break;\n }\n }\n }\n\n /**\n * Increment and return parameter index (for PostgreSQL-style)\n */\n protected nextParameterIndex(): number {\n return ++this.parameterIndex;\n }\n}\n\n// ============ Type Definitions ============\n\nexport interface BuiltSQL {\n sql: string;\n bindings: unknown[];\n}\n\nexport interface WhereCondition {\n type: 'AND' | 'OR';\n sql: string;\n bindings: unknown[];\n}\n\nexport interface JoinDefinition {\n type: 'INNER' | 'LEFT' | 'RIGHT' | 'FULL' | 'CROSS';\n table: string;\n alias?: string;\n condition: string;\n bindings: unknown[];\n}\n\nexport interface OrderByDefinition {\n column: string;\n direction: 'ASC' | 'DESC';\n raw?: boolean;\n}\n\nexport interface SelectComponents {\n columns: string[];\n distinct?: boolean;\n from?: string;\n fromAlias?: string;\n joins: JoinDefinition[];\n where: WhereCondition[];\n groupBy: string[];\n having?: { condition: string; bindings: unknown[] };\n orderBy: OrderByDefinition[];\n limit?: number;\n offset?: number;\n}\n\nexport interface InsertComponents {\n table: string;\n data: Record<string, unknown>[];\n returning?: string[];\n}\n\nexport interface UpdateComponents {\n table: string;\n data: Record<string, unknown>;\n where: WhereCondition[];\n returning?: string[];\n}\n\nexport interface DeleteComponents {\n table: string;\n where: WhereCondition[];\n returning?: string[];\n}\n","/**\n * MySQL Dialect Implementation\n *\n * Handles MySQL-specific SQL syntax:\n * - Backtick (`) identifier quoting\n * - Positional (?) parameter placeholders\n * - MySQL-specific functions and operators\n */\n\nimport { SQLDialect } from './sql-dialect';\n\nimport type { DialectConfig } from './sql-dialect';\n\nexport class MySQLDialect extends SQLDialect {\n readonly name = 'mysql';\n\n readonly config: DialectConfig = {\n identifierQuote: '`',\n namedParameters: false,\n concatOperator: 'CONCAT',\n booleanLiterals: { true: 'TRUE', false: 'FALSE' },\n dateFunctions: {\n now: 'NOW()',\n currentDate: 'CURDATE()',\n currentTime: 'CURTIME()',\n dateFormat: (column: string, format: string) => `DATE_FORMAT(${column}, '${format}')`,\n },\n limitStyle: 'LIMIT_OFFSET',\n jsonOperators: {\n extract: (column: string, path: string) => `JSON_EXTRACT(${column}, '${path}')`,\n contains: (column: string, value: string) => `JSON_CONTAINS(${column}, '${value}')`,\n },\n };\n\n /**\n * MySQL uses ? for all positional parameters\n */\n getParameterPlaceholder(): string {\n return '?';\n }\n\n /**\n * Escape value for MySQL\n */\n escapeValue(value: unknown): string {\n if (value === null || value === undefined) {\n return 'NULL';\n }\n\n if (typeof value === 'boolean') {\n return value ? 'TRUE' : 'FALSE';\n }\n\n if (typeof value === 'number') {\n return String(value);\n }\n\n if (value instanceof Date) {\n return `'${value.toISOString().slice(0, 19).replace('T', ' ')}'`;\n }\n\n if (typeof value === 'string') {\n // Escape single quotes and backslashes\n return `'${value.replaceAll('\\\\', '\\\\\\\\').replaceAll(\"'\", \"\\\\'\")}'`;\n }\n\n if (Buffer.isBuffer(value)) {\n return `X'${value.toString('hex')}'`;\n }\n\n // Arrays and objects - serialize as JSON\n return `'${JSON.stringify(value).replaceAll(\"'\", \"\\\\'\")}'`;\n }\n\n /**\n * MySQL-specific: INSERT ... ON DUPLICATE KEY UPDATE\n */\n buildUpsert(\n table: string,\n data: Record<string, unknown>,\n conflictColumns: string[],\n ): { sql: string; bindings: unknown[] } {\n const columns = Object.keys(data);\n const bindings: unknown[] = [];\n\n const parts: string[] = [];\n parts.push('INSERT INTO');\n parts.push(this.escapeIdentifier(table));\n parts.push(`(${columns.map((col) => this.escapeIdentifier(col)).join(', ')})`, 'VALUES');\n\n const placeholders = columns.map(() => this.getParameterPlaceholder());\n parts.push(`(${placeholders.join(', ')})`);\n bindings.push(...Object.values(data));\n\n parts.push('ON DUPLICATE KEY UPDATE');\n const updateClauses = columns\n .filter((col) => !conflictColumns.includes(col))\n .map((col) => `${this.escapeIdentifier(col)} = VALUES(${this.escapeIdentifier(col)})`);\n parts.push(updateClauses.join(', '));\n\n return {\n sql: parts.join(' '),\n bindings,\n };\n }\n\n /**\n * MySQL-specific: REPLACE INTO\n */\n buildReplace(table: string, data: Record<string, unknown>): { sql: string; bindings: unknown[] } {\n const columns = Object.keys(data);\n const bindings: unknown[] = [];\n\n const parts: string[] = [];\n parts.push('REPLACE INTO');\n parts.push(this.escapeIdentifier(table));\n parts.push(`(${columns.map((col) => this.escapeIdentifier(col)).join(', ')})`, 'VALUES');\n\n const placeholders = columns.map(() => this.getParameterPlaceholder());\n parts.push(`(${placeholders.join(', ')})`);\n bindings.push(...Object.values(data));\n\n return {\n sql: parts.join(' '),\n bindings,\n };\n }\n\n /**\n * MySQL-specific: Get last insert ID\n */\n getLastInsertIdSQL(): string {\n return 'SELECT LAST_INSERT_ID() as id';\n }\n\n /**\n * MySQL-specific: OFFSET requires LIMIT\n * If offset is specified without limit, use a very large limit (18446744073709551615 = max bigint)\n */\n protected override appendLimitOffset(parts: string[], limit?: number, offset?: number): void {\n // MySQL requires LIMIT before OFFSET\n if (offset !== undefined && limit === undefined) {\n // Use MySQL's max bigint unsigned as unlimited\n parts.push('LIMIT 18446744073709551615');\n parts.push(`OFFSET ${offset}`);\n } else if (limit !== undefined) {\n parts.push(`LIMIT ${limit}`);\n if (offset !== undefined) {\n parts.push(`OFFSET ${offset}`);\n }\n }\n }\n}\n","/**\n * PostgreSQL Dialect Implementation\n *\n * Handles PostgreSQL-specific SQL syntax:\n * - Double quote (\") identifier quoting\n * - Numbered ($1, $2) parameter placeholders\n * - PostgreSQL-specific functions and operators\n * - RETURNING clause support\n */\n\nimport { SQLDialect } from './sql-dialect';\n\nimport type { DialectConfig } from './sql-dialect';\n\nexport class PostgreSQLDialect extends SQLDialect {\n readonly name = 'postgresql';\n\n readonly config: DialectConfig = {\n identifierQuote: '\"',\n namedParameters: false,\n concatOperator: '||',\n booleanLiterals: { true: 'TRUE', false: 'FALSE' },\n dateFunctions: {\n now: 'NOW()',\n currentDate: 'CURRENT_DATE',\n currentTime: 'CURRENT_TIME',\n dateFormat: (column: string, format: string) => `TO_CHAR(${column}, '${format}')`,\n },\n limitStyle: 'LIMIT_OFFSET',\n jsonOperators: {\n extract: (column: string, path: string) => `${column}->'${path}'`,\n contains: (column: string, value: string) => `${column} @> '${value}'`,\n },\n };\n\n /**\n * PostgreSQL uses $1, $2, $3... for positional parameters\n */\n getParameterPlaceholder(): string {\n return `$${this.nextParameterIndex()}`;\n }\n\n /**\n * Escape value for PostgreSQL\n */\n escapeValue(value: unknown): string {\n if (value === null || value === undefined) {\n return 'NULL';\n }\n\n if (typeof value === 'boolean') {\n return value ? 'TRUE' : 'FALSE';\n }\n\n if (typeof value === 'number') {\n return String(value);\n }\n\n if (value instanceof Date) {\n return `'${value.toISOString()}'::timestamptz`;\n }\n\n if (typeof value === 'string') {\n // PostgreSQL uses doubled single quotes for escaping\n return `'${value.replaceAll(\"'\", \"''\")}'`;\n }\n\n if (Buffer.isBuffer(value)) {\n return `'\\\\x${value.toString('hex')}'::bytea`;\n }\n\n if (Array.isArray(value)) {\n // PostgreSQL array literal\n const escaped = value.map((v) => this.escapeValue(v)).join(', ');\n return `ARRAY[${escaped}]`;\n }\n\n // Objects - serialize as JSONB\n return `'${JSON.stringify(value).replaceAll(\"'\", \"''\")}'::jsonb`;\n }\n\n /**\n * PostgreSQL-specific: INSERT ... ON CONFLICT\n */\n buildUpsert(\n table: string,\n data: Record<string, unknown>,\n conflictColumns: string[],\n updateColumns?: string[],\n ): { sql: string; bindings: unknown[] } {\n const columns = Object.keys(data);\n const bindings: unknown[] = [];\n\n this.resetParameters();\n\n const parts: string[] = [];\n parts.push('INSERT INTO');\n parts.push(this.escapeIdentifier(table));\n parts.push(`(${columns.map((col) => this.escapeIdentifier(col)).join(', ')})`, 'VALUES');\n\n const placeholders = columns.map(() => this.getParameterPlaceholder());\n parts.push(`(${placeholders.join(', ')})`);\n bindings.push(...Object.values(data));\n\n parts.push('ON CONFLICT');\n parts.push(`(${conflictColumns.map((col) => this.escapeIdentifier(col)).join(', ')})`);\n\n const toUpdate = updateColumns || columns.filter((col) => !conflictColumns.includes(col));\n\n if (toUpdate.length > 0) {\n parts.push('DO UPDATE SET');\n const updateClauses = toUpdate.map(\n (col) => `${this.escapeIdentifier(col)} = EXCLUDED.${this.escapeIdentifier(col)}`,\n );\n parts.push(updateClauses.join(', '));\n } else {\n parts.push('DO NOTHING');\n }\n\n return {\n sql: parts.join(' '),\n bindings,\n };\n }\n\n /**\n * PostgreSQL-specific: CTE (Common Table Expressions)\n */\n buildWithCTE(cteName: string, cteQuery: string, mainQuery: string, recursive = false): string {\n const withKeyword = recursive ? 'WITH RECURSIVE' : 'WITH';\n return `${withKeyword} ${this.escapeIdentifier(cteName)} AS (${cteQuery}) ${mainQuery}`;\n }\n\n /**\n * PostgreSQL-specific: RETURNING clause\n */\n buildReturning(columns: string[]): string {\n if (columns.length === 0) {\n return 'RETURNING *';\n }\n return `RETURNING ${columns.map((col) => this.escapeIdentifier(col)).join(', ')}`;\n }\n\n /**\n * PostgreSQL-specific: Array operations\n */\n buildArrayContains(column: string, value: unknown): string {\n return `${this.escapeValue(value)} = ANY(${this.escapeIdentifier(column)})`;\n }\n\n buildArrayOverlap(column: string, values: unknown[]): string {\n return `${this.escapeIdentifier(column)} && ARRAY[${values.map((v) => this.escapeValue(v)).join(', ')}]`;\n }\n\n /**\n * PostgreSQL-specific: Full-text search\n */\n buildTextSearch(column: string, query: string, config = 'english'): string {\n return `to_tsvector('${config}', ${this.escapeIdentifier(column)}) @@ plainto_tsquery('${config}', ${this.escapeValue(query)})`;\n }\n\n /**\n * PostgreSQL-specific: JSON/JSONB operations\n */\n buildJsonPath(column: string, path: string[]): string {\n const pathExpr = path.map((p) => `'${p}'`).join('->');\n return `${this.escapeIdentifier(column)}->${pathExpr}`;\n }\n\n buildJsonPathText(column: string, path: string[]): string {\n if (path.length === 0) {\n return column;\n }\n const lastPath = path.pop()!;\n const pathExpr =\n path.length > 0\n ? `${this.escapeIdentifier(column)}->${path.map((p) => `'${p}'`).join('->')}->>>'${lastPath}'`\n : `${this.escapeIdentifier(column)}->>'${lastPath}'`;\n return pathExpr;\n }\n}\n","/**\n * Dialect Factory\n *\n * Creates appropriate SQL dialect based on database type.\n * Implements Factory pattern for clean dialect instantiation.\n */\n\nimport { MySQLDialect } from './mysql-dialect';\nimport { PostgreSQLDialect } from './postgresql-dialect';\n\nimport type { SQLDialect } from './sql-dialect';\n\nexport type DialectDatabaseType = 'mysql' | 'mariadb' | 'postgresql' | 'postgres';\n\nconst dialectCache = new Map<DialectDatabaseType, SQLDialect>();\n\nexport class DialectFactory {\n /**\n * Get dialect for database type (cached)\n */\n static getDialect(type: DialectDatabaseType): SQLDialect {\n // Normalize type\n const normalizedType = this.normalizeType(type);\n\n // Check cache\n if (dialectCache.has(normalizedType)) {\n return dialectCache.get(normalizedType)!;\n }\n\n // Create dialect\n const dialect = this.createDialect(normalizedType);\n dialectCache.set(normalizedType, dialect);\n return dialect;\n }\n\n /**\n * Create new dialect instance (not cached)\n */\n static createDialect(type: DialectDatabaseType): SQLDialect {\n const normalizedType = this.normalizeType(type);\n\n switch (normalizedType) {\n case 'mysql': {\n return new MySQLDialect();\n }\n case 'postgresql': {\n return new PostgreSQLDialect();\n }\n default: {\n throw new Error(`Unsupported database type: ${type}`);\n }\n }\n }\n\n /**\n * Normalize database type aliases\n */\n private static normalizeType(type: DialectDatabaseType): 'mysql' | 'postgresql' {\n switch (type) {\n case 'mysql':\n case 'mariadb': {\n return 'mysql';\n }\n case 'postgresql':\n case 'postgres': {\n return 'postgresql';\n }\n default: {\n throw new Error(`Unknown database type: ${type}`);\n }\n }\n }\n\n /**\n * Check if database type is supported\n */\n static isSupported(type: string): type is DialectDatabaseType {\n return ['mysql', 'mariadb', 'postgresql', 'postgres'].includes(type);\n }\n\n /**\n * Clear dialect cache (useful for testing)\n */\n static clearCache(): void {\n dialectCache.clear();\n }\n}\n","/**\n * Query Context\n *\n * Shared context for all query builders containing:\n * - Database dialect\n * - Query executor\n * - Crypto provider (optional)\n * - Cache config (optional)\n *\n * This separates execution concerns from query building.\n */\n\nimport { createHash } from 'node:crypto';\n\nimport type { CryptoProvider } from '../crypto/crypto';\nimport type { SQLDialect } from '../dialect/sql-dialect';\nimport type { CacheAdapter } from '../interfaces';\nimport type { QueryResult } from '../types';\n\n/**\n * Execute result for write operations (INSERT/UPDATE/DELETE)\n */\nexport interface ExecuteResult {\n affectedRows: number;\n insertId?: number | bigint;\n changedRows?: number;\n}\n\n/**\n * Query executor interface - implemented by adapters\n */\nexport interface QueryExecutor {\n query<T = unknown>(sql: string, params?: unknown[]): Promise<QueryResult<T>>;\n execute(sql: string, params?: unknown[]): Promise<ExecuteResult>;\n}\n\n/**\n * Cache configuration for QueryContext\n */\nexport interface QueryContextCacheConfig {\n adapter: CacheAdapter;\n defaultTTL: number;\n maxTTL: number;\n prefix: string;\n global: boolean;\n warnOnLargeResult: number;\n maxCacheableRows: number;\n logger?: { warn: (message: string) => void };\n}\n\n// Re-export for convenience\n\n/**\n * Query context containing all dependencies for query execution\n */\nexport class QueryContext {\n public readonly cacheConfig?: QueryContextCacheConfig;\n\n constructor(\n public readonly dialect: SQLDialect,\n public readonly executor: QueryExecutor,\n public readonly crypto?: CryptoProvider,\n cacheConfig?: QueryContextCacheConfig,\n ) {\n this.cacheConfig = cacheConfig;\n }\n\n /**\n * Execute a SELECT query\n */\n async executeQuery<T>(sql: string, bindings: unknown[]): Promise<QueryResult<T>> {\n this.dialect.resetParameters();\n return this.executor.query<T>(sql, bindings);\n }\n\n /**\n * Execute a write query (INSERT/UPDATE/DELETE)\n */\n async executeWrite(sql: string, bindings: unknown[]): Promise<ExecuteResult> {\n this.dialect.resetParameters();\n const result = await this.executor.execute(sql, bindings);\n return result;\n }\n\n /**\n * Encrypt a value if crypto provider is available\n */\n encrypt(value: string): string {\n if (!this.crypto) {\n throw new Error('Crypto provider not configured');\n }\n return this.crypto.encryptField(value);\n }\n\n /**\n * Decrypt a value if crypto provider is available\n */\n decrypt(value: string): string {\n if (!this.crypto) {\n throw new Error('Crypto provider not configured');\n }\n const decrypted = this.crypto.decryptField(value);\n return typeof decrypted === 'string' ? decrypted : JSON.stringify(decrypted);\n }\n\n /**\n * Check if crypto is available\n */\n get hasCrypto(): boolean {\n return this.crypto !== undefined;\n }\n\n /**\n * Check if cache is available\n */\n get hasCache(): boolean {\n return this.cacheConfig !== undefined;\n }\n\n /**\n * Generate cache key from SQL and bindings\n */\n generateCacheKey(sql: string, bindings: unknown[]): string {\n const prefix = this.cacheConfig?.prefix || 'qb:';\n const hash = createHash('sha256')\n .update(sql + JSON.stringify(bindings))\n .digest('hex')\n .slice(0, 16);\n return `${prefix}${hash}`;\n }\n\n /**\n * Execute a cached SELECT query\n *\n * Safety measures:\n * - Enforces maxTTL limit\n * - Skips caching for large result sets\n * - Warns on results exceeding threshold\n */\n async executeCachedQuery<T>(\n sql: string,\n bindings: unknown[],\n options?: { ttl?: number; key?: string },\n ): Promise<QueryResult<T>> {\n if (!this.cacheConfig) {\n // No cache configured, execute directly\n return this.executeQuery<T>(sql, bindings);\n }\n\n const cacheKey = options?.key || this.generateCacheKey(sql, bindings);\n\n // Enforce TTL limits\n let ttl = options?.ttl || this.cacheConfig.defaultTTL;\n if (ttl > this.cacheConfig.maxTTL) {\n ttl = this.cacheConfig.maxTTL;\n this.cacheConfig.logger?.warn(\n `Cache TTL ${options?.ttl}s exceeds maxTTL ${this.cacheConfig.maxTTL}s, using maxTTL`,\n );\n }\n\n // Try to get from cache\n const cached = await this.cacheConfig.adapter.get<QueryResult<T>>(cacheKey);\n if (cached !== null && cached !== undefined) {\n return cached;\n }\n\n // Execute query\n const result = await this.executeQuery<T>(sql, bindings);\n\n // Safety: Skip caching for large result sets\n if (result.rowCount > this.cacheConfig.maxCacheableRows) {\n this.cacheConfig.logger?.warn(\n `Skipping cache for query with ${result.rowCount} rows (max: ${this.cacheConfig.maxCacheableRows}). Use pagination instead.`,\n );\n return result;\n }\n\n // Warn on large results\n if (result.rowCount > this.cacheConfig.warnOnLargeResult) {\n this.cacheConfig.logger?.warn(\n `Caching ${result.rowCount} rows. Consider using pagination for better performance.`,\n );\n }\n\n // Store in cache\n await this.cacheConfig.adapter.set(cacheKey, result, ttl);\n\n return result;\n }\n\n /**\n * Invalidate cache for a table\n */\n async invalidateCache(pattern?: string): Promise<void> {\n if (!this.cacheConfig) {\n return;\n }\n\n const prefix = this.cacheConfig.prefix || 'qb:';\n const key = pattern ? `${prefix}${pattern}*` : `${prefix}*`;\n\n // If the adapter supports delete by pattern\n if (typeof (this.cacheConfig.adapter as any).deletePattern === 'function') {\n await (this.cacheConfig.adapter as any).deletePattern(key);\n }\n }\n}\n\nexport { type FieldInfo, type QueryResult } from '../types';\n","/**\n * Where Builder\n *\n * Handles WHERE clause construction with type-safe conditions.\n * Used by SelectBuilder, UpdateBuilder, and DeleteBuilder.\n *\n * Supports:\n * - Simple equality: where('column', value)\n * - Operators: where('column', '>=', value)\n * - Object syntax: where({ column1: value1, column2: value2 })\n * - Raw SQL: whereRaw('column > ?', [value])\n * - NULL checks: whereNull, whereNotNull\n * - IN clauses: whereIn, whereNotIn\n * - BETWEEN: whereBetween\n * - LIKE: whereLike\n */\n\nimport type { SQLDialect, WhereCondition } from '../dialect/sql-dialect';\n\nexport type WhereConditionInput =\n | { type: 'simple'; column: string; operator: string; value: unknown }\n | { type: 'object'; data: Record<string, unknown> }\n | { type: 'raw'; sql: string; bindings: unknown[] }\n | { type: 'null'; column: string; not: boolean }\n | { type: 'in'; column: string; values: unknown[]; not: boolean }\n | { type: 'between'; column: string; from: unknown; to: unknown; not: boolean }\n | { type: 'like'; column: string; pattern: string; not: boolean };\n\nexport class WhereBuilder {\n private conditions: Array<{ conjunction: 'AND' | 'OR'; input: WhereConditionInput }> = [];\n\n constructor(private readonly dialect: SQLDialect) {}\n\n /**\n * Add AND WHERE condition\n */\n where(column: string, value: unknown): this;\n where(column: string, operator: string, value: unknown): this;\n where(conditions: Record<string, unknown>): this;\n where(\n columnOrConditions: string | Record<string, unknown>,\n operatorOrValue?: string | unknown,\n value?: unknown,\n ): this {\n const input = this.parseWhereArgs(columnOrConditions, operatorOrValue, value);\n this.conditions.push({ conjunction: 'AND', input });\n return this;\n }\n\n /**\n * Add OR WHERE condition\n */\n orWhere(column: string, value: unknown): this;\n orWhere(column: string, operator: string, value: unknown): this;\n orWhere(conditions: Record<string, unknown>): this;\n orWhere(\n columnOrConditions: string | Record<string, unknown>,\n operatorOrValue?: string | unknown,\n value?: unknown,\n ): this {\n const input = this.parseWhereArgs(columnOrConditions, operatorOrValue, value);\n this.conditions.push({ conjunction: 'OR', input });\n return this;\n }\n\n /**\n * WHERE column IS NULL\n */\n whereNull(column: string): this {\n this.conditions.push({\n conjunction: 'AND',\n input: { type: 'null', column, not: false },\n });\n return this;\n }\n\n /**\n * WHERE column IS NOT NULL\n */\n whereNotNull(column: string): this {\n this.conditions.push({\n conjunction: 'AND',\n input: { type: 'null', column, not: true },\n });\n return this;\n }\n\n /**\n * WHERE column IN (...)\n */\n whereIn(column: string, values: unknown[]): this {\n this.conditions.push({\n conjunction: 'AND',\n input: { type: 'in', column, values, not: false },\n });\n return this;\n }\n\n /**\n * WHERE column NOT IN (...)\n */\n whereNotIn(column: string, values: unknown[]): this {\n this.conditions.push({\n conjunction: 'AND',\n input: { type: 'in', column, values, not: true },\n });\n return this;\n }\n\n /**\n * WHERE column BETWEEN ... AND ...\n */\n whereBetween(column: string, from: unknown, to: unknown): this {\n this.conditions.push({\n conjunction: 'AND',\n input: { type: 'between', column, from, to, not: false },\n });\n return this;\n }\n\n /**\n * WHERE column NOT BETWEEN ... AND ...\n */\n whereNotBetween(column: string, from: unknown, to: unknown): this {\n this.conditions.push({\n conjunction: 'AND',\n input: { type: 'between', column, from, to, not: true },\n });\n return this;\n }\n\n /**\n * WHERE column LIKE pattern\n */\n whereLike(column: string, pattern: string): this {\n this.conditions.push({\n conjunction: 'AND',\n input: { type: 'like', column, pattern, not: false },\n });\n return this;\n }\n\n /**\n * WHERE column NOT LIKE pattern\n */\n whereNotLike(column: string, pattern: string): this {\n this.conditions.push({\n conjunction: 'AND',\n input: { type: 'like', column, pattern, not: true },\n });\n return this;\n }\n\n /**\n * Raw WHERE clause\n */\n whereRaw(sql: string, bindings: unknown[] = []): this {\n this.conditions.push({\n conjunction: 'AND',\n input: { type: 'raw', sql, bindings },\n });\n return this;\n }\n\n /**\n * Build WHERE conditions for use by SQLDialect\n */\n build(): WhereCondition[] {\n return this.conditions.map(({ conjunction, input }, index) => {\n const result = this.buildCondition(input);\n return {\n type: index === 0 ? 'AND' : conjunction,\n sql: result.sql,\n bindings: result.bindings,\n };\n });\n }\n\n /**\n * Check if any conditions exist\n */\n hasConditions(): boolean {\n return this.conditions.length > 0;\n }\n\n /**\n * Clear all conditions\n */\n clear(): void {\n this.conditions = [];\n }\n\n /**\n * Clone the WhereBuilder\n */\n clone(): WhereBuilder {\n const cloned = new WhereBuilder(this.dialect);\n // Deep clone conditions array\n cloned.conditions = this.conditions.map((cond) => ({\n conjunction: cond.conjunction,\n input: this.cloneInput(cond.input),\n }));\n return cloned;\n }\n\n /**\n * Deep clone a WhereConditionInput\n */\n private cloneInput(input: WhereConditionInput): WhereConditionInput {\n switch (input.type) {\n case 'simple': {\n return { ...input };\n }\n case 'object': {\n return { ...input, data: { ...input.data } };\n }\n case 'raw': {\n return { ...input, bindings: [...input.bindings] };\n }\n case 'null': {\n return { ...input };\n }\n case 'in': {\n return { ...input, values: [...input.values] };\n }\n case 'between': {\n return { ...input };\n }\n case 'like': {\n return { ...input };\n }\n }\n }\n\n /**\n * Parse where method arguments into WhereConditionInput\n */\n private parseWhereArgs(\n columnOrConditions: string | Record<string, unknown>,\n operatorOrValue?: string | unknown,\n value?: unknown,\n ): WhereConditionInput {\n // Object syntax: where({ column: value })\n if (typeof columnOrConditions === 'object') {\n return { type: 'object', data: columnOrConditions };\n }\n\n // Three args: where('column', '>=', value)\n if (value !== undefined) {\n return {\n type: 'simple',\n column: columnOrConditions,\n operator: operatorOrValue as string,\n value,\n };\n }\n\n // Two args: where('column', value) - defaults to '='\n return {\n type: 'simple',\n column: columnOrConditions,\n operator: '=',\n value: operatorOrValue,\n };\n }\n\n /**\n * Build a single condition to SQL\n */\n private buildCondition(input: WhereConditionInput): { sql: string; bindings: unknown[] } {\n switch (input.type) {\n case 'simple': {\n return this.buildSimpleCondition(input.column, input.operator, input.value);\n }\n\n case 'object': {\n return this.buildObjectCondition(input.data);\n }\n\n case 'raw': {\n return { sql: input.sql, bindings: input.bindings };\n }\n\n case 'null': {\n return {\n sql: `${this.dialect.escapeIdentifier(input.column)} IS ${input.not ? 'NOT ' : ''}NULL`,\n bindings: [],\n };\n }\n\n case 'in': {\n return this.buildInCondition(input.column, input.values, input.not);\n }\n\n case 'between': {\n return this.buildBetweenCondition(input.column, input.from, input.to, input.not);\n }\n\n case 'like': {\n return {\n sql: `${this.dialect.escapeIdentifier(input.column)} ${input.not ? 'NOT ' : ''}LIKE ${this.dialect.getParameterPlaceholder()}`,\n bindings: [input.pattern],\n };\n }\n }\n }\n\n private buildSimpleCondition(\n column: string,\n operator: string,\n value: unknown,\n ): { sql: string; bindings: unknown[] } {\n const escapedColumn = this.dialect.escapeIdentifier(column);\n\n // Handle NULL values\n if (value === null || value === undefined) {\n if (operator === '=' || operator === '==') {\n return { sql: `${escapedColumn} IS NULL`, bindings: [] };\n }\n if (operator === '!=' || operator === '<>') {\n return { sql: `${escapedColumn} IS NOT NULL`, bindings: [] };\n }\n }\n\n const placeholder = this.dialect.getParameterPlaceholder();\n return {\n sql: `${escapedColumn} ${operator} ${placeholder}`,\n bindings: [value],\n };\n }\n\n private buildObjectCondition(data: Record<string, unknown>): {\n sql: string;\n bindings: unknown[];\n } {\n const clauses: string[] = [];\n const bindings: unknown[] = [];\n\n for (const [column, value] of Object.entries(data)) {\n const result = this.buildSimpleCondition(column, '=', value);\n clauses.push(result.sql);\n bindings.push(...result.bindings);\n }\n\n return {\n sql: clauses.length > 1 ? `(${clauses.join(' AND ')})` : clauses[0] || '1=1',\n bindings,\n };\n }\n\n private buildInCondition(\n column: string,\n values: unknown[],\n not: boolean,\n ): { sql: string; bindings: unknown[] } {\n if (values.length === 0) {\n // Empty IN clause - always false (or true for NOT IN)\n return { sql: not ? '1=1' : '1=0', bindings: [] };\n }\n\n const placeholders = values.map(() => this.dialect.getParameterPlaceholder());\n const operator = not ? 'NOT IN' : 'IN';\n\n return {\n sql: `${this.dialect.escapeIdentifier(column)} ${operator} (${placeholders.join(', ')})`,\n bindings: values,\n };\n }\n\n private buildBetweenCondition(\n column: string,\n from: unknown,\n to: unknown,\n not: boolean,\n ): { sql: string; bindings: unknown[] } {\n const escapedColumn = this.dialect.escapeIdentifier(column);\n const placeholder1 = this.dialect.getParameterPlaceholder();\n const placeholder2 = this.dialect.getParameterPlaceholder();\n const operator = not ? 'NOT BETWEEN' : 'BETWEEN';\n\n return {\n sql: `${escapedColumn} ${operator} ${placeholder1} AND ${placeholder2}`,\n bindings: [from, to],\n };\n }\n}\n","/**\n * Select Query Builder\n *\n * Fluent builder for SELECT queries following SRP.\n * Modularized into logical concerns via traits.\n *\n * Related modules:\n * @see traits/select-join-trait.ts - JOIN operations\n * @see traits/select-grouping-trait.ts - GROUP BY, HAVING, ORDER BY\n * @see traits/select-cache-trait.ts - Query caching\n * @see traits/select-execution-trait.ts - Query execution\n *\n * @example\n * ```typescript\n * const users = await select\n * .from('users')\n * .select('id', 'name', 'email')\n * .where('active', true)\n * .orderBy('created_at', 'DESC')\n * .limit(10)\n * .get();\n * ```\n */\n\nimport { WhereBuilder } from './where-builder';\n\nimport type { QueryContext } from './query-context';\nimport type { SelectComponents, JoinDefinition, OrderByDefinition } from '../dialect/sql-dialect';\nimport type { CacheOptions, CacheState } from './traits/select-cache-trait';\nimport type { HavingClause } from './traits/select-grouping-trait';\n\n// Re-export trait types for external use\nexport type { CacheOptions, CacheState } from './traits/select-cache-trait';\nexport type { HavingClause } from './traits/select-grouping-trait';\n\nexport class SelectBuilder<T = unknown> {\n // ============ Core State ============\n private _columns: string[] = [];\n private _distinct = false;\n private _table?: string;\n private _tableAlias?: string;\n\n // ============ Join State (from SelectJoinTrait) ============\n private _joins: JoinDefinition[] = [];\n\n // ============ Grouping State (from SelectGroupingTrait) ============\n private _groupBy: string[] = [];\n private _having?: HavingClause;\n private _orderBy: OrderByDefinition[] = [];\n\n // ============ Pagination State ============\n private _limit?: number;\n private _offset?: number;\n\n // ============ Where State ============\n private _whereBuilder: WhereBuilder;\n\n // ============ Encryption State ============\n private _encryptFields: Set<string> = new Set();\n private _decryptFields: Set<string> = new Set();\n\n // ============ Cache State (from SelectCacheTrait) ============\n private _cacheEnabled = false;\n private _cacheTTL?: number;\n private _cacheKey?: string;\n private _cacheTags?: string[];\n\n constructor(private readonly ctx: QueryContext) {\n if (ctx.cacheConfig?.global) {\n this._cacheEnabled = true;\n }\n this._whereBuilder = new WhereBuilder(ctx.dialect);\n }\n\n // ============ Core Selection Methods ============\n\n /**\n * Set columns to select\n */\n select(...columns: string[]): this {\n this._columns = columns;\n return this;\n }\n\n /**\n * Add columns to selection\n */\n addSelect(...columns: string[]): this {\n this._columns.push(...columns);\n return this;\n }\n\n /**\n * Add DISTINCT keyword\n */\n distinct(): this {\n this._distinct = true;\n return this;\n }\n\n /**\n * Set FROM table\n */\n from(table: string, alias?: string): this {\n this._table = table;\n this._tableAlias = alias;\n return this;\n }\n\n /**\n * Alias for from()\n */\n table(table: string, alias?: string): this {\n return this.from(table, alias);\n }\n\n // ============ WHERE Methods (delegated to WhereBuilder) ============\n\n where(column: string, value: unknown): this;\n where(column: string, operator: string, value: unknown): this;\n where(conditions: Record<string, unknown>): this;\n where(\n columnOrConditions: string | Record<string, unknown>,\n operatorOrValue?: string | unknown,\n value?: unknown,\n ): this {\n this._whereBuilder.where(columnOrConditions as any, operatorOrValue as any, value);\n return this;\n }\n\n orWhere(column: string, value: unknown): this;\n orWhere(column: string, operator: string, value: unknown): this;\n orWhere(conditions: Record<string, unknown>): this;\n orWhere(\n columnOrConditions: string | Record<string, unknown>,\n operatorOrValue?: string | unknown,\n value?: unknown,\n ): this {\n this._whereBuilder.orWhere(columnOrConditions as any, operatorOrValue as any, value);\n return this;\n }\n\n whereNull(column: string): this {\n this._whereBuilder.whereNull(column);\n return this;\n }\n\n whereNotNull(column: string): this {\n this._whereBuilder.whereNotNull(column);\n return this;\n }\n\n whereIn(column: string, values: unknown[]): this {\n this._whereBuilder.whereIn(column, values);\n return this;\n }\n\n whereNotIn(column: string, values: unknown[]): this {\n this._whereBuilder.whereNotIn(column, values);\n return this;\n }\n\n whereBetween(column: string, from: unknown, to: unknown): this {\n this._whereBuilder.whereBetween(column, from, to);\n return this;\n }\n\n whereLike(column: string, pattern: string): this {\n this._whereBuilder.whereLike(column, pattern);\n return this;\n }\n\n whereRaw(sql: string, bindings: unknown[] = []): this {\n this._whereBuilder.whereRaw(sql, bindings);\n return this;\n }\n\n // ============ JOIN Methods (from SelectJoinTrait) ============\n\n join(table: string, condition: string, bindings: unknown[] = []): this {\n return this.innerJoin(table, condition, bindings);\n }\n\n innerJoin(table: string, condition: string, bindings: unknown[] = []): this {\n this._joins.push({ type: 'INNER', table, condition, bindings });\n return this;\n }\n\n leftJoin(table: string, condition: string, bindings: unknown[] = []): this {\n this._joins.push({ type: 'LEFT', table, condition, bindings });\n return this;\n }\n\n rightJoin(table: string, condition: string, bindings: unknown[] = []): this {\n this._joins.push({ type: 'RIGHT', table, condition, bindings });\n return this;\n }\n\n fullJoin(table: string, condition: string, bindings: unknown[] = []): this {\n this._joins.push({ type: 'FULL', table, condition, bindings });\n return this;\n }\n\n crossJoin(table: string): this {\n this._joins.push({ type: 'CROSS', table, condition: '', bindings: [] });\n return this;\n }\n\n leftJoinAs(table: string, alias: string, condition: string, bindings: unknown[] = []): this {\n this._joins.push({ type: 'LEFT', table, alias, condition, bindings });\n return this;\n }\n\n innerJoinAs(table: string, alias: string, condition: string, bindings: unknown[] = []): this {\n this._joins.push({ type: 'INNER', table, alias, condition, bindings });\n return this;\n }\n\n // ============ GROUP BY / HAVING (from SelectGroupingTrait) ============\n\n groupBy(...columns: string[]): this {\n this._groupBy.push(...columns);\n return this;\n }\n\n having(condition: string, bindings: unknown[] = []): this {\n this._having = { condition, bindings };\n return this;\n }\n\n // ============ ORDER BY (from SelectGroupingTrait) ============\n\n orderBy(column: string, direction: 'ASC' | 'DESC' = 'ASC'): this {\n this._orderBy.push({ column, direction });\n return this;\n }\n\n orderByDesc(column: string): this {\n return this.orderBy(column, 'DESC');\n }\n\n orderByAsc(column: string): this {\n return this.orderBy(column, 'ASC');\n }\n\n orderByRaw(expression: string): this {\n this._orderBy.push({ column: expression, direction: 'ASC', raw: true });\n return this;\n }\n\n clearOrder(): this {\n this._orderBy = [];\n return this;\n }\n\n reorder(column: string, direction: 'ASC' | 'DESC' = 'ASC'): this {\n this._orderBy = [];\n return this.orderBy(column, direction);\n }\n\n // ============ LIMIT / OFFSET / Pagination ============\n\n limit(count: number): this {\n this._limit = count;\n return this;\n }\n\n offset(count: number): this {\n this._offset = count;\n return this;\n }\n\n skip(count: number): this {\n return this.offset(count);\n }\n\n take(count: number): this {\n return this.limit(count);\n }\n\n paginate(page: number, perPage: number): this {\n this._limit = perPage;\n this._offset = (page - 1) * perPage;\n return this;\n }\n\n forPage(page: number, perPage = 15): this {\n return this.paginate(page, perPage);\n }\n\n // ============ Encryption ============\n\n encrypt(...fields: string[]): this {\n fields.forEach((f) => this._encryptFields.add(f));\n return this;\n }\n\n decrypt(...fields: string[]): this {\n fields.forEach((f) => this._decryptFields.add(f));\n return this;\n }\n\n // ============ Caching (from SelectCacheTrait) ============\n\n cache(options?: number | CacheOptions): this {\n if (!this.ctx.hasCache) {\n return this;\n }\n\n this._cacheEnabled = true;\n\n if (typeof options === 'number') {\n this._cacheTTL = options;\n } else if (options) {\n this._cacheTTL = options.ttl;\n this._cacheKey = options.key;\n this._cacheTags = options.tags;\n }\n\n return this;\n }\n\n noCache(): this {\n this._cacheEnabled = false;\n this._cacheTTL = undefined;\n this._cacheKey = undefined;\n this._cacheTags = undefined;\n return this;\n }\n\n cacheTTL(seconds: number): this {\n this._cacheTTL = seconds;\n return this;\n }\n\n cacheKey(key: string): this {\n this._cacheKey = key;\n return this;\n }\n\n cacheTags(...tags: string[]): this {\n this._cacheTags = tags;\n return this;\n }\n\n getCacheState(): CacheState {\n return {\n enabled: this._cacheEnabled,\n ttl: this._cacheTTL,\n key: this._cacheKey,\n tags: this._cacheTags,\n };\n }\n\n // ============ SQL Building ============\n\n toSQL(): { sql: string; bindings: unknown[] } {\n this.ctx.dialect.resetParameters();\n\n const components: SelectComponents = {\n columns: this._columns.length > 0 ? this._columns : ['*'],\n distinct: this._distinct,\n from: this._table,\n fromAlias: this._tableAlias,\n joins: this._joins,\n where: this._whereBuilder.build(),\n groupBy: this._groupBy,\n having: this._having,\n orderBy: this._orderBy,\n limit: this._limit,\n offset: this._offset,\n };\n\n return this.ctx.dialect.buildSelect(components);\n }\n\n // ============ Execution Methods (from SelectExecutionTrait) ============\n\n async get(): Promise<T[]> {\n const { sql, bindings } = this.toSQL();\n\n const result =\n this._cacheEnabled && this.ctx.hasCache\n ? await this.ctx.executeCachedQuery<T>(sql, bindings, {\n ttl: this._cacheTTL,\n key: this._cacheKey,\n })\n : await this.ctx.executeQuery<T>(sql, bindings);\n\n return this.processResults(result.rows);\n }\n\n async first(): Promise<T | null> {\n this._limit = 1;\n const results = await this.get();\n return results[0] ?? null;\n }\n\n async firstOrFail(): Promise<T> {\n const result = await this.first();\n if (result === null) {\n throw new Error('No record found');\n }\n return result;\n }\n\n async sole(): Promise<T> {\n this._limit = 2;\n const results = await this.get();\n\n if (results.length === 0) {\n throw new Error('No record found');\n }\n if (results.length > 1) {\n throw new Error('Multiple records found when expecting one');\n }\n\n return results[0] as T;\n }\n\n async count(column = '*'): Promise<number> {\n const originalColumns = this._columns;\n this._columns = [`COUNT(${column}) as count`];\n\n const { sql, bindings } = this.toSQL();\n const result = await this.ctx.executeQuery<{ count: string | number }>(sql, bindings);\n\n this._columns = originalColumns;\n return Number(result.rows[0]?.count ?? 0);\n }\n\n async exists(): Promise<boolean> {\n const count = await this.count();\n return count > 0;\n }\n\n async doesntExist(): Promise<boolean> {\n return !(await this.exists());\n }\n\n async aggregate(\n fn: 'SUM' | 'AVG' | 'MIN' | 'MAX' | 'COUNT',\n column: string,\n ): Promise<number | null> {\n const originalColumns = this._columns;\n this._columns = [`${fn}(${this.ctx.dialect.escapeIdentifier(column)}) as value`];\n\n const { sql, bindings } = this.toSQL();\n const result = await this.ctx.executeQuery<{ value: string | number | null }>(sql, bindings);\n\n this._columns = originalColumns;\n const value = result.rows[0]?.value;\n return value === null ? null : Number(value);\n }\n\n sum(column: string): Promise<number | null> {\n return this.aggregate('SUM', column);\n }\n\n avg(column: string): Promise<number | null> {\n return this.aggregate('AVG', column);\n }\n\n min(column: string): Promise<number | null> {\n return this.aggregate('MIN', column);\n }\n\n max(column: string): Promise<number | null> {\n return this.aggregate('MAX', column);\n }\n\n async pluck<V = unknown>(column: string): Promise<V[]> {\n const originalColumns = this._columns;\n this._columns = [column];\n\n const results = await this.get();\n this._columns = originalColumns;\n\n return results.map((row: any) => row[column]) as V[];\n }\n\n async pluckKeyValue<K extends string | number, V = unknown>(\n valueColumn: string,\n keyColumn: string,\n ): Promise<Map<K, V>> {\n const originalColumns = this._columns;\n this._columns = [keyColumn, valueColumn];\n\n const results = await this.get();\n this._columns = originalColumns;\n\n const map = new Map<K, V>();\n for (const row of results as any[]) {\n map.set(row[keyColumn] as K, row[valueColumn] as V);\n }\n return map;\n }\n\n async chunk(\n size: number,\n callback: (rows: T[], chunkNumber: number) => Promise<boolean | void> | boolean | void,\n ): Promise<void> {\n let offset = 0;\n let chunkNumber = 1;\n let hasMore = true;\n\n while (hasMore) {\n this._limit = size;\n this._offset = offset;\n\n const rows = await this.get();\n\n if (rows.length === 0) {\n hasMore = false;\n continue;\n }\n\n const result = await callback(rows, chunkNumber);\n\n if (result === false) {\n hasMore = false;\n continue;\n }\n\n offset += size;\n chunkNumber++;\n\n if (rows.length < size) {\n hasMore = false;\n }\n }\n }\n\n async *lazy(chunkSize = 100): AsyncGenerator<T, void, unknown> {\n let offset = 0;\n let hasMore = true;\n\n while (hasMore) {\n this._limit = chunkSize;\n this._offset = offset;\n\n const rows = await this.get();\n\n for (const row of rows) {\n yield row;\n }\n\n if (rows.length < chunkSize) {\n hasMore = false;\n } else {\n offset += chunkSize;\n }\n }\n }\n\n // ============ Private Methods ============\n\n private processResults(rows: T[]): T[] {\n if (this._decryptFields.size === 0 || !this.ctx.hasCrypto) {\n return rows;\n }\n\n return rows.map((row) => {\n const processed = { ...row } as any;\n for (const field of this._decryptFields) {\n if (processed[field] && typeof processed[field] === 'string') {\n try {\n processed[field] = this.ctx.decrypt(processed[field]);\n } catch {\n // Keep original value if decryption fails\n }\n }\n }\n return processed as T;\n });\n }\n\n // ============ Utility Methods ============\n\n /**\n * Clone the builder\n */\n clone(): SelectBuilder<T> {\n const cloned = new SelectBuilder<T>(this.ctx);\n cloned._columns = [...this._columns];\n cloned._distinct = this._distinct;\n cloned._table = this._table;\n cloned._tableAlias = this._tableAlias;\n cloned._joins = [...this._joins];\n cloned._groupBy = [...this._groupBy];\n cloned._having = this._having ? { ...this._having } : undefined;\n cloned._orderBy = [...this._orderBy];\n cloned._limit = this._limit;\n cloned._offset = this._offset;\n cloned._encryptFields = new Set(this._encryptFields);\n cloned._decryptFields = new Set(this._decryptFields);\n cloned._cacheEnabled = this._cacheEnabled;\n cloned._cacheTTL = this._cacheTTL;\n cloned._cacheKey = this._cacheKey;\n cloned._cacheTags = this._cacheTags ? [...this._cacheTags] : undefined;\n // Clone the WhereBuilder to ensure independent state\n cloned._whereBuilder = this._whereBuilder.clone();\n return cloned;\n }\n\n /**\n * Debug helper - log query without executing\n */\n dump(): this {\n const { sql, bindings } = this.toSQL();\n // eslint-disable-next-line no-console\n console.log('SQL:', sql);\n // eslint-disable-next-line no-console\n console.log('Bindings:', bindings);\n return this;\n }\n\n /**\n * Debug helper - log and execute query\n */\n async dd(): Promise<T[]> {\n this.dump();\n return this.get();\n }\n}\n","/**\n * Insert Query Builder\n *\n * Fluent builder for INSERT queries following SRP.\n *\n * @example\n * ```typescript\n * const id = await insert\n * .into('users')\n * .values({ name: 'John', email: 'john@example.com' })\n * .execute();\n *\n * // Bulk insert\n * await insert\n * .into('users')\n * .values([\n * { name: 'John', email: 'john@example.com' },\n * { name: 'Jane', email: 'jane@example.com' },\n * ])\n * .execute();\n * ```\n */\n\nimport type { QueryContext, ExecuteResult } from './query-context';\nimport type { InsertComponents } from '../dialect/sql-dialect';\n\nexport class InsertBuilder<T = unknown> {\n private _table?: string;\n private _data: Record<string, unknown>[] = [];\n private _returning: string[] = [];\n private _encryptFields: Set<string> = new Set();\n private _ignore = false;\n\n constructor(private readonly ctx: QueryContext) {}\n\n /**\n * Set table to insert into\n */\n into(table: string): this {\n this._table = table;\n return this;\n }\n\n /**\n * Alias for into()\n */\n table(table: string): this {\n return this.into(table);\n }\n\n /**\n * Set values to insert (single row or multiple rows)\n */\n values(data: Record<string, unknown> | Record<string, unknown>[]): this {\n if (Array.isArray(data)) {\n this._data = data;\n } else {\n this._data = [data];\n }\n return this;\n }\n\n /**\n * Mark fields to be encrypted before insertion\n */\n encrypt(...fields: string[]): this {\n fields.forEach((f) => this._encryptFields.add(f));\n return this;\n }\n\n /**\n * Add RETURNING clause (PostgreSQL)\n */\n returning(...columns: string[]): this {\n this._returning = columns;\n return this;\n }\n\n /**\n * Use INSERT IGNORE (MySQL) - ignore duplicate key errors\n */\n ignore(): this {\n this._ignore = true;\n return this;\n }\n\n /**\n * Build SQL without executing\n */\n toSQL(): { sql: string; bindings: unknown[] } {\n if (!this._table) {\n throw new Error('Table name is required for INSERT');\n }\n\n if (this._data.length === 0) {\n throw new Error('Insert data is required');\n }\n\n this.ctx.dialect.resetParameters();\n\n // Process encryption\n const processedData = this.processDataForEncryption(this._data);\n\n const components: InsertComponents = {\n table: this._table,\n data: processedData,\n returning: this._returning.length > 0 ? this._returning : undefined,\n };\n\n const result = this.ctx.dialect.buildInsert(components);\n let sql = result.sql;\n const { bindings } = result;\n\n // Handle INSERT IGNORE for MySQL\n if (this._ignore && this.ctx.dialect.name === 'mysql') {\n sql = sql.replace('INSERT INTO', 'INSERT IGNORE INTO');\n }\n\n return { sql, bindings };\n }\n\n /**\n * Execute insert and return result\n */\n async execute(): Promise<ExecuteResult> {\n const { sql, bindings } = this.toSQL();\n return this.ctx.executeWrite(sql, bindings);\n }\n\n /**\n * Execute and return inserted ID\n */\n async getInsertId(): Promise<number | bigint | undefined> {\n const result = await this.execute();\n return result.insertId;\n }\n\n /**\n * Execute and return inserted row (with RETURNING)\n */\n async getInserted<R = T>(): Promise<R | null> {\n if (this._returning.length === 0) {\n this._returning = ['*'];\n }\n\n const { sql, bindings } = this.toSQL();\n const result = await this.ctx.executeQuery<R>(sql, bindings);\n return result.rows[0] ?? null;\n }\n\n // ============ Private Methods ============\n\n private processDataForEncryption(data: Record<string, unknown>[]): Record<string, unknown>[] {\n if (this._encryptFields.size === 0 || !this.ctx.hasCrypto) {\n return data;\n }\n\n return data.map((row) => {\n const processed = { ...row };\n for (const field of this._encryptFields) {\n if (processed[field] && typeof processed[field] === 'string') {\n processed[field] = this.ctx.encrypt(processed[field]);\n }\n }\n return processed;\n });\n }\n}\n","/**\n * Update Query Builder\n *\n * Fluent builder for UPDATE queries following SRP.\n *\n * @example\n * ```typescript\n * const affected = await update\n * .table('users')\n * .set({ name: 'John Doe', updated_at: new Date() })\n * .where('id', 1)\n * .execute();\n *\n * // Increment a value\n * await update\n * .table('posts')\n * .set({ views: raw('views + 1') })\n * .where('id', postId)\n * .execute();\n * ```\n */\n\nimport { WhereBuilder } from './where-builder';\n\nimport type { QueryContext, ExecuteResult } from './query-context';\nimport type { UpdateComponents } from '../dialect/sql-dialect';\n\nexport class UpdateBuilder<T = unknown> {\n private _table?: string;\n private _data: Record<string, unknown> = {};\n private _whereBuilder: WhereBuilder;\n private _returning: string[] = [];\n private _encryptFields: Set<string> = new Set();\n\n constructor(private readonly ctx: QueryContext) {\n this._whereBuilder = new WhereBuilder(ctx.dialect);\n }\n\n /**\n * Set table to update\n */\n table(table: string): this {\n this._table = table;\n return this;\n }\n\n /**\n * Set values to update\n */\n set(data: Record<string, unknown>): this {\n this._data = { ...this._data, ...data };\n return this;\n }\n\n /**\n * Mark fields to be encrypted before update\n */\n encrypt(...fields: string[]): this {\n fields.forEach((f) => this._encryptFields.add(f));\n return this;\n }\n\n /**\n * Add RETURNING clause (PostgreSQL)\n */\n returning(...columns: string[]): this {\n this._returning = columns;\n return this;\n }\n\n // ============ WHERE Methods (delegated to WhereBuilder) ============\n\n where(column: string, value: unknown): this;\n where(column: string, operator: string, value: unknown): this;\n where(conditions: Record<string, unknown>): this;\n where(\n columnOrConditions: string | Record<string, unknown>,\n operatorOrValue?: string | unknown,\n value?: unknown,\n ): this {\n this._whereBuilder.where(columnOrConditions as any, operatorOrValue as any, value);\n return this;\n }\n\n orWhere(column: string, value: unknown): this;\n orWhere(column: string, operator: string, value: unknown): this;\n orWhere(conditions: Record<string, unknown>): this;\n orWhere(\n columnOrConditions: string | Record<string, unknown>,\n operatorOrValue?: string | unknown,\n value?: unknown,\n ): this {\n this._whereBuilder.orWhere(columnOrConditions as any, operatorOrValue as any, value);\n return this;\n }\n\n whereNull(column: string): this {\n this._whereBuilder.whereNull(column);\n return this;\n }\n\n whereNotNull(column: string): this {\n this._whereBuilder.whereNotNull(column);\n return this;\n }\n\n whereIn(column: string, values: unknown[]): this {\n this._whereBuilder.whereIn(column, values);\n return this;\n }\n\n whereNotIn(column: string, values: unknown[]): this {\n this._whereBuilder.whereNotIn(column, values);\n return this;\n }\n\n whereBetween(column: string, from: unknown, to: unknown): this {\n this._whereBuilder.whereBetween(column, from, to);\n return this;\n }\n\n whereLike(column: string, pattern: string): this {\n this._whereBuilder.whereLike(column, pattern);\n return this;\n }\n\n whereRaw(sql: string, bindings: unknown[] = []): this {\n this._whereBuilder.whereRaw(sql, bindings);\n return this;\n }\n\n // ============ Execution Methods ============\n\n /**\n * Build SQL without executing\n */\n toSQL(): { sql: string; bindings: unknown[] } {\n if (!this._table) {\n throw new Error('Table name is required for UPDATE');\n }\n\n if (Object.keys(this._data).length === 0) {\n throw new Error('Update data is required');\n }\n\n this.ctx.dialect.resetParameters();\n\n // Process encryption\n const processedData = this.processDataForEncryption(this._data);\n\n const components: UpdateComponents = {\n table: this._table,\n data: processedData,\n where: this._whereBuilder.build(),\n returning: this._returning.length > 0 ? this._returning : undefined,\n };\n\n return this.ctx.dialect.buildUpdate(components);\n }\n\n /**\n * Execute update and return result\n */\n async execute(): Promise<ExecuteResult> {\n const { sql, bindings } = this.toSQL();\n return this.ctx.executeWrite(sql, bindings);\n }\n\n /**\n * Execute and return affected row count\n */\n async getAffectedRows(): Promise<number> {\n const result = await this.execute();\n return result.affectedRows;\n }\n\n /**\n * Execute and return updated row (with RETURNING)\n */\n async getUpdated<R = T>(): Promise<R | null> {\n if (this._returning.length === 0) {\n this._returning = ['*'];\n }\n\n const { sql, bindings } = this.toSQL();\n const result = await this.ctx.executeQuery<R>(sql, bindings);\n return result.rows[0] ?? null;\n }\n\n /**\n * Execute and return all updated rows (with RETURNING)\n */\n async getAllUpdated<R = T>(): Promise<R[]> {\n if (this._returning.length === 0) {\n this._returning = ['*'];\n }\n\n const { sql, bindings } = this.toSQL();\n const result = await this.ctx.executeQuery<R>(sql, bindings);\n return result.rows;\n }\n\n // ============ Private Methods ============\n\n private processDataForEncryption(data: Record<string, unknown>): Record<string, unknown> {\n if (this._encryptFields.size === 0 || !this.ctx.hasCrypto) {\n return data;\n }\n\n const processed = { ...data };\n for (const field of this._encryptFields) {\n if (processed[field] && typeof processed[field] === 'string') {\n processed[field] = this.ctx.encrypt(processed[field]);\n }\n }\n return processed;\n }\n}\n","/**\n * Delete Query Builder\n *\n * Fluent builder for DELETE queries following SRP.\n *\n * @example\n * ```typescript\n * // Delete single record\n * const affected = await del\n * .from('users')\n * .where('id', 1)\n * .execute();\n *\n * // Delete with conditions\n * await del\n * .from('sessions')\n * .where('expires_at', '<', new Date())\n * .execute();\n *\n * // Truncate (delete all)\n * await del\n * .from('logs')\n * .truncate();\n * ```\n */\n\nimport { WhereBuilder } from './where-builder';\n\nimport type { QueryContext, ExecuteResult } from './query-context';\nimport type { DeleteComponents } from '../dialect/sql-dialect';\n\nexport class DeleteBuilder<T = unknown> {\n private _table?: string;\n private _whereBuilder: WhereBuilder;\n private _returning: string[] = [];\n private _force = false;\n\n constructor(private readonly ctx: QueryContext) {\n this._whereBuilder = new WhereBuilder(ctx.dialect);\n }\n\n /**\n * Set table to delete from\n */\n from(table: string): this {\n this._table = table;\n return this;\n }\n\n /**\n * Alias for from()\n */\n table(table: string): this {\n return this.from(table);\n }\n\n /**\n * Add RETURNING clause (PostgreSQL)\n */\n returning(...columns: string[]): this {\n this._returning = columns;\n return this;\n }\n\n /**\n * Allow delete without WHERE clause (dangerous!)\n */\n force(): this {\n this._force = true;\n return this;\n }\n\n // ============ WHERE Methods (delegated to WhereBuilder) ============\n\n where(column: string, value: unknown): this;\n where(column: string, operator: string, value: unknown): this;\n where(conditions: Record<string, unknown>): this;\n where(\n columnOrConditions: string | Record<string, unknown>,\n operatorOrValue?: string | unknown,\n value?: unknown,\n ): this {\n this._whereBuilder.where(columnOrConditions as any, operatorOrValue as any, value);\n return this;\n }\n\n orWhere(column: string, value: unknown): this;\n orWhere(column: string, operator: string, value: unknown): this;\n orWhere(conditions: Record<string, unknown>): this;\n orWhere(\n columnOrConditions: string | Record<string, unknown>,\n operatorOrValue?: string | unknown,\n value?: unknown,\n ): this {\n this._whereBuilder.orWhere(columnOrConditions as any, operatorOrValue as any, value);\n return this;\n }\n\n whereNull(column: string): this {\n this._whereBuilder.whereNull(column);\n return this;\n }\n\n whereNotNull(column: string): this {\n this._whereBuilder.whereNotNull(column);\n return this;\n }\n\n whereIn(column: string, values: unknown[]): this {\n this._whereBuilder.whereIn(column, values);\n return this;\n }\n\n whereNotIn(column: string, values: unknown[]): this {\n this._whereBuilder.whereNotIn(column, values);\n return this;\n }\n\n whereBetween(column: string, from: unknown, to: unknown): this {\n this._whereBuilder.whereBetween(column, from, to);\n return this;\n }\n\n whereLike(column: string, pattern: string): this {\n this._whereBuilder.whereLike(column, pattern);\n return this;\n }\n\n whereRaw(sql: string, bindings: unknown[] = []): this {\n this._whereBuilder.whereRaw(sql, bindings);\n return this;\n }\n\n // ============ Execution Methods ============\n\n /**\n * Build SQL without executing\n */\n toSQL(): { sql: string; bindings: unknown[] } {\n if (!this._table) {\n throw new Error('Table name is required for DELETE');\n }\n\n // Safety check: require WHERE clause unless force() is called\n if (!this._whereBuilder.hasConditions() && !this._force) {\n throw new Error(\n 'DELETE without WHERE clause is dangerous. Use .force() to confirm deletion of all records.',\n );\n }\n\n this.ctx.dialect.resetParameters();\n\n const components: DeleteComponents = {\n table: this._table,\n where: this._whereBuilder.build(),\n returning: this._returning.length > 0 ? this._returning : undefined,\n };\n\n return this.ctx.dialect.buildDelete(components);\n }\n\n /**\n * Execute delete and return result\n */\n async execute(): Promise<ExecuteResult> {\n const { sql, bindings } = this.toSQL();\n return this.ctx.executeWrite(sql, bindings);\n }\n\n /**\n * Execute and return affected row count\n */\n async getAffectedRows(): Promise<number> {\n const result = await this.execute();\n return result.affectedRows;\n }\n\n /**\n * Execute and return deleted row (with RETURNING)\n */\n async getDeleted<R = T>(): Promise<R | null> {\n if (this._returning.length === 0) {\n this._returning = ['*'];\n }\n\n const { sql, bindings } = this.toSQL();\n const result = await this.ctx.executeQuery<R>(sql, bindings);\n return result.rows[0] ?? null;\n }\n\n /**\n * Execute and return all deleted rows (with RETURNING)\n */\n async getAllDeleted<R = T>(): Promise<R[]> {\n if (this._returning.length === 0) {\n this._returning = ['*'];\n }\n\n const { sql, bindings } = this.toSQL();\n const result = await this.ctx.executeQuery<R>(sql, bindings);\n return result.rows;\n }\n\n /**\n * Truncate table (delete all records efficiently)\n */\n async truncate(): Promise<void> {\n if (!this._table) {\n throw new Error('Table name is required for TRUNCATE');\n }\n\n const sql = `TRUNCATE TABLE ${this.ctx.dialect.escapeIdentifier(this._table)}`;\n await this.ctx.executeWrite(sql, []);\n }\n}\n","/**\n * Query Builder Factory\n *\n * Factory for creating query builder instances with proper context.\n * This is the main entry point for the query builder API.\n *\n * @example\n * ```typescript\n * const qb = createQueryBuilder({\n * dialect: MySQLDialect,\n * executor: mysqlAdapter,\n * crypto: cryptoProvider, // optional\n * });\n *\n * // Select\n * const users = await qb.select()\n * .from('users')\n * .where('active', true)\n * .get();\n *\n * // Insert\n * const id = await qb.insert()\n * .into('users')\n * .values({ name: 'John' })\n * .getInsertId();\n *\n * // Update\n * await qb.update()\n * .table('users')\n * .set({ name: 'Jane' })\n * .where('id', 1)\n * .execute();\n *\n * // Delete\n * await qb.delete()\n * .from('users')\n * .where('id', 1)\n * .execute();\n * ```\n */\n\nimport { DeleteBuilder } from './delete-builder';\nimport { InsertBuilder } from './insert-builder';\nimport { QueryContext } from './query-context';\nimport { SelectBuilder } from './select-builder';\nimport { UpdateBuilder } from './update-builder';\n\nimport type { CryptoProvider } from '../crypto/crypto';\nimport type { SQLDialect } from '../dialect/sql-dialect';\nimport type { CacheAdapter } from '../interfaces';\nimport type { QueryExecutor } from './query-context';\n\n/**\n * Cache configuration for query builder\n *\n * IMPORTANT: Cache is OPT-IN per query by default.\n * Use .cache() method on queries you want to cache.\n *\n * @example\n * ```typescript\n * // Configure cache (uses Redis - recommended for production)\n * const qb = createModularQueryBuilder({\n * dialect,\n * executor,\n * cache: {\n * adapter: redisAdapter,\n * defaultTTL: 300, // 5 minutes default\n * maxTTL: 3600, // Max 1 hour\n * warnOnLargeResult: 1000 // Warn if result > 1000 rows\n * }\n * });\n *\n * // Cache specific queries (opt-in)\n * const users = await qb.select().from('users').cache(60).get();\n * ```\n *\n * WARNING: Avoid using in-memory cache in production with high traffic.\n * Use Redis or another distributed cache instead.\n */\nexport interface QueryBuilderCacheConfig {\n /** Cache adapter (Redis recommended for production, Memory for dev only) */\n adapter: CacheAdapter;\n\n /** Default TTL in seconds (default: 300 = 5 minutes) */\n defaultTTL?: number;\n\n /** Maximum TTL in seconds - prevents accidental long caching (default: 3600 = 1 hour) */\n maxTTL?: number;\n\n /** Cache key prefix (default: 'qb:') */\n prefix?: string;\n\n /**\n * Enable caching globally for all SELECT queries (default: false)\n * WARNING: Not recommended! Use .cache() per query instead.\n */\n global?: boolean;\n\n /**\n * Warn if result row count exceeds this number (default: 1000)\n * Large results shouldn't be cached - use pagination instead\n */\n warnOnLargeResult?: number;\n\n /**\n * Skip caching if result exceeds this many rows (default: 10000)\n * Prevents memory issues from caching huge result sets\n */\n maxCacheableRows?: number;\n\n /**\n * Logger for cache warnings (optional)\n */\n logger?: { warn: (message: string) => void };\n}\n\nexport interface ModularQueryBuilderOptions {\n dialect: SQLDialect;\n executor: QueryExecutor;\n crypto?: CryptoProvider;\n /** Cache configuration (optional) */\n cache?: QueryBuilderCacheConfig;\n}\n\nexport interface ModularQueryBuilder {\n /**\n * Create a new SELECT query builder\n */\n select<T = unknown>(...columns: string[]): SelectBuilder<T>;\n\n /**\n * Create a new INSERT query builder\n */\n insert<T = unknown>(): InsertBuilder<T>;\n\n /**\n * Create a new UPDATE query builder\n */\n update<T = unknown>(): UpdateBuilder<T>;\n\n /**\n * Create a new DELETE query builder\n */\n delete<T = unknown>(): DeleteBuilder<T>;\n\n /**\n * Get the query context\n */\n getContext(): QueryContext;\n\n /**\n * Execute a raw SQL query\n */\n raw<T = unknown>(sql: string, bindings?: unknown[]): Promise<T[]>;\n\n /**\n * Execute a raw SQL statement\n */\n rawExecute(sql: string, bindings?: unknown[]): Promise<{ affectedRows: number }>;\n\n /**\n * Start a table query (shorthand)\n */\n table<T = unknown>(name: string, alias?: string): SelectBuilder<T>;\n}\n\n/**\n * Create a query builder instance with the provided options\n */\nexport function createModularQueryBuilder(\n options: ModularQueryBuilderOptions,\n): ModularQueryBuilder {\n // Build cache config if provided with safe defaults\n const cacheConfig = options.cache\n ? {\n adapter: options.cache.adapter,\n defaultTTL: options.cache.defaultTTL ?? 300, // 5 minutes default\n maxTTL: options.cache.maxTTL ?? 3600, // Max 1 hour\n prefix: options.cache.prefix ?? 'qb:',\n global: options.cache.global ?? false, // Opt-in by default\n warnOnLargeResult: options.cache.warnOnLargeResult ?? 1000,\n maxCacheableRows: options.cache.maxCacheableRows ?? 10_000,\n logger: options.cache.logger,\n }\n : undefined;\n\n const context = new QueryContext(options.dialect, options.executor, options.crypto, cacheConfig);\n\n return {\n select<T = unknown>(...columns: string[]): SelectBuilder<T> {\n const builder = new SelectBuilder<T>(context);\n if (columns.length > 0) {\n builder.select(...columns);\n }\n return builder;\n },\n\n insert<T = unknown>(): InsertBuilder<T> {\n return new InsertBuilder<T>(context);\n },\n\n update<T = unknown>(): UpdateBuilder<T> {\n return new UpdateBuilder<T>(context);\n },\n\n delete<T = unknown>(): DeleteBuilder<T> {\n return new DeleteBuilder<T>(context);\n },\n\n getContext(): QueryContext {\n return context;\n },\n\n async raw<T = unknown>(sql: string, bindings: unknown[] = []): Promise<T[]> {\n const result = await context.executeQuery<T>(sql, bindings);\n return result.rows;\n },\n\n async rawExecute(sql: string, bindings: unknown[] = []): Promise<{ affectedRows: number }> {\n const result = await context.executeWrite(sql, bindings);\n return { affectedRows: result.affectedRows };\n },\n\n table<T = unknown>(name: string, alias?: string): SelectBuilder<T> {\n return new SelectBuilder<T>(context).from(name, alias);\n },\n };\n}\n\n/**\n * Type helper for extracting row type from a query builder\n */\nexport type InferQueryResult<T> = T extends SelectBuilder<infer R> ? R : never;\n","/**\n * Base Transaction\n *\n * Abstract base class for database transactions following DRY principle.\n * Handles common state management, validation, and error handling.\n * Database-specific implementations only need to override the abstract methods.\n *\n * @example\n * ```typescript\n * class MySQLTransaction extends BaseTransaction<PoolConnection> {\n * protected async doBegin(): Promise<void> {\n * await this.connection.beginTransaction();\n * }\n *\n * protected async doCommit(): Promise<void> {\n * await this.connection.commit();\n * }\n *\n * protected async doRollback(): Promise<void> {\n * await this.connection.rollback();\n * }\n *\n * // ... other abstract method implementations\n * }\n * ```\n */\n\nimport { TransactionError } from '../errors';\nimport { generateUUID } from '../utils';\n\nimport type {\n Transaction,\n TransactionOptions,\n IsolationLevel,\n QueryParams,\n QueryOptions,\n QueryResult,\n} from '../types';\n\n/**\n * Connection interface that all database connections must satisfy\n */\nexport interface TransactionConnection {\n release(): void | Promise<void>;\n}\n\n/**\n * Abstract base class for database transactions\n *\n * Type parameter TConnection is the database-specific connection type\n */\nexport abstract class BaseTransaction<\n TConnection extends TransactionConnection,\n> implements Transaction {\n readonly id: string;\n protected _isActive = false;\n protected readonly savepoints: Set<string> = new Set();\n\n constructor(\n protected readonly connection: TConnection,\n protected readonly options?: TransactionOptions,\n ) {\n this.id = generateUUID();\n }\n\n get isActive(): boolean {\n return this._isActive;\n }\n\n // ============ Public Transaction Methods ============\n\n async begin(): Promise<void> {\n if (this._isActive) {\n throw new TransactionError('Transaction already active', this.id);\n }\n\n try {\n await this.applyTransactionOptions();\n await this.doBegin();\n this._isActive = true;\n } catch (error) {\n throw new TransactionError('Failed to begin transaction', this.id, error as Error);\n }\n }\n\n async commit(): Promise<void> {\n this.ensureActive('commit');\n\n try {\n await this.doCommit();\n this._isActive = false;\n this.savepoints.clear();\n } catch (error) {\n throw new TransactionError('Failed to commit transaction', this.id, error as Error);\n } finally {\n await this.releaseConnection();\n }\n }\n\n async rollback(): Promise<void> {\n this.ensureActive('rollback');\n\n try {\n await this.doRollback();\n this._isActive = false;\n this.savepoints.clear();\n } catch (error) {\n throw new TransactionError('Failed to rollback transaction', this.id, error as Error);\n } finally {\n await this.releaseConnection();\n }\n }\n\n async savepoint(name: string): Promise<void> {\n this.ensureActive('create savepoint');\n this.validateSavepointName(name);\n\n if (this.savepoints.has(name)) {\n throw new TransactionError(`Savepoint \"${name}\" already exists`, this.id);\n }\n\n try {\n await this.doSavepoint(name);\n this.savepoints.add(name);\n } catch (error) {\n throw new TransactionError(`Failed to create savepoint \"${name}\"`, this.id, error as Error);\n }\n }\n\n async releaseSavepoint(name: string): Promise<void> {\n this.ensureActive('release savepoint');\n this.ensureSavepointExists(name);\n\n try {\n await this.doReleaseSavepoint(name);\n this.savepoints.delete(name);\n } catch (error) {\n throw new TransactionError(`Failed to release savepoint \"${name}\"`, this.id, error as Error);\n }\n }\n\n async rollbackToSavepoint(name: string): Promise<void> {\n this.ensureActive('rollback to savepoint');\n this.ensureSavepointExists(name);\n\n try {\n await this.doRollbackToSavepoint(name);\n this.removeNewerSavepoints(name);\n } catch (error) {\n throw new TransactionError(\n `Failed to rollback to savepoint \"${name}\"`,\n this.id,\n error as Error,\n );\n }\n }\n\n async query<T = unknown>(\n sql: string,\n params?: QueryParams,\n options?: QueryOptions,\n ): Promise<QueryResult<T>> {\n this.ensureActive('execute query');\n\n try {\n return await this.doQuery<T>(sql, params, options);\n } catch (error) {\n throw new TransactionError(\n `Query failed in transaction: ${(error as Error).message}`,\n this.id,\n error as Error,\n );\n }\n }\n\n /**\n * Alias for query() for consistency\n */\n async execute<T = unknown>(\n sql: string,\n params?: QueryParams,\n options?: QueryOptions,\n ): Promise<QueryResult<T>> {\n return this.query<T>(sql, params, options);\n }\n\n /**\n * Get the underlying database connection\n */\n getConnection(): TConnection {\n return this.connection;\n }\n\n // ============ Abstract Methods (Database-specific) ============\n\n /**\n * Begin the transaction (database-specific)\n */\n protected abstract doBegin(): Promise<void>;\n\n /**\n * Commit the transaction (database-specific)\n */\n protected abstract doCommit(): Promise<void>;\n\n /**\n * Rollback the transaction (database-specific)\n */\n protected abstract doRollback(): Promise<void>;\n\n /**\n * Create a savepoint (database-specific)\n */\n protected abstract doSavepoint(name: string): Promise<void>;\n\n /**\n * Release a savepoint (database-specific)\n */\n protected abstract doReleaseSavepoint(name: string): Promise<void>;\n\n /**\n * Rollback to a savepoint (database-specific)\n */\n protected abstract doRollbackToSavepoint(name: string): Promise<void>;\n\n /**\n * Execute a query within the transaction (database-specific)\n */\n protected abstract doQuery<T>(\n sql: string,\n params?: QueryParams,\n options?: QueryOptions,\n ): Promise<QueryResult<T>>;\n\n /**\n * Set isolation level (database-specific)\n */\n protected abstract setIsolationLevel(level: IsolationLevel): Promise<void>;\n\n /**\n * Escape an identifier for use in SQL (database-specific)\n */\n protected abstract escapeIdentifier(identifier: string): string;\n\n // ============ Protected Helper Methods ============\n\n /**\n * Apply transaction options (isolation level, read-only, etc.)\n */\n protected async applyTransactionOptions(): Promise<void> {\n if (!this.options) {\n return;\n }\n\n if (this.options.isolationLevel !== null && this.options.isolationLevel !== undefined) {\n await this.setIsolationLevel(this.options.isolationLevel);\n }\n\n // Database-specific options (readOnly, deferrable) can be handled\n // in subclass implementations of applyTransactionOptions\n }\n\n /**\n * Release the connection back to pool\n */\n protected async releaseConnection(): Promise<void> {\n try {\n await Promise.resolve(this.connection.release());\n } catch {\n // Ignore release errors\n }\n }\n\n /**\n * Ensure the transaction is active\n */\n protected ensureActive(operation: string): void {\n if (!this._isActive) {\n throw new TransactionError(`Cannot ${operation}: Transaction not active`, this.id);\n }\n }\n\n /**\n * Ensure a savepoint exists\n */\n protected ensureSavepointExists(name: string): void {\n if (!this.savepoints.has(name)) {\n throw new TransactionError(`Savepoint \"${name}\" does not exist`, this.id);\n }\n }\n\n /**\n * Validate savepoint name (alphanumeric and underscores only)\n */\n protected validateSavepointName(name: string): void {\n if (!/^[A-Z_a-z]\\w*$/.test(name)) {\n throw new TransactionError(\n `Invalid savepoint name \"${name}\". Use only letters, numbers, and underscores.`,\n this.id,\n );\n }\n }\n\n /**\n * Sanitize savepoint name for use in SQL\n */\n protected sanitizeSavepointName(name: string): string {\n return name.replaceAll(/\\W/g, '_');\n }\n\n /**\n * Remove savepoints created after the given savepoint\n */\n protected removeNewerSavepoints(name: string): void {\n const savepointsArray = Array.from(this.savepoints);\n const index = savepointsArray.indexOf(name);\n\n if (index !== -1) {\n for (let i = index + 1; i < savepointsArray.length; i++) {\n const sp = savepointsArray[i];\n if (sp) {\n this.savepoints.delete(sp);\n }\n }\n }\n }\n\n /**\n * Normalize query parameters to array format\n */\n protected normalizeParams(params?: QueryParams): unknown[] {\n if (!params) {\n return [];\n }\n return Array.isArray(params) ? params : Object.values(params);\n }\n}\n","/**\n * Middleware Chain\n *\n * Manages and executes middleware in a chain pattern.\n * Middleware are executed in order, each can modify context\n * or short-circuit the chain.\n *\n * @example\n * ```typescript\n * const chain = new MiddlewareChain()\n * .use(cacheMiddleware)\n * .use(retryMiddleware)\n * .use(timeoutMiddleware)\n * .use(loggingMiddleware);\n *\n * const result = await chain.execute(context, finalHandler);\n * ```\n */\n\nimport type {\n QueryMiddleware,\n QueryMiddlewareContext,\n QueryMiddlewareResult,\n NextMiddleware,\n} from './types';\n\nexport class MiddlewareChain<T = unknown> {\n private middlewares: QueryMiddleware<T>[] = [];\n\n /**\n * Add middleware to the chain\n */\n use(middleware: QueryMiddleware<T>): this {\n this.middlewares.push(middleware);\n return this;\n }\n\n /**\n * Remove middleware from the chain\n */\n remove(middleware: QueryMiddleware<T>): this {\n const index = this.middlewares.indexOf(middleware);\n if (index !== -1) {\n this.middlewares.splice(index, 1);\n }\n return this;\n }\n\n /**\n * Clear all middleware\n */\n clear(): this {\n this.middlewares = [];\n return this;\n }\n\n /**\n * Get count of middleware in chain\n */\n get length(): number {\n return this.middlewares.length;\n }\n\n /**\n * Execute the middleware chain\n */\n async execute(\n context: QueryMiddlewareContext,\n finalHandler: NextMiddleware<T>,\n ): Promise<QueryMiddlewareResult<T>> {\n // Build the chain from right to left\n let next: NextMiddleware<T> = finalHandler;\n\n for (let i = this.middlewares.length - 1; i >= 0; i--) {\n const middleware = this.middlewares[i]!;\n const currentNext = next;\n next = (ctx) => middleware(ctx, currentNext);\n }\n\n return next(context);\n }\n\n /**\n * Create a new context for query execution\n */\n static createContext(\n sql: string,\n params: unknown[],\n options?: QueryMiddlewareContext['options'],\n ): QueryMiddlewareContext {\n return {\n sql,\n params,\n options,\n startTime: Date.now(),\n metadata: {},\n };\n }\n}\n\n/**\n * Compose multiple middleware into a single middleware\n */\nexport function composeMiddleware<T = unknown>(\n ...middlewares: QueryMiddleware<T>[]\n): QueryMiddleware<T> {\n return async (context, next) => {\n const chain = new MiddlewareChain<T>();\n middlewares.forEach((m) => chain.use(m));\n return chain.execute(context, next);\n };\n}\n","/**\n * Cache Middleware\n *\n * Caches query results to improve performance.\n * Supports configurable TTL and cache key generation.\n *\n * @example\n * ```typescript\n * const middleware = createCacheMiddleware({\n * adapter: redisCache,\n * defaultTTL: 60000, // 1 minute\n * keyPrefix: 'db:',\n * });\n * ```\n */\n\nimport { createHash } from 'node:crypto';\n\nimport type {\n QueryMiddleware,\n QueryMiddlewareContext,\n QueryMiddlewareResult,\n NextMiddleware,\n CacheMiddlewareOptions,\n MiddlewareCacheAdapter,\n} from './types';\n\n/**\n * Default function to determine if a query should be cached\n */\nfunction defaultShouldCache(sql: string): boolean {\n const normalizedSql = sql.trim().toUpperCase();\n return (\n normalizedSql.startsWith('SELECT') ||\n normalizedSql.startsWith('SHOW') ||\n normalizedSql.startsWith('DESCRIBE') ||\n normalizedSql.startsWith('EXPLAIN')\n );\n}\n\n/**\n * Generate a cache key from SQL and params\n */\nfunction generateCacheKey(prefix: string, sql: string, params: unknown[]): string {\n const hash = createHash('sha256');\n hash.update(sql);\n hash.update(JSON.stringify(params));\n return `${prefix}${hash.digest('hex').slice(0, 16)}`;\n}\n\n/**\n * Create a cache middleware with the given options\n */\nexport function createCacheMiddleware<T = unknown>(\n options: CacheMiddlewareOptions,\n): QueryMiddleware<T> {\n const {\n adapter,\n defaultTTL = 60_000,\n keyPrefix = 'qcache:',\n shouldCache = defaultShouldCache,\n } = options;\n\n return async (\n context: QueryMiddlewareContext,\n next: NextMiddleware<T>,\n ): Promise<QueryMiddlewareResult<T>> => {\n // Check if caching is explicitly disabled\n if (context.options?.cache === false) {\n return next(context);\n }\n\n // Check if query should be cached\n if (!shouldCache(context.sql, context.params)) {\n return next(context);\n }\n\n // Determine cache key\n const cacheOptions = typeof context.options?.cache === 'object' ? context.options.cache : {};\n const cacheKey = cacheOptions.key || generateCacheKey(keyPrefix, context.sql, context.params);\n\n // Try to get from cache\n try {\n const cached = await adapter.get<QueryMiddlewareResult<T>>(cacheKey);\n if (cached) {\n return {\n ...cached,\n cached: true,\n duration: Date.now() - context.startTime,\n };\n }\n } catch {\n // Ignore cache errors, proceed with query\n }\n\n // Execute the query\n const result = await next(context);\n\n // Cache the result if it has data\n if (result.result.rows.length > 0) {\n const ttl = cacheOptions.ttl || defaultTTL;\n try {\n await adapter.set(cacheKey, result, ttl);\n } catch {\n // Ignore cache errors\n }\n }\n\n return {\n ...result,\n cached: false,\n };\n };\n}\n\n/**\n * Create cache invalidation middleware\n * Invalidates cache entries when write operations occur\n */\nexport function createCacheInvalidationMiddleware<T = unknown>(\n _adapter: MiddlewareCacheAdapter,\n _keyPrefix = 'qcache:',\n): QueryMiddleware<T> {\n return async (\n context: QueryMiddlewareContext,\n next: NextMiddleware<T>,\n ): Promise<QueryMiddlewareResult<T>> => {\n const result = await next(context);\n\n // Check if this is a write operation\n const normalizedSql = context.sql.trim().toUpperCase();\n const isWrite =\n normalizedSql.startsWith('INSERT') ||\n normalizedSql.startsWith('UPDATE') ||\n normalizedSql.startsWith('DELETE') ||\n normalizedSql.startsWith('TRUNCATE');\n\n if (isWrite) {\n // Extract table name from query\n const tableName = extractTableName(context.sql);\n if (tableName) {\n // Mark for invalidation in metadata\n context.metadata['invalidatedTable'] = tableName;\n context.metadata['cacheInvalidated'] = true;\n }\n }\n\n return result;\n };\n}\n\n/**\n * Extract table name from SQL query\n */\nfunction extractTableName(sql: string): string | null {\n const normalizedSql = sql.trim().toUpperCase();\n\n // INSERT INTO table_name\n const insertMatch = normalizedSql.match(/insert\\s+into\\s+[\"'`]?(\\w+)[\"'`]?/i);\n if (insertMatch) {\n return insertMatch[1] || null;\n }\n\n // UPDATE table_name\n const updateMatch = normalizedSql.match(/update\\s+[\"'`]?(\\w+)[\"'`]?/i);\n if (updateMatch) {\n return updateMatch[1] || null;\n }\n\n // DELETE FROM table_name\n const deleteMatch = normalizedSql.match(/delete\\s+from\\s+[\"'`]?(\\w+)[\"'`]?/i);\n if (deleteMatch) {\n return deleteMatch[1] || null;\n }\n\n // TRUNCATE TABLE table_name\n const truncateMatch = normalizedSql.match(/truncate\\s+(?:table\\s+)?[\"'`]?(\\w+)[\"'`]?/i);\n if (truncateMatch) {\n return truncateMatch[1] || null;\n }\n\n return null;\n}\n","/**\n * Retry Middleware\n *\n * Automatically retries failed queries with exponential backoff.\n * Supports configurable retry conditions and delays.\n *\n * @example\n * ```typescript\n * const middleware = createRetryMiddleware({\n * maxRetries: 3,\n * baseDelay: 100,\n * retryOn: (error) => error.message.includes('ECONNRESET'),\n * });\n * ```\n */\n\nimport type {\n QueryMiddleware,\n QueryMiddlewareContext,\n QueryMiddlewareResult,\n NextMiddleware,\n RetryMiddlewareOptions,\n} from './types';\n\n/**\n * Default retry condition - retry on transient errors\n */\nfunction defaultRetryCondition(error: Error): boolean {\n const message = error.message.toLowerCase();\n\n // Connection errors\n if (\n message.includes('econnreset') ||\n message.includes('econnrefused') ||\n message.includes('etimedout') ||\n message.includes('epipe') ||\n message.includes('connection lost') ||\n message.includes('connection closed')\n ) {\n return true;\n }\n\n // Deadlock errors\n if (\n message.includes('deadlock') ||\n message.includes('lock wait timeout') ||\n message.includes('could not serialize access')\n ) {\n return true;\n }\n\n // Server temporarily unavailable\n if (\n message.includes('server has gone away') ||\n message.includes('too many connections') ||\n message.includes('max_connections')\n ) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Calculate delay with exponential backoff and jitter\n */\nfunction calculateDelay(\n attempt: number,\n baseDelay: number,\n maxDelay: number,\n multiplier: number,\n): number {\n // Exponential backoff\n const exponentialDelay = baseDelay * Math.pow(multiplier, attempt);\n\n // Cap at max delay\n const cappedDelay = Math.min(exponentialDelay, maxDelay);\n\n // Add jitter (±25%)\n const jitter = cappedDelay * 0.25 * (Math.random() * 2 - 1);\n\n return Math.floor(cappedDelay + jitter);\n}\n\n/**\n * Sleep for specified milliseconds\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Create a retry middleware with the given options\n */\nexport function createRetryMiddleware<T = unknown>(\n options: RetryMiddlewareOptions = {},\n): QueryMiddleware<T> {\n const {\n maxRetries = 3,\n baseDelay = 100,\n maxDelay = 5000,\n retryOn = defaultRetryCondition,\n backoffMultiplier = 2,\n } = options;\n\n return async (\n context: QueryMiddlewareContext,\n next: NextMiddleware<T>,\n ): Promise<QueryMiddlewareResult<T>> => {\n let lastError: Error | undefined;\n let attempts = 0;\n\n while (attempts <= maxRetries) {\n try {\n const result = await next(context);\n\n // Track retry count in result\n if (attempts > 0) {\n result.retries = attempts;\n }\n\n return result;\n } catch (error) {\n lastError = error as Error;\n attempts++;\n\n // Check if we should retry\n if (attempts > maxRetries || !retryOn(lastError)) {\n throw lastError;\n }\n\n // Calculate and wait for backoff delay\n const delay = calculateDelay(attempts - 1, baseDelay, maxDelay, backoffMultiplier);\n\n // Store retry info in context metadata\n context.metadata['retryAttempt'] = attempts;\n context.metadata['retryDelay'] = delay;\n context.metadata['lastError'] = lastError.message;\n\n await sleep(delay);\n }\n }\n\n // Should never reach here, but TypeScript needs it\n throw lastError || new Error('Retry failed');\n };\n}\n\n/**\n * Create a circuit breaker middleware\n * Prevents cascading failures by temporarily blocking requests\n */\nexport function createCircuitBreakerMiddleware<T = unknown>(\n options: {\n failureThreshold?: number;\n resetTimeout?: number;\n halfOpenRequests?: number;\n } = {},\n): QueryMiddleware<T> {\n const { failureThreshold = 5, resetTimeout = 30_000, halfOpenRequests = 1 } = options;\n\n let failures = 0;\n let lastFailureTime = 0;\n let state: 'closed' | 'open' | 'half-open' = 'closed';\n let halfOpenSuccesses = 0;\n\n return async (\n context: QueryMiddlewareContext,\n next: NextMiddleware<T>,\n ): Promise<QueryMiddlewareResult<T>> => {\n // Check circuit state\n if (state === 'open') {\n const now = Date.now();\n if (now - lastFailureTime >= resetTimeout) {\n state = 'half-open';\n halfOpenSuccesses = 0;\n } else {\n throw new Error(\n `Circuit breaker is open. Retry after ${Math.ceil((resetTimeout - (now - lastFailureTime)) / 1000)}s`,\n );\n }\n }\n\n try {\n const result = await next(context);\n\n // Success - update circuit state\n if (state === 'half-open') {\n halfOpenSuccesses++;\n if (halfOpenSuccesses >= halfOpenRequests) {\n state = 'closed';\n failures = 0;\n }\n } else {\n failures = 0;\n }\n\n return result;\n } catch (error) {\n failures++;\n lastFailureTime = Date.now();\n\n if (state === 'half-open' || failures >= failureThreshold) {\n state = 'open';\n }\n\n context.metadata['circuitState'] = state;\n context.metadata['failures'] = failures;\n\n throw error;\n }\n };\n}\n","/**\n * Timeout Middleware\n *\n * Enforces query execution time limits.\n * Throws TimeoutError if query exceeds the configured timeout.\n *\n * @example\n * ```typescript\n * const middleware = createTimeoutMiddleware({\n * defaultTimeout: 30000, // 30 seconds\n * onTimeout: (sql, elapsed) => {\n * console.warn(`Query timed out after ${elapsed}ms: ${sql}`);\n * },\n * });\n * ```\n */\n\nimport { TimeoutError } from '../errors';\n\nimport type {\n QueryMiddleware,\n QueryMiddlewareContext,\n QueryMiddlewareResult,\n NextMiddleware,\n TimeoutMiddlewareOptions,\n} from './types';\n\n/**\n * Create a timeout middleware with the given options\n */\nexport function createTimeoutMiddleware<T = unknown>(\n options: TimeoutMiddlewareOptions = {},\n): QueryMiddleware<T> {\n const { defaultTimeout = 30_000, onTimeout } = options;\n\n return async (\n context: QueryMiddlewareContext,\n next: NextMiddleware<T>,\n ): Promise<QueryMiddlewareResult<T>> => {\n // Get timeout from options or use default\n const timeout = context.options?.timeout ?? defaultTimeout;\n\n // If timeout is 0 or negative, skip timeout handling\n if (timeout <= 0) {\n return next(context);\n }\n\n // Create abort controller for cancellation\n const controller = new AbortController();\n let timeoutId: NodeJS.Timeout | undefined;\n\n // Create timeout promise\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => {\n controller.abort();\n const elapsed = Date.now() - context.startTime;\n\n // Call timeout callback if provided\n if (onTimeout) {\n try {\n onTimeout(context.sql, elapsed);\n } catch {\n // Ignore callback errors\n }\n }\n\n // Store timeout info in context\n context.metadata['timedOut'] = true;\n context.metadata['timeoutMs'] = timeout;\n context.metadata['elapsedMs'] = elapsed;\n\n reject(\n new TimeoutError(`Query timed out after ${elapsed}ms (limit: ${timeout}ms)`, elapsed),\n );\n }, timeout);\n });\n\n try {\n // Race between query and timeout\n const result = await Promise.race([next(context), timeoutPromise]);\n\n // Store timing in result\n result.duration = Date.now() - context.startTime;\n\n return result;\n } finally {\n // Clean up timeout\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n }\n };\n}\n\n/**\n * Create a deadline middleware\n * Similar to timeout but uses absolute deadline instead of relative timeout\n */\nexport function createDeadlineMiddleware<T = unknown>(\n options: {\n getDeadline?: (context: QueryMiddlewareContext) => number | undefined;\n } = {},\n): QueryMiddleware<T> {\n const { getDeadline } = options;\n\n return async (\n context: QueryMiddlewareContext,\n next: NextMiddleware<T>,\n ): Promise<QueryMiddlewareResult<T>> => {\n // Get deadline from options or context\n const deadline = getDeadline?.(context) ?? (context.metadata['deadline'] as number | undefined);\n\n // If no deadline, skip\n if (!deadline) {\n return next(context);\n }\n\n const now = Date.now();\n const remainingTime = deadline - now;\n\n // Check if deadline already passed\n if (remainingTime <= 0) {\n throw new TimeoutError(\n `Deadline exceeded: deadline was ${new Date(deadline).toISOString()}`,\n -remainingTime,\n );\n }\n\n // Use timeout middleware with remaining time\n const timeoutMiddleware = createTimeoutMiddleware<T>({\n defaultTimeout: remainingTime,\n });\n\n return timeoutMiddleware(context, next);\n };\n}\n","/**\n * Logging Middleware\n *\n * Logs query execution details for debugging and monitoring.\n * Supports configurable log levels and slow query detection.\n *\n * @example\n * ```typescript\n * const middleware = createLoggingMiddleware({\n * logger: console,\n * logLevel: 'debug',\n * slowQueryThreshold: 1000, // Log slow queries > 1s\n * });\n * ```\n */\n\nimport type {\n QueryMiddleware,\n QueryMiddlewareContext,\n QueryMiddlewareResult,\n NextMiddleware,\n LoggingMiddlewareOptions,\n MiddlewareLogger,\n} from './types';\n\n/**\n * Default console logger\n */\n/* eslint-disable no-console */\nconst consoleLogger: MiddlewareLogger = {\n debug: (msg, ...args) => console.debug(`[db-bridge] ${msg}`, ...args),\n info: (msg, ...args) => console.info(`[db-bridge] ${msg}`, ...args),\n warn: (msg, ...args) => console.warn(`[db-bridge] ${msg}`, ...args),\n error: (msg, ...args) => console.error(`[db-bridge] ${msg}`, ...args),\n};\n/* eslint-enable no-console */\n\n/**\n * Truncate long SQL for logging\n */\nfunction truncateSql(sql: string, maxLength = 200): string {\n if (sql.length <= maxLength) {\n return sql;\n }\n return `${sql.slice(0, maxLength)}...`;\n}\n\n/**\n * Format parameters for logging (hide sensitive data)\n */\nfunction formatParams(params: unknown[], maxLength = 100): string {\n const str = JSON.stringify(params);\n if (str.length <= maxLength) {\n return str;\n }\n return `${str.slice(0, maxLength)}...`;\n}\n\n/**\n * Create a logging middleware with the given options\n */\nexport function createLoggingMiddleware<T = unknown>(\n options: LoggingMiddlewareOptions = {},\n): QueryMiddleware<T> {\n const {\n logger = consoleLogger,\n logLevel = 'debug',\n logParams = false,\n logResults = false,\n slowQueryThreshold = 1000,\n } = options;\n\n const log = logger[logLevel];\n\n return async (\n context: QueryMiddlewareContext,\n next: NextMiddleware<T>,\n ): Promise<QueryMiddlewareResult<T>> => {\n const truncatedSql = truncateSql(context.sql);\n const startTime = Date.now();\n\n // Log query start\n if (logParams) {\n log(`Executing query: ${truncatedSql}`, formatParams(context.params));\n } else {\n log(`Executing query: ${truncatedSql}`);\n }\n\n try {\n const result = await next(context);\n const duration = Date.now() - startTime;\n\n // Check for slow query\n if (duration >= slowQueryThreshold) {\n logger.warn(`Slow query detected (${duration}ms): ${truncatedSql}`, {\n duration,\n rowCount: result.result.rowCount,\n });\n }\n\n // Log query completion\n const logMsg = `Query completed in ${duration}ms (${result.result.rowCount} rows)`;\n if (logResults && result.result.rows.length > 0) {\n log(logMsg, { rows: result.result.rows.slice(0, 5) }); // Log first 5 rows\n } else {\n log(logMsg);\n }\n\n // Add cached flag if present\n if (result.cached) {\n log(`Query served from cache`);\n }\n\n return result;\n } catch (error) {\n const duration = Date.now() - startTime;\n logger.error(`Query failed after ${duration}ms: ${(error as Error).message}`, {\n sql: truncatedSql,\n error,\n });\n throw error;\n }\n };\n}\n\n/**\n * Create a metrics middleware\n * Collects query metrics without logging\n */\nexport function createMetricsMiddleware<T = unknown>(\n options: {\n onQuery?: (metrics: MiddlewareQueryMetrics) => void;\n buckets?: number[];\n } = {},\n): QueryMiddleware<T> {\n const { onQuery, buckets = [10, 50, 100, 250, 500, 1000, 2500, 5000, 10_000] } = options;\n\n return async (\n context: QueryMiddlewareContext,\n next: NextMiddleware<T>,\n ): Promise<QueryMiddlewareResult<T>> => {\n const startTime = Date.now();\n let success = false;\n let result: QueryMiddlewareResult<T> | undefined;\n\n try {\n result = await next(context);\n success = true;\n return result;\n } finally {\n const duration = Date.now() - startTime;\n\n // Determine histogram bucket\n const bucket = buckets.find((b) => duration <= b) ?? Number.POSITIVE_INFINITY;\n\n // Build metrics object\n const metrics: MiddlewareQueryMetrics = {\n sql: context.sql,\n duration,\n success,\n cached: result?.cached ?? false,\n rowCount: result?.result?.rowCount ?? 0,\n retries: result?.retries ?? 0,\n bucket,\n timestamp: new Date(),\n };\n\n // Store in context metadata\n context.metadata['metrics'] = metrics;\n\n // Call metrics callback if provided\n if (onQuery) {\n try {\n onQuery(metrics);\n } catch {\n // Ignore callback errors\n }\n }\n }\n };\n}\n\n/**\n * Query metrics interface\n */\nexport interface MiddlewareQueryMetrics {\n sql: string;\n duration: number;\n success: boolean;\n cached: boolean;\n rowCount: number;\n retries: number;\n bucket: number;\n timestamp: Date;\n}\n","import { CachedAdapter } from './cache/cached-adapter';\nimport { CryptoProvider } from './crypto/crypto';\n\nimport type { DatabaseAdapter, CacheAdapter } from './interfaces';\nimport type { ConnectionConfig } from './types';\n\nexport interface ClientOptions {\n provider: 'mysql' | 'postgresql' | 'postgres';\n url?: string;\n connection?: ConnectionConfig & {\n // Additional connection options\n poolMin?: number;\n poolMax?: number;\n poolIdleTimeout?: number;\n poolAcquireTimeout?: number;\n charset?: string;\n timezone?: string;\n multipleStatements?: boolean;\n dateStrings?: boolean;\n supportBigNumbers?: boolean;\n bigNumberStrings?: boolean;\n schema?: string;\n searchPath?: string[];\n statement_timeout?: number;\n query_timeout?: number;\n application_name?: string;\n };\n cache?:\n | boolean\n | {\n provider: 'redis';\n url?: string;\n connection?: ConnectionConfig & {\n db?: number;\n sentinels?: Array<{ host: string; port: number }>;\n name?: string;\n sentinelPassword?: string;\n retryStrategy?: (times: number) => number;\n maxRetriesPerRequest?: number;\n enableReadyCheck?: boolean;\n enableOfflineQueue?: boolean;\n cluster?: Array<{ host: string; port: number }>;\n };\n };\n encryption?:\n | boolean\n | {\n algorithm?: string;\n key?: string;\n keyRotationInterval?: number;\n autoEncryptFields?: Record<string, string[]>;\n };\n logger?:\n | boolean\n | Console\n | {\n level?: string;\n prettyPrint?: boolean;\n customLogger?: (level: string, message: string, meta?: any) => void;\n };\n monitoring?: {\n enabled?: boolean;\n slowQueryThreshold?: number;\n captureStackTrace?: boolean;\n metricsCollector?: (metric: any) => void;\n };\n healthCheck?: {\n enabled?: boolean;\n interval?: number;\n timeout?: number;\n retries?: number;\n };\n multiTenant?: {\n enabled?: boolean;\n tenantIdField?: string;\n tenantIdHeader?: string;\n isolationLevel?: 'schema' | 'database' | 'row';\n tenantResolver?: (context: any) => Promise<string>;\n };\n migrations?: {\n directory?: string;\n tableName?: string;\n strategy?: 'safe' | 'force' | 'dry-run';\n beforeMigrate?: (migration: any) => Promise<void>;\n afterMigrate?: (migration: any) => Promise<void>;\n rollbackOnError?: boolean;\n validateChecksum?: boolean;\n };\n typeMappings?: {\n pg_to_js?: Record<string, (value: any) => any>;\n js_to_pg?: Record<string, (value: any) => any>;\n };\n poolSize?: number;\n ssl?: boolean | any;\n}\n\nexport class DBBridge {\n private static instances: Map<string, DBBridge> = new Map();\n private adapter: DatabaseAdapter;\n private connected: boolean = false;\n\n public readonly options: ClientOptions;\n\n constructor(options: ClientOptions) {\n this.options = options;\n this.adapter = this.createAdapter();\n }\n\n /**\n * Create a new database client\n *\n * @example\n * ```ts\n * const db = DBBridge.create({\n * provider: 'mysql',\n * url: 'mysql://user:pass@localhost:3306/mydb'\n * });\n * ```\n */\n static create(options: ClientOptions): DBBridge {\n return new DBBridge(options);\n }\n\n /**\n * Get or create a singleton instance\n *\n * @example\n * ```ts\n * const db = DBBridge.getInstance('main', {\n * provider: 'postgresql',\n * url: process.env.DATABASE_URL\n * });\n * ```\n */\n static getInstance(name: string, options?: ClientOptions): DBBridge {\n if (!this.instances.has(name)) {\n if (!options) {\n throw new Error(`Instance \"${name}\" not found and no options provided`);\n }\n this.instances.set(name, new DBBridge(options));\n }\n return this.instances.get(name)!;\n }\n\n /**\n * Create from connection string\n *\n * @example\n * ```ts\n * const db = DBBridge.fromUrl('postgresql://user:pass@localhost/mydb');\n * ```\n */\n static fromUrl(url: string, options?: Partial<ClientOptions>): DBBridge {\n const provider = this.parseProvider(url);\n return new DBBridge({\n provider,\n url,\n ...options,\n });\n }\n\n private static parseProvider(url: string): ClientOptions['provider'] {\n if (url.startsWith('mysql://')) {\n return 'mysql';\n }\n if (url.startsWith('postgresql://') || url.startsWith('postgres://')) {\n return 'postgresql';\n }\n throw new Error(`Unsupported database URL: ${url}`);\n }\n\n private createAdapter(): DatabaseAdapter {\n const logger = this.options.logger === true ? console : this.options.logger || undefined;\n\n let crypto: CryptoProvider | undefined;\n if (this.options.encryption) {\n const encryptionOpts = this.options.encryption === true ? {} : this.options.encryption;\n crypto = new CryptoProvider({\n algorithm: encryptionOpts.algorithm,\n });\n if (encryptionOpts.key) {\n process.env['DB_BRIDGE_ENCRYPTION_KEY'] = encryptionOpts.key;\n }\n }\n\n let adapter: DatabaseAdapter;\n\n // Dynamically load adapters to avoid circular dependencies\n switch (this.options.provider) {\n case 'mysql': {\n const { MySQLAdapter } = require('@db-bridge/mysql');\n adapter = new MySQLAdapter({ logger, crypto });\n break;\n }\n case 'postgresql':\n case 'postgres': {\n const { PostgreSQLAdapter } = require('@db-bridge/postgresql');\n adapter = new PostgreSQLAdapter({ logger, crypto });\n break;\n }\n default: {\n throw new Error(`Unsupported provider: ${this.options.provider}`);\n }\n }\n\n // Wrap with caching if enabled\n if (this.options.cache) {\n const cacheOpts =\n this.options.cache === true ? { provider: 'redis' as const } : this.options.cache;\n if (cacheOpts.provider === 'redis') {\n const { RedisAdapter } = require('@db-bridge/redis');\n const redisAdapter = new RedisAdapter({ logger }) as CacheAdapter;\n if (cacheOpts.url || cacheOpts.connection) {\n // Connect to Redis will be handled in connect()\n }\n adapter = new CachedAdapter({\n adapter,\n cache: redisAdapter,\n enabled: true,\n });\n }\n }\n\n return adapter;\n }\n\n private parseConnectionUrl(url: string): ConnectionConfig {\n const urlObj = new URL(url);\n return {\n host: urlObj.hostname,\n port: Number.parseInt(urlObj.port) || (this.options.provider === 'mysql' ? 3306 : 5432),\n user: urlObj.username,\n password: urlObj.password,\n database: urlObj.pathname.slice(1),\n ssl: this.options.ssl,\n };\n }\n\n /**\n * Connect to the database\n */\n async connect(): Promise<void> {\n if (this.connected) {\n return;\n }\n\n const config = this.options.url\n ? this.parseConnectionUrl(this.options.url)\n : this.options.connection;\n\n if (!config) {\n throw new Error('No connection configuration provided');\n }\n\n await this.adapter.connect({\n ...config,\n poolSize: this.options.poolSize || config.poolSize,\n });\n\n // Connect to cache if needed\n if (this.options.cache && this.adapter instanceof CachedAdapter) {\n const cacheOpts =\n this.options.cache === true ? { provider: 'redis' as const } : this.options.cache;\n const cacheAdapter = (this.adapter as any).cache;\n\n if (cacheOpts.url) {\n await cacheAdapter.connect(this.parseConnectionUrl(cacheOpts.url));\n } else if (cacheOpts.connection) {\n await cacheAdapter.connect(cacheOpts.connection);\n } else {\n // Default Redis connection\n await cacheAdapter.connect({ host: 'localhost', port: 6379 });\n }\n }\n\n this.connected = true;\n }\n\n /**\n * Get a query builder\n *\n * @example\n * ```ts\n * const users = await db.from('users')\n * .select('id', 'name', 'email')\n * .where({ active: true })\n * .limit(10);\n * ```\n */\n from<T = any>(table: string, alias?: string) {\n return this.adapter.createQueryBuilder<T>().from(table, alias);\n }\n\n /**\n * Execute a raw query\n *\n * @example\n * ```ts\n * const result = await db.query('SELECT * FROM users WHERE id = ?', [userId]);\n * ```\n */\n async query<T = any>(sql: string, params?: any[]) {\n return this.adapter.query<T>(sql, params);\n }\n\n /**\n * Insert data\n *\n * @example\n * ```ts\n * await db.insert('users', { name: 'John', email: 'john@example.com' });\n * ```\n */\n async insert<T = any>(table: string, data: Record<string, any> | Record<string, any>[]) {\n return this.adapter.createQueryBuilder<T>().insert(table, data).execute();\n }\n\n /**\n * Update data\n *\n * @example\n * ```ts\n * await db.update('users', { name: 'Jane' }, { id: userId });\n * ```\n */\n async update<T = any>(table: string, data: Record<string, any>, where: Record<string, any>) {\n return this.adapter.createQueryBuilder<T>().update(table, data).where(where).execute();\n }\n\n /**\n * Delete data\n *\n * @example\n * ```ts\n * await db.delete('users', { id: userId });\n * ```\n */\n async delete<T = any>(table: string, where: Record<string, any>) {\n return this.adapter.createQueryBuilder<T>().delete(table).where(where).execute();\n }\n\n /**\n * Start a transaction\n *\n * @example\n * ```ts\n * const tx = await db.transaction();\n * try {\n * await tx.query('INSERT INTO...');\n * await tx.commit();\n * } catch (error) {\n * await tx.rollback();\n * }\n * ```\n */\n async transaction() {\n return this.adapter.beginTransaction();\n }\n\n /**\n * Disconnect from the database\n */\n async disconnect(): Promise<void> {\n if (!this.connected) {\n return;\n }\n\n await this.adapter.disconnect();\n\n // Disconnect from cache if needed\n if (this.adapter instanceof CachedAdapter) {\n const cacheAdapter = (this.adapter as any).cache;\n await cacheAdapter.disconnect();\n }\n\n this.connected = false;\n }\n\n /**\n * Get the underlying adapter\n */\n getAdapter(): DatabaseAdapter {\n return this.adapter;\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Ping the database\n */\n async ping(): Promise<boolean> {\n return this.adapter.ping();\n }\n}\n","import { MySQLDialect, PostgreSQLDialect } from './dialect';\nimport { DatabaseError } from './errors';\nimport { createModularQueryBuilder } from './query';\n\nimport type { SQLDialect } from './dialect';\nimport type { ConnectionConfig, DatabaseAdapter, QueryBuilder } from './interfaces';\nimport type { ModularQueryBuilder, QueryExecutor, ExecuteResult } from './query';\nimport type { QueryResult } from './types';\n\n/**\n * Supported database types\n */\nexport enum DatabaseType {\n MySQL = 'mysql',\n PostgreSQL = 'postgresql',\n Postgres = 'postgres', // Alias for PostgreSQL\n Redis = 'redis',\n}\n\n// Also export as string literal type for backward compatibility\nexport type DatabaseTypeString = 'mysql' | 'postgresql' | 'postgres' | 'redis';\n\nexport interface DBBridgeConfig {\n type: DatabaseType | DatabaseTypeString;\n connection: ConnectionConfig;\n options?: {\n logging?: boolean;\n logger?: any;\n /** Auto-connect on creation (default: false) */\n autoConnect?: boolean;\n /** @deprecated Use connection.pool instead */\n pool?: {\n min?: number;\n max?: number;\n };\n };\n}\n\n/**\n * DBBridge - Simple and user-friendly database interface\n *\n * @example\n * ```typescript\n * // Basic usage\n * const db = DBBridge.mysql({\n * host: 'localhost',\n * user: 'root',\n * password: '',\n * database: 'mydb'\n * });\n *\n * await db.connect();\n *\n * // Query builder\n * const users = await db.table('users')\n * .where('active', true)\n * .orderBy('created_at', 'desc')\n * .get();\n * ```\n */\nexport class DBBridge {\n private adapter?: DatabaseAdapter;\n private readonly config: DBBridgeConfig;\n private _dialect?: SQLDialect;\n private _queryBuilder?: ModularQueryBuilder;\n\n constructor(config: DBBridgeConfig) {\n this.config = config;\n }\n\n /**\n * Create MySQL instance (requires manual connect())\n */\n static mysql(connection: ConnectionConfig, options?: any): DBBridge {\n return new DBBridge({\n type: DatabaseType.MySQL,\n connection,\n options,\n });\n }\n\n /**\n * Create and connect to MySQL database\n *\n * @param connection - Connection configuration\n * @param options - Additional options\n * @param autoConnect - Whether to auto-connect (default: true)\n *\n * @example\n * ```typescript\n * // Auto-connect (default)\n * const db = await DBBridge.createMySQL({\n * host: 'localhost',\n * user: 'root',\n * database: 'mydb'\n * });\n * // Ready to use - no connect() needed!\n *\n * // Without auto-connect\n * const db = await DBBridge.createMySQL(config, null, false);\n * await db.connect(); // Connect when ready\n * ```\n */\n static async createMySQL(\n connection: ConnectionConfig,\n options?: any,\n autoConnect = true,\n ): Promise<DBBridge> {\n const db = DBBridge.mysql(connection, options);\n if (autoConnect) {\n await db.connect();\n }\n return db;\n }\n\n /**\n * Create PostgreSQL instance (requires manual connect())\n */\n static postgresql(connection: ConnectionConfig, options?: any): DBBridge {\n return new DBBridge({\n type: DatabaseType.PostgreSQL,\n connection,\n options,\n });\n }\n\n /**\n * Create and connect to PostgreSQL database\n *\n * @param connection - Connection configuration\n * @param options - Additional options\n * @param autoConnect - Whether to auto-connect (default: true)\n *\n * @example\n * ```typescript\n * // Auto-connect (default)\n * const db = await DBBridge.createPostgreSQL({\n * host: 'localhost',\n * user: 'postgres',\n * database: 'mydb'\n * });\n * // Ready to use!\n *\n * // Without auto-connect\n * const db = await DBBridge.createPostgreSQL(config, null, false);\n * ```\n */\n static async createPostgreSQL(\n connection: ConnectionConfig,\n options?: any,\n autoConnect = true,\n ): Promise<DBBridge> {\n const db = DBBridge.postgresql(connection, options);\n if (autoConnect) {\n await db.connect();\n }\n return db;\n }\n\n /**\n * Create Redis instance (requires manual connect())\n */\n static redis(connection?: ConnectionConfig, options?: any): DBBridge {\n return new DBBridge({\n type: DatabaseType.Redis,\n connection: connection || { host: 'localhost', port: 6379 },\n options,\n });\n }\n\n /**\n * Create and connect to Redis\n *\n * @param connection - Connection configuration\n * @param options - Additional options\n * @param autoConnect - Whether to auto-connect (default: true)\n *\n * @example\n * ```typescript\n * // Auto-connect (default)\n * const redis = await DBBridge.createRedis({\n * host: 'localhost',\n * port: 6379\n * });\n * // Ready to use!\n *\n * // Without auto-connect\n * const redis = await DBBridge.createRedis(config, null, false);\n * ```\n */\n static async createRedis(\n connection?: ConnectionConfig,\n options?: any,\n autoConnect = true,\n ): Promise<DBBridge> {\n const db = DBBridge.redis(connection, options);\n if (autoConnect) {\n await db.connect();\n }\n return db;\n }\n\n /**\n * Generic factory method - create and optionally connect\n *\n * @param config - Database configuration\n * @param autoConnect - Whether to auto-connect (default: true)\n *\n * @example\n * ```typescript\n * // Auto-connect enabled (default)\n * const db = await DBBridge.create({\n * type: DatabaseType.MySQL,\n * connection: { host: 'localhost', database: 'test' }\n * });\n *\n * // Auto-connect disabled\n * const db = await DBBridge.create({\n * type: DatabaseType.MySQL,\n * connection: { host: 'localhost', database: 'test' }\n * }, false);\n * await db.connect(); // Manual connect when ready\n * ```\n */\n static async create(config: DBBridgeConfig, autoConnect = true): Promise<DBBridge> {\n const db = new DBBridge(config);\n if (autoConnect) {\n await db.connect();\n }\n return db;\n }\n\n /**\n * Connect to database\n */\n async connect(): Promise<void> {\n // Create adapter based on type (will be loaded dynamically at runtime)\n const adapterModule = await this.loadAdapter();\n this.adapter = adapterModule;\n await this.adapter.connect(this.config.connection);\n }\n\n /**\n * Load adapter dynamically\n */\n private async loadAdapter(): Promise<DatabaseAdapter> {\n const dbType = this.config.type;\n\n // Enum values are string literals, so this handles both\n switch (dbType) {\n case 'mysql': {\n return this.loadMySQLAdapter();\n }\n\n case 'postgresql':\n case 'postgres': {\n return this.loadPostgreSQLAdapter();\n }\n\n case 'redis': {\n return this.loadRedisAdapter();\n }\n\n default: {\n throw new DatabaseError(`Unsupported database type: ${dbType}`);\n }\n }\n }\n\n private async loadRedisAdapter(): Promise<DatabaseAdapter> {\n try {\n let redisModule: any;\n\n // Try dynamic import first (for ESM)\n try {\n redisModule = await (import('@db-bridge/redis') as Promise<any>);\n } catch {\n // Fallback to require (for CJS)\n redisModule = require('@db-bridge/redis');\n }\n\n const RedisAdapter = redisModule.RedisAdapter || redisModule.default?.RedisAdapter;\n if (!RedisAdapter) {\n throw new Error('RedisAdapter not found in module');\n }\n\n const adapter = new RedisAdapter(\n this.config.options?.logger\n ? {\n logger: this.config.options.logger,\n }\n : {},\n );\n return adapter as DatabaseAdapter;\n } catch {\n throw new DatabaseError('Redis adapter not installed. Run: npm install @db-bridge/redis');\n }\n }\n\n private async loadMySQLAdapter(): Promise<DatabaseAdapter> {\n try {\n let mysqlModule: any;\n\n // Try dynamic import first (for ESM)\n try {\n mysqlModule = await (import('@db-bridge/mysql') as Promise<any>);\n } catch {\n // Fallback to require (for CJS)\n mysqlModule = require('@db-bridge/mysql');\n }\n\n const MySQLAdapter = mysqlModule.MySQLAdapter || mysqlModule.default?.MySQLAdapter;\n if (!MySQLAdapter) {\n throw new Error('MySQLAdapter not found in module');\n }\n\n const adapter = new MySQLAdapter(\n this.config.options?.logger\n ? {\n logger: this.config.options.logger,\n }\n : {},\n );\n return adapter as DatabaseAdapter;\n } catch {\n throw new DatabaseError('MySQL adapter not installed. Run: npm install @db-bridge/mysql');\n }\n }\n\n private async loadPostgreSQLAdapter(): Promise<DatabaseAdapter> {\n try {\n let pgModule: any;\n\n // Try dynamic import first (for ESM)\n try {\n pgModule = await (import('@db-bridge/postgresql') as Promise<any>);\n } catch {\n // Fallback to require (for CJS)\n pgModule = require('@db-bridge/postgresql');\n }\n\n const PostgreSQLAdapter = pgModule.PostgreSQLAdapter || pgModule.default?.PostgreSQLAdapter;\n if (!PostgreSQLAdapter) {\n throw new Error('PostgreSQLAdapter not found in module');\n }\n\n const adapter = new PostgreSQLAdapter(\n this.config.options?.logger\n ? {\n logger: this.config.options.logger,\n }\n : {},\n );\n return adapter as DatabaseAdapter;\n } catch {\n throw new DatabaseError(\n 'PostgreSQL adapter not installed. Run: npm install @db-bridge/postgresql',\n );\n }\n }\n\n /**\n * Disconnect from database\n */\n async disconnect(): Promise<void> {\n if (this.adapter) {\n await this.adapter.disconnect();\n }\n }\n\n /**\n * Execute raw SQL query\n */\n async query<T = any>(sql: string, params?: any[]): Promise<{ rows: T[]; fields?: any[] }> {\n this.ensureConnected();\n return this.adapter!.query(sql, params);\n }\n\n /**\n * Execute SQL command (INSERT, UPDATE, DELETE)\n */\n async execute(sql: string, params?: any[]): Promise<any> {\n this.ensureConnected();\n return this.adapter!.execute(sql, params);\n }\n\n /**\n * Get query builder for table\n */\n table<T = any>(tableName: string): QueryBuilder<T> {\n this.ensureConnected();\n const qb = this.adapter!.createQueryBuilder<T>();\n return this.configureQueryBuilder(qb, tableName);\n }\n\n /**\n * Configure query builder with table\n */\n private configureQueryBuilder<T>(qb: any, tableName: string): QueryBuilder<T> {\n // Try common methods\n if (typeof qb.table === 'function') {\n return qb.table(tableName);\n }\n if (typeof qb.from === 'function') {\n return qb.from(tableName);\n }\n // As last resort, set internal property if exists\n if ('_table' in qb || 'tableName' in qb) {\n qb._table = tableName;\n qb.tableName = tableName;\n return qb;\n }\n throw new DatabaseError('Query builder does not support table selection');\n }\n\n /**\n * from() method - alias for table()\n */\n from<T = any>(tableName: string): QueryBuilder<T> {\n return this.table<T>(tableName);\n }\n\n /**\n * Start a transaction\n */\n async transaction<T>(callback: (trx: any) => Promise<T>): Promise<T> {\n this.ensureConnected();\n const trx = await this.adapter!.beginTransaction();\n\n try {\n const result = await callback(trx);\n await trx.commit();\n return result;\n } catch (error) {\n await trx.rollback();\n throw error;\n }\n }\n\n /**\n * Create prepared statement\n */\n async prepare(sql: string, options?: any): Promise<any> {\n this.ensureConnected();\n return this.adapter!.prepare(sql, options);\n }\n\n /**\n * Ensure connected\n */\n private ensureConnected(): void {\n if (!this.adapter) {\n throw new DatabaseError('Not connected. Call connect() first.');\n }\n }\n\n /**\n * Get adapter (for advanced usage)\n */\n getAdapter(): DatabaseAdapter | undefined {\n return this.adapter;\n }\n\n /**\n * Get SQL dialect for current database type\n * Auto-selects MySQL or PostgreSQL dialect based on configuration\n */\n getDialect(): SQLDialect {\n if (!this._dialect) {\n const dbType = this.config.type;\n\n // Enum values are string literals, so this handles both\n switch (dbType) {\n case 'mysql': {\n this._dialect = new MySQLDialect();\n break;\n }\n case 'postgresql':\n case 'postgres': {\n this._dialect = new PostgreSQLDialect();\n break;\n }\n case 'redis': {\n throw new DatabaseError('Redis does not support SQL dialects');\n }\n default: {\n throw new DatabaseError(`Unsupported database type for dialect: ${dbType}`);\n }\n }\n }\n return this._dialect;\n }\n\n /**\n * Get dialect-aware modular query builder\n *\n * The query builder auto-adapts SQL syntax based on database type:\n * - MySQL: Uses backticks (`) and ? placeholders\n * - PostgreSQL: Uses double quotes (\") and $1, $2 placeholders\n *\n * @example\n * ```typescript\n * // Works the same for MySQL and PostgreSQL\n * const users = await db.qb()\n * .select('id', 'name', 'email')\n * .from('users')\n * .where('active', true)\n * .orderBy('created_at', 'DESC')\n * .limit(10)\n * .get();\n *\n * // Insert with auto-syntax\n * await db.qb()\n * .insert()\n * .into('users')\n * .values({ name: 'John', email: 'john@example.com' })\n * .execute();\n *\n * // PostgreSQL-specific: RETURNING clause works automatically\n * const inserted = await db.qb()\n * .insert()\n * .into('users')\n * .values({ name: 'John' })\n * .returning('id', 'created_at')\n * .execute();\n * ```\n */\n qb(): ModularQueryBuilder {\n this.ensureConnected();\n\n if (!this._queryBuilder) {\n const dialect = this.getDialect();\n const adapter = this.adapter!;\n\n // Create executor that wraps the adapter\n const executor: QueryExecutor = {\n async query<T = unknown>(sql: string, params?: unknown[]): Promise<QueryResult<T>> {\n const result = await adapter.query<T>(sql, params as any);\n return {\n rows: result.rows,\n rowCount: result.rows.length,\n fields: result.fields,\n };\n },\n async execute(sql: string, params?: unknown[]): Promise<ExecuteResult> {\n const result = await adapter.execute(sql, params as any);\n return {\n affectedRows: result.affectedRows ?? 0,\n insertId: result.insertId,\n changedRows: (result as any).changedRows,\n };\n },\n };\n\n this._queryBuilder = createModularQueryBuilder({\n dialect,\n executor,\n });\n }\n\n return this._queryBuilder;\n }\n\n /**\n * Get database type\n */\n getDatabaseType(): DatabaseType | DatabaseTypeString {\n return this.config.type;\n }\n}\n","/**\n * DBBridge with Industry-Leading Cache Support\n *\n * Combines the best features from:\n * - Drizzle ORM: $cache API, $withCache() method chaining\n * - TypeORM: Simple configuration\n * - Prisma: Extension pattern with callbacks\n *\n * @example\n * ```typescript\n * // Simple setup with cache\n * const db = CachedDBBridge.mysql({\n * host: 'localhost',\n * database: 'mydb',\n * cache: {\n * redis: 'redis://localhost:6379',\n * ttl: 3600,\n * global: false, // Explicit caching (opt-in)\n * }\n * });\n *\n * await db.connect();\n *\n * // Per-query caching\n * const users = await db.query('SELECT * FROM users').$withCache();\n * const posts = await db.query('SELECT * FROM posts').$withCache({ ttl: 60 });\n *\n * // Cache invalidation\n * await db.$cache.invalidate({ tables: ['users'] });\n *\n * // Statistics\n * console.log(db.$cache.stats());\n * ```\n */\n\nimport { EventEmitter } from 'eventemitter3';\n\nimport { CacheAPI } from './cache/cache-api';\nimport { CacheKeyGenerator } from './cache/cache-key-generator';\nimport { DatabaseError } from './errors';\n\nimport type { CacheConfig, QueryCacheConfig } from './cache/cache-api';\nimport type { DatabaseAdapter, CacheAdapter, QueryBuilder } from './interfaces';\nimport type {\n QueryResult,\n QueryParams,\n Transaction,\n TransactionOptions,\n ConnectionConfig,\n} from './types';\n\nexport type DatabaseType = 'mysql' | 'postgresql' | 'postgres' | 'redis';\n\n/** Extended cache adapter with connection methods */\ninterface ConnectableCacheAdapter extends CacheAdapter {\n connect(config: ConnectionConfig): Promise<void>;\n disconnect(): Promise<void>;\n isConnected?: boolean;\n}\n\nexport interface CachedDBBridgeConfig {\n type: DatabaseType;\n host?: string;\n port?: number;\n user?: string;\n password?: string;\n database?: string;\n connectionString?: string;\n\n /** Cache configuration */\n cache?: CacheConfig;\n\n /** Additional options */\n options?: {\n logging?: boolean;\n logger?: any;\n pool?: {\n min?: number;\n max?: number;\n };\n };\n}\n\n/**\n * Chainable query result with $withCache support\n */\nexport class CacheableQuery<T = unknown> implements PromiseLike<QueryResult<T>> {\n private executed = false;\n private cacheConfig: QueryCacheConfig | null = null;\n private result: QueryResult<T> | null = null;\n\n constructor(\n private readonly sql: string,\n private readonly params: QueryParams | undefined,\n private readonly executor: (\n sql: string,\n params?: QueryParams,\n cache?: QueryCacheConfig | null,\n ) => Promise<QueryResult<T>>,\n globalCache: boolean,\n ) {\n // If global cache is enabled, use cache by default\n if (globalCache) {\n this.cacheConfig = { enabled: true };\n }\n }\n\n /**\n * Enable caching for this query (Drizzle-style)\n *\n * @example\n * ```typescript\n * // Simple enable\n * await db.query('SELECT * FROM users').$withCache();\n *\n * // With options\n * await db.query('SELECT * FROM users').$withCache({\n * ttl: 60,\n * tags: ['users']\n * });\n *\n * // Disable for global cache mode\n * await db.query('SELECT * FROM users').$withCache(false);\n * ```\n */\n $withCache(options?: boolean | QueryCacheConfig): this {\n if (options === false) {\n this.cacheConfig = null;\n } else if (options === true || options === undefined) {\n this.cacheConfig = { enabled: true };\n } else {\n this.cacheConfig = { enabled: true, ...options };\n }\n return this;\n }\n\n /**\n * Alias for $withCache\n */\n cache(options?: boolean | QueryCacheConfig): this {\n return this.$withCache(options);\n }\n\n /**\n * Execute the query\n */\n async execute(): Promise<QueryResult<T>> {\n if (!this.executed) {\n this.result = await this.executor(this.sql, this.params, this.cacheConfig);\n this.executed = true;\n }\n return this.result!;\n }\n\n /**\n * Implement PromiseLike for await support\n */\n then<TResult1 = QueryResult<T>, TResult2 = never>(\n onfulfilled?: ((value: QueryResult<T>) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null,\n ): PromiseLike<TResult1 | TResult2> {\n return this.execute().then(onfulfilled, onrejected);\n }\n}\n\n/**\n * CachedDBBridge - Database client with integrated caching\n */\nexport class CachedDBBridge extends EventEmitter {\n private adapter?: DatabaseAdapter;\n private cacheAdapter?: ConnectableCacheAdapter;\n private cacheAPI?: CacheAPI;\n private keyGenerator: CacheKeyGenerator;\n private readonly config: CachedDBBridgeConfig;\n\n constructor(config: CachedDBBridgeConfig) {\n super();\n this.config = config;\n this.keyGenerator = new CacheKeyGenerator({\n namespace: config.cache?.namespace || 'db-bridge',\n });\n }\n\n // ============================================\n // Static Factory Methods\n // ============================================\n\n /**\n * Create MySQL instance with optional cache\n */\n static mysql(\n config: Omit<CachedDBBridgeConfig, 'type'> & {\n host?: string;\n port?: number;\n user?: string;\n password?: string;\n database?: string;\n },\n ): CachedDBBridge {\n return new CachedDBBridge({ ...config, type: 'mysql' });\n }\n\n /**\n * Create PostgreSQL instance with optional cache\n */\n static postgresql(\n config: Omit<CachedDBBridgeConfig, 'type'> & {\n host?: string;\n port?: number;\n user?: string;\n password?: string;\n database?: string;\n },\n ): CachedDBBridge {\n return new CachedDBBridge({ ...config, type: 'postgresql' });\n }\n\n /**\n * Alias for postgresql\n */\n static postgres(config: Omit<CachedDBBridgeConfig, 'type'>): CachedDBBridge {\n return CachedDBBridge.postgresql(config);\n }\n\n // ============================================\n // $cache API (Drizzle-style)\n // ============================================\n\n /**\n * Cache management API\n *\n * @example\n * ```typescript\n * // Invalidate by tables\n * await db.$cache.invalidate({ tables: ['users', 'posts'] });\n *\n * // Invalidate by tags\n * await db.$cache.invalidate({ tags: ['user-123'] });\n *\n * // Get statistics\n * const stats = db.$cache.stats();\n *\n * // Clear all\n * await db.$cache.clear();\n * ```\n */\n get $cache(): {\n invalidate: CacheAPI['invalidate'];\n clear: CacheAPI['clear'];\n warmup: (\n queries: Array<{ sql: string; params?: unknown[]; ttl?: number }>,\n ) => Promise<{ success: number; failed: number }>;\n stats: () => ReturnType<CacheAPI['getStats']>;\n resetStats: () => void;\n key: () => CacheKeyGenerator;\n } {\n if (!this.cacheAPI) {\n throw new DatabaseError('Cache not configured. Add cache config to enable caching.');\n }\n\n return {\n invalidate: this.cacheAPI.invalidate.bind(this.cacheAPI),\n clear: this.cacheAPI.clear.bind(this.cacheAPI),\n warmup: (queries) =>\n this.cacheAPI!.warmup(queries, (sql, params) =>\n this.adapter!.query(sql, params as QueryParams),\n ),\n stats: () => this.cacheAPI!.getStats(),\n resetStats: () => this.cacheAPI!.resetStats(),\n key: () => this.keyGenerator,\n };\n }\n\n /**\n * Check if cache is enabled\n */\n get isCacheEnabled(): boolean {\n return !!this.cacheAPI;\n }\n\n // ============================================\n // Connection Methods\n // ============================================\n\n /**\n * Connect to database (and cache if configured)\n */\n async connect(): Promise<void> {\n // Load and connect database adapter\n this.adapter = await this.loadAdapter();\n await this.adapter.connect({\n host: this.config.host,\n port: this.config.port,\n user: this.config.user,\n password: this.config.password,\n database: this.config.database,\n connectionString: this.config.connectionString,\n pool: this.config.options?.pool,\n });\n\n // Setup cache if configured\n if (this.config.cache) {\n await this.setupCache();\n }\n\n this.emit('connect');\n }\n\n /**\n * Disconnect from database and cache\n */\n async disconnect(): Promise<void> {\n if (this.cacheAdapter && typeof this.cacheAdapter.disconnect === 'function') {\n await this.cacheAdapter.disconnect();\n }\n if (this.adapter) {\n await this.adapter.disconnect();\n }\n this.emit('disconnect');\n }\n\n // ============================================\n // Query Methods with $withCache Support\n // ============================================\n\n /**\n * Execute query with optional caching\n *\n * @example\n * ```typescript\n * // Simple query\n * const result = await db.query('SELECT * FROM users');\n *\n * // With cache (method chaining)\n * const cached = await db.query('SELECT * FROM users').$withCache();\n *\n * // With cache options\n * const custom = await db.query('SELECT * FROM users').$withCache({\n * ttl: 60,\n * tags: ['users-list']\n * });\n *\n * // Disable cache (when global is true)\n * const fresh = await db.query('SELECT * FROM users').$withCache(false);\n * ```\n */\n query<T = unknown>(sql: string, params?: QueryParams): CacheableQuery<T> {\n this.ensureConnected();\n\n const executor = async (\n s: string,\n p?: QueryParams,\n cacheConfig?: QueryCacheConfig | null,\n ): Promise<QueryResult<T>> => {\n // No caching\n if (!cacheConfig || !this.cacheAPI) {\n return this.adapter!.query<T>(s, p);\n }\n\n // Generate cache key\n const key = cacheConfig.key || this.cacheAPI.generateKey(s, p as unknown[]);\n\n // Try cache first\n const cached = await this.cacheAPI.get<QueryResult<T>>(key);\n if (cached) {\n this.emit('cacheHit', { key, sql: s });\n return cached;\n }\n\n // Execute query\n const result = await this.adapter!.query<T>(s, p);\n this.emit('cacheMiss', { key, sql: s });\n\n // Cache the result\n const tables = this.extractTables(s);\n await this.cacheAPI.set(key, result, {\n ttl: cacheConfig.ttl || this.config.cache?.ttl || 3600,\n tags: cacheConfig.tags,\n tables,\n });\n\n return result;\n };\n\n return new CacheableQuery<T>(sql, params, executor, this.config.cache?.global ?? false);\n }\n\n /**\n * Execute command (INSERT, UPDATE, DELETE)\n * Automatically invalidates related cache\n */\n async execute<T = unknown>(sql: string, params?: QueryParams): Promise<QueryResult<T>> {\n this.ensureConnected();\n\n const result = await this.adapter!.query<T>(sql, params);\n\n // Auto-invalidate cache for mutations\n if (this.cacheAPI && this.config.cache?.autoInvalidate !== false) {\n const command = sql.trim().split(/\\s+/)[0]?.toUpperCase();\n const mutationCommands = ['INSERT', 'UPDATE', 'DELETE', 'TRUNCATE', 'DROP', 'ALTER'];\n\n if (command && mutationCommands.includes(command)) {\n const tables = this.extractTables(sql);\n if (tables.length > 0) {\n await this.$cache.invalidate({ tables });\n this.emit('cacheInvalidated', { tables, command });\n }\n }\n }\n\n return result;\n }\n\n // ============================================\n // Query Builder\n // ============================================\n\n /**\n * Get query builder for table\n */\n table<T = unknown>(tableName: string): QueryBuilder<T> {\n this.ensureConnected();\n const qb = this.adapter!.createQueryBuilder<T>();\n return this.configureQueryBuilder(qb, tableName);\n }\n\n /**\n * Alias for table()\n */\n from<T = unknown>(tableName: string): QueryBuilder<T> {\n return this.table<T>(tableName);\n }\n\n // ============================================\n // Transaction Support\n // ============================================\n\n /**\n * Execute transaction\n * Note: Cache is bypassed during transactions\n */\n async transaction<T>(\n callback: (trx: Transaction) => Promise<T>,\n options?: TransactionOptions,\n ): Promise<T> {\n this.ensureConnected();\n\n const trx = await this.adapter!.beginTransaction(options);\n\n try {\n const result = await callback(trx);\n await trx.commit();\n\n // Invalidate all cache after successful transaction\n if (this.cacheAPI) {\n await this.$cache.clear();\n }\n\n return result;\n } catch (error) {\n await trx.rollback();\n throw error;\n }\n }\n\n // ============================================\n // Utility Methods\n // ============================================\n\n /**\n * Get raw adapter for advanced usage\n */\n getAdapter(): DatabaseAdapter | undefined {\n return this.adapter;\n }\n\n /**\n * Get cache adapter\n */\n getCacheAdapter(): CacheAdapter | undefined {\n return this.cacheAdapter;\n }\n\n /**\n * Ping database\n */\n async ping(): Promise<boolean> {\n this.ensureConnected();\n return this.adapter!.ping();\n }\n\n /**\n * Check if connected\n */\n get isConnected(): boolean {\n return !!this.adapter?.isConnected;\n }\n\n // ============================================\n // Private Methods\n // ============================================\n\n private async setupCache(): Promise<void> {\n const cacheConfig = this.config.cache!;\n\n // Load Redis adapter if string connection\n if (typeof cacheConfig.redis === 'string') {\n this.cacheAdapter = await this.loadRedisAdapter();\n if (typeof this.cacheAdapter.connect === 'function') {\n await this.cacheAdapter.connect({\n connectionString: cacheConfig.redis,\n });\n }\n } else if (cacheConfig.redis) {\n this.cacheAdapter = cacheConfig.redis as ConnectableCacheAdapter;\n }\n\n if (!this.cacheAdapter) {\n throw new DatabaseError('Cache adapter not configured properly');\n }\n\n // Create Cache API\n this.cacheAPI = new CacheAPI({\n adapter: this.cacheAdapter,\n namespace: cacheConfig.namespace || 'db-bridge',\n logger: this.config.options?.logger,\n onHit: cacheConfig.onHit,\n onMiss: cacheConfig.onMiss,\n onError: cacheConfig.onError,\n });\n\n // Warmup if configured\n if (cacheConfig.warmup && cacheConfig.warmup.length > 0) {\n await this.$cache.warmup(cacheConfig.warmup);\n }\n }\n\n private async loadAdapter(): Promise<DatabaseAdapter> {\n switch (this.config.type) {\n case 'mysql': {\n return this.loadMySQLAdapter();\n }\n case 'postgresql':\n case 'postgres': {\n return this.loadPostgreSQLAdapter();\n }\n default: {\n throw new DatabaseError(`Unsupported database type: ${this.config.type}`);\n }\n }\n }\n\n private async loadMySQLAdapter(): Promise<DatabaseAdapter> {\n try {\n let module: any;\n try {\n module = await import('@db-bridge/mysql');\n } catch {\n module = require('@db-bridge/mysql');\n }\n const MySQLAdapter = module.MySQLAdapter || module.default?.MySQLAdapter;\n return new MySQLAdapter(\n this.config.options?.logger ? { logger: this.config.options.logger } : {},\n );\n } catch {\n throw new DatabaseError('MySQL adapter not installed. Run: npm install @db-bridge/mysql');\n }\n }\n\n private async loadPostgreSQLAdapter(): Promise<DatabaseAdapter> {\n try {\n let module: any;\n try {\n module = await import('@db-bridge/postgresql');\n } catch {\n module = require('@db-bridge/postgresql');\n }\n const PostgreSQLAdapter = module.PostgreSQLAdapter || module.default?.PostgreSQLAdapter;\n return new PostgreSQLAdapter(\n this.config.options?.logger ? { logger: this.config.options.logger } : {},\n );\n } catch {\n throw new DatabaseError(\n 'PostgreSQL adapter not installed. Run: npm install @db-bridge/postgresql',\n );\n }\n }\n\n private async loadRedisAdapter(): Promise<ConnectableCacheAdapter> {\n try {\n let module: any;\n try {\n module = await import('@db-bridge/redis');\n } catch {\n module = require('@db-bridge/redis');\n }\n const RedisAdapter = module.RedisAdapter || module.default?.RedisAdapter;\n return new RedisAdapter() as ConnectableCacheAdapter;\n } catch {\n throw new DatabaseError('Redis adapter not installed. Run: npm install @db-bridge/redis');\n }\n }\n\n private configureQueryBuilder<T>(qb: any, tableName: string): QueryBuilder<T> {\n if (typeof qb.table === 'function') {\n return qb.table(tableName);\n }\n if (typeof qb.from === 'function') {\n return qb.from(tableName);\n }\n if ('_table' in qb || 'tableName' in qb) {\n qb._table = tableName;\n qb.tableName = tableName;\n return qb;\n }\n throw new DatabaseError('Query builder does not support table selection');\n }\n\n private ensureConnected(): void {\n if (!this.adapter) {\n throw new DatabaseError('Not connected. Call connect() first.');\n }\n }\n\n private extractTables(sql: string): string[] {\n const tables: string[] = [];\n const patterns = [\n /from\\s+[\"'`]?(\\w+)[\"'`]?/gi,\n /join\\s+[\"'`]?(\\w+)[\"'`]?/gi,\n /into\\s+[\"'`]?(\\w+)[\"'`]?/gi,\n /update\\s+[\"'`]?(\\w+)[\"'`]?/gi,\n /delete\\s+from\\s+[\"'`]?(\\w+)[\"'`]?/gi,\n ];\n\n for (const pattern of patterns) {\n let match;\n while ((match = pattern.exec(sql)) !== null) {\n if (match[1]) {\n tables.push(match[1].toLowerCase());\n }\n }\n }\n\n return [...new Set(tables)];\n }\n}\n\n// Export types\n\nexport { type CacheConfig, type QueryCacheConfig } from './cache/cache-api';\n","import { DatabaseError } from './errors';\n\nimport type { ConnectionConfig, DatabaseAdapter } from './interfaces';\n\nexport type DatabaseType = 'mysql' | 'postgresql' | 'postgres';\n\nexport interface DBBridgeConfig {\n type: DatabaseType;\n connection: ConnectionConfig;\n options?: {\n logging?: boolean;\n logger?: any;\n pool?: {\n min?: number;\n max?: number;\n };\n };\n}\n\n// Adapter factory interface\nexport interface AdapterFactory {\n createAdapter(config: DBBridgeConfig): DatabaseAdapter;\n}\n\n// Registry for adapter factories\nconst adapterFactories = new Map<DatabaseType, AdapterFactory>();\n\n/**\n * Register an adapter factory\n */\nexport function registerAdapterFactory(type: DatabaseType, factory: AdapterFactory): void {\n adapterFactories.set(type, factory);\n}\n\n/**\n * Create adapter using registered factory\n */\nexport function createAdapter(config: DBBridgeConfig): DatabaseAdapter {\n const factory = adapterFactories.get(config.type);\n\n if (!factory) {\n throw new DatabaseError(\n `No adapter factory registered for type: ${config.type}. ` +\n `Make sure you've imported the adapter package.`,\n );\n }\n\n return factory.createAdapter(config);\n}\n\n/**\n * DBBridge with factory pattern - no dynamic imports\n */\nexport class DBBridge {\n private adapter?: DatabaseAdapter;\n private readonly config: DBBridgeConfig;\n\n constructor(config: DBBridgeConfig) {\n this.config = config;\n }\n\n static mysql(connection: ConnectionConfig, options?: any): DBBridge {\n return new DBBridge({\n type: 'mysql',\n connection,\n options,\n });\n }\n\n static postgresql(connection: ConnectionConfig, options?: any): DBBridge {\n return new DBBridge({\n type: 'postgresql',\n connection,\n options,\n });\n }\n\n async connect(): Promise<void> {\n this.adapter = createAdapter(this.config);\n await this.adapter.connect(this.config.connection);\n }\n\n async disconnect(): Promise<void> {\n if (this.adapter) {\n await this.adapter.disconnect();\n }\n }\n\n async query<T = any>(sql: string, params?: any[]): Promise<{ rows: T[]; fields?: any[] }> {\n this.ensureConnected();\n return this.adapter!.query(sql, params);\n }\n\n async execute(sql: string, params?: any[]): Promise<any> {\n this.ensureConnected();\n return this.adapter!.execute(sql, params);\n }\n\n table<T = any>(tableName: string): import('./interfaces').QueryBuilder<T> {\n this.ensureConnected();\n const qb = this.adapter!.createQueryBuilder<T>();\n return this.configureQueryBuilder(qb, tableName);\n }\n\n private configureQueryBuilder<T>(\n qb: any,\n tableName: string,\n ): import('./interfaces').QueryBuilder<T> {\n if (typeof qb.table === 'function') {\n return qb.table(tableName);\n }\n if (typeof qb.from === 'function') {\n return qb.from(tableName);\n }\n if ('_table' in qb || 'tableName' in qb) {\n qb._table = tableName;\n qb.tableName = tableName;\n return qb;\n }\n throw new DatabaseError('Query builder does not support table selection');\n }\n\n from<T = any>(tableName: string): import('./interfaces').QueryBuilder<T> {\n return this.table<T>(tableName);\n }\n\n async transaction<T>(callback: (trx: any) => Promise<T>): Promise<T> {\n this.ensureConnected();\n const trx = await this.adapter!.beginTransaction();\n\n try {\n const result = await callback(trx);\n await trx.commit();\n return result;\n } catch (error) {\n await trx.rollback();\n throw error;\n }\n }\n\n async prepare(sql: string, options?: any): Promise<any> {\n this.ensureConnected();\n return this.adapter!.prepare(sql, options);\n }\n\n private ensureConnected(): void {\n if (!this.adapter) {\n throw new DatabaseError('Not connected. Call connect() first.');\n }\n }\n\n getAdapter(): DatabaseAdapter | undefined {\n return this.adapter;\n }\n}\n"]}