sonamu 0.10.12 → 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 +131 -27
- 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 +12 -6
- 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 +3 -2
- package/dist/migration/migrator.d.ts.map +1 -1
- package/dist/migration/migrator.js +27 -21
- 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/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 +135 -128
- 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.map +1 -1
- package/dist/ui/migrations-api.js +17 -15
- package/dist/ui-web/assets/index-DV1AAq6W.js +178 -0
- package/dist/ui-web/index.html +1 -1
- 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 +5 -3
- 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 +153 -36
- 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 +68 -41
- package/src/migration/postgresql-schema-reader.ts +52 -47
- package/src/migration/slack-confirm.ts +17 -15
- 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 +727 -616
- package/src/ui/async-route.ts +4 -0
- package/src/ui/cdd-service.ts +35 -12
- package/src/ui/migrations-api.ts +63 -51
- 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-C0m1pk6K.js +0 -177
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { init_runtime_value, isObjectValue, isStringValue } from "../../utils/runtime-value.js";
|
|
1
2
|
import { DB, init_db } from "../../database/db.js";
|
|
2
3
|
import { ROUTES } from "./events.js";
|
|
3
4
|
import { buildAuditEventCatalog } from "./builders.js";
|
|
@@ -6,6 +7,7 @@ import { getLogger } from "@logtape/logtape";
|
|
|
6
7
|
import { createAuthMiddleware } from "better-auth/api";
|
|
7
8
|
//#region src/auth/audit-log/plugin.ts
|
|
8
9
|
init_db();
|
|
10
|
+
init_runtime_value();
|
|
9
11
|
const stripQuery = (value) => value.split("?")[0] || value;
|
|
10
12
|
const escapeRegex = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
11
13
|
const routeToRegex = (route) => {
|
|
@@ -44,12 +46,7 @@ const getOrganizationTriggerInfo = (user) => ({
|
|
|
44
46
|
triggeredBy: user?.id ?? "unknown",
|
|
45
47
|
triggerContext: "organization"
|
|
46
48
|
});
|
|
47
|
-
const narrowRequestCtx = (raw) =>
|
|
48
|
-
if (!raw || typeof raw !== "object") return null;
|
|
49
|
-
const candidate = raw;
|
|
50
|
-
if (!candidate.context || typeof candidate.context !== "object") return null;
|
|
51
|
-
return raw;
|
|
52
|
-
};
|
|
49
|
+
const narrowRequestCtx = (raw) => raw;
|
|
53
50
|
const fetchUserBy = async (ctx, field, value) => {
|
|
54
51
|
if (!value) return null;
|
|
55
52
|
const adapter = ctx.context.adapter;
|
|
@@ -67,17 +64,20 @@ const fetchUserBy = async (ctx, field, value) => {
|
|
|
67
64
|
value
|
|
68
65
|
}]
|
|
69
66
|
});
|
|
70
|
-
if (!row) return null;
|
|
67
|
+
if (!row || !isObjectValue(row)) return null;
|
|
68
|
+
const id = "id" in row ? row.id : void 0;
|
|
69
|
+
const name = "name" in row ? row.name : void 0;
|
|
70
|
+
const email = "email" in row ? row.email : void 0;
|
|
71
71
|
return {
|
|
72
|
-
id: String(
|
|
73
|
-
name:
|
|
74
|
-
email:
|
|
72
|
+
id: String(id),
|
|
73
|
+
name: isStringValue(name) ? name : void 0,
|
|
74
|
+
email: isStringValue(email) ? email : void 0
|
|
75
75
|
};
|
|
76
76
|
} catch {
|
|
77
77
|
return null;
|
|
78
78
|
}
|
|
79
79
|
};
|
|
80
|
-
const isNonEmptyString = (
|
|
80
|
+
const isNonEmptyString = (value) => isStringValue(value) && value.length > 0;
|
|
81
81
|
const IP_HEADER_ORDER = [
|
|
82
82
|
"cf-connecting-ip",
|
|
83
83
|
"x-forwarded-for",
|
|
@@ -87,11 +87,10 @@ const IP_HEADER_ORDER = [
|
|
|
87
87
|
const readHeader = (headers, key) => {
|
|
88
88
|
if (!headers) return null;
|
|
89
89
|
if (headers instanceof Headers) return headers.get(key);
|
|
90
|
-
if (
|
|
91
|
-
const
|
|
92
|
-
|
|
93
|
-
if (
|
|
94
|
-
if (Array.isArray(v) && typeof v[0] === "string") return v[0];
|
|
90
|
+
if (isObjectValue(headers)) {
|
|
91
|
+
const v = headers[key] ?? headers[key.toLowerCase()];
|
|
92
|
+
if (isStringValue(v)) return v;
|
|
93
|
+
if (Array.isArray(v) && isStringValue(v[0])) return v[0];
|
|
95
94
|
}
|
|
96
95
|
return null;
|
|
97
96
|
};
|
|
@@ -99,7 +98,7 @@ const extractLocationFromHeaders = (headers) => {
|
|
|
99
98
|
let ipAddress = null;
|
|
100
99
|
for (const key of IP_HEADER_ORDER) {
|
|
101
100
|
const raw = readHeader(headers, key);
|
|
102
|
-
if (
|
|
101
|
+
if (isStringValue(raw) && raw.length > 0) {
|
|
103
102
|
const first = raw.split(",")[0]?.trim();
|
|
104
103
|
if (first) {
|
|
105
104
|
ipAddress = first;
|
|
@@ -116,11 +115,10 @@ const extractLocationFromHeaders = (headers) => {
|
|
|
116
115
|
countryCode: countryCode ?? void 0
|
|
117
116
|
};
|
|
118
117
|
};
|
|
119
|
-
const wrapOrgHook = (
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
await
|
|
123
|
-
if (prev) return prev(...args);
|
|
118
|
+
const wrapOrgHook = (previous, handler) => {
|
|
119
|
+
return async (payload) => {
|
|
120
|
+
await handler(payload);
|
|
121
|
+
await previous?.(payload);
|
|
124
122
|
};
|
|
125
123
|
};
|
|
126
124
|
/**
|
|
@@ -131,6 +129,9 @@ const wrapOrgHook = (hooks, name, handler) => {
|
|
|
131
129
|
* - dash의 infra 연결/API endpoint 제공 범위는 포함하지 않고, audit-event emit/ingest 경로만 유지한다.
|
|
132
130
|
* - security 4종은 R1 결정에 따라 scope out (builders.ts의 TODO 주석 참조).
|
|
133
131
|
*/
|
|
132
|
+
function locationFor(ctx) {
|
|
133
|
+
return ctx.context.location ?? void 0;
|
|
134
|
+
}
|
|
134
135
|
function sonamuAuditLog() {
|
|
135
136
|
const logger = getLogger(["sonamu", "audit-log"]);
|
|
136
137
|
const catalog = buildAuditEventCatalog();
|
|
@@ -143,7 +144,6 @@ function sonamuAuditLog() {
|
|
|
143
144
|
}
|
|
144
145
|
};
|
|
145
146
|
const triggerFor = (ctx, subjectUserId) => getTriggerInfo(ctx.path, ctx.context.session?.session?.userId ?? null, subjectUserId);
|
|
146
|
-
const locationFor = (ctx) => ctx.context.location ?? void 0;
|
|
147
147
|
return {
|
|
148
148
|
id: "sonamu-audit-log",
|
|
149
149
|
init(pluginCtx) {
|
|
@@ -315,18 +315,16 @@ function sonamuAuditLog() {
|
|
|
315
315
|
matcher: () => true,
|
|
316
316
|
handler: createAuthMiddleware(async (rawCtx) => {
|
|
317
317
|
const ctx = rawCtx;
|
|
318
|
-
if (!ctx.context) return;
|
|
319
318
|
const headers = ctx.headers ?? ctx.request?.headers;
|
|
320
319
|
ctx.context.location = extractLocationFromHeaders(headers);
|
|
321
320
|
})
|
|
322
321
|
}],
|
|
323
322
|
after: [{
|
|
324
323
|
matcher: (ctx) => {
|
|
325
|
-
|
|
326
|
-
if (
|
|
327
|
-
if (!c.request.url) return false;
|
|
324
|
+
if (ctx.request?.method !== "GET") return true;
|
|
325
|
+
if (!ctx.request.url) return false;
|
|
328
326
|
try {
|
|
329
|
-
const p = new URL(
|
|
327
|
+
const p = new URL(ctx.request.url).pathname;
|
|
330
328
|
return matchesAnyRoute(p, [ROUTES.SIGN_IN_SOCIAL_CALLBACK, ROUTES.SIGN_IN_OAUTH_CALLBACK]);
|
|
331
329
|
} catch {
|
|
332
330
|
return false;
|
|
@@ -344,15 +342,15 @@ function sonamuAuditLog() {
|
|
|
344
342
|
const user = ctx.context.session.user;
|
|
345
343
|
if (sessionEntity && user) await emit(catalog.session.trackEmailVerificationSent(sessionEntity, user, trigger));
|
|
346
344
|
}
|
|
347
|
-
const body = ctx.body
|
|
348
|
-
if (matchesAnyRoute(ctx.path, [ROUTES.SIGN_IN_EMAIL, ROUTES.SIGN_IN_EMAIL_OTP]) && isErrored && body?.email) {
|
|
345
|
+
const body = ctx.body;
|
|
346
|
+
if (matchesAnyRoute(ctx.path, [ROUTES.SIGN_IN_EMAIL, ROUTES.SIGN_IN_EMAIL_OTP]) && isErrored && isStringValue(body?.email)) {
|
|
349
347
|
const user = await fetchUserBy(ctx, "email", body.email);
|
|
350
348
|
await emit(catalog.session.trackEmailSignInAttempt({
|
|
351
349
|
email: body.email,
|
|
352
350
|
loginMethod: getLoginMethod(ctx.path, ctx.params?.id)
|
|
353
351
|
}, user, trigger, location));
|
|
354
352
|
}
|
|
355
|
-
if (matchesAnyRoute(ctx.path, [ROUTES.SIGN_IN_SOCIAL]) && isErrored && body?.provider && body?.idToken) await emit(catalog.session.trackSocialSignInAttempt({ loginMethod: getLoginMethod(ctx.path, ctx.params?.id) }, null, trigger, location));
|
|
353
|
+
if (matchesAnyRoute(ctx.path, [ROUTES.SIGN_IN_SOCIAL]) && isErrored && isStringValue(body?.provider) && isStringValue(body?.idToken)) await emit(catalog.session.trackSocialSignInAttempt({ loginMethod: getLoginMethod(ctx.path, ctx.params?.id) }, null, trigger, location));
|
|
356
354
|
if (matchesAnyRoute(ctx.path, [ROUTES.SIGN_IN_SOCIAL_CALLBACK]) && isErrored) await emit(catalog.session.trackSocialSignInRedirectionAttempt({ loginMethod: getLoginMethod(ctx.path, ctx.params?.id) }, null, trigger, location));
|
|
357
355
|
})
|
|
358
356
|
}]
|
|
@@ -360,37 +358,35 @@ function sonamuAuditLog() {
|
|
|
360
358
|
};
|
|
361
359
|
}
|
|
362
360
|
function installOrganizationHooks(pluginCtx, catalog, emit, logger) {
|
|
363
|
-
const
|
|
364
|
-
|
|
365
|
-
if (!organizationPlugin || typeof organizationPlugin !== "object") {
|
|
361
|
+
const organizationPlugin = pluginCtx.getPlugin("organization");
|
|
362
|
+
if (!organizationPlugin) {
|
|
366
363
|
logger.debug("organization plugin not active; skipping instrumentation");
|
|
367
364
|
return;
|
|
368
365
|
}
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
wrapOrgHook(hooks,
|
|
373
|
-
wrapOrgHook(hooks, "afterUpdateOrganization", async (p) => {
|
|
366
|
+
organizationPlugin.options = organizationPlugin.options ?? {};
|
|
367
|
+
const hooks = organizationPlugin.options.organizationHooks = organizationPlugin.options.organizationHooks ?? {};
|
|
368
|
+
hooks.afterCreateOrganization = wrapOrgHook(hooks.afterCreateOrganization, async (p) => emit(catalog.organization.trackOrganizationCreated(p.organization, getOrganizationTriggerInfo(p.user))));
|
|
369
|
+
hooks.afterUpdateOrganization = wrapOrgHook(hooks.afterUpdateOrganization, async (p) => {
|
|
374
370
|
if (!p.organization) return;
|
|
375
371
|
await emit(catalog.organization.trackOrganizationUpdated(p.organization, getOrganizationTriggerInfo(p.user)));
|
|
376
372
|
});
|
|
377
|
-
wrapOrgHook(hooks
|
|
378
|
-
wrapOrgHook(hooks
|
|
379
|
-
wrapOrgHook(hooks
|
|
380
|
-
wrapOrgHook(hooks
|
|
381
|
-
wrapOrgHook(hooks
|
|
382
|
-
wrapOrgHook(hooks
|
|
383
|
-
wrapOrgHook(hooks
|
|
384
|
-
wrapOrgHook(hooks
|
|
385
|
-
wrapOrgHook(hooks
|
|
373
|
+
hooks.afterAddMember = wrapOrgHook(hooks.afterAddMember, async (p) => emit(catalog.member.trackOrganizationMemberAdded(p.organization, p.member, p.user, getOrganizationTriggerInfo(p.user))));
|
|
374
|
+
hooks.afterRemoveMember = wrapOrgHook(hooks.afterRemoveMember, async (p) => emit(catalog.member.trackOrganizationMemberRemoved(p.organization, p.member, p.user, getOrganizationTriggerInfo(p.user))));
|
|
375
|
+
hooks.afterUpdateMemberRole = wrapOrgHook(hooks.afterUpdateMemberRole, async (p) => emit(catalog.member.trackOrganizationMemberRoleUpdated(p.organization, p.member, p.user, p.previousRole, getOrganizationTriggerInfo(p.user))));
|
|
376
|
+
hooks.afterCreateInvitation = wrapOrgHook(hooks.afterCreateInvitation, async (p) => emit(catalog.invitation.trackOrganizationMemberInvited(p.organization, p.invitation, p.inviter, getOrganizationTriggerInfo(p.inviter))));
|
|
377
|
+
hooks.afterAcceptInvitation = wrapOrgHook(hooks.afterAcceptInvitation, async (p) => emit(catalog.invitation.trackOrganizationMemberInviteAccepted(p.organization, p.invitation, p.member, p.user, getOrganizationTriggerInfo(p.user))));
|
|
378
|
+
hooks.afterRejectInvitation = wrapOrgHook(hooks.afterRejectInvitation, async (p) => emit(catalog.invitation.trackOrganizationMemberInviteRejected(p.organization, p.invitation, p.user, getOrganizationTriggerInfo(p.user))));
|
|
379
|
+
hooks.afterCancelInvitation = wrapOrgHook(hooks.afterCancelInvitation, async (p) => emit(catalog.invitation.trackOrganizationMemberInviteCanceled(p.organization, p.invitation, p.cancelledBy, getOrganizationTriggerInfo(p.cancelledBy))));
|
|
380
|
+
hooks.afterCreateTeam = wrapOrgHook(hooks.afterCreateTeam, async (p) => emit(catalog.team.trackOrganizationTeamCreated(p.organization, p.team, getOrganizationTriggerInfo(p.user))));
|
|
381
|
+
hooks.afterUpdateTeam = wrapOrgHook(hooks.afterUpdateTeam, async (p) => {
|
|
386
382
|
if (!p.team) return;
|
|
387
383
|
await emit(catalog.team.trackOrganizationTeamUpdated(p.organization, p.team, getOrganizationTriggerInfo(p.user)));
|
|
388
384
|
});
|
|
389
|
-
wrapOrgHook(hooks
|
|
390
|
-
wrapOrgHook(hooks
|
|
391
|
-
wrapOrgHook(hooks
|
|
385
|
+
hooks.afterDeleteTeam = wrapOrgHook(hooks.afterDeleteTeam, async (p) => emit(catalog.team.trackOrganizationTeamDeleted(p.organization, p.team, getOrganizationTriggerInfo(p.user))));
|
|
386
|
+
hooks.afterAddTeamMember = wrapOrgHook(hooks.afterAddTeamMember, async (p) => emit(catalog.team.trackOrganizationTeamMemberAdded(p.organization, p.team, p.user, p.teamMember, getOrganizationTriggerInfo(p.user))));
|
|
387
|
+
hooks.afterRemoveTeamMember = wrapOrgHook(hooks.afterRemoveTeamMember, async (p) => emit(catalog.team.trackOrganizationTeamMemberRemoved(p.organization, p.team, p.user, p.teamMember, getOrganizationTriggerInfo(p.user))));
|
|
392
388
|
}
|
|
393
389
|
//#endregion
|
|
394
390
|
export { sonamuAuditLog };
|
|
395
391
|
|
|
396
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hdXRoL2F1ZGl0LWxvZy9wbHVnaW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcbmltcG9ydCB7IHR5cGUgQmV0dGVyQXV0aFBsdWdpbiB9IGZyb20gXCJiZXR0ZXItYXV0aFwiO1xuaW1wb3J0IHsgY3JlYXRlQXV0aE1pZGRsZXdhcmUgfSBmcm9tIFwiYmV0dGVyLWF1dGgvYXBpXCI7XG5cbmltcG9ydCB7IERCIH0gZnJvbSBcIi4uLy4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBpbmdlc3RBdWRpdEV2ZW50IH0gZnJvbSBcIi4uL2F1ZGl0LWxvZy1pbmdlc3RvclwiO1xuaW1wb3J0IHsgYnVpbGRBdWRpdEV2ZW50Q2F0YWxvZyB9IGZyb20gXCIuL2J1aWxkZXJzXCI7XG5pbXBvcnQge1xuICB0eXBlIEFjY291bnRTbmFwc2hvdCxcbiAgdHlwZSBBdWRpdExvZ0V2ZW50LFxuICB0eXBlIEJ1aWxkZXJMb2NhdGlvbixcbiAgdHlwZSBCdWlsZGVyVHJpZ2dlcixcbiAgdHlwZSBJbnZpdGF0aW9uU25hcHNob3QsXG4gIHR5cGUgTWVtYmVyU25hcHNob3QsXG4gIHR5cGUgT3JnYW5pemF0aW9uU25hcHNob3QsXG4gIFJPVVRFUyxcbiAgdHlwZSBTZXNzaW9uU25hcHNob3QsXG4gIHR5cGUgVGVhbVNuYXBzaG90LFxuICB0eXBlIFVzZXJQcm9maWxlTGl0ZSxcbiAgdHlwZSBVc2VyU25hcHNob3QsXG4gIHR5cGUgVmVyaWZpY2F0aW9uU25hcHNob3QsXG59IGZyb20gXCIuL2V2ZW50c1wiO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyDrnbzsmrDtjIUv7Yq466as6rGwIOycoO2LuFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuY29uc3Qgc3RyaXBRdWVyeSA9ICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nID0+IHZhbHVlLnNwbGl0KFwiP1wiKVswXSB8fCB2YWx1ZTtcbmNvbnN0IGVzY2FwZVJlZ2V4ID0gKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgPT4gdmFsdWUucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csIFwiXFxcXCQmXCIpO1xuY29uc3Qgcm91dGVUb1JlZ2V4ID0gKHJvdXRlOiBzdHJpbmcpOiBSZWdFeHAgPT4ge1xuICBjb25zdCBwYXR0ZXJuID0gZXNjYXBlUmVnZXgoc3RyaXBRdWVyeShyb3V0ZSkpLnJlcGxhY2UoL1xcLzooW14vXSspL2csIFwiL1teL10rXCIpO1xuICByZXR1cm4gbmV3IFJlZ0V4cChgJHtwYXR0ZXJufSg/OiR8Wy8/XSlgKTtcbn07XG5jb25zdCBtYXRjaGVzQW55Um91dGUgPSAocm91dGVQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsIHJvdXRlczogcmVhZG9ubHkgc3RyaW5nW10pOiBib29sZWFuID0+IHtcbiAgaWYgKCFyb3V0ZVBhdGgpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgY2xlYW5QYXRoID0gc3RyaXBRdWVyeShyb3V0ZVBhdGgpO1xuICByZXR1cm4gcm91dGVzLnNvbWUoKHJvdXRlKSA9PiByb3V0ZVRvUmVnZXgocm91dGUpLnRlc3QoY2xlYW5QYXRoKSk7XG59O1xuXG5jb25zdCBMT0dJTl9QQVRIUyA9IFtcbiAgUk9VVEVTLlNJR05fSU5fU09DSUFMX0NBTExCQUNLLFxuICBST1VURVMuU0lHTl9JTl9PQVVUSF9DQUxMQkFDSyxcbiAgUk9VVEVTLlNJR05fSU5fRU1BSUwsXG4gIFJPVVRFUy5TSUdOX0lOX1NPQ0lBTCxcbiAgUk9VVEVTLlNJR05fSU5fRU1BSUxfT1RQLFxuICBST1VURVMuU0lHTl9VUF9FTUFJTCxcbl0gYXMgY29uc3Q7XG5cbi8vIGRhc2ggMzE5LTMyMyDrr7jrn6w6IO2YhOyerCDsmpTssq0gcGF0aOyXkOyEnCDroZzqt7jsnbgg67Cp7Iud7J2EIOy2lOy2nO2VnOuLpC5cbmNvbnN0IGdldExvZ2luTWV0aG9kID0gKGN0eFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCwgcGFyYW1zSWQ/OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsID0+IHtcbiAgaWYgKCFjdHhQYXRoKSByZXR1cm4gbnVsbDtcbiAgaWYgKG1hdGNoZXNBbnlSb3V0ZShjdHhQYXRoLCBMT0dJTl9QQVRIUykpIHtcbiAgICBpZiAocGFyYW1zSWQpIHJldHVybiBwYXJhbXNJZDtcbiAgICByZXR1cm4gY3R4UGF0aC5zcGxpdChcIi9cIikucG9wKCkgPz8gbnVsbDtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbi8vIGRhc2ggNzk3LTgwMyDrr7jrn6w6IOyEuOyFmC/smpTssq3sl5DshJwg7Yq466as6rGwIOyjvOyytOyZgCDsu6jthY3siqTtirjrpbwg64+E7Lac7ZWc64ukLlxuY29uc3QgZ2V0VHJpZ2dlckluZm8gPSAoXG4gIGN0eFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgc2Vzc2lvblVzZXJJZDogc3RyaW5nIHwgbnVsbCxcbiAgdXNlcklkOiBzdHJpbmcsXG4pOiBCdWlsZGVyVHJpZ2dlciA9PiB7XG4gIGNvbnN0IHJlc29sdmVkID0gc2Vzc2lvblVzZXJJZCA/PyB1c2VySWQ7XG4gIGNvbnN0IHRyaWdnZXJDb250ZXh0ID1cbiAgICByZXNvbHZlZCA9PT0gdXNlcklkXG4gICAgICA/IFwidXNlclwiXG4gICAgICA6IG1hdGNoZXNBbnlSb3V0ZShjdHhQYXRoLCBbUk9VVEVTLkFETUlOX1JPVVRFXSlcbiAgICAgICAgPyBcImFkbWluXCJcbiAgICAgICAgOiBtYXRjaGVzQW55Um91dGUoY3R4UGF0aCwgW1JPVVRFUy5EQVNIX1JPVVRFXSlcbiAgICAgICAgICA/IFwiZGFzaGJvYXJkXCJcbiAgICAgICAgICA6IHJlc29sdmVkID09PSBcInVua25vd25cIlxuICAgICAgICAgICAgPyBcInVzZXJcIlxuICAgICAgICAgICAgOiBcInVua25vd25cIjtcbiAgcmV0dXJuIHsgdHJpZ2dlcmVkQnk6IHJlc29sdmVkLCB0cmlnZ2VyQ29udGV4dCB9O1xufTtcblxuLy8gZGFzaCA4MDktODE0IOuvuOufrDogb3JnYW5pemF0aW9uIGhvb2vsnYAg7J247KadIOy7qO2FjeyKpO2KuCDsl4bsnbTrj4Qg7Zi47Lac65CY66+A66GcXG4vLyDso7zslrTsp4QgdXNlciDqsJ3ssrTroZzrtoDthLAg7Yq466as6rGwIOygleuztOulvCDtlanshLHtlZzri6QuXG5jb25zdCBnZXRPcmdhbml6YXRpb25UcmlnZ2VySW5mbyA9ICh1c2VyOiB7IGlkPzogc3RyaW5nIH0gfCBudWxsIHwgdW5kZWZpbmVkKTogQnVpbGRlclRyaWdnZXIgPT4gKHtcbiAgdHJpZ2dlcmVkQnk6IHVzZXI/LmlkID8/IFwidW5rbm93blwiLFxuICB0cmlnZ2VyQ29udGV4dDogXCJvcmdhbml6YXRpb25cIixcbn0pO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBiZXR0ZXItYXV0aCBjdHgg7YOA7J6FIGhlbHBlcnMgKOuCtOu2gCBzaGFwZeydgCDrn7Dtg4DsnoQg6rWs7KGw66W8IOq4sOykgOycvOuhnCDsooHtmIAg7IKs7Jqp7ZWc64ukKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxudHlwZSBCZXR0ZXJBdXRoUmVxdWVzdEN0eCA9IHtcbiAgcGF0aD86IHN0cmluZztcbiAgYm9keT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB8IG51bGwgfCB1bmRlZmluZWQ7XG4gIGNvbnRleHQ6IHtcbiAgICBzZXNzaW9uPzoge1xuICAgICAgc2Vzc2lvbj86IHsgdXNlcklkPzogc3RyaW5nIH07XG4gICAgICB1c2VyPzogeyBpZD86IHN0cmluZyB9O1xuICAgIH0gfCBudWxsO1xuICAgIGxvY2F0aW9uPzogQnVpbGRlckxvY2F0aW9uIHwgbnVsbDtcbiAgICBhZGFwdGVyPzoge1xuICAgICAgZmluZE9uZTogKGFyZ3M6IHtcbiAgICAgICAgbW9kZWw6IHN0cmluZztcbiAgICAgICAgc2VsZWN0Pzogc3RyaW5nW107XG4gICAgICAgIHdoZXJlOiB7IGZpZWxkOiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH1bXTtcbiAgICAgIH0pID0+IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsPjtcbiAgICB9O1xuICAgIHJldHVybmVkPzogdW5rbm93bjtcbiAgfTtcbn07XG5cbi8vIGRhdGFiYXNlSG9va3MgYWZ0ZXIg7L2c67Cx7J2YIGN0eOuKlCDshKDtg53soIHsnbTrqbAgc2hhcGXsnYQg65+w7YOA7J6E7JeQ7IScIOyige2ejOuLpC5cbmNvbnN0IG5hcnJvd1JlcXVlc3RDdHggPSAocmF3OiB1bmtub3duKTogQmV0dGVyQXV0aFJlcXVlc3RDdHggfCBudWxsID0+IHtcbiAgaWYgKCFyYXcgfHwgdHlwZW9mIHJhdyAhPT0gXCJvYmplY3RcIikgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGNhbmRpZGF0ZSA9IHJhdyBhcyB7IGNvbnRleHQ/OiB1bmtub3duIH07XG4gIGlmICghY2FuZGlkYXRlLmNvbnRleHQgfHwgdHlwZW9mIGNhbmRpZGF0ZS5jb250ZXh0ICE9PSBcIm9iamVjdFwiKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIHJhdyBhcyBCZXR0ZXJBdXRoUmVxdWVzdEN0eDtcbn07XG5cbi8vIGFkYXB0ZXIuZmluZE9uZSDtmLjstpwg7Iuk7YyoIOyLnCBudWxs7J2EIOuwmO2ZmO2VnOuLpC4gZGFzaCDtl6ztjbzsmYAg64+Z7J28IOygleyxhS5cbmNvbnN0IGZldGNoVXNlckJ5ID0gYXN5bmMgKFxuICBjdHg6IEJldHRlckF1dGhSZXF1ZXN0Q3R4LFxuICBmaWVsZDogXCJpZFwiIHwgXCJlbWFpbFwiLFxuICB2YWx1ZTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCxcbik6IFByb21pc2U8VXNlclByb2ZpbGVMaXRlPiA9PiB7XG4gIGlmICghdmFsdWUpIHJldHVybiBudWxsO1xuICBjb25zdCBhZGFwdGVyID0gY3R4LmNvbnRleHQuYWRhcHRlcjtcbiAgaWYgKCFhZGFwdGVyKSByZXR1cm4gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCByb3cgPSBhd2FpdCBhZGFwdGVyLmZpbmRPbmUoe1xuICAgICAgbW9kZWw6IFwidXNlclwiLFxuICAgICAgc2VsZWN0OiBbXCJpZFwiLCBcIm5hbWVcIiwgXCJlbWFpbFwiXSxcbiAgICAgIHdoZXJlOiBbeyBmaWVsZCwgdmFsdWUgfV0sXG4gICAgfSk7XG4gICAgaWYgKCFyb3cpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB7XG4gICAgICBpZDogU3RyaW5nKHJvdy5pZCksXG4gICAgICBuYW1lOiB0eXBlb2Ygcm93Lm5hbWUgPT09IFwic3RyaW5nXCIgPyByb3cubmFtZSA6IHVuZGVmaW5lZCxcbiAgICAgIGVtYWlsOiB0eXBlb2Ygcm93LmVtYWlsID09PSBcInN0cmluZ1wiID8gcm93LmVtYWlsIDogdW5kZWZpbmVkLFxuICAgIH07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59O1xuXG5jb25zdCBpc05vbkVtcHR5U3RyaW5nID0gKHY6IHVua25vd24pOiB2IGlzIHN0cmluZyA9PiB0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIiAmJiB2Lmxlbmd0aCA+IDA7XG5cbi8vIGRhc2gg7KCc6rGwIOyLnCDtlajqu5gg7IKs65287KeEIGxvY2F0aW9uIOqzteq4iSDqsr3roZzrpbwg64yA7LK07ZWc64ukLlxuLy8g7Jqw7ISg7Iic7JyEOiBjZi1jb25uZWN0aW5nLWlwID4geC1mb3J3YXJkZWQtZm9yKOyyqyDtla3rqqkpID4geC1yZWFsLWlwID4geC12ZXJjZWwtZm9yd2FyZGVkLWZvclxuLy8gKHNvbmFtdS50cyBJUF9IRUFERVJTIOyDgeyImOyZgCDrj5nsnbwpXG5jb25zdCBJUF9IRUFERVJfT1JERVIgPSBbXG4gIFwiY2YtY29ubmVjdGluZy1pcFwiLFxuICBcIngtZm9yd2FyZGVkLWZvclwiLFxuICBcIngtcmVhbC1pcFwiLFxuICBcIngtdmVyY2VsLWZvcndhcmRlZC1mb3JcIixcbl0gYXMgY29uc3Q7XG5cbmNvbnN0IHJlYWRIZWFkZXIgPSAoaGVhZGVyczogdW5rbm93biwga2V5OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsID0+IHtcbiAgaWYgKCFoZWFkZXJzKSByZXR1cm4gbnVsbDtcbiAgaWYgKGhlYWRlcnMgaW5zdGFuY2VvZiBIZWFkZXJzKSB7XG4gICAgcmV0dXJuIGhlYWRlcnMuZ2V0KGtleSk7XG4gIH1cbiAgaWYgKHR5cGVvZiBoZWFkZXJzID09PSBcIm9iamVjdFwiKSB7XG4gICAgY29uc3QgbWFwID0gaGVhZGVycyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCB2ID0gbWFwW2tleV0gPz8gbWFwW2tleS50b0xvd2VyQ2FzZSgpXTtcbiAgICBpZiAodHlwZW9mIHYgPT09IFwic3RyaW5nXCIpIHJldHVybiB2O1xuICAgIGlmIChBcnJheS5pc0FycmF5KHYpICYmIHR5cGVvZiB2WzBdID09PSBcInN0cmluZ1wiKSByZXR1cm4gdlswXTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbmNvbnN0IGV4dHJhY3RMb2NhdGlvbkZyb21IZWFkZXJzID0gKGhlYWRlcnM6IHVua25vd24pOiBCdWlsZGVyTG9jYXRpb24gPT4ge1xuICBsZXQgaXBBZGRyZXNzOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgZm9yIChjb25zdCBrZXkgb2YgSVBfSEVBREVSX09SREVSKSB7XG4gICAgY29uc3QgcmF3ID0gcmVhZEhlYWRlcihoZWFkZXJzLCBrZXkpO1xuICAgIGlmICh0eXBlb2YgcmF3ID09PSBcInN0cmluZ1wiICYmIHJhdy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBmaXJzdCA9IHJhdy5zcGxpdChcIixcIilbMF0/LnRyaW0oKTtcbiAgICAgIGlmIChmaXJzdCkge1xuICAgICAgICBpcEFkZHJlc3MgPSBmaXJzdDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnN0IGNvdW50cnlDb2RlID0gcmVhZEhlYWRlcihoZWFkZXJzLCBcImNmLWlwY291bnRyeVwiKTtcbiAgY29uc3QgY2l0eSA9IHJlYWRIZWFkZXIoaGVhZGVycywgXCJjZi1pcGNpdHlcIik7XG4gIHJldHVybiB7XG4gICAgaXBBZGRyZXNzOiBpcEFkZHJlc3MgPz8gdW5kZWZpbmVkLFxuICAgIGNpdHk6IGNpdHkgPz8gdW5kZWZpbmVkLFxuICAgIGNvdW50cnk6IHVuZGVmaW5lZCxcbiAgICBjb3VudHJ5Q29kZTogY291bnRyeUNvZGUgPz8gdW5kZWZpbmVkLFxuICB9O1xufTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gT3JnYW5pemF0aW9uIGhvb2sg656Y7ZWRIO2XrO2NvFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxudHlwZSBPcmdIb29rRm4gPSAoLi4uYXJnczogdW5rbm93bltdKSA9PiBQcm9taXNlPHVua25vd24+O1xuXG4vLyDso7zslrTsp4Qgb3JnYW5pemF0aW9uSG9va3Mg66CI7L2U65Oc7JeQIOuMgO2VtCDtlbTri7kgbmFtZeydmCDquLDsobQgaG9va+ydhCBjaGFpbu2VnOuLpC5cbi8vIGhhbmRsZXLripQgcGF5bG9hZCDqsJ3ssrQo7LKrIOuyiOynuCDsnbjsnpAp66eMIOuwm+yVhOyEnCBhdWRpdCBlbWl07J2EIOyImO2Wie2VnOuLpC5cbmNvbnN0IHdyYXBPcmdIb29rID0gPFBheWxvYWQ+KFxuICBob29rczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIG5hbWU6IHN0cmluZyxcbiAgaGFuZGxlcjogKHBheWxvYWQ6IFBheWxvYWQpID0+IFByb21pc2U8dm9pZD4sXG4pOiB2b2lkID0+IHtcbiAgY29uc3QgcHJldiA9IGhvb2tzW25hbWVdIGFzIE9yZ0hvb2tGbiB8IHVuZGVmaW5lZDtcbiAgaG9va3NbbmFtZV0gPSBhc3luYyAoLi4uYXJnczogdW5rbm93bltdKTogUHJvbWlzZTx1bmtub3duPiA9PiB7XG4gICAgYXdhaXQgaGFuZGxlcihhcmdzWzBdIGFzIFBheWxvYWQpO1xuICAgIGlmIChwcmV2KSByZXR1cm4gcHJldiguLi5hcmdzKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9O1xufTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUGx1Z2luIGVudHJ5XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vKipcbiAqIEJldHRlciBBdXRoIGRhdGFiYXNlSG9va3Mvb3JnYW5pemF0aW9uSG9va3MvbWlkZGxld2FyZeyXkOyEnCDsiJjsp5HtlZxcbiAqIOydtOuypO2KuOulvCBgREIuZ2V0REIoXCJ3XCIpYOuhnCDslrvsnYAga25leOyXkCBgaW5nZXN0QXVkaXRFdmVudGDroZwg7KCB7J6s7ZWc64ukLlxuICpcbiAqIC0gZGFzaChAYmV0dGVyLWF1dGgvaW5mcmEp7J2YIGF1ZGl0LWV2ZW50IOyImOynkSDtm4Ug6rWs7KGw66W8IOywuOqzoO2VtCBTb25hbXUg64K067aAIOyggeyerCDqsr3roZzroZwg7Y+s7YyF7ZWc64ukLlxuICogLSBkYXNo7J2YIGluZnJhIOyXsOqysC9BUEkgZW5kcG9pbnQg7KCc6rO1IOuylOychOuKlCDtj6ztlajtlZjsp4Ag7JWK6rOgLCBhdWRpdC1ldmVudCBlbWl0L2luZ2VzdCDqsr3roZzrp4wg7Jyg7KeA7ZWc64ukLlxuICogLSBzZWN1cml0eSA07KKF7J2AIFIxIOqysOygleyXkCDrlLDrnbwgc2NvcGUgb3V0IChidWlsZGVycy50c+ydmCBUT0RPIOyjvOyEnSDssLjsobApLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc29uYW11QXVkaXRMb2coKTogQmV0dGVyQXV0aFBsdWdpbiB7XG4gIGNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJzb25hbXVcIiwgXCJhdWRpdC1sb2dcIl0pO1xuICBjb25zdCBjYXRhbG9nID0gYnVpbGRBdWRpdEV2ZW50Q2F0YWxvZygpO1xuXG4gIC8vIGRhc2ggNzM5NDog64+Z7J28IOyalOyyreyXkOyEnCDshLjshZgg67KM7YGsIOyCreygnOqwgCDri6Ttmowg67Cc7IOd7ZWgIOuVjCBhbGxfc2Vzc2lvbnNfcmV2b2tlZOulvFxuICAvLyDtlZwg67KI66eMIGVtaXTtlZjrj4TroZ0g7LKY66asIOy7qO2FjeyKpO2KuOulvCDquLDslrXtlZzri6QuXG4gIGNvbnN0IHByb2Nlc3NlZEJ1bGtPcGVyYXRpb25Db250ZXh0cyA9IG5ldyBXZWFrU2V0PG9iamVjdD4oKTtcblxuICBjb25zdCBlbWl0ID0gYXN5bmMgKGV2ZW50OiBBdWRpdExvZ0V2ZW50KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGluZ2VzdEF1ZGl0RXZlbnQoREIuZ2V0REIoXCJ3XCIpLCBldmVudCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoXCJhdWRpdCBldmVudCBpbmdlc3QgZmFpbGVkOiB7ZXJyb3J9XCIsIHsgZXJyb3I6IGVyciB9KTtcbiAgICB9XG4gIH07XG5cbiAgLy8gY3R4LnBhdGggKyBzZXNzaW9u7JeQ7IScIOyCrOyaqeyekCDtirjrpqzqsbDrpbwg64+E7Lac7ZWc64ukKGVudGl0eS5pZOulvCBzdWJqZWN066GcIOyCrOyaqSkuXG4gIGNvbnN0IHRyaWdnZXJGb3IgPSAoY3R4OiBCZXR0ZXJBdXRoUmVxdWVzdEN0eCwgc3ViamVjdFVzZXJJZDogc3RyaW5nKTogQnVpbGRlclRyaWdnZXIgPT5cbiAgICBnZXRUcmlnZ2VySW5mbyhjdHgucGF0aCwgY3R4LmNvbnRleHQuc2Vzc2lvbj8uc2Vzc2lvbj8udXNlcklkID8/IG51bGwsIHN1YmplY3RVc2VySWQpO1xuXG4gIGNvbnN0IGxvY2F0aW9uRm9yID0gKGN0eDogQmV0dGVyQXV0aFJlcXVlc3RDdHgpOiBCdWlsZGVyTG9jYXRpb24gfCB1bmRlZmluZWQgPT5cbiAgICBjdHguY29udGV4dC5sb2NhdGlvbiA/PyB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIHtcbiAgICBpZDogXCJzb25hbXUtYXVkaXQtbG9nXCIsXG5cbiAgICBpbml0KHBsdWdpbkN0eDogdW5rbm93bikge1xuICAgICAgaW5zdGFsbE9yZ2FuaXphdGlvbkhvb2tzKHBsdWdpbkN0eCwgY2F0YWxvZywgZW1pdCwgbG9nZ2VyKTtcblxuICAgICAgLy8gZGFzaCA3MjgzLTc0NDkg66+465+sOiBkYXRhYmFzZUhvb2tzICh1c2VyL3Nlc3Npb24vYWNjb3VudC92ZXJpZmljYXRpb24pLlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGRhdGFiYXNlSG9va3M6IHtcbiAgICAgICAgICAgIHVzZXI6IHtcbiAgICAgICAgICAgICAgY3JlYXRlOiB7XG4gICAgICAgICAgICAgICAgYWZ0ZXI6IGFzeW5jIChyYXdVc2VyOiB1bmtub3duLCByYXdDdHg/OiB1bmtub3duKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjdHggPSBuYXJyb3dSZXF1ZXN0Q3R4KHJhd0N0eCk7XG4gICAgICAgICAgICAgICAgICBpZiAoIWN0eCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgY29uc3QgdXNlciA9IHJhd1VzZXIgYXMgVXNlclNuYXBzaG90O1xuICAgICAgICAgICAgICAgICAgYXdhaXQgZW1pdChcbiAgICAgICAgICAgICAgICAgICAgY2F0YWxvZy51c2VyLnRyYWNrVXNlclNpZ25lZFVwKFxuICAgICAgICAgICAgICAgICAgICAgIHVzZXIsXG4gICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckZvcihjdHgsIHVzZXIuaWQpLFxuICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uRm9yKGN0eCksXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHVwZGF0ZToge1xuICAgICAgICAgICAgICAgIGFmdGVyOiBhc3luYyAocmF3VXNlcjogdW5rbm93biwgcmF3Q3R4PzogdW5rbm93bik6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3QgY3R4ID0gbmFycm93UmVxdWVzdEN0eChyYXdDdHgpO1xuICAgICAgICAgICAgICAgICAgaWYgKCFjdHgpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHVzZXIgPSByYXdVc2VyIGFzIFVzZXJTbmFwc2hvdCAmIHtcbiAgICAgICAgICAgICAgICAgICAgZW1haWxWZXJpZmllZD86IGJvb2xlYW47XG4gICAgICAgICAgICAgICAgICAgIGltYWdlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICBjb25zdCBwYXRoID0gY3R4LnBhdGg7XG4gICAgICAgICAgICAgICAgICBjb25zdCB0cmlnZ2VyID0gdHJpZ2dlckZvcihjdHgsIHVzZXIuaWQpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgbG9jYXRpb24gPSBsb2NhdGlvbkZvcihjdHgpO1xuXG4gICAgICAgICAgICAgICAgICBpZiAobWF0Y2hlc0FueVJvdXRlKHBhdGgsIFtST1VURVMuVVBEQVRFX1VTRVIsIFJPVVRFUy5EQVNIX1VQREFURV9VU0VSXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXBkYXRlZEZpZWxkcyA9IE9iamVjdC5rZXlzKChjdHguYm9keSBhcyBvYmplY3QpID8/IHt9KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNPbmx5SW1hZ2VVcGRhdGUgPVxuICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRGaWVsZHMubGVuZ3RoID09PSAxICYmIHVwZGF0ZWRGaWVsZHNbMF0gPT09IFwiaW1hZ2VcIjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNPbmx5RW1haWxWZXJpZmllZFVwZGF0ZSA9XG4gICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZEZpZWxkcy5sZW5ndGggPT09IDEgJiYgdXBkYXRlZEZpZWxkc1swXSA9PT0gXCJlbWFpbFZlcmlmaWVkXCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhc0VtYWlsVmVyaWZpZWRVcGRhdGUgPSB1cGRhdGVkRmllbGRzLmluY2x1ZGVzKFwiZW1haWxWZXJpZmllZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzT25seUVtYWlsVmVyaWZpZWRVcGRhdGUgJiYgdXNlci5lbWFpbFZlcmlmaWVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZW1pdChjYXRhbG9nLnVzZXIudHJhY2tVc2VyRW1haWxWZXJpZmllZCh1c2VyLCB0cmlnZ2VyLCBsb2NhdGlvbikpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzT25seUltYWdlVXBkYXRlICYmIHVzZXIuaW1hZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBlbWl0KFxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0YWxvZy51c2VyLnRyYWNrVXNlclByb2ZpbGVJbWFnZVVwZGF0ZWQodXNlciwgdHJpZ2dlciwgbG9jYXRpb24pLFxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzT25seUltYWdlVXBkYXRlICYmICFpc09ubHlFbWFpbFZlcmlmaWVkVXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZW1pdChcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGFsb2cudXNlci50cmFja1VzZXJQcm9maWxlVXBkYXRlZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZEZpZWxkcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0VtYWlsVmVyaWZpZWRVcGRhdGUgJiYgdXNlci5lbWFpbFZlcmlmaWVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBlbWl0KGNhdGFsb2cudXNlci50cmFja1VzZXJFbWFpbFZlcmlmaWVkKHVzZXIsIHRyaWdnZXIsIGxvY2F0aW9uKSk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1hdGNoZXNBbnlSb3V0ZShwYXRoLCBbUk9VVEVTLkNIQU5HRV9FTUFJTF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRGaWVsZHMgPSBPYmplY3Qua2V5cygoY3R4LmJvZHkgYXMgb2JqZWN0KSA/PyB7fSk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGVtaXQoXG4gICAgICAgICAgICAgICAgICAgICAgY2F0YWxvZy51c2VyLnRyYWNrVXNlclByb2ZpbGVVcGRhdGVkKHVzZXIsIHVwZGF0ZWRGaWVsZHMsIHRyaWdnZXIsIGxvY2F0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzQW55Um91dGUocGF0aCwgW1JPVVRFUy5WRVJJRllfRU1BSUxdKSAmJiB1c2VyLmVtYWlsVmVyaWZpZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZW1pdChjYXRhbG9nLnVzZXIudHJhY2tVc2VyRW1haWxWZXJpZmllZCh1c2VyLCB0cmlnZ2VyLCBsb2NhdGlvbikpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBtYXRjaGVzQW55Um91dGUocGF0aCwgW1JPVVRFUy5BRE1JTl9CQU5fVVNFUl0pICYmXG4gICAgICAgICAgICAgICAgICAgIFwiYmFubmVkXCIgaW4gdXNlciAmJlxuICAgICAgICAgICAgICAgICAgICB1c2VyLmJhbm5lZFxuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGVtaXQoY2F0YWxvZy51c2VyLnRyYWNrVXNlckJhbm5lZCh1c2VyLCB0cmlnZ2VyLCBsb2NhdGlvbikpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBtYXRjaGVzQW55Um91dGUocGF0aCwgW1JPVVRFUy5BRE1JTl9VTkJBTl9VU0VSXSkgJiZcbiAgICAgICAgICAgICAgICAgICAgXCJiYW5uZWRcIiBpbiB1c2VyICYmXG4gICAgICAgICAgICAgICAgICAgICF1c2VyLmJhbm5lZFxuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGVtaXQoY2F0YWxvZy51c2VyLnRyYWNrVXNlclVuQmFubmVkKHVzZXIsIHRyaWdnZXIsIGxvY2F0aW9uKSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZGVsZXRlOiB7XG4gICAgICAgICAgICAgICAgYWZ0ZXI6IGFzeW5jIChyYXdVc2VyOiB1bmtub3duLCByYXdDdHg/OiB1bmtub3duKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjdHggPSBuYXJyb3dSZXF1ZXN0Q3R4KHJhd0N0eCk7XG4gICAgICAgICAgICAgICAgICBpZiAoIWN0eCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgY29uc3QgdXNlciA9IHJhd1VzZXIgYXMgVXNlclNuYXBzaG90O1xuICAgICAgICAgICAgICAgICAgYXdhaXQgZW1pdChcbiAgICAgICAgICAgICAgICAgICAgY2F0YWxvZy51c2VyLnRyYWNrVXNlckRlbGV0ZWQodXNlciwgdHJpZ2dlckZvcihjdHgsIHVzZXIuaWQpLCBsb2NhdGlvbkZvcihjdHgpKSxcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXNzaW9uOiB7XG4gICAgICAgICAgICAgIGNyZWF0ZToge1xuICAgICAgICAgICAgICAgIGJlZm9yZTogYXN5bmMgKFxuICAgICAgICAgICAgICAgICAgcmF3U2Vzc2lvbjogdW5rbm93bixcbiAgICAgICAgICAgICAgICAgIHJhd0N0eD86IHVua25vd24sXG4gICAgICAgICAgICAgICAgKTogUHJvbWlzZTx7IGRhdGE6IHsgbG9naW5NZXRob2Q6IHN0cmluZyB8IG51bGwgfSB9IHwgdW5kZWZpbmVkPiA9PiB7XG4gICAgICAgICAgICAgICAgICB2b2lkIHJhd1Nlc3Npb247XG4gICAgICAgICAgICAgICAgICBjb25zdCBjdHggPSBuYXJyb3dSZXF1ZXN0Q3R4KHJhd0N0eCk7XG4gICAgICAgICAgICAgICAgICBpZiAoIWN0eCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHsgbG9naW5NZXRob2Q6IGdldExvZ2luTWV0aG9kKGN0eC5wYXRoLCBjdHgucGFyYW1zPy5pZCkgfSB9O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYWZ0ZXI6IGFzeW5jIChyYXdTZXNzaW9uOiB1bmtub3duLCByYXdDdHg/OiB1bmtub3duKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjdHggPSBuYXJyb3dSZXF1ZXN0Q3R4KHJhd0N0eCk7XG4gICAgICAgICAgICAgICAgICBpZiAoIWN0eCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IHJhd1Nlc3Npb24gYXMgU2Vzc2lvblNuYXBzaG90O1xuICAgICAgICAgICAgICAgICAgaWYgKCFzZXNzaW9uLnVzZXJJZCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgY29uc3QgbG9jYXRpb24gPSBsb2NhdGlvbkZvcihjdHgpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgbG9naW5NZXRob2QgPSBnZXRMb2dpbk1ldGhvZChjdHgucGF0aCwgY3R4LnBhcmFtcz8uaWQpID8/IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGVucmljaGVkU2Vzc2lvbjogU2Vzc2lvblNuYXBzaG90ID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi5zZXNzaW9uLFxuICAgICAgICAgICAgICAgICAgICBsb2dpbk1ldGhvZDogbG9naW5NZXRob2QgPz8gc2Vzc2lvbi5sb2dpbk1ldGhvZCA/PyBudWxsLFxuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHVzZXIgPSBhd2FpdCBmZXRjaFVzZXJCeShjdHgsIFwiaWRcIiwgc2Vzc2lvbi51c2VySWQpO1xuXG4gICAgICAgICAgICAgICAgICBsZXQgdHJpZ2dlcjogQnVpbGRlclRyaWdnZXI7XG4gICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZXNBbnlSb3V0ZShjdHgucGF0aCwgW1xuICAgICAgICAgICAgICAgICAgICAgIFJPVVRFUy5TSUdOX0lOLFxuICAgICAgICAgICAgICAgICAgICAgIFJPVVRFUy5TSUdOX1VQLFxuICAgICAgICAgICAgICAgICAgICAgIFJPVVRFUy5TSUdOX0lOX1NPQ0lBTF9DQUxMQkFDSyxcbiAgICAgICAgICAgICAgICAgICAgICBST1VURVMuU0lHTl9JTl9PQVVUSF9DQUxMQkFDSyxcbiAgICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyID0gZ2V0VHJpZ2dlckluZm8oY3R4LnBhdGgsIHNlc3Npb24udXNlcklkLCBzZXNzaW9uLnVzZXJJZCk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGVtaXQoXG4gICAgICAgICAgICAgICAgICAgICAgY2F0YWxvZy5zZXNzaW9uLnRyYWNrVXNlclNpZ25lZEluKGVucmljaGVkU2Vzc2lvbiwgdXNlciwgdHJpZ2dlciwgbG9jYXRpb24pLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlciA9IHRyaWdnZXJGb3IoY3R4LCBzZXNzaW9uLnVzZXJJZCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBhd2FpdCBlbWl0KFxuICAgICAgICAgICAgICAgICAgICBjYXRhbG9nLnNlc3Npb24udHJhY2tTZXNzaW9uQ3JlYXRlZChlbnJpY2hlZFNlc3Npb24sIHVzZXIsIHRyaWdnZXIsIGxvY2F0aW9uKSxcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBpZiAoaXNOb25FbXB0eVN0cmluZyhzZXNzaW9uLmltcGVyc29uYXRlZEJ5KSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbXBlcnNvbmF0b3IgPSBhd2FpdCBmZXRjaFVzZXJCeShjdHgsIFwiaWRcIiwgc2Vzc2lvbi5pbXBlcnNvbmF0ZWRCeSk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGVtaXQoXG4gICAgICAgICAgICAgICAgICAgICAgY2F0YWxvZy5zZXNzaW9uLnRyYWNrVXNlckltcGVyc29uYXRlZChcbiAgICAgICAgICAgICAgICAgICAgICAgIGVucmljaGVkU2Vzc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbXBlcnNvbmF0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJlZEJ5OiBzZXNzaW9uLmltcGVyc29uYXRlZEJ5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyQ29udGV4dDogdHJpZ2dlci50cmlnZ2VyQ29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGRlbGV0ZToge1xuICAgICAgICAgICAgICAgIGFmdGVyOiBhc3luYyAocmF3U2Vzc2lvbjogdW5rbm93biwgcmF3Q3R4PzogdW5rbm93bik6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3QgY3R4ID0gbmFycm93UmVxdWVzdEN0eChyYXdDdHgpO1xuICAgICAgICAgICAgICAgICAgaWYgKCFjdHgpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNlc3Npb24gPSByYXdTZXNzaW9uIGFzIFNlc3Npb25TbmFwc2hvdDtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGxvY2F0aW9uID0gbG9jYXRpb25Gb3IoY3R4KTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGVucmljaGVkU2Vzc2lvbjogU2Vzc2lvblNuYXBzaG90ID0geyAuLi5zZXNzaW9uIH07XG4gICAgICAgICAgICAgICAgICBjb25zdCB1c2VyID0gYXdhaXQgZmV0Y2hVc2VyQnkoY3R4LCBcImlkXCIsIHNlc3Npb24udXNlcklkKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHRyaWdnZXIgPSB0cmlnZ2VyRm9yKGN0eCwgc2Vzc2lvbi51c2VySWQpO1xuICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBtYXRjaGVzQW55Um91dGUoY3R4LnBhdGgsIFtcbiAgICAgICAgICAgICAgICAgICAgICBST1VURVMuUkVWT0tFX0FMTF9TRVNTSU9OUyxcbiAgICAgICAgICAgICAgICAgICAgICBST1VURVMuQURNSU5fUkVWT0tFX1VTRVJfU0VTU0lPTlMsXG4gICAgICAgICAgICAgICAgICAgICAgUk9VVEVTLkRBU0hfUkVWT0tFX1NFU1NJT05TX0FMTCxcbiAgICAgICAgICAgICAgICAgICAgICBST1VURVMuREFTSF9CQU5fVVNFUixcbiAgICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXByb2Nlc3NlZEJ1bGtPcGVyYXRpb25Db250ZXh0cy5oYXMoY3R4KSkge1xuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGVtaXQoXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRhbG9nLnNlc3Npb24udHJhY2tTZXNzaW9uUmV2b2tlZEFsbChlbnJpY2hlZFNlc3Npb24sIHVzZXIsIHRyaWdnZXIpLFxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkQnVsa09wZXJhdGlvbkNvbnRleHRzLmFkZChjdHgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1hdGNoZXNBbnlSb3V0ZShjdHgucGF0aCwgW1JPVVRFUy5TSUdOX09VVF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGVtaXQoXG4gICAgICAgICAgICAgICAgICAgICAgY2F0YWxvZy5zZXNzaW9uLnRyYWNrVXNlclNpZ25lZE91dChlbnJpY2hlZFNlc3Npb24sIHVzZXIsIHRyaWdnZXIsIGxvY2F0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGVtaXQoXG4gICAgICAgICAgICAgICAgICAgICAgY2F0YWxvZy5zZXNzaW9uLnRyYWNrU2Vzc2lvblJldm9rZWQoZW5yaWNoZWRTZXNzaW9uLCB1c2VyLCB0cmlnZ2VyLCBsb2NhdGlvbiksXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBpZiAoaXNOb25FbXB0eVN0cmluZyhzZXNzaW9uLmltcGVyc29uYXRlZEJ5KSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbXBlcnNvbmF0b3IgPSBhd2FpdCBmZXRjaFVzZXJCeShjdHgsIFwiaWRcIiwgc2Vzc2lvbi5pbXBlcnNvbmF0ZWRCeSk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGVtaXQoXG4gICAgICAgICAgICAgICAgICAgICAgY2F0YWxvZy5zZXNzaW9uLnRyYWNrVXNlckltcGVyc29uYXRpb25TdG9wKFxuICAgICAgICAgICAgICAgICAgICAgICAgZW5yaWNoZWRTZXNzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGltcGVyc29uYXRvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWNjb3VudDoge1xuICAgICAgICAgICAgICBjcmVhdGU6IHtcbiAgICAgICAgICAgICAgICBhZnRlcjogYXN5bmMgKHJhd0FjY291bnQ6IHVua25vd24sIHJhd0N0eD86IHVua25vd24pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGN0eCA9IG5hcnJvd1JlcXVlc3RDdHgocmF3Q3R4KTtcbiAgICAgICAgICAgICAgICAgIGlmICghY3R4KSByZXR1cm47XG4gICAgICAgICAgICAgICAgICBjb25zdCBhY2NvdW50ID0gcmF3QWNjb3VudCBhcyBBY2NvdW50U25hcHNob3Q7XG4gICAgICAgICAgICAgICAgICBpZiAoIWFjY291bnQudXNlcklkKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICBjb25zdCB1c2VyID0gYXdhaXQgZmV0Y2hVc2VyQnkoY3R4LCBcImlkXCIsIGFjY291bnQudXNlcklkKTtcbiAgICAgICAgICAgICAgICAgIGF3YWl0IGVtaXQoXG4gICAgICAgICAgICAgICAgICAgIGNhdGFsb2cuYWNjb3VudC50cmFja0FjY291bnRMaW5raW5nKFxuICAgICAgICAgICAgICAgICAgICAgIGFjY291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgdXNlcixcbiAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyRm9yKGN0eCwgYWNjb3VudC51c2VySWQpLFxuICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uRm9yKGN0eCksXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHVwZGF0ZToge1xuICAgICAgICAgICAgICAgIGFmdGVyOiBhc3luYyAocmF3QWNjb3VudDogdW5rbm93biwgcmF3Q3R4PzogdW5rbm93bik6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3QgY3R4ID0gbmFycm93UmVxdWVzdEN0eChyYXdDdHgpO1xuICAgICAgICAgICAgICAgICAgaWYgKCFjdHgpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGFjY291bnQgPSByYXdBY2NvdW50IGFzIEFjY291bnRTbmFwc2hvdDtcbiAgICAgICAgICAgICAgICAgIGlmICghYWNjb3VudC51c2VySWQpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgIW1hdGNoZXNBbnlSb3V0ZShjdHgucGF0aCwgW1xuICAgICAgICAgICAgICAgICAgICAgIFJPVVRFUy5DSEFOR0VfUEFTU1dPUkQsXG4gICAgICAgICAgICAgICAgICAgICAgUk9VVEVTLlNFVF9QQVNTV09SRCxcbiAgICAgICAgICAgICAgICAgICAgICBST1VURVMuUkVTRVRfUEFTU1dPUkQsXG4gICAgICAgICAgICAgICAgICAgICAgUk9VVEVTLkFETUlOX1NFVF9QQVNTV09SRCxcbiAgICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjb25zdCB1c2VyID0gYXdhaXQgZmV0Y2hVc2VyQnkoY3R4LCBcImlkXCIsIGFjY291bnQudXNlcklkKTtcbiAgICAgICAgICAgICAgICAgIGF3YWl0IGVtaXQoXG4gICAgICAgICAgICAgICAgICAgIGNhdGFsb2cuYWNjb3VudC50cmFja0FjY291bnRQYXNzd29yZENoYW5nZShcbiAgICAgICAgICAgICAgICAgICAgICBhY2NvdW50LFxuICAgICAgICAgICAgICAgICAgICAgIHVzZXIsXG4gICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckZvcihjdHgsIGFjY291bnQudXNlcklkKSxcbiAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbkZvcihjdHgpLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBkZWxldGU6IHtcbiAgICAgICAgICAgICAgICBhZnRlcjogYXN5bmMgKHJhd0FjY291bnQ6IHVua25vd24sIHJhd0N0eD86IHVua25vd24pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGN0eCA9IG5hcnJvd1JlcXVlc3RDdHgocmF3Q3R4KTtcbiAgICAgICAgICAgICAgICAgIGlmICghY3R4KSByZXR1cm47XG4gICAgICAgICAgICAgICAgICBjb25zdCBhY2NvdW50ID0gcmF3QWNjb3VudCBhcyBBY2NvdW50U25hcHNob3Q7XG4gICAgICAgICAgICAgICAgICBpZiAoIWFjY291bnQudXNlcklkKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICBjb25zdCB1c2VyID0gYXdhaXQgZmV0Y2hVc2VyQnkoY3R4LCBcImlkXCIsIGFjY291bnQudXNlcklkKTtcbiAgICAgICAgICAgICAgICAgIGF3YWl0IGVtaXQoXG4gICAgICAgICAgICAgICAgICAgIGNhdGFsb2cuYWNjb3VudC50cmFja0FjY291bnRVbmxpbmsoXG4gICAgICAgICAgICAgICAgICAgICAgYWNjb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICB1c2VyLFxuICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJGb3IoY3R4LCBhY2NvdW50LnVzZXJJZCksXG4gICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25Gb3IoY3R4KSxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJpZmljYXRpb246IHtcbiAgICAgICAgICAgICAgY3JlYXRlOiB7XG4gICAgICAgICAgICAgICAgYWZ0ZXI6IGFzeW5jIChyYXdWZXJpZmljYXRpb246IHVua25vd24sIHJhd0N0eD86IHVua25vd24pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGN0eCA9IG5hcnJvd1JlcXVlc3RDdHgocmF3Q3R4KTtcbiAgICAgICAgICAgICAgICAgIGlmICghY3R4KSByZXR1cm47XG4gICAgICAgICAgICAgICAgICBpZiAoIW1hdGNoZXNBbnlSb3V0ZShjdHgucGF0aCwgW1JPVVRFUy5SRVFVRVNUX1BBU1NXT1JEX1JFU0VUXSkpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbiA9IHJhd1ZlcmlmaWNhdGlvbiBhcyBWZXJpZmljYXRpb25TbmFwc2hvdDtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNlc3Npb25Vc2VySWQgPSBjdHguY29udGV4dC5zZXNzaW9uPy51c2VyPy5pZCA/PyBcInVua25vd25cIjtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHRyaWdnZXIgPSBnZXRUcmlnZ2VySW5mbyhjdHgucGF0aCwgc2Vzc2lvblVzZXJJZCwgc2Vzc2lvblVzZXJJZCk7XG4gICAgICAgICAgICAgICAgICBjb25zdCB1c2VyID0gYXdhaXQgZmV0Y2hVc2VyQnkoY3R4LCBcImlkXCIsIHZlcmlmaWNhdGlvbi52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICBhd2FpdCBlbWl0KFxuICAgICAgICAgICAgICAgICAgICBjYXRhbG9nLnZlcmlmaWNhdGlvbi50cmFja1Bhc3N3b3JkUmVzZXRSZXF1ZXN0KFxuICAgICAgICAgICAgICAgICAgICAgIHZlcmlmaWNhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICB1c2VyLFxuICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIsXG4gICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25Gb3IoY3R4KSxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZGVsZXRlOiB7XG4gICAgICAgICAgICAgICAgYWZ0ZXI6IGFzeW5jIChyYXdWZXJpZmljYXRpb246IHVua25vd24sIHJhd0N0eD86IHVua25vd24pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGN0eCA9IG5hcnJvd1JlcXVlc3RDdHgocmF3Q3R4KTtcbiAgICAgICAgICAgICAgICAgIGlmICghY3R4KSByZXR1cm47XG4gICAgICAgICAgICAgICAgICBpZiAoIW1hdGNoZXNBbnlSb3V0ZShjdHgucGF0aCwgW1JPVVRFUy5SRVNFVF9QQVNTV09SRF0pKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICBjb25zdCB2ZXJpZmljYXRpb24gPSByYXdWZXJpZmljYXRpb24gYXMgVmVyaWZpY2F0aW9uU25hcHNob3Q7XG4gICAgICAgICAgICAgICAgICBjb25zdCBzZXNzaW9uVXNlcklkID0gY3R4LmNvbnRleHQuc2Vzc2lvbj8udXNlcj8uaWQgPz8gXCJ1bmtub3duXCI7XG4gICAgICAgICAgICAgICAgICBjb25zdCB0cmlnZ2VyID0gZ2V0VHJpZ2dlckluZm8oY3R4LnBhdGgsIHNlc3Npb25Vc2VySWQsIHNlc3Npb25Vc2VySWQpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgdXNlciA9IGF3YWl0IGZldGNoVXNlckJ5KGN0eCwgXCJpZFwiLCB2ZXJpZmljYXRpb24udmFsdWUpO1xuICAgICAgICAgICAgICAgICAgYXdhaXQgZW1pdChcbiAgICAgICAgICAgICAgICAgICAgY2F0YWxvZy52ZXJpZmljYXRpb24udHJhY2tQYXNzd29yZFJlc2V0UmVxdWVzdENvbXBsZXRpb24oXG4gICAgICAgICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgIHVzZXIsXG4gICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcixcbiAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbkZvcihjdHgpLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9LFxuXG4gICAgaG9va3M6IHtcbiAgICAgIGJlZm9yZTogW1xuICAgICAgICB7XG4gICAgICAgICAgLy8gZGFzaCDsoJzqsbDroZwg7IKs65287KeEIGxvY2F0aW9uIOqzteq4iSDqsr3roZzrpbwg67O16rWs7ZWc64ukLlxuICAgICAgICAgIC8vIOuqqOuToCDsmpTssq3sl5DshJwgY3R4LmNvbnRleHQubG9jYXRpb27snYQg7LGE7JuMIOydtO2bhCDruYzrjZTrk6TsnbQgaXBBZGRyZXNzL2NpdHkvY291bnRyeUNvZGXrpbwg6riw66Gd7ZWgIOyImCDsnojqsowg7ZWc64ukLlxuICAgICAgICAgIG1hdGNoZXI6ICgpID0+IHRydWUsXG4gICAgICAgICAgaGFuZGxlcjogY3JlYXRlQXV0aE1pZGRsZXdhcmUoYXN5bmMgKHJhd0N0eCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gcmF3Q3R4IGFzIHtcbiAgICAgICAgICAgICAgaGVhZGVycz86IHVua25vd247XG4gICAgICAgICAgICAgIHJlcXVlc3Q/OiB7IGhlYWRlcnM/OiB1bmtub3duIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIGNvbnRleHQ/OiB7IGxvY2F0aW9uPzogQnVpbGRlckxvY2F0aW9uIHwgbnVsbCB9ICYgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKCFjdHguY29udGV4dCkgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IGN0eC5oZWFkZXJzID8/IGN0eC5yZXF1ZXN0Py5oZWFkZXJzO1xuICAgICAgICAgICAgY3R4LmNvbnRleHQubG9jYXRpb24gPSBleHRyYWN0TG9jYXRpb25Gcm9tSGVhZGVycyhoZWFkZXJzKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBhZnRlcjogW1xuICAgICAgICB7XG4gICAgICAgICAgLy8gZGFzaCA3NDYyLTc0ODcg66+465+sOiB2ZXJpZmljYXRpb24gZW1haWwgc2VuZCwgc2lnbi1pbiBhdHRlbXB0cy5cbiAgICAgICAgICAvLyBHRVQg7JqU7LKt7J2AIOy9nOuwsSDqsr3roZzrp4wg7Ya16rO87Iuc7YKo64ukLlxuICAgICAgICAgIG1hdGNoZXI6IChjdHg6IHVua25vd24pOiBib29sZWFuID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGMgPSBjdHggYXMgeyByZXF1ZXN0PzogeyBtZXRob2Q/OiBzdHJpbmc7IHVybD86IHN0cmluZyB9IH07XG4gICAgICAgICAgICBpZiAoYy5yZXF1ZXN0Py5tZXRob2QgIT09IFwiR0VUXCIpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgaWYgKCFjLnJlcXVlc3QudXJsKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBwID0gbmV3IFVSTChjLnJlcXVlc3QudXJsKS5wYXRobmFtZTtcbiAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXNBbnlSb3V0ZShwLCBbXG4gICAgICAgICAgICAgICAgUk9VVEVTLlNJR05fSU5fU09DSUFMX0NBTExCQUNLLFxuICAgICAgICAgICAgICAgIFJPVVRFUy5TSUdOX0lOX09BVVRIX0NBTExCQUNLLFxuICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBoYW5kbGVyOiBjcmVhdGVBdXRoTWlkZGxld2FyZShhc3luYyAocmF3Q3R4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSBuYXJyb3dSZXF1ZXN0Q3R4KHJhd0N0eCk7XG4gICAgICAgICAgICBpZiAoIWN0eCkgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3Qgc2Vzc2lvblVzZXIgPSBjdHguY29udGV4dC5zZXNzaW9uPy51c2VyO1xuICAgICAgICAgICAgY29uc3Qgc2Vzc2lvblVzZXJJZCA9IHNlc3Npb25Vc2VyPy5pZCA/PyBcInVua25vd25cIjtcbiAgICAgICAgICAgIGNvbnN0IHRyaWdnZXIgPSBnZXRUcmlnZ2VySW5mbyhjdHgucGF0aCwgc2Vzc2lvblVzZXJJZCwgc2Vzc2lvblVzZXJJZCk7XG4gICAgICAgICAgICBjb25zdCBsb2NhdGlvbiA9IGxvY2F0aW9uRm9yKGN0eCk7XG4gICAgICAgICAgICBjb25zdCByZXR1cm5lZCA9IGN0eC5jb250ZXh0LnJldHVybmVkO1xuICAgICAgICAgICAgY29uc3QgaXNFcnJvcmVkID0gcmV0dXJuZWQgaW5zdGFuY2VvZiBFcnJvcjtcblxuICAgICAgICAgICAgLy8gdmVyaWZpY2F0aW9uIGVtYWlsIHNlbnRcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgbWF0Y2hlc0FueVJvdXRlKGN0eC5wYXRoLCBbUk9VVEVTLlNFTkRfVkVSSUZJQ0FUSU9OX0VNQUlMXSkgJiZcbiAgICAgICAgICAgICAgY3R4LmNvbnRleHQuc2Vzc2lvbiAmJlxuICAgICAgICAgICAgICAhaXNFcnJvcmVkXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbkVudGl0eSA9IGN0eC5jb250ZXh0LnNlc3Npb24uc2Vzc2lvbiBhcyBTZXNzaW9uU25hcHNob3QgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIGNvbnN0IHVzZXIgPSBjdHguY29udGV4dC5zZXNzaW9uLnVzZXIgYXNcbiAgICAgICAgICAgICAgICB8IHsgbmFtZT86IHN0cmluZzsgZW1haWw/OiBzdHJpbmcgfVxuICAgICAgICAgICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICBpZiAoc2Vzc2lvbkVudGl0eSAmJiB1c2VyKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgZW1pdChcbiAgICAgICAgICAgICAgICAgIGNhdGFsb2cuc2Vzc2lvbi50cmFja0VtYWlsVmVyaWZpY2F0aW9uU2VudChzZXNzaW9uRW50aXR5LCB1c2VyLCB0cmlnZ2VyKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGJvZHkgPVxuICAgICAgICAgICAgICAoY3R4LmJvZHkgYXMgeyBlbWFpbD86IHN0cmluZzsgcHJvdmlkZXI/OiBzdHJpbmc7IGlkVG9rZW4/OiBzdHJpbmcgfSB8IG51bGwpID8/IG51bGw7XG4gICAgICAgICAgICAvLyBlbWFpbCBzaWduLWluIGF0dGVtcHQgZmFpbGVkXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIG1hdGNoZXNBbnlSb3V0ZShjdHgucGF0aCwgW1JPVVRFUy5TSUdOX0lOX0VNQUlMLCBST1VURVMuU0lHTl9JTl9FTUFJTF9PVFBdKSAmJlxuICAgICAgICAgICAgICBpc0Vycm9yZWQgJiZcbiAgICAgICAgICAgICAgYm9keT8uZW1haWxcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBjb25zdCB1c2VyID0gYXdhaXQgZmV0Y2hVc2VyQnkoY3R4LCBcImVtYWlsXCIsIGJvZHkuZW1haWwpO1xuICAgICAgICAgICAgICBhd2FpdCBlbWl0KFxuICAgICAgICAgICAgICAgIGNhdGFsb2cuc2Vzc2lvbi50cmFja0VtYWlsU2lnbkluQXR0ZW1wdChcbiAgICAgICAgICAgICAgICAgIHsgZW1haWw6IGJvZHkuZW1haWwsIGxvZ2luTWV0aG9kOiBnZXRMb2dpbk1ldGhvZChjdHgucGF0aCwgY3R4LnBhcmFtcz8uaWQpIH0sXG4gICAgICAgICAgICAgICAgICB1c2VyLFxuICAgICAgICAgICAgICAgICAgdHJpZ2dlcixcbiAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBzb2NpYWwgc2lnbi1pbiBhdHRlbXB0IGZhaWxlZCAoUE9TVClcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgbWF0Y2hlc0FueVJvdXRlKGN0eC5wYXRoLCBbUk9VVEVTLlNJR05fSU5fU09DSUFMXSkgJiZcbiAgICAgICAgICAgICAgaXNFcnJvcmVkICYmXG4gICAgICAgICAgICAgIGJvZHk/LnByb3ZpZGVyICYmXG4gICAgICAgICAgICAgIGJvZHk/LmlkVG9rZW5cbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBhd2FpdCBlbWl0KFxuICAgICAgICAgICAgICAgIGNhdGFsb2cuc2Vzc2lvbi50cmFja1NvY2lhbFNpZ25JbkF0dGVtcHQoXG4gICAgICAgICAgICAgICAgICB7IGxvZ2luTWV0aG9kOiBnZXRMb2dpbk1ldGhvZChjdHgucGF0aCwgY3R4LnBhcmFtcz8uaWQpIH0sXG4gICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgdHJpZ2dlcixcbiAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBzb2NpYWwgcmVkaXJlY3Rpb24gY2FsbGJhY2sgZmFpbGVkIChHRVQpXG4gICAgICAgICAgICBpZiAobWF0Y2hlc0FueVJvdXRlKGN0eC5wYXRoLCBbUk9VVEVTLlNJR05fSU5fU09DSUFMX0NBTExCQUNLXSkgJiYgaXNFcnJvcmVkKSB7XG4gICAgICAgICAgICAgIGF3YWl0IGVtaXQoXG4gICAgICAgICAgICAgICAgY2F0YWxvZy5zZXNzaW9uLnRyYWNrU29jaWFsU2lnbkluUmVkaXJlY3Rpb25BdHRlbXB0KFxuICAgICAgICAgICAgICAgICAgeyBsb2dpbk1ldGhvZDogZ2V0TG9naW5NZXRob2QoY3R4LnBhdGgsIGN0eC5wYXJhbXM/LmlkKSB9LFxuICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgIHRyaWdnZXIsXG4gICAgICAgICAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9LFxuICB9O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBPcmdhbml6YXRpb24gaG9vayDtlanshLEgKG9yZ2FuaXphdGlvbiDtlIzrn6zqt7jsnbjsnbQg7Zmc7ISx7ZmU65CcIOqyveyasOyXkOunjClcbi8vIGRhc2ggNzE5Mi03MjgxIOuvuOufrC5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbnR5cGUgRXZlbnRFbWl0dGVyID0gKGV2ZW50OiBBdWRpdExvZ0V2ZW50KSA9PiBQcm9taXNlPHZvaWQ+O1xudHlwZSBBdWRpdExvZ2dlciA9IFJldHVyblR5cGU8dHlwZW9mIGdldExvZ2dlcj47XG5cbmZ1bmN0aW9uIGluc3RhbGxPcmdhbml6YXRpb25Ib29rcyhcbiAgcGx1Z2luQ3R4OiB1bmtub3duLFxuICBjYXRhbG9nOiBSZXR1cm5UeXBlPHR5cGVvZiBidWlsZEF1ZGl0RXZlbnRDYXRhbG9nPixcbiAgZW1pdDogRXZlbnRFbWl0dGVyLFxuICBsb2dnZXI6IEF1ZGl0TG9nZ2VyLFxuKTogdm9pZCB7XG4gIGNvbnN0IGdldFBsdWdpbiA9IChwbHVnaW5DdHggYXMgeyBnZXRQbHVnaW4/OiAoaWQ6IHN0cmluZykgPT4gdW5rbm93biB9KT8uZ2V0UGx1Z2luO1xuICBjb25zdCBvcmdhbml6YXRpb25QbHVnaW4gPVxuICAgIHR5cGVvZiBnZXRQbHVnaW4gPT09IFwiZnVuY3Rpb25cIiA/IGdldFBsdWdpbi5jYWxsKHBsdWdpbkN0eCwgXCJvcmdhbml6YXRpb25cIikgOiBudWxsO1xuXG4gIGlmICghb3JnYW5pemF0aW9uUGx1Z2luIHx8IHR5cGVvZiBvcmdhbml6YXRpb25QbHVnaW4gIT09IFwib2JqZWN0XCIpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJvcmdhbml6YXRpb24gcGx1Z2luIG5vdCBhY3RpdmU7IHNraXBwaW5nIGluc3RydW1lbnRhdGlvblwiKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBvcmdQbHVnaW4gPSBvcmdhbml6YXRpb25QbHVnaW4gYXMge1xuICAgIG9wdGlvbnM/OiB7IG9yZ2FuaXphdGlvbkhvb2tzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfTtcbiAgfTtcbiAgb3JnUGx1Z2luLm9wdGlvbnMgPSBvcmdQbHVnaW4ub3B0aW9ucyA/PyB7fTtcbiAgY29uc3QgaG9va3MgPSAob3JnUGx1Z2luLm9wdGlvbnMub3JnYW5pemF0aW9uSG9va3MgPSBvcmdQbHVnaW4ub3B0aW9ucy5vcmdhbml6YXRpb25Ib29rcyA/PyB7fSk7XG5cbiAgd3JhcE9yZ0hvb2s8eyBvcmdhbml6YXRpb246IE9yZ2FuaXphdGlvblNuYXBzaG90OyB1c2VyOiBVc2VyU25hcHNob3QgfT4oXG4gICAgaG9va3MsXG4gICAgXCJhZnRlckNyZWF0ZU9yZ2FuaXphdGlvblwiLFxuICAgIGFzeW5jIChwKSA9PlxuICAgICAgZW1pdChcbiAgICAgICAgY2F0YWxvZy5vcmdhbml6YXRpb24udHJhY2tPcmdhbml6YXRpb25DcmVhdGVkKFxuICAgICAgICAgIHAub3JnYW5pemF0aW9uLFxuICAgICAgICAgIGdldE9yZ2FuaXphdGlvblRyaWdnZXJJbmZvKHAudXNlciksXG4gICAgICAgICksXG4gICAgICApLFxuICApO1xuXG4gIHdyYXBPcmdIb29rPHsgb3JnYW5pemF0aW9uPzogT3JnYW5pemF0aW9uU25hcHNob3Q7IHVzZXI6IFVzZXJTbmFwc2hvdCB9PihcbiAgICBob29rcyxcbiAgICBcImFmdGVyVXBkYXRlT3JnYW5pemF0aW9uXCIsXG4gICAgYXN5bmMgKHApID0+IHtcbiAgICAgIGlmICghcC5vcmdhbml6YXRpb24pIHJldHVybjtcbiAgICAgIGF3YWl0IGVtaXQoXG4gICAgICAgIGNhdGFsb2cub3JnYW5pemF0aW9uLnRyYWNrT3JnYW5pemF0aW9uVXBkYXRlZChcbiAgICAgICAgICBwLm9yZ2FuaXphdGlvbixcbiAgICAgICAgICBnZXRPcmdhbml6YXRpb25UcmlnZ2VySW5mbyhwLnVzZXIpLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9LFxuICApO1xuXG4gIHdyYXBPcmdIb29rPHtcbiAgICBvcmdhbml6YXRpb246IE9yZ2FuaXphdGlvblNuYXBzaG90O1xuICAgIG1lbWJlcjogTWVtYmVyU25hcHNob3Q7XG4gICAgdXNlcjogVXNlclNuYXBzaG90O1xuICB9Pihob29rcywgXCJhZnRlckFkZE1lbWJlclwiLCBhc3luYyAocCkgPT5cbiAgICBlbWl0KFxuICAgICAgY2F0YWxvZy5tZW1iZXIudHJhY2tPcmdhbml6YXRpb25NZW1iZXJBZGRlZChcbiAgICAgICAgcC5vcmdhbml6YXRpb24sXG4gICAgICAgIHAubWVtYmVyLFxuICAgICAgICBwLnVzZXIsXG4gICAgICAgIGdldE9yZ2FuaXphdGlvblRyaWdnZXJJbmZvKHAudXNlciksXG4gICAgICApLFxuICAgICksXG4gICk7XG5cbiAgd3JhcE9yZ0hvb2s8e1xuICAgIG9yZ2FuaXphdGlvbjogT3JnYW5pemF0aW9uU25hcHNob3Q7XG4gICAgbWVtYmVyOiBNZW1iZXJTbmFwc2hvdDtcbiAgICB1c2VyOiBVc2VyU25hcHNob3Q7XG4gIH0+KGhvb2tzLCBcImFmdGVyUmVtb3ZlTWVtYmVyXCIsIGFzeW5jIChwKSA9PlxuICAgIGVtaXQoXG4gICAgICBjYXRhbG9nLm1lbWJlci50cmFja09yZ2FuaXphdGlvbk1lbWJlclJlbW92ZWQoXG4gICAgICAgIHAub3JnYW5pemF0aW9uLFxuICAgICAgICBwLm1lbWJlcixcbiAgICAgICAgcC51c2VyLFxuICAgICAgICBnZXRPcmdhbml6YXRpb25UcmlnZ2VySW5mbyhwLnVzZXIpLFxuICAgICAgKSxcbiAgICApLFxuICApO1xuXG4gIHdyYXBPcmdIb29rPHtcbiAgICBvcmdhbml6YXRpb246IE9yZ2FuaXphdGlvblNuYXBzaG90O1xuICAgIG1lbWJlcjogTWVtYmVyU25hcHNob3Q7XG4gICAgdXNlcjogVXNlclNuYXBzaG90O1xuICAgIHByZXZpb3VzUm9sZTogc3RyaW5nO1xuICB9Pihob29rcywgXCJhZnRlclVwZGF0ZU1lbWJlclJvbGVcIiwgYXN5bmMgKHApID0+XG4gICAgZW1pdChcbiAgICAgIGNhdGFsb2cubWVtYmVyLnRyYWNrT3JnYW5pemF0aW9uTWVtYmVyUm9sZVVwZGF0ZWQoXG4gICAgICAgIHAub3JnYW5pemF0aW9uLFxuICAgICAgICBwLm1lbWJlcixcbiAgICAgICAgcC51c2VyLFxuICAgICAgICBwLnByZXZpb3VzUm9sZSxcbiAgICAgICAgZ2V0T3JnYW5pemF0aW9uVHJpZ2dlckluZm8ocC51c2VyKSxcbiAgICAgICksXG4gICAgKSxcbiAgKTtcblxuICB3cmFwT3JnSG9vazx7XG4gICAgb3JnYW5pemF0aW9uOiBPcmdhbml6YXRpb25TbmFwc2hvdDtcbiAgICBpbnZpdGF0aW9uOiBJbnZpdGF0aW9uU25hcHNob3Q7XG4gICAgaW52aXRlcjogVXNlclNuYXBzaG90O1xuICB9Pihob29rcywgXCJhZnRlckNyZWF0ZUludml0YXRpb25cIiwgYXN5bmMgKHApID0+XG4gICAgZW1pdChcbiAgICAgIGNhdGFsb2cuaW52aXRhdGlvbi50cmFja09yZ2FuaXphdGlvbk1lbWJlckludml0ZWQoXG4gICAgICAgIHAub3JnYW5pemF0aW9uLFxuICAgICAgICBwLmludml0YXRpb24sXG4gICAgICAgIHAuaW52aXRlcixcbiAgICAgICAgZ2V0T3JnYW5pemF0aW9uVHJpZ2dlckluZm8ocC5pbnZpdGVyKSxcbiAgICAgICksXG4gICAgKSxcbiAgKTtcblxuICB3cmFwT3JnSG9vazx7XG4gICAgb3JnYW5pemF0aW9uOiBPcmdhbml6YXRpb25TbmFwc2hvdDtcbiAgICBpbnZpdGF0aW9uOiBJbnZpdGF0aW9uU25hcHNob3Q7XG4gICAgbWVtYmVyOiBNZW1iZXJTbmFwc2hvdDtcbiAgICB1c2VyOiBVc2VyU25hcHNob3Q7XG4gIH0+KGhvb2tzLCBcImFmdGVyQWNjZXB0SW52aXRhdGlvblwiLCBhc3luYyAocCkgPT5cbiAgICBlbWl0KFxuICAgICAgY2F0YWxvZy5pbnZpdGF0aW9uLnRyYWNrT3JnYW5pemF0aW9uTWVtYmVySW52aXRlQWNjZXB0ZWQoXG4gICAgICAgIHAub3JnYW5pemF0aW9uLFxuICAgICAgICBwLmludml0YXRpb24sXG4gICAgICAgIHAubWVtYmVyLFxuICAgICAgICBwLnVzZXIsXG4gICAgICAgIGdldE9yZ2FuaXphdGlvblRyaWdnZXJJbmZvKHAudXNlciksXG4gICAgICApLFxuICAgICksXG4gICk7XG5cbiAgd3JhcE9yZ0hvb2s8e1xuICAgIG9yZ2FuaXphdGlvbjogT3JnYW5pemF0aW9uU25hcHNob3Q7XG4gICAgaW52aXRhdGlvbjogSW52aXRhdGlvblNuYXBzaG90O1xuICAgIHVzZXI6IFVzZXJTbmFwc2hvdDtcbiAgfT4oaG9va3MsIFwiYWZ0ZXJSZWplY3RJbnZpdGF0aW9uXCIsIGFzeW5jIChwKSA9PlxuICAgIGVtaXQoXG4gICAgICBjYXRhbG9nLmludml0YXRpb24udHJhY2tPcmdhbml6YXRpb25NZW1iZXJJbnZpdGVSZWplY3RlZChcbiAgICAgICAgcC5vcmdhbml6YXRpb24sXG4gICAgICAgIHAuaW52aXRhdGlvbixcbiAgICAgICAgcC51c2VyLFxuICAgICAgICBnZXRPcmdhbml6YXRpb25UcmlnZ2VySW5mbyhwLnVzZXIpLFxuICAgICAgKSxcbiAgICApLFxuICApO1xuXG4gIHdyYXBPcmdIb29rPHtcbiAgICBvcmdhbml6YXRpb246IE9yZ2FuaXphdGlvblNuYXBzaG90O1xuICAgIGludml0YXRpb246IEludml0YXRpb25TbmFwc2hvdDtcbiAgICBjYW5jZWxsZWRCeTogVXNlclNuYXBzaG90O1xuICB9Pihob29rcywgXCJhZnRlckNhbmNlbEludml0YXRpb25cIiwgYXN5bmMgKHApID0+XG4gICAgZW1pdChcbiAgICAgIGNhdGFsb2cuaW52aXRhdGlvbi50cmFja09yZ2FuaXphdGlvbk1lbWJlckludml0ZUNhbmNlbGVkKFxuICAgICAgICBwLm9yZ2FuaXphdGlvbixcbiAgICAgICAgcC5pbnZpdGF0aW9uLFxuICAgICAgICBwLmNhbmNlbGxlZEJ5LFxuICAgICAgICBnZXRPcmdhbml6YXRpb25UcmlnZ2VySW5mbyhwLmNhbmNlbGxlZEJ5KSxcbiAgICAgICksXG4gICAgKSxcbiAgKTtcblxuICB3cmFwT3JnSG9vazx7XG4gICAgb3JnYW5pemF0aW9uOiBPcmdhbml6YXRpb25TbmFwc2hvdDtcbiAgICB0ZWFtOiBUZWFtU25hcHNob3Q7XG4gICAgdXNlcjogVXNlclNuYXBzaG90O1xuICB9Pihob29rcywgXCJhZnRlckNyZWF0ZVRlYW1cIiwgYXN5bmMgKHApID0+XG4gICAgZW1pdChcbiAgICAgIGNhdGFsb2cudGVhbS50cmFja09yZ2FuaXphdGlvblRlYW1DcmVhdGVkKFxuICAgICAgICBwLm9yZ2FuaXphdGlvbixcbiAgICAgICAgcC50ZWFtLFxuICAgICAgICBnZXRPcmdhbml6YXRpb25UcmlnZ2VySW5mbyhwLnVzZXIpLFxuICAgICAgKSxcbiAgICApLFxuICApO1xuXG4gIHdyYXBPcmdIb29rPHtcbiAgICBvcmdhbml6YXRpb246IE9yZ2FuaXphdGlvblNuYXBzaG90O1xuICAgIHRlYW0/OiBUZWFtU25hcHNob3Q7XG4gICAgdXNlcjogVXNlclNuYXBzaG90O1xuICB9Pihob29rcywgXCJhZnRlclVwZGF0ZVRlYW1cIiwgYXN5bmMgKHApID0+IHtcbiAgICBpZiAoIXAudGVhbSkgcmV0dXJuO1xuICAgIGF3YWl0IGVtaXQoXG4gICAgICBjYXRhbG9nLnRlYW0udHJhY2tPcmdhbml6YXRpb25UZWFtVXBkYXRlZChcbiAgICAgICAgcC5vcmdhbml6YXRpb24sXG4gICAgICAgIHAudGVhbSxcbiAgICAgICAgZ2V0T3JnYW5pemF0aW9uVHJpZ2dlckluZm8ocC51c2VyKSxcbiAgICAgICksXG4gICAgKTtcbiAgfSk7XG5cbiAgd3JhcE9yZ0hvb2s8e1xuICAgIG9yZ2FuaXphdGlvbjogT3JnYW5pemF0aW9uU25hcHNob3Q7XG4gICAgdGVhbTogVGVhbVNuYXBzaG90O1xuICAgIHVzZXI6IFVzZXJTbmFwc2hvdDtcbiAgfT4oaG9va3MsIFwiYWZ0ZXJEZWxldGVUZWFtXCIsIGFzeW5jIChwKSA9PlxuICAgIGVtaXQoXG4gICAgICBjYXRhbG9nLnRlYW0udHJhY2tPcmdhbml6YXRpb25UZWFtRGVsZXRlZChcbiAgICAgICAgcC5vcmdhbml6YXRpb24sXG4gICAgICAgIHAudGVhbSxcbiAgICAgICAgZ2V0T3JnYW5pemF0aW9uVHJpZ2dlckluZm8ocC51c2VyKSxcbiAgICAgICksXG4gICAgKSxcbiAgKTtcblxuICB3cmFwT3JnSG9vazx7XG4gICAgb3JnYW5pemF0aW9uOiBPcmdhbml6YXRpb25TbmFwc2hvdDtcbiAgICB0ZWFtOiBUZWFtU25hcHNob3Q7XG4gICAgdXNlcjogVXNlclNuYXBzaG90O1xuICAgIHRlYW1NZW1iZXI6IHsgdGVhbUlkOiBzdHJpbmc7IHVzZXJJZDogc3RyaW5nIH07XG4gIH0+KGhvb2tzLCBcImFmdGVyQWRkVGVhbU1lbWJlclwiLCBhc3luYyAocCkgPT5cbiAgICBlbWl0KFxuICAgICAgY2F0YWxvZy50ZWFtLnRyYWNrT3JnYW5pemF0aW9uVGVhbU1lbWJlckFkZGVkKFxuICAgICAgICBwLm9yZ2FuaXphdGlvbixcbiAgICAgICAgcC50ZWFtLFxuICAgICAgICBwLnVzZXIsXG4gICAgICAgIHAudGVhbU1lbWJlcixcbiAgICAgICAgZ2V0T3JnYW5pemF0aW9uVHJpZ2dlckluZm8ocC51c2VyKSxcbiAgICAgICksXG4gICAgKSxcbiAgKTtcblxuICB3cmFwT3JnSG9vazx7XG4gICAgb3JnYW5pemF0aW9uOiBPcmdhbml6YXRpb25TbmFwc2hvdDtcbiAgICB0ZWFtOiBUZWFtU25hcHNob3Q7XG4gICAgdXNlcjogVXNlclNuYXBzaG90O1xuICAgIHRlYW1NZW1iZXI6IHsgdGVhbUlkOiBzdHJpbmc7IHVzZXJJZDogc3RyaW5nIH07XG4gIH0+KGhvb2tzLCBcImFmdGVyUmVtb3ZlVGVhbU1lbWJlclwiLCBhc3luYyAocCkgPT5cbiAgICBlbWl0KFxuICAgICAgY2F0YWxvZy50ZWFtLnRyYWNrT3JnYW5pemF0aW9uVGVhbU1lbWJlclJlbW92ZWQoXG4gICAgICAgIHAub3JnYW5pemF0aW9uLFxuICAgICAgICBwLnRlYW0sXG4gICAgICAgIHAudXNlcixcbiAgICAgICAgcC50ZWFtTWVtYmVyLFxuICAgICAgICBnZXRPcmdhbml6YXRpb25UcmlnZ2VySW5mbyhwLnVzZXIpLFxuICAgICAgKSxcbiAgICApLFxuICApO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O1FBSXNDO0FBc0J0QyxNQUFNLGNBQWMsVUFBMEIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQU07QUFDckUsTUFBTSxlQUFlLFVBQTBCLE1BQU0sUUFBUSx1QkFBdUIsTUFBTTtBQUMxRixNQUFNLGdCQUFnQixVQUEwQjtDQUM5QyxNQUFNLFVBQVUsWUFBWSxXQUFXLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxlQUFlLFFBQVE7Q0FDOUUsT0FBTyxJQUFJLE9BQU8sR0FBRyxRQUFRLFdBQVc7QUFDMUM7QUFDQSxNQUFNLG1CQUFtQixXQUErQixXQUF1QztDQUM3RixJQUFJLENBQUMsV0FBVyxPQUFPO0NBQ3ZCLE1BQU0sWUFBWSxXQUFXLFNBQVM7Q0FDdEMsT0FBTyxPQUFPLE1BQU0sVUFBVSxhQUFhLEtBQUssQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDO0FBQ25FO0FBRUEsTUFBTSxjQUFjO0NBQ2xCLE9B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
|
|
392
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hdXRoL2F1ZGl0LWxvZy9wbHVnaW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcbmltcG9ydCB7IHR5cGUgQXV0aENvbnRleHQsIHR5cGUgQmV0dGVyQXV0aFBsdWdpbiwgdHlwZSBHZW5lcmljRW5kcG9pbnRDb250ZXh0IH0gZnJvbSBcImJldHRlci1hdXRoXCI7XG5pbXBvcnQgeyBjcmVhdGVBdXRoTWlkZGxld2FyZSB9IGZyb20gXCJiZXR0ZXItYXV0aC9hcGlcIjtcblxuaW1wb3J0IHsgREIgfSBmcm9tIFwiLi4vLi4vZGF0YWJhc2UvZGJcIjtcbmltcG9ydCB7IGlzT2JqZWN0VmFsdWUsIGlzU3RyaW5nVmFsdWUgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuaW1wb3J0IHsgaW5nZXN0QXVkaXRFdmVudCB9IGZyb20gXCIuLi9hdWRpdC1sb2ctaW5nZXN0b3JcIjtcbmltcG9ydCB7IGJ1aWxkQXVkaXRFdmVudENhdGFsb2cgfSBmcm9tIFwiLi9idWlsZGVyc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBBY2NvdW50U25hcHNob3QsXG4gIHR5cGUgQXVkaXRMb2dFdmVudCxcbiAgdHlwZSBCdWlsZGVyTG9jYXRpb24sXG4gIHR5cGUgQnVpbGRlclRyaWdnZXIsXG4gIFJPVVRFUyxcbiAgdHlwZSBTZXNzaW9uU25hcHNob3QsXG4gIHR5cGUgVXNlclByb2ZpbGVMaXRlLFxuICB0eXBlIFVzZXJTbmFwc2hvdCxcbiAgdHlwZSBWZXJpZmljYXRpb25TbmFwc2hvdCxcbn0gZnJvbSBcIi4vZXZlbnRzXCI7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIOudvOyasO2MhS/tirjrpqzqsbAg7Jyg7Yu4XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5jb25zdCBzdHJpcFF1ZXJ5ID0gKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgPT4gdmFsdWUuc3BsaXQoXCI/XCIpWzBdIHx8IHZhbHVlO1xuY29uc3QgZXNjYXBlUmVnZXggPSAodmFsdWU6IHN0cmluZyk6IHN0cmluZyA9PiB2YWx1ZS5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgXCJcXFxcJCZcIik7XG5jb25zdCByb3V0ZVRvUmVnZXggPSAocm91dGU6IHN0cmluZyk6IFJlZ0V4cCA9PiB7XG4gIGNvbnN0IHBhdHRlcm4gPSBlc2NhcGVSZWdleChzdHJpcFF1ZXJ5KHJvdXRlKSkucmVwbGFjZSgvXFwvOihbXi9dKykvZywgXCIvW14vXStcIik7XG4gIHJldHVybiBuZXcgUmVnRXhwKGAke3BhdHRlcm59KD86JHxbLz9dKWApO1xufTtcbmNvbnN0IG1hdGNoZXNBbnlSb3V0ZSA9IChyb3V0ZVBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCwgcm91dGVzOiByZWFkb25seSBzdHJpbmdbXSk6IGJvb2xlYW4gPT4ge1xuICBpZiAoIXJvdXRlUGF0aCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBjbGVhblBhdGggPSBzdHJpcFF1ZXJ5KHJvdXRlUGF0aCk7XG4gIHJldHVybiByb3V0ZXMuc29tZSgocm91dGUpID0+IHJvdXRlVG9SZWdleChyb3V0ZSkudGVzdChjbGVhblBhdGgpKTtcbn07XG5cbmNvbnN0IExPR0lOX1BBVEhTID0gW1xuICBST1VURVMuU0lHTl9JTl9TT0NJQUxfQ0FMTEJBQ0ssXG4gIFJPVVRFUy5TSUdOX0lOX09BVVRIX0NBTExCQUNLLFxuICBST1VURVMuU0lHTl9JTl9FTUFJTCxcbiAgUk9VVEVTLlNJR05fSU5fU09DSUFMLFxuICBST1VURVMuU0lHTl9JTl9FTUFJTF9PVFAsXG4gIFJPVVRFUy5TSUdOX1VQX0VNQUlMLFxuXSBhcyBjb25zdDtcblxuLy8gZGFzaCAzMTktMzIzIOuvuOufrDog7ZiE7J6sIOyalOyyrSBwYXRo7JeQ7IScIOuhnOq3uOyduCDrsKnsi53snYQg7LaU7Lac7ZWc64ukLlxuY29uc3QgZ2V0TG9naW5NZXRob2QgPSAoY3R4UGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLCBwYXJhbXNJZD86IHN0cmluZyk6IHN0cmluZyB8IG51bGwgPT4ge1xuICBpZiAoIWN0eFBhdGgpIHJldHVybiBudWxsO1xuICBpZiAobWF0Y2hlc0FueVJvdXRlKGN0eFBhdGgsIExPR0lOX1BBVEhTKSkge1xuICAgIGlmIChwYXJhbXNJZCkgcmV0dXJuIHBhcmFtc0lkO1xuICAgIHJldHVybiBjdHhQYXRoLnNwbGl0KFwiL1wiKS5wb3AoKSA/PyBudWxsO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuLy8gZGFzaCA3OTctODAzIOuvuOufrDog7IS47IWYL+yalOyyreyXkOyEnCDtirjrpqzqsbAg7KO87LK07JmAIOy7qO2FjeyKpO2KuOulvCDrj4TstpztlZzri6QuXG5jb25zdCBnZXRUcmlnZ2VySW5mbyA9IChcbiAgY3R4UGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBzZXNzaW9uVXNlcklkOiBzdHJpbmcgfCBudWxsLFxuICB1c2VySWQ6IHN0cmluZyxcbik6IEJ1aWxkZXJUcmlnZ2VyID0+IHtcbiAgY29uc3QgcmVzb2x2ZWQgPSBzZXNzaW9uVXNlcklkID8/IHVzZXJJZDtcbiAgY29uc3QgdHJpZ2dlckNvbnRleHQgPVxuICAgIHJlc29sdmVkID09PSB1c2VySWRcbiAgICAgID8gXCJ1c2VyXCJcbiAgICAgIDogbWF0Y2hlc0FueVJvdXRlKGN0eFBhdGgsIFtST1VURVMuQURNSU5fUk9VVEVdKVxuICAgICAgICA/IFwiYWRtaW5cIlxuICAgICAgICA6IG1hdGNoZXNBbnlSb3V0ZShjdHhQYXRoLCBbUk9VVEVTLkRBU0hfUk9VVEVdKVxuICAgICAgICAgID8gXCJkYXNoYm9hcmRcIlxuICAgICAgICAgIDogcmVzb2x2ZWQgPT09IFwidW5rbm93blwiXG4gICAgICAgICAgICA/IFwidXNlclwiXG4gICAgICAgICAgICA6IFwidW5rbm93blwiO1xuICByZXR1cm4geyB0cmlnZ2VyZWRCeTogcmVzb2x2ZWQsIHRyaWdnZXJDb250ZXh0IH07XG59O1xuXG4vLyBkYXNoIDgwOS04MTQg66+465+sOiBvcmdhbml6YXRpb24gaG9va+ydgCDsnbjspp0g7Luo7YWN7Iqk7Yq4IOyXhuydtOuPhCDtmLjstpzrkJjrr4DroZxcbi8vIOyjvOyWtOynhCB1c2VyIOqwneyytOuhnOu2gO2EsCDtirjrpqzqsbAg7KCV67O066W8IO2VqeyEse2VnOuLpC5cbmNvbnN0IGdldE9yZ2FuaXphdGlvblRyaWdnZXJJbmZvID0gKHVzZXI6IHsgaWQ/OiBzdHJpbmcgfSB8IG51bGwgfCB1bmRlZmluZWQpOiBCdWlsZGVyVHJpZ2dlciA9PiAoe1xuICB0cmlnZ2VyZWRCeTogdXNlcj8uaWQgPz8gXCJ1bmtub3duXCIsXG4gIHRyaWdnZXJDb250ZXh0OiBcIm9yZ2FuaXphdGlvblwiLFxufSk7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIGJldHRlci1hdXRoIGN0eCDtg4DsnoUgaGVscGVycyAo64K067aAIHNoYXBl7J2AIOufsO2DgOyehCDqtazsobDrpbwg6riw7KSA7Jy866GcIOyige2YgCDsgqzsmqntlZzri6QpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG50eXBlIEJldHRlckF1dGhSZXF1ZXN0Q3R4ID0gR2VuZXJpY0VuZHBvaW50Q29udGV4dCAmIHtcbiAgY29udGV4dDogR2VuZXJpY0VuZHBvaW50Q29udGV4dFtcImNvbnRleHRcIl0gJiB7XG4gICAgbG9jYXRpb24/OiBCdWlsZGVyTG9jYXRpb24gfCBudWxsO1xuICB9O1xufTtcblxuLy8gZGF0YWJhc2VIb29rcyBhZnRlciDsvZzrsLHsnZggY3R464qUIOyEoO2DneyggeydtOupsCBzaGFwZeydhCDrn7Dtg4DsnoTsl5DshJwg7KKB7Z6M64ukLlxuY29uc3QgbmFycm93UmVxdWVzdEN0eCA9IChyYXc6IEdlbmVyaWNFbmRwb2ludENvbnRleHQgfCBudWxsKTogQmV0dGVyQXV0aFJlcXVlc3RDdHggfCBudWxsID0+IHJhdztcblxuLy8gYWRhcHRlci5maW5kT25lIO2YuOy2nCDsi6TtjKgg7IucIG51bGzsnYQg67CY7ZmY7ZWc64ukLiBkYXNoIO2XrO2NvOyZgCDrj5nsnbwg7KCV7LGFLlxuY29uc3QgZmV0Y2hVc2VyQnkgPSBhc3luYyAoXG4gIGN0eDogQmV0dGVyQXV0aFJlcXVlc3RDdHgsXG4gIGZpZWxkOiBcImlkXCIgfCBcImVtYWlsXCIsXG4gIHZhbHVlOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLFxuKTogUHJvbWlzZTxVc2VyUHJvZmlsZUxpdGU+ID0+IHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGFkYXB0ZXIgPSBjdHguY29udGV4dC5hZGFwdGVyO1xuICBpZiAoIWFkYXB0ZXIpIHJldHVybiBudWxsO1xuICB0cnkge1xuICAgIGNvbnN0IHJvdyA9IGF3YWl0IGFkYXB0ZXIuZmluZE9uZSh7XG4gICAgICBtb2RlbDogXCJ1c2VyXCIsXG4gICAgICBzZWxlY3Q6IFtcImlkXCIsIFwibmFtZVwiLCBcImVtYWlsXCJdLFxuICAgICAgd2hlcmU6IFt7IGZpZWxkLCB2YWx1ZSB9XSxcbiAgICB9KTtcbiAgICBpZiAoIXJvdyB8fCAhaXNPYmplY3RWYWx1ZShyb3cpKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBpZCA9IFwiaWRcIiBpbiByb3cgPyByb3cuaWQgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbmFtZSA9IFwibmFtZVwiIGluIHJvdyA/IHJvdy5uYW1lIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGVtYWlsID0gXCJlbWFpbFwiIGluIHJvdyA/IHJvdy5lbWFpbCA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IFN0cmluZyhpZCksXG4gICAgICBuYW1lOiBpc1N0cmluZ1ZhbHVlKG5hbWUpID8gbmFtZSA6IHVuZGVmaW5lZCxcbiAgICAgIGVtYWlsOiBpc1N0cmluZ1ZhbHVlKGVtYWlsKSA/IGVtYWlsIDogdW5kZWZpbmVkLFxuICAgIH07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59O1xuXG5jb25zdCBpc05vbkVtcHR5U3RyaW5nID0gPFZhbHVlPih2YWx1ZTogVmFsdWUpOiB2YWx1ZSBpcyBWYWx1ZSAmIHN0cmluZyA9PlxuICBpc1N0cmluZ1ZhbHVlKHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPiAwO1xuXG4vLyBkYXNoIOygnOqxsCDsi5wg7ZWo6ruYIOyCrOudvOynhCBsb2NhdGlvbiDqs7XquIkg6rK966Gc66W8IOuMgOyytO2VnOuLpC5cbi8vIOyasOyEoOyInOychDogY2YtY29ubmVjdGluZy1pcCA+IHgtZm9yd2FyZGVkLWZvcijssqsg7ZWt66qpKSA+IHgtcmVhbC1pcCA+IHgtdmVyY2VsLWZvcndhcmRlZC1mb3Jcbi8vIChzb25hbXUudHMgSVBfSEVBREVSUyDsg4HsiJjsmYAg64+Z7J28KVxuY29uc3QgSVBfSEVBREVSX09SREVSID0gW1xuICBcImNmLWNvbm5lY3RpbmctaXBcIixcbiAgXCJ4LWZvcndhcmRlZC1mb3JcIixcbiAgXCJ4LXJlYWwtaXBcIixcbiAgXCJ4LXZlcmNlbC1mb3J3YXJkZWQtZm9yXCIsXG5dIGFzIGNvbnN0O1xuXG50eXBlIEhlYWRlckNvbGxlY3Rpb24gPVxuICB8IEhlYWRlcnNcbiAgfCB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkIH1cbiAgfCBudWxsXG4gIHwgdW5kZWZpbmVkO1xuXG5jb25zdCByZWFkSGVhZGVyID0gKGhlYWRlcnM6IEhlYWRlckNvbGxlY3Rpb24sIGtleTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCA9PiB7XG4gIGlmICghaGVhZGVycykgcmV0dXJuIG51bGw7XG4gIGlmIChoZWFkZXJzIGluc3RhbmNlb2YgSGVhZGVycykge1xuICAgIHJldHVybiBoZWFkZXJzLmdldChrZXkpO1xuICB9XG4gIGlmIChpc09iamVjdFZhbHVlKGhlYWRlcnMpKSB7XG4gICAgY29uc3QgdiA9IGhlYWRlcnNba2V5XSA/PyBoZWFkZXJzW2tleS50b0xvd2VyQ2FzZSgpXTtcbiAgICBpZiAoaXNTdHJpbmdWYWx1ZSh2KSkgcmV0dXJuIHY7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodikgJiYgaXNTdHJpbmdWYWx1ZSh2WzBdKSkgcmV0dXJuIHZbMF07XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG5jb25zdCBleHRyYWN0TG9jYXRpb25Gcm9tSGVhZGVycyA9IChoZWFkZXJzOiBIZWFkZXJDb2xsZWN0aW9uKTogQnVpbGRlckxvY2F0aW9uID0+IHtcbiAgbGV0IGlwQWRkcmVzczogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIGZvciAoY29uc3Qga2V5IG9mIElQX0hFQURFUl9PUkRFUikge1xuICAgIGNvbnN0IHJhdyA9IHJlYWRIZWFkZXIoaGVhZGVycywga2V5KTtcbiAgICBpZiAoaXNTdHJpbmdWYWx1ZShyYXcpICYmIHJhdy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBmaXJzdCA9IHJhdy5zcGxpdChcIixcIilbMF0/LnRyaW0oKTtcbiAgICAgIGlmIChmaXJzdCkge1xuICAgICAgICBpcEFkZHJlc3MgPSBmaXJzdDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnN0IGNvdW50cnlDb2RlID0gcmVhZEhlYWRlcihoZWFkZXJzLCBcImNmLWlwY291bnRyeVwiKTtcbiAgY29uc3QgY2l0eSA9IHJlYWRIZWFkZXIoaGVhZGVycywgXCJjZi1pcGNpdHlcIik7XG4gIHJldHVybiB7XG4gICAgaXBBZGRyZXNzOiBpcEFkZHJlc3MgPz8gdW5kZWZpbmVkLFxuICAgIGNpdHk6IGNpdHkgPz8gdW5kZWZpbmVkLFxuICAgIGNvdW50cnk6IHVuZGVmaW5lZCxcbiAgICBjb3VudHJ5Q29kZTogY291bnRyeUNvZGUgPz8gdW5kZWZpbmVkLFxuICB9O1xufTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gT3JnYW5pemF0aW9uIGhvb2sg656Y7ZWRIO2XrO2NvFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8g7KO87Ja07KeEIG9yZ2FuaXphdGlvbkhvb2tzIOugiOy9lOuTnOyXkCDrjIDtlbQg7ZW064u5IG5hbWXsnZgg6riw7KG0IGhvb2vsnYQgY2hhaW7tlZzri6QuXG4vLyBoYW5kbGVy64qUIHBheWxvYWQg6rCd7LK0KOyyqyDrsojsp7gg7J247J6QKeunjCDrsJvslYTshJwgYXVkaXQgZW1pdOydhCDsiJjtlontlZzri6QuXG5jb25zdCB3cmFwT3JnSG9vayA9IDxQYXlsb2FkIGV4dGVuZHMgb2JqZWN0PihcbiAgcHJldmlvdXM6ICgocGF5bG9hZDogUGF5bG9hZCkgPT4gUHJvbWlzZTx2b2lkPikgfCB1bmRlZmluZWQsXG4gIGhhbmRsZXI6IChwYXlsb2FkOiBQYXlsb2FkKSA9PiBQcm9taXNlPHZvaWQ+LFxuKTogKChwYXlsb2FkOiBQYXlsb2FkKSA9PiBQcm9taXNlPHZvaWQ+KSA9PiB7XG4gIHJldHVybiBhc3luYyAocGF5bG9hZCkgPT4ge1xuICAgIGF3YWl0IGhhbmRsZXIocGF5bG9hZCk7XG4gICAgYXdhaXQgcHJldmlvdXM/LihwYXlsb2FkKTtcbiAgfTtcbn07XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFBsdWdpbiBlbnRyeVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLyoqXG4gKiBCZXR0ZXIgQXV0aCBkYXRhYmFzZUhvb2tzL29yZ2FuaXphdGlvbkhvb2tzL21pZGRsZXdhcmXsl5DshJwg7IiY7KeR7ZWcXG4gKiDsnbTrsqTtirjrpbwgYERCLmdldERCKFwid1wiKWDroZwg7Ja77J2AIGtuZXjsl5AgYGluZ2VzdEF1ZGl0RXZlbnRg66GcIOyggeyerO2VnOuLpC5cbiAqXG4gKiAtIGRhc2goQGJldHRlci1hdXRoL2luZnJhKeydmCBhdWRpdC1ldmVudCDsiJjsp5Eg7ZuFIOq1rOyhsOulvCDssLjqs6DtlbQgU29uYW11IOuCtOu2gCDsoIHsnqwg6rK966Gc66GcIO2PrO2Mhe2VnOuLpC5cbiAqIC0gZGFzaOydmCBpbmZyYSDsl7DqsrAvQVBJIGVuZHBvaW50IOygnOqztSDrspTsnITripQg7Y+s7ZWo7ZWY7KeAIOyViuqzoCwgYXVkaXQtZXZlbnQgZW1pdC9pbmdlc3Qg6rK966Gc66eMIOycoOyngO2VnOuLpC5cbiAqIC0gc2VjdXJpdHkgNOyiheydgCBSMSDqsrDsoJXsl5Ag65Sw6528IHNjb3BlIG91dCAoYnVpbGRlcnMudHPsnZggVE9ETyDso7zshJ0g7LC47KGwKS5cbiAqL1xuZnVuY3Rpb24gbG9jYXRpb25Gb3IoY3R4OiBCZXR0ZXJBdXRoUmVxdWVzdEN0eCk6IEJ1aWxkZXJMb2NhdGlvbiB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjdHguY29udGV4dC5sb2NhdGlvbiA/PyB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzb25hbXVBdWRpdExvZygpOiBCZXR0ZXJBdXRoUGx1Z2luIHtcbiAgY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInNvbmFtdVwiLCBcImF1ZGl0LWxvZ1wiXSk7XG4gIGNvbnN0IGNhdGFsb2cgPSBidWlsZEF1ZGl0RXZlbnRDYXRhbG9nKCk7XG5cbiAgLy8gZGFzaCA3Mzk0OiDrj5nsnbwg7JqU7LKt7JeQ7IScIOyEuOyFmCDrsoztgawg7IKt7KCc6rCAIOuLpO2ajCDrsJzsg53tlaAg65WMIGFsbF9zZXNzaW9uc19yZXZva2Vk66W8XG4gIC8vIO2VnCDrsojrp4wgZW1pdO2VmOuPhOuhnSDsspjrpqwg7Luo7YWN7Iqk7Yq466W8IOq4sOyWte2VnOuLpC5cbiAgY29uc3QgcHJvY2Vzc2VkQnVsa09wZXJhdGlvbkNvbnRleHRzID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuXG4gIGNvbnN0IGVtaXQgPSBhc3luYyAoZXZlbnQ6IEF1ZGl0TG9nRXZlbnQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgaW5nZXN0QXVkaXRFdmVudChEQi5nZXREQihcIndcIiksIGV2ZW50KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihcImF1ZGl0IGV2ZW50IGluZ2VzdCBmYWlsZWQ6IHtlcnJvcn1cIiwgeyBlcnJvcjogZXJyIH0pO1xuICAgIH1cbiAgfTtcblxuICAvLyBjdHgucGF0aCArIHNlc3Npb27sl5DshJwg7IKs7Jqp7J6QIO2KuOumrOqxsOulvCDrj4TstpztlZzri6QoZW50aXR5Lmlk66W8IHN1YmplY3TroZwg7IKs7JqpKS5cbiAgY29uc3QgdHJpZ2dlckZvciA9IChjdHg6IEJldHRlckF1dGhSZXF1ZXN0Q3R4LCBzdWJqZWN0VXNlcklkOiBzdHJpbmcpOiBCdWlsZGVyVHJpZ2dlciA9PlxuICAgIGdldFRyaWdnZXJJbmZvKGN0eC5wYXRoLCBjdHguY29udGV4dC5zZXNzaW9uPy5zZXNzaW9uPy51c2VySWQgPz8gbnVsbCwgc3ViamVjdFVzZXJJZCk7XG5cbiAgcmV0dXJuIHtcbiAgICBpZDogXCJzb25hbXUtYXVkaXQtbG9nXCIsXG5cbiAgICBpbml0KHBsdWdpbkN0eCkge1xuICAgICAgaW5zdGFsbE9yZ2FuaXphdGlvbkhvb2tzKHBsdWdpbkN0eCwgY2F0YWxvZywgZW1pdCwgbG9nZ2VyKTtcblxuICAgICAgLy8gZGFzaCA3MjgzLTc0NDkg66+465+sOiBkYXRhYmFzZUhvb2tzICh1c2VyL3Nlc3Npb24vYWNjb3VudC92ZXJpZmljYXRpb24pLlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGRhdGFiYXNlSG9va3M6IHtcbiAgICAgICAgICAgIHVzZXI6IHtcbiAgICAgICAgICAgICAgY3JlYXRlOiB7XG4gICAgICAgICAgICAgICAgYWZ0ZXI6IGFzeW5jIChyYXdVc2VyLCByYXdDdHgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGN0eCA9IG5hcnJvd1JlcXVlc3RDdHgocmF3Q3R4KTtcbiAgICAgICAgICAgICAgICAgIGlmICghY3R4KSByZXR1cm47XG4gICAgICAgICAgICAgICAgICBjb25zdCB1c2VyID1cbiAgICAgICAgICAgICAgICAgICAgLyogU0FGRVRZOiBiZXR0ZXItYXV0aCDtm4Xqs7wg7Ja064yR7YSwIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIHJhd1VzZXIgYXMgVXNlclNuYXBzaG90O1xuICAgICAgICAgICAgICAgICAgYXdhaXQgZW1pdChcbiAgICAgICAgICAgICAgICAgICAgY2F0YWxvZy51c2VyLnRyYWNrVXNlclNpZ25lZFVwKFxuICAgICAgICAgICAgICAgICAgICAgIHVzZXIsXG4gICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckZvcihjdHgsIHVzZXIuaWQpLFxuICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uRm9yKGN0eCksXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHVwZGF0ZToge1xuICAgICAgICAgICAgICAgIGFmdGVyOiBhc3luYyAocmF3VXNlciwgcmF3Q3R4KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjdHggPSBuYXJyb3dSZXF1ZXN0Q3R4KHJhd0N0eCk7XG4gICAgICAgICAgICAgICAgICBpZiAoIWN0eCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgY29uc3QgdXNlciA9XG4gICAgICAgICAgICAgICAgICAgIC8qIFNBRkVUWTogYmV0dGVyLWF1dGgg7ZuF6rO8IOyWtOuMke2EsCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyByYXdVc2VyIGFzIFVzZXJTbmFwc2hvdCAmIHtcbiAgICAgICAgICAgICAgICAgICAgICBlbWFpbFZlcmlmaWVkPzogYm9vbGVhbjtcbiAgICAgICAgICAgICAgICAgICAgICBpbWFnZT86IHN0cmluZyB8IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICBjb25zdCBwYXRoID0gY3R4LnBhdGg7XG4gICAgICAgICAgICAgICAgICBjb25zdCB0cmlnZ2VyID0gdHJpZ2dlckZvcihjdHgsIHVzZXIuaWQpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgbG9jYXRpb24gPSBsb2NhdGlvbkZvcihjdHgpO1xuXG4gICAgICAgICAgICAgICAgICBpZiAobWF0Y2hlc0FueVJvdXRlKHBhdGgsIFtST1VURVMuVVBEQVRFX1VTRVIsIFJPVVRFUy5EQVNIX1VQREFURV9VU0VSXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXBkYXRlZEZpZWxkcyA9IE9iamVjdC5rZXlzKFxuICAgICAgICAgICAgICAgICAgICAgIC8qIFNBRkVUWTogYmV0dGVyLWF1dGgg7ZuF6rO8IOyWtOuMke2EsCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoY3R4LmJvZHkgYXMgb2JqZWN0KSA/P1xuICAgICAgICAgICAgICAgICAgICAgICAge30sXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzT25seUltYWdlVXBkYXRlID1cbiAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkRmllbGRzLmxlbmd0aCA9PT0gMSAmJiB1cGRhdGVkRmllbGRzWzBdID09PSBcImltYWdlXCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzT25seUVtYWlsVmVyaWZpZWRVcGRhdGUgPVxuICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRGaWVsZHMubGVuZ3RoID09PSAxICYmIHVwZGF0ZWRGaWVsZHNbMF0gPT09IFwiZW1haWxWZXJpZmllZFwiO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXNFbWFpbFZlcmlmaWVkVXBkYXRlID0gdXBkYXRlZEZpZWxkcy5pbmNsdWRlcyhcImVtYWlsVmVyaWZpZWRcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc09ubHlFbWFpbFZlcmlmaWVkVXBkYXRlICYmIHVzZXIuZW1haWxWZXJpZmllZCkge1xuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGVtaXQoY2F0YWxvZy51c2VyLnRyYWNrVXNlckVtYWlsVmVyaWZpZWQodXNlciwgdHJpZ2dlciwgbG9jYXRpb24pKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc09ubHlJbWFnZVVwZGF0ZSAmJiB1c2VyLmltYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZW1pdChcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGFsb2cudXNlci50cmFja1VzZXJQcm9maWxlSW1hZ2VVcGRhdGVkKHVzZXIsIHRyaWdnZXIsIGxvY2F0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc09ubHlJbWFnZVVwZGF0ZSAmJiAhaXNPbmx5RW1haWxWZXJpZmllZFVwZGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGVtaXQoXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRhbG9nLnVzZXIudHJhY2tVc2VyUHJvZmlsZVVwZGF0ZWQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRGaWVsZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNFbWFpbFZlcmlmaWVkVXBkYXRlICYmIHVzZXIuZW1haWxWZXJpZmllZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZW1pdChjYXRhbG9nLnVzZXIudHJhY2tVc2VyRW1haWxWZXJpZmllZCh1c2VyLCB0cmlnZ2VyLCBsb2NhdGlvbikpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtYXRjaGVzQW55Um91dGUocGF0aCwgW1JPVVRFUy5DSEFOR0VfRU1BSUxdKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB1cGRhdGVkRmllbGRzID0gT2JqZWN0LmtleXMoXG4gICAgICAgICAgICAgICAgICAgICAgLyogU0FGRVRZOiBiZXR0ZXItYXV0aCDtm4Xqs7wg7Ja064yR7YSwIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChjdHguYm9keSBhcyBvYmplY3QpID8/XG4gICAgICAgICAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZW1pdChcbiAgICAgICAgICAgICAgICAgICAgICBjYXRhbG9nLnVzZXIudHJhY2tVc2VyUHJvZmlsZVVwZGF0ZWQodXNlciwgdXBkYXRlZEZpZWxkcywgdHJpZ2dlciwgbG9jYXRpb24pLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoZXNBbnlSb3V0ZShwYXRoLCBbUk9VVEVTLlZFUklGWV9FTUFJTF0pICYmIHVzZXIuZW1haWxWZXJpZmllZCkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBlbWl0KGNhdGFsb2cudXNlci50cmFja1VzZXJFbWFpbFZlcmlmaWVkKHVzZXIsIHRyaWdnZXIsIGxvY2F0aW9uKSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZXNBbnlSb3V0ZShwYXRoLCBbUk9VVEVTLkFETUlOX0JBTl9VU0VSXSkgJiZcbiAgICAgICAgICAgICAgICAgICAgXCJiYW5uZWRcIiBpbiB1c2VyICYmXG4gICAgICAgICAgICAgICAgICAgIHVzZXIuYmFubmVkXG4gICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZW1pdChjYXRhbG9nLnVzZXIudHJhY2tVc2VyQmFubmVkKHVzZXIsIHRyaWdnZXIsIGxvY2F0aW9uKSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZXNBbnlSb3V0ZShwYXRoLCBbUk9VVEVTLkFETUlOX1VOQkFOX1VTRVJdKSAmJlxuICAgICAgICAgICAgICAgICAgICBcImJhbm5lZFwiIGluIHVzZXIgJiZcbiAgICAgICAgICAgICAgICAgICAgIXVzZXIuYmFubmVkXG4gICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZW1pdChjYXRhbG9nLnVzZXIudHJhY2tVc2VyVW5CYW5uZWQodXNlciwgdHJpZ2dlciwgbG9jYXRpb24pKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBkZWxldGU6IHtcbiAgICAgICAgICAgICAgICBhZnRlcjogYXN5bmMgKHJhd1VzZXIsIHJhd0N0eCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3QgY3R4ID0gbmFycm93UmVxdWVzdEN0eChyYXdDdHgpO1xuICAgICAgICAgICAgICAgICAgaWYgKCFjdHgpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHVzZXIgPVxuICAgICAgICAgICAgICAgICAgICAvKiBTQUZFVFk6IGJldHRlci1hdXRoIO2bheqzvCDslrTrjJHthLAg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gcmF3VXNlciBhcyBVc2VyU25hcHNob3Q7XG4gICAgICAgICAgICAgICAgICBhd2FpdCBlbWl0KFxuICAgICAgICAgICAgICAgICAgICBjYXRhbG9nLnVzZXIudHJhY2tVc2VyRGVsZXRlZCh1c2VyLCB0cmlnZ2VyRm9yKGN0eCwgdXNlci5pZCksIGxvY2F0aW9uRm9yKGN0eCkpLFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNlc3Npb246IHtcbiAgICAgICAgICAgICAgY3JlYXRlOiB7XG4gICAgICAgICAgICAgICAgYmVmb3JlOiBhc3luYyAoXG4gICAgICAgICAgICAgICAgICByYXdTZXNzaW9uLFxuICAgICAgICAgICAgICAgICAgcmF3Q3R4LFxuICAgICAgICAgICAgICAgICk6IFByb21pc2U8eyBkYXRhOiB7IGxvZ2luTWV0aG9kOiBzdHJpbmcgfCBudWxsIH0gfSB8IHVuZGVmaW5lZD4gPT4ge1xuICAgICAgICAgICAgICAgICAgdm9pZCByYXdTZXNzaW9uO1xuICAgICAgICAgICAgICAgICAgY29uc3QgY3R4ID0gbmFycm93UmVxdWVzdEN0eChyYXdDdHgpO1xuICAgICAgICAgICAgICAgICAgaWYgKCFjdHgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiB7IGxvZ2luTWV0aG9kOiBnZXRMb2dpbk1ldGhvZChjdHgucGF0aCwgY3R4LnBhcmFtcz8uaWQpIH0gfTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGFmdGVyOiBhc3luYyAocmF3U2Vzc2lvbiwgcmF3Q3R4KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjdHggPSBuYXJyb3dSZXF1ZXN0Q3R4KHJhd0N0eCk7XG4gICAgICAgICAgICAgICAgICBpZiAoIWN0eCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbiA9XG4gICAgICAgICAgICAgICAgICAgIC8qIFNBRkVUWTogYmV0dGVyLWF1dGgg7ZuF6rO8IOyWtOuMke2EsCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyByYXdTZXNzaW9uIGFzIFNlc3Npb25TbmFwc2hvdDtcbiAgICAgICAgICAgICAgICAgIGlmICghc2Vzc2lvbi51c2VySWQpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGxvY2F0aW9uID0gbG9jYXRpb25Gb3IoY3R4KTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGxvZ2luTWV0aG9kID0gZ2V0TG9naW5NZXRob2QoY3R4LnBhdGgsIGN0eC5wYXJhbXM/LmlkKSA/PyB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICBjb25zdCBlbnJpY2hlZFNlc3Npb246IFNlc3Npb25TbmFwc2hvdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uc2Vzc2lvbixcbiAgICAgICAgICAgICAgICAgICAgbG9naW5NZXRob2Q6IGxvZ2luTWV0aG9kID8/IHNlc3Npb24ubG9naW5NZXRob2QgPz8gbnVsbCxcbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICBjb25zdCB1c2VyID0gYXdhaXQgZmV0Y2hVc2VyQnkoY3R4LCBcImlkXCIsIHNlc3Npb24udXNlcklkKTtcblxuICAgICAgICAgICAgICAgICAgbGV0IHRyaWdnZXI6IEJ1aWxkZXJUcmlnZ2VyO1xuICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBtYXRjaGVzQW55Um91dGUoY3R4LnBhdGgsIFtcbiAgICAgICAgICAgICAgICAgICAgICBST1VURVMuU0lHTl9JTixcbiAgICAgICAgICAgICAgICAgICAgICBST1VURVMuU0lHTl9VUCxcbiAgICAgICAgICAgICAgICAgICAgICBST1VURVMuU0lHTl9JTl9TT0NJQUxfQ0FMTEJBQ0ssXG4gICAgICAgICAgICAgICAgICAgICAgUk9VVEVTLlNJR05fSU5fT0FVVEhfQ0FMTEJBQ0ssXG4gICAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlciA9IGdldFRyaWdnZXJJbmZvKGN0eC5wYXRoLCBzZXNzaW9uLnVzZXJJZCwgc2Vzc2lvbi51c2VySWQpO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBlbWl0KFxuICAgICAgICAgICAgICAgICAgICAgIGNhdGFsb2cuc2Vzc2lvbi50cmFja1VzZXJTaWduZWRJbihlbnJpY2hlZFNlc3Npb24sIHVzZXIsIHRyaWdnZXIsIGxvY2F0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXIgPSB0cmlnZ2VyRm9yKGN0eCwgc2Vzc2lvbi51c2VySWQpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgYXdhaXQgZW1pdChcbiAgICAgICAgICAgICAgICAgICAgY2F0YWxvZy5zZXNzaW9uLnRyYWNrU2Vzc2lvbkNyZWF0ZWQoZW5yaWNoZWRTZXNzaW9uLCB1c2VyLCB0cmlnZ2VyLCBsb2NhdGlvbiksXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgaWYgKGlzTm9uRW1wdHlTdHJpbmcoc2Vzc2lvbi5pbXBlcnNvbmF0ZWRCeSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW1wZXJzb25hdG9yID0gYXdhaXQgZmV0Y2hVc2VyQnkoY3R4LCBcImlkXCIsIHNlc3Npb24uaW1wZXJzb25hdGVkQnkpO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBlbWl0KFxuICAgICAgICAgICAgICAgICAgICAgIGNhdGFsb2cuc2Vzc2lvbi50cmFja1VzZXJJbXBlcnNvbmF0ZWQoXG4gICAgICAgICAgICAgICAgICAgICAgICBlbnJpY2hlZFNlc3Npb24sXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW1wZXJzb25hdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyZWRCeTogc2Vzc2lvbi5pbXBlcnNvbmF0ZWRCeSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckNvbnRleHQ6IHRyaWdnZXIudHJpZ2dlckNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBkZWxldGU6IHtcbiAgICAgICAgICAgICAgICBhZnRlcjogYXN5bmMgKHJhd1Nlc3Npb24sIHJhd0N0eCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3QgY3R4ID0gbmFycm93UmVxdWVzdEN0eChyYXdDdHgpO1xuICAgICAgICAgICAgICAgICAgaWYgKCFjdHgpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNlc3Npb24gPVxuICAgICAgICAgICAgICAgICAgICAvKiBTQUZFVFk6IGJldHRlci1hdXRoIO2bheqzvCDslrTrjJHthLAg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gcmF3U2Vzc2lvbiBhcyBTZXNzaW9uU25hcHNob3Q7XG4gICAgICAgICAgICAgICAgICBjb25zdCBsb2NhdGlvbiA9IGxvY2F0aW9uRm9yKGN0eCk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBlbnJpY2hlZFNlc3Npb246IFNlc3Npb25TbmFwc2hvdCA9IHsgLi4uc2Vzc2lvbiB9O1xuICAgICAgICAgICAgICAgICAgY29uc3QgdXNlciA9IGF3YWl0IGZldGNoVXNlckJ5KGN0eCwgXCJpZFwiLCBzZXNzaW9uLnVzZXJJZCk7XG4gICAgICAgICAgICAgICAgICBjb25zdCB0cmlnZ2VyID0gdHJpZ2dlckZvcihjdHgsIHNlc3Npb24udXNlcklkKTtcbiAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlc0FueVJvdXRlKGN0eC5wYXRoLCBbXG4gICAgICAgICAgICAgICAgICAgICAgUk9VVEVTLlJFVk9LRV9BTExfU0VTU0lPTlMsXG4gICAgICAgICAgICAgICAgICAgICAgUk9VVEVTLkFETUlOX1JFVk9LRV9VU0VSX1NFU1NJT05TLFxuICAgICAgICAgICAgICAgICAgICAgIFJPVVRFUy5EQVNIX1JFVk9LRV9TRVNTSU9OU19BTEwsXG4gICAgICAgICAgICAgICAgICAgICAgUk9VVEVTLkRBU0hfQkFOX1VTRVIsXG4gICAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm9jZXNzZWRCdWxrT3BlcmF0aW9uQ29udGV4dHMuaGFzKGN0eCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBlbWl0KFxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0YWxvZy5zZXNzaW9uLnRyYWNrU2Vzc2lvblJldm9rZWRBbGwoZW5yaWNoZWRTZXNzaW9uLCB1c2VyLCB0cmlnZ2VyKSxcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZEJ1bGtPcGVyYXRpb25Db250ZXh0cy5hZGQoY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtYXRjaGVzQW55Um91dGUoY3R4LnBhdGgsIFtST1VURVMuU0lHTl9PVVRdKSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBlbWl0KFxuICAgICAgICAgICAgICAgICAgICAgIGNhdGFsb2cuc2Vzc2lvbi50cmFja1VzZXJTaWduZWRPdXQoZW5yaWNoZWRTZXNzaW9uLCB1c2VyLCB0cmlnZ2VyLCBsb2NhdGlvbiksXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBlbWl0KFxuICAgICAgICAgICAgICAgICAgICAgIGNhdGFsb2cuc2Vzc2lvbi50cmFja1Nlc3Npb25SZXZva2VkKGVucmljaGVkU2Vzc2lvbiwgdXNlciwgdHJpZ2dlciwgbG9jYXRpb24pLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgaWYgKGlzTm9uRW1wdHlTdHJpbmcoc2Vzc2lvbi5pbXBlcnNvbmF0ZWRCeSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW1wZXJzb25hdG9yID0gYXdhaXQgZmV0Y2hVc2VyQnkoY3R4LCBcImlkXCIsIHNlc3Npb24uaW1wZXJzb25hdGVkQnkpO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBlbWl0KFxuICAgICAgICAgICAgICAgICAgICAgIGNhdGFsb2cuc2Vzc2lvbi50cmFja1VzZXJJbXBlcnNvbmF0aW9uU3RvcChcbiAgICAgICAgICAgICAgICAgICAgICAgIGVucmljaGVkU2Vzc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbXBlcnNvbmF0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFjY291bnQ6IHtcbiAgICAgICAgICAgICAgY3JlYXRlOiB7XG4gICAgICAgICAgICAgICAgYWZ0ZXI6IGFzeW5jIChyYXdBY2NvdW50LCByYXdDdHgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGN0eCA9IG5hcnJvd1JlcXVlc3RDdHgocmF3Q3R4KTtcbiAgICAgICAgICAgICAgICAgIGlmICghY3R4KSByZXR1cm47XG4gICAgICAgICAgICAgICAgICBjb25zdCBhY2NvdW50ID1cbiAgICAgICAgICAgICAgICAgICAgLyogU0FGRVRZOiBiZXR0ZXItYXV0aCDtm4Xqs7wg7Ja064yR7YSwIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIHJhd0FjY291bnQgYXMgQWNjb3VudFNuYXBzaG90O1xuICAgICAgICAgICAgICAgICAgaWYgKCFhY2NvdW50LnVzZXJJZCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgY29uc3QgdXNlciA9IGF3YWl0IGZldGNoVXNlckJ5KGN0eCwgXCJpZFwiLCBhY2NvdW50LnVzZXJJZCk7XG4gICAgICAgICAgICAgICAgICBhd2FpdCBlbWl0KFxuICAgICAgICAgICAgICAgICAgICBjYXRhbG9nLmFjY291bnQudHJhY2tBY2NvdW50TGlua2luZyhcbiAgICAgICAgICAgICAgICAgICAgICBhY2NvdW50LFxuICAgICAgICAgICAgICAgICAgICAgIHVzZXIsXG4gICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckZvcihjdHgsIGFjY291bnQudXNlcklkKSxcbiAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbkZvcihjdHgpLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB1cGRhdGU6IHtcbiAgICAgICAgICAgICAgICBhZnRlcjogYXN5bmMgKHJhd0FjY291bnQsIHJhd0N0eCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3QgY3R4ID0gbmFycm93UmVxdWVzdEN0eChyYXdDdHgpO1xuICAgICAgICAgICAgICAgICAgaWYgKCFjdHgpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGFjY291bnQgPVxuICAgICAgICAgICAgICAgICAgICAvKiBTQUZFVFk6IGJldHRlci1hdXRoIO2bheqzvCDslrTrjJHthLAg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gcmF3QWNjb3VudCBhcyBBY2NvdW50U25hcHNob3Q7XG4gICAgICAgICAgICAgICAgICBpZiAoIWFjY291bnQudXNlcklkKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICFtYXRjaGVzQW55Um91dGUoY3R4LnBhdGgsIFtcbiAgICAgICAgICAgICAgICAgICAgICBST1VURVMuQ0hBTkdFX1BBU1NXT1JELFxuICAgICAgICAgICAgICAgICAgICAgIFJPVVRFUy5TRVRfUEFTU1dPUkQsXG4gICAgICAgICAgICAgICAgICAgICAgUk9VVEVTLlJFU0VUX1BBU1NXT1JELFxuICAgICAgICAgICAgICAgICAgICAgIFJPVVRFUy5BRE1JTl9TRVRfUEFTU1dPUkQsXG4gICAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY29uc3QgdXNlciA9IGF3YWl0IGZldGNoVXNlckJ5KGN0eCwgXCJpZFwiLCBhY2NvdW50LnVzZXJJZCk7XG4gICAgICAgICAgICAgICAgICBhd2FpdCBlbWl0KFxuICAgICAgICAgICAgICAgICAgICBjYXRhbG9nLmFjY291bnQudHJhY2tBY2NvdW50UGFzc3dvcmRDaGFuZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgYWNjb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICB1c2VyLFxuICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJGb3IoY3R4LCBhY2NvdW50LnVzZXJJZCksXG4gICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25Gb3IoY3R4KSxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZGVsZXRlOiB7XG4gICAgICAgICAgICAgICAgYWZ0ZXI6IGFzeW5jIChyYXdBY2NvdW50LCByYXdDdHgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGN0eCA9IG5hcnJvd1JlcXVlc3RDdHgocmF3Q3R4KTtcbiAgICAgICAgICAgICAgICAgIGlmICghY3R4KSByZXR1cm47XG4gICAgICAgICAgICAgICAgICBjb25zdCBhY2NvdW50ID1cbiAgICAgICAgICAgICAgICAgICAgLyogU0FGRVRZOiBiZXR0ZXItYXV0aCDtm4Xqs7wg7Ja064yR7YSwIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIHJhd0FjY291bnQgYXMgQWNjb3VudFNuYXBzaG90O1xuICAgICAgICAgICAgICAgICAgaWYgKCFhY2NvdW50LnVzZXJJZCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgY29uc3QgdXNlciA9IGF3YWl0IGZldGNoVXNlckJ5KGN0eCwgXCJpZFwiLCBhY2NvdW50LnVzZXJJZCk7XG4gICAgICAgICAgICAgICAgICBhd2FpdCBlbWl0KFxuICAgICAgICAgICAgICAgICAgICBjYXRhbG9nLmFjY291bnQudHJhY2tBY2NvdW50VW5saW5rKFxuICAgICAgICAgICAgICAgICAgICAgIGFjY291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgdXNlcixcbiAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyRm9yKGN0eCwgYWNjb3VudC51c2VySWQpLFxuICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uRm9yKGN0eCksXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyaWZpY2F0aW9uOiB7XG4gICAgICAgICAgICAgIGNyZWF0ZToge1xuICAgICAgICAgICAgICAgIGFmdGVyOiBhc3luYyAocmF3VmVyaWZpY2F0aW9uLCByYXdDdHgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGN0eCA9IG5hcnJvd1JlcXVlc3RDdHgocmF3Q3R4KTtcbiAgICAgICAgICAgICAgICAgIGlmICghY3R4KSByZXR1cm47XG4gICAgICAgICAgICAgICAgICBpZiAoIW1hdGNoZXNBbnlSb3V0ZShjdHgucGF0aCwgW1JPVVRFUy5SRVFVRVNUX1BBU1NXT1JEX1JFU0VUXSkpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbiA9XG4gICAgICAgICAgICAgICAgICAgIC8qIFNBRkVUWTogYmV0dGVyLWF1dGgg7ZuF6rO8IOyWtOuMke2EsCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyByYXdWZXJpZmljYXRpb24gYXMgVmVyaWZpY2F0aW9uU25hcHNob3Q7XG4gICAgICAgICAgICAgICAgICBjb25zdCBzZXNzaW9uVXNlcklkID0gY3R4LmNvbnRleHQuc2Vzc2lvbj8udXNlcj8uaWQgPz8gXCJ1bmtub3duXCI7XG4gICAgICAgICAgICAgICAgICBjb25zdCB0cmlnZ2VyID0gZ2V0VHJpZ2dlckluZm8oY3R4LnBhdGgsIHNlc3Npb25Vc2VySWQsIHNlc3Npb25Vc2VySWQpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgdXNlciA9IGF3YWl0IGZldGNoVXNlckJ5KGN0eCwgXCJpZFwiLCB2ZXJpZmljYXRpb24udmFsdWUpO1xuICAgICAgICAgICAgICAgICAgYXdhaXQgZW1pdChcbiAgICAgICAgICAgICAgICAgICAgY2F0YWxvZy52ZXJpZmljYXRpb24udHJhY2tQYXNzd29yZFJlc2V0UmVxdWVzdChcbiAgICAgICAgICAgICAgICAgICAgICB2ZXJpZmljYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgdXNlcixcbiAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyLFxuICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uRm9yKGN0eCksXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGRlbGV0ZToge1xuICAgICAgICAgICAgICAgIGFmdGVyOiBhc3luYyAocmF3VmVyaWZpY2F0aW9uLCByYXdDdHgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGN0eCA9IG5hcnJvd1JlcXVlc3RDdHgocmF3Q3R4KTtcbiAgICAgICAgICAgICAgICAgIGlmICghY3R4KSByZXR1cm47XG4gICAgICAgICAgICAgICAgICBpZiAoIW1hdGNoZXNBbnlSb3V0ZShjdHgucGF0aCwgW1JPVVRFUy5SRVNFVF9QQVNTV09SRF0pKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICBjb25zdCB2ZXJpZmljYXRpb24gPVxuICAgICAgICAgICAgICAgICAgICAvKiBTQUZFVFk6IGJldHRlci1hdXRoIO2bheqzvCDslrTrjJHthLAg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gcmF3VmVyaWZpY2F0aW9uIGFzIFZlcmlmaWNhdGlvblNuYXBzaG90O1xuICAgICAgICAgICAgICAgICAgY29uc3Qgc2Vzc2lvblVzZXJJZCA9IGN0eC5jb250ZXh0LnNlc3Npb24/LnVzZXI/LmlkID8/IFwidW5rbm93blwiO1xuICAgICAgICAgICAgICAgICAgY29uc3QgdHJpZ2dlciA9IGdldFRyaWdnZXJJbmZvKGN0eC5wYXRoLCBzZXNzaW9uVXNlcklkLCBzZXNzaW9uVXNlcklkKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHVzZXIgPSBhd2FpdCBmZXRjaFVzZXJCeShjdHgsIFwiaWRcIiwgdmVyaWZpY2F0aW9uLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgIGF3YWl0IGVtaXQoXG4gICAgICAgICAgICAgICAgICAgIGNhdGFsb2cudmVyaWZpY2F0aW9uLnRyYWNrUGFzc3dvcmRSZXNldFJlcXVlc3RDb21wbGV0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgIHZlcmlmaWNhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICB1c2VyLFxuICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIsXG4gICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25Gb3IoY3R4KSxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSxcblxuICAgIGhvb2tzOiB7XG4gICAgICBiZWZvcmU6IFtcbiAgICAgICAge1xuICAgICAgICAgIC8vIGRhc2gg7KCc6rGw66GcIOyCrOudvOynhCBsb2NhdGlvbiDqs7XquIkg6rK966Gc66W8IOuzteq1rO2VnOuLpC5cbiAgICAgICAgICAvLyDrqqjrk6Ag7JqU7LKt7JeQ7IScIGN0eC5jb250ZXh0LmxvY2F0aW9u7J2EIOyxhOybjCDsnbTtm4Qg67mM642U65Ok7J20IGlwQWRkcmVzcy9jaXR5L2NvdW50cnlDb2Rl66W8IOq4sOuhne2VoCDsiJgg7J6I6rKMIO2VnOuLpC5cbiAgICAgICAgICBtYXRjaGVyOiAoKSA9PiB0cnVlLFxuICAgICAgICAgIGhhbmRsZXI6IGNyZWF0ZUF1dGhNaWRkbGV3YXJlKGFzeW5jIChyYXdDdHgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGN0eDogQmV0dGVyQXV0aFJlcXVlc3RDdHggPSByYXdDdHg7XG4gICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gY3R4LmhlYWRlcnMgPz8gY3R4LnJlcXVlc3Q/LmhlYWRlcnM7XG4gICAgICAgICAgICBjdHguY29udGV4dC5sb2NhdGlvbiA9IGV4dHJhY3RMb2NhdGlvbkZyb21IZWFkZXJzKGhlYWRlcnMpO1xuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGFmdGVyOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAvLyBkYXNoIDc0NjItNzQ4NyDrr7jrn6w6IHZlcmlmaWNhdGlvbiBlbWFpbCBzZW5kLCBzaWduLWluIGF0dGVtcHRzLlxuICAgICAgICAgIC8vIEdFVCDsmpTssq3snYAg7L2c67CxIOqyveuhnOunjCDthrXqs7zsi5ztgqjri6QuXG4gICAgICAgICAgbWF0Y2hlcjogKGN0eCk6IGJvb2xlYW4gPT4ge1xuICAgICAgICAgICAgaWYgKGN0eC5yZXF1ZXN0Py5tZXRob2QgIT09IFwiR0VUXCIpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgaWYgKCFjdHgucmVxdWVzdC51cmwpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IHAgPSBuZXcgVVJMKGN0eC5yZXF1ZXN0LnVybCkucGF0aG5hbWU7XG4gICAgICAgICAgICAgIHJldHVybiBtYXRjaGVzQW55Um91dGUocCwgW1xuICAgICAgICAgICAgICAgIFJPVVRFUy5TSUdOX0lOX1NPQ0lBTF9DQUxMQkFDSyxcbiAgICAgICAgICAgICAgICBST1VURVMuU0lHTl9JTl9PQVVUSF9DQUxMQkFDSyxcbiAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgaGFuZGxlcjogY3JlYXRlQXV0aE1pZGRsZXdhcmUoYXN5bmMgKHJhd0N0eCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gbmFycm93UmVxdWVzdEN0eChyYXdDdHgpO1xuICAgICAgICAgICAgaWYgKCFjdHgpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IHNlc3Npb25Vc2VyID0gY3R4LmNvbnRleHQuc2Vzc2lvbj8udXNlcjtcbiAgICAgICAgICAgIGNvbnN0IHNlc3Npb25Vc2VySWQgPSBzZXNzaW9uVXNlcj8uaWQgPz8gXCJ1bmtub3duXCI7XG4gICAgICAgICAgICBjb25zdCB0cmlnZ2VyID0gZ2V0VHJpZ2dlckluZm8oY3R4LnBhdGgsIHNlc3Npb25Vc2VySWQsIHNlc3Npb25Vc2VySWQpO1xuICAgICAgICAgICAgY29uc3QgbG9jYXRpb24gPSBsb2NhdGlvbkZvcihjdHgpO1xuICAgICAgICAgICAgY29uc3QgcmV0dXJuZWQgPSBjdHguY29udGV4dC5yZXR1cm5lZDtcbiAgICAgICAgICAgIGNvbnN0IGlzRXJyb3JlZCA9IHJldHVybmVkIGluc3RhbmNlb2YgRXJyb3I7XG5cbiAgICAgICAgICAgIC8vIHZlcmlmaWNhdGlvbiBlbWFpbCBzZW50XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIG1hdGNoZXNBbnlSb3V0ZShjdHgucGF0aCwgW1JPVVRFUy5TRU5EX1ZFUklGSUNBVElPTl9FTUFJTF0pICYmXG4gICAgICAgICAgICAgIGN0eC5jb250ZXh0LnNlc3Npb24gJiZcbiAgICAgICAgICAgICAgIWlzRXJyb3JlZFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHNlc3Npb25FbnRpdHkgPVxuICAgICAgICAgICAgICAgIC8qIFNBRkVUWTogYmV0dGVyLWF1dGgg7ZuF6rO8IOyWtOuMke2EsCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBjdHguY29udGV4dFxuICAgICAgICAgICAgICAgICAgLnNlc3Npb24uc2Vzc2lvbiBhcyBTZXNzaW9uU25hcHNob3QgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIGNvbnN0IHVzZXIgPSAvKiBTQUZFVFk6IGJldHRlci1hdXRoIO2bheqzvCDslrTrjJHthLAg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gY3R4XG4gICAgICAgICAgICAgICAgLmNvbnRleHQuc2Vzc2lvbi51c2VyIGFzIHsgbmFtZT86IHN0cmluZzsgZW1haWw/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgaWYgKHNlc3Npb25FbnRpdHkgJiYgdXNlcikge1xuICAgICAgICAgICAgICAgIGF3YWl0IGVtaXQoXG4gICAgICAgICAgICAgICAgICBjYXRhbG9nLnNlc3Npb24udHJhY2tFbWFpbFZlcmlmaWNhdGlvblNlbnQoc2Vzc2lvbkVudGl0eSwgdXNlciwgdHJpZ2dlciksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBib2R5ID0gY3R4LmJvZHk7XG4gICAgICAgICAgICAvLyBlbWFpbCBzaWduLWluIGF0dGVtcHQgZmFpbGVkXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIG1hdGNoZXNBbnlSb3V0ZShjdHgucGF0aCwgW1JPVVRFUy5TSUdOX0lOX0VNQUlMLCBST1VURVMuU0lHTl9JTl9FTUFJTF9PVFBdKSAmJlxuICAgICAgICAgICAgICBpc0Vycm9yZWQgJiZcbiAgICAgICAgICAgICAgaXNTdHJpbmdWYWx1ZShib2R5Py5lbWFpbClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBjb25zdCB1c2VyID0gYXdhaXQgZmV0Y2hVc2VyQnkoY3R4LCBcImVtYWlsXCIsIGJvZHkuZW1haWwpO1xuICAgICAgICAgICAgICBhd2FpdCBlbWl0KFxuICAgICAgICAgICAgICAgIGNhdGFsb2cuc2Vzc2lvbi50cmFja0VtYWlsU2lnbkluQXR0ZW1wdChcbiAgICAgICAgICAgICAgICAgIHsgZW1haWw6IGJvZHkuZW1haWwsIGxvZ2luTWV0aG9kOiBnZXRMb2dpbk1ldGhvZChjdHgucGF0aCwgY3R4LnBhcmFtcz8uaWQpIH0sXG4gICAgICAgICAgICAgICAgICB1c2VyLFxuICAgICAgICAgICAgICAgICAgdHJpZ2dlcixcbiAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBzb2NpYWwgc2lnbi1pbiBhdHRlbXB0IGZhaWxlZCAoUE9TVClcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgbWF0Y2hlc0FueVJvdXRlKGN0eC5wYXRoLCBbUk9VVEVTLlNJR05fSU5fU09DSUFMXSkgJiZcbiAgICAgICAgICAgICAgaXNFcnJvcmVkICYmXG4gICAgICAgICAgICAgIGlzU3RyaW5nVmFsdWUoYm9keT8ucHJvdmlkZXIpICYmXG4gICAgICAgICAgICAgIGlzU3RyaW5nVmFsdWUoYm9keT8uaWRUb2tlbilcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBhd2FpdCBlbWl0KFxuICAgICAgICAgICAgICAgIGNhdGFsb2cuc2Vzc2lvbi50cmFja1NvY2lhbFNpZ25JbkF0dGVtcHQoXG4gICAgICAgICAgICAgICAgICB7IGxvZ2luTWV0aG9kOiBnZXRMb2dpbk1ldGhvZChjdHgucGF0aCwgY3R4LnBhcmFtcz8uaWQpIH0sXG4gICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgdHJpZ2dlcixcbiAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBzb2NpYWwgcmVkaXJlY3Rpb24gY2FsbGJhY2sgZmFpbGVkIChHRVQpXG4gICAgICAgICAgICBpZiAobWF0Y2hlc0FueVJvdXRlKGN0eC5wYXRoLCBbUk9VVEVTLlNJR05fSU5fU09DSUFMX0NBTExCQUNLXSkgJiYgaXNFcnJvcmVkKSB7XG4gICAgICAgICAgICAgIGF3YWl0IGVtaXQoXG4gICAgICAgICAgICAgICAgY2F0YWxvZy5zZXNzaW9uLnRyYWNrU29jaWFsU2lnbkluUmVkaXJlY3Rpb25BdHRlbXB0KFxuICAgICAgICAgICAgICAgICAgeyBsb2dpbk1ldGhvZDogZ2V0TG9naW5NZXRob2QoY3R4LnBhdGgsIGN0eC5wYXJhbXM/LmlkKSB9LFxuICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgIHRyaWdnZXIsXG4gICAgICAgICAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9LFxuICB9O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBPcmdhbml6YXRpb24gaG9vayDtlanshLEgKG9yZ2FuaXphdGlvbiDtlIzrn6zqt7jsnbjsnbQg7Zmc7ISx7ZmU65CcIOqyveyasOyXkOunjClcbi8vIGRhc2ggNzE5Mi03MjgxIOuvuOufrC5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbnR5cGUgRXZlbnRFbWl0dGVyID0gKGV2ZW50OiBBdWRpdExvZ0V2ZW50KSA9PiBQcm9taXNlPHZvaWQ+O1xudHlwZSBBdWRpdExvZ2dlciA9IFJldHVyblR5cGU8dHlwZW9mIGdldExvZ2dlcj47XG5cbmZ1bmN0aW9uIGluc3RhbGxPcmdhbml6YXRpb25Ib29rcyhcbiAgcGx1Z2luQ3R4OiBBdXRoQ29udGV4dCxcbiAgY2F0YWxvZzogUmV0dXJuVHlwZTx0eXBlb2YgYnVpbGRBdWRpdEV2ZW50Q2F0YWxvZz4sXG4gIGVtaXQ6IEV2ZW50RW1pdHRlcixcbiAgbG9nZ2VyOiBBdWRpdExvZ2dlcixcbik6IHZvaWQge1xuICBjb25zdCBvcmdhbml6YXRpb25QbHVnaW4gPSBwbHVnaW5DdHguZ2V0UGx1Z2luKFwib3JnYW5pemF0aW9uXCIpO1xuXG4gIGlmICghb3JnYW5pemF0aW9uUGx1Z2luKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwib3JnYW5pemF0aW9uIHBsdWdpbiBub3QgYWN0aXZlOyBza2lwcGluZyBpbnN0cnVtZW50YXRpb25cIik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgb3JnYW5pemF0aW9uUGx1Z2luLm9wdGlvbnMgPSBvcmdhbml6YXRpb25QbHVnaW4ub3B0aW9ucyA/PyB7fTtcbiAgY29uc3QgaG9va3MgPSAob3JnYW5pemF0aW9uUGx1Z2luLm9wdGlvbnMub3JnYW5pemF0aW9uSG9va3MgPVxuICAgIG9yZ2FuaXphdGlvblBsdWdpbi5vcHRpb25zLm9yZ2FuaXphdGlvbkhvb2tzID8/IHt9KTtcblxuICBob29rcy5hZnRlckNyZWF0ZU9yZ2FuaXphdGlvbiA9IHdyYXBPcmdIb29rKGhvb2tzLmFmdGVyQ3JlYXRlT3JnYW5pemF0aW9uLCBhc3luYyAocCkgPT5cbiAgICBlbWl0KFxuICAgICAgY2F0YWxvZy5vcmdhbml6YXRpb24udHJhY2tPcmdhbml6YXRpb25DcmVhdGVkKFxuICAgICAgICBwLm9yZ2FuaXphdGlvbixcbiAgICAgICAgZ2V0T3JnYW5pemF0aW9uVHJpZ2dlckluZm8ocC51c2VyKSxcbiAgICAgICksXG4gICAgKSxcbiAgKTtcblxuICBob29rcy5hZnRlclVwZGF0ZU9yZ2FuaXphdGlvbiA9IHdyYXBPcmdIb29rKGhvb2tzLmFmdGVyVXBkYXRlT3JnYW5pemF0aW9uLCBhc3luYyAocCkgPT4ge1xuICAgIGlmICghcC5vcmdhbml6YXRpb24pIHJldHVybjtcbiAgICBhd2FpdCBlbWl0KFxuICAgICAgY2F0YWxvZy5vcmdhbml6YXRpb24udHJhY2tPcmdhbml6YXRpb25VcGRhdGVkKFxuICAgICAgICBwLm9yZ2FuaXphdGlvbixcbiAgICAgICAgZ2V0T3JnYW5pemF0aW9uVHJpZ2dlckluZm8ocC51c2VyKSxcbiAgICAgICksXG4gICAgKTtcbiAgfSk7XG5cbiAgaG9va3MuYWZ0ZXJBZGRNZW1iZXIgPSB3cmFwT3JnSG9vayhob29rcy5hZnRlckFkZE1lbWJlciwgYXN5bmMgKHApID0+XG4gICAgZW1pdChcbiAgICAgIGNhdGFsb2cubWVtYmVyLnRyYWNrT3JnYW5pemF0aW9uTWVtYmVyQWRkZWQoXG4gICAgICAgIHAub3JnYW5pemF0aW9uLFxuICAgICAgICBwLm1lbWJlcixcbiAgICAgICAgcC51c2VyLFxuICAgICAgICBnZXRPcmdhbml6YXRpb25UcmlnZ2VySW5mbyhwLnVzZXIpLFxuICAgICAgKSxcbiAgICApLFxuICApO1xuXG4gIGhvb2tzLmFmdGVyUmVtb3ZlTWVtYmVyID0gd3JhcE9yZ0hvb2soaG9va3MuYWZ0ZXJSZW1vdmVNZW1iZXIsIGFzeW5jIChwKSA9PlxuICAgIGVtaXQoXG4gICAgICBjYXRhbG9nLm1lbWJlci50cmFja09yZ2FuaXphdGlvbk1lbWJlclJlbW92ZWQoXG4gICAgICAgIHAub3JnYW5pemF0aW9uLFxuICAgICAgICBwLm1lbWJlcixcbiAgICAgICAgcC51c2VyLFxuICAgICAgICBnZXRPcmdhbml6YXRpb25UcmlnZ2VySW5mbyhwLnVzZXIpLFxuICAgICAgKSxcbiAgICApLFxuICApO1xuXG4gIGhvb2tzLmFmdGVyVXBkYXRlTWVtYmVyUm9sZSA9IHdyYXBPcmdIb29rKGhvb2tzLmFmdGVyVXBkYXRlTWVtYmVyUm9sZSwgYXN5bmMgKHApID0+XG4gICAgZW1pdChcbiAgICAgIGNhdGFsb2cubWVtYmVyLnRyYWNrT3JnYW5pemF0aW9uTWVtYmVyUm9sZVVwZGF0ZWQoXG4gICAgICAgIHAub3JnYW5pemF0aW9uLFxuICAgICAgICBwLm1lbWJlcixcbiAgICAgICAgcC51c2VyLFxuICAgICAgICBwLnByZXZpb3VzUm9sZSxcbiAgICAgICAgZ2V0T3JnYW5pemF0aW9uVHJpZ2dlckluZm8ocC51c2VyKSxcbiAgICAgICksXG4gICAgKSxcbiAgKTtcblxuICBob29rcy5hZnRlckNyZWF0ZUludml0YXRpb24gPSB3cmFwT3JnSG9vayhob29rcy5hZnRlckNyZWF0ZUludml0YXRpb24sIGFzeW5jIChwKSA9PlxuICAgIGVtaXQoXG4gICAgICBjYXRhbG9nLmludml0YXRpb24udHJhY2tPcmdhbml6YXRpb25NZW1iZXJJbnZpdGVkKFxuICAgICAgICBwLm9yZ2FuaXphdGlvbixcbiAgICAgICAgcC5pbnZpdGF0aW9uLFxuICAgICAgICBwLmludml0ZXIsXG4gICAgICAgIGdldE9yZ2FuaXphdGlvblRyaWdnZXJJbmZvKHAuaW52aXRlciksXG4gICAgICApLFxuICAgICksXG4gICk7XG5cbiAgaG9va3MuYWZ0ZXJBY2NlcHRJbnZpdGF0aW9uID0gd3JhcE9yZ0hvb2soaG9va3MuYWZ0ZXJBY2NlcHRJbnZpdGF0aW9uLCBhc3luYyAocCkgPT5cbiAgICBlbWl0KFxuICAgICAgY2F0YWxvZy5pbnZpdGF0aW9uLnRyYWNrT3JnYW5pemF0aW9uTWVtYmVySW52aXRlQWNjZXB0ZWQoXG4gICAgICAgIHAub3JnYW5pemF0aW9uLFxuICAgICAgICBwLmludml0YXRpb24sXG4gICAgICAgIHAubWVtYmVyLFxuICAgICAgICBwLnVzZXIsXG4gICAgICAgIGdldE9yZ2FuaXphdGlvblRyaWdnZXJJbmZvKHAudXNlciksXG4gICAgICApLFxuICAgICksXG4gICk7XG5cbiAgaG9va3MuYWZ0ZXJSZWplY3RJbnZpdGF0aW9uID0gd3JhcE9yZ0hvb2soaG9va3MuYWZ0ZXJSZWplY3RJbnZpdGF0aW9uLCBhc3luYyAocCkgPT5cbiAgICBlbWl0KFxuICAgICAgY2F0YWxvZy5pbnZpdGF0aW9uLnRyYWNrT3JnYW5pemF0aW9uTWVtYmVySW52aXRlUmVqZWN0ZWQoXG4gICAgICAgIHAub3JnYW5pemF0aW9uLFxuICAgICAgICBwLmludml0YXRpb24sXG4gICAgICAgIHAudXNlcixcbiAgICAgICAgZ2V0T3JnYW5pemF0aW9uVHJpZ2dlckluZm8ocC51c2VyKSxcbiAgICAgICksXG4gICAgKSxcbiAgKTtcblxuICBob29rcy5hZnRlckNhbmNlbEludml0YXRpb24gPSB3cmFwT3JnSG9vayhob29rcy5hZnRlckNhbmNlbEludml0YXRpb24sIGFzeW5jIChwKSA9PlxuICAgIGVtaXQoXG4gICAgICBjYXRhbG9nLmludml0YXRpb24udHJhY2tPcmdhbml6YXRpb25NZW1iZXJJbnZpdGVDYW5jZWxlZChcbiAgICAgICAgcC5vcmdhbml6YXRpb24sXG4gICAgICAgIHAuaW52aXRhdGlvbixcbiAgICAgICAgcC5jYW5jZWxsZWRCeSxcbiAgICAgICAgZ2V0T3JnYW5pemF0aW9uVHJpZ2dlckluZm8ocC5jYW5jZWxsZWRCeSksXG4gICAgICApLFxuICAgICksXG4gICk7XG5cbiAgaG9va3MuYWZ0ZXJDcmVhdGVUZWFtID0gd3JhcE9yZ0hvb2soaG9va3MuYWZ0ZXJDcmVhdGVUZWFtLCBhc3luYyAocCkgPT5cbiAgICBlbWl0KFxuICAgICAgY2F0YWxvZy50ZWFtLnRyYWNrT3JnYW5pemF0aW9uVGVhbUNyZWF0ZWQoXG4gICAgICAgIHAub3JnYW5pemF0aW9uLFxuICAgICAgICBwLnRlYW0sXG4gICAgICAgIGdldE9yZ2FuaXphdGlvblRyaWdnZXJJbmZvKHAudXNlciksXG4gICAgICApLFxuICAgICksXG4gICk7XG5cbiAgaG9va3MuYWZ0ZXJVcGRhdGVUZWFtID0gd3JhcE9yZ0hvb2soaG9va3MuYWZ0ZXJVcGRhdGVUZWFtLCBhc3luYyAocCkgPT4ge1xuICAgIGlmICghcC50ZWFtKSByZXR1cm47XG4gICAgYXdhaXQgZW1pdChcbiAgICAgIGNhdGFsb2cudGVhbS50cmFja09yZ2FuaXphdGlvblRlYW1VcGRhdGVkKFxuICAgICAgICBwLm9yZ2FuaXphdGlvbixcbiAgICAgICAgcC50ZWFtLFxuICAgICAgICBnZXRPcmdhbml6YXRpb25UcmlnZ2VySW5mbyhwLnVzZXIpLFxuICAgICAgKSxcbiAgICApO1xuICB9KTtcblxuICBob29rcy5hZnRlckRlbGV0ZVRlYW0gPSB3cmFwT3JnSG9vayhob29rcy5hZnRlckRlbGV0ZVRlYW0sIGFzeW5jIChwKSA9PlxuICAgIGVtaXQoXG4gICAgICBjYXRhbG9nLnRlYW0udHJhY2tPcmdhbml6YXRpb25UZWFtRGVsZXRlZChcbiAgICAgICAgcC5vcmdhbml6YXRpb24sXG4gICAgICAgIHAudGVhbSxcbiAgICAgICAgZ2V0T3JnYW5pemF0aW9uVHJpZ2dlckluZm8ocC51c2VyKSxcbiAgICAgICksXG4gICAgKSxcbiAgKTtcblxuICBob29rcy5hZnRlckFkZFRlYW1NZW1iZXIgPSB3cmFwT3JnSG9vayhob29rcy5hZnRlckFkZFRlYW1NZW1iZXIsIGFzeW5jIChwKSA9PlxuICAgIGVtaXQoXG4gICAgICBjYXRhbG9nLnRlYW0udHJhY2tPcmdhbml6YXRpb25UZWFtTWVtYmVyQWRkZWQoXG4gICAgICAgIHAub3JnYW5pemF0aW9uLFxuICAgICAgICBwLnRlYW0sXG4gICAgICAgIHAudXNlcixcbiAgICAgICAgcC50ZWFtTWVtYmVyLFxuICAgICAgICBnZXRPcmdhbml6YXRpb25UcmlnZ2VySW5mbyhwLnVzZXIpLFxuICAgICAgKSxcbiAgICApLFxuICApO1xuXG4gIGhvb2tzLmFmdGVyUmVtb3ZlVGVhbU1lbWJlciA9IHdyYXBPcmdIb29rKGhvb2tzLmFmdGVyUmVtb3ZlVGVhbU1lbWJlciwgYXN5bmMgKHApID0+XG4gICAgZW1pdChcbiAgICAgIGNhdGFsb2cudGVhbS50cmFja09yZ2FuaXphdGlvblRlYW1NZW1iZXJSZW1vdmVkKFxuICAgICAgICBwLm9yZ2FuaXphdGlvbixcbiAgICAgICAgcC50ZWFtLFxuICAgICAgICBwLnVzZXIsXG4gICAgICAgIHAudGVhbU1lbWJlcixcbiAgICAgICAgZ2V0T3JnYW5pemF0aW9uVHJpZ2dlckluZm8ocC51c2VyKSxcbiAgICAgICksXG4gICAgKSxcbiAgKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7UUFJc0M7bUJBQ2tDO0FBa0J4RSxNQUFNLGNBQWMsVUFBMEIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQU07QUFDckUsTUFBTSxlQUFlLFVBQTBCLE1BQU0sUUFBUSx1QkFBdUIsTUFBTTtBQUMxRixNQUFNLGdCQUFnQixVQUEwQjtDQUM5QyxNQUFNLFVBQVUsWUFBWSxXQUFXLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxlQUFlLFFBQVE7Q0FDOUUsT0FBTyxJQUFJLE9BQU8sR0FBRyxRQUFRLFdBQVc7QUFDMUM7QUFDQSxNQUFNLG1CQUFtQixXQUErQixXQUF1QztDQUM3RixJQUFJLENBQUMsV0FBVyxPQUFPO0NBQ3ZCLE1BQU0sWUFBWSxXQUFXLFNBQVM7Q0FDdEMsT0FBTyxPQUFPLE1BQU0sVUFBVSxhQUFhLEtBQUssQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDO0FBQ25FO0FBRUEsTUFBTSxjQUFjO0NBQ2xCLE9BQU87Q0FDUCxPQUFPO0NBQ1AsT0FBTztDQUNQLE9BQU87Q0FDUCxPQUFPO0NBQ1AsT0FBTztBQUNUO0FBR0Es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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit-log-ingestor.d.ts","sourceRoot":"","sources":["../../src/auth/audit-log-ingestor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"audit-log-ingestor.d.ts","sourceRoot":"","sources":["../../src/auth/audit-log-ingestor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,MAAM,CAAC;AAIjC,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AA8I7E;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA0FpF"}
|