sonamu 0.10.11 → 0.10.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai/agents/agent.d.ts +1 -1
- package/dist/ai/agents/agent.d.ts.map +1 -1
- package/dist/ai/agents/agent.js +5 -6
- package/dist/ai/agents/types.d.ts +1 -1
- package/dist/ai/agents/types.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/api.js +18 -18
- package/dist/ai/providers/rtzr/error.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/error.js +17 -15
- package/dist/ai/providers/rtzr/model.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/model.js +3 -2
- package/dist/ai/providers/rtzr/options.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/options.js +16 -16
- package/dist/ai/providers/rtzr/provider.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/provider.js +9 -9
- package/dist/ai/providers/rtzr/utils.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/utils.js +1 -1
- package/dist/api/caster.d.ts.map +1 -1
- package/dist/api/caster.js +17 -17
- package/dist/api/code-converters.d.ts +4 -2
- package/dist/api/code-converters.d.ts.map +1 -1
- package/dist/api/code-converters.js +100 -19
- package/dist/api/config.d.ts +16 -1
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +28 -21
- package/dist/api/context.d.ts +2 -2
- package/dist/api/context.d.ts.map +1 -1
- package/dist/api/context.js +1 -1
- package/dist/api/decorators.d.ts.map +1 -1
- package/dist/api/decorators.js +18 -11
- package/dist/api/http-validator.d.ts +36 -0
- package/dist/api/http-validator.d.ts.map +1 -0
- package/dist/api/http-validator.js +72 -0
- package/dist/api/index.js +6 -4
- package/dist/api/sonamu.d.ts +59 -20
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +250 -106
- package/dist/api/websocket-helpers.d.ts +7 -5
- package/dist/api/websocket-helpers.d.ts.map +1 -1
- package/dist/api/websocket-helpers.js +6 -6
- package/dist/auth/audit-log/builders.d.ts.map +1 -1
- package/dist/auth/audit-log/builders.js +1 -1
- package/dist/auth/audit-log/client-ip.d.ts +1 -1
- package/dist/auth/audit-log/client-ip.d.ts.map +1 -1
- package/dist/auth/audit-log/client-ip.js +4 -2
- package/dist/auth/audit-log/events.d.ts +5 -1
- package/dist/auth/audit-log/events.d.ts.map +1 -1
- package/dist/auth/audit-log/events.js +1 -1
- package/dist/auth/audit-log/plugin.d.ts +0 -8
- package/dist/auth/audit-log/plugin.d.ts.map +1 -1
- package/dist/auth/audit-log/plugin.js +48 -52
- package/dist/auth/audit-log-ingestor.d.ts.map +1 -1
- package/dist/auth/audit-log-ingestor.js +16 -12
- package/dist/auth/auth-generator.d.ts.map +1 -1
- package/dist/auth/auth-generator.js +1 -1
- package/dist/auth/better-auth-request.d.ts.map +1 -1
- package/dist/auth/better-auth-request.js +6 -5
- package/dist/auth/knex-adapter.js +1 -1
- package/dist/auth/plugins/entity-definitions/index.d.ts +13 -1
- package/dist/auth/plugins/entity-definitions/index.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/index.js +1 -1
- package/dist/auth/plugins/wrappers/admin.d.ts +1 -1
- package/dist/bin/build-config.d.ts +25 -0
- package/dist/bin/build-config.d.ts.map +1 -1
- package/dist/bin/build-config.js +105 -2
- package/dist/bin/cli.js +133 -29
- package/dist/bin/compiler-policy.d.ts +3 -0
- package/dist/bin/compiler-policy.d.ts.map +1 -0
- package/dist/bin/compiler-policy.js +24 -0
- package/dist/bin/fixture.d.ts.map +1 -1
- package/dist/bin/fixture.js +5 -3
- package/dist/bin/test-command.d.ts +22 -1
- package/dist/bin/test-command.d.ts.map +1 -1
- package/dist/bin/test-command.js +18 -10
- package/dist/bin/ts-loader-registration.d.ts +7 -1
- package/dist/bin/ts-loader-registration.d.ts.map +1 -1
- package/dist/bin/ts-loader-registration.js +13 -4
- package/dist/cache/decorator.d.ts.map +1 -1
- package/dist/cache/decorator.js +11 -4
- package/dist/compress/compress.d.ts.map +1 -1
- package/dist/compress/compress.js +1 -1
- package/dist/cone/cone-generator.d.ts +14 -1
- package/dist/cone/cone-generator.d.ts.map +1 -1
- package/dist/cone/cone-generator.js +13 -9
- package/dist/database/_batch_update.js +1 -1
- package/dist/database/base-model.d.ts +22 -10
- package/dist/database/base-model.d.ts.map +1 -1
- package/dist/database/base-model.js +26 -16
- package/dist/database/base-model.types.d.ts +15 -3
- package/dist/database/base-model.types.d.ts.map +1 -1
- package/dist/database/db.d.ts +12 -2
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +10 -7
- package/dist/database/knex.d.ts.map +1 -1
- package/dist/database/knex.js +17 -14
- package/dist/database/puri.d.ts +11 -9
- package/dist/database/puri.d.ts.map +1 -1
- package/dist/database/puri.js +93 -79
- package/dist/database/puri.types.d.ts +21 -21
- package/dist/database/puri.types.d.ts.map +1 -1
- package/dist/database/puri.types.js +1 -1
- package/dist/database/upsert-builder.d.ts +12 -10
- package/dist/database/upsert-builder.d.ts.map +1 -1
- package/dist/database/upsert-builder.js +20 -12
- package/dist/dict/sd.d.ts.map +1 -1
- package/dist/dict/sd.js +1 -1
- package/dist/dict/sonamu-dictionary.d.ts.map +1 -1
- package/dist/dict/sonamu-dictionary.js +1 -1
- package/dist/dict/utils.d.ts.map +1 -1
- package/dist/dict/utils.js +7 -2
- package/dist/entity/entity-manager.d.ts +13 -4
- package/dist/entity/entity-manager.d.ts.map +1 -1
- package/dist/entity/entity-manager.js +19 -11
- package/dist/entity/entity-template-cone.d.ts +73 -5
- package/dist/entity/entity-template-cone.d.ts.map +1 -1
- package/dist/entity/entity-template-cone.js +4 -2
- package/dist/entity/entity.d.ts +6 -2
- package/dist/entity/entity.d.ts.map +1 -1
- package/dist/entity/entity.js +30 -28
- package/dist/env.d.ts +3 -1
- package/dist/env.d.ts.map +1 -1
- package/dist/env.js +1 -1
- package/dist/exceptions/error-handler.d.ts.map +1 -1
- package/dist/exceptions/error-handler.js +7 -2
- package/dist/exceptions/so-exceptions.d.ts +24 -20
- package/dist/exceptions/so-exceptions.d.ts.map +1 -1
- package/dist/exceptions/so-exceptions.js +4 -2
- package/dist/filter/utils.d.ts +7 -2
- package/dist/filter/utils.d.ts.map +1 -1
- package/dist/filter/utils.js +8 -6
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -7
- package/dist/logger/configure.d.ts.map +1 -1
- package/dist/logger/configure.js +10 -10
- package/dist/migration/code-generation.d.ts.map +1 -1
- package/dist/migration/code-generation.js +50 -46
- package/dist/migration/index-where-predicate.d.ts.map +1 -1
- package/dist/migration/index-where-predicate.js +22 -8
- package/dist/migration/migration-set.d.ts.map +1 -1
- package/dist/migration/migration-set.js +1 -1
- package/dist/migration/migrator.d.ts +61 -36
- package/dist/migration/migrator.d.ts.map +1 -1
- package/dist/migration/migrator.js +276 -167
- package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
- package/dist/migration/postgresql-schema-reader.js +51 -36
- package/dist/migration/slack-confirm.d.ts.map +1 -1
- package/dist/migration/slack-confirm.js +1 -1
- package/dist/migration/types.d.ts +54 -0
- package/dist/migration/types.d.ts.map +1 -1
- package/dist/naite/naite-reporter.js +2 -2
- package/dist/naite/naite.d.ts +74 -15
- package/dist/naite/naite.d.ts.map +1 -1
- package/dist/naite/naite.js +5 -19
- package/dist/runtime-type.d.ts +6 -0
- package/dist/runtime-type.d.ts.map +1 -0
- package/dist/runtime-type.js +26 -0
- package/dist/ssr/hmr-opt-out.d.ts +26 -0
- package/dist/ssr/hmr-opt-out.d.ts.map +1 -0
- package/dist/ssr/hmr-opt-out.js +59 -0
- package/dist/ssr/renderer.d.ts.map +1 -1
- package/dist/ssr/renderer.js +4 -1
- package/dist/storage/base-file.js +14 -14
- package/dist/storage/buffered-file.d.ts +2 -2
- package/dist/storage/buffered-file.d.ts.map +1 -1
- package/dist/storage/buffered-file.js +12 -12
- package/dist/storage/s3-driver.d.ts.map +1 -1
- package/dist/storage/s3-driver.js +1 -1
- package/dist/storage/uploaded-file.d.ts +2 -2
- package/dist/storage/uploaded-file.d.ts.map +1 -1
- package/dist/storage/uploaded-file.js +8 -8
- package/dist/stream/sse.js +11 -11
- package/dist/stream/ws-core.d.ts +1 -1
- package/dist/stream/ws-core.d.ts.map +1 -1
- package/dist/stream/ws-delivery.d.ts +1 -1
- package/dist/stream/ws-delivery.d.ts.map +1 -1
- package/dist/stream/ws-delivery.js +6 -4
- package/dist/stream/ws-local-connection-store.d.ts.map +1 -1
- package/dist/stream/ws-local-connection-store.js +4 -2
- package/dist/stream/ws-presence-store.js +1 -1
- package/dist/stream/ws-registry.d.ts +4 -4
- package/dist/stream/ws-registry.d.ts.map +1 -1
- package/dist/stream/ws-registry.js +4 -2
- package/dist/stream/ws-telemetry.d.ts +16 -12
- package/dist/stream/ws-telemetry.d.ts.map +1 -1
- package/dist/stream/ws-telemetry.js +22 -18
- package/dist/stream/ws.d.ts +18 -12
- package/dist/stream/ws.d.ts.map +1 -1
- package/dist/stream/ws.js +26 -22
- package/dist/syncer/api-parser.js +1 -1
- package/dist/syncer/checksum.d.ts.map +1 -1
- package/dist/syncer/checksum.js +7 -8
- package/dist/syncer/code-generator.d.ts.map +1 -1
- package/dist/syncer/code-generator.js +13 -14
- package/dist/syncer/entity-operations.d.ts.map +1 -1
- package/dist/syncer/entity-operations.js +5 -6
- package/dist/syncer/file-copy.d.ts +5 -0
- package/dist/syncer/file-copy.d.ts.map +1 -0
- package/dist/syncer/file-copy.js +36 -0
- package/dist/syncer/file-patterns.d.ts +1 -0
- package/dist/syncer/file-patterns.d.ts.map +1 -1
- package/dist/syncer/file-patterns.js +5 -2
- package/dist/syncer/file-tracking.d.ts.map +1 -1
- package/dist/syncer/file-tracking.js +5 -4
- package/dist/syncer/filesystem-dependencies.d.ts +15 -0
- package/dist/syncer/filesystem-dependencies.d.ts.map +1 -0
- package/dist/syncer/filesystem-dependencies.js +53 -0
- package/dist/syncer/module-loader.d.ts +1 -1
- package/dist/syncer/module-loader.d.ts.map +1 -1
- package/dist/syncer/module-loader.js +6 -4
- package/dist/syncer/syncer-actions.d.ts +4 -0
- package/dist/syncer/syncer-actions.d.ts.map +1 -1
- package/dist/syncer/syncer-actions.js +34 -17
- package/dist/syncer/syncer.d.ts +17 -6
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +71 -29
- package/dist/syncer/watcher.d.ts.map +1 -1
- package/dist/syncer/watcher.js +3 -3
- package/dist/tasks/decorator.d.ts +6 -6
- package/dist/tasks/decorator.d.ts.map +1 -1
- package/dist/tasks/decorator.js +4 -4
- package/dist/tasks/step-wrapper.d.ts +6 -4
- package/dist/tasks/step-wrapper.d.ts.map +1 -1
- package/dist/tasks/step-wrapper.js +5 -5
- package/dist/tasks/workflow-manager.d.ts.map +1 -1
- package/dist/tasks/workflow-manager.js +13 -7
- package/dist/template/entity-converter.d.ts +1 -1
- package/dist/template/entity-converter.d.ts.map +1 -1
- package/dist/template/entity-converter.js +2 -2
- package/dist/template/helpers.d.ts +8 -6
- package/dist/template/helpers.d.ts.map +1 -1
- package/dist/template/helpers.js +1 -1
- package/dist/template/implementations/generated.template.d.ts.map +1 -1
- package/dist/template/implementations/generated.template.js +4 -4
- package/dist/template/implementations/generated_http.template.d.ts +7 -4
- package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
- package/dist/template/implementations/generated_http.template.js +21 -21
- package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
- package/dist/template/implementations/generated_sso.template.js +6 -3
- package/dist/template/implementations/http_validators.template.d.ts +18 -0
- package/dist/template/implementations/http_validators.template.d.ts.map +1 -0
- package/dist/template/implementations/http_validators.template.js +127 -0
- package/dist/template/implementations/model.template.d.ts.map +1 -1
- package/dist/template/implementations/model.template.js +1 -1
- package/dist/template/implementations/queries.template.js +1 -1
- package/dist/template/implementations/sd.template.d.ts.map +1 -1
- package/dist/template/implementations/sd.template.js +79 -39
- package/dist/template/implementations/services.template.d.ts.map +1 -1
- package/dist/template/implementations/services.template.js +6 -4
- package/dist/template/implementations/view_form.template.d.ts +6 -1
- package/dist/template/implementations/view_form.template.d.ts.map +1 -1
- package/dist/template/implementations/view_form.template.js +23 -15
- package/dist/template/implementations/view_list.template.d.ts.map +1 -1
- package/dist/template/implementations/view_list.template.js +11 -6
- package/dist/template/template-manager.d.ts.map +1 -1
- package/dist/template/template-manager.js +9 -7
- package/dist/template/template-types.d.ts +12 -5
- package/dist/template/template-types.d.ts.map +1 -1
- package/dist/template/template-types.js +1 -1
- package/dist/template/template.d.ts +2 -2
- package/dist/template/template.d.ts.map +1 -1
- package/dist/template/template.js +6 -4
- package/dist/template/zod-converter.d.ts +0 -19
- package/dist/template/zod-converter.d.ts.map +1 -1
- package/dist/template/zod-converter.js +100 -84
- package/dist/testing/_relation-graph.d.ts.map +1 -1
- package/dist/testing/_relation-graph.js +2 -1
- package/dist/testing/bootstrap.d.ts.map +1 -1
- package/dist/testing/bootstrap.js +9 -6
- package/dist/testing/data-explorer.d.ts +32 -7
- package/dist/testing/data-explorer.d.ts.map +1 -1
- package/dist/testing/data-explorer.js +77 -31
- package/dist/testing/dev-test-routes.d.ts +8 -1
- package/dist/testing/dev-test-routes.d.ts.map +1 -1
- package/dist/testing/dev-test-routes.js +125 -108
- package/dist/testing/dev-vitest-manager.d.ts +54 -8
- package/dist/testing/dev-vitest-manager.d.ts.map +1 -1
- package/dist/testing/dev-vitest-manager.js +24 -9
- package/dist/testing/faker-mappings.d.ts +412 -1
- package/dist/testing/faker-mappings.d.ts.map +1 -1
- package/dist/testing/faker-mappings.js +1 -1
- package/dist/testing/filesystem.d.ts +2 -0
- package/dist/testing/filesystem.d.ts.map +1 -0
- package/dist/testing/filesystem.js +7 -0
- package/dist/testing/fixture-generator.d.ts +25 -8
- package/dist/testing/fixture-generator.d.ts.map +1 -1
- package/dist/testing/fixture-generator.js +132 -73
- package/dist/testing/fixture-loader.d.ts +3 -1
- package/dist/testing/fixture-loader.d.ts.map +1 -1
- package/dist/testing/fixture-loader.js +1 -20
- package/dist/testing/fixture-manager.d.ts +8 -7
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +91 -59
- package/dist/testing/global-setup.d.ts.map +1 -1
- package/dist/testing/global-setup.js +5 -2
- package/dist/testing/index.d.ts +2 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +6 -3
- package/dist/types/types.d.ts +101 -99
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +234 -225
- package/dist/ui/ai-api.d.ts.map +1 -1
- package/dist/ui/ai-api.js +1 -1
- package/dist/ui/ai-client.d.ts.map +1 -1
- package/dist/ui/ai-client.js +28 -18
- package/dist/ui/api.d.ts.map +1 -1
- package/dist/ui/api.js +146 -210
- package/dist/ui/async-route.d.ts +3 -0
- package/dist/ui/async-route.d.ts.map +1 -0
- package/dist/ui/async-route.js +12 -0
- package/dist/ui/cdd-service.d.ts +9 -7
- package/dist/ui/cdd-service.d.ts.map +1 -1
- package/dist/ui/cdd-service.js +7 -5
- package/dist/ui/migrations-api.d.ts +3 -0
- package/dist/ui/migrations-api.d.ts.map +1 -0
- package/dist/ui/migrations-api.js +215 -0
- package/dist/ui-web/assets/index-D3QNH-Dv.css +1 -0
- package/dist/ui-web/assets/index-DV1AAq6W.js +178 -0
- package/dist/ui-web/index.html +2 -2
- package/dist/utils/formatter.d.ts.map +1 -1
- package/dist/utils/formatter.js +7 -5
- package/dist/utils/fs-utils.d.ts +3 -3
- package/dist/utils/fs-utils.d.ts.map +1 -1
- package/dist/utils/fs-utils.js +6 -6
- package/dist/utils/model.d.ts +3 -5
- package/dist/utils/model.d.ts.map +1 -1
- package/dist/utils/model.js +1 -1
- package/dist/utils/object-utils.d.ts +1 -1
- package/dist/utils/object-utils.d.ts.map +1 -1
- package/dist/utils/object-utils.js +17 -16
- package/dist/utils/process-utils.d.ts.map +1 -1
- package/dist/utils/process-utils.js +4 -2
- package/dist/utils/runtime-value.d.ts +13 -0
- package/dist/utils/runtime-value.d.ts.map +1 -0
- package/dist/utils/runtime-value.js +40 -0
- package/dist/utils/sql-parser.d.ts +8 -1
- package/dist/utils/sql-parser.d.ts.map +1 -1
- package/dist/utils/sql-parser.js +6 -3
- package/dist/utils/type-utils.d.ts.map +1 -1
- package/dist/utils/type-utils.js +10 -8
- package/dist/utils/utils.d.ts +2 -2
- package/dist/utils/utils.d.ts.map +1 -1
- package/dist/utils/utils.js +11 -8
- package/dist/utils/zod-error.d.ts.map +1 -1
- package/dist/utils/zod-error.js +7 -4
- package/dist/vector/chunking.d.ts.map +1 -1
- package/dist/vector/chunking.js +1 -1
- package/dist/vector/embedding.d.ts.map +1 -1
- package/dist/vector/embedding.js +1 -1
- package/dist/vector/types.d.ts +3 -2
- package/dist/vector/types.d.ts.map +1 -1
- package/package.json +11 -7
- package/src/ai/agents/agent.ts +5 -5
- package/src/ai/agents/types.ts +1 -1
- package/src/ai/providers/rtzr/__tests__/model.test.ts +2 -2
- package/src/ai/providers/rtzr/error.ts +5 -3
- package/src/ai/providers/rtzr/model.ts +3 -2
- package/src/ai/providers/rtzr/options.ts +10 -5
- package/src/ai/providers/rtzr/provider.ts +10 -10
- package/src/ai/providers/rtzr/utils.ts +3 -1
- package/src/api/__tests__/config.test.ts +11 -21
- package/src/api/__tests__/sonamu.http-validator.test.ts +512 -0
- package/src/api/__tests__/sonamu.websocket.test.ts +51 -41
- package/src/api/__tests__/zod-compiler-policy.test.ts +95 -0
- package/src/api/caster.ts +6 -8
- package/src/api/code-converters.ts +136 -36
- package/src/api/config.ts +62 -4
- package/src/api/context.ts +3 -3
- package/src/api/decorators.ts +28 -17
- package/src/api/http-validator.ts +149 -0
- package/src/api/sonamu.ts +459 -152
- package/src/api/websocket-helpers.ts +24 -17
- package/src/auth/audit-log/builders.ts +3 -2
- package/src/auth/audit-log/client-ip.ts +4 -2
- package/src/auth/audit-log/events.ts +15 -1
- package/src/auth/audit-log/plugin.ts +129 -200
- package/src/auth/audit-log-ingestor.ts +19 -15
- package/src/auth/auth-generator.ts +10 -5
- package/src/auth/better-auth-request.ts +4 -3
- package/src/auth/knex-adapter.ts +8 -2
- package/src/auth/plugins/entity-definitions/index.ts +6 -5
- package/src/bin/__tests__/http-validator-benchmark.test.ts +94 -0
- package/src/bin/__tests__/test-command.test.ts +9 -15
- package/src/bin/__tests__/ts-loader-register.test.ts +15 -17
- package/src/bin/__tests__/zod-compiler-build.test.ts +307 -0
- package/src/bin/build-config.ts +167 -0
- package/src/bin/cli.ts +155 -38
- package/src/bin/compiler-policy.ts +35 -0
- package/src/bin/fixture.ts +14 -3
- package/src/bin/test-command.ts +74 -29
- package/src/bin/ts-loader-registration.ts +22 -4
- package/src/cache/decorator.ts +10 -3
- package/src/compress/compress.ts +17 -4
- package/src/cone/cone-generator.ts +34 -6
- package/src/database/__tests__/db.test.ts +1 -0
- package/src/database/__tests__/puri.test.ts +16 -15
- package/src/database/__tests__/transaction-scope.test.ts +5 -0
- package/src/database/_batch_update.ts +1 -0
- package/src/database/base-model.ts +81 -50
- package/src/database/base-model.types.ts +6 -6
- package/src/database/db.ts +29 -19
- package/src/database/knex.ts +30 -17
- package/src/database/puri-subset.test-d.ts +17 -0
- package/src/database/puri.ts +181 -143
- package/src/database/puri.types.test-d.ts +31 -1
- package/src/database/puri.types.ts +23 -21
- package/src/database/upsert-builder.ts +75 -53
- package/src/dict/sd.ts +15 -5
- package/src/dict/sonamu-dictionary.ts +6 -6
- package/src/dict/utils.ts +9 -1
- package/src/entity/entity-manager.ts +26 -9
- package/src/entity/entity-template-cone.ts +5 -10
- package/src/entity/entity.ts +50 -34
- package/src/env.ts +7 -3
- package/src/exceptions/error-handler.ts +17 -2
- package/src/exceptions/so-exceptions.ts +26 -20
- package/src/filter/utils.ts +21 -11
- package/src/index.ts +3 -0
- package/src/logger/configure.ts +26 -18
- package/src/migration/__tests__/migrator.test.ts +50 -57
- package/src/migration/code-generation.ts +132 -104
- package/src/migration/index-where-predicate.ts +51 -24
- package/src/migration/migration-set.ts +11 -5
- package/src/migration/migrator.ts +392 -244
- package/src/migration/postgresql-schema-reader.ts +52 -47
- package/src/migration/slack-confirm.ts +17 -15
- package/src/migration/types.ts +57 -0
- package/src/naite/naite-reporter.ts +1 -1
- package/src/naite/naite.ts +97 -24
- package/src/runtime-type.ts +34 -0
- package/src/ssr/hmr-opt-out.ts +78 -0
- package/src/ssr/renderer.ts +6 -0
- package/src/storage/base-file.ts +13 -13
- package/src/storage/buffered-file.ts +11 -11
- package/src/storage/s3-driver.ts +4 -1
- package/src/storage/uploaded-file.ts +8 -8
- package/src/stream/__tests__/ws-contracts.test.ts +4 -2
- package/src/stream/__tests__/ws-telemetry.test.ts +1 -1
- package/src/stream/__tests__/ws.test.ts +30 -6
- package/src/stream/sse.ts +12 -11
- package/src/stream/ws-core.ts +1 -1
- package/src/stream/ws-delivery.ts +16 -7
- package/src/stream/ws-local-connection-store.ts +2 -3
- package/src/stream/ws-presence-store.ts +6 -1
- package/src/stream/ws-registry.ts +16 -7
- package/src/stream/ws-telemetry.ts +66 -43
- package/src/stream/ws.ts +73 -39
- package/src/syncer/__tests__/api-parser.websocket-type-ref.test.ts +3 -2
- package/src/syncer/__tests__/http-validator-registry.test.ts +137 -0
- package/src/syncer/api-parser.ts +67 -27
- package/src/syncer/checksum.ts +17 -11
- package/src/syncer/code-generator.ts +25 -17
- package/src/syncer/entity-operations.ts +3 -5
- package/src/syncer/file-copy.ts +46 -0
- package/src/syncer/file-patterns.ts +11 -8
- package/src/syncer/file-tracking.ts +3 -4
- package/src/syncer/filesystem-dependencies.ts +73 -0
- package/src/syncer/module-loader.ts +8 -4
- package/src/syncer/syncer-actions.ts +56 -18
- package/src/syncer/syncer.ts +116 -43
- package/src/syncer/watcher.ts +8 -4
- package/src/tasks/decorator.ts +20 -12
- package/src/tasks/step-wrapper.ts +19 -9
- package/src/tasks/workflow-manager.ts +15 -9
- package/src/template/__tests__/http_validators.template.test.ts +160 -0
- package/src/template/__tests__/services.template.mutation.test.ts +24 -23
- package/src/template/__tests__/services.template.websocket.test.ts +21 -25
- package/src/template/entity-converter.ts +5 -2
- package/src/template/helpers.ts +8 -9
- package/src/template/implementations/generated.template.ts +5 -4
- package/src/template/implementations/generated_http.template.ts +61 -15
- package/src/template/implementations/generated_sso.template.ts +15 -4
- package/src/template/implementations/http_validators.template.ts +175 -0
- package/src/template/implementations/model.template.ts +3 -1
- package/src/template/implementations/sd.template.ts +81 -41
- package/src/template/implementations/services.template.ts +2 -2
- package/src/template/implementations/view_form.template.ts +56 -39
- package/src/template/implementations/view_list.template.ts +31 -23
- package/src/template/template-manager.ts +15 -13
- package/src/template/template-types.ts +13 -5
- package/src/template/template.ts +4 -3
- package/src/template/zod-converter.ts +206 -91
- package/src/testing/__tests__/dev-test-routes.test.ts +85 -25
- package/src/testing/__tests__/dev-vitest-manager.test.ts +15 -15
- package/src/testing/_relation-graph.ts +4 -1
- package/src/testing/bootstrap.ts +12 -5
- package/src/testing/data-explorer.ts +102 -53
- package/src/testing/dev-test-routes.ts +87 -50
- package/src/testing/dev-vitest-manager.ts +88 -32
- package/src/testing/faker-mappings.ts +2 -2
- package/src/testing/filesystem.ts +1 -0
- package/src/testing/fixture-generator.ts +191 -131
- package/src/testing/fixture-loader.ts +5 -1
- package/src/testing/fixture-manager.ts +129 -90
- package/src/testing/global-setup.ts +7 -3
- package/src/testing/index.ts +5 -0
- package/src/types/__tests__/entity-json-schema-search-text.test.ts +9 -3
- package/src/types/types.ts +184 -158
- package/src/ui/ai-api.ts +9 -7
- package/src/ui/ai-client.ts +61 -56
- package/src/ui/api.ts +726 -770
- package/src/ui/async-route.ts +4 -0
- package/src/ui/cdd-service.ts +35 -12
- package/src/ui/migrations-api.ts +381 -0
- package/src/utils/formatter.ts +7 -3
- package/src/utils/fs-utils.ts +5 -5
- package/src/utils/model.ts +4 -5
- package/src/utils/object-utils.ts +32 -22
- package/src/utils/process-utils.ts +4 -1
- package/src/utils/runtime-value.ts +43 -0
- package/src/utils/sql-parser.ts +13 -6
- package/src/utils/type-utils.ts +9 -7
- package/src/utils/utils.ts +19 -21
- package/src/utils/zod-error.ts +4 -2
- package/src/vector/chunking.ts +6 -1
- package/src/vector/embedding.ts +2 -1
- package/src/vector/types.ts +4 -2
- package/tsdown.api.config.ts +5 -2
- package/dist/ui-web/assets/index-CJf8uJYf.js +0 -176
- package/dist/ui-web/assets/index-GMMIVGja.css +0 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { __esmMin } from "../_virtual/_rolldown/runtime.js";
|
|
2
2
|
import { convertDomainToCategory, init_category } from "../logger/category.js";
|
|
3
|
+
import { init_runtime_value, isObjectValue } from "../utils/runtime-value.js";
|
|
3
4
|
import { DB, init_db } from "./db.js";
|
|
4
5
|
import { Sonamu, init_sonamu } from "../api/sonamu.js";
|
|
5
6
|
import { EntityManager, init_entity_manager } from "../entity/entity-manager.js";
|
|
@@ -18,6 +19,7 @@ var init_base_model = __esmMin((() => {
|
|
|
18
19
|
init_entity_manager();
|
|
19
20
|
init_utils();
|
|
20
21
|
init_category();
|
|
22
|
+
init_runtime_value();
|
|
21
23
|
init_sql_parser();
|
|
22
24
|
init_db();
|
|
23
25
|
init_puri();
|
|
@@ -81,9 +83,12 @@ var init_base_model = __esmMin((() => {
|
|
|
81
83
|
if (!this.subsetQueries) throw new Error("subsetQueries is not defined");
|
|
82
84
|
const puriWrapper = this.getSubsetQueryPuri();
|
|
83
85
|
const qb = this.subsetQueries[subset]?.(puriWrapper);
|
|
86
|
+
function onSubset(_subset) {
|
|
87
|
+
return qb;
|
|
88
|
+
}
|
|
84
89
|
return {
|
|
85
90
|
qb,
|
|
86
|
-
onSubset
|
|
91
|
+
onSubset
|
|
87
92
|
};
|
|
88
93
|
}
|
|
89
94
|
/**
|
|
@@ -147,7 +152,7 @@ var init_base_model = __esmMin((() => {
|
|
|
147
152
|
for (const [field, condition] of Object.entries(filters)) {
|
|
148
153
|
if (condition === void 0 || condition === null) continue;
|
|
149
154
|
const fullField = entity.getFullFieldName(field);
|
|
150
|
-
if (
|
|
155
|
+
if (!isObjectValue(condition) || Array.isArray(condition)) {
|
|
151
156
|
puri.where(fullField, condition);
|
|
152
157
|
continue;
|
|
153
158
|
}
|
|
@@ -218,10 +223,10 @@ var init_base_model = __esmMin((() => {
|
|
|
218
223
|
* 중첩 필드 삭제 (배열 내 객체도 처리)
|
|
219
224
|
*/
|
|
220
225
|
deleteField(obj, parts) {
|
|
221
|
-
if (!obj ||
|
|
226
|
+
if (!obj || !isObjectValue(obj)) return;
|
|
222
227
|
if (parts.length === 1) {
|
|
223
228
|
if (Array.isArray(obj)) obj.forEach((item) => {
|
|
224
|
-
if (item &&
|
|
229
|
+
if (item && isObjectValue(item)) delete item[parts[0]];
|
|
225
230
|
});
|
|
226
231
|
else delete obj[parts[0]];
|
|
227
232
|
return;
|
|
@@ -229,7 +234,7 @@ var init_base_model = __esmMin((() => {
|
|
|
229
234
|
const [first, ...rest] = parts;
|
|
230
235
|
const next = obj[first];
|
|
231
236
|
if (Array.isArray(next)) next.map((item) => this.deleteField(item, rest));
|
|
232
|
-
else if (next &&
|
|
237
|
+
else if (next && isObjectValue(next)) this.deleteField(next, rest);
|
|
233
238
|
}
|
|
234
239
|
/**
|
|
235
240
|
* COUNT 쿼리 실행 (내부 메서드)
|
|
@@ -290,27 +295,32 @@ var init_base_model = __esmMin((() => {
|
|
|
290
295
|
*/
|
|
291
296
|
hydrate(rows) {
|
|
292
297
|
return rows.map((row) => {
|
|
298
|
+
const rowValues = new Map(Object.entries(row));
|
|
293
299
|
const nestedKeys = Object.keys(row).filter((key) => key.includes("__"));
|
|
294
300
|
const groups = Object.groupBy(nestedKeys, (key) => key.split("__")[0]);
|
|
295
301
|
const nullKeys = Object.entries(groups).filter(([groupKey, fields]) => {
|
|
296
302
|
if (!fields || fields.length === 0) return false;
|
|
297
303
|
const idField = `${groupKey}__id`;
|
|
298
|
-
if (idField in row) return
|
|
299
|
-
return fields.every((field) =>
|
|
304
|
+
if (idField in row) return rowValues.get(idField) === null;
|
|
305
|
+
return fields.every((field) => {
|
|
306
|
+
const fieldValue = rowValues.get(field);
|
|
307
|
+
return fieldValue === null || Array.isArray(fieldValue) && fieldValue.length === 0;
|
|
308
|
+
});
|
|
300
309
|
}).map(([key]) => key);
|
|
301
|
-
|
|
310
|
+
let hydrated = Object.fromEntries([]);
|
|
311
|
+
for (const field of Object.keys(row)) {
|
|
312
|
+
const fieldValue = rowValues.get(field);
|
|
302
313
|
if (!field.includes("__")) {
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
314
|
+
const hydratedValue = Array.isArray(fieldValue) && isObject(fieldValue[0]) ? this.hydrate(fieldValue) : fieldValue;
|
|
315
|
+
Object.assign(hydrated, { [field]: hydratedValue });
|
|
316
|
+
continue;
|
|
306
317
|
}
|
|
307
318
|
const parts = field.split("__");
|
|
308
319
|
const objPath = parts[0] + parts.slice(1).map((part) => `[${part}]`).join("");
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
}, {});
|
|
320
|
+
hydrated = set(hydrated, objPath, fieldValue && Array.isArray(fieldValue) && isObject(fieldValue[0]) ? this.hydrate(fieldValue) : fieldValue);
|
|
321
|
+
}
|
|
312
322
|
nullKeys.forEach((nullKey) => {
|
|
313
|
-
hydrated[nullKey]
|
|
323
|
+
Object.assign(hydrated, { [nullKey]: null });
|
|
314
324
|
});
|
|
315
325
|
return hydrated;
|
|
316
326
|
});
|
|
@@ -322,4 +332,4 @@ var init_base_model = __esmMin((() => {
|
|
|
322
332
|
init_base_model();
|
|
323
333
|
export { BaseModel, BaseModelClass, init_base_model };
|
|
324
334
|
|
|
325
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1tb2RlbC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YWJhc2UvYmFzZS1tb2RlbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogYmlvbWUtaWdub3JlLWFsbCBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogUHVyaeydmCDtg4DsnoXsnYAg6rCc67OEIOuqqOuNuOyXkOyEnCDtmZXsoJXrkJjrr4DroZwgQmFzZU1vZGVs7JeQ7ISc64qUIGFueeulvCDtl4jsmqntlaggKi9cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyB0eXBlIExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyB0eXBlIEtuZXggfSBmcm9tIFwia25leFwiO1xuaW1wb3J0IHsgY2xvbmVEZWVwLCBjbHVzdGVyLCBncm91cCwgaXNPYmplY3QsIG9taXQsIHNldCB9IGZyb20gXCJyYWRhc2hpXCI7XG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgdHlwZSBGaWx0ZXJPcGVyYXRvciwgdHlwZSBGaWx0ZXJRdWVyeSB9IGZyb20gXCIuLi9maWx0ZXIvdHlwZXNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZUZpbHRlclF1ZXJ5LCB2YWxpZGF0ZVNvbmFtdUZpbHRlcnMgfSBmcm9tIFwiLi4vZmlsdGVyL3V0aWxzXCI7XG5pbXBvcnQgeyBjb252ZXJ0RG9tYWluVG9DYXRlZ29yeSB9IGZyb20gXCIuLi9sb2dnZXIvY2F0ZWdvcnlcIjtcbmltcG9ydCB7IHR5cGUgRGF0YWJhc2VTY2hlbWFFeHRlbmQsIHR5cGUgU29uYW11UXVlcnlNb2RlIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIExpc3RSZXN1bHQgfSBmcm9tIFwiLi4vdXRpbHMvbW9kZWxcIjtcbmltcG9ydCB7IGdldEpvaW5UYWJsZXMsIGdldFRhYmxlTmFtZXNGcm9tV2hlcmUgfSBmcm9tIFwiLi4vdXRpbHMvc3FsLXBhcnNlclwiO1xuaW1wb3J0IHsgdHlwZSBFbmhhbmNlck1hcCwgdHlwZSBSZXNvbHZlU3Vic2V0SW50ZXJzZWN0aW9uIH0gZnJvbSBcIi4vYmFzZS1tb2RlbC50eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBEQlByZXNldCB9IGZyb20gXCIuL2RiXCI7XG5pbXBvcnQgeyBEQiB9IGZyb20gXCIuL2RiXCI7XG5pbXBvcnQgeyBQdXJpIH0gZnJvbSBcIi4vcHVyaVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBJbmZlckFsbFN1YnNldHMsXG4gIHR5cGUgUHVyaUxvYWRlclF1ZXJpZXMsXG4gIHR5cGUgUHVyaVN1YnNldEZuLFxufSBmcm9tIFwiLi9wdXJpLXN1YnNldC50eXBlc1wiO1xuaW1wb3J0IHsgUHVyaVdyYXBwZXIgfSBmcm9tIFwiLi9wdXJpLXdyYXBwZXJcIjtcbmltcG9ydCB7IHR5cGUgVW5pb25FeHRyYWN0ZWRUVGFibGVzIH0gZnJvbSBcIi4vcHVyaS50eXBlc1wiO1xuaW1wb3J0IHsgVXBzZXJ0QnVpbGRlciB9IGZyb20gXCIuL3Vwc2VydC1idWlsZGVyXCI7XG5cbnR5cGUgVW5rbm93bkRCUmVjb3JkID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbi8qKlxuICog66qo65OgIE1vZGVsIO2BtOuemOyKpOydmCDquLDrs7gg7YG0656Y7IqkXG4gKlxuICogQHRlbXBsYXRlIFRTdWJzZXRLZXkgLSDshJzruIzshYsg7YKkIOycoOuLiOyYqCAo7JiIOiBcIkFcIiB8IFwiUFwiIHwgXCJTU1wiKVxuICogQHRlbXBsYXRlIFRTdWJzZXRNYXBwaW5nIC0g7ISc67iM7IWL67OEIOy1nOyihSDqsrDqs7wg7YOA7J6FIOunpO2VkVxuICogQHRlbXBsYXRlIFRTdWJzZXRRdWVyaWVzIC0g7ISc67iM7IWLIOy/vOumrCDtlajsiJgg6rCd7LK0XG4gKiBAdGVtcGxhdGUgVExvYWRlclF1ZXJpZXMgLSDshJzruIzshYvrs4Qg66Gc642UIOy/vOumrCDrsLDsl7Qg6rCd7LK0XG4gKi9cbmV4cG9ydCBjbGFzcyBCYXNlTW9kZWxDbGFzczxcbiAgVFN1YnNldEtleSBleHRlbmRzIHN0cmluZyA9IG5ldmVyLFxuICBUU3Vic2V0TWFwcGluZyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBuZXZlcixcbiAgVFN1YnNldFF1ZXJpZXMgZXh0ZW5kcyBSZWNvcmQ8VFN1YnNldEtleSwgUHVyaVN1YnNldEZuPiA9IG5ldmVyLFxuICBUTG9hZGVyUXVlcmllcyBleHRlbmRzIFB1cmlMb2FkZXJRdWVyaWVzPFRTdWJzZXRLZXk+ID0gbmV2ZXIsXG4+IHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGxvZ2dlcjogTG9nZ2VyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBtb2RlbE5hbWU6IHN0cmluZyA9IHRoaXMuY29uc3RydWN0b3IubmFtZSxcbiAgICBwcm90ZWN0ZWQgc3Vic2V0UXVlcmllcz86IFRTdWJzZXRRdWVyaWVzLFxuICAgIHByb3RlY3RlZCBsb2FkZXJRdWVyaWVzPzogVExvYWRlclF1ZXJpZXMsXG4gICkge1xuICAgIHRoaXMubG9nZ2VyID0gZ2V0TG9nZ2VyKGNvbnZlcnREb21haW5Ub0NhdGVnb3J5KHRoaXMubW9kZWxOYW1lLCBcIm1vZGVsXCIpKTtcbiAgfVxuXG4gIGdldERCKHdoaWNoOiBEQlByZXNldCk6IEtuZXgge1xuICAgIHJldHVybiBEQi5nZXREQih3aGljaCk7XG4gIH1cblxuICBnZXRQdXJpKHdoaWNoOiBEQlByZXNldCk6IFB1cmlXcmFwcGVyIHtcbiAgICAvLyDtirjrnpzsnq3shZgg7Luo7YWN7Iqk7Yq47JeQ7IScIO2KuOuenOyereyFmCDtmo3rk51cbiAgICBjb25zdCB0cnggPSBEQi5nZXRUcmFuc2FjdGlvbkNvbnRleHQoKS5nZXRUcmFuc2FjdGlvbih3aGljaCk7XG4gICAgaWYgKHRyeCkge1xuICAgICAgcmV0dXJuIHRyeDtcbiAgICB9XG5cbiAgICAvLyDtirjrnpzsnq3shZjsnbQg7JeG7Jy866m0IOyDiOuhnOyatCBQdXJpV3JhcHBlciDrsJjtmZhcbiAgICBjb25zdCBkYiA9IHRoaXMuZ2V0REIod2hpY2gpO1xuICAgIHJldHVybiBuZXcgUHVyaVdyYXBwZXIoZGIsIG5ldyBVcHNlcnRCdWlsZGVyKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTdWJzZXRRdWVyeVB1cmkoKTogUHVyaVdyYXBwZXIge1xuICAgIGNvbnN0IGFjdGl2ZVRyYW5zYWN0aW9uID0gREIuZ2V0VHJhbnNhY3Rpb25Db250ZXh0KCkuZ2V0QWN0aXZlVHJhbnNhY3Rpb24oKTtcbiAgICBpZiAoYWN0aXZlVHJhbnNhY3Rpb24pIHtcbiAgICAgIHJldHVybiBhY3RpdmVUcmFuc2FjdGlvbjtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFB1cmlXcmFwcGVyKHRoaXMuZ2V0REIoXCJyXCIpLCBuZXcgVXBzZXJ0QnVpbGRlcigpKTtcbiAgfVxuXG4gIGFzeW5jIGRlc3Ryb3koKSB7XG4gICAgcmV0dXJuIERCLmRlc3Ryb3koKTtcbiAgfVxuXG4gIGFzeW5jIGdldEluc2VydGVkSWRzKFxuICAgIHdkYjogS25leCxcbiAgICByb3dzOiBVbmtub3duREJSZWNvcmRbXSxcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICB1bnFLZXlGaWVsZHM6IHN0cmluZ1tdLFxuICAgIGNodW5rU2l6ZTogbnVtYmVyID0gNTAwLFxuICApIHtcbiAgICBpZiAoIXdkYikge1xuICAgICAgd2RiID0gdGhpcy5nZXREQihcIndcIik7XG4gICAgfVxuXG4gICAgbGV0IHVucUtleXM6IHN0cmluZ1tdO1xuICAgIGxldCB3aGVyZUluRmllbGQ6IHN0cmluZyB8IEtuZXguUmF3O1xuICAgIGxldCBzZWxlY3RGaWVsZDogc3RyaW5nO1xuXG4gICAgaWYgKHVucUtleUZpZWxkcy5sZW5ndGggPiAxKSB7XG4gICAgICB3aGVyZUluRmllbGQgPSB3ZGIucmF3KGBDT05DQVRfV1MoJ18nLCAnJHt1bnFLZXlGaWVsZHMuam9pbihcIixcIil9JylgKTtcbiAgICAgIHNlbGVjdEZpZWxkID0gYCR7d2hlcmVJbkZpZWxkfSBhcyB0bXBVaWRgO1xuICAgICAgdW5xS2V5cyA9IHJvd3MubWFwKChyb3cpID0+IHVucUtleUZpZWxkcy5tYXAoKGZpZWxkKSA9PiByb3dbZmllbGRdKS5qb2luKFwiX1wiKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdoZXJlSW5GaWVsZCA9IHVucUtleUZpZWxkc1swXTtcbiAgICAgIHNlbGVjdEZpZWxkID0gdW5xS2V5RmllbGRzWzBdO1xuICAgICAgdW5xS2V5cyA9IHJvd3MubWFwKChyb3cpID0+IHJvd1t1bnFLZXlGaWVsZHNbMF1dIGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdElkczogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGl0ZW1zIG9mIGNsdXN0ZXIodW5xS2V5cywgY2h1bmtTaXplKSkge1xuICAgICAgY29uc3QgZGJSb3dzID0gYXdhaXQgd2RiKHRhYmxlTmFtZSlcbiAgICAgICAgLnNlbGVjdChcImlkXCIsIHdkYi5yYXcoc2VsZWN0RmllbGQpKVxuICAgICAgICAud2hlcmVJbih3aGVyZUluRmllbGQgYXMgc3RyaW5nLCBpdGVtcyk7XG4gICAgICByZXN1bHRJZHMgPSByZXN1bHRJZHMuY29uY2F0KFxuICAgICAgICBkYlJvd3MubWFwKChkYlJvdzogVW5rbm93bkRCUmVjb3JkKSA9PiBwYXJzZUludChTdHJpbmcoZGJSb3cuaWQpKSksXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRJZHM7XG4gIH1cblxuICAvKipcbiAgICog7Yq57KCVIOyEnOu4jOyFi+yXkCDrjIDtlZwg7L+866asIOu5jOuNlCDtmo3rk51cbiAgICpcbiAgICogQHJldHVybnMgcWIgLSDsv7zrpqwg67mM642UICjsobDqsbQg7LaU6rCA7JqpKVxuICAgKiBAcmV0dXJucyBvblN1YnNldCAtIO2KueyglSDshJzruIzshYsg7KCE7JqpIO2DgOyeheydtCDtlYTsmpTtlaAg65WMIOyCrOyaqVxuICAgKi9cbiAgZ2V0U3Vic2V0UXVlcmllczxUIGV4dGVuZHMgVFN1YnNldEtleT4oc3Vic2V0OiBUKSB7XG4gICAgaWYgKCF0aGlzLnN1YnNldFF1ZXJpZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInN1YnNldFF1ZXJpZXMgaXMgbm90IGRlZmluZWRcIik7XG4gICAgfVxuXG4gICAgY29uc3QgcHVyaVdyYXBwZXIgPSB0aGlzLmdldFN1YnNldFF1ZXJ5UHVyaSgpO1xuICAgIGNvbnN0IHFiID0gdGhpcy5zdWJzZXRRdWVyaWVzW3N1YnNldF0/LihwdXJpV3JhcHBlcik7XG5cbiAgICAvLyBOb25BbGxvd2VkQXNTaW5nbGVUYWJsZTog64uo7J28IO2FjOydtOu4lCDsu6zrn7wg7KCR6re8IOuwqeyngOyaqSDrp4jsu6RcbiAgICB0eXBlIFFCVGFibGVzID0gVW5pb25FeHRyYWN0ZWRUVGFibGVzPFRTdWJzZXRLZXksIFRTdWJzZXRRdWVyaWVzPiAmIHtcbiAgICAgIE5vbkFsbG93ZWRBc1NpbmdsZVRhYmxlOiB7IF9fZnVsbHRleHRfXzogdHJ1ZSB9O1xuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgcWI6IHFiIGFzIHVua25vd24gYXMgUHVyaTxEYXRhYmFzZVNjaGVtYUV4dGVuZCwgUUJUYWJsZXMsIHt9PixcbiAgICAgIG9uU3Vic2V0OiAoKF9zdWJzZXQ6IFRTdWJzZXRLZXkgfCByZWFkb25seSBUU3Vic2V0S2V5W10pID0+IHFiKSBhcyB7XG4gICAgICAgIC8vIOuLqOydvCDtgqRcbiAgICAgICAgPFMgZXh0ZW5kcyBUU3Vic2V0S2V5PihzdWJzZXQ6IFMpOiBSZXR1cm5UeXBlPFRTdWJzZXRRdWVyaWVzW1NdPjtcbiAgICAgICAgLy8g7YKkIOuwsOyXtCAtPiDqtZDsp5Htlakg67CY7ZmYXG4gICAgICAgIDxBcnIgZXh0ZW5kcyByZWFkb25seSBUU3Vic2V0S2V5W10+KFxuICAgICAgICAgIHN1YnNldHM6IFsuLi5BcnJdLFxuICAgICAgICApOiBSZXNvbHZlU3Vic2V0SW50ZXJzZWN0aW9uPEFyciwgVFN1YnNldFF1ZXJpZXM+O1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEVuaGFuY2VyIOqwneyytCDsg53shLEg7Zes7Y28XG4gICAqIO2DgOyehSDqsoDspp0g67CPIOy2lOuhoOydhCDrj4TsmYDspIxcbiAgICovXG4gIGNyZWF0ZUVuaGFuY2VyczxUIGV4dGVuZHMgVFN1YnNldEtleT4oXG4gICAgZW5oYW5jZXJzOiBFbmhhbmNlck1hcDxcbiAgICAgIFQsXG4gICAgICBJbmZlckFsbFN1YnNldHM8VFN1YnNldFF1ZXJpZXMsIFRMb2FkZXJRdWVyaWVzPixcbiAgICAgIFRTdWJzZXRNYXBwaW5nLFxuICAgICAgVFN1YnNldFF1ZXJpZXNcbiAgICA+LFxuICApIHtcbiAgICByZXR1cm4gZW5oYW5jZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIOyEnOu4jOyFiyDsv7zrpqwg7Iuk7ZaJXG4gICAqXG4gICAqIDEuIFNvbmFtdSDtlYTthLAg7KCB7JqpICjtg4DsnoUg67OA7ZmYIO2PrO2VqClcbiAgICogMi4g7L+866asIOyLpO2WiSAocGFnaW5hdGlvbiDsoIHsmqkpXG4gICAqIDMuIOuhnOuNlCDsi6TtlokgKDE6TiwgTjpNIOq0gOqzhCDrjbDsnbTthLAg66Gc65SpKVxuICAgKiA0LiBIeWRyYXRlIChmbGF0IOKGkiDspJHssqkg6rCd7LK0KVxuICAgKiA1LiBFbmhhbmNlciDsoIHsmqkgKHZpcnR1YWwg7ZWE65OcIOqzhOyCsClcbiAgICovXG4gIGFzeW5jIGV4ZWN1dGVTdWJzZXRRdWVyeTxcbiAgICBUIGV4dGVuZHMgVFN1YnNldEtleSxcbiAgICBUQ29tcHV0ZWRSZXN1bHRzIGV4dGVuZHMgSW5mZXJBbGxTdWJzZXRzPFRTdWJzZXRRdWVyaWVzLCBUTG9hZGVyUXVlcmllcz4sXG4gICAgTFAgZXh0ZW5kcyB7XG4gICAgICBudW0/OiBudW1iZXI7XG4gICAgICBwYWdlPzogbnVtYmVyO1xuICAgICAgcXVlcnlNb2RlPzogU29uYW11UXVlcnlNb2RlO1xuICAgICAgc29uYW11RmlsdGVyPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgfSxcbiAgPihcbiAgICBwYXJhbXM6IHtcbiAgICAgIHN1YnNldDogVDtcbiAgICAgIHFiOiBQdXJpPGFueSwgYW55LCBhbnk+O1xuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIG51bTogbnVtYmVyO1xuICAgICAgICBwYWdlOiBudW1iZXI7XG4gICAgICAgIHF1ZXJ5TW9kZT86IFNvbmFtdVF1ZXJ5TW9kZTtcbiAgICAgICAgc29uYW11RmlsdGVyPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICB9O1xuICAgICAgZGVidWc/OiBib29sZWFuO1xuICAgICAgb3B0aW1pemVDb3VudFF1ZXJ5PzogYm9vbGVhbjtcbiAgICB9ICYgRW5oYW5jZXJQYXJhbTxUU3Vic2V0S2V5LCBUQ29tcHV0ZWRSZXN1bHRzLCBUU3Vic2V0TWFwcGluZywgVFN1YnNldFF1ZXJpZXM+LFxuICApOiBQcm9taXNlPExpc3RSZXN1bHQ8TFAsIFRTdWJzZXRNYXBwaW5nW1RdPj4ge1xuICAgIGNvbnN0IHsgc3Vic2V0LCBxYiwgcGFyYW1zOiBxdWVyeVBhcmFtcywgZGVidWcgPSBmYWxzZSwgb3B0aW1pemVDb3VudFF1ZXJ5ID0gZmFsc2UgfSA9IHBhcmFtcztcblxuICAgIGlmICghdGhpcy5sb2FkZXJRdWVyaWVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJsb2FkZXJRdWVyaWVzIGlzIG5vdCBkZWZpbmVkXCIpO1xuICAgIH1cblxuICAgIC8vIFNvbmFtdSBGaWx0ZXIg7KCB7JqpXG4gICAgaWYgKHF1ZXJ5UGFyYW1zLnNvbmFtdUZpbHRlcikge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZEZpbHRlciA9IG5vcm1hbGl6ZUZpbHRlclF1ZXJ5KHF1ZXJ5UGFyYW1zLnNvbmFtdUZpbHRlcik7XG4gICAgICB0aGlzLmFwcGx5U29uYW11RmlsdGVycyhxYiwgbm9ybWFsaXplZEZpbHRlcik7XG4gICAgfVxuXG4gICAgY29uc3QgeyBudW0sIHBhZ2UgfSA9IHF1ZXJ5UGFyYW1zO1xuICAgIC8vIOuqqOuToCDroZzrjZTqsIAgcm9vdCBxdWVyeeyZgCDqsJnsnYAg7Jew6rKw7J2EIOyCrOyaqe2VmOuPhOuhnSDsi6Ttlokg7Iuc7KCQ7J2YIGtuZXjsl5DshJwg7ZWcIOuyiOunjCDtjIzsg53tlZzri6QuXG4gICAgY29uc3QgcHVyaVdyYXBwZXIgPSBuZXcgUHVyaVdyYXBwZXIocWIua25leCwgbmV3IFVwc2VydEJ1aWxkZXIoKSk7XG5cbiAgICAvLyBDT1VOVCDsv7zrpqwg7Iuk7ZaJIChxdWVyeU1vZGU6IGxpc3Tsnbwg65WM64qUIDAg66as7YS0KVxuICAgIGNvbnN0IHRvdGFsID0gYXdhaXQgdGhpcy5leGVjdXRlQ291bnRRdWVyeShxYiwgcXVlcnlQYXJhbXMsIGRlYnVnLCBvcHRpbWl6ZUNvdW50UXVlcnkpO1xuXG4gICAgaWYgKHF1ZXJ5UGFyYW1zPy5xdWVyeU1vZGUgPT09IFwiY291bnRcIikge1xuICAgICAgcmV0dXJuIHsgdG90YWwgfSBhcyBMaXN0UmVzdWx0PExQLCBUU3Vic2V0TWFwcGluZ1tUXT47XG4gICAgfVxuXG4gICAgLy8gTElTVCDsv7zrpqwg7Iuk7ZaJXG4gICAgY29uc3QgY29tcHV0ZWRSb3dzID0gYXdhaXQgdGhpcy5leGVjdXRlTGlzdFF1ZXJ5KFxuICAgICAgc3Vic2V0LFxuICAgICAgcWIsXG4gICAgICBxdWVyeVBhcmFtcyxcbiAgICAgIG51bSxcbiAgICAgIHBhZ2UsXG4gICAgICBkZWJ1ZyxcbiAgICAgIHB1cmlXcmFwcGVyLFxuICAgICk7XG5cbiAgICAvLyBFbmhhbmNlciDsoIHsmqlcbiAgICBjb25zdCBlbmhhbmNlciA9IChwYXJhbXMgYXMgYW55KS5lbmhhbmNlcnM/LltzdWJzZXRdO1xuICAgIGNvbnN0IGVuaGFuY2VkUm93cyA9IChhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGNvbXB1dGVkUm93cy5tYXAoKHJvdykgPT4gZW5oYW5jZXI/Lihyb3cpID8/IHJvdyksXG4gICAgKSkgYXMgVFN1YnNldE1hcHBpbmdbVF1bXTtcblxuICAgIC8vIEludGVybmFsIO2VhOuTnCDsoJzqsbBcbiAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldCh0aGlzLm1vZGVsTmFtZSk7XG4gICAgY29uc3QgaW50ZXJuYWxGaWVsZHMgPSBlbnRpdHkuc3Vic2V0c0ludGVybmFsW3N1YnNldF0gPz8gW107XG4gICAgY29uc3Qgcm93cyA9XG4gICAgICBpbnRlcm5hbEZpZWxkcy5sZW5ndGggPiAwXG4gICAgICAgID8gZW5oYW5jZWRSb3dzLm1hcCgocm93KSA9PiB0aGlzLm9taXRJbnRlcm5hbEZpZWxkcyhyb3csIGludGVybmFsRmllbGRzKSlcbiAgICAgICAgOiBlbmhhbmNlZFJvd3M7XG5cbiAgICBpZiAocXVlcnlQYXJhbXMucXVlcnlNb2RlID09PSBcImxpc3RcIikge1xuICAgICAgLy8g66as7Iqk7Yq466eMIOumrO2EtFxuICAgICAgcmV0dXJuIHsgcm93cyB9IGFzIExpc3RSZXN1bHQ8TFAsIFRTdWJzZXRNYXBwaW5nW1RdPjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8g65GY64ukIOumrO2EtFxuICAgICAgcmV0dXJuIHsgcm93cywgdG90YWwgfSBhcyBMaXN0UmVzdWx0PExQLCBUU3Vic2V0TWFwcGluZ1tUXT47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOqwneyytOyXkOyEnCBpbnRlcm5hbCDtlYTrk5wg7KCc6rGwXG4gICAqIOykkeyyqSDtlYTrk5wo7JiIOiBcInVzZXIuZW1haWxcIikg67CPIOuwsOyXtCjsmIg6IFwiZW1wbG95ZWVzLnNhbGFyeVwiKeuPhCDsspjrpqxcbiAgICovXG4gIG9taXRJbnRlcm5hbEZpZWxkczxUIGV4dGVuZHMgb2JqZWN0Pihyb3c6IFQsIGZpZWxkczogc3RyaW5nW10pOiBUIHtcbiAgICBjb25zdCByZXN1bHQgPSBjbG9uZURlZXAocm93KTtcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGZpZWxkcykge1xuICAgICAgdGhpcy5kZWxldGVGaWVsZChyZXN1bHQsIGZpZWxkLnNwbGl0KFwiLlwiKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVyUXVlcnnrpbwgUHVyaSBRdWVyeUJ1aWxkZXLsl5Ag7KCB7JqpXG4gICAqXG4gICAqIEBwYXJhbSBxYiBQdXJpIFF1ZXJ5QnVpbGRlciDsnbjsiqTthLTsiqRcbiAgICogQHBhcmFtIGZpbHRlcnMgRmlsdGVyUXVlcnkg6rCd7LK0XG4gICAqL1xuICBwcm90ZWN0ZWQgYXBwbHlTb25hbXVGaWx0ZXJzPFRFbnRpdHkgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gICAgcWI6IFB1cmk8YW55LCBhbnksIGFueT4sXG4gICAgZmlsdGVycz86IEZpbHRlclF1ZXJ5PFRFbnRpdHk+LFxuICApOiB2b2lkIHtcbiAgICBpZiAoIWZpbHRlcnMpIHJldHVybjtcblxuICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHRoaXMubW9kZWxOYW1lKTtcblxuICAgIC8vIDEuIO2VhO2EsCDqsoDspp0gKEVudGl0eSDquLDrsJgpXG4gICAgdmFsaWRhdGVTb25hbXVGaWx0ZXJzKGZpbHRlcnMsIGVudGl0eSk7XG5cbiAgICAvLyAyLiDqsoDspp3rkJwg7ZWE7YSwIOyggeyaqVxuICAgIGNvbnN0IHB1cmkgPSBxYiBhcyBhbnk7XG5cbiAgICBmb3IgKGNvbnN0IFtmaWVsZCwgY29uZGl0aW9uXSBvZiBPYmplY3QuZW50cmllcyhmaWx0ZXJzKSkge1xuICAgICAgaWYgKGNvbmRpdGlvbiA9PT0gdW5kZWZpbmVkIHx8IGNvbmRpdGlvbiA9PT0gbnVsbCkgY29udGludWU7XG5cbiAgICAgIC8vIO2FjOydtOu4lOuqhS7tlYTrk5zrqoUg7ZiV7Iud7Jy866GcIOuzgO2ZmFxuICAgICAgY29uc3QgZnVsbEZpZWxkID0gZW50aXR5LmdldEZ1bGxGaWVsZE5hbWUoZmllbGQpO1xuXG4gICAgICAvLyDsp4HsoJEg6rCSIChlceyZgCDrj5nsnbwpXG4gICAgICBpZiAodHlwZW9mIGNvbmRpdGlvbiAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGNvbmRpdGlvbikpIHtcbiAgICAgICAgcHVyaS53aGVyZShmdWxsRmllbGQsIGNvbmRpdGlvbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyDsl7DsgrDsnpAg6rCd7LK0XG4gICAgICBmb3IgKGNvbnN0IFtvcGVyYXRvciwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmRpdGlvbikpIHtcbiAgICAgICAgdGhpcy5hcHBseU9wZXJhdG9yKHFiLCBmdWxsRmllbGQsIG9wZXJhdG9yIGFzIEZpbHRlck9wZXJhdG9yLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOuLqOydvCDsl7DsgrDsnpDrpbwgUXVlcnlCdWlsZGVy7JeQIOyggeyaqVxuICAgKi9cbiAgcHJpdmF0ZSBhcHBseU9wZXJhdG9yKFxuICAgIHFiOiBQdXJpPGFueSwgYW55LCBhbnk+LFxuICAgIGZpZWxkOiBzdHJpbmcsXG4gICAgb3BlcmF0b3I6IEZpbHRlck9wZXJhdG9yLFxuICAgIHZhbHVlOiB1bmtub3duLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBwdXJpID0gcWIgYXMgYW55O1xuXG4gICAgc3dpdGNoIChvcGVyYXRvcikge1xuICAgICAgY2FzZSBcImVxXCI6XG4gICAgICAgIHB1cmkud2hlcmUoZmllbGQsIHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJuZVwiOlxuICAgICAgICBwdXJpLndoZXJlKGZpZWxkLCBcIiE9XCIsIHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJndFwiOlxuICAgICAgICBwdXJpLndoZXJlKGZpZWxkLCBcIj5cIiwgdmFsdWUpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcImd0ZVwiOlxuICAgICAgICBwdXJpLndoZXJlKGZpZWxkLCBcIj49XCIsIHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJsdFwiOlxuICAgICAgICBwdXJpLndoZXJlKGZpZWxkLCBcIjxcIiwgdmFsdWUpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcImx0ZVwiOlxuICAgICAgICBwdXJpLndoZXJlKGZpZWxkLCBcIjw9XCIsIHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJpblwiOlxuICAgICAgICBwdXJpLndoZXJlSW4oZmllbGQsIHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJub3RJblwiOlxuICAgICAgICBwdXJpLndoZXJlTm90SW4oZmllbGQsIHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJjb250YWluc1wiOlxuICAgICAgICBwdXJpLndoZXJlKGZpZWxkLCBcImxpa2VcIiwgYCUke3ZhbHVlfSVgKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJzdGFydHNXaXRoXCI6XG4gICAgICAgIHB1cmkud2hlcmUoZmllbGQsIFwibGlrZVwiLCBgJHt2YWx1ZX0lYCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwiZW5kc1dpdGhcIjpcbiAgICAgICAgcHVyaS53aGVyZShmaWVsZCwgXCJsaWtlXCIsIGAlJHt2YWx1ZX1gKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJpc051bGxcIjpcbiAgICAgICAgcHVyaS53aGVyZShmaWVsZCwgbnVsbCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwiaXNOb3ROdWxsXCI6XG4gICAgICAgIHB1cmkud2hlcmUoZmllbGQsIFwiIT1cIiwgbnVsbCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwiYmVmb3JlXCI6XG4gICAgICAgIHB1cmkud2hlcmUoZmllbGQsIFwiPFwiLCB2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwiYWZ0ZXJcIjpcbiAgICAgICAgcHVyaS53aGVyZShmaWVsZCwgXCI+XCIsIHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJiZXR3ZWVuXCI6IHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgIGNvbnN0IFttaW4sIG1heF0gPSB2YWx1ZTtcbiAgICAgICAgICBwdXJpLndoZXJlKGZpZWxkLCBcIj49XCIsIG1pbikud2hlcmUoZmllbGQsIFwiPD1cIiwgbWF4KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgY29uc29sZS53YXJuKGBVbnN1cHBvcnRlZCBvcGVyYXRvcjogJHtvcGVyYXRvcn1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog7KSR7LKpIO2VhOuTnCDsgq3soJwgKOuwsOyXtCDrgrQg6rCd7LK064+EIOyymOumrClcbiAgICovXG4gIGRlbGV0ZUZpZWxkKG9iajogYW55LCBwYXJ0czogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICBvYmouZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGlmIChpdGVtICYmIHR5cGVvZiBpdGVtID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBkZWxldGUgaXRlbVtwYXJ0c1swXV07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBvYmpbcGFydHNbMF1dO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IFtmaXJzdCwgLi4ucmVzdF0gPSBwYXJ0cztcbiAgICBjb25zdCBuZXh0ID0gb2JqW2ZpcnN0XTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KG5leHQpKSB7XG4gICAgICBuZXh0Lm1hcCgoaXRlbSkgPT4gdGhpcy5kZWxldGVGaWVsZChpdGVtLCByZXN0KSk7XG4gICAgfSBlbHNlIGlmIChuZXh0ICYmIHR5cGVvZiBuZXh0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aGlzLmRlbGV0ZUZpZWxkKG5leHQsIHJlc3QpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDT1VOVCDsv7zrpqwg7Iuk7ZaJICjrgrTrtoAg66mU7ISc65OcKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlQ291bnRRdWVyeShcbiAgICBxYjogUHVyaTxhbnksIGFueSwgYW55PixcbiAgICBwYXJhbXM6IHsgcXVlcnlNb2RlPzogXCJsaXN0XCIgfCBcImNvdW50XCIgfCBcImJvdGhcIiB9LFxuICAgIGRlYnVnOiBib29sZWFuLFxuICAgIG9wdGltaXplQ291bnRRdWVyeTogYm9vbGVhbixcbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBpZiAocGFyYW1zLnF1ZXJ5TW9kZSA9PT0gXCJsaXN0XCIpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGNvbnN0IGNvdW50UHVyaSA9IHFiLmNsb25lKCkuY2xlYXIoXCJvcmRlclwiKS5jbGVhcihcImxpbWl0XCIpLmNsZWFyKFwib2Zmc2V0XCIpO1xuXG4gICAgaWYgKG9wdGltaXplQ291bnRRdWVyeSkge1xuICAgICAgY29uc3QgeyBkZWZhdWx0OiBTcWxQYXJzZXIgfSA9IGF3YWl0IGltcG9ydChcIm5vZGUtc3FsLXBhcnNlclwiKTtcbiAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBTcWxQYXJzZXIuUGFyc2VyKCk7XG4gICAgICBjb25zdCBwYXJzZWRRdWVyeSA9IHBhcnNlci5hc3RpZnkoY291bnRQdXJpLnRvUXVlcnkoKSwge1xuICAgICAgICBkYXRhYmFzZTogU29uYW11LmNvbmZpZy5kYXRhYmFzZS5kYXRhYmFzZSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBsZWZ0Sm9pblRhYmxlcyA9IGdldEpvaW5UYWJsZXMocGFyc2VkUXVlcnksIFtcIkxFRlQgSk9JTlwiXSk7XG4gICAgICBjb25zdCB3aGVyZVRhYmxlcyA9IGdldFRhYmxlTmFtZXNGcm9tV2hlcmUocGFyc2VkUXVlcnkpO1xuXG4gICAgICBjb25zdCB0YWJsZXNUb1JlbW92ZSA9IGxlZnRKb2luVGFibGVzLmZpbHRlcigoaikgPT4gIXdoZXJlVGFibGVzLmluY2x1ZGVzKGopKTtcbiAgICAgIHRhYmxlc1RvUmVtb3ZlLmZvckVhY2goKHRhYmxlKSA9PiB7XG4gICAgICAgIGNvdW50UHVyaS5jbGVhckpvaW4odGFibGUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ09VTlQoKinroZwg7KCE7LK0IOugiOy9lOuTnCDsiJjrpbwg6rOE7IKwXG4gICAgLy8gVE9ETzogcWLsnZggRElTVElOQ1TqsIAg7J6I64qUIOqyveyasCDsspjrpqztlbTslbwg7ZWoXG4gICAgY29uc3QgY291bnRSZXN1bHQ6IHsgdG90YWw/OiBudW1iZXIgfSA9IGF3YWl0IGNvdW50UHVyaVxuICAgICAgLmNsZWFyKFwic2VsZWN0XCIpXG4gICAgICAuc2VsZWN0KHsgdG90YWw6IFB1cmkucmF3TnVtYmVyKGBDT1VOVCgqKTo6aW50ZWdlcmApIH0pXG4gICAgICAuZmlyc3QoKTtcblxuICAgIGlmIChkZWJ1Zykge1xuICAgICAgY291bnRQdXJpLmRlYnVnKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvdW50UmVzdWx0Py50b3RhbCA/PyAwO1xuICB9XG5cbiAgLyoqXG4gICAqIExJU1Qg7L+866asIOyLpO2WiSAo64K067aAIOuplOyEnOuTnClcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZUxpc3RRdWVyeTxUIGV4dGVuZHMgVFN1YnNldEtleT4oXG4gICAgc3Vic2V0OiBULFxuICAgIHFiOiBQdXJpPGFueSwgYW55LCBhbnk+LFxuICAgIHBhcmFtczogeyBxdWVyeU1vZGU/OiBcImxpc3RcIiB8IFwiY291bnRcIiB8IFwiYm90aFwiIH0sXG4gICAgbnVtOiBudW1iZXIsXG4gICAgcGFnZTogbnVtYmVyLFxuICAgIGRlYnVnOiBib29sZWFuLFxuICAgIHB1cmlXcmFwcGVyOiBQdXJpV3JhcHBlcixcbiAgKTogUHJvbWlzZTxhbnlbXT4ge1xuICAgIGlmIChwYXJhbXMucXVlcnlNb2RlID09PSBcImNvdW50XCIpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBsaW1pdGVkUWIgPSAoKCkgPT4ge1xuICAgICAgaWYgKG51bSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gcWI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcWIubGltaXQobnVtKS5vZmZzZXQobnVtICogKHBhZ2UgLSAxKSk7XG4gICAgICB9XG4gICAgfSkoKTtcbiAgICBsZXQgdW5sb2FkZWRSb3dzID0gYXdhaXQgbGltaXRlZFFiO1xuXG4gICAgaWYgKGRlYnVnKSB7XG4gICAgICBxYi5kZWJ1ZygpO1xuICAgIH1cblxuICAgIC8vIOuhnOuNlCDsspjrpqxcbiAgICBjb25zdCBsb2FkZXJzID0gKHRoaXMubG9hZGVyUXVlcmllcyBhcyBhbnkpW3N1YnNldF07XG4gICAgaWYgKGxvYWRlcnMgJiYgQXJyYXkuaXNBcnJheShsb2FkZXJzKSkge1xuICAgICAgdW5sb2FkZWRSb3dzID0gYXdhaXQgdGhpcy5wcm9jZXNzTG9hZGVycyh1bmxvYWRlZFJvd3MsIGxvYWRlcnMsIGRlYnVnLCBwdXJpV3JhcHBlcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaHlkcmF0ZSh1bmxvYWRlZFJvd3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIOyerOq3gOyggSDroZzrjZQg7LKY66asXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByb2Nlc3NMb2FkZXJzKFxuICAgIHJvd3M6IGFueVtdLFxuICAgIGxvYWRlcnM6IGFueVtdLFxuICAgIGRlYnVnOiBib29sZWFuLFxuICAgIHB1cmlXcmFwcGVyOiBQdXJpV3JhcHBlcixcbiAgKTogUHJvbWlzZTxhbnlbXT4ge1xuICAgIGZvciAoY29uc3QgcmVzb2x2ZUxvYWRlciBvZiBsb2FkZXJzKSB7XG4gICAgICBjb25zdCB7IGFzLCByZWZJZCwgcWI6IHJlc29sdmVMb2FkZXJRYkZuLCBsb2FkZXJzOiBuZXN0ZWRMb2FkZXJzIH0gPSByZXNvbHZlTG9hZGVyO1xuXG4gICAgICBjb25zdCByZXNvbHZlTG9hZGVyUWIgPSByZXNvbHZlTG9hZGVyUWJGbihcbiAgICAgICAgcHVyaVdyYXBwZXIsXG4gICAgICAgIHJvd3MubWFwKChyb3cpID0+IHJvd1tyZWZJZF0pLFxuICAgICAgKTtcblxuICAgICAgaWYgKGRlYnVnKSB7XG4gICAgICAgIHJlc29sdmVMb2FkZXJRYi5kZWJ1ZygpO1xuICAgICAgfVxuXG4gICAgICBsZXQgbG9hZGVkUm93cyA9IChhd2FpdCByZXNvbHZlTG9hZGVyUWIpIGFzIGFueVtdO1xuXG4gICAgICAvLyDspJHssqkgbG9hZGVyc+qwgCDsnojsnLzrqbQg7J6s6reAIOyymOumrFxuICAgICAgaWYgKG5lc3RlZExvYWRlcnMgJiYgbmVzdGVkTG9hZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxvYWRlZFJvd3MgPSBhd2FpdCB0aGlzLnByb2Nlc3NMb2FkZXJzKGxvYWRlZFJvd3MsIG5lc3RlZExvYWRlcnMsIGRlYnVnLCBwdXJpV3JhcHBlcik7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN1YlJvd0dyb3VwcyA9IGdyb3VwKGxvYWRlZFJvd3MsIChyb3cpID0+IHJvdy5yZWZJZCk7XG5cbiAgICAgIHJvd3MgPSByb3dzLm1hcCgocm93KSA9PiB7XG4gICAgICAgIHJvd1thc10gPSAoc3ViUm93R3JvdXBzW3Jvd1tyZWZJZF1dID8/IFtdKS5tYXAoKHIpID0+IG9taXQociwgW1wicmVmSWRcIl0pKTtcbiAgICAgICAgcmV0dXJuIHJvdztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByb3dzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYXQg66CI7L2U65Oc66W8IOykkeyyqSDqsJ3ssrTroZwg67OA7ZmYXG4gICAqXG4gICAqIC0gYHVzZXJfX25hbWVgIOKGkiBgeyB1c2VyOiB7IG5hbWUgfSB9YFxuICAgKiAtIG51bGxhYmxlIHJlbGF0aW9u7J2YIOqyveyasCBpZCDtlYTrk5zqsIAgbnVsbOydtOuptCDqsJ3ssrQg7J6Q7LK066W8IG51bGzroZxcbiAgICovXG4gIGh5ZHJhdGU8VCBleHRlbmRzIFVua25vd25EQlJlY29yZD4ocm93czogVFtdKTogVFtdIHtcbiAgICByZXR1cm4gcm93cy5tYXAoKHJvdzogVCkgPT4ge1xuICAgICAgLy8gbnVsbGFibGUgcmVsYXRpb24g7LKY66asOiDqt7jro7nsnZggaWQg7ZWE65Oc6rCAIG51bGzsnbTrqbQg6rCd7LK0IOyghOyytOulvCBudWxs66GcXG4gICAgICBjb25zdCBuZXN0ZWRLZXlzID0gT2JqZWN0LmtleXMocm93KS5maWx0ZXIoKGtleSkgPT4ga2V5LmluY2x1ZGVzKFwiX19cIikpO1xuICAgICAgY29uc3QgZ3JvdXBzID0gT2JqZWN0Lmdyb3VwQnkobmVzdGVkS2V5cywgKGtleSkgPT4ga2V5LnNwbGl0KFwiX19cIilbMF0pO1xuXG4gICAgICAvLyBpZCDtlYTrk5zqsIAgbnVsbOyduCDqt7jro7kg7LC+6riwICjsmIg6IHBhcmVudF9faWTqsIAgbnVsbOydtOuptCBwYXJlbnQg6re466O5IOyghOyytOqwgCBudWxsKVxuICAgICAgY29uc3QgbnVsbEtleXMgPSBPYmplY3QuZW50cmllcyhncm91cHMpXG4gICAgICAgIC5maWx0ZXIoKFtncm91cEtleSwgZmllbGRzXSkgPT4ge1xuICAgICAgICAgIGlmICghZmllbGRzIHx8IGZpZWxkcy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgIC8vIOq3uOujueydmCBpZCDtlYTrk5wg7LC+6riwICjsmIg6IFwicGFyZW50X19pZFwiKVxuICAgICAgICAgIGNvbnN0IGlkRmllbGQgPSBgJHtncm91cEtleX1fX2lkYDtcbiAgICAgICAgICBpZiAoaWRGaWVsZCBpbiByb3cpIHtcbiAgICAgICAgICAgIC8vIGlkIO2VhOuTnOqwgCBudWxs7J2066m0IOqwneyytCDsoITssrTqsIAgbnVsbFxuICAgICAgICAgICAgcmV0dXJuIHJvd1tpZEZpZWxkXSA9PT0gbnVsbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBpZCDtlYTrk5zqsIAg7JeG7Jy866m0IOq4sOyhtCDroZzsp4E6IOuqqOuToCDtlYTrk5zqsIAgbnVsbOyduOyngCDtmZXsnbhcbiAgICAgICAgICByZXR1cm4gZmllbGRzLmV2ZXJ5KFxuICAgICAgICAgICAgKGZpZWxkKSA9PlxuICAgICAgICAgICAgICByb3dbZmllbGRdID09PSBudWxsIHx8IChBcnJheS5pc0FycmF5KHJvd1tmaWVsZF0pICYmIHJvd1tmaWVsZF0ubGVuZ3RoID09PSAwKSxcbiAgICAgICAgICApO1xuICAgICAgICB9KVxuICAgICAgICAubWFwKChba2V5XSkgPT4ga2V5KTtcblxuICAgICAgY29uc3QgaHlkcmF0ZWQgPSBPYmplY3Qua2V5cyhyb3cpLnJlZHVjZSgociwgZmllbGQpID0+IHtcbiAgICAgICAgaWYgKCFmaWVsZC5pbmNsdWRlcyhcIl9fXCIpKSB7XG4gICAgICAgICAgLy8g7J2867CYIO2VhOuTnDog67Cw7Je0IOuCtCDqsJ3ssrTrqbQg7J6s6reAIGh5ZHJhdGVcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyb3dbZmllbGRdKSAmJiBpc09iamVjdChyb3dbZmllbGRdWzBdKSkge1xuICAgICAgICAgICAgcltmaWVsZF0gPSB0aGlzLmh5ZHJhdGUocm93W2ZpZWxkXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJbZmllbGRdID0gcm93W2ZpZWxkXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDspJHssqkg7ZWE65OcIOyymOumrDogdXNlcl9fbmFtZSDihpIgdXNlcltuYW1lXVxuICAgICAgICBjb25zdCBwYXJ0cyA9IGZpZWxkLnNwbGl0KFwiX19cIik7XG4gICAgICAgIGNvbnN0IG9ialBhdGggPVxuICAgICAgICAgIHBhcnRzWzBdICtcbiAgICAgICAgICBwYXJ0c1xuICAgICAgICAgICAgLnNsaWNlKDEpXG4gICAgICAgICAgICAubWFwKChwYXJ0KSA9PiBgWyR7cGFydH1dYClcbiAgICAgICAgICAgIC5qb2luKFwiXCIpO1xuXG4gICAgICAgIHIgPSBzZXQoXG4gICAgICAgICAgcixcbiAgICAgICAgICBvYmpQYXRoLFxuICAgICAgICAgIHJvd1tmaWVsZF0gJiYgQXJyYXkuaXNBcnJheShyb3dbZmllbGRdKSAmJiBpc09iamVjdChyb3dbZmllbGRdWzBdKVxuICAgICAgICAgICAgPyB0aGlzLmh5ZHJhdGUocm93W2ZpZWxkXSlcbiAgICAgICAgICAgIDogcm93W2ZpZWxkXSxcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH0sIHt9IGFzIFVua25vd25EQlJlY29yZCk7XG5cbiAgICAgIC8vIG51bGwgcmVsYXRpb24g7LKY66asXG4gICAgICBudWxsS2V5cy5mb3JFYWNoKChudWxsS2V5KSA9PiB7XG4gICAgICAgIGh5ZHJhdGVkW251bGxLZXldID0gbnVsbDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gaHlkcmF0ZWQ7XG4gICAgfSkgYXMgVFtdO1xuICB9XG59XG5cbi8qKlxuICogRW5oYW5jZXIg7YyM652866+47YSwIOyhsOqxtOu2gCDtg4DsnoVcbiAqIFJlcXVpcmVkRW5oYW5jZXJLZXlz6rCAIOyXhuycvOuptCBlbmhhbmNlcnMg7ISg7YOd7KCBLCDsnojsnLzrqbQg7ZWE7IiYXG4gKi9cbnR5cGUgRW5oYW5jZXJQYXJhbTxcbiAgVFN1YnNldEtleSBleHRlbmRzIHN0cmluZyxcbiAgVENvbXB1dGVkUmVzdWx0cyBleHRlbmRzIFJlY29yZDxUU3Vic2V0S2V5LCBhbnk+LFxuICBUU3Vic2V0TWFwcGluZyBleHRlbmRzIFJlY29yZDxUU3Vic2V0S2V5LCBhbnk+LFxuICBUU3Vic2V0UXVlcmllcyBleHRlbmRzIFJlY29yZDxUU3Vic2V0S2V5LCBQdXJpU3Vic2V0Rm4+LFxuPiA9IFtSZXF1aXJlZEVuaGFuY2VyS2V5czxUU3Vic2V0S2V5LCBUQ29tcHV0ZWRSZXN1bHRzLCBUU3Vic2V0TWFwcGluZz5dIGV4dGVuZHMgW25ldmVyXVxuICA/IHsgZW5oYW5jZXJzPzogRW5oYW5jZXJNYXA8VFN1YnNldEtleSwgVENvbXB1dGVkUmVzdWx0cywgVFN1YnNldE1hcHBpbmcsIFRTdWJzZXRRdWVyaWVzPiB9XG4gIDogeyBlbmhhbmNlcnM6IEVuaGFuY2VyTWFwPFRTdWJzZXRLZXksIFRDb21wdXRlZFJlc3VsdHMsIFRTdWJzZXRNYXBwaW5nLCBUU3Vic2V0UXVlcmllcz4gfTtcblxudHlwZSBSZXF1aXJlZEVuaGFuY2VyS2V5czxcbiAgVFN1YnNldEtleSBleHRlbmRzIHN0cmluZyxcbiAgVENvbXB1dGVkUmVzdWx0cyBleHRlbmRzIFJlY29yZDxUU3Vic2V0S2V5LCBhbnk+LFxuICBUU3Vic2V0TWFwcGluZyBleHRlbmRzIFJlY29yZDxUU3Vic2V0S2V5LCBhbnk+LFxuPiA9IHtcbiAgW0sgaW4gVFN1YnNldEtleV06IFRDb21wdXRlZFJlc3VsdHNbS10gZXh0ZW5kcyBUU3Vic2V0TWFwcGluZ1tLXSA/IG5ldmVyIDogSztcbn1bVFN1YnNldEtleV07XG5cbmV4cG9ydCBjb25zdCBCYXNlTW9kZWwgPSBuZXcgQmFzZU1vZGVsQ2xhc3MoKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OzthQU1zQztxQkFDa0I7WUFFcUI7ZUFDakI7aUJBR2U7U0FHbEQ7V0FDSTttQkFNZTtxQkFFSTtDQVluQyxpQkFBYixNQUtF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
|
|
335
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1tb2RlbC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YWJhc2UvYmFzZS1tb2RlbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogYmlvbWUtaWdub3JlLWFsbCBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogUHVyaeydmCDtg4DsnoXsnYAg6rCc67OEIOuqqOuNuOyXkOyEnCDtmZXsoJXrkJjrr4DroZwgQmFzZU1vZGVs7JeQ7ISc64qUIGFueeulvCDtl4jsmqntlaggKi9cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyB0eXBlIExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyB0eXBlIEtuZXggfSBmcm9tIFwia25leFwiO1xuaW1wb3J0IHsgY2xvbmVEZWVwLCBjbHVzdGVyLCBncm91cCwgaXNPYmplY3QsIG9taXQsIHNldCB9IGZyb20gXCJyYWRhc2hpXCI7XG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgdHlwZSBGaWx0ZXJPcGVyYXRvciwgdHlwZSBGaWx0ZXJRdWVyeSB9IGZyb20gXCIuLi9maWx0ZXIvdHlwZXNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZUZpbHRlclF1ZXJ5LCB2YWxpZGF0ZVNvbmFtdUZpbHRlcnMgfSBmcm9tIFwiLi4vZmlsdGVyL3V0aWxzXCI7XG5pbXBvcnQgeyBjb252ZXJ0RG9tYWluVG9DYXRlZ29yeSB9IGZyb20gXCIuLi9sb2dnZXIvY2F0ZWdvcnlcIjtcbmltcG9ydCB7IHR5cGUgRGF0YWJhc2VTY2hlbWFFeHRlbmQsIHR5cGUgU29uYW11UXVlcnlNb2RlIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIExpc3RSZXN1bHQgfSBmcm9tIFwiLi4vdXRpbHMvbW9kZWxcIjtcbmltcG9ydCB7IGlzT2JqZWN0VmFsdWUgfSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuaW1wb3J0IHsgZ2V0Sm9pblRhYmxlcywgZ2V0VGFibGVOYW1lc0Zyb21XaGVyZSB9IGZyb20gXCIuLi91dGlscy9zcWwtcGFyc2VyXCI7XG5pbXBvcnQgeyB0eXBlIEVuaGFuY2VyTWFwLCB0eXBlIFJlc29sdmVTdWJzZXRJbnRlcnNlY3Rpb24gfSBmcm9tIFwiLi9iYXNlLW1vZGVsLnR5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIERCUHJlc2V0IH0gZnJvbSBcIi4vZGJcIjtcbmltcG9ydCB7IERCIH0gZnJvbSBcIi4vZGJcIjtcbmltcG9ydCB7IFB1cmkgfSBmcm9tIFwiLi9wdXJpXCI7XG5pbXBvcnQge1xuICB0eXBlIEluZmVyQWxsU3Vic2V0cyxcbiAgdHlwZSBQdXJpTG9hZGVyUXVlcmllcyxcbiAgdHlwZSBQdXJpU3Vic2V0Rm4sXG59IGZyb20gXCIuL3B1cmktc3Vic2V0LnR5cGVzXCI7XG5pbXBvcnQgeyBQdXJpV3JhcHBlciB9IGZyb20gXCIuL3B1cmktd3JhcHBlclwiO1xuaW1wb3J0IHsgdHlwZSBVbmlvbkV4dHJhY3RlZFRUYWJsZXMgfSBmcm9tIFwiLi9wdXJpLnR5cGVzXCI7XG5pbXBvcnQgeyBVcHNlcnRCdWlsZGVyIH0gZnJvbSBcIi4vdXBzZXJ0LWJ1aWxkZXJcIjtcblxudHlwZSBEYXRhYmFzZVJlY29yZFZhbHVlID1cbiAgfCBzdHJpbmdcbiAgfCBudW1iZXJcbiAgfCBib29sZWFuXG4gIHwgYmlnaW50XG4gIHwgRGF0ZVxuICB8IEJ1ZmZlclxuICB8IEtuZXguUmF3XG4gIHwgbnVsbFxuICB8IERhdGFiYXNlUmVjb3JkVmFsdWVbXVxuICB8IHsgW2tleTogc3RyaW5nXTogRGF0YWJhc2VSZWNvcmRWYWx1ZSB9O1xudHlwZSBEYXRhYmFzZVJlY29yZCA9IFJlY29yZDxzdHJpbmcsIERhdGFiYXNlUmVjb3JkVmFsdWUgfCB1bmRlZmluZWQ+O1xuXG4vKipcbiAqIOuqqOuToCBNb2RlbCDtgbTrnpjsiqTsnZgg6riw67O4IO2BtOuemOyKpFxuICpcbiAqIEB0ZW1wbGF0ZSBUU3Vic2V0S2V5IC0g7ISc67iM7IWLIO2CpCDsnKDri4jsmKggKOyYiDogXCJBXCIgfCBcIlBcIiB8IFwiU1NcIilcbiAqIEB0ZW1wbGF0ZSBUU3Vic2V0TWFwcGluZyAtIOyEnOu4jOyFi+uzhCDstZzsooUg6rKw6rO8IO2DgOyehSDrp6TtlZFcbiAqIEB0ZW1wbGF0ZSBUU3Vic2V0UXVlcmllcyAtIOyEnOu4jOyFiyDsv7zrpqwg7ZWo7IiYIOqwneyytFxuICogQHRlbXBsYXRlIFRMb2FkZXJRdWVyaWVzIC0g7ISc67iM7IWL67OEIOuhnOuNlCDsv7zrpqwg67Cw7Je0IOqwneyytFxuICovXG5leHBvcnQgY2xhc3MgQmFzZU1vZGVsQ2xhc3M8XG4gIFRTdWJzZXRLZXkgZXh0ZW5kcyBzdHJpbmcgPSBuZXZlcixcbiAgVFN1YnNldE1hcHBpbmcgZXh0ZW5kcyB7IFtLIGluIFRTdWJzZXRLZXldOiBUU3Vic2V0TWFwcGluZ1tLXSB9ID0gbmV2ZXIsXG4gIFRTdWJzZXRRdWVyaWVzIGV4dGVuZHMgUmVjb3JkPFRTdWJzZXRLZXksIFB1cmlTdWJzZXRGbj4gPSBuZXZlcixcbiAgVExvYWRlclF1ZXJpZXMgZXh0ZW5kcyBQdXJpTG9hZGVyUXVlcmllczxUU3Vic2V0S2V5PiA9IG5ldmVyLFxuPiB7XG4gIHByb3RlY3RlZCByZWFkb25seSBsb2dnZXI6IExvZ2dlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgbW9kZWxOYW1lOiBzdHJpbmcgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWUsXG4gICAgcHJvdGVjdGVkIHN1YnNldFF1ZXJpZXM/OiBUU3Vic2V0UXVlcmllcyxcbiAgICBwcm90ZWN0ZWQgbG9hZGVyUXVlcmllcz86IFRMb2FkZXJRdWVyaWVzLFxuICApIHtcbiAgICB0aGlzLmxvZ2dlciA9IGdldExvZ2dlcihjb252ZXJ0RG9tYWluVG9DYXRlZ29yeSh0aGlzLm1vZGVsTmFtZSwgXCJtb2RlbFwiKSk7XG4gIH1cblxuICBnZXREQih3aGljaDogREJQcmVzZXQpOiBLbmV4IHtcbiAgICByZXR1cm4gREIuZ2V0REIod2hpY2gpO1xuICB9XG5cbiAgZ2V0UHVyaSh3aGljaDogREJQcmVzZXQpOiBQdXJpV3JhcHBlciB7XG4gICAgLy8g7Yq4656c7J6t7IWYIOy7qO2FjeyKpO2KuOyXkOyEnCDtirjrnpzsnq3shZgg7ZqN65OdXG4gICAgY29uc3QgdHJ4ID0gREIuZ2V0VHJhbnNhY3Rpb25Db250ZXh0KCkuZ2V0VHJhbnNhY3Rpb24od2hpY2gpO1xuICAgIGlmICh0cngpIHtcbiAgICAgIHJldHVybiB0cng7XG4gICAgfVxuXG4gICAgLy8g7Yq4656c7J6t7IWY7J20IOyXhuycvOuptCDsg4jroZzsmrQgUHVyaVdyYXBwZXIg67CY7ZmYXG4gICAgY29uc3QgZGIgPSB0aGlzLmdldERCKHdoaWNoKTtcbiAgICByZXR1cm4gbmV3IFB1cmlXcmFwcGVyKGRiLCBuZXcgVXBzZXJ0QnVpbGRlcigpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3Vic2V0UXVlcnlQdXJpKCk6IFB1cmlXcmFwcGVyIHtcbiAgICBjb25zdCBhY3RpdmVUcmFuc2FjdGlvbiA9IERCLmdldFRyYW5zYWN0aW9uQ29udGV4dCgpLmdldEFjdGl2ZVRyYW5zYWN0aW9uKCk7XG4gICAgaWYgKGFjdGl2ZVRyYW5zYWN0aW9uKSB7XG4gICAgICByZXR1cm4gYWN0aXZlVHJhbnNhY3Rpb247XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQdXJpV3JhcHBlcih0aGlzLmdldERCKFwiclwiKSwgbmV3IFVwc2VydEJ1aWxkZXIoKSk7XG4gIH1cblxuICBhc3luYyBkZXN0cm95KCkge1xuICAgIHJldHVybiBEQi5kZXN0cm95KCk7XG4gIH1cblxuICBhc3luYyBnZXRJbnNlcnRlZElkcyhcbiAgICB3ZGI6IEtuZXgsXG4gICAgcm93czogRGF0YWJhc2VSZWNvcmRbXSxcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICB1bnFLZXlGaWVsZHM6IHN0cmluZ1tdLFxuICAgIGNodW5rU2l6ZTogbnVtYmVyID0gNTAwLFxuICApIHtcbiAgICBpZiAoIXdkYikge1xuICAgICAgd2RiID0gdGhpcy5nZXREQihcIndcIik7XG4gICAgfVxuXG4gICAgbGV0IHVucUtleXM6IHN0cmluZ1tdO1xuICAgIGxldCB3aGVyZUluRmllbGQ6IHN0cmluZyB8IEtuZXguUmF3O1xuICAgIGxldCBzZWxlY3RGaWVsZDogc3RyaW5nO1xuXG4gICAgaWYgKHVucUtleUZpZWxkcy5sZW5ndGggPiAxKSB7XG4gICAgICB3aGVyZUluRmllbGQgPSB3ZGIucmF3KGBDT05DQVRfV1MoJ18nLCAnJHt1bnFLZXlGaWVsZHMuam9pbihcIixcIil9JylgKTtcbiAgICAgIHNlbGVjdEZpZWxkID0gYCR7d2hlcmVJbkZpZWxkfSBhcyB0bXBVaWRgO1xuICAgICAgdW5xS2V5cyA9IHJvd3MubWFwKChyb3cpID0+IHVucUtleUZpZWxkcy5tYXAoKGZpZWxkKSA9PiByb3dbZmllbGRdKS5qb2luKFwiX1wiKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdoZXJlSW5GaWVsZCA9IHVucUtleUZpZWxkc1swXTtcbiAgICAgIHNlbGVjdEZpZWxkID0gdW5xS2V5RmllbGRzWzBdO1xuICAgICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgIHVucUtleXMgPSByb3dzLm1hcCgocm93KSA9PiByb3dbdW5xS2V5RmllbGRzWzBdXSBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIGxldCByZXN1bHRJZHM6IG51bWJlcltdID0gW107XG4gICAgZm9yIChjb25zdCBpdGVtcyBvZiBjbHVzdGVyKHVucUtleXMsIGNodW5rU2l6ZSkpIHtcbiAgICAgIGNvbnN0IGRiUm93cyA9IGF3YWl0IHdkYih0YWJsZU5hbWUpXG4gICAgICAgIC5zZWxlY3QoXCJpZFwiLCB3ZGIucmF3KHNlbGVjdEZpZWxkKSlcbiAgICAgICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgICAgLndoZXJlSW4oXG4gICAgICAgICAgLyogU0FGRVRZOiBLbmV4IOufsO2DgOyehOydgCDsu6zrn7wg7JyE7LmY7J2YIFJhdyDtkZztmITsi53snYQg7KeA7JuQ7ZWY7KeA66eMIOyEoOyWuCDtg4DsnoXsl5DripQg64iE652965CY7Ja0IOyeiOyKteuLiOuLpC4gKi9cbiAgICAgICAgICB3aGVyZUluRmllbGQgYXMgc3RyaW5nLFxuICAgICAgICAgIGl0ZW1zLFxuICAgICAgICApO1xuICAgICAgcmVzdWx0SWRzID0gcmVzdWx0SWRzLmNvbmNhdChcbiAgICAgICAgZGJSb3dzLm1hcCgoZGJSb3c6IERhdGFiYXNlUmVjb3JkKSA9PiBwYXJzZUludChTdHJpbmcoZGJSb3cuaWQpKSksXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRJZHM7XG4gIH1cblxuICAvKipcbiAgICog7Yq57KCVIOyEnOu4jOyFi+yXkCDrjIDtlZwg7L+866asIOu5jOuNlCDtmo3rk51cbiAgICpcbiAgICogQHJldHVybnMgcWIgLSDsv7zrpqwg67mM642UICjsobDqsbQg7LaU6rCA7JqpKVxuICAgKiBAcmV0dXJucyBvblN1YnNldCAtIO2KueyglSDshJzruIzshYsg7KCE7JqpIO2DgOyeheydtCDtlYTsmpTtlaAg65WMIOyCrOyaqVxuICAgKi9cbiAgZ2V0U3Vic2V0UXVlcmllczxUIGV4dGVuZHMgVFN1YnNldEtleT4oc3Vic2V0OiBUKSB7XG4gICAgaWYgKCF0aGlzLnN1YnNldFF1ZXJpZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInN1YnNldFF1ZXJpZXMgaXMgbm90IGRlZmluZWRcIik7XG4gICAgfVxuXG4gICAgY29uc3QgcHVyaVdyYXBwZXIgPSB0aGlzLmdldFN1YnNldFF1ZXJ5UHVyaSgpO1xuICAgIGNvbnN0IHFiID0gdGhpcy5zdWJzZXRRdWVyaWVzW3N1YnNldF0/LihwdXJpV3JhcHBlcik7XG5cbiAgICAvLyBOb25BbGxvd2VkQXNTaW5nbGVUYWJsZTog64uo7J28IO2FjOydtOu4lCDsu6zrn7wg7KCR6re8IOuwqeyngOyaqSDrp4jsu6RcbiAgICB0eXBlIFFCVGFibGVzID0gVW5pb25FeHRyYWN0ZWRUVGFibGVzPFRTdWJzZXRLZXksIFRTdWJzZXRRdWVyaWVzPiAmIHtcbiAgICAgIE5vbkFsbG93ZWRBc1NpbmdsZVRhYmxlOiB7IF9fZnVsbHRleHRfXzogdHJ1ZSB9O1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBvblN1YnNldDxTIGV4dGVuZHMgVFN1YnNldEtleT4oc3Vic2V0OiBTKTogUmV0dXJuVHlwZTxUU3Vic2V0UXVlcmllc1tTXT47XG4gICAgZnVuY3Rpb24gb25TdWJzZXQ8QXJyIGV4dGVuZHMgcmVhZG9ubHkgVFN1YnNldEtleVtdPihcbiAgICAgIHN1YnNldHM6IFsuLi5BcnJdLFxuICAgICk6IFJlc29sdmVTdWJzZXRJbnRlcnNlY3Rpb248QXJyLCBUU3Vic2V0UXVlcmllcz47XG4gICAgZnVuY3Rpb24gb25TdWJzZXQoX3N1YnNldDogVFN1YnNldEtleSB8IHJlYWRvbmx5IFRTdWJzZXRLZXlbXSkge1xuICAgICAgcmV0dXJuIHFiO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAvLyBTQUZFVFk6IOqwmeydgCBQdXJpIOyduOyKpO2EtOyKpOyXkCDri6jsnbwg7YWM7J2067iUIOygkeq3vCDsoJztlZzsmqkg7YOA7J6FIOuniOy7pOunjCDstpTqsIDtlanri4jri6QuXG4gICAgICBxYjogcWIgYXMgUHVyaTxEYXRhYmFzZVNjaGVtYUV4dGVuZCwgUUJUYWJsZXMsIHt9PixcbiAgICAgIG9uU3Vic2V0LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRW5oYW5jZXIg6rCd7LK0IOyDneyEsSDtl6ztjbxcbiAgICog7YOA7J6FIOqygOymnSDrsI8g7LaU66Gg7J2EIOuPhOyZgOykjFxuICAgKi9cbiAgY3JlYXRlRW5oYW5jZXJzPFQgZXh0ZW5kcyBUU3Vic2V0S2V5PihcbiAgICBlbmhhbmNlcnM6IEVuaGFuY2VyTWFwPFxuICAgICAgVCxcbiAgICAgIEluZmVyQWxsU3Vic2V0czxUU3Vic2V0UXVlcmllcywgVExvYWRlclF1ZXJpZXM+LFxuICAgICAgVFN1YnNldE1hcHBpbmcsXG4gICAgICBUU3Vic2V0UXVlcmllc1xuICAgID4sXG4gICkge1xuICAgIHJldHVybiBlbmhhbmNlcnM7XG4gIH1cblxuICAvKipcbiAgICog7ISc67iM7IWLIOy/vOumrCDsi6TtlolcbiAgICpcbiAgICogMS4gU29uYW11IO2VhO2EsCDsoIHsmqkgKO2DgOyehSDrs4DtmZgg7Y+s7ZWoKVxuICAgKiAyLiDsv7zrpqwg7Iuk7ZaJIChwYWdpbmF0aW9uIOyggeyaqSlcbiAgICogMy4g66Gc642UIOyLpO2WiSAoMTpOLCBOOk0g6rSA6rOEIOuNsOydtO2EsCDroZzrlKkpXG4gICAqIDQuIEh5ZHJhdGUgKGZsYXQg4oaSIOykkeyyqSDqsJ3ssrQpXG4gICAqIDUuIEVuaGFuY2VyIOyggeyaqSAodmlydHVhbCDtlYTrk5wg6rOE7IKwKVxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZVN1YnNldFF1ZXJ5PFxuICAgIFQgZXh0ZW5kcyBUU3Vic2V0S2V5LFxuICAgIFRDb21wdXRlZFJlc3VsdHMgZXh0ZW5kcyBJbmZlckFsbFN1YnNldHM8VFN1YnNldFF1ZXJpZXMsIFRMb2FkZXJRdWVyaWVzPixcbiAgICBURmlsdGVyIGV4dGVuZHMgb2JqZWN0LFxuICAgIExQIGV4dGVuZHMge1xuICAgICAgbnVtPzogbnVtYmVyO1xuICAgICAgcGFnZT86IG51bWJlcjtcbiAgICAgIHF1ZXJ5TW9kZT86IFNvbmFtdVF1ZXJ5TW9kZTtcbiAgICB9LFxuICA+KFxuICAgIHBhcmFtczoge1xuICAgICAgc3Vic2V0OiBUO1xuICAgICAgcWI6IFB1cmk8YW55LCBhbnksIGFueT47XG4gICAgICBwYXJhbXM6IHtcbiAgICAgICAgbnVtOiBudW1iZXI7XG4gICAgICAgIHBhZ2U6IG51bWJlcjtcbiAgICAgICAgcXVlcnlNb2RlPzogU29uYW11UXVlcnlNb2RlO1xuICAgICAgICBzb25hbXVGaWx0ZXI/OiBURmlsdGVyO1xuICAgICAgfTtcbiAgICAgIGRlYnVnPzogYm9vbGVhbjtcbiAgICAgIG9wdGltaXplQ291bnRRdWVyeT86IGJvb2xlYW47XG4gICAgfSAmIEVuaGFuY2VyUGFyYW08VFN1YnNldEtleSwgVENvbXB1dGVkUmVzdWx0cywgVFN1YnNldE1hcHBpbmcsIFRTdWJzZXRRdWVyaWVzPixcbiAgKTogUHJvbWlzZTxMaXN0UmVzdWx0PExQLCBUU3Vic2V0TWFwcGluZ1tUXT4+IHtcbiAgICBjb25zdCB7IHN1YnNldCwgcWIsIHBhcmFtczogcXVlcnlQYXJhbXMsIGRlYnVnID0gZmFsc2UsIG9wdGltaXplQ291bnRRdWVyeSA9IGZhbHNlIH0gPSBwYXJhbXM7XG5cbiAgICBpZiAoIXRoaXMubG9hZGVyUXVlcmllcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwibG9hZGVyUXVlcmllcyBpcyBub3QgZGVmaW5lZFwiKTtcbiAgICB9XG5cbiAgICAvLyBTb25hbXUgRmlsdGVyIOyggeyaqVxuICAgIGlmIChxdWVyeVBhcmFtcy5zb25hbXVGaWx0ZXIpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRGaWx0ZXIgPSBub3JtYWxpemVGaWx0ZXJRdWVyeShxdWVyeVBhcmFtcy5zb25hbXVGaWx0ZXIpO1xuICAgICAgdGhpcy5hcHBseVNvbmFtdUZpbHRlcnMocWIsIG5vcm1hbGl6ZWRGaWx0ZXIpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgbnVtLCBwYWdlIH0gPSBxdWVyeVBhcmFtcztcbiAgICAvLyDrqqjrk6Ag66Gc642U6rCAIHJvb3QgcXVlcnnsmYAg6rCZ7J2AIOyXsOqysOydhCDsgqzsmqntlZjrj4TroZ0g7Iuk7ZaJIOyLnOygkOydmCBrbmV47JeQ7IScIO2VnCDrsojrp4wg7YyM7IOd7ZWc64ukLlxuICAgIGNvbnN0IHB1cmlXcmFwcGVyID0gbmV3IFB1cmlXcmFwcGVyKHFiLmtuZXgsIG5ldyBVcHNlcnRCdWlsZGVyKCkpO1xuXG4gICAgLy8gQ09VTlQg7L+866asIOyLpO2WiSAocXVlcnlNb2RlOiBsaXN07J28IOuVjOuKlCAwIOumrO2EtClcbiAgICBjb25zdCB0b3RhbCA9IGF3YWl0IHRoaXMuZXhlY3V0ZUNvdW50UXVlcnkocWIsIHF1ZXJ5UGFyYW1zLCBkZWJ1Zywgb3B0aW1pemVDb3VudFF1ZXJ5KTtcblxuICAgIGlmIChxdWVyeVBhcmFtcz8ucXVlcnlNb2RlID09PSBcImNvdW50XCIpIHtcbiAgICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgICByZXR1cm4geyB0b3RhbCB9IGFzIExpc3RSZXN1bHQ8TFAsIFRTdWJzZXRNYXBwaW5nW1RdPjtcbiAgICB9XG5cbiAgICAvLyBMSVNUIOy/vOumrCDsi6TtlolcbiAgICBjb25zdCBjb21wdXRlZFJvd3MgPSBhd2FpdCB0aGlzLmV4ZWN1dGVMaXN0UXVlcnkoXG4gICAgICBzdWJzZXQsXG4gICAgICBxYixcbiAgICAgIHF1ZXJ5UGFyYW1zLFxuICAgICAgbnVtLFxuICAgICAgcGFnZSxcbiAgICAgIGRlYnVnLFxuICAgICAgcHVyaVdyYXBwZXIsXG4gICAgKTtcblxuICAgIC8vIEVuaGFuY2VyIOyggeyaqVxuICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgY29uc3QgZW5oYW5jZXIgPSAocGFyYW1zIGFzIGFueSkuZW5oYW5jZXJzPy5bc3Vic2V0XTtcbiAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgIGNvbnN0IGVuaGFuY2VkUm93cyA9IChhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGNvbXB1dGVkUm93cy5tYXAoKHJvdykgPT4gZW5oYW5jZXI/Lihyb3cpID8/IHJvdyksXG4gICAgKSkgYXMgVFN1YnNldE1hcHBpbmdbVF1bXTtcblxuICAgIC8vIEludGVybmFsIO2VhOuTnCDsoJzqsbBcbiAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldCh0aGlzLm1vZGVsTmFtZSk7XG4gICAgY29uc3QgaW50ZXJuYWxGaWVsZHMgPSBlbnRpdHkuc3Vic2V0c0ludGVybmFsW3N1YnNldF0gPz8gW107XG4gICAgY29uc3Qgcm93cyA9XG4gICAgICBpbnRlcm5hbEZpZWxkcy5sZW5ndGggPiAwXG4gICAgICAgID8gZW5oYW5jZWRSb3dzLm1hcCgocm93KSA9PiB0aGlzLm9taXRJbnRlcm5hbEZpZWxkcyhyb3csIGludGVybmFsRmllbGRzKSlcbiAgICAgICAgOiBlbmhhbmNlZFJvd3M7XG5cbiAgICBpZiAocXVlcnlQYXJhbXMucXVlcnlNb2RlID09PSBcImxpc3RcIikge1xuICAgICAgLy8g66as7Iqk7Yq466eMIOumrO2EtFxuICAgICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgIHJldHVybiB7IHJvd3MgfSBhcyBMaXN0UmVzdWx0PExQLCBUU3Vic2V0TWFwcGluZ1tUXT47XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOuRmOuLpCDrpqzthLRcbiAgICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgICByZXR1cm4geyByb3dzLCB0b3RhbCB9IGFzIExpc3RSZXN1bHQ8TFAsIFRTdWJzZXRNYXBwaW5nW1RdPjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6rCd7LK07JeQ7IScIGludGVybmFsIO2VhOuTnCDsoJzqsbBcbiAgICog7KSR7LKpIO2VhOuTnCjsmIg6IFwidXNlci5lbWFpbFwiKSDrsI8g67Cw7Je0KOyYiDogXCJlbXBsb3llZXMuc2FsYXJ5XCIp64+EIOyymOumrFxuICAgKi9cbiAgb21pdEludGVybmFsRmllbGRzPFQgZXh0ZW5kcyBvYmplY3Q+KHJvdzogVCwgZmllbGRzOiBzdHJpbmdbXSk6IFQge1xuICAgIGNvbnN0IHJlc3VsdCA9IGNsb25lRGVlcChyb3cpO1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICB0aGlzLmRlbGV0ZUZpZWxkKHJlc3VsdCwgZmllbGQuc3BsaXQoXCIuXCIpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJRdWVyeeulvCBQdXJpIFF1ZXJ5QnVpbGRlcuyXkCDsoIHsmqlcbiAgICpcbiAgICogQHBhcmFtIHFiIFB1cmkgUXVlcnlCdWlsZGVyIOyduOyKpO2EtOyKpFxuICAgKiBAcGFyYW0gZmlsdGVycyBGaWx0ZXJRdWVyeSDqsJ3ssrRcbiAgICovXG4gIHByb3RlY3RlZCBhcHBseVNvbmFtdUZpbHRlcnM8VEVudGl0eT4oXG4gICAgcWI6IFB1cmk8YW55LCBhbnksIGFueT4sXG4gICAgZmlsdGVycz86IEZpbHRlclF1ZXJ5PFRFbnRpdHk+LFxuICApOiB2b2lkIHtcbiAgICBpZiAoIWZpbHRlcnMpIHJldHVybjtcblxuICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHRoaXMubW9kZWxOYW1lKTtcblxuICAgIC8vIDEuIO2VhO2EsCDqsoDspp0gKEVudGl0eSDquLDrsJgpXG4gICAgdmFsaWRhdGVTb25hbXVGaWx0ZXJzKGZpbHRlcnMsIGVudGl0eSk7XG5cbiAgICAvLyAyLiDqsoDspp3rkJwg7ZWE7YSwIOyggeyaqVxuICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgY29uc3QgcHVyaSA9IHFiIGFzIGFueTtcblxuICAgIGZvciAoY29uc3QgW2ZpZWxkLCBjb25kaXRpb25dIG9mIE9iamVjdC5lbnRyaWVzKGZpbHRlcnMpKSB7XG4gICAgICBpZiAoY29uZGl0aW9uID09PSB1bmRlZmluZWQgfHwgY29uZGl0aW9uID09PSBudWxsKSBjb250aW51ZTtcblxuICAgICAgLy8g7YWM7J2067iU66qFLu2VhOuTnOuqhSDtmJXsi53snLzroZwg67OA7ZmYXG4gICAgICBjb25zdCBmdWxsRmllbGQgPSBlbnRpdHkuZ2V0RnVsbEZpZWxkTmFtZShmaWVsZCk7XG5cbiAgICAgIC8vIOyngeygkSDqsJIgKGVx7JmAIOuPmeydvClcbiAgICAgIGlmICghaXNPYmplY3RWYWx1ZShjb25kaXRpb24pIHx8IEFycmF5LmlzQXJyYXkoY29uZGl0aW9uKSkge1xuICAgICAgICBwdXJpLndoZXJlKGZ1bGxGaWVsZCwgY29uZGl0aW9uKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIOyXsOyCsOyekCDqsJ3ssrRcbiAgICAgIGZvciAoY29uc3QgW29wZXJhdG9yLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoY29uZGl0aW9uKSkge1xuICAgICAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAgICB0aGlzLmFwcGx5T3BlcmF0b3IocWIsIGZ1bGxGaWVsZCwgb3BlcmF0b3IgYXMgRmlsdGVyT3BlcmF0b3IsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog64uo7J28IOyXsOyCsOyekOulvCBRdWVyeUJ1aWxkZXLsl5Ag7KCB7JqpXG4gICAqL1xuICBwcml2YXRlIGFwcGx5T3BlcmF0b3I8VmFsdWU+KFxuICAgIHFiOiBQdXJpPGFueSwgYW55LCBhbnk+LFxuICAgIGZpZWxkOiBzdHJpbmcsXG4gICAgb3BlcmF0b3I6IEZpbHRlck9wZXJhdG9yLFxuICAgIHZhbHVlOiBWYWx1ZSxcbiAgKTogdm9pZCB7XG4gICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICBjb25zdCBwdXJpID0gcWIgYXMgYW55O1xuXG4gICAgc3dpdGNoIChvcGVyYXRvcikge1xuICAgICAgY2FzZSBcImVxXCI6XG4gICAgICAgIHB1cmkud2hlcmUoZmllbGQsIHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJuZVwiOlxuICAgICAgICBwdXJpLndoZXJlKGZpZWxkLCBcIiE9XCIsIHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJndFwiOlxuICAgICAgICBwdXJpLndoZXJlKGZpZWxkLCBcIj5cIiwgdmFsdWUpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcImd0ZVwiOlxuICAgICAgICBwdXJpLndoZXJlKGZpZWxkLCBcIj49XCIsIHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJsdFwiOlxuICAgICAgICBwdXJpLndoZXJlKGZpZWxkLCBcIjxcIiwgdmFsdWUpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcImx0ZVwiOlxuICAgICAgICBwdXJpLndoZXJlKGZpZWxkLCBcIjw9XCIsIHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJpblwiOlxuICAgICAgICBwdXJpLndoZXJlSW4oZmllbGQsIHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJub3RJblwiOlxuICAgICAgICBwdXJpLndoZXJlTm90SW4oZmllbGQsIHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJjb250YWluc1wiOlxuICAgICAgICBwdXJpLndoZXJlKGZpZWxkLCBcImxpa2VcIiwgYCUke3ZhbHVlfSVgKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJzdGFydHNXaXRoXCI6XG4gICAgICAgIHB1cmkud2hlcmUoZmllbGQsIFwibGlrZVwiLCBgJHt2YWx1ZX0lYCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwiZW5kc1dpdGhcIjpcbiAgICAgICAgcHVyaS53aGVyZShmaWVsZCwgXCJsaWtlXCIsIGAlJHt2YWx1ZX1gKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJpc051bGxcIjpcbiAgICAgICAgcHVyaS53aGVyZShmaWVsZCwgbnVsbCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwiaXNOb3ROdWxsXCI6XG4gICAgICAgIHB1cmkud2hlcmUoZmllbGQsIFwiIT1cIiwgbnVsbCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwiYmVmb3JlXCI6XG4gICAgICAgIHB1cmkud2hlcmUoZmllbGQsIFwiPFwiLCB2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwiYWZ0ZXJcIjpcbiAgICAgICAgcHVyaS53aGVyZShmaWVsZCwgXCI+XCIsIHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJiZXR3ZWVuXCI6IHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgIGNvbnN0IFttaW4sIG1heF0gPSB2YWx1ZTtcbiAgICAgICAgICBwdXJpLndoZXJlKGZpZWxkLCBcIj49XCIsIG1pbikud2hlcmUoZmllbGQsIFwiPD1cIiwgbWF4KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgY29uc29sZS53YXJuKGBVbnN1cHBvcnRlZCBvcGVyYXRvcjogJHtvcGVyYXRvcn1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog7KSR7LKpIO2VhOuTnCDsgq3soJwgKOuwsOyXtCDrgrQg6rCd7LK064+EIOyymOumrClcbiAgICovXG4gIGRlbGV0ZUZpZWxkKG9iajogYW55LCBwYXJ0czogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBpZiAoIW9iaiB8fCAhaXNPYmplY3RWYWx1ZShvYmopKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICBvYmouZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGlmIChpdGVtICYmIGlzT2JqZWN0VmFsdWUoaXRlbSkpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBpdGVtW3BhcnRzWzBdXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIG9ialtwYXJ0c1swXV07XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgW2ZpcnN0LCAuLi5yZXN0XSA9IHBhcnRzO1xuICAgIGNvbnN0IG5leHQgPSBvYmpbZmlyc3RdO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobmV4dCkpIHtcbiAgICAgIG5leHQubWFwKChpdGVtKSA9PiB0aGlzLmRlbGV0ZUZpZWxkKGl0ZW0sIHJlc3QpKTtcbiAgICB9IGVsc2UgaWYgKG5leHQgJiYgaXNPYmplY3RWYWx1ZShuZXh0KSkge1xuICAgICAgdGhpcy5kZWxldGVGaWVsZChuZXh0LCByZXN0KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ09VTlQg7L+866asIOyLpO2WiSAo64K067aAIOuplOyEnOuTnClcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZUNvdW50UXVlcnkoXG4gICAgcWI6IFB1cmk8YW55LCBhbnksIGFueT4sXG4gICAgcGFyYW1zOiB7IHF1ZXJ5TW9kZT86IFwibGlzdFwiIHwgXCJjb3VudFwiIHwgXCJib3RoXCIgfSxcbiAgICBkZWJ1ZzogYm9vbGVhbixcbiAgICBvcHRpbWl6ZUNvdW50UXVlcnk6IGJvb2xlYW4sXG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgaWYgKHBhcmFtcy5xdWVyeU1vZGUgPT09IFwibGlzdFwiKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBjb25zdCBjb3VudFB1cmkgPSBxYi5jbG9uZSgpLmNsZWFyKFwib3JkZXJcIikuY2xlYXIoXCJsaW1pdFwiKS5jbGVhcihcIm9mZnNldFwiKTtcblxuICAgIGlmIChvcHRpbWl6ZUNvdW50UXVlcnkpIHtcbiAgICAgIGNvbnN0IHsgZGVmYXVsdDogU3FsUGFyc2VyIH0gPSBhd2FpdCBpbXBvcnQoXCJub2RlLXNxbC1wYXJzZXJcIik7XG4gICAgICBjb25zdCBwYXJzZXIgPSBuZXcgU3FsUGFyc2VyLlBhcnNlcigpO1xuICAgICAgY29uc3QgcGFyc2VkUXVlcnkgPSBwYXJzZXIuYXN0aWZ5KGNvdW50UHVyaS50b1F1ZXJ5KCksIHtcbiAgICAgICAgZGF0YWJhc2U6IFNvbmFtdS5jb25maWcuZGF0YWJhc2UuZGF0YWJhc2UsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgbGVmdEpvaW5UYWJsZXMgPSBnZXRKb2luVGFibGVzKHBhcnNlZFF1ZXJ5LCBbXCJMRUZUIEpPSU5cIl0pO1xuICAgICAgY29uc3Qgd2hlcmVUYWJsZXMgPSBnZXRUYWJsZU5hbWVzRnJvbVdoZXJlKHBhcnNlZFF1ZXJ5KTtcblxuICAgICAgY29uc3QgdGFibGVzVG9SZW1vdmUgPSBsZWZ0Sm9pblRhYmxlcy5maWx0ZXIoKGopID0+ICF3aGVyZVRhYmxlcy5pbmNsdWRlcyhqKSk7XG4gICAgICB0YWJsZXNUb1JlbW92ZS5mb3JFYWNoKCh0YWJsZSkgPT4ge1xuICAgICAgICBjb3VudFB1cmkuY2xlYXJKb2luKHRhYmxlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIENPVU5UKCop66GcIOyghOyytCDroIjsvZTrk5wg7IiY66W8IOqzhOyCsFxuICAgIC8vIFRPRE86IHFi7J2YIERJU1RJTkNU6rCAIOyeiOuKlCDqsr3smrAg7LKY66as7ZW07JW8IO2VqFxuICAgIGNvbnN0IGNvdW50UmVzdWx0OiB7IHRvdGFsPzogbnVtYmVyIH0gPSBhd2FpdCBjb3VudFB1cmlcbiAgICAgIC5jbGVhcihcInNlbGVjdFwiKVxuICAgICAgLnNlbGVjdCh7IHRvdGFsOiBQdXJpLnJhd051bWJlcihgQ09VTlQoKik6OmludGVnZXJgKSB9KVxuICAgICAgLmZpcnN0KCk7XG5cbiAgICBpZiAoZGVidWcpIHtcbiAgICAgIGNvdW50UHVyaS5kZWJ1ZygpO1xuICAgIH1cblxuICAgIHJldHVybiBjb3VudFJlc3VsdD8udG90YWwgPz8gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBMSVNUIOy/vOumrCDsi6TtlokgKOuCtOu2gCDrqZTshJzrk5wpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVMaXN0UXVlcnk8VCBleHRlbmRzIFRTdWJzZXRLZXk+KFxuICAgIHN1YnNldDogVCxcbiAgICBxYjogUHVyaTxhbnksIGFueSwgYW55PixcbiAgICBwYXJhbXM6IHsgcXVlcnlNb2RlPzogXCJsaXN0XCIgfCBcImNvdW50XCIgfCBcImJvdGhcIiB9LFxuICAgIG51bTogbnVtYmVyLFxuICAgIHBhZ2U6IG51bWJlcixcbiAgICBkZWJ1ZzogYm9vbGVhbixcbiAgICBwdXJpV3JhcHBlcjogUHVyaVdyYXBwZXIsXG4gICk6IFByb21pc2U8YW55W10+IHtcbiAgICBpZiAocGFyYW1zLnF1ZXJ5TW9kZSA9PT0gXCJjb3VudFwiKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgbGltaXRlZFFiID0gKCgpID0+IHtcbiAgICAgIGlmIChudW0gPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHFiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHFiLmxpbWl0KG51bSkub2Zmc2V0KG51bSAqIChwYWdlIC0gMSkpO1xuICAgICAgfVxuICAgIH0pKCk7XG4gICAgbGV0IHVubG9hZGVkUm93cyA9IGF3YWl0IGxpbWl0ZWRRYjtcblxuICAgIGlmIChkZWJ1Zykge1xuICAgICAgcWIuZGVidWcoKTtcbiAgICB9XG5cbiAgICAvLyDroZzrjZQg7LKY66asXG4gICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICBjb25zdCBsb2FkZXJzID0gKHRoaXMubG9hZGVyUXVlcmllcyBhcyBhbnkpW3N1YnNldF07XG4gICAgaWYgKGxvYWRlcnMgJiYgQXJyYXkuaXNBcnJheShsb2FkZXJzKSkge1xuICAgICAgdW5sb2FkZWRSb3dzID0gYXdhaXQgdGhpcy5wcm9jZXNzTG9hZGVycyh1bmxvYWRlZFJvd3MsIGxvYWRlcnMsIGRlYnVnLCBwdXJpV3JhcHBlcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaHlkcmF0ZSh1bmxvYWRlZFJvd3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIOyerOq3gOyggSDroZzrjZQg7LKY66asXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByb2Nlc3NMb2FkZXJzKFxuICAgIHJvd3M6IGFueVtdLFxuICAgIGxvYWRlcnM6IGFueVtdLFxuICAgIGRlYnVnOiBib29sZWFuLFxuICAgIHB1cmlXcmFwcGVyOiBQdXJpV3JhcHBlcixcbiAgKTogUHJvbWlzZTxhbnlbXT4ge1xuICAgIGZvciAoY29uc3QgcmVzb2x2ZUxvYWRlciBvZiBsb2FkZXJzKSB7XG4gICAgICBjb25zdCB7IGFzLCByZWZJZCwgcWI6IHJlc29sdmVMb2FkZXJRYkZuLCBsb2FkZXJzOiBuZXN0ZWRMb2FkZXJzIH0gPSByZXNvbHZlTG9hZGVyO1xuXG4gICAgICBjb25zdCByZXNvbHZlTG9hZGVyUWIgPSByZXNvbHZlTG9hZGVyUWJGbihcbiAgICAgICAgcHVyaVdyYXBwZXIsXG4gICAgICAgIHJvd3MubWFwKChyb3cpID0+IHJvd1tyZWZJZF0pLFxuICAgICAgKTtcblxuICAgICAgaWYgKGRlYnVnKSB7XG4gICAgICAgIHJlc29sdmVMb2FkZXJRYi5kZWJ1ZygpO1xuICAgICAgfVxuXG4gICAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAgbGV0IGxvYWRlZFJvd3MgPSAoYXdhaXQgcmVzb2x2ZUxvYWRlclFiKSBhcyBhbnlbXTtcblxuICAgICAgLy8g7KSR7LKpIGxvYWRlcnPqsIAg7J6I7Jy866m0IOyerOq3gCDsspjrpqxcbiAgICAgIGlmIChuZXN0ZWRMb2FkZXJzICYmIG5lc3RlZExvYWRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBsb2FkZWRSb3dzID0gYXdhaXQgdGhpcy5wcm9jZXNzTG9hZGVycyhsb2FkZWRSb3dzLCBuZXN0ZWRMb2FkZXJzLCBkZWJ1ZywgcHVyaVdyYXBwZXIpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdWJSb3dHcm91cHMgPSBncm91cChsb2FkZWRSb3dzLCAocm93KSA9PiByb3cucmVmSWQpO1xuXG4gICAgICByb3dzID0gcm93cy5tYXAoKHJvdykgPT4ge1xuICAgICAgICByb3dbYXNdID0gKHN1YlJvd0dyb3Vwc1tyb3dbcmVmSWRdXSA/PyBbXSkubWFwKChyKSA9PiBvbWl0KHIsIFtcInJlZklkXCJdKSk7XG4gICAgICAgIHJldHVybiByb3c7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcm93cztcbiAgfVxuXG4gIC8qKlxuICAgKiBGbGF0IOugiOy9lOuTnOulvCDspJHssqkg6rCd7LK066GcIOuzgO2ZmFxuICAgKlxuICAgKiAtIGB1c2VyX19uYW1lYCDihpIgYHsgdXNlcjogeyBuYW1lIH0gfWBcbiAgICogLSBudWxsYWJsZSByZWxhdGlvbuydmCDqsr3smrAgaWQg7ZWE65Oc6rCAIG51bGzsnbTrqbQg6rCd7LK0IOyekOyytOulvCBudWxs66GcXG4gICAqL1xuICBoeWRyYXRlPFQgZXh0ZW5kcyBvYmplY3Q+KHJvd3M6IFRbXSk6IFRbXSB7XG4gICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICByZXR1cm4gcm93cy5tYXAoKHJvdzogVCkgPT4ge1xuICAgICAgY29uc3Qgcm93VmFsdWVzID0gbmV3IE1hcChPYmplY3QuZW50cmllcyhyb3cpKTtcbiAgICAgIC8vIG51bGxhYmxlIHJlbGF0aW9uIOyymOumrDog6re466O57J2YIGlkIO2VhOuTnOqwgCBudWxs7J2066m0IOqwneyytCDsoITssrTrpbwgbnVsbOuhnFxuICAgICAgY29uc3QgbmVzdGVkS2V5cyA9IE9iamVjdC5rZXlzKHJvdykuZmlsdGVyKChrZXkpID0+IGtleS5pbmNsdWRlcyhcIl9fXCIpKTtcbiAgICAgIGNvbnN0IGdyb3VwcyA9IE9iamVjdC5ncm91cEJ5KG5lc3RlZEtleXMsIChrZXkpID0+IGtleS5zcGxpdChcIl9fXCIpWzBdKTtcblxuICAgICAgLy8gaWQg7ZWE65Oc6rCAIG51bGzsnbgg6re466O5IOywvuq4sCAo7JiIOiBwYXJlbnRfX2lk6rCAIG51bGzsnbTrqbQgcGFyZW50IOq3uOujuSDsoITssrTqsIAgbnVsbClcbiAgICAgIGNvbnN0IG51bGxLZXlzID0gT2JqZWN0LmVudHJpZXMoZ3JvdXBzKVxuICAgICAgICAuZmlsdGVyKChbZ3JvdXBLZXksIGZpZWxkc10pID0+IHtcbiAgICAgICAgICBpZiAoIWZpZWxkcyB8fCBmaWVsZHMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgICAvLyDqt7jro7nsnZggaWQg7ZWE65OcIOywvuq4sCAo7JiIOiBcInBhcmVudF9faWRcIilcbiAgICAgICAgICBjb25zdCBpZEZpZWxkID0gYCR7Z3JvdXBLZXl9X19pZGA7XG4gICAgICAgICAgaWYgKGlkRmllbGQgaW4gcm93KSB7XG4gICAgICAgICAgICAvLyBpZCDtlYTrk5zqsIAgbnVsbOydtOuptCDqsJ3ssrQg7KCE7LK06rCAIG51bGxcbiAgICAgICAgICAgIHJldHVybiByb3dWYWx1ZXMuZ2V0KGlkRmllbGQpID09PSBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGlkIO2VhOuTnOqwgCDsl4bsnLzrqbQg6riw7KG0IOuhnOyngTog66qo65OgIO2VhOuTnOqwgCBudWxs7J247KeAIO2ZleyduFxuICAgICAgICAgIHJldHVybiBmaWVsZHMuZXZlcnkoKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZFZhbHVlID0gcm93VmFsdWVzLmdldChmaWVsZCk7XG4gICAgICAgICAgICByZXR1cm4gZmllbGRWYWx1ZSA9PT0gbnVsbCB8fCAoQXJyYXkuaXNBcnJheShmaWVsZFZhbHVlKSAmJiBmaWVsZFZhbHVlLmxlbmd0aCA9PT0gMCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICAgIC5tYXAoKFtrZXldKSA9PiBrZXkpO1xuXG4gICAgICBsZXQgaHlkcmF0ZWQ6IERhdGFiYXNlUmVjb3JkID0gT2JqZWN0LmZyb21FbnRyaWVzKFtdKTtcbiAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgT2JqZWN0LmtleXMocm93KSkge1xuICAgICAgICBjb25zdCBmaWVsZFZhbHVlID0gcm93VmFsdWVzLmdldChmaWVsZCk7XG4gICAgICAgIGlmICghZmllbGQuaW5jbHVkZXMoXCJfX1wiKSkge1xuICAgICAgICAgIGNvbnN0IGh5ZHJhdGVkVmFsdWUgPVxuICAgICAgICAgICAgQXJyYXkuaXNBcnJheShmaWVsZFZhbHVlKSAmJiBpc09iamVjdChmaWVsZFZhbHVlWzBdKVxuICAgICAgICAgICAgICA/IHRoaXMuaHlkcmF0ZShmaWVsZFZhbHVlKVxuICAgICAgICAgICAgICA6IGZpZWxkVmFsdWU7XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihoeWRyYXRlZCwgeyBbZmllbGRdOiBoeWRyYXRlZFZhbHVlIH0pO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g7KSR7LKpIO2VhOuTnCDsspjrpqw6IHVzZXJfX25hbWUg4oaSIHVzZXJbbmFtZV1cbiAgICAgICAgY29uc3QgcGFydHMgPSBmaWVsZC5zcGxpdChcIl9fXCIpO1xuICAgICAgICBjb25zdCBvYmpQYXRoID1cbiAgICAgICAgICBwYXJ0c1swXSArXG4gICAgICAgICAgcGFydHNcbiAgICAgICAgICAgIC5zbGljZSgxKVxuICAgICAgICAgICAgLm1hcCgocGFydCkgPT4gYFske3BhcnR9XWApXG4gICAgICAgICAgICAuam9pbihcIlwiKTtcblxuICAgICAgICBoeWRyYXRlZCA9IHNldChcbiAgICAgICAgICBoeWRyYXRlZCxcbiAgICAgICAgICBvYmpQYXRoLFxuICAgICAgICAgIGZpZWxkVmFsdWUgJiYgQXJyYXkuaXNBcnJheShmaWVsZFZhbHVlKSAmJiBpc09iamVjdChmaWVsZFZhbHVlWzBdKVxuICAgICAgICAgICAgPyB0aGlzLmh5ZHJhdGUoZmllbGRWYWx1ZSlcbiAgICAgICAgICAgIDogZmllbGRWYWx1ZSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gbnVsbCByZWxhdGlvbiDsspjrpqxcbiAgICAgIG51bGxLZXlzLmZvckVhY2goKG51bGxLZXkpID0+IHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihoeWRyYXRlZCwgeyBbbnVsbEtleV06IG51bGwgfSk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGh5ZHJhdGVkO1xuICAgIH0pIGFzIFRbXTtcbiAgfVxufVxuXG4vKipcbiAqIEVuaGFuY2VyIO2MjOudvOuvuO2EsCDsobDqsbTrtoAg7YOA7J6FXG4gKiBSZXF1aXJlZEVuaGFuY2VyS2V5c+qwgCDsl4bsnLzrqbQgZW5oYW5jZXJzIOyEoO2DneyggSwg7J6I7Jy866m0IO2VhOyImFxuICovXG50eXBlIEVuaGFuY2VyUGFyYW08XG4gIFRTdWJzZXRLZXkgZXh0ZW5kcyBzdHJpbmcsXG4gIFRDb21wdXRlZFJlc3VsdHMgZXh0ZW5kcyB7IFtLIGluIFRTdWJzZXRLZXldOiBUQ29tcHV0ZWRSZXN1bHRzW0tdIH0sXG4gIFRTdWJzZXRNYXBwaW5nIGV4dGVuZHMgeyBbSyBpbiBUU3Vic2V0S2V5XTogVFN1YnNldE1hcHBpbmdbS10gfSxcbiAgVFN1YnNldFF1ZXJpZXMgZXh0ZW5kcyBSZWNvcmQ8VFN1YnNldEtleSwgUHVyaVN1YnNldEZuPixcbj4gPSBbUmVxdWlyZWRFbmhhbmNlcktleXM8VFN1YnNldEtleSwgVENvbXB1dGVkUmVzdWx0cywgVFN1YnNldE1hcHBpbmc+XSBleHRlbmRzIFtuZXZlcl1cbiAgPyB7IGVuaGFuY2Vycz86IEVuaGFuY2VyTWFwPFRTdWJzZXRLZXksIFRDb21wdXRlZFJlc3VsdHMsIFRTdWJzZXRNYXBwaW5nLCBUU3Vic2V0UXVlcmllcz4gfVxuICA6IHsgZW5oYW5jZXJzOiBFbmhhbmNlck1hcDxUU3Vic2V0S2V5LCBUQ29tcHV0ZWRSZXN1bHRzLCBUU3Vic2V0TWFwcGluZywgVFN1YnNldFF1ZXJpZXM+IH07XG5cbnR5cGUgUmVxdWlyZWRFbmhhbmNlcktleXM8XG4gIFRTdWJzZXRLZXkgZXh0ZW5kcyBzdHJpbmcsXG4gIFRDb21wdXRlZFJlc3VsdHMgZXh0ZW5kcyB7IFtLIGluIFRTdWJzZXRLZXldOiBUQ29tcHV0ZWRSZXN1bHRzW0tdIH0sXG4gIFRTdWJzZXRNYXBwaW5nIGV4dGVuZHMgeyBbSyBpbiBUU3Vic2V0S2V5XTogVFN1YnNldE1hcHBpbmdbS10gfSxcbj4gPSB7XG4gIFtLIGluIFRTdWJzZXRLZXldOiBUQ29tcHV0ZWRSZXN1bHRzW0tdIGV4dGVuZHMgVFN1YnNldE1hcHBpbmdbS10gPyBuZXZlciA6IEs7XG59W1RTdWJzZXRLZXldO1xuXG5leHBvcnQgY29uc3QgQmFzZU1vZGVsID0gbmV3IEJhc2VNb2RlbENsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O2FBTXNDO3FCQUNrQjtZQUVxQjtlQUNqQjtvQkFHTjtpQkFDcUI7U0FHbEQ7V0FDSTttQkFNZTtxQkFFSTtDQXVCbkMsaUJBQWIsTUFLRTtFQUlrQjtFQUNOO0VBQ0E7RUFMWjtFQUVBLFlBQ0UsWUFBb0MsS0FBSyxZQUFZLE1BQ3JELGVBQ0EsZUFDQTtHQUhnQixLQUFBLFlBQUE7R0FDTixLQUFBLGdCQUFBO0dBQ0EsS0FBQSxnQkFBQTtHQUVWLEtBQUssU0FBUyxVQUFVLHdCQUF3QixLQUFLLFdBQVcsT0FBTyxDQUFDO0VBQzFFO0VBRUEsTUFBTSxPQUF1QjtHQUMzQixPQUFPLEdBQUcsTUFBTSxLQUFLO0VBQ3ZCO0VBRUEsUUFBUSxPQUE4QjtHQUVwQyxNQUFNLE1BQU0sR0FBRyxzQkFBc0IsQ0FBQyxDQUFDLGVBQWUsS0FBSztHQUMzRCxJQUFJLEtBQ0YsT0FBTztHQUtULE9BQU8sSUFBSSxZQURBLEtBQUssTUFBTSxLQUNDLEdBQUksSUFBSSxjQUFjLENBQUM7RUFDaEQ7RUFFQSxxQkFBMEM7R0FDeEMsTUFBTSxvQkFBb0IsR0FBRyxzQkFBc0IsQ0FBQyxDQUFDLHFCQUFxQjtHQUMxRSxJQUFJLG1CQUNGLE9BQU87R0FHVCxPQUFPLElBQUksWUFBWSxLQUFLLE1BQU0sR0FBRyxHQUFHLElBQUksY0FBYyxDQUFDO0VBQzdEO0VBRUEsTUFBTSxVQUFVO0dBQ2QsT0FBTyxHQUFHLFFBQVE7RUFDcEI7RUFFQSxNQUFNLGVBQ0osS0FDQSxNQUNBLFdBQ0EsY0FDQSxZQUFvQixLQUNwQjtHQUNBLElBQUksQ0FBQyxLQUNILE1BQU0sS0FBSyxNQUFNLEdBQUc7R0FHdEIsSUFBSTtHQUNKLElBQUk7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
|
|
@@ -37,7 +37,11 @@ type OmitVirtualQueryFromMapping<TMapping, TVirtualQueryKeys> = Omit<TMapping, T
|
|
|
37
37
|
/**
|
|
38
38
|
* Computed가 Mapping에 호환되는지 판단 (virtualQuery 키 제외)
|
|
39
39
|
*/
|
|
40
|
-
type IsEnhancerOptional<TSubsetKey extends string, TComputedResults extends
|
|
40
|
+
type IsEnhancerOptional<TSubsetKey extends string, TComputedResults extends {
|
|
41
|
+
[K in TSubsetKey]: TComputedResults[K];
|
|
42
|
+
}, TSubsetMapping extends {
|
|
43
|
+
[K in TSubsetKey]: TSubsetMapping[K];
|
|
44
|
+
}, TSubsetQueries extends Record<TSubsetKey, PuriSubsetFn>, K extends TSubsetKey> = TComputedResults[K] extends OmitVirtualQueryFromMapping<TSubsetMapping[K], ExtractVirtualQueryKeys<TSubsetQueries>> ? true : false;
|
|
41
45
|
/**
|
|
42
46
|
* 단일 Enhancer 함수 타입
|
|
43
47
|
* computed 결과 + virtualQuery props를 받아 최종 mapping 타입으로 변환
|
|
@@ -50,7 +54,11 @@ type EnhancerFnWithVirtualQuery<TComputed, TMapping, TVirtualQueryKeys> = (row:
|
|
|
50
54
|
* (즉, virtual 필드 등 추가 변환이 필요한 경우)
|
|
51
55
|
* 단, virtualQuery 키는 무시 (사용자가 appendSelect로 직접 추가)
|
|
52
56
|
*/
|
|
53
|
-
export type RequiredEnhancerKeys<TSubsetKey extends string, TComputedResults extends
|
|
57
|
+
export type RequiredEnhancerKeys<TSubsetKey extends string, TComputedResults extends {
|
|
58
|
+
[K in TSubsetKey]: TComputedResults[K];
|
|
59
|
+
}, TSubsetMapping extends {
|
|
60
|
+
[K in TSubsetKey]: TSubsetMapping[K];
|
|
61
|
+
}, TSubsetQueries extends Record<TSubsetKey, PuriSubsetFn>> = {
|
|
54
62
|
[K in TSubsetKey]: IsEnhancerOptional<TSubsetKey, TComputedResults, TSubsetMapping, TSubsetQueries, K> extends true ? never : K;
|
|
55
63
|
}[TSubsetKey];
|
|
56
64
|
/**
|
|
@@ -66,7 +74,11 @@ export type RequiredEnhancerKeys<TSubsetKey extends string, TComputedResults ext
|
|
|
66
74
|
* type Mapping = { id: number; name: string; employee_count: number }
|
|
67
75
|
* // → Enhancer 필수 (employee_count 계산 필요)
|
|
68
76
|
*/
|
|
69
|
-
export type EnhancerMap<TSubsetKey extends string, TComputedResults extends
|
|
77
|
+
export type EnhancerMap<TSubsetKey extends string, TComputedResults extends {
|
|
78
|
+
[K in TSubsetKey]: TComputedResults[K];
|
|
79
|
+
}, TSubsetMapping extends {
|
|
80
|
+
[K in TSubsetKey]: TSubsetMapping[K];
|
|
81
|
+
}, TSubsetQueries extends Record<TSubsetKey, PuriSubsetFn>, TRequiredKeys extends TSubsetKey = RequiredEnhancerKeys<TSubsetKey, TComputedResults, TSubsetMapping, TSubsetQueries>> = {
|
|
70
82
|
[K in Exclude<TSubsetKey, TRequiredKeys>]?: EnhancerFnWithVirtualQuery<TComputedResults[K], TSubsetMapping[K], ExtractVirtualQueryKeys<TSubsetQueries>>;
|
|
71
83
|
} & {
|
|
72
84
|
[K in TRequiredKeys]: EnhancerFnWithVirtualQuery<TComputedResults[K], TSubsetMapping[K], ExtractVirtualQueryKeys<TSubsetQueries>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-model.types.d.ts","sourceRoot":"","sources":["../../src/database/base-model.types.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAMnD;;GAEG;AACH,KAAK,eAAe,CAClB,CAAC,SAAS,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAC7B,CAAC,SAAS,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAC7B,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC,EACtB,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC,IACpB,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAE3E;;;;;GAKG;AACH,MAAM,MAAM,yBAAyB,CACnC,IAAI,SAAS,SAAS,MAAM,EAAE,EAC9B,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,GAAG,CAAC,IACnD,IAAI,SAAS,CAAC,MAAM,IAAI,SAAS,MAAM,EAAE,GAAG,MAAM,IAAI,SAAS,MAAM,EAAE,CAAC,GACxE,IAAI,SAAS,EAAE,GACb,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GACzB,eAAe,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,yBAAyB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,GACtF,KAAK,CAAC;AAMV;;;;GAIG;AACH,KAAK,gBAAgB,CAAC,cAAc,SAAS,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,IAAI,OAAO,CAClF,MAAM,cAAc,CAAC,UAAU,CAAC,cAAc,CAAC,MAAM,cAAc,CAAC,CAAC,CAAC,EACtE,MAAM,oBAAoB,CAC3B,CAAC;AAEF,KAAK,uBAAuB,CAAC,cAAc,SAAS,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,IAC9E,gBAAgB,CAAC,cAAc,CAAC,SAAS,MAAM,MAAM,SAAS,MAAM,oBAAoB,GACpF,oBAAoB,CAAC,MAAM,CAAC,SAAS;IAAE,iBAAiB,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,CAAA;CAAE,GAC9E,CAAC,GACD,KAAK,GACP,KAAK,CAAC;AAEZ;;;GAGG;AACH,KAAK,2BAA2B,CAAC,QAAQ,EAAE,iBAAiB,IAAI,IAAI,CAClE,QAAQ,EACR,iBAAiB,GAAG,MAAM,QAAQ,CACnC,GACC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,iBAAiB,GAAG,MAAM,QAAQ,CAAC,CAAC,CAAC;AAE9D;;GAEG;AACH,KAAK,kBAAkB,CACrB,UAAU,SAAS,MAAM,EACzB,gBAAgB,SAAS,
|
|
1
|
+
{"version":3,"file":"base-model.types.d.ts","sourceRoot":"","sources":["../../src/database/base-model.types.ts"],"names":[],"mappings":"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"}
|
package/dist/database/db.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { AsyncLocalStorage } from "async_hooks";
|
|
2
2
|
import { type Knex } from "knex";
|
|
3
|
-
import { type SonamuConfig } from "../api/config";
|
|
3
|
+
import { type DatabaseConfig, type SonamuConfig } from "../api/config";
|
|
4
4
|
import { type EnvironmentSnapshots, type SonamuEnvironment } from "../env";
|
|
5
5
|
import { type PuriTransactionWrapper } from "./puri-wrapper";
|
|
6
6
|
import { TransactionContext } from "./transaction-context";
|
|
@@ -24,7 +24,17 @@ export declare class DBClass {
|
|
|
24
24
|
private getWorkerDB;
|
|
25
25
|
getDBConfig(which: DBPreset): Knex.Config;
|
|
26
26
|
destroy(): Promise<void>;
|
|
27
|
-
generateDBConfig(config: SonamuConfig["database"], projectName?: string, snapshots?: EnvironmentSnapshots):
|
|
27
|
+
generateDBConfig(config: SonamuConfig["database"], projectName?: string, snapshots?: EnvironmentSnapshots): {
|
|
28
|
+
test: Knex.Config<any>;
|
|
29
|
+
test_readonly: Knex.Config<any>;
|
|
30
|
+
fixture: Partial<DatabaseConfig>;
|
|
31
|
+
development: Knex.Config<any>;
|
|
32
|
+
development_readonly: Knex.Config<any>;
|
|
33
|
+
staging: Knex.Config<any>;
|
|
34
|
+
staging_readonly: Knex.Config<any>;
|
|
35
|
+
production: Knex.Config<any>;
|
|
36
|
+
production_readonly: Knex.Config<any>;
|
|
37
|
+
};
|
|
28
38
|
testTransaction: Knex.Transaction | null;
|
|
29
39
|
createTestTransaction(): Promise<Knex.Transaction>;
|
|
30
40
|
clearTestTransaction(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/database/db.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,MAAM,CAAC;AAEjC,OAAO,
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/database/db.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,MAAM,CAAC;AAEjC,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAwB,KAAK,oBAAoB,EAAE,KAAK,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAGjG,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAuC3D,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,SAAS,GAAG,iBAAiB,CAAC;AACxE,MAAM,MAAM,sBAAsB,GAC9B,eAAe,GACf,sBAAsB,GACtB,kBAAkB,GAClB,qBAAqB,CAAC;AAC1B,MAAM,MAAM,cAAc,GAAG,kBAAkB,GAAG,sBAAsB,CAAC;AACzE,MAAM,MAAM,QAAQ,GAAG,GAAG,GAAG,GAAG,GAAG,cAAc,CAAC;AAElD,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;AAkGjE,qBAAa,OAAO;IAClB,OAAO,CAAC,GAAG,CAAC,CAAO;IACnB,OAAO,CAAC,GAAG,CAAC,CAAO;IACnB,OAAO,CAAC,SAAS,CAAwC;IACzD,OAAO,CAAC,SAAS,CAAgC;IACjD,OAAO,CAAC,aAAa,CAA+B;IAE7C,kBAAkB,wCAA+C;IAEjE,uBAAuB,CAAC,CAAC,EAC9B,MAAM,EAAE,QAAQ,EAChB,WAAW,EAAE,sBAAsB,EACnC,QAAQ,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACzB,OAAO,CAAC,CAAC,CAAC;IAcb,SAAS,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI;IAIzC,OAAO,CAAC,gBAAgB;IAQjB,qBAAqB,IAAI,kBAAkB;IAIlD,KAAK,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IA4C5B,OAAO,CAAC,WAAW;IA8BnB,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC,MAAM;IAsBnC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBvB,gBAAgB,CACrB,MAAM,EAAE,YAAY,CAAC,UAAU,CAAC,EAChC,WAAW,CAAC,EAAE,MAAM,EACpB,SAAS,CAAC,EAAE,oBAAoB;;;;;;;;;;;IA8E3B,eAAe,EAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAQ;IACjD,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;IAKlD,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrC,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;CAIzC;AACD,eAAO,MAAM,EAAE,SAAgB,CAAC"}
|
package/dist/database/db.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { __esmMin } from "../_virtual/_rolldown/runtime.js";
|
|
2
|
+
import { init_runtime_value, isObjectValue } from "../utils/runtime-value.js";
|
|
2
3
|
import { getSonamuEnvironment, init_env } from "../env.js";
|
|
3
4
|
import { createKnexInstance, init_knex } from "./knex.js";
|
|
4
5
|
import { TransactionContext, init_transaction_context } from "./transaction-context.js";
|
|
@@ -6,18 +7,19 @@ import { AsyncLocalStorage } from "async_hooks";
|
|
|
6
7
|
import assert from "assert";
|
|
7
8
|
//#region src/database/db.ts
|
|
8
9
|
function isPlainObject(value) {
|
|
9
|
-
return
|
|
10
|
+
return isObjectValue(value) && !Array.isArray(value);
|
|
10
11
|
}
|
|
11
12
|
function mergeRecord(target, source) {
|
|
13
|
+
const targetEntries = new Map(Object.entries(target));
|
|
12
14
|
for (const [key, value] of Object.entries(source)) {
|
|
13
|
-
const currentValue =
|
|
14
|
-
|
|
15
|
-
|
|
15
|
+
const currentValue = targetEntries.get(key);
|
|
16
|
+
const mergedValue = isPlainObject(currentValue) && isPlainObject(value) ? mergeRecord({ ...currentValue }, value) : value;
|
|
17
|
+
Object.assign(target, { [key]: mergedValue });
|
|
16
18
|
}
|
|
17
19
|
return target;
|
|
18
20
|
}
|
|
19
|
-
function mergeConfigs(...configs) {
|
|
20
|
-
const merged = {};
|
|
21
|
+
function mergeConfigs(baseConfig, ...configs) {
|
|
22
|
+
const merged = { ...baseConfig };
|
|
21
23
|
for (const config of configs) if (config !== void 0 && config !== null) mergeRecord(merged, config);
|
|
22
24
|
return merged;
|
|
23
25
|
}
|
|
@@ -70,6 +72,7 @@ function assertNoLegacyDatabaseConfig(config) {
|
|
|
70
72
|
var DBClass, DB;
|
|
71
73
|
var init_db = __esmMin((() => {
|
|
72
74
|
init_env();
|
|
75
|
+
init_runtime_value();
|
|
73
76
|
init_knex();
|
|
74
77
|
init_transaction_context();
|
|
75
78
|
DBClass = class {
|
|
@@ -252,4 +255,4 @@ var init_db = __esmMin((() => {
|
|
|
252
255
|
init_db();
|
|
253
256
|
export { DB, DBClass, init_db };
|
|
254
257
|
|
|
255
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RhdGFiYXNlL2RiLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgQXN5bmNMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiYXN5bmNfaG9va3NcIjtcblxuaW1wb3J0IHsgdHlwZSBLbmV4IH0gZnJvbSBcImtuZXhcIjtcblxuaW1wb3J0IHsgdHlwZSBEYXRhYmFzZUNvbmZpZywgdHlwZSBTb25hbXVDb25maWcgfSBmcm9tIFwiLi4vYXBpL2NvbmZpZ1wiO1xuaW1wb3J0IHsgZ2V0U29uYW11RW52aXJvbm1lbnQsIHR5cGUgRW52aXJvbm1lbnRTbmFwc2hvdHMsIHR5cGUgU29uYW11RW52aXJvbm1lbnQgfSBmcm9tIFwiLi4vZW52XCI7XG5pbXBvcnQgeyBjcmVhdGVLbmV4SW5zdGFuY2UgfSBmcm9tIFwiLi9rbmV4XCI7XG5pbXBvcnQgeyB0eXBlIFB1cmlUcmFuc2FjdGlvbldyYXBwZXIgfSBmcm9tIFwiLi9wdXJpLXdyYXBwZXJcIjtcbmltcG9ydCB7IFRyYW5zYWN0aW9uQ29udGV4dCB9IGZyb20gXCIuL3RyYW5zYWN0aW9uLWNvbnRleHRcIjtcblxuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIG1lcmdlUmVjb3JkKFxuICB0YXJnZXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBzb3VyY2U6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzb3VyY2UpKSB7XG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gdGFyZ2V0W2tleV07XG5cbiAgICBpZiAoaXNQbGFpbk9iamVjdChjdXJyZW50VmFsdWUpICYmIGlzUGxhaW5PYmplY3QodmFsdWUpKSB7XG4gICAgICB0YXJnZXRba2V5XSA9IG1lcmdlUmVjb3JkKHsgLi4uY3VycmVudFZhbHVlIH0sIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0W2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBtZXJnZUNvbmZpZ3M8VCBleHRlbmRzIG9iamVjdD4oLi4uY29uZmlnczogKFBhcnRpYWw8VD4gfCB1bmRlZmluZWQgfCBudWxsKVtdKTogVCB7XG4gIGNvbnN0IG1lcmdlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBjb25maWdzKSB7XG4gICAgaWYgKGNvbmZpZyAhPT0gdW5kZWZpbmVkICYmIGNvbmZpZyAhPT0gbnVsbCkge1xuICAgICAgbWVyZ2VSZWNvcmQobWVyZ2VkLCBjb25maWcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtZXJnZWQgYXMgVDtcbn1cblxuZXhwb3J0IHR5cGUgU29uYW11TWFpbkRCUHJlc2V0ID0gXCJ0ZXN0XCIgfCBcImZpeHR1cmVcIiB8IFNvbmFtdUVudmlyb25tZW50O1xuZXhwb3J0IHR5cGUgU29uYW11UmVhZG9ubHlEQlByZXNldCA9XG4gIHwgXCJ0ZXN0X3JlYWRvbmx5XCJcbiAgfCBcImRldmVsb3BtZW50X3JlYWRvbmx5XCJcbiAgfCBcInN0YWdpbmdfcmVhZG9ubHlcIlxuICB8IFwicHJvZHVjdGlvbl9yZWFkb25seVwiO1xuZXhwb3J0IHR5cGUgU29uYW11REJQcmVzZXQgPSBTb25hbXVNYWluREJQcmVzZXQgfCBTb25hbXVSZWFkb25seURCUHJlc2V0O1xuZXhwb3J0IHR5cGUgREJQcmVzZXQgPSBcIndcIiB8IFwiclwiIHwgU29uYW11REJQcmVzZXQ7XG5cbmV4cG9ydCB0eXBlIFNvbmFtdURCQ29uZmlnID0gUmVjb3JkPFNvbmFtdURCUHJlc2V0LCBLbmV4LkNvbmZpZz47XG5cbmZ1bmN0aW9uIGlzQ29uY3JldGVQcmVzZXQodmFsdWU6IERCUHJlc2V0KTogdmFsdWUgaXMgU29uYW11REJQcmVzZXQge1xuICByZXR1cm4gdmFsdWUgIT09IFwid1wiICYmIHZhbHVlICE9PSBcInJcIjtcbn1cblxuZnVuY3Rpb24gZ2V0UmVhZG9ubHlQcmVzZXQoZW52aXJvbm1lbnQ6IFNvbmFtdUVudmlyb25tZW50KTogU29uYW11UmVhZG9ubHlEQlByZXNldCB7XG4gIHJldHVybiBgJHtlbnZpcm9ubWVudH1fcmVhZG9ubHlgIGFzIFNvbmFtdVJlYWRvbmx5REJQcmVzZXQ7XG59XG5cbmZ1bmN0aW9uIGdldFByb2plY3REYXRhYmFzZUJhc2VOYW1lKHByb2plY3ROYW1lPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIChwcm9qZWN0TmFtZSA/PyBcInNvbmFtdVwiKVxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnJlcGxhY2UoL1teYS16MC05XSsvZywgXCJfXCIpXG4gICAgLnJlcGxhY2UoL15fK3xfKyQvZywgXCJcIik7XG59XG5cbmZ1bmN0aW9uIG51bWJlckZyb21FbnYodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCwgZmFsbGJhY2s6IG51bWJlcik6IG51bWJlciB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIGZhbGxiYWNrO1xuICB9XG5cbiAgY29uc3QgcGFyc2VkID0gTnVtYmVyKHZhbHVlKTtcbiAgaWYgKE51bWJlci5pc05hTihwYXJzZWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGRhdGFiYXNlIHBvcnQ6ICR7dmFsdWV9YCk7XG4gIH1cblxuICByZXR1cm4gcGFyc2VkO1xufVxuXG5mdW5jdGlvbiBjb25uZWN0aW9uRnJvbUVudihvcHRpb25zOiB7XG4gIGJhc2VOYW1lOiBzdHJpbmc7XG4gIHN1ZmZpeDogU29uYW11TWFpbkRCUHJlc2V0O1xuICBiYXNlQ29ubmVjdGlvbj86IEtuZXguUGdDb25uZWN0aW9uQ29uZmlnO1xuICBwcmVmaXg/OiBcIlNPTkFNVV9EQl9SRUFET05MWVwiIHwgXCJTT05BTVVfREJfRklYVFVSRVwiO1xuICBlbnY/OiBOb2RlSlMuUHJvY2Vzc0Vudjtcbn0pOiBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZyB7XG4gIGNvbnN0IHtcbiAgICBiYXNlTmFtZSxcbiAgICBzdWZmaXgsXG4gICAgYmFzZUNvbm5lY3Rpb24gPSB7fSxcbiAgICBwcmVmaXggPSBcIlNPTkFNVV9EQlwiLFxuICAgIGVudiA9IHByb2Nlc3MuZW52LFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgcmVhZCA9IChrZXk6IFwiSE9TVFwiIHwgXCJQT1JUXCIgfCBcIlVTRVJcIiB8IFwiUEFTU1dPUkRcIiB8IFwiTkFNRVwiKSA9PiB7XG4gICAgY29uc3QgcHJlZml4ZWRWYWx1ZSA9IGVudltgJHtwcmVmaXh9XyR7a2V5fWBdO1xuICAgIGlmIChwcmVmaXhlZFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBwcmVmaXhlZFZhbHVlO1xuICAgIH1cbiAgICBpZiAocHJlZml4ID09PSBcIlNPTkFNVV9EQl9GSVhUVVJFXCIgJiYga2V5ID09PSBcIk5BTUVcIikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gZW52W2BTT05BTVVfREJfJHtrZXl9YF07XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5iYXNlQ29ubmVjdGlvbixcbiAgICBob3N0OiByZWFkKFwiSE9TVFwiKSA/PyBiYXNlQ29ubmVjdGlvbi5ob3N0ID8/IFwiMC4wLjAuMFwiLFxuICAgIHBvcnQ6IG51bWJlckZyb21FbnYocmVhZChcIlBPUlRcIiksIGJhc2VDb25uZWN0aW9uLnBvcnQgPz8gNTQzMiksXG4gICAgdXNlcjogcmVhZChcIlVTRVJcIikgPz8gYmFzZUNvbm5lY3Rpb24udXNlciA/PyBcInBvc3RncmVzXCIsXG4gICAgcGFzc3dvcmQ6IHJlYWQoXCJQQVNTV09SRFwiKSA/PyBiYXNlQ29ubmVjdGlvbi5wYXNzd29yZCxcbiAgICBkYXRhYmFzZTogcmVhZChcIk5BTUVcIikgPz8gYCR7YmFzZU5hbWV9XyR7c3VmZml4fWAsXG4gIH07XG59XG5cbmZ1bmN0aW9uIG5ldXRyYWxpemVFbnZpcm9ubWVudENvbm5lY3Rpb25GaWVsZHMoXG4gIGNvbm5lY3Rpb246IEtuZXguUGdDb25uZWN0aW9uQ29uZmlnIHwgdW5kZWZpbmVkLFxuKTogS25leC5QZ0Nvbm5lY3Rpb25Db25maWcgfCB1bmRlZmluZWQge1xuICBpZiAoY29ubmVjdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IG5ldXRyYWxDb25uZWN0aW9uID0geyAuLi5jb25uZWN0aW9uIH07XG4gIGRlbGV0ZSBuZXV0cmFsQ29ubmVjdGlvbi5ob3N0O1xuICBkZWxldGUgbmV1dHJhbENvbm5lY3Rpb24ucG9ydDtcbiAgZGVsZXRlIG5ldXRyYWxDb25uZWN0aW9uLnVzZXI7XG4gIGRlbGV0ZSBuZXV0cmFsQ29ubmVjdGlvbi5wYXNzd29yZDtcbiAgZGVsZXRlIG5ldXRyYWxDb25uZWN0aW9uLmRhdGFiYXNlO1xuXG4gIHJldHVybiBuZXV0cmFsQ29ubmVjdGlvbjtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0Tm9MZWdhY3lEYXRhYmFzZUNvbmZpZyhjb25maWc6IFNvbmFtdUNvbmZpZ1tcImRhdGFiYXNlXCJdKTogdm9pZCB7XG4gIGNvbnN0IGxlZ2FjeUNvbmZpZyA9IGNvbmZpZyBhcyBTb25hbXVDb25maWdbXCJkYXRhYmFzZVwiXSAmIHtcbiAgICBuYW1lPzogdW5rbm93bjtcbiAgICBlbnZpcm9ubWVudHM/OiB1bmtub3duO1xuICB9O1xuXG4gIGlmIChsZWdhY3lDb25maWcubmFtZSAhPT0gdW5kZWZpbmVkIHx8IGxlZ2FjeUNvbmZpZy5lbnZpcm9ubWVudHMgIT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiU29uYW11IGRhdGFiYXNlLm5hbWUgYW5kIGRhdGFiYXNlLmVudmlyb25tZW50cyB3ZXJlIHJlbW92ZWQuIFVzZSBTT05BTVVfREJfKiBkb3RlbnYgdmFyaWFibGVzIGluc3RlYWQuXCIsXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgREJDbGFzcyB7XG4gIHByaXZhdGUgd2RiPzogS25leDtcbiAgcHJpdmF0ZSByZGI/OiBLbmV4O1xuICBwcml2YXRlIHByZXNldERCczogTWFwPFNvbmFtdURCUHJlc2V0LCBLbmV4PiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSB3b3JrZXJEQnM6IE1hcDxudW1iZXIsIEtuZXg+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIGN1cnJlbnRDb25maWc6IFNvbmFtdURCQ29uZmlnIHwgbnVsbCA9IG51bGw7XG5cbiAgcHVibGljIHRyYW5zYWN0aW9uU3RvcmFnZSA9IG5ldyBBc3luY0xvY2FsU3RvcmFnZTxUcmFuc2FjdGlvbkNvbnRleHQ+KCk7XG5cbiAgcHVibGljIHJ1bldpdGhUcmFuc2FjdGlvblNjb3BlPFQ+KFxuICAgIHByZXNldDogREJQcmVzZXQsXG4gICAgdHJhbnNhY3Rpb246IFB1cmlUcmFuc2FjdGlvbldyYXBwZXIsXG4gICAgY2FsbGJhY2s6ICgpID0+IFByb21pc2U8VD4sXG4gICk6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IHBhcmVudENvbnRleHQgPSB0aGlzLnRyYW5zYWN0aW9uU3RvcmFnZS5nZXRTdG9yZSgpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uQ29udGV4dCA9IG5ldyBUcmFuc2FjdGlvbkNvbnRleHQocGFyZW50Q29udGV4dCwgeyBwcmVzZXQsIHRyYW5zYWN0aW9uIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb25TdG9yYWdlLnJ1bih0cmFuc2FjdGlvbkNvbnRleHQsIGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBjYWxsYmFjaygpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgLy8gZGV0YWNoZWQgZGVzY2VuZGFudOqwgCDsmYTro4zrkJwg7Yq4656c7J6t7IWY7J2EIOuLpOyLnCDsgqzsmqntlZjsp4Ag7JWK64+E66GdIGxvY2FsIHNjb3Bl66W8IOu5hOyatOuLpC5cbiAgICAgICAgdHJhbnNhY3Rpb25Db250ZXh0LmNsZWFyTG9jYWwoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNldENvbmZpZyhkYkNvbmZpZzogU29uYW11REJDb25maWcpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRDb25maWcgPSBkYkNvbmZpZztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q3VycmVudENvbmZpZygpOiBTb25hbXVEQkNvbmZpZyB7XG4gICAgaWYgKHRoaXMuY3VycmVudENvbmZpZyA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IERCIGNvbmZpZyBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY3VycmVudENvbmZpZztcbiAgfVxuXG4gIHB1YmxpYyBnZXRUcmFuc2FjdGlvbkNvbnRleHQoKTogVHJhbnNhY3Rpb25Db250ZXh0IHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvblN0b3JhZ2UuZ2V0U3RvcmUoKSA/PyBuZXcgVHJhbnNhY3Rpb25Db250ZXh0KCk7XG4gIH1cblxuICBnZXREQih3aGljaDogREJQcmVzZXQpOiBLbmV4IHtcbiAgICBjb25zdCBkYkNvbmZpZyA9IHRoaXMuZ2V0Q3VycmVudENvbmZpZygpO1xuXG4gICAgaWYgKGlzQ29uY3JldGVQcmVzZXQod2hpY2gpKSB7XG4gICAgICBpZiAoIXRoaXMucHJlc2V0REJzLmhhcyh3aGljaCkpIHtcbiAgICAgICAgdGhpcy5wcmVzZXREQnMuc2V0KHdoaWNoLCBjcmVhdGVLbmV4SW5zdGFuY2UoZGJDb25maWdbd2hpY2hdKSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRiID0gdGhpcy5wcmVzZXREQnMuZ2V0KHdoaWNoKTtcbiAgICAgIGFzc2VydChkYiwgYERCIHByZXNldCAke3doaWNofSBub3QgZm91bmRgKTtcbiAgICAgIHJldHVybiBkYjtcbiAgICB9XG5cbiAgICBpZiAoZ2V0U29uYW11RW52aXJvbm1lbnQoKSA9PT0gXCJ0ZXN0XCIpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5TT05BTVVfV09SS0VSX0RCID09PSBcInRydWVcIikge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRXb3JrZXJEQihkYkNvbmZpZyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnRlc3RUcmFuc2FjdGlvbikge1xuICAgICAgICByZXR1cm4gdGhpcy50ZXN0VHJhbnNhY3Rpb247XG4gICAgICB9IGVsc2UgaWYgKHRoaXMud2RiKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndkYjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMud2RiID0gY3JlYXRlS25leEluc3RhbmNlKHtcbiAgICAgICAgICAuLi5kYkNvbmZpZy50ZXN0LFxuICAgICAgICAgIHBvb2w6IHtcbiAgICAgICAgICAgIG1pbjogMSxcbiAgICAgICAgICAgIG1heDogMSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMud2RiO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGluc3RhbmNlTmFtZSA9IHdoaWNoID09PSBcIndcIiA/IFwid2RiXCIgOiBcInJkYlwiO1xuXG4gICAgaWYgKCF0aGlzW2luc3RhbmNlTmFtZV0pIHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuZ2V0REJDb25maWcod2hpY2gpO1xuICAgICAgdGhpc1tpbnN0YW5jZU5hbWVdID0gY3JlYXRlS25leEluc3RhbmNlKGNvbmZpZyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNbaW5zdGFuY2VOYW1lXTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0V29ya2VyREIoZGJDb25maWc6IFNvbmFtdURCQ29uZmlnKTogS25leCB7XG4gICAgaWYgKHRoaXMudGVzdFRyYW5zYWN0aW9uKSB7XG4gICAgICByZXR1cm4gdGhpcy50ZXN0VHJhbnNhY3Rpb247XG4gICAgfVxuXG4gICAgY29uc3Qgd29ya2VySWQgPSBwYXJzZUludChwcm9jZXNzLmVudi5WSVRFU1RfUE9PTF9JRCA/PyBcIjFcIiwgMTApO1xuXG4gICAgaWYgKCF0aGlzLndvcmtlckRCcy5oYXMod29ya2VySWQpKSB7XG4gICAgICBjb25zdCBiYXNlVGVzdENvbmZpZyA9IGRiQ29uZmlnLnRlc3Q7XG4gICAgICBjb25zdCBjb25uZWN0aW9uID0gYmFzZVRlc3RDb25maWcuY29ubmVjdGlvbiBhcyB7IGRhdGFiYXNlOiBzdHJpbmcgfTtcbiAgICAgIGNvbnN0IHdvcmtlckRiTmFtZSA9IGAke2Nvbm5lY3Rpb24uZGF0YWJhc2V9XyR7d29ya2VySWR9YDtcblxuICAgICAgY29uc3Qgd29ya2VyQ29uZmlnID0ge1xuICAgICAgICAuLi5iYXNlVGVzdENvbmZpZyxcbiAgICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICAgIC4uLmNvbm5lY3Rpb24sXG4gICAgICAgICAgZGF0YWJhc2U6IHdvcmtlckRiTmFtZSxcbiAgICAgICAgfSxcbiAgICAgICAgcG9vbDogeyBtaW46IDEsIG1heDogMSB9LFxuICAgICAgfTtcblxuICAgICAgdGhpcy53b3JrZXJEQnMuc2V0KHdvcmtlcklkLCBjcmVhdGVLbmV4SW5zdGFuY2Uod29ya2VyQ29uZmlnKSk7XG4gICAgfVxuXG4gICAgY29uc3QgZGIgPSB0aGlzLndvcmtlckRCcy5nZXQod29ya2VySWQpO1xuICAgIGFzc2VydChkYiwgYFdvcmtlciBEQiAke3dvcmtlcklkfSBub3QgZm91bmRgKTtcbiAgICByZXR1cm4gZGI7XG4gIH1cblxuICBnZXREQkNvbmZpZyh3aGljaDogREJQcmVzZXQpOiBLbmV4LkNvbmZpZyB7XG4gICAgY29uc3QgZGJDb25maWcgPSB0aGlzLmdldEN1cnJlbnRDb25maWcoKTtcblxuICAgIGlmIChpc0NvbmNyZXRlUHJlc2V0KHdoaWNoKSkge1xuICAgICAgcmV0dXJuIGRiQ29uZmlnW3doaWNoXTtcbiAgICB9XG5cbiAgICBjb25zdCBlbnZpcm9ubWVudCA9IGdldFNvbmFtdUVudmlyb25tZW50KCk7XG4gICAgaWYgKGVudmlyb25tZW50ID09PSBcInRlc3RcIikge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gd2hpY2ggPT09IFwid1wiID8gZGJDb25maWcudGVzdCA6IGRiQ29uZmlnLnRlc3RfcmVhZG9ubHk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi50YXJnZXQsXG4gICAgICAgIHBvb2w6IHtcbiAgICAgICAgICBtaW46IDEsXG4gICAgICAgICAgbWF4OiAxLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gd2hpY2ggPT09IFwid1wiID8gZGJDb25maWdbZW52aXJvbm1lbnRdIDogZGJDb25maWdbZ2V0UmVhZG9ubHlQcmVzZXQoZW52aXJvbm1lbnQpXTtcbiAgfVxuXG4gIGFzeW5jIGRlc3Ryb3koKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMud2RiICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMud2RiLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMud2RiID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAodGhpcy5yZGIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYXdhaXQgdGhpcy5yZGIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5yZGIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZGIgb2YgdGhpcy5wcmVzZXREQnMudmFsdWVzKCkpIHtcbiAgICAgIGF3YWl0IGRiLmRlc3Ryb3koKTtcbiAgICB9XG4gICAgdGhpcy5wcmVzZXREQnMuY2xlYXIoKTtcbiAgICBmb3IgKGNvbnN0IGRiIG9mIHRoaXMud29ya2VyREJzLnZhbHVlcygpKSB7XG4gICAgICBhd2FpdCBkYi5kZXN0cm95KCk7XG4gICAgfVxuICAgIHRoaXMud29ya2VyREJzLmNsZWFyKCk7XG4gIH1cblxuICBwdWJsaWMgZ2VuZXJhdGVEQkNvbmZpZyhcbiAgICBjb25maWc6IFNvbmFtdUNvbmZpZ1tcImRhdGFiYXNlXCJdLFxuICAgIHByb2plY3ROYW1lPzogc3RyaW5nLFxuICAgIHNuYXBzaG90cz86IEVudmlyb25tZW50U25hcHNob3RzLFxuICApOiBTb25hbXVEQkNvbmZpZyB7XG4gICAgYXNzZXJ0Tm9MZWdhY3lEYXRhYmFzZUNvbmZpZyhjb25maWcpO1xuXG4gICAgY29uc3QgYmFzZU5hbWUgPSBnZXRQcm9qZWN0RGF0YWJhc2VCYXNlTmFtZShwcm9qZWN0TmFtZSk7XG4gICAgY29uc3QgZGVmYXVsdEtuZXhDb25maWcgPSBtZXJnZUNvbmZpZ3M8UGFydGlhbDxEYXRhYmFzZUNvbmZpZz4+KFxuICAgICAge1xuICAgICAgICBjbGllbnQ6IGNvbmZpZy5kYXRhYmFzZSA9PT0gXCJwZ25hdGl2ZVwiID8gXCJwZ25hdGl2ZVwiIDogXCJwb3N0Z3Jlc3FsXCIsXG4gICAgICAgIHBvb2w6IHtcbiAgICAgICAgICBtaW46IDEsXG4gICAgICAgICAgbWF4OiA1LFxuICAgICAgICB9LFxuICAgICAgICBtaWdyYXRpb25zOiB7XG4gICAgICAgICAgZGlyZWN0b3J5OiBcIi4vc3JjL21pZ3JhdGlvbnNcIixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBjb25maWcuZGVmYXVsdE9wdGlvbnMsXG4gICAgKTtcbiAgICBjb25zdCBiYXNlQ29ubmVjdGlvbiA9IGRlZmF1bHRLbmV4Q29uZmlnLmNvbm5lY3Rpb24gYXMgS25leC5QZ0Nvbm5lY3Rpb25Db25maWcgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgZW52aXJvbm1lbnRGYWxsYmFja0Nvbm5lY3Rpb24gPSBzbmFwc2hvdHNcbiAgICAgID8gbmV1dHJhbGl6ZUVudmlyb25tZW50Q29ubmVjdGlvbkZpZWxkcyhiYXNlQ29ubmVjdGlvbilcbiAgICAgIDogYmFzZUNvbm5lY3Rpb247XG5cbiAgICBjb25zdCBlbnZGb3JQcmVzZXQgPSAocHJlc2V0OiBTb25hbXVNYWluREJQcmVzZXQpOiBOb2RlSlMuUHJvY2Vzc0VudiA9PiB7XG4gICAgICBpZiAoIXNuYXBzaG90cykge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnY7XG4gICAgICB9XG4gICAgICBpZiAocHJlc2V0ID09PSBcImZpeHR1cmVcIikge1xuICAgICAgICByZXR1cm4gc25hcHNob3RzLnRlc3Q7XG4gICAgICB9XG4gICAgICByZXR1cm4gc25hcHNob3RzW3ByZXNldF07XG4gICAgfTtcblxuICAgIGNvbnN0IG1haW5Db25maWcgPSAocHJlc2V0OiBTb25hbXVNYWluREJQcmVzZXQpOiBLbmV4LkNvbmZpZyA9PlxuICAgICAgbWVyZ2VDb25maWdzKGRlZmF1bHRLbmV4Q29uZmlnLCB7XG4gICAgICAgIGNvbm5lY3Rpb246IGNvbm5lY3Rpb25Gcm9tRW52KHtcbiAgICAgICAgICBiYXNlTmFtZSxcbiAgICAgICAgICBzdWZmaXg6IHByZXNldCxcbiAgICAgICAgICBiYXNlQ29ubmVjdGlvbjogZW52aXJvbm1lbnRGYWxsYmFja0Nvbm5lY3Rpb24sXG4gICAgICAgICAgZW52OiBlbnZGb3JQcmVzZXQocHJlc2V0KSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICBjb25zdCByZWFkb25seUNvbmZpZyA9IChlbnZpcm9ubWVudDogU29uYW11RW52aXJvbm1lbnQpOiBLbmV4LkNvbmZpZyA9PlxuICAgICAgbWVyZ2VDb25maWdzPEtuZXguQ29uZmlnPihkZWZhdWx0S25leENvbmZpZywgbWFpbkNvbmZpZyhlbnZpcm9ubWVudCksIHtcbiAgICAgICAgY29ubmVjdGlvbjogY29ubmVjdGlvbkZyb21FbnYoe1xuICAgICAgICAgIGJhc2VOYW1lLFxuICAgICAgICAgIHN1ZmZpeDogZW52aXJvbm1lbnQsXG4gICAgICAgICAgYmFzZUNvbm5lY3Rpb246IG1haW5Db25maWcoZW52aXJvbm1lbnQpLmNvbm5lY3Rpb24gYXMgS25leC5QZ0Nvbm5lY3Rpb25Db25maWcsXG4gICAgICAgICAgcHJlZml4OiBcIlNPTkFNVV9EQl9SRUFET05MWVwiLFxuICAgICAgICAgIGVudjogZW52Rm9yUHJlc2V0KGVudmlyb25tZW50KSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcblxuICAgIGNvbnN0IHRlc3QgPSBtYWluQ29uZmlnKFwidGVzdFwiKTtcblxuICAgIHJldHVybiB7XG4gICAgICB0ZXN0LFxuICAgICAgdGVzdF9yZWFkb25seTogcmVhZG9ubHlDb25maWcoXCJ0ZXN0XCIpLFxuICAgICAgZml4dHVyZTogbWVyZ2VDb25maWdzKGRlZmF1bHRLbmV4Q29uZmlnLCB7XG4gICAgICAgIGNvbm5lY3Rpb246IGNvbm5lY3Rpb25Gcm9tRW52KHtcbiAgICAgICAgICBiYXNlTmFtZSxcbiAgICAgICAgICBzdWZmaXg6IFwiZml4dHVyZVwiLFxuICAgICAgICAgIGJhc2VDb25uZWN0aW9uOiBlbnZpcm9ubWVudEZhbGxiYWNrQ29ubmVjdGlvbixcbiAgICAgICAgICBwcmVmaXg6IFwiU09OQU1VX0RCX0ZJWFRVUkVcIixcbiAgICAgICAgICBlbnY6IGVudkZvclByZXNldChcImZpeHR1cmVcIiksXG4gICAgICAgIH0pLFxuICAgICAgfSksXG4gICAgICBkZXZlbG9wbWVudDogbWFpbkNvbmZpZyhcImRldmVsb3BtZW50XCIpLFxuICAgICAgZGV2ZWxvcG1lbnRfcmVhZG9ubHk6IHJlYWRvbmx5Q29uZmlnKFwiZGV2ZWxvcG1lbnRcIiksXG4gICAgICBzdGFnaW5nOiBtYWluQ29uZmlnKFwic3RhZ2luZ1wiKSxcbiAgICAgIHN0YWdpbmdfcmVhZG9ubHk6IHJlYWRvbmx5Q29uZmlnKFwic3RhZ2luZ1wiKSxcbiAgICAgIHByb2R1Y3Rpb246IG1haW5Db25maWcoXCJwcm9kdWN0aW9uXCIpLFxuICAgICAgcHJvZHVjdGlvbl9yZWFkb25seTogcmVhZG9ubHlDb25maWcoXCJwcm9kdWN0aW9uXCIpLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgdGVzdFRyYW5zYWN0aW9uOiBLbmV4LlRyYW5zYWN0aW9uIHwgbnVsbCA9IG51bGw7XG4gIGFzeW5jIGNyZWF0ZVRlc3RUcmFuc2FjdGlvbigpOiBQcm9taXNlPEtuZXguVHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCBkYiA9IHRoaXMuZ2V0REIoXCJ3XCIpO1xuICAgIHRoaXMudGVzdFRyYW5zYWN0aW9uID0gYXdhaXQgZGIudHJhbnNhY3Rpb24oKTtcbiAgICByZXR1cm4gdGhpcy50ZXN0VHJhbnNhY3Rpb247XG4gIH1cbiAgYXN5bmMgY2xlYXJUZXN0VHJhbnNhY3Rpb24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy50ZXN0VHJhbnNhY3Rpb24/LnJvbGxiYWNrKCk7XG4gICAgdGhpcy50ZXN0VHJhbnNhY3Rpb24gPSBudWxsO1xuICB9XG4gIGFzeW5jIGdldFRlc3RDb25uZWN0aW9uKCk6IFByb21pc2U8S25leD4ge1xuICAgIGNvbnN0IGRiID0gdGhpcy5nZXREQihcIndcIik7XG4gICAgcmV0dXJuIGRiO1xuICB9XG59XG5leHBvcnQgY29uc3QgREIgPSBuZXcgREJDbGFzcygpO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBV0EsU0FBUyxjQUFjLE9BQWtEO0NBQ3ZFLE9BQU8sT0FBTyxVQUFVLFlBQVksVUFBVSxRQUFRLENBQUMsTUFBTSxRQUFRLEtBQUs7QUFDNUU7QUFFQSxTQUFTLFlBQ1AsUUFDQSxRQUN5QjtDQUN6QixLQUFLLE1BQU0sQ0FBQyxLQUFLLFVBQVUsT0FBTyxRQUFRLE1BQU0sR0FBRztFQUNqRCxNQUFNLGVBQWUsT0FBTztFQUU1QixJQUFJLGNBQWMsWUFBWSxLQUFLLGNBQWMsS0FBSyxHQUNwRCxPQUFPLE9BQU8sWUFBWSxFQUFFLEdBQUcsYUFBYSxHQUFHLEtBQUs7T0FF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
|
|
258
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RhdGFiYXNlL2RiLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgQXN5bmNMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiYXN5bmNfaG9va3NcIjtcblxuaW1wb3J0IHsgdHlwZSBLbmV4IH0gZnJvbSBcImtuZXhcIjtcblxuaW1wb3J0IHsgdHlwZSBEYXRhYmFzZUNvbmZpZywgdHlwZSBTb25hbXVDb25maWcgfSBmcm9tIFwiLi4vYXBpL2NvbmZpZ1wiO1xuaW1wb3J0IHsgZ2V0U29uYW11RW52aXJvbm1lbnQsIHR5cGUgRW52aXJvbm1lbnRTbmFwc2hvdHMsIHR5cGUgU29uYW11RW52aXJvbm1lbnQgfSBmcm9tIFwiLi4vZW52XCI7XG5pbXBvcnQgeyBpc09iamVjdFZhbHVlIH0gZnJvbSBcIi4uL3V0aWxzL3J1bnRpbWUtdmFsdWVcIjtcbmltcG9ydCB7IGNyZWF0ZUtuZXhJbnN0YW5jZSB9IGZyb20gXCIuL2tuZXhcIjtcbmltcG9ydCB7IHR5cGUgUHVyaVRyYW5zYWN0aW9uV3JhcHBlciB9IGZyb20gXCIuL3B1cmktd3JhcHBlclwiO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25Db250ZXh0IH0gZnJvbSBcIi4vdHJhbnNhY3Rpb24tY29udGV4dFwiO1xuXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0PFZhbHVlPih2YWx1ZTogVmFsdWUpOiB2YWx1ZSBpcyBWYWx1ZSAmIG9iamVjdCB7XG4gIHJldHVybiBpc09iamVjdFZhbHVlKHZhbHVlKSAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIG1lcmdlUmVjb3JkPFRhcmdldCBleHRlbmRzIG9iamVjdCwgU291cmNlIGV4dGVuZHMgb2JqZWN0PihcbiAgdGFyZ2V0OiBUYXJnZXQsXG4gIHNvdXJjZTogU291cmNlLFxuKTogVGFyZ2V0IHtcbiAgY29uc3QgdGFyZ2V0RW50cmllcyA9IG5ldyBNYXAoT2JqZWN0LmVudHJpZXModGFyZ2V0KSk7XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc291cmNlKSkge1xuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRhcmdldEVudHJpZXMuZ2V0KGtleSk7XG4gICAgY29uc3QgbWVyZ2VkVmFsdWUgPVxuICAgICAgaXNQbGFpbk9iamVjdChjdXJyZW50VmFsdWUpICYmIGlzUGxhaW5PYmplY3QodmFsdWUpXG4gICAgICAgID8gbWVyZ2VSZWNvcmQoeyAuLi5jdXJyZW50VmFsdWUgfSwgdmFsdWUpXG4gICAgICAgIDogdmFsdWU7XG4gICAgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHsgW2tleV06IG1lcmdlZFZhbHVlIH0pO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuZnVuY3Rpb24gbWVyZ2VDb25maWdzPFQgZXh0ZW5kcyBvYmplY3Q+KFxuICBiYXNlQ29uZmlnOiBULFxuICAuLi5jb25maWdzOiAoUGFydGlhbDxUPiB8IHVuZGVmaW5lZCB8IG51bGwpW11cbik6IFQge1xuICBjb25zdCBtZXJnZWQgPSB7IC4uLmJhc2VDb25maWcgfTtcblxuICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBjb25maWdzKSB7XG4gICAgaWYgKGNvbmZpZyAhPT0gdW5kZWZpbmVkICYmIGNvbmZpZyAhPT0gbnVsbCkge1xuICAgICAgbWVyZ2VSZWNvcmQobWVyZ2VkLCBjb25maWcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtZXJnZWQ7XG59XG5cbmV4cG9ydCB0eXBlIFNvbmFtdU1haW5EQlByZXNldCA9IFwidGVzdFwiIHwgXCJmaXh0dXJlXCIgfCBTb25hbXVFbnZpcm9ubWVudDtcbmV4cG9ydCB0eXBlIFNvbmFtdVJlYWRvbmx5REJQcmVzZXQgPVxuICB8IFwidGVzdF9yZWFkb25seVwiXG4gIHwgXCJkZXZlbG9wbWVudF9yZWFkb25seVwiXG4gIHwgXCJzdGFnaW5nX3JlYWRvbmx5XCJcbiAgfCBcInByb2R1Y3Rpb25fcmVhZG9ubHlcIjtcbmV4cG9ydCB0eXBlIFNvbmFtdURCUHJlc2V0ID0gU29uYW11TWFpbkRCUHJlc2V0IHwgU29uYW11UmVhZG9ubHlEQlByZXNldDtcbmV4cG9ydCB0eXBlIERCUHJlc2V0ID0gXCJ3XCIgfCBcInJcIiB8IFNvbmFtdURCUHJlc2V0O1xuXG5leHBvcnQgdHlwZSBTb25hbXVEQkNvbmZpZyA9IFJlY29yZDxTb25hbXVEQlByZXNldCwgS25leC5Db25maWc+O1xuXG5mdW5jdGlvbiBpc0NvbmNyZXRlUHJlc2V0KHZhbHVlOiBEQlByZXNldCk6IHZhbHVlIGlzIFNvbmFtdURCUHJlc2V0IHtcbiAgcmV0dXJuIHZhbHVlICE9PSBcIndcIiAmJiB2YWx1ZSAhPT0gXCJyXCI7XG59XG5cbmZ1bmN0aW9uIGdldFJlYWRvbmx5UHJlc2V0KGVudmlyb25tZW50OiBTb25hbXVFbnZpcm9ubWVudCk6IFNvbmFtdVJlYWRvbmx5REJQcmVzZXQge1xuICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICByZXR1cm4gYCR7ZW52aXJvbm1lbnR9X3JlYWRvbmx5YCBhcyBTb25hbXVSZWFkb25seURCUHJlc2V0O1xufVxuXG5mdW5jdGlvbiBnZXRQcm9qZWN0RGF0YWJhc2VCYXNlTmFtZShwcm9qZWN0TmFtZT86IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiAocHJvamVjdE5hbWUgPz8gXCJzb25hbXVcIilcbiAgICAudG9Mb3dlckNhc2UoKVxuICAgIC5yZXBsYWNlKC9bXmEtejAtOV0rL2csIFwiX1wiKVxuICAgIC5yZXBsYWNlKC9eXyt8XyskL2csIFwiXCIpO1xufVxuXG5mdW5jdGlvbiBudW1iZXJGcm9tRW52KHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQsIGZhbGxiYWNrOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gXCJcIikge1xuICAgIHJldHVybiBmYWxsYmFjaztcbiAgfVxuXG4gIGNvbnN0IHBhcnNlZCA9IE51bWJlcih2YWx1ZSk7XG4gIGlmIChOdW1iZXIuaXNOYU4ocGFyc2VkKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBkYXRhYmFzZSBwb3J0OiAke3ZhbHVlfWApO1xuICB9XG5cbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuZnVuY3Rpb24gY29ubmVjdGlvbkZyb21FbnYob3B0aW9uczoge1xuICBiYXNlTmFtZTogc3RyaW5nO1xuICBzdWZmaXg6IFNvbmFtdU1haW5EQlByZXNldDtcbiAgYmFzZUNvbm5lY3Rpb24/OiBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZztcbiAgcHJlZml4PzogXCJTT05BTVVfREJfUkVBRE9OTFlcIiB8IFwiU09OQU1VX0RCX0ZJWFRVUkVcIjtcbiAgZW52PzogTm9kZUpTLlByb2Nlc3NFbnY7XG59KTogS25leC5QZ0Nvbm5lY3Rpb25Db25maWcge1xuICBjb25zdCB7XG4gICAgYmFzZU5hbWUsXG4gICAgc3VmZml4LFxuICAgIGJhc2VDb25uZWN0aW9uID0ge30sXG4gICAgcHJlZml4ID0gXCJTT05BTVVfREJcIixcbiAgICBlbnYgPSBwcm9jZXNzLmVudixcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHJlYWQgPSAoa2V5OiBcIkhPU1RcIiB8IFwiUE9SVFwiIHwgXCJVU0VSXCIgfCBcIlBBU1NXT1JEXCIgfCBcIk5BTUVcIikgPT4ge1xuICAgIGNvbnN0IHByZWZpeGVkVmFsdWUgPSBlbnZbYCR7cHJlZml4fV8ke2tleX1gXTtcbiAgICBpZiAocHJlZml4ZWRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gcHJlZml4ZWRWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHByZWZpeCA9PT0gXCJTT05BTVVfREJfRklYVFVSRVwiICYmIGtleSA9PT0gXCJOQU1FXCIpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVudltgU09OQU1VX0RCXyR7a2V5fWBdO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgLi4uYmFzZUNvbm5lY3Rpb24sXG4gICAgaG9zdDogcmVhZChcIkhPU1RcIikgPz8gYmFzZUNvbm5lY3Rpb24uaG9zdCA/PyBcIjAuMC4wLjBcIixcbiAgICBwb3J0OiBudW1iZXJGcm9tRW52KHJlYWQoXCJQT1JUXCIpLCBiYXNlQ29ubmVjdGlvbi5wb3J0ID8/IDU0MzIpLFxuICAgIHVzZXI6IHJlYWQoXCJVU0VSXCIpID8/IGJhc2VDb25uZWN0aW9uLnVzZXIgPz8gXCJwb3N0Z3Jlc1wiLFxuICAgIHBhc3N3b3JkOiByZWFkKFwiUEFTU1dPUkRcIikgPz8gYmFzZUNvbm5lY3Rpb24ucGFzc3dvcmQsXG4gICAgZGF0YWJhc2U6IHJlYWQoXCJOQU1FXCIpID8/IGAke2Jhc2VOYW1lfV8ke3N1ZmZpeH1gLFxuICB9O1xufVxuXG5mdW5jdGlvbiBuZXV0cmFsaXplRW52aXJvbm1lbnRDb25uZWN0aW9uRmllbGRzKFxuICBjb25uZWN0aW9uOiBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZyB8IHVuZGVmaW5lZCxcbik6IEtuZXguUGdDb25uZWN0aW9uQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGNvbm5lY3Rpb24gPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBuZXV0cmFsQ29ubmVjdGlvbiA9IHsgLi4uY29ubmVjdGlvbiB9O1xuICBkZWxldGUgbmV1dHJhbENvbm5lY3Rpb24uaG9zdDtcbiAgZGVsZXRlIG5ldXRyYWxDb25uZWN0aW9uLnBvcnQ7XG4gIGRlbGV0ZSBuZXV0cmFsQ29ubmVjdGlvbi51c2VyO1xuICBkZWxldGUgbmV1dHJhbENvbm5lY3Rpb24ucGFzc3dvcmQ7XG4gIGRlbGV0ZSBuZXV0cmFsQ29ubmVjdGlvbi5kYXRhYmFzZTtcblxuICByZXR1cm4gbmV1dHJhbENvbm5lY3Rpb247XG59XG5cbmZ1bmN0aW9uIGFzc2VydE5vTGVnYWN5RGF0YWJhc2VDb25maWcoY29uZmlnOiBTb25hbXVDb25maWdbXCJkYXRhYmFzZVwiXSk6IHZvaWQge1xuICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICBjb25zdCBsZWdhY3lDb25maWcgPSBjb25maWcgYXMgU29uYW11Q29uZmlnW1wiZGF0YWJhc2VcIl0gJiB7XG4gICAgbmFtZT86IHVua25vd247XG4gICAgZW52aXJvbm1lbnRzPzogdW5rbm93bjtcbiAgfTtcblxuICBpZiAobGVnYWN5Q29uZmlnLm5hbWUgIT09IHVuZGVmaW5lZCB8fCBsZWdhY3lDb25maWcuZW52aXJvbm1lbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcIlNvbmFtdSBkYXRhYmFzZS5uYW1lIGFuZCBkYXRhYmFzZS5lbnZpcm9ubWVudHMgd2VyZSByZW1vdmVkLiBVc2UgU09OQU1VX0RCXyogZG90ZW52IHZhcmlhYmxlcyBpbnN0ZWFkLlwiLFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERCQ2xhc3Mge1xuICBwcml2YXRlIHdkYj86IEtuZXg7XG4gIHByaXZhdGUgcmRiPzogS25leDtcbiAgcHJpdmF0ZSBwcmVzZXREQnM6IE1hcDxTb25hbXVEQlByZXNldCwgS25leD4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgd29ya2VyREJzOiBNYXA8bnVtYmVyLCBLbmV4PiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBjdXJyZW50Q29uZmlnOiBTb25hbXVEQkNvbmZpZyB8IG51bGwgPSBudWxsO1xuXG4gIHB1YmxpYyB0cmFuc2FjdGlvblN0b3JhZ2UgPSBuZXcgQXN5bmNMb2NhbFN0b3JhZ2U8VHJhbnNhY3Rpb25Db250ZXh0PigpO1xuXG4gIHB1YmxpYyBydW5XaXRoVHJhbnNhY3Rpb25TY29wZTxUPihcbiAgICBwcmVzZXQ6IERCUHJlc2V0LFxuICAgIHRyYW5zYWN0aW9uOiBQdXJpVHJhbnNhY3Rpb25XcmFwcGVyLFxuICAgIGNhbGxiYWNrOiAoKSA9PiBQcm9taXNlPFQ+LFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBwYXJlbnRDb250ZXh0ID0gdGhpcy50cmFuc2FjdGlvblN0b3JhZ2UuZ2V0U3RvcmUoKTtcbiAgICBjb25zdCB0cmFuc2FjdGlvbkNvbnRleHQgPSBuZXcgVHJhbnNhY3Rpb25Db250ZXh0KHBhcmVudENvbnRleHQsIHsgcHJlc2V0LCB0cmFuc2FjdGlvbiB9KTtcblxuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uU3RvcmFnZS5ydW4odHJhbnNhY3Rpb25Db250ZXh0LCBhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgY2FsbGJhY2soKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIC8vIGRldGFjaGVkIGRlc2NlbmRhbnTqsIAg7JmE66OM65CcIO2KuOuenOyereyFmOydhCDri6Tsi5wg7IKs7Jqp7ZWY7KeAIOyViuuPhOuhnSBsb2NhbCBzY29wZeulvCDruYTsmrTri6QuXG4gICAgICAgIHRyYW5zYWN0aW9uQ29udGV4dC5jbGVhckxvY2FsKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzZXRDb25maWcoZGJDb25maWc6IFNvbmFtdURCQ29uZmlnKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50Q29uZmlnID0gZGJDb25maWc7XG4gIH1cblxuICBwcml2YXRlIGdldEN1cnJlbnRDb25maWcoKTogU29uYW11REJDb25maWcge1xuICAgIGlmICh0aGlzLmN1cnJlbnRDb25maWcgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBEQiBjb25maWcgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmN1cnJlbnRDb25maWc7XG4gIH1cblxuICBwdWJsaWMgZ2V0VHJhbnNhY3Rpb25Db250ZXh0KCk6IFRyYW5zYWN0aW9uQ29udGV4dCB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb25TdG9yYWdlLmdldFN0b3JlKCkgPz8gbmV3IFRyYW5zYWN0aW9uQ29udGV4dCgpO1xuICB9XG5cbiAgZ2V0REIod2hpY2g6IERCUHJlc2V0KTogS25leCB7XG4gICAgY29uc3QgZGJDb25maWcgPSB0aGlzLmdldEN1cnJlbnRDb25maWcoKTtcblxuICAgIGlmIChpc0NvbmNyZXRlUHJlc2V0KHdoaWNoKSkge1xuICAgICAgaWYgKCF0aGlzLnByZXNldERCcy5oYXMod2hpY2gpKSB7XG4gICAgICAgIHRoaXMucHJlc2V0REJzLnNldCh3aGljaCwgY3JlYXRlS25leEluc3RhbmNlKGRiQ29uZmlnW3doaWNoXSkpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkYiA9IHRoaXMucHJlc2V0REJzLmdldCh3aGljaCk7XG4gICAgICBhc3NlcnQoZGIsIGBEQiBwcmVzZXQgJHt3aGljaH0gbm90IGZvdW5kYCk7XG4gICAgICByZXR1cm4gZGI7XG4gICAgfVxuXG4gICAgaWYgKGdldFNvbmFtdUVudmlyb25tZW50KCkgPT09IFwidGVzdFwiKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuU09OQU1VX1dPUktFUl9EQiA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0V29ya2VyREIoZGJDb25maWcpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy50ZXN0VHJhbnNhY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGVzdFRyYW5zYWN0aW9uO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLndkYikge1xuICAgICAgICByZXR1cm4gdGhpcy53ZGI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLndkYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZSh7XG4gICAgICAgICAgLi4uZGJDb25maWcudGVzdCxcbiAgICAgICAgICBwb29sOiB7XG4gICAgICAgICAgICBtaW46IDEsXG4gICAgICAgICAgICBtYXg6IDEsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLndkYjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBpbnN0YW5jZU5hbWUgPSB3aGljaCA9PT0gXCJ3XCIgPyBcIndkYlwiIDogXCJyZGJcIjtcblxuICAgIGlmICghdGhpc1tpbnN0YW5jZU5hbWVdKSB7XG4gICAgICBjb25zdCBjb25maWcgPSB0aGlzLmdldERCQ29uZmlnKHdoaWNoKTtcbiAgICAgIHRoaXNbaW5zdGFuY2VOYW1lXSA9IGNyZWF0ZUtuZXhJbnN0YW5jZShjb25maWcpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzW2luc3RhbmNlTmFtZV07XG4gIH1cblxuICBwcml2YXRlIGdldFdvcmtlckRCKGRiQ29uZmlnOiBTb25hbXVEQkNvbmZpZyk6IEtuZXgge1xuICAgIGlmICh0aGlzLnRlc3RUcmFuc2FjdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMudGVzdFRyYW5zYWN0aW9uO1xuICAgIH1cblxuICAgIGNvbnN0IHdvcmtlcklkID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuVklURVNUX1BPT0xfSUQgPz8gXCIxXCIsIDEwKTtcblxuICAgIGlmICghdGhpcy53b3JrZXJEQnMuaGFzKHdvcmtlcklkKSkge1xuICAgICAgY29uc3QgYmFzZVRlc3RDb25maWcgPSBkYkNvbmZpZy50ZXN0O1xuICAgICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBiYXNlVGVzdENvbmZpZy5jb25uZWN0aW9uIGFzIHsgZGF0YWJhc2U6IHN0cmluZyB9O1xuICAgICAgY29uc3Qgd29ya2VyRGJOYW1lID0gYCR7Y29ubmVjdGlvbi5kYXRhYmFzZX1fJHt3b3JrZXJJZH1gO1xuXG4gICAgICBjb25zdCB3b3JrZXJDb25maWcgPSB7XG4gICAgICAgIC4uLmJhc2VUZXN0Q29uZmlnLFxuICAgICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgICAgLi4uY29ubmVjdGlvbixcbiAgICAgICAgICBkYXRhYmFzZTogd29ya2VyRGJOYW1lLFxuICAgICAgICB9LFxuICAgICAgICBwb29sOiB7IG1pbjogMSwgbWF4OiAxIH0sXG4gICAgICB9O1xuXG4gICAgICB0aGlzLndvcmtlckRCcy5zZXQod29ya2VySWQsIGNyZWF0ZUtuZXhJbnN0YW5jZSh3b3JrZXJDb25maWcpKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYiA9IHRoaXMud29ya2VyREJzLmdldCh3b3JrZXJJZCk7XG4gICAgYXNzZXJ0KGRiLCBgV29ya2VyIERCICR7d29ya2VySWR9IG5vdCBmb3VuZGApO1xuICAgIHJldHVybiBkYjtcbiAgfVxuXG4gIGdldERCQ29uZmlnKHdoaWNoOiBEQlByZXNldCk6IEtuZXguQ29uZmlnIHtcbiAgICBjb25zdCBkYkNvbmZpZyA9IHRoaXMuZ2V0Q3VycmVudENvbmZpZygpO1xuXG4gICAgaWYgKGlzQ29uY3JldGVQcmVzZXQod2hpY2gpKSB7XG4gICAgICByZXR1cm4gZGJDb25maWdbd2hpY2hdO1xuICAgIH1cblxuICAgIGNvbnN0IGVudmlyb25tZW50ID0gZ2V0U29uYW11RW52aXJvbm1lbnQoKTtcbiAgICBpZiAoZW52aXJvbm1lbnQgPT09IFwidGVzdFwiKSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSB3aGljaCA9PT0gXCJ3XCIgPyBkYkNvbmZpZy50ZXN0IDogZGJDb25maWcudGVzdF9yZWFkb25seTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnRhcmdldCxcbiAgICAgICAgcG9vbDoge1xuICAgICAgICAgIG1pbjogMSxcbiAgICAgICAgICBtYXg6IDEsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB3aGljaCA9PT0gXCJ3XCIgPyBkYkNvbmZpZ1tlbnZpcm9ubWVudF0gOiBkYkNvbmZpZ1tnZXRSZWFkb25seVByZXNldChlbnZpcm9ubWVudCldO1xuICB9XG5cbiAgYXN5bmMgZGVzdHJveSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy53ZGIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYXdhaXQgdGhpcy53ZGIuZGVzdHJveSgpO1xuICAgICAgdGhpcy53ZGIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLnJkYiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhd2FpdCB0aGlzLnJkYi5kZXN0cm95KCk7XG4gICAgICB0aGlzLnJkYiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZm9yIChjb25zdCBkYiBvZiB0aGlzLnByZXNldERCcy52YWx1ZXMoKSkge1xuICAgICAgYXdhaXQgZGIuZGVzdHJveSgpO1xuICAgIH1cbiAgICB0aGlzLnByZXNldERCcy5jbGVhcigpO1xuICAgIGZvciAoY29uc3QgZGIgb2YgdGhpcy53b3JrZXJEQnMudmFsdWVzKCkpIHtcbiAgICAgIGF3YWl0IGRiLmRlc3Ryb3koKTtcbiAgICB9XG4gICAgdGhpcy53b3JrZXJEQnMuY2xlYXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZW5lcmF0ZURCQ29uZmlnKFxuICAgIGNvbmZpZzogU29uYW11Q29uZmlnW1wiZGF0YWJhc2VcIl0sXG4gICAgcHJvamVjdE5hbWU/OiBzdHJpbmcsXG4gICAgc25hcHNob3RzPzogRW52aXJvbm1lbnRTbmFwc2hvdHMsXG4gICkge1xuICAgIGFzc2VydE5vTGVnYWN5RGF0YWJhc2VDb25maWcoY29uZmlnKTtcblxuICAgIGNvbnN0IGJhc2VOYW1lID0gZ2V0UHJvamVjdERhdGFiYXNlQmFzZU5hbWUocHJvamVjdE5hbWUpO1xuICAgIGNvbnN0IGRlZmF1bHRLbmV4Q29uZmlnID0gbWVyZ2VDb25maWdzPFBhcnRpYWw8RGF0YWJhc2VDb25maWc+PihcbiAgICAgIHtcbiAgICAgICAgY2xpZW50OiBjb25maWcuZGF0YWJhc2UgPT09IFwicGduYXRpdmVcIiA/IFwicGduYXRpdmVcIiA6IFwicG9zdGdyZXNxbFwiLFxuICAgICAgICBwb29sOiB7XG4gICAgICAgICAgbWluOiAxLFxuICAgICAgICAgIG1heDogNSxcbiAgICAgICAgfSxcbiAgICAgICAgbWlncmF0aW9uczoge1xuICAgICAgICAgIGRpcmVjdG9yeTogXCIuL3NyYy9taWdyYXRpb25zXCIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgY29uZmlnLmRlZmF1bHRPcHRpb25zLFxuICAgICk7XG4gICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICBjb25zdCBiYXNlQ29ubmVjdGlvbiA9IGRlZmF1bHRLbmV4Q29uZmlnLmNvbm5lY3Rpb24gYXMgS25leC5QZ0Nvbm5lY3Rpb25Db25maWcgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgZW52aXJvbm1lbnRGYWxsYmFja0Nvbm5lY3Rpb24gPSBzbmFwc2hvdHNcbiAgICAgID8gbmV1dHJhbGl6ZUVudmlyb25tZW50Q29ubmVjdGlvbkZpZWxkcyhiYXNlQ29ubmVjdGlvbilcbiAgICAgIDogYmFzZUNvbm5lY3Rpb247XG5cbiAgICBjb25zdCBlbnZGb3JQcmVzZXQgPSAocHJlc2V0OiBTb25hbXVNYWluREJQcmVzZXQpOiBOb2RlSlMuUHJvY2Vzc0VudiA9PiB7XG4gICAgICBpZiAoIXNuYXBzaG90cykge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnY7XG4gICAgICB9XG4gICAgICBpZiAocHJlc2V0ID09PSBcImZpeHR1cmVcIikge1xuICAgICAgICByZXR1cm4gc25hcHNob3RzLnRlc3Q7XG4gICAgICB9XG4gICAgICByZXR1cm4gc25hcHNob3RzW3ByZXNldF07XG4gICAgfTtcblxuICAgIGNvbnN0IG1haW5Db25maWcgPSAocHJlc2V0OiBTb25hbXVNYWluREJQcmVzZXQpOiBLbmV4LkNvbmZpZyA9PlxuICAgICAgbWVyZ2VDb25maWdzKGRlZmF1bHRLbmV4Q29uZmlnLCB7XG4gICAgICAgIGNvbm5lY3Rpb246IGNvbm5lY3Rpb25Gcm9tRW52KHtcbiAgICAgICAgICBiYXNlTmFtZSxcbiAgICAgICAgICBzdWZmaXg6IHByZXNldCxcbiAgICAgICAgICBiYXNlQ29ubmVjdGlvbjogZW52aXJvbm1lbnRGYWxsYmFja0Nvbm5lY3Rpb24sXG4gICAgICAgICAgZW52OiBlbnZGb3JQcmVzZXQocHJlc2V0KSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICBjb25zdCByZWFkb25seUNvbmZpZyA9IChlbnZpcm9ubWVudDogU29uYW11RW52aXJvbm1lbnQpOiBLbmV4LkNvbmZpZyA9PlxuICAgICAgbWVyZ2VDb25maWdzPEtuZXguQ29uZmlnPihkZWZhdWx0S25leENvbmZpZywgbWFpbkNvbmZpZyhlbnZpcm9ubWVudCksIHtcbiAgICAgICAgY29ubmVjdGlvbjogY29ubmVjdGlvbkZyb21FbnYoe1xuICAgICAgICAgIGJhc2VOYW1lLFxuICAgICAgICAgIHN1ZmZpeDogZW52aXJvbm1lbnQsXG4gICAgICAgICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgICAgICBiYXNlQ29ubmVjdGlvbjogbWFpbkNvbmZpZyhlbnZpcm9ubWVudCkuY29ubmVjdGlvbiBhcyBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZyxcbiAgICAgICAgICBwcmVmaXg6IFwiU09OQU1VX0RCX1JFQURPTkxZXCIsXG4gICAgICAgICAgZW52OiBlbnZGb3JQcmVzZXQoZW52aXJvbm1lbnQpLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuXG4gICAgY29uc3QgdGVzdCA9IG1haW5Db25maWcoXCJ0ZXN0XCIpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRlc3QsXG4gICAgICB0ZXN0X3JlYWRvbmx5OiByZWFkb25seUNvbmZpZyhcInRlc3RcIiksXG4gICAgICBmaXh0dXJlOiBtZXJnZUNvbmZpZ3MoZGVmYXVsdEtuZXhDb25maWcsIHtcbiAgICAgICAgY29ubmVjdGlvbjogY29ubmVjdGlvbkZyb21FbnYoe1xuICAgICAgICAgIGJhc2VOYW1lLFxuICAgICAgICAgIHN1ZmZpeDogXCJmaXh0dXJlXCIsXG4gICAgICAgICAgYmFzZUNvbm5lY3Rpb246IGVudmlyb25tZW50RmFsbGJhY2tDb25uZWN0aW9uLFxuICAgICAgICAgIHByZWZpeDogXCJTT05BTVVfREJfRklYVFVSRVwiLFxuICAgICAgICAgIGVudjogZW52Rm9yUHJlc2V0KFwiZml4dHVyZVwiKSxcbiAgICAgICAgfSksXG4gICAgICB9KSxcbiAgICAgIGRldmVsb3BtZW50OiBtYWluQ29uZmlnKFwiZGV2ZWxvcG1lbnRcIiksXG4gICAgICBkZXZlbG9wbWVudF9yZWFkb25seTogcmVhZG9ubHlDb25maWcoXCJkZXZlbG9wbWVudFwiKSxcbiAgICAgIHN0YWdpbmc6IG1haW5Db25maWcoXCJzdGFnaW5nXCIpLFxuICAgICAgc3RhZ2luZ19yZWFkb25seTogcmVhZG9ubHlDb25maWcoXCJzdGFnaW5nXCIpLFxuICAgICAgcHJvZHVjdGlvbjogbWFpbkNvbmZpZyhcInByb2R1Y3Rpb25cIiksXG4gICAgICBwcm9kdWN0aW9uX3JlYWRvbmx5OiByZWFkb25seUNvbmZpZyhcInByb2R1Y3Rpb25cIiksXG4gICAgfSBzYXRpc2ZpZXMgU29uYW11REJDb25maWc7XG4gIH1cblxuICBwdWJsaWMgdGVzdFRyYW5zYWN0aW9uOiBLbmV4LlRyYW5zYWN0aW9uIHwgbnVsbCA9IG51bGw7XG4gIGFzeW5jIGNyZWF0ZVRlc3RUcmFuc2FjdGlvbigpOiBQcm9taXNlPEtuZXguVHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCBkYiA9IHRoaXMuZ2V0REIoXCJ3XCIpO1xuICAgIHRoaXMudGVzdFRyYW5zYWN0aW9uID0gYXdhaXQgZGIudHJhbnNhY3Rpb24oKTtcbiAgICByZXR1cm4gdGhpcy50ZXN0VHJhbnNhY3Rpb247XG4gIH1cbiAgYXN5bmMgY2xlYXJUZXN0VHJhbnNhY3Rpb24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy50ZXN0VHJhbnNhY3Rpb24/LnJvbGxiYWNrKCk7XG4gICAgdGhpcy50ZXN0VHJhbnNhY3Rpb24gPSBudWxsO1xuICB9XG4gIGFzeW5jIGdldFRlc3RDb25uZWN0aW9uKCk6IFByb21pc2U8S25leD4ge1xuICAgIGNvbnN0IGRiID0gdGhpcy5nZXREQihcIndcIik7XG4gICAgcmV0dXJuIGRiO1xuICB9XG59XG5leHBvcnQgY29uc3QgREIgPSBuZXcgREJDbGFzcygpO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVlBLFNBQVMsY0FBcUIsT0FBdUM7Q0FDbkUsT0FBTyxjQUFjLEtBQUssS0FBSyxDQUFDLE1BQU0sUUFBUSxLQUFLO0FBQ3JEO0FBRUEsU0FBUyxZQUNQLFFBQ0EsUUFDUTtDQUNSLE1BQU0sZ0JBQWdCLElBQUksSUFBSSxPQUFPLFFBQVEsTUFBTSxDQUFDO0NBRXBELEtBQUssTUFBTSxDQUFDLEtBQUssVUFBVSxPQUFPLFFBQVEsTUFBTSxHQUFHO0VBQ2pELE1BQU0sZUFBZSxjQUFjLElBQUksR0FBRztFQUMxQyxNQUFNLGNBQ0osY0FBYyxZQUFZLEtBQUssY0FBYyxLQUFLLElBQzlDLFlBQVksRUFBRSxHQUFHLGFBQWEsR0FBRyxLQUFLLElBQ3RDO0VBQ04sT0FBTyxPQUFPLFFBQVEsR0FBRyxNQUFNLFlBQVksQ0FBQztDQUM5QztDQUVBLE9BQU87QUFDVDtBQUVBLFNBQVMsYUFDUCxZQUNBLEdBQUcsU0FDQTtDQUNILE1BQU0sU0FBUyxFQUFFLEdBQUcsV0FBVztDQUUvQixLQUFLLE1BQU0sVUFBVSxTQUNuQixJQUFJLFdBQVcsVUFBYSxXQUFXLE1BQ3JDLFlBQVksUUFBUSxNQUFNO0NBSTlCLE9BQU87QUFDVDtBQWFBLFNBQVMsaUJBQWlCLE9BQTBDO0NB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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knex.d.ts","sourceRoot":"","sources":["../../src/database/knex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"knex.d.ts","sourceRoot":"","sources":["../../src/database/knex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,MAAM,CAAC;AAajC,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAgD5D"}
|
package/dist/database/knex.js
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { __esmMin } from "../_virtual/_rolldown/runtime.js";
|
|
2
|
+
import { init_runtime_value, isObjectValue } from "../utils/runtime-value.js";
|
|
2
3
|
import knex from "knex";
|
|
3
4
|
//#region src/database/knex.ts
|
|
4
5
|
function createKnexInstance(config) {
|
|
5
|
-
if (config.connection &&
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
if (config.connection && isObjectValue(config.connection)) {
|
|
7
|
+
const keepAlive = "keepAlive" in config.connection ? config.connection.keepAlive : void 0;
|
|
8
|
+
const initialDelay = "keepAliveInitialDelayMillis" in config.connection ? config.connection.keepAliveInitialDelayMillis : void 0;
|
|
9
|
+
if (keepAlive === void 0) Object.assign(config.connection, {
|
|
10
|
+
keepAlive: true,
|
|
11
|
+
keepAliveInitialDelayMillis: initialDelay ?? 1e4
|
|
12
|
+
});
|
|
11
13
|
}
|
|
12
14
|
config.pool = {
|
|
13
15
|
maxConnectionLifetimeMillis: 18e5,
|
|
@@ -19,22 +21,23 @@ function createKnexInstance(config) {
|
|
|
19
21
|
createTimeoutMillis: 3e4,
|
|
20
22
|
...config.pool,
|
|
21
23
|
validate: (connection) => {
|
|
22
|
-
if (
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
return
|
|
24
|
+
if (!isObjectValue(connection)) return false;
|
|
25
|
+
const isEnding = "_ending" in connection && connection["_ending"] === true;
|
|
26
|
+
const isClosed = "_closed" in connection && connection["_closed"] === true;
|
|
27
|
+
return !isEnding && !isClosed;
|
|
26
28
|
},
|
|
27
29
|
afterCreate: ((conn, done) => {
|
|
28
|
-
|
|
29
|
-
if (stream?.stream?.setKeepAlive) stream.stream.setKeepAlive(true, 1e4);
|
|
30
|
+
if (conn.connection?.stream?.setKeepAlive) conn.connection.stream.setKeepAlive(true, 1e4);
|
|
30
31
|
done(null, conn);
|
|
31
32
|
})
|
|
32
33
|
};
|
|
33
34
|
return knex(config);
|
|
34
35
|
}
|
|
35
|
-
var init_knex = __esmMin((() => {
|
|
36
|
+
var init_knex = __esmMin((() => {
|
|
37
|
+
init_runtime_value();
|
|
38
|
+
}));
|
|
36
39
|
//#endregion
|
|
37
40
|
init_knex();
|
|
38
41
|
export { createKnexInstance, init_knex };
|
|
39
42
|
|
|
40
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
43
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia25leC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YWJhc2Uva25leC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIEtuZXggfSBmcm9tIFwia25leFwiO1xuaW1wb3J0IGtuZXggZnJvbSBcImtuZXhcIjtcblxuaW1wb3J0IHsgaXNPYmplY3RWYWx1ZSB9IGZyb20gXCIuLi91dGlscy9ydW50aW1lLXZhbHVlXCI7XG5cbnR5cGUgS25leENsaWVudFdpdGhDb25uZWN0aW9uID0gS25leC5DbGllbnQgJiB7XG4gIGNvbm5lY3Rpb24/OiB7XG4gICAgc3RyZWFtPzoge1xuICAgICAgc2V0S2VlcEFsaXZlPzogKGVuYWJsZTogYm9vbGVhbiwgaW5pdGlhbERlbGF5OiBudW1iZXIpID0+IHZvaWQ7XG4gICAgfTtcbiAgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVLbmV4SW5zdGFuY2UoY29uZmlnOiBLbmV4LkNvbmZpZyk6IEtuZXgge1xuICBpZiAoY29uZmlnLmNvbm5lY3Rpb24gJiYgaXNPYmplY3RWYWx1ZShjb25maWcuY29ubmVjdGlvbikpIHtcbiAgICBjb25zdCBrZWVwQWxpdmUgPSBcImtlZXBBbGl2ZVwiIGluIGNvbmZpZy5jb25uZWN0aW9uID8gY29uZmlnLmNvbm5lY3Rpb24ua2VlcEFsaXZlIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGluaXRpYWxEZWxheSA9XG4gICAgICBcImtlZXBBbGl2ZUluaXRpYWxEZWxheU1pbGxpc1wiIGluIGNvbmZpZy5jb25uZWN0aW9uXG4gICAgICAgID8gY29uZmlnLmNvbm5lY3Rpb24ua2VlcEFsaXZlSW5pdGlhbERlbGF5TWlsbGlzXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKGtlZXBBbGl2ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBPYmplY3QuYXNzaWduKGNvbmZpZy5jb25uZWN0aW9uLCB7XG4gICAgICAgIGtlZXBBbGl2ZTogdHJ1ZSxcbiAgICAgICAga2VlcEFsaXZlSW5pdGlhbERlbGF5TWlsbGlzOiBpbml0aWFsRGVsYXkgPz8gMTAwMDAsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBjb25maWcucG9vbCA9IHtcbiAgICAvLyDslYTrnpjripQg6riw67O46rCS7J2066mwLCDtmLjstpzsuKHsnbQgY29uZmlnLnBvb2zroZwg642u7Ja07JO4IOyImCDsnojri6QuXG4gICAgLy8gKOyYiDog66eI7J206re466CI7J207IWYIOyDge2DnCDsobDtmozripQgZmFpbC1mYXN066W8IOychO2VtCDsp6fsnYAg7YOA7J6E7JWE7JuDICsgcHJvcGFnYXRlQ3JlYXRlRXJyb3Lrpbwg7KeA7KCVKVxuICAgIG1heENvbm5lY3Rpb25MaWZldGltZU1pbGxpczogMTgwMDAwMCxcbiAgICBtYXhDb25uZWN0aW9uTGlmZXRpbWVKaXR0ZXJNaWxsaXM6IDMwMDAwMCxcbiAgICBwcm9wYWdhdGVDcmVhdGVFcnJvcjogZmFsc2UsXG4gICAgaWRsZVRpbWVvdXRNaWxsaXM6IDEwMDAwLFxuICAgIHJlYXBJbnRlcnZhbE1pbGxpczogMTAwMCxcbiAgICBhY3F1aXJlVGltZW91dE1pbGxpczogMzAwMDAsXG4gICAgY3JlYXRlVGltZW91dE1pbGxpczogMzAwMDAsXG4gICAgLi4uY29uZmlnLnBvb2wsXG4gICAgLy8gdmFsaWRhdGUvYWZ0ZXJDcmVhdGXripQg7ZWt7IOBIO2UhOugiOyehOybjO2BrCDquLDrs7jqsJLsnYQg7IKs7Jqp7ZWc64ukLlxuICAgIHZhbGlkYXRlOiA8Q29ubmVjdGlvbj4oY29ubmVjdGlvbjogQ29ubmVjdGlvbikgPT4ge1xuICAgICAgaWYgKCFpc09iamVjdFZhbHVlKGNvbm5lY3Rpb24pKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBpc0VuZGluZyA9IFwiX2VuZGluZ1wiIGluIGNvbm5lY3Rpb24gJiYgY29ubmVjdGlvbltcIl9lbmRpbmdcIl0gPT09IHRydWU7XG4gICAgICBjb25zdCBpc0Nsb3NlZCA9IFwiX2Nsb3NlZFwiIGluIGNvbm5lY3Rpb24gJiYgY29ubmVjdGlvbltcIl9jbG9zZWRcIl0gPT09IHRydWU7XG4gICAgICByZXR1cm4gIWlzRW5kaW5nICYmICFpc0Nsb3NlZDtcbiAgICB9LFxuICAgIGFmdGVyQ3JlYXRlOiAoKFxuICAgICAgY29ubjogS25leENsaWVudFdpdGhDb25uZWN0aW9uLFxuICAgICAgZG9uZTogKGVycjogRXJyb3IgfCBudWxsLCBjb25uOiBLbmV4LkNsaWVudCkgPT4gdm9pZCxcbiAgICApID0+IHtcbiAgICAgIC8vIHBnIGRyaXZlciDshozsvJPsl5Aga2VlcEFsaXZl66W8IOyggeyaqe2VtCDsnKDtnLQg7Jew6rKwIOuLqOygiOydhCDspITsnoXri4jri6QuXG4gICAgICBpZiAoY29ubi5jb25uZWN0aW9uPy5zdHJlYW0/LnNldEtlZXBBbGl2ZSkge1xuICAgICAgICBjb25uLmNvbm5lY3Rpb24uc3RyZWFtLnNldEtlZXBBbGl2ZSh0cnVlLCAxMDAwMCk7XG4gICAgICB9XG5cbiAgICAgIGRvbmUobnVsbCwgY29ubik7XG4gICAgfSkgc2F0aXNmaWVzIEtuZXguUG9vbENvbmZpZ1tcImFmdGVyQ3JlYXRlXCJdLFxuICB9O1xuXG4gIHJldHVybiBrbmV4KGNvbmZpZyk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFhQSxTQUFnQixtQkFBbUIsUUFBMkI7Q0FDNUQsSUFBSSxPQUFPLGNBQWMsY0FBYyxPQUFPLFVBQVUsR0FBRztFQUN6RCxNQUFNLFlBQVksZUFBZSxPQUFPLGFBQWEsT0FBTyxXQUFXLFlBQVk7RUFDbkYsTUFBTSxlQUNKLGlDQUFpQyxPQUFPLGFBQ3BDLE9BQU8sV0FBVyw4QkFDbEI7RUFFTixJQUFJLGNBQWMsUUFDaEIsT0FBTyxPQUFPLE9BQU8sWUFBWTtHQUMvQixXQUFXO0dBQ1gsNkJBQTZCLGdCQUFnQjtFQUMvQyxDQUFDO0NBRUw7Q0FFQSxPQUFPLE9BQU87RUFHWiw2QkFBNkI7RUFDN0IsbUNBQW1DO0VBQ25DLHNCQUFzQjtFQUN0QixtQkFBbUI7RUFDbkIsb0JBQW9CO0VBQ3BCLHNCQUFzQjtFQUN0QixxQkFBcUI7RUFDckIsR0FBRyxPQUFPO0VBRVYsV0FBdUIsZUFBMkI7R0FDaEQsSUFBSSxDQUFDLGNBQWMsVUFBVSxHQUFHLE9BQU87R0FDdkMsTUFBTSxXQUFXLGFBQWEsY0FBYyxXQUFXLGVBQWU7R0FDdEUsTUFBTSxXQUFXLGFBQWEsY0FBYyxXQUFXLGVBQWU7R0FDdEUsT0FBTyxDQUFDLFlBQVksQ0FBQztFQUN2QjtFQUNBLGVBQ0UsTUFDQSxTQUNHO0dBRUgsSUFBSSxLQUFLLFlBQVksUUFBUSxjQUMzQixLQUFLLFdBQVcsT0FBTyxhQUFhLE1BQU0sR0FBSztHQUdqRCxLQUFLLE1BQU0sSUFBSTtFQUNqQjtDQUNGO0NBRUEsT0FBTyxLQUFLLE1BQU07QUFDcEI7O29CQTFEc0QifQ==
|