sonamu 0.8.26 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/cli.js +60 -13
- package/dist/_virtual/rolldown_runtime.js +39 -0
- package/dist/ai/agents/agent.d.ts +3 -3
- package/dist/ai/agents/agent.d.ts.map +1 -1
- package/dist/ai/agents/agent.js +76 -73
- package/dist/ai/agents/index.js +3 -3
- package/dist/ai/agents/types.d.ts +3 -3
- package/dist/ai/agents/types.d.ts.map +1 -1
- package/dist/ai/agents/types.js +1 -3
- package/dist/ai/index.js +3 -2
- package/dist/ai/providers/rtzr/api.js +25 -25
- package/dist/ai/providers/rtzr/error.js +25 -26
- package/dist/ai/providers/rtzr/index.js +5 -5
- package/dist/ai/providers/rtzr/model.d.ts +1 -1
- package/dist/ai/providers/rtzr/model.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/model.js +117 -133
- package/dist/ai/providers/rtzr/options.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/options.js +35 -41
- package/dist/ai/providers/rtzr/provider.d.ts +1 -1
- package/dist/ai/providers/rtzr/provider.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/provider.js +53 -51
- package/dist/ai/providers/rtzr/utils.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/utils.js +84 -84
- package/dist/api/base-frame.d.ts +2 -2
- package/dist/api/base-frame.d.ts.map +1 -1
- package/dist/api/base-frame.js +29 -19
- package/dist/api/caster.d.ts +1 -1
- package/dist/api/caster.d.ts.map +1 -1
- package/dist/api/caster.js +51 -61
- package/dist/api/code-converters.d.ts +4 -3
- package/dist/api/code-converters.d.ts.map +1 -1
- package/dist/api/code-converters.js +226 -249
- package/dist/api/config.d.ts +17 -17
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +37 -30
- package/dist/api/context.d.ts +10 -10
- package/dist/api/context.d.ts.map +1 -1
- package/dist/api/context.js +8 -2
- package/dist/api/decorators.d.ts +8 -8
- package/dist/api/decorators.d.ts.map +1 -1
- package/dist/api/decorators.js +245 -268
- package/dist/api/index.js +39 -7
- package/dist/api/secret.js +22 -15
- package/dist/api/sonamu.d.ts +15 -15
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +1012 -1131
- package/dist/api/validator.js +88 -79
- package/dist/auth/auth-generator.d.ts.map +1 -1
- package/dist/auth/auth-generator.js +203 -200
- package/dist/auth/better-auth-entities.d.ts +2 -2
- package/dist/auth/better-auth-entities.d.ts.map +1 -1
- package/dist/auth/better-auth-entities.js +369 -429
- package/dist/auth/index.js +21 -6
- package/dist/auth/knex-adapter.d.ts +2 -2
- package/dist/auth/knex-adapter.d.ts.map +1 -1
- package/dist/auth/knex-adapter.js +153 -157
- package/dist/auth/plugins/entity-definitions/admin.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/admin.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/admin.js +58 -56
- package/dist/auth/plugins/entity-definitions/anonymous.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/anonymous.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/anonymous.js +20 -20
- package/dist/auth/plugins/entity-definitions/api-key.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/api-key.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/api-key.js +185 -196
- package/dist/auth/plugins/entity-definitions/index.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/index.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/index.js +26 -29
- package/dist/auth/plugins/entity-definitions/jwt.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/jwt.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/jwt.js +62 -64
- package/dist/auth/plugins/entity-definitions/organization.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/organization.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/organization.js +362 -421
- package/dist/auth/plugins/entity-definitions/passkey.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/passkey.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/passkey.js +115 -126
- package/dist/auth/plugins/entity-definitions/phone-number.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/phone-number.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/phone-number.js +31 -40
- package/dist/auth/plugins/entity-definitions/sso.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/sso.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/sso.js +94 -107
- package/dist/auth/plugins/entity-definitions/two-factor.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/two-factor.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/two-factor.js +78 -92
- package/dist/auth/plugins/entity-definitions/types.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/types.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/types.js +1 -10
- package/dist/auth/plugins/entity-definitions/username.d.ts +1 -1
- package/dist/auth/plugins/entity-definitions/username.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/username.js +31 -40
- package/dist/auth/plugins/index.js +12 -3
- package/dist/auth/plugins/wrappers/admin.d.ts +2 -2
- package/dist/auth/plugins/wrappers/admin.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/admin.js +28 -29
- package/dist/auth/plugins/wrappers/anonymous.d.ts +2 -1
- package/dist/auth/plugins/wrappers/anonymous.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/anonymous.js +23 -22
- package/dist/auth/plugins/wrappers/api-key.d.ts +2 -1
- package/dist/auth/plugins/wrappers/api-key.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/api-key.js +39 -34
- package/dist/auth/plugins/wrappers/index.js +11 -11
- package/dist/auth/plugins/wrappers/jwt.d.ts +2 -1
- package/dist/auth/plugins/wrappers/jwt.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/jwt.js +31 -26
- package/dist/auth/plugins/wrappers/organization.d.ts +2 -1
- package/dist/auth/plugins/wrappers/organization.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/organization.js +65 -62
- package/dist/auth/plugins/wrappers/passkey.d.ts +2 -1
- package/dist/auth/plugins/wrappers/passkey.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/passkey.js +33 -28
- package/dist/auth/plugins/wrappers/phone-number.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/phone-number.js +26 -23
- package/dist/auth/plugins/wrappers/sso.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/sso.js +37 -31
- package/dist/auth/plugins/wrappers/two-factor.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/two-factor.js +31 -28
- package/dist/auth/plugins/wrappers/username.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/username.js +23 -23
- package/dist/bin/build-config.js +31 -31
- package/dist/bin/cli.js +1063 -1204
- package/dist/bin/fixture.d.ts.map +1 -1
- package/dist/bin/fixture.js +266 -259
- package/dist/bin/hmr-hook-register.d.ts.map +1 -1
- package/dist/bin/hmr-hook-register.js +19 -18
- package/dist/bin/test-command.d.ts.map +1 -1
- package/dist/bin/test-command.js +180 -177
- package/dist/bin/ts-loader-register.js +13 -6
- package/dist/bin/ts-loader-registration.d.ts.map +1 -1
- package/dist/bin/ts-loader-registration.js +28 -38
- package/dist/cache/cache-manager.d.ts +1 -1
- package/dist/cache/cache-manager.d.ts.map +1 -1
- package/dist/cache/cache-manager.js +20 -15
- package/dist/cache/decorator.d.ts +1 -1
- package/dist/cache/decorator.d.ts.map +1 -1
- package/dist/cache/decorator.js +84 -76
- package/dist/cache/drivers.js +21 -34
- package/dist/cache/index.js +10 -7
- package/dist/cache/types.d.ts +2 -2
- package/dist/cache/types.d.ts.map +1 -1
- package/dist/cache/types.js +1 -6
- package/dist/cache-control/cache-control.d.ts +2 -2
- package/dist/cache-control/cache-control.d.ts.map +1 -1
- package/dist/cache-control/cache-control.js +106 -122
- package/dist/cache-control/types.d.ts +2 -2
- package/dist/cache-control/types.d.ts.map +1 -1
- package/dist/cache-control/types.js +1 -19
- package/dist/compress/compress.d.ts +1 -1
- package/dist/compress/compress.d.ts.map +1 -1
- package/dist/compress/compress.js +58 -56
- package/dist/compress/index.js +7 -2
- package/dist/compress/types.js +1 -11
- package/dist/cone/cone-generator.d.ts +1 -1
- package/dist/cone/cone-generator.d.ts.map +1 -1
- package/dist/cone/cone-generator.js +216 -219
- package/dist/database/_batch_update.d.ts +1 -1
- package/dist/database/_batch_update.d.ts.map +1 -1
- package/dist/database/_batch_update.js +107 -102
- package/dist/database/base-model.d.ts +8 -9
- package/dist/database/base-model.d.ts.map +1 -1
- package/dist/database/base-model.js +371 -392
- package/dist/database/base-model.types.d.ts +5 -5
- package/dist/database/base-model.types.d.ts.map +1 -1
- package/dist/database/base-model.types.js +1 -20
- package/dist/database/db.d.ts +5 -2
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +185 -171
- package/dist/database/knex.d.ts +1 -1
- package/dist/database/knex.d.ts.map +1 -1
- package/dist/database/knex.js +48 -42
- package/dist/database/puri-subset.types.d.ts +6 -7
- package/dist/database/puri-subset.types.d.ts.map +1 -1
- package/dist/database/puri-subset.types.js +1 -16
- package/dist/database/puri-wrapper.d.ts +6 -6
- package/dist/database/puri-wrapper.d.ts.map +1 -1
- package/dist/database/puri-wrapper.js +99 -101
- package/dist/database/puri.d.ts +4 -5
- package/dist/database/puri.d.ts.map +1 -1
- package/dist/database/puri.js +1021 -1227
- package/dist/database/puri.types.d.ts +6 -6
- package/dist/database/puri.types.d.ts.map +1 -1
- package/dist/database/puri.types.js +15 -6
- package/dist/database/transaction-context.d.ts +2 -2
- package/dist/database/transaction-context.d.ts.map +1 -1
- package/dist/database/transaction-context.js +22 -13
- package/dist/database/upsert-builder.d.ts +3 -3
- package/dist/database/upsert-builder.d.ts.map +1 -1
- package/dist/database/upsert-builder.js +405 -465
- package/dist/dict/en.js +72 -74
- package/dist/dict/index.js +13 -13
- package/dist/dict/ko.js +72 -74
- package/dist/dict/rc-keys.js +150 -168
- package/dist/dict/sd.d.ts +3 -1
- package/dist/dict/sd.d.ts.map +1 -1
- package/dist/dict/sd.js +54 -40
- package/dist/dict/sonamu-dictionary.d.ts +1 -1
- package/dist/dict/sonamu-dictionary.d.ts.map +1 -1
- package/dist/dict/sonamu-dictionary.js +887 -955
- package/dist/dict/types.js +1 -7
- package/dist/dict/utils.js +26 -24
- package/dist/entity/entity-manager.d.ts +9 -9
- package/dist/entity/entity-manager.d.ts.map +1 -1
- package/dist/entity/entity-manager.js +226 -223
- package/dist/entity/entity-template-cone.d.ts +1 -1
- package/dist/entity/entity-template-cone.d.ts.map +1 -1
- package/dist/entity/entity-template-cone.js +152 -151
- package/dist/entity/entity.d.ts.map +1 -1
- package/dist/entity/entity.js +952 -1089
- package/dist/exceptions/error-handler.d.ts +1 -1
- package/dist/exceptions/error-handler.d.ts.map +1 -1
- package/dist/exceptions/error-handler.js +32 -27
- package/dist/exceptions/so-exceptions.d.ts +1 -1
- package/dist/exceptions/so-exceptions.d.ts.map +1 -1
- package/dist/exceptions/so-exceptions.js +61 -68
- package/dist/filter/index.js +9 -3
- package/dist/filter/types.js +92 -88
- package/dist/filter/utils.d.ts +1 -1
- package/dist/filter/utils.d.ts.map +1 -1
- package/dist/filter/utils.js +147 -161
- package/dist/index.js +87 -40
- package/dist/logger/category.d.ts.map +1 -1
- package/dist/logger/category.js +30 -29
- package/dist/logger/configure.d.ts.map +1 -1
- package/dist/logger/configure.js +83 -107
- package/dist/migration/code-generation.d.ts +2 -2
- package/dist/migration/code-generation.d.ts.map +1 -1
- package/dist/migration/code-generation.js +1385 -1578
- package/dist/migration/migration-set.d.ts +1 -1
- package/dist/migration/migration-set.d.ts.map +1 -1
- package/dist/migration/migration-set.js +177 -227
- package/dist/migration/migrator.d.ts +4 -3
- package/dist/migration/migrator.d.ts.map +1 -1
- package/dist/migration/migrator.js +340 -345
- package/dist/migration/postgresql-schema-reader.d.ts +2 -2
- package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
- package/dist/migration/postgresql-schema-reader.js +506 -564
- package/dist/migration/slack-confirm.d.ts +2 -2
- package/dist/migration/slack-confirm.d.ts.map +1 -1
- package/dist/migration/slack-confirm.js +205 -193
- package/dist/migration/types.d.ts +2 -2
- package/dist/migration/types.d.ts.map +1 -1
- package/dist/migration/types.js +1 -3
- package/dist/naite/messaging-types.d.ts +1 -0
- package/dist/naite/messaging-types.d.ts.map +1 -1
- package/dist/naite/messaging-types.js +1 -7
- package/dist/naite/naite-reporter.d.ts +2 -2
- package/dist/naite/naite-reporter.d.ts.map +1 -1
- package/dist/naite/naite-reporter.js +127 -120
- package/dist/naite/naite.d.ts +3 -2
- package/dist/naite/naite.d.ts.map +1 -1
- package/dist/naite/naite.js +266 -300
- package/dist/ssr/index.d.ts +2 -2
- package/dist/ssr/index.d.ts.map +1 -1
- package/dist/ssr/index.js +13 -3
- package/dist/ssr/registry.d.ts +1 -1
- package/dist/ssr/registry.d.ts.map +1 -1
- package/dist/ssr/registry.js +45 -37
- package/dist/ssr/renderer.d.ts +4 -4
- package/dist/ssr/renderer.d.ts.map +1 -1
- package/dist/ssr/renderer.js +84 -91
- package/dist/ssr/types.d.ts +2 -2
- package/dist/ssr/types.d.ts.map +1 -1
- package/dist/ssr/types.js +1 -3
- package/dist/storage/base-file.js +54 -41
- package/dist/storage/buffered-file.d.ts +2 -2
- package/dist/storage/buffered-file.d.ts.map +1 -1
- package/dist/storage/buffered-file.js +51 -44
- package/dist/storage/drivers.d.ts +2 -2
- package/dist/storage/drivers.d.ts.map +1 -1
- package/dist/storage/drivers.js +12 -7
- package/dist/storage/index.js +14 -7
- package/dist/storage/s3-driver.d.ts +2 -2
- package/dist/storage/s3-driver.d.ts.map +1 -1
- package/dist/storage/s3-driver.js +52 -48
- package/dist/storage/storage-manager.d.ts +2 -2
- package/dist/storage/storage-manager.d.ts.map +1 -1
- package/dist/storage/storage-manager.js +33 -25
- package/dist/storage/types.d.ts +2 -2
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/storage/types.js +1 -5
- package/dist/storage/uploaded-file.d.ts +1 -1
- package/dist/storage/uploaded-file.d.ts.map +1 -1
- package/dist/storage/uploaded-file.js +45 -35
- package/dist/stream/index.js +7 -2
- package/dist/stream/sse.d.ts +2 -2
- package/dist/stream/sse.d.ts.map +1 -1
- package/dist/stream/sse.js +72 -67
- package/dist/syncer/api-parser.d.ts +1 -1
- package/dist/syncer/api-parser.d.ts.map +1 -1
- package/dist/syncer/api-parser.js +224 -245
- package/dist/syncer/checksum.d.ts +1 -1
- package/dist/syncer/checksum.d.ts.map +1 -1
- package/dist/syncer/checksum.js +86 -72
- package/dist/syncer/code-generator.d.ts +2 -2
- package/dist/syncer/code-generator.d.ts.map +1 -1
- package/dist/syncer/code-generator.js +154 -160
- package/dist/syncer/entity-operations.d.ts +1 -1
- package/dist/syncer/entity-operations.d.ts.map +1 -1
- package/dist/syncer/entity-operations.js +63 -54
- package/dist/syncer/file-patterns.d.ts +1 -1
- package/dist/syncer/file-patterns.d.ts.map +1 -1
- package/dist/syncer/file-patterns.js +38 -38
- package/dist/syncer/index.js +19 -8
- package/dist/syncer/module-loader.d.ts +5 -5
- package/dist/syncer/module-loader.d.ts.map +1 -1
- package/dist/syncer/module-loader.js +83 -78
- package/dist/syncer/syncer-actions.d.ts +2 -2
- package/dist/syncer/syncer-actions.d.ts.map +1 -1
- package/dist/syncer/syncer-actions.js +76 -91
- package/dist/syncer/syncer.d.ts +7 -6
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +426 -492
- package/dist/tasks/decorator.d.ts +3 -3
- package/dist/tasks/decorator.d.ts.map +1 -1
- package/dist/tasks/decorator.js +32 -28
- package/dist/tasks/step-wrapper.d.ts +1 -1
- package/dist/tasks/step-wrapper.d.ts.map +1 -1
- package/dist/tasks/step-wrapper.js +42 -41
- package/dist/tasks/workflow-manager.d.ts +2 -2
- package/dist/tasks/workflow-manager.d.ts.map +1 -1
- package/dist/tasks/workflow-manager.js +192 -221
- package/dist/template/entity-converter.d.ts +1 -1
- package/dist/template/entity-converter.d.ts.map +1 -1
- package/dist/template/entity-converter.js +103 -103
- package/dist/template/helpers.d.ts.map +1 -1
- package/dist/template/helpers.js +163 -163
- package/dist/template/implementations/entity.template.d.ts +1 -1
- package/dist/template/implementations/entity.template.d.ts.map +1 -1
- package/dist/template/implementations/entity.template.js +76 -85
- package/dist/template/implementations/entry-server.template.d.ts +1 -1
- package/dist/template/implementations/entry-server.template.d.ts.map +1 -1
- package/dist/template/implementations/entry-server.template.js +32 -27
- package/dist/template/implementations/generated.template.d.ts +1 -1
- package/dist/template/implementations/generated.template.d.ts.map +1 -1
- package/dist/template/implementations/generated.template.js +254 -275
- package/dist/template/implementations/generated_http.template.d.ts +2 -2
- package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
- package/dist/template/implementations/generated_http.template.js +114 -133
- package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
- package/dist/template/implementations/generated_sso.template.js +249 -275
- package/dist/template/implementations/init_types.template.d.ts +1 -1
- package/dist/template/implementations/init_types.template.d.ts.map +1 -1
- package/dist/template/implementations/init_types.template.js +40 -34
- package/dist/template/implementations/model.template.d.ts +1 -1
- package/dist/template/implementations/model.template.d.ts.map +1 -1
- package/dist/template/implementations/model.template.js +56 -53
- package/dist/template/implementations/model_test.template.d.ts +1 -1
- package/dist/template/implementations/model_test.template.d.ts.map +1 -1
- package/dist/template/implementations/model_test.template.js +32 -24
- package/dist/template/implementations/queries.template.d.ts +1 -1
- package/dist/template/implementations/queries.template.d.ts.map +1 -1
- package/dist/template/implementations/queries.template.js +84 -89
- package/dist/template/implementations/sd.template.d.ts +1 -1
- package/dist/template/implementations/sd.template.d.ts.map +1 -1
- package/dist/template/implementations/sd.template.js +137 -144
- package/dist/template/implementations/services.template.d.ts +1 -1
- package/dist/template/implementations/services.template.d.ts.map +1 -1
- package/dist/template/implementations/services.template.js +164 -189
- package/dist/template/implementations/view_form.template.d.ts +1 -1
- package/dist/template/implementations/view_form.template.d.ts.map +1 -1
- package/dist/template/implementations/view_form.template.js +258 -285
- package/dist/template/implementations/view_id_all_select.template.d.ts +1 -1
- package/dist/template/implementations/view_id_all_select.template.d.ts.map +1 -1
- package/dist/template/implementations/view_id_all_select.template.js +31 -25
- package/dist/template/implementations/view_list.template.d.ts +1 -1
- package/dist/template/implementations/view_list.template.d.ts.map +1 -1
- package/dist/template/implementations/view_list.template.js +304 -355
- package/dist/template/implementations/view_search_input.template.d.ts +1 -1
- package/dist/template/implementations/view_search_input.template.d.ts.map +1 -1
- package/dist/template/implementations/view_search_input.template.js +31 -27
- package/dist/template/index.js +21 -7
- package/dist/template/template-manager.d.ts +1 -1
- package/dist/template/template-manager.d.ts.map +1 -1
- package/dist/template/template-manager.js +132 -123
- package/dist/template/template-types.js +8 -6
- package/dist/template/template.d.ts +2 -2
- package/dist/template/template.d.ts.map +1 -1
- package/dist/template/template.js +73 -68
- package/dist/template/zod-converter.d.ts.map +1 -1
- package/dist/template/zod-converter.js +603 -657
- package/dist/testing/_relation-graph.d.ts +1 -1
- package/dist/testing/_relation-graph.d.ts.map +1 -1
- package/dist/testing/_relation-graph.js +93 -88
- package/dist/testing/bootstrap.d.ts +22 -13
- package/dist/testing/bootstrap.d.ts.map +1 -1
- package/dist/testing/bootstrap.js +114 -114
- package/dist/testing/data-explorer.d.ts +3 -3
- package/dist/testing/data-explorer.d.ts.map +1 -1
- package/dist/testing/data-explorer.js +237 -265
- package/dist/testing/dev-test-routes.d.ts +2 -2
- package/dist/testing/dev-test-routes.d.ts.map +1 -1
- package/dist/testing/dev-test-routes.js +258 -249
- package/dist/testing/dev-vitest-manager.d.ts +1 -1
- package/dist/testing/dev-vitest-manager.d.ts.map +1 -1
- package/dist/testing/dev-vitest-manager.js +514 -539
- package/dist/testing/faker-mappings.js +422 -420
- package/dist/testing/fixture-generator.d.ts +3 -3
- package/dist/testing/fixture-generator.d.ts.map +1 -1
- package/dist/testing/fixture-generator.js +1216 -1346
- package/dist/testing/fixture-loader.js +26 -25
- package/dist/testing/fixture-manager.d.ts +3 -3
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +706 -776
- package/dist/testing/global-setup.js +53 -49
- package/dist/testing/index.js +19 -11
- package/dist/testing/naite-vitest-reporter.js +18 -13
- package/dist/testing/parallel-db-manager.d.ts +1 -1
- package/dist/testing/parallel-db-manager.d.ts.map +1 -1
- package/dist/testing/parallel-db-manager.js +63 -78
- package/dist/testing/vitest-helpers.d.ts +1 -1
- package/dist/testing/vitest-helpers.d.ts.map +1 -1
- package/dist/testing/vitest-helpers.js +37 -33
- package/dist/types/types.d.ts +28 -28
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +764 -890
- package/dist/ui/ai-api.d.ts +1 -1
- package/dist/ui/ai-api.d.ts.map +1 -1
- package/dist/ui/ai-api.js +52 -42
- package/dist/ui/ai-client.d.ts +1 -2
- package/dist/ui/ai-client.d.ts.map +1 -1
- package/dist/ui/ai-client.js +353 -388
- package/dist/ui/api.d.ts +1 -1
- package/dist/ui/api.d.ts.map +1 -1
- package/dist/ui/api.js +903 -1145
- package/dist/ui/cdd-service.d.ts +1 -1
- package/dist/ui/cdd-service.d.ts.map +1 -1
- package/dist/ui/cdd-service.js +406 -407
- package/dist/ui/cdd-types.js +1 -3
- package/dist/ui-web/assets/index-C-Zz-wYg.css +1 -0
- package/dist/ui-web/assets/index-DejDON8K.js +238 -0
- package/dist/ui-web/index.html +3 -3
- package/dist/utils/async-utils.js +57 -45
- package/dist/utils/console-util.d.ts.map +1 -1
- package/dist/utils/console-util.js +104 -87
- package/dist/utils/controller.js +26 -19
- package/dist/utils/esm-utils.js +49 -38
- package/dist/utils/formatter.d.ts +1 -2
- package/dist/utils/formatter.d.ts.map +1 -1
- package/dist/utils/formatter.js +89 -115
- package/dist/utils/fs-utils.d.ts.map +1 -1
- package/dist/utils/fs-utils.js +68 -65
- package/dist/utils/lodash-able.js +11 -4
- package/dist/utils/model.d.ts +1 -1
- package/dist/utils/model.d.ts.map +1 -1
- package/dist/utils/model.js +21 -19
- package/dist/utils/object-utils.js +148 -186
- package/dist/utils/path-utils.js +67 -57
- package/dist/utils/process-utils.d.ts.map +1 -1
- package/dist/utils/process-utils.js +37 -31
- package/dist/utils/sql-parser.d.ts +1 -1
- package/dist/utils/sql-parser.d.ts.map +1 -1
- package/dist/utils/sql-parser.js +40 -40
- package/dist/utils/type-utils.js +44 -43
- package/dist/utils/utils.d.ts +2 -3
- package/dist/utils/utils.d.ts.map +1 -1
- package/dist/utils/utils.js +81 -93
- package/dist/utils/zod-error.d.ts +1 -1
- package/dist/utils/zod-error.d.ts.map +1 -1
- package/dist/utils/zod-error.js +24 -17
- package/dist/vector/chunking.d.ts +1 -1
- package/dist/vector/chunking.d.ts.map +1 -1
- package/dist/vector/chunking.js +100 -94
- package/dist/vector/config.d.ts +1 -1
- package/dist/vector/config.d.ts.map +1 -1
- package/dist/vector/config.js +76 -78
- package/dist/vector/embedding.d.ts +1 -1
- package/dist/vector/embedding.d.ts.map +1 -1
- package/dist/vector/embedding.js +128 -125
- package/dist/vector/index.js +5 -5
- package/dist/vector/types.js +1 -5
- package/package.json +31 -36
- package/src/ai/agents/agent.ts +12 -5
- package/src/ai/agents/types.ts +5 -5
- package/src/ai/providers/rtzr/model.ts +8 -10
- package/src/ai/providers/rtzr/options.ts +2 -1
- package/src/ai/providers/rtzr/provider.ts +5 -3
- package/src/ai/providers/rtzr/utils.ts +2 -7
- package/src/api/__tests__/config.test.ts +15 -8
- package/src/api/base-frame.ts +5 -3
- package/src/api/caster.ts +7 -6
- package/src/api/code-converters.ts +23 -26
- package/src/api/config.ts +23 -17
- package/src/api/context.ts +18 -11
- package/src/api/decorators.ts +17 -18
- package/src/api/sonamu.ts +44 -49
- package/src/auth/auth-generator.ts +4 -6
- package/src/auth/better-auth-entities.ts +3 -2
- package/src/auth/knex-adapter.ts +6 -5
- package/src/auth/plugins/entity-definitions/admin.ts +1 -1
- package/src/auth/plugins/entity-definitions/anonymous.ts +1 -1
- package/src/auth/plugins/entity-definitions/api-key.ts +1 -1
- package/src/auth/plugins/entity-definitions/index.ts +1 -1
- package/src/auth/plugins/entity-definitions/jwt.ts +1 -1
- package/src/auth/plugins/entity-definitions/organization.ts +1 -1
- package/src/auth/plugins/entity-definitions/passkey.ts +1 -1
- package/src/auth/plugins/entity-definitions/phone-number.ts +1 -1
- package/src/auth/plugins/entity-definitions/sso.ts +1 -1
- package/src/auth/plugins/entity-definitions/two-factor.ts +1 -1
- package/src/auth/plugins/entity-definitions/types.ts +1 -1
- package/src/auth/plugins/entity-definitions/username.ts +1 -1
- package/src/auth/plugins/wrappers/admin.ts +3 -1
- package/src/auth/plugins/wrappers/anonymous.ts +3 -1
- package/src/auth/plugins/wrappers/api-key.ts +3 -1
- package/src/auth/plugins/wrappers/jwt.ts +3 -1
- package/src/auth/plugins/wrappers/organization.ts +3 -1
- package/src/auth/plugins/wrappers/passkey.ts +3 -1
- package/src/auth/plugins/wrappers/phone-number.ts +3 -1
- package/src/auth/plugins/wrappers/sso.ts +2 -1
- package/src/auth/plugins/wrappers/two-factor.ts +3 -1
- package/src/auth/plugins/wrappers/username.ts +3 -1
- package/src/bin/__tests__/ts-loader-register.test.ts +7 -12
- package/src/bin/build-config.ts +3 -3
- package/src/bin/cli.ts +27 -25
- package/src/bin/fixture.ts +4 -2
- package/src/bin/hmr-hook-register.ts +1 -0
- package/src/bin/test-command.ts +4 -2
- package/src/bin/ts-loader-registration.ts +6 -22
- package/src/cache/cache-manager.ts +2 -1
- package/src/cache/decorator.ts +2 -2
- package/src/cache/types.ts +3 -3
- package/src/cache-control/cache-control.ts +3 -2
- package/src/cache-control/types.ts +2 -2
- package/src/compress/compress.ts +1 -1
- package/src/cone/cone-generator.ts +5 -3
- package/src/database/_batch_update.ts +1 -1
- package/src/database/base-model.ts +20 -14
- package/src/database/base-model.types.ts +12 -11
- package/src/database/db.ts +56 -21
- package/src/database/knex.ts +2 -2
- package/src/database/puri-subset.test-d.ts +33 -32
- package/src/database/puri-subset.types.ts +6 -7
- package/src/database/puri-wrapper.ts +29 -26
- package/src/database/puri.ts +36 -34
- package/src/database/puri.types.test-d.ts +6 -5
- package/src/database/puri.types.ts +9 -12
- package/src/database/transaction-context.ts +2 -2
- package/src/database/upsert-builder.ts +17 -10
- package/src/dict/sd.ts +17 -4
- package/src/dict/sonamu-dictionary.ts +23 -17
- package/src/entity/entity-manager.ts +9 -7
- package/src/entity/entity-template-cone.ts +10 -3
- package/src/entity/entity.ts +20 -16
- package/src/exceptions/error-handler.ts +2 -1
- package/src/exceptions/so-exceptions.ts +1 -1
- package/src/filter/utils.ts +3 -2
- package/src/logger/category.ts +1 -0
- package/src/logger/configure.ts +5 -5
- package/src/migration/__tests__/code-generation.search-text.test.ts +2 -3
- package/src/migration/code-generation.ts +26 -25
- package/src/migration/migration-set.ts +16 -18
- package/src/migration/migrator.ts +38 -33
- package/src/migration/postgresql-schema-reader.ts +12 -12
- package/src/migration/slack-confirm.ts +5 -4
- package/src/migration/types.ts +2 -2
- package/src/naite/messaging-types.ts +1 -1
- package/src/naite/naite-reporter.ts +5 -3
- package/src/naite/naite.ts +12 -7
- package/src/shared/app.shared.ts.txt +2 -2
- package/src/shared/web.shared.ts.txt +2 -2
- package/src/skills/AGENTS.md +19 -18
- package/src/skills/commands/sonamu-skills.md +9 -9
- package/src/skills/sonamu/SKILL.md +111 -104
- package/src/skills/sonamu/ai-agents.md +27 -26
- package/src/skills/sonamu/api.md +81 -69
- package/src/skills/sonamu/auth-migration.md +13 -27
- package/src/skills/sonamu/auth-plugins.md +41 -31
- package/src/skills/sonamu/auth.md +30 -24
- package/src/skills/sonamu/cdd.md +26 -17
- package/src/skills/sonamu/cone.md +50 -50
- package/src/skills/sonamu/config.md +74 -51
- package/src/skills/sonamu/create-sonamu.md +31 -19
- package/src/skills/sonamu/database.md +43 -26
- package/src/skills/sonamu/entity-basic.md +61 -61
- package/src/skills/sonamu/entity-relations.md +84 -80
- package/src/skills/sonamu/entity-validation-checklist.md +19 -15
- package/src/skills/sonamu/fixture-cli.md +52 -30
- package/src/skills/sonamu/framework-change.md +9 -7
- package/src/skills/sonamu/frontend.md +64 -82
- package/src/skills/sonamu/i18n.md +45 -37
- package/src/skills/sonamu/migration.md +54 -31
- package/src/skills/sonamu/model.md +98 -66
- package/src/skills/sonamu/naite.md +34 -32
- package/src/skills/sonamu/project-init.md +28 -8
- package/src/skills/sonamu/puri.md +82 -91
- package/src/skills/sonamu/scaffolding.md +44 -32
- package/src/skills/sonamu/skill-contribution.md +50 -45
- package/src/skills/sonamu/subset.md +13 -13
- package/src/skills/sonamu/tasks.md +73 -58
- package/src/skills/sonamu/testing-devrunner.md +56 -36
- package/src/skills/sonamu/testing.md +23 -58
- package/src/skills/sonamu/upsert.md +32 -31
- package/src/skills/sonamu/vector.md +37 -36
- package/src/ssr/index.ts +2 -12
- package/src/ssr/registry.ts +1 -1
- package/src/ssr/renderer.ts +7 -5
- package/src/ssr/types.ts +2 -2
- package/src/storage/buffered-file.ts +4 -2
- package/src/storage/drivers.ts +3 -2
- package/src/storage/s3-driver.ts +7 -4
- package/src/storage/storage-manager.ts +3 -2
- package/src/storage/types.ts +3 -2
- package/src/storage/uploaded-file.ts +1 -1
- package/src/stream/sse.ts +2 -2
- package/src/syncer/api-parser.ts +8 -5
- package/src/syncer/checksum.ts +9 -5
- package/src/syncer/code-generator.ts +16 -8
- package/src/syncer/entity-operations.ts +5 -3
- package/src/syncer/file-patterns.ts +2 -1
- package/src/syncer/module-loader.ts +9 -6
- package/src/syncer/syncer-actions.ts +5 -3
- package/src/syncer/syncer.ts +18 -24
- package/src/tasks/decorator.ts +10 -8
- package/src/tasks/step-wrapper.ts +1 -1
- package/src/tasks/workflow-manager.ts +18 -15
- package/src/template/__tests__/generated.template.search-text.test.ts +1 -0
- package/src/template/entity-converter.ts +4 -2
- package/src/template/generated.template.test-d.ts +2 -1
- package/src/template/helpers.ts +5 -2
- package/src/template/implementations/entity.template.ts +9 -8
- package/src/template/implementations/entry-server.template.ts +1 -1
- package/src/template/implementations/generated.template.ts +21 -29
- package/src/template/implementations/generated_http.template.ts +9 -6
- package/src/template/implementations/generated_sso.template.ts +6 -4
- package/src/template/implementations/init_types.template.ts +3 -2
- package/src/template/implementations/model.template.ts +4 -2
- package/src/template/implementations/model_test.template.ts +3 -2
- package/src/template/implementations/queries.template.ts +6 -14
- package/src/template/implementations/sd.template.ts +4 -2
- package/src/template/implementations/services.template.ts +7 -11
- package/src/template/implementations/view_form.template.ts +5 -3
- package/src/template/implementations/view_id_all_select.template.ts +3 -2
- package/src/template/implementations/view_list.template.ts +7 -5
- package/src/template/implementations/view_search_input.template.ts +3 -2
- package/src/template/template-manager.ts +4 -3
- package/src/template/template.ts +4 -3
- package/src/template/zod-converter.ts +10 -7
- package/src/testing/__tests__/dev-test-routes.test.ts +3 -2
- package/src/testing/__tests__/dev-vitest-manager.test.ts +1 -0
- package/src/testing/_relation-graph.ts +2 -2
- package/src/testing/bootstrap.ts +55 -27
- package/src/testing/data-explorer.ts +5 -4
- package/src/testing/dev-test-routes.ts +8 -5
- package/src/testing/dev-vitest-manager.ts +13 -12
- package/src/testing/fixture-generator.ts +11 -17
- package/src/testing/fixture-manager.ts +21 -17
- package/src/testing/parallel-db-manager.ts +2 -1
- package/src/testing/vitest-helpers.ts +2 -1
- package/src/types/__tests__/entity-json-schema-search-text.test.ts +1 -0
- package/src/types/types.ts +8 -8
- package/src/typings/knex.d.ts +4 -4
- package/src/ui/ai-api.ts +5 -3
- package/src/ui/ai-client.ts +6 -5
- package/src/ui/api.ts +25 -23
- package/src/ui/cdd-service.ts +12 -11
- package/src/utils/console-util.ts +3 -1
- package/src/utils/formatter.ts +94 -102
- package/src/utils/fs-utils.ts +2 -1
- package/src/utils/model.ts +2 -2
- package/src/utils/object-utils.ts +3 -3
- package/src/utils/process-utils.ts +2 -1
- package/src/utils/sql-parser.ts +10 -1
- package/src/utils/type-utils.ts +3 -3
- package/src/utils/utils.ts +9 -7
- package/src/utils/zod-error.ts +1 -1
- package/src/vector/chunking.ts +1 -1
- package/src/vector/config.ts +1 -1
- package/src/vector/embedding.ts +11 -9
- package/tsdown.api.config.ts +50 -0
- package/.swcrc.project-default +0 -18
- package/dist/api/__tests__/config.test.js +0 -189
- package/dist/bin/__tests__/test-command.test.js +0 -112
- package/dist/bin/__tests__/ts-loader-register.test.js +0 -45
- package/dist/database/puri-subset.test-d.js +0 -89
- package/dist/database/puri.types.test-d.js +0 -129
- package/dist/migration/__tests__/code-generation.search-text.test.js +0 -435
- package/dist/template/__tests__/generated.template.search-text.test.js +0 -99
- package/dist/template/generated.template.test-d.js +0 -24
- package/dist/testing/__tests__/dev-test-routes.test.js +0 -144
- package/dist/testing/__tests__/dev-vitest-manager.test.js +0 -152
- package/dist/types/__tests__/entity-json-schema-search-text.test.js +0 -256
- package/dist/typings/knex.d.js +0 -3
- package/dist/ui-web/assets/index-CKo0Z2Iu.css +0 -1
- package/dist/ui-web/assets/index-DK-2aacv.js +0 -257
package/dist/types/types.js
CHANGED
|
@@ -1,928 +1,802 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
shape.array()
|
|
8
|
-
]);
|
|
1
|
+
import { __esmMin } from "../_virtual/rolldown_runtime.js";
|
|
2
|
+
import { z as z$1 } from "zod";
|
|
3
|
+
|
|
4
|
+
//#region src/types/types.ts
|
|
5
|
+
function zArrayable(shape) {
|
|
6
|
+
return z$1.union([shape, shape.array()]);
|
|
9
7
|
}
|
|
10
8
|
/**
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
9
|
+
* prop의 설명을 반환합니다.
|
|
10
|
+
*
|
|
11
|
+
* cone.note가 있으면 우선 사용하고, 없으면 prop.desc를 사용합니다.
|
|
12
|
+
*/
|
|
13
|
+
function getDescription(item) {
|
|
14
|
+
return item.cone?.note || item.desc;
|
|
16
15
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
// 기본 포맷
|
|
23
|
-
"email",
|
|
24
|
-
"uuid",
|
|
25
|
-
"url",
|
|
26
|
-
"httpUrl",
|
|
27
|
-
"hostname",
|
|
28
|
-
"emoji",
|
|
29
|
-
"base64",
|
|
30
|
-
"base64url",
|
|
31
|
-
"hex",
|
|
32
|
-
"jwt",
|
|
33
|
-
"nanoid",
|
|
34
|
-
"cuid",
|
|
35
|
-
"cuid2",
|
|
36
|
-
"ulid",
|
|
37
|
-
"ipv4",
|
|
38
|
-
"ipv6",
|
|
39
|
-
"mac",
|
|
40
|
-
"cidrv4",
|
|
41
|
-
"cidrv6",
|
|
42
|
-
// hash 포맷 (알고리즘별)
|
|
43
|
-
"hashMd5",
|
|
44
|
-
"hashSha1",
|
|
45
|
-
"hashSha256",
|
|
46
|
-
"hashSha384",
|
|
47
|
-
"hashSha512",
|
|
48
|
-
// ISO 포맷
|
|
49
|
-
"isoDate",
|
|
50
|
-
"isoTime",
|
|
51
|
-
"isoDatetime",
|
|
52
|
-
"isoDuration"
|
|
53
|
-
]);
|
|
54
|
-
export const SonamuFileSchema = z.object({
|
|
55
|
-
name: z.string(),
|
|
56
|
-
url: z.string(),
|
|
57
|
-
mime_type: z.string(),
|
|
58
|
-
size: z.number()
|
|
59
|
-
}).describe("SonamuFile");
|
|
60
|
-
export const SonamuFileArraySchema = z.array(SonamuFileSchema).describe("SonamuFile[]");
|
|
61
|
-
/**
|
|
62
|
-
* Sonamu 코어에서 제공하는 내장 JSON 타입 ID 목록
|
|
63
|
-
* 새로운 내장 타입 추가 시 이 배열에 추가하면 자동으로 UI에 노출됩니다.
|
|
64
|
-
*/ export const BUILT_IN_TYPE_IDS = [
|
|
65
|
-
"SonamuFile",
|
|
66
|
-
"SonamuFile[]"
|
|
67
|
-
];
|
|
68
|
-
export const KnownOpclassValues = [
|
|
69
|
-
"gin_trgm_ops",
|
|
70
|
-
"gist_trgm_ops",
|
|
71
|
-
"gin_bigm_ops",
|
|
72
|
-
"vector_cosine_ops",
|
|
73
|
-
"vector_ip_ops",
|
|
74
|
-
"vector_l2_ops",
|
|
75
|
-
"pgroonga_varchar_full_text_search_ops_v2",
|
|
76
|
-
"pgroonga_jsonb_full_text_search_ops_v2"
|
|
77
|
-
];
|
|
78
|
-
export function normalizeSubsetField(f) {
|
|
79
|
-
return typeof f === "string" ? f : f.field;
|
|
80
|
-
}
|
|
81
|
-
export function isInternalSubsetField(f) {
|
|
82
|
-
return typeof f !== "string" && f.internal === true;
|
|
16
|
+
function normalizeSubsetField(f) {
|
|
17
|
+
return typeof f === "string" ? f : f.field;
|
|
18
|
+
}
|
|
19
|
+
function isInternalSubsetField(f) {
|
|
20
|
+
return typeof f !== "string" && f.internal === true;
|
|
83
21
|
}
|
|
84
22
|
/**
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
23
|
+
* SubsetDef가 새로운 객체 형태인지 확인
|
|
24
|
+
*/
|
|
25
|
+
function isSubsetDefWithCone(def) {
|
|
26
|
+
return !Array.isArray(def) && "fields" in def;
|
|
88
27
|
}
|
|
89
28
|
/**
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
29
|
+
* EnumDef가 새로운 객체 형태인지 확인
|
|
30
|
+
*/
|
|
31
|
+
function isEnumDefWithCone(def) {
|
|
32
|
+
return "values" in def && !("cone" in def && def.cone === undefined && Object.keys(def).length > 1);
|
|
93
33
|
}
|
|
94
34
|
/**
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
35
|
+
* SubsetDef에서 fields 추출
|
|
36
|
+
*/
|
|
37
|
+
function getSubsetFields(def) {
|
|
38
|
+
return Array.isArray(def) ? def : def.fields;
|
|
98
39
|
}
|
|
99
40
|
/**
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
41
|
+
* EnumDef에서 values 추출
|
|
42
|
+
*/
|
|
43
|
+
function getEnumDefValues(def) {
|
|
44
|
+
return isEnumDefWithCone(def) ? def.values : def;
|
|
103
45
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
*/ export function isIntegerSingleProp(p) {
|
|
107
|
-
return p?.type === "integer";
|
|
46
|
+
function isIntegerSingleProp(p) {
|
|
47
|
+
return p?.type === "integer";
|
|
108
48
|
}
|
|
109
|
-
|
|
110
|
-
|
|
49
|
+
function isIntegerArrayProp(p) {
|
|
50
|
+
return p?.type === "integer[]";
|
|
111
51
|
}
|
|
112
|
-
|
|
113
|
-
|
|
52
|
+
function isIntegerProp(p) {
|
|
53
|
+
return isIntegerSingleProp(p) || isIntegerArrayProp(p);
|
|
114
54
|
}
|
|
115
|
-
|
|
116
|
-
|
|
55
|
+
function isBigIntegerSingleProp(p) {
|
|
56
|
+
return p?.type === "bigInteger";
|
|
117
57
|
}
|
|
118
|
-
|
|
119
|
-
|
|
58
|
+
function isBigIntegerArrayProp(p) {
|
|
59
|
+
return p?.type === "bigInteger[]";
|
|
120
60
|
}
|
|
121
|
-
|
|
122
|
-
|
|
61
|
+
function isBigIntegerProp(p) {
|
|
62
|
+
return isBigIntegerSingleProp(p) || isBigIntegerArrayProp(p);
|
|
123
63
|
}
|
|
124
|
-
|
|
125
|
-
|
|
64
|
+
function isStringSingleProp(p) {
|
|
65
|
+
return p?.type === "string";
|
|
126
66
|
}
|
|
127
|
-
|
|
128
|
-
|
|
67
|
+
function isStringArrayProp(p) {
|
|
68
|
+
return p?.type === "string[]";
|
|
129
69
|
}
|
|
130
|
-
|
|
131
|
-
|
|
70
|
+
function isStringProp(p) {
|
|
71
|
+
return isStringSingleProp(p) || isStringArrayProp(p);
|
|
132
72
|
}
|
|
133
|
-
|
|
134
|
-
|
|
73
|
+
function isEnumSingleProp(p) {
|
|
74
|
+
return p?.type === "enum";
|
|
135
75
|
}
|
|
136
|
-
|
|
137
|
-
|
|
76
|
+
function isEnumArrayProp(p) {
|
|
77
|
+
return p?.type === "enum[]";
|
|
138
78
|
}
|
|
139
|
-
|
|
140
|
-
|
|
79
|
+
function isEnumProp(p) {
|
|
80
|
+
return isEnumSingleProp(p) || isEnumArrayProp(p);
|
|
141
81
|
}
|
|
142
|
-
|
|
143
|
-
|
|
82
|
+
function isNumberSingleProp(p) {
|
|
83
|
+
return p?.type === "number";
|
|
144
84
|
}
|
|
145
|
-
|
|
146
|
-
|
|
85
|
+
function isNumberArrayProp(p) {
|
|
86
|
+
return p?.type === "number[]";
|
|
147
87
|
}
|
|
148
|
-
|
|
149
|
-
|
|
88
|
+
function isNumberProp(p) {
|
|
89
|
+
return isNumberSingleProp(p) || isNumberArrayProp(p);
|
|
150
90
|
}
|
|
151
|
-
|
|
152
|
-
|
|
91
|
+
function isNumericSingleProp(p) {
|
|
92
|
+
return p?.type === "numeric";
|
|
153
93
|
}
|
|
154
|
-
|
|
155
|
-
|
|
94
|
+
function isNumericArrayProp(p) {
|
|
95
|
+
return p?.type === "numeric[]";
|
|
156
96
|
}
|
|
157
|
-
|
|
158
|
-
|
|
97
|
+
function isNumericProp(p) {
|
|
98
|
+
return isNumericSingleProp(p) || isNumericArrayProp(p);
|
|
159
99
|
}
|
|
160
|
-
|
|
161
|
-
|
|
100
|
+
function isBooleanSingleProp(p) {
|
|
101
|
+
return p?.type === "boolean";
|
|
162
102
|
}
|
|
163
|
-
|
|
164
|
-
|
|
103
|
+
function isBooleanArrayProp(p) {
|
|
104
|
+
return p?.type === "boolean[]";
|
|
165
105
|
}
|
|
166
|
-
|
|
167
|
-
|
|
106
|
+
function isBooleanProp(p) {
|
|
107
|
+
return isBooleanSingleProp(p) || isBooleanArrayProp(p);
|
|
168
108
|
}
|
|
169
|
-
|
|
170
|
-
|
|
109
|
+
function isDateSingleProp(p) {
|
|
110
|
+
return p?.type === "date";
|
|
171
111
|
}
|
|
172
|
-
|
|
173
|
-
|
|
112
|
+
function isDateArrayProp(p) {
|
|
113
|
+
return p?.type === "date[]";
|
|
174
114
|
}
|
|
175
|
-
|
|
176
|
-
|
|
115
|
+
function isDateProp(p) {
|
|
116
|
+
return isDateSingleProp(p) || isDateArrayProp(p);
|
|
117
|
+
}
|
|
118
|
+
function isUuidSingleProp(p) {
|
|
119
|
+
return p?.type === "uuid";
|
|
120
|
+
}
|
|
121
|
+
function isUuidArrayProp(p) {
|
|
122
|
+
return p?.type === "uuid[]";
|
|
123
|
+
}
|
|
124
|
+
function isUuidProp(p) {
|
|
125
|
+
return isUuidSingleProp(p) || isUuidArrayProp(p);
|
|
126
|
+
}
|
|
127
|
+
function isJsonProp(p) {
|
|
128
|
+
return p?.type === "json";
|
|
129
|
+
}
|
|
130
|
+
function isSearchTextProp(p) {
|
|
131
|
+
return p?.type === "searchText";
|
|
132
|
+
}
|
|
133
|
+
function isVirtualProp(p) {
|
|
134
|
+
return p?.type === "virtual";
|
|
135
|
+
}
|
|
136
|
+
function isVirtualCodeProp(p) {
|
|
137
|
+
if (!isVirtualProp(p)) return false;
|
|
138
|
+
return p.virtualType !== "query";
|
|
139
|
+
}
|
|
140
|
+
function isVirtualQueryProp(p) {
|
|
141
|
+
if (!isVirtualProp(p)) return false;
|
|
142
|
+
return p.virtualType === "query";
|
|
143
|
+
}
|
|
144
|
+
function isVectorSingleProp(p) {
|
|
145
|
+
return p?.type === "vector";
|
|
146
|
+
}
|
|
147
|
+
function isVectorArrayProp(p) {
|
|
148
|
+
return p?.type === "vector[]";
|
|
149
|
+
}
|
|
150
|
+
function isVectorProp(p) {
|
|
151
|
+
return isVectorSingleProp(p) || isVectorArrayProp(p);
|
|
152
|
+
}
|
|
153
|
+
function isTsVectorProp(p) {
|
|
154
|
+
return p?.type === "tsvector";
|
|
155
|
+
}
|
|
156
|
+
function isRelationProp(p) {
|
|
157
|
+
return p?.type === "relation";
|
|
158
|
+
}
|
|
159
|
+
function isOneToOneRelationProp(p) {
|
|
160
|
+
return p?.relationType === "OneToOne";
|
|
161
|
+
}
|
|
162
|
+
function isBelongsToOneRelationProp(p) {
|
|
163
|
+
return p?.relationType === "BelongsToOne";
|
|
164
|
+
}
|
|
165
|
+
function isHasManyRelationProp(p) {
|
|
166
|
+
return p?.relationType === "HasMany";
|
|
167
|
+
}
|
|
168
|
+
function isManyToManyRelationProp(p) {
|
|
169
|
+
return p?.relationType === "ManyToMany";
|
|
170
|
+
}
|
|
171
|
+
function isCustomJoinClause(p) {
|
|
172
|
+
return !!p?.custom;
|
|
173
|
+
}
|
|
174
|
+
function isKnexError(e) {
|
|
175
|
+
return !!e?.code && !!e?.sqlMessage && !!e?.sqlState;
|
|
177
176
|
}
|
|
178
|
-
export function isUuidSingleProp(p) {
|
|
179
|
-
return p?.type === "uuid";
|
|
180
|
-
}
|
|
181
|
-
export function isUuidArrayProp(p) {
|
|
182
|
-
return p?.type === "uuid[]";
|
|
183
|
-
}
|
|
184
|
-
export function isUuidProp(p) {
|
|
185
|
-
return isUuidSingleProp(p) || isUuidArrayProp(p);
|
|
186
|
-
}
|
|
187
|
-
export function isJsonProp(p) {
|
|
188
|
-
return p?.type === "json";
|
|
189
|
-
}
|
|
190
|
-
export function isSearchTextProp(p) {
|
|
191
|
-
return p?.type === "searchText";
|
|
192
|
-
}
|
|
193
|
-
export function isVirtualProp(p) {
|
|
194
|
-
return p?.type === "virtual";
|
|
195
|
-
}
|
|
196
|
-
export function isVirtualCodeProp(p) {
|
|
197
|
-
if (!isVirtualProp(p)) return false;
|
|
198
|
-
return p.virtualType !== "query"; // undefined도 "code"로 취급
|
|
199
|
-
}
|
|
200
|
-
export function isVirtualQueryProp(p) {
|
|
201
|
-
if (!isVirtualProp(p)) return false;
|
|
202
|
-
return p.virtualType === "query";
|
|
203
|
-
}
|
|
204
|
-
export function isVectorSingleProp(p) {
|
|
205
|
-
return p?.type === "vector";
|
|
206
|
-
}
|
|
207
|
-
export function isVectorArrayProp(p) {
|
|
208
|
-
return p?.type === "vector[]";
|
|
209
|
-
}
|
|
210
|
-
export function isVectorProp(p) {
|
|
211
|
-
return isVectorSingleProp(p) || isVectorArrayProp(p);
|
|
212
|
-
}
|
|
213
|
-
export function isTsVectorProp(p) {
|
|
214
|
-
return p?.type === "tsvector";
|
|
215
|
-
}
|
|
216
|
-
export function isRelationProp(p) {
|
|
217
|
-
return p?.type === "relation";
|
|
218
|
-
}
|
|
219
|
-
export function isOneToOneRelationProp(p) {
|
|
220
|
-
return p?.relationType === "OneToOne";
|
|
221
|
-
}
|
|
222
|
-
export function isBelongsToOneRelationProp(p) {
|
|
223
|
-
return p?.relationType === "BelongsToOne";
|
|
224
|
-
}
|
|
225
|
-
export function isHasManyRelationProp(p) {
|
|
226
|
-
return p?.relationType === "HasMany";
|
|
227
|
-
}
|
|
228
|
-
export function isManyToManyRelationProp(p) {
|
|
229
|
-
return p?.relationType === "ManyToMany";
|
|
230
|
-
}
|
|
231
|
-
export function isCustomJoinClause(p) {
|
|
232
|
-
return !!p?.custom;
|
|
233
|
-
}
|
|
234
|
-
/* BaseModel */ export const SonamuQueryMode = z.enum([
|
|
235
|
-
"both",
|
|
236
|
-
"list",
|
|
237
|
-
"count"
|
|
238
|
-
]);
|
|
239
|
-
/* Semantic Query */ export const SonamuSemanticParams = z.object({
|
|
240
|
-
semanticQuery: z.object({
|
|
241
|
-
embedding: z.array(z.number()).min(1024).max(1024),
|
|
242
|
-
threshold: z.number().optional(),
|
|
243
|
-
method: z.enum([
|
|
244
|
-
"cosine",
|
|
245
|
-
"l2",
|
|
246
|
-
"inner_product"
|
|
247
|
-
]).optional()
|
|
248
|
-
})
|
|
249
|
-
});
|
|
250
|
-
export function isKnexError(e) {
|
|
251
|
-
return !!e?.code && !!e?.sqlMessage && !!e?.sqlState;
|
|
252
|
-
}
|
|
253
|
-
(function(ApiParamType) {
|
|
254
|
-
function isObject(v) {
|
|
255
|
-
return v?.t === "object";
|
|
256
|
-
}
|
|
257
|
-
ApiParamType.isObject = isObject;
|
|
258
|
-
function isUnion(v) {
|
|
259
|
-
return v?.t === "union";
|
|
260
|
-
}
|
|
261
|
-
ApiParamType.isUnion = isUnion;
|
|
262
|
-
function isIntersection(v) {
|
|
263
|
-
return v?.t === "intersection";
|
|
264
|
-
}
|
|
265
|
-
ApiParamType.isIntersection = isIntersection;
|
|
266
|
-
function isStringLiteral(v) {
|
|
267
|
-
return v?.t === "string-literal";
|
|
268
|
-
}
|
|
269
|
-
ApiParamType.isStringLiteral = isStringLiteral;
|
|
270
|
-
function isNumericLiteral(v) {
|
|
271
|
-
return v?.t === "numeric-literal";
|
|
272
|
-
}
|
|
273
|
-
ApiParamType.isNumericLiteral = isNumericLiteral;
|
|
274
|
-
function isArray(v) {
|
|
275
|
-
return v?.t === "array";
|
|
276
|
-
}
|
|
277
|
-
ApiParamType.isArray = isArray;
|
|
278
|
-
function isRef(v) {
|
|
279
|
-
return typeof v === "object" && v !== null && v.t === "ref";
|
|
280
|
-
}
|
|
281
|
-
ApiParamType.isRef = isRef;
|
|
282
|
-
function isIndexedAccess(v) {
|
|
283
|
-
return typeof v === "object" && v !== null && v.t === "indexed-access";
|
|
284
|
-
}
|
|
285
|
-
ApiParamType.isIndexedAccess = isIndexedAccess;
|
|
286
|
-
function isTupleType(v) {
|
|
287
|
-
return typeof v === "object" && v !== null && v.t === "tuple-type";
|
|
288
|
-
}
|
|
289
|
-
ApiParamType.isTupleType = isTupleType;
|
|
290
|
-
function isPick(v) {
|
|
291
|
-
return typeof v === "object" && v !== null && v.t === "ref" && v.id === "Pick";
|
|
292
|
-
}
|
|
293
|
-
ApiParamType.isPick = isPick;
|
|
294
|
-
function isOmit(v) {
|
|
295
|
-
return typeof v === "object" && v !== null && v.t === "ref" && v.id === "Omit";
|
|
296
|
-
}
|
|
297
|
-
ApiParamType.isOmit = isOmit;
|
|
298
|
-
function isPartial(v) {
|
|
299
|
-
return typeof v === "object" && v !== null && v.t === "ref" && v.id === "Partial";
|
|
300
|
-
}
|
|
301
|
-
ApiParamType.isPartial = isPartial;
|
|
302
|
-
function isPromise(v) {
|
|
303
|
-
return typeof v === "object" && v !== null && v.t === "ref" && v.id === "Promise";
|
|
304
|
-
}
|
|
305
|
-
ApiParamType.isPromise = isPromise;
|
|
306
|
-
function isContext(v) {
|
|
307
|
-
return typeof v === "object" && v !== null && v.t === "ref" && v.id === "Context";
|
|
308
|
-
}
|
|
309
|
-
ApiParamType.isContext = isContext;
|
|
310
|
-
function isRefKnex(v) {
|
|
311
|
-
return typeof v === "object" && v !== null && v.t === "ref" && v.id === "Knex";
|
|
312
|
-
}
|
|
313
|
-
ApiParamType.isRefKnex = isRefKnex;
|
|
314
|
-
function isTypeParam(v) {
|
|
315
|
-
return typeof v === "object" && v !== null && v.t === "type-param";
|
|
316
|
-
}
|
|
317
|
-
ApiParamType.isTypeParam = isTypeParam;
|
|
318
|
-
})(ApiParamType || (ApiParamType = {}));
|
|
319
|
-
/* Template */ /**
|
|
320
|
-
* UI 컴포넌트 렌더링을 위한 메타데이터 노드입니다.
|
|
321
|
-
*
|
|
322
|
-
* **목적**: Zod 스키마로부터 프론트엔드 UI 컴포넌트를 자동 생성하기 위한
|
|
323
|
-
* 렌더링 정보를 담은 트리 구조입니다. 각 필드가 어떤 UI 컴포넌트로
|
|
324
|
-
* 표현되어야 하는지(텍스트, 이미지, 날짜, Enum 선택 등)를 명시합니다.
|
|
325
|
-
*
|
|
326
|
-
* **변환 흐름**:
|
|
327
|
-
* Entity subset → EntityPropNode → Zod 스키마 → RenderingNode (UI용) → React 컴포넌트 코드 생성
|
|
328
|
-
*
|
|
329
|
-
* **주요 필드**:
|
|
330
|
-
* - `renderType`: UI 컴포넌트 유형 (string-plain, number-fk_id, enums, array 등)
|
|
331
|
-
* - `zodType`: 원본 Zod 스키마 (validation 용)
|
|
332
|
-
* - `children`: 중첩된 객체 필드들 (object일 때)
|
|
333
|
-
* - `element`: 배열 요소 타입 (array일 때)
|
|
334
|
-
*
|
|
335
|
-
* **사용 위치**:
|
|
336
|
-
* - zod-converter.ts의 zodTypeToRenderingNode()에서 생성
|
|
337
|
-
* - view_form.template.ts, view_list.template.ts 등에서 React 컴포넌트 코드 생성에 사용
|
|
338
|
-
*/ // 셀프 참조 타입이므로 Zod 생략하고 직접 정의
|
|
339
|
-
export const RenderingNode = z.any();
|
|
340
|
-
const GeneratedColumnSchema = z.object({
|
|
341
|
-
type: z.enum([
|
|
342
|
-
"STORED",
|
|
343
|
-
"VIRTUAL"
|
|
344
|
-
]),
|
|
345
|
-
expression: z.string()
|
|
346
|
-
});
|
|
347
|
-
const FixtureCompanionSchema = z.object({
|
|
348
|
-
entity: z.string(),
|
|
349
|
-
overrides: z.record(z.string(), z.unknown()).optional(),
|
|
350
|
-
count: z.number().int().positive().optional()
|
|
351
|
-
});
|
|
352
|
-
/**
|
|
353
|
-
* Cone 스키마 검증
|
|
354
|
-
*
|
|
355
|
-
* cone 메타데이터의 유효성을 검증합니다.
|
|
356
|
-
*/ const ConeSchema = z.object({
|
|
357
|
-
note: z.string().optional(),
|
|
358
|
-
tags: z.array(z.string()).optional(),
|
|
359
|
-
fixtureGenerator: z.string().optional(),
|
|
360
|
-
fixtureDefault: z.unknown().optional(),
|
|
361
|
-
fixtureStrategy: z.literal("sequence").optional(),
|
|
362
|
-
fixtureCompanions: z.array(FixtureCompanionSchema).optional(),
|
|
363
|
-
fixtureParentOverrides: z.record(z.string(), z.unknown()).optional(),
|
|
364
|
-
dataSource: z.object({
|
|
365
|
-
strategy: z.enum([
|
|
366
|
-
"sample",
|
|
367
|
-
"ids",
|
|
368
|
-
"query",
|
|
369
|
-
"file",
|
|
370
|
-
"recent",
|
|
371
|
-
"random"
|
|
372
|
-
]),
|
|
373
|
-
config: z.unknown().optional()
|
|
374
|
-
}).optional()
|
|
375
|
-
}).catchall(z.unknown()); // 사용자 정의 메타데이터 허용
|
|
376
|
-
const BasePropFields = {
|
|
377
|
-
name: z.string(),
|
|
378
|
-
desc: z.string().optional(),
|
|
379
|
-
nullable: z.boolean().optional(),
|
|
380
|
-
toFilter: z.boolean().default(false).optional(),
|
|
381
|
-
dbDefault: z.union([
|
|
382
|
-
z.string(),
|
|
383
|
-
z.number(),
|
|
384
|
-
z.boolean()
|
|
385
|
-
]).optional(),
|
|
386
|
-
generated: GeneratedColumnSchema.optional(),
|
|
387
|
-
cone: ConeSchema.optional()
|
|
388
|
-
};
|
|
389
|
-
// 부가 필드가 필요없는 prop
|
|
390
|
-
const BasePropFieldsWithoutAdditional = z.object({
|
|
391
|
-
...BasePropFields,
|
|
392
|
-
type: z.union([
|
|
393
|
-
z.literal("integer"),
|
|
394
|
-
z.literal("integer[]"),
|
|
395
|
-
z.literal("bigInteger"),
|
|
396
|
-
z.literal("bigInteger[]"),
|
|
397
|
-
z.literal("boolean"),
|
|
398
|
-
z.literal("boolean[]"),
|
|
399
|
-
z.literal("uuid"),
|
|
400
|
-
z.literal("uuid[]"),
|
|
401
|
-
z.literal("tsvector")
|
|
402
|
-
])
|
|
403
|
-
}).strict();
|
|
404
|
-
// precision/scale 필드
|
|
405
|
-
const PrecisionScaleFields = {
|
|
406
|
-
precision: z.number().optional(),
|
|
407
|
-
scale: z.number().optional()
|
|
408
|
-
};
|
|
409
|
-
// 각 타입별 스키마 정의
|
|
410
|
-
const StringPropSchema = z.object({
|
|
411
|
-
...BasePropFields,
|
|
412
|
-
type: z.literal("string"),
|
|
413
|
-
length: z.number().optional(),
|
|
414
|
-
zodFormat: ZodStringFormat.optional()
|
|
415
|
-
}).strict();
|
|
416
|
-
const StringArrayPropSchema = z.object({
|
|
417
|
-
...BasePropFields,
|
|
418
|
-
type: z.literal("string[]"),
|
|
419
|
-
length: z.number().optional(),
|
|
420
|
-
zodFormat: ZodStringFormat.optional()
|
|
421
|
-
}).strict();
|
|
422
|
-
const EnumPropSchema = z.object({
|
|
423
|
-
...BasePropFields,
|
|
424
|
-
type: z.literal("enum"),
|
|
425
|
-
id: z.string(),
|
|
426
|
-
length: z.number().optional()
|
|
427
|
-
}).strict();
|
|
428
|
-
const EnumArrayPropSchema = z.object({
|
|
429
|
-
...BasePropFields,
|
|
430
|
-
type: z.literal("enum[]"),
|
|
431
|
-
id: z.string()
|
|
432
|
-
}).strict();
|
|
433
|
-
const NumberPropSchema = z.object({
|
|
434
|
-
...BasePropFields,
|
|
435
|
-
type: z.literal("number"),
|
|
436
|
-
...PrecisionScaleFields,
|
|
437
|
-
numberType: z.enum([
|
|
438
|
-
"real",
|
|
439
|
-
"double precision",
|
|
440
|
-
"numeric"
|
|
441
|
-
]).optional()
|
|
442
|
-
}).strict();
|
|
443
|
-
const NumberArrayPropSchema = z.object({
|
|
444
|
-
...BasePropFields,
|
|
445
|
-
type: z.literal("number[]"),
|
|
446
|
-
...PrecisionScaleFields,
|
|
447
|
-
numberType: z.enum([
|
|
448
|
-
"real",
|
|
449
|
-
"double precision",
|
|
450
|
-
"numeric"
|
|
451
|
-
]).optional()
|
|
452
|
-
}).strict();
|
|
453
|
-
const DatePropSchema = z.object({
|
|
454
|
-
...BasePropFields,
|
|
455
|
-
type: z.literal("date"),
|
|
456
|
-
precision: z.number().optional()
|
|
457
|
-
}).strict();
|
|
458
|
-
const DateArrayPropSchema = z.object({
|
|
459
|
-
...BasePropFields,
|
|
460
|
-
type: z.literal("date[]"),
|
|
461
|
-
precision: z.number().optional()
|
|
462
|
-
}).strict();
|
|
463
|
-
const NumericPropSchema = z.object({
|
|
464
|
-
...BasePropFields,
|
|
465
|
-
type: z.literal("numeric"),
|
|
466
|
-
...PrecisionScaleFields
|
|
467
|
-
}).strict();
|
|
468
|
-
const NumericArrayPropSchema = z.object({
|
|
469
|
-
...BasePropFields,
|
|
470
|
-
type: z.literal("numeric[]"),
|
|
471
|
-
...PrecisionScaleFields
|
|
472
|
-
}).strict();
|
|
473
|
-
const JsonPropSchema = z.object({
|
|
474
|
-
...BasePropFields,
|
|
475
|
-
type: z.literal("json"),
|
|
476
|
-
id: z.string()
|
|
477
|
-
}).strict();
|
|
478
|
-
const SearchTextSourceColumnSchema = z.object({
|
|
479
|
-
name: z.string(),
|
|
480
|
-
caseInsensitive: z.boolean().optional()
|
|
481
|
-
}).strict();
|
|
482
|
-
const SearchTextPropSchema = z.object({
|
|
483
|
-
...BasePropFields,
|
|
484
|
-
type: z.literal("searchText"),
|
|
485
|
-
sourceColumns: z.array(SearchTextSourceColumnSchema).min(1)
|
|
486
|
-
}).strict();
|
|
487
|
-
const VirtualPropSchema = z.object({
|
|
488
|
-
...BasePropFields,
|
|
489
|
-
type: z.literal("virtual"),
|
|
490
|
-
id: z.string(),
|
|
491
|
-
virtualType: z.enum([
|
|
492
|
-
"query",
|
|
493
|
-
"code"
|
|
494
|
-
]).optional()
|
|
495
|
-
}).strict();
|
|
496
|
-
const VectorPropSchema = z.object({
|
|
497
|
-
...BasePropFields,
|
|
498
|
-
type: z.literal("vector"),
|
|
499
|
-
dimensions: z.number()
|
|
500
|
-
}).strict();
|
|
501
|
-
const VectorArrayPropSchema = z.object({
|
|
502
|
-
...BasePropFields,
|
|
503
|
-
type: z.literal("vector[]"),
|
|
504
|
-
dimensions: z.number()
|
|
505
|
-
}).strict();
|
|
506
|
-
// Relation 타입은 relationType에 따라 세분화
|
|
507
|
-
const BaseRelationFields = {
|
|
508
|
-
...BasePropFields,
|
|
509
|
-
type: z.literal("relation"),
|
|
510
|
-
with: z.string()
|
|
511
|
-
};
|
|
512
|
-
// RelationOn 타입
|
|
513
|
-
const RelationOnSchema = z.enum([
|
|
514
|
-
"CASCADE",
|
|
515
|
-
"SET NULL",
|
|
516
|
-
"NO ACTION",
|
|
517
|
-
"SET DEFAULT",
|
|
518
|
-
"RESTRICT"
|
|
519
|
-
]);
|
|
520
|
-
const BelongsToOneRelationPropSchema = z.object({
|
|
521
|
-
...BaseRelationFields,
|
|
522
|
-
relationType: z.literal("BelongsToOne"),
|
|
523
|
-
customJoinClause: z.string().optional(),
|
|
524
|
-
useConstraint: z.boolean().optional(),
|
|
525
|
-
onUpdate: RelationOnSchema.optional(),
|
|
526
|
-
onDelete: RelationOnSchema.optional()
|
|
527
|
-
}).strict();
|
|
528
|
-
const HasManyRelationPropSchema = z.object({
|
|
529
|
-
...BaseRelationFields,
|
|
530
|
-
relationType: z.literal("HasMany"),
|
|
531
|
-
joinColumn: z.string(),
|
|
532
|
-
fromColumn: z.string().optional()
|
|
533
|
-
}).strict();
|
|
534
|
-
const ManyToManyRelationPropSchema = z.object({
|
|
535
|
-
...BaseRelationFields,
|
|
536
|
-
relationType: z.literal("ManyToMany"),
|
|
537
|
-
joinTable: z.string(),
|
|
538
|
-
onUpdate: RelationOnSchema,
|
|
539
|
-
onDelete: RelationOnSchema
|
|
540
|
-
}).strict();
|
|
541
|
-
const OneToOneRelationPropSchema = z.object({
|
|
542
|
-
...BaseRelationFields,
|
|
543
|
-
relationType: z.literal("OneToOne"),
|
|
544
|
-
customJoinClause: z.string().optional(),
|
|
545
|
-
hasJoinColumn: z.boolean().optional(),
|
|
546
|
-
useConstraint: z.boolean().optional(),
|
|
547
|
-
onUpdate: RelationOnSchema.optional(),
|
|
548
|
-
onDelete: RelationOnSchema.optional()
|
|
549
|
-
}).strict();
|
|
550
|
-
const RelationTypes = [
|
|
551
|
-
"BelongsToOne",
|
|
552
|
-
"HasMany",
|
|
553
|
-
"ManyToMany",
|
|
554
|
-
"OneToOne"
|
|
555
|
-
];
|
|
556
|
-
export const RelationPropSchema = z.discriminatedUnion("relationType", [
|
|
557
|
-
BelongsToOneRelationPropSchema,
|
|
558
|
-
HasManyRelationPropSchema,
|
|
559
|
-
ManyToManyRelationPropSchema,
|
|
560
|
-
OneToOneRelationPropSchema
|
|
561
|
-
], {
|
|
562
|
-
error: (iss)=>`relationType은 ${RelationTypes.map((t)=>`'${t}'`).join(", ")} 중 하나여야 합니다. 입력값: "${iss.input?.relationType}"`
|
|
563
|
-
});
|
|
564
|
-
const NormalPropTypes = [
|
|
565
|
-
"integer",
|
|
566
|
-
"integer[]",
|
|
567
|
-
"bigInteger",
|
|
568
|
-
"bigInteger[]",
|
|
569
|
-
"string",
|
|
570
|
-
"string[]",
|
|
571
|
-
"enum",
|
|
572
|
-
"enum[]",
|
|
573
|
-
"number",
|
|
574
|
-
"number[]",
|
|
575
|
-
"numeric",
|
|
576
|
-
"numeric[]",
|
|
577
|
-
"boolean",
|
|
578
|
-
"boolean[]",
|
|
579
|
-
"date",
|
|
580
|
-
"date[]",
|
|
581
|
-
"uuid",
|
|
582
|
-
"uuid[]",
|
|
583
|
-
"json",
|
|
584
|
-
"searchText",
|
|
585
|
-
"virtual",
|
|
586
|
-
"vector",
|
|
587
|
-
"vector[]",
|
|
588
|
-
"tsvector"
|
|
589
|
-
];
|
|
590
|
-
// VIRTUAL Generated Column에서 사용 불가능한 타입들
|
|
591
|
-
const VirtualGeneratedDisallowedTypes = [
|
|
592
|
-
"json",
|
|
593
|
-
"vector",
|
|
594
|
-
"vector[]",
|
|
595
|
-
"string[]",
|
|
596
|
-
"integer[]",
|
|
597
|
-
"bigInteger[]",
|
|
598
|
-
"boolean[]",
|
|
599
|
-
"date[]",
|
|
600
|
-
"uuid[]",
|
|
601
|
-
"number[]",
|
|
602
|
-
"numeric[]",
|
|
603
|
-
"enum[]"
|
|
604
|
-
];
|
|
605
|
-
export const NormalPropSchema = z.discriminatedUnion("type", [
|
|
606
|
-
BasePropFieldsWithoutAdditional,
|
|
607
|
-
StringPropSchema,
|
|
608
|
-
StringArrayPropSchema,
|
|
609
|
-
EnumPropSchema,
|
|
610
|
-
EnumArrayPropSchema,
|
|
611
|
-
NumberPropSchema,
|
|
612
|
-
NumberArrayPropSchema,
|
|
613
|
-
DatePropSchema,
|
|
614
|
-
DateArrayPropSchema,
|
|
615
|
-
NumericPropSchema,
|
|
616
|
-
NumericArrayPropSchema,
|
|
617
|
-
JsonPropSchema,
|
|
618
|
-
SearchTextPropSchema,
|
|
619
|
-
VirtualPropSchema,
|
|
620
|
-
VectorPropSchema,
|
|
621
|
-
VectorArrayPropSchema
|
|
622
|
-
], {
|
|
623
|
-
error: (iss)=>`type은 ${NormalPropTypes.map((t)=>`'${t}'`).join(", ")} 중 하나여야 합니다. 입력값: "${iss.input?.type}"`
|
|
624
|
-
}).superRefine((data, ctx)=>{
|
|
625
|
-
if (!data.generated) {
|
|
626
|
-
return;
|
|
627
|
-
}
|
|
628
|
-
// dbDefault와 generated 동시 사용 불가
|
|
629
|
-
if (data.dbDefault !== undefined) {
|
|
630
|
-
ctx.addIssue({
|
|
631
|
-
code: "custom",
|
|
632
|
-
message: "dbDefault와 generated는 함께 사용할 수 없습니다",
|
|
633
|
-
path: [
|
|
634
|
-
"generated"
|
|
635
|
-
]
|
|
636
|
-
});
|
|
637
|
-
}
|
|
638
|
-
// virtual 타입은 generated 불가
|
|
639
|
-
if (data.type === "virtual") {
|
|
640
|
-
ctx.addIssue({
|
|
641
|
-
code: "custom",
|
|
642
|
-
message: "virtual 타입은 generated column을 지원하지 않습니다",
|
|
643
|
-
path: [
|
|
644
|
-
"generated"
|
|
645
|
-
]
|
|
646
|
-
});
|
|
647
|
-
}
|
|
648
|
-
// VIRTUAL Generated Column 타입 제한 검증
|
|
649
|
-
if (data.generated.type === "VIRTUAL") {
|
|
650
|
-
if (VirtualGeneratedDisallowedTypes.includes(data.type)) {
|
|
651
|
-
ctx.addIssue({
|
|
652
|
-
code: "custom",
|
|
653
|
-
message: `VIRTUAL generated column은 ${data.type} 타입을 지원하지 않습니다. STORED를 사용하세요.`,
|
|
654
|
-
path: [
|
|
655
|
-
"generated",
|
|
656
|
-
"type"
|
|
657
|
-
],
|
|
658
|
-
fatal: true
|
|
659
|
-
});
|
|
660
|
-
}
|
|
661
|
-
}
|
|
662
|
-
});
|
|
663
|
-
const AllPropTypes = [
|
|
664
|
-
...NormalPropTypes,
|
|
665
|
-
"relation"
|
|
666
|
-
];
|
|
667
|
-
const EntityPropSchema = z.discriminatedUnion("type", [
|
|
668
|
-
NormalPropSchema,
|
|
669
|
-
RelationPropSchema
|
|
670
|
-
], {
|
|
671
|
-
error: (iss)=>`type은 ${AllPropTypes.map((t)=>`'${t}'`).join(", ")} 중 하나여야 합니다. 입력값: "${iss.input?.type}"`
|
|
672
|
-
});
|
|
673
|
-
const EntityIndexColumnSchema = z.object({
|
|
674
|
-
name: z.string(),
|
|
675
|
-
nullsFirst: z.boolean().optional(),
|
|
676
|
-
sortOrder: z.enum([
|
|
677
|
-
"ASC",
|
|
678
|
-
"DESC"
|
|
679
|
-
]).optional(),
|
|
680
|
-
vectorOps: z.enum([
|
|
681
|
-
"vector_cosine_ops",
|
|
682
|
-
"vector_ip_ops",
|
|
683
|
-
"vector_l2_ops"
|
|
684
|
-
]).optional(),
|
|
685
|
-
opclass: z.union([
|
|
686
|
-
z.enum(KnownOpclassValues),
|
|
687
|
-
z.string().min(1)
|
|
688
|
-
]).optional()
|
|
689
|
-
});
|
|
690
|
-
// EntityIndex 스키마 정의
|
|
691
|
-
const EntityIndexSchema = z.object({
|
|
692
|
-
type: z.enum([
|
|
693
|
-
"index",
|
|
694
|
-
"unique",
|
|
695
|
-
"hnsw",
|
|
696
|
-
"ivfflat"
|
|
697
|
-
]),
|
|
698
|
-
columns: z.array(EntityIndexColumnSchema),
|
|
699
|
-
name: z.string().min(1).max(63),
|
|
700
|
-
using: z.enum([
|
|
701
|
-
"btree",
|
|
702
|
-
"hash",
|
|
703
|
-
"gin",
|
|
704
|
-
"gist",
|
|
705
|
-
"pgroonga"
|
|
706
|
-
]).optional(),
|
|
707
|
-
nullsNotDistinct: z.boolean().optional(),
|
|
708
|
-
m: z.number().optional(),
|
|
709
|
-
efConstruction: z.number().optional(),
|
|
710
|
-
lists: z.number().optional()
|
|
711
|
-
}).strict();
|
|
712
|
-
/**
|
|
713
|
-
* SubsetDef 스키마
|
|
714
|
-
*
|
|
715
|
-
* 하위 호환성을 위해 배열 형태와 객체 형태 둘 다 지원합니다.
|
|
716
|
-
*/ const SubsetDefSchema = z.union([
|
|
717
|
-
// 기존 배열 형태
|
|
718
|
-
z.array(z.union([
|
|
719
|
-
z.string(),
|
|
720
|
-
z.object({
|
|
721
|
-
field: z.string(),
|
|
722
|
-
internal: z.boolean().optional()
|
|
723
|
-
})
|
|
724
|
-
])),
|
|
725
|
-
// 새로운 객체 형태
|
|
726
|
-
z.object({
|
|
727
|
-
fields: z.array(z.union([
|
|
728
|
-
z.string(),
|
|
729
|
-
z.object({
|
|
730
|
-
field: z.string(),
|
|
731
|
-
internal: z.boolean().optional()
|
|
732
|
-
})
|
|
733
|
-
])),
|
|
734
|
-
cone: ConeSchema.optional()
|
|
735
|
-
})
|
|
736
|
-
]);
|
|
737
|
-
/**
|
|
738
|
-
* EnumDef 스키마
|
|
739
|
-
*
|
|
740
|
-
* 하위 호환성을 위해 Record 형태와 객체 형태 둘 다 지원합니다.
|
|
741
|
-
*/ const EnumDefSchema = z.union([
|
|
742
|
-
// 기존 Record 형태
|
|
743
|
-
z.record(z.string(), z.string()),
|
|
744
|
-
// 새로운 객체 형태
|
|
745
|
-
z.object({
|
|
746
|
-
values: z.record(z.string(), z.string()),
|
|
747
|
-
cone: ConeSchema.optional()
|
|
748
|
-
})
|
|
749
|
-
]);
|
|
750
177
|
function unwrapSearchTextJsonSourceType(zodType) {
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
}
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
}
|
|
765
|
-
function validateSearchTextSources(props, ctx, propsPath = [
|
|
766
|
-
|
|
767
|
-
]
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
178
|
+
let current = zodType;
|
|
179
|
+
while (current instanceof z$1.ZodOptional || current instanceof z$1.ZodNullable) {
|
|
180
|
+
current = current.unwrap();
|
|
181
|
+
}
|
|
182
|
+
return current;
|
|
183
|
+
}
|
|
184
|
+
function isSearchTextJsonSourceZodType(zodType) {
|
|
185
|
+
const baseType = unwrapSearchTextJsonSourceType(zodType);
|
|
186
|
+
if (!(baseType instanceof z$1.ZodArray)) {
|
|
187
|
+
return false;
|
|
188
|
+
}
|
|
189
|
+
const elementType = baseType.def.element;
|
|
190
|
+
return elementType instanceof z$1.ZodString;
|
|
191
|
+
}
|
|
192
|
+
function validateSearchTextSources(props, ctx, propsPath = ["props"]) {
|
|
193
|
+
const propsByName = new Map(props.map((prop) => {
|
|
194
|
+
return [prop.name, prop];
|
|
195
|
+
}));
|
|
196
|
+
props.forEach((prop, propIndex) => {
|
|
197
|
+
if (prop.type !== "searchText") {
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
prop.sourceColumns.forEach((source, sourceIndex) => {
|
|
201
|
+
const sourceProp = propsByName.get(source.name);
|
|
202
|
+
const sourcePath = [
|
|
203
|
+
...propsPath,
|
|
204
|
+
propIndex,
|
|
205
|
+
"sourceColumns",
|
|
206
|
+
sourceIndex,
|
|
207
|
+
"name"
|
|
208
|
+
];
|
|
209
|
+
if (!sourceProp) {
|
|
210
|
+
ctx.addIssue({
|
|
211
|
+
code: "custom",
|
|
212
|
+
message: `searchText source column "${source.name}"을(를) 찾을 수 없습니다.`,
|
|
213
|
+
path: sourcePath
|
|
214
|
+
});
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
if (sourceProp.type === "string" || sourceProp.type === "string[]") {
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
if (sourceProp.type === "json") {
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
ctx.addIssue({
|
|
224
|
+
code: "custom",
|
|
225
|
+
message: `searchText source column "${source.name}"의 타입 "${sourceProp.type}"은(는) 지원되지 않습니다.`,
|
|
226
|
+
path: sourcePath
|
|
227
|
+
});
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
var ZodStringFormat, SonamuFileSchema, SonamuFileArraySchema, BUILT_IN_TYPE_IDS, KnownOpclassValues, SonamuQueryMode, SonamuSemanticParams, ApiParamType, RenderingNode, GeneratedColumnSchema, FixtureCompanionSchema, ConeSchema, BasePropFields, BasePropFieldsWithoutAdditional, PrecisionScaleFields, StringPropSchema, StringArrayPropSchema, EnumPropSchema, EnumArrayPropSchema, NumberPropSchema, NumberArrayPropSchema, DatePropSchema, DateArrayPropSchema, NumericPropSchema, NumericArrayPropSchema, JsonPropSchema, SearchTextSourceColumnSchema, SearchTextPropSchema, VirtualPropSchema, VectorPropSchema, VectorArrayPropSchema, BaseRelationFields, RelationOnSchema, BelongsToOneRelationPropSchema, HasManyRelationPropSchema, ManyToManyRelationPropSchema, OneToOneRelationPropSchema, RelationTypes, RelationPropSchema, NormalPropTypes, VirtualGeneratedDisallowedTypes, NormalPropSchema, AllPropTypes, EntityPropSchema, EntityIndexColumnSchema, EntityIndexSchema, SubsetDefSchema, EnumDefSchema, EntityJsonBaseSchema, EntityJsonSchema, TemplateEntitySchema, TemplateOptions, TemplateKey, GenerateOptions, PathAndCode;
|
|
232
|
+
var init_types = __esmMin((() => {
|
|
233
|
+
ZodStringFormat = z$1.enum([
|
|
234
|
+
"email",
|
|
235
|
+
"uuid",
|
|
236
|
+
"url",
|
|
237
|
+
"httpUrl",
|
|
238
|
+
"hostname",
|
|
239
|
+
"emoji",
|
|
240
|
+
"base64",
|
|
241
|
+
"base64url",
|
|
242
|
+
"hex",
|
|
243
|
+
"jwt",
|
|
244
|
+
"nanoid",
|
|
245
|
+
"cuid",
|
|
246
|
+
"cuid2",
|
|
247
|
+
"ulid",
|
|
248
|
+
"ipv4",
|
|
249
|
+
"ipv6",
|
|
250
|
+
"mac",
|
|
251
|
+
"cidrv4",
|
|
252
|
+
"cidrv6",
|
|
253
|
+
"hashMd5",
|
|
254
|
+
"hashSha1",
|
|
255
|
+
"hashSha256",
|
|
256
|
+
"hashSha384",
|
|
257
|
+
"hashSha512",
|
|
258
|
+
"isoDate",
|
|
259
|
+
"isoTime",
|
|
260
|
+
"isoDatetime",
|
|
261
|
+
"isoDuration"
|
|
262
|
+
]);
|
|
263
|
+
SonamuFileSchema = z$1.object({
|
|
264
|
+
name: z$1.string(),
|
|
265
|
+
url: z$1.string(),
|
|
266
|
+
mime_type: z$1.string(),
|
|
267
|
+
size: z$1.number()
|
|
268
|
+
}).describe("SonamuFile");
|
|
269
|
+
SonamuFileArraySchema = z$1.array(SonamuFileSchema).describe("SonamuFile[]");
|
|
270
|
+
BUILT_IN_TYPE_IDS = ["SonamuFile", "SonamuFile[]"];
|
|
271
|
+
KnownOpclassValues = [
|
|
272
|
+
"gin_trgm_ops",
|
|
273
|
+
"gist_trgm_ops",
|
|
274
|
+
"gin_bigm_ops",
|
|
275
|
+
"vector_cosine_ops",
|
|
276
|
+
"vector_ip_ops",
|
|
277
|
+
"vector_l2_ops",
|
|
278
|
+
"pgroonga_varchar_full_text_search_ops_v2",
|
|
279
|
+
"pgroonga_jsonb_full_text_search_ops_v2"
|
|
280
|
+
];
|
|
281
|
+
SonamuQueryMode = z$1.enum([
|
|
282
|
+
"both",
|
|
283
|
+
"list",
|
|
284
|
+
"count"
|
|
285
|
+
]);
|
|
286
|
+
SonamuSemanticParams = z$1.object({ semanticQuery: z$1.object({
|
|
287
|
+
embedding: z$1.array(z$1.number()).min(1024).max(1024),
|
|
288
|
+
threshold: z$1.number().optional(),
|
|
289
|
+
method: z$1.enum([
|
|
290
|
+
"cosine",
|
|
291
|
+
"l2",
|
|
292
|
+
"inner_product"
|
|
293
|
+
]).optional()
|
|
294
|
+
}) });
|
|
295
|
+
;
|
|
296
|
+
(function(_ApiParamType) {
|
|
297
|
+
function isObject(v) {
|
|
298
|
+
return v?.t === "object";
|
|
299
|
+
}
|
|
300
|
+
_ApiParamType.isObject = isObject;
|
|
301
|
+
function isUnion(v) {
|
|
302
|
+
return v?.t === "union";
|
|
303
|
+
}
|
|
304
|
+
_ApiParamType.isUnion = isUnion;
|
|
305
|
+
function isIntersection(v) {
|
|
306
|
+
return v?.t === "intersection";
|
|
307
|
+
}
|
|
308
|
+
_ApiParamType.isIntersection = isIntersection;
|
|
309
|
+
function isStringLiteral(v) {
|
|
310
|
+
return v?.t === "string-literal";
|
|
311
|
+
}
|
|
312
|
+
_ApiParamType.isStringLiteral = isStringLiteral;
|
|
313
|
+
function isNumericLiteral(v) {
|
|
314
|
+
return v?.t === "numeric-literal";
|
|
315
|
+
}
|
|
316
|
+
_ApiParamType.isNumericLiteral = isNumericLiteral;
|
|
317
|
+
function isArray(v) {
|
|
318
|
+
return v?.t === "array";
|
|
319
|
+
}
|
|
320
|
+
_ApiParamType.isArray = isArray;
|
|
321
|
+
function isRef(v) {
|
|
322
|
+
return typeof v === "object" && v !== null && v.t === "ref";
|
|
323
|
+
}
|
|
324
|
+
_ApiParamType.isRef = isRef;
|
|
325
|
+
function isIndexedAccess(v) {
|
|
326
|
+
return typeof v === "object" && v !== null && v.t === "indexed-access";
|
|
327
|
+
}
|
|
328
|
+
_ApiParamType.isIndexedAccess = isIndexedAccess;
|
|
329
|
+
function isTupleType(v) {
|
|
330
|
+
return typeof v === "object" && v !== null && v.t === "tuple-type";
|
|
331
|
+
}
|
|
332
|
+
_ApiParamType.isTupleType = isTupleType;
|
|
333
|
+
function isPick(v) {
|
|
334
|
+
return typeof v === "object" && v !== null && v.t === "ref" && v.id === "Pick";
|
|
335
|
+
}
|
|
336
|
+
_ApiParamType.isPick = isPick;
|
|
337
|
+
function isOmit(v) {
|
|
338
|
+
return typeof v === "object" && v !== null && v.t === "ref" && v.id === "Omit";
|
|
339
|
+
}
|
|
340
|
+
_ApiParamType.isOmit = isOmit;
|
|
341
|
+
function isPartial(v) {
|
|
342
|
+
return typeof v === "object" && v !== null && v.t === "ref" && v.id === "Partial";
|
|
343
|
+
}
|
|
344
|
+
_ApiParamType.isPartial = isPartial;
|
|
345
|
+
function isPromise(v) {
|
|
346
|
+
return typeof v === "object" && v !== null && v.t === "ref" && v.id === "Promise";
|
|
347
|
+
}
|
|
348
|
+
_ApiParamType.isPromise = isPromise;
|
|
349
|
+
function isContext(v) {
|
|
350
|
+
return typeof v === "object" && v !== null && v.t === "ref" && v.id === "Context";
|
|
351
|
+
}
|
|
352
|
+
_ApiParamType.isContext = isContext;
|
|
353
|
+
function isRefKnex(v) {
|
|
354
|
+
return typeof v === "object" && v !== null && v.t === "ref" && v.id === "Knex";
|
|
355
|
+
}
|
|
356
|
+
_ApiParamType.isRefKnex = isRefKnex;
|
|
357
|
+
function isTypeParam(v) {
|
|
358
|
+
return typeof v === "object" && v !== null && v.t === "type-param";
|
|
359
|
+
}
|
|
360
|
+
_ApiParamType.isTypeParam = isTypeParam;
|
|
361
|
+
})(ApiParamType || (ApiParamType = {}));
|
|
362
|
+
RenderingNode = z$1.any();
|
|
363
|
+
GeneratedColumnSchema = z$1.object({
|
|
364
|
+
type: z$1.enum(["STORED", "VIRTUAL"]),
|
|
365
|
+
expression: z$1.string()
|
|
366
|
+
});
|
|
367
|
+
FixtureCompanionSchema = z$1.object({
|
|
368
|
+
entity: z$1.string(),
|
|
369
|
+
overrides: z$1.record(z$1.string(), z$1.unknown()).optional(),
|
|
370
|
+
count: z$1.number().int().positive().optional()
|
|
371
|
+
});
|
|
372
|
+
ConeSchema = z$1.object({
|
|
373
|
+
note: z$1.string().optional(),
|
|
374
|
+
tags: z$1.array(z$1.string()).optional(),
|
|
375
|
+
fixtureGenerator: z$1.string().optional(),
|
|
376
|
+
fixtureDefault: z$1.unknown().optional(),
|
|
377
|
+
fixtureStrategy: z$1.literal("sequence").optional(),
|
|
378
|
+
fixtureCompanions: z$1.array(FixtureCompanionSchema).optional(),
|
|
379
|
+
fixtureParentOverrides: z$1.record(z$1.string(), z$1.unknown()).optional(),
|
|
380
|
+
dataSource: z$1.object({
|
|
381
|
+
strategy: z$1.enum([
|
|
382
|
+
"sample",
|
|
383
|
+
"ids",
|
|
384
|
+
"query",
|
|
385
|
+
"file",
|
|
386
|
+
"recent",
|
|
387
|
+
"random"
|
|
388
|
+
]),
|
|
389
|
+
config: z$1.unknown().optional()
|
|
390
|
+
}).optional()
|
|
391
|
+
}).catchall(z$1.unknown());
|
|
392
|
+
BasePropFields = {
|
|
393
|
+
name: z$1.string(),
|
|
394
|
+
desc: z$1.string().optional(),
|
|
395
|
+
nullable: z$1.boolean().optional(),
|
|
396
|
+
toFilter: z$1.boolean().default(false).optional(),
|
|
397
|
+
dbDefault: z$1.union([
|
|
398
|
+
z$1.string(),
|
|
399
|
+
z$1.number(),
|
|
400
|
+
z$1.boolean()
|
|
401
|
+
]).optional(),
|
|
402
|
+
generated: GeneratedColumnSchema.optional(),
|
|
403
|
+
cone: ConeSchema.optional()
|
|
404
|
+
};
|
|
405
|
+
BasePropFieldsWithoutAdditional = z$1.object({
|
|
406
|
+
...BasePropFields,
|
|
407
|
+
type: z$1.union([
|
|
408
|
+
z$1.literal("integer"),
|
|
409
|
+
z$1.literal("integer[]"),
|
|
410
|
+
z$1.literal("bigInteger"),
|
|
411
|
+
z$1.literal("bigInteger[]"),
|
|
412
|
+
z$1.literal("boolean"),
|
|
413
|
+
z$1.literal("boolean[]"),
|
|
414
|
+
z$1.literal("uuid"),
|
|
415
|
+
z$1.literal("uuid[]"),
|
|
416
|
+
z$1.literal("tsvector")
|
|
417
|
+
])
|
|
418
|
+
}).strict();
|
|
419
|
+
PrecisionScaleFields = {
|
|
420
|
+
precision: z$1.number().optional(),
|
|
421
|
+
scale: z$1.number().optional()
|
|
422
|
+
};
|
|
423
|
+
StringPropSchema = z$1.object({
|
|
424
|
+
...BasePropFields,
|
|
425
|
+
type: z$1.literal("string"),
|
|
426
|
+
length: z$1.number().optional(),
|
|
427
|
+
zodFormat: ZodStringFormat.optional()
|
|
428
|
+
}).strict();
|
|
429
|
+
StringArrayPropSchema = z$1.object({
|
|
430
|
+
...BasePropFields,
|
|
431
|
+
type: z$1.literal("string[]"),
|
|
432
|
+
length: z$1.number().optional(),
|
|
433
|
+
zodFormat: ZodStringFormat.optional()
|
|
434
|
+
}).strict();
|
|
435
|
+
EnumPropSchema = z$1.object({
|
|
436
|
+
...BasePropFields,
|
|
437
|
+
type: z$1.literal("enum"),
|
|
438
|
+
id: z$1.string(),
|
|
439
|
+
length: z$1.number().optional()
|
|
440
|
+
}).strict();
|
|
441
|
+
EnumArrayPropSchema = z$1.object({
|
|
442
|
+
...BasePropFields,
|
|
443
|
+
type: z$1.literal("enum[]"),
|
|
444
|
+
id: z$1.string()
|
|
445
|
+
}).strict();
|
|
446
|
+
NumberPropSchema = z$1.object({
|
|
447
|
+
...BasePropFields,
|
|
448
|
+
type: z$1.literal("number"),
|
|
449
|
+
...PrecisionScaleFields,
|
|
450
|
+
numberType: z$1.enum([
|
|
451
|
+
"real",
|
|
452
|
+
"double precision",
|
|
453
|
+
"numeric"
|
|
454
|
+
]).optional()
|
|
455
|
+
}).strict();
|
|
456
|
+
NumberArrayPropSchema = z$1.object({
|
|
457
|
+
...BasePropFields,
|
|
458
|
+
type: z$1.literal("number[]"),
|
|
459
|
+
...PrecisionScaleFields,
|
|
460
|
+
numberType: z$1.enum([
|
|
461
|
+
"real",
|
|
462
|
+
"double precision",
|
|
463
|
+
"numeric"
|
|
464
|
+
]).optional()
|
|
465
|
+
}).strict();
|
|
466
|
+
DatePropSchema = z$1.object({
|
|
467
|
+
...BasePropFields,
|
|
468
|
+
type: z$1.literal("date"),
|
|
469
|
+
precision: z$1.number().optional()
|
|
470
|
+
}).strict();
|
|
471
|
+
DateArrayPropSchema = z$1.object({
|
|
472
|
+
...BasePropFields,
|
|
473
|
+
type: z$1.literal("date[]"),
|
|
474
|
+
precision: z$1.number().optional()
|
|
475
|
+
}).strict();
|
|
476
|
+
NumericPropSchema = z$1.object({
|
|
477
|
+
...BasePropFields,
|
|
478
|
+
type: z$1.literal("numeric"),
|
|
479
|
+
...PrecisionScaleFields
|
|
480
|
+
}).strict();
|
|
481
|
+
NumericArrayPropSchema = z$1.object({
|
|
482
|
+
...BasePropFields,
|
|
483
|
+
type: z$1.literal("numeric[]"),
|
|
484
|
+
...PrecisionScaleFields
|
|
485
|
+
}).strict();
|
|
486
|
+
JsonPropSchema = z$1.object({
|
|
487
|
+
...BasePropFields,
|
|
488
|
+
type: z$1.literal("json"),
|
|
489
|
+
id: z$1.string()
|
|
490
|
+
}).strict();
|
|
491
|
+
SearchTextSourceColumnSchema = z$1.object({
|
|
492
|
+
name: z$1.string(),
|
|
493
|
+
caseInsensitive: z$1.boolean().optional()
|
|
494
|
+
}).strict();
|
|
495
|
+
SearchTextPropSchema = z$1.object({
|
|
496
|
+
...BasePropFields,
|
|
497
|
+
type: z$1.literal("searchText"),
|
|
498
|
+
sourceColumns: z$1.array(SearchTextSourceColumnSchema).min(1)
|
|
499
|
+
}).strict();
|
|
500
|
+
VirtualPropSchema = z$1.object({
|
|
501
|
+
...BasePropFields,
|
|
502
|
+
type: z$1.literal("virtual"),
|
|
503
|
+
id: z$1.string(),
|
|
504
|
+
virtualType: z$1.enum(["query", "code"]).optional()
|
|
505
|
+
}).strict();
|
|
506
|
+
VectorPropSchema = z$1.object({
|
|
507
|
+
...BasePropFields,
|
|
508
|
+
type: z$1.literal("vector"),
|
|
509
|
+
dimensions: z$1.number()
|
|
510
|
+
}).strict();
|
|
511
|
+
VectorArrayPropSchema = z$1.object({
|
|
512
|
+
...BasePropFields,
|
|
513
|
+
type: z$1.literal("vector[]"),
|
|
514
|
+
dimensions: z$1.number()
|
|
515
|
+
}).strict();
|
|
516
|
+
BaseRelationFields = {
|
|
517
|
+
...BasePropFields,
|
|
518
|
+
type: z$1.literal("relation"),
|
|
519
|
+
with: z$1.string()
|
|
520
|
+
};
|
|
521
|
+
RelationOnSchema = z$1.enum([
|
|
522
|
+
"CASCADE",
|
|
523
|
+
"SET NULL",
|
|
524
|
+
"NO ACTION",
|
|
525
|
+
"SET DEFAULT",
|
|
526
|
+
"RESTRICT"
|
|
527
|
+
]);
|
|
528
|
+
BelongsToOneRelationPropSchema = z$1.object({
|
|
529
|
+
...BaseRelationFields,
|
|
530
|
+
relationType: z$1.literal("BelongsToOne"),
|
|
531
|
+
customJoinClause: z$1.string().optional(),
|
|
532
|
+
useConstraint: z$1.boolean().optional(),
|
|
533
|
+
onUpdate: RelationOnSchema.optional(),
|
|
534
|
+
onDelete: RelationOnSchema.optional()
|
|
535
|
+
}).strict();
|
|
536
|
+
HasManyRelationPropSchema = z$1.object({
|
|
537
|
+
...BaseRelationFields,
|
|
538
|
+
relationType: z$1.literal("HasMany"),
|
|
539
|
+
joinColumn: z$1.string(),
|
|
540
|
+
fromColumn: z$1.string().optional()
|
|
541
|
+
}).strict();
|
|
542
|
+
ManyToManyRelationPropSchema = z$1.object({
|
|
543
|
+
...BaseRelationFields,
|
|
544
|
+
relationType: z$1.literal("ManyToMany"),
|
|
545
|
+
joinTable: z$1.string(),
|
|
546
|
+
onUpdate: RelationOnSchema,
|
|
547
|
+
onDelete: RelationOnSchema
|
|
548
|
+
}).strict();
|
|
549
|
+
OneToOneRelationPropSchema = z$1.object({
|
|
550
|
+
...BaseRelationFields,
|
|
551
|
+
relationType: z$1.literal("OneToOne"),
|
|
552
|
+
customJoinClause: z$1.string().optional(),
|
|
553
|
+
hasJoinColumn: z$1.boolean().optional(),
|
|
554
|
+
useConstraint: z$1.boolean().optional(),
|
|
555
|
+
onUpdate: RelationOnSchema.optional(),
|
|
556
|
+
onDelete: RelationOnSchema.optional()
|
|
557
|
+
}).strict();
|
|
558
|
+
RelationTypes = [
|
|
559
|
+
"BelongsToOne",
|
|
560
|
+
"HasMany",
|
|
561
|
+
"ManyToMany",
|
|
562
|
+
"OneToOne"
|
|
563
|
+
];
|
|
564
|
+
RelationPropSchema = z$1.discriminatedUnion("relationType", [
|
|
565
|
+
BelongsToOneRelationPropSchema,
|
|
566
|
+
HasManyRelationPropSchema,
|
|
567
|
+
ManyToManyRelationPropSchema,
|
|
568
|
+
OneToOneRelationPropSchema
|
|
569
|
+
], { error: (iss) => `relationType은 ${RelationTypes.map((t) => `'${t}'`).join(", ")} 중 하나여야 합니다. 입력값: "${iss.input?.relationType}"` });
|
|
570
|
+
NormalPropTypes = [
|
|
571
|
+
"integer",
|
|
572
|
+
"integer[]",
|
|
573
|
+
"bigInteger",
|
|
574
|
+
"bigInteger[]",
|
|
575
|
+
"string",
|
|
576
|
+
"string[]",
|
|
577
|
+
"enum",
|
|
578
|
+
"enum[]",
|
|
579
|
+
"number",
|
|
580
|
+
"number[]",
|
|
581
|
+
"numeric",
|
|
582
|
+
"numeric[]",
|
|
583
|
+
"boolean",
|
|
584
|
+
"boolean[]",
|
|
585
|
+
"date",
|
|
586
|
+
"date[]",
|
|
587
|
+
"uuid",
|
|
588
|
+
"uuid[]",
|
|
589
|
+
"json",
|
|
590
|
+
"searchText",
|
|
591
|
+
"virtual",
|
|
592
|
+
"vector",
|
|
593
|
+
"vector[]",
|
|
594
|
+
"tsvector"
|
|
595
|
+
];
|
|
596
|
+
VirtualGeneratedDisallowedTypes = [
|
|
597
|
+
"json",
|
|
598
|
+
"vector",
|
|
599
|
+
"vector[]",
|
|
600
|
+
"string[]",
|
|
601
|
+
"integer[]",
|
|
602
|
+
"bigInteger[]",
|
|
603
|
+
"boolean[]",
|
|
604
|
+
"date[]",
|
|
605
|
+
"uuid[]",
|
|
606
|
+
"number[]",
|
|
607
|
+
"numeric[]",
|
|
608
|
+
"enum[]"
|
|
609
|
+
];
|
|
610
|
+
NormalPropSchema = z$1.discriminatedUnion("type", [
|
|
611
|
+
BasePropFieldsWithoutAdditional,
|
|
612
|
+
StringPropSchema,
|
|
613
|
+
StringArrayPropSchema,
|
|
614
|
+
EnumPropSchema,
|
|
615
|
+
EnumArrayPropSchema,
|
|
616
|
+
NumberPropSchema,
|
|
617
|
+
NumberArrayPropSchema,
|
|
618
|
+
DatePropSchema,
|
|
619
|
+
DateArrayPropSchema,
|
|
620
|
+
NumericPropSchema,
|
|
621
|
+
NumericArrayPropSchema,
|
|
622
|
+
JsonPropSchema,
|
|
623
|
+
SearchTextPropSchema,
|
|
624
|
+
VirtualPropSchema,
|
|
625
|
+
VectorPropSchema,
|
|
626
|
+
VectorArrayPropSchema
|
|
627
|
+
], { error: (iss) => `type은 ${NormalPropTypes.map((t) => `'${t}'`).join(", ")} 중 하나여야 합니다. 입력값: "${iss.input?.type}"` }).superRefine((data, ctx) => {
|
|
628
|
+
if (!data.generated) {
|
|
629
|
+
return;
|
|
630
|
+
}
|
|
631
|
+
if (data.dbDefault !== undefined) {
|
|
632
|
+
ctx.addIssue({
|
|
633
|
+
code: "custom",
|
|
634
|
+
message: "dbDefault와 generated는 함께 사용할 수 없습니다",
|
|
635
|
+
path: ["generated"]
|
|
636
|
+
});
|
|
637
|
+
}
|
|
638
|
+
if (data.type === "virtual") {
|
|
639
|
+
ctx.addIssue({
|
|
640
|
+
code: "custom",
|
|
641
|
+
message: "virtual 타입은 generated column을 지원하지 않습니다",
|
|
642
|
+
path: ["generated"]
|
|
643
|
+
});
|
|
644
|
+
}
|
|
645
|
+
if (data.generated.type === "VIRTUAL") {
|
|
646
|
+
if (VirtualGeneratedDisallowedTypes.includes(data.type)) {
|
|
647
|
+
ctx.addIssue({
|
|
648
|
+
code: "custom",
|
|
649
|
+
message: `VIRTUAL generated column은 ${data.type} 타입을 지원하지 않습니다. STORED를 사용하세요.`,
|
|
650
|
+
path: ["generated", "type"],
|
|
651
|
+
fatal: true
|
|
652
|
+
});
|
|
653
|
+
}
|
|
654
|
+
}
|
|
655
|
+
});
|
|
656
|
+
AllPropTypes = [...NormalPropTypes, "relation"];
|
|
657
|
+
EntityPropSchema = z$1.discriminatedUnion("type", [NormalPropSchema, RelationPropSchema], { error: (iss) => `type은 ${AllPropTypes.map((t) => `'${t}'`).join(", ")} 중 하나여야 합니다. 입력값: "${iss.input?.type}"` });
|
|
658
|
+
EntityIndexColumnSchema = z$1.object({
|
|
659
|
+
name: z$1.string(),
|
|
660
|
+
nullsFirst: z$1.boolean().optional(),
|
|
661
|
+
sortOrder: z$1.enum(["ASC", "DESC"]).optional(),
|
|
662
|
+
vectorOps: z$1.enum([
|
|
663
|
+
"vector_cosine_ops",
|
|
664
|
+
"vector_ip_ops",
|
|
665
|
+
"vector_l2_ops"
|
|
666
|
+
]).optional(),
|
|
667
|
+
opclass: z$1.union([z$1.enum(KnownOpclassValues), z$1.string().min(1)]).optional()
|
|
668
|
+
});
|
|
669
|
+
EntityIndexSchema = z$1.object({
|
|
670
|
+
type: z$1.enum([
|
|
671
|
+
"index",
|
|
672
|
+
"unique",
|
|
673
|
+
"hnsw",
|
|
674
|
+
"ivfflat"
|
|
675
|
+
]),
|
|
676
|
+
columns: z$1.array(EntityIndexColumnSchema),
|
|
677
|
+
name: z$1.string().min(1).max(63),
|
|
678
|
+
using: z$1.enum([
|
|
679
|
+
"btree",
|
|
680
|
+
"hash",
|
|
681
|
+
"gin",
|
|
682
|
+
"gist",
|
|
683
|
+
"pgroonga"
|
|
684
|
+
]).optional(),
|
|
685
|
+
nullsNotDistinct: z$1.boolean().optional(),
|
|
686
|
+
m: z$1.number().optional(),
|
|
687
|
+
efConstruction: z$1.number().optional(),
|
|
688
|
+
lists: z$1.number().optional()
|
|
689
|
+
}).strict();
|
|
690
|
+
SubsetDefSchema = z$1.union([z$1.array(z$1.union([z$1.string(), z$1.object({
|
|
691
|
+
field: z$1.string(),
|
|
692
|
+
internal: z$1.boolean().optional()
|
|
693
|
+
})])), z$1.object({
|
|
694
|
+
fields: z$1.array(z$1.union([z$1.string(), z$1.object({
|
|
695
|
+
field: z$1.string(),
|
|
696
|
+
internal: z$1.boolean().optional()
|
|
697
|
+
})])),
|
|
698
|
+
cone: ConeSchema.optional()
|
|
699
|
+
})]);
|
|
700
|
+
EnumDefSchema = z$1.union([z$1.record(z$1.string(), z$1.string()), z$1.object({
|
|
701
|
+
values: z$1.record(z$1.string(), z$1.string()),
|
|
702
|
+
cone: ConeSchema.optional()
|
|
703
|
+
})]);
|
|
704
|
+
EntityJsonBaseSchema = z$1.object({
|
|
705
|
+
id: z$1.string().describe("PascalCase로 된 Entity ID"),
|
|
706
|
+
title: z$1.string().describe("Entity 이름"),
|
|
707
|
+
table: z$1.string().describe("snake_case로 된 테이블명"),
|
|
708
|
+
parentId: z$1.string().optional().describe("부모 Entity ID"),
|
|
709
|
+
cone: ConeSchema.optional(),
|
|
710
|
+
props: z$1.array(EntityPropSchema),
|
|
711
|
+
indexes: z$1.array(EntityIndexSchema),
|
|
712
|
+
subsets: z$1.record(z$1.string(), SubsetDefSchema),
|
|
713
|
+
enums: z$1.record(z$1.string(), EnumDefSchema)
|
|
714
|
+
}).strict();
|
|
715
|
+
EntityJsonSchema = EntityJsonBaseSchema.superRefine((entity, ctx) => {
|
|
716
|
+
validateSearchTextSources(entity.props, ctx);
|
|
717
|
+
});
|
|
718
|
+
TemplateEntitySchema = EntityJsonBaseSchema.omit({ id: true }).extend({ entityId: z$1.string() }).partial({
|
|
719
|
+
table: true,
|
|
720
|
+
props: true,
|
|
721
|
+
indexes: true,
|
|
722
|
+
subsets: true,
|
|
723
|
+
enums: true
|
|
724
|
+
}).superRefine((entity, ctx) => {
|
|
725
|
+
if (!entity.props) {
|
|
726
|
+
return;
|
|
727
|
+
}
|
|
728
|
+
validateSearchTextSources(entity.props, ctx);
|
|
729
|
+
});
|
|
730
|
+
TemplateOptions = z$1.object({
|
|
731
|
+
entity: TemplateEntitySchema,
|
|
732
|
+
init_types: z$1.object({ entityId: z$1.string() }),
|
|
733
|
+
generated: z$1.object({}),
|
|
734
|
+
generated_sso: z$1.object({}),
|
|
735
|
+
generated_http: z$1.object({ entityId: z$1.string() }),
|
|
736
|
+
model: z$1.object({
|
|
737
|
+
entityId: z$1.string(),
|
|
738
|
+
defaultSearchField: z$1.string().optional(),
|
|
739
|
+
defaultOrderBy: z$1.string().optional()
|
|
740
|
+
}),
|
|
741
|
+
model_test: z$1.object({ entityId: z$1.string() }),
|
|
742
|
+
bridge: z$1.object({ entityId: z$1.string() }),
|
|
743
|
+
services: z$1.object({}),
|
|
744
|
+
view_list: z$1.object({
|
|
745
|
+
entityId: z$1.string(),
|
|
746
|
+
extra: z$1.unknown()
|
|
747
|
+
}),
|
|
748
|
+
view_list_columns: z$1.object({
|
|
749
|
+
entityId: z$1.string(),
|
|
750
|
+
columns: z$1.object({
|
|
751
|
+
name: z$1.string(),
|
|
752
|
+
label: z$1.string(),
|
|
753
|
+
tc: z$1.string()
|
|
754
|
+
}).array(),
|
|
755
|
+
columnImports: z$1.string()
|
|
756
|
+
}),
|
|
757
|
+
view_search_input: z$1.object({ entityId: z$1.string() }),
|
|
758
|
+
view_form: z$1.object({ entityId: z$1.string() }),
|
|
759
|
+
view_id_all_select: z$1.object({ entityId: z$1.string() }),
|
|
760
|
+
view_enums_buttonset: z$1.object({
|
|
761
|
+
entityId: z$1.string(),
|
|
762
|
+
enumId: z$1.string()
|
|
763
|
+
}),
|
|
764
|
+
queries: z$1.object({}),
|
|
765
|
+
entry_server: z$1.object({}),
|
|
766
|
+
sd: z$1.object({ target: z$1.enum([
|
|
767
|
+
"api",
|
|
768
|
+
"web",
|
|
769
|
+
"app"
|
|
770
|
+
]) })
|
|
771
|
+
});
|
|
772
|
+
TemplateKey = z$1.enum([
|
|
773
|
+
"entity",
|
|
774
|
+
"init_types",
|
|
775
|
+
"generated",
|
|
776
|
+
"generated_sso",
|
|
777
|
+
"generated_http",
|
|
778
|
+
"model",
|
|
779
|
+
"model_test",
|
|
780
|
+
"bridge",
|
|
781
|
+
"services",
|
|
782
|
+
"view_list",
|
|
783
|
+
"view_list_columns",
|
|
784
|
+
"view_search_input",
|
|
785
|
+
"view_form",
|
|
786
|
+
"view_id_all_select",
|
|
787
|
+
"view_enums_buttonset",
|
|
788
|
+
"queries",
|
|
789
|
+
"entry_server",
|
|
790
|
+
"sd"
|
|
791
|
+
]);
|
|
792
|
+
GenerateOptions = z$1.object({ overwrite: z$1.boolean().optional() });
|
|
793
|
+
PathAndCode = z$1.object({
|
|
794
|
+
path: z$1.string(),
|
|
795
|
+
code: z$1.string()
|
|
796
|
+
});
|
|
797
|
+
}));
|
|
927
798
|
|
|
928
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy90eXBlcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEZhc3RpZnlSZXBseSwgRmFzdGlmeVJlcXVlc3QgfSBmcm9tIFwiZmFzdGlmeVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB0eXBlIHsgQXBpRGVjb3JhdG9yT3B0aW9ucywgQ29udGV4dCB9IGZyb20gXCIuLi9hcGlcIjtcbmltcG9ydCB0eXBlIHsgR3VhcmRLZXkgfSBmcm9tIFwiLi8uLi9hcGkvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHR5cGUgeyBDYWNoZUNvbnRyb2xIYW5kbGVyIH0gZnJvbSBcIi4uL2NhY2hlLWNvbnRyb2wvdHlwZXNcIjtcblxuLypcbiAgVXRpbGl0eSBUeXBlc1xuKi9cbmV4cG9ydCBmdW5jdGlvbiB6QXJyYXlhYmxlPFQgZXh0ZW5kcyB6LlpvZFR5cGVBbnk+KHNoYXBlOiBUKTogei5ab2RVbmlvbjxbVCwgei5ab2RBcnJheTxUPl0+IHtcbiAgcmV0dXJuIHoudW5pb24oW3NoYXBlLCBzaGFwZS5hcnJheSgpXSk7XG59XG4vLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IGFueSBpcyB1c2VkIHRvIG1ha2UgdGhlIHR5cGUgZGlzdHJpYnV0aXZlXG5leHBvcnQgdHlwZSBEaXN0cmlidXRpdmVPbWl0PFQsIEsgZXh0ZW5kcyBrZXlvZiBhbnk+ID0gVCBleHRlbmRzIGFueSA/IE9taXQ8VCwgSz4gOiBuZXZlcjtcblxuLypcbiAgTW9kZWwtRGVmaW5pdGlvblxuKi9cblxuLyoqXG4gKiDrtoDrqqggRW50aXR5IGZpeHR1cmUg7IOd7ISxIOyLnCDtlajqu5gg7IOd7ISx7ZWgIGNvbXBhbmlvbiBFbnRpdHkg7ISk7KCVXG4gKlxuICog7JiIOiBVc2VyIGZpeHR1cmUg7IOd7ISxIOyLnCBjcmVkZW50aWFscyBBY2NvdW5066W8IO2VqOq7mCDsg53shLFcbiAqL1xuZXhwb3J0IHR5cGUgRml4dHVyZUNvbXBhbmlvbiA9IHtcbiAgLyoqIO2VqOq7mCDsg53shLHtlaAgRW50aXR5IOydtOumhCAqL1xuICBlbnRpdHk6IHN0cmluZztcblxuICAvKipcbiAgICog6rOg7KCVIOyYpOuyhOudvOydtOuTnCDqsJIuXG4gICAqIFwie3tmaWVsZE5hbWV9fVwiIO2YleyLneycvOuhnCDrtoDrqqggZml4dHVyZeydmCDtlYTrk5wg6rCS7J2EIOywuOyhsO2VoCDsiJgg7J6I64ukLlxuICAgKiDsmIg6IHsgXCJhY2NvdW50X2lkXCI6IFwie3tlbWFpbH19XCIgfSDihpIg67aA66qoIFVzZXLsnZggZW1haWwg6rCSIOyCrOyaqVxuICAgKi9cbiAgb3ZlcnJpZGVzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgLyoqXG4gICAqIOu2gOuqqCAx6rCc64u5IOyDneyEse2VoCBjb21wYW5pb24g6rCc7IiYLiDquLDrs7jqsJIgMS5cbiAgICog7JiIOiBjb3VudDogMiDihpIgVXNlciAx6rCc64u5IGNvbXBhbmlvbiAy6rCcIOyDneyEsVxuICAgKi9cbiAgY291bnQ/OiBudW1iZXI7XG59O1xuXG4vKipcbiAqIGNvbmU6IOuylOyaqSDrqZTtg4DrjbDsnbTthLAg7Iuc7Iqk7YWcXG4gKlxuICogRW50aXR5LCBQcm9wLCBFbnVtLCBTdWJzZXTsl5AgXCLshpTrsKnsmrjsnYQg64uo64ukXCLripQg6rCc64WQ7Jy866GcIOu2meydtOuKlCDri6jsnbwg7ISc7IigIOuplO2DgOuNsOydtO2EsOyeheuLiOuLpC5cbiAqIG5vdGUg7ZWY64KY66GcIOu5hOymiOuLiOyKpCDsnZjrr7jsmYAgZml4dHVyZSDsg53shLEg7Z6M7Yq466W8IO2VqOq7mCDquLDsiKDtlanri4jri6QuXG4gKi9cbmV4cG9ydCB0eXBlIENvbmUgPSB7XG4gIG5vdGU/OiBzdHJpbmc7IC8vIOydtCDrjIDsg4HsnbQg66y07JeH7J247KeAIOyEpOuqhSAo67mE7KaI64uI7IqkIOydmOuvuCArIGZpeHR1cmUg7Z6M7Yq4IO2Gte2VqSlcbiAgdGFncz86IHN0cmluZ1tdOyAvLyDrtoTrpZgv6rKA7IOJ7JqpIO2DnOq3uFxuXG4gIC8vIEZpeHR1cmUg7IOd7ISxIOq0gOugqFxuICBmaXh0dXJlR2VuZXJhdG9yPzogc3RyaW5nOyAvLyBGYWtlci5qcyDsvZTrk5wg65iQ64qUIOy7pOyKpO2FgCDtlajsiJhcbiAgZml4dHVyZURlZmF1bHQ/OiB1bmtub3duOyAvLyDquLDrs7jqsJJcbiAgZml4dHVyZVN0cmF0ZWd5PzogXCJzZXF1ZW5jZVwiOyAvLyBzdHJpbmcg7YOA7J6F7J207KeA66eMIERCIHNlcXVlbmNl66GcIOq0gOumrOuQmOuKlCBQSyAoYmV0dGVyLWF1dGgg65OxKVxuICBmaXh0dXJlQ29tcGFuaW9ucz86IEZpeHR1cmVDb21wYW5pb25bXTsgLy8g67aA66qoIGZpeHR1cmUg7IOd7ISxIOyLnCDtlajqu5gg7IOd7ISx7ZWgIGNvbXBhbmlvbiBFbnRpdHkg66qp66GdXG4gIGZpeHR1cmVQYXJlbnRPdmVycmlkZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjsgLy8gcGFyZW50SWQg7JeU7Yuw7Yuw7J2YIOu2gOuqqCDsg53shLEg7IucIOyCrOyaqe2VoCBvdmVycmlkZSDqsJIgKOyYiDogeyBhY2hpZXZlbWVudF90eXBlOiBcIlBBUEVSXCIgfSlcblxuICAvLyDssLjsobAg642w7J207YSwIOq0gOugqFxuICBkYXRhU291cmNlPzoge1xuICAgIHN0cmF0ZWd5OiBcInNhbXBsZVwiIHwgXCJpZHNcIiB8IFwicXVlcnlcIiB8IFwiZmlsZVwiIHwgXCJyZWNlbnRcIiB8IFwicmFuZG9tXCI7XG4gICAgY29uZmlnPzogdW5rbm93bjsgLy8g7KCE656167OEIOyEpOyglVxuICB9O1xuXG4gIC8vIO2ZleyepeyEsVxuICBba2V5OiBzdHJpbmddOiB1bmtub3duOyAvLyDsgqzsmqnsnpAg7KCV7J2YIOuplO2DgOuNsOydtO2EsFxufTtcblxuZXhwb3J0IHR5cGUgR2VuZXJhdGVkQ29sdW1uVHlwZSA9IFwiU1RPUkVEXCIgfCBcIlZJUlRVQUxcIjtcbmV4cG9ydCB0eXBlIEdlbmVyYXRlZENvbHVtbiA9IHtcbiAgdHlwZTogR2VuZXJhdGVkQ29sdW1uVHlwZTtcbiAgZXhwcmVzc2lvbjogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIENvbW1vblByb3AgPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgbnVsbGFibGU/OiBib29sZWFuO1xuICB0b0ZpbHRlcj86IHRydWU7XG4gIGRlc2M/OiBzdHJpbmc7XG4gIGRiRGVmYXVsdD86IHN0cmluZztcbiAgZ2VuZXJhdGVkPzogR2VuZXJhdGVkQ29sdW1uO1xuICBjb25lPzogQ29uZTsgLy8gY29uZSDrqZTtg4DrjbDsnbTthLBcbn07XG5cbi8qKlxuICogcHJvcOydmCDshKTrqoXsnYQg67CY7ZmY7ZWp64uI64ukLlxuICpcbiAqIGNvbmUubm90ZeqwgCDsnojsnLzrqbQg7Jqw7ISgIOyCrOyaqe2VmOqzoCwg7JeG7Jy866m0IHByb3AuZGVzY+ulvCDsgqzsmqntlanri4jri6QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZXNjcmlwdGlvbihpdGVtOiB7IGRlc2M/OiBzdHJpbmc7IGNvbmU/OiBDb25lIH0pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gaXRlbS5jb25lPy5ub3RlIHx8IGl0ZW0uZGVzYztcbn1cbmV4cG9ydCB0eXBlIEludGVnZXJQcm9wID0gQ29tbW9uUHJvcCAmIHtcbiAgdHlwZTogXCJpbnRlZ2VyXCI7XG59OyAvLyBQRzogaW50ZWdlciAvIFRTOiBudW1iZXIgLyBKU09OOiBudW1iZXJcbmV4cG9ydCB0eXBlIEludGVnZXJBcnJheVByb3AgPSBDb21tb25Qcm9wICYge1xuICB0eXBlOiBcImludGVnZXJbXVwiO1xufTsgLy8gUEc6IGludGVnZXJbXSAvIFRTOiBudW1iZXJbXSAvIEpTT046IG51bWJlcltdXG5leHBvcnQgdHlwZSBCaWdJbnRlZ2VyUHJvcCA9IENvbW1vblByb3AgJiB7XG4gIHR5cGU6IFwiYmlnSW50ZWdlclwiO1xufTsgLy8gUEc6IGJpZ2ludCAvIFRTOiBiaWdpbnQgLyBKU09OOiBiaWdpbnRcbmV4cG9ydCB0eXBlIEJpZ0ludGVnZXJBcnJheVByb3AgPSBDb21tb25Qcm9wICYge1xuICB0eXBlOiBcImJpZ0ludGVnZXJbXVwiO1xufTsgLy8gUEc6IGJpZ2ludFtdIC8gVFM6IGJpZ2ludFtdIC8gSlNPTjogYmlnaW50W11cblxuLyoqXG4gKiBab2QgNCBTdHJpbmcgRm9ybWF0IO2DgOyehVxuICogZW50aXR5Lmpzb27sl5DshJwgc3RyaW5nIO2DgOyeheydmCBwcm9w7JeQIHpvZEZvcm1hdCDsmLXshZjsnYQg7KeA7KCV7ZWY7JesXG4gKiBCYXNlU2NoZW1hIOyDneyEsSDsi5wgWm9k7J2YIHN0cmluZyBmb3JtYXQgdmFsaWRhdGlvbuydhCDsoIHsmqntlanri4jri6QuXG4gKi9cbmV4cG9ydCBjb25zdCBab2RTdHJpbmdGb3JtYXQgPSB6LmVudW0oW1xuICAvLyDquLDrs7gg7Y+s66e3XG4gIFwiZW1haWxcIixcbiAgXCJ1dWlkXCIsXG4gIFwidXJsXCIsXG4gIFwiaHR0cFVybFwiLFxuICBcImhvc3RuYW1lXCIsXG4gIFwiZW1vamlcIixcbiAgXCJiYXNlNjRcIixcbiAgXCJiYXNlNjR1cmxcIixcbiAgXCJoZXhcIixcbiAgXCJqd3RcIixcbiAgXCJuYW5vaWRcIixcbiAgXCJjdWlkXCIsXG4gIFwiY3VpZDJcIixcbiAgXCJ1bGlkXCIsXG4gIFwiaXB2NFwiLFxuICBcImlwdjZcIixcbiAgXCJtYWNcIixcbiAgXCJjaWRydjRcIixcbiAgXCJjaWRydjZcIixcbiAgLy8gaGFzaCDtj6zrp7cgKOyVjOqzoOumrOymmOuzhClcbiAgXCJoYXNoTWQ1XCIsXG4gIFwiaGFzaFNoYTFcIixcbiAgXCJoYXNoU2hhMjU2XCIsXG4gIFwiaGFzaFNoYTM4NFwiLFxuICBcImhhc2hTaGE1MTJcIixcbiAgLy8gSVNPIO2PrOunt1xuICBcImlzb0RhdGVcIixcbiAgXCJpc29UaW1lXCIsXG4gIFwiaXNvRGF0ZXRpbWVcIixcbiAgXCJpc29EdXJhdGlvblwiLFxuXSk7XG5leHBvcnQgdHlwZSBab2RTdHJpbmdGb3JtYXQgPSB6LmluZmVyPHR5cGVvZiBab2RTdHJpbmdGb3JtYXQ+O1xuXG5leHBvcnQgdHlwZSBTdHJpbmdQcm9wID0gQ29tbW9uUHJvcCAmIHtcbiAgdHlwZTogXCJzdHJpbmdcIjtcbiAgbGVuZ3RoPzogbnVtYmVyOyAvLyBQRzogdmFyY2hhcihuKSwgdGV4dCAvIFRTOiBzdHJpbmcgLyBKU09OOiBzdHJpbmdcbiAgem9kRm9ybWF0PzogWm9kU3RyaW5nRm9ybWF0O1xufTsgLy8gUEc6IHRleHQgLyBUUzogc3RyaW5nIC8gSlNPTjogc3RyaW5nXG5leHBvcnQgdHlwZSBTdHJpbmdBcnJheVByb3AgPSBDb21tb25Qcm9wICYge1xuICB0eXBlOiBcInN0cmluZ1tdXCI7XG4gIGxlbmd0aD86IG51bWJlcjsgLy8gUEc6IHZhcmNoYXIobilbXSwgdGV4dFtdIC8gVFM6IHN0cmluZ1tdIC8gSlNPTjogc3RyaW5nW11cbiAgem9kRm9ybWF0PzogWm9kU3RyaW5nRm9ybWF0O1xufTsgLy8gUEc6IHZhcmNoYXIobilbXSwgdGV4dFtdIC8gVFM6IHN0cmluZ1tdIC8gSlNPTjogc3RyaW5nW11cbmV4cG9ydCB0eXBlIEVudW1Qcm9wID0gQ29tbW9uUHJvcCAmIHtcbiAgdHlwZTogXCJlbnVtXCI7XG4gIGlkOiBzdHJpbmc7XG4gIGxlbmd0aD86IG51bWJlcjtcbn07IC8vIFBHOiB0ZXh0IC8gVFM6IHN0cmluZyAvIEpTT046IHN0cmluZ1xuZXhwb3J0IHR5cGUgRW51bUFycmF5UHJvcCA9IENvbW1vblByb3AgJiB7XG4gIHR5cGU6IFwiZW51bVtdXCI7XG4gIGlkOiBzdHJpbmc7XG59OyAvLyBQRzogdGV4dFtdIC8gVFM6IHN0cmluZ1tdIC8gSlNPTjogc3RyaW5nW11cbmV4cG9ydCB0eXBlIE51bWJlclByb3AgPSBDb21tb25Qcm9wICYge1xuICB0eXBlOiBcIm51bWJlclwiO1xuICBwcmVjaXNpb24/OiBudW1iZXI7IC8vIFBHOiBudW1lcmljKHAsIHMpIC8gVFM6IG51bWJlciAvIEpTT046IG51bWJlclxuICBzY2FsZT86IG51bWJlcjsgLy8gUEc6IG51bWVyaWMocCwgcykgLyBUUzogbnVtYmVyIC8gSlNPTjogbnVtYmVyXG4gIG51bWJlclR5cGU/OiBcInJlYWxcIiB8IFwiZG91YmxlIHByZWNpc2lvblwiIHwgXCJudW1lcmljXCI7IC8vIOq4sOuzuOqwkjogbnVtZXJpY1xufTsgLy8gUEc6IG51bWVyaWMocCwgcykgLyBUUzogbnVtYmVyIC8gSlNPTjogbnVtYmVyXG5leHBvcnQgdHlwZSBOdW1iZXJBcnJheVByb3AgPSBDb21tb25Qcm9wICYge1xuICB0eXBlOiBcIm51bWJlcltdXCI7XG4gIHByZWNpc2lvbj86IG51bWJlcjtcbiAgc2NhbGU/OiBudW1iZXI7XG4gIG51bWJlclR5cGU/OiBcInJlYWxcIiB8IFwiZG91YmxlIHByZWNpc2lvblwiIHwgXCJudW1lcmljXCI7IC8vIOq4sOuzuOqwkjogbnVtZXJpY1xufTsgLy8gUEc6IG51bWVyaWMocCwgcylbXSAvIFRTOiBudW1iZXJbXSAvIEpTT046IG51bWJlcltdXG5leHBvcnQgdHlwZSBOdW1lcmljUHJvcCA9IENvbW1vblByb3AgJiB7XG4gIHR5cGU6IFwibnVtZXJpY1wiO1xuICBwcmVjaXNpb24/OiBudW1iZXI7XG4gIHNjYWxlPzogbnVtYmVyO1xufTsgLy8gUEc6IG51bWVyaWMocCwgcykgLyBUUzogc3RyaW5nIC8gSlNPTjogc3RyaW5nXG5leHBvcnQgdHlwZSBOdW1lcmljQXJyYXlQcm9wID0gQ29tbW9uUHJvcCAmIHtcbiAgdHlwZTogXCJudW1lcmljW11cIjtcbiAgcHJlY2lzaW9uPzogbnVtYmVyO1xuICBzY2FsZT86IG51bWJlcjtcbn07IC8vIFBHOiBudW1lcmljKHAsIHMpW10gLyBUUzogc3RyaW5nW10gLyBKU09OOiBzdHJpbmdbXVxuZXhwb3J0IHR5cGUgQm9vbGVhblByb3AgPSBDb21tb25Qcm9wICYge1xuICB0eXBlOiBcImJvb2xlYW5cIjtcbn07IC8vIFBHOiBib29sZWFuIC8gVFM6IGJvb2xlYW4gLyBKU09OOiBib29sZWFuXG5leHBvcnQgdHlwZSBCb29sZWFuQXJyYXlQcm9wID0gQ29tbW9uUHJvcCAmIHtcbiAgdHlwZTogXCJib29sZWFuW11cIjtcbn07IC8vIFBHOiBib29sZWFuW10gLyBUUzogYm9vbGVhbltdIC8gSlNPTjogYm9vbGVhbltdXG5leHBvcnQgdHlwZSBEYXRlUHJvcCA9IENvbW1vblByb3AgJiB7XG4gIHR5cGU6IFwiZGF0ZVwiO1xuICAvLyDquLDrs7jqsJLsnYAgMywgbWljcm9zZWNvbmRz66W8IOyTsOugpOuptCA27J2EIOyNqOyVvO2VqCAoMCB+IDYpXG4gIHByZWNpc2lvbj86IG51bWJlcjtcbn07IC8vIFBHOiB0aW1lc3RhbXB6IC8gVFM6IERhdGUgLyBKU09OOiBzdHJpbmcoSVNPU3RyaW5nKVxuZXhwb3J0IHR5cGUgRGF0ZUFycmF5UHJvcCA9IENvbW1vblByb3AgJiB7XG4gIHR5cGU6IFwiZGF0ZVtdXCI7XG4gIC8vIOq4sOuzuOqwkuydgCAzLCBtaWNyb3NlY29uZHPrpbwg7JOw66Ck66m0IDbsnYQg7I2o7JW87ZWoICgwIH4gNilcbiAgcHJlY2lzaW9uPzogbnVtYmVyO1xufTsgLy8gUEc6IHRpbWVzdGFtcHR6W10gLyBUUzogRGF0ZVtdIC8gSlNPTjogc3RyaW5nW11cbmV4cG9ydCB0eXBlIEpzb25Qcm9wID0gQ29tbW9uUHJvcCAmIHtcbiAgdHlwZTogXCJqc29uXCI7XG4gIGlkOiBzdHJpbmc7XG59OyAvLyBQRzoganNvbiAvIFRTOiBhbnkoaWQpIC8gSlNPTjogYW55XG5leHBvcnQgdHlwZSBTZWFyY2hUZXh0U291cmNlQ29sdW1uID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGNhc2VJbnNlbnNpdGl2ZT86IGJvb2xlYW47XG59O1xuZXhwb3J0IHR5cGUgU2VhcmNoVGV4dFByb3AgPSBDb21tb25Qcm9wICYge1xuICB0eXBlOiBcInNlYXJjaFRleHRcIjtcbiAgc291cmNlQ29sdW1uczogU2VhcmNoVGV4dFNvdXJjZUNvbHVtbltdO1xufTsgLy8gUEc6IHRleHQgKGdlbmVyYXRlZCkgLyBUUzogc3RyaW5nIC8gSlNPTjogc3RyaW5nXG5leHBvcnQgdHlwZSBVdWlkUHJvcCA9IENvbW1vblByb3AgJiB7XG4gIHR5cGU6IFwidXVpZFwiO1xufTsgLy8gUEc6IHV1aWQgLyBUUzogc3RyaW5nIC8gSlNPTjogc3RyaW5nXG5leHBvcnQgdHlwZSBVdWlkQXJyYXlQcm9wID0gQ29tbW9uUHJvcCAmIHtcbiAgdHlwZTogXCJ1dWlkW11cIjtcbn07IC8vIFBHOiB1dWlkW10gLyBUUzogc3RyaW5nW10gLyBKU09OOiBzdHJpbmdbXVxuZXhwb3J0IHR5cGUgVmlydHVhbFByb3AgPSBDb21tb25Qcm9wICYge1xuICB0eXBlOiBcInZpcnR1YWxcIjtcbiAgaWQ6IHN0cmluZztcbiAgdmlydHVhbFR5cGU/OiBcInF1ZXJ5XCIgfCBcImNvZGVcIjsgLy8gZGVmYXVsdDogXCJjb2RlXCJcbn07IC8vIFBHOiBub25lIC8gVFM6IGFueShpZCkgLyBKU09OOiBhbnlcbmV4cG9ydCB0eXBlIFZlY3RvclByb3AgPSBDb21tb25Qcm9wICYge1xuICB0eXBlOiBcInZlY3RvclwiO1xuICBkaW1lbnNpb25zOiBudW1iZXI7XG59O1xuZXhwb3J0IHR5cGUgVmVjdG9yQXJyYXlQcm9wID0gQ29tbW9uUHJvcCAmIHtcbiAgdHlwZTogXCJ2ZWN0b3JbXVwiO1xuICBkaW1lbnNpb25zOiBudW1iZXI7XG59O1xuZXhwb3J0IHR5cGUgVHNWZWN0b3JQcm9wID0gQ29tbW9uUHJvcCAmIHtcbiAgdHlwZTogXCJ0c3ZlY3RvclwiO1xufTtcbmV4cG9ydCB0eXBlIFJlbGF0aW9uVHlwZSA9IFwiSGFzTWFueVwiIHwgXCJCZWxvbmdzVG9PbmVcIiB8IFwiTWFueVRvTWFueVwiIHwgXCJPbmVUb09uZVwiO1xuZXhwb3J0IHR5cGUgUmVsYXRpb25PbiA9IFwiQ0FTQ0FERVwiIHwgXCJTRVQgTlVMTFwiIHwgXCJOTyBBQ1RJT05cIiB8IFwiU0VUIERFRkFVTFRcIiB8IFwiUkVTVFJJQ1RcIjtcbnR5cGUgX1JlbGF0aW9uUHJvcCA9IHtcbiAgdHlwZTogXCJyZWxhdGlvblwiO1xuICBuYW1lOiBzdHJpbmc7XG4gIHdpdGg6IHN0cmluZztcbiAgbnVsbGFibGU/OiBib29sZWFuOyAvLyBERUZBVUxUOiBmYWxzZVxuICB0b0ZpbHRlcj86IHRydWU7IC8vIERFRkFVTFQ6IGZhbHNlXG4gIGRlc2M/OiBzdHJpbmc7XG4gIGNvbmU/OiBDb25lOyAvLyBjb25lIOuplO2DgOuNsOydtO2EsFxufTtcbmV4cG9ydCB0eXBlIE9uZVRvT25lUmVsYXRpb25Qcm9wID0gX1JlbGF0aW9uUHJvcCAmIHtcbiAgcmVsYXRpb25UeXBlOiBcIk9uZVRvT25lXCI7XG4gIGN1c3RvbUpvaW5DbGF1c2U/OiBzdHJpbmc7XG59ICYgKFxuICAgIHwge1xuICAgICAgICBoYXNKb2luQ29sdW1uOiB0cnVlO1xuICAgICAgICB1c2VDb25zdHJhaW50PzogYm9vbGVhbjsgLy8gREVGQVVMVDogdHJ1ZVxuICAgICAgICBvblVwZGF0ZT86IFJlbGF0aW9uT247IC8vIERFRkFVTFQ6IFJFU1RSSUNUXG4gICAgICAgIG9uRGVsZXRlPzogUmVsYXRpb25PbjsgLy8gREVGQVVMVDogUkVTVFJJQ1RcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgaGFzSm9pbkNvbHVtbjogZmFsc2U7XG4gICAgICB9XG4gICk7XG5leHBvcnQgdHlwZSBCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AgPSBfUmVsYXRpb25Qcm9wICYge1xuICByZWxhdGlvblR5cGU6IFwiQmVsb25nc1RvT25lXCI7XG4gIGN1c3RvbUpvaW5DbGF1c2U/OiBzdHJpbmc7XG4gIHVzZUNvbnN0cmFpbnQ/OiBib29sZWFuOyAvLyBERUZBVUxUOiB0cnVlXG4gIG9uVXBkYXRlPzogUmVsYXRpb25PbjsgLy8gREVGQVVMVDogUkVTVFJJQ1RcbiAgb25EZWxldGU/OiBSZWxhdGlvbk9uOyAvLyBERUZBVUxUOiBSRVNUUklDVFxufTtcbmV4cG9ydCB0eXBlIEhhc01hbnlSZWxhdGlvblByb3AgPSBfUmVsYXRpb25Qcm9wICYge1xuICByZWxhdGlvblR5cGU6IFwiSGFzTWFueVwiO1xuICBqb2luQ29sdW1uOiBzdHJpbmc7XG4gIGZyb21Db2x1bW4/OiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgTWFueVRvTWFueVJlbGF0aW9uUHJvcCA9IF9SZWxhdGlvblByb3AgJiB7XG4gIHJlbGF0aW9uVHlwZTogXCJNYW55VG9NYW55XCI7XG4gIGpvaW5UYWJsZTogYCR7c3RyaW5nfV9fJHtzdHJpbmd9YDtcbiAgb25VcGRhdGU6IFJlbGF0aW9uT247XG4gIG9uRGVsZXRlOiBSZWxhdGlvbk9uO1xufTtcbmV4cG9ydCB0eXBlIFJlbGF0aW9uUHJvcCA9XG4gIHwgT25lVG9PbmVSZWxhdGlvblByb3BcbiAgfCBCZWxvbmdzVG9PbmVSZWxhdGlvblByb3BcbiAgfCBIYXNNYW55UmVsYXRpb25Qcm9wXG4gIHwgTWFueVRvTWFueVJlbGF0aW9uUHJvcDtcblxuZXhwb3J0IHR5cGUgRW50aXR5UHJvcCA9XG4gIHwgSW50ZWdlclByb3BcbiAgfCBJbnRlZ2VyQXJyYXlQcm9wXG4gIHwgQmlnSW50ZWdlclByb3BcbiAgfCBCaWdJbnRlZ2VyQXJyYXlQcm9wXG4gIHwgU3RyaW5nUHJvcFxuICB8IFN0cmluZ0FycmF5UHJvcFxuICB8IEVudW1Qcm9wXG4gIHwgRW51bUFycmF5UHJvcFxuICB8IE51bWJlclByb3BcbiAgfCBOdW1iZXJBcnJheVByb3BcbiAgfCBOdW1lcmljUHJvcFxuICB8IE51bWVyaWNBcnJheVByb3BcbiAgfCBOdW1lcmljUHJvcFxuICB8IEJvb2xlYW5Qcm9wXG4gIHwgQm9vbGVhbkFycmF5UHJvcFxuICB8IERhdGVQcm9wXG4gIHwgRGF0ZUFycmF5UHJvcFxuICB8IFV1aWRQcm9wXG4gIHwgVXVpZEFycmF5UHJvcFxuICB8IEpzb25Qcm9wXG4gIHwgU2VhcmNoVGV4dFByb3BcbiAgfCBWaXJ0dWFsUHJvcFxuICB8IFZlY3RvclByb3BcbiAgfCBWZWN0b3JBcnJheVByb3BcbiAgfCBUc1ZlY3RvclByb3BcbiAgfCBSZWxhdGlvblByb3A7XG5cbi8qKlxuICogU29uYW11RmlsZSBUeXBlc1xuICpcbiAqIO2MjOydvCDsl4XroZzrk5zrpbwg7JyE7ZWcIEpTT04g7YOA7J6F7J6F64uI64ukLlxuICogRW50aXR57J2YIGpzb24g7IaN7ISx7JeQ7IScIGlk66GcIFwiU29uYW11RmlsZVwiIOuYkOuKlCBcIlNvbmFtdUZpbGVbXVwi7J2EIOyngOygle2VmOyXrCDsgqzsmqntlanri4jri6QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU29uYW11RmlsZSB7XG4gIG5hbWU6IHN0cmluZztcbiAgdXJsOiBzdHJpbmc7XG4gIG1pbWVfdHlwZTogc3RyaW5nO1xuICBzaXplOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBTb25hbXVGaWxlU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBuYW1lOiB6LnN0cmluZygpLFxuICAgIHVybDogei5zdHJpbmcoKSxcbiAgICBtaW1lX3R5cGU6IHouc3RyaW5nKCksXG4gICAgc2l6ZTogei5udW1iZXIoKSxcbiAgfSlcbiAgLmRlc2NyaWJlKFwiU29uYW11RmlsZVwiKTtcblxuZXhwb3J0IGNvbnN0IFNvbmFtdUZpbGVBcnJheVNjaGVtYSA9IHouYXJyYXkoU29uYW11RmlsZVNjaGVtYSkuZGVzY3JpYmUoXCJTb25hbXVGaWxlW11cIik7XG5cbi8qKlxuICogU29uYW11IOy9lOyWtOyXkOyEnCDsoJzqs7XtlZjripQg64K07J6lIEpTT04g7YOA7J6FIElEIOuqqeuhnVxuICog7IOI66Gc7Jq0IOuCtOyepSDtg4DsnoUg7LaU6rCAIOyLnCDsnbQg67Cw7Je07JeQIOy2lOqwgO2VmOuptCDsnpDrj5nsnLzroZwgVUnsl5Ag64W47Lac65Cp64uI64ukLlxuICovXG5leHBvcnQgY29uc3QgQlVJTFRfSU5fVFlQRV9JRFMgPSBbXCJTb25hbXVGaWxlXCIsIFwiU29uYW11RmlsZVtdXCJdIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgQnVpbHRJblR5cGVJZCA9ICh0eXBlb2YgQlVJTFRfSU5fVFlQRV9JRFMpW251bWJlcl07XG5cbi8qKlxuICogcGd2ZWN0b3Ig6rGw66asIOyXsOyCsOyekCDtgbTrnpjsiqRcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIC0gYHZlY3Rvcl9jb3NpbmVfb3BzYDog7L2U7IKs7J24IOqxsOumrCAoQ29zaW5lIERpc3RhbmNlKSAtIOq2jOyepVxuICogICAtIFNRTCDsl7DsgrDsnpA6IGA8PT5gXG4gKiAgIC0g67Kh7YSw7J2YIOuwqe2WpeunjCDruYTqtZAgKO2BrOq4sCDrrLTsi5wpLCAxIC0gY29zaW5lX3NpbWlsYXJpdHlcbiAqICAgLSDthY3siqTtirgg7J6E67Kg65SpLCDsi5zrp6jti7Eg6rKA7IOJ7JeQIOqwgOyepSDsnbzrsJjsoIHsnLzroZwg7IKs7JqpXG4gKiAgIC0g7IKs7JqpIOyYiDogT3BlbkFJLCBWb3lhZ2Ug65OxIOuMgOu2gOu2hOydmCDsnoTrsqDrlKkg66qo64247JeQIOq2jOyepVxuICpcbiAqIC0gYHZlY3Rvcl9pcF9vcHNgOiDrgrTsoIEgKElubmVyIFByb2R1Y3QpXG4gKiAgIC0gU1FMIOyXsOyCsOyekDogYDwjPmBcbiAqICAgLSDrkZAg67Kh7YSw7J2YIOuCtOyggeydhCDqs4TsgrAgKHN1bShhW2ldICogYltpXSkpXG4gKiAgIC0g7KCV6rec7ZmU65CcIOuyoe2EsOyXkOyEnCDsvZTsgqzsnbgg7Jyg7IKs64+E7JmAIOuPmeydvO2VnCDqsrDqs7xcbiAqICAgLSDqsJLsnbQg7YG07IiY66GdIOycoOyCrCAo7J2M7IiYIOyXsOyCsOyekOydtOuvgOuhnCBPUkRFUiBCWeyXkOyEnCDso7zsnZgpXG4gKiAgIC0g7IKs7JqpIOyYiDog7J2066+4IOygleq3nO2ZlOuQnCDsnoTrsqDrlKnsl5DshJwg6rCA7J6lIOu5oOuluCDshLHriqVcbiAqXG4gKiAtIGB2ZWN0b3JfbDJfb3BzYDog7Jyg7YG066as65OcIOqxsOumrCAoTDIgRGlzdGFuY2UpXG4gKiAgIC0gU1FMIOyXsOyCsOyekDogYDwtPmBcbiAqICAgLSDrkZAg67Kh7YSwIOqwhOydmCDsp4HshKAg6rGw66as66W8IOqzhOyCsCAoc3FydChzdW0oKGFbaV0gLSBiW2ldKV4yKSkpXG4gKiAgIC0g67Kh7YSw7J2YIO2BrOq4sChtYWduaXR1ZGUp6rCAIOykkeyalO2VoCDrlYwg7IKs7JqpXG4gKiAgIC0g7IKs7JqpIOyYiDog7J2066+47KeAIOycoOyCrOuPhCwg7KCI64yA7KCBIOqxsOumrCDsuKHsoJXsnbQg7ZWE7JqU7ZWcIOqyveyasFxuICovXG5leHBvcnQgdHlwZSBWZWN0b3JPcHMgPSBcInZlY3Rvcl9jb3NpbmVfb3BzXCIgfCBcInZlY3Rvcl9pcF9vcHNcIiB8IFwidmVjdG9yX2wyX29wc1wiO1xuXG5leHBvcnQgY29uc3QgS25vd25PcGNsYXNzVmFsdWVzID0gW1xuICBcImdpbl90cmdtX29wc1wiLFxuICBcImdpc3RfdHJnbV9vcHNcIixcbiAgXCJnaW5fYmlnbV9vcHNcIixcbiAgXCJ2ZWN0b3JfY29zaW5lX29wc1wiLFxuICBcInZlY3Rvcl9pcF9vcHNcIixcbiAgXCJ2ZWN0b3JfbDJfb3BzXCIsXG4gIFwicGdyb29uZ2FfdmFyY2hhcl9mdWxsX3RleHRfc2VhcmNoX29wc192MlwiLFxuICBcInBncm9vbmdhX2pzb25iX2Z1bGxfdGV4dF9zZWFyY2hfb3BzX3YyXCIsXG5dIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgS25vd25PcGNsYXNzID0gKHR5cGVvZiBLbm93bk9wY2xhc3NWYWx1ZXMpW251bWJlcl07XG5cbnR5cGUgRW50aXR5SW5kZXhDb2x1bW4gPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgbnVsbHNGaXJzdD86IGJvb2xlYW47XG4gIHNvcnRPcmRlcj86IFwiQVNDXCIgfCBcIkRFU0NcIjtcbiAgLyoqIHBndmVjdG9yIOyduOuNseyKpOyXkOyEnCDsgqzsmqntlaAg6rGw66asIOyXsOyCsOyekCAodmVjdG9yIOy7rOufvOyXkOunjCDsoIHsmqkpICovXG4gIHZlY3Rvck9wcz86IFZlY3Rvck9wcztcbiAgLyoqIGdlbmVyaWMg7J24642x7IqkIG9wY2xhc3MgKHZlY3Rvck9wc+uKlCDtlZjsnITtmLjtmZgg66qp7KCB7Jy866GcIOycoOyngCkgKi9cbiAgb3BjbGFzcz86IEtub3duT3BjbGFzcyB8IHN0cmluZztcbn07XG5leHBvcnQgdHlwZSBFbnRpdHlJbmRleCA9IHtcbiAgdHlwZTogXCJpbmRleFwiIHwgXCJ1bmlxdWVcIiB8IFwiaG5zd1wiIHwgXCJpdmZmbGF0XCI7XG4gIGNvbHVtbnM6IEVudGl0eUluZGV4Q29sdW1uW107XG4gIG5hbWU6IHN0cmluZztcbiAgdXNpbmc/OiBcImJ0cmVlXCIgfCBcImhhc2hcIiB8IFwiZ2luXCIgfCBcImdpc3RcIiB8IFwicGdyb29uZ2FcIjtcbiAgbnVsbHNOb3REaXN0aW5jdD86IGJvb2xlYW47IC8vIHVuaXF1ZSBpbmRleCBvbmx5XG4gIC8qKlxuICAgKiBITlNXIChIaWVyYXJjaGljYWwgTmF2aWdhYmxlIFNtYWxsIFdvcmxkKSDsnbjrjbHsiqQ6IOqwgSDrhbjrk5zsnZgg7LWc64yAIOyXsOqysCDsiJhcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIOq3uOuemO2UhOyXkOyEnCDqsIEg64W465Oc6rCAIOqwgOyniCDsiJgg7J6I64qUIOy1nOuMgCDsl7DqsrAg7IiY7J6F64uI64ukLlxuICAgKiBITlNX64qUIOu5oOuluCDqsoDsg4kg7IaN64+E7JmAIOuGkuydgCDsoJXtmZXrj4Trpbwg7KCc6rO17ZWY66+A66GcIOq2jOyepeuQqeuLiOuLpC5cbiAgICogLSDquLDrs7jqsJI6IDE2XG4gICAqIC0g67KU7JyEOiAyIH4gMTAwXG4gICAqIC0g64aS7J2E7IiY66GdOiDsoJXtmZXrj4TihpEsIOu5jOuTnCDsi5zqsITihpEsIOuplOuqqOumrOKGkVxuICAgKiAtIOq2jOyepTog67mg66W4IOu5jOuTnCg4KSwg6reg7ZiVKDE2KSwg64aS7J2AIOygle2ZleuPhCgzMiksIOy1nOqzoCDsoJXtmZXrj4QoNjQpXG4gICAqL1xuICBtPzogbnVtYmVyO1xuICAvKipcbiAgICogSE5TVyAoSGllcmFyY2hpY2FsIE5hdmlnYWJsZSBTbWFsbCBXb3JsZCkg7J24642x7IqkOiDqtazshLEg7IucIO2DkOyDiSDrspTsnIRcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIOyduOuNseyKpCDqtazshLEg7IucIOqwgSDrhbjrk5zsl5DshJwg7YOQ7IOJ7ZWgIOuylOychOyeheuLiOuLpC5cbiAgICogLSDquLDrs7jqsJI6IDY0XG4gICAqIC0g67KU7JyEOiA0IH4gMTAwMFxuICAgKiAtIOuGkuydhOyImOuhnTog7KCV7ZmV64+E4oaRLCDruYzrk5wg7Iuc6rCE4oaRXG4gICAqIC0g6raM7J6lOiDruaDrpbgg67mM65OcKDMyKSwg6reg7ZiVKDY0KSwg64aS7J2AIOygle2ZleuPhCgxMjgpLCDstZzqs6Ag7KCV7ZmV64+EKDI1NilcbiAgICovXG4gIGVmQ29uc3RydWN0aW9uPzogbnVtYmVyO1xuICAvKipcbiAgICogSVZGRmxhdCAoSW52ZXJ0ZWQgRmlsZSB3aXRoIEZsYXQgQ29tcHJlc3Npb24pIOyduOuNseyKpDog7YG065+s7Iqk7YSw66eBIOumrOyKpO2KuCDsiJhcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIOuyoe2EsOulvCDtgbTrn6zsiqTthLDrp4HtlaAg67KE7YK3IOyImOulvCDsp4DsoJXtlanri4jri6QuXG4gICAqIElWRkZsYXTsnYAg67mg66W4IOu5jOuTnOyZgCDrgq7snYAg66mU66qo66asIOyCrOyaqeydtCDtlYTsmpTtlaAg65WMIOyCrOyaqe2VqeuLiOuLpC5cbiAgICogLSDqtozsnqXqsJI6IHNxcnQocm93X2NvdW50KSB+IHJvd19jb3VudCAvIDEwMDBcbiAgICogLSDsmIjsi5w6IDEwLDAwMO2WiSDihpIgMTAwLCAxMDAsMDAw7ZaJIOKGkiAzMDAsIDEsMDAwLDAwMO2WiSDihpIgMTAwMFxuICAgKiAtIOunjuydhOyImOuhnSDsoJXtmZXrj4TihpEsIOqygOyDiSDsho3rj4TihpNcbiAgICovXG4gIGxpc3RzPzogbnVtYmVyO1xufTtcblxuLy8gU3Vic2V0RmllbGQg7YOA7J6FOiBzdHJpbmcg65iQ64qUIGludGVybmFsIOyYteyFmOydtCDsnojripQg6rCd7LK0XG5leHBvcnQgdHlwZSBTdWJzZXRGaWVsZCA9IHN0cmluZyB8IHsgZmllbGQ6IHN0cmluZzsgaW50ZXJuYWw/OiBib29sZWFuIH07XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVTdWJzZXRGaWVsZChmOiBTdWJzZXRGaWVsZCk6IHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgZiA9PT0gXCJzdHJpbmdcIiA/IGYgOiBmLmZpZWxkO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzSW50ZXJuYWxTdWJzZXRGaWVsZChmOiBTdWJzZXRGaWVsZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIGYgIT09IFwic3RyaW5nXCIgJiYgZi5pbnRlcm5hbCA9PT0gdHJ1ZTtcbn1cblxuLyoqXG4gKiBTdWJzZXREZWY6IFN1YnNldCDsoJXsnZhcbiAqXG4gKiDtlZjsnIQg7Zi47ZmY7ISx7J2EIOychO2VtCBTdWJzZXRGaWVsZFtdIOuwsOyXtCDtmJXtg5zrj4Qg7KeA7JuQ7ZWp64uI64ukLlxuICovXG5leHBvcnQgdHlwZSBTdWJzZXREZWYgPVxuICB8IFN1YnNldEZpZWxkW10gLy8g6riw7KG0IOuwsOyXtCDtmJXtg5xcbiAgfCB7XG4gICAgICAvLyDsg4jroZzsmrQg6rCd7LK0IO2Yle2DnFxuICAgICAgZmllbGRzOiBTdWJzZXRGaWVsZFtdO1xuICAgICAgY29uZT86IENvbmU7XG4gICAgfTtcblxuLyoqXG4gKiBFbnVtRGVmOiBFbnVtIOygleydmFxuICpcbiAqIO2VmOychCDtmLjtmZjshLHsnYQg7JyE7ZW0IFJlY29yZDxzdHJpbmcsIHN0cmluZz4g7ZiV7YOc64+EIOyngOybkO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IHR5cGUgRW51bURlZiA9XG4gIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPiAvLyDquLDsobQgUmVjb3JkIO2Yle2DnFxuICB8IHtcbiAgICAgIC8vIOyDiOuhnOyatCDqsJ3ssrQg7ZiV7YOcXG4gICAgICB2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgICBjb25lPzogQ29uZTtcbiAgICB9O1xuXG4vKipcbiAqIFN1YnNldERlZuqwgCDsg4jroZzsmrQg6rCd7LK0IO2Yle2DnOyduOyngCDtmZXsnbhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3Vic2V0RGVmV2l0aENvbmUoZGVmOiBTdWJzZXREZWYpOiBkZWYgaXMgeyBmaWVsZHM6IFN1YnNldEZpZWxkW107IGNvbmU/OiBDb25lIH0ge1xuICByZXR1cm4gIUFycmF5LmlzQXJyYXkoZGVmKSAmJiBcImZpZWxkc1wiIGluIGRlZjtcbn1cblxuLyoqXG4gKiBFbnVtRGVm6rCAIOyDiOuhnOyatCDqsJ3ssrQg7ZiV7YOc7J247KeAIO2ZleyduFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFbnVtRGVmV2l0aENvbmUoXG4gIGRlZjogRW51bURlZixcbik6IGRlZiBpcyB7IHZhbHVlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjsgY29uZT86IENvbmUgfSB7XG4gIHJldHVybiAoXG4gICAgXCJ2YWx1ZXNcIiBpbiBkZWYgJiYgIShcImNvbmVcIiBpbiBkZWYgJiYgZGVmLmNvbmUgPT09IHVuZGVmaW5lZCAmJiBPYmplY3Qua2V5cyhkZWYpLmxlbmd0aCA+IDEpXG4gICk7XG59XG5cbi8qKlxuICogU3Vic2V0RGVm7JeQ7IScIGZpZWxkcyDstpTstpxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN1YnNldEZpZWxkcyhkZWY6IFN1YnNldERlZik6IFN1YnNldEZpZWxkW10ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShkZWYpID8gZGVmIDogZGVmLmZpZWxkcztcbn1cblxuLyoqXG4gKiBFbnVtRGVm7JeQ7IScIHZhbHVlcyDstpTstpxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEVudW1EZWZWYWx1ZXMoZGVmOiBFbnVtRGVmKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIHJldHVybiBpc0VudW1EZWZXaXRoQ29uZShkZWYpID8gZGVmLnZhbHVlcyA6IGRlZjtcbn1cblxuZXhwb3J0IHR5cGUgRW50aXR5SnNvbiA9IHtcbiAgaWQ6IHN0cmluZztcbiAgcGFyZW50SWQ/OiBzdHJpbmc7XG4gIHRhYmxlOiBzdHJpbmc7XG4gIHRpdGxlPzogc3RyaW5nO1xuICBjb25lPzogQ29uZTsgLy8gY29uZSDrqZTtg4DrjbDsnbTthLBcbiAgcHJvcHM6IEVudGl0eVByb3BbXTtcbiAgaW5kZXhlczogRW50aXR5SW5kZXhbXTtcbiAgc3Vic2V0czoge1xuICAgIFtzdWJzZXQ6IHN0cmluZ106IFN1YnNldERlZjtcbiAgfTtcbiAgZW51bXM6IHtcbiAgICBbZW51bUlkOiBzdHJpbmddOiBFbnVtRGVmO1xuICB9O1xufTtcbmV4cG9ydCB0eXBlIEVudGl0eVN1YnNldFJvdyA9IHtcbiAgZmllbGQ6IHN0cmluZztcbiAgaGFzOiB7XG4gICAgW2tleTogc3RyaW5nXTogYm9vbGVhbjtcbiAgfTtcbiAgaXNJbnRlcm5hbDoge1xuICAgIFtrZXk6IHN0cmluZ106IGJvb2xlYW47XG4gIH07XG4gIGNoaWxkcmVuOiBFbnRpdHlTdWJzZXRSb3dbXTtcbiAgcHJlZml4ZXM6IHN0cmluZ1tdO1xuICByZWxhdGlvbkVudGl0eT86IHN0cmluZztcbiAgaXNPcGVuPzogYm9vbGVhbjtcbn07XG5leHBvcnQgdHlwZSBGbGF0dGVuU3Vic2V0Um93ID0gT21pdDxFbnRpdHlTdWJzZXRSb3csIFwiY2hpbGRyZW5cIj47XG5cbi8qXG4gIFByb3BOb2RlXG4qL1xuXG4vKipcbiAqIOyXlO2LsO2LsOydmCDtlYTrk5wg6rWs7KGw66W8IO2KuOumrCDtmJXtg5zroZwg7ZGc7ZiE7ZWY64qUIOykkeqwhCDrhbjrk5zsnoXri4jri6QuXG4gKlxuICogKirrqqnsoIEqKjogRW50aXR57J2YIHN1YnNldCDtlYTrk5wg7ZGc7ZiE7IudKOyYiDogXCJpZFwiLCBcInVzZXIubmFtZVwiLCBcInRhZ3NbXVwiKeydhFxuICog7J6s6reA7KCB7J24IO2KuOumrCDqtazsobDroZwg7YyM7Iux7ZWY7JesIFpvZCDsiqTtgqTrp4gg7IOd7ISx7J2YIOykkeqwhCDri6jqs4TroZwg7IKs7Jqp7ZWp64uI64ukLlxuICpcbiAqICoq67OA7ZmYIO2dkOumhCoqOlxuICogRW50aXR5IHN1YnNldCDihpIgRW50aXR5UHJvcE5vZGUgKO2KuOumrCDqtazsobApIOKGkiBab2Qg7Iqk7YKk66eIIOKGkiBSZW5kZXJpbmdOb2RlIChVSeyaqSlcbiAqXG4gKiAqKm5vZGVUeXBlKio6XG4gKiAtIFwicGxhaW5cIjog64uo7J28IO2VhOuTnCAo7JiIOiBcImlkXCIsIFwibmFtZVwiKVxuICogLSBcIm9iamVjdFwiOiDspJHssqkg6rCd7LK0ICjsmIg6IFwidXNlci5uYW1lXCIg4oaSIHVzZXIg6rCd7LK0KVxuICogLSBcImFycmF5XCI6IOuwsOyXtCAo7JiIOiBcInRhZ3NbXVwiIOKGkiB0YWdzIOuwsOyXtClcbiAqXG4gKiAqKuyCrOyaqSDsnITsuZgqKjogZW50aXR5LWNvbnZlcnRlci50c+ydmCBwcm9wTm9kZVRvWm9kVHlwZSgpXG4gKi9cbmV4cG9ydCB0eXBlIEVudGl0eVByb3BOb2RlID1cbiAgfCB7XG4gICAgICBub2RlVHlwZTogXCJwbGFpblwiO1xuICAgICAgcHJvcDogRW50aXR5UHJvcDtcbiAgICB9XG4gIHwge1xuICAgICAgbm9kZVR5cGU6IFwib2JqZWN0XCIgfCBcImFycmF5XCI7XG4gICAgICBwcm9wPzogRW50aXR5UHJvcDtcbiAgICAgIGNoaWxkcmVuOiBFbnRpdHlQcm9wTm9kZVtdO1xuICAgIH07XG5cbi8qXG4gIFByb3AgVHlwZSBHdWFyZHNcbiovXG5leHBvcnQgZnVuY3Rpb24gaXNJbnRlZ2VyU2luZ2xlUHJvcChwOiB1bmtub3duKTogcCBpcyBJbnRlZ2VyUHJvcCB7XG4gIHJldHVybiAocCBhcyBJbnRlZ2VyUHJvcCk/LnR5cGUgPT09IFwiaW50ZWdlclwiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzSW50ZWdlckFycmF5UHJvcChwOiB1bmtub3duKTogcCBpcyBJbnRlZ2VyQXJyYXlQcm9wIHtcbiAgcmV0dXJuIChwIGFzIEludGVnZXJBcnJheVByb3ApPy50eXBlID09PSBcImludGVnZXJbXVwiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzSW50ZWdlclByb3AocDogdW5rbm93bik6IHAgaXMgSW50ZWdlclByb3AgfCBJbnRlZ2VyQXJyYXlQcm9wIHtcbiAgcmV0dXJuIGlzSW50ZWdlclNpbmdsZVByb3AocCkgfHwgaXNJbnRlZ2VyQXJyYXlQcm9wKHApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQmlnSW50ZWdlclNpbmdsZVByb3AocDogdW5rbm93bik6IHAgaXMgQmlnSW50ZWdlclByb3Age1xuICByZXR1cm4gKHAgYXMgQmlnSW50ZWdlclByb3ApPy50eXBlID09PSBcImJpZ0ludGVnZXJcIjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0JpZ0ludGVnZXJBcnJheVByb3AocDogdW5rbm93bik6IHAgaXMgQmlnSW50ZWdlckFycmF5UHJvcCB7XG4gIHJldHVybiAocCBhcyBCaWdJbnRlZ2VyQXJyYXlQcm9wKT8udHlwZSA9PT0gXCJiaWdJbnRlZ2VyW11cIjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0JpZ0ludGVnZXJQcm9wKHA6IHVua25vd24pOiBwIGlzIEJpZ0ludGVnZXJQcm9wIHwgQmlnSW50ZWdlckFycmF5UHJvcCB7XG4gIHJldHVybiBpc0JpZ0ludGVnZXJTaW5nbGVQcm9wKHApIHx8IGlzQmlnSW50ZWdlckFycmF5UHJvcChwKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1N0cmluZ1NpbmdsZVByb3AocDogdW5rbm93bik6IHAgaXMgU3RyaW5nUHJvcCB7XG4gIHJldHVybiAocCBhcyBTdHJpbmdQcm9wKT8udHlwZSA9PT0gXCJzdHJpbmdcIjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1N0cmluZ0FycmF5UHJvcChwOiB1bmtub3duKTogcCBpcyBTdHJpbmdBcnJheVByb3Age1xuICByZXR1cm4gKHAgYXMgU3RyaW5nQXJyYXlQcm9wKT8udHlwZSA9PT0gXCJzdHJpbmdbXVwiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nUHJvcChwOiB1bmtub3duKTogcCBpcyBTdHJpbmdQcm9wIHwgU3RyaW5nQXJyYXlQcm9wIHtcbiAgcmV0dXJuIGlzU3RyaW5nU2luZ2xlUHJvcChwKSB8fCBpc1N0cmluZ0FycmF5UHJvcChwKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0VudW1TaW5nbGVQcm9wKHA6IHVua25vd24pOiBwIGlzIEVudW1Qcm9wIHtcbiAgcmV0dXJuIChwIGFzIEVudW1Qcm9wKT8udHlwZSA9PT0gXCJlbnVtXCI7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNFbnVtQXJyYXlQcm9wKHA6IHVua25vd24pOiBwIGlzIEVudW1BcnJheVByb3Age1xuICByZXR1cm4gKHAgYXMgRW51bUFycmF5UHJvcCk/LnR5cGUgPT09IFwiZW51bVtdXCI7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNFbnVtUHJvcChwOiB1bmtub3duKTogcCBpcyBFbnVtUHJvcCB8IEVudW1BcnJheVByb3Age1xuICByZXR1cm4gaXNFbnVtU2luZ2xlUHJvcChwKSB8fCBpc0VudW1BcnJheVByb3AocCk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXJTaW5nbGVQcm9wKHA6IHVua25vd24pOiBwIGlzIE51bWJlclByb3Age1xuICByZXR1cm4gKHAgYXMgTnVtYmVyUHJvcCk/LnR5cGUgPT09IFwibnVtYmVyXCI7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXJBcnJheVByb3AocDogdW5rbm93bik6IHAgaXMgTnVtYmVyQXJyYXlQcm9wIHtcbiAgcmV0dXJuIChwIGFzIE51bWJlckFycmF5UHJvcCk/LnR5cGUgPT09IFwibnVtYmVyW11cIjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc051bWJlclByb3AocDogdW5rbm93bik6IHAgaXMgTnVtYmVyUHJvcCB8IE51bWJlckFycmF5UHJvcCB7XG4gIHJldHVybiBpc051bWJlclNpbmdsZVByb3AocCkgfHwgaXNOdW1iZXJBcnJheVByb3AocCk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOdW1lcmljU2luZ2xlUHJvcChwOiB1bmtub3duKTogcCBpcyBOdW1lcmljUHJvcCB7XG4gIHJldHVybiAocCBhcyBOdW1lcmljUHJvcCk/LnR5cGUgPT09IFwibnVtZXJpY1wiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTnVtZXJpY0FycmF5UHJvcChwOiB1bmtub3duKTogcCBpcyBOdW1lcmljQXJyYXlQcm9wIHtcbiAgcmV0dXJuIChwIGFzIE51bWVyaWNBcnJheVByb3ApPy50eXBlID09PSBcIm51bWVyaWNbXVwiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTnVtZXJpY1Byb3AocDogdW5rbm93bik6IHAgaXMgTnVtZXJpY1Byb3AgfCBOdW1lcmljQXJyYXlQcm9wIHtcbiAgcmV0dXJuIGlzTnVtZXJpY1NpbmdsZVByb3AocCkgfHwgaXNOdW1lcmljQXJyYXlQcm9wKHApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQm9vbGVhblNpbmdsZVByb3AocDogdW5rbm93bik6IHAgaXMgQm9vbGVhblByb3Age1xuICByZXR1cm4gKHAgYXMgQm9vbGVhblByb3ApPy50eXBlID09PSBcImJvb2xlYW5cIjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0Jvb2xlYW5BcnJheVByb3AocDogdW5rbm93bik6IHAgaXMgQm9vbGVhbkFycmF5UHJvcCB7XG4gIHJldHVybiAocCBhcyBCb29sZWFuQXJyYXlQcm9wKT8udHlwZSA9PT0gXCJib29sZWFuW11cIjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0Jvb2xlYW5Qcm9wKHA6IHVua25vd24pOiBwIGlzIEJvb2xlYW5Qcm9wIHwgQm9vbGVhbkFycmF5UHJvcCB7XG4gIHJldHVybiBpc0Jvb2xlYW5TaW5nbGVQcm9wKHApIHx8IGlzQm9vbGVhbkFycmF5UHJvcChwKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGVTaW5nbGVQcm9wKHA6IHVua25vd24pOiBwIGlzIERhdGVQcm9wIHtcbiAgcmV0dXJuIChwIGFzIERhdGVQcm9wKT8udHlwZSA9PT0gXCJkYXRlXCI7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNEYXRlQXJyYXlQcm9wKHA6IHVua25vd24pOiBwIGlzIERhdGVBcnJheVByb3Age1xuICByZXR1cm4gKHAgYXMgRGF0ZUFycmF5UHJvcCk/LnR5cGUgPT09IFwiZGF0ZVtdXCI7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNEYXRlUHJvcChwOiB1bmtub3duKTogcCBpcyBEYXRlUHJvcCB8IERhdGVBcnJheVByb3Age1xuICByZXR1cm4gaXNEYXRlU2luZ2xlUHJvcChwKSB8fCBpc0RhdGVBcnJheVByb3AocCk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNVdWlkU2luZ2xlUHJvcChwOiB1bmtub3duKTogcCBpcyBVdWlkUHJvcCB7XG4gIHJldHVybiAocCBhcyBVdWlkUHJvcCk/LnR5cGUgPT09IFwidXVpZFwiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVXVpZEFycmF5UHJvcChwOiB1bmtub3duKTogcCBpcyBVdWlkQXJyYXlQcm9wIHtcbiAgcmV0dXJuIChwIGFzIFV1aWRBcnJheVByb3ApPy50eXBlID09PSBcInV1aWRbXVwiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVXVpZFByb3AocDogdW5rbm93bik6IHAgaXMgVXVpZFByb3AgfCBVdWlkQXJyYXlQcm9wIHtcbiAgcmV0dXJuIGlzVXVpZFNpbmdsZVByb3AocCkgfHwgaXNVdWlkQXJyYXlQcm9wKHApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzSnNvblByb3AocDogdW5rbm93bik6IHAgaXMgSnNvblByb3Age1xuICByZXR1cm4gKHAgYXMgSnNvblByb3ApPy50eXBlID09PSBcImpzb25cIjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1NlYXJjaFRleHRQcm9wKHA6IHVua25vd24pOiBwIGlzIFNlYXJjaFRleHRQcm9wIHtcbiAgcmV0dXJuIChwIGFzIFNlYXJjaFRleHRQcm9wKT8udHlwZSA9PT0gXCJzZWFyY2hUZXh0XCI7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNWaXJ0dWFsUHJvcChwOiB1bmtub3duKTogcCBpcyBWaXJ0dWFsUHJvcCB7XG4gIHJldHVybiAocCBhcyBWaXJ0dWFsUHJvcCk/LnR5cGUgPT09IFwidmlydHVhbFwiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVmlydHVhbENvZGVQcm9wKHA6IHVua25vd24pOiBwIGlzIFZpcnR1YWxQcm9wIHtcbiAgaWYgKCFpc1ZpcnR1YWxQcm9wKHApKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBwLnZpcnR1YWxUeXBlICE9PSBcInF1ZXJ5XCI7IC8vIHVuZGVmaW5lZOuPhCBcImNvZGVcIuuhnCDst6jquIlcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1ZpcnR1YWxRdWVyeVByb3AocDogdW5rbm93bik6IHAgaXMgVmlydHVhbFByb3Age1xuICBpZiAoIWlzVmlydHVhbFByb3AocCkpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHAudmlydHVhbFR5cGUgPT09IFwicXVlcnlcIjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1ZlY3RvclNpbmdsZVByb3AocDogdW5rbm93bik6IHAgaXMgVmVjdG9yUHJvcCB7XG4gIHJldHVybiAocCBhcyBWZWN0b3JQcm9wKT8udHlwZSA9PT0gXCJ2ZWN0b3JcIjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1ZlY3RvckFycmF5UHJvcChwOiB1bmtub3duKTogcCBpcyBWZWN0b3JBcnJheVByb3Age1xuICByZXR1cm4gKHAgYXMgVmVjdG9yQXJyYXlQcm9wKT8udHlwZSA9PT0gXCJ2ZWN0b3JbXVwiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVmVjdG9yUHJvcChwOiB1bmtub3duKTogcCBpcyBWZWN0b3JQcm9wIHwgVmVjdG9yQXJyYXlQcm9wIHtcbiAgcmV0dXJuIGlzVmVjdG9yU2luZ2xlUHJvcChwKSB8fCBpc1ZlY3RvckFycmF5UHJvcChwKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RzVmVjdG9yUHJvcChwOiB1bmtub3duKTogcCBpcyBUc1ZlY3RvclByb3Age1xuICByZXR1cm4gKHAgYXMgVHNWZWN0b3JQcm9wKT8udHlwZSA9PT0gXCJ0c3ZlY3RvclwiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVsYXRpb25Qcm9wKHA6IHVua25vd24pOiBwIGlzIFJlbGF0aW9uUHJvcCB7XG4gIHJldHVybiAocCBhcyBSZWxhdGlvblByb3ApPy50eXBlID09PSBcInJlbGF0aW9uXCI7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwOiB1bmtub3duKTogcCBpcyBPbmVUb09uZVJlbGF0aW9uUHJvcCB7XG4gIHJldHVybiAocCBhcyBPbmVUb09uZVJlbGF0aW9uUHJvcCk/LnJlbGF0aW9uVHlwZSA9PT0gXCJPbmVUb09uZVwiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHA6IHVua25vd24pOiBwIGlzIEJlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCB7XG4gIHJldHVybiAocCBhcyBCZWxvbmdzVG9PbmVSZWxhdGlvblByb3ApPy5yZWxhdGlvblR5cGUgPT09IFwiQmVsb25nc1RvT25lXCI7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNIYXNNYW55UmVsYXRpb25Qcm9wKHA6IHVua25vd24pOiBwIGlzIEhhc01hbnlSZWxhdGlvblByb3Age1xuICByZXR1cm4gKHAgYXMgSGFzTWFueVJlbGF0aW9uUHJvcCk/LnJlbGF0aW9uVHlwZSA9PT0gXCJIYXNNYW55XCI7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wKHA6IHVua25vd24pOiBwIGlzIE1hbnlUb01hbnlSZWxhdGlvblByb3Age1xuICByZXR1cm4gKHAgYXMgTWFueVRvTWFueVJlbGF0aW9uUHJvcCk/LnJlbGF0aW9uVHlwZSA9PT0gXCJNYW55VG9NYW55XCI7XG59XG5cbnR5cGUgSm9pbkNsYXVzZSA9XG4gIHwge1xuICAgICAgZnJvbTogc3RyaW5nO1xuICAgICAgdG86IHN0cmluZztcbiAgICB9XG4gIHwge1xuICAgICAgY3VzdG9tOiBzdHJpbmc7XG4gICAgfTtcbmV4cG9ydCBmdW5jdGlvbiBpc0N1c3RvbUpvaW5DbGF1c2UocDogdW5rbm93bik6IHAgaXMgeyBjdXN0b206IHN0cmluZyB9IHtcbiAgcmV0dXJuICEhKHAgYXMgeyBjdXN0b206IHN0cmluZyB9KT8uY3VzdG9tO1xufVxuXG50eXBlIFN1YnNldExvYWRlciA9IHtcbiAgYXM6IHN0cmluZztcbiAgdGFibGU6IHN0cmluZztcbiAgbWFueUpvaW46IHtcbiAgICBmcm9tVGFibGU6IHN0cmluZztcbiAgICBmcm9tQ29sOiBzdHJpbmc7XG4gICAgaWRGaWVsZDogc3RyaW5nO1xuICAgIHRvVGFibGU6IHN0cmluZztcbiAgICB0b0NvbDogc3RyaW5nO1xuICAgIHRocm91Z2g/OiB7XG4gICAgICB0YWJsZTogc3RyaW5nO1xuICAgICAgZnJvbUNvbDogc3RyaW5nO1xuICAgICAgdG9Db2w6IHN0cmluZztcbiAgICB9O1xuICB9O1xuICBvbmVKb2luczogKHtcbiAgICBhczogc3RyaW5nO1xuICAgIGpvaW46IFwiaW5uZXJcIiB8IFwib3V0ZXJcIjtcbiAgICB0YWJsZTogc3RyaW5nO1xuICB9ICYgSm9pbkNsYXVzZSlbXTtcbiAgc2VsZWN0OiBzdHJpbmdbXTtcbiAgbG9hZGVycz86IFN1YnNldExvYWRlcltdO1xufTtcblxuZXhwb3J0IHR5cGUgU3Vic2V0UXVlcnkgPSB7XG4gIHNlbGVjdDogc3RyaW5nW107XG4gIHZpcnR1YWw6IHN0cmluZ1tdO1xuICBqb2luczogKHtcbiAgICBhczogc3RyaW5nO1xuICAgIGpvaW46IFwiaW5uZXJcIiB8IFwib3V0ZXJcIjtcbiAgICB0YWJsZTogc3RyaW5nO1xuICB9ICYgSm9pbkNsYXVzZSlbXTtcbiAgbG9hZGVyczogU3Vic2V0TG9hZGVyW107XG59O1xuXG4vKiBCYXNlTW9kZWwgKi9cbmV4cG9ydCBjb25zdCBTb25hbXVRdWVyeU1vZGUgPSB6LmVudW0oW1wiYm90aFwiLCBcImxpc3RcIiwgXCJjb3VudFwiXSk7XG5leHBvcnQgdHlwZSBTb25hbXVRdWVyeU1vZGUgPSB6LmluZmVyPHR5cGVvZiBTb25hbXVRdWVyeU1vZGU+O1xuXG4vKiBTZW1hbnRpYyBRdWVyeSAqL1xuZXhwb3J0IGNvbnN0IFNvbmFtdVNlbWFudGljUGFyYW1zID0gei5vYmplY3Qoe1xuICBzZW1hbnRpY1F1ZXJ5OiB6Lm9iamVjdCh7XG4gICAgZW1iZWRkaW5nOiB6LmFycmF5KHoubnVtYmVyKCkpLm1pbigxMDI0KS5tYXgoMTAyNCksXG4gICAgdGhyZXNob2xkOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgbWV0aG9kOiB6LmVudW0oW1wiY29zaW5lXCIsIFwibDJcIiwgXCJpbm5lcl9wcm9kdWN0XCJdKS5vcHRpb25hbCgpLFxuICB9KSxcbn0pO1xuZXhwb3J0IHR5cGUgU29uYW11U2VtYW50aWNQYXJhbXMgPSB6LmluZmVyPHR5cGVvZiBTb25hbXVTZW1hbnRpY1BhcmFtcz47XG5cbi8qIEtuZXggTWlncmF0aW9uICovXG5leHBvcnQgdHlwZSBLbmV4RXJyb3IgPSB7XG4gIGNvZGU6IHN0cmluZztcbiAgZXJybm86IG51bWJlcjtcbiAgc3FsOiBzdHJpbmc7XG4gIHNxbE1lc3NhZ2U6IHN0cmluZztcbiAgc3FsU3RhdGU6IHN0cmluZztcbn07XG5leHBvcnQgZnVuY3Rpb24gaXNLbmV4RXJyb3IoZTogdW5rbm93bik6IGUgaXMgS25leEVycm9yIHtcbiAgcmV0dXJuICEhKGUgYXMgS25leEVycm9yKT8uY29kZSAmJiAhIShlIGFzIEtuZXhFcnJvcik/LnNxbE1lc3NhZ2UgJiYgISEoZSBhcyBLbmV4RXJyb3IpPy5zcWxTdGF0ZTtcbn1cblxuZXhwb3J0IHR5cGUgS25leENvbHVtblR5cGUgPVxuICB8IFwic3RyaW5nXCJcbiAgfCBcInRleHRcIlxuICB8IFwic21hbGx0ZXh0XCJcbiAgfCBcIm1lZGl1bXRleHRcIlxuICB8IFwibG9uZ3RleHRcIlxuICB8IFwiaW50ZWdlclwiXG4gIHwgXCJiaWdJbnRlZ2VyXCJcbiAgfCBcImRlY2ltYWxcIlxuICB8IFwidGltZXN0YW1wXCJcbiAgfCBcImJvb2xlYW5cIlxuICB8IFwiZm9yZWlnblwiXG4gIHwgXCJ1dWlkXCJcbiAgfCBcImpzb25cIlxuICB8IFwiZmxvYXRcIlxuICB8IFwiZGF0ZVwiXG4gIHwgXCJ0aW1lXCJcbiAgfCBcImRhdGV0aW1lXCI7XG5leHBvcnQgdHlwZSBNaWdyYXRpb25Db2x1bW5UeXBlID1cbiAgfCBcInN0cmluZ1wiXG4gIHwgXCJzdHJpbmdbXVwiXG4gIHwgXCJpbnRlZ2VyXCJcbiAgfCBcImludGVnZXJbXVwiXG4gIHwgXCJiaWdJbnRlZ2VyXCJcbiAgfCBcImJpZ0ludGVnZXJbXVwiXG4gIHwgXCJudW1iZXJPck51bWVyaWNcIlxuICB8IFwibnVtYmVyT3JOdW1lcmljW11cIlxuICB8IFwiYm9vbGVhblwiXG4gIHwgXCJib29sZWFuW11cIlxuICB8IFwiZGF0ZVwiXG4gIHwgXCJkYXRlW11cIlxuICB8IFwidXVpZFwiXG4gIHwgXCJ1dWlkW11cIlxuICB8IFwianNvblwiXG4gIHwgXCJ2ZWN0b3JcIlxuICB8IFwidmVjdG9yW11cIlxuICB8IFwidHN2ZWN0b3JcIjtcbmV4cG9ydCB0eXBlIE1pZ3JhdGlvbkNvbHVtbiA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICB0eXBlOiBNaWdyYXRpb25Db2x1bW5UeXBlO1xuICBudWxsYWJsZTogYm9vbGVhbjtcbiAgbnVtYmVyVHlwZT86IFwicmVhbFwiIHwgXCJkb3VibGUgcHJlY2lzaW9uXCIgfCBcIm51bWVyaWNcIjtcbiAgbGVuZ3RoPzogbnVtYmVyO1xuICBkZWZhdWx0VG8/OiBzdHJpbmc7XG4gIHByZWNpc2lvbj86IG51bWJlcjtcbiAgc2NhbGU/OiBudW1iZXI7XG4gIGRpbWVuc2lvbnM/OiBudW1iZXI7XG4gIGdlbmVyYXRlZD86IEdlbmVyYXRlZENvbHVtbjtcbn07XG5leHBvcnQgdHlwZSBNaWdyYXRpb25JbmRleCA9IHtcbiAgdHlwZTogXCJ1bmlxdWVcIiB8IFwiaW5kZXhcIiB8IFwiaG5zd1wiIHwgXCJpdmZmbGF0XCI7XG4gIGNvbHVtbnM6IEVudGl0eUluZGV4Q29sdW1uW107XG4gIG5hbWU6IHN0cmluZztcbiAgdXNpbmc/OiBcImJ0cmVlXCIgfCBcImhhc2hcIiB8IFwiZ2luXCIgfCBcImdpc3RcIiB8IFwicGdyb29uZ2FcIjtcbiAgbnVsbHNOb3REaXN0aW5jdD86IGJvb2xlYW47XG4gIC8qKiBITlNXIChIaWVyYXJjaGljYWwgTmF2aWdhYmxlIFNtYWxsIFdvcmxkKTog6rCBIOuFuOuTnOydmCDstZzrjIAg7Jew6rKwIOyImCAqL1xuICBtPzogbnVtYmVyO1xuICAvKiogSE5TVyAoSGllcmFyY2hpY2FsIE5hdmlnYWJsZSBTbWFsbCBXb3JsZCk6IOq1rOyEsSDsi5wg7YOQ7IOJIOuylOychCAqL1xuICBlZkNvbnN0cnVjdGlvbj86IG51bWJlcjtcbiAgLyoqIElWRkZsYXQgKEludmVydGVkIEZpbGUgd2l0aCBGbGF0IENvbXByZXNzaW9uKTog7YG065+s7Iqk7YSw66eBIOumrOyKpO2KuCDsiJggKi9cbiAgbGlzdHM/OiBudW1iZXI7XG59O1xuZXhwb3J0IHR5cGUgTWlncmF0aW9uRm9yZWlnbiA9IHtcbiAgY29sdW1uczogc3RyaW5nW107XG4gIHRvOiBzdHJpbmc7XG4gIG9uVXBkYXRlOiBSZWxhdGlvbk9uO1xuICBvbkRlbGV0ZTogUmVsYXRpb25Pbjtcbn07XG5leHBvcnQgdHlwZSBNaWdyYXRpb25Kb2luVGFibGUgPSB7XG4gIHRhYmxlOiBzdHJpbmc7XG4gIGluZGV4ZXM6IE1pZ3JhdGlvbkluZGV4W107XG4gIGNvbHVtbnM6IE1pZ3JhdGlvbkNvbHVtbltdO1xuICBmb3JlaWduczogTWlncmF0aW9uRm9yZWlnbltdO1xufTtcbmV4cG9ydCB0eXBlIE1pZ3JhdGlvblNldCA9IHtcbiAgdGFibGU6IHN0cmluZztcbiAgY29sdW1uczogTWlncmF0aW9uQ29sdW1uW107XG4gIGluZGV4ZXM6IE1pZ3JhdGlvbkluZGV4W107XG4gIGZvcmVpZ25zOiBNaWdyYXRpb25Gb3JlaWduW107XG59O1xuZXhwb3J0IHR5cGUgTWlncmF0aW9uU2V0QW5kSm9pblRhYmxlID0gTWlncmF0aW9uU2V0ICYge1xuICBqb2luVGFibGVzOiBNaWdyYXRpb25Kb2luVGFibGVbXTtcbn07XG5leHBvcnQgdHlwZSBHZW5NaWdyYXRpb25Db2RlID0ge1xuICB0aXRsZTogc3RyaW5nO1xuICB0YWJsZTogc3RyaW5nO1xuICB0eXBlOiBcIm5vcm1hbFwiIHwgXCJmb3JlaWduXCI7XG4gIGZvcm1hdHRlZDogc3RyaW5nIHwgbnVsbDtcbn07XG5cbi8qIEFwaSAqL1xuZXhwb3J0IHR5cGUgQXBpUGFyYW0gPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgdHlwZTogQXBpUGFyYW1UeXBlO1xuICBvcHRpb25hbDogYm9vbGVhbjtcbiAgZGVmYXVsdERlZj86IHN0cmluZztcbn07XG5leHBvcnQgbmFtZXNwYWNlIEFwaVBhcmFtVHlwZSB7XG4gIGV4cG9ydCB0eXBlIEZ1bmN0aW9uID0ge1xuICAgIHQ6IFwiZnVuY3Rpb25cIjtcbiAgICBwYXJhbWV0ZXJzOiBBcGlQYXJhbVtdO1xuICAgIHJldHVyblR5cGU6IEFwaVBhcmFtVHlwZTtcbiAgfTtcbiAgZXhwb3J0IHR5cGUgT2JqZWN0ID0ge1xuICAgIHQ6IFwib2JqZWN0XCI7XG4gICAgcHJvcHM6IEFwaVBhcmFtW107XG4gIH07XG4gIGV4cG9ydCB0eXBlIFVuaW9uID0ge1xuICAgIHQ6IFwidW5pb25cIjtcbiAgICB0eXBlczogQXBpUGFyYW1UeXBlW107XG4gIH07XG4gIGV4cG9ydCB0eXBlIEludGVyc2VjdGlvbiA9IHtcbiAgICB0OiBcImludGVyc2VjdGlvblwiO1xuICAgIHR5cGVzOiBBcGlQYXJhbVR5cGVbXTtcbiAgfTtcbiAgZXhwb3J0IHR5cGUgU3RyaW5nTGl0ZXJhbCA9IHtcbiAgICB0OiBcInN0cmluZy1saXRlcmFsXCI7XG4gICAgdmFsdWU6IHN0cmluZztcbiAgfTtcbiAgZXhwb3J0IHR5cGUgTnVtZXJpY0xpdGVyYWwgPSB7XG4gICAgdDogXCJudW1lcmljLWxpdGVyYWxcIjtcbiAgICB2YWx1ZTogbnVtYmVyO1xuICB9O1xuICBleHBvcnQgdHlwZSBBcnJheSA9IHtcbiAgICB0OiBcImFycmF5XCI7XG4gICAgZWxlbWVudHNUeXBlOiBBcGlQYXJhbVR5cGU7XG4gIH07XG4gIGV4cG9ydCB0eXBlIFJlZiA9IHtcbiAgICB0OiBcInJlZlwiO1xuICAgIGlkOiBzdHJpbmc7XG4gICAgYXJncz86IEFwaVBhcmFtVHlwZVtdO1xuICB9O1xuICBleHBvcnQgdHlwZSBJbmRleGVkQWNjZXNzID0ge1xuICAgIHQ6IFwiaW5kZXhlZC1hY2Nlc3NcIjtcbiAgICBvYmplY3Q6IEFwaVBhcmFtVHlwZTtcbiAgICBpbmRleDogQXBpUGFyYW1UeXBlO1xuICB9O1xuICBleHBvcnQgdHlwZSBUdXBsZVR5cGUgPSB7XG4gICAgdDogXCJ0dXBsZS10eXBlXCI7XG4gICAgZWxlbWVudHM6IEFwaVBhcmFtVHlwZVtdO1xuICB9O1xuICBleHBvcnQgdHlwZSBQaWNrID0gUmVmICYge1xuICAgIHQ6IFwicmVmXCI7XG4gICAgaWQ6IFwiUGlja1wiO1xuICB9O1xuICBleHBvcnQgdHlwZSBPbWl0ID0gUmVmICYge1xuICAgIHQ6IFwicmVmXCI7XG4gICAgaWQ6IFwiT21pdFwiO1xuICB9O1xuICBleHBvcnQgdHlwZSBQYXJ0aWFsID0gUmVmICYge1xuICAgIHQ6IFwicmVmXCI7XG4gICAgaWQ6IFwiUGFydGlhbFwiO1xuICB9O1xuICBleHBvcnQgdHlwZSBQcm9taXNlID0gUmVmICYge1xuICAgIHQ6IFwicmVmXCI7XG4gICAgaWQ6IFwiUHJvbWlzZVwiO1xuICB9O1xuICBleHBvcnQgdHlwZSBDb250ZXh0ID0gUmVmICYge1xuICAgIHQ6IFwicmVmXCI7XG4gICAgaWQ6IFwiQ29udGV4dFwiO1xuICB9O1xuICBleHBvcnQgdHlwZSBUeXBlUGFyYW0gPSB7XG4gICAgdDogXCJ0eXBlLXBhcmFtXCI7XG4gICAgaWQ6IHN0cmluZztcbiAgICBjb25zdHJhaW50PzogQXBpUGFyYW1UeXBlO1xuICB9O1xuXG4gIGV4cG9ydCBmdW5jdGlvbiBpc09iamVjdCh2OiB1bmtub3duKTogdiBpcyBBcGlQYXJhbVR5cGUuT2JqZWN0IHtcbiAgICByZXR1cm4gKHYgYXMgQXBpUGFyYW1UeXBlLk9iamVjdCk/LnQgPT09IFwib2JqZWN0XCI7XG4gIH1cbiAgZXhwb3J0IGZ1bmN0aW9uIGlzVW5pb24odjogdW5rbm93bik6IHYgaXMgQXBpUGFyYW1UeXBlLlVuaW9uIHtcbiAgICByZXR1cm4gKHYgYXMgQXBpUGFyYW1UeXBlLlVuaW9uKT8udCA9PT0gXCJ1bmlvblwiO1xuICB9XG4gIGV4cG9ydCBmdW5jdGlvbiBpc0ludGVyc2VjdGlvbih2OiB1bmtub3duKTogdiBpcyBBcGlQYXJhbVR5cGUuSW50ZXJzZWN0aW9uIHtcbiAgICByZXR1cm4gKHYgYXMgQXBpUGFyYW1UeXBlLkludGVyc2VjdGlvbik/LnQgPT09IFwiaW50ZXJzZWN0aW9uXCI7XG4gIH1cbiAgZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nTGl0ZXJhbCh2OiB1bmtub3duKTogdiBpcyBBcGlQYXJhbVR5cGUuU3RyaW5nTGl0ZXJhbCB7XG4gICAgcmV0dXJuICh2IGFzIEFwaVBhcmFtVHlwZS5TdHJpbmdMaXRlcmFsKT8udCA9PT0gXCJzdHJpbmctbGl0ZXJhbFwiO1xuICB9XG4gIGV4cG9ydCBmdW5jdGlvbiBpc051bWVyaWNMaXRlcmFsKHY6IHVua25vd24pOiB2IGlzIEFwaVBhcmFtVHlwZS5OdW1lcmljTGl0ZXJhbCB7XG4gICAgcmV0dXJuICh2IGFzIEFwaVBhcmFtVHlwZS5OdW1lcmljTGl0ZXJhbCk/LnQgPT09IFwibnVtZXJpYy1saXRlcmFsXCI7XG4gIH1cbiAgZXhwb3J0IGZ1bmN0aW9uIGlzQXJyYXkodjogdW5rbm93bik6IHYgaXMgQXBpUGFyYW1UeXBlLkFycmF5IHtcbiAgICByZXR1cm4gKHYgYXMgQXBpUGFyYW1UeXBlLkFycmF5KT8udCA9PT0gXCJhcnJheVwiO1xuICB9XG4gIGV4cG9ydCBmdW5jdGlvbiBpc1JlZih2OiB1bmtub3duKTogdiBpcyBBcGlQYXJhbVR5cGUuUmVmIHtcbiAgICByZXR1cm4gdHlwZW9mIHYgPT09IFwib2JqZWN0XCIgJiYgdiAhPT0gbnVsbCAmJiAodiBhcyB7IHQ/OiB1bmtub3duIH0pLnQgPT09IFwicmVmXCI7XG4gIH1cbiAgZXhwb3J0IGZ1bmN0aW9uIGlzSW5kZXhlZEFjY2Vzcyh2OiB1bmtub3duKTogdiBpcyBBcGlQYXJhbVR5cGUuSW5kZXhlZEFjY2VzcyB7XG4gICAgcmV0dXJuIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiICYmIHYgIT09IG51bGwgJiYgKHYgYXMgeyB0PzogdW5rbm93biB9KS50ID09PSBcImluZGV4ZWQtYWNjZXNzXCI7XG4gIH1cbiAgZXhwb3J0IGZ1bmN0aW9uIGlzVHVwbGVUeXBlKHY6IHVua25vd24pOiB2IGlzIEFwaVBhcmFtVHlwZS5UdXBsZVR5cGUge1xuICAgIHJldHVybiB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIiAmJiB2ICE9PSBudWxsICYmICh2IGFzIHsgdD86IHVua25vd24gfSkudCA9PT0gXCJ0dXBsZS10eXBlXCI7XG4gIH1cbiAgZXhwb3J0IGZ1bmN0aW9uIGlzUGljayh2OiB1bmtub3duKTogdiBpcyBBcGlQYXJhbVR5cGUuUGljayB7XG4gICAgcmV0dXJuIChcbiAgICAgIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiICYmXG4gICAgICB2ICE9PSBudWxsICYmXG4gICAgICAodiBhcyB7IHQ/OiB1bmtub3duIH0pLnQgPT09IFwicmVmXCIgJiZcbiAgICAgICh2IGFzIHsgaWQ/OiB1bmtub3duIH0pLmlkID09PSBcIlBpY2tcIlxuICAgICk7XG4gIH1cbiAgZXhwb3J0IGZ1bmN0aW9uIGlzT21pdCh2OiB1bmtub3duKTogdiBpcyBBcGlQYXJhbVR5cGUuT21pdCB7XG4gICAgcmV0dXJuIChcbiAgICAgIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiICYmXG4gICAgICB2ICE9PSBudWxsICYmXG4gICAgICAodiBhcyB7IHQ/OiB1bmtub3duIH0pLnQgPT09IFwicmVmXCIgJiZcbiAgICAgICh2IGFzIHsgaWQ/OiB1bmtub3duIH0pLmlkID09PSBcIk9taXRcIlxuICAgICk7XG4gIH1cbiAgZXhwb3J0IGZ1bmN0aW9uIGlzUGFydGlhbCh2OiB1bmtub3duKTogdiBpcyBBcGlQYXJhbVR5cGUuUGFydGlhbCB7XG4gICAgcmV0dXJuIChcbiAgICAgIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiICYmXG4gICAgICB2ICE9PSBudWxsICYmXG4gICAgICAodiBhcyB7IHQ/OiB1bmtub3duIH0pLnQgPT09IFwicmVmXCIgJiZcbiAgICAgICh2IGFzIHsgaWQ/OiB1bmtub3duIH0pLmlkID09PSBcIlBhcnRpYWxcIlxuICAgICk7XG4gIH1cbiAgZXhwb3J0IGZ1bmN0aW9uIGlzUHJvbWlzZSh2OiB1bmtub3duKTogdiBpcyBBcGlQYXJhbVR5cGUuUHJvbWlzZSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiICYmXG4gICAgICB2ICE9PSBudWxsICYmXG4gICAgICAodiBhcyB7IHQ/OiB1bmtub3duIH0pLnQgPT09IFwicmVmXCIgJiZcbiAgICAgICh2IGFzIHsgaWQ/OiB1bmtub3duIH0pLmlkID09PSBcIlByb21pc2VcIlxuICAgICk7XG4gIH1cbiAgZXhwb3J0IGZ1bmN0aW9uIGlzQ29udGV4dCh2OiB1bmtub3duKTogdiBpcyBBcGlQYXJhbVR5cGUuQ29udGV4dCB7XG4gICAgcmV0dXJuIChcbiAgICAgIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiICYmXG4gICAgICB2ICE9PSBudWxsICYmXG4gICAgICAodiBhcyB7IHQ/OiB1bmtub3duIH0pLnQgPT09IFwicmVmXCIgJiZcbiAgICAgICh2IGFzIHsgaWQ/OiB1bmtub3duIH0pLmlkID09PSBcIkNvbnRleHRcIlxuICAgICk7XG4gIH1cbiAgZXhwb3J0IGZ1bmN0aW9uIGlzUmVmS25leCh2OiB1bmtub3duKTogdiBpcyBBcGlQYXJhbVR5cGUuUmVmIHtcbiAgICByZXR1cm4gKFxuICAgICAgdHlwZW9mIHYgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgIHYgIT09IG51bGwgJiZcbiAgICAgICh2IGFzIHsgdD86IHVua25vd24gfSkudCA9PT0gXCJyZWZcIiAmJlxuICAgICAgKHYgYXMgeyBpZD86IHVua25vd24gfSkuaWQgPT09IFwiS25leFwiXG4gICAgKTtcbiAgfVxuICBleHBvcnQgZnVuY3Rpb24gaXNUeXBlUGFyYW0odjogdW5rbm93bik6IHYgaXMgQXBpUGFyYW1UeXBlLlR5cGVQYXJhbSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiICYmIHYgIT09IG51bGwgJiYgKHYgYXMgeyB0PzogdW5rbm93biB9KS50ID09PSBcInR5cGUtcGFyYW1cIjtcbiAgfVxufVxuZXhwb3J0IHR5cGUgQXBpUGFyYW1UeXBlID1cbiAgfCBcInN0cmluZ1wiXG4gIHwgXCJudW1iZXJcIlxuICB8IFwiYm9vbGVhblwiXG4gIHwgXCJudWxsXCJcbiAgfCBcInVuZGVmaW5lZFwiXG4gIHwgXCJ2b2lkXCJcbiAgfCBcImFueVwiXG4gIHwgXCJ1bmtub3duXCJcbiAgfCBcInRydWVcIlxuICB8IFwiZmFsc2VcIlxuICB8IEFwaVBhcmFtVHlwZS5TdHJpbmdMaXRlcmFsXG4gIHwgQXBpUGFyYW1UeXBlLk51bWVyaWNMaXRlcmFsXG4gIHwgQXBpUGFyYW1UeXBlLk9iamVjdFxuICB8IEFwaVBhcmFtVHlwZS5VbmlvblxuICB8IEFwaVBhcmFtVHlwZS5JbnRlcnNlY3Rpb25cbiAgfCBBcGlQYXJhbVR5cGUuQXJyYXlcbiAgfCBBcGlQYXJhbVR5cGUuUmVmXG4gIHwgQXBpUGFyYW1UeXBlLkluZGV4ZWRBY2Nlc3NcbiAgfCBBcGlQYXJhbVR5cGUuVHlwZVBhcmFtXG4gIHwgQXBpUGFyYW1UeXBlLlR1cGxlVHlwZVxuICB8IEFwaVBhcmFtVHlwZS5GdW5jdGlvbjtcblxuLyogVGVtcGxhdGUgKi9cbi8qKlxuICogVUkg7Lu07Y+s64SM7Yq4IOugjOuNlOungeydhCDsnITtlZwg66mU7YOA642w7J207YSwIOuFuOuTnOyeheuLiOuLpC5cbiAqXG4gKiAqKuuqqeyggSoqOiBab2Qg7Iqk7YKk66eI66Gc67aA7YSwIO2UhOuhoO2KuOyXlOuTnCBVSSDsu7Ttj6zrhIztirjrpbwg7J6Q64+ZIOyDneyEse2VmOq4sCDsnITtlZxcbiAqIOugjOuNlOungSDsoJXrs7Trpbwg64u07J2AIO2KuOumrCDqtazsobDsnoXri4jri6QuIOqwgSDtlYTrk5zqsIAg7Ja065akIFVJIOy7tO2PrOuEjO2KuOuhnFxuICog7ZGc7ZiE65CY7Ja07JW8IO2VmOuKlOyngCjthY3siqTtirgsIOydtOuvuOyngCwg64Kg7KecLCBFbnVtIOyEoO2DnSDrk7Ep66W8IOuqheyLnO2VqeuLiOuLpC5cbiAqXG4gKiAqKuuzgO2ZmCDtnZDrpoQqKjpcbiAqIEVudGl0eSBzdWJzZXQg4oaSIEVudGl0eVByb3BOb2RlIOKGkiBab2Qg7Iqk7YKk66eIIOKGkiBSZW5kZXJpbmdOb2RlIChVSeyaqSkg4oaSIFJlYWN0IOy7tO2PrOuEjO2KuCDsvZTrk5wg7IOd7ISxXG4gKlxuICogKirso7zsmpQg7ZWE65OcKio6XG4gKiAtIGByZW5kZXJUeXBlYDogVUkg7Lu07Y+s64SM7Yq4IOycoO2YlSAoc3RyaW5nLXBsYWluLCBudW1iZXItZmtfaWQsIGVudW1zLCBhcnJheSDrk7EpXG4gKiAtIGB6b2RUeXBlYDog7JuQ67O4IFpvZCDsiqTtgqTrp4ggKHZhbGlkYXRpb24g7JqpKVxuICogLSBgY2hpbGRyZW5gOiDspJHssqnrkJwg6rCd7LK0IO2VhOuTnOuTpCAob2JqZWN07J28IOuVjClcbiAqIC0gYGVsZW1lbnRgOiDrsLDsl7Qg7JqU7IaMIO2DgOyehSAoYXJyYXnsnbwg65WMKVxuICpcbiAqICoq7IKs7JqpIOychOy5mCoqOlxuICogLSB6b2QtY29udmVydGVyLnRz7J2YIHpvZFR5cGVUb1JlbmRlcmluZ05vZGUoKeyXkOyEnCDsg53shLFcbiAqIC0gdmlld19mb3JtLnRlbXBsYXRlLnRzLCB2aWV3X2xpc3QudGVtcGxhdGUudHMg65Ox7JeQ7IScIFJlYWN0IOy7tO2PrOuEjO2KuCDsvZTrk5wg7IOd7ISx7JeQIOyCrOyaqVxuICovXG4vLyDshYDtlIQg7LC47KGwIO2DgOyeheydtOuvgOuhnCBab2Qg7IOd65617ZWY6rOgIOyngeygkSDsoJXsnZhcbmV4cG9ydCBjb25zdCBSZW5kZXJpbmdOb2RlID0gei5hbnkoKTtcbmV4cG9ydCB0eXBlIFJlbmRlcmluZ05vZGUgPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgcmVuZGVyVHlwZTpcbiAgICB8IFwic3RyaW5nLXBsYWluXCJcbiAgICB8IFwic3RyaW5nLWltYWdlXCJcbiAgICB8IFwic3RyaW5nLWRhdGV0aW1lXCJcbiAgICB8IFwic3RyaW5nLWRhdGVcIlxuICAgIHwgXCJzdHJpbmctaWRcIlxuICAgIHwgXCJzdHJpbmctZmtfaWRcIlxuICAgIHwgXCJkYXRldGltZVwiXG4gICAgfCBcIm51bWJlci1wbGFpblwiXG4gICAgfCBcIm51bWJlci1pZFwiXG4gICAgfCBcIm51bWJlci1ma19pZFwiXG4gICAgfCBcImJvb2xlYW5cIlxuICAgIHwgXCJlbnVtc1wiXG4gICAgfCBcImFycmF5XCJcbiAgICB8IFwiYXJyYXktaW1hZ2VzXCJcbiAgICB8IFwianNvbi1zb25hbXVmaWxlXCJcbiAgICB8IFwianNvbi1zb25hbXVmaWxlLWFycmF5XCJcbiAgICB8IFwib2JqZWN0XCJcbiAgICB8IFwib2JqZWN0LXBpY2tcIlxuICAgIHwgXCJyZWNvcmRcIlxuICAgIHwgXCJ2ZWN0b3JcIjtcbiAgem9kVHlwZTogei5ab2RUeXBlQW55O1xuICBlbGVtZW50PzogUmVuZGVyaW5nTm9kZTtcbiAgY2hpbGRyZW4/OiBSZW5kZXJpbmdOb2RlW107XG4gIGNvbmZpZz86IHtcbiAgICBwaWNrZWQ6IHN0cmluZztcbiAgfTtcbiAgb3B0aW9uYWw/OiBib29sZWFuO1xuICBudWxsYWJsZT86IGJvb2xlYW47XG59O1xuXG5jb25zdCBHZW5lcmF0ZWRDb2x1bW5TY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHR5cGU6IHouZW51bShbXCJTVE9SRURcIiwgXCJWSVJUVUFMXCJdKSxcbiAgZXhwcmVzc2lvbjogei5zdHJpbmcoKSxcbn0pO1xuXG5jb25zdCBGaXh0dXJlQ29tcGFuaW9uU2NoZW1hID0gei5vYmplY3Qoe1xuICBlbnRpdHk6IHouc3RyaW5nKCksXG4gIG92ZXJyaWRlczogei5yZWNvcmQoei5zdHJpbmcoKSwgei51bmtub3duKCkpLm9wdGlvbmFsKCksXG4gIGNvdW50OiB6Lm51bWJlcigpLmludCgpLnBvc2l0aXZlKCkub3B0aW9uYWwoKSxcbn0pO1xuXG4vKipcbiAqIENvbmUg7Iqk7YKk66eIIOqygOymnVxuICpcbiAqIGNvbmUg66mU7YOA642w7J207YSw7J2YIOycoO2aqOyEseydhCDqsoDspp3tlanri4jri6QuXG4gKi9cbmNvbnN0IENvbmVTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIG5vdGU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICB0YWdzOiB6LmFycmF5KHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgZml4dHVyZUdlbmVyYXRvcjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIGZpeHR1cmVEZWZhdWx0OiB6LnVua25vd24oKS5vcHRpb25hbCgpLFxuICAgIGZpeHR1cmVTdHJhdGVneTogei5saXRlcmFsKFwic2VxdWVuY2VcIikub3B0aW9uYWwoKSxcbiAgICBmaXh0dXJlQ29tcGFuaW9uczogei5hcnJheShGaXh0dXJlQ29tcGFuaW9uU2NoZW1hKS5vcHRpb25hbCgpLFxuICAgIGZpeHR1cmVQYXJlbnRPdmVycmlkZXM6IHoucmVjb3JkKHouc3RyaW5nKCksIHoudW5rbm93bigpKS5vcHRpb25hbCgpLFxuICAgIGRhdGFTb3VyY2U6IHpcbiAgICAgIC5vYmplY3Qoe1xuICAgICAgICBzdHJhdGVneTogei5lbnVtKFtcInNhbXBsZVwiLCBcImlkc1wiLCBcInF1ZXJ5XCIsIFwiZmlsZVwiLCBcInJlY2VudFwiLCBcInJhbmRvbVwiXSksXG4gICAgICAgIGNvbmZpZzogei51bmtub3duKCkub3B0aW9uYWwoKSxcbiAgICAgIH0pXG4gICAgICAub3B0aW9uYWwoKSxcbiAgfSlcbiAgLmNhdGNoYWxsKHoudW5rbm93bigpKTsgLy8g7IKs7Jqp7J6QIOygleydmCDrqZTtg4DrjbDsnbTthLAg7ZeI7JqpXG5cbmNvbnN0IEJhc2VQcm9wRmllbGRzID0ge1xuICBuYW1lOiB6LnN0cmluZygpLFxuICBkZXNjOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIG51bGxhYmxlOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICB0b0ZpbHRlcjogei5ib29sZWFuKCkuZGVmYXVsdChmYWxzZSkub3B0aW9uYWwoKSxcbiAgZGJEZWZhdWx0OiB6LnVuaW9uKFt6LnN0cmluZygpLCB6Lm51bWJlcigpLCB6LmJvb2xlYW4oKV0pLm9wdGlvbmFsKCksXG4gIGdlbmVyYXRlZDogR2VuZXJhdGVkQ29sdW1uU2NoZW1hLm9wdGlvbmFsKCksXG4gIGNvbmU6IENvbmVTY2hlbWEub3B0aW9uYWwoKSxcbn07XG5cbi8vIOu2gOqwgCDtlYTrk5zqsIAg7ZWE7JqU7JeG64qUIHByb3BcbmNvbnN0IEJhc2VQcm9wRmllbGRzV2l0aG91dEFkZGl0aW9uYWwgPSB6XG4gIC5vYmplY3Qoe1xuICAgIC4uLkJhc2VQcm9wRmllbGRzLFxuICAgIHR5cGU6IHoudW5pb24oW1xuICAgICAgei5saXRlcmFsKFwiaW50ZWdlclwiKSxcbiAgICAgIHoubGl0ZXJhbChcImludGVnZXJbXVwiKSxcbiAgICAgIHoubGl0ZXJhbChcImJpZ0ludGVnZXJcIiksXG4gICAgICB6LmxpdGVyYWwoXCJiaWdJbnRlZ2VyW11cIiksXG4gICAgICB6LmxpdGVyYWwoXCJib29sZWFuXCIpLFxuICAgICAgei5saXRlcmFsKFwiYm9vbGVhbltdXCIpLFxuICAgICAgei5saXRlcmFsKFwidXVpZFwiKSxcbiAgICAgIHoubGl0ZXJhbChcInV1aWRbXVwiKSxcbiAgICAgIHoubGl0ZXJhbChcInRzdmVjdG9yXCIpLFxuICAgIF0pLFxuICB9KVxuICAuc3RyaWN0KCk7XG5cbi8vIHByZWNpc2lvbi9zY2FsZSDtlYTrk5xcbmNvbnN0IFByZWNpc2lvblNjYWxlRmllbGRzID0ge1xuICBwcmVjaXNpb246IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgc2NhbGU6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbn07XG5cbi8vIOqwgSDtg4DsnoXrs4Qg7Iqk7YKk66eIIOygleydmFxuXG5jb25zdCBTdHJpbmdQcm9wU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICAuLi5CYXNlUHJvcEZpZWxkcyxcbiAgICB0eXBlOiB6LmxpdGVyYWwoXCJzdHJpbmdcIiksXG4gICAgbGVuZ3RoOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgem9kRm9ybWF0OiBab2RTdHJpbmdGb3JtYXQub3B0aW9uYWwoKSxcbiAgfSlcbiAgLnN0cmljdCgpO1xuY29uc3QgU3RyaW5nQXJyYXlQcm9wU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICAuLi5CYXNlUHJvcEZpZWxkcyxcbiAgICB0eXBlOiB6LmxpdGVyYWwoXCJzdHJpbmdbXVwiKSxcbiAgICBsZW5ndGg6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICB6b2RGb3JtYXQ6IFpvZFN0cmluZ0Zvcm1hdC5vcHRpb25hbCgpLFxuICB9KVxuICAuc3RyaWN0KCk7XG5cbmNvbnN0IEVudW1Qcm9wU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICAuLi5CYXNlUHJvcEZpZWxkcyxcbiAgICB0eXBlOiB6LmxpdGVyYWwoXCJlbnVtXCIpLFxuICAgIGlkOiB6LnN0cmluZygpLFxuICAgIGxlbmd0aDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICB9KVxuICAuc3RyaWN0KCk7XG5jb25zdCBFbnVtQXJyYXlQcm9wU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICAuLi5CYXNlUHJvcEZpZWxkcyxcbiAgICB0eXBlOiB6LmxpdGVyYWwoXCJlbnVtW11cIiksXG4gICAgaWQ6IHouc3RyaW5nKCksXG4gIH0pXG4gIC5zdHJpY3QoKTtcblxuY29uc3QgTnVtYmVyUHJvcFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgLi4uQmFzZVByb3BGaWVsZHMsXG4gICAgdHlwZTogei5saXRlcmFsKFwibnVtYmVyXCIpLFxuICAgIC4uLlByZWNpc2lvblNjYWxlRmllbGRzLFxuICAgIG51bWJlclR5cGU6IHouZW51bShbXCJyZWFsXCIsIFwiZG91YmxlIHByZWNpc2lvblwiLCBcIm51bWVyaWNcIl0pLm9wdGlvbmFsKCksXG4gIH0pXG4gIC5zdHJpY3QoKTtcbmNvbnN0IE51bWJlckFycmF5UHJvcFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgLi4uQmFzZVByb3BGaWVsZHMsXG4gICAgdHlwZTogei5saXRlcmFsKFwibnVtYmVyW11cIiksXG4gICAgLi4uUHJlY2lzaW9uU2NhbGVGaWVsZHMsXG4gICAgbnVtYmVyVHlwZTogei5lbnVtKFtcInJlYWxcIiwgXCJkb3VibGUgcHJlY2lzaW9uXCIsIFwibnVtZXJpY1wiXSkub3B0aW9uYWwoKSxcbiAgfSlcbiAgLnN0cmljdCgpO1xuXG5jb25zdCBEYXRlUHJvcFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgLi4uQmFzZVByb3BGaWVsZHMsXG4gICAgdHlwZTogei5saXRlcmFsKFwiZGF0ZVwiKSxcbiAgICBwcmVjaXNpb246IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgfSlcbiAgLnN0cmljdCgpO1xuY29uc3QgRGF0ZUFycmF5UHJvcFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgLi4uQmFzZVByb3BGaWVsZHMsXG4gICAgdHlwZTogei5saXRlcmFsKFwiZGF0ZVtdXCIpLFxuICAgIHByZWNpc2lvbjogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICB9KVxuICAuc3RyaWN0KCk7XG5cbmNvbnN0IE51bWVyaWNQcm9wU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICAuLi5CYXNlUHJvcEZpZWxkcyxcbiAgICB0eXBlOiB6LmxpdGVyYWwoXCJudW1lcmljXCIpLFxuICAgIC4uLlByZWNpc2lvblNjYWxlRmllbGRzLFxuICB9KVxuICAuc3RyaWN0KCk7XG5jb25zdCBOdW1lcmljQXJyYXlQcm9wU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICAuLi5CYXNlUHJvcEZpZWxkcyxcbiAgICB0eXBlOiB6LmxpdGVyYWwoXCJudW1lcmljW11cIiksXG4gICAgLi4uUHJlY2lzaW9uU2NhbGVGaWVsZHMsXG4gIH0pXG4gIC5zdHJpY3QoKTtcblxuY29uc3QgSnNvblByb3BTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIC4uLkJhc2VQcm9wRmllbGRzLFxuICAgIHR5cGU6IHoubGl0ZXJhbChcImpzb25cIiksXG4gICAgaWQ6IHouc3RyaW5nKCksXG4gIH0pXG4gIC5zdHJpY3QoKTtcblxuY29uc3QgU2VhcmNoVGV4dFNvdXJjZUNvbHVtblNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgbmFtZTogei5zdHJpbmcoKSxcbiAgICBjYXNlSW5zZW5zaXRpdmU6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gIH0pXG4gIC5zdHJpY3QoKTtcblxuY29uc3QgU2VhcmNoVGV4dFByb3BTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIC4uLkJhc2VQcm9wRmllbGRzLFxuICAgIHR5cGU6IHoubGl0ZXJhbChcInNlYXJjaFRleHRcIiksXG4gICAgc291cmNlQ29sdW1uczogei5hcnJheShTZWFyY2hUZXh0U291cmNlQ29sdW1uU2NoZW1hKS5taW4oMSksXG4gIH0pXG4gIC5zdHJpY3QoKTtcblxuY29uc3QgVmlydHVhbFByb3BTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIC4uLkJhc2VQcm9wRmllbGRzLFxuICAgIHR5cGU6IHoubGl0ZXJhbChcInZpcnR1YWxcIiksXG4gICAgaWQ6IHouc3RyaW5nKCksXG4gICAgdmlydHVhbFR5cGU6IHouZW51bShbXCJxdWVyeVwiLCBcImNvZGVcIl0pLm9wdGlvbmFsKCksXG4gIH0pXG4gIC5zdHJpY3QoKTtcblxuY29uc3QgVmVjdG9yUHJvcFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgLi4uQmFzZVByb3BGaWVsZHMsXG4gICAgdHlwZTogei5saXRlcmFsKFwidmVjdG9yXCIpLFxuICAgIGRpbWVuc2lvbnM6IHoubnVtYmVyKCksXG4gIH0pXG4gIC5zdHJpY3QoKTtcbmNvbnN0IFZlY3RvckFycmF5UHJvcFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgLi4uQmFzZVByb3BGaWVsZHMsXG4gICAgdHlwZTogei5saXRlcmFsKFwidmVjdG9yW11cIiksXG4gICAgZGltZW5zaW9uczogei5udW1iZXIoKSxcbiAgfSlcbiAgLnN0cmljdCgpO1xuXG4vLyBSZWxhdGlvbiDtg4DsnoXsnYAgcmVsYXRpb25UeXBl7JeQIOuUsOudvCDshLjrtoTtmZRcbmNvbnN0IEJhc2VSZWxhdGlvbkZpZWxkcyA9IHtcbiAgLi4uQmFzZVByb3BGaWVsZHMsXG4gIHR5cGU6IHoubGl0ZXJhbChcInJlbGF0aW9uXCIpLFxuICB3aXRoOiB6LnN0cmluZygpLFxufTtcblxuLy8gUmVsYXRpb25PbiDtg4DsnoVcbmNvbnN0IFJlbGF0aW9uT25TY2hlbWEgPSB6LmVudW0oW1wiQ0FTQ0FERVwiLCBcIlNFVCBOVUxMXCIsIFwiTk8gQUNUSU9OXCIsIFwiU0VUIERFRkFVTFRcIiwgXCJSRVNUUklDVFwiXSk7XG5cbmNvbnN0IEJlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgLi4uQmFzZVJlbGF0aW9uRmllbGRzLFxuICAgIHJlbGF0aW9uVHlwZTogei5saXRlcmFsKFwiQmVsb25nc1RvT25lXCIpLFxuICAgIGN1c3RvbUpvaW5DbGF1c2U6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICB1c2VDb25zdHJhaW50OiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAgIG9uVXBkYXRlOiBSZWxhdGlvbk9uU2NoZW1hLm9wdGlvbmFsKCksXG4gICAgb25EZWxldGU6IFJlbGF0aW9uT25TY2hlbWEub3B0aW9uYWwoKSxcbiAgfSlcbiAgLnN0cmljdCgpO1xuXG5jb25zdCBIYXNNYW55UmVsYXRpb25Qcm9wU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICAuLi5CYXNlUmVsYXRpb25GaWVsZHMsXG4gICAgcmVsYXRpb25UeXBlOiB6LmxpdGVyYWwoXCJIYXNNYW55XCIpLFxuICAgIGpvaW5Db2x1bW46IHouc3RyaW5nKCksXG4gICAgZnJvbUNvbHVtbjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICB9KVxuICAuc3RyaWN0KCk7XG5cbmNvbnN0IE1hbnlUb01hbnlSZWxhdGlvblByb3BTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIC4uLkJhc2VSZWxhdGlvbkZpZWxkcyxcbiAgICByZWxhdGlvblR5cGU6IHoubGl0ZXJhbChcIk1hbnlUb01hbnlcIiksXG4gICAgam9pblRhYmxlOiB6LnN0cmluZygpLFxuICAgIG9uVXBkYXRlOiBSZWxhdGlvbk9uU2NoZW1hLFxuICAgIG9uRGVsZXRlOiBSZWxhdGlvbk9uU2NoZW1hLFxuICB9KVxuICAuc3RyaWN0KCk7XG5cbmNvbnN0IE9uZVRvT25lUmVsYXRpb25Qcm9wU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICAuLi5CYXNlUmVsYXRpb25GaWVsZHMsXG4gICAgcmVsYXRpb25UeXBlOiB6LmxpdGVyYWwoXCJPbmVUb09uZVwiKSxcbiAgICBjdXN0b21Kb2luQ2xhdXNlOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgaGFzSm9pbkNvbHVtbjogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgICB1c2VDb25zdHJhaW50OiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAgIG9uVXBkYXRlOiBSZWxhdGlvbk9uU2NoZW1hLm9wdGlvbmFsKCksXG4gICAgb25EZWxldGU6IFJlbGF0aW9uT25TY2hlbWEub3B0aW9uYWwoKSxcbiAgfSlcbiAgLnN0cmljdCgpO1xuXG5jb25zdCBSZWxhdGlvblR5cGVzID0gW1wiQmVsb25nc1RvT25lXCIsIFwiSGFzTWFueVwiLCBcIk1hbnlUb01hbnlcIiwgXCJPbmVUb09uZVwiXSBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCBSZWxhdGlvblByb3BTY2hlbWEgPSB6LmRpc2NyaW1pbmF0ZWRVbmlvbihcbiAgXCJyZWxhdGlvblR5cGVcIixcbiAgW1xuICAgIEJlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcFNjaGVtYSxcbiAgICBIYXNNYW55UmVsYXRpb25Qcm9wU2NoZW1hLFxuICAgIE1hbnlUb01hbnlSZWxhdGlvblByb3BTY2hlbWEsXG4gICAgT25lVG9PbmVSZWxhdGlvblByb3BTY2hlbWEsXG4gIF0sXG4gIHtcbiAgICBlcnJvcjogKGlzcykgPT5cbiAgICAgIGByZWxhdGlvblR5cGXsnYAgJHtSZWxhdGlvblR5cGVzLm1hcCgodCkgPT4gYCcke3R9J2ApLmpvaW4oXCIsIFwiKX0g7KSRIO2VmOuCmOyXrOyVvCDtlanri4jri6QuIOyeheugpeqwkjogXCIkeyhpc3MuaW5wdXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pPy5yZWxhdGlvblR5cGV9XCJgLFxuICB9LFxuKTtcblxuY29uc3QgTm9ybWFsUHJvcFR5cGVzID0gW1xuICBcImludGVnZXJcIixcbiAgXCJpbnRlZ2VyW11cIixcbiAgXCJiaWdJbnRlZ2VyXCIsXG4gIFwiYmlnSW50ZWdlcltdXCIsXG4gIFwic3RyaW5nXCIsXG4gIFwic3RyaW5nW11cIixcbiAgXCJlbnVtXCIsXG4gIFwiZW51bVtdXCIsXG4gIFwibnVtYmVyXCIsXG4gIFwibnVtYmVyW11cIixcbiAgXCJudW1lcmljXCIsXG4gIFwibnVtZXJpY1tdXCIsXG4gIFwiYm9vbGVhblwiLFxuICBcImJvb2xlYW5bXVwiLFxuICBcImRhdGVcIixcbiAgXCJkYXRlW11cIixcbiAgXCJ1dWlkXCIsXG4gIFwidXVpZFtdXCIsXG4gIFwianNvblwiLFxuICBcInNlYXJjaFRleHRcIixcbiAgXCJ2aXJ0dWFsXCIsXG4gIFwidmVjdG9yXCIsXG4gIFwidmVjdG9yW11cIixcbiAgXCJ0c3ZlY3RvclwiLFxuXSBhcyBjb25zdDtcblxuLy8gVklSVFVBTCBHZW5lcmF0ZWQgQ29sdW1u7JeQ7IScIOyCrOyaqSDrtojqsIDriqXtlZwg7YOA7J6F65OkXG5jb25zdCBWaXJ0dWFsR2VuZXJhdGVkRGlzYWxsb3dlZFR5cGVzID0gW1xuICBcImpzb25cIixcbiAgXCJ2ZWN0b3JcIixcbiAgXCJ2ZWN0b3JbXVwiLFxuICBcInN0cmluZ1tdXCIsXG4gIFwiaW50ZWdlcltdXCIsXG4gIFwiYmlnSW50ZWdlcltdXCIsXG4gIFwiYm9vbGVhbltdXCIsXG4gIFwiZGF0ZVtdXCIsXG4gIFwidXVpZFtdXCIsXG4gIFwibnVtYmVyW11cIixcbiAgXCJudW1lcmljW11cIixcbiAgXCJlbnVtW11cIixcbl0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBOb3JtYWxQcm9wU2NoZW1hID0gelxuICAuZGlzY3JpbWluYXRlZFVuaW9uKFxuICAgIFwidHlwZVwiLFxuICAgIFtcbiAgICAgIEJhc2VQcm9wRmllbGRzV2l0aG91dEFkZGl0aW9uYWwsXG4gICAgICBTdHJpbmdQcm9wU2NoZW1hLFxuICAgICAgU3RyaW5nQXJyYXlQcm9wU2NoZW1hLFxuICAgICAgRW51bVByb3BTY2hlbWEsXG4gICAgICBFbnVtQXJyYXlQcm9wU2NoZW1hLFxuICAgICAgTnVtYmVyUHJvcFNjaGVtYSxcbiAgICAgIE51bWJlckFycmF5UHJvcFNjaGVtYSxcbiAgICAgIERhdGVQcm9wU2NoZW1hLFxuICAgICAgRGF0ZUFycmF5UHJvcFNjaGVtYSxcbiAgICAgIE51bWVyaWNQcm9wU2NoZW1hLFxuICAgICAgTnVtZXJpY0FycmF5UHJvcFNjaGVtYSxcbiAgICAgIEpzb25Qcm9wU2NoZW1hLFxuICAgICAgU2VhcmNoVGV4dFByb3BTY2hlbWEsXG4gICAgICBWaXJ0dWFsUHJvcFNjaGVtYSxcbiAgICAgIFZlY3RvclByb3BTY2hlbWEsXG4gICAgICBWZWN0b3JBcnJheVByb3BTY2hlbWEsXG4gICAgXSxcbiAgICB7XG4gICAgICBlcnJvcjogKGlzcykgPT5cbiAgICAgICAgYHR5cGXsnYAgJHtOb3JtYWxQcm9wVHlwZXMubWFwKCh0KSA9PiBgJyR7dH0nYCkuam9pbihcIiwgXCIpfSDspJEg7ZWY64KY7Jes7JW8IO2VqeuLiOuLpC4g7J6F66Cl6rCSOiBcIiR7KGlzcy5pbnB1dCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik/LnR5cGV9XCJgLFxuICAgIH0sXG4gIClcbiAgLnN1cGVyUmVmaW5lKChkYXRhLCBjdHgpID0+IHtcbiAgICBpZiAoIWRhdGEuZ2VuZXJhdGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gZGJEZWZhdWx07JmAIGdlbmVyYXRlZCDrj5nsi5wg7IKs7JqpIOu2iOqwgFxuICAgIGlmIChkYXRhLmRiRGVmYXVsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjdHguYWRkSXNzdWUoe1xuICAgICAgICBjb2RlOiBcImN1c3RvbVwiLFxuICAgICAgICBtZXNzYWdlOiBcImRiRGVmYXVsdOyZgCBnZW5lcmF0ZWTripQg7ZWo6ruYIOyCrOyaqe2VoCDsiJgg7JeG7Iq164uI64ukXCIsXG4gICAgICAgIHBhdGg6IFtcImdlbmVyYXRlZFwiXSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIHZpcnR1YWwg7YOA7J6F7J2AIGdlbmVyYXRlZCDrtojqsIBcbiAgICBpZiAoZGF0YS50eXBlID09PSBcInZpcnR1YWxcIikge1xuICAgICAgY3R4LmFkZElzc3VlKHtcbiAgICAgICAgY29kZTogXCJjdXN0b21cIixcbiAgICAgICAgbWVzc2FnZTogXCJ2aXJ0dWFsIO2DgOyeheydgCBnZW5lcmF0ZWQgY29sdW1u7J2EIOyngOybkO2VmOyngCDslYrsirXri4jri6RcIixcbiAgICAgICAgcGF0aDogW1wiZ2VuZXJhdGVkXCJdLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gVklSVFVBTCBHZW5lcmF0ZWQgQ29sdW1uIO2DgOyehSDsoJztlZwg6rKA7KadXG4gICAgaWYgKGRhdGEuZ2VuZXJhdGVkLnR5cGUgPT09IFwiVklSVFVBTFwiKSB7XG4gICAgICBpZiAoKFZpcnR1YWxHZW5lcmF0ZWREaXNhbGxvd2VkVHlwZXMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKGRhdGEudHlwZSkpIHtcbiAgICAgICAgY3R4LmFkZElzc3VlKHtcbiAgICAgICAgICBjb2RlOiBcImN1c3RvbVwiLFxuICAgICAgICAgIG1lc3NhZ2U6IGBWSVJUVUFMIGdlbmVyYXRlZCBjb2x1bW7snYAgJHtkYXRhLnR5cGV9IO2DgOyeheydhCDsp4Dsm5DtlZjsp4Ag7JWK7Iq164uI64ukLiBTVE9SRUTrpbwg7IKs7Jqp7ZWY7IS47JqULmAsXG4gICAgICAgICAgcGF0aDogW1wiZ2VuZXJhdGVkXCIsIFwidHlwZVwiXSxcbiAgICAgICAgICBmYXRhbDogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuY29uc3QgQWxsUHJvcFR5cGVzID0gWy4uLk5vcm1hbFByb3BUeXBlcywgXCJyZWxhdGlvblwiXSBhcyBjb25zdDtcbmNvbnN0IEVudGl0eVByb3BTY2hlbWEgPSB6LmRpc2NyaW1pbmF0ZWRVbmlvbihcInR5cGVcIiwgW05vcm1hbFByb3BTY2hlbWEsIFJlbGF0aW9uUHJvcFNjaGVtYV0sIHtcbiAgZXJyb3I6IChpc3MpID0+XG4gICAgYHR5cGXsnYAgJHtBbGxQcm9wVHlwZXMubWFwKCh0KSA9PiBgJyR7dH0nYCkuam9pbihcIiwgXCIpfSDspJEg7ZWY64KY7Jes7JW8IO2VqeuLiOuLpC4g7J6F66Cl6rCSOiBcIiR7KGlzcy5pbnB1dCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik/LnR5cGV9XCJgLFxufSk7XG5cbmNvbnN0IEVudGl0eUluZGV4Q29sdW1uU2NoZW1hID0gei5vYmplY3Qoe1xuICBuYW1lOiB6LnN0cmluZygpLFxuICBudWxsc0ZpcnN0OiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICBzb3J0T3JkZXI6IHouZW51bShbXCJBU0NcIiwgXCJERVNDXCJdKS5vcHRpb25hbCgpLFxuICB2ZWN0b3JPcHM6IHouZW51bShbXCJ2ZWN0b3JfY29zaW5lX29wc1wiLCBcInZlY3Rvcl9pcF9vcHNcIiwgXCJ2ZWN0b3JfbDJfb3BzXCJdKS5vcHRpb25hbCgpLFxuICBvcGNsYXNzOiB6LnVuaW9uKFt6LmVudW0oS25vd25PcGNsYXNzVmFsdWVzKSwgei5zdHJpbmcoKS5taW4oMSldKS5vcHRpb25hbCgpLFxufSk7XG5cbi8vIEVudGl0eUluZGV4IOyKpO2CpOuniCDsoJXsnZhcbmNvbnN0IEVudGl0eUluZGV4U2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICB0eXBlOiB6LmVudW0oW1wiaW5kZXhcIiwgXCJ1bmlxdWVcIiwgXCJobnN3XCIsIFwiaXZmZmxhdFwiXSksXG4gICAgY29sdW1uczogei5hcnJheShFbnRpdHlJbmRleENvbHVtblNjaGVtYSksXG4gICAgbmFtZTogei5zdHJpbmcoKS5taW4oMSkubWF4KDYzKSxcbiAgICB1c2luZzogei5lbnVtKFtcImJ0cmVlXCIsIFwiaGFzaFwiLCBcImdpblwiLCBcImdpc3RcIiwgXCJwZ3Jvb25nYVwiXSkub3B0aW9uYWwoKSxcbiAgICBudWxsc05vdERpc3RpbmN0OiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAgIG06IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICBlZkNvbnN0cnVjdGlvbjogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgIGxpc3RzOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIH0pXG4gIC5zdHJpY3QoKTtcblxuLyoqXG4gKiBTdWJzZXREZWYg7Iqk7YKk66eIXG4gKlxuICog7ZWY7JyEIO2YuO2ZmOyEseydhCDsnITtlbQg67Cw7Je0IO2Yle2DnOyZgCDqsJ3ssrQg7ZiV7YOcIOuRmCDri6Qg7KeA7JuQ7ZWp64uI64ukLlxuICovXG5jb25zdCBTdWJzZXREZWZTY2hlbWEgPSB6LnVuaW9uKFtcbiAgLy8g6riw7KG0IOuwsOyXtCDtmJXtg5xcbiAgei5hcnJheSh6LnVuaW9uKFt6LnN0cmluZygpLCB6Lm9iamVjdCh7IGZpZWxkOiB6LnN0cmluZygpLCBpbnRlcm5hbDogei5ib29sZWFuKCkub3B0aW9uYWwoKSB9KV0pKSxcbiAgLy8g7IOI66Gc7Jq0IOqwneyytCDtmJXtg5xcbiAgei5vYmplY3Qoe1xuICAgIGZpZWxkczogei5hcnJheShcbiAgICAgIHoudW5pb24oW3ouc3RyaW5nKCksIHoub2JqZWN0KHsgZmllbGQ6IHouc3RyaW5nKCksIGludGVybmFsOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpIH0pXSksXG4gICAgKSxcbiAgICBjb25lOiBDb25lU2NoZW1hLm9wdGlvbmFsKCksXG4gIH0pLFxuXSk7XG5cbi8qKlxuICogRW51bURlZiDsiqTtgqTrp4hcbiAqXG4gKiDtlZjsnIQg7Zi47ZmY7ISx7J2EIOychO2VtCBSZWNvcmQg7ZiV7YOc7JmAIOqwneyytCDtmJXtg5wg65GYIOuLpCDsp4Dsm5Dtlanri4jri6QuXG4gKi9cbmNvbnN0IEVudW1EZWZTY2hlbWEgPSB6LnVuaW9uKFtcbiAgLy8g6riw7KG0IFJlY29yZCDtmJXtg5xcbiAgei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSksXG4gIC8vIOyDiOuhnOyatCDqsJ3ssrQg7ZiV7YOcXG4gIHoub2JqZWN0KHtcbiAgICB2YWx1ZXM6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLFxuICAgIGNvbmU6IENvbmVTY2hlbWEub3B0aW9uYWwoKSxcbiAgfSksXG5dKTtcblxuZnVuY3Rpb24gdW53cmFwU2VhcmNoVGV4dEpzb25Tb3VyY2VUeXBlKHpvZFR5cGU6IHouWm9kVHlwZUFueSk6IHouWm9kVHlwZUFueSB7XG4gIGxldCBjdXJyZW50ID0gem9kVHlwZTtcblxuICB3aGlsZSAoY3VycmVudCBpbnN0YW5jZW9mIHouWm9kT3B0aW9uYWwgfHwgY3VycmVudCBpbnN0YW5jZW9mIHouWm9kTnVsbGFibGUpIHtcbiAgICBjdXJyZW50ID0gY3VycmVudC51bndyYXAoKSBhcyB6LlpvZFR5cGVBbnk7XG4gIH1cblxuICByZXR1cm4gY3VycmVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU2VhcmNoVGV4dEpzb25Tb3VyY2Vab2RUeXBlKHpvZFR5cGU6IHouWm9kVHlwZUFueSk6IGJvb2xlYW4ge1xuICBjb25zdCBiYXNlVHlwZSA9IHVud3JhcFNlYXJjaFRleHRKc29uU291cmNlVHlwZSh6b2RUeXBlKTtcbiAgaWYgKCEoYmFzZVR5cGUgaW5zdGFuY2VvZiB6LlpvZEFycmF5KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGVsZW1lbnRUeXBlID0gYmFzZVR5cGUuZGVmLmVsZW1lbnQ7XG4gIHJldHVybiBlbGVtZW50VHlwZSBpbnN0YW5jZW9mIHouWm9kU3RyaW5nO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVNlYXJjaFRleHRTb3VyY2VzKFxuICBwcm9wczogcmVhZG9ubHkgei5pbmZlcjx0eXBlb2YgRW50aXR5UHJvcFNjaGVtYT5bXSxcbiAgY3R4OiB6LlJlZmluZW1lbnRDdHgsXG4gIHByb3BzUGF0aDogKHN0cmluZyB8IG51bWJlcilbXSA9IFtcInByb3BzXCJdLFxuKTogdm9pZCB7XG4gIGNvbnN0IHByb3BzQnlOYW1lID0gbmV3IE1hcChcbiAgICBwcm9wcy5tYXAoKHByb3ApID0+IHtcbiAgICAgIHJldHVybiBbcHJvcC5uYW1lLCBwcm9wXTtcbiAgICB9KSxcbiAgKTtcblxuICBwcm9wcy5mb3JFYWNoKChwcm9wLCBwcm9wSW5kZXgpID0+IHtcbiAgICBpZiAocHJvcC50eXBlICE9PSBcInNlYXJjaFRleHRcIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHByb3Auc291cmNlQ29sdW1ucy5mb3JFYWNoKChzb3VyY2UsIHNvdXJjZUluZGV4KSA9PiB7XG4gICAgICBjb25zdCBzb3VyY2VQcm9wID0gcHJvcHNCeU5hbWUuZ2V0KHNvdXJjZS5uYW1lKTtcbiAgICAgIGNvbnN0IHNvdXJjZVBhdGggPSBbLi4ucHJvcHNQYXRoLCBwcm9wSW5kZXgsIFwic291cmNlQ29sdW1uc1wiLCBzb3VyY2VJbmRleCwgXCJuYW1lXCJdO1xuXG4gICAgICBpZiAoIXNvdXJjZVByb3ApIHtcbiAgICAgICAgY3R4LmFkZElzc3VlKHtcbiAgICAgICAgICBjb2RlOiBcImN1c3RvbVwiLFxuICAgICAgICAgIG1lc3NhZ2U6IGBzZWFyY2hUZXh0IHNvdXJjZSBjb2x1bW4gXCIke3NvdXJjZS5uYW1lfVwi7J2EKOulvCkg7LC+7J2EIOyImCDsl4bsirXri4jri6QuYCxcbiAgICAgICAgICBwYXRoOiBzb3VyY2VQYXRoLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoc291cmNlUHJvcC50eXBlID09PSBcInN0cmluZ1wiIHx8IHNvdXJjZVByb3AudHlwZSA9PT0gXCJzdHJpbmdbXVwiKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHNvdXJjZVByb3AudHlwZSA9PT0gXCJqc29uXCIpIHtcbiAgICAgICAgLy8ganNvbiBzb3VyY2XsnZgg7LWc7KKFIO2DgOyehSDsnKDtmqjshLHsnYAgRW50aXR5TWFuYWdlci5yZWdpc3RlcigpIOuLqOqzhOyXkOyEnFxuICAgICAgICAvLyDsi6TsoJwgWm9kIO2DgOyeheydhCDtlbTshJ3tlZjsl6wg6rWs7KGw7KCB7Jy866GcIOqygOymne2VqeuLiOuLpC5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjdHguYWRkSXNzdWUoe1xuICAgICAgICBjb2RlOiBcImN1c3RvbVwiLFxuICAgICAgICBtZXNzYWdlOiBgc2VhcmNoVGV4dCBzb3VyY2UgY29sdW1uIFwiJHtzb3VyY2UubmFtZX1cIuydmCDtg4DsnoUgXCIke3NvdXJjZVByb3AudHlwZX1cIuydgCjripQpIOyngOybkOuQmOyngCDslYrsirXri4jri6QuYCxcbiAgICAgICAgcGF0aDogc291cmNlUGF0aCxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn1cblxuY29uc3QgRW50aXR5SnNvbkJhc2VTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIGlkOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiUGFzY2FsQ2FzZeuhnCDrkJwgRW50aXR5IElEXCIpLFxuICAgIHRpdGxlOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiRW50aXR5IOydtOumhFwiKSxcbiAgICB0YWJsZTogei5zdHJpbmcoKS5kZXNjcmliZShcInNuYWtlX2Nhc2XroZwg65CcIO2FjOydtOu4lOuqhVwiKSxcbiAgICBwYXJlbnRJZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwi67aA66qoIEVudGl0eSBJRFwiKSxcbiAgICBjb25lOiBDb25lU2NoZW1hLm9wdGlvbmFsKCksXG4gICAgcHJvcHM6IHouYXJyYXkoRW50aXR5UHJvcFNjaGVtYSksXG4gICAgaW5kZXhlczogei5hcnJheShFbnRpdHlJbmRleFNjaGVtYSksXG4gICAgc3Vic2V0czogei5yZWNvcmQoei5zdHJpbmcoKSwgU3Vic2V0RGVmU2NoZW1hKSxcbiAgICBlbnVtczogei5yZWNvcmQoei5zdHJpbmcoKSwgRW51bURlZlNjaGVtYSksXG4gIH0pXG4gIC5zdHJpY3QoKTtcblxuZXhwb3J0IGNvbnN0IEVudGl0eUpzb25TY2hlbWEgPSBFbnRpdHlKc29uQmFzZVNjaGVtYS5zdXBlclJlZmluZSgoZW50aXR5LCBjdHgpID0+IHtcbiAgdmFsaWRhdGVTZWFyY2hUZXh0U291cmNlcyhlbnRpdHkucHJvcHMsIGN0eCk7XG59KTtcblxuY29uc3QgVGVtcGxhdGVFbnRpdHlTY2hlbWEgPSBFbnRpdHlKc29uQmFzZVNjaGVtYS5vbWl0KHsgaWQ6IHRydWUgfSlcbiAgLmV4dGVuZCh7XG4gICAgZW50aXR5SWQ6IHouc3RyaW5nKCksXG4gIH0pXG4gIC5wYXJ0aWFsKHtcbiAgICB0YWJsZTogdHJ1ZSxcbiAgICBwcm9wczogdHJ1ZSxcbiAgICBpbmRleGVzOiB0cnVlLFxuICAgIHN1YnNldHM6IHRydWUsXG4gICAgZW51bXM6IHRydWUsXG4gIH0pXG4gIC5zdXBlclJlZmluZSgoZW50aXR5LCBjdHgpID0+IHtcbiAgICBpZiAoIWVudGl0eS5wcm9wcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhbGlkYXRlU2VhcmNoVGV4dFNvdXJjZXMoZW50aXR5LnByb3BzLCBjdHgpO1xuICB9KTtcblxuZXhwb3J0IGNvbnN0IFRlbXBsYXRlT3B0aW9ucyA9IHoub2JqZWN0KHtcbiAgZW50aXR5OiBUZW1wbGF0ZUVudGl0eVNjaGVtYSxcbiAgaW5pdF90eXBlczogei5vYmplY3Qoe1xuICAgIGVudGl0eUlkOiB6LnN0cmluZygpLFxuICB9KSxcbiAgZ2VuZXJhdGVkOiB6Lm9iamVjdCh7fSksXG4gIGdlbmVyYXRlZF9zc286IHoub2JqZWN0KHt9KSxcbiAgZ2VuZXJhdGVkX2h0dHA6IHoub2JqZWN0KHtcbiAgICBlbnRpdHlJZDogei5zdHJpbmcoKSxcbiAgfSksXG4gIG1vZGVsOiB6Lm9iamVjdCh7XG4gICAgZW50aXR5SWQ6IHouc3RyaW5nKCksXG4gICAgZGVmYXVsdFNlYXJjaEZpZWxkOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgZGVmYXVsdE9yZGVyQnk6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgfSksXG4gIG1vZGVsX3Rlc3Q6IHoub2JqZWN0KHtcbiAgICBlbnRpdHlJZDogei5zdHJpbmcoKSxcbiAgfSksXG4gIGJyaWRnZTogei5vYmplY3Qoe1xuICAgIGVudGl0eUlkOiB6LnN0cmluZygpLFxuICB9KSxcbiAgc2VydmljZXM6IHoub2JqZWN0KHt9KSxcbiAgdmlld19saXN0OiB6Lm9iamVjdCh7XG4gICAgZW50aXR5SWQ6IHouc3RyaW5nKCksXG4gICAgZXh0cmE6IHoudW5rbm93bigpLFxuICB9KSxcbiAgdmlld19saXN0X2NvbHVtbnM6IHoub2JqZWN0KHtcbiAgICBlbnRpdHlJZDogei5zdHJpbmcoKSxcbiAgICBjb2x1bW5zOiB6XG4gICAgICAub2JqZWN0KHtcbiAgICAgICAgbmFtZTogei5zdHJpbmcoKSxcbiAgICAgICAgbGFiZWw6IHouc3RyaW5nKCksXG4gICAgICAgIHRjOiB6LnN0cmluZygpLFxuICAgICAgfSlcbiAgICAgIC5hcnJheSgpLFxuICAgIGNvbHVtbkltcG9ydHM6IHouc3RyaW5nKCksXG4gIH0pLFxuICB2aWV3X3NlYXJjaF9pbnB1dDogei5vYmplY3Qoe1xuICAgIGVudGl0eUlkOiB6LnN0cmluZygpLFxuICB9KSxcbiAgdmlld19mb3JtOiB6Lm9iamVjdCh7XG4gICAgZW50aXR5SWQ6IHouc3RyaW5nKCksXG4gIH0pLFxuICB2aWV3X2lkX2FsbF9zZWxlY3Q6IHoub2JqZWN0KHtcbiAgICBlbnRpdHlJZDogei5zdHJpbmcoKSxcbiAgfSksXG4gIHZpZXdfZW51bXNfYnV0dG9uc2V0OiB6Lm9iamVjdCh7XG4gICAgZW50aXR5SWQ6IHouc3RyaW5nKCksXG4gICAgZW51bUlkOiB6LnN0cmluZygpLFxuICB9KSxcbiAgcXVlcmllczogei5vYmplY3Qoe30pLFxuICBlbnRyeV9zZXJ2ZXI6IHoub2JqZWN0KHt9KSxcbiAgc2Q6IHoub2JqZWN0KHtcbiAgICB0YXJnZXQ6IHouZW51bShbXCJhcGlcIiwgXCJ3ZWJcIiwgXCJhcHBcIl0pLFxuICB9KSxcbn0pO1xuZXhwb3J0IHR5cGUgVGVtcGxhdGVPcHRpb25zID0gei5pbmZlcjx0eXBlb2YgVGVtcGxhdGVPcHRpb25zPjtcblxuZXhwb3J0IGNvbnN0IFRlbXBsYXRlS2V5ID0gei5lbnVtKFtcbiAgXCJlbnRpdHlcIixcbiAgXCJpbml0X3R5cGVzXCIsXG4gIFwiZ2VuZXJhdGVkXCIsXG4gIFwiZ2VuZXJhdGVkX3Nzb1wiLFxuICBcImdlbmVyYXRlZF9odHRwXCIsXG4gIFwibW9kZWxcIixcbiAgXCJtb2RlbF90ZXN0XCIsXG4gIFwiYnJpZGdlXCIsXG4gIFwic2VydmljZXNcIixcbiAgXCJ2aWV3X2xpc3RcIixcbiAgXCJ2aWV3X2xpc3RfY29sdW1uc1wiLFxuICBcInZpZXdfc2VhcmNoX2lucHV0XCIsXG4gIFwidmlld19mb3JtXCIsXG4gIFwidmlld19pZF9hbGxfc2VsZWN0XCIsXG4gIFwidmlld19lbnVtc19idXR0b25zZXRcIixcbiAgXCJxdWVyaWVzXCIsXG4gIFwiZW50cnlfc2VydmVyXCIsXG4gIFwic2RcIixcbl0pO1xuZXhwb3J0IHR5cGUgVGVtcGxhdGVLZXkgPSB6LmluZmVyPHR5cGVvZiBUZW1wbGF0ZUtleT47XG5cbmV4cG9ydCBjb25zdCBHZW5lcmF0ZU9wdGlvbnMgPSB6Lm9iamVjdCh7XG4gIG92ZXJ3cml0ZTogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbn0pO1xuZXhwb3J0IHR5cGUgR2VuZXJhdGVPcHRpb25zID0gei5pbmZlcjx0eXBlb2YgR2VuZXJhdGVPcHRpb25zPjtcblxuZXhwb3J0IGNvbnN0IFBhdGhBbmRDb2RlID0gei5vYmplY3Qoe1xuICBwYXRoOiB6LnN0cmluZygpLFxuICBjb2RlOiB6LnN0cmluZygpLFxufSk7XG5leHBvcnQgdHlwZSBQYXRoQW5kQ29kZSA9IHouaW5mZXI8dHlwZW9mIFBhdGhBbmRDb2RlPjtcblxuZXhwb3J0IHR5cGUgRml4dHVyZVNlYXJjaE9wdGlvbnMgPSB7XG4gIGVudGl0eUlkOiBzdHJpbmc7XG4gIGZpZWxkOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIHNlYXJjaFR5cGU6IFwiZXF1YWxzXCIgfCBcImxpa2VcIjtcbn07XG5cbnR5cGUgQ29sdW1uVmFsdWUgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgRGF0ZSB8IG51bGw7XG5leHBvcnQgdHlwZSBGaXh0dXJlUmVjb3JkID0ge1xuICBmaXh0dXJlSWQ6IHN0cmluZztcbiAgZW50aXR5SWQ6IHN0cmluZztcbiAgaWQ6IG51bWJlciB8IHN0cmluZztcbiAgY29sdW1uczoge1xuICAgIFtrZXk6IHN0cmluZ106IHtcbiAgICAgIHByb3A6IEVudGl0eVByb3A7XG4gICAgICB2YWx1ZTogQ29sdW1uVmFsdWUgfCBDb2x1bW5WYWx1ZVtdO1xuICAgIH07XG4gIH07XG4gIGZldGNoZWRSZWNvcmRzOiBzdHJpbmdbXTtcbiAgYmVsb25nc1JlY29yZHM6IHN0cmluZ1tdO1xuICB0YXJnZXQ/OiBGaXh0dXJlUmVjb3JkOyAvLyBJbXBvcnQg64yA7IOBIERCIOugiOy9lOuTnChpZOqwgCDqsJnsnYApXG4gIHVuaXF1ZT86IEZpeHR1cmVSZWNvcmQ7IC8vIEltcG9ydCDrjIDsg4EgREIg66CI7L2U65OcKHVuaXF1ZSBrZXnqsIAg6rCZ7J2AKVxuICBvdmVycmlkZT86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBGaXh0dXJlSW1wb3J0UmVzdWx0ID0ge1xuICBlbnRpdHlJZDogc3RyaW5nO1xuICBkYXRhOiB7XG4gICAgW2tleTogc3RyaW5nXTogQ29sdW1uVmFsdWU7XG4gIH07XG59O1xuXG5leHBvcnQgdHlwZSBSZWxhdGlvbk5vZGUgPSB7XG4gIGZpeHR1cmVJZDogc3RyaW5nO1xuICBlbnRpdHlJZDogc3RyaW5nO1xuICByZWxhdGVkOiBTZXQ8c3RyaW5nPjtcbn07XG5cbi8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FbXB0eUludGVyZmFjZTogc29uYW11LmdlbmVyYXRlZC5zc28g7JeQ7IScIO2ZleyepeydhCDsnITtlbQg7KSA67mE65CcIOu5iCDsnbjthLDtjpjsnbTsiqRcbmV4cG9ydCBpbnRlcmZhY2UgRGF0YWJhc2VTY2hlbWFFeHRlbmQge31cbi8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FbXB0eUludGVyZmFjZTogc29uYW11LmdlbmVyYXRlZC5zc28g7JeQ7IScIO2ZleyepeydhCDsnITtlbQg7KSA67mE65CcIOu5iCDsnbjthLDtjpjsnbTsiqRcbmV4cG9ydCBpbnRlcmZhY2UgRGF0YWJhc2VGb3JlaWduS2V5cyB7fVxuZXhwb3J0IHR5cGUgTWFueVRvTWFueUJhc2VTY2hlbWE8XG4gIEZyb21JZEtleSBleHRlbmRzIHN0cmluZyxcbiAgVG9JZEtleSBleHRlbmRzIHN0cmluZyxcbiAgRnJvbVBrVHlwZSA9IG51bWJlcixcbiAgVG9Qa1R5cGUgPSBudW1iZXIsXG4+ID0ge1xuICBpZDogbnVtYmVyO1xufSAmIHtcbiAgW0sgaW4gYCR7RnJvbUlkS2V5fV9pZGBdOiBGcm9tUGtUeXBlO1xufSAmIHtcbiAgW0sgaW4gYCR7VG9JZEtleX1faWRgXTogVG9Qa1R5cGU7XG59O1xuXG4vLyDqsJ3ssrQsIO2VqOyImCwg67mE64+Z6riwIO2VqOyImOulvCDrqqjrkZAg7Y+s6rSE7ZWY64qUIO2DgOyehVxuZXhwb3J0IHR5cGUgRXhlY3V0YWJsZTxUPiA9IFQgfCBQcm9taXNlPFQ+IHwgKCgpID0+IFQpIHwgKCgpID0+IFByb21pc2U8VD4pO1xuXG5leHBvcnQgdHlwZSBTb25hbXVGYXN0aWZ5Q29uZmlnID0ge1xuICBjb250ZXh0UHJvdmlkZXI6IChcbiAgICBkZWZhdWx0Q29udGV4dDogUGljazxcbiAgICAgIENvbnRleHQsXG4gICAgICBcInJlcXVlc3RcIiB8IFwicmVwbHlcIiB8IFwiaGVhZGVyc1wiIHwgXCJjcmVhdGVTU0VcIiB8IFwibmFpdGVTdG9yZVwiIHwgXCJsb2NhbGVcIiB8IFwidXNlclwiIHwgXCJzZXNzaW9uXCJcbiAgICA+LFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIHJlcGx5OiBGYXN0aWZ5UmVwbHksXG4gICkgPT4gQ29udGV4dCB8IFByb21pc2U8Q29udGV4dD47XG4gIGd1YXJkSGFuZGxlcjogKFxuICAgIGd1YXJkOiBHdWFyZEtleSxcbiAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICBhcGk6IHtcbiAgICAgIHR5cGVQYXJhbWV0ZXJzOiBBcGlQYXJhbVR5cGUuVHlwZVBhcmFtW107XG4gICAgICBwYXJhbWV0ZXJzOiBBcGlQYXJhbVtdO1xuICAgICAgcmV0dXJuVHlwZTogQXBpUGFyYW1UeXBlO1xuICAgICAgbW9kZWxOYW1lOiBzdHJpbmc7XG4gICAgICBtZXRob2ROYW1lOiBzdHJpbmc7XG4gICAgICBwYXRoOiBzdHJpbmc7XG4gICAgICBvcHRpb25zOiBBcGlEZWNvcmF0b3JPcHRpb25zO1xuICAgIH0sXG4gICkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIOyghOyXrSBDYWNoZS1Db250cm9sIO2VuOuTpOufrOyeheuLiOuLpC5cbiAgICog7JqU7LKtIO2DgOyehShhcGksIGFzc2V0cywgc3NyLCBjc3Ip7JeQIOuUsOudvCBDYWNoZS1Db250cm9sIOyEpOygleydhCDrsJjtmZjtlanri4jri6QuXG4gICAqIHVuZGVmaW5lZOulvCDrsJjtmZjtlZjrqbQg7YOA7J6F67OEIOq4sOuzuOqwkuydtCDsoIHsmqnrkKnri4jri6QuXG4gICAqL1xuICBjYWNoZUNvbnRyb2xIYW5kbGVyPzogQ2FjaGVDb250cm9sSGFuZGxlcjtcbn07XG4iXSwibmFtZXMiOlsieiIsInpBcnJheWFibGUiLCJzaGFwZSIsInVuaW9uIiwiYXJyYXkiLCJnZXREZXNjcmlwdGlvbiIsIml0ZW0iLCJjb25lIiwibm90ZSIsImRlc2MiLCJab2RTdHJpbmdGb3JtYXQiLCJlbnVtIiwiU29uYW11RmlsZVNjaGVtYSIsIm9iamVjdCIsIm5hbWUiLCJzdHJpbmciLCJ1cmwiLCJtaW1lX3R5cGUiLCJzaXplIiwibnVtYmVyIiwiZGVzY3JpYmUiLCJTb25hbXVGaWxlQXJyYXlTY2hlbWEiLCJCVUlMVF9JTl9UWVBFX0lEUyIsIktub3duT3BjbGFzc1ZhbHVlcyIsIm5vcm1hbGl6ZVN1YnNldEZpZWxkIiwiZiIsImZpZWxkIiwiaXNJbnRlcm5hbFN1YnNldEZpZWxkIiwiaW50ZXJuYWwiLCJpc1N1YnNldERlZldpdGhDb25lIiwiZGVmIiwiQXJyYXkiLCJpc0FycmF5IiwiaXNFbnVtRGVmV2l0aENvbmUiLCJ1bmRlZmluZWQiLCJPYmplY3QiLCJrZXlzIiwibGVuZ3RoIiwiZ2V0U3Vic2V0RmllbGRzIiwiZmllbGRzIiwiZ2V0RW51bURlZlZhbHVlcyIsInZhbHVlcyIsImlzSW50ZWdlclNpbmdsZVByb3AiLCJwIiwidHlwZSIsImlzSW50ZWdlckFycmF5UHJvcCIsImlzSW50ZWdlclByb3AiLCJpc0JpZ0ludGVnZXJTaW5nbGVQcm9wIiwiaXNCaWdJbnRlZ2VyQXJyYXlQcm9wIiwiaXNCaWdJbnRlZ2VyUHJvcCIsImlzU3RyaW5nU2luZ2xlUHJvcCIsImlzU3RyaW5nQXJyYXlQcm9wIiwiaXNTdHJpbmdQcm9wIiwiaXNFbnVtU2luZ2xlUHJvcCIsImlzRW51bUFycmF5UHJvcCIsImlzRW51bVByb3AiLCJpc051bWJlclNpbmdsZVByb3AiLCJpc051bWJlckFycmF5UHJvcCIsImlzTnVtYmVyUHJvcCIsImlzTnVtZXJpY1NpbmdsZVByb3AiLCJpc051bWVyaWNBcnJheVByb3AiLCJpc051bWVyaWNQcm9wIiwiaXNCb29sZWFuU2luZ2xlUHJvcCIsImlzQm9vbGVhbkFycmF5UHJvcCIsImlzQm9vbGVhblByb3AiLCJpc0RhdGVTaW5nbGVQcm9wIiwiaXNEYXRlQXJyYXlQcm9wIiwiaXNEYXRlUHJvcCIsImlzVXVpZFNpbmdsZVByb3AiLCJpc1V1aWRBcnJheVByb3AiLCJpc1V1aWRQcm9wIiwiaXNKc29uUHJvcCIsImlzU2VhcmNoVGV4dFByb3AiLCJpc1ZpcnR1YWxQcm9wIiwiaXNWaXJ0dWFsQ29kZVByb3AiLCJ2aXJ0dWFsVHlwZSIsImlzVmlydHVhbFF1ZXJ5UHJvcCIsImlzVmVjdG9yU2luZ2xlUHJvcCIsImlzVmVjdG9yQXJyYXlQcm9wIiwiaXNWZWN0b3JQcm9wIiwiaXNUc1ZlY3RvclByb3AiLCJpc1JlbGF0aW9uUHJvcCIsImlzT25lVG9PbmVSZWxhdGlvblByb3AiLCJyZWxhdGlvblR5cGUiLCJpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCIsImlzSGFzTWFueVJlbGF0aW9uUHJvcCIsImlzTWFueVRvTWFueVJlbGF0aW9uUHJvcCIsImlzQ3VzdG9tSm9pbkNsYXVzZSIsImN1c3RvbSIsIlNvbmFtdVF1ZXJ5TW9kZSIsIlNvbmFtdVNlbWFudGljUGFyYW1zIiwic2VtYW50aWNRdWVyeSIsImVtYmVkZGluZyIsIm1pbiIsIm1heCIsInRocmVzaG9sZCIsIm9wdGlvbmFsIiwibWV0aG9kIiwiaXNLbmV4RXJyb3IiLCJlIiwiY29kZSIsInNxbE1lc3NhZ2UiLCJzcWxTdGF0ZSIsIkFwaVBhcmFtVHlwZSIsImlzT2JqZWN0IiwidiIsInQiLCJpc1VuaW9uIiwiaXNJbnRlcnNlY3Rpb24iLCJpc1N0cmluZ0xpdGVyYWwiLCJpc051bWVyaWNMaXRlcmFsIiwiaXNSZWYiLCJpc0luZGV4ZWRBY2Nlc3MiLCJpc1R1cGxlVHlwZSIsImlzUGljayIsImlkIiwiaXNPbWl0IiwiaXNQYXJ0aWFsIiwiaXNQcm9taXNlIiwiaXNDb250ZXh0IiwiaXNSZWZLbmV4IiwiaXNUeXBlUGFyYW0iLCJSZW5kZXJpbmdOb2RlIiwiYW55IiwiR2VuZXJhdGVkQ29sdW1uU2NoZW1hIiwiZXhwcmVzc2lvbiIsIkZpeHR1cmVDb21wYW5pb25TY2hlbWEiLCJlbnRpdHkiLCJvdmVycmlkZXMiLCJyZWNvcmQiLCJ1bmtub3duIiwiY291bnQiLCJpbnQiLCJwb3NpdGl2ZSIsIkNvbmVTY2hlbWEiLCJ0YWdzIiwiZml4dHVyZUdlbmVyYXRvciIsImZpeHR1cmVEZWZhdWx0IiwiZml4dHVyZVN0cmF0ZWd5IiwibGl0ZXJhbCIsImZpeHR1cmVDb21wYW5pb25zIiwiZml4dHVyZVBhcmVudE92ZXJyaWRlcyIsImRhdGFTb3VyY2UiLCJzdHJhdGVneSIsImNvbmZpZyIsImNhdGNoYWxsIiwiQmFzZVByb3BGaWVsZHMiLCJudWxsYWJsZSIsImJvb2xlYW4iLCJ0b0ZpbHRlciIsImRlZmF1bHQiLCJkYkRlZmF1bHQiLCJnZW5lcmF0ZWQiLCJCYXNlUHJvcEZpZWxkc1dpdGhvdXRBZGRpdGlvbmFsIiwic3RyaWN0IiwiUHJlY2lzaW9uU2NhbGVGaWVsZHMiLCJwcmVjaXNpb24iLCJzY2FsZSIsIlN0cmluZ1Byb3BTY2hlbWEiLCJ6b2RGb3JtYXQiLCJTdHJpbmdBcnJheVByb3BTY2hlbWEiLCJFbnVtUHJvcFNjaGVtYSIsIkVudW1BcnJheVByb3BTY2hlbWEiLCJOdW1iZXJQcm9wU2NoZW1hIiwibnVtYmVyVHlwZSIsIk51bWJlckFycmF5UHJvcFNjaGVtYSIsIkRhdGVQcm9wU2NoZW1hIiwiRGF0ZUFycmF5UHJvcFNjaGVtYSIsIk51bWVyaWNQcm9wU2NoZW1hIiwiTnVtZXJpY0FycmF5UHJvcFNjaGVtYSIsIkpzb25Qcm9wU2NoZW1hIiwiU2VhcmNoVGV4dFNvdXJjZUNvbHVtblNjaGVtYSIsImNhc2VJbnNlbnNpdGl2ZSIsIlNlYXJjaFRleHRQcm9wU2NoZW1hIiwic291cmNlQ29sdW1ucyIsIlZpcnR1YWxQcm9wU2NoZW1hIiwiVmVjdG9yUHJvcFNjaGVtYSIsImRpbWVuc2lvbnMiLCJWZWN0b3JBcnJheVByb3BTY2hlbWEiLCJCYXNlUmVsYXRpb25GaWVsZHMiLCJ3aXRoIiwiUmVsYXRpb25PblNjaGVtYSIsIkJlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcFNjaGVtYSIsImN1c3RvbUpvaW5DbGF1c2UiLCJ1c2VDb25zdHJhaW50Iiwib25VcGRhdGUiLCJvbkRlbGV0ZSIsIkhhc01hbnlSZWxhdGlvblByb3BTY2hlbWEiLCJqb2luQ29sdW1uIiwiZnJvbUNvbHVtbiIsIk1hbnlUb01hbnlSZWxhdGlvblByb3BTY2hlbWEiLCJqb2luVGFibGUiLCJPbmVUb09uZVJlbGF0aW9uUHJvcFNjaGVtYSIsImhhc0pvaW5Db2x1bW4iLCJSZWxhdGlvblR5cGVzIiwiUmVsYXRpb25Qcm9wU2NoZW1hIiwiZGlzY3JpbWluYXRlZFVuaW9uIiwiZXJyb3IiLCJpc3MiLCJtYXAiLCJqb2luIiwiaW5wdXQiLCJOb3JtYWxQcm9wVHlwZXMiLCJWaXJ0dWFsR2VuZXJhdGVkRGlzYWxsb3dlZFR5cGVzIiwiTm9ybWFsUHJvcFNjaGVtYSIsInN1cGVyUmVmaW5lIiwiZGF0YSIsImN0eCIsImFkZElzc3VlIiwibWVzc2FnZSIsInBhdGgiLCJpbmNsdWRlcyIsImZhdGFsIiwiQWxsUHJvcFR5cGVzIiwiRW50aXR5UHJvcFNjaGVtYSIsIkVudGl0eUluZGV4Q29sdW1uU2NoZW1hIiwibnVsbHNGaXJzdCIsInNvcnRPcmRlciIsInZlY3Rvck9wcyIsIm9wY2xhc3MiLCJFbnRpdHlJbmRleFNjaGVtYSIsImNvbHVtbnMiLCJ1c2luZyIsIm51bGxzTm90RGlzdGluY3QiLCJtIiwiZWZDb25zdHJ1Y3Rpb24iLCJsaXN0cyIsIlN1YnNldERlZlNjaGVtYSIsIkVudW1EZWZTY2hlbWEiLCJ1bndyYXBTZWFyY2hUZXh0SnNvblNvdXJjZVR5cGUiLCJ6b2RUeXBlIiwiY3VycmVudCIsIlpvZE9wdGlvbmFsIiwiWm9kTnVsbGFibGUiLCJ1bndyYXAiLCJpc1NlYXJjaFRleHRKc29uU291cmNlWm9kVHlwZSIsImJhc2VUeXBlIiwiWm9kQXJyYXkiLCJlbGVtZW50VHlwZSIsImVsZW1lbnQiLCJab2RTdHJpbmciLCJ2YWxpZGF0ZVNlYXJjaFRleHRTb3VyY2VzIiwicHJvcHMiLCJwcm9wc1BhdGgiLCJwcm9wc0J5TmFtZSIsIk1hcCIsInByb3AiLCJmb3JFYWNoIiwicHJvcEluZGV4Iiwic291cmNlIiwic291cmNlSW5kZXgiLCJzb3VyY2VQcm9wIiwiZ2V0Iiwic291cmNlUGF0aCIsIkVudGl0eUpzb25CYXNlU2NoZW1hIiwidGl0bGUiLCJ0YWJsZSIsInBhcmVudElkIiwiaW5kZXhlcyIsInN1YnNldHMiLCJlbnVtcyIsIkVudGl0eUpzb25TY2hlbWEiLCJUZW1wbGF0ZUVudGl0eVNjaGVtYSIsIm9taXQiLCJleHRlbmQiLCJlbnRpdHlJZCIsInBhcnRpYWwiLCJUZW1wbGF0ZU9wdGlvbnMiLCJpbml0X3R5cGVzIiwiZ2VuZXJhdGVkX3NzbyIsImdlbmVyYXRlZF9odHRwIiwibW9kZWwiLCJkZWZhdWx0U2VhcmNoRmllbGQiLCJkZWZhdWx0T3JkZXJCeSIsIm1vZGVsX3Rlc3QiLCJicmlkZ2UiLCJzZXJ2aWNlcyIsInZpZXdfbGlzdCIsImV4dHJhIiwidmlld19saXN0X2NvbHVtbnMiLCJsYWJlbCIsInRjIiwiY29sdW1uSW1wb3J0cyIsInZpZXdfc2VhcmNoX2lucHV0Iiwidmlld19mb3JtIiwidmlld19pZF9hbGxfc2VsZWN0Iiwidmlld19lbnVtc19idXR0b25zZXQiLCJlbnVtSWQiLCJxdWVyaWVzIiwiZW50cnlfc2VydmVyIiwic2QiLCJ0YXJnZXQiLCJUZW1wbGF0ZUtleSIsIkdlbmVyYXRlT3B0aW9ucyIsIm92ZXJ3cml0ZSIsIlBhdGhBbmRDb2RlIl0sIm1hcHBpbmdzIjoiQUFDQSxTQUFTQSxDQUFDLFFBQVEsTUFBTTtBQUt4Qjs7QUFFQSxHQUNBLE9BQU8sU0FBU0MsV0FBbUNDLEtBQVE7SUFDekQsT0FBT0YsRUFBRUcsS0FBSyxDQUFDO1FBQUNEO1FBQU9BLE1BQU1FLEtBQUs7S0FBRztBQUN2QztBQXlFQTs7OztDQUlDLEdBQ0QsT0FBTyxTQUFTQyxlQUFlQyxJQUFvQztJQUNqRSxPQUFPQSxLQUFLQyxJQUFJLEVBQUVDLFFBQVFGLEtBQUtHLElBQUk7QUFDckM7QUFjQTs7OztDQUlDLEdBQ0QsT0FBTyxNQUFNQyxrQkFBa0JWLEVBQUVXLElBQUksQ0FBQztJQUNwQyxRQUFRO0lBQ1I7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQSxrQkFBa0I7SUFDbEI7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBLFNBQVM7SUFDVDtJQUNBO0lBQ0E7SUFDQTtDQUNELEVBQUU7QUF3TEgsT0FBTyxNQUFNQyxtQkFBbUJaLEVBQzdCYSxNQUFNLENBQUM7SUFDTkMsTUFBTWQsRUFBRWUsTUFBTTtJQUNkQyxLQUFLaEIsRUFBRWUsTUFBTTtJQUNiRSxXQUFXakIsRUFBRWUsTUFBTTtJQUNuQkcsTUFBTWxCLEVBQUVtQixNQUFNO0FBQ2hCLEdBQ0NDLFFBQVEsQ0FBQyxjQUFjO0FBRTFCLE9BQU8sTUFBTUMsd0JBQXdCckIsRUFBRUksS0FBSyxDQUFDUSxrQkFBa0JRLFFBQVEsQ0FBQyxnQkFBZ0I7QUFFeEY7OztDQUdDLEdBQ0QsT0FBTyxNQUFNRSxvQkFBb0I7SUFBQztJQUFjO0NBQWUsQ0FBVTtBQTRCekUsT0FBTyxNQUFNQyxxQkFBcUI7SUFDaEM7SUFDQTtJQUNB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
|
|
799
|
+
//#endregion
|
|
800
|
+
init_types();
|
|
801
|
+
export { ApiParamType, BUILT_IN_TYPE_IDS, EntityJsonSchema, GenerateOptions, KnownOpclassValues, NormalPropSchema, PathAndCode, RelationPropSchema, RenderingNode, SonamuFileArraySchema, SonamuFileSchema, SonamuQueryMode, SonamuSemanticParams, TemplateKey, TemplateOptions, ZodStringFormat, getDescription, getEnumDefValues, getSubsetFields, init_types, isBelongsToOneRelationProp, isBigIntegerArrayProp, isBigIntegerProp, isBigIntegerSingleProp, isBooleanArrayProp, isBooleanProp, isBooleanSingleProp, isCustomJoinClause, isDateArrayProp, isDateProp, isDateSingleProp, isEnumArrayProp, isEnumDefWithCone, isEnumProp, isEnumSingleProp, isHasManyRelationProp, isIntegerArrayProp, isIntegerProp, isIntegerSingleProp, isInternalSubsetField, isJsonProp, isKnexError, isManyToManyRelationProp, isNumberArrayProp, isNumberProp, isNumberSingleProp, isNumericArrayProp, isNumericProp, isNumericSingleProp, isOneToOneRelationProp, isRelationProp, isSearchTextJsonSourceZodType, isSearchTextProp, isStringArrayProp, isStringProp, isStringSingleProp, isSubsetDefWithCone, isTsVectorProp, isUuidArrayProp, isUuidProp, isUuidSingleProp, isVectorArrayProp, isVectorProp, isVectorSingleProp, isVirtualCodeProp, isVirtualProp, isVirtualQueryProp, normalizeSubsetField, zArrayable };
|
|
802
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJuYW1lcyI6WyJ6Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R5cGVzL3R5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgRmFzdGlmeVJlcGx5LCB0eXBlIEZhc3RpZnlSZXF1ZXN0IH0gZnJvbSBcImZhc3RpZnlcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7IHR5cGUgQXBpRGVjb3JhdG9yT3B0aW9ucywgdHlwZSBDb250ZXh0IH0gZnJvbSBcIi4uL2FwaVwiO1xuaW1wb3J0IHsgdHlwZSBDYWNoZUNvbnRyb2xIYW5kbGVyIH0gZnJvbSBcIi4uL2NhY2hlLWNvbnRyb2wvdHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgR3VhcmRLZXkgfSBmcm9tIFwiLi8uLi9hcGkvZGVjb3JhdG9yc1wiO1xuXG4vKlxuICBVdGlsaXR5IFR5cGVzXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIHpBcnJheWFibGU8VCBleHRlbmRzIHouWm9kVHlwZUFueT4oc2hhcGU6IFQpOiB6LlpvZFVuaW9uPFtULCB6LlpvZEFycmF5PFQ+XT4ge1xuICByZXR1cm4gei51bmlvbihbc2hhcGUsIHNoYXBlLmFycmF5KCldKTtcbn1cbi8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55IC0tIGFueSBpcyB1c2VkIHRvIG1ha2UgdGhlIHR5cGUgZGlzdHJpYnV0aXZlXG5leHBvcnQgdHlwZSBEaXN0cmlidXRpdmVPbWl0PFQsIEsgZXh0ZW5kcyBrZXlvZiBhbnk+ID0gVCBleHRlbmRzIGFueSA/IE9taXQ8VCwgSz4gOiBuZXZlcjtcblxuLypcbiAgTW9kZWwtRGVmaW5pdGlvblxuKi9cblxuLyoqXG4gKiDrtoDrqqggRW50aXR5IGZpeHR1cmUg7IOd7ISxIOyLnCDtlajqu5gg7IOd7ISx7ZWgIGNvbXBhbmlvbiBFbnRpdHkg7ISk7KCVXG4gKlxuICog7JiIOiBVc2VyIGZpeHR1cmUg7IOd7ISxIOyLnCBjcmVkZW50aWFscyBBY2NvdW5066W8IO2VqOq7mCDsg53shLFcbiAqL1xuZXhwb3J0IHR5cGUgRml4dHVyZUNvbXBhbmlvbiA9IHtcbiAgLyoqIO2VqOq7mCDsg53shLHtlaAgRW50aXR5IOydtOumhCAqL1xuICBlbnRpdHk6IHN0cmluZztcblxuICAvKipcbiAgICog6rOg7KCVIOyYpOuyhOudvOydtOuTnCDqsJIuXG4gICAqIFwie3tmaWVsZE5hbWV9fVwiIO2YleyLneycvOuhnCDrtoDrqqggZml4dHVyZeydmCDtlYTrk5wg6rCS7J2EIOywuOyhsO2VoCDsiJgg7J6I64ukLlxuICAgKiDsmIg6IHsgXCJhY2NvdW50X2lkXCI6IFwie3tlbWFpbH19XCIgfSDihpIg67aA66qoIFVzZXLsnZggZW1haWwg6rCSIOyCrOyaqVxuICAgKi9cbiAgb3ZlcnJpZGVzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgLyoqXG4gICAqIOu2gOuqqCAx6rCc64u5IOyDneyEse2VoCBjb21wYW5pb24g6rCc7IiYLiDquLDrs7jqsJIgMS5cbiAgICog7JiIOiBjb3VudDogMiDihpIgVXNlciAx6rCc64u5IGNvbXBhbmlvbiAy6rCcIOyDneyEsVxuICAgKi9cbiAgY291bnQ/OiBudW1iZXI7XG59O1xuXG4vKipcbiAqIGNvbmU6IOuylOyaqSDrqZTtg4DrjbDsnbTthLAg7Iuc7Iqk7YWcXG4gKlxuICogRW50aXR5LCBQcm9wLCBFbnVtLCBTdWJzZXTsl5AgXCLshpTrsKnsmrjsnYQg64uo64ukXCLripQg6rCc64WQ7Jy866GcIOu2meydtOuKlCDri6jsnbwg7ISc7IigIOuplO2DgOuNsOydtO2EsOyeheuLiOuLpC5cbiAqIG5vdGUg7ZWY64KY66GcIOu5hOymiOuLiOyKpCDsnZjrr7jsmYAgZml4dHVyZSDsg53shLEg7Z6M7Yq466W8IO2VqOq7mCDquLDsiKDtlanri4jri6QuXG4gKi9cbmV4cG9ydCB0eXBlIENvbmUgPSB7XG4gIG5vdGU/OiBzdHJpbmc7IC8vIOydtCDrjIDsg4HsnbQg66y07JeH7J247KeAIOyEpOuqhSAo67mE7KaI64uI7IqkIOydmOuvuCArIGZpeHR1cmUg7Z6M7Yq4IO2Gte2VqSlcbiAgdGFncz86IHN0cmluZ1tdOyAvLyDrtoTrpZgv6rKA7IOJ7JqpIO2DnOq3uFxuXG4gIC8vIEZpeHR1cmUg7IOd7ISxIOq0gOugqFxuICBmaXh0dXJlR2VuZXJhdG9yPzogc3RyaW5nOyAvLyBGYWtlci5qcyDsvZTrk5wg65iQ64qUIOy7pOyKpO2FgCDtlajsiJhcbiAgZml4dHVyZURlZmF1bHQ/OiB1bmtub3duOyAvLyDquLDrs7jqsJJcbiAgZml4dHVyZVN0cmF0ZWd5PzogXCJzZXF1ZW5jZVwiOyAvLyBzdHJpbmcg7YOA7J6F7J207KeA66eMIERCIHNlcXVlbmNl66GcIOq0gOumrOuQmOuKlCBQSyAoYmV0dGVyLWF1dGgg65OxKVxuICBmaXh0dXJlQ29tcGFuaW9ucz86IEZpeHR1cmVDb21wYW5pb25bXTsgLy8g67aA66qoIGZpeHR1cmUg7IOd7ISxIOyLnCDtlajqu5gg7IOd7ISx7ZWgIGNvbXBhbmlvbiBFbnRpdHkg66qp66GdXG4gIGZpeHR1cmVQYXJlbnRPdmVycmlkZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjsgLy8gcGFyZW50SWQg7JeU7Yuw7Yuw7J2YIOu2gOuqqCDsg53shLEg7IucIOyCrOyaqe2VoCBvdmVycmlkZSDqsJIgKOyYiDogeyBhY2hpZXZlbWVudF90eXBlOiBcIlBBUEVSXCIgfSlcblxuICAvLyDssLjsobAg642w7J207YSwIOq0gOugqFxuICBkYXRhU291cmNlPzoge1xuICAgIHN0cmF0ZWd5OiBcInNhbXBsZVwiIHwgXCJpZHNcIiB8IFwicXVlcnlcIiB8IFwiZmlsZVwiIHwgXCJyZWNlbnRcIiB8IFwicmFuZG9tXCI7XG4gICAgY29uZmlnPzogdW5rbm93bjsgLy8g7KCE656167OEIOyEpOyglVxuICB9O1xuXG4gIC8vIO2ZleyepeyEsVxuICBba2V5OiBzdHJpbmddOiB1bmtub3duOyAvLyDsgqzsmqnsnpAg7KCV7J2YIOuplO2DgOuNsOydtO2EsFxufTtcblxuZXhwb3J0IHR5cGUgR2VuZXJhdGVkQ29sdW1uVHlwZSA9IFwiU1RPUkVEXCIgfCBcIlZJUlRVQUxcIjtcbmV4cG9ydCB0eXBlIEdlbmVyYXRlZENvbHVtbiA9IHtcbiAgdHlwZTogR2VuZXJhdGVkQ29sdW1uVHlwZTtcbiAgZXhwcmVzc2lvbjogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIENvbW1vblByb3AgPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgbnVsbGFibGU/OiBib29sZWFuO1xuICB0b0ZpbHRlcj86IHRydWU7XG4gIGRlc2M/OiBzdHJpbmc7XG4gIGRiRGVmYXVsdD86IHN0cmluZztcbiAgZ2VuZXJhdGVkPzogR2VuZXJhdGVkQ29sdW1uO1xuICBjb25lPzogQ29uZTsgLy8gY29uZSDrqZTtg4DrjbDsnbTthLBcbn07XG5cbi8qKlxuICogcHJvcOydmCDshKTrqoXsnYQg67CY7ZmY7ZWp64uI64ukLlxuICpcbiAqIGNvbmUubm90ZeqwgCDsnojsnLzrqbQg7Jqw7ISgIOyCrOyaqe2VmOqzoCwg7JeG7Jy866m0IHByb3AuZGVzY+ulvCDsgqzsmqntlanri4jri6QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZXNjcmlwdGlvbihpdGVtOiB7IGRlc2M/OiBzdHJpbmc7IGNvbmU/OiBDb25lIH0pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gaXRlbS5jb25lPy5ub3RlIHx8IGl0ZW0uZGVzYztcbn1cbmV4cG9ydCB0eXBlIEludGVnZXJQcm9wID0gQ29tbW9uUHJvcCAmIHtcbiAgdHlwZTogXCJpbnRlZ2VyXCI7XG59OyAvLyBQRzogaW50ZWdlciAvIFRTOiBudW1iZXIgLyBKU09OOiBudW1iZXJcbmV4cG9ydCB0eXBlIEludGVnZXJBcnJheVByb3AgPSBDb21tb25Qcm9wICYge1xuICB0eXBlOiBcImludGVnZXJbXVwiO1xufTsgLy8gUEc6IGludGVnZXJbXSAvIFRTOiBudW1iZXJbXSAvIEpTT046IG51bWJlcltdXG5leHBvcnQgdHlwZSBCaWdJbnRlZ2VyUHJvcCA9IENvbW1vblByb3AgJiB7XG4gIHR5cGU6IFwiYmlnSW50ZWdlclwiO1xufTsgLy8gUEc6IGJpZ2ludCAvIFRTOiBiaWdpbnQgLyBKU09OOiBiaWdpbnRcbmV4cG9ydCB0eXBlIEJpZ0ludGVnZXJBcnJheVByb3AgPSBDb21tb25Qcm9wICYge1xuICB0eXBlOiBcImJpZ0ludGVnZXJbXVwiO1xufTsgLy8gUEc6IGJpZ2ludFtdIC8gVFM6IGJpZ2ludFtdIC8gSlNPTjogYmlnaW50W11cblxuLyoqXG4gKiBab2QgNCBTdHJpbmcgRm9ybWF0IO2DgOyehVxuICogZW50aXR5Lmpzb27sl5DshJwgc3RyaW5nIO2DgOyeheydmCBwcm9w7JeQIHpvZEZvcm1hdCDsmLXshZjsnYQg7KeA7KCV7ZWY7JesXG4gKiBCYXNlU2NoZW1hIOyDneyEsSDsi5wgWm9k7J2YIHN0cmluZyBmb3JtYXQgdmFsaWRhdGlvbuydhCDsoIHsmqntlanri4jri6QuXG4gKi9cbmV4cG9ydCBjb25zdCBab2RTdHJpbmdGb3JtYXQgPSB6LmVudW0oW1xuICAvLyDquLDrs7gg7Y+s66e3XG4gIFwiZW1haWxcIixcbiAgXCJ1dWlkXCIsXG4gIFwidXJsXCIsXG4gIFwiaHR0cFVybFwiLFxuICBcImhvc3RuYW1lXCIsXG4gIFwiZW1vamlcIixcbiAgXCJiYXNlNjRcIixcbiAgXCJiYXNlNjR1cmxcIixcbiAgXCJoZXhcIixcbiAgXCJqd3RcIixcbiAgXCJuYW5vaWRcIixcbiAgXCJjdWlkXCIsXG4gIFwiY3VpZDJcIixcbiAgXCJ1bGlkXCIsXG4gIFwiaXB2NFwiLFxuICBcImlwdjZcIixcbiAgXCJtYWNcIixcbiAgXCJjaWRydjRcIixcbiAgXCJjaWRydjZcIixcbiAgLy8gaGFzaCDtj6zrp7cgKOyVjOqzoOumrOymmOuzhClcbiAgXCJoYXNoTWQ1XCIsXG4gIFwiaGFzaFNoYTFcIixcbiAgXCJoYXNoU2hhMjU2XCIsXG4gIFwiaGFzaFNoYTM4NFwiLFxuICBcImhhc2hTaGE1MTJcIixcbiAgLy8gSVNPIO2PrOunt1xuICBcImlzb0RhdGVcIixcbiAgXCJpc29UaW1lXCIsXG4gIFwiaXNvRGF0ZXRpbWVcIixcbiAgXCJpc29EdXJhdGlvblwiLFxuXSk7XG5leHBvcnQgdHlwZSBab2RTdHJpbmdGb3JtYXQgPSB6LmluZmVyPHR5cGVvZiBab2RTdHJpbmdGb3JtYXQ+O1xuXG5leHBvcnQgdHlwZSBTdHJpbmdQcm9wID0gQ29tbW9uUHJvcCAmIHtcbiAgdHlwZTogXCJzdHJpbmdcIjtcbiAgbGVuZ3RoPzogbnVtYmVyOyAvLyBQRzogdmFyY2hhcihuKSwgdGV4dCAvIFRTOiBzdHJpbmcgLyBKU09OOiBzdHJpbmdcbiAgem9kRm9ybWF0PzogWm9kU3RyaW5nRm9ybWF0O1xufTsgLy8gUEc6IHRleHQgLyBUUzogc3RyaW5nIC8gSlNPTjogc3RyaW5nXG5leHBvcnQgdHlwZSBTdHJpbmdBcnJheVByb3AgPSBDb21tb25Qcm9wICYge1xuICB0eXBlOiBcInN0cmluZ1tdXCI7XG4gIGxlbmd0aD86IG51bWJlcjsgLy8gUEc6IHZhcmNoYXIobilbXSwgdGV4dFtdIC8gVFM6IHN0cmluZ1tdIC8gSlNPTjogc3RyaW5nW11cbiAgem9kRm9ybWF0PzogWm9kU3RyaW5nRm9ybWF0O1xufTsgLy8gUEc6IHZhcmNoYXIobilbXSwgdGV4dFtdIC8gVFM6IHN0cmluZ1tdIC8gSlNPTjogc3RyaW5nW11cbmV4cG9ydCB0eXBlIEVudW1Qcm9wID0gQ29tbW9uUHJvcCAmIHtcbiAgdHlwZTogXCJlbnVtXCI7XG4gIGlkOiBzdHJpbmc7XG4gIGxlbmd0aD86IG51bWJlcjtcbn07IC8vIFBHOiB0ZXh0IC8gVFM6IHN0cmluZyAvIEpTT046IHN0cmluZ1xuZXhwb3J0IHR5cGUgRW51bUFycmF5UHJvcCA9IENvbW1vblByb3AgJiB7XG4gIHR5cGU6IFwiZW51bVtdXCI7XG4gIGlkOiBzdHJpbmc7XG59OyAvLyBQRzogdGV4dFtdIC8gVFM6IHN0cmluZ1tdIC8gSlNPTjogc3RyaW5nW11cbmV4cG9ydCB0eXBlIE51bWJlclByb3AgPSBDb21tb25Qcm9wICYge1xuICB0eXBlOiBcIm51bWJlclwiO1xuICBwcmVjaXNpb24/OiBudW1iZXI7IC8vIFBHOiBudW1lcmljKHAsIHMpIC8gVFM6IG51bWJlciAvIEpTT046IG51bWJlclxuICBzY2FsZT86IG51bWJlcjsgLy8gUEc6IG51bWVyaWMocCwgcykgLyBUUzogbnVtYmVyIC8gSlNPTjogbnVtYmVyXG4gIG51bWJlclR5cGU/OiBcInJlYWxcIiB8IFwiZG91YmxlIHByZWNpc2lvblwiIHwgXCJudW1lcmljXCI7IC8vIOq4sOuzuOqwkjogbnVtZXJpY1xufTsgLy8gUEc6IG51bWVyaWMocCwgcykgLyBUUzogbnVtYmVyIC8gSlNPTjogbnVtYmVyXG5leHBvcnQgdHlwZSBOdW1iZXJBcnJheVByb3AgPSBDb21tb25Qcm9wICYge1xuICB0eXBlOiBcIm51bWJlcltdXCI7XG4gIHByZWNpc2lvbj86IG51bWJlcjtcbiAgc2NhbGU/OiBudW1iZXI7XG4gIG51bWJlclR5cGU/OiBcInJlYWxcIiB8IFwiZG91YmxlIHByZWNpc2lvblwiIHwgXCJudW1lcmljXCI7IC8vIOq4sOuzuOqwkjogbnVtZXJpY1xufTsgLy8gUEc6IG51bWVyaWMocCwgcylbXSAvIFRTOiBudW1iZXJbXSAvIEpTT046IG51bWJlcltdXG5leHBvcnQgdHlwZSBOdW1lcmljUHJvcCA9IENvbW1vblByb3AgJiB7XG4gIHR5cGU6IFwibnVtZXJpY1wiO1xuICBwcmVjaXNpb24/OiBudW1iZXI7XG4gIHNjYWxlPzogbnVtYmVyO1xufTsgLy8gUEc6IG51bWVyaWMocCwgcykgLyBUUzogc3RyaW5nIC8gSlNPTjogc3RyaW5nXG5leHBvcnQgdHlwZSBOdW1lcmljQXJyYXlQcm9wID0gQ29tbW9uUHJvcCAmIHtcbiAgdHlwZTogXCJudW1lcmljW11cIjtcbiAgcHJlY2lzaW9uPzogbnVtYmVyO1xuICBzY2FsZT86IG51bWJlcjtcbn07IC8vIFBHOiBudW1lcmljKHAsIHMpW10gLyBUUzogc3RyaW5nW10gLyBKU09OOiBzdHJpbmdbXVxuZXhwb3J0IHR5cGUgQm9vbGVhblByb3AgPSBDb21tb25Qcm9wICYge1xuICB0eXBlOiBcImJvb2xlYW5cIjtcbn07IC8vIFBHOiBib29sZWFuIC8gVFM6IGJvb2xlYW4gLyBKU09OOiBib29sZWFuXG5leHBvcnQgdHlwZSBCb29sZWFuQXJyYXlQcm9wID0gQ29tbW9uUHJvcCAmIHtcbiAgdHlwZTogXCJib29sZWFuW11cIjtcbn07IC8vIFBHOiBib29sZWFuW10gLyBUUzogYm9vbGVhbltdIC8gSlNPTjogYm9vbGVhbltdXG5leHBvcnQgdHlwZSBEYXRlUHJvcCA9IENvbW1vblByb3AgJiB7XG4gIHR5cGU6IFwiZGF0ZVwiO1xuICAvLyDquLDrs7jqsJLsnYAgMywgbWljcm9zZWNvbmRz66W8IOyTsOugpOuptCA27J2EIOyNqOyVvO2VqCAoMCB+IDYpXG4gIHByZWNpc2lvbj86IG51bWJlcjtcbn07IC8vIFBHOiB0aW1lc3RhbXB6IC8gVFM6IERhdGUgLyBKU09OOiBzdHJpbmcoSVNPU3RyaW5nKVxuZXhwb3J0IHR5cGUgRGF0ZUFycmF5UHJvcCA9IENvbW1vblByb3AgJiB7XG4gIHR5cGU6IFwiZGF0ZVtdXCI7XG4gIC8vIOq4sOuzuOqwkuydgCAzLCBtaWNyb3NlY29uZHPrpbwg7JOw66Ck66m0IDbsnYQg7I2o7JW87ZWoICgwIH4gNilcbiAgcHJlY2lzaW9uPzogbnVtYmVyO1xufTsgLy8gUEc6IHRpbWVzdGFtcHR6W10gLyBUUzogRGF0ZVtdIC8gSlNPTjogc3RyaW5nW11cbmV4cG9ydCB0eXBlIEpzb25Qcm9wID0gQ29tbW9uUHJvcCAmIHtcbiAgdHlwZTogXCJqc29uXCI7XG4gIGlkOiBzdHJpbmc7XG59OyAvLyBQRzoganNvbiAvIFRTOiBhbnkoaWQpIC8gSlNPTjogYW55XG5leHBvcnQgdHlwZSBTZWFyY2hUZXh0U291cmNlQ29sdW1uID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGNhc2VJbnNlbnNpdGl2ZT86IGJvb2xlYW47XG59O1xuZXhwb3J0IHR5cGUgU2VhcmNoVGV4dFByb3AgPSBDb21tb25Qcm9wICYge1xuICB0eXBlOiBcInNlYXJjaFRleHRcIjtcbiAgc291cmNlQ29sdW1uczogU2VhcmNoVGV4dFNvdXJjZUNvbHVtbltdO1xufTsgLy8gUEc6IHRleHQgKGdlbmVyYXRlZCkgLyBUUzogc3RyaW5nIC8gSlNPTjogc3RyaW5nXG5leHBvcnQgdHlwZSBVdWlkUHJvcCA9IENvbW1vblByb3AgJiB7XG4gIHR5cGU6IFwidXVpZFwiO1xufTsgLy8gUEc6IHV1aWQgLyBUUzogc3RyaW5nIC8gSlNPTjogc3RyaW5nXG5leHBvcnQgdHlwZSBVdWlkQXJyYXlQcm9wID0gQ29tbW9uUHJvcCAmIHtcbiAgdHlwZTogXCJ1dWlkW11cIjtcbn07IC8vIFBHOiB1dWlkW10gLyBUUzogc3RyaW5nW10gLyBKU09OOiBzdHJpbmdbXVxuZXhwb3J0IHR5cGUgVmlydHVhbFByb3AgPSBDb21tb25Qcm9wICYge1xuICB0eXBlOiBcInZpcnR1YWxcIjtcbiAgaWQ6IHN0cmluZztcbiAgdmlydHVhbFR5cGU/OiBcInF1ZXJ5XCIgfCBcImNvZGVcIjsgLy8gZGVmYXVsdDogXCJjb2RlXCJcbn07IC8vIFBHOiBub25lIC8gVFM6IGFueShpZCkgLyBKU09OOiBhbnlcbmV4cG9ydCB0eXBlIFZlY3RvclByb3AgPSBDb21tb25Qcm9wICYge1xuICB0eXBlOiBcInZlY3RvclwiO1xuICBkaW1lbnNpb25zOiBudW1iZXI7XG59O1xuZXhwb3J0IHR5cGUgVmVjdG9yQXJyYXlQcm9wID0gQ29tbW9uUHJvcCAmIHtcbiAgdHlwZTogXCJ2ZWN0b3JbXVwiO1xuICBkaW1lbnNpb25zOiBudW1iZXI7XG59O1xuZXhwb3J0IHR5cGUgVHNWZWN0b3JQcm9wID0gQ29tbW9uUHJvcCAmIHtcbiAgdHlwZTogXCJ0c3ZlY3RvclwiO1xufTtcbmV4cG9ydCB0eXBlIFJlbGF0aW9uVHlwZSA9IFwiSGFzTWFueVwiIHwgXCJCZWxvbmdzVG9PbmVcIiB8IFwiTWFueVRvTWFueVwiIHwgXCJPbmVUb09uZVwiO1xuZXhwb3J0IHR5cGUgUmVsYXRpb25PbiA9IFwiQ0FTQ0FERVwiIHwgXCJTRVQgTlVMTFwiIHwgXCJOTyBBQ1RJT05cIiB8IFwiU0VUIERFRkFVTFRcIiB8IFwiUkVTVFJJQ1RcIjtcbnR5cGUgX1JlbGF0aW9uUHJvcCA9IHtcbiAgdHlwZTogXCJyZWxhdGlvblwiO1xuICBuYW1lOiBzdHJpbmc7XG4gIHdpdGg6IHN0cmluZztcbiAgbnVsbGFibGU/OiBib29sZWFuOyAvLyBERUZBVUxUOiBmYWxzZVxuICB0b0ZpbHRlcj86IHRydWU7IC8vIERFRkFVTFQ6IGZhbHNlXG4gIGRlc2M/OiBzdHJpbmc7XG4gIGNvbmU/OiBDb25lOyAvLyBjb25lIOuplO2DgOuNsOydtO2EsFxufTtcbmV4cG9ydCB0eXBlIE9uZVRvT25lUmVsYXRpb25Qcm9wID0gX1JlbGF0aW9uUHJvcCAmIHtcbiAgcmVsYXRpb25UeXBlOiBcIk9uZVRvT25lXCI7XG4gIGN1c3RvbUpvaW5DbGF1c2U/OiBzdHJpbmc7XG59ICYgKFxuICAgIHwge1xuICAgICAgICBoYXNKb2luQ29sdW1uOiB0cnVlO1xuICAgICAgICB1c2VDb25zdHJhaW50PzogYm9vbGVhbjsgLy8gREVGQVVMVDogdHJ1ZVxuICAgICAgICBvblVwZGF0ZT86IFJlbGF0aW9uT247IC8vIERFRkFVTFQ6IFJFU1RSSUNUXG4gICAgICAgIG9uRGVsZXRlPzogUmVsYXRpb25PbjsgLy8gREVGQVVMVDogUkVTVFJJQ1RcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgaGFzSm9pbkNvbHVtbjogZmFsc2U7XG4gICAgICB9XG4gICk7XG5leHBvcnQgdHlwZSBCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AgPSBfUmVsYXRpb25Qcm9wICYge1xuICByZWxhdGlvblR5cGU6IFwiQmVsb25nc1RvT25lXCI7XG4gIGN1c3RvbUpvaW5DbGF1c2U/OiBzdHJpbmc7XG4gIHVzZUNvbnN0cmFpbnQ/OiBib29sZWFuOyAvLyBERUZBVUxUOiB0cnVlXG4gIG9uVXBkYXRlPzogUmVsYXRpb25PbjsgLy8gREVGQVVMVDogUkVTVFJJQ1RcbiAgb25EZWxldGU/OiBSZWxhdGlvbk9uOyAvLyBERUZBVUxUOiBSRVNUUklDVFxufTtcbmV4cG9ydCB0eXBlIEhhc01hbnlSZWxhdGlvblByb3AgPSBfUmVsYXRpb25Qcm9wICYge1xuICByZWxhdGlvblR5cGU6IFwiSGFzTWFueVwiO1xuICBqb2luQ29sdW1uOiBzdHJpbmc7XG4gIGZyb21Db2x1bW4/OiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgTWFueVRvTWFueVJlbGF0aW9uUHJvcCA9IF9SZWxhdGlvblByb3AgJiB7XG4gIHJlbGF0aW9uVHlwZTogXCJNYW55VG9NYW55XCI7XG4gIGpvaW5UYWJsZTogYCR7c3RyaW5nfV9fJHtzdHJpbmd9YDtcbiAgb25VcGRhdGU6IFJlbGF0aW9uT247XG4gIG9uRGVsZXRlOiBSZWxhdGlvbk9uO1xufTtcbmV4cG9ydCB0eXBlIFJlbGF0aW9uUHJvcCA9XG4gIHwgT25lVG9PbmVSZWxhdGlvblByb3BcbiAgfCBCZWxvbmdzVG9PbmVSZWxhdGlvblByb3BcbiAgfCBIYXNNYW55UmVsYXRpb25Qcm9wXG4gIHwgTWFueVRvTWFueVJlbGF0aW9uUHJvcDtcblxuZXhwb3J0IHR5cGUgRW50aXR5UHJvcCA9XG4gIHwgSW50ZWdlclByb3BcbiAgfCBJbnRlZ2VyQXJyYXlQcm9wXG4gIHwgQmlnSW50ZWdlclByb3BcbiAgfCBCaWdJbnRlZ2VyQXJyYXlQcm9wXG4gIHwgU3RyaW5nUHJvcFxuICB8IFN0cmluZ0FycmF5UHJvcFxuICB8IEVudW1Qcm9wXG4gIHwgRW51bUFycmF5UHJvcFxuICB8IE51bWJlclByb3BcbiAgfCBOdW1iZXJBcnJheVByb3BcbiAgfCBOdW1lcmljUHJvcFxuICB8IE51bWVyaWNBcnJheVByb3BcbiAgfCBCb29sZWFuUHJvcFxuICB8IEJvb2xlYW5BcnJheVByb3BcbiAgfCBEYXRlUHJvcFxuICB8IERhdGVBcnJheVByb3BcbiAgfCBVdWlkUHJvcFxuICB8IFV1aWRBcnJheVByb3BcbiAgfCBKc29uUHJvcFxuICB8IFNlYXJjaFRleHRQcm9wXG4gIHwgVmlydHVhbFByb3BcbiAgfCBWZWN0b3JQcm9wXG4gIHwgVmVjdG9yQXJyYXlQcm9wXG4gIHwgVHNWZWN0b3JQcm9wXG4gIHwgUmVsYXRpb25Qcm9wO1xuXG4vKipcbiAqIFNvbmFtdUZpbGUgVHlwZXNcbiAqXG4gKiDtjIzsnbwg7JeF66Gc65Oc66W8IOychO2VnCBKU09OIO2DgOyeheyeheuLiOuLpC5cbiAqIEVudGl0eeydmCBqc29uIOyGjeyEseyXkOyEnCBpZOuhnCBcIlNvbmFtdUZpbGVcIiDrmJDripQgXCJTb25hbXVGaWxlW11cIuydhCDsp4DsoJXtlZjsl6wg7IKs7Jqp7ZWp64uI64ukLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNvbmFtdUZpbGUge1xuICBuYW1lOiBzdHJpbmc7XG4gIHVybDogc3RyaW5nO1xuICBtaW1lX3R5cGU6IHN0cmluZztcbiAgc2l6ZTogbnVtYmVyO1xufVxuXG5leHBvcnQgY29uc3QgU29uYW11RmlsZVNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgbmFtZTogei5zdHJpbmcoKSxcbiAgICB1cmw6IHouc3RyaW5nKCksXG4gICAgbWltZV90eXBlOiB6LnN0cmluZygpLFxuICAgIHNpemU6IHoubnVtYmVyKCksXG4gIH0pXG4gIC5kZXNjcmliZShcIlNvbmFtdUZpbGVcIik7XG5cbmV4cG9ydCBjb25zdCBTb25hbXVGaWxlQXJyYXlTY2hlbWEgPSB6LmFycmF5KFNvbmFtdUZpbGVTY2hlbWEpLmRlc2NyaWJlKFwiU29uYW11RmlsZVtdXCIpO1xuXG4vKipcbiAqIFNvbmFtdSDsvZTslrTsl5DshJwg7KCc6rO17ZWY64qUIOuCtOyepSBKU09OIO2DgOyehSBJRCDrqqnroZ1cbiAqIOyDiOuhnOyatCDrgrTsnqUg7YOA7J6FIOy2lOqwgCDsi5wg7J20IOuwsOyXtOyXkCDstpTqsIDtlZjrqbQg7J6Q64+Z7Jy866GcIFVJ7JeQIOuFuOy2nOuQqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGNvbnN0IEJVSUxUX0lOX1RZUEVfSURTID0gW1wiU29uYW11RmlsZVwiLCBcIlNvbmFtdUZpbGVbXVwiXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEJ1aWx0SW5UeXBlSWQgPSAodHlwZW9mIEJVSUxUX0lOX1RZUEVfSURTKVtudW1iZXJdO1xuXG4vKipcbiAqIHBndmVjdG9yIOqxsOumrCDsl7DsgrDsnpAg7YG0656Y7IqkXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiAtIGB2ZWN0b3JfY29zaW5lX29wc2A6IOy9lOyCrOyduCDqsbDrpqwgKENvc2luZSBEaXN0YW5jZSkgLSDqtozsnqVcbiAqICAgLSBTUUwg7Jew7IKw7J6QOiBgPD0+YFxuICogICAtIOuyoe2EsOydmCDrsKntlqXrp4wg67mE6rWQICjtgazquLAg66y07IucKSwgMSAtIGNvc2luZV9zaW1pbGFyaXR5XG4gKiAgIC0g7YWN7Iqk7Yq4IOyehOuyoOuUqSwg7Iuc66eo7YuxIOqygOyDieyXkCDqsIDsnqUg7J2867CY7KCB7Jy866GcIOyCrOyaqVxuICogICAtIOyCrOyaqSDsmIg6IE9wZW5BSSwgVm95YWdlIOuTsSDrjIDrtoDrtoTsnZgg7J6E67Kg65SpIOuqqOuNuOyXkCDqtozsnqVcbiAqXG4gKiAtIGB2ZWN0b3JfaXBfb3BzYDog64K07KCBIChJbm5lciBQcm9kdWN0KVxuICogICAtIFNRTCDsl7DsgrDsnpA6IGA8Iz5gXG4gKiAgIC0g65GQIOuyoe2EsOydmCDrgrTsoIHsnYQg6rOE7IKwIChzdW0oYVtpXSAqIGJbaV0pKVxuICogICAtIOygleq3nO2ZlOuQnCDrsqHthLDsl5DshJwg7L2U7IKs7J24IOycoOyCrOuPhOyZgCDrj5nsnbztlZwg6rKw6rO8XG4gKiAgIC0g6rCS7J20IO2BtOyImOuhnSDsnKDsgqwgKOydjOyImCDsl7DsgrDsnpDsnbTrr4DroZwgT1JERVIgQlnsl5DshJwg7KO87J2YKVxuICogICAtIOyCrOyaqSDsmIg6IOydtOuvuCDsoJXqt5ztmZTrkJwg7J6E67Kg65Sp7JeQ7IScIOqwgOyepSDruaDrpbgg7ISx64qlXG4gKlxuICogLSBgdmVjdG9yX2wyX29wc2A6IOycoO2BtOumrOuTnCDqsbDrpqwgKEwyIERpc3RhbmNlKVxuICogICAtIFNRTCDsl7DsgrDsnpA6IGA8LT5gXG4gKiAgIC0g65GQIOuyoe2EsCDqsITsnZgg7KeB7ISgIOqxsOumrOulvCDqs4TsgrAgKHNxcnQoc3VtKChhW2ldIC0gYltpXSleMikpKVxuICogICAtIOuyoe2EsOydmCDtgazquLAobWFnbml0dWRlKeqwgCDspJHsmpTtlaAg65WMIOyCrOyaqVxuICogICAtIOyCrOyaqSDsmIg6IOydtOuvuOyngCDsnKDsgqzrj4QsIOygiOuMgOyggSDqsbDrpqwg7Lih7KCV7J20IO2VhOyalO2VnCDqsr3smrBcbiAqL1xuZXhwb3J0IHR5cGUgVmVjdG9yT3BzID0gXCJ2ZWN0b3JfY29zaW5lX29wc1wiIHwgXCJ2ZWN0b3JfaXBfb3BzXCIgfCBcInZlY3Rvcl9sMl9vcHNcIjtcblxuZXhwb3J0IGNvbnN0IEtub3duT3BjbGFzc1ZhbHVlcyA9IFtcbiAgXCJnaW5fdHJnbV9vcHNcIixcbiAgXCJnaXN0X3RyZ21fb3BzXCIsXG4gIFwiZ2luX2JpZ21fb3BzXCIsXG4gIFwidmVjdG9yX2Nvc2luZV9vcHNcIixcbiAgXCJ2ZWN0b3JfaXBfb3BzXCIsXG4gIFwidmVjdG9yX2wyX29wc1wiLFxuICBcInBncm9vbmdhX3ZhcmNoYXJfZnVsbF90ZXh0X3NlYXJjaF9vcHNfdjJcIixcbiAgXCJwZ3Jvb25nYV9qc29uYl9mdWxsX3RleHRfc2VhcmNoX29wc192MlwiLFxuXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEtub3duT3BjbGFzcyA9ICh0eXBlb2YgS25vd25PcGNsYXNzVmFsdWVzKVtudW1iZXJdO1xuXG50eXBlIEVudGl0eUluZGV4Q29sdW1uID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIG51bGxzRmlyc3Q/OiBib29sZWFuO1xuICBzb3J0T3JkZXI/OiBcIkFTQ1wiIHwgXCJERVNDXCI7XG4gIC8qKiBwZ3ZlY3RvciDsnbjrjbHsiqTsl5DshJwg7IKs7Jqp7ZWgIOqxsOumrCDsl7DsgrDsnpAgKHZlY3RvciDsu6zrn7zsl5Drp4wg7KCB7JqpKSAqL1xuICB2ZWN0b3JPcHM/OiBWZWN0b3JPcHM7XG4gIC8qKiBnZW5lcmljIOyduOuNseyKpCBvcGNsYXNzICh2ZWN0b3JPcHPripQg7ZWY7JyE7Zi47ZmYIOuqqeyggeycvOuhnCDsnKDsp4ApICovXG4gIG9wY2xhc3M/OiBLbm93bk9wY2xhc3MgfCBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgRW50aXR5SW5kZXggPSB7XG4gIHR5cGU6IFwiaW5kZXhcIiB8IFwidW5pcXVlXCIgfCBcImhuc3dcIiB8IFwiaXZmZmxhdFwiO1xuICBjb2x1bW5zOiBFbnRpdHlJbmRleENvbHVtbltdO1xuICBuYW1lOiBzdHJpbmc7XG4gIHVzaW5nPzogXCJidHJlZVwiIHwgXCJoYXNoXCIgfCBcImdpblwiIHwgXCJnaXN0XCIgfCBcInBncm9vbmdhXCI7XG4gIG51bGxzTm90RGlzdGluY3Q/OiBib29sZWFuOyAvLyB1bmlxdWUgaW5kZXggb25seVxuICAvKipcbiAgICogSE5TVyAoSGllcmFyY2hpY2FsIE5hdmlnYWJsZSBTbWFsbCBXb3JsZCkg7J24642x7IqkOiDqsIEg64W465Oc7J2YIOy1nOuMgCDsl7DqsrAg7IiYXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiDqt7jrnpjtlITsl5DshJwg6rCBIOuFuOuTnOqwgCDqsIDsp4gg7IiYIOyeiOuKlCDstZzrjIAg7Jew6rKwIOyImOyeheuLiOuLpC5cbiAgICogSE5TV+uKlCDruaDrpbgg6rKA7IOJIOyGjeuPhOyZgCDrhpLsnYAg7KCV7ZmV64+E66W8IOygnOqzte2VmOuvgOuhnCDqtozsnqXrkKnri4jri6QuXG4gICAqIC0g6riw67O46rCSOiAxNlxuICAgKiAtIOuylOychDogMiB+IDEwMFxuICAgKiAtIOuGkuydhOyImOuhnTog7KCV7ZmV64+E4oaRLCDruYzrk5wg7Iuc6rCE4oaRLCDrqZTrqqjrpqzihpFcbiAgICogLSDqtozsnqU6IOu5oOuluCDruYzrk5woOCksIOq3oO2YlSgxNiksIOuGkuydgCDsoJXtmZXrj4QoMzIpLCDstZzqs6Ag7KCV7ZmV64+EKDY0KVxuICAgKi9cbiAgbT86IG51bWJlcjtcbiAgLyoqXG4gICAqIEhOU1cgKEhpZXJhcmNoaWNhbCBOYXZpZ2FibGUgU21hbGwgV29ybGQpIOyduOuNseyKpDog6rWs7ISxIOyLnCDtg5Dsg4kg67KU7JyEXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiDsnbjrjbHsiqQg6rWs7ISxIOyLnCDqsIEg64W465Oc7JeQ7IScIO2DkOyDie2VoCDrspTsnITsnoXri4jri6QuXG4gICAqIC0g6riw67O46rCSOiA2NFxuICAgKiAtIOuylOychDogNCB+IDEwMDBcbiAgICogLSDrhpLsnYTsiJjroZ06IOygle2ZleuPhOKGkSwg67mM65OcIOyLnOqwhOKGkVxuICAgKiAtIOq2jOyepTog67mg66W4IOu5jOuTnCgzMiksIOq3oO2YlSg2NCksIOuGkuydgCDsoJXtmZXrj4QoMTI4KSwg7LWc6rOgIOygle2ZleuPhCgyNTYpXG4gICAqL1xuICBlZkNvbnN0cnVjdGlvbj86IG51bWJlcjtcbiAgLyoqXG4gICAqIElWRkZsYXQgKEludmVydGVkIEZpbGUgd2l0aCBGbGF0IENvbXByZXNzaW9uKSDsnbjrjbHsiqQ6IO2BtOufrOyKpO2EsOungSDrpqzsiqTtirgg7IiYXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiDrsqHthLDrpbwg7YG065+s7Iqk7YSw66eB7ZWgIOuyhO2CtyDsiJjrpbwg7KeA7KCV7ZWp64uI64ukLlxuICAgKiBJVkZGbGF07J2AIOu5oOuluCDruYzrk5zsmYAg64Ku7J2AIOuplOuqqOumrCDsgqzsmqnsnbQg7ZWE7JqU7ZWgIOuVjCDsgqzsmqntlanri4jri6QuXG4gICAqIC0g6raM7J6l6rCSOiBzcXJ0KHJvd19jb3VudCkgfiByb3dfY291bnQgLyAxMDAwXG4gICAqIC0g7JiI7IucOiAxMCwwMDDtlokg4oaSIDEwMCwgMTAwLDAwMO2WiSDihpIgMzAwLCAxLDAwMCwwMDDtlokg4oaSIDEwMDBcbiAgICogLSDrp47snYTsiJjroZ0g7KCV7ZmV64+E4oaRLCDqsoDsg4kg7IaN64+E4oaTXG4gICAqL1xuICBsaXN0cz86IG51bWJlcjtcbn07XG5cbi8vIFN1YnNldEZpZWxkIO2DgOyehTogc3RyaW5nIOuYkOuKlCBpbnRlcm5hbCDsmLXshZjsnbQg7J6I64qUIOqwneyytFxuZXhwb3J0IHR5cGUgU3Vic2V0RmllbGQgPSBzdHJpbmcgfCB7IGZpZWxkOiBzdHJpbmc7IGludGVybmFsPzogYm9vbGVhbiB9O1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplU3Vic2V0RmllbGQoZjogU3Vic2V0RmllbGQpOiBzdHJpbmcge1xuICByZXR1cm4gdHlwZW9mIGYgPT09IFwic3RyaW5nXCIgPyBmIDogZi5maWVsZDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0ludGVybmFsU3Vic2V0RmllbGQoZjogU3Vic2V0RmllbGQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBmICE9PSBcInN0cmluZ1wiICYmIGYuaW50ZXJuYWwgPT09IHRydWU7XG59XG5cbi8qKlxuICogU3Vic2V0RGVmOiBTdWJzZXQg7KCV7J2YXG4gKlxuICog7ZWY7JyEIO2YuO2ZmOyEseydhCDsnITtlbQgU3Vic2V0RmllbGRbXSDrsLDsl7Qg7ZiV7YOc64+EIOyngOybkO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IHR5cGUgU3Vic2V0RGVmID1cbiAgfCBTdWJzZXRGaWVsZFtdIC8vIOq4sOyhtCDrsLDsl7Qg7ZiV7YOcXG4gIHwge1xuICAgICAgLy8g7IOI66Gc7Jq0IOqwneyytCDtmJXtg5xcbiAgICAgIGZpZWxkczogU3Vic2V0RmllbGRbXTtcbiAgICAgIGNvbmU/OiBDb25lO1xuICAgIH07XG5cbi8qKlxuICogRW51bURlZjogRW51bSDsoJXsnZhcbiAqXG4gKiDtlZjsnIQg7Zi47ZmY7ISx7J2EIOychO2VtCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IO2Yle2DnOuPhCDsp4Dsm5Dtlanri4jri6QuXG4gKi9cbmV4cG9ydCB0eXBlIEVudW1EZWYgPVxuICB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gLy8g6riw7KG0IFJlY29yZCDtmJXtg5xcbiAgfCB7XG4gICAgICAvLyDsg4jroZzsmrQg6rCd7LK0IO2Yle2DnFxuICAgICAgdmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgY29uZT86IENvbmU7XG4gICAgfTtcblxuLyoqXG4gKiBTdWJzZXREZWbqsIAg7IOI66Gc7Jq0IOqwneyytCDtmJXtg5zsnbjsp4Ag7ZmV7J24XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N1YnNldERlZldpdGhDb25lKGRlZjogU3Vic2V0RGVmKTogZGVmIGlzIHsgZmllbGRzOiBTdWJzZXRGaWVsZFtdOyBjb25lPzogQ29uZSB9IHtcbiAgcmV0dXJuICFBcnJheS5pc0FycmF5KGRlZikgJiYgXCJmaWVsZHNcIiBpbiBkZWY7XG59XG5cbi8qKlxuICogRW51bURlZuqwgCDsg4jroZzsmrQg6rCd7LK0IO2Yle2DnOyduOyngCDtmZXsnbhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRW51bURlZldpdGhDb25lKFxuICBkZWY6IEVudW1EZWYsXG4pOiBkZWYgaXMgeyB2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47IGNvbmU/OiBDb25lIH0ge1xuICByZXR1cm4gKFxuICAgIFwidmFsdWVzXCIgaW4gZGVmICYmICEoXCJjb25lXCIgaW4gZGVmICYmIGRlZi5jb25lID09PSB1bmRlZmluZWQgJiYgT2JqZWN0LmtleXMoZGVmKS5sZW5ndGggPiAxKVxuICApO1xufVxuXG4vKipcbiAqIFN1YnNldERlZuyXkOyEnCBmaWVsZHMg7LaU7LacXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdWJzZXRGaWVsZHMoZGVmOiBTdWJzZXREZWYpOiBTdWJzZXRGaWVsZFtdIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZGVmKSA/IGRlZiA6IGRlZi5maWVsZHM7XG59XG5cbi8qKlxuICogRW51bURlZuyXkOyEnCB2YWx1ZXMg7LaU7LacXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbnVtRGVmVmFsdWVzKGRlZjogRW51bURlZik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICByZXR1cm4gaXNFbnVtRGVmV2l0aENvbmUoZGVmKSA/IGRlZi52YWx1ZXMgOiBkZWY7XG59XG5cbmV4cG9ydCB0eXBlIEVudGl0eUpzb24gPSB7XG4gIGlkOiBzdHJpbmc7XG4gIHBhcmVudElkPzogc3RyaW5nO1xuICB0YWJsZTogc3RyaW5nO1xuICB0aXRsZT86IHN0cmluZztcbiAgY29uZT86IENvbmU7IC8vIGNvbmUg66mU7YOA642w7J207YSwXG4gIHByb3BzOiBFbnRpdHlQcm9wW107XG4gIGluZGV4ZXM6IEVudGl0eUluZGV4W107XG4gIHN1YnNldHM6IHtcbiAgICBbc3Vic2V0OiBzdHJpbmddOiBTdWJzZXREZWY7XG4gIH07XG4gIGVudW1zOiB7XG4gICAgW2VudW1JZDogc3RyaW5nXTogRW51bURlZjtcbiAgfTtcbn07XG5leHBvcnQgdHlwZSBFbnRpdHlTdWJzZXRSb3cgPSB7XG4gIGZpZWxkOiBzdHJpbmc7XG4gIGhhczoge1xuICAgIFtrZXk6IHN0cmluZ106IGJvb2xlYW47XG4gIH07XG4gIGlzSW50ZXJuYWw6IHtcbiAgICBba2V5OiBzdHJpbmddOiBib29sZWFuO1xuICB9O1xuICBjaGlsZHJlbjogRW50aXR5U3Vic2V0Um93W107XG4gIHByZWZpeGVzOiBzdHJpbmdbXTtcbiAgcmVsYXRpb25FbnRpdHk/OiBzdHJpbmc7XG4gIGlzT3Blbj86IGJvb2xlYW47XG59O1xuZXhwb3J0IHR5cGUgRmxhdHRlblN1YnNldFJvdyA9IE9taXQ8RW50aXR5U3Vic2V0Um93LCBcImNoaWxkcmVuXCI+O1xuXG4vKlxuICBQcm9wTm9kZVxuKi9cblxuLyoqXG4gKiDsl5Tti7Dti7DsnZgg7ZWE65OcIOq1rOyhsOulvCDtirjrpqwg7ZiV7YOc66GcIO2RnO2YhO2VmOuKlCDspJHqsIQg64W465Oc7J6F64uI64ukLlxuICpcbiAqICoq66qp7KCBKio6IEVudGl0eeydmCBzdWJzZXQg7ZWE65OcIO2RnO2YhOyLnSjsmIg6IFwiaWRcIiwgXCJ1c2VyLm5hbWVcIiwgXCJ0YWdzW11cIinsnYRcbiAqIOyerOq3gOyggeyduCDtirjrpqwg6rWs7KGw66GcIO2MjOyLse2VmOyXrCBab2Qg7Iqk7YKk66eIIOyDneyEseydmCDspJHqsIQg64uo6rOE66GcIOyCrOyaqe2VqeuLiOuLpC5cbiAqXG4gKiAqKuuzgO2ZmCDtnZDrpoQqKjpcbiAqIEVudGl0eSBzdWJzZXQg4oaSIEVudGl0eVByb3BOb2RlICjtirjrpqwg6rWs7KGwKSDihpIgWm9kIOyKpO2CpOuniCDihpIgUmVuZGVyaW5nTm9kZSAoVUnsmqkpXG4gKlxuICogKipub2RlVHlwZSoqOlxuICogLSBcInBsYWluXCI6IOuLqOydvCDtlYTrk5wgKOyYiDogXCJpZFwiLCBcIm5hbWVcIilcbiAqIC0gXCJvYmplY3RcIjog7KSR7LKpIOqwneyytCAo7JiIOiBcInVzZXIubmFtZVwiIOKGkiB1c2VyIOqwneyytClcbiAqIC0gXCJhcnJheVwiOiDrsLDsl7QgKOyYiDogXCJ0YWdzW11cIiDihpIgdGFncyDrsLDsl7QpXG4gKlxuICogKirsgqzsmqkg7JyE7LmYKio6IGVudGl0eS1jb252ZXJ0ZXIudHPsnZggcHJvcE5vZGVUb1pvZFR5cGUoKVxuICovXG5leHBvcnQgdHlwZSBFbnRpdHlQcm9wTm9kZSA9XG4gIHwge1xuICAgICAgbm9kZVR5cGU6IFwicGxhaW5cIjtcbiAgICAgIHByb3A6IEVudGl0eVByb3A7XG4gICAgfVxuICB8IHtcbiAgICAgIG5vZGVUeXBlOiBcIm9iamVjdFwiIHwgXCJhcnJheVwiO1xuICAgICAgcHJvcD86IEVudGl0eVByb3A7XG4gICAgICBjaGlsZHJlbjogRW50aXR5UHJvcE5vZGVbXTtcbiAgICB9O1xuXG4vKlxuICBQcm9wIFR5cGUgR3VhcmRzXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSW50ZWdlclNpbmdsZVByb3AocDogdW5rbm93bik6IHAgaXMgSW50ZWdlclByb3Age1xuICByZXR1cm4gKHAgYXMgSW50ZWdlclByb3ApPy50eXBlID09PSBcImludGVnZXJcIjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0ludGVnZXJBcnJheVByb3AocDogdW5rbm93bik6IHAgaXMgSW50ZWdlckFycmF5UHJvcCB7XG4gIHJldHVybiAocCBhcyBJbnRlZ2VyQXJyYXlQcm9wKT8udHlwZSA9PT0gXCJpbnRlZ2VyW11cIjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0ludGVnZXJQcm9wKHA6IHVua25vd24pOiBwIGlzIEludGVnZXJQcm9wIHwgSW50ZWdlckFycmF5UHJvcCB7XG4gIHJldHVybiBpc0ludGVnZXJTaW5nbGVQcm9wKHApIHx8IGlzSW50ZWdlckFycmF5UHJvcChwKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0JpZ0ludGVnZXJTaW5nbGVQcm9wKHA6IHVua25vd24pOiBwIGlzIEJpZ0ludGVnZXJQcm9wIHtcbiAgcmV0dXJuIChwIGFzIEJpZ0ludGVnZXJQcm9wKT8udHlwZSA9PT0gXCJiaWdJbnRlZ2VyXCI7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNCaWdJbnRlZ2VyQXJyYXlQcm9wKHA6IHVua25vd24pOiBwIGlzIEJpZ0ludGVnZXJBcnJheVByb3Age1xuICByZXR1cm4gKHAgYXMgQmlnSW50ZWdlckFycmF5UHJvcCk/LnR5cGUgPT09IFwiYmlnSW50ZWdlcltdXCI7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNCaWdJbnRlZ2VyUHJvcChwOiB1bmtub3duKTogcCBpcyBCaWdJbnRlZ2VyUHJvcCB8IEJpZ0ludGVnZXJBcnJheVByb3Age1xuICByZXR1cm4gaXNCaWdJbnRlZ2VyU2luZ2xlUHJvcChwKSB8fCBpc0JpZ0ludGVnZXJBcnJheVByb3AocCk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmdTaW5nbGVQcm9wKHA6IHVua25vd24pOiBwIGlzIFN0cmluZ1Byb3Age1xuICByZXR1cm4gKHAgYXMgU3RyaW5nUHJvcCk/LnR5cGUgPT09IFwic3RyaW5nXCI7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmdBcnJheVByb3AocDogdW5rbm93bik6IHAgaXMgU3RyaW5nQXJyYXlQcm9wIHtcbiAgcmV0dXJuIChwIGFzIFN0cmluZ0FycmF5UHJvcCk/LnR5cGUgPT09IFwic3RyaW5nW11cIjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1N0cmluZ1Byb3AocDogdW5rbm93bik6IHAgaXMgU3RyaW5nUHJvcCB8IFN0cmluZ0FycmF5UHJvcCB7XG4gIHJldHVybiBpc1N0cmluZ1NpbmdsZVByb3AocCkgfHwgaXNTdHJpbmdBcnJheVByb3AocCk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNFbnVtU2luZ2xlUHJvcChwOiB1bmtub3duKTogcCBpcyBFbnVtUHJvcCB7XG4gIHJldHVybiAocCBhcyBFbnVtUHJvcCk/LnR5cGUgPT09IFwiZW51bVwiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRW51bUFycmF5UHJvcChwOiB1bmtub3duKTogcCBpcyBFbnVtQXJyYXlQcm9wIHtcbiAgcmV0dXJuIChwIGFzIEVudW1BcnJheVByb3ApPy50eXBlID09PSBcImVudW1bXVwiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRW51bVByb3AocDogdW5rbm93bik6IHAgaXMgRW51bVByb3AgfCBFbnVtQXJyYXlQcm9wIHtcbiAgcmV0dXJuIGlzRW51bVNpbmdsZVByb3AocCkgfHwgaXNFbnVtQXJyYXlQcm9wKHApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTnVtYmVyU2luZ2xlUHJvcChwOiB1bmtub3duKTogcCBpcyBOdW1iZXJQcm9wIHtcbiAgcmV0dXJuIChwIGFzIE51bWJlclByb3ApPy50eXBlID09PSBcIm51bWJlclwiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTnVtYmVyQXJyYXlQcm9wKHA6IHVua25vd24pOiBwIGlzIE51bWJlckFycmF5UHJvcCB7XG4gIHJldHVybiAocCBhcyBOdW1iZXJBcnJheVByb3ApPy50eXBlID09PSBcIm51bWJlcltdXCI7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXJQcm9wKHA6IHVua25vd24pOiBwIGlzIE51bWJlclByb3AgfCBOdW1iZXJBcnJheVByb3Age1xuICByZXR1cm4gaXNOdW1iZXJTaW5nbGVQcm9wKHApIHx8IGlzTnVtYmVyQXJyYXlQcm9wKHApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTnVtZXJpY1NpbmdsZVByb3AocDogdW5rbm93bik6IHAgaXMgTnVtZXJpY1Byb3Age1xuICByZXR1cm4gKHAgYXMgTnVtZXJpY1Byb3ApPy50eXBlID09PSBcIm51bWVyaWNcIjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc051bWVyaWNBcnJheVByb3AocDogdW5rbm93bik6IHAgaXMgTnVtZXJpY0FycmF5UHJvcCB7XG4gIHJldHVybiAocCBhcyBOdW1lcmljQXJyYXlQcm9wKT8udHlwZSA9PT0gXCJudW1lcmljW11cIjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc051bWVyaWNQcm9wKHA6IHVua25vd24pOiBwIGlzIE51bWVyaWNQcm9wIHwgTnVtZXJpY0FycmF5UHJvcCB7XG4gIHJldHVybiBpc051bWVyaWNTaW5nbGVQcm9wKHApIHx8IGlzTnVtZXJpY0FycmF5UHJvcChwKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0Jvb2xlYW5TaW5nbGVQcm9wKHA6IHVua25vd24pOiBwIGlzIEJvb2xlYW5Qcm9wIHtcbiAgcmV0dXJuIChwIGFzIEJvb2xlYW5Qcm9wKT8udHlwZSA9PT0gXCJib29sZWFuXCI7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNCb29sZWFuQXJyYXlQcm9wKHA6IHVua25vd24pOiBwIGlzIEJvb2xlYW5BcnJheVByb3Age1xuICByZXR1cm4gKHAgYXMgQm9vbGVhbkFycmF5UHJvcCk/LnR5cGUgPT09IFwiYm9vbGVhbltdXCI7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNCb29sZWFuUHJvcChwOiB1bmtub3duKTogcCBpcyBCb29sZWFuUHJvcCB8IEJvb2xlYW5BcnJheVByb3Age1xuICByZXR1cm4gaXNCb29sZWFuU2luZ2xlUHJvcChwKSB8fCBpc0Jvb2xlYW5BcnJheVByb3AocCk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNEYXRlU2luZ2xlUHJvcChwOiB1bmtub3duKTogcCBpcyBEYXRlUHJvcCB7XG4gIHJldHVybiAocCBhcyBEYXRlUHJvcCk/LnR5cGUgPT09IFwiZGF0ZVwiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0ZUFycmF5UHJvcChwOiB1bmtub3duKTogcCBpcyBEYXRlQXJyYXlQcm9wIHtcbiAgcmV0dXJuIChwIGFzIERhdGVBcnJheVByb3ApPy50eXBlID09PSBcImRhdGVbXVwiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0ZVByb3AocDogdW5rbm93bik6IHAgaXMgRGF0ZVByb3AgfCBEYXRlQXJyYXlQcm9wIHtcbiAgcmV0dXJuIGlzRGF0ZVNpbmdsZVByb3AocCkgfHwgaXNEYXRlQXJyYXlQcm9wKHApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVXVpZFNpbmdsZVByb3AocDogdW5rbm93bik6IHAgaXMgVXVpZFByb3Age1xuICByZXR1cm4gKHAgYXMgVXVpZFByb3ApPy50eXBlID09PSBcInV1aWRcIjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1V1aWRBcnJheVByb3AocDogdW5rbm93bik6IHAgaXMgVXVpZEFycmF5UHJvcCB7XG4gIHJldHVybiAocCBhcyBVdWlkQXJyYXlQcm9wKT8udHlwZSA9PT0gXCJ1dWlkW11cIjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1V1aWRQcm9wKHA6IHVua25vd24pOiBwIGlzIFV1aWRQcm9wIHwgVXVpZEFycmF5UHJvcCB7XG4gIHJldHVybiBpc1V1aWRTaW5nbGVQcm9wKHApIHx8IGlzVXVpZEFycmF5UHJvcChwKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0pzb25Qcm9wKHA6IHVua25vd24pOiBwIGlzIEpzb25Qcm9wIHtcbiAgcmV0dXJuIChwIGFzIEpzb25Qcm9wKT8udHlwZSA9PT0gXCJqc29uXCI7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTZWFyY2hUZXh0UHJvcChwOiB1bmtub3duKTogcCBpcyBTZWFyY2hUZXh0UHJvcCB7XG4gIHJldHVybiAocCBhcyBTZWFyY2hUZXh0UHJvcCk/LnR5cGUgPT09IFwic2VhcmNoVGV4dFwiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVmlydHVhbFByb3AocDogdW5rbm93bik6IHAgaXMgVmlydHVhbFByb3Age1xuICByZXR1cm4gKHAgYXMgVmlydHVhbFByb3ApPy50eXBlID09PSBcInZpcnR1YWxcIjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1ZpcnR1YWxDb2RlUHJvcChwOiB1bmtub3duKTogcCBpcyBWaXJ0dWFsUHJvcCB7XG4gIGlmICghaXNWaXJ0dWFsUHJvcChwKSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gcC52aXJ0dWFsVHlwZSAhPT0gXCJxdWVyeVwiOyAvLyB1bmRlZmluZWTrj4QgXCJjb2RlXCLroZwg7Leo6riJXG59XG5leHBvcnQgZnVuY3Rpb24gaXNWaXJ0dWFsUXVlcnlQcm9wKHA6IHVua25vd24pOiBwIGlzIFZpcnR1YWxQcm9wIHtcbiAgaWYgKCFpc1ZpcnR1YWxQcm9wKHApKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBwLnZpcnR1YWxUeXBlID09PSBcInF1ZXJ5XCI7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNWZWN0b3JTaW5nbGVQcm9wKHA6IHVua25vd24pOiBwIGlzIFZlY3RvclByb3Age1xuICByZXR1cm4gKHAgYXMgVmVjdG9yUHJvcCk/LnR5cGUgPT09IFwidmVjdG9yXCI7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNWZWN0b3JBcnJheVByb3AocDogdW5rbm93bik6IHAgaXMgVmVjdG9yQXJyYXlQcm9wIHtcbiAgcmV0dXJuIChwIGFzIFZlY3RvckFycmF5UHJvcCk/LnR5cGUgPT09IFwidmVjdG9yW11cIjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1ZlY3RvclByb3AocDogdW5rbm93bik6IHAgaXMgVmVjdG9yUHJvcCB8IFZlY3RvckFycmF5UHJvcCB7XG4gIHJldHVybiBpc1ZlY3RvclNpbmdsZVByb3AocCkgfHwgaXNWZWN0b3JBcnJheVByb3AocCk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUc1ZlY3RvclByb3AocDogdW5rbm93bik6IHAgaXMgVHNWZWN0b3JQcm9wIHtcbiAgcmV0dXJuIChwIGFzIFRzVmVjdG9yUHJvcCk/LnR5cGUgPT09IFwidHN2ZWN0b3JcIjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1JlbGF0aW9uUHJvcChwOiB1bmtub3duKTogcCBpcyBSZWxhdGlvblByb3Age1xuICByZXR1cm4gKHAgYXMgUmVsYXRpb25Qcm9wKT8udHlwZSA9PT0gXCJyZWxhdGlvblwiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzT25lVG9PbmVSZWxhdGlvblByb3AocDogdW5rbm93bik6IHAgaXMgT25lVG9PbmVSZWxhdGlvblByb3Age1xuICByZXR1cm4gKHAgYXMgT25lVG9PbmVSZWxhdGlvblByb3ApPy5yZWxhdGlvblR5cGUgPT09IFwiT25lVG9PbmVcIjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwOiB1bmtub3duKTogcCBpcyBCZWxvbmdzVG9PbmVSZWxhdGlvblByb3Age1xuICByZXR1cm4gKHAgYXMgQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKT8ucmVsYXRpb25UeXBlID09PSBcIkJlbG9uZ3NUb09uZVwiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzSGFzTWFueVJlbGF0aW9uUHJvcChwOiB1bmtub3duKTogcCBpcyBIYXNNYW55UmVsYXRpb25Qcm9wIHtcbiAgcmV0dXJuIChwIGFzIEhhc01hbnlSZWxhdGlvblByb3ApPy5yZWxhdGlvblR5cGUgPT09IFwiSGFzTWFueVwiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcChwOiB1bmtub3duKTogcCBpcyBNYW55VG9NYW55UmVsYXRpb25Qcm9wIHtcbiAgcmV0dXJuIChwIGFzIE1hbnlUb01hbnlSZWxhdGlvblByb3ApPy5yZWxhdGlvblR5cGUgPT09IFwiTWFueVRvTWFueVwiO1xufVxuXG50eXBlIEpvaW5DbGF1c2UgPVxuICB8IHtcbiAgICAgIGZyb206IHN0cmluZztcbiAgICAgIHRvOiBzdHJpbmc7XG4gICAgfVxuICB8IHtcbiAgICAgIGN1c3RvbTogc3RyaW5nO1xuICAgIH07XG5leHBvcnQgZnVuY3Rpb24gaXNDdXN0b21Kb2luQ2xhdXNlKHA6IHVua25vd24pOiBwIGlzIHsgY3VzdG9tOiBzdHJpbmcgfSB7XG4gIHJldHVybiAhIShwIGFzIHsgY3VzdG9tOiBzdHJpbmcgfSk/LmN1c3RvbTtcbn1cblxudHlwZSBTdWJzZXRMb2FkZXIgPSB7XG4gIGFzOiBzdHJpbmc7XG4gIHRhYmxlOiBzdHJpbmc7XG4gIG1hbnlKb2luOiB7XG4gICAgZnJvbVRhYmxlOiBzdHJpbmc7XG4gICAgZnJvbUNvbDogc3RyaW5nO1xuICAgIGlkRmllbGQ6IHN0cmluZztcbiAgICB0b1RhYmxlOiBzdHJpbmc7XG4gICAgdG9Db2w6IHN0cmluZztcbiAgICB0aHJvdWdoPzoge1xuICAgICAgdGFibGU6IHN0cmluZztcbiAgICAgIGZyb21Db2w6IHN0cmluZztcbiAgICAgIHRvQ29sOiBzdHJpbmc7XG4gICAgfTtcbiAgfTtcbiAgb25lSm9pbnM6ICh7XG4gICAgYXM6IHN0cmluZztcbiAgICBqb2luOiBcImlubmVyXCIgfCBcIm91dGVyXCI7XG4gICAgdGFibGU6IHN0cmluZztcbiAgfSAmIEpvaW5DbGF1c2UpW107XG4gIHNlbGVjdDogc3RyaW5nW107XG4gIGxvYWRlcnM/OiBTdWJzZXRMb2FkZXJbXTtcbn07XG5cbmV4cG9ydCB0eXBlIFN1YnNldFF1ZXJ5ID0ge1xuICBzZWxlY3Q6IHN0cmluZ1tdO1xuICB2aXJ0dWFsOiBzdHJpbmdbXTtcbiAgam9pbnM6ICh7XG4gICAgYXM6IHN0cmluZztcbiAgICBqb2luOiBcImlubmVyXCIgfCBcIm91dGVyXCI7XG4gICAgdGFibGU6IHN0cmluZztcbiAgfSAmIEpvaW5DbGF1c2UpW107XG4gIGxvYWRlcnM6IFN1YnNldExvYWRlcltdO1xufTtcblxuLyogQmFzZU1vZGVsICovXG5leHBvcnQgY29uc3QgU29uYW11UXVlcnlNb2RlID0gei5lbnVtKFtcImJvdGhcIiwgXCJsaXN0XCIsIFwiY291bnRcIl0pO1xuZXhwb3J0IHR5cGUgU29uYW11UXVlcnlNb2RlID0gei5pbmZlcjx0eXBlb2YgU29uYW11UXVlcnlNb2RlPjtcblxuLyogU2VtYW50aWMgUXVlcnkgKi9cbmV4cG9ydCBjb25zdCBTb25hbXVTZW1hbnRpY1BhcmFtcyA9IHoub2JqZWN0KHtcbiAgc2VtYW50aWNRdWVyeTogei5vYmplY3Qoe1xuICAgIGVtYmVkZGluZzogei5hcnJheSh6Lm51bWJlcigpKS5taW4oMTAyNCkubWF4KDEwMjQpLFxuICAgIHRocmVzaG9sZDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgIG1ldGhvZDogei5lbnVtKFtcImNvc2luZVwiLCBcImwyXCIsIFwiaW5uZXJfcHJvZHVjdFwiXSkub3B0aW9uYWwoKSxcbiAgfSksXG59KTtcbmV4cG9ydCB0eXBlIFNvbmFtdVNlbWFudGljUGFyYW1zID0gei5pbmZlcjx0eXBlb2YgU29uYW11U2VtYW50aWNQYXJhbXM+O1xuXG4vKiBLbmV4IE1pZ3JhdGlvbiAqL1xuZXhwb3J0IHR5cGUgS25leEVycm9yID0ge1xuICBjb2RlOiBzdHJpbmc7XG4gIGVycm5vOiBudW1iZXI7XG4gIHNxbDogc3RyaW5nO1xuICBzcWxNZXNzYWdlOiBzdHJpbmc7XG4gIHNxbFN0YXRlOiBzdHJpbmc7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIGlzS25leEVycm9yKGU6IHVua25vd24pOiBlIGlzIEtuZXhFcnJvciB7XG4gIHJldHVybiAhIShlIGFzIEtuZXhFcnJvcik/LmNvZGUgJiYgISEoZSBhcyBLbmV4RXJyb3IpPy5zcWxNZXNzYWdlICYmICEhKGUgYXMgS25leEVycm9yKT8uc3FsU3RhdGU7XG59XG5cbmV4cG9ydCB0eXBlIEtuZXhDb2x1bW5UeXBlID1cbiAgfCBcInN0cmluZ1wiXG4gIHwgXCJ0ZXh0XCJcbiAgfCBcInNtYWxsdGV4dFwiXG4gIHwgXCJtZWRpdW10ZXh0XCJcbiAgfCBcImxvbmd0ZXh0XCJcbiAgfCBcImludGVnZXJcIlxuICB8IFwiYmlnSW50ZWdlclwiXG4gIHwgXCJkZWNpbWFsXCJcbiAgfCBcInRpbWVzdGFtcFwiXG4gIHwgXCJib29sZWFuXCJcbiAgfCBcImZvcmVpZ25cIlxuICB8IFwidXVpZFwiXG4gIHwgXCJqc29uXCJcbiAgfCBcImZsb2F0XCJcbiAgfCBcImRhdGVcIlxuICB8IFwidGltZVwiXG4gIHwgXCJkYXRldGltZVwiO1xuZXhwb3J0IHR5cGUgTWlncmF0aW9uQ29sdW1uVHlwZSA9XG4gIHwgXCJzdHJpbmdcIlxuICB8IFwic3RyaW5nW11cIlxuICB8IFwiaW50ZWdlclwiXG4gIHwgXCJpbnRlZ2VyW11cIlxuICB8IFwiYmlnSW50ZWdlclwiXG4gIHwgXCJiaWdJbnRlZ2VyW11cIlxuICB8IFwibnVtYmVyT3JOdW1lcmljXCJcbiAgfCBcIm51bWJlck9yTnVtZXJpY1tdXCJcbiAgfCBcImJvb2xlYW5cIlxuICB8IFwiYm9vbGVhbltdXCJcbiAgfCBcImRhdGVcIlxuICB8IFwiZGF0ZVtdXCJcbiAgfCBcInV1aWRcIlxuICB8IFwidXVpZFtdXCJcbiAgfCBcImpzb25cIlxuICB8IFwidmVjdG9yXCJcbiAgfCBcInZlY3RvcltdXCJcbiAgfCBcInRzdmVjdG9yXCI7XG5leHBvcnQgdHlwZSBNaWdyYXRpb25Db2x1bW4gPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgdHlwZTogTWlncmF0aW9uQ29sdW1uVHlwZTtcbiAgbnVsbGFibGU6IGJvb2xlYW47XG4gIG51bWJlclR5cGU/OiBcInJlYWxcIiB8IFwiZG91YmxlIHByZWNpc2lvblwiIHwgXCJudW1lcmljXCI7XG4gIGxlbmd0aD86IG51bWJlcjtcbiAgZGVmYXVsdFRvPzogc3RyaW5nO1xuICBwcmVjaXNpb24/OiBudW1iZXI7XG4gIHNjYWxlPzogbnVtYmVyO1xuICBkaW1lbnNpb25zPzogbnVtYmVyO1xuICBnZW5lcmF0ZWQ/OiBHZW5lcmF0ZWRDb2x1bW47XG59O1xuZXhwb3J0IHR5cGUgTWlncmF0aW9uSW5kZXggPSB7XG4gIHR5cGU6IFwidW5pcXVlXCIgfCBcImluZGV4XCIgfCBcImhuc3dcIiB8IFwiaXZmZmxhdFwiO1xuICBjb2x1bW5zOiBFbnRpdHlJbmRleENvbHVtbltdO1xuICBuYW1lOiBzdHJpbmc7XG4gIHVzaW5nPzogXCJidHJlZVwiIHwgXCJoYXNoXCIgfCBcImdpblwiIHwgXCJnaXN0XCIgfCBcInBncm9vbmdhXCI7XG4gIG51bGxzTm90RGlzdGluY3Q/OiBib29sZWFuO1xuICAvKiogSE5TVyAoSGllcmFyY2hpY2FsIE5hdmlnYWJsZSBTbWFsbCBXb3JsZCk6IOqwgSDrhbjrk5zsnZgg7LWc64yAIOyXsOqysCDsiJggKi9cbiAgbT86IG51bWJlcjtcbiAgLyoqIEhOU1cgKEhpZXJhcmNoaWNhbCBOYXZpZ2FibGUgU21hbGwgV29ybGQpOiDqtazshLEg7IucIO2DkOyDiSDrspTsnIQgKi9cbiAgZWZDb25zdHJ1Y3Rpb24/OiBudW1iZXI7XG4gIC8qKiBJVkZGbGF0IChJbnZlcnRlZCBGaWxlIHdpdGggRmxhdCBDb21wcmVzc2lvbik6IO2BtOufrOyKpO2EsOungSDrpqzsiqTtirgg7IiYICovXG4gIGxpc3RzPzogbnVtYmVyO1xufTtcbmV4cG9ydCB0eXBlIE1pZ3JhdGlvbkZvcmVpZ24gPSB7XG4gIGNvbHVtbnM6IHN0cmluZ1tdO1xuICB0bzogc3RyaW5nO1xuICBvblVwZGF0ZTogUmVsYXRpb25PbjtcbiAgb25EZWxldGU6IFJlbGF0aW9uT247XG59O1xuZXhwb3J0IHR5cGUgTWlncmF0aW9uSm9pblRhYmxlID0ge1xuICB0YWJsZTogc3RyaW5nO1xuICBpbmRleGVzOiBNaWdyYXRpb25JbmRleFtdO1xuICBjb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXTtcbiAgZm9yZWlnbnM6IE1pZ3JhdGlvbkZvcmVpZ25bXTtcbn07XG5leHBvcnQgdHlwZSBNaWdyYXRpb25TZXQgPSB7XG4gIHRhYmxlOiBzdHJpbmc7XG4gIGNvbHVtbnM6IE1pZ3JhdGlvbkNvbHVtbltdO1xuICBpbmRleGVzOiBNaWdyYXRpb25JbmRleFtdO1xuICBmb3JlaWduczogTWlncmF0aW9uRm9yZWlnbltdO1xufTtcbmV4cG9ydCB0eXBlIE1pZ3JhdGlvblNldEFuZEpvaW5UYWJsZSA9IE1pZ3JhdGlvblNldCAmIHtcbiAgam9pblRhYmxlczogTWlncmF0aW9uSm9pblRhYmxlW107XG59O1xuZXhwb3J0IHR5cGUgR2VuTWlncmF0aW9uQ29kZSA9IHtcbiAgdGl0bGU6IHN0cmluZztcbiAgdGFibGU6IHN0cmluZztcbiAgdHlwZTogXCJub3JtYWxcIiB8IFwiZm9yZWlnblwiO1xuICBmb3JtYXR0ZWQ6IHN0cmluZyB8IG51bGw7XG59O1xuXG4vKiBBcGkgKi9cbmV4cG9ydCB0eXBlIEFwaVBhcmFtID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHR5cGU6IEFwaVBhcmFtVHlwZTtcbiAgb3B0aW9uYWw6IGJvb2xlYW47XG4gIGRlZmF1bHREZWY/OiBzdHJpbmc7XG59O1xuZXhwb3J0IG5hbWVzcGFjZSBBcGlQYXJhbVR5cGUge1xuICBleHBvcnQgdHlwZSBGdW5jdGlvbiA9IHtcbiAgICB0OiBcImZ1bmN0aW9uXCI7XG4gICAgcGFyYW1ldGVyczogQXBpUGFyYW1bXTtcbiAgICByZXR1cm5UeXBlOiBBcGlQYXJhbVR5cGU7XG4gIH07XG4gIGV4cG9ydCB0eXBlIE9iamVjdCA9IHtcbiAgICB0OiBcIm9iamVjdFwiO1xuICAgIHByb3BzOiBBcGlQYXJhbVtdO1xuICB9O1xuICBleHBvcnQgdHlwZSBVbmlvbiA9IHtcbiAgICB0OiBcInVuaW9uXCI7XG4gICAgdHlwZXM6IEFwaVBhcmFtVHlwZVtdO1xuICB9O1xuICBleHBvcnQgdHlwZSBJbnRlcnNlY3Rpb24gPSB7XG4gICAgdDogXCJpbnRlcnNlY3Rpb25cIjtcbiAgICB0eXBlczogQXBpUGFyYW1UeXBlW107XG4gIH07XG4gIGV4cG9ydCB0eXBlIFN0cmluZ0xpdGVyYWwgPSB7XG4gICAgdDogXCJzdHJpbmctbGl0ZXJhbFwiO1xuICAgIHZhbHVlOiBzdHJpbmc7XG4gIH07XG4gIGV4cG9ydCB0eXBlIE51bWVyaWNMaXRlcmFsID0ge1xuICAgIHQ6IFwibnVtZXJpYy1saXRlcmFsXCI7XG4gICAgdmFsdWU6IG51bWJlcjtcbiAgfTtcbiAgZXhwb3J0IHR5cGUgQXJyYXkgPSB7XG4gICAgdDogXCJhcnJheVwiO1xuICAgIGVsZW1lbnRzVHlwZTogQXBpUGFyYW1UeXBlO1xuICB9O1xuICBleHBvcnQgdHlwZSBSZWYgPSB7XG4gICAgdDogXCJyZWZcIjtcbiAgICBpZDogc3RyaW5nO1xuICAgIGFyZ3M/OiBBcGlQYXJhbVR5cGVbXTtcbiAgfTtcbiAgZXhwb3J0IHR5cGUgSW5kZXhlZEFjY2VzcyA9IHtcbiAgICB0OiBcImluZGV4ZWQtYWNjZXNzXCI7XG4gICAgb2JqZWN0OiBBcGlQYXJhbVR5cGU7XG4gICAgaW5kZXg6IEFwaVBhcmFtVHlwZTtcbiAgfTtcbiAgZXhwb3J0IHR5cGUgVHVwbGVUeXBlID0ge1xuICAgIHQ6IFwidHVwbGUtdHlwZVwiO1xuICAgIGVsZW1lbnRzOiBBcGlQYXJhbVR5cGVbXTtcbiAgfTtcbiAgZXhwb3J0IHR5cGUgUGljayA9IFJlZiAmIHtcbiAgICB0OiBcInJlZlwiO1xuICAgIGlkOiBcIlBpY2tcIjtcbiAgfTtcbiAgZXhwb3J0IHR5cGUgT21pdCA9IFJlZiAmIHtcbiAgICB0OiBcInJlZlwiO1xuICAgIGlkOiBcIk9taXRcIjtcbiAgfTtcbiAgZXhwb3J0IHR5cGUgUGFydGlhbCA9IFJlZiAmIHtcbiAgICB0OiBcInJlZlwiO1xuICAgIGlkOiBcIlBhcnRpYWxcIjtcbiAgfTtcbiAgZXhwb3J0IHR5cGUgUHJvbWlzZSA9IFJlZiAmIHtcbiAgICB0OiBcInJlZlwiO1xuICAgIGlkOiBcIlByb21pc2VcIjtcbiAgfTtcbiAgZXhwb3J0IHR5cGUgQ29udGV4dCA9IFJlZiAmIHtcbiAgICB0OiBcInJlZlwiO1xuICAgIGlkOiBcIkNvbnRleHRcIjtcbiAgfTtcbiAgZXhwb3J0IHR5cGUgVHlwZVBhcmFtID0ge1xuICAgIHQ6IFwidHlwZS1wYXJhbVwiO1xuICAgIGlkOiBzdHJpbmc7XG4gICAgY29uc3RyYWludD86IEFwaVBhcmFtVHlwZTtcbiAgfTtcblxuICBleHBvcnQgZnVuY3Rpb24gaXNPYmplY3QodjogdW5rbm93bik6IHYgaXMgQXBpUGFyYW1UeXBlLk9iamVjdCB7XG4gICAgcmV0dXJuICh2IGFzIEFwaVBhcmFtVHlwZS5PYmplY3QpPy50ID09PSBcIm9iamVjdFwiO1xuICB9XG4gIGV4cG9ydCBmdW5jdGlvbiBpc1VuaW9uKHY6IHVua25vd24pOiB2IGlzIEFwaVBhcmFtVHlwZS5VbmlvbiB7XG4gICAgcmV0dXJuICh2IGFzIEFwaVBhcmFtVHlwZS5Vbmlvbik/LnQgPT09IFwidW5pb25cIjtcbiAgfVxuICBleHBvcnQgZnVuY3Rpb24gaXNJbnRlcnNlY3Rpb24odjogdW5rbm93bik6IHYgaXMgQXBpUGFyYW1UeXBlLkludGVyc2VjdGlvbiB7XG4gICAgcmV0dXJuICh2IGFzIEFwaVBhcmFtVHlwZS5JbnRlcnNlY3Rpb24pPy50ID09PSBcImludGVyc2VjdGlvblwiO1xuICB9XG4gIGV4cG9ydCBmdW5jdGlvbiBpc1N0cmluZ0xpdGVyYWwodjogdW5rbm93bik6IHYgaXMgQXBpUGFyYW1UeXBlLlN0cmluZ0xpdGVyYWwge1xuICAgIHJldHVybiAodiBhcyBBcGlQYXJhbVR5cGUuU3RyaW5nTGl0ZXJhbCk/LnQgPT09IFwic3RyaW5nLWxpdGVyYWxcIjtcbiAgfVxuICBleHBvcnQgZnVuY3Rpb24gaXNOdW1lcmljTGl0ZXJhbCh2OiB1bmtub3duKTogdiBpcyBBcGlQYXJhbVR5cGUuTnVtZXJpY0xpdGVyYWwge1xuICAgIHJldHVybiAodiBhcyBBcGlQYXJhbVR5cGUuTnVtZXJpY0xpdGVyYWwpPy50ID09PSBcIm51bWVyaWMtbGl0ZXJhbFwiO1xuICB9XG4gIGV4cG9ydCBmdW5jdGlvbiBpc0FycmF5KHY6IHVua25vd24pOiB2IGlzIEFwaVBhcmFtVHlwZS5BcnJheSB7XG4gICAgcmV0dXJuICh2IGFzIEFwaVBhcmFtVHlwZS5BcnJheSk/LnQgPT09IFwiYXJyYXlcIjtcbiAgfVxuICBleHBvcnQgZnVuY3Rpb24gaXNSZWYodjogdW5rbm93bik6IHYgaXMgQXBpUGFyYW1UeXBlLlJlZiB7XG4gICAgcmV0dXJuIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiICYmIHYgIT09IG51bGwgJiYgKHYgYXMgeyB0PzogdW5rbm93biB9KS50ID09PSBcInJlZlwiO1xuICB9XG4gIGV4cG9ydCBmdW5jdGlvbiBpc0luZGV4ZWRBY2Nlc3ModjogdW5rbm93bik6IHYgaXMgQXBpUGFyYW1UeXBlLkluZGV4ZWRBY2Nlc3Mge1xuICAgIHJldHVybiB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIiAmJiB2ICE9PSBudWxsICYmICh2IGFzIHsgdD86IHVua25vd24gfSkudCA9PT0gXCJpbmRleGVkLWFjY2Vzc1wiO1xuICB9XG4gIGV4cG9ydCBmdW5jdGlvbiBpc1R1cGxlVHlwZSh2OiB1bmtub3duKTogdiBpcyBBcGlQYXJhbVR5cGUuVHVwbGVUeXBlIHtcbiAgICByZXR1cm4gdHlwZW9mIHYgPT09IFwib2JqZWN0XCIgJiYgdiAhPT0gbnVsbCAmJiAodiBhcyB7IHQ/OiB1bmtub3duIH0pLnQgPT09IFwidHVwbGUtdHlwZVwiO1xuICB9XG4gIGV4cG9ydCBmdW5jdGlvbiBpc1BpY2sodjogdW5rbm93bik6IHYgaXMgQXBpUGFyYW1UeXBlLlBpY2sge1xuICAgIHJldHVybiAoXG4gICAgICB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgdiAhPT0gbnVsbCAmJlxuICAgICAgKHYgYXMgeyB0PzogdW5rbm93biB9KS50ID09PSBcInJlZlwiICYmXG4gICAgICAodiBhcyB7IGlkPzogdW5rbm93biB9KS5pZCA9PT0gXCJQaWNrXCJcbiAgICApO1xuICB9XG4gIGV4cG9ydCBmdW5jdGlvbiBpc09taXQodjogdW5rbm93bik6IHYgaXMgQXBpUGFyYW1UeXBlLk9taXQge1xuICAgIHJldHVybiAoXG4gICAgICB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgdiAhPT0gbnVsbCAmJlxuICAgICAgKHYgYXMgeyB0PzogdW5rbm93biB9KS50ID09PSBcInJlZlwiICYmXG4gICAgICAodiBhcyB7IGlkPzogdW5rbm93biB9KS5pZCA9PT0gXCJPbWl0XCJcbiAgICApO1xuICB9XG4gIGV4cG9ydCBmdW5jdGlvbiBpc1BhcnRpYWwodjogdW5rbm93bik6IHYgaXMgQXBpUGFyYW1UeXBlLlBhcnRpYWwge1xuICAgIHJldHVybiAoXG4gICAgICB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgdiAhPT0gbnVsbCAmJlxuICAgICAgKHYgYXMgeyB0PzogdW5rbm93biB9KS50ID09PSBcInJlZlwiICYmXG4gICAgICAodiBhcyB7IGlkPzogdW5rbm93biB9KS5pZCA9PT0gXCJQYXJ0aWFsXCJcbiAgICApO1xuICB9XG4gIGV4cG9ydCBmdW5jdGlvbiBpc1Byb21pc2UodjogdW5rbm93bik6IHYgaXMgQXBpUGFyYW1UeXBlLlByb21pc2Uge1xuICAgIHJldHVybiAoXG4gICAgICB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgdiAhPT0gbnVsbCAmJlxuICAgICAgKHYgYXMgeyB0PzogdW5rbm93biB9KS50ID09PSBcInJlZlwiICYmXG4gICAgICAodiBhcyB7IGlkPzogdW5rbm93biB9KS5pZCA9PT0gXCJQcm9taXNlXCJcbiAgICApO1xuICB9XG4gIGV4cG9ydCBmdW5jdGlvbiBpc0NvbnRleHQodjogdW5rbm93bik6IHYgaXMgQXBpUGFyYW1UeXBlLkNvbnRleHQge1xuICAgIHJldHVybiAoXG4gICAgICB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgdiAhPT0gbnVsbCAmJlxuICAgICAgKHYgYXMgeyB0PzogdW5rbm93biB9KS50ID09PSBcInJlZlwiICYmXG4gICAgICAodiBhcyB7IGlkPzogdW5rbm93biB9KS5pZCA9PT0gXCJDb250ZXh0XCJcbiAgICApO1xuICB9XG4gIGV4cG9ydCBmdW5jdGlvbiBpc1JlZktuZXgodjogdW5rbm93bik6IHYgaXMgQXBpUGFyYW1UeXBlLlJlZiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiICYmXG4gICAgICB2ICE9PSBudWxsICYmXG4gICAgICAodiBhcyB7IHQ/OiB1bmtub3duIH0pLnQgPT09IFwicmVmXCIgJiZcbiAgICAgICh2IGFzIHsgaWQ/OiB1bmtub3duIH0pLmlkID09PSBcIktuZXhcIlxuICAgICk7XG4gIH1cbiAgZXhwb3J0IGZ1bmN0aW9uIGlzVHlwZVBhcmFtKHY6IHVua25vd24pOiB2IGlzIEFwaVBhcmFtVHlwZS5UeXBlUGFyYW0ge1xuICAgIHJldHVybiB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIiAmJiB2ICE9PSBudWxsICYmICh2IGFzIHsgdD86IHVua25vd24gfSkudCA9PT0gXCJ0eXBlLXBhcmFtXCI7XG4gIH1cbn1cbmV4cG9ydCB0eXBlIEFwaVBhcmFtVHlwZSA9XG4gIHwgXCJzdHJpbmdcIlxuICB8IFwibnVtYmVyXCJcbiAgfCBcImJvb2xlYW5cIlxuICB8IFwibnVsbFwiXG4gIHwgXCJ1bmRlZmluZWRcIlxuICB8IFwidm9pZFwiXG4gIHwgXCJhbnlcIlxuICB8IFwidW5rbm93blwiXG4gIHwgXCJ0cnVlXCJcbiAgfCBcImZhbHNlXCJcbiAgfCBBcGlQYXJhbVR5cGUuU3RyaW5nTGl0ZXJhbFxuICB8IEFwaVBhcmFtVHlwZS5OdW1lcmljTGl0ZXJhbFxuICB8IEFwaVBhcmFtVHlwZS5PYmplY3RcbiAgfCBBcGlQYXJhbVR5cGUuVW5pb25cbiAgfCBBcGlQYXJhbVR5cGUuSW50ZXJzZWN0aW9uXG4gIHwgQXBpUGFyYW1UeXBlLkFycmF5XG4gIHwgQXBpUGFyYW1UeXBlLlJlZlxuICB8IEFwaVBhcmFtVHlwZS5JbmRleGVkQWNjZXNzXG4gIHwgQXBpUGFyYW1UeXBlLlR5cGVQYXJhbVxuICB8IEFwaVBhcmFtVHlwZS5UdXBsZVR5cGVcbiAgfCBBcGlQYXJhbVR5cGUuRnVuY3Rpb247XG5cbi8qIFRlbXBsYXRlICovXG4vKipcbiAqIFVJIOy7tO2PrOuEjO2KuCDroIzrjZTrp4HsnYQg7JyE7ZWcIOuplO2DgOuNsOydtO2EsCDrhbjrk5zsnoXri4jri6QuXG4gKlxuICogKirrqqnsoIEqKjogWm9kIOyKpO2CpOuniOuhnOu2gO2EsCDtlITroaDtirjsl5Trk5wgVUkg7Lu07Y+s64SM7Yq466W8IOyekOuPmSDsg53shLHtlZjquLAg7JyE7ZWcXG4gKiDroIzrjZTrp4Eg7KCV67O066W8IOuLtOydgCDtirjrpqwg6rWs7KGw7J6F64uI64ukLiDqsIEg7ZWE65Oc6rCAIOyWtOuWpCBVSSDsu7Ttj6zrhIztirjroZxcbiAqIO2RnO2YhOuQmOyWtOyVvCDtlZjripTsp4Ao7YWN7Iqk7Yq4LCDsnbTrr7jsp4AsIOuCoOynnCwgRW51bSDshKDtg50g65OxKeulvCDrqoXsi5ztlanri4jri6QuXG4gKlxuICogKirrs4DtmZgg7Z2Q66aEKio6XG4gKiBFbnRpdHkgc3Vic2V0IOKGkiBFbnRpdHlQcm9wTm9kZSDihpIgWm9kIOyKpO2CpOuniCDihpIgUmVuZGVyaW5nTm9kZSAoVUnsmqkpIOKGkiBSZWFjdCDsu7Ttj6zrhIztirgg7L2U65OcIOyDneyEsVxuICpcbiAqICoq7KO87JqUIO2VhOuTnCoqOlxuICogLSBgcmVuZGVyVHlwZWA6IFVJIOy7tO2PrOuEjO2KuCDsnKDtmJUgKHN0cmluZy1wbGFpbiwgbnVtYmVyLWZrX2lkLCBlbnVtcywgYXJyYXkg65OxKVxuICogLSBgem9kVHlwZWA6IOybkOuzuCBab2Qg7Iqk7YKk66eIICh2YWxpZGF0aW9uIOyaqSlcbiAqIC0gYGNoaWxkcmVuYDog7KSR7LKp65CcIOqwneyytCDtlYTrk5zrk6QgKG9iamVjdOydvCDrlYwpXG4gKiAtIGBlbGVtZW50YDog67Cw7Je0IOyalOyGjCDtg4DsnoUgKGFycmF57J28IOuVjClcbiAqXG4gKiAqKuyCrOyaqSDsnITsuZgqKjpcbiAqIC0gem9kLWNvbnZlcnRlci50c+ydmCB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlKCnsl5DshJwg7IOd7ISxXG4gKiAtIHZpZXdfZm9ybS50ZW1wbGF0ZS50cywgdmlld19saXN0LnRlbXBsYXRlLnRzIOuTseyXkOyEnCBSZWFjdCDsu7Ttj6zrhIztirgg7L2U65OcIOyDneyEseyXkCDsgqzsmqlcbiAqL1xuLy8g7IWA7ZSEIOywuOyhsCDtg4DsnoXsnbTrr4DroZwgWm9kIOyDneuete2VmOqzoCDsp4HsoJEg7KCV7J2YXG5leHBvcnQgY29uc3QgUmVuZGVyaW5nTm9kZSA9IHouYW55KCk7XG5leHBvcnQgdHlwZSBSZW5kZXJpbmdOb2RlID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHJlbmRlclR5cGU6XG4gICAgfCBcInN0cmluZy1wbGFpblwiXG4gICAgfCBcInN0cmluZy1pbWFnZVwiXG4gICAgfCBcInN0cmluZy1kYXRldGltZVwiXG4gICAgfCBcInN0cmluZy1kYXRlXCJcbiAgICB8IFwic3RyaW5nLWlkXCJcbiAgICB8IFwic3RyaW5nLWZrX2lkXCJcbiAgICB8IFwiZGF0ZXRpbWVcIlxuICAgIHwgXCJudW1iZXItcGxhaW5cIlxuICAgIHwgXCJudW1iZXItaWRcIlxuICAgIHwgXCJudW1iZXItZmtfaWRcIlxuICAgIHwgXCJib29sZWFuXCJcbiAgICB8IFwiZW51bXNcIlxuICAgIHwgXCJhcnJheVwiXG4gICAgfCBcImFycmF5LWltYWdlc1wiXG4gICAgfCBcImpzb24tc29uYW11ZmlsZVwiXG4gICAgfCBcImpzb24tc29uYW11ZmlsZS1hcnJheVwiXG4gICAgfCBcIm9iamVjdFwiXG4gICAgfCBcIm9iamVjdC1waWNrXCJcbiAgICB8IFwicmVjb3JkXCJcbiAgICB8IFwidmVjdG9yXCI7XG4gIHpvZFR5cGU6IHouWm9kVHlwZUFueTtcbiAgZWxlbWVudD86IFJlbmRlcmluZ05vZGU7XG4gIGNoaWxkcmVuPzogUmVuZGVyaW5nTm9kZVtdO1xuICBjb25maWc/OiB7XG4gICAgcGlja2VkOiBzdHJpbmc7XG4gIH07XG4gIG9wdGlvbmFsPzogYm9vbGVhbjtcbiAgbnVsbGFibGU/OiBib29sZWFuO1xufTtcblxuY29uc3QgR2VuZXJhdGVkQ29sdW1uU2NoZW1hID0gei5vYmplY3Qoe1xuICB0eXBlOiB6LmVudW0oW1wiU1RPUkVEXCIsIFwiVklSVFVBTFwiXSksXG4gIGV4cHJlc3Npb246IHouc3RyaW5nKCksXG59KTtcblxuY29uc3QgRml4dHVyZUNvbXBhbmlvblNjaGVtYSA9IHoub2JqZWN0KHtcbiAgZW50aXR5OiB6LnN0cmluZygpLFxuICBvdmVycmlkZXM6IHoucmVjb3JkKHouc3RyaW5nKCksIHoudW5rbm93bigpKS5vcHRpb25hbCgpLFxuICBjb3VudDogei5udW1iZXIoKS5pbnQoKS5wb3NpdGl2ZSgpLm9wdGlvbmFsKCksXG59KTtcblxuLyoqXG4gKiBDb25lIOyKpO2CpOuniCDqsoDspp1cbiAqXG4gKiBjb25lIOuplO2DgOuNsOydtO2EsOydmCDsnKDtmqjshLHsnYQg6rKA7Kad7ZWp64uI64ukLlxuICovXG5jb25zdCBDb25lU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBub3RlOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgdGFnczogei5hcnJheSh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgIGZpeHR1cmVHZW5lcmF0b3I6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBmaXh0dXJlRGVmYXVsdDogei51bmtub3duKCkub3B0aW9uYWwoKSxcbiAgICBmaXh0dXJlU3RyYXRlZ3k6IHoubGl0ZXJhbChcInNlcXVlbmNlXCIpLm9wdGlvbmFsKCksXG4gICAgZml4dHVyZUNvbXBhbmlvbnM6IHouYXJyYXkoRml4dHVyZUNvbXBhbmlvblNjaGVtYSkub3B0aW9uYWwoKSxcbiAgICBmaXh0dXJlUGFyZW50T3ZlcnJpZGVzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkub3B0aW9uYWwoKSxcbiAgICBkYXRhU291cmNlOiB6XG4gICAgICAub2JqZWN0KHtcbiAgICAgICAgc3RyYXRlZ3k6IHouZW51bShbXCJzYW1wbGVcIiwgXCJpZHNcIiwgXCJxdWVyeVwiLCBcImZpbGVcIiwgXCJyZWNlbnRcIiwgXCJyYW5kb21cIl0pLFxuICAgICAgICBjb25maWc6IHoudW5rbm93bigpLm9wdGlvbmFsKCksXG4gICAgICB9KVxuICAgICAgLm9wdGlvbmFsKCksXG4gIH0pXG4gIC5jYXRjaGFsbCh6LnVua25vd24oKSk7IC8vIOyCrOyaqeyekCDsoJXsnZgg66mU7YOA642w7J207YSwIO2XiOyaqVxuXG5jb25zdCBCYXNlUHJvcEZpZWxkcyA9IHtcbiAgbmFtZTogei5zdHJpbmcoKSxcbiAgZGVzYzogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBudWxsYWJsZTogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgdG9GaWx0ZXI6IHouYm9vbGVhbigpLmRlZmF1bHQoZmFsc2UpLm9wdGlvbmFsKCksXG4gIGRiRGVmYXVsdDogei51bmlvbihbei5zdHJpbmcoKSwgei5udW1iZXIoKSwgei5ib29sZWFuKCldKS5vcHRpb25hbCgpLFxuICBnZW5lcmF0ZWQ6IEdlbmVyYXRlZENvbHVtblNjaGVtYS5vcHRpb25hbCgpLFxuICBjb25lOiBDb25lU2NoZW1hLm9wdGlvbmFsKCksXG59O1xuXG4vLyDrtoDqsIAg7ZWE65Oc6rCAIO2VhOyalOyXhuuKlCBwcm9wXG5jb25zdCBCYXNlUHJvcEZpZWxkc1dpdGhvdXRBZGRpdGlvbmFsID0gelxuICAub2JqZWN0KHtcbiAgICAuLi5CYXNlUHJvcEZpZWxkcyxcbiAgICB0eXBlOiB6LnVuaW9uKFtcbiAgICAgIHoubGl0ZXJhbChcImludGVnZXJcIiksXG4gICAgICB6LmxpdGVyYWwoXCJpbnRlZ2VyW11cIiksXG4gICAgICB6LmxpdGVyYWwoXCJiaWdJbnRlZ2VyXCIpLFxuICAgICAgei5saXRlcmFsKFwiYmlnSW50ZWdlcltdXCIpLFxuICAgICAgei5saXRlcmFsKFwiYm9vbGVhblwiKSxcbiAgICAgIHoubGl0ZXJhbChcImJvb2xlYW5bXVwiKSxcbiAgICAgIHoubGl0ZXJhbChcInV1aWRcIiksXG4gICAgICB6LmxpdGVyYWwoXCJ1dWlkW11cIiksXG4gICAgICB6LmxpdGVyYWwoXCJ0c3ZlY3RvclwiKSxcbiAgICBdKSxcbiAgfSlcbiAgLnN0cmljdCgpO1xuXG4vLyBwcmVjaXNpb24vc2NhbGUg7ZWE65OcXG5jb25zdCBQcmVjaXNpb25TY2FsZUZpZWxkcyA9IHtcbiAgcHJlY2lzaW9uOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIHNjYWxlOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG59O1xuXG4vLyDqsIEg7YOA7J6F67OEIOyKpO2CpOuniCDsoJXsnZhcblxuY29uc3QgU3RyaW5nUHJvcFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgLi4uQmFzZVByb3BGaWVsZHMsXG4gICAgdHlwZTogei5saXRlcmFsKFwic3RyaW5nXCIpLFxuICAgIGxlbmd0aDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgIHpvZEZvcm1hdDogWm9kU3RyaW5nRm9ybWF0Lm9wdGlvbmFsKCksXG4gIH0pXG4gIC5zdHJpY3QoKTtcbmNvbnN0IFN0cmluZ0FycmF5UHJvcFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgLi4uQmFzZVByb3BGaWVsZHMsXG4gICAgdHlwZTogei5saXRlcmFsKFwic3RyaW5nW11cIiksXG4gICAgbGVuZ3RoOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgem9kRm9ybWF0OiBab2RTdHJpbmdGb3JtYXQub3B0aW9uYWwoKSxcbiAgfSlcbiAgLnN0cmljdCgpO1xuXG5jb25zdCBFbnVtUHJvcFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgLi4uQmFzZVByb3BGaWVsZHMsXG4gICAgdHlwZTogei5saXRlcmFsKFwiZW51bVwiKSxcbiAgICBpZDogei5zdHJpbmcoKSxcbiAgICBsZW5ndGg6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgfSlcbiAgLnN0cmljdCgpO1xuY29uc3QgRW51bUFycmF5UHJvcFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgLi4uQmFzZVByb3BGaWVsZHMsXG4gICAgdHlwZTogei5saXRlcmFsKFwiZW51bVtdXCIpLFxuICAgIGlkOiB6LnN0cmluZygpLFxuICB9KVxuICAuc3RyaWN0KCk7XG5cbmNvbnN0IE51bWJlclByb3BTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIC4uLkJhc2VQcm9wRmllbGRzLFxuICAgIHR5cGU6IHoubGl0ZXJhbChcIm51bWJlclwiKSxcbiAgICAuLi5QcmVjaXNpb25TY2FsZUZpZWxkcyxcbiAgICBudW1iZXJUeXBlOiB6LmVudW0oW1wicmVhbFwiLCBcImRvdWJsZSBwcmVjaXNpb25cIiwgXCJudW1lcmljXCJdKS5vcHRpb25hbCgpLFxuICB9KVxuICAuc3RyaWN0KCk7XG5jb25zdCBOdW1iZXJBcnJheVByb3BTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIC4uLkJhc2VQcm9wRmllbGRzLFxuICAgIHR5cGU6IHoubGl0ZXJhbChcIm51bWJlcltdXCIpLFxuICAgIC4uLlByZWNpc2lvblNjYWxlRmllbGRzLFxuICAgIG51bWJlclR5cGU6IHouZW51bShbXCJyZWFsXCIsIFwiZG91YmxlIHByZWNpc2lvblwiLCBcIm51bWVyaWNcIl0pLm9wdGlvbmFsKCksXG4gIH0pXG4gIC5zdHJpY3QoKTtcblxuY29uc3QgRGF0ZVByb3BTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIC4uLkJhc2VQcm9wRmllbGRzLFxuICAgIHR5cGU6IHoubGl0ZXJhbChcImRhdGVcIiksXG4gICAgcHJlY2lzaW9uOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIH0pXG4gIC5zdHJpY3QoKTtcbmNvbnN0IERhdGVBcnJheVByb3BTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIC4uLkJhc2VQcm9wRmllbGRzLFxuICAgIHR5cGU6IHoubGl0ZXJhbChcImRhdGVbXVwiKSxcbiAgICBwcmVjaXNpb246IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgfSlcbiAgLnN0cmljdCgpO1xuXG5jb25zdCBOdW1lcmljUHJvcFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgLi4uQmFzZVByb3BGaWVsZHMsXG4gICAgdHlwZTogei5saXRlcmFsKFwibnVtZXJpY1wiKSxcbiAgICAuLi5QcmVjaXNpb25TY2FsZUZpZWxkcyxcbiAgfSlcbiAgLnN0cmljdCgpO1xuY29uc3QgTnVtZXJpY0FycmF5UHJvcFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgLi4uQmFzZVByb3BGaWVsZHMsXG4gICAgdHlwZTogei5saXRlcmFsKFwibnVtZXJpY1tdXCIpLFxuICAgIC4uLlByZWNpc2lvblNjYWxlRmllbGRzLFxuICB9KVxuICAuc3RyaWN0KCk7XG5cbmNvbnN0IEpzb25Qcm9wU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICAuLi5CYXNlUHJvcEZpZWxkcyxcbiAgICB0eXBlOiB6LmxpdGVyYWwoXCJqc29uXCIpLFxuICAgIGlkOiB6LnN0cmluZygpLFxuICB9KVxuICAuc3RyaWN0KCk7XG5cbmNvbnN0IFNlYXJjaFRleHRTb3VyY2VDb2x1bW5TY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIG5hbWU6IHouc3RyaW5nKCksXG4gICAgY2FzZUluc2Vuc2l0aXZlOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICB9KVxuICAuc3RyaWN0KCk7XG5cbmNvbnN0IFNlYXJjaFRleHRQcm9wU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICAuLi5CYXNlUHJvcEZpZWxkcyxcbiAgICB0eXBlOiB6LmxpdGVyYWwoXCJzZWFyY2hUZXh0XCIpLFxuICAgIHNvdXJjZUNvbHVtbnM6IHouYXJyYXkoU2VhcmNoVGV4dFNvdXJjZUNvbHVtblNjaGVtYSkubWluKDEpLFxuICB9KVxuICAuc3RyaWN0KCk7XG5cbmNvbnN0IFZpcnR1YWxQcm9wU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICAuLi5CYXNlUHJvcEZpZWxkcyxcbiAgICB0eXBlOiB6LmxpdGVyYWwoXCJ2aXJ0dWFsXCIpLFxuICAgIGlkOiB6LnN0cmluZygpLFxuICAgIHZpcnR1YWxUeXBlOiB6LmVudW0oW1wicXVlcnlcIiwgXCJjb2RlXCJdKS5vcHRpb25hbCgpLFxuICB9KVxuICAuc3RyaWN0KCk7XG5cbmNvbnN0IFZlY3RvclByb3BTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIC4uLkJhc2VQcm9wRmllbGRzLFxuICAgIHR5cGU6IHoubGl0ZXJhbChcInZlY3RvclwiKSxcbiAgICBkaW1lbnNpb25zOiB6Lm51bWJlcigpLFxuICB9KVxuICAuc3RyaWN0KCk7XG5jb25zdCBWZWN0b3JBcnJheVByb3BTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIC4uLkJhc2VQcm9wRmllbGRzLFxuICAgIHR5cGU6IHoubGl0ZXJhbChcInZlY3RvcltdXCIpLFxuICAgIGRpbWVuc2lvbnM6IHoubnVtYmVyKCksXG4gIH0pXG4gIC5zdHJpY3QoKTtcblxuLy8gUmVsYXRpb24g7YOA7J6F7J2AIHJlbGF0aW9uVHlwZeyXkCDrlLDrnbwg7IS467aE7ZmUXG5jb25zdCBCYXNlUmVsYXRpb25GaWVsZHMgPSB7XG4gIC4uLkJhc2VQcm9wRmllbGRzLFxuICB0eXBlOiB6LmxpdGVyYWwoXCJyZWxhdGlvblwiKSxcbiAgd2l0aDogei5zdHJpbmcoKSxcbn07XG5cbi8vIFJlbGF0aW9uT24g7YOA7J6FXG5jb25zdCBSZWxhdGlvbk9uU2NoZW1hID0gei5lbnVtKFtcIkNBU0NBREVcIiwgXCJTRVQgTlVMTFwiLCBcIk5PIEFDVElPTlwiLCBcIlNFVCBERUZBVUxUXCIsIFwiUkVTVFJJQ1RcIl0pO1xuXG5jb25zdCBCZWxvbmdzVG9PbmVSZWxhdGlvblByb3BTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIC4uLkJhc2VSZWxhdGlvbkZpZWxkcyxcbiAgICByZWxhdGlvblR5cGU6IHoubGl0ZXJhbChcIkJlbG9uZ3NUb09uZVwiKSxcbiAgICBjdXN0b21Kb2luQ2xhdXNlOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgdXNlQ29uc3RyYWludDogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgICBvblVwZGF0ZTogUmVsYXRpb25PblNjaGVtYS5vcHRpb25hbCgpLFxuICAgIG9uRGVsZXRlOiBSZWxhdGlvbk9uU2NoZW1hLm9wdGlvbmFsKCksXG4gIH0pXG4gIC5zdHJpY3QoKTtcblxuY29uc3QgSGFzTWFueVJlbGF0aW9uUHJvcFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgLi4uQmFzZVJlbGF0aW9uRmllbGRzLFxuICAgIHJlbGF0aW9uVHlwZTogei5saXRlcmFsKFwiSGFzTWFueVwiKSxcbiAgICBqb2luQ29sdW1uOiB6LnN0cmluZygpLFxuICAgIGZyb21Db2x1bW46IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgfSlcbiAgLnN0cmljdCgpO1xuXG5jb25zdCBNYW55VG9NYW55UmVsYXRpb25Qcm9wU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICAuLi5CYXNlUmVsYXRpb25GaWVsZHMsXG4gICAgcmVsYXRpb25UeXBlOiB6LmxpdGVyYWwoXCJNYW55VG9NYW55XCIpLFxuICAgIGpvaW5UYWJsZTogei5zdHJpbmcoKSxcbiAgICBvblVwZGF0ZTogUmVsYXRpb25PblNjaGVtYSxcbiAgICBvbkRlbGV0ZTogUmVsYXRpb25PblNjaGVtYSxcbiAgfSlcbiAgLnN0cmljdCgpO1xuXG5jb25zdCBPbmVUb09uZVJlbGF0aW9uUHJvcFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgLi4uQmFzZVJlbGF0aW9uRmllbGRzLFxuICAgIHJlbGF0aW9uVHlwZTogei5saXRlcmFsKFwiT25lVG9PbmVcIiksXG4gICAgY3VzdG9tSm9pbkNsYXVzZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIGhhc0pvaW5Db2x1bW46IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gICAgdXNlQ29uc3RyYWludDogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgICBvblVwZGF0ZTogUmVsYXRpb25PblNjaGVtYS5vcHRpb25hbCgpLFxuICAgIG9uRGVsZXRlOiBSZWxhdGlvbk9uU2NoZW1hLm9wdGlvbmFsKCksXG4gIH0pXG4gIC5zdHJpY3QoKTtcblxuY29uc3QgUmVsYXRpb25UeXBlcyA9IFtcIkJlbG9uZ3NUb09uZVwiLCBcIkhhc01hbnlcIiwgXCJNYW55VG9NYW55XCIsIFwiT25lVG9PbmVcIl0gYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgUmVsYXRpb25Qcm9wU2NoZW1hID0gei5kaXNjcmltaW5hdGVkVW5pb24oXG4gIFwicmVsYXRpb25UeXBlXCIsXG4gIFtcbiAgICBCZWxvbmdzVG9PbmVSZWxhdGlvblByb3BTY2hlbWEsXG4gICAgSGFzTWFueVJlbGF0aW9uUHJvcFNjaGVtYSxcbiAgICBNYW55VG9NYW55UmVsYXRpb25Qcm9wU2NoZW1hLFxuICAgIE9uZVRvT25lUmVsYXRpb25Qcm9wU2NoZW1hLFxuICBdLFxuICB7XG4gICAgZXJyb3I6IChpc3MpID0+XG4gICAgICBgcmVsYXRpb25UeXBl7J2AICR7UmVsYXRpb25UeXBlcy5tYXAoKHQpID0+IGAnJHt0fSdgKS5qb2luKFwiLCBcIil9IOykkSDtlZjrgpjsl6zslbwg7ZWp64uI64ukLiDsnoXroKXqsJI6IFwiJHsoaXNzLmlucHV0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KT8ucmVsYXRpb25UeXBlfVwiYCxcbiAgfSxcbik7XG5cbmNvbnN0IE5vcm1hbFByb3BUeXBlcyA9IFtcbiAgXCJpbnRlZ2VyXCIsXG4gIFwiaW50ZWdlcltdXCIsXG4gIFwiYmlnSW50ZWdlclwiLFxuICBcImJpZ0ludGVnZXJbXVwiLFxuICBcInN0cmluZ1wiLFxuICBcInN0cmluZ1tdXCIsXG4gIFwiZW51bVwiLFxuICBcImVudW1bXVwiLFxuICBcIm51bWJlclwiLFxuICBcIm51bWJlcltdXCIsXG4gIFwibnVtZXJpY1wiLFxuICBcIm51bWVyaWNbXVwiLFxuICBcImJvb2xlYW5cIixcbiAgXCJib29sZWFuW11cIixcbiAgXCJkYXRlXCIsXG4gIFwiZGF0ZVtdXCIsXG4gIFwidXVpZFwiLFxuICBcInV1aWRbXVwiLFxuICBcImpzb25cIixcbiAgXCJzZWFyY2hUZXh0XCIsXG4gIFwidmlydHVhbFwiLFxuICBcInZlY3RvclwiLFxuICBcInZlY3RvcltdXCIsXG4gIFwidHN2ZWN0b3JcIixcbl0gYXMgY29uc3Q7XG5cbi8vIFZJUlRVQUwgR2VuZXJhdGVkIENvbHVtbuyXkOyEnCDsgqzsmqkg67aI6rCA64ql7ZWcIO2DgOyeheuTpFxuY29uc3QgVmlydHVhbEdlbmVyYXRlZERpc2FsbG93ZWRUeXBlcyA9IFtcbiAgXCJqc29uXCIsXG4gIFwidmVjdG9yXCIsXG4gIFwidmVjdG9yW11cIixcbiAgXCJzdHJpbmdbXVwiLFxuICBcImludGVnZXJbXVwiLFxuICBcImJpZ0ludGVnZXJbXVwiLFxuICBcImJvb2xlYW5bXVwiLFxuICBcImRhdGVbXVwiLFxuICBcInV1aWRbXVwiLFxuICBcIm51bWJlcltdXCIsXG4gIFwibnVtZXJpY1tdXCIsXG4gIFwiZW51bVtdXCIsXG5dIGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgTm9ybWFsUHJvcFNjaGVtYSA9IHpcbiAgLmRpc2NyaW1pbmF0ZWRVbmlvbihcbiAgICBcInR5cGVcIixcbiAgICBbXG4gICAgICBCYXNlUHJvcEZpZWxkc1dpdGhvdXRBZGRpdGlvbmFsLFxuICAgICAgU3RyaW5nUHJvcFNjaGVtYSxcbiAgICAgIFN0cmluZ0FycmF5UHJvcFNjaGVtYSxcbiAgICAgIEVudW1Qcm9wU2NoZW1hLFxuICAgICAgRW51bUFycmF5UHJvcFNjaGVtYSxcbiAgICAgIE51bWJlclByb3BTY2hlbWEsXG4gICAgICBOdW1iZXJBcnJheVByb3BTY2hlbWEsXG4gICAgICBEYXRlUHJvcFNjaGVtYSxcbiAgICAgIERhdGVBcnJheVByb3BTY2hlbWEsXG4gICAgICBOdW1lcmljUHJvcFNjaGVtYSxcbiAgICAgIE51bWVyaWNBcnJheVByb3BTY2hlbWEsXG4gICAgICBKc29uUHJvcFNjaGVtYSxcbiAgICAgIFNlYXJjaFRleHRQcm9wU2NoZW1hLFxuICAgICAgVmlydHVhbFByb3BTY2hlbWEsXG4gICAgICBWZWN0b3JQcm9wU2NoZW1hLFxuICAgICAgVmVjdG9yQXJyYXlQcm9wU2NoZW1hLFxuICAgIF0sXG4gICAge1xuICAgICAgZXJyb3I6IChpc3MpID0+XG4gICAgICAgIGB0eXBl7J2AICR7Tm9ybWFsUHJvcFR5cGVzLm1hcCgodCkgPT4gYCcke3R9J2ApLmpvaW4oXCIsIFwiKX0g7KSRIO2VmOuCmOyXrOyVvCDtlanri4jri6QuIOyeheugpeqwkjogXCIkeyhpc3MuaW5wdXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pPy50eXBlfVwiYCxcbiAgICB9LFxuICApXG4gIC5zdXBlclJlZmluZSgoZGF0YSwgY3R4KSA9PiB7XG4gICAgaWYgKCFkYXRhLmdlbmVyYXRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGRiRGVmYXVsdOyZgCBnZW5lcmF0ZWQg64+Z7IucIOyCrOyaqSDrtojqsIBcbiAgICBpZiAoZGF0YS5kYkRlZmF1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY3R4LmFkZElzc3VlKHtcbiAgICAgICAgY29kZTogXCJjdXN0b21cIixcbiAgICAgICAgbWVzc2FnZTogXCJkYkRlZmF1bHTsmYAgZ2VuZXJhdGVk64qUIO2VqOq7mCDsgqzsmqntlaAg7IiYIOyXhuyKteuLiOuLpFwiLFxuICAgICAgICBwYXRoOiBbXCJnZW5lcmF0ZWRcIl0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyB2aXJ0dWFsIO2DgOyeheydgCBnZW5lcmF0ZWQg67aI6rCAXG4gICAgaWYgKGRhdGEudHlwZSA9PT0gXCJ2aXJ0dWFsXCIpIHtcbiAgICAgIGN0eC5hZGRJc3N1ZSh7XG4gICAgICAgIGNvZGU6IFwiY3VzdG9tXCIsXG4gICAgICAgIG1lc3NhZ2U6IFwidmlydHVhbCDtg4DsnoXsnYAgZ2VuZXJhdGVkIGNvbHVtbuydhCDsp4Dsm5DtlZjsp4Ag7JWK7Iq164uI64ukXCIsXG4gICAgICAgIHBhdGg6IFtcImdlbmVyYXRlZFwiXSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFZJUlRVQUwgR2VuZXJhdGVkIENvbHVtbiDtg4DsnoUg7KCc7ZWcIOqygOymnVxuICAgIGlmIChkYXRhLmdlbmVyYXRlZC50eXBlID09PSBcIlZJUlRVQUxcIikge1xuICAgICAgaWYgKChWaXJ0dWFsR2VuZXJhdGVkRGlzYWxsb3dlZFR5cGVzIGFzIHJlYWRvbmx5IHN0cmluZ1tdKS5pbmNsdWRlcyhkYXRhLnR5cGUpKSB7XG4gICAgICAgIGN0eC5hZGRJc3N1ZSh7XG4gICAgICAgICAgY29kZTogXCJjdXN0b21cIixcbiAgICAgICAgICBtZXNzYWdlOiBgVklSVFVBTCBnZW5lcmF0ZWQgY29sdW1u7J2AICR7ZGF0YS50eXBlfSDtg4DsnoXsnYQg7KeA7JuQ7ZWY7KeAIOyViuyKteuLiOuLpC4gU1RPUkVE66W8IOyCrOyaqe2VmOyEuOyalC5gLFxuICAgICAgICAgIHBhdGg6IFtcImdlbmVyYXRlZFwiLCBcInR5cGVcIl0sXG4gICAgICAgICAgZmF0YWw6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbmNvbnN0IEFsbFByb3BUeXBlcyA9IFsuLi5Ob3JtYWxQcm9wVHlwZXMsIFwicmVsYXRpb25cIl0gYXMgY29uc3Q7XG5jb25zdCBFbnRpdHlQcm9wU2NoZW1hID0gei5kaXNjcmltaW5hdGVkVW5pb24oXCJ0eXBlXCIsIFtOb3JtYWxQcm9wU2NoZW1hLCBSZWxhdGlvblByb3BTY2hlbWFdLCB7XG4gIGVycm9yOiAoaXNzKSA9PlxuICAgIGB0eXBl7J2AICR7QWxsUHJvcFR5cGVzLm1hcCgodCkgPT4gYCcke3R9J2ApLmpvaW4oXCIsIFwiKX0g7KSRIO2VmOuCmOyXrOyVvCDtlanri4jri6QuIOyeheugpeqwkjogXCIkeyhpc3MuaW5wdXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pPy50eXBlfVwiYCxcbn0pO1xuXG5jb25zdCBFbnRpdHlJbmRleENvbHVtblNjaGVtYSA9IHoub2JqZWN0KHtcbiAgbmFtZTogei5zdHJpbmcoKSxcbiAgbnVsbHNGaXJzdDogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgc29ydE9yZGVyOiB6LmVudW0oW1wiQVNDXCIsIFwiREVTQ1wiXSkub3B0aW9uYWwoKSxcbiAgdmVjdG9yT3BzOiB6LmVudW0oW1widmVjdG9yX2Nvc2luZV9vcHNcIiwgXCJ2ZWN0b3JfaXBfb3BzXCIsIFwidmVjdG9yX2wyX29wc1wiXSkub3B0aW9uYWwoKSxcbiAgb3BjbGFzczogei51bmlvbihbei5lbnVtKEtub3duT3BjbGFzc1ZhbHVlcyksIHouc3RyaW5nKCkubWluKDEpXSkub3B0aW9uYWwoKSxcbn0pO1xuXG4vLyBFbnRpdHlJbmRleCDsiqTtgqTrp4gg7KCV7J2YXG5jb25zdCBFbnRpdHlJbmRleFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgdHlwZTogei5lbnVtKFtcImluZGV4XCIsIFwidW5pcXVlXCIsIFwiaG5zd1wiLCBcIml2ZmZsYXRcIl0pLFxuICAgIGNvbHVtbnM6IHouYXJyYXkoRW50aXR5SW5kZXhDb2x1bW5TY2hlbWEpLFxuICAgIG5hbWU6IHouc3RyaW5nKCkubWluKDEpLm1heCg2MyksXG4gICAgdXNpbmc6IHouZW51bShbXCJidHJlZVwiLCBcImhhc2hcIiwgXCJnaW5cIiwgXCJnaXN0XCIsIFwicGdyb29uZ2FcIl0pLm9wdGlvbmFsKCksXG4gICAgbnVsbHNOb3REaXN0aW5jdDogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgICBtOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgZWZDb25zdHJ1Y3Rpb246IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICBsaXN0czogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICB9KVxuICAuc3RyaWN0KCk7XG5cbi8qKlxuICogU3Vic2V0RGVmIOyKpO2CpOuniFxuICpcbiAqIO2VmOychCDtmLjtmZjshLHsnYQg7JyE7ZW0IOuwsOyXtCDtmJXtg5zsmYAg6rCd7LK0IO2Yle2DnCDrkZgg64ukIOyngOybkO2VqeuLiOuLpC5cbiAqL1xuY29uc3QgU3Vic2V0RGVmU2NoZW1hID0gei51bmlvbihbXG4gIC8vIOq4sOyhtCDrsLDsl7Qg7ZiV7YOcXG4gIHouYXJyYXkoei51bmlvbihbei5zdHJpbmcoKSwgei5vYmplY3QoeyBmaWVsZDogei5zdHJpbmcoKSwgaW50ZXJuYWw6IHouYm9vbGVhbigpLm9wdGlvbmFsKCkgfSldKSksXG4gIC8vIOyDiOuhnOyatCDqsJ3ssrQg7ZiV7YOcXG4gIHoub2JqZWN0KHtcbiAgICBmaWVsZHM6IHouYXJyYXkoXG4gICAgICB6LnVuaW9uKFt6LnN0cmluZygpLCB6Lm9iamVjdCh7IGZpZWxkOiB6LnN0cmluZygpLCBpbnRlcm5hbDogei5ib29sZWFuKCkub3B0aW9uYWwoKSB9KV0pLFxuICAgICksXG4gICAgY29uZTogQ29uZVNjaGVtYS5vcHRpb25hbCgpLFxuICB9KSxcbl0pO1xuXG4vKipcbiAqIEVudW1EZWYg7Iqk7YKk66eIXG4gKlxuICog7ZWY7JyEIO2YuO2ZmOyEseydhCDsnITtlbQgUmVjb3JkIO2Yle2DnOyZgCDqsJ3ssrQg7ZiV7YOcIOuRmCDri6Qg7KeA7JuQ7ZWp64uI64ukLlxuICovXG5jb25zdCBFbnVtRGVmU2NoZW1hID0gei51bmlvbihbXG4gIC8vIOq4sOyhtCBSZWNvcmQg7ZiV7YOcXG4gIHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLFxuICAvLyDsg4jroZzsmrQg6rCd7LK0IO2Yle2DnFxuICB6Lm9iamVjdCh7XG4gICAgdmFsdWVzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKSxcbiAgICBjb25lOiBDb25lU2NoZW1hLm9wdGlvbmFsKCksXG4gIH0pLFxuXSk7XG5cbmZ1bmN0aW9uIHVud3JhcFNlYXJjaFRleHRKc29uU291cmNlVHlwZSh6b2RUeXBlOiB6LlpvZFR5cGVBbnkpOiB6LlpvZFR5cGVBbnkge1xuICBsZXQgY3VycmVudCA9IHpvZFR5cGU7XG5cbiAgd2hpbGUgKGN1cnJlbnQgaW5zdGFuY2VvZiB6LlpvZE9wdGlvbmFsIHx8IGN1cnJlbnQgaW5zdGFuY2VvZiB6LlpvZE51bGxhYmxlKSB7XG4gICAgY3VycmVudCA9IGN1cnJlbnQudW53cmFwKCkgYXMgei5ab2RUeXBlQW55O1xuICB9XG5cbiAgcmV0dXJuIGN1cnJlbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1NlYXJjaFRleHRKc29uU291cmNlWm9kVHlwZSh6b2RUeXBlOiB6LlpvZFR5cGVBbnkpOiBib29sZWFuIHtcbiAgY29uc3QgYmFzZVR5cGUgPSB1bndyYXBTZWFyY2hUZXh0SnNvblNvdXJjZVR5cGUoem9kVHlwZSk7XG4gIGlmICghKGJhc2VUeXBlIGluc3RhbmNlb2Ygei5ab2RBcnJheSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBlbGVtZW50VHlwZSA9IGJhc2VUeXBlLmRlZi5lbGVtZW50O1xuICByZXR1cm4gZWxlbWVudFR5cGUgaW5zdGFuY2VvZiB6LlpvZFN0cmluZztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVTZWFyY2hUZXh0U291cmNlcyhcbiAgcHJvcHM6IHJlYWRvbmx5IHouaW5mZXI8dHlwZW9mIEVudGl0eVByb3BTY2hlbWE+W10sXG4gIGN0eDogei5SZWZpbmVtZW50Q3R4LFxuICBwcm9wc1BhdGg6IChzdHJpbmcgfCBudW1iZXIpW10gPSBbXCJwcm9wc1wiXSxcbik6IHZvaWQge1xuICBjb25zdCBwcm9wc0J5TmFtZSA9IG5ldyBNYXAoXG4gICAgcHJvcHMubWFwKChwcm9wKSA9PiB7XG4gICAgICByZXR1cm4gW3Byb3AubmFtZSwgcHJvcF07XG4gICAgfSksXG4gICk7XG5cbiAgcHJvcHMuZm9yRWFjaCgocHJvcCwgcHJvcEluZGV4KSA9PiB7XG4gICAgaWYgKHByb3AudHlwZSAhPT0gXCJzZWFyY2hUZXh0XCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBwcm9wLnNvdXJjZUNvbHVtbnMuZm9yRWFjaCgoc291cmNlLCBzb3VyY2VJbmRleCkgPT4ge1xuICAgICAgY29uc3Qgc291cmNlUHJvcCA9IHByb3BzQnlOYW1lLmdldChzb3VyY2UubmFtZSk7XG4gICAgICBjb25zdCBzb3VyY2VQYXRoID0gWy4uLnByb3BzUGF0aCwgcHJvcEluZGV4LCBcInNvdXJjZUNvbHVtbnNcIiwgc291cmNlSW5kZXgsIFwibmFtZVwiXTtcblxuICAgICAgaWYgKCFzb3VyY2VQcm9wKSB7XG4gICAgICAgIGN0eC5hZGRJc3N1ZSh7XG4gICAgICAgICAgY29kZTogXCJjdXN0b21cIixcbiAgICAgICAgICBtZXNzYWdlOiBgc2VhcmNoVGV4dCBzb3VyY2UgY29sdW1uIFwiJHtzb3VyY2UubmFtZX1cIuydhCjrpbwpIOywvuydhCDsiJgg7JeG7Iq164uI64ukLmAsXG4gICAgICAgICAgcGF0aDogc291cmNlUGF0aCxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHNvdXJjZVByb3AudHlwZSA9PT0gXCJzdHJpbmdcIiB8fCBzb3VyY2VQcm9wLnR5cGUgPT09IFwic3RyaW5nW11cIikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChzb3VyY2VQcm9wLnR5cGUgPT09IFwianNvblwiKSB7XG4gICAgICAgIC8vIGpzb24gc291cmNl7J2YIOy1nOyihSDtg4DsnoUg7Jyg7Zqo7ISx7J2AIEVudGl0eU1hbmFnZXIucmVnaXN0ZXIoKSDri6jqs4Tsl5DshJxcbiAgICAgICAgLy8g7Iuk7KCcIFpvZCDtg4DsnoXsnYQg7ZW07ISd7ZWY7JesIOq1rOyhsOyggeycvOuhnCDqsoDspp3tlanri4jri6QuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY3R4LmFkZElzc3VlKHtcbiAgICAgICAgY29kZTogXCJjdXN0b21cIixcbiAgICAgICAgbWVzc2FnZTogYHNlYXJjaFRleHQgc291cmNlIGNvbHVtbiBcIiR7c291cmNlLm5hbWV9XCLsnZgg7YOA7J6FIFwiJHtzb3VyY2VQcm9wLnR5cGV9XCLsnYAo64qUKSDsp4Dsm5DrkJjsp4Ag7JWK7Iq164uI64ukLmAsXG4gICAgICAgIHBhdGg6IHNvdXJjZVBhdGgsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmNvbnN0IEVudGl0eUpzb25CYXNlU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBpZDogei5zdHJpbmcoKS5kZXNjcmliZShcIlBhc2NhbENhc2XroZwg65CcIEVudGl0eSBJRFwiKSxcbiAgICB0aXRsZTogei5zdHJpbmcoKS5kZXNjcmliZShcIkVudGl0eSDsnbTrpoRcIiksXG4gICAgdGFibGU6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJzbmFrZV9jYXNl66GcIOuQnCDthYzsnbTruJTrqoVcIiksXG4gICAgcGFyZW50SWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIuu2gOuqqCBFbnRpdHkgSURcIiksXG4gICAgY29uZTogQ29uZVNjaGVtYS5vcHRpb25hbCgpLFxuICAgIHByb3BzOiB6LmFycmF5KEVudGl0eVByb3BTY2hlbWEpLFxuICAgIGluZGV4ZXM6IHouYXJyYXkoRW50aXR5SW5kZXhTY2hlbWEpLFxuICAgIHN1YnNldHM6IHoucmVjb3JkKHouc3RyaW5nKCksIFN1YnNldERlZlNjaGVtYSksXG4gICAgZW51bXM6IHoucmVjb3JkKHouc3RyaW5nKCksIEVudW1EZWZTY2hlbWEpLFxuICB9KVxuICAuc3RyaWN0KCk7XG5cbmV4cG9ydCBjb25zdCBFbnRpdHlKc29uU2NoZW1hID0gRW50aXR5SnNvbkJhc2VTY2hlbWEuc3VwZXJSZWZpbmUoKGVudGl0eSwgY3R4KSA9PiB7XG4gIHZhbGlkYXRlU2VhcmNoVGV4dFNvdXJjZXMoZW50aXR5LnByb3BzLCBjdHgpO1xufSk7XG5cbmNvbnN0IFRlbXBsYXRlRW50aXR5U2NoZW1hID0gRW50aXR5SnNvbkJhc2VTY2hlbWEub21pdCh7IGlkOiB0cnVlIH0pXG4gIC5leHRlbmQoe1xuICAgIGVudGl0eUlkOiB6LnN0cmluZygpLFxuICB9KVxuICAucGFydGlhbCh7XG4gICAgdGFibGU6IHRydWUsXG4gICAgcHJvcHM6IHRydWUsXG4gICAgaW5kZXhlczogdHJ1ZSxcbiAgICBzdWJzZXRzOiB0cnVlLFxuICAgIGVudW1zOiB0cnVlLFxuICB9KVxuICAuc3VwZXJSZWZpbmUoKGVudGl0eSwgY3R4KSA9PiB7XG4gICAgaWYgKCFlbnRpdHkucHJvcHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YWxpZGF0ZVNlYXJjaFRleHRTb3VyY2VzKGVudGl0eS5wcm9wcywgY3R4KTtcbiAgfSk7XG5cbmV4cG9ydCBjb25zdCBUZW1wbGF0ZU9wdGlvbnMgPSB6Lm9iamVjdCh7XG4gIGVudGl0eTogVGVtcGxhdGVFbnRpdHlTY2hlbWEsXG4gIGluaXRfdHlwZXM6IHoub2JqZWN0KHtcbiAgICBlbnRpdHlJZDogei5zdHJpbmcoKSxcbiAgfSksXG4gIGdlbmVyYXRlZDogei5vYmplY3Qoe30pLFxuICBnZW5lcmF0ZWRfc3NvOiB6Lm9iamVjdCh7fSksXG4gIGdlbmVyYXRlZF9odHRwOiB6Lm9iamVjdCh7XG4gICAgZW50aXR5SWQ6IHouc3RyaW5nKCksXG4gIH0pLFxuICBtb2RlbDogei5vYmplY3Qoe1xuICAgIGVudGl0eUlkOiB6LnN0cmluZygpLFxuICAgIGRlZmF1bHRTZWFyY2hGaWVsZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIGRlZmF1bHRPcmRlckJ5OiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIH0pLFxuICBtb2RlbF90ZXN0OiB6Lm9iamVjdCh7XG4gICAgZW50aXR5SWQ6IHouc3RyaW5nKCksXG4gIH0pLFxuICBicmlkZ2U6IHoub2JqZWN0KHtcbiAgICBlbnRpdHlJZDogei5zdHJpbmcoKSxcbiAgfSksXG4gIHNlcnZpY2VzOiB6Lm9iamVjdCh7fSksXG4gIHZpZXdfbGlzdDogei5vYmplY3Qoe1xuICAgIGVudGl0eUlkOiB6LnN0cmluZygpLFxuICAgIGV4dHJhOiB6LnVua25vd24oKSxcbiAgfSksXG4gIHZpZXdfbGlzdF9jb2x1bW5zOiB6Lm9iamVjdCh7XG4gICAgZW50aXR5SWQ6IHouc3RyaW5nKCksXG4gICAgY29sdW1uczogelxuICAgICAgLm9iamVjdCh7XG4gICAgICAgIG5hbWU6IHouc3RyaW5nKCksXG4gICAgICAgIGxhYmVsOiB6LnN0cmluZygpLFxuICAgICAgICB0Yzogei5zdHJpbmcoKSxcbiAgICAgIH0pXG4gICAgICAuYXJyYXkoKSxcbiAgICBjb2x1bW5JbXBvcnRzOiB6LnN0cmluZygpLFxuICB9KSxcbiAgdmlld19zZWFyY2hfaW5wdXQ6IHoub2JqZWN0KHtcbiAgICBlbnRpdHlJZDogei5zdHJpbmcoKSxcbiAgfSksXG4gIHZpZXdfZm9ybTogei5vYmplY3Qoe1xuICAgIGVudGl0eUlkOiB6LnN0cmluZygpLFxuICB9KSxcbiAgdmlld19pZF9hbGxfc2VsZWN0OiB6Lm9iamVjdCh7XG4gICAgZW50aXR5SWQ6IHouc3RyaW5nKCksXG4gIH0pLFxuICB2aWV3X2VudW1zX2J1dHRvbnNldDogei5vYmplY3Qoe1xuICAgIGVudGl0eUlkOiB6LnN0cmluZygpLFxuICAgIGVudW1JZDogei5zdHJpbmcoKSxcbiAgfSksXG4gIHF1ZXJpZXM6IHoub2JqZWN0KHt9KSxcbiAgZW50cnlfc2VydmVyOiB6Lm9iamVjdCh7fSksXG4gIHNkOiB6Lm9iamVjdCh7XG4gICAgdGFyZ2V0OiB6LmVudW0oW1wiYXBpXCIsIFwid2ViXCIsIFwiYXBwXCJdKSxcbiAgfSksXG59KTtcbmV4cG9ydCB0eXBlIFRlbXBsYXRlT3B0aW9ucyA9IHouaW5mZXI8dHlwZW9mIFRlbXBsYXRlT3B0aW9ucz47XG5cbmV4cG9ydCBjb25zdCBUZW1wbGF0ZUtleSA9IHouZW51bShbXG4gIFwiZW50aXR5XCIsXG4gIFwiaW5pdF90eXBlc1wiLFxuICBcImdlbmVyYXRlZFwiLFxuICBcImdlbmVyYXRlZF9zc29cIixcbiAgXCJnZW5lcmF0ZWRfaHR0cFwiLFxuICBcIm1vZGVsXCIsXG4gIFwibW9kZWxfdGVzdFwiLFxuICBcImJyaWRnZVwiLFxuICBcInNlcnZpY2VzXCIsXG4gIFwidmlld19saXN0XCIsXG4gIFwidmlld19saXN0X2NvbHVtbnNcIixcbiAgXCJ2aWV3X3NlYXJjaF9pbnB1dFwiLFxuICBcInZpZXdfZm9ybVwiLFxuICBcInZpZXdfaWRfYWxsX3NlbGVjdFwiLFxuICBcInZpZXdfZW51bXNfYnV0dG9uc2V0XCIsXG4gIFwicXVlcmllc1wiLFxuICBcImVudHJ5X3NlcnZlclwiLFxuICBcInNkXCIsXG5dKTtcbmV4cG9ydCB0eXBlIFRlbXBsYXRlS2V5ID0gei5pbmZlcjx0eXBlb2YgVGVtcGxhdGVLZXk+O1xuXG5leHBvcnQgY29uc3QgR2VuZXJhdGVPcHRpb25zID0gei5vYmplY3Qoe1xuICBvdmVyd3JpdGU6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG59KTtcbmV4cG9ydCB0eXBlIEdlbmVyYXRlT3B0aW9ucyA9IHouaW5mZXI8dHlwZW9mIEdlbmVyYXRlT3B0aW9ucz47XG5cbmV4cG9ydCBjb25zdCBQYXRoQW5kQ29kZSA9IHoub2JqZWN0KHtcbiAgcGF0aDogei5zdHJpbmcoKSxcbiAgY29kZTogei5zdHJpbmcoKSxcbn0pO1xuZXhwb3J0IHR5cGUgUGF0aEFuZENvZGUgPSB6LmluZmVyPHR5cGVvZiBQYXRoQW5kQ29kZT47XG5cbmV4cG9ydCB0eXBlIEZpeHR1cmVTZWFyY2hPcHRpb25zID0ge1xuICBlbnRpdHlJZDogc3RyaW5nO1xuICBmaWVsZDogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xuICBzZWFyY2hUeXBlOiBcImVxdWFsc1wiIHwgXCJsaWtlXCI7XG59O1xuXG50eXBlIENvbHVtblZhbHVlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IERhdGUgfCBudWxsO1xuZXhwb3J0IHR5cGUgRml4dHVyZVJlY29yZCA9IHtcbiAgZml4dHVyZUlkOiBzdHJpbmc7XG4gIGVudGl0eUlkOiBzdHJpbmc7XG4gIGlkOiBudW1iZXIgfCBzdHJpbmc7XG4gIGNvbHVtbnM6IHtcbiAgICBba2V5OiBzdHJpbmddOiB7XG4gICAgICBwcm9wOiBFbnRpdHlQcm9wO1xuICAgICAgdmFsdWU6IENvbHVtblZhbHVlIHwgQ29sdW1uVmFsdWVbXTtcbiAgICB9O1xuICB9O1xuICBmZXRjaGVkUmVjb3Jkczogc3RyaW5nW107XG4gIGJlbG9uZ3NSZWNvcmRzOiBzdHJpbmdbXTtcbiAgdGFyZ2V0PzogRml4dHVyZVJlY29yZDsgLy8gSW1wb3J0IOuMgOyDgSBEQiDroIjsvZTrk5woaWTqsIAg6rCZ7J2AKVxuICB1bmlxdWU/OiBGaXh0dXJlUmVjb3JkOyAvLyBJbXBvcnQg64yA7IOBIERCIOugiOy9lOuTnCh1bmlxdWUga2V56rCAIOqwmeydgClcbiAgb3ZlcnJpZGU/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgRml4dHVyZUltcG9ydFJlc3VsdCA9IHtcbiAgZW50aXR5SWQ6IHN0cmluZztcbiAgZGF0YToge1xuICAgIFtrZXk6IHN0cmluZ106IENvbHVtblZhbHVlO1xuICB9O1xufTtcblxuZXhwb3J0IHR5cGUgUmVsYXRpb25Ob2RlID0ge1xuICBmaXh0dXJlSWQ6IHN0cmluZztcbiAgZW50aXR5SWQ6IHN0cmluZztcbiAgcmVsYXRlZDogU2V0PHN0cmluZz47XG59O1xuXG4vLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWludGVyZmFjZSAtLSBzb25hbXUuZ2VuZXJhdGVkLnNzbyDsl5DshJwg7ZmV7J6l7J2EIOychO2VtCDspIDruYTrkJwg67mIIOyduO2EsO2OmOydtOyKpFxuZXhwb3J0IGludGVyZmFjZSBEYXRhYmFzZVNjaGVtYUV4dGVuZCB7fVxuLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1pbnRlcmZhY2UgLS0gc29uYW11LmdlbmVyYXRlZC5zc28g7JeQ7IScIO2ZleyepeydhCDsnITtlbQg7KSA67mE65CcIOu5iCDsnbjthLDtjpjsnbTsiqRcbmV4cG9ydCBpbnRlcmZhY2UgRGF0YWJhc2VGb3JlaWduS2V5cyB7fVxuZXhwb3J0IHR5cGUgTWFueVRvTWFueUJhc2VTY2hlbWE8XG4gIEZyb21JZEtleSBleHRlbmRzIHN0cmluZyxcbiAgVG9JZEtleSBleHRlbmRzIHN0cmluZyxcbiAgRnJvbVBrVHlwZSA9IG51bWJlcixcbiAgVG9Qa1R5cGUgPSBudW1iZXIsXG4+ID0ge1xuICBpZDogbnVtYmVyO1xufSAmIHtcbiAgW0sgaW4gYCR7RnJvbUlkS2V5fV9pZGBdOiBGcm9tUGtUeXBlO1xufSAmIHtcbiAgW0sgaW4gYCR7VG9JZEtleX1faWRgXTogVG9Qa1R5cGU7XG59O1xuXG4vLyDqsJ3ssrQsIO2VqOyImCwg67mE64+Z6riwIO2VqOyImOulvCDrqqjrkZAg7Y+s6rSE7ZWY64qUIO2DgOyehVxuZXhwb3J0IHR5cGUgRXhlY3V0YWJsZTxUPiA9IFQgfCBQcm9taXNlPFQ+IHwgKCgpID0+IFQpIHwgKCgpID0+IFByb21pc2U8VD4pO1xuXG5leHBvcnQgdHlwZSBTb25hbXVGYXN0aWZ5Q29uZmlnID0ge1xuICBjb250ZXh0UHJvdmlkZXI6IChcbiAgICBkZWZhdWx0Q29udGV4dDogUGljazxcbiAgICAgIENvbnRleHQsXG4gICAgICBcInJlcXVlc3RcIiB8IFwicmVwbHlcIiB8IFwiaGVhZGVyc1wiIHwgXCJjcmVhdGVTU0VcIiB8IFwibmFpdGVTdG9yZVwiIHwgXCJsb2NhbGVcIiB8IFwidXNlclwiIHwgXCJzZXNzaW9uXCJcbiAgICA+LFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIHJlcGx5OiBGYXN0aWZ5UmVwbHksXG4gICkgPT4gQ29udGV4dCB8IFByb21pc2U8Q29udGV4dD47XG4gIGd1YXJkSGFuZGxlcjogKFxuICAgIGd1YXJkOiBHdWFyZEtleSxcbiAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICBhcGk6IHtcbiAgICAgIHR5cGVQYXJhbWV0ZXJzOiBBcGlQYXJhbVR5cGUuVHlwZVBhcmFtW107XG4gICAgICBwYXJhbWV0ZXJzOiBBcGlQYXJhbVtdO1xuICAgICAgcmV0dXJuVHlwZTogQXBpUGFyYW1UeXBlO1xuICAgICAgbW9kZWxOYW1lOiBzdHJpbmc7XG4gICAgICBtZXRob2ROYW1lOiBzdHJpbmc7XG4gICAgICBwYXRoOiBzdHJpbmc7XG4gICAgICBvcHRpb25zOiBBcGlEZWNvcmF0b3JPcHRpb25zO1xuICAgIH0sXG4gICkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIOyghOyXrSBDYWNoZS1Db250cm9sIO2VuOuTpOufrOyeheuLiOuLpC5cbiAgICog7JqU7LKtIO2DgOyehShhcGksIGFzc2V0cywgc3NyLCBjc3Ip7JeQIOuUsOudvCBDYWNoZS1Db250cm9sIOyEpOygleydhCDrsJjtmZjtlanri4jri6QuXG4gICAqIHVuZGVmaW5lZOulvCDrsJjtmZjtlZjrqbQg7YOA7J6F67OEIOq4sOuzuOqwkuydtCDsoIHsmqnrkKnri4jri6QuXG4gICAqL1xuICBjYWNoZUNvbnRyb2xIYW5kbGVyPzogQ2FjaGVDb250cm9sSGFuZGxlcjtcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFVQSxTQUFnQixXQUFtQyxPQUEwQztBQUMzRixRQUFPQSxJQUFFLE1BQU0sQ0FBQyxPQUFPLE1BQU0sT0FBTyxDQUFDLENBQUM7Ozs7Ozs7QUErRXhDLFNBQWdCLGVBQWUsTUFBMEQ7QUFDdkYsUUFBTyxLQUFLLE1BQU0sUUFBUSxLQUFLOztBQXdWakMsU0FBZ0IscUJBQXFCLEdBQXdCO0FBQzNELFFBQU8sT0FBTyxNQUFNLFdBQVcsSUFBSSxFQUFFOztBQUV2QyxTQUFnQixzQkFBc0IsR0FBeUI7QUFDN0QsUUFBTyxPQUFPLE1BQU0sWUFBWSxFQUFFLGFBQWE7Ozs7O0FBZ0NqRCxTQUFnQixvQkFBb0IsS0FBK0Q7QUFDakcsUUFBTyxDQUFDLE1BQU0sUUFBUSxJQUFJLElBQUksWUFBWTs7Ozs7QUFNNUMsU0FBZ0Isa0JBQ2QsS0FDd0Q7QUFDeEQsUUFDRSxZQUFZLE9BQU8sRUFBRSxVQUFVLE9BQU8sSUFBSSxTQUFTLGFBQWEsT0FBTyxLQUFLLElBQUksQ0FBQyxTQUFTOzs7OztBQU85RixTQUFnQixnQkFBZ0IsS0FBK0I7QUFDN0QsUUFBTyxNQUFNLFFB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
|