jtcsv 2.2.8 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +204 -115
- package/bin/jtcsv.ts +2612 -0
- package/browser.d.ts +142 -0
- package/dist/benchmark.js +446 -0
- package/dist/benchmark.js.map +1 -0
- package/dist/bin/jtcsv.js +1940 -0
- package/dist/bin/jtcsv.js.map +1 -0
- package/dist/csv-to-json.js +1262 -0
- package/dist/csv-to-json.js.map +1 -0
- package/dist/errors.js +291 -0
- package/dist/errors.js.map +1 -0
- package/dist/eslint.config.js +147 -0
- package/dist/eslint.config.js.map +1 -0
- package/dist/index-core.js +95 -0
- package/dist/index-core.js.map +1 -0
- package/dist/index.js +93 -0
- package/dist/index.js.map +1 -0
- package/dist/json-save.js +229 -0
- package/dist/json-save.js.map +1 -0
- package/dist/json-to-csv.js +576 -0
- package/dist/json-to-csv.js.map +1 -0
- package/dist/jtcsv-core.cjs.js +1736 -0
- package/dist/jtcsv-core.cjs.js.map +1 -0
- package/dist/jtcsv-core.esm.js +1708 -0
- package/dist/jtcsv-core.esm.js.map +1 -0
- package/dist/jtcsv-core.umd.js +1742 -0
- package/dist/jtcsv-core.umd.js.map +1 -0
- package/dist/jtcsv-full.cjs.js +2241 -0
- package/dist/jtcsv-full.cjs.js.map +1 -0
- package/dist/jtcsv-full.esm.js +2209 -0
- package/dist/jtcsv-full.esm.js.map +1 -0
- package/dist/jtcsv-full.umd.js +2247 -0
- package/dist/jtcsv-full.umd.js.map +1 -0
- package/dist/jtcsv-workers.esm.js +768 -0
- package/dist/jtcsv-workers.esm.js.map +1 -0
- package/dist/jtcsv-workers.umd.js +782 -0
- package/dist/jtcsv-workers.umd.js.map +1 -0
- package/dist/jtcsv.cjs.js +1996 -2048
- package/dist/jtcsv.cjs.js.map +1 -1
- package/dist/jtcsv.esm.js +1992 -2048
- package/dist/jtcsv.esm.js.map +1 -1
- package/dist/jtcsv.umd.js +2157 -2209
- package/dist/jtcsv.umd.js.map +1 -1
- package/dist/plugins/express-middleware/index.js +350 -0
- package/dist/plugins/express-middleware/index.js.map +1 -0
- package/dist/plugins/fastify-plugin/index.js +315 -0
- package/dist/plugins/fastify-plugin/index.js.map +1 -0
- package/dist/plugins/hono/index.js +111 -0
- package/dist/plugins/hono/index.js.map +1 -0
- package/dist/plugins/nestjs/index.js +112 -0
- package/dist/plugins/nestjs/index.js.map +1 -0
- package/dist/plugins/nuxt/index.js +53 -0
- package/dist/plugins/nuxt/index.js.map +1 -0
- package/dist/plugins/remix/index.js +133 -0
- package/dist/plugins/remix/index.js.map +1 -0
- package/dist/plugins/sveltekit/index.js +155 -0
- package/dist/plugins/sveltekit/index.js.map +1 -0
- package/dist/plugins/trpc/index.js +136 -0
- package/dist/plugins/trpc/index.js.map +1 -0
- package/dist/run-demo.js +49 -0
- package/dist/run-demo.js.map +1 -0
- package/dist/src/browser/browser-functions.js +193 -0
- package/dist/src/browser/browser-functions.js.map +1 -0
- package/dist/src/browser/core.js +123 -0
- package/dist/src/browser/core.js.map +1 -0
- package/dist/src/browser/csv-to-json-browser.js +353 -0
- package/dist/src/browser/csv-to-json-browser.js.map +1 -0
- package/dist/src/browser/errors-browser.js +219 -0
- package/dist/src/browser/errors-browser.js.map +1 -0
- package/dist/src/browser/extensions/plugins.js +106 -0
- package/dist/src/browser/extensions/plugins.js.map +1 -0
- package/dist/src/browser/extensions/workers.js +66 -0
- package/dist/src/browser/extensions/workers.js.map +1 -0
- package/dist/src/browser/index.js +140 -0
- package/dist/src/browser/index.js.map +1 -0
- package/dist/src/browser/json-to-csv-browser.js +225 -0
- package/dist/src/browser/json-to-csv-browser.js.map +1 -0
- package/dist/src/browser/streams.js +340 -0
- package/dist/src/browser/streams.js.map +1 -0
- package/dist/src/browser/workers/csv-parser.worker.js +264 -0
- package/dist/src/browser/workers/csv-parser.worker.js.map +1 -0
- package/dist/src/browser/workers/worker-pool.js +338 -0
- package/dist/src/browser/workers/worker-pool.js.map +1 -0
- package/dist/src/core/delimiter-cache.js +196 -0
- package/dist/src/core/delimiter-cache.js.map +1 -0
- package/dist/src/core/node-optimizations.js +279 -0
- package/dist/src/core/node-optimizations.js.map +1 -0
- package/dist/src/core/plugin-system.js +399 -0
- package/dist/src/core/plugin-system.js.map +1 -0
- package/dist/src/core/transform-hooks.js +348 -0
- package/dist/src/core/transform-hooks.js.map +1 -0
- package/dist/src/engines/fast-path-engine-new.js +262 -0
- package/dist/src/engines/fast-path-engine-new.js.map +1 -0
- package/dist/src/engines/fast-path-engine.js +671 -0
- package/dist/src/engines/fast-path-engine.js.map +1 -0
- package/dist/src/errors.js +18 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/formats/ndjson-parser.js +332 -0
- package/dist/src/formats/ndjson-parser.js.map +1 -0
- package/dist/src/formats/tsv-parser.js +230 -0
- package/dist/src/formats/tsv-parser.js.map +1 -0
- package/dist/src/index-with-plugins.js +259 -0
- package/dist/src/index-with-plugins.js.map +1 -0
- package/dist/src/types/index.js +3 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/src/utils/bom-utils.js +267 -0
- package/dist/src/utils/bom-utils.js.map +1 -0
- package/dist/src/utils/encoding-support.js +77 -0
- package/dist/src/utils/encoding-support.js.map +1 -0
- package/dist/src/utils/schema-validator.js +609 -0
- package/dist/src/utils/schema-validator.js.map +1 -0
- package/dist/src/utils/transform-loader.js +281 -0
- package/dist/src/utils/transform-loader.js.map +1 -0
- package/dist/src/utils/validators.js +40 -0
- package/dist/src/utils/validators.js.map +1 -0
- package/dist/src/utils/zod-adapter.js +144 -0
- package/dist/src/utils/zod-adapter.js.map +1 -0
- package/dist/src/web-server/index.js +648 -0
- package/dist/src/web-server/index.js.map +1 -0
- package/dist/src/workers/csv-multithreaded.js +211 -0
- package/dist/src/workers/csv-multithreaded.js.map +1 -0
- package/dist/src/workers/csv-parser.worker.js +179 -0
- package/dist/src/workers/csv-parser.worker.js.map +1 -0
- package/dist/src/workers/worker-pool.js +228 -0
- package/dist/src/workers/worker-pool.js.map +1 -0
- package/dist/stream-csv-to-json.js +665 -0
- package/dist/stream-csv-to-json.js.map +1 -0
- package/dist/stream-json-to-csv.js +389 -0
- package/dist/stream-json-to-csv.js.map +1 -0
- package/examples/advanced/conditional-transformations.ts +446 -0
- package/examples/advanced/csv-parser.worker.ts +89 -0
- package/examples/advanced/nested-objects-example.ts +306 -0
- package/examples/advanced/performance-optimization.ts +504 -0
- package/examples/advanced/run-demo-server.ts +116 -0
- package/examples/advanced/web-worker-usage.html +874 -0
- package/examples/async-multithreaded-example.ts +335 -0
- package/examples/cli-advanced-usage.md +290 -0
- package/examples/{cli-batch-processing.js → cli-batch-processing.ts} +38 -38
- package/examples/{cli-tool.js → cli-tool.ts} +5 -8
- package/examples/{error-handling.js → error-handling.ts} +356 -324
- package/examples/{express-api.js → express-api.ts} +161 -164
- package/examples/{large-dataset-example.js → large-dataset-example.ts} +201 -182
- package/examples/{ndjson-processing.js → ndjson-processing.ts} +456 -434
- package/examples/{plugin-excel-exporter.js → plugin-excel-exporter.ts} +6 -7
- package/examples/react-integration.tsx +637 -0
- package/examples/{schema-validation.js → schema-validation.ts} +2 -2
- package/examples/simple-usage.ts +194 -0
- package/examples/{streaming-example.js → streaming-example.ts} +12 -12
- package/index.d.ts +187 -18
- package/package.json +75 -81
- package/plugins.d.ts +37 -0
- package/schema.d.ts +103 -0
- package/src/browser/browser-functions.ts +402 -0
- package/src/browser/core.ts +152 -0
- package/src/browser/csv-to-json-browser.d.ts +3 -0
- package/src/browser/csv-to-json-browser.ts +494 -0
- package/src/browser/{errors-browser.js → errors-browser.ts} +305 -197
- package/src/browser/extensions/plugins.ts +93 -0
- package/src/browser/extensions/workers.ts +39 -0
- package/src/browser/globals.d.ts +5 -0
- package/src/browser/index.ts +192 -0
- package/src/browser/json-to-csv-browser.d.ts +3 -0
- package/src/browser/json-to-csv-browser.ts +338 -0
- package/src/browser/streams.ts +403 -0
- package/src/browser/workers/{csv-parser.worker.js → csv-parser.worker.ts} +3 -3
- package/src/browser/workers/{worker-pool.js → worker-pool.ts} +51 -30
- package/src/core/delimiter-cache.ts +320 -0
- package/src/core/{node-optimizations.js → node-optimizations.ts} +448 -407
- package/src/core/plugin-system.ts +588 -0
- package/src/core/transform-hooks.ts +566 -0
- package/src/engines/{fast-path-engine-new.js → fast-path-engine-new.ts} +11 -2
- package/src/engines/{fast-path-engine.js → fast-path-engine.ts} +79 -53
- package/src/errors.ts +1 -0
- package/src/formats/{ndjson-parser.js → ndjson-parser.ts} +24 -16
- package/src/formats/{tsv-parser.js → tsv-parser.ts} +18 -17
- package/src/{index-with-plugins.js → index-with-plugins.ts} +381 -357
- package/src/types/index.ts +275 -0
- package/src/utils/bom-utils.ts +373 -0
- package/src/utils/encoding-support.ts +155 -0
- package/src/utils/{schema-validator.js → schema-validator.ts} +814 -589
- package/src/utils/transform-loader.ts +389 -0
- package/src/utils/validators.ts +35 -0
- package/src/utils/zod-adapter.ts +280 -0
- package/src/web-server/{index.js → index.ts} +19 -19
- package/src/workers/csv-multithreaded.ts +310 -0
- package/src/workers/csv-parser.worker.ts +227 -0
- package/src/workers/worker-pool.ts +409 -0
- package/bin/jtcsv.js +0 -2462
- package/csv-to-json.js +0 -688
- package/errors.js +0 -208
- package/examples/simple-usage.js +0 -282
- package/index.js +0 -68
- package/json-save.js +0 -254
- package/json-to-csv.js +0 -526
- package/plugins/README.md +0 -91
- package/plugins/express-middleware/README.md +0 -64
- package/plugins/express-middleware/example.js +0 -136
- package/plugins/express-middleware/index.d.ts +0 -114
- package/plugins/express-middleware/index.js +0 -360
- package/plugins/express-middleware/package.json +0 -52
- package/plugins/fastify-plugin/index.js +0 -406
- package/plugins/fastify-plugin/package.json +0 -55
- package/plugins/hono/README.md +0 -28
- package/plugins/hono/index.d.ts +0 -12
- package/plugins/hono/index.js +0 -36
- package/plugins/hono/package.json +0 -35
- package/plugins/nestjs/README.md +0 -35
- package/plugins/nestjs/index.d.ts +0 -25
- package/plugins/nestjs/index.js +0 -77
- package/plugins/nestjs/package.json +0 -37
- package/plugins/nextjs-api/README.md +0 -57
- package/plugins/nextjs-api/examples/ConverterComponent.jsx +0 -386
- package/plugins/nextjs-api/examples/api-convert.js +0 -69
- package/plugins/nextjs-api/index.js +0 -387
- package/plugins/nextjs-api/package.json +0 -63
- package/plugins/nextjs-api/route.js +0 -371
- package/plugins/nuxt/README.md +0 -24
- package/plugins/nuxt/index.js +0 -21
- package/plugins/nuxt/package.json +0 -35
- package/plugins/nuxt/runtime/composables/useJtcsv.js +0 -6
- package/plugins/nuxt/runtime/plugin.js +0 -6
- package/plugins/remix/README.md +0 -26
- package/plugins/remix/index.d.ts +0 -16
- package/plugins/remix/index.js +0 -62
- package/plugins/remix/package.json +0 -35
- package/plugins/sveltekit/README.md +0 -28
- package/plugins/sveltekit/index.d.ts +0 -17
- package/plugins/sveltekit/index.js +0 -54
- package/plugins/sveltekit/package.json +0 -33
- package/plugins/trpc/README.md +0 -25
- package/plugins/trpc/index.d.ts +0 -7
- package/plugins/trpc/index.js +0 -32
- package/plugins/trpc/package.json +0 -34
- package/src/browser/browser-functions.js +0 -219
- package/src/browser/csv-to-json-browser.js +0 -700
- package/src/browser/index.js +0 -113
- package/src/browser/json-to-csv-browser.js +0 -309
- package/src/browser/streams.js +0 -393
- package/src/core/delimiter-cache.js +0 -186
- package/src/core/plugin-system.js +0 -476
- package/src/core/transform-hooks.js +0 -350
- package/src/errors.js +0 -26
- package/src/utils/transform-loader.js +0 -205
- package/stream-csv-to-json.js +0 -542
- package/stream-json-to-csv.js +0 -464
- /package/examples/{web-workers-advanced.js → web-workers-advanced.ts} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"csv-to-json.js","sourceRoot":"","sources":["../csv-to-json.ts"],"names":[],"mappings":";;;;;;AAkJA,kDA0FC;AAiDD,8BAgjBC;AA4QD,wCAaC;AAKD,8CAkaC;AAsCD,sCAqCC;AASD,8CAmCC;AAMD,oDAEC;AAOD,oDAEC;AAMD,wDAEC;AAKD,kDAEC;AA7pDD,qCAUkB;AAElB,gEAA6E;AAmpDpE,+FAnpDA,gCAAc,OAmpDA;AAAE,gGAnpDA,iCAAe,OAmpDA;AAlpDxC,gEAA4D;AAC5D,sFAA4D;AAC5D,qDAA8E;AAI9E,MAAM,oBAAoB,GAAG,IAAI,gCAAc,CAAC,GAAG,CAAC,CAAC;AACrD,MAAM,oBAAoB,GAAG,IAAI,0BAAc,EAAE,CAAC;AAMlD,SAAS,gBAAgB,CAAC,GAAW,EAAE,OAA0B;IAE/D,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,wBAAe,CAAC,4BAA4B,CAAC,CAAC;IAC1D,CAAC;IAGD,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC3C,MAAM,IAAI,2BAAkB,CAAC,2BAA2B,CAAC,CAAC;IAC5D,CAAC;IAGD,IAAI,OAAO,EAAE,SAAS,IAAI,OAAO,OAAO,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QAChE,MAAM,IAAI,2BAAkB,CAAC,4BAA4B,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,OAAO,EAAE,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,2BAAkB,CAAC,sCAAsC,CAAC,CAAC;IACvE,CAAC;IAGD,IAAI,OAAO,EAAE,UAAU,KAAK,SAAS,IAAI,OAAO,OAAO,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACjF,MAAM,IAAI,2BAAkB,CAAC,8BAA8B,CAAC,CAAC;IAC/D,CAAC;IAGD,IAAI,OAAO,EAAE,UAAU,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9D,MAAM,IAAI,2BAAkB,CAAC,6BAA6B,CAAC,CAAC;IAC9D,CAAC;IAGD,IAAI,OAAO,EAAE,OAAO,KAAK,SAAS,IAAI,CAAC,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC;QACpG,MAAM,IAAI,2BAAkB,CAAC,mCAAmC,CAAC,CAAC;IACpE,CAAC;IAGD,IAAI,OAAO,EAAE,QAAQ,KAAK,SAAS,IAAI,OAAO,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC7E,MAAM,IAAI,2BAAkB,CAAC,4BAA4B,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,YAAY,gCAAc,CAAC,EAAE,CAAC;QACjE,MAAM,IAAI,2BAAkB,CAAC,6CAA6C,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,OAAO,EAAE,WAAW,KAAK,SAAS,IAAI,OAAO,OAAO,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACnF,MAAM,IAAI,2BAAkB,CAAC,+BAA+B,CAAC,CAAC;IAChE,CAAC;IAED,IAAI,OAAO,EAAE,YAAY,KAAK,SAAS;WAClC,OAAO,CAAC,YAAY,KAAK,SAAS;WAClC,OAAO,CAAC,YAAY,KAAK,SAAS;WAClC,OAAO,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,IAAI,2BAAkB,CAAC,wDAAwD,CAAC,CAAC;IACzF,CAAC;IAED,IAAI,OAAO,EAAE,sBAAsB,KAAK,SAAS,EAAE,CAAC;QAClD,IAAI,OAAO,OAAO,CAAC,sBAAsB,KAAK,QAAQ,IAAI,OAAO,CAAC,sBAAsB,IAAI,CAAC,EAAE,CAAC;YAC9F,MAAM,IAAI,2BAAkB,CAAC,kDAAkD,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;IAED,IAAI,OAAO,EAAE,WAAW,KAAK,SAAS,EAAE,CAAC;QACvC,IAAI,OAAO,OAAO,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;YAC5C,MAAM,IAAI,2BAAkB,CAAC,8BAA8B,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,OAAO,CAAC,WAAW,KAAK,QAAQ,IAAI,OAAO,CAAC,WAAW,IAAI,CAAC,EAAE,CAAC;YACjE,MAAM,IAAI,2BAAkB,CAAC,mDAAmD,CAAC,CAAC;QACpF,CAAC;IACH,CAAC;IAED,IAAI,OAAO,EAAE,OAAO,KAAK,SAAS;WAC7B,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,2BAAkB,CAAC,4CAA4C,CAAC,CAAC;IAC7E,CAAC;IAED,IAAI,OAAO,EAAE,YAAY,KAAK,SAAS,IAAI,OAAO,OAAO,CAAC,YAAY,KAAK,UAAU,EAAE,CAAC;QACtF,MAAM,IAAI,2BAAkB,CAAC,iCAAiC,CAAC,CAAC;IAClE,CAAC;IAGD,IAAI,OAAO,EAAE,KAAK,EAAE,CAAC;QACnB,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACtC,MAAM,IAAI,2BAAkB,CAAC,yBAAyB,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,OAAO,CAAC,KAAK,CAAC,aAAa,IAAI,OAAO,OAAO,CAAC,KAAK,CAAC,aAAa,KAAK,UAAU,EAAE,CAAC;YACrF,MAAM,IAAI,2BAAkB,CAAC,wCAAwC,CAAC,CAAC;QACzE,CAAC;QAED,IAAI,OAAO,CAAC,KAAK,CAAC,YAAY,IAAI,OAAO,OAAO,CAAC,KAAK,CAAC,YAAY,KAAK,UAAU,EAAE,CAAC;YACnF,MAAM,IAAI,2BAAkB,CAAC,uCAAuC,CAAC,CAAC;QACxE,CAAC;QAED,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,IAAI,OAAO,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YACvE,MAAM,IAAI,2BAAkB,CAAC,iCAAiC,CAAC,CAAC;QAClE,CAAC;QAED,IAAI,OAAO,CAAC,KAAK,CAAC,cAAc;eAC3B,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,YAAY,gCAAc,CAAC,EAAE,CAAC;YAC/D,MAAM,IAAI,2BAAkB,CAAC,4DAA4D,CAAC,CAAC;QAC7F,CAAC;QAED,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,IAAI,OAAO,OAAO,CAAC,KAAK,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;YACzE,MAAM,IAAI,2BAAkB,CAAC,kCAAkC,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAKD,SAAgB,mBAAmB,CACjC,GAAW,EACX,UAIe,EAAE;IAEjB,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/D,OAAO,GAAG,CAAC;IACb,CAAC;IAED,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAC5C,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE;QACzB,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IAEpB,MAAM,EACJ,UAAU,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,EAClC,QAAQ,GAAG,IAAI,EACf,KAAK,GAAG,oBAAoB,EAC7B,GAAG,eAAe,CAAC;IAGpB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,2BAAkB,CAAC,6BAA6B,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5D,MAAM,IAAI,2BAAkB,CAAC,kDAAkD,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;IAGD,IAAI,QAAQ,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAC1C,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IAID,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5D,IAAI,aAAa,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAClC,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC;IAEnB,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,KAAK,GAAG,CAAC,CAAC;QAGd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,IAAI,WAAW,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;gBACjC,KAAK,EAAE,CAAC;YACV,CAAC;QACH,CAAC;QAGD,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC7E,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,MAAM,gBAAgB,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;gBAC1D,IAAI,UAAU,GAAG,IAAI,CAAC;gBAEtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBACnD,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,gBAAgB,EAAE,CAAC;wBAC1D,UAAU,GAAG,KAAK,CAAC;wBACnB,MAAM;oBACR,CAAC;gBACH,CAAC;gBAED,IAAI,UAAU,EAAE,CAAC;oBACf,KAAK,IAAI,GAAG,CAAC;gBACf,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,KAAK,GAAG,SAAS,EAAE,CAAC;YACtB,SAAS,GAAG,KAAK,CAAC;YAClB,aAAa,GAAG,SAAS,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,MAAM,iBAAiB,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC;IAE9D,IAAI,QAAQ,IAAI,KAAK,EAAE,CAAC;QACtB,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,EAAE,iBAAiB,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED,SAAS,oBAAoB,CAAC,GAAW;IACvC,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,6BAA6B,CACpC,GAAW,EACX,gBAAoC,EACpC,UAAoB;IAEpB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IACD,MAAM,UAAU,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAC7C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IACD,MAAM,YAAY,GAAG,UAAU,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IACnE,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IACD,IAAI,aAAa,GAAG,gBAAgB,CAAC;IACrC,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5D,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QACrD,IAAI,KAAK,GAAG,SAAS,EAAE,CAAC;YACtB,SAAS,GAAG,KAAK,CAAC;YAClB,aAAa,GAAG,SAAS,CAAC;QAC5B,CAAC;IACH,CAAC;IACD,OAAO,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,gBAAgB,CAAC;AAC1D,CAAC;AAKD,SAAgB,SAAS,CACvB,GAAW,EACX,UAA4B,EAAE;IAE9B,OAAO,IAAA,wBAAe,EAAC,GAAG,EAAE;QAE1B,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAE/B,MAAM,IAAI,GAAG,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAEnE,MAAM,EACJ,SAAS,EACT,UAAU,GAAG,IAAI,EACjB,UAAU,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,EAClC,UAAU,GAAG,IAAI,EACjB,SAAS,GAAG,EAAE,EACd,IAAI,GAAG,IAAI,EACX,YAAY,GAAG,KAAK,EACpB,aAAa,GAAG,KAAK,EACrB,OAAO,EACP,WAAW,GAAG,IAAI,EAClB,YAAY,GAAG,SAAS,EACxB,MAAM,GAAG,IAAI,EACb,SAAS,EACT,KAAK,EACP,QAAQ,GAAG,IAAI,EACf,KAAK,EACL,OAAO,GAAG,OAAO,EACjB,YAAY,EACZ,eAAe,GAAG,IAAI,EACtB,eAAe,GAAG,IAAI,EACtB,sBAAsB,GAAG,OAAO,EAChC,WAAW,GAAG,OAAO,EACtB,GAAG,IAAI,CAAC;QAEP,MAAM,iBAAiB,GAAG,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,IAAI,CAAC;QACxE,MAAM,cAAc,GAAG,KAAK,EAAE,cAAc,YAAY,gCAAc;YACpE,CAAC,CAAC,KAAK,CAAC,cAAc;YACtB,CAAC,CAAC,IAAI,CAAC;QACT,MAAM,YAAY,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAEvC,IAAI,mBAAmB,GAAG,WAAW,CAAC;QACtC,IAAI,OAAO,KAAK,OAAO,IAAI,mBAAmB,EAAE,CAAC;YAC/C,mBAAmB,GAAG,KAAK,CAAC;QAC9B,CAAC;QAED,IAAI,YAAY,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,iBAAiB,CAAC,GAAG,EAAE,IAAI,CAAwB,CAAC;QAC7D,CAAC;QAGD,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;YAChB,OAAO,EAAE,CAAC;QACZ,CAAC;QAGD,MAAM,aAAa,GAAG,IAAA,6BAAiB,EAAC,GAAG,CAAC,CAAC;QAE7C,MAAM,UAAU,GAAG,KAAK,YAAY,gCAAc,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAAC;QAElF,IAAI,cAAc,GAAG,SAAS,CAAC;QAC/B,IAAI,CAAC,cAAc,IAAI,UAAU,EAAE,CAAC;YAClC,cAAc,GAAG,mBAAmB,CAAC,aAAa,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;QACnG,CAAC;QAED,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,cAAc,GAAG,GAAG,CAAC;QACvB,CAAC;QAGD,IAAI,YAAY,GAAG,aAAa,CAAC;QACjC,IAAI,cAAc,EAAE,CAAC;YACnB,YAAY,GAAG,cAAc,CAAC,kBAAkB,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;QAC/E,CAAC;QACD,IAAI,KAAK,EAAE,aAAa,EAAE,CAAC;YACzB,YAAY,GAAG,KAAK,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,CAAC,iBAAiB,IAAI,UAAU,EAAE,CAAC;YACrC,MAAM,OAAO,GAAG,6BAA6B,CAAC,YAAY,EAAE,cAAc,EAAE,UAAU,CAAC,IAAI,cAAc,CAAC;YAC1G,IAAI,OAAO,KAAK,cAAc,IAAI,QAAQ,IAAI,UAAU,EAAE,CAAC;gBACzD,UAAU,CAAC,GAAG,CAAC,YAAY,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;YACpD,CAAC;YACD,cAAc,GAAG,OAAO,CAAC;QAC3B,CAAC;QAED,MAAM,gBAAgB,GAAG,CAAC,GAAc,EAAE,KAAa,EAAa,EAAE;YACpE,IAAI,MAAM,GAAc,GAAG,CAAC;YAC5B,IAAI,cAAc,EAAE,CAAC;gBACnB,MAAM,GAAG,cAAc,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAc,CAAC;YAChF,CAAC;YACD,IAAI,KAAK,EAAE,MAAM,EAAE,CAAC;gBAClB,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAc,CAAC;YAClE,CAAC;YACD,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;YAC7B,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC;QAEF,MAAM,cAAc,GAAG,CAAC,KAAU,EAAO,EAAE;YACzC,IAAI,UAAU,GAAG,KAAK,CAAC;YACvB,IAAI,IAAI,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;gBAC3C,UAAU,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;YACjC,CAAC;YACD,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;gBACnC,IAAI,UAAU,KAAK,EAAE,EAAE,CAAC;oBACtB,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACnD,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBACtC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;oBACzD,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;oBAC7B,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;wBACrF,UAAU,GAAG,SAAS,CAAC;oBACzB,CAAC;gBACH,CAAC;YACH,CAAC;YACD,IAAI,YAAY,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;gBACnD,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;gBAChC,IAAI,CAAC,SAAS,IAAI,GAAG,IAAI,SAAS,IAAI,GAAG,CAAC,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;oBAC1G,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;oBACpC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;wBAC5B,UAAU,GAAG,QAAQ,CAAC;oBACxB,CAAC;gBACH,CAAC;YACH,CAAC;YACD,IAAI,aAAa,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;gBACpD,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;gBAChC,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;oBACrF,MAAM,UAAU,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;oBAC5C,IAAI,UAAU,KAAK,MAAM,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;wBACpD,UAAU,GAAG,UAAU,KAAK,MAAM,CAAC;oBACrC,CAAC;gBACH,CAAC;YACH,CAAC;YACD,OAAO,UAAU,CAAC;QACpB,CAAC,CAAC;QAEF,MAAM,sBAAsB,GAAG,CAAC,IAAc,EAAY,EAAE;YAC1D,IAAI,MAAM,GAAa,IAAI,CAAC;YAC5B,IAAI,KAAK,EAAE,YAAY,EAAE,CAAC;gBACxB,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC5C,CAAC;YACD,IAAI,cAAc,EAAE,CAAC;gBACnB,MAAM,GAAG,cAAc,CAAC,iBAAiB,CAAC,MAAM,EAAE,YAAY,CAAa,CAAC;YAC9E,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC;QAGF,IAAI,mBAAmB,IAAI,oBAAoB,EAAE,CAAC;YAChD,IAAI,CAAC;gBACH,IAAI,YAAY,GAAoB,IAAI,CAAC;gBACzC,MAAM,eAAe,GAAG;oBACtB,SAAS,EAAE,cAAc;oBACzB,UAAU;oBACV,IAAI;oBACJ,YAAY;oBACZ,aAAa;oBACb,OAAO;oBACP,IAAI,EAAE,YAAY;iBACnB,CAAC;gBAEF,IAAI,OAAQ,oBAA4B,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;oBAC9D,YAAY,GAAI,oBAA4B,CAAC,KAAK,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;gBACpF,CAAC;qBAAM,IAAI,OAAQ,oBAA4B,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;oBACzE,MAAM,SAAS,GAAa,EAAE,CAAC;oBAC9B,oBAA4B,CAAC,SAAS,CAAC,YAAY,EAAE,eAAe,EAAE,CAAC,GAAa,EAAE,EAAE;wBACvF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;4BAC5C,OAAO;wBACT,CAAC;wBACD,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBACtB,CAAC,CAAC,CAAC;oBACH,YAAY,GAAG,SAAS,CAAC;gBAC3B,CAAC;gBAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;oBACjC,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;gBAC9D,CAAC;gBAED,MAAM,cAAc,GAAG,CAAC,KAAU,EAAO,EAAE;oBACzC,IAAI,UAAU,GAAG,KAAK,CAAC;oBACvB,IAAI,IAAI,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;wBAC3C,UAAU,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;oBACjC,CAAC;oBACD,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;wBACnC,IAAI,UAAU,KAAK,EAAE,EAAE,CAAC;4BACtB,OAAO,IAAI,CAAC;wBACd,CAAC;wBACD,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BACnD,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;4BACtC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;4BACzD,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;4BAC7B,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;gCACrF,UAAU,GAAG,SAAS,CAAC;4BACzB,CAAC;wBACH,CAAC;oBACH,CAAC;oBACD,IAAI,YAAY,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;wBACnD,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;wBAChC,IAAI,CAAC,SAAS,IAAI,GAAG,IAAI,SAAS,IAAI,GAAG,CAAC,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;4BAC1G,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;4BACpC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;gCAC5B,UAAU,GAAG,QAAQ,CAAC;4BACxB,CAAC;wBACH,CAAC;oBACH,CAAC;oBACD,IAAI,aAAa,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;wBACpD,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;wBAChC,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;4BACrF,MAAM,UAAU,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;4BAC5C,IAAI,UAAU,KAAK,MAAM,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;gCACpD,UAAU,GAAG,UAAU,KAAK,MAAM,CAAC;4BACrC,CAAC;wBACH,CAAC;oBACH,CAAC;oBACD,OAAO,UAAU,CAAC;gBACpB,CAAC,CAAC;gBAEF,MAAM,mBAAmB,GAAG,CAAC,KAAY,EAAE,QAAgB,EAAE,GAAa,EAAE,EAAE;oBAC5E,IAAI,YAAY,EAAE,CAAC;wBACjB,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;oBAC1F,CAAC;oBACD,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;wBACvB,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,MAAM,EAAE,CAAC;4BACvC,OAAO,CAAC,IAAI,CAAC,eAAe,UAAU,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;wBAC5F,CAAC;wBACD,OAAO,IAAI,CAAC;oBACd,CAAC;oBACD,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;wBACvB,OAAO,IAAI,CAAC;oBACd,CAAC;oBACD,MAAM,KAAK,CAAC;gBACd,CAAC,CAAC;gBAEF,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;oBAC/B,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;oBACnE,IAAI,OAAO,IAAI,QAAQ,CAAC,MAAM,GAAG,OAAO,EAAE,CAAC;wBACzC,MAAM,IAAI,mBAAU,CAClB,qCAAqC,OAAO,OAAO,EACnD,OAAO,EACP,QAAQ,CAAC,MAAM,CAChB,CAAC;oBACJ,CAAC;oBACD,MAAM,WAAW,GAAG,QAAQ,CAAC;oBAC7B,MAAM,cAAc,GAAa,EAAE,CAAC;oBACpC,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;wBAC9B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;4BAC5C,SAAS;wBACX,CAAC;wBACD,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBACjE,CAAC;oBACD,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,cAAc,CAAC,MAAM,GAAG,WAAW,EAAE,CAAC;wBACxE,MAAM,IAAI,mBAAU,CAClB,2CAA2C,WAAW,OAAO,EAC7D,WAAW,EACX,cAAc,CAAC,MAAM,CACtB,CAAC;oBACJ,CAAC;oBACD,IAAI,sBAAsB;2BACrB,cAAc,CAAC,MAAM,GAAG,sBAAsB;2BAC9C,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,MAAM,EAAE,CAAC;wBACxC,OAAO,CAAC,IAAI,CACV,gDAAgD;4BAChD,yDAAyD;4BACzD,gBAAgB,GAAG,cAAc,CAAC,MAAM,CAAC,cAAc,EAAE,GAAG,SAAS;4BACrE,qEAAqE,CACtE,CAAC;oBACJ,CAAC;oBACD,OAAO,sBAAsB,CAAC,cAAc,CAAC,CAAC;gBAChD,CAAC;gBAED,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC9B,OAAO,sBAAsB,CAAC,EAAE,CAAC,CAAC;gBACpC,CAAC;gBAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBACpC,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;oBAC5E,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;wBACpD,IAAI,GAAG,GAAG,GAAgB,CAAC;wBAC3B,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BACtC,MAAM,OAAO,GAAc,EAAE,CAAC;4BAC9B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gCAC/C,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;gCACrC,OAAO,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;4BAC1B,CAAC;4BACD,GAAG,GAAG,OAAO,CAAC;wBAChB,CAAC;wBACD,OAAO,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;oBACtC,CAAC,CAAC,CAAC;oBAEH,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,cAAc,CAAC,MAAM,GAAG,WAAW,EAAE,CAAC;wBACxE,MAAM,IAAI,mBAAU,CAClB,2CAA2C,WAAW,OAAO,EAC7D,WAAW,EACX,cAAc,CAAC,MAAM,CACtB,CAAC;oBACJ,CAAC;oBACD,IAAI,sBAAsB;2BACrB,cAAc,CAAC,MAAM,GAAG,sBAAsB;2BAC9C,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,MAAM,EAAE,CAAC;wBACxC,OAAO,CAAC,IAAI,CACV,gDAAgD;4BAChD,yDAAyD;4BACzD,gBAAgB,GAAG,cAAc,CAAC,MAAM,CAAC,cAAc,EAAE,GAAG,SAAS;4BACrE,qEAAqE,CACtE,CAAC;oBACJ,CAAC;oBAED,OAAO,sBAAsB,CAAC,cAAc,CAAC,CAAC;gBAChD,CAAC;gBAED,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAE,YAAY,CAAC,CAAC,CAAc,CAAC,CAAC,CAAC,IAAI,CAAC;gBACpE,IAAI,UAAU,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACrE,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;oBACxC,MAAM,qBAAqB,GAAG,CAAC,UAAU,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;yBAChE,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;oBACvD,IAAI,qBAAqB,EAAE,CAAC;wBAC1B,MAAM,IAAI,qBAAY,CAAC,0CAA0C,CAAC,CAAC;oBACrE,CAAC;gBACH,CAAC;gBAED,MAAM,WAAW,GAAG,UAAU;oBAC5B,CAAC,CAAE,SAAsB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;oBAC1F,CAAC,CAAE,YAAY,CAAC,CAAC,CAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,SAAS,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC1E,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,CAAC;gBAC9E,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;gBACnE,IAAI,OAAO,IAAI,QAAQ,CAAC,MAAM,GAAG,OAAO,EAAE,CAAC;oBACzC,MAAM,IAAI,mBAAU,CAClB,qCAAqC,OAAO,OAAO,EACnD,OAAO,EACP,QAAQ,CAAC,MAAM,CAChB,CAAC;gBACJ,CAAC;gBACD,MAAM,WAAW,GAAG,QAAQ,CAAC;gBAE7B,MAAM,OAAO,GAAa,EAAE,CAAC;gBAC7B,KAAK,IAAI,QAAQ,GAAG,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC;oBACjE,MAAM,GAAG,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;oBAClC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBAC5C,SAAS;oBACX,CAAC;oBACD,IAAI,SAAS,GAAG,GAAG,CAAC;oBACpB,IAAI,SAAS,CAAC,MAAM,KAAK,WAAW,CAAC,MAAM,EAAE,CAAC;wBAC5C,IAAI,SAAS,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;4BAC1C,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,aAAa,EAAE,CAAC;gCAC9C,MAAM,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC;gCAC5D,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC;gCACzD,OAAO,CAAC,IAAI,CAAC,gBAAgB,UAAU,KAAK,UAAU,uBAAuB,CAAC,CAAC;4BACjF,CAAC;4BACD,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;wBACrD,CAAC;6BAAM,CAAC;4BACN,OAAO,SAAS,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;gCAC7C,SAAS,CAAC,IAAI,CAAC,SAAgB,CAAC,CAAC;4BACnC,CAAC;wBACH,CAAC;oBACH,CAAC;oBAED,MAAM,GAAG,GAAc,EAAE,CAAC;oBAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;wBAC7C,IAAI,KAAK,GAAQ,SAAS,CAAC,CAAC,CAAC,CAAC;wBAC9B,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;wBAC9B,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;oBAC/B,CAAC;oBACD,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACpB,CAAC;gBAED,MAAM,YAAY,GAAG,eAAe;oBAClC,CAAC,CAAC,iBAAiB,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,eAAe,EAAE,CAAC;oBAC/D,CAAC,CAAC,OAAO,CAAC;gBACZ,MAAM,cAAc,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;gBAEtF,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,cAAc,CAAC,MAAM,GAAG,WAAW,EAAE,CAAC;oBACxE,MAAM,IAAI,mBAAU,CAClB,2CAA2C,WAAW,OAAO,EAC7D,WAAW,EACX,cAAc,CAAC,MAAM,CACtB,CAAC;gBACJ,CAAC;gBACD,IAAI,sBAAsB;uBACrB,cAAc,CAAC,MAAM,GAAG,sBAAsB;uBAC9C,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,MAAM,EAAE,CAAC;oBACxC,OAAO,CAAC,IAAI,CACV,gDAAgD;wBAChD,yDAAyD;wBACzD,gBAAgB,GAAG,cAAc,CAAC,MAAM,CAAC,cAAc,EAAE,GAAG,SAAS;wBACrE,qEAAqE,CACtE,CAAC;gBACJ,CAAC;gBAED,OAAO,sBAAsB,CAAC,cAAc,CAAC,CAAC;YAChD,CAAC;YAAC,OAAO,KAAc,EAAE,CAAC;gBACxB,IAAI,KAAK,YAAY,mBAAU,EAAE,CAAC;oBAChC,MAAM,KAAK,CAAC;gBACd,CAAC;gBAED,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC5E,OAAO,CAAC,IAAI,CAAC,4DAA4D,EAAE,YAAY,CAAC,CAAC;YAC3F,CAAC;QACH,CAAC;QAGD,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAE9E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,EAAE,CAAC;QACZ,CAAC;QAGD,IAAI,aAAa,GAAG,KAAK,CAAC;QAC1B,IAAI,OAAO,IAAI,KAAK,CAAC,MAAM,GAAG,OAAO,EAAE,CAAC;YACtC,MAAM,IAAI,mBAAU,CAClB,qCAAqC,OAAO,OAAO,EACnD,OAAO,EACP,KAAK,CAAC,MAAM,CACb,CAAC;QACJ,CAAC;QAGD,IAAI,OAAO,GAAa,EAAE,CAAC;QAC3B,IAAI,QAAQ,GAAG,aAAa,CAAC;QAE7B,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,UAAU,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;YACpC,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC5D,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACpC,CAAC;aAAM,CAAC;YAEN,MAAM,QAAQ,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACzE,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,SAAS,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7D,CAAC;QAED,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,WAAW,EAAE,CAAC;YAClE,MAAM,IAAI,mBAAU,CAClB,2CAA2C,WAAW,OAAO,EAC7D,WAAW,EACX,QAAQ,CAAC,MAAM,CAChB,CAAC;QACJ,CAAC;QAED,IAAI,sBAAsB;eACrB,QAAQ,CAAC,MAAM,GAAG,sBAAsB;eACxC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,MAAM,EAAE,CAAC;YACxC,OAAO,CAAC,IAAI,CACV,gDAAgD;gBAChD,yDAAyD;gBACzD,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,GAAG,SAAS;gBAC/D,qEAAqE,CACtE,CAAC;QACJ,CAAC;QAGD,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,CAAC;QAExE,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,aAAa,GAAa,EAAE,CAAC;YACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACzC,IAAI,OAAO,IAAI,aAAa,CAAC,MAAM,IAAI,OAAO,EAAE,CAAC;oBAC/C,MAAM;gBACR,CAAC;gBACD,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;gBACzB,MAAM,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBAC9C,IAAI,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;gBAClE,IAAI,MAAM,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM,EAAE,CAAC;oBAC1C,IAAI,MAAM,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC;wBACxC,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,aAAa,EAAE,CAAC;4BAC9C,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC;4BACvD,OAAO,CAAC,IAAI,CAAC,gBAAgB,UAAU,KAAK,UAAU,uBAAuB,CAAC,CAAC;wBACjF,CAAC;wBACD,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;oBAChD,CAAC;yBAAM,CAAC;wBACN,OAAO,MAAM,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC;4BAC3C,MAAM,CAAC,IAAI,CAAC,SAAgB,CAAC,CAAC;wBAChC,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACnE,CAAC;YACD,OAAO,sBAAsB,CAAC,aAAa,CAAC,CAAC;QAC/C,CAAC;QAGD,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,MAAM,cAAc,GAAG,CAAC,KAAY,EAAE,IAAY,EAAE,UAAkB,EAAW,EAAE;YACjF,IAAI,KAAK,YAAY,mBAAU,EAAE,CAAC;gBAChC,MAAM,KAAK,CAAC;YACd,CAAC;YACD,IAAI,YAAY,EAAE,CAAC;gBACjB,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;YACxC,CAAC;YACD,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;gBACvB,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,MAAM,EAAE,CAAC;oBACvC,OAAO,CAAC,IAAI,CAAC,gBAAgB,UAAU,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC/D,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;gBACvB,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC,CAAC;QAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC9C,IAAI,CAAC;gBACH,IAAI,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;gBAGlE,IAAI,MAAM,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM,EAAE,CAAC;oBAC1C,IAAI,MAAM,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC;wBACxC,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,aAAa,EAAE,CAAC;4BAC9C,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC;4BACvD,OAAO,CAAC,IAAI,CAAC,gBAAgB,UAAU,KAAK,UAAU,uBAAuB,CAAC,CAAC;wBACjF,CAAC;wBACD,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;oBAChD,CAAC;yBAAM,CAAC;wBACN,OAAO,MAAM,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC;4BAC3C,MAAM,CAAC,IAAI,CAAC,SAAgB,CAAC,CAAC;wBAChC,CAAC;oBACH,CAAC;gBACH,CAAC;gBAGD,MAAM,GAAG,GAAc,EAAE,CAAC;gBAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC7C,IAAI,KAAK,GAAQ,MAAM,CAAC,CAAC,CAAC,CAAC;oBAG3B,IAAI,YAAY,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;wBACjE,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;oBACxB,CAAC;oBAGD,IAAI,aAAa,EAAE,CAAC;wBAClB,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;wBAC/C,IAAI,UAAU,KAAK,MAAM,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;4BACpD,KAAK,GAAG,UAAU,KAAK,MAAM,CAAC;wBAChC,CAAC;oBACH,CAAC;oBAED,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;gBAC/B,CAAC;gBAGD,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACpB,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,IAAI,cAAc,CAAC,KAAc,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC;oBACrD,SAAS;gBACX,CAAC;YACH,CAAC;QACH,CAAC;QAGD,MAAM,YAAY,GAAG,eAAe;YAClC,CAAC,CAAC,iBAAiB,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,eAAe,EAAE,CAAC;YAC/D,CAAC,CAAC,OAAO,CAAC;QACZ,MAAM,cAAc,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;QACtF,OAAO,sBAAsB,CAAC,cAAc,CAAC,CAAC;IAChD,CAAC,EAAE,eAAe,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;AACjD,CAAC;AAKD,SAAS,YAAY,CACnB,IAAY,EACZ,SAAiB,EACjB,IAAa,EACb,UAAmB;IAEnB,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,YAAY,GAAG,EAAE,CAAC;IACtB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,SAAS,GAAG,GAAG,CAAC;IACpB,IAAI,UAAU,GAAG,KAAK,CAAC;IAEvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAExD,IAAI,UAAU,EAAE,CAAC;YACf,YAAY,IAAI,IAAI,CAAC;YACrB,UAAU,GAAG,KAAK,CAAC;YACnB,SAAS;QACX,CAAC;QAED,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,UAAU,GAAG,IAAI,CAAC;YAClB,SAAS;QACX,CAAC;QAED,IAAI,CAAC,QAAQ,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;YACvD,YAAY,GAAG,EAAE,CAAC;QACpB,CAAC;aAAM,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACvD,QAAQ,GAAG,IAAI,CAAC;YAChB,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC;aAAM,IAAI,QAAQ,IAAI,IAAI,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YACpE,YAAY,IAAI,IAAI,CAAC;YACrB,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC1B,QAAQ,GAAG,KAAK,CAAC;YACnB,CAAC;YACD,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,IAAI,QAAQ,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YAC1C,QAAQ,GAAG,KAAK,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,YAAY,IAAI,IAAI,CAAC;QACvB,CAAC;IACH,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,YAAY,IAAI,IAAI,CAAC;IACvB,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IAEvD,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,qBAAY,CAAC,cAAc,CAC/B,UAAU,IAAI,IAAI,EAClB,IAAI,EACJ,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CACvB,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,YAAY,CAAC,KAAU;IAC9B,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;AAC/D,CAAC;AAED,SAAS,YAAY,CAAC,KAAU;IAC9B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACrB,KAAK,EAAE,CAAC;QACV,CAAC;IACH,CAAC;IACD,OAAO,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,YAAY,CAAC,KAAU;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAU;IACxC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC9C,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QACnD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAG9C,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACpE,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACrF,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAc,EAAE,OAAiB;IAC3D,MAAM,UAAU,GAAc,EAAE,CAAC;IACjC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;IACxF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,sBAAsB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;QACtD,IAAI,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YAChD,UAAU,CAAC,MAAM,CAAC,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;QACtD,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;QACjC,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAU;IACrC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;QACnB,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAU;IACpC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,0DAA0D,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,UAAU,CAAC,KAAU;IAC5B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,oCAAoC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACvF,CAAC;AAED,SAAS,iBAAiB,CACxB,IAAc,EACd,OAAiB,EACjB,UAAyC,EAAE;IAE3C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IACnC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,OAAO,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAc,CAAC;QACrC,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACjB,KAAK,EAAE,CAAC;YACR,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;QACpD,IAAI,YAAY,GAAG,CAAC,CAAC,CAAC;QACtB,KAAK,IAAI,CAAC,GAAG,WAAW,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7B,YAAY,GAAG,CAAC,CAAC;gBACjB,MAAM;YACR,CAAC;QACH,CAAC;QAED,MAAM,YAAY,GAAG,WAAW,GAAG,CAAC,GAAG,YAAY,CAAC;QACpD,IAAI,YAAY,IAAI,CAAC,IAAI,YAAY,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YACrE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAc,CAAC;YAC7C,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAC3C,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC5D,MAAM,iBAAiB,GAAG,UAAU;qBACjC,KAAK,CAAC,WAAW,GAAG,YAAY,CAAC;qBACjC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;gBAEzC,MAAM,UAAU,GAAG,UAAU;qBAC1B,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC;qBACtB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC3C,MAAM,WAAW,GAAG,iBAAiB;uBAChC,UAAU,CAAC,MAAM,GAAG,CAAC;uBACrB,CAAC,YAAY,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,YAAY,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBAEhF,IAAI,WAAW,EAAE,CAAC;oBAChB,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;oBAE1D,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACxB,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;wBACpF,MAAM,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACxF,CAAC;oBAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC;wBACtC,MAAM,CAAC,YAAY,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;oBAC9D,CAAC;oBAED,MAAM,SAAS,GAAc,EAAE,CAAC;oBAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;wBACrC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;oBACpC,CAAC;oBAED,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBACvB,KAAK,IAAI,CAAC,CAAC;oBACX,SAAS;gBACX,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAc,CAAC;YAC7C,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpC,MAAM,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9C,MAAM,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9C,MAAM,oBAAoB,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;uBAC/C,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;uBACvB,UAAU,CAAC,OAAO,CAAC;uBACnB,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,IAAI,kBAAkB,CAAC,iBAAiB,CAAC,CAAC,CAAC;gBAEtF,IAAI,oBAAoB,EAAE,CAAC;oBACzB,MAAM,YAAY,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;yBACvE,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;yBACvC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;oBACjC,MAAM,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAGpC,IAAI,MAAM,GAAG,YAAY,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;oBAC9E,IAAI,MAAM,GAAG,YAAY,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;oBAE9E,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;oBACxC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;oBACxC,MAAM,MAAM,GAAG,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC3E,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;oBACrC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;oBAE5B,MAAM,SAAS,GAAc,EAAE,CAAC;oBAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;wBACrC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;oBACpC,CAAC;oBAED,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBACvB,KAAK,IAAI,CAAC,CAAC;oBACX,SAAS;gBACX,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjB,KAAK,EAAE,CAAC;IACV,CAAC;IAED,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;QAC5B,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAKM,KAAK,UAAU,cAAc,CAClC,GAAW,EACX,UAAiC,EAAE;IAEnC,OAAO,IAAA,yBAAgB,EAAC,KAAK,IAAI,EAAE;QAGjC,MAAM,EAAE,UAAU,GAAG,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,WAAW,EAAE,GAAG,OAAO,CAAC;QAI3F,OAAO,SAAS,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IACrC,CAAC,EAAE,eAAe,EAAE,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC,CAAC;AACtD,CAAC;AAKD,QAAe,CAAC,CAAC,iBAAiB,CAChC,GAAW,EACX,UAA4B,EAAE;IAG9B,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAE/B,MAAM,IAAI,GAAG,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAEnE,MAAM,EACJ,SAAS,EACT,UAAU,GAAG,IAAI,EACjB,UAAU,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,EAClC,UAAU,GAAG,IAAI,EACjB,SAAS,GAAG,EAAE,EACd,IAAI,GAAG,IAAI,EACX,YAAY,GAAG,KAAK,EACpB,aAAa,GAAG,KAAK,EACrB,OAAO,EACP,WAAW,GAAG,IAAI,EAClB,YAAY,GAAG,SAAS,EACxB,SAAS,EACT,KAAK,EACL,QAAQ,GAAG,IAAI,EACf,KAAK,EACL,OAAO,GAAG,OAAO,EACjB,YAAY,EACZ,eAAe,GAAG,IAAI,EACtB,eAAe,GAAG,IAAI,EACtB,sBAAsB,GAAG,OAAO,EAChC,WAAW,GAAG,OAAO,EACtB,GAAG,IAAI,CAAC;IAET,MAAM,iBAAiB,GAAG,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,IAAI,CAAC;IACxE,MAAM,cAAc,GAAG,KAAK,EAAE,cAAc,YAAY,gCAAc;QACpE,CAAC,CAAC,KAAK,CAAC,cAAc;QACtB,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,YAAY,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAGvC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;QAChB,OAAO;IACT,CAAC;IAGD,MAAM,aAAa,GAAG,IAAA,6BAAiB,EAAC,GAAG,CAAC,CAAC;IAC7C,IAAI,YAAY,GAAG,aAAa,CAAC;IACjC,IAAI,cAAc,EAAE,CAAC;QACnB,YAAY,GAAG,cAAc,CAAC,kBAAkB,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IAC/E,CAAC;IACD,IAAI,KAAK,EAAE,aAAa,EAAE,CAAC;QACzB,YAAY,GAAG,KAAK,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IACzD,CAAC;IAGD,IAAI,cAAc,GAAG,SAAS,CAAC;IAC/B,IAAI,CAAC,cAAc,IAAI,UAAU,EAAE,CAAC;QAClC,MAAM,UAAU,GAAG,KAAK,YAAY,gCAAc,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAAC;QAClF,cAAc,GAAG,mBAAmB,CAAC,YAAY,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;IAClG,CAAC;IAED,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,cAAc,GAAG,GAAG,CAAC;IACvB,CAAC;IACD,IAAI,CAAC,iBAAiB,IAAI,UAAU,EAAE,CAAC;QACrC,MAAM,UAAU,GAAG,KAAK,YAAY,gCAAc,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAAC;QAClF,MAAM,OAAO,GAAG,6BAA6B,CAAC,YAAY,EAAE,cAAc,EAAE,UAAU,CAAC,IAAI,cAAc,CAAC;QAC1G,IAAI,OAAO,KAAK,cAAc,IAAI,QAAQ,IAAI,UAAU,EAAE,CAAC;YACzD,UAAU,CAAC,GAAG,CAAC,YAAY,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;QACpD,CAAC;QACD,cAAc,GAAG,OAAO,CAAC;IAC3B,CAAC;IAED,MAAM,gBAAgB,GAAG,CAAC,GAAc,EAAE,KAAa,EAAa,EAAE;QACpE,IAAI,MAAM,GAAc,GAAG,CAAC;QAC5B,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,GAAG,cAAc,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAc,CAAC;QAChF,CAAC;QACD,IAAI,KAAK,EAAE,MAAM,EAAE,CAAC;YAClB,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAc,CAAC;QAClE,CAAC;QACD,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,CAAC,KAAU,EAAO,EAAE;QACzC,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,IAAI,IAAI,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;YAC3C,UAAU,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;QACjC,CAAC;QACD,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;YACnC,IAAI,UAAU,KAAK,EAAE,EAAE,CAAC;gBACtB,OAAO,IAAI,CAAC;YACd,CAAC;YACD,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnD,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACtC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;gBACzD,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBAC7B,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;oBACrF,UAAU,GAAG,SAAS,CAAC;gBACzB,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,YAAY,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;YACnD,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAChC,IAAI,CAAC,SAAS,IAAI,GAAG,IAAI,SAAS,IAAI,GAAG,CAAC,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;gBAC1G,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;gBACpC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC5B,UAAU,GAAG,QAAQ,CAAC;gBACxB,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,aAAa,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;YACpD,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAChC,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;gBACrF,MAAM,UAAU,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;gBAC5C,IAAI,UAAU,KAAK,MAAM,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;oBACpD,UAAU,GAAG,UAAU,KAAK,MAAM,CAAC;gBACrC,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,CAAC,KAAY,EAAE,IAAY,EAAE,UAAkB,EAAW,EAAE;QACjF,IAAI,KAAK,YAAY,mBAAU,EAAE,CAAC;YAChC,MAAM,KAAK,CAAC;QACd,CAAC;QACD,IAAI,YAAY,EAAE,CAAC;YACjB,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;YACvB,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,MAAM,EAAE,CAAC;gBACvC,OAAO,CAAC,IAAI,CAAC,gBAAgB,UAAU,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC/D,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC,CAAC;IAEF,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,MAAM,cAAc,GAAG,GAAG,EAAE;QAC1B,IAAI,OAAO,IAAI,QAAQ,IAAI,OAAO,EAAE,CAAC;YACnC,MAAM,IAAI,mBAAU,CAClB,qCAAqC,OAAO,OAAO,EACnD,OAAO,EACP,QAAQ,GAAG,CAAC,CACb,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,qBAAqB,GAAG,sBAAsB,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,MAAM,CAAC;IAC3F,IAAI,iBAAiB,GAAG,KAAK,CAAC;IAE9B,IAAI,oBAAoB,IAAI,OAAQ,oBAA4B,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;QAC5F,MAAM,cAAc,GAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC;QAC1D,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,cAAc,CAAC,WAAW,GAAG,UAAU,CAAC;QAC1C,CAAC;QAED,MAAM,WAAW,GAAI,oBAA4B,CAAC,WAAW,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;QAC5F,IAAI,OAAO,GAAa,EAAE,CAAC;QAC3B,IAAI,YAAY,GAAa,EAAE,CAAC;QAChC,IAAI,gBAAgB,GAAG,KAAK,CAAC;QAC7B,IAAI,UAAU,GAAqB,IAAI,CAAC;QAExC,IAAI,CAAC;YACH,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;gBAC9B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC5C,SAAS;gBACX,CAAC;gBAED,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBACtB,IAAI,UAAU,EAAE,CAAC;wBACf,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;wBAC/E,gBAAgB,GAAG,IAAI,CAAC;wBACxB,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,CAAC;wBACpE,SAAS;oBACX,CAAC;yBAAM,CAAC;wBACN,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,SAAS,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;wBACtD,gBAAgB,GAAG,IAAI,CAAC;wBACxB,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,CAAC;oBACtE,CAAC;gBACH,CAAC;gBAED,IAAI,OAAO,IAAI,QAAQ,IAAI,OAAO,EAAE,CAAC;oBACnC,MAAM,IAAI,mBAAU,CAClB,qCAAqC,OAAO,OAAO,EACnD,OAAO,EACP,QAAQ,GAAG,CAAC,CACb,CAAC;gBACJ,CAAC;gBAED,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,QAAQ,GAAG,CAAC,GAAG,WAAW,EAAE,CAAC;oBAC/D,MAAM,IAAI,mBAAU,CAClB,2CAA2C,WAAW,OAAO,EAC7D,WAAW,EACX,QAAQ,GAAG,CAAC,CACb,CAAC;gBACJ,CAAC;gBAED,IAAI,CAAC,iBAAiB,IAAI,qBAAqB,IAAI,QAAQ,GAAG,CAAC,GAAG,sBAAsB,EAAE,CAAC;oBACzF,iBAAiB,GAAG,IAAI,CAAC;oBACzB,OAAO,CAAC,IAAI,CACV,gDAAgD;wBAChD,yDAAyD;wBACzD,gBAAgB,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,cAAc,EAAE,GAAG,SAAS;wBAC9D,qEAAqE,CACtE,CAAC;gBACJ,CAAC;gBAED,IAAI,MAAM,GAAG,GAAG,CAAC;gBACjB,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC;oBACrC,IAAI,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;wBACnC,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,aAAa,EAAE,CAAC;4BAC9C,MAAM,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC;4BAC5D,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC;4BACvD,OAAO,CAAC,IAAI,CAAC,gBAAgB,UAAU,KAAK,UAAU,uBAAuB,CAAC,CAAC;wBACjF,CAAC;wBACD,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;oBAC3C,CAAC;yBAAM,CAAC;wBACN,OAAO,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;4BACtC,MAAM,CAAC,IAAI,CAAC,SAAgB,CAAC,CAAC;wBAChC,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;oBAC/B,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;oBACnD,QAAQ,EAAE,CAAC;oBACX,SAAS;gBACX,CAAC;gBAED,MAAM,MAAM,GAAc,EAAE,CAAC;gBAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC7C,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtD,CAAC;gBAED,IAAI,eAAe,EAAE,CAAC;oBACpB,IAAI,CAAC,UAAU,EAAE,CAAC;wBAChB,UAAU,GAAG,MAAM,CAAC;wBACpB,SAAS;oBACX,CAAC;oBAED,MAAM,YAAY,GAAG,iBAAiB,CAAC,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,YAAY,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC;oBAChG,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBAC9B,cAAc,EAAE,CAAC;wBACjB,MAAM,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;wBAClD,QAAQ,EAAE,CAAC;wBACX,UAAU,GAAG,IAAI,CAAC;wBAClB,SAAS;oBACX,CAAC;oBAED,cAAc,EAAE,CAAC;oBACjB,MAAM,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;oBAClD,QAAQ,EAAE,CAAC;oBACX,UAAU,GAAG,YAAY,CAAC,CAAC,CAAc,CAAC;gBAC5C,CAAC;qBAAM,CAAC;oBACN,MAAM,aAAa,GAAG,eAAe,CAAC,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;oBAC1F,cAAc,EAAE,CAAC;oBACjB,MAAM,gBAAgB,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;oBAChD,QAAQ,EAAE,CAAC;gBACb,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,2BAA2B,EAAE,CAAC;gBACxD,MAAM,qBAAY,CAAC,cAAc,CAAC,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC;YAC9D,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QAED,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,WAAW,GAAG,iBAAiB,CAAC,CAAC,UAAU,CAAC,EAAE,YAAY,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC;YACvF,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;gBAC9B,cAAc,EAAE,CAAC;gBACjB,MAAM,gBAAgB,CAAC,GAAgB,EAAE,QAAQ,CAAC,CAAC;gBACnD,QAAQ,EAAE,CAAC;YACb,CAAC;YACD,UAAU,GAAG,IAAI,CAAC;QACpB,CAAC;QAED,OAAO;IACT,CAAC;IAGD,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE9E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO;IACT,CAAC;IAGD,IAAI,OAAO,GAAa,EAAE,CAAC;IAC3B,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5B,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC5D,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;SAAM,CAAC;QAEN,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACjE,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,SAAS,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7D,CAAC;IAGD,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,CAAC;IAIxE,IAAI,UAAU,GAAqB,IAAI,CAAC;IAExC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAEzC,IAAI,OAAO,IAAI,QAAQ,IAAI,OAAO,EAAE,CAAC;YACnC,MAAM,IAAI,mBAAU,CAClB,qCAAqC,OAAO,OAAO,EACnD,OAAO,EACP,QAAQ,GAAG,CAAC,CACb,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC9C,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,QAAQ,GAAG,CAAC,GAAG,WAAW,EAAE,CAAC;YAC/D,MAAM,IAAI,mBAAU,CAClB,2CAA2C,WAAW,OAAO,EAC7D,WAAW,EACX,QAAQ,GAAG,CAAC,CACb,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,iBAAiB,IAAI,qBAAqB,IAAI,QAAQ,GAAG,CAAC,GAAG,sBAAsB,EAAE,CAAC;YACzF,iBAAiB,GAAG,IAAI,CAAC;YACzB,OAAO,CAAC,IAAI,CACV,gDAAgD;gBAChD,yDAAyD;gBACzD,gBAAgB,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,cAAc,EAAE,GAAG,SAAS;gBAC9D,qEAAqE,CACtE,CAAC;QACJ,CAAC;QACD,IAAI,CAAC;YACH,IAAI,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;YAGhE,IAAI,MAAM,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM,EAAE,CAAC;gBAC1C,IAAI,MAAM,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC;oBACxC,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,aAAa,EAAE,CAAC;wBAC9C,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC;wBACvD,OAAO,CAAC,IAAI,CAAC,gBAAgB,UAAU,KAAK,UAAU,uBAAuB,CAAC,CAAC;oBACjF,CAAC;oBACD,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;gBAChD,CAAC;qBAAM,CAAC;oBACN,OAAO,MAAM,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC;wBAC3C,MAAM,CAAC,IAAI,CAAC,SAAgB,CAAC,CAAC;oBAChC,CAAC;gBACH,CAAC;YACH,CAAC;YAEH,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;gBAC/B,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;gBACnD,QAAQ,EAAE,CAAC;gBACX,SAAS;YACX,CAAC;YAGD,MAAM,GAAG,GAAc,EAAE,CAAC;YAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7C,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBACxC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;YAC/B,CAAC;YAED,IAAI,eAAe,EAAE,CAAC;gBACpB,IAAI,CAAC,UAAU,EAAE,CAAC;oBAChB,UAAU,GAAG,GAAG,CAAC;oBACjB,SAAS;gBACX,CAAC;gBAED,MAAM,YAAY,GAAG,iBAAiB,CAAC,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,YAAY,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC;gBAC7F,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC9B,cAAc,EAAE,CAAC;oBACjB,MAAM,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;oBAClD,QAAQ,EAAE,CAAC;oBACX,UAAU,GAAG,IAAI,CAAC;oBAClB,SAAS;gBACX,CAAC;gBAED,cAAc,EAAE,CAAC;gBACjB,MAAM,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;gBAClD,QAAQ,EAAE,CAAC;gBACX,UAAU,GAAG,YAAY,CAAC,CAAC,CAAc,CAAC;YAC5C,CAAC;iBAAM,CAAC;gBACN,MAAM,aAAa,GAAG,eAAe,CAAC,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;gBACpF,cAAc,EAAE,CAAC;gBACjB,MAAM,gBAAgB,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;gBAChD,QAAQ,EAAE,CAAC;YACb,CAAC;QACH,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,cAAc,CAAC,KAAc,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC;gBACrD,SAAS;YACX,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,WAAW,GAAG,iBAAiB,CAAC,CAAC,UAAU,CAAC,EAAE,YAAY,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC;QACvF,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAC9B,cAAc,EAAE,CAAC;YACjB,MAAM,gBAAgB,CAAC,GAAgB,EAAE,QAAQ,CAAC,CAAC;YACnD,QAAQ,EAAE,CAAC;QACb,CAAC;QACD,UAAU,GAAG,IAAI,CAAC;IACpB,CAAC;AACH,CAAC;AAMD,SAAS,mBAAmB,CAAC,QAAgB;IAC3C,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC3D,MAAM,IAAI,wBAAe,CAAC,sCAAsC,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,wBAAe,CAAC,+BAA+B,CAAC,CAAC;IAC7D,CAAC;IAGD,MAAM,cAAc,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;IAGvC,IAAI,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAClE,MAAM,IAAI,sBAAa,CAAC,iDAAiD,CAAC,CAAC;IAC7E,CAAC;IAGD,MAAM,mBAAmB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IAC3E,MAAM,SAAS,GAAG,cAAc,CAAC,WAAW,EAAE,CAAC;IAC/C,KAAK,MAAM,GAAG,IAAI,mBAAmB,EAAE,CAAC;QACtC,IAAI,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,sBAAa,CAAC,2BAA2B,GAAG,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,OAAO,cAAc,CAAC;AACxB,CAAC;AAKM,KAAK,UAAU,aAAa,CACjC,QAAgB,EAChB,UAAyD,EAAE;IAE3D,OAAO,IAAA,yBAAgB,EAAC,KAAK,IAAI,EAAE;QACjC,MAAM,EAAE,YAAY,GAAG,IAAI,EAAE,GAAG,UAAU,EAAE,GAAG,OAAO,CAAC;QACvD,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAGzB,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QAEzE,IAAI,CAAC;YAEH,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAGhE,OAAO,SAAS,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAEpB,IAAI,KAAK,YAAY,qBAAY,IAAI,KAAK,YAAY,wBAAe,IAAI,KAAK,YAAY,mBAAU,EAAE,CAAC;gBACrG,MAAM,KAAK,CAAC;YACd,CAAC;YAGD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC5B,MAAM,IAAI,wBAAe,CAAC,mBAAmB,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC;YAClE,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC5B,MAAM,IAAI,wBAAe,CAAC,sBAAsB,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC;YACrE,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC5B,MAAM,IAAI,wBAAe,CAAC,wBAAwB,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC;YACvE,CAAC;YAED,MAAM,IAAI,wBAAe,CAAC,4BAA4B,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;QAChF,CAAC;IACH,CAAC,EAAE,mBAAmB,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC,CAAC;AACzD,CAAC;AASD,SAAgB,iBAAiB,CAC/B,QAAgB,EAChB,UAAyD,EAAE;IAE3D,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAGzB,MAAM,EAAE,YAAY,GAAG,IAAI,EAAE,GAAG,UAAU,EAAE,GAAG,OAAO,CAAC;IACvD,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAEzE,IAAI,CAAC;QAEH,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAGrD,OAAO,SAAS,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QAEpB,IAAI,KAAK,YAAY,qBAAY,IAAI,KAAK,YAAY,wBAAe,IAAI,KAAK,YAAY,mBAAU,EAAE,CAAC;YACrG,MAAM,KAAK,CAAC;QACd,CAAC;QAGD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,IAAI,wBAAe,CAAC,mBAAmB,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,IAAI,wBAAe,CAAC,sBAAsB,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC;QACrE,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,IAAI,wBAAe,CAAC,wBAAwB,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC;QACvE,CAAC;QAED,MAAM,IAAI,wBAAe,CAAC,4BAA4B,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;IAChF,CAAC;AACH,CAAC;AAMD,SAAgB,oBAAoB;IAClC,OAAO,IAAI,gCAAc,EAAE,CAAC;AAC9B,CAAC;AAOD,SAAgB,oBAAoB,CAAC,UAAkB,GAAG;IACxD,OAAO,IAAI,gCAAc,CAAC,OAAO,CAAC,CAAC;AACrC,CAAC;AAMD,SAAgB,sBAAsB;IACpC,OAAO,oBAAoB,CAAC,QAAQ,EAAE,CAAC;AACzC,CAAC;AAKD,SAAgB,mBAAmB;IACjC,oBAAoB,CAAC,KAAK,EAAE,CAAC;AAC/B,CAAC","sourcesContent":["/**\r\n * CSV to JSON Converter - TypeScript Module\r\n * \r\n * A lightweight, efficient module for converting CSV data to JSON format\r\n * with proper parsing and error handling.\r\n */\r\n\r\nimport {\r\n ValidationError,\r\n SecurityError,\r\n FileSystemError,\r\n ParsingError,\r\n LimitError,\r\n ConfigurationError,\r\n safeExecuteSync,\r\n safeExecuteAsync,\r\n ErrorCode\r\n} from './errors';\r\n\r\nimport { TransformHooks, predefinedHooks } from './src/core/transform-hooks';\r\nimport { DelimiterCache } from './src/core/delimiter-cache';\r\nimport FastPathEngine from './src/engines/fast-path-engine';\r\nimport { stripBomFromString, normalizeCsvInput } from './src/utils/bom-utils';\r\nimport { CsvToJsonOptions, AsyncCsvToJsonOptions, AnyObject, AnyArray } from './src/types';\r\n\r\n// Глобальный экземпляр кэша для авто-детектирования разделителя\r\nconst globalDelimiterCache = new DelimiterCache(100);\r\nconst globalFastPathEngine = new FastPathEngine();\r\n\r\n/**\r\n * Validates CSV input and options\r\n * @private\r\n */\r\nfunction validateCsvInput(csv: string, options?: CsvToJsonOptions): boolean {\r\n // Validate CSV input\r\n if (typeof csv !== 'string') {\r\n throw new ValidationError('Input must be a CSV string');\r\n }\r\n \r\n // Validate options\r\n if (options && typeof options !== 'object') {\r\n throw new ConfigurationError('Options must be an object');\r\n }\r\n \r\n // Validate delimiter\r\n if (options?.delimiter && typeof options.delimiter !== 'string') {\r\n throw new ConfigurationError('Delimiter must be a string');\r\n }\r\n \r\n if (options?.delimiter && options.delimiter.length !== 1) {\r\n throw new ConfigurationError('Delimiter must be a single character');\r\n }\r\n \r\n // Validate autoDetect\r\n if (options?.autoDetect !== undefined && typeof options.autoDetect !== 'boolean') {\r\n throw new ConfigurationError('autoDetect must be a boolean');\r\n }\r\n \r\n // Validate candidates\r\n if (options?.candidates && !Array.isArray(options.candidates)) {\r\n throw new ConfigurationError('candidates must be an array');\r\n }\r\n \r\n // Validate maxRows\r\n if (options?.maxRows !== undefined && (typeof options.maxRows !== 'number' || options.maxRows <= 0)) {\r\n throw new ConfigurationError('maxRows must be a positive number');\r\n }\r\n \r\n // Validate cache options\r\n if (options?.useCache !== undefined && typeof options.useCache !== 'boolean') {\r\n throw new ConfigurationError('useCache must be a boolean');\r\n }\r\n \r\n if (options?.cache && !(options.cache instanceof DelimiterCache)) {\r\n throw new ConfigurationError('cache must be an instance of DelimiterCache');\r\n }\r\n\r\n if (options?.useFastPath !== undefined && typeof options.useFastPath !== 'boolean') {\r\n throw new ConfigurationError('useFastPath must be a boolean');\r\n }\r\n\r\n if (options?.fastPathMode !== undefined\r\n && options.fastPathMode !== 'objects'\r\n && options.fastPathMode !== 'compact'\r\n && options.fastPathMode !== 'stream') {\r\n throw new ConfigurationError('fastPathMode must be \"objects\", \"compact\", or \"stream\"');\r\n }\r\n\r\n if (options?.memoryWarningThreshold !== undefined) {\r\n if (typeof options.memoryWarningThreshold !== 'number' || options.memoryWarningThreshold <= 0) {\r\n throw new ConfigurationError('memoryWarningThreshold must be a positive number');\r\n }\r\n }\r\n\r\n if (options?.memoryLimit !== undefined) {\r\n if (typeof options.memoryLimit !== 'number') {\r\n throw new ConfigurationError('memoryLimit must be a number');\r\n }\r\n if (options.memoryLimit !== Infinity && options.memoryLimit <= 0) {\r\n throw new ConfigurationError('memoryLimit must be a positive number or Infinity');\r\n }\r\n }\r\n\r\n if (options?.onError !== undefined\r\n && !['skip', 'warn', 'throw'].includes(options.onError)) {\r\n throw new ConfigurationError('onError must be \"skip\", \"warn\", or \"throw\"');\r\n }\r\n\r\n if (options?.errorHandler !== undefined && typeof options.errorHandler !== 'function') {\r\n throw new ConfigurationError('errorHandler must be a function');\r\n }\r\n\r\n // Validate hooks\r\n if (options?.hooks) {\r\n if (typeof options.hooks !== 'object') {\r\n throw new ConfigurationError('hooks must be an object');\r\n }\r\n \r\n if (options.hooks.beforeConvert && typeof options.hooks.beforeConvert !== 'function') {\r\n throw new ConfigurationError('hooks.beforeConvert must be a function');\r\n }\r\n \r\n if (options.hooks.afterConvert && typeof options.hooks.afterConvert !== 'function') {\r\n throw new ConfigurationError('hooks.afterConvert must be a function');\r\n }\r\n \r\n if (options.hooks.perRow && typeof options.hooks.perRow !== 'function') {\r\n throw new ConfigurationError('hooks.perRow must be a function');\r\n }\r\n\r\n if (options.hooks.transformHooks\r\n && !(options.hooks.transformHooks instanceof TransformHooks)) {\r\n throw new ConfigurationError('hooks.transformHooks must be an instance of TransformHooks');\r\n }\r\n\r\n if (options.hooks.onError && typeof options.hooks.onError !== 'function') {\r\n throw new ConfigurationError('hooks.onError must be a function');\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\n/**\r\n * Auto-detects the delimiter from CSV content\r\n */\r\nexport function autoDetectDelimiter(\r\n csv: string,\r\n options: {\r\n candidates?: string[];\r\n useCache?: boolean;\r\n cache?: DelimiterCache;\r\n } | string[] = {}\r\n): string {\r\n if (!csv || typeof csv !== 'string' || csv.trim().length === 0) {\r\n return ';';\r\n }\r\n\r\n const resolvedOptions = Array.isArray(options)\r\n ? { candidates: options }\r\n : (options || {});\r\n\r\n const {\r\n candidates = [';', ',', '\\t', '|'],\r\n useCache = true,\r\n cache = globalDelimiterCache\r\n } = resolvedOptions;\r\n\r\n // Validate candidates\r\n if (!Array.isArray(candidates)) {\r\n throw new ConfigurationError('candidates must be an array');\r\n }\r\n\r\n for (const candidate of candidates) {\r\n if (typeof candidate !== 'string' || candidate.length !== 1) {\r\n throw new ConfigurationError('Each candidate must be a single character string');\r\n }\r\n }\r\n\r\n // Check cache if enabled\r\n if (useCache && cache) {\r\n const cached = cache.get(csv, candidates);\r\n if (cached !== null) {\r\n return cached;\r\n }\r\n }\r\n\r\n // Simple delimiter detection logic\r\n // Count occurrences of each candidate in the first few lines\r\n const sampleLines = csv.split('\\n').slice(0, 10).join('\\n');\r\n let bestDelimiter = candidates[0];\r\n let bestScore = -1;\r\n\r\n for (const delimiter of candidates) {\r\n let score = 0;\r\n \r\n // Count occurrences in sample\r\n for (let i = 0; i < sampleLines.length; i++) {\r\n if (sampleLines[i] === delimiter) {\r\n score++;\r\n }\r\n }\r\n \r\n // Bonus for consistent column count (only when delimiter appears)\r\n if (score > 0) {\r\n const lines = sampleLines.split('\\n').filter(line => line.trim().length > 0);\r\n if (lines.length > 1) {\r\n const firstLineColumns = lines[0].split(delimiter).length;\r\n let consistent = true;\r\n \r\n for (let i = 1; i < Math.min(lines.length, 5); i++) {\r\n if (lines[i].split(delimiter).length !== firstLineColumns) {\r\n consistent = false;\r\n break;\r\n }\r\n }\r\n \r\n if (consistent) {\r\n score += 100;\r\n }\r\n }\r\n }\r\n \r\n if (score > bestScore) {\r\n bestScore = score;\r\n bestDelimiter = delimiter;\r\n }\r\n }\r\n\r\n const resolvedDelimiter = bestScore > 0 ? bestDelimiter : ';';\r\n\r\n if (useCache && cache) {\r\n cache.set(csv, candidates, resolvedDelimiter);\r\n }\r\n\r\n return resolvedDelimiter;\r\n}\r\n\r\nfunction getFirstNonEmptyLine(csv: string): string | null {\r\n if (!csv || typeof csv !== 'string') {\r\n return null;\r\n }\r\n const lines = csv.split('\\n');\r\n for (const line of lines) {\r\n if (line.trim().length > 0) {\r\n return line;\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nfunction refineDelimiterFromHeaderLine(\r\n csv: string,\r\n currentDelimiter: string | undefined,\r\n candidates: string[]\r\n): string | undefined {\r\n if (!currentDelimiter) {\r\n return currentDelimiter;\r\n }\r\n const headerLine = getFirstNonEmptyLine(csv);\r\n if (!headerLine) {\r\n return currentDelimiter;\r\n }\r\n const currentCount = headerLine.split(currentDelimiter).length - 1;\r\n if (currentCount > 0) {\r\n return currentDelimiter;\r\n }\r\n let bestDelimiter = currentDelimiter;\r\n let bestCount = 0;\r\n for (const candidate of candidates) {\r\n if (typeof candidate !== 'string' || candidate.length !== 1) {\r\n continue;\r\n }\r\n const count = headerLine.split(candidate).length - 1;\r\n if (count > bestCount) {\r\n bestCount = count;\r\n bestDelimiter = candidate;\r\n }\r\n }\r\n return bestCount > 0 ? bestDelimiter : currentDelimiter;\r\n}\r\n\r\n/**\r\n * Parses a CSV string into JSON objects\r\n */\r\nexport function csvToJson(\r\n csv: string,\r\n options: CsvToJsonOptions = {}\r\n): AnyArray {\r\n return safeExecuteSync(() => {\r\n // Validate input\r\n validateCsvInput(csv, options);\r\n \r\n const opts = options && typeof options === 'object' ? options : {};\r\n \r\n const {\r\n delimiter,\r\n autoDetect = true,\r\n candidates = [';', ',', '\\t', '|'],\r\n hasHeaders = true,\r\n renameMap = {},\r\n trim = true,\r\n parseNumbers = false,\r\n parseBooleans = false,\r\n maxRows,\r\n useFastPath = true,\r\n fastPathMode = 'objects',\r\n schema = null,\r\n transform,\r\n hooks,\r\n useCache = true,\r\n cache,\r\n onError = 'throw',\r\n errorHandler,\r\n repairRowShifts = true,\r\n normalizeQuotes = true,\r\n memoryWarningThreshold = 1000000,\r\n memoryLimit = 5000000\r\n } = opts;\r\n\r\n const delimiterProvided = delimiter !== undefined && delimiter !== null;\r\n const transformHooks = hooks?.transformHooks instanceof TransformHooks\r\n ? hooks.transformHooks\r\n : null;\r\n const hooksContext = { options: opts };\r\n\r\n let resolvedUseFastPath = useFastPath;\r\n if (onError !== 'throw' && resolvedUseFastPath) {\r\n resolvedUseFastPath = false;\r\n }\r\n\r\n if (fastPathMode === 'stream') {\r\n return csvToJsonIterator(csv, opts) as unknown as AnyArray;\r\n }\r\n \r\n // Handle empty CSV\r\n if (!csv.trim()) {\r\n return [];\r\n }\r\n \r\n // Normalize CSV input (remove BOM, normalize line endings)\r\n const normalizedCsv = normalizeCsvInput(csv);\r\n \r\n const cacheToUse = cache instanceof DelimiterCache ? cache : globalDelimiterCache;\r\n // Determine delimiter\r\n let finalDelimiter = delimiter;\r\n if (!finalDelimiter && autoDetect) {\r\n finalDelimiter = autoDetectDelimiter(normalizedCsv, { candidates, useCache, cache: cacheToUse });\r\n }\r\n \r\n if (!finalDelimiter) {\r\n finalDelimiter = ';'; // Default fallback\r\n }\r\n \r\n // Apply hooks if provided\r\n let processedCsv = normalizedCsv;\r\n if (transformHooks) {\r\n processedCsv = transformHooks.applyBeforeConvert(processedCsv, hooksContext);\r\n }\r\n if (hooks?.beforeConvert) {\r\n processedCsv = hooks.beforeConvert(processedCsv, opts);\r\n }\r\n if (!delimiterProvided && autoDetect) {\r\n const refined = refineDelimiterFromHeaderLine(processedCsv, finalDelimiter, candidates) || finalDelimiter;\r\n if (refined !== finalDelimiter && useCache && cacheToUse) {\r\n cacheToUse.set(processedCsv, candidates, refined);\r\n }\r\n finalDelimiter = refined;\r\n }\r\n\r\n const applyPerRowHooks = (row: AnyObject, index: number): AnyObject => {\r\n let result: AnyObject = row;\r\n if (transformHooks) {\r\n result = transformHooks.applyPerRow(result, index, hooksContext) as AnyObject;\r\n }\r\n if (hooks?.perRow) {\r\n result = hooks.perRow(result, index, hooksContext) as AnyObject;\r\n }\r\n if (transform) {\r\n result = transform(result);\r\n }\r\n return result;\r\n };\r\n\r\n const normalizeValue = (value: any): any => {\r\n let normalized = value;\r\n if (trim && typeof normalized === 'string') {\r\n normalized = normalized.trim();\r\n }\r\n if (typeof normalized === 'string') {\r\n if (normalized === '') {\r\n return null;\r\n }\r\n if (normalized[0] === \"'\" && normalized.length > 1) {\r\n const candidate = normalized.slice(1);\r\n const leading = trim ? candidate.trimStart() : candidate;\r\n const firstChar = leading[0];\r\n if (firstChar === '=' || firstChar === '+' || firstChar === '-' || firstChar === '@') {\r\n normalized = candidate;\r\n }\r\n }\r\n }\r\n if (parseNumbers && typeof normalized === 'string') {\r\n const firstChar = normalized[0];\r\n if ((firstChar >= '0' && firstChar <= '9') || firstChar === '-' || firstChar === '+' || firstChar === '.') {\r\n const numValue = Number(normalized);\r\n if (!Number.isNaN(numValue)) {\r\n normalized = numValue;\r\n }\r\n }\r\n }\r\n if (parseBooleans && typeof normalized === 'string') {\r\n const firstChar = normalized[0];\r\n if (firstChar === 't' || firstChar === 'T' || firstChar === 'f' || firstChar === 'F') {\r\n const lowerValue = normalized.toLowerCase();\r\n if (lowerValue === 'true' || lowerValue === 'false') {\r\n normalized = lowerValue === 'true';\r\n }\r\n }\r\n }\r\n return normalized;\r\n };\r\n\r\n const applyAfterConvertHooks = (rows: AnyArray): AnyArray => {\r\n let result: AnyArray = rows;\r\n if (hooks?.afterConvert) {\r\n result = hooks.afterConvert(result, opts);\r\n }\r\n if (transformHooks) {\r\n result = transformHooks.applyAfterConvert(result, hooksContext) as AnyArray;\r\n }\r\n return result;\r\n };\r\n \r\n // Use fast-path engine if enabled\r\n if (resolvedUseFastPath && globalFastPathEngine) {\r\n try {\r\n let fastPathRows: AnyArray | null = null;\r\n const fastPathOptions = {\r\n delimiter: finalDelimiter,\r\n hasHeaders,\r\n trim,\r\n parseNumbers,\r\n parseBooleans,\r\n maxRows,\r\n mode: fastPathMode\r\n };\r\n\r\n if (typeof (globalFastPathEngine as any).parse === 'function') {\r\n fastPathRows = (globalFastPathEngine as any).parse(processedCsv, fastPathOptions);\r\n } else if (typeof (globalFastPathEngine as any).parseRows === 'function') {\r\n const collected: AnyArray = [];\r\n (globalFastPathEngine as any).parseRows(processedCsv, fastPathOptions, (row: AnyArray) => {\r\n if (!Array.isArray(row) || row.length === 0) {\r\n return;\r\n }\r\n collected.push(row);\r\n });\r\n fastPathRows = collected;\r\n }\r\n\r\n if (!Array.isArray(fastPathRows)) {\r\n throw new Error('Fast-path parser returned invalid result');\r\n }\r\n\r\n const normalizeValue = (value: any): any => {\r\n let normalized = value;\r\n if (trim && typeof normalized === 'string') {\r\n normalized = normalized.trim();\r\n }\r\n if (typeof normalized === 'string') {\r\n if (normalized === '') {\r\n return null;\r\n }\r\n if (normalized[0] === \"'\" && normalized.length > 1) {\r\n const candidate = normalized.slice(1);\r\n const leading = trim ? candidate.trimStart() : candidate;\r\n const firstChar = leading[0];\r\n if (firstChar === '=' || firstChar === '+' || firstChar === '-' || firstChar === '@') {\r\n normalized = candidate;\r\n }\r\n }\r\n }\r\n if (parseNumbers && typeof normalized === 'string') {\r\n const firstChar = normalized[0];\r\n if ((firstChar >= '0' && firstChar <= '9') || firstChar === '-' || firstChar === '+' || firstChar === '.') {\r\n const numValue = Number(normalized);\r\n if (!Number.isNaN(numValue)) {\r\n normalized = numValue;\r\n }\r\n }\r\n }\r\n if (parseBooleans && typeof normalized === 'string') {\r\n const firstChar = normalized[0];\r\n if (firstChar === 't' || firstChar === 'T' || firstChar === 'f' || firstChar === 'F') {\r\n const lowerValue = normalized.toLowerCase();\r\n if (lowerValue === 'true' || lowerValue === 'false') {\r\n normalized = lowerValue === 'true';\r\n }\r\n }\r\n }\r\n return normalized;\r\n };\r\n\r\n const handleFastPathError = (error: Error, rowIndex: number, row: AnyArray) => {\r\n if (errorHandler) {\r\n errorHandler(error, row.join(finalDelimiter), hasHeaders ? rowIndex + 2 : rowIndex + 1);\r\n }\r\n if (onError === 'warn') {\r\n if (process.env['NODE_ENV'] !== 'test') {\r\n console.warn(`[jtcsv] Row ${hasHeaders ? rowIndex + 2 : rowIndex + 1}: ${error.message}`);\r\n }\r\n return true;\r\n }\r\n if (onError === 'skip') {\r\n return true;\r\n }\r\n throw error;\r\n };\r\n\r\n if (fastPathMode === 'compact') {\r\n const dataRows = hasHeaders ? fastPathRows.slice(1) : fastPathRows;\r\n if (maxRows && dataRows.length > maxRows) {\r\n throw new LimitError(\r\n `CSV size exceeds maximum limit of ${maxRows} rows`,\r\n maxRows,\r\n dataRows.length\r\n );\r\n }\r\n const limitedRows = dataRows;\r\n const normalizedRows: AnyArray = [];\r\n for (const row of limitedRows) {\r\n if (!Array.isArray(row) || row.length === 0) {\r\n continue;\r\n }\r\n normalizedRows.push(row.map((value) => normalizeValue(value)));\r\n }\r\n if (Number.isFinite(memoryLimit) && normalizedRows.length > memoryLimit) {\r\n throw new LimitError(\r\n `CSV size exceeds memory safety limit of ${memoryLimit} rows`,\r\n memoryLimit,\r\n normalizedRows.length\r\n );\r\n }\r\n if (memoryWarningThreshold\r\n && normalizedRows.length > memoryWarningThreshold\r\n && process.env['NODE_ENV'] !== 'test') {\r\n console.warn(\r\n 'Warning: Large in-memory CSV parse detected.\\n' +\r\n 'Consider using createCsvToJsonStream() for big files.\\n' +\r\n 'Current size: ' + normalizedRows.length.toLocaleString() + ' rows\\n' +\r\n 'Tip: Increase memoryLimit or set memoryLimit: Infinity to override.'\r\n );\r\n }\r\n return applyAfterConvertHooks(normalizedRows);\r\n }\r\n\r\n if (fastPathRows.length === 0) {\r\n return applyAfterConvertHooks([]);\r\n }\r\n\r\n if (!Array.isArray(fastPathRows[0])) {\r\n const limitedRows = maxRows ? fastPathRows.slice(0, maxRows) : fastPathRows;\r\n const normalizedRows = limitedRows.map((row, index) => {\r\n let obj = row as AnyObject;\r\n if (Object.keys(renameMap).length > 0) {\r\n const renamed: AnyObject = {};\r\n for (const [key, value] of Object.entries(obj)) {\r\n const newKey = renameMap[key] || key;\r\n renamed[newKey] = value;\r\n }\r\n obj = renamed;\r\n }\r\n return applyPerRowHooks(obj, index);\r\n });\r\n\r\n if (Number.isFinite(memoryLimit) && normalizedRows.length > memoryLimit) {\r\n throw new LimitError(\r\n `CSV size exceeds memory safety limit of ${memoryLimit} rows`,\r\n memoryLimit,\r\n normalizedRows.length\r\n );\r\n }\r\n if (memoryWarningThreshold\r\n && normalizedRows.length > memoryWarningThreshold\r\n && process.env['NODE_ENV'] !== 'test') {\r\n console.warn(\r\n 'Warning: Large in-memory CSV parse detected.\\n' +\r\n 'Consider using createCsvToJsonStream() for big files.\\n' +\r\n 'Current size: ' + normalizedRows.length.toLocaleString() + ' rows\\n' +\r\n 'Tip: Increase memoryLimit or set memoryLimit: Infinity to override.'\r\n );\r\n }\r\n\r\n return applyAfterConvertHooks(normalizedRows);\r\n }\r\n\r\n const headerRow = hasHeaders ? (fastPathRows[0] as AnyArray) : null;\r\n if (hasHeaders && Array.isArray(headerRow) && headerRow.length === 1) {\r\n const headerText = String(headerRow[0]);\r\n const hasCandidateDelimiter = (candidates || [';', ',', '\\t', '|'])\r\n .some((candidate) => headerText.includes(candidate));\r\n if (hasCandidateDelimiter) {\r\n throw new ParsingError('Fast-path parser failed to split headers');\r\n }\r\n }\r\n\r\n const baseHeaders = hasHeaders\r\n ? (headerRow as AnyArray).map((header) => (trim ? String(header).trim() : String(header)))\r\n : (fastPathRows[0] as AnyArray).map((_, index) => `column${index + 1}`);\r\n const finalHeaders = baseHeaders.map((header) => renameMap[header] || header);\r\n const dataRows = hasHeaders ? fastPathRows.slice(1) : fastPathRows;\r\n if (maxRows && dataRows.length > maxRows) {\r\n throw new LimitError(\r\n `CSV size exceeds maximum limit of ${maxRows} rows`,\r\n maxRows,\r\n dataRows.length\r\n );\r\n }\r\n const limitedRows = dataRows;\r\n\r\n const rawRows: AnyArray = [];\r\n for (let rowIndex = 0; rowIndex < limitedRows.length; rowIndex++) {\r\n const row = limitedRows[rowIndex];\r\n if (!Array.isArray(row) || row.length === 0) {\r\n continue;\r\n }\r\n let rowValues = row;\r\n if (rowValues.length !== baseHeaders.length) {\r\n if (rowValues.length > baseHeaders.length) {\r\n if (process.env['NODE_ENV'] === 'development') {\r\n const lineNumber = hasHeaders ? rowIndex + 2 : rowIndex + 1;\r\n const extraCount = rowValues.length - baseHeaders.length;\r\n console.warn(`[jtcsv] Line ${lineNumber}: ${extraCount} extra fields ignored`);\r\n }\r\n rowValues = rowValues.slice(0, baseHeaders.length);\r\n } else {\r\n while (rowValues.length < baseHeaders.length) {\r\n rowValues.push(undefined as any);\r\n }\r\n }\r\n }\r\n\r\n const obj: AnyObject = {};\r\n for (let j = 0; j < finalHeaders.length; j++) {\r\n let value: any = rowValues[j];\r\n value = normalizeValue(value);\r\n obj[finalHeaders[j]] = value;\r\n }\r\n rawRows.push(obj);\r\n }\r\n\r\n const repairedRows = repairRowShifts\r\n ? repairShiftedRows(rawRows, finalHeaders, { normalizeQuotes })\r\n : rawRows;\r\n const normalizedRows = repairedRows.map((row, index) => applyPerRowHooks(row, index));\r\n\r\n if (Number.isFinite(memoryLimit) && normalizedRows.length > memoryLimit) {\r\n throw new LimitError(\r\n `CSV size exceeds memory safety limit of ${memoryLimit} rows`,\r\n memoryLimit,\r\n normalizedRows.length\r\n );\r\n }\r\n if (memoryWarningThreshold\r\n && normalizedRows.length > memoryWarningThreshold\r\n && process.env['NODE_ENV'] !== 'test') {\r\n console.warn(\r\n 'Warning: Large in-memory CSV parse detected.\\n' +\r\n 'Consider using createCsvToJsonStream() for big files.\\n' +\r\n 'Current size: ' + normalizedRows.length.toLocaleString() + ' rows\\n' +\r\n 'Tip: Increase memoryLimit or set memoryLimit: Infinity to override.'\r\n );\r\n }\r\n \r\n return applyAfterConvertHooks(normalizedRows);\r\n } catch (error: unknown) {\r\n if (error instanceof LimitError) {\r\n throw error;\r\n }\r\n // Fall back to standard parsing if fast-path fails\r\n const errorMessage = error instanceof Error ? error.message : String(error);\r\n console.warn('Fast-path parsing failed, falling back to standard parser:', errorMessage);\r\n }\r\n }\r\n \r\n // Standard CSV parsing implementation\r\n const lines = processedCsv.split('\\n').filter(line => line.trim().length > 0);\r\n \r\n if (lines.length === 0) {\r\n return [];\r\n }\r\n \r\n // Apply row limit if specified\r\n let rowsToProcess = lines;\r\n if (maxRows && lines.length > maxRows) {\r\n throw new LimitError(\r\n `CSV size exceeds maximum limit of ${maxRows} rows`,\r\n maxRows,\r\n lines.length\r\n );\r\n }\r\n \r\n // Parse headers\r\n let headers: string[] = [];\r\n let dataRows = rowsToProcess;\r\n \r\n if (hasHeaders) {\r\n const headerLine = rowsToProcess[0];\r\n headers = parseCsvLine(headerLine, finalDelimiter, trim, 1);\r\n dataRows = rowsToProcess.slice(1);\r\n } else {\r\n // Generate default headers (col0, col1, ...)\r\n const firstRow = parseCsvLine(rowsToProcess[0], finalDelimiter, trim, 1);\r\n headers = firstRow.map((_, index) => `column${index + 1}`);\r\n }\r\n\r\n if (Number.isFinite(memoryLimit) && dataRows.length > memoryLimit) {\r\n throw new LimitError(\r\n `CSV size exceeds memory safety limit of ${memoryLimit} rows`,\r\n memoryLimit,\r\n dataRows.length\r\n );\r\n }\r\n\r\n if (memoryWarningThreshold\r\n && dataRows.length > memoryWarningThreshold\r\n && process.env['NODE_ENV'] !== 'test') {\r\n console.warn(\r\n 'Warning: Large in-memory CSV parse detected.\\n' +\r\n 'Consider using createCsvToJsonStream() for big files.\\n' +\r\n 'Current size: ' + dataRows.length.toLocaleString() + ' rows\\n' +\r\n 'Tip: Increase memoryLimit or set memoryLimit: Infinity to override.'\r\n );\r\n }\r\n \r\n // Apply rename map to headers\r\n const finalHeaders = headers.map(header => renameMap[header] || header);\r\n\r\n if (fastPathMode === 'compact') {\r\n const compactResult: AnyArray = [];\r\n for (let i = 0; i < dataRows.length; i++) {\r\n if (maxRows && compactResult.length >= maxRows) {\r\n break;\r\n }\r\n const line = dataRows[i];\r\n const lineNumber = hasHeaders ? i + 2 : i + 1;\r\n let values = parseCsvLine(line, finalDelimiter, trim, lineNumber);\r\n if (values.length !== finalHeaders.length) {\r\n if (values.length > finalHeaders.length) {\r\n if (process.env['NODE_ENV'] === 'development') {\r\n const extraCount = values.length - finalHeaders.length;\r\n console.warn(`[jtcsv] Line ${lineNumber}: ${extraCount} extra fields ignored`);\r\n }\r\n values = values.slice(0, finalHeaders.length);\r\n } else {\r\n while (values.length < finalHeaders.length) {\r\n values.push(undefined as any);\r\n }\r\n }\r\n }\r\n compactResult.push(values.map((value) => normalizeValue(value)));\r\n }\r\n return applyAfterConvertHooks(compactResult);\r\n }\r\n \r\n // Parse data rows\r\n const rawRows: AnyArray = [];\r\n const handleRowError = (error: Error, line: string, lineNumber: number): boolean => {\r\n if (error instanceof LimitError) {\r\n throw error;\r\n }\r\n if (errorHandler) {\r\n errorHandler(error, line, lineNumber);\r\n }\r\n if (onError === 'warn') {\r\n if (process.env['NODE_ENV'] !== 'test') {\r\n console.warn(`[jtcsv] Line ${lineNumber}: ${error.message}`);\r\n }\r\n return true;\r\n }\r\n if (onError === 'skip') {\r\n return true;\r\n }\r\n throw error;\r\n };\r\n \r\n for (let i = 0; i < dataRows.length; i++) {\r\n const line = dataRows[i];\r\n const lineNumber = hasHeaders ? i + 2 : i + 1;\r\n try {\r\n let values = parseCsvLine(line, finalDelimiter, trim, lineNumber);\r\n \r\n // Handle field count mismatch\r\n if (values.length !== finalHeaders.length) {\r\n if (values.length > finalHeaders.length) {\r\n if (process.env['NODE_ENV'] === 'development') {\r\n const extraCount = values.length - finalHeaders.length;\r\n console.warn(`[jtcsv] Line ${lineNumber}: ${extraCount} extra fields ignored`);\r\n }\r\n values = values.slice(0, finalHeaders.length);\r\n } else {\r\n while (values.length < finalHeaders.length) {\r\n values.push(undefined as any);\r\n }\r\n }\r\n }\r\n \r\n // Create object\r\n const row: AnyObject = {};\r\n for (let j = 0; j < finalHeaders.length; j++) {\r\n let value: any = values[j];\r\n \r\n // Parse numbers if enabled\r\n if (parseNumbers && !isNaN(Number(value)) && value.trim() !== '') {\r\n value = Number(value);\r\n }\r\n \r\n // Parse booleans if enabled\r\n if (parseBooleans) {\r\n const lowerValue = String(value).toLowerCase();\r\n if (lowerValue === 'true' || lowerValue === 'false') {\r\n value = lowerValue === 'true';\r\n }\r\n }\r\n \r\n row[finalHeaders[j]] = value;\r\n }\r\n \r\n // Apply transform function if provided\r\n rawRows.push(row);\r\n } catch (error: any) {\r\n if (handleRowError(error as Error, line, lineNumber)) {\r\n continue;\r\n }\r\n }\r\n }\r\n \r\n // Apply hooks if provided\r\n const repairedRows = repairRowShifts\r\n ? repairShiftedRows(rawRows, finalHeaders, { normalizeQuotes })\r\n : rawRows;\r\n const normalizedRows = repairedRows.map((row, index) => applyPerRowHooks(row, index));\r\n return applyAfterConvertHooks(normalizedRows);\r\n }, 'PARSING_ERROR', { function: 'csvToJson' });\r\n}\r\n\r\n/**\r\n * Parses a single CSV line\r\n */\r\nfunction parseCsvLine(\r\n line: string,\r\n delimiter: string,\r\n trim: boolean,\r\n lineNumber?: number\r\n): string[] {\r\n const result: string[] = [];\r\n let currentField = '';\r\n let inQuotes = false;\r\n let quoteChar = '\"';\r\n let escapeNext = false;\r\n \r\n for (let i = 0; i < line.length; i++) {\r\n const char = line[i];\r\n const nextChar = i < line.length - 1 ? line[i + 1] : '';\r\n\r\n if (escapeNext) {\r\n currentField += char;\r\n escapeNext = false;\r\n continue;\r\n }\r\n\r\n if (char === '\\\\') {\r\n escapeNext = true;\r\n continue;\r\n }\r\n \r\n if (!inQuotes && char === delimiter) {\r\n result.push(trim ? currentField.trim() : currentField);\r\n currentField = '';\r\n } else if (!inQuotes && (char === '\"' || char === \"'\")) {\r\n inQuotes = true;\r\n quoteChar = char;\r\n } else if (inQuotes && char === quoteChar && nextChar === quoteChar) {\r\n currentField += char;\r\n if (i + 2 === line.length) {\r\n inQuotes = false;\r\n }\r\n i++;\r\n } else if (inQuotes && char === quoteChar) {\r\n inQuotes = false;\r\n } else {\r\n currentField += char;\r\n }\r\n }\r\n\r\n if (escapeNext) {\r\n currentField += '\\\\';\r\n }\r\n \r\n result.push(trim ? currentField.trim() : currentField);\r\n \r\n if (inQuotes) {\r\n throw ParsingError.unclosedQuotes(\r\n lineNumber ?? null,\r\n null,\r\n line.substring(0, 100)\r\n );\r\n }\r\n \r\n return result;\r\n}\r\n\r\nfunction isEmptyValue(value: any): boolean {\r\n return value === undefined || value === null || value === '';\r\n}\r\n\r\nfunction hasOddQuotes(value: any): boolean {\r\n if (typeof value !== 'string') {\r\n return false;\r\n }\r\n let count = 0;\r\n for (let i = 0; i < value.length; i++) {\r\n if (value[i] === '\"') {\r\n count++;\r\n }\r\n }\r\n return count % 2 === 1;\r\n}\r\n\r\nfunction hasAnyQuotes(value: any): boolean {\r\n return typeof value === 'string' && value.includes('\"');\r\n}\r\n\r\nfunction normalizeQuotesInField(value: any): any {\r\n if (typeof value !== 'string') {\r\n return value;\r\n }\r\n // Не нормализуем кавычки в JSON-строках - это ломит структуру JSON\r\n if ((value.startsWith('{') && value.endsWith('}')) ||\r\n (value.startsWith('[') && value.endsWith(']'))) {\r\n return value; // Возвращаем как есть для JSON\r\n }\r\n \r\n let normalized = value.replace(/\"{2,}/g, '\"');\r\n // Не применяем правило, которое ломает JSON:\r\n // normalized = normalized.replace(/\"\\s*,\\s*\"/g, ',');\r\n normalized = normalized.replace(/\"\\n/g, '\\n').replace(/\\n\"/g, '\\n');\r\n if (normalized.length >= 2 && normalized.startsWith('\"') && normalized.endsWith('\"')) {\r\n normalized = normalized.slice(1, -1);\r\n }\r\n return normalized;\r\n}\r\n\r\nfunction normalizeRowQuotes(row: AnyObject, headers: string[]): AnyObject {\r\n const normalized: AnyObject = {};\r\n const phoneKeys = new Set(['phone', 'phonenumber', 'phone_number', 'tel', 'telephone']);\r\n for (const header of headers) {\r\n const baseValue = normalizeQuotesInField(row[header]);\r\n if (phoneKeys.has(String(header).toLowerCase())) {\r\n normalized[header] = normalizePhoneValue(baseValue);\r\n } else {\r\n normalized[header] = baseValue;\r\n }\r\n }\r\n return normalized;\r\n}\r\n\r\nfunction normalizePhoneValue(value: any): any {\r\n if (typeof value !== 'string') {\r\n return value;\r\n }\r\n const trimmed = value.trim();\r\n if (trimmed === '') {\r\n return trimmed;\r\n }\r\n return trimmed.replace(/[\"'\\\\]/g, '');\r\n}\r\n\r\nfunction looksLikeUserAgent(value: any): boolean {\r\n if (typeof value !== 'string') {\r\n return false;\r\n }\r\n return /Mozilla\\/|Opera\\/|MSIE|AppleWebKit|Gecko|Safari|Chrome\\//.test(value);\r\n}\r\n\r\nfunction isHexColor(value: any): boolean {\r\n return typeof value === 'string' && /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.test(value);\r\n}\r\n\r\nfunction repairShiftedRows(\r\n rows: AnyArray,\r\n headers: string[],\r\n options: { normalizeQuotes?: boolean } = {}\r\n): AnyArray {\r\n if (!Array.isArray(rows) || rows.length === 0 || headers.length === 0) {\r\n return rows;\r\n }\r\n\r\n const headerCount = headers.length;\r\n const merged: AnyArray = [];\r\n let index = 0;\r\n\r\n while (index < rows.length) {\r\n const row = rows[index] as AnyObject;\r\n if (!row || typeof row !== 'object') {\r\n merged.push(row);\r\n index++;\r\n continue;\r\n }\r\n\r\n const values = headers.map((header) => row[header]);\r\n let lastNonEmpty = -1;\r\n for (let i = headerCount - 1; i >= 0; i--) {\r\n if (!isEmptyValue(values[i])) {\r\n lastNonEmpty = i;\r\n break;\r\n }\r\n }\r\n\r\n const missingCount = headerCount - 1 - lastNonEmpty;\r\n if (lastNonEmpty >= 0 && missingCount > 0 && index + 1 < rows.length) {\r\n const nextRow = rows[index + 1] as AnyObject;\r\n if (nextRow && typeof nextRow === 'object') {\r\n const nextValues = headers.map((header) => nextRow[header]);\r\n const nextTrailingEmpty = nextValues\r\n .slice(headerCount - missingCount)\r\n .every((value) => isEmptyValue(value));\r\n\r\n const leadValues = nextValues\r\n .slice(0, missingCount)\r\n .filter((value) => !isEmptyValue(value));\r\n const shouldMerge = nextTrailingEmpty\r\n && leadValues.length > 0\r\n && (hasOddQuotes(values[lastNonEmpty]) || hasAnyQuotes(values[lastNonEmpty]));\r\n\r\n if (shouldMerge) {\r\n const toAppend = leadValues.map((value) => String(value));\r\n\r\n if (toAppend.length > 0) {\r\n const base = isEmptyValue(values[lastNonEmpty]) ? '' : String(values[lastNonEmpty]);\r\n values[lastNonEmpty] = base ? `${base}\\n${toAppend.join('\\n')}` : toAppend.join('\\n');\r\n }\r\n\r\n for (let i = 0; i < missingCount; i++) {\r\n values[lastNonEmpty + 1 + i] = nextValues[missingCount + i];\r\n }\r\n\r\n const mergedRow: AnyObject = {};\r\n for (let i = 0; i < headerCount; i++) {\r\n mergedRow[headers[i]] = values[i];\r\n }\r\n\r\n merged.push(mergedRow);\r\n index += 2;\r\n continue;\r\n }\r\n }\r\n }\r\n\r\n if (index + 1 < rows.length) {\r\n const nextRow = rows[index + 1] as AnyObject;\r\n if (nextRow && typeof nextRow === 'object') {\r\n const nextHex = nextRow[headers[4]];\r\n const nextUserAgentHead = nextRow[headers[2]];\r\n const nextUserAgentTail = nextRow[headers[3]];\r\n const shouldMergeUserAgent = isEmptyValue(values[4])\r\n && isEmptyValue(values[5])\r\n && isHexColor(nextHex)\r\n && (looksLikeUserAgent(nextUserAgentHead) || looksLikeUserAgent(nextUserAgentTail));\r\n\r\n if (shouldMergeUserAgent) {\r\n const addressParts = [values[3], nextRow[headers[0]], nextRow[headers[1]]]\r\n .filter((value) => !isEmptyValue(value))\r\n .map((value) => String(value));\r\n values[3] = addressParts.join('\\n');\r\n\r\n // Очищаем кавычки из частей userAgent перед объединением\r\n let uaHead = isEmptyValue(nextUserAgentHead) ? '' : String(nextUserAgentHead);\r\n let uaTail = isEmptyValue(nextUserAgentTail) ? '' : String(nextUserAgentTail);\r\n // Удаляем лишние кавычки из начала и конца каждой части\r\n uaHead = uaHead.replace(/^\"+|\"+$/g, '');\r\n uaTail = uaTail.replace(/^\"+|\"+$/g, '');\r\n const joiner = uaHead && uaTail ? (uaTail.startsWith(' ') ? '' : ',') : '';\r\n values[4] = uaHead + joiner + uaTail;\r\n values[5] = String(nextHex);\r\n\r\n const mergedRow: AnyObject = {};\r\n for (let i = 0; i < headerCount; i++) {\r\n mergedRow[headers[i]] = values[i];\r\n }\r\n\r\n merged.push(mergedRow);\r\n index += 2;\r\n continue;\r\n }\r\n }\r\n }\r\n\r\n merged.push(row);\r\n index++;\r\n }\r\n\r\n if (options.normalizeQuotes) {\r\n return merged.map((row) => normalizeRowQuotes(row, headers));\r\n }\r\n\r\n return merged;\r\n}\r\n\r\n/**\r\n * Asynchronous version of csvToJson with support for worker threads\r\n */\r\nexport async function csvToJsonAsync(\r\n csv: string,\r\n options: AsyncCsvToJsonOptions = {}\r\n): Promise<AnyArray> {\r\n return safeExecuteAsync(async () => {\r\n // For now, use the synchronous version\r\n // In the future, this will use worker threads for large datasets\r\n const { useWorkers = false, workerCount, chunkSize, onProgress, ...syncOptions } = options;\r\n \r\n // Simple implementation - just call the synchronous version\r\n // TODO: Implement worker thread support for large datasets\r\n return csvToJson(csv, syncOptions);\r\n }, 'PARSING_ERROR', { function: 'csvToJsonAsync' });\r\n}\r\n\r\n/**\r\n * Creates an iterator for streaming CSV parsing\r\n */\r\nexport function* csvToJsonIterator(\r\n csv: string,\r\n options: CsvToJsonOptions = {}\r\n): Generator<AnyObject, void, unknown> {\r\n // Validate input\r\n validateCsvInput(csv, options);\r\n \r\n const opts = options && typeof options === 'object' ? options : {};\r\n \r\n const {\r\n delimiter,\r\n autoDetect = true,\r\n candidates = [';', ',', '\\t', '|'],\r\n hasHeaders = true,\r\n renameMap = {},\r\n trim = true,\r\n parseNumbers = false,\r\n parseBooleans = false,\r\n maxRows,\r\n useFastPath = true,\r\n fastPathMode = 'objects',\r\n transform,\r\n hooks,\r\n useCache = true,\r\n cache,\r\n onError = 'throw',\r\n errorHandler,\r\n repairRowShifts = true,\r\n normalizeQuotes = true,\r\n memoryWarningThreshold = 1000000,\r\n memoryLimit = 5000000\r\n } = opts;\r\n\r\n const delimiterProvided = delimiter !== undefined && delimiter !== null;\r\n const transformHooks = hooks?.transformHooks instanceof TransformHooks\r\n ? hooks.transformHooks\r\n : null;\r\n const hooksContext = { options: opts };\r\n \r\n // Handle empty CSV\r\n if (!csv.trim()) {\r\n return;\r\n }\r\n \r\n // Normalize CSV input\r\n const normalizedCsv = normalizeCsvInput(csv);\r\n let processedCsv = normalizedCsv;\r\n if (transformHooks) {\r\n processedCsv = transformHooks.applyBeforeConvert(processedCsv, hooksContext);\r\n }\r\n if (hooks?.beforeConvert) {\r\n processedCsv = hooks.beforeConvert(processedCsv, opts);\r\n }\r\n \r\n // Determine delimiter\r\n let finalDelimiter = delimiter;\r\n if (!finalDelimiter && autoDetect) {\r\n const cacheToUse = cache instanceof DelimiterCache ? cache : globalDelimiterCache;\r\n finalDelimiter = autoDetectDelimiter(processedCsv, { candidates, useCache, cache: cacheToUse });\r\n }\r\n \r\n if (!finalDelimiter) {\r\n finalDelimiter = ';'; // Default fallback\r\n }\r\n if (!delimiterProvided && autoDetect) {\r\n const cacheToUse = cache instanceof DelimiterCache ? cache : globalDelimiterCache;\r\n const refined = refineDelimiterFromHeaderLine(processedCsv, finalDelimiter, candidates) || finalDelimiter;\r\n if (refined !== finalDelimiter && useCache && cacheToUse) {\r\n cacheToUse.set(processedCsv, candidates, refined);\r\n }\r\n finalDelimiter = refined;\r\n }\r\n\r\n const applyPerRowHooks = (row: AnyObject, index: number): AnyObject => {\r\n let result: AnyObject = row;\r\n if (transformHooks) {\r\n result = transformHooks.applyPerRow(result, index, hooksContext) as AnyObject;\r\n }\r\n if (hooks?.perRow) {\r\n result = hooks.perRow(result, index, hooksContext) as AnyObject;\r\n }\r\n if (transform) {\r\n result = transform(result);\r\n }\r\n return result;\r\n };\r\n\r\n const normalizeValue = (value: any): any => {\r\n let normalized = value;\r\n if (trim && typeof normalized === 'string') {\r\n normalized = normalized.trim();\r\n }\r\n if (typeof normalized === 'string') {\r\n if (normalized === '') {\r\n return null;\r\n }\r\n if (normalized[0] === \"'\" && normalized.length > 1) {\r\n const candidate = normalized.slice(1);\r\n const leading = trim ? candidate.trimStart() : candidate;\r\n const firstChar = leading[0];\r\n if (firstChar === '=' || firstChar === '+' || firstChar === '-' || firstChar === '@') {\r\n normalized = candidate;\r\n }\r\n }\r\n }\r\n if (parseNumbers && typeof normalized === 'string') {\r\n const firstChar = normalized[0];\r\n if ((firstChar >= '0' && firstChar <= '9') || firstChar === '-' || firstChar === '+' || firstChar === '.') {\r\n const numValue = Number(normalized);\r\n if (!Number.isNaN(numValue)) {\r\n normalized = numValue;\r\n }\r\n }\r\n }\r\n if (parseBooleans && typeof normalized === 'string') {\r\n const firstChar = normalized[0];\r\n if (firstChar === 't' || firstChar === 'T' || firstChar === 'f' || firstChar === 'F') {\r\n const lowerValue = normalized.toLowerCase();\r\n if (lowerValue === 'true' || lowerValue === 'false') {\r\n normalized = lowerValue === 'true';\r\n }\r\n }\r\n }\r\n return normalized;\r\n };\r\n \r\n const handleRowError = (error: Error, line: string, lineNumber: number): boolean => {\r\n if (error instanceof LimitError) {\r\n throw error;\r\n }\r\n if (errorHandler) {\r\n errorHandler(error, line, lineNumber);\r\n }\r\n if (onError === 'warn') {\r\n if (process.env['NODE_ENV'] !== 'test') {\r\n console.warn(`[jtcsv] Line ${lineNumber}: ${error.message}`);\r\n }\r\n return true;\r\n }\r\n if (onError === 'skip') {\r\n return true;\r\n }\r\n throw error;\r\n };\r\n\r\n let rowCount = 0; // Объявляем rowCount выше, чтобы assertRowLimit мог его использовать\r\n \r\n const assertRowLimit = () => {\r\n if (maxRows && rowCount >= maxRows) {\r\n throw new LimitError(\r\n `CSV size exceeds maximum limit of ${maxRows} rows`,\r\n maxRows,\r\n rowCount + 1\r\n );\r\n }\r\n };\r\n\r\n const shouldWarnLargeMemory = memoryWarningThreshold && process.env['NODE_ENV'] !== 'test';\r\n let warnedLargeMemory = false;\r\n\r\n if (globalFastPathEngine && typeof (globalFastPathEngine as any).iterateRows === 'function') {\r\n const iterateOptions: any = { delimiter: finalDelimiter };\r\n if (!useFastPath) {\r\n iterateOptions.forceEngine = 'STANDARD';\r\n }\r\n\r\n const rowIterator = (globalFastPathEngine as any).iterateRows(processedCsv, iterateOptions);\r\n let headers: string[] = [];\r\n let finalHeaders: string[] = [];\r\n let headersProcessed = false;\r\n let pendingRow: AnyObject | null = null;\r\n\r\n try {\r\n for (const row of rowIterator) {\r\n if (!Array.isArray(row) || row.length === 0) {\r\n continue;\r\n }\r\n\r\n if (!headersProcessed) {\r\n if (hasHeaders) {\r\n headers = row.map((header) => (trim ? String(header).trim() : String(header)));\r\n headersProcessed = true;\r\n finalHeaders = headers.map((header) => renameMap[header] || header);\r\n continue;\r\n } else {\r\n headers = row.map((_, index) => `column${index + 1}`);\r\n headersProcessed = true;\r\n finalHeaders = headers.map((header) => renameMap[header] || header);\r\n }\r\n }\r\n\r\n if (maxRows && rowCount >= maxRows) {\r\n throw new LimitError(\r\n `CSV size exceeds maximum limit of ${maxRows} rows`,\r\n maxRows,\r\n rowCount + 1\r\n );\r\n }\r\n\r\n if (Number.isFinite(memoryLimit) && rowCount + 1 > memoryLimit) {\r\n throw new LimitError(\r\n `CSV size exceeds memory safety limit of ${memoryLimit} rows`,\r\n memoryLimit,\r\n rowCount + 1\r\n );\r\n }\r\n\r\n if (!warnedLargeMemory && shouldWarnLargeMemory && rowCount + 1 > memoryWarningThreshold) {\r\n warnedLargeMemory = true;\r\n console.warn(\r\n 'Warning: Large in-memory CSV parse detected.\\n' +\r\n 'Consider using createCsvToJsonStream() for big files.\\n' +\r\n 'Current size: ' + (rowCount + 1).toLocaleString() + ' rows\\n' +\r\n 'Tip: Increase memoryLimit or set memoryLimit: Infinity to override.'\r\n );\r\n }\r\n\r\n let values = row;\r\n if (values.length !== headers.length) {\r\n if (values.length > headers.length) {\r\n if (process.env['NODE_ENV'] === 'development') {\r\n const lineNumber = hasHeaders ? rowCount + 2 : rowCount + 1;\r\n const extraCount = values.length - finalHeaders.length;\r\n console.warn(`[jtcsv] Line ${lineNumber}: ${extraCount} extra fields ignored`);\r\n }\r\n values = values.slice(0, headers.length);\r\n } else {\r\n while (values.length < headers.length) {\r\n values.push(undefined as any);\r\n }\r\n }\r\n }\r\n\r\n if (fastPathMode === 'compact') {\r\n yield values.map((value) => normalizeValue(value));\r\n rowCount++;\r\n continue;\r\n }\r\n\r\n const rowObj: AnyObject = {};\r\n for (let j = 0; j < finalHeaders.length; j++) {\r\n rowObj[finalHeaders[j]] = normalizeValue(values[j]);\r\n }\r\n\r\n if (repairRowShifts) {\r\n if (!pendingRow) {\r\n pendingRow = rowObj;\r\n continue;\r\n }\r\n\r\n const repairedRows = repairShiftedRows([pendingRow, rowObj], finalHeaders, { normalizeQuotes });\r\n if (repairedRows.length === 1) {\r\n assertRowLimit();\r\n yield applyPerRowHooks(repairedRows[0], rowCount);\r\n rowCount++;\r\n pendingRow = null;\r\n continue;\r\n }\r\n\r\n assertRowLimit();\r\n yield applyPerRowHooks(repairedRows[0], rowCount);\r\n rowCount++;\r\n pendingRow = repairedRows[1] as AnyObject;\r\n } else {\r\n const normalizedRow = normalizeQuotes ? normalizeRowQuotes(rowObj, finalHeaders) : rowObj;\r\n assertRowLimit();\r\n yield applyPerRowHooks(normalizedRow, rowCount);\r\n rowCount++;\r\n }\r\n }\r\n } catch (error: any) {\r\n if (error && error.code === 'FAST_PATH_UNCLOSED_QUOTES') {\r\n throw ParsingError.unclosedQuotes(error.lineNumber ?? null);\r\n }\r\n throw error;\r\n }\r\n\r\n if (pendingRow) {\r\n const flushedRows = repairShiftedRows([pendingRow], finalHeaders, { normalizeQuotes });\r\n for (const row of flushedRows) {\r\n assertRowLimit();\r\n yield applyPerRowHooks(row as AnyObject, rowCount);\r\n rowCount++;\r\n }\r\n pendingRow = null;\r\n }\r\n\r\n return;\r\n }\r\n\r\n // Split into lines\r\n const lines = processedCsv.split('\\n').filter(line => line.trim().length > 0);\r\n \r\n if (lines.length === 0) {\r\n return;\r\n }\r\n \r\n // Parse headers\r\n let headers: string[] = [];\r\n let dataRows = lines;\r\n \r\n if (hasHeaders) {\r\n const headerLine = lines[0];\r\n headers = parseCsvLine(headerLine, finalDelimiter, trim, 1);\r\n dataRows = lines.slice(1);\r\n } else {\r\n // Generate default headers\r\n const firstRow = parseCsvLine(lines[0], finalDelimiter, trim, 1);\r\n headers = firstRow.map((_, index) => `column${index + 1}`);\r\n }\r\n \r\n // Apply rename map to headers\r\n const finalHeaders = headers.map(header => renameMap[header] || header);\r\n \r\n // Yield rows one by one\r\n // rowCount уже объявлен выше\r\n let pendingRow: AnyObject | null = null;\r\n\r\n for (let i = 0; i < dataRows.length; i++) {\r\n // Check maxRows limit\r\n if (maxRows && rowCount >= maxRows) {\r\n throw new LimitError(\r\n `CSV size exceeds maximum limit of ${maxRows} rows`,\r\n maxRows,\r\n rowCount + 1\r\n );\r\n }\r\n\r\n const line = dataRows[i];\r\n const lineNumber = hasHeaders ? i + 2 : i + 1;\r\n if (Number.isFinite(memoryLimit) && rowCount + 1 > memoryLimit) {\r\n throw new LimitError(\r\n `CSV size exceeds memory safety limit of ${memoryLimit} rows`,\r\n memoryLimit,\r\n rowCount + 1\r\n );\r\n }\r\n if (!warnedLargeMemory && shouldWarnLargeMemory && rowCount + 1 > memoryWarningThreshold) {\r\n warnedLargeMemory = true;\r\n console.warn(\r\n 'Warning: Large in-memory CSV parse detected.\\n' +\r\n 'Consider using createCsvToJsonStream() for big files.\\n' +\r\n 'Current size: ' + (rowCount + 1).toLocaleString() + ' rows\\n' +\r\n 'Tip: Increase memoryLimit or set memoryLimit: Infinity to override.'\r\n );\r\n }\r\n try {\r\n let values = parseCsvLine(line, finalDelimiter, trim, lineNumber);\r\n \r\n // Handle field count mismatch\r\n if (values.length !== finalHeaders.length) {\r\n if (values.length > finalHeaders.length) {\r\n if (process.env['NODE_ENV'] === 'development') {\r\n const extraCount = values.length - finalHeaders.length;\r\n console.warn(`[jtcsv] Line ${lineNumber}: ${extraCount} extra fields ignored`);\r\n }\r\n values = values.slice(0, finalHeaders.length);\r\n } else {\r\n while (values.length < finalHeaders.length) {\r\n values.push(undefined as any);\r\n }\r\n }\r\n }\r\n \r\n if (fastPathMode === 'compact') {\r\n yield values.map((value) => normalizeValue(value));\r\n rowCount++;\r\n continue;\r\n }\r\n\r\n // Create object\r\n const row: AnyObject = {};\r\n for (let j = 0; j < finalHeaders.length; j++) {\r\n const value = normalizeValue(values[j]);\r\n row[finalHeaders[j]] = value;\r\n }\r\n\r\n if (repairRowShifts) {\r\n if (!pendingRow) {\r\n pendingRow = row;\r\n continue;\r\n }\r\n\r\n const repairedRows = repairShiftedRows([pendingRow, row], finalHeaders, { normalizeQuotes });\r\n if (repairedRows.length === 1) {\r\n assertRowLimit();\r\n yield applyPerRowHooks(repairedRows[0], rowCount);\r\n rowCount++;\r\n pendingRow = null;\r\n continue;\r\n }\r\n\r\n assertRowLimit();\r\n yield applyPerRowHooks(repairedRows[0], rowCount);\r\n rowCount++;\r\n pendingRow = repairedRows[1] as AnyObject;\r\n } else {\r\n const normalizedRow = normalizeQuotes ? normalizeRowQuotes(row, finalHeaders) : row;\r\n assertRowLimit();\r\n yield applyPerRowHooks(normalizedRow, rowCount);\r\n rowCount++;\r\n }\r\n } catch (error: any) {\r\n if (handleRowError(error as Error, line, lineNumber)) {\r\n continue;\r\n }\r\n }\r\n }\r\n\r\n if (pendingRow) {\r\n const flushedRows = repairShiftedRows([pendingRow], finalHeaders, { normalizeQuotes });\r\n for (const row of flushedRows) {\r\n assertRowLimit();\r\n yield applyPerRowHooks(row as AnyObject, rowCount);\r\n rowCount++;\r\n }\r\n pendingRow = null;\r\n }\r\n}\r\n\r\n/**\r\n * Validates CSV file path for security\r\n * @private\r\n */\r\nfunction validateCsvFilePath(filePath: string): string {\r\n if (typeof filePath !== 'string' || filePath.trim() === '') {\r\n throw new ValidationError('File path must be a non-empty string');\r\n }\r\n\r\n if (!filePath.toLowerCase().endsWith('.csv')) {\r\n throw new ValidationError('File must have .csv extension');\r\n }\r\n \r\n // Basic path validation\r\n const normalizedPath = filePath.trim();\r\n \r\n // Check for directory traversal attempts\r\n if (normalizedPath.includes('..') || normalizedPath.includes('~')) {\r\n throw new SecurityError('Invalid file path: directory traversal detected');\r\n }\r\n \r\n // Check for dangerous extensions\r\n const dangerousExtensions = ['.exe', '.bat', '.cmd', '.sh', '.php', '.py'];\r\n const lowerPath = normalizedPath.toLowerCase();\r\n for (const ext of dangerousExtensions) {\r\n if (lowerPath.endsWith(ext)) {\r\n throw new SecurityError(`Invalid file extension: ${ext}`);\r\n }\r\n }\r\n \r\n return normalizedPath;\r\n}\r\n\r\n/**\r\n * Reads CSV file and converts to JSON (synchronous)\r\n */\r\nexport async function readCsvAsJson(\r\n filePath: string,\r\n options: CsvToJsonOptions & { validatePath?: boolean } = {}\r\n): Promise<AnyArray> {\r\n return safeExecuteAsync(async () => {\r\n const { validatePath = true, ...csvOptions } = options;\r\n const fs = require('fs');\r\n \r\n // Validate file path if requested\r\n const safePath = validatePath ? validateCsvFilePath(filePath) : filePath;\r\n \r\n try {\r\n // Read file\r\n const csvContent = await fs.promises.readFile(safePath, 'utf8');\r\n \r\n // Parse CSV with hooks and caching\r\n return csvToJson(csvContent, csvOptions);\r\n } catch (error: any) {\r\n // Re-throw parsing errors as-is\r\n if (error instanceof ParsingError || error instanceof ValidationError || error instanceof LimitError) {\r\n throw error;\r\n }\r\n \r\n // Wrap file system errors\r\n if (error.code === 'ENOENT') {\r\n throw new FileSystemError(`File not found: ${safePath}`, error);\r\n }\r\n if (error.code === 'EACCES') {\r\n throw new FileSystemError(`Permission denied: ${safePath}`, error);\r\n }\r\n if (error.code === 'EISDIR') {\r\n throw new FileSystemError(`Path is a directory: ${safePath}`, error);\r\n }\r\n \r\n throw new FileSystemError(`Failed to read CSV file: ${error.message}`, error);\r\n }\r\n }, 'FILE_SYSTEM_ERROR', { function: 'readCsvAsJson' });\r\n}\r\n\r\n/**\r\n * Reads CSV file and converts to JSON (synchronous)\r\n * \r\n * @param filePath - Path to CSV file\r\n * @param options - Configuration options (same as csvToJson)\r\n * @returns JSON array\r\n */\r\nexport function readCsvAsJsonSync(\r\n filePath: string,\r\n options: CsvToJsonOptions & { validatePath?: boolean } = {}\r\n): AnyArray {\r\n const fs = require('fs');\r\n \r\n // Validate file path\r\n const { validatePath = true, ...csvOptions } = options;\r\n const safePath = validatePath ? validateCsvFilePath(filePath) : filePath;\r\n \r\n try {\r\n // Read file\r\n const csvContent = fs.readFileSync(safePath, 'utf8');\r\n \r\n // Parse CSV with hooks and caching\r\n return csvToJson(csvContent, csvOptions);\r\n } catch (error: any) {\r\n // Re-throw parsing errors as-is\r\n if (error instanceof ParsingError || error instanceof ValidationError || error instanceof LimitError) {\r\n throw error;\r\n }\r\n \r\n // Wrap file system errors\r\n if (error.code === 'ENOENT') {\r\n throw new FileSystemError(`File not found: ${safePath}`, error);\r\n }\r\n if (error.code === 'EACCES') {\r\n throw new FileSystemError(`Permission denied: ${safePath}`, error);\r\n }\r\n if (error.code === 'EISDIR') {\r\n throw new FileSystemError(`Path is a directory: ${safePath}`, error);\r\n }\r\n \r\n throw new FileSystemError(`Failed to read CSV file: ${error.message}`, error);\r\n }\r\n}\r\n\r\n/**\r\n * Creates a new TransformHooks instance\r\n * @returns New TransformHooks instance\r\n */\r\nexport function createTransformHooks(): TransformHooks {\r\n return new TransformHooks();\r\n}\r\n\r\n/**\r\n * Creates a new DelimiterCache instance\r\n * @param maxSize - Maximum cache size (default: 100)\r\n * @returns New DelimiterCache instance\r\n */\r\nexport function createDelimiterCache(maxSize: number = 100): DelimiterCache {\r\n return new DelimiterCache(maxSize);\r\n}\r\n\r\n/**\r\n * Gets statistics from the global delimiter cache\r\n * @returns Cache statistics\r\n */\r\nexport function getDelimiterCacheStats(): any {\r\n return globalDelimiterCache.getStats();\r\n}\r\n\r\n/**\r\n * Clears the global delimiter cache\r\n */\r\nexport function clearDelimiterCache(): void {\r\n globalDelimiterCache.clear();\r\n}\r\n\r\nexport { TransformHooks, predefinedHooks };\r\n"]}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ERROR_CODES = exports.ErrorContext = exports.ConfigurationError = exports.LimitError = exports.ParsingError = exports.FileSystemError = exports.SecurityError = exports.ValidationError = exports.JtcsvError = void 0;
|
|
4
|
+
exports.createDetailedErrorMessage = createDetailedErrorMessage;
|
|
5
|
+
exports.createErrorMessage = createErrorMessage;
|
|
6
|
+
exports.handleError = handleError;
|
|
7
|
+
exports.safeExecuteAsync = safeExecuteAsync;
|
|
8
|
+
exports.safeExecuteSync = safeExecuteSync;
|
|
9
|
+
exports.safeExecute = safeExecute;
|
|
10
|
+
class JtcsvError extends Error {
|
|
11
|
+
constructor(message, code = 'JTCSV_ERROR', meta = {}) {
|
|
12
|
+
super(message);
|
|
13
|
+
this.name = 'JtcsvError';
|
|
14
|
+
this.code = code;
|
|
15
|
+
this.hint = meta.hint;
|
|
16
|
+
this.docs = meta.docs;
|
|
17
|
+
this.context = meta.context;
|
|
18
|
+
this.originalError = meta.originalError;
|
|
19
|
+
if (Error.captureStackTrace) {
|
|
20
|
+
Error.captureStackTrace(this, JtcsvError);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
exports.JtcsvError = JtcsvError;
|
|
25
|
+
class ValidationError extends JtcsvError {
|
|
26
|
+
constructor(message, meta = {}) {
|
|
27
|
+
super(message, 'VALIDATION_ERROR', meta);
|
|
28
|
+
this.name = 'ValidationError';
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
exports.ValidationError = ValidationError;
|
|
32
|
+
class SecurityError extends JtcsvError {
|
|
33
|
+
constructor(message, meta = {}) {
|
|
34
|
+
super(message, 'SECURITY_ERROR', meta);
|
|
35
|
+
this.name = 'SecurityError';
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
exports.SecurityError = SecurityError;
|
|
39
|
+
class FileSystemError extends JtcsvError {
|
|
40
|
+
constructor(message, originalError = null, meta = {}) {
|
|
41
|
+
super(message, 'FILE_SYSTEM_ERROR', { ...meta, originalError });
|
|
42
|
+
this.name = 'FileSystemError';
|
|
43
|
+
this.originalError = originalError ?? meta.originalError ?? null;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
exports.FileSystemError = FileSystemError;
|
|
47
|
+
class ParsingError extends JtcsvError {
|
|
48
|
+
constructor(message, lineNumber = null, column = null, context = null, expected = null, actual = null, meta = {}) {
|
|
49
|
+
const resolvedContext = context ?? (typeof meta.context === 'string' ? meta.context : null);
|
|
50
|
+
let detailedMessage = message;
|
|
51
|
+
if (lineNumber !== null) {
|
|
52
|
+
detailedMessage += ` at line ${lineNumber}`;
|
|
53
|
+
if (column !== null) {
|
|
54
|
+
detailedMessage += `, column ${column}`;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (resolvedContext !== null) {
|
|
58
|
+
detailedMessage += `\nContext: ${resolvedContext}`;
|
|
59
|
+
}
|
|
60
|
+
if (expected !== null && actual !== null) {
|
|
61
|
+
detailedMessage += `\nExpected: ${expected}`;
|
|
62
|
+
detailedMessage += `\nActual: ${actual}`;
|
|
63
|
+
}
|
|
64
|
+
else if (expected !== null) {
|
|
65
|
+
detailedMessage += `\nExpected: ${expected}`;
|
|
66
|
+
}
|
|
67
|
+
else if (actual !== null) {
|
|
68
|
+
detailedMessage += `\nActual: ${actual}`;
|
|
69
|
+
}
|
|
70
|
+
super(detailedMessage, 'PARSING_ERROR', { ...meta, context: resolvedContext ?? meta.context ?? null });
|
|
71
|
+
this.name = 'ParsingError';
|
|
72
|
+
this.lineNumber = lineNumber;
|
|
73
|
+
this.column = column;
|
|
74
|
+
this.context = resolvedContext ?? meta.context ?? null;
|
|
75
|
+
this.expected = expected;
|
|
76
|
+
this.actual = actual;
|
|
77
|
+
this.originalMessage = message;
|
|
78
|
+
}
|
|
79
|
+
static csvFormat(message, lineNumber = null, column = null, rowContent = null) {
|
|
80
|
+
let context = null;
|
|
81
|
+
if (rowContent !== null) {
|
|
82
|
+
context = `Row content: "${rowContent.substring(0, 100)}${rowContent.length > 100 ? '...' : ''}"`;
|
|
83
|
+
}
|
|
84
|
+
return new ParsingError(`CSV format error: ${message}`, lineNumber, column, context);
|
|
85
|
+
}
|
|
86
|
+
static fieldCountMismatch(expectedCount, actualCount, lineNumber = null, rowContent = null) {
|
|
87
|
+
return new ParsingError('Field count mismatch', lineNumber, null, rowContent ? `Row: "${rowContent.substring(0, 100)}${rowContent.length > 100 ? '...' : ''}"` : null, `${expectedCount} fields`, `${actualCount} fields`);
|
|
88
|
+
}
|
|
89
|
+
static unclosedQuotes(lineNumber = null, column = null, content = null) {
|
|
90
|
+
return new ParsingError('Unclosed quotes in CSV', lineNumber, column, content ? `Content: "${content}"` : null);
|
|
91
|
+
}
|
|
92
|
+
static invalidDelimiter(delimiter, lineNumber = null, context = null) {
|
|
93
|
+
return new ParsingError(`Invalid delimiter '${delimiter}'`, lineNumber, null, context);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
exports.ParsingError = ParsingError;
|
|
97
|
+
class LimitError extends JtcsvError {
|
|
98
|
+
constructor(message, limit, actual, meta = {}) {
|
|
99
|
+
super(message, 'LIMIT_ERROR', meta);
|
|
100
|
+
this.name = 'LimitError';
|
|
101
|
+
this.limit = limit;
|
|
102
|
+
this.actual = actual;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
exports.LimitError = LimitError;
|
|
106
|
+
class ConfigurationError extends JtcsvError {
|
|
107
|
+
constructor(message, meta = {}) {
|
|
108
|
+
super(message, 'CONFIGURATION_ERROR', meta);
|
|
109
|
+
this.name = 'ConfigurationError';
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
exports.ConfigurationError = ConfigurationError;
|
|
113
|
+
function createDetailedErrorMessage(baseMessage, details = {}) {
|
|
114
|
+
let message = baseMessage;
|
|
115
|
+
if (details.lineNumber !== undefined) {
|
|
116
|
+
message += ` at line ${details.lineNumber}`;
|
|
117
|
+
}
|
|
118
|
+
if (details.column !== undefined) {
|
|
119
|
+
message += `, column ${details.column}`;
|
|
120
|
+
}
|
|
121
|
+
if (details.context !== undefined) {
|
|
122
|
+
message += `\nContext: ${details.context}`;
|
|
123
|
+
}
|
|
124
|
+
if (details.expected !== undefined) {
|
|
125
|
+
message += `\nExpected: ${details.expected}`;
|
|
126
|
+
}
|
|
127
|
+
if (details.actual !== undefined) {
|
|
128
|
+
message += `\nActual: ${details.actual}`;
|
|
129
|
+
}
|
|
130
|
+
if (details.suggestion !== undefined) {
|
|
131
|
+
message += `\nSuggestion: ${details.suggestion}`;
|
|
132
|
+
}
|
|
133
|
+
if (details.codeSnippet !== undefined) {
|
|
134
|
+
message += `\nCode snippet: ${details.codeSnippet}`;
|
|
135
|
+
}
|
|
136
|
+
if (details.hint !== undefined) {
|
|
137
|
+
message += `\nHint: ${details.hint}`;
|
|
138
|
+
}
|
|
139
|
+
if (details.docs !== undefined) {
|
|
140
|
+
message += `\nDocs: ${details.docs}`;
|
|
141
|
+
}
|
|
142
|
+
return message;
|
|
143
|
+
}
|
|
144
|
+
class ErrorContext {
|
|
145
|
+
constructor() {
|
|
146
|
+
this.details = {};
|
|
147
|
+
}
|
|
148
|
+
lineNumber(line) {
|
|
149
|
+
this.details.lineNumber = line;
|
|
150
|
+
return this;
|
|
151
|
+
}
|
|
152
|
+
column(col) {
|
|
153
|
+
this.details.column = col;
|
|
154
|
+
return this;
|
|
155
|
+
}
|
|
156
|
+
context(ctx) {
|
|
157
|
+
this.details.context = ctx;
|
|
158
|
+
return this;
|
|
159
|
+
}
|
|
160
|
+
expected(exp) {
|
|
161
|
+
this.details.expected = exp;
|
|
162
|
+
return this;
|
|
163
|
+
}
|
|
164
|
+
actual(act) {
|
|
165
|
+
this.details.actual = act;
|
|
166
|
+
return this;
|
|
167
|
+
}
|
|
168
|
+
suggestion(sugg) {
|
|
169
|
+
this.details.suggestion = sugg;
|
|
170
|
+
return this;
|
|
171
|
+
}
|
|
172
|
+
codeSnippet(snippet) {
|
|
173
|
+
this.details.codeSnippet = snippet;
|
|
174
|
+
return this;
|
|
175
|
+
}
|
|
176
|
+
hint(text) {
|
|
177
|
+
this.details.hint = text;
|
|
178
|
+
return this;
|
|
179
|
+
}
|
|
180
|
+
docs(link) {
|
|
181
|
+
this.details.docs = link;
|
|
182
|
+
return this;
|
|
183
|
+
}
|
|
184
|
+
buildMessage(baseMessage) {
|
|
185
|
+
return createDetailedErrorMessage(baseMessage, this.details);
|
|
186
|
+
}
|
|
187
|
+
throwParsingError(baseMessage) {
|
|
188
|
+
const message = this.buildMessage(baseMessage);
|
|
189
|
+
const meta = {
|
|
190
|
+
hint: this.details.hint ?? this.details.suggestion,
|
|
191
|
+
docs: this.details.docs,
|
|
192
|
+
context: this.details.context
|
|
193
|
+
};
|
|
194
|
+
throw new ParsingError(message, this.details.lineNumber, this.details.column, this.details.context, this.details.expected, this.details.actual, meta);
|
|
195
|
+
}
|
|
196
|
+
throwValidationError(baseMessage) {
|
|
197
|
+
const message = this.buildMessage(baseMessage);
|
|
198
|
+
throw new ValidationError(message, {
|
|
199
|
+
hint: this.details.hint ?? this.details.suggestion,
|
|
200
|
+
docs: this.details.docs,
|
|
201
|
+
context: this.details.context
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
exports.ErrorContext = ErrorContext;
|
|
206
|
+
exports.ERROR_CODES = {
|
|
207
|
+
JTCSV_ERROR: 'JTCSV_ERROR',
|
|
208
|
+
VALIDATION_ERROR: 'VALIDATION_ERROR',
|
|
209
|
+
SECURITY_ERROR: 'SECURITY_ERROR',
|
|
210
|
+
FILE_SYSTEM_ERROR: 'FILE_SYSTEM_ERROR',
|
|
211
|
+
PARSING_ERROR: 'PARSING_ERROR',
|
|
212
|
+
LIMIT_ERROR: 'LIMIT_ERROR',
|
|
213
|
+
CONFIGURATION_ERROR: 'CONFIGURATION_ERROR',
|
|
214
|
+
INVALID_INPUT: 'INVALID_INPUT',
|
|
215
|
+
SECURITY_VIOLATION: 'SECURITY_VIOLATION',
|
|
216
|
+
FILE_NOT_FOUND: 'FILE_NOT_FOUND',
|
|
217
|
+
PARSE_FAILED: 'PARSE_FAILED',
|
|
218
|
+
SIZE_LIMIT: 'SIZE_LIMIT',
|
|
219
|
+
INVALID_CONFIG: 'INVALID_CONFIG',
|
|
220
|
+
UNKNOWN_ERROR: 'UNKNOWN_ERROR',
|
|
221
|
+
STREAM_CREATION_ERROR: 'STREAM_CREATION_ERROR',
|
|
222
|
+
STREAM_PROCESSING_ERROR: 'STREAM_PROCESSING_ERROR'
|
|
223
|
+
};
|
|
224
|
+
function createErrorMessage(type, details) {
|
|
225
|
+
const messages = {
|
|
226
|
+
INVALID_INPUT: `Invalid input: ${details}`,
|
|
227
|
+
SECURITY_VIOLATION: `Security violation: ${details}`,
|
|
228
|
+
FILE_NOT_FOUND: `File not found: ${details}`,
|
|
229
|
+
PARSE_FAILED: `Parse failed: ${details}`,
|
|
230
|
+
SIZE_LIMIT: `Size limit exceeded: ${details}`,
|
|
231
|
+
INVALID_CONFIG: `Invalid configuration: ${details}`,
|
|
232
|
+
UNKNOWN_ERROR: `Unknown error: ${details}`,
|
|
233
|
+
JTCSV_ERROR: `JTCSV error: ${details}`,
|
|
234
|
+
VALIDATION_ERROR: `Validation error: ${details}`,
|
|
235
|
+
SECURITY_ERROR: `Security error: ${details}`,
|
|
236
|
+
FILE_SYSTEM_ERROR: `File system error: ${details}`,
|
|
237
|
+
PARSING_ERROR: `Parsing error: ${details}`,
|
|
238
|
+
LIMIT_ERROR: `Limit error: ${details}`,
|
|
239
|
+
CONFIGURATION_ERROR: `Configuration error: ${details}`,
|
|
240
|
+
STREAM_CREATION_ERROR: `Stream creation error: ${details}`,
|
|
241
|
+
STREAM_PROCESSING_ERROR: `Stream processing error: ${details}`
|
|
242
|
+
};
|
|
243
|
+
return messages[type] || messages.UNKNOWN_ERROR;
|
|
244
|
+
}
|
|
245
|
+
function handleError(error, context = {}) {
|
|
246
|
+
if (process.env['NODE_ENV'] === 'development') {
|
|
247
|
+
console.error(`[jtcsv] Error in ${context['function'] || 'unknown'}:`, {
|
|
248
|
+
message: error.message,
|
|
249
|
+
code: error.code,
|
|
250
|
+
stack: error.stack,
|
|
251
|
+
context
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
throw error;
|
|
255
|
+
}
|
|
256
|
+
async function safeExecuteAsync(fn, errorType, context = {}) {
|
|
257
|
+
try {
|
|
258
|
+
return await fn();
|
|
259
|
+
}
|
|
260
|
+
catch (error) {
|
|
261
|
+
if (error instanceof JtcsvError) {
|
|
262
|
+
throw error;
|
|
263
|
+
}
|
|
264
|
+
const message = createErrorMessage(errorType, error.message);
|
|
265
|
+
const wrappedError = new JtcsvError(message, errorType);
|
|
266
|
+
wrappedError.originalError = error;
|
|
267
|
+
handleError(wrappedError, context);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
function safeExecuteSync(fn, errorType, context = {}) {
|
|
271
|
+
try {
|
|
272
|
+
return fn();
|
|
273
|
+
}
|
|
274
|
+
catch (error) {
|
|
275
|
+
if (error instanceof JtcsvError) {
|
|
276
|
+
throw error;
|
|
277
|
+
}
|
|
278
|
+
const message = createErrorMessage(errorType, error.message);
|
|
279
|
+
const wrappedError = new JtcsvError(message, errorType);
|
|
280
|
+
wrappedError.originalError = error;
|
|
281
|
+
handleError(wrappedError, context);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
function safeExecute(fn, errorType, context = {}) {
|
|
285
|
+
const result = fn();
|
|
286
|
+
if (result && typeof result.then === 'function') {
|
|
287
|
+
return safeExecuteAsync(() => result, errorType, context);
|
|
288
|
+
}
|
|
289
|
+
return safeExecuteSync(() => result, errorType, context);
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../errors.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * Custom error classes for jtcsv\r\n */\r\n\r\nexport type ErrorContextValue = Record<string, any> | string | null;\n\nexport interface ErrorMeta {\n hint?: string;\n docs?: string;\n context?: ErrorContextValue;\n originalError?: Error;\n}\n\n/**\n * Base error class for jtcsv\n */\nexport class JtcsvError extends Error {\n code: string;\n hint?: string;\n docs?: string;\n context?: ErrorContextValue;\n originalError?: Error;\n \n constructor(message: string, code: string = 'JTCSV_ERROR', meta: ErrorMeta = {}) {\n super(message);\n this.name = 'JtcsvError';\n this.code = code;\n this.hint = meta.hint;\n this.docs = meta.docs;\n this.context = meta.context;\n this.originalError = meta.originalError;\n \n // Maintains proper stack trace for where our error was thrown\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, JtcsvError);\n }\n }\n}\n\r\n/**\r\n * Error for invalid input data\r\n */\r\nexport class ValidationError extends JtcsvError {\n constructor(message: string, meta: ErrorMeta = {}) {\n super(message, 'VALIDATION_ERROR', meta);\n this.name = 'ValidationError';\n }\n}\n\r\n/**\r\n * Error for security violations\r\n */\r\nexport class SecurityError extends JtcsvError {\n constructor(message: string, meta: ErrorMeta = {}) {\n super(message, 'SECURITY_ERROR', meta);\n this.name = 'SecurityError';\n }\n}\n\r\n/**\r\n * Error for file system operations\r\n */\r\nexport class FileSystemError extends JtcsvError {\n originalError: Error | null;\n \n constructor(message: string, originalError: Error | null = null, meta: ErrorMeta = {}) {\n super(message, 'FILE_SYSTEM_ERROR', { ...meta, originalError });\n this.name = 'FileSystemError';\n this.originalError = originalError ?? meta.originalError ?? null;\n }\n}\n\r\n/**\r\n * Error for parsing/formatting issues\r\n */\r\nexport class ParsingError extends JtcsvError {\n lineNumber: number | null;\n column: number | null;\n context: ErrorContextValue;\n expected: string | null;\n actual: string | null;\n originalMessage: string;\n \r\n constructor(\r\n message: string,\n lineNumber: number | null = null,\n column: number | null = null,\n context: string | null = null,\n expected: string | null = null,\n actual: string | null = null,\n meta: ErrorMeta = {}\n ) {\n const resolvedContext = context ?? (typeof meta.context === 'string' ? meta.context : null);\n // Build detailed message\n let detailedMessage = message;\n \n if (lineNumber !== null) {\n detailedMessage += ` at line ${lineNumber}`;\n if (column !== null) {\r\n detailedMessage += `, column ${column}`;\r\n }\r\n }\r\n \r\n if (resolvedContext !== null) {\n detailedMessage += `\\nContext: ${resolvedContext}`;\n }\n \r\n if (expected !== null && actual !== null) {\r\n detailedMessage += `\\nExpected: ${expected}`;\r\n detailedMessage += `\\nActual: ${actual}`;\r\n } else if (expected !== null) {\r\n detailedMessage += `\\nExpected: ${expected}`;\r\n } else if (actual !== null) {\r\n detailedMessage += `\\nActual: ${actual}`;\r\n }\r\n \r\n super(detailedMessage, 'PARSING_ERROR', { ...meta, context: resolvedContext ?? meta.context ?? null });\n this.name = 'ParsingError';\n this.lineNumber = lineNumber;\n this.column = column;\n this.context = resolvedContext ?? meta.context ?? null;\n this.expected = expected;\n this.actual = actual;\n this.originalMessage = message;\n }\n \r\n /**\r\n * Create a ParsingError for CSV format issues\r\n */\r\n static csvFormat(\r\n message: string,\r\n lineNumber: number | null = null,\r\n column: number | null = null,\r\n rowContent: string | null = null\r\n ): ParsingError {\r\n let context: string | null = null;\r\n if (rowContent !== null) {\r\n context = `Row content: \"${rowContent.substring(0, 100)}${rowContent.length > 100 ? '...' : ''}\"`;\r\n }\r\n \r\n return new ParsingError(\r\n `CSV format error: ${message}`,\r\n lineNumber,\r\n column,\r\n context\r\n );\r\n }\r\n \r\n /**\r\n * Create a ParsingError for field count mismatch\r\n */\r\n static fieldCountMismatch(\r\n expectedCount: number,\r\n actualCount: number,\r\n lineNumber: number | null = null,\r\n rowContent: string | null = null\r\n ): ParsingError {\r\n return new ParsingError(\r\n 'Field count mismatch',\r\n lineNumber,\r\n null,\r\n rowContent ? `Row: \"${rowContent.substring(0, 100)}${rowContent.length > 100 ? '...' : ''}\"` : null,\r\n `${expectedCount} fields`,\r\n `${actualCount} fields`\r\n );\r\n }\r\n \r\n /**\r\n * Create a ParsingError for unclosed quotes\r\n */\r\n static unclosedQuotes(\r\n lineNumber: number | null = null,\r\n column: number | null = null,\r\n content: string | null = null\r\n ): ParsingError {\r\n return new ParsingError(\r\n 'Unclosed quotes in CSV',\r\n lineNumber,\r\n column,\r\n content ? `Content: \"${content}\"` : null\r\n );\r\n }\r\n \r\n /**\r\n * Create a ParsingError for invalid delimiter\r\n */\r\n static invalidDelimiter(\r\n delimiter: string,\r\n lineNumber: number | null = null,\r\n context: string | null = null\r\n ): ParsingError {\r\n return new ParsingError(\r\n `Invalid delimiter '${delimiter}'`,\r\n lineNumber,\r\n null,\r\n context\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Error for size/limit violations\r\n */\r\nexport class LimitError extends JtcsvError {\n limit: any;\n actual: any;\n \n constructor(message: string, limit: any, actual: any, meta: ErrorMeta = {}) {\n super(message, 'LIMIT_ERROR', meta);\n this.name = 'LimitError';\n this.limit = limit;\n this.actual = actual;\n }\n}\n\r\n/**\r\n * Error for configuration issues\r\n */\r\nexport class ConfigurationError extends JtcsvError {\n constructor(message: string, meta: ErrorMeta = {}) {\n super(message, 'CONFIGURATION_ERROR', meta);\n this.name = 'ConfigurationError';\n }\n}\n\r\n/**\r\n * Utility function to create detailed error messages\r\n */\r\nexport function createDetailedErrorMessage(\n baseMessage: string,\n details: {\n lineNumber?: number;\n column?: number;\n context?: string;\n expected?: string;\n actual?: string;\n suggestion?: string;\n codeSnippet?: string;\n hint?: string;\n docs?: string;\n } = {}\n): string {\n let message = baseMessage;\n \r\n if (details.lineNumber !== undefined) {\r\n message += ` at line ${details.lineNumber}`;\r\n }\r\n \r\n if (details.column !== undefined) {\r\n message += `, column ${details.column}`;\r\n }\r\n \r\n if (details.context !== undefined) {\r\n message += `\\nContext: ${details.context}`;\r\n }\r\n \r\n if (details.expected !== undefined) {\r\n message += `\\nExpected: ${details.expected}`;\r\n }\r\n \r\n if (details.actual !== undefined) {\r\n message += `\\nActual: ${details.actual}`;\r\n }\r\n \r\n if (details.suggestion !== undefined) {\n message += `\\nSuggestion: ${details.suggestion}`;\n }\n \n if (details.codeSnippet !== undefined) {\n message += `\\nCode snippet: ${details.codeSnippet}`;\n }\n\n if (details.hint !== undefined) {\n message += `\\nHint: ${details.hint}`;\n }\n\n if (details.docs !== undefined) {\n message += `\\nDocs: ${details.docs}`;\n }\n \n return message;\n}\n\r\n/**\r\n * Error context builder for better debugging\r\n */\r\nexport class ErrorContext {\n private details: {\n lineNumber?: number;\n column?: number;\n context?: string;\n expected?: string;\n actual?: string;\n suggestion?: string;\n codeSnippet?: string;\n hint?: string;\n docs?: string;\n } = {};\n \r\n lineNumber(line: number): this {\r\n this.details.lineNumber = line;\r\n return this;\r\n }\r\n \r\n column(col: number): this {\r\n this.details.column = col;\r\n return this;\r\n }\r\n \r\n context(ctx: string): this {\r\n this.details.context = ctx;\r\n return this;\r\n }\r\n \r\n expected(exp: string): this {\r\n this.details.expected = exp;\r\n return this;\r\n }\r\n \r\n actual(act: string): this {\r\n this.details.actual = act;\r\n return this;\r\n }\r\n \r\n suggestion(sugg: string): this {\n this.details.suggestion = sugg;\n return this;\n }\n \n codeSnippet(snippet: string): this {\n this.details.codeSnippet = snippet;\n return this;\n }\n\n hint(text: string): this {\n this.details.hint = text;\n return this;\n }\n\n docs(link: string): this {\n this.details.docs = link;\n return this;\n }\n \r\n buildMessage(baseMessage: string): string {\r\n return createDetailedErrorMessage(baseMessage, this.details);\r\n }\r\n \r\n throwParsingError(baseMessage: string): never {\n const message = this.buildMessage(baseMessage);\n const meta: ErrorMeta = {\n hint: this.details.hint ?? this.details.suggestion,\n docs: this.details.docs,\n context: this.details.context\n };\n throw new ParsingError(\n message,\n this.details.lineNumber,\n this.details.column,\n this.details.context,\n this.details.expected,\n this.details.actual,\n meta\n );\n }\n \n throwValidationError(baseMessage: string): never {\n const message = this.buildMessage(baseMessage);\n throw new ValidationError(message, {\n hint: this.details.hint ?? this.details.suggestion,\n docs: this.details.docs,\n context: this.details.context\n });\n }\n}\n\r\nexport const ERROR_CODES = {\r\n JTCSV_ERROR: 'JTCSV_ERROR',\r\n VALIDATION_ERROR: 'VALIDATION_ERROR',\r\n SECURITY_ERROR: 'SECURITY_ERROR',\r\n FILE_SYSTEM_ERROR: 'FILE_SYSTEM_ERROR',\r\n PARSING_ERROR: 'PARSING_ERROR',\r\n LIMIT_ERROR: 'LIMIT_ERROR',\r\n CONFIGURATION_ERROR: 'CONFIGURATION_ERROR',\r\n INVALID_INPUT: 'INVALID_INPUT',\r\n SECURITY_VIOLATION: 'SECURITY_VIOLATION',\r\n FILE_NOT_FOUND: 'FILE_NOT_FOUND',\r\n PARSE_FAILED: 'PARSE_FAILED',\r\n SIZE_LIMIT: 'SIZE_LIMIT',\r\n INVALID_CONFIG: 'INVALID_CONFIG',\r\n UNKNOWN_ERROR: 'UNKNOWN_ERROR',\r\n STREAM_CREATION_ERROR: 'STREAM_CREATION_ERROR',\r\n STREAM_PROCESSING_ERROR: 'STREAM_PROCESSING_ERROR'\r\n} as const;\r\n\r\nexport type ErrorCode = typeof ERROR_CODES[keyof typeof ERROR_CODES];\r\n\r\n/**\r\n * Utility function to create standardized error messages\r\n */\r\nexport function createErrorMessage(type: ErrorCode, details: string): string {\r\n const messages: Record<ErrorCode, string> = {\r\n INVALID_INPUT: `Invalid input: ${details}`,\r\n SECURITY_VIOLATION: `Security violation: ${details}`,\r\n FILE_NOT_FOUND: `File not found: ${details}`,\r\n PARSE_FAILED: `Parse failed: ${details}`,\r\n SIZE_LIMIT: `Size limit exceeded: ${details}`,\r\n INVALID_CONFIG: `Invalid configuration: ${details}`,\r\n UNKNOWN_ERROR: `Unknown error: ${details}`,\r\n // Добавляем остальные коды для полноты\r\n JTCSV_ERROR: `JTCSV error: ${details}`,\r\n VALIDATION_ERROR: `Validation error: ${details}`,\r\n SECURITY_ERROR: `Security error: ${details}`,\r\n FILE_SYSTEM_ERROR: `File system error: ${details}`,\r\n PARSING_ERROR: `Parsing error: ${details}`,\r\n LIMIT_ERROR: `Limit error: ${details}`,\r\n CONFIGURATION_ERROR: `Configuration error: ${details}`,\r\n STREAM_CREATION_ERROR: `Stream creation error: ${details}`,\r\n STREAM_PROCESSING_ERROR: `Stream processing error: ${details}`\r\n };\r\n \r\n return messages[type] || messages.UNKNOWN_ERROR;\r\n}\r\n\r\n/**\r\n * Error handler utility\r\n */\r\n/* istanbul ignore next */\r\nexport function handleError(error: Error, context: Record<string, any> = {}): never {\r\n // Log error in development\r\n if (process.env['NODE_ENV'] === 'development') {\r\n console.error(`[jtcsv] Error in ${context['function'] || 'unknown'}:`, {\r\n message: error.message,\r\n code: (error as any).code,\r\n stack: error.stack,\r\n context\r\n });\r\n }\r\n \r\n // Re-throw the error\r\n throw error;\r\n}\r\n\r\n/**\r\n * Safe execution wrapper for async functions\r\n */\r\n/* istanbul ignore next */\r\nexport async function safeExecuteAsync<T>(\r\n fn: () => Promise<T>,\r\n errorType: ErrorCode,\r\n context: Record<string, any> = {}\r\n): Promise<T> {\r\n try {\r\n return await fn();\r\n } catch (error) {\r\n if (error instanceof JtcsvError) {\r\n throw error;\r\n }\r\n \r\n // Wrap unknown errors\r\n const message = createErrorMessage(errorType, (error as Error).message);\r\n const wrappedError = new JtcsvError(message, errorType);\r\n (wrappedError as any).originalError = error;\r\n \r\n handleError(wrappedError, context);\r\n }\r\n}\r\n\r\n/**\r\n * Safe execution wrapper for sync functions\r\n */\r\nexport function safeExecuteSync<T>(\r\n fn: () => T,\r\n errorType: ErrorCode,\r\n context: Record<string, any> = {}\r\n): T {\r\n try {\r\n return fn();\r\n } catch (error) {\r\n if (error instanceof JtcsvError) {\r\n throw error;\r\n }\r\n \r\n // Wrap unknown errors\r\n const message = createErrorMessage(errorType, (error as Error).message);\r\n const wrappedError = new JtcsvError(message, errorType);\r\n (wrappedError as any).originalError = error;\r\n \r\n handleError(wrappedError, context);\r\n }\r\n}\r\n\r\n/**\r\n * Safe execution wrapper (auto-detects async/sync)\r\n */\r\nexport function safeExecute<T>(\r\n fn: () => T | Promise<T>,\r\n errorType: ErrorCode,\r\n context: Record<string, any> = {}\r\n): T | Promise<T> {\r\n const result = fn();\r\n \r\n // Check if function returns a promise\r\n if (result && typeof (result as any).then === 'function') {\r\n return safeExecuteAsync(() => result as Promise<T>, errorType, context);\r\n }\r\n \r\n return safeExecuteSync(() => result as T, errorType, context);\r\n}\r\n\r\n// Экспорт типов для использования в других модулях\r\nexport type {\r\n // Типы ошибок\r\n JtcsvError as JtcsvErrorType,\r\n ValidationError as ValidationErrorType,\r\n SecurityError as SecurityErrorType,\r\n FileSystemError as FileSystemErrorType,\r\n ParsingError as ParsingErrorType,\r\n LimitError as LimitErrorType,\r\n ConfigurationError as ConfigurationErrorType\r\n};\n"]}
|