sonamu 0.9.20 → 0.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_virtual/_rolldown/runtime.js +36 -0
- package/dist/ai/agents/agent.js +5 -7
- package/dist/ai/agents/index.js +1 -2
- package/dist/ai/agents/types.js +1 -1
- package/dist/ai/index.js +1 -2
- package/dist/ai/providers/rtzr/api.js +2 -3
- package/dist/ai/providers/rtzr/error.js +14 -29
- package/dist/ai/providers/rtzr/index.js +1 -2
- package/dist/ai/providers/rtzr/model.js +13 -20
- package/dist/ai/providers/rtzr/options.js +2 -3
- package/dist/ai/providers/rtzr/provider.js +2 -3
- package/dist/ai/providers/rtzr/utils.js +12 -21
- package/dist/api/base-frame.js +4 -4
- package/dist/api/caster.js +21 -38
- package/dist/api/code-converters.js +41 -98
- package/dist/api/config.d.ts +1 -10
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +9 -8
- package/dist/api/context.js +2 -3
- package/dist/api/decorators.js +80 -116
- package/dist/api/index.js +2 -3
- package/dist/api/secret.js +6 -10
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +210 -406
- package/dist/api/validator.js +5 -8
- package/dist/api/websocket-helpers.js +22 -33
- package/dist/auth/audit-log/builders.d.ts.map +1 -1
- package/dist/auth/audit-log/builders.js +4 -3
- package/dist/auth/audit-log/client-ip.d.ts +3 -0
- package/dist/auth/audit-log/client-ip.d.ts.map +1 -0
- package/dist/auth/audit-log/client-ip.js +27 -0
- package/dist/auth/audit-log/events.d.ts +1 -0
- package/dist/auth/audit-log/events.d.ts.map +1 -1
- package/dist/auth/audit-log/events.js +2 -2
- package/dist/auth/audit-log/plugin.js +30 -61
- package/dist/auth/audit-log-ingestor.d.ts.map +1 -1
- package/dist/auth/audit-log-ingestor.js +26 -43
- package/dist/auth/auth-generator.js +16 -41
- package/dist/auth/better-auth-entities.js +3 -4
- package/dist/auth/better-auth-request.d.ts +3 -0
- package/dist/auth/better-auth-request.d.ts.map +1 -0
- package/dist/auth/better-auth-request.js +23 -0
- package/dist/auth/index.js +2 -3
- package/dist/auth/knex-adapter.js +18 -45
- package/dist/auth/plugins/entity-definitions/admin.js +2 -2
- package/dist/auth/plugins/entity-definitions/anonymous.js +2 -2
- package/dist/auth/plugins/entity-definitions/api-key.js +2 -2
- package/dist/auth/plugins/entity-definitions/audit-log.js +2 -2
- package/dist/auth/plugins/entity-definitions/index.js +2 -3
- package/dist/auth/plugins/entity-definitions/jwt.js +2 -2
- package/dist/auth/plugins/entity-definitions/organization.js +2 -2
- package/dist/auth/plugins/entity-definitions/passkey.js +2 -2
- package/dist/auth/plugins/entity-definitions/phone-number.js +2 -2
- package/dist/auth/plugins/entity-definitions/sso.js +2 -2
- package/dist/auth/plugins/entity-definitions/two-factor.js +2 -2
- package/dist/auth/plugins/entity-definitions/types.js +1 -1
- package/dist/auth/plugins/entity-definitions/username.js +2 -2
- package/dist/auth/plugins/index.js +1 -2
- package/dist/auth/plugins/wrappers/admin.js +2 -3
- package/dist/auth/plugins/wrappers/anonymous.js +2 -3
- package/dist/auth/plugins/wrappers/api-key.js +2 -3
- package/dist/auth/plugins/wrappers/index.js +1 -2
- package/dist/auth/plugins/wrappers/jwt.js +2 -3
- package/dist/auth/plugins/wrappers/organization.js +2 -3
- package/dist/auth/plugins/wrappers/passkey.js +2 -3
- package/dist/auth/plugins/wrappers/phone-number.js +2 -3
- package/dist/auth/plugins/wrappers/sso.js +2 -3
- package/dist/auth/plugins/wrappers/two-factor.js +2 -3
- package/dist/auth/plugins/wrappers/username.js +2 -3
- package/dist/bin/build-config.js +2 -2
- package/dist/bin/cli.js +152 -259
- package/dist/bin/fixture.d.ts.map +1 -1
- package/dist/bin/fixture.js +55 -97
- package/dist/bin/hmr-hook-register.js +3 -3
- package/dist/bin/migrate-targets.d.ts +3 -0
- package/dist/bin/migrate-targets.d.ts.map +1 -0
- package/dist/bin/migrate-targets.js +11 -0
- package/dist/bin/test-command.js +25 -55
- package/dist/bin/ts-loader-register.js +5 -6
- package/dist/bin/ts-loader-registration.js +6 -13
- package/dist/cache/cache-manager.js +3 -4
- package/dist/cache/decorator.js +11 -21
- package/dist/cache/drivers.js +2 -3
- package/dist/cache/index.js +2 -3
- package/dist/cache/types.js +1 -1
- package/dist/cache-control/cache-control.js +21 -34
- package/dist/cache-control/types.js +1 -1
- package/dist/compress/compress.js +10 -10
- package/dist/compress/index.js +1 -2
- package/dist/compress/types.js +1 -1
- package/dist/cone/cone-generator.js +25 -63
- package/dist/database/_batch_update.js +26 -46
- package/dist/database/base-model.js +44 -97
- package/dist/database/base-model.types.js +1 -1
- package/dist/database/db.d.ts +8 -14
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +127 -72
- package/dist/database/knex.js +5 -8
- package/dist/database/puri-subset.types.js +1 -1
- package/dist/database/puri-wrapper.js +11 -15
- package/dist/database/puri.js +117 -234
- package/dist/database/puri.types.js +3 -4
- package/dist/database/transaction-context.js +4 -5
- package/dist/database/upsert-builder.js +109 -176
- package/dist/dict/en.d.ts +1 -0
- package/dist/dict/en.d.ts.map +1 -1
- package/dist/dict/en.js +4 -4
- package/dist/dict/index.js +2 -3
- package/dist/dict/ko.d.ts +1 -0
- package/dist/dict/ko.d.ts.map +1 -1
- package/dist/dict/ko.js +4 -4
- package/dist/dict/rc-keys.js +3 -4
- package/dist/dict/sd.js +8 -19
- package/dist/dict/sonamu-dictionary.js +141 -284
- package/dist/dict/types.js +1 -1
- package/dist/dict/utils.js +4 -5
- package/dist/entity/entity-manager.d.ts +2 -2
- package/dist/entity/entity-manager.js +34 -82
- package/dist/entity/entity-template-cone.js +33 -66
- package/dist/entity/entity.js +157 -311
- package/dist/env.d.ts +14 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +75 -0
- package/dist/exceptions/error-handler.js +2 -3
- package/dist/exceptions/so-exceptions.js +7 -5
- package/dist/filter/index.js +1 -2
- package/dist/filter/types.js +3 -4
- package/dist/filter/utils.js +21 -54
- package/dist/index.js +9 -8
- package/dist/logger/category.js +6 -12
- package/dist/logger/configure.js +23 -34
- package/dist/migration/code-generation.js +147 -315
- package/dist/migration/index-where-predicate.js +52 -144
- package/dist/migration/migration-set.js +19 -33
- package/dist/migration/migrator.d.ts +2 -0
- package/dist/migration/migrator.d.ts.map +1 -1
- package/dist/migration/migrator.js +69 -53
- package/dist/migration/postgresql-schema-reader.js +126 -225
- package/dist/migration/slack-confirm.d.ts +1 -0
- package/dist/migration/slack-confirm.d.ts.map +1 -1
- package/dist/migration/slack-confirm.js +28 -38
- package/dist/migration/types.js +1 -1
- package/dist/naite/messaging-types.js +1 -1
- package/dist/naite/naite-reporter.js +15 -32
- package/dist/naite/naite.js +43 -76
- package/dist/ssr/index.js +6 -9
- package/dist/ssr/registry.js +10 -18
- package/dist/ssr/renderer.js +10 -21
- package/dist/ssr/types.js +1 -1
- package/dist/storage/base-file.js +5 -10
- package/dist/storage/buffered-file.js +3 -4
- package/dist/storage/drivers.js +2 -3
- package/dist/storage/index.js +2 -3
- package/dist/storage/s3-driver.js +5 -9
- package/dist/storage/storage-manager.js +5 -5
- package/dist/storage/types.js +1 -1
- package/dist/storage/uploaded-file.js +4 -6
- package/dist/stream/index.js +1 -2
- package/dist/stream/sse.js +8 -13
- package/dist/stream/ws-audience-resolver.js +5 -5
- package/dist/stream/ws-audience.js +3 -4
- package/dist/stream/ws-cluster-bus.js +3 -4
- package/dist/stream/ws-core.js +1 -1
- package/dist/stream/ws-delivery.js +11 -25
- package/dist/stream/ws-local-connection-store.js +9 -18
- package/dist/stream/ws-presence-store.js +43 -97
- package/dist/stream/ws-registry.js +17 -22
- package/dist/stream/ws-telemetry-memory.js +38 -45
- package/dist/stream/ws-telemetry-trace.js +4 -6
- package/dist/stream/ws-telemetry.js +82 -135
- package/dist/stream/ws.js +47 -91
- package/dist/syncer/api-parser.js +81 -147
- package/dist/syncer/checksum.js +14 -32
- package/dist/syncer/code-generator.js +29 -47
- package/dist/syncer/entity-operations.js +17 -27
- package/dist/syncer/event-batcher.js +8 -15
- package/dist/syncer/file-patterns.js +3 -4
- package/dist/syncer/file-tracking.js +6 -10
- package/dist/syncer/index.js +1 -2
- package/dist/syncer/module-loader.js +10 -26
- package/dist/syncer/syncer-actions.js +19 -37
- package/dist/syncer/syncer.js +46 -98
- package/dist/syncer/watcher.js +12 -26
- package/dist/tasks/decorator.js +7 -11
- package/dist/tasks/step-wrapper.js +7 -8
- package/dist/tasks/workflow-manager.js +18 -25
- package/dist/template/entity-converter.js +40 -64
- package/dist/template/helpers.js +32 -63
- package/dist/template/implementations/entity.template.js +7 -11
- package/dist/template/implementations/entry-server.template.js +2 -3
- package/dist/template/implementations/generated.template.js +25 -51
- package/dist/template/implementations/generated_http.template.js +31 -58
- package/dist/template/implementations/generated_sso.template.js +45 -85
- package/dist/template/implementations/init_types.template.js +4 -7
- package/dist/template/implementations/model.template.js +5 -10
- package/dist/template/implementations/model_test.template.js +2 -3
- package/dist/template/implementations/queries.template.js +4 -7
- package/dist/template/implementations/sd.template.js +17 -35
- package/dist/template/implementations/services.template.js +18 -30
- package/dist/template/implementations/view_form.template.js +72 -125
- package/dist/template/implementations/view_id_all_select.template.js +2 -3
- package/dist/template/implementations/view_list.template.js +86 -143
- package/dist/template/implementations/view_search_input.template.js +2 -3
- package/dist/template/index.js +5 -8
- package/dist/template/template-manager.js +13 -26
- package/dist/template/template-types.js +2 -3
- package/dist/template/template.js +7 -11
- package/dist/template/zod-converter.js +173 -348
- package/dist/testing/_relation-graph.js +18 -37
- package/dist/testing/bootstrap.js +5 -8
- package/dist/testing/data-explorer.js +34 -78
- package/dist/testing/dev-test-routes.js +54 -60
- package/dist/testing/dev-vitest-manager.js +33 -84
- package/dist/testing/faker-mappings.js +3 -4
- package/dist/testing/fixture-generator.d.ts +2 -1
- package/dist/testing/fixture-generator.d.ts.map +1 -1
- package/dist/testing/fixture-generator.js +159 -321
- package/dist/testing/fixture-loader.js +2 -2
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +124 -227
- package/dist/testing/global-setup.d.ts.map +1 -1
- package/dist/testing/global-setup.js +29 -17
- package/dist/testing/index.d.ts +1 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +5 -4
- package/dist/testing/naite-vitest-reporter.js +2 -3
- package/dist/testing/parallel-db-manager.js +5 -3
- package/dist/testing/vitest-helpers.d.ts.map +1 -1
- package/dist/testing/vitest-helpers.js +15 -12
- package/dist/types/types.d.ts +14 -14
- package/dist/types/types.js +27 -50
- package/dist/ui/ai-api.js +6 -11
- package/dist/ui/ai-client.js +86 -134
- package/dist/ui/api.js +100 -196
- package/dist/ui/cdd-service.js +78 -130
- package/dist/ui/cdd-types.js +1 -1
- package/dist/ui-web/assets/{index-Df8q-fhb.js → index-DFStGyd0.js} +49 -49
- package/dist/ui-web/assets/index-Dx4ap5i4.css +1 -0
- package/dist/ui-web/index.html +2 -2
- package/dist/utils/async-utils.js +13 -25
- package/dist/utils/class-name.js +3 -4
- package/dist/utils/console-util.js +11 -26
- package/dist/utils/controller.d.ts.map +1 -1
- package/dist/utils/controller.js +14 -12
- package/dist/utils/esm-utils.js +5 -8
- package/dist/utils/formatter.js +10 -22
- package/dist/utils/fs-utils.js +14 -25
- package/dist/utils/lodash-able.js +3 -4
- package/dist/utils/model.js +7 -14
- package/dist/utils/object-utils.js +41 -73
- package/dist/utils/path-utils.js +5 -9
- package/dist/utils/process-utils.js +4 -7
- package/dist/utils/sql-parser.js +6 -13
- package/dist/utils/type-utils.js +16 -26
- package/dist/utils/utils.js +18 -40
- package/dist/utils/zod-error.js +9 -16
- package/dist/vector/chunking.js +24 -37
- package/dist/vector/config.js +2 -2
- package/dist/vector/embedding.js +8 -19
- package/dist/vector/index.js +1 -2
- package/dist/vector/types.js +1 -1
- package/package.json +8 -8
- package/src/__tests__/env.test.ts +127 -0
- package/src/api/__tests__/config.test.ts +10 -1
- package/src/api/config.ts +4 -12
- package/src/api/sonamu.ts +28 -33
- package/src/auth/audit-log/builders.ts +3 -0
- package/src/auth/audit-log/client-ip.ts +38 -0
- package/src/auth/audit-log/events.ts +1 -0
- package/src/auth/audit-log-ingestor.ts +22 -15
- package/src/auth/better-auth-request.ts +20 -0
- package/src/bin/__tests__/migrate-targets.test.ts +28 -0
- package/src/bin/__tests__/test-command.test.ts +82 -1
- package/src/bin/cli.ts +9 -18
- package/src/bin/fixture.ts +5 -4
- package/src/bin/migrate-targets.ts +7 -0
- package/src/bin/test-command.ts +2 -2
- package/src/database/__tests__/db.test.ts +175 -0
- package/src/database/db.ts +193 -71
- package/src/dict/en.ts +2 -0
- package/src/dict/ko.ts +2 -0
- package/src/env.ts +123 -0
- package/src/migration/__tests__/migrator.test.ts +149 -0
- package/src/migration/migrator.ts +74 -17
- package/src/migration/slack-confirm.ts +21 -0
- package/src/skills/sonamu/database.md +1 -1
- package/src/skills/sonamu/puri.md +33 -0
- package/src/skills/sonamu/testing-devrunner.md +1 -1
- package/src/stream/ws-telemetry-memory.ts +2 -2
- package/src/syncer/checksum.ts +7 -12
- package/src/testing/fixture-generator.ts +2 -1
- package/src/testing/fixture-manager.ts +3 -4
- package/src/testing/global-setup.ts +42 -18
- package/src/testing/index.ts +1 -0
- package/src/testing/vitest-helpers.ts +14 -0
- package/src/utils/controller.ts +14 -7
- package/tsdown.api.config.ts +6 -0
- package/dist/_virtual/rolldown_runtime.js +0 -39
- package/dist/ui-web/assets/index-D4rYm-Xz.css +0 -1
|
@@ -2,7 +2,6 @@ import { Sonamu } from "../../api/sonamu.js";
|
|
|
2
2
|
import { EntityManager, init_entity_manager } from "../../entity/entity-manager.js";
|
|
3
3
|
import { init_api } from "../../api/index.js";
|
|
4
4
|
import { Template, init_template } from "../template.js";
|
|
5
|
-
|
|
6
5
|
//#region src/template/implementations/model_test.template.ts
|
|
7
6
|
init_api();
|
|
8
7
|
init_entity_manager();
|
|
@@ -37,7 +36,7 @@ describe.skip("${entityId}ModelTest", () => {
|
|
|
37
36
|
};
|
|
38
37
|
}
|
|
39
38
|
};
|
|
40
|
-
|
|
41
39
|
//#endregion
|
|
42
40
|
export { Template__model_test };
|
|
43
|
-
|
|
41
|
+
|
|
42
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWxfdGVzdC50ZW1wbGF0ZS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVtcGxhdGUvaW1wbGVtZW50YXRpb25zL21vZGVsX3Rlc3QudGVtcGxhdGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uLy4uL2FwaVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi8uLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgRW50aXR5TmFtZXNSZWNvcmQgfSBmcm9tIFwiLi4vLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyB0eXBlIFRlbXBsYXRlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgVGVtcGxhdGUgfSBmcm9tIFwiLi4vdGVtcGxhdGVcIjtcblxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlX19tb2RlbF90ZXN0IGV4dGVuZHMgVGVtcGxhdGUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIm1vZGVsX3Rlc3RcIik7XG4gIH1cblxuICBnZXRUYXJnZXRBbmRQYXRoKG5hbWVzOiBFbnRpdHlOYW1lc1JlY29yZCkge1xuICAgIGNvbnN0IHsgZGlyIH0gPSBTb25hbXUuY29uZmlnLmFwaTtcblxuICAgIHJldHVybiB7XG4gICAgICB0YXJnZXQ6IGAke2Rpcn0vc3JjL2FwcGxpY2F0aW9uYCxcbiAgICAgIHBhdGg6IGAke25hbWVzLmZzfS8ke25hbWVzLmZzfS5tb2RlbC50ZXN0LnRzYCxcbiAgICB9O1xuICB9XG5cbiAgcmVuZGVyKHsgZW50aXR5SWQgfTogVGVtcGxhdGVPcHRpb25zW1wibW9kZWxfdGVzdFwiXSkge1xuICAgIGNvbnN0IG5hbWVzID0gRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChlbnRpdHlJZCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5nZXRUYXJnZXRBbmRQYXRoKG5hbWVzKSxcbiAgICAgIGJvZHk6IGBcbmltcG9ydCB7IGJvb3RzdHJhcCwgdGVzdCB9IGZyb20gXCJzb25hbXUvdGVzdFwiO1xuaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgdmkgfSBmcm9tIFwidml0ZXN0XCI7XG5cbmJvb3RzdHJhcCh2aSk7XG5kZXNjcmliZS5za2lwKFwiJHtlbnRpdHlJZH1Nb2RlbFRlc3RcIiwgKCkgPT4ge1xuICB0ZXN0KFwiUXVlcnlcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGV4cGVjdCh0cnVlKS50b0JlKHRydWUpO1xuICB9KTtcbn0pO1xuICAgICAgYC50cmltKCksXG4gICAgICBpbXBvcnRLZXlzOiBbXSxcbiAgICB9O1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7O1NBQWtDO29CQUN5QjtjQUdyQjtBQUV0QyxJQUFhLHVCQUFiLGNBQTBDLFNBQVM7Q0FDakQsY0FBYztFQUNaLE1BQU0sWUFBWTtDQUNwQjtDQUVBLGlCQUFpQixPQUEwQjtFQUN6QyxNQUFNLEVBQUUsUUFBUSxPQUFPLE9BQU87RUFFOUIsT0FBTztHQUNMLFFBQVEsR0FBRyxJQUFJO0dBQ2YsTUFBTSxHQUFHLE1BQU0sR0FBRyxHQUFHLE1BQU0sR0FBRztFQUNoQztDQUNGO0NBRUEsT0FBTyxFQUFFLFlBQTJDO0VBQ2xELE1BQU0sUUFBUSxjQUFjLGVBQWUsUUFBUTtFQUVuRCxPQUFPO0dBQ0wsR0FBRyxLQUFLLGlCQUFpQixLQUFLO0dBQzlCLE1BQU07Ozs7O2lCQUtLLFNBQVM7Ozs7O1FBS2xCLEtBQUs7R0FDUCxZQUFZLENBQUM7RUFDZjtDQUNGO0FBQ0YifQ==
|
|
@@ -4,7 +4,6 @@ import { apiParamToTsCode, apiParamTypeToTsType, init_code_converters } from "..
|
|
|
4
4
|
import { Template, init_template } from "../template.js";
|
|
5
5
|
import inflection from "inflection";
|
|
6
6
|
import { diff, unique } from "radashi";
|
|
7
|
-
|
|
8
7
|
//#region src/template/implementations/queries.template.ts
|
|
9
8
|
init_code_converters();
|
|
10
9
|
init_sonamu();
|
|
@@ -24,12 +23,10 @@ var Template__queries = class extends Template {
|
|
|
24
23
|
render({}) {
|
|
25
24
|
const { apis } = Sonamu.syncer;
|
|
26
25
|
const queryApis = apis.filter((api) => api.options.clients?.includes("tanstack-query"));
|
|
27
|
-
const apisByModel = new Map();
|
|
26
|
+
const apisByModel = /* @__PURE__ */ new Map();
|
|
28
27
|
for (const api of queryApis) {
|
|
29
28
|
const modelName = api.modelName.replace(/Model$/, "").replace(/Frame$/, "");
|
|
30
|
-
if (!apisByModel.has(modelName))
|
|
31
|
-
apisByModel.set(modelName, []);
|
|
32
|
-
}
|
|
29
|
+
if (!apisByModel.has(modelName)) apisByModel.set(modelName, []);
|
|
33
30
|
apisByModel.get(modelName)?.push(api);
|
|
34
31
|
}
|
|
35
32
|
const namespaces = [];
|
|
@@ -90,7 +87,7 @@ ${functions.join("\n\n")}
|
|
|
90
87
|
};
|
|
91
88
|
}
|
|
92
89
|
};
|
|
93
|
-
|
|
94
90
|
//#endregion
|
|
95
91
|
export { Template__queries };
|
|
96
|
-
|
|
92
|
+
|
|
93
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcmllcy50ZW1wbGF0ZS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVtcGxhdGUvaW1wbGVtZW50YXRpb25zL3F1ZXJpZXMudGVtcGxhdGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB7IGRpZmYsIHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5cbmltcG9ydCB7IGFwaVBhcmFtVG9Uc0NvZGUsIGFwaVBhcmFtVHlwZVRvVHNUeXBlIH0gZnJvbSBcIi4uLy4uL2FwaS9jb2RlLWNvbnZlcnRlcnNcIjtcbmltcG9ydCB7IHR5cGUgRXh0ZW5kZWRBcGkgfSBmcm9tIFwiLi4vLi4vYXBpL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi8uLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyB0eXBlIFRlbXBsYXRlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgQXBpUGFyYW1UeXBlIH0gZnJvbSBcIi4uLy4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gXCIuLi90ZW1wbGF0ZVwiO1xuXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVfX3F1ZXJpZXMgZXh0ZW5kcyBUZW1wbGF0ZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwicXVlcmllc1wiKTtcbiAgfVxuXG4gIGdldFRhcmdldEFuZFBhdGgoKSB7XG4gICAgY29uc3QgeyBkaXIgfSA9IFNvbmFtdS5jb25maWcuYXBpO1xuICAgIHJldHVybiB7XG4gICAgICB0YXJnZXQ6IGAke2Rpcn0vc3JjL2FwcGxpY2F0aW9uYCxcbiAgICAgIHBhdGg6IGBxdWVyaWVzLmdlbmVyYXRlZC50c2AsXG4gICAgfTtcbiAgfVxuXG4gIHJlbmRlcih7fTogVGVtcGxhdGVPcHRpb25zW1wicXVlcmllc1wiXSkge1xuICAgIGNvbnN0IHsgYXBpcyB9ID0gU29uYW11LnN5bmNlcjtcblxuICAgIC8vIHRhbnN0YWNrLXF1ZXJ566W8IO2PrO2VqO2VnCBBUEnrp4wg7ZWE7YSw66eBXG4gICAgY29uc3QgcXVlcnlBcGlzID0gYXBpcy5maWx0ZXIoKGFwaSkgPT4gYXBpLm9wdGlvbnMuY2xpZW50cz8uaW5jbHVkZXMoXCJ0YW5zdGFjay1xdWVyeVwiKSk7XG5cbiAgICAvLyDrqqjrjbjrs4TroZwg6re466O57ZmUXG4gICAgY29uc3QgYXBpc0J5TW9kZWwgPSBuZXcgTWFwPHN0cmluZywgRXh0ZW5kZWRBcGlbXT4oKTtcbiAgICBmb3IgKGNvbnN0IGFwaSBvZiBxdWVyeUFwaXMpIHtcbiAgICAgIGNvbnN0IG1vZGVsTmFtZSA9IGFwaS5tb2RlbE5hbWUucmVwbGFjZSgvTW9kZWwkLywgXCJcIikucmVwbGFjZSgvRnJhbWUkLywgXCJcIik7XG4gICAgICBpZiAoIWFwaXNCeU1vZGVsLmhhcyhtb2RlbE5hbWUpKSB7XG4gICAgICAgIGFwaXNCeU1vZGVsLnNldChtb2RlbE5hbWUsIFtdKTtcbiAgICAgIH1cbiAgICAgIGFwaXNCeU1vZGVsLmdldChtb2RlbE5hbWUpPy5wdXNoKGFwaSk7XG4gICAgfVxuXG4gICAgY29uc3QgbmFtZXNwYWNlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBpbXBvcnRLZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCB0eXBlUGFyYW1OYW1lczogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgW21vZGVsTmFtZSwgbW9kZWxBcGlzXSBvZiBhcGlzQnlNb2RlbCkge1xuICAgICAgY29uc3QgZnVuY3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBmb3IgKGNvbnN0IGFwaSBvZiBtb2RlbEFwaXMpIHtcbiAgICAgICAgLy8gQ29udGV4dCDsoJzsmbjtlZwg7YyM652866+47YSwXG4gICAgICAgIGNvbnN0IHBhcmFtc1dpdGhvdXRDb250ZXh0ID0gYXBpLnBhcmFtZXRlcnMuZmlsdGVyKFxuICAgICAgICAgIChwYXJhbSkgPT5cbiAgICAgICAgICAgICFBcGlQYXJhbVR5cGUuaXNDb250ZXh0KHBhcmFtLnR5cGUpICYmXG4gICAgICAgICAgICAhQXBpUGFyYW1UeXBlLmlzUmVmS25leChwYXJhbS50eXBlKSAmJlxuICAgICAgICAgICAgIShwYXJhbS5vcHRpb25hbCAmJiBwYXJhbS5uYW1lLnN0YXJ0c1dpdGgoXCJfXCIpKSxcbiAgICAgICAgKTtcblxuICAgICAgICAvLyDtg4DsnoUg7YyM652866+47YSwIOydtOumhCDsiJjsp5FcbiAgICAgICAgdHlwZVBhcmFtTmFtZXMgPSB0eXBlUGFyYW1OYW1lcy5jb25jYXQoYXBpLnR5cGVQYXJhbWV0ZXJzLm1hcCgodHApID0+IHRwLmlkKSk7XG5cbiAgICAgICAgLy8g7YOA7J6FIO2MjOudvOuvuO2EsCDsoJXsnZhcbiAgICAgICAgY29uc3QgdHlwZVBhcmFtZXRlcnNBc1RzVHlwZSA9IGFwaS50eXBlUGFyYW1ldGVyc1xuICAgICAgICAgIC5tYXAoKHR5cGVQYXJhbSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGFwaVBhcmFtVHlwZVRvVHNUeXBlKHR5cGVQYXJhbSwgaW1wb3J0S2V5cyk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuam9pbihcIiwgXCIpO1xuICAgICAgICBjb25zdCB0eXBlUGFyYW1zRGVmID0gdHlwZVBhcmFtZXRlcnNBc1RzVHlwZSA/IGA8JHt0eXBlUGFyYW1ldGVyc0FzVHNUeXBlfT5gIDogXCJcIjtcblxuICAgICAgICAvLyDtjIzrnbzrr7jthLAg7KCV7J2YXG4gICAgICAgIGNvbnN0IHBhcmFtc0RlZiA9IGFwaVBhcmFtVG9Uc0NvZGUocGFyYW1zV2l0aG91dENvbnRleHQsIGltcG9ydEtleXMpO1xuICAgICAgICBjb25zdCBwYXJhbU5hbWVzID0gcGFyYW1zV2l0aG91dENvbnRleHQubWFwKChwKSA9PiBwLm5hbWUpLmpvaW4oXCIsIFwiKTtcblxuICAgICAgICAvLyBzZXJ2aWNlTWV0aG9kTmFtZSDqs4TsgrAgKHNlcnZpY2VzLnRlbXBsYXRlLnRz7JmAIOuPmeydvO2VnCDroZzsp4EpXG4gICAgICAgIGNvbnN0IHNlcnZpY2VNZXRob2ROYW1lID0gYXBpLm9wdGlvbnMucmVzb3VyY2VOYW1lXG4gICAgICAgICAgPyBgZ2V0JHtpbmZsZWN0aW9uLmNhbWVsaXplKGFwaS5vcHRpb25zLnJlc291cmNlTmFtZSl9YFxuICAgICAgICAgIDogYXBpLm1ldGhvZE5hbWU7XG5cbiAgICAgICAgLy8gU1NSUXVlcnkg7ZWo7IiYIOyDneyEsSAo7ZWo7IiY66qF64+EIHNlcnZpY2VNZXRob2ROYW1lIOyCrOyaqSlcbiAgICAgICAgZnVuY3Rpb25zLnB1c2goXG4gICAgICAgICAgYFxuICBleHBvcnQgY29uc3QgJHtzZXJ2aWNlTWV0aG9kTmFtZX0gPSAke3R5cGVQYXJhbXNEZWZ9KCR7cGFyYW1zRGVmfSk6IFNTUlF1ZXJ5ID0+XG4gICAgY3JlYXRlU1NSUXVlcnkoJyR7YXBpLm1vZGVsTmFtZX0nLCAnJHthcGkubWV0aG9kTmFtZX0nLCBbJHtwYXJhbU5hbWVzfV0sIFsnJHttb2RlbE5hbWV9JywgJyR7c2VydmljZU1ldGhvZE5hbWV9J10pO1xuICAgICAgICAgIGAudHJpbSgpLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBuYW1lc3BhY2VzLnB1c2goXG4gICAgICAgIGBcbmV4cG9ydCBuYW1lc3BhY2UgJHttb2RlbE5hbWV9U2VydmljZSB7XG4ke2Z1bmN0aW9ucy5qb2luKFwiXFxuXFxuXCIpfVxufVxuICAgICAgYC50cmltKCksXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIHRhbnN0YWNrLXF1ZXJ5IEFQSeqwgCDsl4bsnLzrqbQg7Zes7Y28IO2VqOyImOyZgCBpbXBvcnTrpbwg7Y+s7ZWo7ZWY7KeAIOyViuyKteuLiOuLpC5cbiAgICAvLyDsg4gg7ZSE66Gc7KCd7Yq47JeQ7IScIOyyqyDruYzrk5wg7IucIHN5bmPqsIAg7JWE7KeBIOyViCDrkJjslrQgbmFtZXNwYWNl6rCAIOu5hOyWtOyeiOydhCDsiJgg7J6I6rOgLFxuICAgIC8vIOydtOuVjCBjcmVhdGVTU1JRdWVyeeqwgCB1bnVzZWTroZwg67mM65OcIOyXkOufrOqwgCDrsJzsg53tlZjripQg6rKD7J2EIOuwqeyngO2VqeuLiOuLpC5cbiAgICBjb25zdCBoYXNRdWVyaWVzID0gbmFtZXNwYWNlcy5sZW5ndGggPiAwO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuZ2V0VGFyZ2V0QW5kUGF0aCgpLFxuICAgICAgYm9keTogbmFtZXNwYWNlcy5qb2luKFwiXFxuXFxuXCIpLFxuICAgICAgaW1wb3J0S2V5czogZGlmZih1bmlxdWUoaW1wb3J0S2V5cyksIHR5cGVQYXJhbU5hbWVzKSxcbiAgICAgIGN1c3RvbUhlYWRlcnM6IGhhc1F1ZXJpZXNcbiAgICAgICAgPyBbXG4gICAgICAgICAgICBcIi8qKlwiLFxuICAgICAgICAgICAgXCIgKiBAZ2VuZXJhdGVkXCIsXG4gICAgICAgICAgICBcIiAqIOyngeygkSDsiJjsoJXtlZjsp4Ag66eI7IS47JqULlwiLFxuICAgICAgICAgICAgXCIgKi9cIixcbiAgICAgICAgICAgIFwiXCIsXG4gICAgICAgICAgICBcIi8qIG94bGludC1kaXNhYmxlICovXCIsXG4gICAgICAgICAgICBcIlwiLFxuICAgICAgICAgICAgYGltcG9ydCB0eXBlIHsgU1NSUXVlcnkgfSBmcm9tICdzb25hbXUvc3NyJztgLFxuICAgICAgICAgICAgXCJcIixcbiAgICAgICAgICAgIGAvLyBTU1JRdWVyeSDtl6ztjbwg7ZWo7IiYYCxcbiAgICAgICAgICAgIGBmdW5jdGlvbiBjcmVhdGVTU1JRdWVyeShtb2RlbE5hbWU6IHN0cmluZywgbWV0aG9kTmFtZTogc3RyaW5nLCBwYXJhbXM6IGFueVtdLCBzZXJ2aWNlS2V5OiBbc3RyaW5nLCBzdHJpbmddKTogU1NSUXVlcnkge2AsXG4gICAgICAgICAgICBgICByZXR1cm4geyBtb2RlbE5hbWUsIG1ldGhvZE5hbWUsIHBhcmFtcywgc2VydmljZUtleSwgX19icmFuZDogJ1NTUlF1ZXJ5JyB9IGFzIFNTUlF1ZXJ5O2AsXG4gICAgICAgICAgICBgfWAsXG4gICAgICAgICAgICBcIlwiLFxuICAgICAgICAgIF1cbiAgICAgICAgOiBbXG4gICAgICAgICAgICBcIi8qKlwiLFxuICAgICAgICAgICAgXCIgKiBAZ2VuZXJhdGVkXCIsXG4gICAgICAgICAgICBcIiAqIOyngeygkSDsiJjsoJXtlZjsp4Ag66eI7IS47JqULlwiLFxuICAgICAgICAgICAgXCIgKi9cIixcbiAgICAgICAgICAgIFwiXCIsXG4gICAgICAgICAgICBcIi8qIG94bGludC1kaXNhYmxlICovXCIsXG4gICAgICAgICAgICBcIlwiLFxuICAgICAgICAgIF0sXG4gICAgfTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O3FCQUdrRjtZQUV6QztXQUVPO2NBQ1Y7QUFFdEMsSUFBYSxvQkFBYixjQUF1QyxTQUFTO0NBQzlDLGNBQWM7RUFDWixNQUFNLFNBQVM7Q0FDakI7Q0FFQSxtQkFBbUI7RUFDakIsTUFBTSxFQUFFLFFBQVEsT0FBTyxPQUFPO0VBQzlCLE9BQU87R0FDTCxRQUFRLEdBQUcsSUFBSTtHQUNmLE1BQU07RUFDUjtDQUNGO0NBRUEsT0FBTyxJQUFnQztFQUNyQyxNQUFNLEVBQUUsU0FBUyxPQUFPO0VBR3hCLE1BQU0sWUFBWSxLQUFLLFFBQVEsUUFBUSxJQUFJLFFBQVEsU0FBUyxTQUFTLGdCQUFnQixDQUFDO0VBR3RGLE1BQU0sOEJBQWMsSUFBSSxJQUEyQjtFQUNuRCxLQUFLLE1BQU0sT0FBTyxXQUFXO0dBQzNCLE1BQU0sWUFBWSxJQUFJLFVBQVUsUUFBUSxVQUFVLEVBQUUsQ0FBQyxDQUFDLFFBQVEsVUFBVSxFQUFFO0dBQzFFLElBQUksQ0FBQyxZQUFZLElBQUksU0FBUyxHQUM1QixZQUFZLElBQUksV0FBVyxDQUFDLENBQUM7R0FFL0IsWUFBWSxJQUFJLFNBQVMsQ0FBQyxFQUFFLEtBQUssR0FBRztFQUN0QztFQUVBLE1BQU0sYUFBdUIsQ0FBQztFQUM5QixNQUFNLGFBQXVCLENBQUM7RUFDOUIsSUFBSSxpQkFBMkIsQ0FBQztFQUVoQyxLQUFLLE1BQU0sQ0FBQyxXQUFXLGNBQWMsYUFBYTtHQUNoRCxNQUFNLFlBQXNCLENBQUM7R0FFN0IsS0FBSyxNQUFNLE9BQU8sV0FBVztJQUUzQixNQUFNLHVCQUF1QixJQUFJLFdBQVcsUUFDekMsVUFDQyxDQUFDLGFBQWEsVUFBVSxNQUFNLElBQUksS0FDbEMsQ0FBQyxhQUFhLFVBQVUsTUFBTSxJQUFJLEtBQ2xDLEVBQUUsTUFBTSxZQUFZLE1BQU0sS0FBSyxXQUFXLEdBQUcsRUFDakQ7SUFHQSxpQkFBaUIsZUFBZSxPQUFPLElBQUksZUFBZSxLQUFLLE9BQU8sR0FBRyxFQUFFLENBQUM7SUFHNUUsTUFBTSx5QkFBeUIsSUFBSSxlQUNoQyxLQUFLLGNBQWM7S0FDbEIsT0FBTyxxQkFBcUIsV0FBVyxVQUFVO0lBQ25ELENBQUMsQ0FBQyxDQUNELEtBQUssSUFBSTtJQUNaLE1BQU0sZ0JBQWdCLHlCQUF5QixJQUFJLHVCQUF1QixLQUFLO0lBRy9FLE1BQU0sWUFBWSxpQkFBaUIsc0JBQXNCLFVBQVU7SUFDbkUsTUFBTSxhQUFhLHFCQUFxQixLQUFLLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxLQUFLLElBQUk7SUFHcEUsTUFBTSxvQkFBb0IsSUFBSSxRQUFRLGVBQ2xDLE1BQU0sV0FBVyxTQUFTLElBQUksUUFBUSxZQUFZLE1BQ2xELElBQUk7SUFHUixVQUFVLEtBQ1I7aUJBQ08sa0JBQWtCLEtBQUssY0FBYyxHQUFHLFVBQVU7c0JBQzdDLElBQUksVUFBVSxNQUFNLElBQUksV0FBVyxNQUFNLFdBQVcsT0FBTyxVQUFVLE1BQU0sa0JBQWtCO1lBQ3ZHLEtBQUssQ0FDVDtHQUNGO0dBRUEsV0FBVyxLQUNUO21CQUNXLFVBQVU7RUFDM0IsVUFBVSxLQUFLLE1BQU0sRUFBRTs7UUFFakIsS0FBSyxDQUNQO0VBQ0Y7RUFLQSxNQUFNLGFBQWEsV0FBVyxTQUFTO0VBRXZDLE9BQU87R0FDTCxHQUFHLEtBQUssaUJBQWlCO0dBQ3pCLE1BQU0sV0FBVyxLQUFLLE1BQU07R0FDNUIsWUFBWSxLQUFLLE9BQU8sVUFBVSxHQUFHLGNBQWM7R0FDbkQsZUFBZSxhQUNYO0lBQ0U7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtHQUNGLElBQ0E7SUFDRTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtHQUNGO0VBQ047Q0FDRjtBQUNGIn0=
|
|
@@ -5,7 +5,6 @@ import { extractObjectDeclaration, init_helpers } from "../helpers.js";
|
|
|
5
5
|
import path from "node:path";
|
|
6
6
|
import { fileURLToPath } from "node:url";
|
|
7
7
|
import fs from "node:fs";
|
|
8
|
-
|
|
9
8
|
//#region src/template/implementations/sd.template.ts
|
|
10
9
|
init_sonamu();
|
|
11
10
|
init_entity_manager();
|
|
@@ -21,16 +20,14 @@ var Template__sd = class extends Template {
|
|
|
21
20
|
}
|
|
22
21
|
getTargetAndPath(_names, sdTarget) {
|
|
23
22
|
const target = sdTarget ?? "api";
|
|
24
|
-
const dir = target === "api" ? Sonamu.config.api.dir : target;
|
|
25
23
|
return {
|
|
26
|
-
target: `${dir}/src/i18n`,
|
|
24
|
+
target: `${target === "api" ? Sonamu.config.api.dir : target}/src/i18n`,
|
|
27
25
|
path: "sd.generated.ts"
|
|
28
26
|
};
|
|
29
27
|
}
|
|
30
28
|
render(options) {
|
|
31
29
|
const { target } = options;
|
|
32
|
-
const
|
|
33
|
-
const { defaultLocale, supportedLocales } = i18nConfig;
|
|
30
|
+
const { defaultLocale, supportedLocales } = Sonamu.config.i18n;
|
|
34
31
|
const entityLabels = this.extractEntityLabels();
|
|
35
32
|
const rcKeysSourceCode = this.extractRCKeysSourceCode();
|
|
36
33
|
const localeManagementCode = target === "api" ? `
|
|
@@ -64,9 +61,7 @@ export function getCurrentLocale(): (typeof SUPPORTED_LOCALES)[number] {
|
|
|
64
61
|
const getRCKeysVarName = (locale) => {
|
|
65
62
|
if (locale === "ko" && supportedLocales.includes("ko")) return "rcKeysKo";
|
|
66
63
|
if (locale === "en" && supportedLocales.includes("en")) return "rcKeysEn";
|
|
67
|
-
if (locale !== defaultLocale)
|
|
68
|
-
return getRCKeysVarName(defaultLocale);
|
|
69
|
-
}
|
|
64
|
+
if (locale !== defaultLocale) return getRCKeysVarName(defaultLocale);
|
|
70
65
|
return "rcKeysEn";
|
|
71
66
|
};
|
|
72
67
|
const body = `
|
|
@@ -279,7 +274,7 @@ SD.enumLabels = (enumName: string): Record<string, LocalizedString> => {
|
|
|
279
274
|
};
|
|
280
275
|
`.trim();
|
|
281
276
|
return {
|
|
282
|
-
...this.getTargetAndPath(
|
|
277
|
+
...this.getTargetAndPath(void 0, target),
|
|
283
278
|
body,
|
|
284
279
|
importKeys: [],
|
|
285
280
|
customHeaders: [
|
|
@@ -325,9 +320,7 @@ SD.enumLabels = (enumName: string): Record<string, LocalizedString> => {
|
|
|
325
320
|
*/
|
|
326
321
|
extractEntityLabels() {
|
|
327
322
|
const labels = [];
|
|
328
|
-
if (!EntityManager.isAutoloaded)
|
|
329
|
-
return labels;
|
|
330
|
-
}
|
|
323
|
+
if (!EntityManager.isAutoloaded) return labels;
|
|
331
324
|
const entityIds = EntityManager.getAllIds();
|
|
332
325
|
for (const entityId of entityIds) {
|
|
333
326
|
const entity = EntityManager.get(entityId);
|
|
@@ -335,22 +328,14 @@ SD.enumLabels = (enumName: string): Record<string, LocalizedString> => {
|
|
|
335
328
|
key: `entity.${entityId}`,
|
|
336
329
|
value: entity.title
|
|
337
330
|
});
|
|
338
|
-
for (const prop of entity.props) {
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
}
|
|
346
|
-
for (const [enumId, enumLabelsMap] of Object.entries(entity.enumLabels)) {
|
|
347
|
-
for (const [value, label] of Object.entries(enumLabelsMap)) {
|
|
348
|
-
labels.push({
|
|
349
|
-
key: `enum.${enumId}.${value}`,
|
|
350
|
-
value: label
|
|
351
|
-
});
|
|
352
|
-
}
|
|
353
|
-
}
|
|
331
|
+
for (const prop of entity.props) if (prop.desc) labels.push({
|
|
332
|
+
key: `entity.${entityId}.${prop.name}`,
|
|
333
|
+
value: prop.desc
|
|
334
|
+
});
|
|
335
|
+
for (const [enumId, enumLabelsMap] of Object.entries(entity.enumLabels)) for (const [value, label] of Object.entries(enumLabelsMap)) labels.push({
|
|
336
|
+
key: `enum.${enumId}.${value}`,
|
|
337
|
+
value: label
|
|
338
|
+
});
|
|
354
339
|
}
|
|
355
340
|
return labels;
|
|
356
341
|
}
|
|
@@ -358,19 +343,16 @@ SD.enumLabels = (enumName: string): Record<string, LocalizedString> => {
|
|
|
358
343
|
* entityLabels를 TypeScript 코드로 변환
|
|
359
344
|
*/
|
|
360
345
|
generateEntityLabelsCode(labels) {
|
|
361
|
-
if (labels.length === 0) {
|
|
362
|
-
return "const entityLabels = {} as const;";
|
|
363
|
-
}
|
|
364
|
-
const entries = labels.map(({ key, value }) => ` "${key}": "${this.escapeString(value)}",`);
|
|
346
|
+
if (labels.length === 0) return "const entityLabels = {} as const;";
|
|
365
347
|
return `const entityLabels = {
|
|
366
|
-
${
|
|
348
|
+
${labels.map(({ key, value }) => ` "${key}": "${this.escapeString(value)}",`).join("\n")}
|
|
367
349
|
} as const;`;
|
|
368
350
|
}
|
|
369
351
|
escapeString(str) {
|
|
370
352
|
return str.replace(/\\/g, "\\\\").replace(/"/g, "\\\"").replace(/\n/g, "\\n");
|
|
371
353
|
}
|
|
372
354
|
};
|
|
373
|
-
|
|
374
355
|
//#endregion
|
|
375
356
|
export { Template__sd };
|
|
376
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2QudGVtcGxhdGUuanMiLCJuYW1lcyI6WyJsYWJlbHM6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3RlbXBsYXRlL2ltcGxlbWVudGF0aW9ucy9zZC50ZW1wbGF0ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tIFwibm9kZTp1cmxcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uLy4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyB0eXBlIEVudGl0eU5hbWVzUmVjb3JkIH0gZnJvbSBcIi4uLy4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgdHlwZSBUZW1wbGF0ZU9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGV4dHJhY3RPYmplY3REZWNsYXJhdGlvbiB9IGZyb20gXCIuLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gXCIuLi90ZW1wbGF0ZVwiO1xuXG4vKipcbiAqIFNvbmFtdSBEaWN0aW9uYXJ5IChTRCkg7YWc7ZSM66a/XG4gKiBpMThu7J2EIOychO2VnCBzZC5nZW5lcmF0ZWQudHMg7YyM7J287J2EIOyDneyEse2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGNsYXNzIFRlbXBsYXRlX19zZCBleHRlbmRzIFRlbXBsYXRlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJzZFwiKTtcbiAgfVxuXG4gIGdldFRhcmdldEFuZFBhdGgoX25hbWVzPzogRW50aXR5TmFtZXNSZWNvcmQsIHNkVGFyZ2V0PzogXCJhcGlcIiB8IFwid2ViXCIgfCBcImFwcFwiKSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gc2RUYXJnZXQgPz8gXCJhcGlcIjtcbiAgICAvLyBhcGkuZGly7J2AIOyDgeuMgCDqsr3roZwoXCJhcGlcIinsnbTrr4DroZwsIHdlYi9hcHDrj4Qg7IOB64yAIOqyveuhnOuhnCDrp57stqRcbiAgICBjb25zdCBkaXIgPSB0YXJnZXQgPT09IFwiYXBpXCIgPyBTb25hbXUuY29uZmlnLmFwaS5kaXIgOiB0YXJnZXQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGFyZ2V0OiBgJHtkaXJ9L3NyYy9pMThuYCxcbiAgICAgIHBhdGg6IFwic2QuZ2VuZXJhdGVkLnRzXCIsXG4gICAgfTtcbiAgfVxuXG4gIHJlbmRlcihvcHRpb25zOiBUZW1wbGF0ZU9wdGlvbnNbXCJzZFwiXSkge1xuICAgIGNvbnN0IHsgdGFyZ2V0IH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGkxOG5Db25maWcgPSBTb25hbXUuY29uZmlnLmkxOG47XG5cbiAgICBjb25zdCB7IGRlZmF1bHRMb2NhbGUsIHN1cHBvcnRlZExvY2FsZXMgfSA9IGkxOG5Db25maWc7XG5cbiAgICAvLyBlbnRpdHkuanNvbuyXkOyEnCBlbnRpdHkgbGFiZWxzIOy2lOy2nFxuICAgIGNvbnN0IGVudGl0eUxhYmVscyA9IHRoaXMuZXh0cmFjdEVudGl0eUxhYmVscygpO1xuXG4gICAgLy8gcmMta2V5cyDshozsiqQg7L2U65OcIOy2lOy2nFxuICAgIGNvbnN0IHJjS2V5c1NvdXJjZUNvZGUgPSB0aGlzLmV4dHJhY3RSQ0tleXNTb3VyY2VDb2RlKCk7XG5cbiAgICAvLyDtlIzrnqvtj7zrs4QgbG9jYWxlIOq0gOumrCDsvZTrk5xcbiAgICBjb25zdCBsb2NhbGVNYW5hZ2VtZW50Q29kZSA9XG4gICAgICB0YXJnZXQgPT09IFwiYXBpXCJcbiAgICAgICAgPyBgXG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwic29uYW11XCI7XG5cbmNvbnN0IERFRkFVTFRfTE9DQUxFID0gXCIke2RlZmF1bHRMb2NhbGV9XCIgYXMgY29uc3Q7XG5jb25zdCBTVVBQT1JURURfTE9DQUxFUyA9ICR7SlNPTi5zdHJpbmdpZnkoc3VwcG9ydGVkTG9jYWxlcyl9IGFzIGNvbnN0O1xuZnVuY3Rpb24gZ2V0Q3VycmVudExvY2FsZSgpOiAodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjdHggPSBTb25hbXUuZ2V0Q29udGV4dCgpO1xuICAgIHJldHVybiBjdHgubG9jYWxlIGFzICh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl0gPz8gREVGQVVMVF9MT0NBTEU7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gREVGQVVMVF9MT0NBTEU7XG4gIH1cbn1cbmAudHJpbSgpXG4gICAgICAgIDogYFxuY29uc3QgREVGQVVMVF9MT0NBTEUgPSBcIiR7ZGVmYXVsdExvY2FsZX1cIiBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCBTVVBQT1JURURfTE9DQUxFUyA9ICR7SlNPTi5zdHJpbmdpZnkoc3VwcG9ydGVkTG9jYWxlcyl9IGFzIGNvbnN0O1xubGV0IF9jdXJyZW50TG9jYWxlOiAodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdID0gREVGQVVMVF9MT0NBTEU7XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRMb2NhbGUobG9jYWxlOiAodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdKSB7XG4gIF9jdXJyZW50TG9jYWxlID0gbG9jYWxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3VycmVudExvY2FsZSgpOiAodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdIHtcbiAgcmV0dXJuIF9jdXJyZW50TG9jYWxlO1xufVxuYC50cmltKCk7XG5cbiAgICAvLyBsb2NhbGUgaW1wb3J0XG4gICAgY29uc3QgbG9jYWxlSW1wb3J0cyA9IHN1cHBvcnRlZExvY2FsZXNcbiAgICAgIC5tYXAoKGxvY2FsZSkgPT4gYGltcG9ydCAke2xvY2FsZX0gZnJvbSBcIi4vJHtsb2NhbGV9XCI7YClcbiAgICAgIC5qb2luKFwiXFxuXCIpO1xuXG4gICAgLy8gZW50aXR5TGFiZWxz66W8IOy9lOuTnOuhnCDrs4DtmZhcbiAgICBjb25zdCBlbnRpdHlMYWJlbHNDb2RlID0gdGhpcy5nZW5lcmF0ZUVudGl0eUxhYmVsc0NvZGUoZW50aXR5TGFiZWxzKTtcblxuICAgIC8vIGxvY2FsZeuzhCByY0tleXMg67OA7IiY66qFIOunpO2VkVxuICAgIGNvbnN0IGdldFJDS2V5c1Zhck5hbWUgPSAobG9jYWxlOiBzdHJpbmcpID0+IHtcbiAgICAgIC8vIHN1cHBvcnRlZExvY2FsZXPsl5Ag7Y+s7ZWo65CcIGxvY2FsZeunjCDtlbTri7kg67OA7IiYIOuwmO2ZmFxuICAgICAgaWYgKGxvY2FsZSA9PT0gXCJrb1wiICYmIHN1cHBvcnRlZExvY2FsZXMuaW5jbHVkZXMoXCJrb1wiKSkgcmV0dXJuIFwicmNLZXlzS29cIjtcbiAgICAgIGlmIChsb2NhbGUgPT09IFwiZW5cIiAmJiBzdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKFwiZW5cIikpIHJldHVybiBcInJjS2V5c0VuXCI7XG4gICAgICAvLyBmYWxsYmFjazogZGVmYXVsdExvY2FsZeydmCByY0tleXNcbiAgICAgIGlmIChsb2NhbGUgIT09IGRlZmF1bHRMb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGdldFJDS2V5c1Zhck5hbWUoZGVmYXVsdExvY2FsZSk7XG4gICAgICB9XG4gICAgICAvLyBkZWZhdWx0TG9jYWxl7KGw7LCoIOyXhuuKlCDqsr3smrAgZW7snYQgZmFsbGJhY2vsnLzroZwg7IKs7JqpXG4gICAgICByZXR1cm4gXCJyY0tleXNFblwiO1xuICAgIH07XG5cbiAgICBjb25zdCBib2R5ID0gYFxuJHtsb2NhbGVNYW5hZ2VtZW50Q29kZX1cblxuJHtsb2NhbGVJbXBvcnRzfVxuXG4vLyByZWFjdC1jb21wb25lbnRzIGkxOG4ga2V5c1xuJHtzdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKFwia29cIikgPyByY0tleXNTb3VyY2VDb2RlLmtvIDogXCJcIn1cblxuJHtzdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKFwiZW5cIikgPyByY0tleXNTb3VyY2VDb2RlLmVuIDogXCJcIn1cblxuLy8gZW50aXR5Lmpzb27sl5DshJwg7LaU7Lac7ZWcIGVudGl0eSBsYWJlbHMgKGRlZmF1bHRMb2NhbGUg7KCE7JqpKVxuJHtlbnRpdHlMYWJlbHNDb2RlfVxuXG4vLyBkZWZhdWx0TG9jYWxl7J2YIGRpY3Rpb25hcnnrpbwg6riw7KSA7Jy866GcIO2CpCDstpTstpxcbnR5cGUgUkNLZXlzID0gdHlwZW9mICR7Z2V0UkNLZXlzVmFyTmFtZShkZWZhdWx0TG9jYWxlKX07XG50eXBlIFByb2plY3REaWN0aW9uYXJ5ID0gdHlwZW9mICR7ZGVmYXVsdExvY2FsZX07XG50eXBlIEVudGl0eUxhYmVscyA9IHR5cGVvZiBlbnRpdHlMYWJlbHM7XG50eXBlIFJhd01lcmdlZERpY3Rpb25hcnkgPSBSQ0tleXMgJiBPbWl0PEVudGl0eUxhYmVscywga2V5b2YgKFJDS2V5cyAmIFByb2plY3REaWN0aW9uYXJ5KT4gJiBQcm9qZWN0RGljdGlvbmFyeTtcblxuLy8g7YKk64qUIOycoOyngO2VmOuQmCwg6rCSIO2DgOyeheydgCBzdHJpbmcg65iQ64qUIO2VqOyImOuhnCDsnbzrsJjtmZQgKOuLpOuluCBsb2NhbGXsnZgg66as7YSw65+0IO2DgOyehSDstqnrj4wg67Cp7KeAKVxuZXhwb3J0IHR5cGUgTWVyZ2VkRGljdGlvbmFyeSA9IHtcbiAgW0sgaW4ga2V5b2YgUmF3TWVyZ2VkRGljdGlvbmFyeV06IFJhd01lcmdlZERpY3Rpb25hcnlbS10gZXh0ZW5kcyAoLi4uYXJnczogaW5mZXIgUCkgPT4gc3RyaW5nXG4gICAgPyAoLi4uYXJnczogUCkgPT4gc3RyaW5nXG4gICAgOiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgRGljdEtleSA9IGtleW9mIE1lcmdlZERpY3Rpb25hcnk7XG5leHBvcnQgdHlwZSBMb2NhbGl6ZWRTdHJpbmcgPSBzdHJpbmcgJiB7IF9fYnJhbmQ6IFwiTG9jYWxpemVkU3RyaW5nXCIgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUxvY2FsZShkaWN0OiBQYXJ0aWFsPE1lcmdlZERpY3Rpb25hcnk+KSB7XG4gIHJldHVybiBkaWN0O1xufVxuXG4vLyDqsIEgbG9jYWxl67OE66GcIHJjLWtleXMgKyBlbnRpdHkgbGFiZWxzICsg7ZSE66Gc7KCd7Yq4IGRpY3Qg7ZWp7LmoXG5jb25zdCBkaWN0aW9uYXJpZXM6IFJlY29yZDxzdHJpbmcsIFBhcnRpYWw8TWVyZ2VkRGljdGlvbmFyeT4+ID0ge1xuICAke2RlZmF1bHRMb2NhbGV9OiB7IC4uLiR7Z2V0UkNLZXlzVmFyTmFtZShkZWZhdWx0TG9jYWxlKX0sIC4uLmVudGl0eUxhYmVscywgLi4uJHtkZWZhdWx0TG9jYWxlfSB9LFxuICAke3N1cHBvcnRlZExvY2FsZXNcbiAgICAuZmlsdGVyKChsb2NhbGUpID0+IGxvY2FsZSAhPT0gZGVmYXVsdExvY2FsZSlcbiAgICAubWFwKChsb2NhbGUpID0+IGAgICR7bG9jYWxlfTogeyAuLi4ke2dldFJDS2V5c1Zhck5hbWUobG9jYWxlKX0sIC4uLiR7bG9jYWxlfSB9LGApXG4gICAgLmpvaW4oXCJcXG5cIil9XG59O1xuXG50eXBlIFNEUmV0dXJuVHlwZTxLIGV4dGVuZHMgRGljdEtleT4gPSBNZXJnZWREaWN0aW9uYXJ5W0tdIGV4dGVuZHMgKC4uLmFyZ3M6IGluZmVyIFApID0+IHN0cmluZ1xuICA/ICguLi5hcmdzOiBQKSA9PiBMb2NhbGl6ZWRTdHJpbmdcbiAgOiBMb2NhbGl6ZWRTdHJpbmc7XG5cbmZ1bmN0aW9uIGdldERpY3RWYWx1ZTxLIGV4dGVuZHMgRGljdEtleT4oa2V5OiBLLCBsb2NhbGU6IHN0cmluZyk6IFNEUmV0dXJuVHlwZTxLPiB7XG4gIC8vIDEuIOyngOygleuQnCBsb2NhbGXsl5DshJwg7KGw7ZqMXG4gIGNvbnN0IGRpY3QgPSBkaWN0aW9uYXJpZXNbbG9jYWxlXTtcbiAgaWYgKGRpY3Q/LltrZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZGljdFtrZXldIGFzIHVua25vd24gYXMgU0RSZXR1cm5UeXBlPEs+O1xuICB9XG5cbiAgLy8gMi4gZGVmYXVsdCBsb2NhbGXsl5DshJwg7KGw7ZqMXG4gIGlmIChsb2NhbGUgIT09IERFRkFVTFRfTE9DQUxFICYmIGRpY3Rpb25hcmllc1tERUZBVUxUX0xPQ0FMRV0/LltrZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZGljdGlvbmFyaWVzW0RFRkFVTFRfTE9DQUxFXVtrZXldIGFzIHVua25vd24gYXMgU0RSZXR1cm5UeXBlPEs+O1xuICB9XG5cbiAgLy8gMy4gc3VwcG9ydGVkIGxvY2FsZXMg7Iic7ZqMXG4gIGZvciAoY29uc3Qgc3VwcG9ydGVkTG9jYWxlIG9mIFNVUFBPUlRFRF9MT0NBTEVTKSB7XG4gICAgaWYgKHN1cHBvcnRlZExvY2FsZSAhPT0gbG9jYWxlICYmIHN1cHBvcnRlZExvY2FsZSAhPT0gREVGQVVMVF9MT0NBTEUpIHtcbiAgICAgIGlmIChkaWN0aW9uYXJpZXNbc3VwcG9ydGVkTG9jYWxlXT8uW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZGljdGlvbmFyaWVzW3N1cHBvcnRlZExvY2FsZV1ba2V5XSBhcyB1bmtub3duIGFzIFNEUmV0dXJuVHlwZTxLPjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyA0LiDrqqjrkZAg7Iuk7YyoIOyLnCBrZXkg67CY7ZmYXG4gIHJldHVybiBrZXkgYXMgdW5rbm93biBhcyBTRFJldHVyblR5cGU8Sz47XG59XG5cbi8qKlxuICogU29uYW11IERpY3Rpb25hcnkg7ZWo7IiYXG4gKiBsb2NhbGXsl5Ag66ee64qUIOuyiOyXrSDthY3siqTtirjrpbwg67CY7ZmY7ZWp64uI64ukLlxuICpcbiAqIEBleGFtcGxlXG4gKiBTRChcImNvbW1vbi5zYXZlXCIpICAvLyDihpIgXCLsoIDsnqVcIiAoTG9jYWxpemVkU3RyaW5nKVxuICogU0QoXCJ1c2VyLm5vdEZvdW5kXCIpKDEpICAvLyDihpIgXCLsobTsnqztlZjsp4Ag7JWK64qUIFVzZXIgSUQgMVwiIChMb2NhbGl6ZWRTdHJpbmcpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTRDxLIGV4dGVuZHMgRGljdEtleT4oa2V5OiBLKTogU0RSZXR1cm5UeXBlPEs+IHtcbiAgY29uc3QgbG9jYWxlID0gZ2V0Q3VycmVudExvY2FsZSgpO1xuICByZXR1cm4gZ2V0RGljdFZhbHVlKGtleSwgbG9jYWxlKTtcbn1cblxuLyoqXG4gKiDtirnsoJUgbG9jYWxl7J2YIOuyiOyXrSDthY3siqTtirjrpbwg67CY7ZmY7ZWY64qUIO2VqOyImOulvCDsg53shLHtlanri4jri6QuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IEVOID0gU0QubG9jYWxlKFwiZW5cIik7XG4gKiBFTihcImNvbW1vbi5zYXZlXCIpICAvLyDihpIgXCJTYXZlXCJcbiAqL1xuU0QubG9jYWxlID0gKGxvY2FsZTogKHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXSkgPT4gPEsgZXh0ZW5kcyBEaWN0S2V5PihrZXk6IEspOiBTRFJldHVyblR5cGU8Sz4gPT4ge1xuICByZXR1cm4gZ2V0RGljdFZhbHVlKGtleSwgbG9jYWxlKTtcbn07XG5cbi8vIExvY2FsaXplZCDqsIDriqXtlZwgQ29sdW1uIO2DgOyehSDqs4TsgrBcbnR5cGUgTG9jYWxpemVkQmFzZUNvbHVtbjxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVCAmIHN0cmluZ106IEsgZXh0ZW5kcyBcXGBcXCR7aW5mZXIgQmFzZX1fXFwkeyh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl19XFxgID8gQmFzZSA6IEs7XG59W2tleW9mIFQgJiBzdHJpbmddO1xuXG4vKipcbiAqIGxvY2FsZeyXkCDrlLDrnbwg7KCB7KCI7ZWcIOy7rOufvCDqsJLsnYQg67CY7ZmY7ZWp64uI64ukLlxuICogRELsl5AgbmFtZSwgbmFtZV9rbywgbmFtZV9lbuyymOufvCBsb2NhbGl6ZWQgY29sdW1u7J20IOyeiOydhCDrlYwg7IKs7Jqp7ZWp64uI64ukLlxuICpcbiAqIOyasOyEoOyInOychCAo7KeA7JuQIOuhnOy8gOydvOydgCBrby9qcC9lbuydtOqzoCwg7ISc67mE7Iqk7J2YIOq4sOuzuCDroZzsvIDsnbzsnYAga28sIOyCrOyaqeyekOydmCDroZzsvIDsnbzsnYAganDsnbwg65WMKTogY29sdW1uX2pwIOKGkiBjb2x1bW4g4oaSIGNvbHVtbl9rbyDihpIgY29sdW1uX2VuXG4gKiDsmrDshKDsiJzsnIQgKOyngOybkCDroZzsvIDsnbzsnYAga28vanAvZW7snbTqs6AsIOyEnOu5hOyKpOydmCDquLDrs7gg66Gc7LyA7J287J2AIGVuLCDsgqzsmqnsnpDsnZgg66Gc7LyA7J287J2AIGtv7J28IOuVjCk6IGNvbHVtbl9rbyDihpIgY29sdW1uIOKGkiBjb2x1bW5fZW4g4oaSIGNvbHVtbl9qcFxuICpcbiAqIEBleGFtcGxlXG4gKiBsb2NhbGl6ZWRDb2x1bW4odGFnLCBcIm5hbWVcIilcbiAqL1xudHlwZSBMb2NhbGl6ZWRDb2x1bW5TY2FsYXJWYWx1ZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBiaWdpbnQ7XG50eXBlIExvY2FsaXplZENvbHVtblZhbHVlID0gc3RyaW5nIHwgc3RyaW5nW107XG50eXBlIE5lc3RlZExvY2FsaXplZENvbHVtblZhbHVlRnJvbTxWPiA9IFYgZXh0ZW5kcyBzdHJpbmdcbiAgPyBzdHJpbmdcbiAgOiBWIGV4dGVuZHMgcmVhZG9ubHkgc3RyaW5nW11cbiAgICA/IHN0cmluZ1tdXG4gICAgOiBuZXZlcjtcbnR5cGUgTG9jYWxpemVkQ29sdW1uVmFsdWVGcm9tPFY+ID0gViBleHRlbmRzIHN0cmluZ1xuICA/IHN0cmluZ1xuICA6IFYgZXh0ZW5kcyByZWFkb25seSBzdHJpbmdbXVxuICAgID8gc3RyaW5nW11cbiAgICA6IFYgZXh0ZW5kcyBudW1iZXIgfCBib29sZWFuIHwgYmlnaW50XG4gICAgICA/IHN0cmluZ1xuICAgICAgOiBWIGV4dGVuZHMgUGFydGlhbDxSZWNvcmQ8KHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXSwgaW5mZXIgTFY+PlxuICAgICAgICA/IE5lc3RlZExvY2FsaXplZENvbHVtblZhbHVlRnJvbTxMVj5cbiAgICAgIDogbmV2ZXI7XG50eXBlIExvY2FsaXplZENvbHVtbkNhbmRpZGF0ZTxULCBLIGV4dGVuZHMgc3RyaW5nPiA9XG4gIHwgKEsgZXh0ZW5kcyBrZXlvZiBUID8gVFtLXSA6IG5ldmVyKVxuICB8IHtcbiAgICAgIFtMIGluICh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl1dOiBcXGBcXCR7S31fXFwke0x9XFxgIGV4dGVuZHMga2V5b2YgVCA/IFRbXFxgXFwke0t9X1xcJHtMfVxcYF0gOiBuZXZlcjtcbiAgICB9Wyh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl1dO1xudHlwZSBMb2NhbGl6ZWRDb2x1bW5SZXR1cm48VCwgSyBleHRlbmRzIHN0cmluZz4gPVxuICB8IExvY2FsaXplZENvbHVtblZhbHVlRnJvbTxMb2NhbGl6ZWRDb2x1bW5DYW5kaWRhdGU8VCwgSz4+XG4gIHwgdW5kZWZpbmVkO1xudHlwZSBMb2NhbGVWYWx1ZU1hcCA9IFBhcnRpYWw8UmVjb3JkPCh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl0sIHVua25vd24+PjtcblxuZnVuY3Rpb24gaXNMb2NhbGl6ZWRDb2x1bW5WYWx1ZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIExvY2FsaXplZENvbHVtblZhbHVlIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUuZXZlcnkoKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSBcInN0cmluZ1wiKSk7XG59XG5cbmZ1bmN0aW9uIGlzTG9jYWxpemVkQ29sdW1uU2NhbGFyVmFsdWUodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBMb2NhbGl6ZWRDb2x1bW5TY2FsYXJWYWx1ZSB7XG4gIHJldHVybiBbXCJzdHJpbmdcIiwgXCJudW1iZXJcIiwgXCJib29sZWFuXCIsIFwiYmlnaW50XCJdLmluY2x1ZGVzKHR5cGVvZiB2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIGlzRW1wdHlMb2NhbGl6ZWRDb2x1bW5WYWx1ZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG51bGwgfCB1bmRlZmluZWQgfCBcIlwiIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IFwiXCI7XG59XG5cbmZ1bmN0aW9uIGdldE5lc3RlZExvY2FsZVZhbHVlPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgSyBleHRlbmRzIExvY2FsaXplZEJhc2VDb2x1bW48VD4+KFxuICByb3c6IFQsXG4gIGNvbHVtbjogSyxcbiAgbG9jYWxlOiAodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdLFxuKTogdW5rbm93biB7XG4gIGNvbnN0IGNvbHVtblZhbHVlID0gcm93W2NvbHVtbl07XG4gIGlmIChjb2x1bW5WYWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgY29sdW1uVmFsdWUgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShjb2x1bW5WYWx1ZSkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIChjb2x1bW5WYWx1ZSBhcyBMb2NhbGVWYWx1ZU1hcClbbG9jYWxlXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvY2FsaXplZENvbHVtbjxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIEsgZXh0ZW5kcyBMb2NhbGl6ZWRCYXNlQ29sdW1uPFQ+PihcbiAgcm93OiBULFxuICBjb2x1bW46IEssXG4pOiBMb2NhbGl6ZWRDb2x1bW5SZXR1cm48VCwgSz4ge1xuICBjb25zdCBjdXJyZW50TG9jYWxlID0gZ2V0Q3VycmVudExvY2FsZSgpO1xuICBjb25zdCBsb2NhbGUgPSBTVVBQT1JURURfTE9DQUxFUy5pbmNsdWRlcyhjdXJyZW50TG9jYWxlKSA/IGN1cnJlbnRMb2NhbGUgOiBERUZBVUxUX0xPQ0FMRTtcbiAgY29uc3Qgb3RoZXJMb2NhbGVzID0gU1VQUE9SVEVEX0xPQ0FMRVMuZmlsdGVyKChsOiBzdHJpbmcpID0+IGwgIT09IGxvY2FsZSAmJiBsICE9PSBERUZBVUxUX0xPQ0FMRSk7XG4gIGNvbnN0IGxvY2FsaXplZEtleSA9IChjb2x1bW46IEssIGxvY2FsZTogKHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXSkgPT4gXFxgXFwke2NvbHVtbn1fXFwke2xvY2FsZX1cXGA7XG4gIGNvbnN0IHZhbHVlcyA9IFtcbiAgICB7IHZhbHVlOiByb3dbbG9jYWxpemVkS2V5KGNvbHVtbiwgbG9jYWxlKV0sIHNvdXJjZTogXCJkaXJlY3RcIiB9LFxuICAgIHsgdmFsdWU6IGdldE5lc3RlZExvY2FsZVZhbHVlKHJvdywgY29sdW1uLCBsb2NhbGUpLCBzb3VyY2U6IFwibmVzdGVkXCIgfSxcbiAgICB7IHZhbHVlOiByb3dbY29sdW1uXSwgc291cmNlOiBcImRpcmVjdFwiIH0sXG4gICAgeyB2YWx1ZTogcm93W2xvY2FsaXplZEtleShjb2x1bW4sIERFRkFVTFRfTE9DQUxFKV0sIHNvdXJjZTogXCJkaXJlY3RcIiB9LFxuICAgIHsgdmFsdWU6IGdldE5lc3RlZExvY2FsZVZhbHVlKHJvdywgY29sdW1uLCBERUZBVUxUX0xPQ0FMRSksIHNvdXJjZTogXCJuZXN0ZWRcIiB9LFxuICAgIC4uLm90aGVyTG9jYWxlcy5mbGF0TWFwKChsKSA9PiBbXG4gICAgICB7IHZhbHVlOiByb3dbbG9jYWxpemVkS2V5KGNvbHVtbiwgbCldLCBzb3VyY2U6IFwiZGlyZWN0XCIgfSxcbiAgICAgIHsgdmFsdWU6IGdldE5lc3RlZExvY2FsZVZhbHVlKHJvdywgY29sdW1uLCBsKSwgc291cmNlOiBcIm5lc3RlZFwiIH0sXG4gICAgXSksXG4gIF07XG5cbiAgZm9yIChjb25zdCB7IHZhbHVlLCBzb3VyY2UgfSBvZiB2YWx1ZXMpIHtcbiAgICBpZiAoIWlzRW1wdHlMb2NhbGl6ZWRDb2x1bW5WYWx1ZSh2YWx1ZSkgJiYgaXNMb2NhbGl6ZWRDb2x1bW5WYWx1ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZSBhcyBMb2NhbGl6ZWRDb2x1bW5SZXR1cm48VCwgSz47XG4gICAgfVxuICAgIGlmIChzb3VyY2UgPT09IFwiZGlyZWN0XCIgJiYgIWlzRW1wdHlMb2NhbGl6ZWRDb2x1bW5WYWx1ZSh2YWx1ZSkgJiYgaXNMb2NhbGl6ZWRDb2x1bW5TY2FsYXJWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpIGFzIExvY2FsaXplZENvbHVtblJldHVybjxULCBLPjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEVudW3snZggbG9jYWxpemVkIGxhYmVsc+ulvCBQcm94eeuhnCDrsJjtmZjtlanri4jri6QuXG4gKiBTZWxlY3Qg7Lu07Y+s64SM7Yq4IOuTseyXkOyEnCBFbnVtTGFiZWxba2V5XSDrjIDsi6Ag7IKs7Jqp7ZWp64uI64ukLlxuICpcbiAqIEBleGFtcGxlXG4gKiBTRC5lbnVtTGFiZWxzKFwiVGFnT3JkZXJCeVwiKVtrZXldICAvLyDihpIg7ZiE7J6sIGxvY2FsZeydmCDrnbzrsqhcbiAqL1xuU0QuZW51bUxhYmVscyA9IChlbnVtTmFtZTogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgTG9jYWxpemVkU3RyaW5nPiA9PiB7XG4gIHJldHVybiBuZXcgUHJveHkoe30gYXMgUmVjb3JkPHN0cmluZywgTG9jYWxpemVkU3RyaW5nPiwge1xuICAgIGdldChfLCBrZXk6IHN0cmluZyB8IHN5bWJvbCkge1xuICAgICAgaWYgKHR5cGVvZiBrZXkgPT09IFwic3ltYm9sXCIpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGljdEtleSA9IFxcYGVudW0uXFwke2VudW1OYW1lfS5cXCR7a2V5fVxcYCBhcyBEaWN0S2V5O1xuICAgICAgcmV0dXJuIGdldERpY3RWYWx1ZShkaWN0S2V5LCBnZXRDdXJyZW50TG9jYWxlKCkpO1xuICAgIH1cbiAgfSk7XG59O1xuYC50cmltKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5nZXRUYXJnZXRBbmRQYXRoKHVuZGVmaW5lZCwgdGFyZ2V0KSxcbiAgICAgIGJvZHksXG4gICAgICBpbXBvcnRLZXlzOiBbXSxcbiAgICAgIGN1c3RvbUhlYWRlcnM6IFtcIi8qKlwiLCBcIiAqIEBnZW5lcmF0ZWRcIiwgXCIgKiDsp4HsoJEg7IiY7KCV7ZWY7KeAIOuniOyEuOyalC5cIiwgXCIgKi9cIiwgXCJcIl0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZWFjdC1jb21wb25lbnRz7J2YIHJjLWtleXPrpbwg7LaU7Lac7ZWpXG4gICAqIHNvbmFtdS9zcmMvZGljdC9yYy1rZXlzLnRzIO2MjOydvOydmCDshozsiqQg7L2U65Oc66W8IOyngeygkSDsnb3slrTshJwg67CY7ZmYXG4gICAqL1xuICBwcml2YXRlIGV4dHJhY3RSQ0tleXNTb3VyY2VDb2RlKCk6IHsga286IHN0cmluZzsgZW46IHN0cmluZyB9IHtcbiAgICB0cnkge1xuICAgICAgLy8gcmMta2V5cy50cyDtjIzsnbwg6rK966GcXG4gICAgICBjb25zdCBfX2ZpbGVuYW1lID0gZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpO1xuICAgICAgY29uc3QgX19kaXJuYW1lID0gcGF0aC5kaXJuYW1lKF9fZmlsZW5hbWUpO1xuXG4gICAgICAvLyBkaXN07JeQ7IScIOyLpO2WieuQoCDrlYzripQgc3Jj66GcIOqyveuhnCDrs4Dqsr1cbiAgICAgIGNvbnN0IGJhc2VQYXRoID0gX19kaXJuYW1lLmluY2x1ZGVzKFwiL2Rpc3QvXCIpXG4gICAgICAgID8gX19kaXJuYW1lLnJlcGxhY2UoXCIvZGlzdC9cIiwgXCIvc3JjL1wiKVxuICAgICAgICA6IF9fZGlybmFtZTtcblxuICAgICAgY29uc3QgcmNLZXlzUGF0aCA9IHBhdGguam9pbihiYXNlUGF0aCwgXCIuLi8uLi9kaWN0L3JjLWtleXMudHNcIik7XG5cbiAgICAgIC8vIO2MjOydvCDsnb3quLBcbiAgICAgIGNvbnN0IHNvdXJjZUNvZGUgPSBmcy5yZWFkRmlsZVN5bmMocmNLZXlzUGF0aCwgXCJ1dGYtOFwiKTtcblxuICAgICAgLy8gcmNLZXlzS28g7LaU7LacICjspJHqtITtmLgg7Lm07Jq07YyFIOuwqeyLnSlcbiAgICAgIGNvbnN0IGtvQ29kZSA9IGV4dHJhY3RPYmplY3REZWNsYXJhdGlvbihzb3VyY2VDb2RlLCBcInJjS2V5c0tvXCIpO1xuXG4gICAgICAvLyByY0tleXNFbiDstpTstpwgKOykkeq0hO2YuCDsubTsmrTtjIUg67Cp7IudKVxuICAgICAgY29uc3QgZW5Db2RlID0gZXh0cmFjdE9iamVjdERlY2xhcmF0aW9uKHNvdXJjZUNvZGUsIFwicmNLZXlzRW5cIik7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtvOiBrb0NvZGUucmVwbGFjZSgvXmV4cG9ydCAvLCBcIlwiKSxcbiAgICAgICAgZW46IGVuQ29kZS5yZXBsYWNlKC9eZXhwb3J0IC8sIFwiXCIpLnJlcGxhY2UoLyBzYXRpc2ZpZXMgUkNLZXlzLywgXCIgYXMgY29uc3RcIiksXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyByYy1rZXlzIO2MjOydvOydtCDsl4bripQg6rK97JqwIOu5iCDsvZTrk5wg67CY7ZmYXG4gICAgICBjb25zb2xlLndhcm4oXCJGYWlsZWQgdG8gbG9hZCByYy1rZXlzIHNvdXJjZTpcIiwgZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAga286IFwiY29uc3QgcmNLZXlzS28gPSB7fSBhcyBjb25zdDtcIixcbiAgICAgICAgZW46IFwiY29uc3QgcmNLZXlzRW4gPSB7fSBhcyBjb25zdDtcIixcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOuqqOuToCBlbnRpdHkuanNvbuyXkOyEnCBlbnRpdHkgbGFiZWxzIOy2lOy2nFxuICAgKiBlbnRpdHkuanNvbuyXkOyEnCDsp4HsoJEg6rSA66as65CY64qUIOqwkuunjCDtj6ztlaggKOyekOuPmSDsg53shLEg6rCSIOygnOyZuClcbiAgICogLSBlbnRpdHkue2VudGl0eUlkfTogZW50aXR5IHRpdGxlXG4gICAqIC0gZW50aXR5LntlbnRpdHlJZH0ue3Byb3BOYW1lfTogcHJvcCBkZXNjXG4gICAqIC0gZW51bS57RW51bUlkfS57dmFsdWV9OiBlbnVtIGxhYmVsXG4gICAqL1xuICBwcml2YXRlIGV4dHJhY3RFbnRpdHlMYWJlbHMoKTogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10ge1xuICAgIGNvbnN0IGxhYmVsczogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10gPSBbXTtcblxuICAgIGlmICghRW50aXR5TWFuYWdlci5pc0F1dG9sb2FkZWQpIHtcbiAgICAgIHJldHVybiBsYWJlbHM7XG4gICAgfVxuXG4gICAgY29uc3QgZW50aXR5SWRzID0gRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKTtcblxuICAgIGZvciAoY29uc3QgZW50aXR5SWQgb2YgZW50aXR5SWRzKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG5cbiAgICAgIC8vIGVudGl0eSB0aXRsZSAoZW50aXR5Lmpzb27sl5DshJwg6rSA66asKVxuICAgICAgbGFiZWxzLnB1c2goeyBrZXk6IGBlbnRpdHkuJHtlbnRpdHlJZH1gLCB2YWx1ZTogZW50aXR5LnRpdGxlIH0pO1xuXG4gICAgICAvLyBwcm9wIGxhYmVscyAoZW50aXR5Lmpzb27sl5DshJwg6rSA66asKVxuICAgICAgZm9yIChjb25zdCBwcm9wIG9mIGVudGl0eS5wcm9wcykge1xuICAgICAgICBpZiAocHJvcC5kZXNjKSB7XG4gICAgICAgICAgbGFiZWxzLnB1c2goeyBrZXk6IGBlbnRpdHkuJHtlbnRpdHlJZH0uJHtwcm9wLm5hbWV9YCwgdmFsdWU6IHByb3AuZGVzYyB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBlbnVtIGxhYmVscyAoZW50aXR5Lmpzb27sl5DshJwg6rSA66asKVxuICAgICAgZm9yIChjb25zdCBbZW51bUlkLCBlbnVtTGFiZWxzTWFwXSBvZiBPYmplY3QuZW50cmllcyhlbnRpdHkuZW51bUxhYmVscykpIHtcbiAgICAgICAgZm9yIChjb25zdCBbdmFsdWUsIGxhYmVsXSBvZiBPYmplY3QuZW50cmllcyhlbnVtTGFiZWxzTWFwKSkge1xuICAgICAgICAgIGxhYmVscy5wdXNoKHsga2V5OiBgZW51bS4ke2VudW1JZH0uJHt2YWx1ZX1gLCB2YWx1ZTogbGFiZWwgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbGFiZWxzO1xuICB9XG5cbiAgLyoqXG4gICAqIGVudGl0eUxhYmVsc+ulvCBUeXBlU2NyaXB0IOy9lOuTnOuhnCDrs4DtmZhcbiAgICovXG4gIHByaXZhdGUgZ2VuZXJhdGVFbnRpdHlMYWJlbHNDb2RlKGxhYmVsczogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10pOiBzdHJpbmcge1xuICAgIGlmIChsYWJlbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gXCJjb25zdCBlbnRpdHlMYWJlbHMgPSB7fSBhcyBjb25zdDtcIjtcbiAgICB9XG5cbiAgICBjb25zdCBlbnRyaWVzID0gbGFiZWxzLm1hcCgoeyBrZXksIHZhbHVlIH0pID0+IGAgIFwiJHtrZXl9XCI6IFwiJHt0aGlzLmVzY2FwZVN0cmluZyh2YWx1ZSl9XCIsYCk7XG5cbiAgICByZXR1cm4gYGNvbnN0IGVudGl0eUxhYmVscyA9IHtcbiR7ZW50cmllcy5qb2luKFwiXFxuXCIpfVxufSBhcyBjb25zdDtgO1xuICB9XG5cbiAgcHJpdmF0ZSBlc2NhcGVTdHJpbmcoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvXFxcXC9nLCBcIlxcXFxcXFxcXCIpLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKS5y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
|
|
357
|
+
|
|
358
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2QudGVtcGxhdGUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3RlbXBsYXRlL2ltcGxlbWVudGF0aW9ucy9zZC50ZW1wbGF0ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tIFwibm9kZTp1cmxcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uLy4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyB0eXBlIEVudGl0eU5hbWVzUmVjb3JkIH0gZnJvbSBcIi4uLy4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgdHlwZSBUZW1wbGF0ZU9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGV4dHJhY3RPYmplY3REZWNsYXJhdGlvbiB9IGZyb20gXCIuLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gXCIuLi90ZW1wbGF0ZVwiO1xuXG4vKipcbiAqIFNvbmFtdSBEaWN0aW9uYXJ5IChTRCkg7YWc7ZSM66a/XG4gKiBpMThu7J2EIOychO2VnCBzZC5nZW5lcmF0ZWQudHMg7YyM7J287J2EIOyDneyEse2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGNsYXNzIFRlbXBsYXRlX19zZCBleHRlbmRzIFRlbXBsYXRlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJzZFwiKTtcbiAgfVxuXG4gIGdldFRhcmdldEFuZFBhdGgoX25hbWVzPzogRW50aXR5TmFtZXNSZWNvcmQsIHNkVGFyZ2V0PzogXCJhcGlcIiB8IFwid2ViXCIgfCBcImFwcFwiKSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gc2RUYXJnZXQgPz8gXCJhcGlcIjtcbiAgICAvLyBhcGkuZGly7J2AIOyDgeuMgCDqsr3roZwoXCJhcGlcIinsnbTrr4DroZwsIHdlYi9hcHDrj4Qg7IOB64yAIOqyveuhnOuhnCDrp57stqRcbiAgICBjb25zdCBkaXIgPSB0YXJnZXQgPT09IFwiYXBpXCIgPyBTb25hbXUuY29uZmlnLmFwaS5kaXIgOiB0YXJnZXQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGFyZ2V0OiBgJHtkaXJ9L3NyYy9pMThuYCxcbiAgICAgIHBhdGg6IFwic2QuZ2VuZXJhdGVkLnRzXCIsXG4gICAgfTtcbiAgfVxuXG4gIHJlbmRlcihvcHRpb25zOiBUZW1wbGF0ZU9wdGlvbnNbXCJzZFwiXSkge1xuICAgIGNvbnN0IHsgdGFyZ2V0IH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGkxOG5Db25maWcgPSBTb25hbXUuY29uZmlnLmkxOG47XG5cbiAgICBjb25zdCB7IGRlZmF1bHRMb2NhbGUsIHN1cHBvcnRlZExvY2FsZXMgfSA9IGkxOG5Db25maWc7XG5cbiAgICAvLyBlbnRpdHkuanNvbuyXkOyEnCBlbnRpdHkgbGFiZWxzIOy2lOy2nFxuICAgIGNvbnN0IGVudGl0eUxhYmVscyA9IHRoaXMuZXh0cmFjdEVudGl0eUxhYmVscygpO1xuXG4gICAgLy8gcmMta2V5cyDshozsiqQg7L2U65OcIOy2lOy2nFxuICAgIGNvbnN0IHJjS2V5c1NvdXJjZUNvZGUgPSB0aGlzLmV4dHJhY3RSQ0tleXNTb3VyY2VDb2RlKCk7XG5cbiAgICAvLyDtlIzrnqvtj7zrs4QgbG9jYWxlIOq0gOumrCDsvZTrk5xcbiAgICBjb25zdCBsb2NhbGVNYW5hZ2VtZW50Q29kZSA9XG4gICAgICB0YXJnZXQgPT09IFwiYXBpXCJcbiAgICAgICAgPyBgXG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwic29uYW11XCI7XG5cbmNvbnN0IERFRkFVTFRfTE9DQUxFID0gXCIke2RlZmF1bHRMb2NhbGV9XCIgYXMgY29uc3Q7XG5jb25zdCBTVVBQT1JURURfTE9DQUxFUyA9ICR7SlNPTi5zdHJpbmdpZnkoc3VwcG9ydGVkTG9jYWxlcyl9IGFzIGNvbnN0O1xuZnVuY3Rpb24gZ2V0Q3VycmVudExvY2FsZSgpOiAodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjdHggPSBTb25hbXUuZ2V0Q29udGV4dCgpO1xuICAgIHJldHVybiBjdHgubG9jYWxlIGFzICh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl0gPz8gREVGQVVMVF9MT0NBTEU7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gREVGQVVMVF9MT0NBTEU7XG4gIH1cbn1cbmAudHJpbSgpXG4gICAgICAgIDogYFxuY29uc3QgREVGQVVMVF9MT0NBTEUgPSBcIiR7ZGVmYXVsdExvY2FsZX1cIiBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCBTVVBQT1JURURfTE9DQUxFUyA9ICR7SlNPTi5zdHJpbmdpZnkoc3VwcG9ydGVkTG9jYWxlcyl9IGFzIGNvbnN0O1xubGV0IF9jdXJyZW50TG9jYWxlOiAodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdID0gREVGQVVMVF9MT0NBTEU7XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRMb2NhbGUobG9jYWxlOiAodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdKSB7XG4gIF9jdXJyZW50TG9jYWxlID0gbG9jYWxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3VycmVudExvY2FsZSgpOiAodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdIHtcbiAgcmV0dXJuIF9jdXJyZW50TG9jYWxlO1xufVxuYC50cmltKCk7XG5cbiAgICAvLyBsb2NhbGUgaW1wb3J0XG4gICAgY29uc3QgbG9jYWxlSW1wb3J0cyA9IHN1cHBvcnRlZExvY2FsZXNcbiAgICAgIC5tYXAoKGxvY2FsZSkgPT4gYGltcG9ydCAke2xvY2FsZX0gZnJvbSBcIi4vJHtsb2NhbGV9XCI7YClcbiAgICAgIC5qb2luKFwiXFxuXCIpO1xuXG4gICAgLy8gZW50aXR5TGFiZWxz66W8IOy9lOuTnOuhnCDrs4DtmZhcbiAgICBjb25zdCBlbnRpdHlMYWJlbHNDb2RlID0gdGhpcy5nZW5lcmF0ZUVudGl0eUxhYmVsc0NvZGUoZW50aXR5TGFiZWxzKTtcblxuICAgIC8vIGxvY2FsZeuzhCByY0tleXMg67OA7IiY66qFIOunpO2VkVxuICAgIGNvbnN0IGdldFJDS2V5c1Zhck5hbWUgPSAobG9jYWxlOiBzdHJpbmcpID0+IHtcbiAgICAgIC8vIHN1cHBvcnRlZExvY2FsZXPsl5Ag7Y+s7ZWo65CcIGxvY2FsZeunjCDtlbTri7kg67OA7IiYIOuwmO2ZmFxuICAgICAgaWYgKGxvY2FsZSA9PT0gXCJrb1wiICYmIHN1cHBvcnRlZExvY2FsZXMuaW5jbHVkZXMoXCJrb1wiKSkgcmV0dXJuIFwicmNLZXlzS29cIjtcbiAgICAgIGlmIChsb2NhbGUgPT09IFwiZW5cIiAmJiBzdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKFwiZW5cIikpIHJldHVybiBcInJjS2V5c0VuXCI7XG4gICAgICAvLyBmYWxsYmFjazogZGVmYXVsdExvY2FsZeydmCByY0tleXNcbiAgICAgIGlmIChsb2NhbGUgIT09IGRlZmF1bHRMb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGdldFJDS2V5c1Zhck5hbWUoZGVmYXVsdExvY2FsZSk7XG4gICAgICB9XG4gICAgICAvLyBkZWZhdWx0TG9jYWxl7KGw7LCoIOyXhuuKlCDqsr3smrAgZW7snYQgZmFsbGJhY2vsnLzroZwg7IKs7JqpXG4gICAgICByZXR1cm4gXCJyY0tleXNFblwiO1xuICAgIH07XG5cbiAgICBjb25zdCBib2R5ID0gYFxuJHtsb2NhbGVNYW5hZ2VtZW50Q29kZX1cblxuJHtsb2NhbGVJbXBvcnRzfVxuXG4vLyByZWFjdC1jb21wb25lbnRzIGkxOG4ga2V5c1xuJHtzdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKFwia29cIikgPyByY0tleXNTb3VyY2VDb2RlLmtvIDogXCJcIn1cblxuJHtzdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKFwiZW5cIikgPyByY0tleXNTb3VyY2VDb2RlLmVuIDogXCJcIn1cblxuLy8gZW50aXR5Lmpzb27sl5DshJwg7LaU7Lac7ZWcIGVudGl0eSBsYWJlbHMgKGRlZmF1bHRMb2NhbGUg7KCE7JqpKVxuJHtlbnRpdHlMYWJlbHNDb2RlfVxuXG4vLyBkZWZhdWx0TG9jYWxl7J2YIGRpY3Rpb25hcnnrpbwg6riw7KSA7Jy866GcIO2CpCDstpTstpxcbnR5cGUgUkNLZXlzID0gdHlwZW9mICR7Z2V0UkNLZXlzVmFyTmFtZShkZWZhdWx0TG9jYWxlKX07XG50eXBlIFByb2plY3REaWN0aW9uYXJ5ID0gdHlwZW9mICR7ZGVmYXVsdExvY2FsZX07XG50eXBlIEVudGl0eUxhYmVscyA9IHR5cGVvZiBlbnRpdHlMYWJlbHM7XG50eXBlIFJhd01lcmdlZERpY3Rpb25hcnkgPSBSQ0tleXMgJiBPbWl0PEVudGl0eUxhYmVscywga2V5b2YgKFJDS2V5cyAmIFByb2plY3REaWN0aW9uYXJ5KT4gJiBQcm9qZWN0RGljdGlvbmFyeTtcblxuLy8g7YKk64qUIOycoOyngO2VmOuQmCwg6rCSIO2DgOyeheydgCBzdHJpbmcg65iQ64qUIO2VqOyImOuhnCDsnbzrsJjtmZQgKOuLpOuluCBsb2NhbGXsnZgg66as7YSw65+0IO2DgOyehSDstqnrj4wg67Cp7KeAKVxuZXhwb3J0IHR5cGUgTWVyZ2VkRGljdGlvbmFyeSA9IHtcbiAgW0sgaW4ga2V5b2YgUmF3TWVyZ2VkRGljdGlvbmFyeV06IFJhd01lcmdlZERpY3Rpb25hcnlbS10gZXh0ZW5kcyAoLi4uYXJnczogaW5mZXIgUCkgPT4gc3RyaW5nXG4gICAgPyAoLi4uYXJnczogUCkgPT4gc3RyaW5nXG4gICAgOiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgRGljdEtleSA9IGtleW9mIE1lcmdlZERpY3Rpb25hcnk7XG5leHBvcnQgdHlwZSBMb2NhbGl6ZWRTdHJpbmcgPSBzdHJpbmcgJiB7IF9fYnJhbmQ6IFwiTG9jYWxpemVkU3RyaW5nXCIgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUxvY2FsZShkaWN0OiBQYXJ0aWFsPE1lcmdlZERpY3Rpb25hcnk+KSB7XG4gIHJldHVybiBkaWN0O1xufVxuXG4vLyDqsIEgbG9jYWxl67OE66GcIHJjLWtleXMgKyBlbnRpdHkgbGFiZWxzICsg7ZSE66Gc7KCd7Yq4IGRpY3Qg7ZWp7LmoXG5jb25zdCBkaWN0aW9uYXJpZXM6IFJlY29yZDxzdHJpbmcsIFBhcnRpYWw8TWVyZ2VkRGljdGlvbmFyeT4+ID0ge1xuICAke2RlZmF1bHRMb2NhbGV9OiB7IC4uLiR7Z2V0UkNLZXlzVmFyTmFtZShkZWZhdWx0TG9jYWxlKX0sIC4uLmVudGl0eUxhYmVscywgLi4uJHtkZWZhdWx0TG9jYWxlfSB9LFxuICAke3N1cHBvcnRlZExvY2FsZXNcbiAgICAuZmlsdGVyKChsb2NhbGUpID0+IGxvY2FsZSAhPT0gZGVmYXVsdExvY2FsZSlcbiAgICAubWFwKChsb2NhbGUpID0+IGAgICR7bG9jYWxlfTogeyAuLi4ke2dldFJDS2V5c1Zhck5hbWUobG9jYWxlKX0sIC4uLiR7bG9jYWxlfSB9LGApXG4gICAgLmpvaW4oXCJcXG5cIil9XG59O1xuXG50eXBlIFNEUmV0dXJuVHlwZTxLIGV4dGVuZHMgRGljdEtleT4gPSBNZXJnZWREaWN0aW9uYXJ5W0tdIGV4dGVuZHMgKC4uLmFyZ3M6IGluZmVyIFApID0+IHN0cmluZ1xuICA/ICguLi5hcmdzOiBQKSA9PiBMb2NhbGl6ZWRTdHJpbmdcbiAgOiBMb2NhbGl6ZWRTdHJpbmc7XG5cbmZ1bmN0aW9uIGdldERpY3RWYWx1ZTxLIGV4dGVuZHMgRGljdEtleT4oa2V5OiBLLCBsb2NhbGU6IHN0cmluZyk6IFNEUmV0dXJuVHlwZTxLPiB7XG4gIC8vIDEuIOyngOygleuQnCBsb2NhbGXsl5DshJwg7KGw7ZqMXG4gIGNvbnN0IGRpY3QgPSBkaWN0aW9uYXJpZXNbbG9jYWxlXTtcbiAgaWYgKGRpY3Q/LltrZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZGljdFtrZXldIGFzIHVua25vd24gYXMgU0RSZXR1cm5UeXBlPEs+O1xuICB9XG5cbiAgLy8gMi4gZGVmYXVsdCBsb2NhbGXsl5DshJwg7KGw7ZqMXG4gIGlmIChsb2NhbGUgIT09IERFRkFVTFRfTE9DQUxFICYmIGRpY3Rpb25hcmllc1tERUZBVUxUX0xPQ0FMRV0/LltrZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZGljdGlvbmFyaWVzW0RFRkFVTFRfTE9DQUxFXVtrZXldIGFzIHVua25vd24gYXMgU0RSZXR1cm5UeXBlPEs+O1xuICB9XG5cbiAgLy8gMy4gc3VwcG9ydGVkIGxvY2FsZXMg7Iic7ZqMXG4gIGZvciAoY29uc3Qgc3VwcG9ydGVkTG9jYWxlIG9mIFNVUFBPUlRFRF9MT0NBTEVTKSB7XG4gICAgaWYgKHN1cHBvcnRlZExvY2FsZSAhPT0gbG9jYWxlICYmIHN1cHBvcnRlZExvY2FsZSAhPT0gREVGQVVMVF9MT0NBTEUpIHtcbiAgICAgIGlmIChkaWN0aW9uYXJpZXNbc3VwcG9ydGVkTG9jYWxlXT8uW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZGljdGlvbmFyaWVzW3N1cHBvcnRlZExvY2FsZV1ba2V5XSBhcyB1bmtub3duIGFzIFNEUmV0dXJuVHlwZTxLPjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyA0LiDrqqjrkZAg7Iuk7YyoIOyLnCBrZXkg67CY7ZmYXG4gIHJldHVybiBrZXkgYXMgdW5rbm93biBhcyBTRFJldHVyblR5cGU8Sz47XG59XG5cbi8qKlxuICogU29uYW11IERpY3Rpb25hcnkg7ZWo7IiYXG4gKiBsb2NhbGXsl5Ag66ee64qUIOuyiOyXrSDthY3siqTtirjrpbwg67CY7ZmY7ZWp64uI64ukLlxuICpcbiAqIEBleGFtcGxlXG4gKiBTRChcImNvbW1vbi5zYXZlXCIpICAvLyDihpIgXCLsoIDsnqVcIiAoTG9jYWxpemVkU3RyaW5nKVxuICogU0QoXCJ1c2VyLm5vdEZvdW5kXCIpKDEpICAvLyDihpIgXCLsobTsnqztlZjsp4Ag7JWK64qUIFVzZXIgSUQgMVwiIChMb2NhbGl6ZWRTdHJpbmcpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTRDxLIGV4dGVuZHMgRGljdEtleT4oa2V5OiBLKTogU0RSZXR1cm5UeXBlPEs+IHtcbiAgY29uc3QgbG9jYWxlID0gZ2V0Q3VycmVudExvY2FsZSgpO1xuICByZXR1cm4gZ2V0RGljdFZhbHVlKGtleSwgbG9jYWxlKTtcbn1cblxuLyoqXG4gKiDtirnsoJUgbG9jYWxl7J2YIOuyiOyXrSDthY3siqTtirjrpbwg67CY7ZmY7ZWY64qUIO2VqOyImOulvCDsg53shLHtlanri4jri6QuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IEVOID0gU0QubG9jYWxlKFwiZW5cIik7XG4gKiBFTihcImNvbW1vbi5zYXZlXCIpICAvLyDihpIgXCJTYXZlXCJcbiAqL1xuU0QubG9jYWxlID0gKGxvY2FsZTogKHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXSkgPT4gPEsgZXh0ZW5kcyBEaWN0S2V5PihrZXk6IEspOiBTRFJldHVyblR5cGU8Sz4gPT4ge1xuICByZXR1cm4gZ2V0RGljdFZhbHVlKGtleSwgbG9jYWxlKTtcbn07XG5cbi8vIExvY2FsaXplZCDqsIDriqXtlZwgQ29sdW1uIO2DgOyehSDqs4TsgrBcbnR5cGUgTG9jYWxpemVkQmFzZUNvbHVtbjxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVCAmIHN0cmluZ106IEsgZXh0ZW5kcyBcXGBcXCR7aW5mZXIgQmFzZX1fXFwkeyh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl19XFxgID8gQmFzZSA6IEs7XG59W2tleW9mIFQgJiBzdHJpbmddO1xuXG4vKipcbiAqIGxvY2FsZeyXkCDrlLDrnbwg7KCB7KCI7ZWcIOy7rOufvCDqsJLsnYQg67CY7ZmY7ZWp64uI64ukLlxuICogRELsl5AgbmFtZSwgbmFtZV9rbywgbmFtZV9lbuyymOufvCBsb2NhbGl6ZWQgY29sdW1u7J20IOyeiOydhCDrlYwg7IKs7Jqp7ZWp64uI64ukLlxuICpcbiAqIOyasOyEoOyInOychCAo7KeA7JuQIOuhnOy8gOydvOydgCBrby9qcC9lbuydtOqzoCwg7ISc67mE7Iqk7J2YIOq4sOuzuCDroZzsvIDsnbzsnYAga28sIOyCrOyaqeyekOydmCDroZzsvIDsnbzsnYAganDsnbwg65WMKTogY29sdW1uX2pwIOKGkiBjb2x1bW4g4oaSIGNvbHVtbl9rbyDihpIgY29sdW1uX2VuXG4gKiDsmrDshKDsiJzsnIQgKOyngOybkCDroZzsvIDsnbzsnYAga28vanAvZW7snbTqs6AsIOyEnOu5hOyKpOydmCDquLDrs7gg66Gc7LyA7J287J2AIGVuLCDsgqzsmqnsnpDsnZgg66Gc7LyA7J287J2AIGtv7J28IOuVjCk6IGNvbHVtbl9rbyDihpIgY29sdW1uIOKGkiBjb2x1bW5fZW4g4oaSIGNvbHVtbl9qcFxuICpcbiAqIEBleGFtcGxlXG4gKiBsb2NhbGl6ZWRDb2x1bW4odGFnLCBcIm5hbWVcIilcbiAqL1xudHlwZSBMb2NhbGl6ZWRDb2x1bW5TY2FsYXJWYWx1ZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBiaWdpbnQ7XG50eXBlIExvY2FsaXplZENvbHVtblZhbHVlID0gc3RyaW5nIHwgc3RyaW5nW107XG50eXBlIE5lc3RlZExvY2FsaXplZENvbHVtblZhbHVlRnJvbTxWPiA9IFYgZXh0ZW5kcyBzdHJpbmdcbiAgPyBzdHJpbmdcbiAgOiBWIGV4dGVuZHMgcmVhZG9ubHkgc3RyaW5nW11cbiAgICA/IHN0cmluZ1tdXG4gICAgOiBuZXZlcjtcbnR5cGUgTG9jYWxpemVkQ29sdW1uVmFsdWVGcm9tPFY+ID0gViBleHRlbmRzIHN0cmluZ1xuICA/IHN0cmluZ1xuICA6IFYgZXh0ZW5kcyByZWFkb25seSBzdHJpbmdbXVxuICAgID8gc3RyaW5nW11cbiAgICA6IFYgZXh0ZW5kcyBudW1iZXIgfCBib29sZWFuIHwgYmlnaW50XG4gICAgICA/IHN0cmluZ1xuICAgICAgOiBWIGV4dGVuZHMgUGFydGlhbDxSZWNvcmQ8KHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXSwgaW5mZXIgTFY+PlxuICAgICAgICA/IE5lc3RlZExvY2FsaXplZENvbHVtblZhbHVlRnJvbTxMVj5cbiAgICAgIDogbmV2ZXI7XG50eXBlIExvY2FsaXplZENvbHVtbkNhbmRpZGF0ZTxULCBLIGV4dGVuZHMgc3RyaW5nPiA9XG4gIHwgKEsgZXh0ZW5kcyBrZXlvZiBUID8gVFtLXSA6IG5ldmVyKVxuICB8IHtcbiAgICAgIFtMIGluICh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl1dOiBcXGBcXCR7S31fXFwke0x9XFxgIGV4dGVuZHMga2V5b2YgVCA/IFRbXFxgXFwke0t9X1xcJHtMfVxcYF0gOiBuZXZlcjtcbiAgICB9Wyh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl1dO1xudHlwZSBMb2NhbGl6ZWRDb2x1bW5SZXR1cm48VCwgSyBleHRlbmRzIHN0cmluZz4gPVxuICB8IExvY2FsaXplZENvbHVtblZhbHVlRnJvbTxMb2NhbGl6ZWRDb2x1bW5DYW5kaWRhdGU8VCwgSz4+XG4gIHwgdW5kZWZpbmVkO1xudHlwZSBMb2NhbGVWYWx1ZU1hcCA9IFBhcnRpYWw8UmVjb3JkPCh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl0sIHVua25vd24+PjtcblxuZnVuY3Rpb24gaXNMb2NhbGl6ZWRDb2x1bW5WYWx1ZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIExvY2FsaXplZENvbHVtblZhbHVlIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUuZXZlcnkoKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSBcInN0cmluZ1wiKSk7XG59XG5cbmZ1bmN0aW9uIGlzTG9jYWxpemVkQ29sdW1uU2NhbGFyVmFsdWUodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBMb2NhbGl6ZWRDb2x1bW5TY2FsYXJWYWx1ZSB7XG4gIHJldHVybiBbXCJzdHJpbmdcIiwgXCJudW1iZXJcIiwgXCJib29sZWFuXCIsIFwiYmlnaW50XCJdLmluY2x1ZGVzKHR5cGVvZiB2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIGlzRW1wdHlMb2NhbGl6ZWRDb2x1bW5WYWx1ZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG51bGwgfCB1bmRlZmluZWQgfCBcIlwiIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IFwiXCI7XG59XG5cbmZ1bmN0aW9uIGdldE5lc3RlZExvY2FsZVZhbHVlPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgSyBleHRlbmRzIExvY2FsaXplZEJhc2VDb2x1bW48VD4+KFxuICByb3c6IFQsXG4gIGNvbHVtbjogSyxcbiAgbG9jYWxlOiAodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdLFxuKTogdW5rbm93biB7XG4gIGNvbnN0IGNvbHVtblZhbHVlID0gcm93W2NvbHVtbl07XG4gIGlmIChjb2x1bW5WYWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgY29sdW1uVmFsdWUgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShjb2x1bW5WYWx1ZSkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIChjb2x1bW5WYWx1ZSBhcyBMb2NhbGVWYWx1ZU1hcClbbG9jYWxlXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvY2FsaXplZENvbHVtbjxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIEsgZXh0ZW5kcyBMb2NhbGl6ZWRCYXNlQ29sdW1uPFQ+PihcbiAgcm93OiBULFxuICBjb2x1bW46IEssXG4pOiBMb2NhbGl6ZWRDb2x1bW5SZXR1cm48VCwgSz4ge1xuICBjb25zdCBjdXJyZW50TG9jYWxlID0gZ2V0Q3VycmVudExvY2FsZSgpO1xuICBjb25zdCBsb2NhbGUgPSBTVVBQT1JURURfTE9DQUxFUy5pbmNsdWRlcyhjdXJyZW50TG9jYWxlKSA/IGN1cnJlbnRMb2NhbGUgOiBERUZBVUxUX0xPQ0FMRTtcbiAgY29uc3Qgb3RoZXJMb2NhbGVzID0gU1VQUE9SVEVEX0xPQ0FMRVMuZmlsdGVyKChsOiBzdHJpbmcpID0+IGwgIT09IGxvY2FsZSAmJiBsICE9PSBERUZBVUxUX0xPQ0FMRSk7XG4gIGNvbnN0IGxvY2FsaXplZEtleSA9IChjb2x1bW46IEssIGxvY2FsZTogKHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXSkgPT4gXFxgXFwke2NvbHVtbn1fXFwke2xvY2FsZX1cXGA7XG4gIGNvbnN0IHZhbHVlcyA9IFtcbiAgICB7IHZhbHVlOiByb3dbbG9jYWxpemVkS2V5KGNvbHVtbiwgbG9jYWxlKV0sIHNvdXJjZTogXCJkaXJlY3RcIiB9LFxuICAgIHsgdmFsdWU6IGdldE5lc3RlZExvY2FsZVZhbHVlKHJvdywgY29sdW1uLCBsb2NhbGUpLCBzb3VyY2U6IFwibmVzdGVkXCIgfSxcbiAgICB7IHZhbHVlOiByb3dbY29sdW1uXSwgc291cmNlOiBcImRpcmVjdFwiIH0sXG4gICAgeyB2YWx1ZTogcm93W2xvY2FsaXplZEtleShjb2x1bW4sIERFRkFVTFRfTE9DQUxFKV0sIHNvdXJjZTogXCJkaXJlY3RcIiB9LFxuICAgIHsgdmFsdWU6IGdldE5lc3RlZExvY2FsZVZhbHVlKHJvdywgY29sdW1uLCBERUZBVUxUX0xPQ0FMRSksIHNvdXJjZTogXCJuZXN0ZWRcIiB9LFxuICAgIC4uLm90aGVyTG9jYWxlcy5mbGF0TWFwKChsKSA9PiBbXG4gICAgICB7IHZhbHVlOiByb3dbbG9jYWxpemVkS2V5KGNvbHVtbiwgbCldLCBzb3VyY2U6IFwiZGlyZWN0XCIgfSxcbiAgICAgIHsgdmFsdWU6IGdldE5lc3RlZExvY2FsZVZhbHVlKHJvdywgY29sdW1uLCBsKSwgc291cmNlOiBcIm5lc3RlZFwiIH0sXG4gICAgXSksXG4gIF07XG5cbiAgZm9yIChjb25zdCB7IHZhbHVlLCBzb3VyY2UgfSBvZiB2YWx1ZXMpIHtcbiAgICBpZiAoIWlzRW1wdHlMb2NhbGl6ZWRDb2x1bW5WYWx1ZSh2YWx1ZSkgJiYgaXNMb2NhbGl6ZWRDb2x1bW5WYWx1ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZSBhcyBMb2NhbGl6ZWRDb2x1bW5SZXR1cm48VCwgSz47XG4gICAgfVxuICAgIGlmIChzb3VyY2UgPT09IFwiZGlyZWN0XCIgJiYgIWlzRW1wdHlMb2NhbGl6ZWRDb2x1bW5WYWx1ZSh2YWx1ZSkgJiYgaXNMb2NhbGl6ZWRDb2x1bW5TY2FsYXJWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpIGFzIExvY2FsaXplZENvbHVtblJldHVybjxULCBLPjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEVudW3snZggbG9jYWxpemVkIGxhYmVsc+ulvCBQcm94eeuhnCDrsJjtmZjtlanri4jri6QuXG4gKiBTZWxlY3Qg7Lu07Y+s64SM7Yq4IOuTseyXkOyEnCBFbnVtTGFiZWxba2V5XSDrjIDsi6Ag7IKs7Jqp7ZWp64uI64ukLlxuICpcbiAqIEBleGFtcGxlXG4gKiBTRC5lbnVtTGFiZWxzKFwiVGFnT3JkZXJCeVwiKVtrZXldICAvLyDihpIg7ZiE7J6sIGxvY2FsZeydmCDrnbzrsqhcbiAqL1xuU0QuZW51bUxhYmVscyA9IChlbnVtTmFtZTogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgTG9jYWxpemVkU3RyaW5nPiA9PiB7XG4gIHJldHVybiBuZXcgUHJveHkoe30gYXMgUmVjb3JkPHN0cmluZywgTG9jYWxpemVkU3RyaW5nPiwge1xuICAgIGdldChfLCBrZXk6IHN0cmluZyB8IHN5bWJvbCkge1xuICAgICAgaWYgKHR5cGVvZiBrZXkgPT09IFwic3ltYm9sXCIpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGljdEtleSA9IFxcYGVudW0uXFwke2VudW1OYW1lfS5cXCR7a2V5fVxcYCBhcyBEaWN0S2V5O1xuICAgICAgcmV0dXJuIGdldERpY3RWYWx1ZShkaWN0S2V5LCBnZXRDdXJyZW50TG9jYWxlKCkpO1xuICAgIH1cbiAgfSk7XG59O1xuYC50cmltKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5nZXRUYXJnZXRBbmRQYXRoKHVuZGVmaW5lZCwgdGFyZ2V0KSxcbiAgICAgIGJvZHksXG4gICAgICBpbXBvcnRLZXlzOiBbXSxcbiAgICAgIGN1c3RvbUhlYWRlcnM6IFtcIi8qKlwiLCBcIiAqIEBnZW5lcmF0ZWRcIiwgXCIgKiDsp4HsoJEg7IiY7KCV7ZWY7KeAIOuniOyEuOyalC5cIiwgXCIgKi9cIiwgXCJcIl0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZWFjdC1jb21wb25lbnRz7J2YIHJjLWtleXPrpbwg7LaU7Lac7ZWpXG4gICAqIHNvbmFtdS9zcmMvZGljdC9yYy1rZXlzLnRzIO2MjOydvOydmCDshozsiqQg7L2U65Oc66W8IOyngeygkSDsnb3slrTshJwg67CY7ZmYXG4gICAqL1xuICBwcml2YXRlIGV4dHJhY3RSQ0tleXNTb3VyY2VDb2RlKCk6IHsga286IHN0cmluZzsgZW46IHN0cmluZyB9IHtcbiAgICB0cnkge1xuICAgICAgLy8gcmMta2V5cy50cyDtjIzsnbwg6rK966GcXG4gICAgICBjb25zdCBfX2ZpbGVuYW1lID0gZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpO1xuICAgICAgY29uc3QgX19kaXJuYW1lID0gcGF0aC5kaXJuYW1lKF9fZmlsZW5hbWUpO1xuXG4gICAgICAvLyBkaXN07JeQ7IScIOyLpO2WieuQoCDrlYzripQgc3Jj66GcIOqyveuhnCDrs4Dqsr1cbiAgICAgIGNvbnN0IGJhc2VQYXRoID0gX19kaXJuYW1lLmluY2x1ZGVzKFwiL2Rpc3QvXCIpXG4gICAgICAgID8gX19kaXJuYW1lLnJlcGxhY2UoXCIvZGlzdC9cIiwgXCIvc3JjL1wiKVxuICAgICAgICA6IF9fZGlybmFtZTtcblxuICAgICAgY29uc3QgcmNLZXlzUGF0aCA9IHBhdGguam9pbihiYXNlUGF0aCwgXCIuLi8uLi9kaWN0L3JjLWtleXMudHNcIik7XG5cbiAgICAgIC8vIO2MjOydvCDsnb3quLBcbiAgICAgIGNvbnN0IHNvdXJjZUNvZGUgPSBmcy5yZWFkRmlsZVN5bmMocmNLZXlzUGF0aCwgXCJ1dGYtOFwiKTtcblxuICAgICAgLy8gcmNLZXlzS28g7LaU7LacICjspJHqtITtmLgg7Lm07Jq07YyFIOuwqeyLnSlcbiAgICAgIGNvbnN0IGtvQ29kZSA9IGV4dHJhY3RPYmplY3REZWNsYXJhdGlvbihzb3VyY2VDb2RlLCBcInJjS2V5c0tvXCIpO1xuXG4gICAgICAvLyByY0tleXNFbiDstpTstpwgKOykkeq0hO2YuCDsubTsmrTtjIUg67Cp7IudKVxuICAgICAgY29uc3QgZW5Db2RlID0gZXh0cmFjdE9iamVjdERlY2xhcmF0aW9uKHNvdXJjZUNvZGUsIFwicmNLZXlzRW5cIik7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtvOiBrb0NvZGUucmVwbGFjZSgvXmV4cG9ydCAvLCBcIlwiKSxcbiAgICAgICAgZW46IGVuQ29kZS5yZXBsYWNlKC9eZXhwb3J0IC8sIFwiXCIpLnJlcGxhY2UoLyBzYXRpc2ZpZXMgUkNLZXlzLywgXCIgYXMgY29uc3RcIiksXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyByYy1rZXlzIO2MjOydvOydtCDsl4bripQg6rK97JqwIOu5iCDsvZTrk5wg67CY7ZmYXG4gICAgICBjb25zb2xlLndhcm4oXCJGYWlsZWQgdG8gbG9hZCByYy1rZXlzIHNvdXJjZTpcIiwgZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAga286IFwiY29uc3QgcmNLZXlzS28gPSB7fSBhcyBjb25zdDtcIixcbiAgICAgICAgZW46IFwiY29uc3QgcmNLZXlzRW4gPSB7fSBhcyBjb25zdDtcIixcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOuqqOuToCBlbnRpdHkuanNvbuyXkOyEnCBlbnRpdHkgbGFiZWxzIOy2lOy2nFxuICAgKiBlbnRpdHkuanNvbuyXkOyEnCDsp4HsoJEg6rSA66as65CY64qUIOqwkuunjCDtj6ztlaggKOyekOuPmSDsg53shLEg6rCSIOygnOyZuClcbiAgICogLSBlbnRpdHkue2VudGl0eUlkfTogZW50aXR5IHRpdGxlXG4gICAqIC0gZW50aXR5LntlbnRpdHlJZH0ue3Byb3BOYW1lfTogcHJvcCBkZXNjXG4gICAqIC0gZW51bS57RW51bUlkfS57dmFsdWV9OiBlbnVtIGxhYmVsXG4gICAqL1xuICBwcml2YXRlIGV4dHJhY3RFbnRpdHlMYWJlbHMoKTogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10ge1xuICAgIGNvbnN0IGxhYmVsczogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10gPSBbXTtcblxuICAgIGlmICghRW50aXR5TWFuYWdlci5pc0F1dG9sb2FkZWQpIHtcbiAgICAgIHJldHVybiBsYWJlbHM7XG4gICAgfVxuXG4gICAgY29uc3QgZW50aXR5SWRzID0gRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKTtcblxuICAgIGZvciAoY29uc3QgZW50aXR5SWQgb2YgZW50aXR5SWRzKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG5cbiAgICAgIC8vIGVudGl0eSB0aXRsZSAoZW50aXR5Lmpzb27sl5DshJwg6rSA66asKVxuICAgICAgbGFiZWxzLnB1c2goeyBrZXk6IGBlbnRpdHkuJHtlbnRpdHlJZH1gLCB2YWx1ZTogZW50aXR5LnRpdGxlIH0pO1xuXG4gICAgICAvLyBwcm9wIGxhYmVscyAoZW50aXR5Lmpzb27sl5DshJwg6rSA66asKVxuICAgICAgZm9yIChjb25zdCBwcm9wIG9mIGVudGl0eS5wcm9wcykge1xuICAgICAgICBpZiAocHJvcC5kZXNjKSB7XG4gICAgICAgICAgbGFiZWxzLnB1c2goeyBrZXk6IGBlbnRpdHkuJHtlbnRpdHlJZH0uJHtwcm9wLm5hbWV9YCwgdmFsdWU6IHByb3AuZGVzYyB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBlbnVtIGxhYmVscyAoZW50aXR5Lmpzb27sl5DshJwg6rSA66asKVxuICAgICAgZm9yIChjb25zdCBbZW51bUlkLCBlbnVtTGFiZWxzTWFwXSBvZiBPYmplY3QuZW50cmllcyhlbnRpdHkuZW51bUxhYmVscykpIHtcbiAgICAgICAgZm9yIChjb25zdCBbdmFsdWUsIGxhYmVsXSBvZiBPYmplY3QuZW50cmllcyhlbnVtTGFiZWxzTWFwKSkge1xuICAgICAgICAgIGxhYmVscy5wdXNoKHsga2V5OiBgZW51bS4ke2VudW1JZH0uJHt2YWx1ZX1gLCB2YWx1ZTogbGFiZWwgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbGFiZWxzO1xuICB9XG5cbiAgLyoqXG4gICAqIGVudGl0eUxhYmVsc+ulvCBUeXBlU2NyaXB0IOy9lOuTnOuhnCDrs4DtmZhcbiAgICovXG4gIHByaXZhdGUgZ2VuZXJhdGVFbnRpdHlMYWJlbHNDb2RlKGxhYmVsczogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10pOiBzdHJpbmcge1xuICAgIGlmIChsYWJlbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gXCJjb25zdCBlbnRpdHlMYWJlbHMgPSB7fSBhcyBjb25zdDtcIjtcbiAgICB9XG5cbiAgICBjb25zdCBlbnRyaWVzID0gbGFiZWxzLm1hcCgoeyBrZXksIHZhbHVlIH0pID0+IGAgIFwiJHtrZXl9XCI6IFwiJHt0aGlzLmVzY2FwZVN0cmluZyh2YWx1ZSl9XCIsYCk7XG5cbiAgICByZXR1cm4gYGNvbnN0IGVudGl0eUxhYmVscyA9IHtcbiR7ZW50cmllcy5qb2luKFwiXFxuXCIpfVxufSBhcyBjb25zdDtgO1xuICB9XG5cbiAgcHJpdmF0ZSBlc2NhcGVTdHJpbmcoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvXFxcXC9nLCBcIlxcXFxcXFxcXCIpLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKS5yZXBsYWNlKC9cXG4vZywgXCJcXFxcblwiKTtcbiAgfVxufVxuIl0sIm1h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
|
|
@@ -7,7 +7,6 @@ import { Template, init_template } from "../template.js";
|
|
|
7
7
|
import { BUILT_IN_TYPES, init_zod_converter, zodTypeToTsTypeDef } from "../zod-converter.js";
|
|
8
8
|
import inflection from "inflection";
|
|
9
9
|
import { diff, unique } from "radashi";
|
|
10
|
-
|
|
11
10
|
//#region src/template/implementations/services.template.ts
|
|
12
11
|
init_code_converters();
|
|
13
12
|
init_sonamu();
|
|
@@ -28,12 +27,10 @@ var Template__services = class extends Template {
|
|
|
28
27
|
}
|
|
29
28
|
render({}) {
|
|
30
29
|
const { apis } = Sonamu.syncer;
|
|
31
|
-
const apisByModel = new Map();
|
|
30
|
+
const apisByModel = /* @__PURE__ */ new Map();
|
|
32
31
|
for (const api of apis) {
|
|
33
32
|
const modelName = api.modelName.replace(/Model$/, "").replace(/Frame$/, "");
|
|
34
|
-
if (!apisByModel.has(modelName))
|
|
35
|
-
apisByModel.set(modelName, []);
|
|
36
|
-
}
|
|
33
|
+
if (!apisByModel.has(modelName)) apisByModel.set(modelName, []);
|
|
37
34
|
apisByModel.get(modelName)?.push(api);
|
|
38
35
|
}
|
|
39
36
|
const importKeys = [];
|
|
@@ -44,9 +41,7 @@ var Template__services = class extends Template {
|
|
|
44
41
|
const candidateImportKeys = [];
|
|
45
42
|
const candidateTypeDef = apiParamTypeToTsType(typeRef, candidateImportKeys);
|
|
46
43
|
try {
|
|
47
|
-
for (const key of unique(candidateImportKeys))
|
|
48
|
-
EntityManager.getModulePath(key);
|
|
49
|
-
}
|
|
44
|
+
for (const key of unique(candidateImportKeys)) EntityManager.getModulePath(key);
|
|
50
45
|
importKeys.push(...candidateImportKeys);
|
|
51
46
|
return candidateTypeDef;
|
|
52
47
|
} catch {}
|
|
@@ -57,38 +52,38 @@ var Template__services = class extends Template {
|
|
|
57
52
|
const functions = [];
|
|
58
53
|
for (const api of modelApis) {
|
|
59
54
|
if (api.streamOptions) {
|
|
60
|
-
const paramsWithoutContext
|
|
61
|
-
const apiBaseUrl
|
|
55
|
+
const paramsWithoutContext = api.parameters.filter((param) => !ApiParamType.isContext(param.type) && !ApiParamType.isRefKnex(param.type) && !(param.optional && param.name.startsWith("_")));
|
|
56
|
+
const apiBaseUrl = `${Sonamu.config.api.route.prefix}${api.path}`;
|
|
62
57
|
const methodNameStream = api.options.resourceName ? `use${inflection.camelize(api.options.resourceName)}` : `use${inflection.camelize(api.methodName)}`;
|
|
63
58
|
const methodNameStreamCamelized = inflection.camelize(methodNameStream, true);
|
|
64
59
|
const eventsTypeDef = zodTypeToTsTypeDef(api.streamOptions.events);
|
|
65
|
-
const paramsDefAsObject = paramsWithoutContext
|
|
60
|
+
const paramsDefAsObject = paramsWithoutContext.length > 0 ? `{ ${paramsWithoutContext.map((p) => `${p.name}: ${apiParamTypeToTsType(p.type, importKeys)}`).join(", ")} }` : "{}";
|
|
66
61
|
functions.push(`
|
|
67
62
|
export function ${methodNameStreamCamelized}(
|
|
68
63
|
params: ${paramsDefAsObject},
|
|
69
64
|
handlers: EventHandlers<${eventsTypeDef} & { end?: () => void }>,
|
|
70
65
|
options: SSEStreamOptions
|
|
71
66
|
) {
|
|
72
|
-
return useSSEStream<${eventsTypeDef}>(\`${apiBaseUrl
|
|
67
|
+
return useSSEStream<${eventsTypeDef}>(\`${apiBaseUrl}\`, params, handlers, options);
|
|
73
68
|
}
|
|
74
69
|
`.trim());
|
|
75
70
|
continue;
|
|
76
71
|
}
|
|
77
72
|
if (api.websocketOptions) {
|
|
78
|
-
const paramsWithoutContext
|
|
79
|
-
const apiBaseUrl
|
|
73
|
+
const paramsWithoutContext = api.parameters.filter((param) => !ApiParamType.isContext(param.type) && !ApiParamType.isRefKnex(param.type) && !(param.optional && param.name.startsWith("_")));
|
|
74
|
+
const apiBaseUrl = `${Sonamu.config.api.route.prefix}${api.path}`;
|
|
80
75
|
const methodNameWebSocket = api.options.resourceName ? `use${inflection.camelize(api.options.resourceName)}` : `use${inflection.camelize(api.methodName)}`;
|
|
81
76
|
const methodNameWebSocketCamelized = inflection.camelize(methodNameWebSocket, true);
|
|
82
77
|
const outEventsTypeDef = resolveWebSocketEventTypeDef(api.websocketOptions.outEventsTypeRef, api.websocketOptions.outEvents);
|
|
83
78
|
const inEventsTypeDef = resolveWebSocketEventTypeDef(api.websocketOptions.inEventsTypeRef, api.websocketOptions.inEvents);
|
|
84
|
-
const paramsDefAsObject = paramsWithoutContext
|
|
79
|
+
const paramsDefAsObject = paramsWithoutContext.length > 0 ? `{ ${paramsWithoutContext.map((p) => `${p.name}: ${apiParamTypeToTsType(p.type, importKeys)}`).join(", ")} }` : "{}";
|
|
85
80
|
functions.push(`
|
|
86
81
|
export function ${methodNameWebSocketCamelized}(
|
|
87
82
|
params: ${paramsDefAsObject},
|
|
88
83
|
handlers: EventHandlers<${outEventsTypeDef}>,
|
|
89
84
|
options: WebSocketChannelOptions = {}
|
|
90
85
|
) {
|
|
91
|
-
return useWebSocketChannel<${outEventsTypeDef}, ${inEventsTypeDef}>(\`${apiBaseUrl
|
|
86
|
+
return useWebSocketChannel<${outEventsTypeDef}, ${inEventsTypeDef}>(\`${apiBaseUrl}\`, params, handlers, options);
|
|
92
87
|
}
|
|
93
88
|
`.trim());
|
|
94
89
|
continue;
|
|
@@ -106,16 +101,12 @@ export function ${methodNameWebSocketCamelized}(
|
|
|
106
101
|
if (clients.includes("axios-multipart")) {
|
|
107
102
|
const formDataAppend = `files.forEach(f => { formData.append("files", f); });`;
|
|
108
103
|
const otherParamsAppend = paramsWithoutContext.map((param) => {
|
|
109
|
-
|
|
104
|
+
if (typeof param.type === "string" && [
|
|
110
105
|
"string",
|
|
111
106
|
"number",
|
|
112
107
|
"boolean"
|
|
113
|
-
].includes(param.type)
|
|
114
|
-
|
|
115
|
-
return `formData.append('${param.name}', String(${param.name}));`;
|
|
116
|
-
} else {
|
|
117
|
-
return `toFormData(${param.name}, formData, '${param.name}');`;
|
|
118
|
-
}
|
|
108
|
+
].includes(param.type)) return `formData.append('${param.name}', String(${param.name}));`;
|
|
109
|
+
else return `toFormData(${param.name}, formData, '${param.name}');`;
|
|
119
110
|
}).join("\n ");
|
|
120
111
|
const paramsDefComma = paramsDef !== "" ? ", " : "";
|
|
121
112
|
functions.push(`
|
|
@@ -176,8 +167,7 @@ export const use${inflection.camelize(hookName)} = ${typeParamsDef}(${paramsDef}
|
|
|
176
167
|
}));
|
|
177
168
|
`.trim());
|
|
178
169
|
const resourceName = api.options.resourceName;
|
|
179
|
-
|
|
180
|
-
if (isInfiniteTarget) {
|
|
170
|
+
if (!!resourceName && inflection.pluralize(resourceName) === resourceName && api.methodName === "findMany") {
|
|
181
171
|
const infiniteMethodName = `${methodName}Infinite`;
|
|
182
172
|
const infiniteHookName = `use${inflection.camelize(hookName)}Infinite`;
|
|
183
173
|
functions.push(`
|
|
@@ -244,9 +234,7 @@ ${functions.join("\n\n")}
|
|
|
244
234
|
for (const entityId of entityIds) {
|
|
245
235
|
const names = EntityManager.getNamesFromId(entityId);
|
|
246
236
|
const listApi = apisByModel.get(names.capital)?.find((api) => {
|
|
247
|
-
if (!api.options.resourceName || !api.options.clients?.includes("tanstack-query"))
|
|
248
|
-
return false;
|
|
249
|
-
}
|
|
237
|
+
if (!api.options.resourceName || !api.options.clients?.includes("tanstack-query")) return false;
|
|
250
238
|
const resourceName = api.options.resourceName;
|
|
251
239
|
return inflection.pluralize(resourceName) === resourceName && api.methodName === "findMany";
|
|
252
240
|
});
|
|
@@ -309,7 +297,7 @@ export const ${names.capital}AsyncIdConfig: AsyncIdConfig<${names.capital}Subset
|
|
|
309
297
|
};
|
|
310
298
|
}
|
|
311
299
|
};
|
|
312
|
-
|
|
313
300
|
//#endregion
|
|
314
301
|
export { Template__services };
|
|
315
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZXMudGVtcGxhdGUuanMiLCJuYW1lcyI6WyJpbXBvcnRLZXlzOiBzdHJpbmdbXSIsIm5hbWVzcGFjZXM6IHN0cmluZ1tdIiwidHlwZVBhcmFtTmFtZXM6IHN0cmluZ1tdIiwiY2FuZGlkYXRlSW1wb3J0S2V5czogc3RyaW5nW10iLCJmdW5jdGlvbnM6IHN0cmluZ1tdIiwicGFyYW1zV2l0aG91dENvbnRleHQiLCJhcGlCYXNlVXJsIiwiYXN5bmNJZENvbmZpZ3M6IHN0cmluZ1tdIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3RlbXBsYXRlL2ltcGxlbWVudGF0aW9ucy9zZXJ2aWNlcy50ZW1wbGF0ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHsgZGlmZiwgdW5pcXVlIH0gZnJvbSBcInJhZGFzaGlcIjtcblxuaW1wb3J0IHtcbiAgYXBpUGFyYW1Ub1RzQ29kZSxcbiAgYXBpUGFyYW1UeXBlVG9Uc1R5cGUsXG4gIHVud3JhcFByb21pc2VPbmNlLFxufSBmcm9tIFwiLi4vLi4vYXBpL2NvZGUtY29udmVydGVyc1wiO1xuaW1wb3J0IHsgdHlwZSBFeHRlbmRlZEFwaSB9IGZyb20gXCIuLi8uLi9hcGkvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uLy4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyB0eXBlIFRlbXBsYXRlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgQXBpUGFyYW1UeXBlIH0gZnJvbSBcIi4uLy4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBhc3NlcnREZWZpbmVkIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gXCIuLi90ZW1wbGF0ZVwiO1xuaW1wb3J0IHsgQlVJTFRfSU5fVFlQRVMsIHpvZFR5cGVUb1RzVHlwZURlZiB9IGZyb20gXCIuLi96b2QtY29udmVydGVyXCI7XG5cbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZV9fc2VydmljZXMgZXh0ZW5kcyBUZW1wbGF0ZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwic2VydmljZXNcIik7XG4gIH1cblxuICBnZXRUYXJnZXRBbmRQYXRoKCkge1xuICAgIHJldHVybiB7XG4gICAgICB0YXJnZXQ6IFwiOnRhcmdldC9zcmMvc2VydmljZXNcIixcbiAgICAgIHBhdGg6IGBzZXJ2aWNlcy5nZW5lcmF0ZWQudHNgLFxuICAgIH07XG4gIH1cblxuICByZW5kZXIoe306IFRlbXBsYXRlT3B0aW9uc1tcInNlcnZpY2VzXCJdKSB7XG4gICAgY29uc3QgeyBhcGlzIH0gPSBTb25hbXUuc3luY2VyO1xuXG4gICAgLy8g66qo642467OE66GcIOq3uOujue2ZlFxuICAgIGNvbnN0IGFwaXNCeU1vZGVsID0gbmV3IE1hcDxzdHJpbmcsIEV4dGVuZGVkQXBpW10+KCk7XG4gICAgZm9yIChjb25zdCBhcGkgb2YgYXBpcykge1xuICAgICAgY29uc3QgbW9kZWxOYW1lID0gYXBpLm1vZGVsTmFtZS5yZXBsYWNlKC9Nb2RlbCQvLCBcIlwiKS5yZXBsYWNlKC9GcmFtZSQvLCBcIlwiKTtcbiAgICAgIGlmICghYXBpc0J5TW9kZWwuaGFzKG1vZGVsTmFtZSkpIHtcbiAgICAgICAgYXBpc0J5TW9kZWwuc2V0KG1vZGVsTmFtZSwgW10pO1xuICAgICAgfVxuICAgICAgYXBpc0J5TW9kZWwuZ2V0KG1vZGVsTmFtZSk/LnB1c2goYXBpKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbXBvcnRLZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IG5hbWVzcGFjZXM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHR5cGVQYXJhbU5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHJlc29sdmVXZWJTb2NrZXRFdmVudFR5cGVEZWYgPSAoXG4gICAgICB0eXBlUmVmOiBBcGlQYXJhbVR5cGUuUmVmIHwgdW5kZWZpbmVkLFxuICAgICAgc2NoZW1hOiBQYXJhbWV0ZXJzPHR5cGVvZiB6b2RUeXBlVG9Uc1R5cGVEZWY+WzBdLFxuICAgICk6IHN0cmluZyA9PiB7XG4gICAgICBpZiAodHlwZVJlZikge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGVJbXBvcnRLZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBjb25zdCBjYW5kaWRhdGVUeXBlRGVmID0gYXBpUGFyYW1UeXBlVG9Uc1R5cGUodHlwZVJlZiwgY2FuZGlkYXRlSW1wb3J0S2V5cyk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB1bmlxdWUoY2FuZGlkYXRlSW1wb3J0S2V5cykpIHtcbiAgICAgICAgICAgIEVudGl0eU1hbmFnZXIuZ2V0TW9kdWxlUGF0aChrZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpbXBvcnRLZXlzLnB1c2goLi4uY2FuZGlkYXRlSW1wb3J0S2V5cyk7XG4gICAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZVR5cGVEZWY7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIOuhnOy7rCBjb25zdCDrk7EgaW1wb3J0IOqwgOuKpe2VnCDsi6zrs7zsnbQg7JWE64uI66m0IOq4sOyhtCBpbmxpbmUg7IOd7ISx7Jy866GcIO2bhO2HtFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB6b2RUeXBlVG9Uc1R5cGVEZWYoc2NoZW1hKTtcbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBbbW9kZWxOYW1lLCBtb2RlbEFwaXNdIG9mIGFwaXNCeU1vZGVsKSB7XG4gICAgICBjb25zdCBmdW5jdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgIGZvciAoY29uc3QgYXBpIG9mIG1vZGVsQXBpcykge1xuICAgICAgICAvLyBAc3RyZWFtIOuNsOy9lOugiOydtO2EsOqwgCDsnojsnLzrqbQgU1NFIOyKpO2KuOumvCDtlajsiJgg7IOd7ISxXG4gICAgICAgIGlmIChhcGkuc3RyZWFtT3B0aW9ucykge1xuICAgICAgICAgIGNvbnN0IHBhcmFtc1dpdGhvdXRDb250ZXh0ID0gYXBpLnBhcmFtZXRlcnMuZmlsdGVyKFxuICAgICAgICAgICAgKHBhcmFtKSA9PlxuICAgICAgICAgICAgICAhQXBpUGFyYW1UeXBlLmlzQ29udGV4dChwYXJhbS50eXBlKSAmJlxuICAgICAgICAgICAgICAhQXBpUGFyYW1UeXBlLmlzUmVmS25leChwYXJhbS50eXBlKSAmJlxuICAgICAgICAgICAgICAhKHBhcmFtLm9wdGlvbmFsICYmIHBhcmFtLm5hbWUuc3RhcnRzV2l0aChcIl9cIikpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb25zdCBhcGlCYXNlVXJsID0gYCR7U29uYW11LmNvbmZpZy5hcGkucm91dGUucHJlZml4fSR7YXBpLnBhdGh9YDtcblxuICAgICAgICAgIGNvbnN0IG1ldGhvZE5hbWVTdHJlYW0gPSBhcGkub3B0aW9ucy5yZXNvdXJjZU5hbWVcbiAgICAgICAgICAgID8gYHVzZSR7aW5mbGVjdGlvbi5jYW1lbGl6ZShhcGkub3B0aW9ucy5yZXNvdXJjZU5hbWUpfWBcbiAgICAgICAgICAgIDogYHVzZSR7aW5mbGVjdGlvbi5jYW1lbGl6ZShhcGkubWV0aG9kTmFtZSl9YDtcbiAgICAgICAgICBjb25zdCBtZXRob2ROYW1lU3RyZWFtQ2FtZWxpemVkID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShtZXRob2ROYW1lU3RyZWFtLCB0cnVlKTtcblxuICAgICAgICAgIGNvbnN0IGV2ZW50c1R5cGVEZWYgPSB6b2RUeXBlVG9Uc1R5cGVEZWYoYXBpLnN0cmVhbU9wdGlvbnMuZXZlbnRzKTtcblxuICAgICAgICAgIC8vIO2MjOudvOuvuO2EsOulvCDqsJ3ssrQg7ZiV7YOc66GcIOygleydmCAo7YOA7J6F6rO8IOyLpOygnCDqsJIg66qo65GQ7JeQIOyCrOyaqSlcbiAgICAgICAgICBjb25zdCBwYXJhbXNEZWZBc09iamVjdCA9XG4gICAgICAgICAgICBwYXJhbXNXaXRob3V0Q29udGV4dC5sZW5ndGggPiAwXG4gICAgICAgICAgICAgID8gYHsgJHtwYXJhbXNXaXRob3V0Q29udGV4dC5tYXAoKHApID0+IGAke3AubmFtZX06ICR7YXBpUGFyYW1UeXBlVG9Uc1R5cGUocC50eXBlLCBpbXBvcnRLZXlzKX1gKS5qb2luKFwiLCBcIil9IH1gXG4gICAgICAgICAgICAgIDogXCJ7fVwiO1xuXG4gICAgICAgICAgZnVuY3Rpb25zLnB1c2goXG4gICAgICAgICAgICBgXG5leHBvcnQgZnVuY3Rpb24gJHttZXRob2ROYW1lU3RyZWFtQ2FtZWxpemVkfShcbiAgcGFyYW1zOiAke3BhcmFtc0RlZkFzT2JqZWN0fSxcbiAgaGFuZGxlcnM6IEV2ZW50SGFuZGxlcnM8JHtldmVudHNUeXBlRGVmfSAmIHsgZW5kPzogKCkgPT4gdm9pZCB9PixcbiAgb3B0aW9uczogU1NFU3RyZWFtT3B0aW9uc1xuKSB7XG4gIHJldHVybiB1c2VTU0VTdHJlYW08JHtldmVudHNUeXBlRGVmfT4oXFxgJHthcGlCYXNlVXJsfVxcYCwgcGFyYW1zLCBoYW5kbGVycywgb3B0aW9ucyk7XG59XG4gICAgICAgICAgICBgLnRyaW0oKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFwaS53ZWJzb2NrZXRPcHRpb25zKSB7XG4gICAgICAgICAgLy8gd2Vic29ja2V0IHN1cmZhY2XripQgZmV0Y2gg7ZWo7IiYIOuMgOyLoCB0eXBlZCBob29r7J2EIOyDneyEse2VqFxuICAgICAgICAgIGNvbnN0IHBhcmFtc1dpdGhvdXRDb250ZXh0ID0gYXBpLnBhcmFtZXRlcnMuZmlsdGVyKFxuICAgICAgICAgICAgKHBhcmFtKSA9PlxuICAgICAgICAgICAgICAhQXBpUGFyYW1UeXBlLmlzQ29udGV4dChwYXJhbS50eXBlKSAmJlxuICAgICAgICAgICAgICAhQXBpUGFyYW1UeXBlLmlzUmVmS25leChwYXJhbS50eXBlKSAmJlxuICAgICAgICAgICAgICAhKHBhcmFtLm9wdGlvbmFsICYmIHBhcmFtLm5hbWUuc3RhcnRzV2l0aChcIl9cIikpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb25zdCBhcGlCYXNlVXJsID0gYCR7U29uYW11LmNvbmZpZy5hcGkucm91dGUucHJlZml4fSR7YXBpLnBhdGh9YDtcblxuICAgICAgICAgIGNvbnN0IG1ldGhvZE5hbWVXZWJTb2NrZXQgPSBhcGkub3B0aW9ucy5yZXNvdXJjZU5hbWVcbiAgICAgICAgICAgID8gYHVzZSR7aW5mbGVjdGlvbi5jYW1lbGl6ZShhcGkub3B0aW9ucy5yZXNvdXJjZU5hbWUpfWBcbiAgICAgICAgICAgIDogYHVzZSR7aW5mbGVjdGlvbi5jYW1lbGl6ZShhcGkubWV0aG9kTmFtZSl9YDtcbiAgICAgICAgICBjb25zdCBtZXRob2ROYW1lV2ViU29ja2V0Q2FtZWxpemVkID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShtZXRob2ROYW1lV2ViU29ja2V0LCB0cnVlKTtcblxuICAgICAgICAgIC8vIG91dEV2ZW50c+uKlCDsiJjsi6Ag7YOA7J6FLCBpbkV2ZW50c+uKlCBzZW5kKCkg7J6F66ClIO2DgOyeheycvOuhnCDsgqzsmqntlahcbiAgICAgICAgICBjb25zdCBvdXRFdmVudHNUeXBlRGVmID0gcmVzb2x2ZVdlYlNvY2tldEV2ZW50VHlwZURlZihcbiAgICAgICAgICAgIGFwaS53ZWJzb2NrZXRPcHRpb25zLm91dEV2ZW50c1R5cGVSZWYsXG4gICAgICAgICAgICBhcGkud2Vic29ja2V0T3B0aW9ucy5vdXRFdmVudHMsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBpbkV2ZW50c1R5cGVEZWYgPSByZXNvbHZlV2ViU29ja2V0RXZlbnRUeXBlRGVmKFxuICAgICAgICAgICAgYXBpLndlYnNvY2tldE9wdGlvbnMuaW5FdmVudHNUeXBlUmVmLFxuICAgICAgICAgICAgYXBpLndlYnNvY2tldE9wdGlvbnMuaW5FdmVudHMsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIGNvbnRleHQvcmVmS25leC9pbnRlcm5hbCBvcHRpb25hbCDtjIzrnbzrr7jthLDripQg7YG065287J207Ja47Yq4IOyeheugpeyXkOyEnCDsoJzsmbjtlahcbiAgICAgICAgICBjb25zdCBwYXJhbXNEZWZBc09iamVjdCA9XG4gICAgICAgICAgICBwYXJhbXNXaXRob3V0Q29udGV4dC5sZW5ndGggPiAwXG4gICAgICAgICAgICAgID8gYHsgJHtwYXJhbXNXaXRob3V0Q29udGV4dC5tYXAoKHApID0+IGAke3AubmFtZX06ICR7YXBpUGFyYW1UeXBlVG9Uc1R5cGUocC50eXBlLCBpbXBvcnRLZXlzKX1gKS5qb2luKFwiLCBcIil9IH1gXG4gICAgICAgICAgICAgIDogXCJ7fVwiO1xuXG4gICAgICAgICAgZnVuY3Rpb25zLnB1c2goXG4gICAgICAgICAgICBgXG5leHBvcnQgZnVuY3Rpb24gJHttZXRob2ROYW1lV2ViU29ja2V0Q2FtZWxpemVkfShcbiAgcGFyYW1zOiAke3BhcmFtc0RlZkFzT2JqZWN0fSxcbiAgaGFuZGxlcnM6IEV2ZW50SGFuZGxlcnM8JHtvdXRFdmVudHNUeXBlRGVmfT4sXG4gIG9wdGlvbnM6IFdlYlNvY2tldENoYW5uZWxPcHRpb25zID0ge31cbikge1xuICByZXR1cm4gdXNlV2ViU29ja2V0Q2hhbm5lbDwke291dEV2ZW50c1R5cGVEZWZ9LCAke2luRXZlbnRzVHlwZURlZn0+KFxcYCR7YXBpQmFzZVVybH1cXGAsIHBhcmFtcywgaGFuZGxlcnMsIG9wdGlvbnMpO1xufVxuICAgICAgICAgICAgYC50cmltKCksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnRleHQg7KCc7Jm47ZWcIO2MjOudvOuvuO2EsFxuICAgICAgICBjb25zdCBwYXJhbXNXaXRob3V0Q29udGV4dCA9IGFwaS5wYXJhbWV0ZXJzLmZpbHRlcihcbiAgICAgICAgICAocGFyYW0pID0+XG4gICAgICAgICAgICAhQXBpUGFyYW1UeXBlLmlzQ29udGV4dChwYXJhbS50eXBlKSAmJlxuICAgICAgICAgICAgIUFwaVBhcmFtVHlwZS5pc1JlZktuZXgocGFyYW0udHlwZSkgJiZcbiAgICAgICAgICAgICEocGFyYW0ub3B0aW9uYWwgJiYgcGFyYW0ubmFtZS5zdGFydHNXaXRoKFwiX1wiKSksXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8g7YOA7J6FIO2MjOudvOuvuO2EsCDsoJXsnZhcbiAgICAgICAgY29uc3QgdHlwZVBhcmFtZXRlcnNBc1RzVHlwZSA9IGFwaS50eXBlUGFyYW1ldGVyc1xuICAgICAgICAgIC5tYXAoKHR5cGVQYXJhbSkgPT4gYXBpUGFyYW1UeXBlVG9Uc1R5cGUodHlwZVBhcmFtLCBpbXBvcnRLZXlzKSlcbiAgICAgICAgICAuam9pbihcIiwgXCIpO1xuICAgICAgICBjb25zdCB0eXBlUGFyYW1zRGVmID0gdHlwZVBhcmFtZXRlcnNBc1RzVHlwZSA/IGA8JHt0eXBlUGFyYW1ldGVyc0FzVHNUeXBlfT5gIDogXCJcIjtcbiAgICAgICAgdHlwZVBhcmFtTmFtZXMgPSB0eXBlUGFyYW1OYW1lcy5jb25jYXQoYXBpLnR5cGVQYXJhbWV0ZXJzLm1hcCgodHApID0+IHRwLmlkKSk7XG5cbiAgICAgICAgLy8g7YyM652866+47YSwIOygleydmFxuICAgICAgICBjb25zdCBwYXJhbXNEZWYgPSBhcGlQYXJhbVRvVHNDb2RlKHBhcmFtc1dpdGhvdXRDb250ZXh0LCBpbXBvcnRLZXlzKTtcbiAgICAgICAgY29uc3QgcGFyYW1OYW1lcyA9IHBhcmFtc1dpdGhvdXRDb250ZXh0Lm1hcCgocCkgPT4gcC5uYW1lKS5qb2luKFwiLCBcIik7XG5cbiAgICAgICAgLy8g66as7YS0IO2DgOyehSDsoJXsnZhcbiAgICAgICAgY29uc3QgcmV0dXJuVHlwZURlZiA9IGFwaVBhcmFtVHlwZVRvVHNUeXBlKFxuICAgICAgICAgIGFzc2VydERlZmluZWQodW53cmFwUHJvbWlzZU9uY2UoYXBpLnJldHVyblR5cGUpKSxcbiAgICAgICAgICBpbXBvcnRLZXlzLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIOq4sOuzuCBVUkxcbiAgICAgICAgY29uc3QgYXBpQmFzZVVybCA9IGAke1NvbmFtdS5jb25maWcuYXBpLnJvdXRlLnByZWZpeH0ke2FwaS5wYXRofWA7XG5cbiAgICAgICAgY29uc3QgY2xpZW50cyA9IGFwaS5vcHRpb25zLmNsaWVudHMgfHwgW107XG5cbiAgICAgICAgLy8gMS4gYXhpb3Mg7ZWo7IiYIOyDneyEsVxuICAgICAgICAvLyByZXNvdXJjZU5hbWXsnbQg7J6I7Jy866m0IGdldCArIHJlc291cmNlTmFtZSDtmJXtg5zroZwg7ZWo7IiY66qFIOyDneyEsVxuICAgICAgICBjb25zdCBtZXRob2ROYW1lID0gYXBpLm9wdGlvbnMucmVzb3VyY2VOYW1lXG4gICAgICAgICAgPyBgZ2V0JHtpbmZsZWN0aW9uLmNhbWVsaXplKGFwaS5vcHRpb25zLnJlc291cmNlTmFtZSl9YFxuICAgICAgICAgIDogYXBpLm1ldGhvZE5hbWU7XG5cbiAgICAgICAgLy8gYXhpb3MtbXVsdGlwYXJ0IOyymOumrCAo7YyM7J28IOyXheuhnOuTnClcbiAgICAgICAgaWYgKGNsaWVudHMuaW5jbHVkZXMoXCJheGlvcy1tdWx0aXBhcnRcIikpIHtcbiAgICAgICAgICBjb25zdCBmb3JtRGF0YUFwcGVuZCA9IGBmaWxlcy5mb3JFYWNoKGYgPT4geyBmb3JtRGF0YS5hcHBlbmQoXCJmaWxlc1wiLCBmKTsgfSk7YDtcblxuICAgICAgICAgIGNvbnN0IG90aGVyUGFyYW1zQXBwZW5kID0gcGFyYW1zV2l0aG91dENvbnRleHRcbiAgICAgICAgICAgIC5tYXAoKHBhcmFtKSA9PiB7XG4gICAgICAgICAgICAgIC8vIHByaW1pdGl2ZSDtg4DsnoXsnbjsp4Ag7LK07YGsXG4gICAgICAgICAgICAgIGNvbnN0IGlzUHJpbWl0aXZlID1cbiAgICAgICAgICAgICAgICB0eXBlb2YgcGFyYW0udHlwZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgICAgIFtcInN0cmluZ1wiLCBcIm51bWJlclwiLCBcImJvb2xlYW5cIl0uaW5jbHVkZXMocGFyYW0udHlwZSk7XG5cbiAgICAgICAgICAgICAgaWYgKGlzUHJpbWl0aXZlKSB7XG4gICAgICAgICAgICAgICAgLy8gcHJpbWl0aXZlOiDsp4HsoJEgZm9ybURhdGEuYXBwZW5kXG4gICAgICAgICAgICAgICAgcmV0dXJuIGBmb3JtRGF0YS5hcHBlbmQoJyR7cGFyYW0ubmFtZX0nLCBTdHJpbmcoJHtwYXJhbS5uYW1lfSkpO2A7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gb2JqZWN0OiB0b0Zvcm1EYXRhIOyCrOyaqVxuICAgICAgICAgICAgICAgIHJldHVybiBgdG9Gb3JtRGF0YSgke3BhcmFtLm5hbWV9LCBmb3JtRGF0YSwgJyR7cGFyYW0ubmFtZX0nKTtgO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmpvaW4oXCJcXG4gICAgXCIpO1xuXG4gICAgICAgICAgY29uc3QgcGFyYW1zRGVmQ29tbWEgPSBwYXJhbXNEZWYgIT09IFwiXCIgPyBcIiwgXCIgOiBcIlwiO1xuICAgICAgICAgIGZ1bmN0aW9ucy5wdXNoKFxuICAgICAgICAgICAgYFxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uICR7bWV0aG9kTmFtZX0ke3R5cGVQYXJhbXNEZWZ9KFxuICAke3BhcmFtc0RlZn0ke3BhcmFtc0RlZkNvbW1hfVxuICBmaWxlczogRmlsZVtdLFxuICBvblVwbG9hZFByb2dyZXNzPzogKHBlOiBBeGlvc1Byb2dyZXNzRXZlbnQpID0+IHZvaWRcbik6IFByb21pc2U8JHtyZXR1cm5UeXBlRGVmfT4ge1xuICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAke2Zvcm1EYXRhQXBwZW5kfVxuICAke290aGVyUGFyYW1zQXBwZW5kfVxuICByZXR1cm4gZmV0Y2goe1xuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIHVybDogXFxgJHthcGlCYXNlVXJsfVxcYCxcbiAgICBvblVwbG9hZFByb2dyZXNzLFxuICAgIGRhdGE6IGZvcm1EYXRhLFxuICAgICR7YXBpLm9wdGlvbnMudGltZW91dCA/IGBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoJHthcGkub3B0aW9ucy50aW1lb3V0fSksYCA6IFwiXCJ9XG4gIH0pO1xufVxuICAgICAgICAgIGAudHJpbSgpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoYXBpLm9wdGlvbnMuaHR0cE1ldGhvZCA9PT0gXCJHRVRcIikge1xuICAgICAgICAgIGNvbnN0IGhhc1BhcmFtcyA9IHBhcmFtc1dpdGhvdXRDb250ZXh0Lmxlbmd0aCA+IDA7XG4gICAgICAgICAgZnVuY3Rpb25zLnB1c2goXG4gICAgICAgICAgICBgXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gJHttZXRob2ROYW1lfSR7dHlwZVBhcmFtc0RlZn0oJHtwYXJhbXNEZWZ9KTogUHJvbWlzZTwke3JldHVyblR5cGVEZWZ9PiB7XG4gIHJldHVybiBmZXRjaCh7XG4gICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgIHVybDogXFxgJHthcGlCYXNlVXJsfSR7aGFzUGFyYW1zID8gYD9cXCR7cXMuc3RyaW5naWZ5KHsgJHtwYXJhbU5hbWVzfSB9KX1gIDogXCJcIn1cXGAsXG4gICAgJHthcGkub3B0aW9ucy50aW1lb3V0ID8gYHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCgke2FwaS5vcHRpb25zLnRpbWVvdXR9KSxgIDogXCJcIn1cbiAgfSk7XG59XG4gICAgICAgICAgYC50cmltKCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBoYXNQYXJhbXMgPSBwYXJhbXNXaXRob3V0Q29udGV4dC5sZW5ndGggPiAwO1xuICAgICAgICAgIGZ1bmN0aW9ucy5wdXNoKFxuICAgICAgICAgICAgYFxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uICR7bWV0aG9kTmFtZX0ke3R5cGVQYXJhbXNEZWZ9KCR7cGFyYW1zRGVmfSk6IFByb21pc2U8JHtyZXR1cm5UeXBlRGVmfT4ge1xuICByZXR1cm4gZmV0Y2goe1xuICAgIG1ldGhvZDogXCIke2FwaS5vcHRpb25zLmh0dHBNZXRob2R9XCIsXG4gICAgdXJsOiBcXGAke2FwaUJhc2VVcmx9XFxgLFxuICAgICR7aGFzUGFyYW1zID8gYGRhdGE6IHsgJHtwYXJhbU5hbWVzfSB9LGAgOiBcIlwifVxuICAgICR7YXBpLm9wdGlvbnMudGltZW91dCA/IGBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoJHthcGkub3B0aW9ucy50aW1lb3V0fSksYCA6IFwiXCJ9XG4gIH0pO1xufVxuICAgICAgICAgIGAudHJpbSgpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyLiBxdWVyeU9wdGlvbnMgKyB1c2VRdWVyeSAodGFuc3RhY2stcXVlcnkpXG4gICAgICAgIGlmIChjbGllbnRzLmluY2x1ZGVzKFwidGFuc3RhY2stcXVlcnlcIikpIHtcbiAgICAgICAgICBjb25zdCBob29rTmFtZSA9IGFwaS5vcHRpb25zLnJlc291cmNlTmFtZVxuICAgICAgICAgICAgPyBpbmZsZWN0aW9uLmNhbWVsaXplKGFwaS5vcHRpb25zLnJlc291cmNlTmFtZSwgdHJ1ZSlcbiAgICAgICAgICAgIDogaW5mbGVjdGlvbi5jYW1lbGl6ZShhcGkubWV0aG9kTmFtZSwgdHJ1ZSk7XG5cbiAgICAgICAgICAvLyBxdWVyeU9wdGlvbnNcbiAgICAgICAgICBmdW5jdGlvbnMucHVzaChcbiAgICAgICAgICAgIGBcbmV4cG9ydCBjb25zdCAke21ldGhvZE5hbWV9UXVlcnlPcHRpb25zID0gJHt0eXBlUGFyYW1zRGVmfSgke3BhcmFtc0RlZn0pID0+IHF1ZXJ5T3B0aW9ucyh7XG4gIHF1ZXJ5S2V5OiBbJyR7bW9kZWxOYW1lfScsICcke21ldGhvZE5hbWV9JyR7cGFyYW1OYW1lcyA/IGAsICR7cGFyYW1OYW1lc31gIDogXCJcIn1dLFxuICBxdWVyeUZuOiAoKSA9PiAke21ldGhvZE5hbWV9KCR7cGFyYW1OYW1lc30pXG59KTtcbiAgICAgICAgICBgLnRyaW0oKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gdXNlUXVlcnkgaG9vayAodXNlUmVmcmVzaGFibGXroZwg656Y7ZWR7ZW0IHJlZnJlc2gvaXNSZWZyZXNoaW5n7J2EIOq4sOuzuCDsoJzqs7UpXG4gICAgICAgICAgZnVuY3Rpb25zLnB1c2goXG4gICAgICAgICAgICBgXG5leHBvcnQgY29uc3QgdXNlJHtpbmZsZWN0aW9uLmNhbWVsaXplKGhvb2tOYW1lKX0gPSAke3R5cGVQYXJhbXNEZWZ9KCR7cGFyYW1zRGVmfSR7XG4gICAgICAgICAgICAgIHBhcmFtc0RlZiA/IFwiLCBcIiA6IFwiXCJcbiAgICAgICAgICAgIH1vcHRpb25zPzogeyBlbmFibGVkPzogYm9vbGVhbiB9KSA9PlxuICB1c2VSZWZyZXNoYWJsZSh1c2VRdWVyeSh7XG4gICAgLi4uJHttZXRob2ROYW1lfVF1ZXJ5T3B0aW9ucygke3BhcmFtTmFtZXN9KSxcbiAgICAuLi5vcHRpb25zXG4gIH0pKTtcbiAgICAgICAgICBgLnRyaW0oKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gaW5maW5pdGVRdWVyeU9wdGlvbnMgKyB1c2VJbmZpbml0ZVF1ZXJ5IChBc3luY0lkQ29uZmlnLnVzZUxpc3RJbmZpbml0ZSDrjIDsg4Eg7KGw6rG0KVxuICAgICAgICAgIC8vIOyhsOqxtDogcmVzb3VyY2VOYW1l7J20IOuzteyImO2YleydtOqzoCBtZXRob2ROYW1lID09PSBcImZpbmRNYW55XCJcbiAgICAgICAgICBjb25zdCByZXNvdXJjZU5hbWUgPSBhcGkub3B0aW9ucy5yZXNvdXJjZU5hbWU7XG4gICAgICAgICAgY29uc3QgaXNJbmZpbml0ZVRhcmdldCA9XG4gICAgICAgICAgICAhIXJlc291cmNlTmFtZSAmJlxuICAgICAgICAgICAgaW5mbGVjdGlvbi5wbHVyYWxpemUocmVzb3VyY2VOYW1lKSA9PT0gcmVzb3VyY2VOYW1lICYmXG4gICAgICAgICAgICBhcGkubWV0aG9kTmFtZSA9PT0gXCJmaW5kTWFueVwiO1xuXG4gICAgICAgICAgaWYgKGlzSW5maW5pdGVUYXJnZXQpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZmluaXRlTWV0aG9kTmFtZSA9IGAke21ldGhvZE5hbWV9SW5maW5pdGVgO1xuICAgICAgICAgICAgY29uc3QgaW5maW5pdGVIb29rTmFtZSA9IGB1c2Uke2luZmxlY3Rpb24uY2FtZWxpemUoaG9va05hbWUpfUluZmluaXRlYDtcblxuICAgICAgICAgICAgZnVuY3Rpb25zLnB1c2goXG4gICAgICAgICAgICAgIGBcbmV4cG9ydCBjb25zdCAke2luZmluaXRlTWV0aG9kTmFtZX1RdWVyeU9wdGlvbnMgPSAke3R5cGVQYXJhbXNEZWZ9KCR7cGFyYW1zRGVmfSkgPT4gaW5maW5pdGVRdWVyeU9wdGlvbnMoe1xuICBxdWVyeUtleTogWycke21vZGVsTmFtZX0nLCAnJHttZXRob2ROYW1lfScsICdpbmZpbml0ZScke3BhcmFtTmFtZXMgPyBgLCAke3BhcmFtTmFtZXN9YCA6IFwiXCJ9XSxcbiAgcXVlcnlGbjogKHsgcGFnZVBhcmFtIH0pID0+ICR7bWV0aG9kTmFtZX0oJHtcbiAgICBwYXJhbU5hbWVzID8gcGFyYW1OYW1lcy5yZXBsYWNlKC9cXGJyYXdQYXJhbXNcXGIvLCBcInsgLi4ucmF3UGFyYW1zLCBwYWdlOiBwYWdlUGFyYW0gfVwiKSA6IFwiXCJcbiAgfSksXG4gIGluaXRpYWxQYWdlUGFyYW06IDEgYXMgbnVtYmVyLFxuICBnZXROZXh0UGFnZVBhcmFtOiAobGFzdFBhZ2UsIGFsbFBhZ2VzKSA9PiB7XG4gICAgY29uc3QgdG90YWwgPSAobGFzdFBhZ2UgYXMgeyB0b3RhbD86IG51bWJlciB9KT8udG90YWwgPz8gMDtcbiAgICBjb25zdCBsb2FkZWQgPSBhbGxQYWdlcy5yZWR1Y2UoXG4gICAgICAoc3VtLCBwKSA9PiBzdW0gKyAoKHAgYXMgeyByb3dzPzogdW5rbm93bltdIH0pPy5yb3dzPy5sZW5ndGggPz8gMCksXG4gICAgICAwLFxuICAgICk7XG4gICAgcmV0dXJuIGxvYWRlZCA8IHRvdGFsID8gYWxsUGFnZXMubGVuZ3RoICsgMSA6IHVuZGVmaW5lZDtcbiAgfSxcbiAgc2VsZWN0OiBkZWR1cGVBbmRGbGF0dGVuLFxufSk7XG4gICAgICAgICAgYC50cmltKCksXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBmdW5jdGlvbnMucHVzaChcbiAgICAgICAgICAgICAgYFxuZXhwb3J0IGNvbnN0ICR7aW5maW5pdGVIb29rTmFtZX0gPSAke3R5cGVQYXJhbXNEZWZ9KCR7cGFyYW1zRGVmfSR7XG4gICAgICAgICAgICAgICAgcGFyYW1zRGVmID8gXCIsIFwiIDogXCJcIlxuICAgICAgICAgICAgICB9b3B0aW9ucz86IHsgZW5hYmxlZD86IGJvb2xlYW4gfSkgPT5cbiAgdXNlUmVmcmVzaGFibGUodXNlSW5maW5pdGVRdWVyeSh7XG4gICAgLi4uJHtpbmZpbml0ZU1ldGhvZE5hbWV9UXVlcnlPcHRpb25zKCR7cGFyYW1OYW1lc30pLFxuICAgIC4uLm9wdGlvbnNcbiAgfSkpO1xuICAgICAgICAgIGAudHJpbSgpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyAzLiB1c2VNdXRhdGlvbiAodGFuc3RhY2stbXV0YXRpb24pXG4gICAgICAgIGlmIChjbGllbnRzLmluY2x1ZGVzKFwidGFuc3RhY2stbXV0YXRpb25cIikpIHtcbiAgICAgICAgICBjb25zdCBob29rTmFtZSA9IGluZmxlY3Rpb24uY2FtZWxpemUoYXBpLm1ldGhvZE5hbWUpO1xuICAgICAgICAgIGNvbnN0IG11dGF0aW9uUGFyYW1UeXBlID1cbiAgICAgICAgICAgIHBhcmFtc1dpdGhvdXRDb250ZXh0Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgPyBgeyAke3BhcmFtc1dpdGhvdXRDb250ZXh0XG4gICAgICAgICAgICAgICAgICAubWFwKChwKSA9PiBgJHtwLm5hbWV9OiAke2FwaVBhcmFtVHlwZVRvVHNUeXBlKHAudHlwZSwgW10pfWApXG4gICAgICAgICAgICAgICAgICAuam9pbihcIiwgXCIpfSB9YFxuICAgICAgICAgICAgICA6IFwidm9pZFwiO1xuICAgICAgICAgIGNvbnN0IG11dGF0aW9uUGFyYW1OYW1lcyA9XG4gICAgICAgICAgICBwYXJhbXNXaXRob3V0Q29udGV4dC5sZW5ndGggPiAwXG4gICAgICAgICAgICAgID8gcGFyYW1zV2l0aG91dENvbnRleHQubWFwKChwKSA9PiBgcGFyYW1zLiR7cC5uYW1lfWApLmpvaW4oXCIsIFwiKVxuICAgICAgICAgICAgICA6IFwiXCI7XG5cbiAgICAgICAgICBmdW5jdGlvbnMucHVzaChcbiAgICAgICAgICAgIGBcbmV4cG9ydCBjb25zdCB1c2Uke2hvb2tOYW1lfU11dGF0aW9uID0gJHt0eXBlUGFyYW1zRGVmfSgpID0+IHVzZU11dGF0aW9uKHtcbiAgbXV0YXRpb25GbjogKHBhcmFtczogJHttdXRhdGlvblBhcmFtVHlwZX0pID0+ICR7bWV0aG9kTmFtZX0oJHttdXRhdGlvblBhcmFtTmFtZXN9KVxufSk7XG4gICAgICAgICAgYC50cmltKCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDQuIHVzZU11dGF0aW9uIHdpdGggbXVsdGlwYXJ0ICh0YW5zdGFjay1tdXRhdGlvbi1tdWx0aXBhcnQpXG4gICAgICAgIGlmIChjbGllbnRzLmluY2x1ZGVzKFwidGFuc3RhY2stbXV0YXRpb24tbXVsdGlwYXJ0XCIpKSB7XG4gICAgICAgICAgY29uc3QgaG9va05hbWUgPSBpbmZsZWN0aW9uLmNhbWVsaXplKGFwaS5tZXRob2ROYW1lKTtcblxuICAgICAgICAgIC8vIO2MjOudvOuvuO2EsCDtg4DsnoUg7KCV7J2YOiBwYXJhbXNEZWbsl5DshJwg7YOA7J6F66eMIOy2lOy2nFxuICAgICAgICAgIC8vIHBhcmFtc0RlZiDsmIg6IFwicGFyYW1zOiB7IGNhdGVnb3J5OiBzdHJpbmcgfVwiIOKGkiBcInsgY2F0ZWdvcnk6IHN0cmluZyB9XCJcbiAgICAgICAgICBjb25zdCBwYXJhbXNUeXBlRGVmID1cbiAgICAgICAgICAgIHBhcmFtc1dpdGhvdXRDb250ZXh0Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgPyBwYXJhbXNEZWYuc3BsaXQoXCI6XCIpLnNsaWNlKDEpLmpvaW4oXCI6XCIpLnRyaW0oKSAvLyBcInBhcmFtczogeyBjYXRlZ29yeTogc3RyaW5nIH1cIiDihpIgXCJ7IGNhdGVnb3J5OiBzdHJpbmcgfVwiXG4gICAgICAgICAgICAgIDogXCJcIjtcblxuICAgICAgICAgIGNvbnN0IG11dGF0aW9uUGFyYW1UeXBlID1cbiAgICAgICAgICAgIHBhcmFtc1dpdGhvdXRDb250ZXh0Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgPyBgeyBwYXJhbXM6ICR7cGFyYW1zVHlwZURlZn0sIGZpbGVzOiBGaWxlW10gfWBcbiAgICAgICAgICAgICAgOiBgeyBmaWxlczogRmlsZVtdIH1gO1xuXG4gICAgICAgICAgLy8gbXV0YXRpb25GbiDtmLjstpwg7YyM652866+47YSwXG4gICAgICAgICAgY29uc3QgbXV0YXRpb25GbkNhbGwgPVxuICAgICAgICAgICAgcGFyYW1zV2l0aG91dENvbnRleHQubGVuZ3RoID4gMFxuICAgICAgICAgICAgICA/IGAke21ldGhvZE5hbWV9KHBhcmFtcy5wYXJhbXMsIHBhcmFtcy5maWxlcylgXG4gICAgICAgICAgICAgIDogYCR7bWV0aG9kTmFtZX0ocGFyYW1zLmZpbGVzKWA7XG5cbiAgICAgICAgICBmdW5jdGlvbnMucHVzaChcbiAgICAgICAgICAgIGBcbmV4cG9ydCBjb25zdCB1c2Uke2hvb2tOYW1lfU11dGF0aW9uID0gJHt0eXBlUGFyYW1zRGVmfShcbiAgb3B0aW9ucz86IFVzZU11dGF0aW9uT3B0aW9uczwke3JldHVyblR5cGVEZWZ9LCBFcnJvciwgJHttdXRhdGlvblBhcmFtVHlwZX0+ICYge1xuICAgIG9uVXBsb2FkUHJvZ3Jlc3M/OiAoZTogQXhpb3NQcm9ncmVzc0V2ZW50KSA9PiB2b2lkO1xuICB9XG4pID0+IHVzZU11dGF0aW9uKHtcbiAgbXV0YXRpb25GbjogKHBhcmFtczogJHttdXRhdGlvblBhcmFtVHlwZX0pID0+ICR7bXV0YXRpb25GbkNhbGx9LFxuICByZXRyeTogZmFsc2UsXG4gIC4uLm9wdGlvbnMsXG59KTtcbiAgICAgICAgICBgLnRyaW0oKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG5hbWVzcGFjZXMucHVzaChcbiAgICAgICAgYFxuZXhwb3J0IG5hbWVzcGFjZSAke21vZGVsTmFtZX1TZXJ2aWNlIHtcbiR7ZnVuY3Rpb25zLmpvaW4oXCJcXG5cXG5cIil9XG59XG4gICAgICBgLnRyaW0oKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQXN5bmNJZENvbmZpZyDsg53shLEgKEVudGl0eeuzhOuhnClcbiAgICBjb25zdCBlbnRpdHlJZHMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuICAgIGNvbnN0IGFzeW5jSWRDb25maWdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBlbnRpdHlJZCBvZiBlbnRpdHlJZHMpIHtcbiAgICAgIGNvbnN0IG5hbWVzID0gRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChlbnRpdHlJZCk7XG5cbiAgICAgIC8vIEFzeW5jSWRDb25maWfsmqkg66as7Iqk7Yq4IOyhsO2ajCBBUEkg7LC+6riwXG4gICAgICBjb25zdCBsaXN0QXBpID0gYXBpc0J5TW9kZWwuZ2V0KG5hbWVzLmNhcGl0YWwpPy5maW5kKChhcGkpID0+IHtcbiAgICAgICAgLy8gcmVzb3VyY2VOYW1l7J20IOyXhuqxsOuCmCB0YW5zdGFjay1xdWVyeeulvCDsgqzsmqntlZjsp4Ag7JWK64qUIEFQSeuKlCDsoJzsmbhcbiAgICAgICAgaWYgKCFhcGkub3B0aW9ucy5yZXNvdXJjZU5hbWUgfHwgIWFwaS5vcHRpb25zLmNsaWVudHM/LmluY2x1ZGVzKFwidGFuc3RhY2stcXVlcnlcIikpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVzb3VyY2VOYW1l7J20IOuzteyImO2YleydtOqzoCDrqZTshJzrk5zrqoXsnbQgZmluZE1hbnnsnbggQVBJXG4gICAgICAgIGNvbnN0IHJlc291cmNlTmFtZSA9IGFwaS5vcHRpb25zLnJlc291cmNlTmFtZTtcbiAgICAgICAgcmV0dXJuIGluZmxlY3Rpb24ucGx1cmFsaXplKHJlc291cmNlTmFtZSkgPT09IHJlc291cmNlTmFtZSAmJiBhcGkubWV0aG9kTmFtZSA9PT0gXCJmaW5kTWFueVwiO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChsaXN0QXBpKSB7XG4gICAgICAgIC8vIHJlc291cmNlTmFtZeyXkOyEnCBob29rIOydtOumhCDsg53shLEgKOq4sOyhtCDroZzsp4Hqs7wg64+Z7J28KVxuICAgICAgICBjb25zdCBob29rTmFtZSA9IGluZmxlY3Rpb24uY2FtZWxpemUoYXNzZXJ0RGVmaW5lZChsaXN0QXBpLm9wdGlvbnMucmVzb3VyY2VOYW1lKSwgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IHVzZUhvb2tOYW1lID0gYHVzZSR7aW5mbGVjdGlvbi5jYW1lbGl6ZShob29rTmFtZSl9YDtcbiAgICAgICAgY29uc3QgdXNlSG9va0luZmluaXRlTmFtZSA9IGAke3VzZUhvb2tOYW1lfUluZmluaXRlYDtcblxuICAgICAgICAvLyBMaXN0UGFyYW1zIO2DgOyeheuqhSDqtazshLFcbiAgICAgICAgY29uc3QgbGlzdFBhcmFtc1R5cGUgPSBgJHtuYW1lcy5jYXBpdGFsfUxpc3RQYXJhbXNgO1xuXG4gICAgICAgIGFzeW5jSWRDb25maWdzLnB1c2goXG4gICAgICAgICAgYFxuLy8gQXN5bmNJZENvbmZpZzogJHtuYW1lcy5jYXBpdGFsfVxuZXhwb3J0IGNvbnN0ICR7bmFtZXMuY2FwaXRhbH1Bc3luY0lkQ29uZmlnOiBBc3luY0lkQ29uZmlnPCR7bmFtZXMuY2FwaXRhbH1TdWJzZXRLZXksICR7bmFtZXMuY2FwaXRhbH1TdWJzZXRNYXBwaW5nLCAke2xpc3RQYXJhbXNUeXBlfT4gPSB7XG4gIHBsYWNlaG9sZGVyS2V5OiBcImVudGl0eS4ke25hbWVzLmNhcGl0YWx9XCIsXG4gIHVzZUxpc3Q6ICR7bmFtZXMuY2FwaXRhbH1TZXJ2aWNlLiR7dXNlSG9va05hbWV9LFxuICB1c2VMaXN0SW5maW5pdGU6ICR7bmFtZXMuY2FwaXRhbH1TZXJ2aWNlLiR7dXNlSG9va0luZmluaXRlTmFtZX0sXG59O1xuICAgICAgICAgIGAudHJpbSgpLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEJVSUxUX0lOX1RZUEVT7JeQ7IScIOyCrOyaqeuQmOuKlCDtg4DsnoXrk6TsnYQg7ZmV7J247ZWY7JesIOuPmeyggeycvOuhnCBpbXBvcnQg6rWs7ISxXG4gICAgY29uc3QgYnVpbHRJblR5cGVJbXBvcnRzID0gT2JqZWN0LmtleXMoQlVJTFRfSU5fVFlQRVMpXG4gICAgICAuZmlsdGVyKCh0eXBlS2V5KSA9PiBpbXBvcnRLZXlzLmluY2x1ZGVzKHR5cGVLZXkpKVxuICAgICAgLm1hcCgodHlwZUtleSkgPT4gYHR5cGUgJHt0eXBlS2V5fWApO1xuXG4gICAgLy8gc29uYW11LnNoYXJlZOyXkOyEnCBpbXBvcnTtlaAg7ZWt66qp65Ok7J2EIOuPmeyggeycvOuhnCDqtazshLFcbiAgICAvLyBib2R5IOusuOyekOyXtOydhCDquLDspIDsnLzroZwgaW5maW5pdGUg7ZuFIOyDneyEsSDsl6zrtoAg7YyQ64uoIChmaW5kTWFueSDrs7XsiJjtmJUg67aE6riw7JeQ7ISc66eMIOywuOyhsOuQqClcbiAgICBjb25zdCBib2R5Rm9ySW1wb3J0Q2hlY2sgPSBuYW1lc3BhY2VzLmpvaW4oXCJcXG5cXG5cIik7XG4gICAgY29uc3QgbmVlZHNEZWR1cGVBbmRGbGF0dGVuID0gYm9keUZvckltcG9ydENoZWNrLmluY2x1ZGVzKFwiZGVkdXBlQW5kRmxhdHRlblwiKTtcbiAgICBjb25zdCBuZWVkc1VzZVJlZnJlc2hhYmxlID0gYm9keUZvckltcG9ydENoZWNrLmluY2x1ZGVzKFwidXNlUmVmcmVzaGFibGVcIik7XG5cbiAgICBjb25zdCBzb25hbXVTaGFyZWRJbXBvcnRzID0gW1xuICAgICAgXCJ0eXBlIExpc3RSZXN1bHRcIixcbiAgICAgIFwidHlwZSBGaWx0ZXJRdWVyeVwiLFxuICAgICAgLi4uYnVpbHRJblR5cGVJbXBvcnRzLFxuICAgICAgXCJmZXRjaFwiLFxuICAgICAgXCJ0eXBlIEV2ZW50SGFuZGxlcnNcIixcbiAgICAgIFwidHlwZSBTU0VTdHJlYW1PcHRpb25zXCIsXG4gICAgICBcInR5cGUgV2ViU29ja2V0Q2hhbm5lbE9wdGlvbnNcIixcbiAgICAgIFwidXNlU1NFU3RyZWFtXCIsXG4gICAgICBcInVzZVdlYlNvY2tldENoYW5uZWxcIixcbiAgICAgIFwidG9Gb3JtRGF0YVwiLFxuICAgICAgLi4uKG5lZWRzRGVkdXBlQW5kRmxhdHRlbiA/IFtcImRlZHVwZUFuZEZsYXR0ZW5cIl0gOiBbXSksXG4gICAgICAuLi4obmVlZHNVc2VSZWZyZXNoYWJsZSA/IFtcInVzZVJlZnJlc2hhYmxlXCJdIDogW10pLFxuICAgIF0uam9pbihcIiwgXCIpO1xuXG4gICAgLy8gYm9keSDqtazshLE6IG5hbWVzcGFjZXMgKyBhc3luY0lkQ29uZmlnc1xuICAgIGNvbnN0IGJvZHlQYXJ0cyA9IFsuLi5uYW1lc3BhY2VzLCAuLi5hc3luY0lkQ29uZmlnc107XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5nZXRUYXJnZXRBbmRQYXRoKCksXG4gICAgICBib2R5OiBib2R5UGFydHMuam9pbihcIlxcblxcblwiKSxcbiAgICAgIGltcG9ydEtleXM6IGRpZmYodW5pcXVlKGltcG9ydEtleXMpLCBbXG4gICAgICAgIC4uLnR5cGVQYXJhbU5hbWVzLFxuICAgICAgICBcIkxpc3RSZXN1bHRcIixcbiAgICAgICAgLi4uT2JqZWN0LmtleXMoQlVJTFRfSU5fVFlQRVMpLFxuICAgICAgXSksXG4gICAgICBjdXN0b21IZWFkZXJzOiBbXG4gICAgICAgIFwiLyoqXCIsXG4gICAgICAgIFwiICogQGdlbmVyYXRlZFwiLFxuICAgICAgICBcIiAqIOyngeygkSDsiJjsoJXtlZjsp4Ag66eI7IS47JqULlwiLFxuICAgICAgICBcIiAqL1wiLFxuICAgICAgICBcIlwiLFxuICAgICAgICBcIi8qIG94bGludC1kaXNhYmxlICovXCIsXG4gICAgICAgIFwiXCIsXG4gICAgICAgIGBpbXBvcnQgeyBxdWVyeU9wdGlvbnMsIHVzZVF1ZXJ5LCB1c2VJbmZpbml0ZVF1ZXJ5LCBpbmZpbml0ZVF1ZXJ5T3B0aW9ucywgdXNlTXV0YXRpb24sIHR5cGUgVXNlTXV0YXRpb25PcHRpb25zIH0gZnJvbSAnQHRhbnN0YWNrL3JlYWN0LXF1ZXJ5JztgLFxuICAgICAgICBgaW1wb3J0IHsgdHlwZSBBeGlvc1Byb2dyZXNzRXZlbnQgfSBmcm9tICdheGlvcyc7YCxcbiAgICAgICAgYGltcG9ydCBxcyBmcm9tICdxcyc7YCxcbiAgICAgICAgYGltcG9ydCB7ICR7c29uYW11U2hhcmVkSW1wb3J0c30gfSBmcm9tICcuL3NvbmFtdS5zaGFyZWQnO2AsXG4gICAgICAgIGBpbXBvcnQgeyB0eXBlIEFzeW5jSWRDb25maWcgfSBmcm9tICdAc29uYW11LWtpdC9yZWFjdC1jb21wb25lbnRzL2NvbXBvbmVudHMnO2AsXG4gICAgICBdLFxuICAgIH07XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7c0JBT21DO2FBRU87cUJBQ2tCO1lBRVg7WUFDQztlQUNYO29CQUMrQjtBQUV0RSxJQUFhLHFCQUFiLGNBQXdDLFNBQVM7Q0FDL0MsY0FBYztBQUNaLFFBQU0sV0FBVzs7Q0FHbkIsbUJBQW1CO0FBQ2pCLFNBQU87R0FDTCxRQUFRO0dBQ1IsTUFBTTtHQUNQOztDQUdILE9BQU8sSUFBaUM7RUFDdEMsTUFBTSxFQUFFLFNBQVMsT0FBTztFQUd4QixNQUFNLGNBQWMsSUFBSSxLQUE0QjtBQUNwRCxPQUFLLE1BQU0sT0FBTyxNQUFNO0dBQ3RCLE1BQU0sWUFBWSxJQUFJLFVBQVUsUUFB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
|
|
302
|
+
|
|
303
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZXMudGVtcGxhdGUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3RlbXBsYXRlL2ltcGxlbWVudGF0aW9ucy9zZXJ2aWNlcy50ZW1wbGF0ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHsgZGlmZiwgdW5pcXVlIH0gZnJvbSBcInJhZGFzaGlcIjtcblxuaW1wb3J0IHtcbiAgYXBpUGFyYW1Ub1RzQ29kZSxcbiAgYXBpUGFyYW1UeXBlVG9Uc1R5cGUsXG4gIHVud3JhcFByb21pc2VPbmNlLFxufSBmcm9tIFwiLi4vLi4vYXBpL2NvZGUtY29udmVydGVyc1wiO1xuaW1wb3J0IHsgdHlwZSBFeHRlbmRlZEFwaSB9IGZyb20gXCIuLi8uLi9hcGkvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uLy4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyB0eXBlIFRlbXBsYXRlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgQXBpUGFyYW1UeXBlIH0gZnJvbSBcIi4uLy4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBhc3NlcnREZWZpbmVkIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gXCIuLi90ZW1wbGF0ZVwiO1xuaW1wb3J0IHsgQlVJTFRfSU5fVFlQRVMsIHpvZFR5cGVUb1RzVHlwZURlZiB9IGZyb20gXCIuLi96b2QtY29udmVydGVyXCI7XG5cbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZV9fc2VydmljZXMgZXh0ZW5kcyBUZW1wbGF0ZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwic2VydmljZXNcIik7XG4gIH1cblxuICBnZXRUYXJnZXRBbmRQYXRoKCkge1xuICAgIHJldHVybiB7XG4gICAgICB0YXJnZXQ6IFwiOnRhcmdldC9zcmMvc2VydmljZXNcIixcbiAgICAgIHBhdGg6IGBzZXJ2aWNlcy5nZW5lcmF0ZWQudHNgLFxuICAgIH07XG4gIH1cblxuICByZW5kZXIoe306IFRlbXBsYXRlT3B0aW9uc1tcInNlcnZpY2VzXCJdKSB7XG4gICAgY29uc3QgeyBhcGlzIH0gPSBTb25hbXUuc3luY2VyO1xuXG4gICAgLy8g66qo642467OE66GcIOq3uOujue2ZlFxuICAgIGNvbnN0IGFwaXNCeU1vZGVsID0gbmV3IE1hcDxzdHJpbmcsIEV4dGVuZGVkQXBpW10+KCk7XG4gICAgZm9yIChjb25zdCBhcGkgb2YgYXBpcykge1xuICAgICAgY29uc3QgbW9kZWxOYW1lID0gYXBpLm1vZGVsTmFtZS5yZXBsYWNlKC9Nb2RlbCQvLCBcIlwiKS5yZXBsYWNlKC9GcmFtZSQvLCBcIlwiKTtcbiAgICAgIGlmICghYXBpc0J5TW9kZWwuaGFzKG1vZGVsTmFtZSkpIHtcbiAgICAgICAgYXBpc0J5TW9kZWwuc2V0KG1vZGVsTmFtZSwgW10pO1xuICAgICAgfVxuICAgICAgYXBpc0J5TW9kZWwuZ2V0KG1vZGVsTmFtZSk/LnB1c2goYXBpKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbXBvcnRLZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IG5hbWVzcGFjZXM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHR5cGVQYXJhbU5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHJlc29sdmVXZWJTb2NrZXRFdmVudFR5cGVEZWYgPSAoXG4gICAgICB0eXBlUmVmOiBBcGlQYXJhbVR5cGUuUmVmIHwgdW5kZWZpbmVkLFxuICAgICAgc2NoZW1hOiBQYXJhbWV0ZXJzPHR5cGVvZiB6b2RUeXBlVG9Uc1R5cGVEZWY+WzBdLFxuICAgICk6IHN0cmluZyA9PiB7XG4gICAgICBpZiAodHlwZVJlZikge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGVJbXBvcnRLZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBjb25zdCBjYW5kaWRhdGVUeXBlRGVmID0gYXBpUGFyYW1UeXBlVG9Uc1R5cGUodHlwZVJlZiwgY2FuZGlkYXRlSW1wb3J0S2V5cyk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB1bmlxdWUoY2FuZGlkYXRlSW1wb3J0S2V5cykpIHtcbiAgICAgICAgICAgIEVudGl0eU1hbmFnZXIuZ2V0TW9kdWxlUGF0aChrZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpbXBvcnRLZXlzLnB1c2goLi4uY2FuZGlkYXRlSW1wb3J0S2V5cyk7XG4gICAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZVR5cGVEZWY7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIOuhnOy7rCBjb25zdCDrk7EgaW1wb3J0IOqwgOuKpe2VnCDsi6zrs7zsnbQg7JWE64uI66m0IOq4sOyhtCBpbmxpbmUg7IOd7ISx7Jy866GcIO2bhO2HtFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB6b2RUeXBlVG9Uc1R5cGVEZWYoc2NoZW1hKTtcbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBbbW9kZWxOYW1lLCBtb2RlbEFwaXNdIG9mIGFwaXNCeU1vZGVsKSB7XG4gICAgICBjb25zdCBmdW5jdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgIGZvciAoY29uc3QgYXBpIG9mIG1vZGVsQXBpcykge1xuICAgICAgICAvLyBAc3RyZWFtIOuNsOy9lOugiOydtO2EsOqwgCDsnojsnLzrqbQgU1NFIOyKpO2KuOumvCDtlajsiJgg7IOd7ISxXG4gICAgICAgIGlmIChhcGkuc3RyZWFtT3B0aW9ucykge1xuICAgICAgICAgIGNvbnN0IHBhcmFtc1dpdGhvdXRDb250ZXh0ID0gYXBpLnBhcmFtZXRlcnMuZmlsdGVyKFxuICAgICAgICAgICAgKHBhcmFtKSA9PlxuICAgICAgICAgICAgICAhQXBpUGFyYW1UeXBlLmlzQ29udGV4dChwYXJhbS50eXBlKSAmJlxuICAgICAgICAgICAgICAhQXBpUGFyYW1UeXBlLmlzUmVmS25leChwYXJhbS50eXBlKSAmJlxuICAgICAgICAgICAgICAhKHBhcmFtLm9wdGlvbmFsICYmIHBhcmFtLm5hbWUuc3RhcnRzV2l0aChcIl9cIikpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb25zdCBhcGlCYXNlVXJsID0gYCR7U29uYW11LmNvbmZpZy5hcGkucm91dGUucHJlZml4fSR7YXBpLnBhdGh9YDtcblxuICAgICAgICAgIGNvbnN0IG1ldGhvZE5hbWVTdHJlYW0gPSBhcGkub3B0aW9ucy5yZXNvdXJjZU5hbWVcbiAgICAgICAgICAgID8gYHVzZSR7aW5mbGVjdGlvbi5jYW1lbGl6ZShhcGkub3B0aW9ucy5yZXNvdXJjZU5hbWUpfWBcbiAgICAgICAgICAgIDogYHVzZSR7aW5mbGVjdGlvbi5jYW1lbGl6ZShhcGkubWV0aG9kTmFtZSl9YDtcbiAgICAgICAgICBjb25zdCBtZXRob2ROYW1lU3RyZWFtQ2FtZWxpemVkID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShtZXRob2ROYW1lU3RyZWFtLCB0cnVlKTtcblxuICAgICAgICAgIGNvbnN0IGV2ZW50c1R5cGVEZWYgPSB6b2RUeXBlVG9Uc1R5cGVEZWYoYXBpLnN0cmVhbU9wdGlvbnMuZXZlbnRzKTtcblxuICAgICAgICAgIC8vIO2MjOudvOuvuO2EsOulvCDqsJ3ssrQg7ZiV7YOc66GcIOygleydmCAo7YOA7J6F6rO8IOyLpOygnCDqsJIg66qo65GQ7JeQIOyCrOyaqSlcbiAgICAgICAgICBjb25zdCBwYXJhbXNEZWZBc09iamVjdCA9XG4gICAgICAgICAgICBwYXJhbXNXaXRob3V0Q29udGV4dC5sZW5ndGggPiAwXG4gICAgICAgICAgICAgID8gYHsgJHtwYXJhbXNXaXRob3V0Q29udGV4dC5tYXAoKHApID0+IGAke3AubmFtZX06ICR7YXBpUGFyYW1UeXBlVG9Uc1R5cGUocC50eXBlLCBpbXBvcnRLZXlzKX1gKS5qb2luKFwiLCBcIil9IH1gXG4gICAgICAgICAgICAgIDogXCJ7fVwiO1xuXG4gICAgICAgICAgZnVuY3Rpb25zLnB1c2goXG4gICAgICAgICAgICBgXG5leHBvcnQgZnVuY3Rpb24gJHttZXRob2ROYW1lU3RyZWFtQ2FtZWxpemVkfShcbiAgcGFyYW1zOiAke3BhcmFtc0RlZkFzT2JqZWN0fSxcbiAgaGFuZGxlcnM6IEV2ZW50SGFuZGxlcnM8JHtldmVudHNUeXBlRGVmfSAmIHsgZW5kPzogKCkgPT4gdm9pZCB9PixcbiAgb3B0aW9uczogU1NFU3RyZWFtT3B0aW9uc1xuKSB7XG4gIHJldHVybiB1c2VTU0VTdHJlYW08JHtldmVudHNUeXBlRGVmfT4oXFxgJHthcGlCYXNlVXJsfVxcYCwgcGFyYW1zLCBoYW5kbGVycywgb3B0aW9ucyk7XG59XG4gICAgICAgICAgICBgLnRyaW0oKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFwaS53ZWJzb2NrZXRPcHRpb25zKSB7XG4gICAgICAgICAgLy8gd2Vic29ja2V0IHN1cmZhY2XripQgZmV0Y2gg7ZWo7IiYIOuMgOyLoCB0eXBlZCBob29r7J2EIOyDneyEse2VqFxuICAgICAgICAgIGNvbnN0IHBhcmFtc1dpdGhvdXRDb250ZXh0ID0gYXBpLnBhcmFtZXRlcnMuZmlsdGVyKFxuICAgICAgICAgICAgKHBhcmFtKSA9PlxuICAgICAgICAgICAgICAhQXBpUGFyYW1UeXBlLmlzQ29udGV4dChwYXJhbS50eXBlKSAmJlxuICAgICAgICAgICAgICAhQXBpUGFyYW1UeXBlLmlzUmVmS25leChwYXJhbS50eXBlKSAmJlxuICAgICAgICAgICAgICAhKHBhcmFtLm9wdGlvbmFsICYmIHBhcmFtLm5hbWUuc3RhcnRzV2l0aChcIl9cIikpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb25zdCBhcGlCYXNlVXJsID0gYCR7U29uYW11LmNvbmZpZy5hcGkucm91dGUucHJlZml4fSR7YXBpLnBhdGh9YDtcblxuICAgICAgICAgIGNvbnN0IG1ldGhvZE5hbWVXZWJTb2NrZXQgPSBhcGkub3B0aW9ucy5yZXNvdXJjZU5hbWVcbiAgICAgICAgICAgID8gYHVzZSR7aW5mbGVjdGlvbi5jYW1lbGl6ZShhcGkub3B0aW9ucy5yZXNvdXJjZU5hbWUpfWBcbiAgICAgICAgICAgIDogYHVzZSR7aW5mbGVjdGlvbi5jYW1lbGl6ZShhcGkubWV0aG9kTmFtZSl9YDtcbiAgICAgICAgICBjb25zdCBtZXRob2ROYW1lV2ViU29ja2V0Q2FtZWxpemVkID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShtZXRob2ROYW1lV2ViU29ja2V0LCB0cnVlKTtcblxuICAgICAgICAgIC8vIG91dEV2ZW50c+uKlCDsiJjsi6Ag7YOA7J6FLCBpbkV2ZW50c+uKlCBzZW5kKCkg7J6F66ClIO2DgOyeheycvOuhnCDsgqzsmqntlahcbiAgICAgICAgICBjb25zdCBvdXRFdmVudHNUeXBlRGVmID0gcmVzb2x2ZVdlYlNvY2tldEV2ZW50VHlwZURlZihcbiAgICAgICAgICAgIGFwaS53ZWJzb2NrZXRPcHRpb25zLm91dEV2ZW50c1R5cGVSZWYsXG4gICAgICAgICAgICBhcGkud2Vic29ja2V0T3B0aW9ucy5vdXRFdmVudHMsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBpbkV2ZW50c1R5cGVEZWYgPSByZXNvbHZlV2ViU29ja2V0RXZlbnRUeXBlRGVmKFxuICAgICAgICAgICAgYXBpLndlYnNvY2tldE9wdGlvbnMuaW5FdmVudHNUeXBlUmVmLFxuICAgICAgICAgICAgYXBpLndlYnNvY2tldE9wdGlvbnMuaW5FdmVudHMsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIGNvbnRleHQvcmVmS25leC9pbnRlcm5hbCBvcHRpb25hbCDtjIzrnbzrr7jthLDripQg7YG065287J207Ja47Yq4IOyeheugpeyXkOyEnCDsoJzsmbjtlahcbiAgICAgICAgICBjb25zdCBwYXJhbXNEZWZBc09iamVjdCA9XG4gICAgICAgICAgICBwYXJhbXNXaXRob3V0Q29udGV4dC5sZW5ndGggPiAwXG4gICAgICAgICAgICAgID8gYHsgJHtwYXJhbXNXaXRob3V0Q29udGV4dC5tYXAoKHApID0+IGAke3AubmFtZX06ICR7YXBpUGFyYW1UeXBlVG9Uc1R5cGUocC50eXBlLCBpbXBvcnRLZXlzKX1gKS5qb2luKFwiLCBcIil9IH1gXG4gICAgICAgICAgICAgIDogXCJ7fVwiO1xuXG4gICAgICAgICAgZnVuY3Rpb25zLnB1c2goXG4gICAgICAgICAgICBgXG5leHBvcnQgZnVuY3Rpb24gJHttZXRob2ROYW1lV2ViU29ja2V0Q2FtZWxpemVkfShcbiAgcGFyYW1zOiAke3BhcmFtc0RlZkFzT2JqZWN0fSxcbiAgaGFuZGxlcnM6IEV2ZW50SGFuZGxlcnM8JHtvdXRFdmVudHNUeXBlRGVmfT4sXG4gIG9wdGlvbnM6IFdlYlNvY2tldENoYW5uZWxPcHRpb25zID0ge31cbikge1xuICByZXR1cm4gdXNlV2ViU29ja2V0Q2hhbm5lbDwke291dEV2ZW50c1R5cGVEZWZ9LCAke2luRXZlbnRzVHlwZURlZn0+KFxcYCR7YXBpQmFzZVVybH1cXGAsIHBhcmFtcywgaGFuZGxlcnMsIG9wdGlvbnMpO1xufVxuICAgICAgICAgICAgYC50cmltKCksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnRleHQg7KCc7Jm47ZWcIO2MjOudvOuvuO2EsFxuICAgICAgICBjb25zdCBwYXJhbXNXaXRob3V0Q29udGV4dCA9IGFwaS5wYXJhbWV0ZXJzLmZpbHRlcihcbiAgICAgICAgICAocGFyYW0pID0+XG4gICAgICAgICAgICAhQXBpUGFyYW1UeXBlLmlzQ29udGV4dChwYXJhbS50eXBlKSAmJlxuICAgICAgICAgICAgIUFwaVBhcmFtVHlwZS5pc1JlZktuZXgocGFyYW0udHlwZSkgJiZcbiAgICAgICAgICAgICEocGFyYW0ub3B0aW9uYWwgJiYgcGFyYW0ubmFtZS5zdGFydHNXaXRoKFwiX1wiKSksXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8g7YOA7J6FIO2MjOudvOuvuO2EsCDsoJXsnZhcbiAgICAgICAgY29uc3QgdHlwZVBhcmFtZXRlcnNBc1RzVHlwZSA9IGFwaS50eXBlUGFyYW1ldGVyc1xuICAgICAgICAgIC5tYXAoKHR5cGVQYXJhbSkgPT4gYXBpUGFyYW1UeXBlVG9Uc1R5cGUodHlwZVBhcmFtLCBpbXBvcnRLZXlzKSlcbiAgICAgICAgICAuam9pbihcIiwgXCIpO1xuICAgICAgICBjb25zdCB0eXBlUGFyYW1zRGVmID0gdHlwZVBhcmFtZXRlcnNBc1RzVHlwZSA/IGA8JHt0eXBlUGFyYW1ldGVyc0FzVHNUeXBlfT5gIDogXCJcIjtcbiAgICAgICAgdHlwZVBhcmFtTmFtZXMgPSB0eXBlUGFyYW1OYW1lcy5jb25jYXQoYXBpLnR5cGVQYXJhbWV0ZXJzLm1hcCgodHApID0+IHRwLmlkKSk7XG5cbiAgICAgICAgLy8g7YyM652866+47YSwIOygleydmFxuICAgICAgICBjb25zdCBwYXJhbXNEZWYgPSBhcGlQYXJhbVRvVHNDb2RlKHBhcmFtc1dpdGhvdXRDb250ZXh0LCBpbXBvcnRLZXlzKTtcbiAgICAgICAgY29uc3QgcGFyYW1OYW1lcyA9IHBhcmFtc1dpdGhvdXRDb250ZXh0Lm1hcCgocCkgPT4gcC5uYW1lKS5qb2luKFwiLCBcIik7XG5cbiAgICAgICAgLy8g66as7YS0IO2DgOyehSDsoJXsnZhcbiAgICAgICAgY29uc3QgcmV0dXJuVHlwZURlZiA9IGFwaVBhcmFtVHlwZVRvVHNUeXBlKFxuICAgICAgICAgIGFzc2VydERlZmluZWQodW53cmFwUHJvbWlzZU9uY2UoYXBpLnJldHVyblR5cGUpKSxcbiAgICAgICAgICBpbXBvcnRLZXlzLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIOq4sOuzuCBVUkxcbiAgICAgICAgY29uc3QgYXBpQmFzZVVybCA9IGAke1NvbmFtdS5jb25maWcuYXBpLnJvdXRlLnByZWZpeH0ke2FwaS5wYXRofWA7XG5cbiAgICAgICAgY29uc3QgY2xpZW50cyA9IGFwaS5vcHRpb25zLmNsaWVudHMgfHwgW107XG5cbiAgICAgICAgLy8gMS4gYXhpb3Mg7ZWo7IiYIOyDneyEsVxuICAgICAgICAvLyByZXNvdXJjZU5hbWXsnbQg7J6I7Jy866m0IGdldCArIHJlc291cmNlTmFtZSDtmJXtg5zroZwg7ZWo7IiY66qFIOyDneyEsVxuICAgICAgICBjb25zdCBtZXRob2ROYW1lID0gYXBpLm9wdGlvbnMucmVzb3VyY2VOYW1lXG4gICAgICAgICAgPyBgZ2V0JHtpbmZsZWN0aW9uLmNhbWVsaXplKGFwaS5vcHRpb25zLnJlc291cmNlTmFtZSl9YFxuICAgICAgICAgIDogYXBpLm1ldGhvZE5hbWU7XG5cbiAgICAgICAgLy8gYXhpb3MtbXVsdGlwYXJ0IOyymOumrCAo7YyM7J28IOyXheuhnOuTnClcbiAgICAgICAgaWYgKGNsaWVudHMuaW5jbHVkZXMoXCJheGlvcy1tdWx0aXBhcnRcIikpIHtcbiAgICAgICAgICBjb25zdCBmb3JtRGF0YUFwcGVuZCA9IGBmaWxlcy5mb3JFYWNoKGYgPT4geyBmb3JtRGF0YS5hcHBlbmQoXCJmaWxlc1wiLCBmKTsgfSk7YDtcblxuICAgICAgICAgIGNvbnN0IG90aGVyUGFyYW1zQXBwZW5kID0gcGFyYW1zV2l0aG91dENvbnRleHRcbiAgICAgICAgICAgIC5tYXAoKHBhcmFtKSA9PiB7XG4gICAgICAgICAgICAgIC8vIHByaW1pdGl2ZSDtg4DsnoXsnbjsp4Ag7LK07YGsXG4gICAgICAgICAgICAgIGNvbnN0IGlzUHJpbWl0aXZlID1cbiAgICAgICAgICAgICAgICB0eXBlb2YgcGFyYW0udHlwZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgICAgIFtcInN0cmluZ1wiLCBcIm51bWJlclwiLCBcImJvb2xlYW5cIl0uaW5jbHVkZXMocGFyYW0udHlwZSk7XG5cbiAgICAgICAgICAgICAgaWYgKGlzUHJpbWl0aXZlKSB7XG4gICAgICAgICAgICAgICAgLy8gcHJpbWl0aXZlOiDsp4HsoJEgZm9ybURhdGEuYXBwZW5kXG4gICAgICAgICAgICAgICAgcmV0dXJuIGBmb3JtRGF0YS5hcHBlbmQoJyR7cGFyYW0ubmFtZX0nLCBTdHJpbmcoJHtwYXJhbS5uYW1lfSkpO2A7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gb2JqZWN0OiB0b0Zvcm1EYXRhIOyCrOyaqVxuICAgICAgICAgICAgICAgIHJldHVybiBgdG9Gb3JtRGF0YSgke3BhcmFtLm5hbWV9LCBmb3JtRGF0YSwgJyR7cGFyYW0ubmFtZX0nKTtgO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmpvaW4oXCJcXG4gICAgXCIpO1xuXG4gICAgICAgICAgY29uc3QgcGFyYW1zRGVmQ29tbWEgPSBwYXJhbXNEZWYgIT09IFwiXCIgPyBcIiwgXCIgOiBcIlwiO1xuICAgICAgICAgIGZ1bmN0aW9ucy5wdXNoKFxuICAgICAgICAgICAgYFxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uICR7bWV0aG9kTmFtZX0ke3R5cGVQYXJhbXNEZWZ9KFxuICAke3BhcmFtc0RlZn0ke3BhcmFtc0RlZkNvbW1hfVxuICBmaWxlczogRmlsZVtdLFxuICBvblVwbG9hZFByb2dyZXNzPzogKHBlOiBBeGlvc1Byb2dyZXNzRXZlbnQpID0+IHZvaWRcbik6IFByb21pc2U8JHtyZXR1cm5UeXBlRGVmfT4ge1xuICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAke2Zvcm1EYXRhQXBwZW5kfVxuICAke290aGVyUGFyYW1zQXBwZW5kfVxuICByZXR1cm4gZmV0Y2goe1xuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIHVybDogXFxgJHthcGlCYXNlVXJsfVxcYCxcbiAgICBvblVwbG9hZFByb2dyZXNzLFxuICAgIGRhdGE6IGZvcm1EYXRhLFxuICAgICR7YXBpLm9wdGlvbnMudGltZW91dCA/IGBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoJHthcGkub3B0aW9ucy50aW1lb3V0fSksYCA6IFwiXCJ9XG4gIH0pO1xufVxuICAgICAgICAgIGAudHJpbSgpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoYXBpLm9wdGlvbnMuaHR0cE1ldGhvZCA9PT0gXCJHRVRcIikge1xuICAgICAgICAgIGNvbnN0IGhhc1BhcmFtcyA9IHBhcmFtc1dpdGhvdXRDb250ZXh0Lmxlbmd0aCA+IDA7XG4gICAgICAgICAgZnVuY3Rpb25zLnB1c2goXG4gICAgICAgICAgICBgXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gJHttZXRob2ROYW1lfSR7dHlwZVBhcmFtc0RlZn0oJHtwYXJhbXNEZWZ9KTogUHJvbWlzZTwke3JldHVyblR5cGVEZWZ9PiB7XG4gIHJldHVybiBmZXRjaCh7XG4gICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgIHVybDogXFxgJHthcGlCYXNlVXJsfSR7aGFzUGFyYW1zID8gYD9cXCR7cXMuc3RyaW5naWZ5KHsgJHtwYXJhbU5hbWVzfSB9KX1gIDogXCJcIn1cXGAsXG4gICAgJHthcGkub3B0aW9ucy50aW1lb3V0ID8gYHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCgke2FwaS5vcHRpb25zLnRpbWVvdXR9KSxgIDogXCJcIn1cbiAgfSk7XG59XG4gICAgICAgICAgYC50cmltKCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBoYXNQYXJhbXMgPSBwYXJhbXNXaXRob3V0Q29udGV4dC5sZW5ndGggPiAwO1xuICAgICAgICAgIGZ1bmN0aW9ucy5wdXNoKFxuICAgICAgICAgICAgYFxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uICR7bWV0aG9kTmFtZX0ke3R5cGVQYXJhbXNEZWZ9KCR7cGFyYW1zRGVmfSk6IFByb21pc2U8JHtyZXR1cm5UeXBlRGVmfT4ge1xuICByZXR1cm4gZmV0Y2goe1xuICAgIG1ldGhvZDogXCIke2FwaS5vcHRpb25zLmh0dHBNZXRob2R9XCIsXG4gICAgdXJsOiBcXGAke2FwaUJhc2VVcmx9XFxgLFxuICAgICR7aGFzUGFyYW1zID8gYGRhdGE6IHsgJHtwYXJhbU5hbWVzfSB9LGAgOiBcIlwifVxuICAgICR7YXBpLm9wdGlvbnMudGltZW91dCA/IGBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoJHthcGkub3B0aW9ucy50aW1lb3V0fSksYCA6IFwiXCJ9XG4gIH0pO1xufVxuICAgICAgICAgIGAudHJpbSgpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyLiBxdWVyeU9wdGlvbnMgKyB1c2VRdWVyeSAodGFuc3RhY2stcXVlcnkpXG4gICAgICAgIGlmIChjbGllbnRzLmluY2x1ZGVzKFwidGFuc3RhY2stcXVlcnlcIikpIHtcbiAgICAgICAgICBjb25zdCBob29rTmFtZSA9IGFwaS5vcHRpb25zLnJlc291cmNlTmFtZVxuICAgICAgICAgICAgPyBpbmZsZWN0aW9uLmNhbWVsaXplKGFwaS5vcHRpb25zLnJlc291cmNlTmFtZSwgdHJ1ZSlcbiAgICAgICAgICAgIDogaW5mbGVjdGlvbi5jYW1lbGl6ZShhcGkubWV0aG9kTmFtZSwgdHJ1ZSk7XG5cbiAgICAgICAgICAvLyBxdWVyeU9wdGlvbnNcbiAgICAgICAgICBmdW5jdGlvbnMucHVzaChcbiAgICAgICAgICAgIGBcbmV4cG9ydCBjb25zdCAke21ldGhvZE5hbWV9UXVlcnlPcHRpb25zID0gJHt0eXBlUGFyYW1zRGVmfSgke3BhcmFtc0RlZn0pID0+IHF1ZXJ5T3B0aW9ucyh7XG4gIHF1ZXJ5S2V5OiBbJyR7bW9kZWxOYW1lfScsICcke21ldGhvZE5hbWV9JyR7cGFyYW1OYW1lcyA/IGAsICR7cGFyYW1OYW1lc31gIDogXCJcIn1dLFxuICBxdWVyeUZuOiAoKSA9PiAke21ldGhvZE5hbWV9KCR7cGFyYW1OYW1lc30pXG59KTtcbiAgICAgICAgICBgLnRyaW0oKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gdXNlUXVlcnkgaG9vayAodXNlUmVmcmVzaGFibGXroZwg656Y7ZWR7ZW0IHJlZnJlc2gvaXNSZWZyZXNoaW5n7J2EIOq4sOuzuCDsoJzqs7UpXG4gICAgICAgICAgZnVuY3Rpb25zLnB1c2goXG4gICAgICAgICAgICBgXG5leHBvcnQgY29uc3QgdXNlJHtpbmZsZWN0aW9uLmNhbWVsaXplKGhvb2tOYW1lKX0gPSAke3R5cGVQYXJhbXNEZWZ9KCR7cGFyYW1zRGVmfSR7XG4gICAgICAgICAgICAgIHBhcmFtc0RlZiA/IFwiLCBcIiA6IFwiXCJcbiAgICAgICAgICAgIH1vcHRpb25zPzogeyBlbmFibGVkPzogYm9vbGVhbiB9KSA9PlxuICB1c2VSZWZyZXNoYWJsZSh1c2VRdWVyeSh7XG4gICAgLi4uJHttZXRob2ROYW1lfVF1ZXJ5T3B0aW9ucygke3BhcmFtTmFtZXN9KSxcbiAgICAuLi5vcHRpb25zXG4gIH0pKTtcbiAgICAgICAgICBgLnRyaW0oKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gaW5maW5pdGVRdWVyeU9wdGlvbnMgKyB1c2VJbmZpbml0ZVF1ZXJ5IChBc3luY0lkQ29uZmlnLnVzZUxpc3RJbmZpbml0ZSDrjIDsg4Eg7KGw6rG0KVxuICAgICAgICAgIC8vIOyhsOqxtDogcmVzb3VyY2VOYW1l7J20IOuzteyImO2YleydtOqzoCBtZXRob2ROYW1lID09PSBcImZpbmRNYW55XCJcbiAgICAgICAgICBjb25zdCByZXNvdXJjZU5hbWUgPSBhcGkub3B0aW9ucy5yZXNvdXJjZU5hbWU7XG4gICAgICAgICAgY29uc3QgaXNJbmZpbml0ZVRhcmdldCA9XG4gICAgICAgICAgICAhIXJlc291cmNlTmFtZSAmJlxuICAgICAgICAgICAgaW5mbGVjdGlvbi5wbHVyYWxpemUocmVzb3VyY2VOYW1lKSA9PT0gcmVzb3VyY2VOYW1lICYmXG4gICAgICAgICAgICBhcGkubWV0aG9kTmFtZSA9PT0gXCJmaW5kTWFueVwiO1xuXG4gICAgICAgICAgaWYgKGlzSW5maW5pdGVUYXJnZXQpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZmluaXRlTWV0aG9kTmFtZSA9IGAke21ldGhvZE5hbWV9SW5maW5pdGVgO1xuICAgICAgICAgICAgY29uc3QgaW5maW5pdGVIb29rTmFtZSA9IGB1c2Uke2luZmxlY3Rpb24uY2FtZWxpemUoaG9va05hbWUpfUluZmluaXRlYDtcblxuICAgICAgICAgICAgZnVuY3Rpb25zLnB1c2goXG4gICAgICAgICAgICAgIGBcbmV4cG9ydCBjb25zdCAke2luZmluaXRlTWV0aG9kTmFtZX1RdWVyeU9wdGlvbnMgPSAke3R5cGVQYXJhbXNEZWZ9KCR7cGFyYW1zRGVmfSkgPT4gaW5maW5pdGVRdWVyeU9wdGlvbnMoe1xuICBxdWVyeUtleTogWycke21vZGVsTmFtZX0nLCAnJHttZXRob2ROYW1lfScsICdpbmZpbml0ZScke3BhcmFtTmFtZXMgPyBgLCAke3BhcmFtTmFtZXN9YCA6IFwiXCJ9XSxcbiAgcXVlcnlGbjogKHsgcGFnZVBhcmFtIH0pID0+ICR7bWV0aG9kTmFtZX0oJHtcbiAgICBwYXJhbU5hbWVzID8gcGFyYW1OYW1lcy5yZXBsYWNlKC9cXGJyYXdQYXJhbXNcXGIvLCBcInsgLi4ucmF3UGFyYW1zLCBwYWdlOiBwYWdlUGFyYW0gfVwiKSA6IFwiXCJcbiAgfSksXG4gIGluaXRpYWxQYWdlUGFyYW06IDEgYXMgbnVtYmVyLFxuICBnZXROZXh0UGFnZVBhcmFtOiAobGFzdFBhZ2UsIGFsbFBhZ2VzKSA9PiB7XG4gICAgY29uc3QgdG90YWwgPSAobGFzdFBhZ2UgYXMgeyB0b3RhbD86IG51bWJlciB9KT8udG90YWwgPz8gMDtcbiAgICBjb25zdCBsb2FkZWQgPSBhbGxQYWdlcy5yZWR1Y2UoXG4gICAgICAoc3VtLCBwKSA9PiBzdW0gKyAoKHAgYXMgeyByb3dzPzogdW5rbm93bltdIH0pPy5yb3dzPy5sZW5ndGggPz8gMCksXG4gICAgICAwLFxuICAgICk7XG4gICAgcmV0dXJuIGxvYWRlZCA8IHRvdGFsID8gYWxsUGFnZXMubGVuZ3RoICsgMSA6IHVuZGVmaW5lZDtcbiAgfSxcbiAgc2VsZWN0OiBkZWR1cGVBbmRGbGF0dGVuLFxufSk7XG4gICAgICAgICAgYC50cmltKCksXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBmdW5jdGlvbnMucHVzaChcbiAgICAgICAgICAgICAgYFxuZXhwb3J0IGNvbnN0ICR7aW5maW5pdGVIb29rTmFtZX0gPSAke3R5cGVQYXJhbXNEZWZ9KCR7cGFyYW1zRGVmfSR7XG4gICAgICAgICAgICAgICAgcGFyYW1zRGVmID8gXCIsIFwiIDogXCJcIlxuICAgICAgICAgICAgICB9b3B0aW9ucz86IHsgZW5hYmxlZD86IGJvb2xlYW4gfSkgPT5cbiAgdXNlUmVmcmVzaGFibGUodXNlSW5maW5pdGVRdWVyeSh7XG4gICAgLi4uJHtpbmZpbml0ZU1ldGhvZE5hbWV9UXVlcnlPcHRpb25zKCR7cGFyYW1OYW1lc30pLFxuICAgIC4uLm9wdGlvbnNcbiAgfSkpO1xuICAgICAgICAgIGAudHJpbSgpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyAzLiB1c2VNdXRhdGlvbiAodGFuc3RhY2stbXV0YXRpb24pXG4gICAgICAgIGlmIChjbGllbnRzLmluY2x1ZGVzKFwidGFuc3RhY2stbXV0YXRpb25cIikpIHtcbiAgICAgICAgICBjb25zdCBob29rTmFtZSA9IGluZmxlY3Rpb24uY2FtZWxpemUoYXBpLm1ldGhvZE5hbWUpO1xuICAgICAgICAgIGNvbnN0IG11dGF0aW9uUGFyYW1UeXBlID1cbiAgICAgICAgICAgIHBhcmFtc1dpdGhvdXRDb250ZXh0Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgPyBgeyAke3BhcmFtc1dpdGhvdXRDb250ZXh0XG4gICAgICAgICAgICAgICAgICAubWFwKChwKSA9PiBgJHtwLm5hbWV9OiAke2FwaVBhcmFtVHlwZVRvVHNUeXBlKHAudHlwZSwgW10pfWApXG4gICAgICAgICAgICAgICAgICAuam9pbihcIiwgXCIpfSB9YFxuICAgICAgICAgICAgICA6IFwidm9pZFwiO1xuICAgICAgICAgIGNvbnN0IG11dGF0aW9uUGFyYW1OYW1lcyA9XG4gICAgICAgICAgICBwYXJhbXNXaXRob3V0Q29udGV4dC5sZW5ndGggPiAwXG4gICAgICAgICAgICAgID8gcGFyYW1zV2l0aG91dENvbnRleHQubWFwKChwKSA9PiBgcGFyYW1zLiR7cC5uYW1lfWApLmpvaW4oXCIsIFwiKVxuICAgICAgICAgICAgICA6IFwiXCI7XG5cbiAgICAgICAgICBmdW5jdGlvbnMucHVzaChcbiAgICAgICAgICAgIGBcbmV4cG9ydCBjb25zdCB1c2Uke2hvb2tOYW1lfU11dGF0aW9uID0gJHt0eXBlUGFyYW1zRGVmfSgpID0+IHVzZU11dGF0aW9uKHtcbiAgbXV0YXRpb25GbjogKHBhcmFtczogJHttdXRhdGlvblBhcmFtVHlwZX0pID0+ICR7bWV0aG9kTmFtZX0oJHttdXRhdGlvblBhcmFtTmFtZXN9KVxufSk7XG4gICAgICAgICAgYC50cmltKCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDQuIHVzZU11dGF0aW9uIHdpdGggbXVsdGlwYXJ0ICh0YW5zdGFjay1tdXRhdGlvbi1tdWx0aXBhcnQpXG4gICAgICAgIGlmIChjbGllbnRzLmluY2x1ZGVzKFwidGFuc3RhY2stbXV0YXRpb24tbXVsdGlwYXJ0XCIpKSB7XG4gICAgICAgICAgY29uc3QgaG9va05hbWUgPSBpbmZsZWN0aW9uLmNhbWVsaXplKGFwaS5tZXRob2ROYW1lKTtcblxuICAgICAgICAgIC8vIO2MjOudvOuvuO2EsCDtg4DsnoUg7KCV7J2YOiBwYXJhbXNEZWbsl5DshJwg7YOA7J6F66eMIOy2lOy2nFxuICAgICAgICAgIC8vIHBhcmFtc0RlZiDsmIg6IFwicGFyYW1zOiB7IGNhdGVnb3J5OiBzdHJpbmcgfVwiIOKGkiBcInsgY2F0ZWdvcnk6IHN0cmluZyB9XCJcbiAgICAgICAgICBjb25zdCBwYXJhbXNUeXBlRGVmID1cbiAgICAgICAgICAgIHBhcmFtc1dpdGhvdXRDb250ZXh0Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgPyBwYXJhbXNEZWYuc3BsaXQoXCI6XCIpLnNsaWNlKDEpLmpvaW4oXCI6XCIpLnRyaW0oKSAvLyBcInBhcmFtczogeyBjYXRlZ29yeTogc3RyaW5nIH1cIiDihpIgXCJ7IGNhdGVnb3J5OiBzdHJpbmcgfVwiXG4gICAgICAgICAgICAgIDogXCJcIjtcblxuICAgICAgICAgIGNvbnN0IG11dGF0aW9uUGFyYW1UeXBlID1cbiAgICAgICAgICAgIHBhcmFtc1dpdGhvdXRDb250ZXh0Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgPyBgeyBwYXJhbXM6ICR7cGFyYW1zVHlwZURlZn0sIGZpbGVzOiBGaWxlW10gfWBcbiAgICAgICAgICAgICAgOiBgeyBmaWxlczogRmlsZVtdIH1gO1xuXG4gICAgICAgICAgLy8gbXV0YXRpb25GbiDtmLjstpwg7YyM652866+47YSwXG4gICAgICAgICAgY29uc3QgbXV0YXRpb25GbkNhbGwgPVxuICAgICAgICAgICAgcGFyYW1zV2l0aG91dENvbnRleHQubGVuZ3RoID4gMFxuICAgICAgICAgICAgICA/IGAke21ldGhvZE5hbWV9KHBhcmFtcy5wYXJhbXMsIHBhcmFtcy5maWxlcylgXG4gICAgICAgICAgICAgIDogYCR7bWV0aG9kTmFtZX0ocGFyYW1zLmZpbGVzKWA7XG5cbiAgICAgICAgICBmdW5jdGlvbnMucHVzaChcbiAgICAgICAgICAgIGBcbmV4cG9ydCBjb25zdCB1c2Uke2hvb2tOYW1lfU11dGF0aW9uID0gJHt0eXBlUGFyYW1zRGVmfShcbiAgb3B0aW9ucz86IFVzZU11dGF0aW9uT3B0aW9uczwke3JldHVyblR5cGVEZWZ9LCBFcnJvciwgJHttdXRhdGlvblBhcmFtVHlwZX0+ICYge1xuICAgIG9uVXBsb2FkUHJvZ3Jlc3M/OiAoZTogQXhpb3NQcm9ncmVzc0V2ZW50KSA9PiB2b2lkO1xuICB9XG4pID0+IHVzZU11dGF0aW9uKHtcbiAgbXV0YXRpb25GbjogKHBhcmFtczogJHttdXRhdGlvblBhcmFtVHlwZX0pID0+ICR7bXV0YXRpb25GbkNhbGx9LFxuICByZXRyeTogZmFsc2UsXG4gIC4uLm9wdGlvbnMsXG59KTtcbiAgICAgICAgICBgLnRyaW0oKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG5hbWVzcGFjZXMucHVzaChcbiAgICAgICAgYFxuZXhwb3J0IG5hbWVzcGFjZSAke21vZGVsTmFtZX1TZXJ2aWNlIHtcbiR7ZnVuY3Rpb25zLmpvaW4oXCJcXG5cXG5cIil9XG59XG4gICAgICBgLnRyaW0oKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQXN5bmNJZENvbmZpZyDsg53shLEgKEVudGl0eeuzhOuhnClcbiAgICBjb25zdCBlbnRpdHlJZHMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuICAgIGNvbnN0IGFzeW5jSWRDb25maWdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBlbnRpdHlJZCBvZiBlbnRpdHlJZHMpIHtcbiAgICAgIGNvbnN0IG5hbWVzID0gRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChlbnRpdHlJZCk7XG5cbiAgICAgIC8vIEFzeW5jSWRDb25maWfsmqkg66as7Iqk7Yq4IOyhsO2ajCBBUEkg7LC+6riwXG4gICAgICBjb25zdCBsaXN0QXBpID0gYXBpc0J5TW9kZWwuZ2V0KG5hbWVzLmNhcGl0YWwpPy5maW5kKChhcGkpID0+IHtcbiAgICAgICAgLy8gcmVzb3VyY2VOYW1l7J20IOyXhuqxsOuCmCB0YW5zdGFjay1xdWVyeeulvCDsgqzsmqntlZjsp4Ag7JWK64qUIEFQSeuKlCDsoJzsmbhcbiAgICAgICAgaWYgKCFhcGkub3B0aW9ucy5yZXNvdXJjZU5hbWUgfHwgIWFwaS5vcHRpb25zLmNsaWVudHM/LmluY2x1ZGVzKFwidGFuc3RhY2stcXVlcnlcIikpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVzb3VyY2VOYW1l7J20IOuzteyImO2YleydtOqzoCDrqZTshJzrk5zrqoXsnbQgZmluZE1hbnnsnbggQVBJXG4gICAgICAgIGNvbnN0IHJlc291cmNlTmFtZSA9IGFwaS5vcHRpb25zLnJlc291cmNlTmFtZTtcbiAgICAgICAgcmV0dXJuIGluZmxlY3Rpb24ucGx1cmFsaXplKHJlc291cmNlTmFtZSkgPT09IHJlc291cmNlTmFtZSAmJiBhcGkubWV0aG9kTmFtZSA9PT0gXCJmaW5kTWFueVwiO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChsaXN0QXBpKSB7XG4gICAgICAgIC8vIHJlc291cmNlTmFtZeyXkOyEnCBob29rIOydtOumhCDsg53shLEgKOq4sOyhtCDroZzsp4Hqs7wg64+Z7J28KVxuICAgICAgICBjb25zdCBob29rTmFtZSA9IGluZmxlY3Rpb24uY2FtZWxpemUoYXNzZXJ0RGVmaW5lZChsaXN0QXBpLm9wdGlvbnMucmVzb3VyY2VOYW1lKSwgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IHVzZUhvb2tOYW1lID0gYHVzZSR7aW5mbGVjdGlvbi5jYW1lbGl6ZShob29rTmFtZSl9YDtcbiAgICAgICAgY29uc3QgdXNlSG9va0luZmluaXRlTmFtZSA9IGAke3VzZUhvb2tOYW1lfUluZmluaXRlYDtcblxuICAgICAgICAvLyBMaXN0UGFyYW1zIO2DgOyeheuqhSDqtazshLFcbiAgICAgICAgY29uc3QgbGlzdFBhcmFtc1R5cGUgPSBgJHtuYW1lcy5jYXBpdGFsfUxpc3RQYXJhbXNgO1xuXG4gICAgICAgIGFzeW5jSWRDb25maWdzLnB1c2goXG4gICAgICAgICAgYFxuLy8gQXN5bmNJZENvbmZpZzogJHtuYW1lcy5jYXBpdGFsfVxuZXhwb3J0IGNvbnN0ICR7bmFtZXMuY2FwaXRhbH1Bc3luY0lkQ29uZmlnOiBBc3luY0lkQ29uZmlnPCR7bmFtZXMuY2FwaXRhbH1TdWJzZXRLZXksICR7bmFtZXMuY2FwaXRhbH1TdWJzZXRNYXBwaW5nLCAke2xpc3RQYXJhbXNUeXBlfT4gPSB7XG4gIHBsYWNlaG9sZGVyS2V5OiBcImVudGl0eS4ke25hbWVzLmNhcGl0YWx9XCIsXG4gIHVzZUxpc3Q6ICR7bmFtZXMuY2FwaXRhbH1TZXJ2aWNlLiR7dXNlSG9va05hbWV9LFxuICB1c2VMaXN0SW5maW5pdGU6ICR7bmFtZXMuY2FwaXRhbH1TZXJ2aWNlLiR7dXNlSG9va0luZmluaXRlTmFtZX0sXG59O1xuICAgICAgICAgIGAudHJpbSgpLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEJVSUxUX0lOX1RZUEVT7JeQ7IScIOyCrOyaqeuQmOuKlCDtg4DsnoXrk6TsnYQg7ZmV7J247ZWY7JesIOuPmeyggeycvOuhnCBpbXBvcnQg6rWs7ISxXG4gICAgY29uc3QgYnVpbHRJblR5cGVJbXBvcnRzID0gT2JqZWN0LmtleXMoQlVJTFRfSU5fVFlQRVMpXG4gICAgICAuZmlsdGVyKCh0eXBlS2V5KSA9PiBpbXBvcnRLZXlzLmluY2x1ZGVzKHR5cGVLZXkpKVxuICAgICAgLm1hcCgodHlwZUtleSkgPT4gYHR5cGUgJHt0eXBlS2V5fWApO1xuXG4gICAgLy8gc29uYW11LnNoYXJlZOyXkOyEnCBpbXBvcnTtlaAg7ZWt66qp65Ok7J2EIOuPmeyggeycvOuhnCDqtazshLFcbiAgICAvLyBib2R5IOusuOyekOyXtOydhCDquLDspIDsnLzroZwgaW5maW5pdGUg7ZuFIOyDneyEsSDsl6zrtoAg7YyQ64uoIChmaW5kTWFueSDrs7XsiJjtmJUg67aE6riw7JeQ7ISc66eMIOywuOyhsOuQqClcbiAgICBjb25zdCBib2R5Rm9ySW1wb3J0Q2hlY2sgPSBuYW1lc3BhY2VzLmpvaW4oXCJcXG5cXG5cIik7XG4gICAgY29uc3QgbmVlZHNEZWR1cGVBbmRGbGF0dGVuID0gYm9keUZvckltcG9ydENoZWNrLmluY2x1ZGVzKFwiZGVkdXBlQW5kRmxhdHRlblwiKTtcbiAgICBjb25zdCBuZWVkc1VzZVJlZnJlc2hhYmxlID0gYm9keUZvckltcG9ydENoZWNrLmluY2x1ZGVzKFwidXNlUmVmcmVzaGFibGVcIik7XG5cbiAgICBjb25zdCBzb25hbXVTaGFyZWRJbXBvcnRzID0gW1xuICAgICAgXCJ0eXBlIExpc3RSZXN1bHRcIixcbiAgICAgIFwidHlwZSBGaWx0ZXJRdWVyeVwiLFxuICAgICAgLi4uYnVpbHRJblR5cGVJbXBvcnRzLFxuICAgICAgXCJmZXRjaFwiLFxuICAgICAgXCJ0eXBlIEV2ZW50SGFuZGxlcnNcIixcbiAgICAgIFwidHlwZSBTU0VTdHJlYW1PcHRpb25zXCIsXG4gICAgICBcInR5cGUgV2ViU29ja2V0Q2hhbm5lbE9wdGlvbnNcIixcbiAgICAgIFwidXNlU1NFU3RyZWFtXCIsXG4gICAgICBcInVzZVdlYlNvY2tldENoYW5uZWxcIixcbiAgICAgIFwidG9Gb3JtRGF0YVwiLFxuICAgICAgLi4uKG5lZWRzRGVkdXBlQW5kRmxhdHRlbiA/IFtcImRlZHVwZUFuZEZsYXR0ZW5cIl0gOiBbXSksXG4gICAgICAuLi4obmVlZHNVc2VSZWZyZXNoYWJsZSA/IFtcInVzZVJlZnJlc2hhYmxlXCJdIDogW10pLFxuICAgIF0uam9pbihcIiwgXCIpO1xuXG4gICAgLy8gYm9keSDqtazshLE6IG5hbWVzcGFjZXMgKyBhc3luY0lkQ29uZmlnc1xuICAgIGNvbnN0IGJvZHlQYXJ0cyA9IFsuLi5uYW1lc3BhY2VzLCAuLi5hc3luY0lkQ29uZmlnc107XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5nZXRUYXJnZXRBbmRQYXRoKCksXG4gICAgICBib2R5OiBib2R5UGFydHMuam9pbihcIlxcblxcblwiKSxcbiAgICAgIGltcG9ydEtleXM6IGRpZmYodW5pcXVlKGltcG9ydEtleXMpLCBbXG4gICAgICAgIC4uLnR5cGVQYXJhbU5hbWVzLFxuICAgICAgICBcIkxpc3RSZXN1bHRcIixcbiAgICAgICAgLi4uT2JqZWN0LmtleXMoQlVJTFRfSU5fVFlQRVMpLFxuICAgICAgXSksXG4gICAgICBjdXN0b21IZWFkZXJzOiBbXG4gICAgICAgIFwiLyoqXCIsXG4gICAgICAgIFwiICogQGdlbmVyYXRlZFwiLFxuICAgICAgICBcIiAqIOyngeygkSDsiJjsoJXtlZjsp4Ag66eI7IS47JqULlwiLFxuICAgICAgICBcIiAqL1wiLFxuICAgICAgICBcIlwiLFxuICAgICAgICBcIi8qIG94bGludC1kaXNhYmxlICovXCIsXG4gICAgICAgIFwiXCIsXG4gICAgICAgIGBpbXBvcnQgeyBxdWVyeU9wdGlvbnMsIHVzZVF1ZXJ5LCB1c2VJbmZpbml0ZVF1ZXJ5LCBpbmZpbml0ZVF1ZXJ5T3B0aW9ucywgdXNlTXV0YXRpb24sIHR5cGUgVXNlTXV0YXRpb25PcHRpb25zIH0gZnJvbSAnQHRhbnN0YWNrL3JlYWN0LXF1ZXJ5JztgLFxuICAgICAgICBgaW1wb3J0IHsgdHlwZSBBeGlvc1Byb2dyZXNzRXZlbnQgfSBmcm9tICdheGlvcyc7YCxcbiAgICAgICAgYGltcG9ydCBxcyBmcm9tICdxcyc7YCxcbiAgICAgICAgYGltcG9ydCB7ICR7c29uYW11U2hhcmVkSW1wb3J0c30gfSBmcm9tICcuL3NvbmFtdS5zaGFyZWQnO2AsXG4gICAgICAgIGBpbXBvcnQgeyB0eXBlIEFzeW5jSWRDb25maWcgfSBmcm9tICdAc29uYW11LWtpdC9yZWFjdC1jb21wb25lbnRzL2NvbXBvbmVudHMnO2AsXG4gICAgICBdLFxuICAgIH07XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztxQkFPa0M7WUFFTztvQkFDa0I7V0FFWDtXQUNDO2NBQ1g7bUJBQytCO0FBRXJFLElBQWEscUJBQWIsY0FBd0MsU0FBUztDQUMvQyxjQUFjO0VBQ1osTUFBTSxVQUFVO0NBQ2xCO0NBRUEsbUJBQW1CO0VBQ2pCLE9BQU87R0FDTCxRQUFRO0dBQ1IsTUFBTTtFQUNSO0NBQ0Y7Q0FFQSxPQUFPLElBQWlDO0VBQ3RDLE1BQU0sRUFBRSxTQUFTLE9BQU87RUFHeEIsTUFBTSw4QkFBYyxJQUFJLElBQTJCO0VBQ25ELEtBQUssTUFBTSxPQUFPLE1BQU07R0FDdEIsTUFBTSxZQUFZLElBQUksVUFBVSxRQUFRLFVBQVUsRUFBRSxDQUFDLENBQUMsUUFBUSxVQUFVLEVBQUU7R0FDMUUsSUFBSSxDQUFDLFlBQVksSUFBSSxTQUFTLEdBQzVCLFlBQVksSUFBSSxXQUFXLENBQUMsQ0FBQztHQUUvQixZQUFZLElBQUksU0FBUyxDQUFDLEVBQUUsS0FBSyxHQUFHO0VBQ3RDO0VBRUEsTUFBTSxhQUF1QixDQUFDO0VBQzlCLE1BQU0sYUFB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
|